@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,329 @@
1
+ /**
2
+ * The small files the PreToolUse fast path reads while a skill's run block is
3
+ * live, kept beside phase 0's session state in `<trail home>/sessions/`:
4
+ *
5
+ * - `<id>.gate.json`: the live run blocks' gated steps (a publish, a push to
6
+ * prod, a deploy, ...), grouped so one ask of the person covers a run of
7
+ * consecutive steps of one kind, and which asks were made and approved.
8
+ * It exists only while something is live.
9
+ * - `<id>.post.jsonl`: outcomes PostToolUse and PostToolUseFailure saw
10
+ * before the transcript had them, one line each, taken by the next
11
+ * catch-up. The transcript's result always wins when it arrives.
12
+ *
13
+ * An approval is the asked call's own PostToolUse: the person said yes and
14
+ * the command ran. A failed asked call (PostToolUseFailure) never approves,
15
+ * because a refused ask may arrive the same way.
16
+ *
17
+ * Every shell command passes through PreToolUse, so this file stays light:
18
+ * static imports are node:path, node:os and the shell lexer; node:fs and
19
+ * node:crypto come from `process.getBuiltinModule`, as pre-bash.ts does.
20
+ * Writes are tmp-and-rename (or one O_APPEND write) at 0600 in a 0700 folder.
21
+ */
22
+ import { homedir } from 'node:os';
23
+ import { dirname, join, resolve } from 'node:path';
24
+ import { programOf } from './shell.js';
25
+ /** A gate file bigger than this is not read: the fast path never parses much. */
26
+ const MAX_GATE_BYTES = 16 * 1024;
27
+ const MAX_TAIL = 200;
28
+ const MAX_MARKS = 2000;
29
+ const fs = () => process.getBuiltinModule('node:fs');
30
+ const crypto = () => process.getBuiltinModule('node:crypto');
31
+ /** The same answer as notes/home.ts trailHome(env); a test holds them equal. */
32
+ export function trailHomeFast(env = process.env) {
33
+ return env.TRAIL_HOME ? resolve(env.TRAIL_HOME) : join(homedir(), '.trail');
34
+ }
35
+ /** A session id as a file name, as phase 0's state.ts does it (a test holds them equal). */
36
+ function fileId(sessionId) {
37
+ if (/^[A-Za-z0-9_-][A-Za-z0-9._-]{0,127}$/.test(sessionId))
38
+ return sessionId;
39
+ return `h-${crypto().createHash('sha256').update(String(sessionId)).digest('hex').slice(0, 16)}`;
40
+ }
41
+ /** `<home>/sessions/<id><suffix>`: the session's files (`.json`, `.gate.json`, `.post.jsonl`). */
42
+ export function sessionPath(sessionId, suffix, env = process.env) {
43
+ return join(trailHomeFast(env), 'sessions', `${fileId(String(sessionId))}${suffix}`);
44
+ }
45
+ export function gateFilePath(sessionId, env = process.env) {
46
+ return sessionPath(sessionId, '.gate.json', env);
47
+ }
48
+ function postPath(sessionId, env) {
49
+ return sessionPath(sessionId, '.post.jsonl', env);
50
+ }
51
+ /**
52
+ * A folder only its owner can open, made if missing and tightened if it was looser. A link is left alone: a chmod
53
+ * would follow it and tighten what it points to. The mode is set through a descriptor that refuses a link (as
54
+ * state.ts ensurePrivateDir, kept here so this file loads only node:path and node:os).
55
+ */
56
+ function privateDir(dir) {
57
+ const f = fs();
58
+ try {
59
+ if (f.lstatSync(dir).isSymbolicLink())
60
+ return;
61
+ }
62
+ catch { /* missing: made below */ }
63
+ f.mkdirSync(dir, { recursive: true, mode: 0o700 });
64
+ const k = f.constants;
65
+ if (process.platform === 'win32' || k.O_NOFOLLOW === undefined)
66
+ return;
67
+ try {
68
+ const fd = f.openSync(dir, k.O_RDONLY | (k.O_DIRECTORY ?? 0) | k.O_NOFOLLOW);
69
+ try {
70
+ f.fchmodSync(fd, 0o700);
71
+ }
72
+ finally {
73
+ f.closeSync(fd);
74
+ }
75
+ }
76
+ catch (e) {
77
+ // A folder its owner can't read can't be opened, but can still be tightened.
78
+ if (e.code !== 'EACCES')
79
+ return;
80
+ try {
81
+ if (!f.lstatSync(dir).isSymbolicLink())
82
+ f.chmodSync(dir, 0o700);
83
+ }
84
+ catch { /* not ours to change */ }
85
+ }
86
+ }
87
+ /** tmp file + rename at 0600. */
88
+ function writeWhole(path, data) {
89
+ const f = fs();
90
+ privateDir(dirname(path));
91
+ const tmp = `${path}.${process.pid}.${Math.random().toString(16).slice(2, 8)}.tmp`;
92
+ try {
93
+ const fd = f.openSync(tmp, 'wx', 0o600);
94
+ try {
95
+ f.fchmodSync(fd, 0o600);
96
+ f.writeSync(fd, data);
97
+ }
98
+ finally {
99
+ f.closeSync(fd);
100
+ }
101
+ f.renameSync(tmp, path);
102
+ }
103
+ catch (e) {
104
+ try {
105
+ f.rmSync(tmp, { force: true });
106
+ }
107
+ catch { /* nothing more to do */ }
108
+ throw e;
109
+ }
110
+ }
111
+ const isStr = (v) => typeof v === 'string';
112
+ const strOrNull = (v) => v === null || typeof v === 'string';
113
+ function validGroup(g) {
114
+ if (!g || typeof g !== 'object')
115
+ return false;
116
+ const x = g;
117
+ return isStr(x.kind) && Array.isArray(x.steps) && x.steps.every((s) => s && typeof s.n === 'number' && isStr(s.text))
118
+ && strOrNull(x.askedAt) && strOrNull(x.askedToolUseId) && strOrNull(x.approvedAt);
119
+ }
120
+ function validGate(v) {
121
+ if (!v || typeof v !== 'object' || Array.isArray(v))
122
+ return false;
123
+ const g = v;
124
+ if (g.v !== 1 || typeof g.epoch !== 'number' || !Array.isArray(g.live))
125
+ return false;
126
+ return g.live.every((l) => l && isStr(l.injId) && isStr(l.name) && Array.isArray(l.steps) && Array.isArray(l.groups) && l.groups.every(validGroup));
127
+ }
128
+ /** No lock; a file over 16 KB or bad JSON reads as null. */
129
+ export function readGateFile(sessionId, env = process.env) {
130
+ try {
131
+ const f = fs();
132
+ const path = gateFilePath(sessionId, env);
133
+ const st = f.statSync(path);
134
+ if (!st.isFile() || st.size > MAX_GATE_BYTES)
135
+ return null;
136
+ const v = JSON.parse(f.readFileSync(path, 'utf8'));
137
+ return validGate(v) ? v : null;
138
+ }
139
+ catch {
140
+ return null;
141
+ }
142
+ }
143
+ /** Gated steps, consecutive ones of one kind together (one ask covers a group). */
144
+ function groupsOf(steps, gated) {
145
+ const sorted = [...gated].filter((g) => g.step >= 1 && g.step <= steps.length).sort((a, b) => a.step - b.step);
146
+ const out = [];
147
+ for (const g of sorted) {
148
+ const text = steps[g.step - 1];
149
+ const step = { n: g.step, text, program: programOf(text) };
150
+ const last = out[out.length - 1];
151
+ const prev = last?.steps[last.steps.length - 1];
152
+ if (last && prev && last.kind === g.kind && prev.n === g.step - 1)
153
+ last.steps.push(step);
154
+ else
155
+ out.push({ kind: g.kind, steps: [step], askedAt: null, askedToolUseId: null, approvedAt: null });
156
+ }
157
+ return out;
158
+ }
159
+ const sameSteps = (a, b) => a.kind === b.kind && a.steps.length === b.steps.length && a.steps.every((s, i) => s.n === b.steps[i].n && s.text === b.steps[i].text);
160
+ /** Rewrites `live` from st.injected (live ones), keeping asked/approved marks of injections that stay. Deletes the file when nothing is live. */
161
+ export function writeGateFile(sessionId, st, env = process.env) {
162
+ const path = gateFilePath(sessionId, env);
163
+ const old = readGateFile(sessionId, env);
164
+ const live = st.injected.filter((i) => i.live).map((inj) => {
165
+ const before = old?.live.find((l) => l.injId === inj.injId);
166
+ const groups = groupsOf(inj.steps, inj.gated).map((g) => {
167
+ const kept = before?.groups.find((b) => sameSteps(b, g));
168
+ return kept ? { ...g, askedAt: kept.askedAt, askedToolUseId: kept.askedToolUseId, approvedAt: kept.approvedAt, askedStep: kept.askedStep ?? null } : g;
169
+ });
170
+ const handed = before?.steps.join('\n') === inj.steps.join('\n') ? validHanded(before?.handed) : [];
171
+ return { injId: inj.injId, name: inj.name, skillId: inj.skillId, params: inj.params, steps: inj.steps, check: inj.check, groups, ...(handed.length ? { handed } : {}) };
172
+ });
173
+ if (!live.length) {
174
+ try {
175
+ fs().rmSync(path, { force: true });
176
+ }
177
+ catch { /* gone already */ }
178
+ return;
179
+ }
180
+ // Over the cap the file would read as nothing: keep the newest blocks that fit.
181
+ let file = { v: 1, epoch: st.epoch, live };
182
+ let text = JSON.stringify(file);
183
+ while (Buffer.byteLength(text) > MAX_GATE_BYTES && file.live.length > 1) {
184
+ file = { ...file, live: file.live.slice(1) };
185
+ text = JSON.stringify(file);
186
+ }
187
+ writeWhole(path, text);
188
+ }
189
+ function rewrite(sessionId, env, change) {
190
+ const g = readGateFile(sessionId, env);
191
+ if (!g || !change(g))
192
+ return false;
193
+ writeWhole(gateFilePath(sessionId, env), JSON.stringify(g));
194
+ return true;
195
+ }
196
+ export function markAsked(sessionId, injId, group, toolUseId, now, env = process.env, step) {
197
+ rewrite(sessionId, env, (g) => {
198
+ const target = g.live.find((l) => l.injId === injId)?.groups[group];
199
+ if (!target)
200
+ return false;
201
+ target.askedAt = now.toISOString();
202
+ target.askedToolUseId = toolUseId;
203
+ target.approvedAt = null;
204
+ target.askedStep = typeof step === 'number' ? step : null;
205
+ return true;
206
+ });
207
+ }
208
+ const MAX_HANDED = 8;
209
+ const validHanded = (v) => (Array.isArray(v) ? v : []).filter((h) => !!h && typeof h.n === 'number' && Number.isInteger(h.n) && h.n >= 1 && isStr(h.at)).slice(-MAX_HANDED);
210
+ /** D137: the gated step `step` of block `injId` was denied and printed for the person to run (no ask possible here). */
211
+ export function markHanded(sessionId, injId, step, now, env = process.env) {
212
+ rewrite(sessionId, env, (g) => {
213
+ const l = g.live.find((x) => x.injId === injId);
214
+ if (!l || !Number.isInteger(step) || step < 1 || step > l.steps.length)
215
+ return false;
216
+ l.handed = [...validHanded(l.handed).filter((h) => h.n !== step), { n: step, at: now.toISOString() }].slice(-MAX_HANDED);
217
+ return true;
218
+ });
219
+ }
220
+ /** D137: every handed step the gate file holds, by block. */
221
+ export function readHanded(sessionId, env = process.env) {
222
+ const g = readGateFile(sessionId, env);
223
+ return g ? g.live.flatMap((l) => validHanded(l.handed).map((h) => ({ ...h, injId: l.injId }))) : [];
224
+ }
225
+ /** true when toolUseId was an asked call (sets approvedAt). PostToolUse only: a failed asked call (PostToolUseFailure) never
226
+ * approves its group, because a refused ask may arrive the same way; the next step in the group asks again (3.3). */
227
+ export function markApproved(sessionId, toolUseId, now, env = process.env) {
228
+ if (!toolUseId)
229
+ return false;
230
+ return rewrite(sessionId, env, (g) => {
231
+ let hit = false;
232
+ for (const l of g.live)
233
+ for (const grp of l.groups) {
234
+ if (grp.askedToolUseId === toolUseId) {
235
+ grp.approvedAt = now.toISOString();
236
+ hit = true;
237
+ }
238
+ }
239
+ return hit;
240
+ });
241
+ }
242
+ /**
243
+ * `<home>/sessions/<id>.post.jsonl`, one O_APPEND write at 0600. Opened without blocking and written only when it
244
+ * is a regular file: a FIFO planted at the path would otherwise hold PostToolUse until its timeout (D100 18). A FIFO
245
+ * or anything else that isn't a regular file is skipped, and the mark is lost (the fold reads the call anyway).
246
+ */
247
+ export function appendPostMark(sessionId, mark, env = process.env) {
248
+ const f = fs();
249
+ const path = postPath(sessionId, env);
250
+ const clean = { id: String(mark.id), at: String(mark.at), failed: mark.failed === true };
251
+ if (typeof mark.tail === 'string')
252
+ clean.tail = mark.tail.slice(-MAX_TAIL);
253
+ privateDir(dirname(path));
254
+ // Never through a symlink: one planted at this path would have the hook append to, and chmod, its target.
255
+ const { O_WRONLY, O_APPEND, O_CREAT, O_NOFOLLOW, O_NONBLOCK } = f.constants;
256
+ let fd;
257
+ try {
258
+ fd = f.openSync(path, O_WRONLY | O_APPEND | O_CREAT | O_NOFOLLOW | (O_NONBLOCK ?? 0), 0o600);
259
+ }
260
+ catch (e) {
261
+ // A FIFO with no reader refuses a non-blocking open for writing.
262
+ if (e.code === 'ENXIO')
263
+ return;
264
+ throw e;
265
+ }
266
+ try {
267
+ if (!f.fstatSync(fd).isFile())
268
+ return;
269
+ f.fchmodSync(fd, 0o600);
270
+ f.writeSync(fd, `${JSON.stringify(clean)}\n`);
271
+ }
272
+ finally {
273
+ f.closeSync(fd);
274
+ }
275
+ }
276
+ function asMark(v) {
277
+ if (!v || typeof v !== 'object' || Array.isArray(v))
278
+ return null;
279
+ const m = v;
280
+ if (!isStr(m.id) || !m.id || !isStr(m.at) || typeof m.failed !== 'boolean')
281
+ return null;
282
+ return isStr(m.tail) ? { id: m.id, at: m.at, failed: m.failed, tail: m.tail.slice(-MAX_TAIL) } : { id: m.id, at: m.at, failed: m.failed };
283
+ }
284
+ /** Read and truncate: the file is moved aside first, so a mark appended meanwhile waits for the next take. */
285
+ export function takePostMarks(sessionId, env = process.env) {
286
+ const f = fs();
287
+ const path = postPath(sessionId, env);
288
+ const aside = `${path}.${process.pid}.${Math.random().toString(16).slice(2, 8)}.take`;
289
+ try {
290
+ f.renameSync(path, aside);
291
+ }
292
+ catch {
293
+ return [];
294
+ }
295
+ try {
296
+ const out = [];
297
+ for (const line of f.readFileSync(aside, 'utf8').split('\n')) {
298
+ if (!line.trim())
299
+ continue;
300
+ try {
301
+ const m = asMark(JSON.parse(line));
302
+ if (m)
303
+ out.push(m);
304
+ }
305
+ catch { /* a broken line is skipped */ }
306
+ }
307
+ return out.slice(-MAX_MARKS);
308
+ }
309
+ catch {
310
+ return [];
311
+ }
312
+ finally {
313
+ try {
314
+ f.rmSync(aside, { force: true });
315
+ }
316
+ catch { /* nothing more to do */ }
317
+ }
318
+ }
319
+ /** settings.json's `skills === 'on'`, read with fs only. */
320
+ export function skillsOnFast(env = process.env) {
321
+ try {
322
+ const v = JSON.parse(fs().readFileSync(join(trailHomeFast(env), 'settings.json'), 'utf8'));
323
+ return !!v && typeof v === 'object' && !Array.isArray(v) && v.skills === 'on';
324
+ }
325
+ catch {
326
+ return false;
327
+ }
328
+ }
329
+ //# sourceMappingURL=gate-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate-file.js","sourceRoot":"","sources":["../../src/trace/gate-file.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /** J16's words, then the way out (R29), as information about the denied command (D88). */
2
+ export declare const SURE_FAIL_REASON: string;
3
+ /**
4
+ * Where `timeout` lives when the hook's PATH is narrower than the shell's (4.11 step 3, R29). `$HOME` is env.HOME,
5
+ * `$USER` env.USER. Review: nix-darwin's per-user profile joins 4.11's list. /usr/bin and /bin stay out: a hook's
6
+ * PATH always holds them, and on Linux (where coreutils puts timeout there) they would hide the deny path from CI.
7
+ */
8
+ export declare const FIXED_DIRS: readonly string[];
9
+ /** The PATH's folders, split on the platform's delimiter (';' on Windows), absolute ones only. */
10
+ export declare function pathDirs(env: NodeJS.ProcessEnv): string[];
11
+ /** The file names a program can have: itself, and on Windows with each PATHEXT ending too (git.exe, npm.cmd). */
12
+ export declare function programFiles(name: string, env: NodeJS.ProcessEnv): string[];
13
+ /** PATH dirs from env, then the fixed folders of 4.11. */
14
+ export declare function timeoutOnPath(env: NodeJS.ProcessEnv): boolean;
15
+ /** Reads <trail home>/learnings/no-timeout.md (under 1 KB) when it exists. Deny only when sure (4.11). */
16
+ export declare function sureFail(command: string, env: NodeJS.ProcessEnv): {
17
+ deny: string;
18
+ check: 'no-timeout';
19
+ } | null;
20
+ /** Appends {at, restSha} to sessions/<id>.denied.jsonl (O_APPEND, 0600, 4 KB cap) for the avoided credit. */
21
+ export declare function markDenied(sessionId: string, command: string, env: NodeJS.ProcessEnv, now?: Date): void;
22
+ //# sourceMappingURL=guard-fast.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guard-fast.d.ts","sourceRoot":"","sources":["../../src/trace/guard-fast.ts"],"names":[],"mappings":"AAuBA,0FAA0F;AAC1F,eAAO,MAAM,gBAAgB,QAG2E,CAAC;AAEzG;;;;GAIG;AACH,eAAO,MAAM,UAAU,EAAE,SAAS,MAAM,EAKtC,CAAC;AAmFH,kGAAkG;AAClG,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,EAAE,CAEzD;AAED,iHAAiH;AACjH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,MAAM,EAAE,CAI3E;AAkBD,0DAA0D;AAC1D,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG,OAAO,CAW7D;AAED,0GAA0G;AAC1G,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,YAAY,CAAA;CAAE,GAAG,IAAI,CAU9G;AAED,6GAA6G;AAC7G,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,EAAE,GAAG,GAAE,IAAiB,GAAG,IAAI,CAsBnH"}
@@ -0,0 +1,213 @@
1
+ /**
2
+ * The sure-fail guardrail on the PreToolUse fast path (design 4.11): when
3
+ * the person kept the no-timeout guardrail, a `timeout N ...` command is
4
+ * denied, but only when no `timeout` program exists on this machine, so the
5
+ * command would fail anyway. Nothing else is ever denied here, and anything
6
+ * odd (no file, a retired or edited one, a read that throws) allows.
7
+ *
8
+ * The caller decides whether skills are on (0 rule 1); this file only reads
9
+ * `<trail home>/learnings/no-timeout.md` (one small file, R56).
10
+ *
11
+ * Fast-path safe (0 rule 8): static imports are node:path, node:os and the
12
+ * shell lexer files already on the path; node:fs and node:crypto come from
13
+ * `process.getBuiltinModule`. TRAIL_HOME is resolved as gate-file.ts does.
14
+ */
15
+ import { homedir, userInfo } from 'node:os';
16
+ import { delimiter, dirname, isAbsolute, join } from 'node:path';
17
+ import { sessionPath, trailHomeFast } from './gate-file.js';
18
+ import { normalizeCommand, stripTimeout } from './shell.js';
19
+ import { afterTimeout, simpleCommands } from './shell-words.js';
20
+ import { ASSIGN, words } from './shell-scan.js';
21
+ /** J16's words, then the way out (R29), as information about the denied command (D88). */
22
+ export const SURE_FAIL_REASON = '[trail] Trail, the tool this person installed, stopped this command before it ran: '
23
+ + 'this Mac has no timeout program (a guardrail this person kept), so it would fail with "timeout: command not found". '
24
+ + "The usual fix is the same command without timeout, using the Bash tool's own timeout parameter or run_in_background. "
25
+ + 'If timeout is installed here now, the person can drop this guardrail with trail forget no-timeout.';
26
+ /**
27
+ * Where `timeout` lives when the hook's PATH is narrower than the shell's (4.11 step 3, R29). `$HOME` is env.HOME,
28
+ * `$USER` env.USER. Review: nix-darwin's per-user profile joins 4.11's list. /usr/bin and /bin stay out: a hook's
29
+ * PATH always holds them, and on Linux (where coreutils puts timeout there) they would hide the deny path from CI.
30
+ */
31
+ export const FIXED_DIRS = Object.freeze([
32
+ '/opt/homebrew/bin', '/usr/local/bin', '/opt/homebrew/opt/coreutils/libexec/gnubin', '/usr/local/opt/coreutils/libexec/gnubin',
33
+ '/opt/local/bin', '/opt/local/libexec/gnubin', '$HOME/.nix-profile/bin', '/run/current-system/sw/bin',
34
+ '/nix/var/nix/profiles/default/bin', '$HOME/bin', '$HOME/.local/bin',
35
+ '/etc/profiles/per-user/$USER/bin',
36
+ ]);
37
+ const MAX_FILE = 4 * 1024;
38
+ /** A longer command is allowed unread: the deny is only for when Trail is sure, and parsing 2 MB took 150 ms here. */
39
+ const MAX_COMMAND = 64 * 1024;
40
+ const MAX_DENIED = 4 * 1024;
41
+ const fs = () => process.getBuiltinModule('node:fs');
42
+ const crypto = () => process.getBuiltinModule('node:crypto');
43
+ /** A front-matter value: quotes and padding gone, lower case. */
44
+ const value = (raw) => raw.trim().replace(/^(['"])(.*)\1$/, '$2').trim().toLowerCase();
45
+ /** The guardrail file says: active, check no-timeout, enforce sure-fail (2.5). Anything else, or a read error: false. */
46
+ function guardrailKept(env) {
47
+ const f = fs();
48
+ let text;
49
+ try {
50
+ const path = join(trailHomeFast(env), 'learnings', 'no-timeout.md');
51
+ // O_NONBLOCK: a FIFO planted here would otherwise hold the hook until its 5 s run out.
52
+ const fd = f.openSync(path, f.constants.O_RDONLY | (f.constants.O_NOFOLLOW ?? 0) | (f.constants.O_NONBLOCK ?? 0));
53
+ try {
54
+ const st = f.fstatSync(fd);
55
+ if (!st.isFile() || st.size > MAX_FILE)
56
+ return false;
57
+ const buf = Buffer.alloc(st.size);
58
+ const n = f.readSync(fd, buf, 0, st.size, 0);
59
+ text = buf.toString('utf8', 0, n);
60
+ }
61
+ finally {
62
+ f.closeSync(fd);
63
+ }
64
+ }
65
+ catch {
66
+ return false;
67
+ }
68
+ const m = /^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)/.exec(text);
69
+ if (!m)
70
+ return false;
71
+ const fm = {};
72
+ for (const line of m[1].split(/\r?\n/)) {
73
+ const kv = /^([a-z]+):(.*)$/.exec(line);
74
+ if (kv)
75
+ fm[kv[1]] = value(kv[2]);
76
+ }
77
+ return (fm.status ?? 'active') === 'active' && fm.check === 'no-timeout' && fm.enforce === 'sure-fail';
78
+ }
79
+ /** The words of a simple command after env prefixes (`A=1`, `env [-i] [-u N] A=1`). */
80
+ function afterEnv(simple) {
81
+ let w = words(simple);
82
+ while (w.length && ASSIGN.test(w[0]))
83
+ w = w.slice(1);
84
+ if (w[0] === 'env') {
85
+ let i = 1;
86
+ while (i < w.length && (w[i].startsWith('-') || ASSIGN.test(w[i])))
87
+ i += /^-[uCS]$/.test(w[i]) ? 2 : 1;
88
+ w = w.slice(i);
89
+ }
90
+ return w;
91
+ }
92
+ /** `timeout() {`, `function timeout`, `alias timeout=` anywhere in the command: its own timeout, so not sure (R29). */
93
+ const OWN_TIMEOUT = /(?:^|[\s;&|({])(?:timeout\s*\(\s*\)|function\s+timeout\b|alias\s+(?:-\S+\s+)*['"]?timeout=)/;
94
+ /**
95
+ * The command may find a `timeout` the hook can't see: it changes PATH, or loads the person's shell setup
96
+ * (`source`, `.`, `eval`, `hash`), whose PATH, alias or function Trail can't read. Not sure, so allow.
97
+ */
98
+ const CHANGES_LOOKUP = /(?:^|[\s;&|({`])(?:(?:export|typeset|declare|local|readonly)\s+(?:-\S+\s+)*)?(?:PATH|path)\+?=|(?:^|[\s;&|({`])(?:source|eval|hash|rehash)(?:\s|$)|(?:^|[\s;&|({`])\.\s+\S/;
99
+ /** How many simple commands run `timeout DURATION ...` (after env prefixes). `gtimeout` never. */
100
+ function timeoutRuns(command) {
101
+ let n = 0;
102
+ for (const s of simpleCommands(command)) {
103
+ const w = afterEnv(s);
104
+ if (w[0] === 'timeout' && afterTimeout(w) !== null)
105
+ n++;
106
+ }
107
+ return n;
108
+ }
109
+ /**
110
+ * Sure only when every `timeout` in the command is one of those runs. Any other (`command -v timeout &&`,
111
+ * `which timeout`, `[[ -x …/timeout ]]`, `ln -s … ~/bin/timeout`, a function or alias) means the command looks for
112
+ * one, falls back, or puts one in place: it may well not fail, so it is allowed (R29).
113
+ */
114
+ function onlyRunsTimeout(command) {
115
+ const runs = timeoutRuns(command);
116
+ return runs > 0 && (command.match(/\btimeout\b/g) ?? []).length === runs;
117
+ }
118
+ /** The PATH's folders, split on the platform's delimiter (';' on Windows), absolute ones only. */
119
+ export function pathDirs(env) {
120
+ return String(env.PATH ?? '').split(delimiter).filter((d) => d !== '' && isAbsolute(d));
121
+ }
122
+ /** The file names a program can have: itself, and on Windows with each PATHEXT ending too (git.exe, npm.cmd). */
123
+ export function programFiles(name, env) {
124
+ if (process.platform !== 'win32')
125
+ return [name];
126
+ const exts = String(env.PATHEXT || '.COM;.EXE;.BAT;.CMD').split(';').map((e) => e.trim().toLowerCase()).filter((e) => /^\.[a-z0-9]{1,8}$/.test(e));
127
+ return [name, ...exts.map((e) => name + e)];
128
+ }
129
+ /** An executable regular file at `dir/timeout` (on Windows, which has no exec bit, any timeout.exe and the like). */
130
+ function executableIn(dir, env) {
131
+ if (!dir)
132
+ return false;
133
+ const f = fs();
134
+ return programFiles('timeout', env).some((name) => {
135
+ try {
136
+ const p = join(dir, name);
137
+ if (!f.statSync(p).isFile())
138
+ return false;
139
+ f.accessSync(p, f.constants.X_OK);
140
+ return true;
141
+ }
142
+ catch {
143
+ return false;
144
+ }
145
+ });
146
+ }
147
+ /** PATH dirs from env, then the fixed folders of 4.11. */
148
+ export function timeoutOnPath(env) {
149
+ const home = env.HOME || homedir();
150
+ let user = env.USER || env.LOGNAME || '';
151
+ if (!user)
152
+ try {
153
+ user = userInfo().username;
154
+ }
155
+ catch { /* none */ }
156
+ const dirs = pathDirs(env);
157
+ for (const d of FIXED_DIRS) {
158
+ if (d.startsWith('$HOME'))
159
+ dirs.push(join(home, d.slice('$HOME'.length)));
160
+ else if (d.includes('$USER')) {
161
+ if (/^[\w.-]{1,64}$/.test(user))
162
+ dirs.push(d.replace('$USER', user));
163
+ }
164
+ else
165
+ dirs.push(d);
166
+ }
167
+ return [...new Set(dirs)].some((d) => executableIn(d, env));
168
+ }
169
+ /** Reads <trail home>/learnings/no-timeout.md (under 1 KB) when it exists. Deny only when sure (4.11). */
170
+ export function sureFail(command, env) {
171
+ try {
172
+ if (typeof command !== 'string' || command.length > MAX_COMMAND || !/\btimeout\b/.test(command))
173
+ return null;
174
+ if (!onlyRunsTimeout(command) || OWN_TIMEOUT.test(command) || CHANGES_LOOKUP.test(command))
175
+ return null;
176
+ if (!guardrailKept(env))
177
+ return null;
178
+ if (timeoutOnPath(env))
179
+ return null;
180
+ return { deny: SURE_FAIL_REASON, check: 'no-timeout' };
181
+ }
182
+ catch {
183
+ return null;
184
+ }
185
+ }
186
+ /** Appends {at, restSha} to sessions/<id>.denied.jsonl (O_APPEND, 0600, 4 KB cap) for the avoided credit. */
187
+ export function markDenied(sessionId, command, env, now = new Date()) {
188
+ try {
189
+ const f = fs();
190
+ const path = sessionPath(String(sessionId), '.denied.jsonl', env);
191
+ const rest = normalizeCommand(stripTimeout(String(command ?? '')));
192
+ const line = `${JSON.stringify({ at: now.toISOString(), restSha: `sha256:${crypto().createHash('sha256').update(rest).digest('hex')}` })}\n`;
193
+ const dir = dirname(path);
194
+ f.mkdirSync(dir, { recursive: true, mode: 0o700 });
195
+ const { O_WRONLY, O_APPEND, O_CREAT, O_NOFOLLOW, O_NONBLOCK } = f.constants;
196
+ // O_NONBLOCK: a FIFO planted here would otherwise hold the hook until its 5 s run out (with no reader, ENXIO).
197
+ const fd = f.openSync(path, O_WRONLY | O_APPEND | O_CREAT | (O_NOFOLLOW ?? 0) | (O_NONBLOCK ?? 0), 0o600);
198
+ try {
199
+ const st = f.fstatSync(fd);
200
+ if (!st.isFile() || st.size + Buffer.byteLength(line) > MAX_DENIED)
201
+ return;
202
+ f.fchmodSync(fd, 0o600);
203
+ f.writeSync(fd, line);
204
+ }
205
+ finally {
206
+ f.closeSync(fd);
207
+ }
208
+ }
209
+ catch {
210
+ /* the avoided count is best effort */
211
+ }
212
+ }
213
+ //# sourceMappingURL=guard-fast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guard-fast.js","sourceRoot":"","sources":["../../src/trace/guard-fast.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Which agent sent a hook payload, and how much of what it did its transcript
3
+ * keeps. Worked out from the payload itself, before any transcript is parsed,
4
+ * never from the settings file that fired the hook: Cursor and Copilot CLI run
5
+ * the Claude Code hooks in `.claude/settings.json` too, so a payload on a
6
+ * Claude hook can carry a Cursor or Copilot transcript path. Parsed as Claude,
7
+ * such a file shows no typed words and no tool results, and every save would
8
+ * look like the agent's own.
9
+ *
10
+ * Tiers (how far Trail can trust the record):
11
+ * - A: typed words told apart, tool calls, results with a failure signal,
12
+ * compactions. Claude Code.
13
+ * - B: a full record whose host checks aren't written up yet. Codex, until HC1 to HC12 are (P31): its rollouts
14
+ * are read and folded (phase 2), but learning stays off.
15
+ * - C: typed words, calls at best, no results Trail can read. Copilot CLI,
16
+ * Gemini CLI (no hooks wired, no parser yet).
17
+ * - D: nothing Trail can read, or a shape it doesn't know. Cursor (its
18
+ * transcripts keep no results), anything unknown.
19
+ * Only tier A can make a live item; everything else is held for a yes.
20
+ *
21
+ * `subagent` is set when the payload comes from a subagent's tool call or
22
+ * stop (Claude Code adds `agent_id` there, never on the main thread). Its
23
+ * transcript path still names the parent session, so the caller stays out.
24
+ */
25
+ export type Host = "claude" | "codex" | "cursor" | "copilot" | "gemini" | "unknown";
26
+ export type Tier = "A" | "B" | "C" | "D";
27
+ export interface HostInfo {
28
+ host: Host;
29
+ tier: Tier;
30
+ subagent?: true;
31
+ }
32
+ /**
33
+ * Codex's tier (design 4.18, P31): the one constant that flips to "A", in the commit that writes up HC1 to HC12 in
34
+ * host-checks.md and passes the Codex legs of J04, J10 and J13 in a real session. Until then a test home may set
35
+ * TRAIL_TIER_CODEX=A (host-facts.ts `hostTier`).
36
+ */
37
+ export declare const CODEX_TIER: Tier;
38
+ /** The host that sent `payload` and its tier. Never throws; anything unreadable is unknown. */
39
+ export declare function detectHost(payload: unknown): HostInfo;
40
+ //# sourceMappingURL=host.d.ts.map