@namzu/cli 29.0.1 → 30.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (413) hide show
  1. package/CHANGELOG.md +194 -0
  2. package/README.md +20 -0
  3. package/dist/browser/commands.d.ts +29 -0
  4. package/dist/browser/commands.d.ts.map +1 -0
  5. package/dist/browser/commands.js +361 -0
  6. package/dist/browser/commands.js.map +1 -0
  7. package/dist/browser/control.d.ts +79 -0
  8. package/dist/browser/control.d.ts.map +1 -0
  9. package/dist/browser/control.js +140 -0
  10. package/dist/browser/control.js.map +1 -0
  11. package/dist/browser/describe.d.ts +12 -0
  12. package/dist/browser/describe.d.ts.map +1 -0
  13. package/dist/browser/describe.js +27 -0
  14. package/dist/browser/describe.js.map +1 -0
  15. package/dist/cli.d.ts.map +1 -1
  16. package/dist/cli.js +29 -2
  17. package/dist/cli.js.map +1 -1
  18. package/dist/commands/acp.d.ts.map +1 -1
  19. package/dist/commands/acp.js +1 -0
  20. package/dist/commands/acp.js.map +1 -1
  21. package/dist/commands/browser.d.ts +7 -0
  22. package/dist/commands/browser.d.ts.map +1 -0
  23. package/dist/commands/browser.js +16 -0
  24. package/dist/commands/browser.js.map +1 -0
  25. package/dist/commands/drain.d.ts +2 -1
  26. package/dist/commands/drain.d.ts.map +1 -1
  27. package/dist/commands/drain.js +6 -3
  28. package/dist/commands/drain.js.map +1 -1
  29. package/dist/commands/exec-flags.d.ts +2 -1
  30. package/dist/commands/exec-flags.d.ts.map +1 -1
  31. package/dist/commands/exec-flags.js +6 -3
  32. package/dist/commands/exec-flags.js.map +1 -1
  33. package/dist/commands/exec-json.d.ts.map +1 -1
  34. package/dist/commands/exec-json.js +2 -1
  35. package/dist/commands/exec-json.js.map +1 -1
  36. package/dist/commands/exec.d.ts.map +1 -1
  37. package/dist/commands/exec.js +5 -1
  38. package/dist/commands/exec.js.map +1 -1
  39. package/dist/commands/host-queries.d.ts.map +1 -1
  40. package/dist/commands/host-queries.js +10 -3
  41. package/dist/commands/host-queries.js.map +1 -1
  42. package/dist/commands/schedule.d.ts +9 -0
  43. package/dist/commands/schedule.d.ts.map +1 -0
  44. package/dist/commands/schedule.js +126 -0
  45. package/dist/commands/schedule.js.map +1 -0
  46. package/dist/commands/serve.d.ts +3 -1
  47. package/dist/commands/serve.d.ts.map +1 -1
  48. package/dist/commands/serve.js +5 -3
  49. package/dist/commands/serve.js.map +1 -1
  50. package/dist/commands/skills.d.ts +10 -0
  51. package/dist/commands/skills.d.ts.map +1 -1
  52. package/dist/commands/skills.js +23 -7
  53. package/dist/commands/skills.js.map +1 -1
  54. package/dist/commands/upgrade.d.ts +5 -0
  55. package/dist/commands/upgrade.d.ts.map +1 -1
  56. package/dist/commands/upgrade.js +11 -0
  57. package/dist/commands/upgrade.js.map +1 -1
  58. package/dist/config/load.d.ts +39 -0
  59. package/dist/config/load.d.ts.map +1 -1
  60. package/dist/config/load.js +232 -1
  61. package/dist/config/load.js.map +1 -1
  62. package/dist/config/schema.d.ts +78 -0
  63. package/dist/config/schema.d.ts.map +1 -1
  64. package/dist/config/schema.js.map +1 -1
  65. package/dist/config/user-config.d.ts +23 -0
  66. package/dist/config/user-config.d.ts.map +1 -0
  67. package/dist/config/user-config.js +48 -0
  68. package/dist/config/user-config.js.map +1 -0
  69. package/dist/context/capabilities.d.ts +1 -1
  70. package/dist/context/capabilities.d.ts.map +1 -1
  71. package/dist/context/capabilities.js +1 -0
  72. package/dist/context/capabilities.js.map +1 -1
  73. package/dist/context/environment.d.ts +26 -3
  74. package/dist/context/environment.d.ts.map +1 -1
  75. package/dist/context/environment.js +68 -9
  76. package/dist/context/environment.js.map +1 -1
  77. package/dist/doctor/checks/browser.d.ts +15 -0
  78. package/dist/doctor/checks/browser.d.ts.map +1 -0
  79. package/dist/doctor/checks/browser.js +63 -0
  80. package/dist/doctor/checks/browser.js.map +1 -0
  81. package/dist/doctor/checks/index.d.ts +4 -1
  82. package/dist/doctor/checks/index.d.ts.map +1 -1
  83. package/dist/doctor/checks/index.js +8 -1
  84. package/dist/doctor/checks/index.js.map +1 -1
  85. package/dist/doctor/checks/scheduler.d.ts +10 -0
  86. package/dist/doctor/checks/scheduler.d.ts.map +1 -0
  87. package/dist/doctor/checks/scheduler.js +74 -0
  88. package/dist/doctor/checks/scheduler.js.map +1 -0
  89. package/dist/index.d.ts +1 -1
  90. package/dist/index.d.ts.map +1 -1
  91. package/dist/index.js +1 -1
  92. package/dist/index.js.map +1 -1
  93. package/dist/integrations/notifications/desktop/freedesktop.d.ts +10 -0
  94. package/dist/integrations/notifications/desktop/freedesktop.d.ts.map +1 -0
  95. package/dist/integrations/notifications/desktop/freedesktop.js +33 -0
  96. package/dist/integrations/notifications/desktop/freedesktop.js.map +1 -0
  97. package/dist/integrations/notifications/desktop/macos.d.ts +6 -0
  98. package/dist/integrations/notifications/desktop/macos.d.ts.map +1 -0
  99. package/dist/integrations/notifications/desktop/macos.js +17 -0
  100. package/dist/integrations/notifications/desktop/macos.js.map +1 -0
  101. package/dist/integrations/notifications/desktop/sanitize.d.ts +16 -0
  102. package/dist/integrations/notifications/desktop/sanitize.d.ts.map +1 -0
  103. package/dist/integrations/notifications/desktop/sanitize.js +49 -0
  104. package/dist/integrations/notifications/desktop/sanitize.js.map +1 -0
  105. package/dist/integrations/notifications/desktop/throttle.d.ts +10 -0
  106. package/dist/integrations/notifications/desktop/throttle.d.ts.map +1 -0
  107. package/dist/integrations/notifications/desktop/throttle.js +39 -0
  108. package/dist/integrations/notifications/desktop/throttle.js.map +1 -0
  109. package/dist/integrations/notifications/desktop/windows-toast.d.ts +23 -0
  110. package/dist/integrations/notifications/desktop/windows-toast.d.ts.map +1 -0
  111. package/dist/integrations/notifications/desktop/windows-toast.js +56 -0
  112. package/dist/integrations/notifications/desktop/windows-toast.js.map +1 -0
  113. package/dist/integrations/notifications/desktop.d.ts +84 -0
  114. package/dist/integrations/notifications/desktop.d.ts.map +1 -0
  115. package/dist/integrations/notifications/desktop.js +199 -0
  116. package/dist/integrations/notifications/desktop.js.map +1 -0
  117. package/dist/integrations/plugins/runtime.d.ts +8 -2
  118. package/dist/integrations/plugins/runtime.d.ts.map +1 -1
  119. package/dist/integrations/plugins/runtime.js +14 -8
  120. package/dist/integrations/plugins/runtime.js.map +1 -1
  121. package/dist/integrations/providers/harness-credentials.d.ts +9 -4
  122. package/dist/integrations/providers/harness-credentials.d.ts.map +1 -1
  123. package/dist/integrations/providers/harness-credentials.js +16 -8
  124. package/dist/integrations/providers/harness-credentials.js.map +1 -1
  125. package/dist/integrations/resident/session-step.d.ts.map +1 -1
  126. package/dist/integrations/resident/session-step.js +1 -0
  127. package/dist/integrations/resident/session-step.js.map +1 -1
  128. package/dist/integrations/subagents/runtime.d.ts +6 -0
  129. package/dist/integrations/subagents/runtime.d.ts.map +1 -1
  130. package/dist/integrations/subagents/runtime.js +14 -5
  131. package/dist/integrations/subagents/runtime.js.map +1 -1
  132. package/dist/integrations/web/open-url.d.ts +24 -0
  133. package/dist/integrations/web/open-url.d.ts.map +1 -0
  134. package/dist/integrations/web/open-url.js +73 -0
  135. package/dist/integrations/web/open-url.js.map +1 -0
  136. package/dist/permissions/browser-sites.d.ts +95 -0
  137. package/dist/permissions/browser-sites.d.ts.map +1 -0
  138. package/dist/permissions/browser-sites.js +270 -0
  139. package/dist/permissions/browser-sites.js.map +1 -0
  140. package/dist/schedule/build.d.ts +86 -0
  141. package/dist/schedule/build.d.ts.map +1 -0
  142. package/dist/schedule/build.js +267 -0
  143. package/dist/schedule/build.js.map +1 -0
  144. package/dist/schedule/changes.d.ts +28 -0
  145. package/dist/schedule/changes.d.ts.map +1 -0
  146. package/dist/schedule/changes.js +65 -0
  147. package/dist/schedule/changes.js.map +1 -0
  148. package/dist/schedule/commands/add.d.ts +24 -0
  149. package/dist/schedule/commands/add.d.ts.map +1 -0
  150. package/dist/schedule/commands/add.js +447 -0
  151. package/dist/schedule/commands/add.js.map +1 -0
  152. package/dist/schedule/commands/args.d.ts +22 -0
  153. package/dist/schedule/commands/args.d.ts.map +1 -0
  154. package/dist/schedule/commands/args.js +80 -0
  155. package/dist/schedule/commands/args.js.map +1 -0
  156. package/dist/schedule/commands/confirm-prompt.d.ts +6 -0
  157. package/dist/schedule/commands/confirm-prompt.d.ts.map +1 -0
  158. package/dist/schedule/commands/confirm-prompt.js +21 -0
  159. package/dist/schedule/commands/confirm-prompt.js.map +1 -0
  160. package/dist/schedule/commands/lifecycle.d.ts +39 -0
  161. package/dist/schedule/commands/lifecycle.d.ts.map +1 -0
  162. package/dist/schedule/commands/lifecycle.js +586 -0
  163. package/dist/schedule/commands/lifecycle.js.map +1 -0
  164. package/dist/schedule/commands/list.d.ts +33 -0
  165. package/dist/schedule/commands/list.d.ts.map +1 -0
  166. package/dist/schedule/commands/list.js +206 -0
  167. package/dist/schedule/commands/list.js.map +1 -0
  168. package/dist/schedule/commands/logs.d.ts +7 -0
  169. package/dist/schedule/commands/logs.d.ts.map +1 -0
  170. package/dist/schedule/commands/logs.js +106 -0
  171. package/dist/schedule/commands/logs.js.map +1 -0
  172. package/dist/schedule/commands/service.d.ts +16 -0
  173. package/dist/schedule/commands/service.d.ts.map +1 -0
  174. package/dist/schedule/commands/service.js +458 -0
  175. package/dist/schedule/commands/service.js.map +1 -0
  176. package/dist/schedule/daemon/daemon.d.ts +156 -0
  177. package/dist/schedule/daemon/daemon.d.ts.map +1 -0
  178. package/dist/schedule/daemon/daemon.js +1253 -0
  179. package/dist/schedule/daemon/daemon.js.map +1 -0
  180. package/dist/schedule/daemon/endpoint.d.ts +38 -0
  181. package/dist/schedule/daemon/endpoint.d.ts.map +1 -0
  182. package/dist/schedule/daemon/endpoint.js +158 -0
  183. package/dist/schedule/daemon/endpoint.js.map +1 -0
  184. package/dist/schedule/daemon/exit.d.ts +8 -0
  185. package/dist/schedule/daemon/exit.d.ts.map +1 -0
  186. package/dist/schedule/daemon/exit.js +8 -0
  187. package/dist/schedule/daemon/exit.js.map +1 -0
  188. package/dist/schedule/daemon/log.d.ts +12 -0
  189. package/dist/schedule/daemon/log.d.ts.map +1 -0
  190. package/dist/schedule/daemon/log.js +53 -0
  191. package/dist/schedule/daemon/log.js.map +1 -0
  192. package/dist/schedule/daemon/notify.d.ts +38 -0
  193. package/dist/schedule/daemon/notify.d.ts.map +1 -0
  194. package/dist/schedule/daemon/notify.js +115 -0
  195. package/dist/schedule/daemon/notify.js.map +1 -0
  196. package/dist/schedule/daemon/retention.d.ts +16 -0
  197. package/dist/schedule/daemon/retention.d.ts.map +1 -0
  198. package/dist/schedule/daemon/retention.js +46 -0
  199. package/dist/schedule/daemon/retention.js.map +1 -0
  200. package/dist/schedule/daemon/sessions.d.ts +23 -0
  201. package/dist/schedule/daemon/sessions.d.ts.map +1 -0
  202. package/dist/schedule/daemon/sessions.js +52 -0
  203. package/dist/schedule/daemon/sessions.js.map +1 -0
  204. package/dist/schedule/env.d.ts +32 -0
  205. package/dist/schedule/env.d.ts.map +1 -0
  206. package/dist/schedule/env.js +106 -0
  207. package/dist/schedule/env.js.map +1 -0
  208. package/dist/schedule/fire/browser-preflight.d.ts +41 -0
  209. package/dist/schedule/fire/browser-preflight.d.ts.map +1 -0
  210. package/dist/schedule/fire/browser-preflight.js +73 -0
  211. package/dist/schedule/fire/browser-preflight.js.map +1 -0
  212. package/dist/schedule/fire/calls.d.ts +49 -0
  213. package/dist/schedule/fire/calls.d.ts.map +1 -0
  214. package/dist/schedule/fire/calls.js +114 -0
  215. package/dist/schedule/fire/calls.js.map +1 -0
  216. package/dist/schedule/fire/fire.d.ts +78 -0
  217. package/dist/schedule/fire/fire.d.ts.map +1 -0
  218. package/dist/schedule/fire/fire.js +490 -0
  219. package/dist/schedule/fire/fire.js.map +1 -0
  220. package/dist/schedule/fire/result.d.ts +13 -0
  221. package/dist/schedule/fire/result.d.ts.map +1 -0
  222. package/dist/schedule/fire/result.js +18 -0
  223. package/dist/schedule/fire/result.js.map +1 -0
  224. package/dist/schedule/fire/unattended-note.d.ts +22 -0
  225. package/dist/schedule/fire/unattended-note.d.ts.map +1 -0
  226. package/dist/schedule/fire/unattended-note.js +46 -0
  227. package/dist/schedule/fire/unattended-note.js.map +1 -0
  228. package/dist/schedule/floor.d.ts +136 -0
  229. package/dist/schedule/floor.d.ts.map +1 -0
  230. package/dist/schedule/floor.js +1289 -0
  231. package/dist/schedule/floor.js.map +1 -0
  232. package/dist/schedule/folder.d.ts +34 -0
  233. package/dist/schedule/folder.d.ts.map +1 -0
  234. package/dist/schedule/folder.js +84 -0
  235. package/dist/schedule/folder.js.map +1 -0
  236. package/dist/schedule/paths.d.ts +49 -0
  237. package/dist/schedule/paths.d.ts.map +1 -0
  238. package/dist/schedule/paths.js +53 -0
  239. package/dist/schedule/paths.js.map +1 -0
  240. package/dist/schedule/policy.d.ts +141 -0
  241. package/dist/schedule/policy.d.ts.map +1 -0
  242. package/dist/schedule/policy.js +378 -0
  243. package/dist/schedule/policy.js.map +1 -0
  244. package/dist/schedule/resume-command.d.ts +36 -0
  245. package/dist/schedule/resume-command.d.ts.map +1 -0
  246. package/dist/schedule/resume-command.js +72 -0
  247. package/dist/schedule/resume-command.js.map +1 -0
  248. package/dist/schedule/service/detect.d.ts +22 -0
  249. package/dist/schedule/service/detect.d.ts.map +1 -0
  250. package/dist/schedule/service/detect.js +29 -0
  251. package/dist/schedule/service/detect.js.map +1 -0
  252. package/dist/schedule/service/index.d.ts +48 -0
  253. package/dist/schedule/service/index.d.ts.map +1 -0
  254. package/dist/schedule/service/index.js +361 -0
  255. package/dist/schedule/service/index.js.map +1 -0
  256. package/dist/schedule/service/launchd.d.ts +24 -0
  257. package/dist/schedule/service/launchd.d.ts.map +1 -0
  258. package/dist/schedule/service/launchd.js +84 -0
  259. package/dist/schedule/service/launchd.js.map +1 -0
  260. package/dist/schedule/service/manifest.d.ts +44 -0
  261. package/dist/schedule/service/manifest.d.ts.map +1 -0
  262. package/dist/schedule/service/manifest.js +16 -0
  263. package/dist/schedule/service/manifest.js.map +1 -0
  264. package/dist/schedule/service/names.d.ts +9 -0
  265. package/dist/schedule/service/names.d.ts.map +1 -0
  266. package/dist/schedule/service/names.js +22 -0
  267. package/dist/schedule/service/names.js.map +1 -0
  268. package/dist/schedule/service/quote.d.ts +24 -0
  269. package/dist/schedule/service/quote.d.ts.map +1 -0
  270. package/dist/schedule/service/quote.js +64 -0
  271. package/dist/schedule/service/quote.js.map +1 -0
  272. package/dist/schedule/service/runner.d.ts +17 -0
  273. package/dist/schedule/service/runner.d.ts.map +1 -0
  274. package/dist/schedule/service/runner.js +31 -0
  275. package/dist/schedule/service/runner.js.map +1 -0
  276. package/dist/schedule/service/systemd.d.ts +37 -0
  277. package/dist/schedule/service/systemd.d.ts.map +1 -0
  278. package/dist/schedule/service/systemd.js +96 -0
  279. package/dist/schedule/service/systemd.js.map +1 -0
  280. package/dist/schedule/service/windows-task.d.ts +58 -0
  281. package/dist/schedule/service/windows-task.d.ts.map +1 -0
  282. package/dist/schedule/service/windows-task.js +199 -0
  283. package/dist/schedule/service/windows-task.js.map +1 -0
  284. package/dist/schedule/service/wsl.d.ts +69 -0
  285. package/dist/schedule/service/wsl.d.ts.map +1 -0
  286. package/dist/schedule/service/wsl.js +121 -0
  287. package/dist/schedule/service/wsl.js.map +1 -0
  288. package/dist/schedule/store/atomic.d.ts +43 -0
  289. package/dist/schedule/store/atomic.d.ts.map +1 -0
  290. package/dist/schedule/store/atomic.js +135 -0
  291. package/dist/schedule/store/atomic.js.map +1 -0
  292. package/dist/schedule/store/claims.d.ts +26 -0
  293. package/dist/schedule/store/claims.d.ts.map +1 -0
  294. package/dist/schedule/store/claims.js +57 -0
  295. package/dist/schedule/store/claims.js.map +1 -0
  296. package/dist/schedule/store/digest.d.ts +18 -0
  297. package/dist/schedule/store/digest.d.ts.map +1 -0
  298. package/dist/schedule/store/digest.js +139 -0
  299. package/dist/schedule/store/digest.js.map +1 -0
  300. package/dist/schedule/store/history.d.ts +21 -0
  301. package/dist/schedule/store/history.d.ts.map +1 -0
  302. package/dist/schedule/store/history.js +114 -0
  303. package/dist/schedule/store/history.js.map +1 -0
  304. package/dist/schedule/store/jobs.d.ts +61 -0
  305. package/dist/schedule/store/jobs.d.ts.map +1 -0
  306. package/dist/schedule/store/jobs.js +210 -0
  307. package/dist/schedule/store/jobs.js.map +1 -0
  308. package/dist/schedule/store/state.d.ts +19 -0
  309. package/dist/schedule/store/state.d.ts.map +1 -0
  310. package/dist/schedule/store/state.js +38 -0
  311. package/dist/schedule/store/state.js.map +1 -0
  312. package/dist/schedule/types.d.ts +283 -0
  313. package/dist/schedule/types.d.ts.map +1 -0
  314. package/dist/schedule/types.js +9 -0
  315. package/dist/schedule/types.js.map +1 -0
  316. package/dist/skills/catalog.d.ts +96 -0
  317. package/dist/skills/catalog.d.ts.map +1 -0
  318. package/dist/skills/catalog.js +226 -0
  319. package/dist/skills/catalog.js.map +1 -0
  320. package/dist/skills/directory.d.ts +38 -0
  321. package/dist/skills/directory.d.ts.map +1 -0
  322. package/dist/skills/directory.js +51 -0
  323. package/dist/skills/directory.js.map +1 -0
  324. package/dist/skills/save.d.ts +148 -0
  325. package/dist/skills/save.d.ts.map +1 -0
  326. package/dist/skills/save.js +344 -0
  327. package/dist/skills/save.js.map +1 -0
  328. package/dist/skills/store.d.ts +103 -16
  329. package/dist/skills/store.d.ts.map +1 -1
  330. package/dist/skills/store.js +227 -30
  331. package/dist/skills/store.js.map +1 -1
  332. package/dist/tui/App.d.ts.map +1 -1
  333. package/dist/tui/App.js +609 -74
  334. package/dist/tui/App.js.map +1 -1
  335. package/dist/tui/LiveActivity.d.ts +8 -1
  336. package/dist/tui/LiveActivity.d.ts.map +1 -1
  337. package/dist/tui/LiveActivity.js +20 -4
  338. package/dist/tui/LiveActivity.js.map +1 -1
  339. package/dist/tui/PermissionOverlay.d.ts +36 -4
  340. package/dist/tui/PermissionOverlay.d.ts.map +1 -1
  341. package/dist/tui/PermissionOverlay.js +135 -15
  342. package/dist/tui/PermissionOverlay.js.map +1 -1
  343. package/dist/tui/SaveSkillOverlay.d.ts +33 -0
  344. package/dist/tui/SaveSkillOverlay.d.ts.map +1 -0
  345. package/dist/tui/SaveSkillOverlay.js +118 -0
  346. package/dist/tui/SaveSkillOverlay.js.map +1 -0
  347. package/dist/tui/agent.d.ts +208 -6
  348. package/dist/tui/agent.d.ts.map +1 -1
  349. package/dist/tui/agent.js +371 -58
  350. package/dist/tui/agent.js.map +1 -1
  351. package/dist/tui/browser-notices.d.ts +33 -0
  352. package/dist/tui/browser-notices.d.ts.map +1 -0
  353. package/dist/tui/browser-notices.js +102 -0
  354. package/dist/tui/browser-notices.js.map +1 -0
  355. package/dist/tui/open-browser.d.ts +29 -1
  356. package/dist/tui/open-browser.d.ts.map +1 -1
  357. package/dist/tui/open-browser.js +83 -11
  358. package/dist/tui/open-browser.js.map +1 -1
  359. package/dist/tui/permission-review.d.ts +10 -1
  360. package/dist/tui/permission-review.d.ts.map +1 -1
  361. package/dist/tui/permission-review.js +228 -22
  362. package/dist/tui/permission-review.js.map +1 -1
  363. package/dist/tui/schedule/host-commands.d.ts +34 -0
  364. package/dist/tui/schedule/host-commands.d.ts.map +1 -0
  365. package/dist/tui/schedule/host-commands.js +310 -0
  366. package/dist/tui/schedule/host-commands.js.map +1 -0
  367. package/dist/tui/schedule/integration.d.ts +62 -0
  368. package/dist/tui/schedule/integration.d.ts.map +1 -0
  369. package/dist/tui/schedule/integration.js +145 -0
  370. package/dist/tui/schedule/integration.js.map +1 -0
  371. package/dist/tui/schedule/loop-host.d.ts +42 -0
  372. package/dist/tui/schedule/loop-host.d.ts.map +1 -0
  373. package/dist/tui/schedule/loop-host.js +153 -0
  374. package/dist/tui/schedule/loop-host.js.map +1 -0
  375. package/dist/tui/schedule/resume.d.ts +122 -0
  376. package/dist/tui/schedule/resume.d.ts.map +1 -0
  377. package/dist/tui/schedule/resume.js +324 -0
  378. package/dist/tui/schedule/resume.js.map +1 -0
  379. package/dist/tui/schedule/startup.d.ts +11 -0
  380. package/dist/tui/schedule/startup.d.ts.map +1 -0
  381. package/dist/tui/schedule/startup.js +121 -0
  382. package/dist/tui/schedule/startup.js.map +1 -0
  383. package/dist/tui/schedule/tool-host.d.ts +58 -0
  384. package/dist/tui/schedule/tool-host.d.ts.map +1 -0
  385. package/dist/tui/schedule/tool-host.js +479 -0
  386. package/dist/tui/schedule/tool-host.js.map +1 -0
  387. package/dist/tui/skills/learning.d.ts +74 -0
  388. package/dist/tui/skills/learning.d.ts.map +1 -0
  389. package/dist/tui/skills/learning.js +131 -0
  390. package/dist/tui/skills/learning.js.map +1 -0
  391. package/dist/tui/skills/suggest-setting.d.ts +22 -0
  392. package/dist/tui/skills/suggest-setting.d.ts.map +1 -0
  393. package/dist/tui/skills/suggest-setting.js +55 -0
  394. package/dist/tui/skills/suggest-setting.js.map +1 -0
  395. package/dist/tui/skills/suggestion-ledger.d.ts +35 -0
  396. package/dist/tui/skills/suggestion-ledger.d.ts.map +1 -0
  397. package/dist/tui/skills/suggestion-ledger.js +52 -0
  398. package/dist/tui/skills/suggestion-ledger.js.map +1 -0
  399. package/dist/tui/slashCommands.d.ts +20 -0
  400. package/dist/tui/slashCommands.d.ts.map +1 -1
  401. package/dist/tui/slashCommands.js +76 -2
  402. package/dist/tui/slashCommands.js.map +1 -1
  403. package/dist/tui/turn-interruption.d.ts +20 -1
  404. package/dist/tui/turn-interruption.d.ts.map +1 -1
  405. package/dist/tui/turn-interruption.js +43 -0
  406. package/dist/tui/turn-interruption.js.map +1 -1
  407. package/dist/tui/types.d.ts +9 -1
  408. package/dist/tui/types.d.ts.map +1 -1
  409. package/package.json +7 -5
  410. package/skills/README.md +20 -0
  411. package/skills/browser-automation/SKILL.md +84 -0
  412. package/skills/schedule-task/SKILL.md +146 -0
  413. package/skills/skill-creator/SKILL.md +101 -0
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Every run is its own session, and a job every minute would leave 1 440 a
3
+ * day in the folder's `/resume` list. After each completed run the daemon
4
+ * ARCHIVES (never deletes) this job's completed-run sessions beyond the
5
+ * newest `retention.keepSessions` — `session_updated{ archived: true }`, the
6
+ * same read-only tombstone `/archive` writes. Parked, failed and interrupted
7
+ * runs are never archived here. `namzu schedule prune` is the only thing that
8
+ * deletes.
9
+ */
10
+ import { asSessionId } from '@namzu/sdk';
11
+ import { archiveConversation, closeSessions, openSessions, } from '../../integrations/sessions/store.js';
12
+ import { foldHistory, readHistory } from '../store/history.js';
13
+ /** The session ids retention would archive now. */
14
+ export function sessionsToArchive(paths, job, state) {
15
+ const done = new Set(state.archivedSessions ?? []);
16
+ const completed = foldHistory(readHistory(paths, job.id)).filter((r) => r.kind === 'run' && r.status === 'completed' && typeof r.sessionId === 'string');
17
+ return completed
18
+ .slice(Math.max(0, job.retention.keepSessions))
19
+ .map((r) => r.sessionId)
20
+ .filter((id) => !done.has(id));
21
+ }
22
+ /** Archive what retention allows. Returns the ids archived (or already archived). */
23
+ export async function archiveOldRuns(paths, job, state) {
24
+ const ids = sessionsToArchive(paths, job, state);
25
+ if (ids.length === 0)
26
+ return [];
27
+ const sessions = await openSessions(job.folder.canonical, { stateRoot: paths.home });
28
+ const archived = [];
29
+ try {
30
+ for (const id of ids) {
31
+ try {
32
+ await archiveConversation(sessions, asSessionId(id));
33
+ archived.push(id);
34
+ }
35
+ catch (error) {
36
+ if (error instanceof Error && /already archived/.test(error.message))
37
+ archived.push(id);
38
+ }
39
+ }
40
+ }
41
+ finally {
42
+ closeSessions(sessions);
43
+ }
44
+ return archived;
45
+ }
46
+ //# sourceMappingURL=retention.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retention.js","sourceRoot":"","sources":["../../../src/schedule/daemon/retention.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,EACN,mBAAmB,EACnB,aAAa,EACb,YAAY,GACZ,MAAM,sCAAsC,CAAA;AAE7C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAG9D,mDAAmD;AACnD,MAAM,UAAU,iBAAiB,CAChC,KAAoB,EACpB,GAAgB,EAChB,KAAiD;IAEjD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAA;IAClD,MAAM,SAAS,GAAG,WAAW,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAC/D,CAAC,CAAC,EAA2C,EAAE,CAC9C,CAAC,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,MAAM,KAAK,WAAW,IAAI,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ,CAChF,CAAA;IACD,OAAO,SAAS;SACd,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;SAC9C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAmB,CAAC;SACjC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;AAChC,CAAC;AAED,qFAAqF;AACrF,MAAM,CAAC,KAAK,UAAU,cAAc,CACnC,KAAoB,EACpB,GAAgB,EAChB,KAAiD;IAEjD,MAAM,GAAG,GAAG,iBAAiB,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;IAChD,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IAC/B,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;IACpF,MAAM,QAAQ,GAAa,EAAE,CAAA;IAC7B,IAAI,CAAC;QACJ,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACtB,IAAI,CAAC;gBACJ,MAAM,mBAAmB,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,CAAA;gBACpD,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YAClB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,IAAI,KAAK,YAAY,KAAK,IAAI,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;oBAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YACxF,CAAC;QACF,CAAC;IACF,CAAC;YAAS,CAAC;QACV,aAAa,CAAC,QAAQ,CAAC,CAAA;IACxB,CAAC;IACD,OAAO,QAAQ,CAAA;AAChB,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * What the daemon reads about a run's session: whether its lease is held,
3
+ * and how its turn ended. Read-only, from the log and the lease files; the
4
+ * daemon writes a session only to abandon an expired park and to archive old
5
+ * runs.
6
+ */
7
+ import { type ConversationFacts } from '../../integrations/sessions/store.js';
8
+ export interface RunSessionRef {
9
+ readonly home: string;
10
+ readonly projectSlug: string;
11
+ readonly sessionId: string;
12
+ }
13
+ /** Whether somebody holds the session's writer lease right now. */
14
+ export declare function sessionLeaseLive(ref: RunSessionRef, now?: number): Promise<boolean>;
15
+ export declare function sessionFacts(ref: RunSessionRef): Promise<ConversationFacts | null>;
16
+ /** How a settled turn ended: `completed`, `failed`, or `undefined` if the log does not say. */
17
+ export declare function turnOutcome(facts: ConversationFacts, turnId: string | undefined): {
18
+ status: 'completed' | 'failed';
19
+ reason?: string;
20
+ } | undefined;
21
+ /** Close a parked turn nobody answered in time (`turn_failed{ abandoned }`). */
22
+ export declare function abandonParkedTurn(ref: RunSessionRef, turnId: string, reason: string): Promise<void>;
23
+ //# sourceMappingURL=sessions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../../src/schedule/daemon/sessions.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,OAAO,EAAE,KAAK,iBAAiB,EAAyB,MAAM,sCAAsC,CAAA;AAEpG,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAC1B;AAMD,mEAAmE;AACnE,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,SAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAO7F;AAED,wBAAsB,YAAY,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAUxF;AAED,+FAA+F;AAC/F,wBAAgB,WAAW,CAC1B,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,MAAM,GAAG,SAAS,GACxB;IAAE,MAAM,EAAE,WAAW,GAAG,QAAQ,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAiBjE;AAED,gFAAgF;AAChF,wBAAsB,iBAAiB,CACtC,GAAG,EAAE,aAAa,EAClB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAGf"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * What the daemon reads about a run's session: whether its lease is held,
3
+ * and how its turn ended. Read-only, from the log and the lease files; the
4
+ * daemon writes a session only to abandon an expired park and to archive old
5
+ * runs.
6
+ */
7
+ import { DiskSessionLog, SessionPaths, abandonTurn, asSessionId, isLeaseLive, readSessionLease, } from '@namzu/sdk';
8
+ import { readConversationFacts } from '../../integrations/sessions/store.js';
9
+ function pathsOf(ref) {
10
+ return new SessionPaths({ home: ref.home, slug: ref.projectSlug });
11
+ }
12
+ /** Whether somebody holds the session's writer lease right now. */
13
+ export async function sessionLeaseLive(ref, now = Date.now()) {
14
+ const dir = pathsOf(ref).sessionDir({ sessionId: asSessionId(ref.sessionId) });
15
+ try {
16
+ return isLeaseLive(await readSessionLease(dir), now);
17
+ }
18
+ catch {
19
+ return false;
20
+ }
21
+ }
22
+ export async function sessionFacts(ref) {
23
+ try {
24
+ return await readConversationFacts({ paths: pathsOf(ref) }, asSessionId(ref.sessionId), 'tolerant');
25
+ }
26
+ catch {
27
+ return null;
28
+ }
29
+ }
30
+ /** How a settled turn ended: `completed`, `failed`, or `undefined` if the log does not say. */
31
+ export function turnOutcome(facts, turnId) {
32
+ for (let i = facts.records.length - 1; i >= 0; i--) {
33
+ const record = facts.records[i];
34
+ if (turnId && record.turnId !== turnId)
35
+ continue;
36
+ if (record.type === 'turn_completed')
37
+ return { status: 'completed' };
38
+ if (record.type === 'turn_failed') {
39
+ return {
40
+ status: 'failed',
41
+ ...(record.error?.message ? { reason: record.error.message } : {}),
42
+ };
43
+ }
44
+ }
45
+ return undefined;
46
+ }
47
+ /** Close a parked turn nobody answered in time (`turn_failed{ abandoned }`). */
48
+ export async function abandonParkedTurn(ref, turnId, reason) {
49
+ const log = DiskSessionLog.at(pathsOf(ref), { sessionId: asSessionId(ref.sessionId) });
50
+ await abandonTurn(asSessionId(ref.sessionId), turnId, reason, { log });
51
+ }
52
+ //# sourceMappingURL=sessions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../../src/schedule/daemon/sessions.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACN,cAAc,EACd,YAAY,EAEZ,WAAW,EACX,WAAW,EACX,WAAW,EACX,gBAAgB,GAChB,MAAM,YAAY,CAAA;AACnB,OAAO,EAA0B,qBAAqB,EAAE,MAAM,sCAAsC,CAAA;AAQpG,SAAS,OAAO,CAAC,GAAkB;IAClC,OAAO,IAAI,YAAY,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC,CAAA;AACnE,CAAC;AAED,mEAAmE;AACnE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAkB,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IAC1E,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;IAC9E,IAAI,CAAC;QACJ,OAAO,WAAW,CAAC,MAAM,gBAAgB,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAA;IACrD,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,KAAK,CAAA;IACb,CAAC;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAkB;IACpD,IAAI,CAAC;QACJ,OAAO,MAAM,qBAAqB,CACjC,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,EACvB,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,EAC1B,UAAU,CACV,CAAA;IACF,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAA;IACZ,CAAC;AACF,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,WAAW,CAC1B,KAAwB,EACxB,MAA0B;IAE1B,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACpD,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAI7B,CAAA;QACD,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM;YAAE,SAAQ;QAChD,IAAI,MAAM,CAAC,IAAI,KAAK,gBAAgB;YAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAA;QACpE,IAAI,MAAM,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YACnC,OAAO;gBACN,MAAM,EAAE,QAAQ;gBAChB,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAClE,CAAA;QACF,CAAC;IACF,CAAC;IACD,OAAO,SAAS,CAAA;AACjB,CAAC;AAED,gFAAgF;AAChF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACtC,GAAkB,EAClB,MAAc,EACd,MAAc;IAEd,MAAM,GAAG,GAAG,cAAc,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;IACtF,MAAM,WAAW,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,MAAgB,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,CAAA;AACjF,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * The environment a scheduled run starts with.
3
+ *
4
+ * A service does not see what an interactive shell exported, so the daemon
5
+ * builds each child's environment from an allowlist rather than passing its
6
+ * own along; `daemon.env` (0600, `KEY=value` lines) supplies credentials. Its
7
+ * values reach PROVIDER DISCOVERY only — the fire child reads the file itself
8
+ * and hands the variables to discovery as an object, never into `process.env`,
9
+ * where the bash tool would inherit whatever name a credential happened to
10
+ * have.
11
+ */
12
+ /** Variables a child inherits from the daemon. Nothing else. */
13
+ export declare const CHILD_ENV_ALLOWLIST: readonly ["HOME", "USER", "LOGNAME", "LANG", "LC_ALL", "TZ", "TMPDIR", "SHELL", "XDG_RUNTIME_DIR", "XDG_CONFIG_HOME", "DBUS_SESSION_BUS_ADDRESS", "WSL_DISTRO_NAME", "WSL_INTEROP", "SystemRoot", "USERPROFILE", "APPDATA", "LOCALAPPDATA", "DISPLAY", "WAYLAND_DISPLAY", "XAUTHORITY"];
14
+ /**
15
+ * `PATH` without Windows drive mounts: under WSL a failed lookup through
16
+ * `/mnt/c` costs seconds. The drives are the one-letter directories under
17
+ * the mount root `/etc/wsl.conf` sets (`[automount] root`, `/mnt/` by default).
18
+ */
19
+ export declare function stripWindowsMounts(path: string | undefined, mountRoot?: string): string;
20
+ /** The environment of a fire child. `mountRoot` is for a test; absent reads `/etc/wsl.conf`. */
21
+ export declare function childEnvironment(source: NodeJS.ProcessEnv, namzuHome: string, mountRoot?: string): NodeJS.ProcessEnv;
22
+ export interface DaemonEnvFile {
23
+ readonly values: Readonly<Record<string, string>>;
24
+ readonly warnings: readonly string[];
25
+ }
26
+ /**
27
+ * Read `daemon.env`: `KEY=value` per line, `#` comments, optional matching
28
+ * quotes around a value. A file others can read is reported, not refused:
29
+ * refusing would stop every job over a mode bit.
30
+ */
31
+ export declare function readDaemonEnv(path: string): DaemonEnvFile;
32
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/schedule/env.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,gEAAgE;AAChE,eAAO,MAAM,mBAAmB,yRAuBtB,CAAA;AAEV;;;;GAIG;AACH,wBAAgB,kBAAkB,CACjC,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,SAAS,GAAE,MAA2B,GACpC,MAAM,CAOR;AAED,gGAAgG;AAChG,wBAAgB,gBAAgB,CAC/B,MAAM,EAAE,MAAM,CAAC,UAAU,EACzB,SAAS,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,MAAM,GAChB,MAAM,CAAC,UAAU,CAUnB;AAED,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IACjD,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;CACpC;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CA8BzD"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * The environment a scheduled run starts with.
3
+ *
4
+ * A service does not see what an interactive shell exported, so the daemon
5
+ * builds each child's environment from an allowlist rather than passing its
6
+ * own along; `daemon.env` (0600, `KEY=value` lines) supplies credentials. Its
7
+ * values reach PROVIDER DISCOVERY only — the fire child reads the file itself
8
+ * and hands the variables to discovery as an object, never into `process.env`,
9
+ * where the bash tool would inherit whatever name a credential happened to
10
+ * have.
11
+ */
12
+ import { readFileSync, statSync } from 'node:fs';
13
+ import { readWslMountRoot } from '../context/environment.js';
14
+ /** Variables a child inherits from the daemon. Nothing else. */
15
+ export const CHILD_ENV_ALLOWLIST = [
16
+ 'HOME',
17
+ 'USER',
18
+ 'LOGNAME',
19
+ 'LANG',
20
+ 'LC_ALL',
21
+ 'TZ',
22
+ 'TMPDIR',
23
+ 'SHELL',
24
+ 'XDG_RUNTIME_DIR',
25
+ 'XDG_CONFIG_HOME',
26
+ 'DBUS_SESSION_BUS_ADDRESS',
27
+ 'WSL_DISTRO_NAME',
28
+ 'WSL_INTEROP',
29
+ 'SystemRoot',
30
+ 'USERPROFILE',
31
+ 'APPDATA',
32
+ 'LOCALAPPDATA',
33
+ // A job with `browser.headed` opens a window: X11, Wayland (WSLg sets
34
+ // both), and the X authority file a display may need.
35
+ 'DISPLAY',
36
+ 'WAYLAND_DISPLAY',
37
+ 'XAUTHORITY',
38
+ ];
39
+ /**
40
+ * `PATH` without Windows drive mounts: under WSL a failed lookup through
41
+ * `/mnt/c` costs seconds. The drives are the one-letter directories under
42
+ * the mount root `/etc/wsl.conf` sets (`[automount] root`, `/mnt/` by default).
43
+ */
44
+ export function stripWindowsMounts(path, mountRoot = readWslMountRoot()) {
45
+ const root = mountRoot.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
46
+ const drive = new RegExp(`^${root}[a-z](/|$)`, 'i');
47
+ return (path ?? '')
48
+ .split(':')
49
+ .filter((entry) => entry !== '' && !drive.test(entry))
50
+ .join(':');
51
+ }
52
+ /** The environment of a fire child. `mountRoot` is for a test; absent reads `/etc/wsl.conf`. */
53
+ export function childEnvironment(source, namzuHome, mountRoot) {
54
+ const env = {};
55
+ for (const key of CHILD_ENV_ALLOWLIST)
56
+ if (source[key] !== undefined)
57
+ env[key] = source[key];
58
+ env.PATH =
59
+ process.platform === 'win32'
60
+ ? (source.PATH ?? source.Path ?? '')
61
+ : stripWindowsMounts(source.PATH, mountRoot);
62
+ if (!env.PATH)
63
+ env.PATH = '/usr/local/bin:/usr/bin:/bin';
64
+ env.NAMZU_HOME = namzuHome;
65
+ return env;
66
+ }
67
+ /**
68
+ * Read `daemon.env`: `KEY=value` per line, `#` comments, optional matching
69
+ * quotes around a value. A file others can read is reported, not refused:
70
+ * refusing would stop every job over a mode bit.
71
+ */
72
+ export function readDaemonEnv(path) {
73
+ let text;
74
+ try {
75
+ text = readFileSync(path, 'utf8');
76
+ }
77
+ catch {
78
+ return { values: {}, warnings: [] };
79
+ }
80
+ const warnings = [];
81
+ try {
82
+ const mode = statSync(path).mode & 0o077;
83
+ if (mode !== 0 && process.platform !== 'win32') {
84
+ warnings.push(`${path} can be read by other users; run chmod 600 on it`);
85
+ }
86
+ }
87
+ catch { }
88
+ const values = {};
89
+ text.split(/\r?\n/).forEach((raw, index) => {
90
+ const line = raw.trim();
91
+ if (!line || line.startsWith('#'))
92
+ return;
93
+ const match = /^(?:export\s+)?([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*)$/.exec(line);
94
+ if (!match) {
95
+ warnings.push(`${path}:${index + 1} is not KEY=value; ignored`);
96
+ return;
97
+ }
98
+ let value = match[2] ?? '';
99
+ if (value.length >= 2 && (value[0] === '"' || value[0] === "'") && value.at(-1) === value[0]) {
100
+ value = value.slice(1, -1);
101
+ }
102
+ values[match[1]] = value;
103
+ });
104
+ return { values, warnings };
105
+ }
106
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/schedule/env.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Whether a scheduled run with a browser grant can drive its browser, asked
3
+ * before any model call: a run that would stop at its first browser call
4
+ * because the profile is missing or the browser cannot start is
5
+ * `blocked-config` with nothing spent, and says what to do.
6
+ *
7
+ * Checks, in order: `@namzu/browser` loads; the profile has a descriptor in
8
+ * `NAMZU_HOME` and its user data directory is there; the engine the profile
9
+ * was signed in with can run in this process's environment (for the Windows
10
+ * browser from WSL: interop, `powershell.exe` and Chrome or Edge, which a
11
+ * systemd service finds through `/run/WSL`); and a window, when the job
12
+ * asks for one, has a display.
13
+ *
14
+ * The run uses the engine the profile belongs to, never another: a
15
+ * profile signed in with the Windows Chrome has its cookies there, and a
16
+ * local Chromium would start signed out.
17
+ */
18
+ import type { BrowserEngineSetting, BrowserEnvironmentProbes } from '@namzu/browser';
19
+ import type { ScheduleBrowserGrant } from '@namzu/sdk';
20
+ export type BrowserPreflight = {
21
+ readonly ok: true;
22
+ /** The engine the profile belongs to, forced for the run. */
23
+ readonly engine: Exclude<BrowserEngineSetting, 'auto'>;
24
+ /** Why the run's browser is what it is, for the run's warnings. */
25
+ readonly warnings: readonly string[];
26
+ } | {
27
+ readonly ok: false;
28
+ readonly reason: string;
29
+ };
30
+ export interface BrowserPreflightDependencies {
31
+ readonly env: NodeJS.ProcessEnv;
32
+ readonly platform?: NodeJS.Platform;
33
+ /** Test seam: the file-system questions detection asks. */
34
+ readonly probes?: BrowserEnvironmentProbes;
35
+ /** Test seam: whether a path exists. */
36
+ readonly exists?: (path: string) => boolean;
37
+ /** Test seam: the browser package. */
38
+ readonly load?: () => Promise<typeof import('@namzu/browser')>;
39
+ }
40
+ export declare function browserPreflight(grant: ScheduleBrowserGrant, home: string, deps: BrowserPreflightDependencies): Promise<BrowserPreflight>;
41
+ //# sourceMappingURL=browser-preflight.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-preflight.d.ts","sourceRoot":"","sources":["../../../src/schedule/fire/browser-preflight.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAA;AACpF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAEtD,MAAM,MAAM,gBAAgB,GACzB;IACA,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAA;IACjB,6DAA6D;IAC7D,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAA;IACtD,mEAAmE;IACnE,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;CACnC,GACD;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAElD,MAAM,WAAW,4BAA4B;IAC5C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAA;IAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAA;IACnC,2DAA2D;IAC3D,QAAQ,CAAC,MAAM,CAAC,EAAE,wBAAwB,CAAA;IAC1C,wCAAwC;IACxC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAA;IAC3C,sCAAsC;IACtC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,OAAO,CAAC,cAAc,gBAAgB,CAAC,CAAC,CAAA;CAC9D;AAED,wBAAsB,gBAAgB,CACrC,KAAK,EAAE,oBAAoB,EAC3B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,4BAA4B,GAChC,OAAO,CAAC,gBAAgB,CAAC,CA2D3B"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Whether a scheduled run with a browser grant can drive its browser, asked
3
+ * before any model call: a run that would stop at its first browser call
4
+ * because the profile is missing or the browser cannot start is
5
+ * `blocked-config` with nothing spent, and says what to do.
6
+ *
7
+ * Checks, in order: `@namzu/browser` loads; the profile has a descriptor in
8
+ * `NAMZU_HOME` and its user data directory is there; the engine the profile
9
+ * was signed in with can run in this process's environment (for the Windows
10
+ * browser from WSL: interop, `powershell.exe` and Chrome or Edge, which a
11
+ * systemd service finds through `/run/WSL`); and a window, when the job
12
+ * asks for one, has a display.
13
+ *
14
+ * The run uses the engine the profile belongs to, never another: a
15
+ * profile signed in with the Windows Chrome has its cookies there, and a
16
+ * local Chromium would start signed out.
17
+ */
18
+ import { existsSync } from 'node:fs';
19
+ export async function browserPreflight(grant, home, deps) {
20
+ let browser;
21
+ try {
22
+ browser = await (deps.load ?? (() => import('@namzu/browser')))();
23
+ }
24
+ catch (error) {
25
+ return {
26
+ ok: false,
27
+ reason: `the job uses the browser, but @namzu/browser cannot be loaded (${error instanceof Error ? error.message : String(error)}); run namzu doctor`,
28
+ };
29
+ }
30
+ const login = `namzu browser login ${grant.profile} ${Object.keys(grant.sites)[0] ?? '<url>'}`;
31
+ let descriptor;
32
+ try {
33
+ descriptor = new browser.BrowserProfileStore(home).get(grant.profile);
34
+ }
35
+ catch (error) {
36
+ return {
37
+ ok: false,
38
+ reason: `browser profile ${grant.profile} cannot be read: ${error instanceof Error ? error.message : String(error)}`,
39
+ };
40
+ }
41
+ if (!descriptor) {
42
+ return {
43
+ ok: false,
44
+ reason: `browser profile ${grant.profile} does not exist; sign in once with ${login}`,
45
+ };
46
+ }
47
+ const engine = descriptor.engine === 'windows-cdp' ? 'windows' : 'local';
48
+ const plan = browser.runnableBrowserPlan(browser.detectBrowserEnvironment(deps.env, deps.platform ?? process.platform, deps.probes ?? browser.nodeBrowserProbes, { engine, headless: grant.headed ? 'never' : 'always', mode: 'unattended' }));
49
+ if (plan.unavailableReason !== undefined) {
50
+ return {
51
+ ok: false,
52
+ reason: `the browser for profile ${grant.profile} cannot start here: ${plan.unavailableReason}`,
53
+ };
54
+ }
55
+ if (plan.engine !== descriptor.engine) {
56
+ return {
57
+ ok: false,
58
+ reason: `browser profile ${grant.profile} was signed in with ${descriptor.engine === 'windows-cdp' ? 'the Windows browser' : 'a browser inside Linux'}, and this run would use ${plan.engine === 'windows-cdp' ? 'the Windows browser' : 'a browser inside Linux'}`,
59
+ };
60
+ }
61
+ const exists = deps.exists ?? existsSync;
62
+ const dataDir = plan.engine === 'windows-cdp'
63
+ ? browser.windowsPathToWsl(descriptor.userDataDir, plan.mountRoot)
64
+ : descriptor.userDataDir;
65
+ if (dataDir === undefined || !exists(dataDir)) {
66
+ return {
67
+ ok: false,
68
+ reason: `browser profile ${grant.profile} has no data at ${descriptor.userDataDir}; sign in again with ${login}`,
69
+ };
70
+ }
71
+ return { ok: true, engine, warnings: plan.warnings };
72
+ }
73
+ //# sourceMappingURL=browser-preflight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-preflight.js","sourceRoot":"","sources":["../../../src/schedule/fire/browser-preflight.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * The tool calls of one scheduled run that did not do what they were for:
3
+ * refused (they never ran — a gate rule, the scheduled-run floor, the mode, a
4
+ * declined review) and failed (they ran and returned an error).
5
+ *
6
+ * A run ends `completed` when its turn ends normally, whatever its calls
7
+ * did: a run whose only command the floor refused ended `completed`, and its
8
+ * notification said `finished`. How the turn ended stays the status, and the
9
+ * counts with each kind's first reason travel beside it, in the run's
10
+ * result, its history record, the job's state and its notification.
11
+ */
12
+ import type { ScheduleCallTally } from '../types.js';
13
+ /** How long a recorded reason may be. */
14
+ export declare const CALL_REASON_MAX = 300;
15
+ export interface CallEnd {
16
+ readonly toolName: string;
17
+ readonly isError: boolean;
18
+ readonly output?: string;
19
+ readonly summary: string;
20
+ /** The person declined on the tool's own screen: nothing failed. */
21
+ readonly cancelled?: boolean;
22
+ }
23
+ export interface CallTallies {
24
+ readonly refusedCalls?: ScheduleCallTally;
25
+ readonly failedCalls?: ScheduleCallTally;
26
+ }
27
+ export declare class CallTally {
28
+ #private;
29
+ /**
30
+ * `withheld`: the tools the run was not given because its permissions
31
+ * never let it use them. A call to one comes back as an unknown tool, and
32
+ * is a refusal, not a failure.
33
+ */
34
+ constructor(withheld?: Iterable<string>);
35
+ /** Count one finished call. */
36
+ observe(call: CallEnd): void;
37
+ /** The counts so far, each only when above zero. */
38
+ tallies(): CallTallies;
39
+ }
40
+ /** `1 call was refused (bash: <reason>); 2 calls failed (read: <reason>)`, or nothing. */
41
+ export declare function callsLine(result: CallTallies): string;
42
+ /** `1 call refused, 2 failed` for a job's last run, from its state's counts, or nothing. */
43
+ export declare function callsCount(last: {
44
+ readonly refusedCalls?: number;
45
+ readonly failedCalls?: number;
46
+ }): string;
47
+ /** `1 call was refused`, `2 calls failed`: a count in words. */
48
+ export declare function callsWords(tally: ScheduleCallTally, verb: 'refused' | 'failed'): string;
49
+ //# sourceMappingURL=calls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calls.d.ts","sourceRoot":"","sources":["../../../src/schedule/fire/calls.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAapD,yCAAyC;AACzC,eAAO,MAAM,eAAe,MAAM,CAAA;AAElC,MAAM,WAAW,OAAO;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,oEAAoE;IACpE,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAC5B;AAED,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,YAAY,CAAC,EAAE,iBAAiB,CAAA;IACzC,QAAQ,CAAC,WAAW,CAAC,EAAE,iBAAiB,CAAA;CACxC;AAED,qBAAa,SAAS;;IAOrB;;;;OAIG;gBACS,QAAQ,GAAE,QAAQ,CAAC,MAAM,CAAM;IAI3C,+BAA+B;IAC/B,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAiC5B,oDAAoD;IACpD,OAAO,IAAI,WAAW;CAUtB;AAED,0FAA0F;AAC1F,wBAAgB,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAarD;AAED,4FAA4F;AAC5F,wBAAgB,UAAU,CAAC,IAAI,EAAE;IAChC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAC7B,GAAG,MAAM,CAMT;AAED,gEAAgE;AAChE,wBAAgB,UAAU,CAAC,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,SAAS,GAAG,QAAQ,GAAG,MAAM,CAKvF"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * The tool calls of one scheduled run that did not do what they were for:
3
+ * refused (they never ran — a gate rule, the scheduled-run floor, the mode, a
4
+ * declined review) and failed (they ran and returned an error).
5
+ *
6
+ * A run ends `completed` when its turn ends normally, whatever its calls
7
+ * did: a run whose only command the floor refused ended `completed`, and its
8
+ * notification said `finished`. How the turn ended stays the status, and the
9
+ * counts with each kind's first reason travel beside it, in the run's
10
+ * result, its history record, the job's state and its notification.
11
+ */
12
+ import { sanitizeLine } from '../../integrations/notifications/desktop/sanitize.js';
13
+ /** What the kernel writes in place of a result for a call that never ran (`deniedToolOutput`). */
14
+ const NOT_EXECUTED = /^Error: Tool "[^"]*" was not executed\.\s*/;
15
+ /**
16
+ * What the kernel writes for a call to a tool the session does not have, in
17
+ * each of its forms: `Error: Unknown tool "x"`, followed by `. Available: …`
18
+ * (what the step can call) when the registry says it lacks the name, and
19
+ * `Error: Unknown or unavailable tool "x": …` from a direct call.
20
+ */
21
+ const UNKNOWN_TOOL = /^Error: Unknown (?:or unavailable )?tool "/;
22
+ /** The gate's prefix, which says nothing the word "refused" does not. */
23
+ const GATE = /^Blocked by the authorization gate:\s*/;
24
+ /** How long a recorded reason may be. */
25
+ export const CALL_REASON_MAX = 300;
26
+ export class CallTally {
27
+ #refused = 0;
28
+ #failed = 0;
29
+ #firstRefused;
30
+ #firstFailed;
31
+ #withheld;
32
+ /**
33
+ * `withheld`: the tools the run was not given because its permissions
34
+ * never let it use them. A call to one comes back as an unknown tool, and
35
+ * is a refusal, not a failure.
36
+ */
37
+ constructor(withheld = []) {
38
+ this.#withheld = new Set(withheld);
39
+ }
40
+ /** Count one finished call. */
41
+ observe(call) {
42
+ if (!call.isError || call.cancelled)
43
+ return;
44
+ const text = call.output ?? call.summary;
45
+ const refused = NOT_EXECUTED.exec(text);
46
+ if (refused) {
47
+ this.#refused++;
48
+ this.#firstRefused ??= {
49
+ tool: call.toolName,
50
+ reason: sanitizeLine(text.slice(refused[0].length).replace(GATE, ''), CALL_REASON_MAX),
51
+ };
52
+ return;
53
+ }
54
+ if (this.#withheld.has(call.toolName) && UNKNOWN_TOOL.test(text)) {
55
+ this.#refused++;
56
+ this.#firstRefused ??= {
57
+ tool: call.toolName,
58
+ reason: `the job's permissions never let a run use ${call.toolName}, so the run was not given it`,
59
+ };
60
+ return;
61
+ }
62
+ this.#failed++;
63
+ this.#firstFailed ??= {
64
+ tool: call.toolName,
65
+ reason: sanitizeLine(text
66
+ .replace(/^Error:\s*/, '')
67
+ .split(/\r?\n/)
68
+ .find((line) => line.trim().length > 0) ?? '', CALL_REASON_MAX),
69
+ };
70
+ }
71
+ /** The counts so far, each only when above zero. */
72
+ tallies() {
73
+ return {
74
+ ...(this.#refused > 0 && this.#firstRefused
75
+ ? { refusedCalls: { count: this.#refused, first: this.#firstRefused } }
76
+ : {}),
77
+ ...(this.#failed > 0 && this.#firstFailed
78
+ ? { failedCalls: { count: this.#failed, first: this.#firstFailed } }
79
+ : {}),
80
+ };
81
+ }
82
+ }
83
+ /** `1 call was refused (bash: <reason>); 2 calls failed (read: <reason>)`, or nothing. */
84
+ export function callsLine(result) {
85
+ return [
86
+ ...(result.refusedCalls
87
+ ? [
88
+ `${callsWords(result.refusedCalls, 'refused')} (${result.refusedCalls.first.tool}: ${result.refusedCalls.first.reason})`,
89
+ ]
90
+ : []),
91
+ ...(result.failedCalls
92
+ ? [
93
+ `${callsWords(result.failedCalls, 'failed')} (${result.failedCalls.first.tool}: ${result.failedCalls.first.reason})`,
94
+ ]
95
+ : []),
96
+ ].join('; ');
97
+ }
98
+ /** `1 call refused, 2 failed` for a job's last run, from its state's counts, or nothing. */
99
+ export function callsCount(last) {
100
+ const refused = last.refusedCalls ?? 0;
101
+ const failed = last.failedCalls ?? 0;
102
+ const calls = (n) => `${n} call${n === 1 ? '' : 's'}`;
103
+ if (refused > 0)
104
+ return `${calls(refused)} refused${failed > 0 ? `, ${failed} failed` : ''}`;
105
+ return failed > 0 ? `${calls(failed)} failed` : '';
106
+ }
107
+ /** `1 call was refused`, `2 calls failed`: a count in words. */
108
+ export function callsWords(tally, verb) {
109
+ const n = tally.count;
110
+ return verb === 'refused'
111
+ ? `${n} call${n === 1 ? ' was' : 's were'} refused`
112
+ : `${n} call${n === 1 ? '' : 's'} failed`;
113
+ }
114
+ //# sourceMappingURL=calls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calls.js","sourceRoot":"","sources":["../../../src/schedule/fire/calls.ts"],"names":[],"mappings":"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"}