@namzu/cli 29.0.1 → 29.1.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 (384) hide show
  1. package/CHANGELOG.md +115 -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 +2 -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/doctor/checks/browser.d.ts +15 -0
  74. package/dist/doctor/checks/browser.d.ts.map +1 -0
  75. package/dist/doctor/checks/browser.js +63 -0
  76. package/dist/doctor/checks/browser.js.map +1 -0
  77. package/dist/doctor/checks/index.d.ts +4 -1
  78. package/dist/doctor/checks/index.d.ts.map +1 -1
  79. package/dist/doctor/checks/index.js +8 -1
  80. package/dist/doctor/checks/index.js.map +1 -1
  81. package/dist/doctor/checks/scheduler.d.ts +10 -0
  82. package/dist/doctor/checks/scheduler.d.ts.map +1 -0
  83. package/dist/doctor/checks/scheduler.js +74 -0
  84. package/dist/doctor/checks/scheduler.js.map +1 -0
  85. package/dist/index.d.ts +1 -1
  86. package/dist/index.d.ts.map +1 -1
  87. package/dist/index.js +1 -1
  88. package/dist/index.js.map +1 -1
  89. package/dist/integrations/notifications/desktop/freedesktop.d.ts +10 -0
  90. package/dist/integrations/notifications/desktop/freedesktop.d.ts.map +1 -0
  91. package/dist/integrations/notifications/desktop/freedesktop.js +33 -0
  92. package/dist/integrations/notifications/desktop/freedesktop.js.map +1 -0
  93. package/dist/integrations/notifications/desktop/macos.d.ts +6 -0
  94. package/dist/integrations/notifications/desktop/macos.d.ts.map +1 -0
  95. package/dist/integrations/notifications/desktop/macos.js +17 -0
  96. package/dist/integrations/notifications/desktop/macos.js.map +1 -0
  97. package/dist/integrations/notifications/desktop/sanitize.d.ts +16 -0
  98. package/dist/integrations/notifications/desktop/sanitize.d.ts.map +1 -0
  99. package/dist/integrations/notifications/desktop/sanitize.js +49 -0
  100. package/dist/integrations/notifications/desktop/sanitize.js.map +1 -0
  101. package/dist/integrations/notifications/desktop/throttle.d.ts +10 -0
  102. package/dist/integrations/notifications/desktop/throttle.d.ts.map +1 -0
  103. package/dist/integrations/notifications/desktop/throttle.js +39 -0
  104. package/dist/integrations/notifications/desktop/throttle.js.map +1 -0
  105. package/dist/integrations/notifications/desktop/windows-toast.d.ts +23 -0
  106. package/dist/integrations/notifications/desktop/windows-toast.d.ts.map +1 -0
  107. package/dist/integrations/notifications/desktop/windows-toast.js +56 -0
  108. package/dist/integrations/notifications/desktop/windows-toast.js.map +1 -0
  109. package/dist/integrations/notifications/desktop.d.ts +82 -0
  110. package/dist/integrations/notifications/desktop.d.ts.map +1 -0
  111. package/dist/integrations/notifications/desktop.js +198 -0
  112. package/dist/integrations/notifications/desktop.js.map +1 -0
  113. package/dist/integrations/resident/session-step.d.ts.map +1 -1
  114. package/dist/integrations/resident/session-step.js +1 -0
  115. package/dist/integrations/resident/session-step.js.map +1 -1
  116. package/dist/integrations/subagents/runtime.d.ts +6 -0
  117. package/dist/integrations/subagents/runtime.d.ts.map +1 -1
  118. package/dist/integrations/subagents/runtime.js +14 -5
  119. package/dist/integrations/subagents/runtime.js.map +1 -1
  120. package/dist/permissions/browser-sites.d.ts +95 -0
  121. package/dist/permissions/browser-sites.d.ts.map +1 -0
  122. package/dist/permissions/browser-sites.js +270 -0
  123. package/dist/permissions/browser-sites.js.map +1 -0
  124. package/dist/schedule/build.d.ts +79 -0
  125. package/dist/schedule/build.d.ts.map +1 -0
  126. package/dist/schedule/build.js +246 -0
  127. package/dist/schedule/build.js.map +1 -0
  128. package/dist/schedule/changes.d.ts +22 -0
  129. package/dist/schedule/changes.d.ts.map +1 -0
  130. package/dist/schedule/changes.js +55 -0
  131. package/dist/schedule/changes.js.map +1 -0
  132. package/dist/schedule/commands/add.d.ts +24 -0
  133. package/dist/schedule/commands/add.d.ts.map +1 -0
  134. package/dist/schedule/commands/add.js +459 -0
  135. package/dist/schedule/commands/add.js.map +1 -0
  136. package/dist/schedule/commands/args.d.ts +22 -0
  137. package/dist/schedule/commands/args.d.ts.map +1 -0
  138. package/dist/schedule/commands/args.js +80 -0
  139. package/dist/schedule/commands/args.js.map +1 -0
  140. package/dist/schedule/commands/confirm-prompt.d.ts +6 -0
  141. package/dist/schedule/commands/confirm-prompt.d.ts.map +1 -0
  142. package/dist/schedule/commands/confirm-prompt.js +21 -0
  143. package/dist/schedule/commands/confirm-prompt.js.map +1 -0
  144. package/dist/schedule/commands/lifecycle.d.ts +39 -0
  145. package/dist/schedule/commands/lifecycle.d.ts.map +1 -0
  146. package/dist/schedule/commands/lifecycle.js +585 -0
  147. package/dist/schedule/commands/lifecycle.js.map +1 -0
  148. package/dist/schedule/commands/list.d.ts +33 -0
  149. package/dist/schedule/commands/list.d.ts.map +1 -0
  150. package/dist/schedule/commands/list.js +202 -0
  151. package/dist/schedule/commands/list.js.map +1 -0
  152. package/dist/schedule/commands/logs.d.ts +7 -0
  153. package/dist/schedule/commands/logs.d.ts.map +1 -0
  154. package/dist/schedule/commands/logs.js +106 -0
  155. package/dist/schedule/commands/logs.js.map +1 -0
  156. package/dist/schedule/commands/service.d.ts +16 -0
  157. package/dist/schedule/commands/service.d.ts.map +1 -0
  158. package/dist/schedule/commands/service.js +458 -0
  159. package/dist/schedule/commands/service.js.map +1 -0
  160. package/dist/schedule/daemon/daemon.d.ts +156 -0
  161. package/dist/schedule/daemon/daemon.d.ts.map +1 -0
  162. package/dist/schedule/daemon/daemon.js +1248 -0
  163. package/dist/schedule/daemon/daemon.js.map +1 -0
  164. package/dist/schedule/daemon/endpoint.d.ts +38 -0
  165. package/dist/schedule/daemon/endpoint.d.ts.map +1 -0
  166. package/dist/schedule/daemon/endpoint.js +158 -0
  167. package/dist/schedule/daemon/endpoint.js.map +1 -0
  168. package/dist/schedule/daemon/exit.d.ts +8 -0
  169. package/dist/schedule/daemon/exit.d.ts.map +1 -0
  170. package/dist/schedule/daemon/exit.js +8 -0
  171. package/dist/schedule/daemon/exit.js.map +1 -0
  172. package/dist/schedule/daemon/log.d.ts +12 -0
  173. package/dist/schedule/daemon/log.d.ts.map +1 -0
  174. package/dist/schedule/daemon/log.js +53 -0
  175. package/dist/schedule/daemon/log.js.map +1 -0
  176. package/dist/schedule/daemon/notify.d.ts +31 -0
  177. package/dist/schedule/daemon/notify.d.ts.map +1 -0
  178. package/dist/schedule/daemon/notify.js +89 -0
  179. package/dist/schedule/daemon/notify.js.map +1 -0
  180. package/dist/schedule/daemon/retention.d.ts +16 -0
  181. package/dist/schedule/daemon/retention.d.ts.map +1 -0
  182. package/dist/schedule/daemon/retention.js +46 -0
  183. package/dist/schedule/daemon/retention.js.map +1 -0
  184. package/dist/schedule/daemon/sessions.d.ts +23 -0
  185. package/dist/schedule/daemon/sessions.d.ts.map +1 -0
  186. package/dist/schedule/daemon/sessions.js +52 -0
  187. package/dist/schedule/daemon/sessions.js.map +1 -0
  188. package/dist/schedule/env.d.ts +28 -0
  189. package/dist/schedule/env.d.ts.map +1 -0
  190. package/dist/schedule/env.js +99 -0
  191. package/dist/schedule/env.js.map +1 -0
  192. package/dist/schedule/fire/browser-preflight.d.ts +41 -0
  193. package/dist/schedule/fire/browser-preflight.d.ts.map +1 -0
  194. package/dist/schedule/fire/browser-preflight.js +73 -0
  195. package/dist/schedule/fire/browser-preflight.js.map +1 -0
  196. package/dist/schedule/fire/fire.d.ts +78 -0
  197. package/dist/schedule/fire/fire.d.ts.map +1 -0
  198. package/dist/schedule/fire/fire.js +482 -0
  199. package/dist/schedule/fire/fire.js.map +1 -0
  200. package/dist/schedule/fire/result.d.ts +13 -0
  201. package/dist/schedule/fire/result.d.ts.map +1 -0
  202. package/dist/schedule/fire/result.js +18 -0
  203. package/dist/schedule/fire/result.js.map +1 -0
  204. package/dist/schedule/fire/unattended-note.d.ts +22 -0
  205. package/dist/schedule/fire/unattended-note.d.ts.map +1 -0
  206. package/dist/schedule/fire/unattended-note.js +46 -0
  207. package/dist/schedule/fire/unattended-note.js.map +1 -0
  208. package/dist/schedule/floor.d.ts +116 -0
  209. package/dist/schedule/floor.d.ts.map +1 -0
  210. package/dist/schedule/floor.js +1051 -0
  211. package/dist/schedule/floor.js.map +1 -0
  212. package/dist/schedule/folder.d.ts +34 -0
  213. package/dist/schedule/folder.d.ts.map +1 -0
  214. package/dist/schedule/folder.js +84 -0
  215. package/dist/schedule/folder.js.map +1 -0
  216. package/dist/schedule/paths.d.ts +49 -0
  217. package/dist/schedule/paths.d.ts.map +1 -0
  218. package/dist/schedule/paths.js +53 -0
  219. package/dist/schedule/paths.js.map +1 -0
  220. package/dist/schedule/policy.d.ts +141 -0
  221. package/dist/schedule/policy.d.ts.map +1 -0
  222. package/dist/schedule/policy.js +378 -0
  223. package/dist/schedule/policy.js.map +1 -0
  224. package/dist/schedule/resume-command.d.ts +36 -0
  225. package/dist/schedule/resume-command.d.ts.map +1 -0
  226. package/dist/schedule/resume-command.js +72 -0
  227. package/dist/schedule/resume-command.js.map +1 -0
  228. package/dist/schedule/service/detect.d.ts +22 -0
  229. package/dist/schedule/service/detect.d.ts.map +1 -0
  230. package/dist/schedule/service/detect.js +29 -0
  231. package/dist/schedule/service/detect.js.map +1 -0
  232. package/dist/schedule/service/index.d.ts +48 -0
  233. package/dist/schedule/service/index.d.ts.map +1 -0
  234. package/dist/schedule/service/index.js +352 -0
  235. package/dist/schedule/service/index.js.map +1 -0
  236. package/dist/schedule/service/launchd.d.ts +24 -0
  237. package/dist/schedule/service/launchd.d.ts.map +1 -0
  238. package/dist/schedule/service/launchd.js +84 -0
  239. package/dist/schedule/service/launchd.js.map +1 -0
  240. package/dist/schedule/service/manifest.d.ts +44 -0
  241. package/dist/schedule/service/manifest.d.ts.map +1 -0
  242. package/dist/schedule/service/manifest.js +16 -0
  243. package/dist/schedule/service/manifest.js.map +1 -0
  244. package/dist/schedule/service/names.d.ts +9 -0
  245. package/dist/schedule/service/names.d.ts.map +1 -0
  246. package/dist/schedule/service/names.js +22 -0
  247. package/dist/schedule/service/names.js.map +1 -0
  248. package/dist/schedule/service/quote.d.ts +24 -0
  249. package/dist/schedule/service/quote.d.ts.map +1 -0
  250. package/dist/schedule/service/quote.js +64 -0
  251. package/dist/schedule/service/quote.js.map +1 -0
  252. package/dist/schedule/service/runner.d.ts +17 -0
  253. package/dist/schedule/service/runner.d.ts.map +1 -0
  254. package/dist/schedule/service/runner.js +31 -0
  255. package/dist/schedule/service/runner.js.map +1 -0
  256. package/dist/schedule/service/systemd.d.ts +37 -0
  257. package/dist/schedule/service/systemd.d.ts.map +1 -0
  258. package/dist/schedule/service/systemd.js +96 -0
  259. package/dist/schedule/service/systemd.js.map +1 -0
  260. package/dist/schedule/service/windows-task.d.ts +51 -0
  261. package/dist/schedule/service/windows-task.d.ts.map +1 -0
  262. package/dist/schedule/service/windows-task.js +134 -0
  263. package/dist/schedule/service/windows-task.js.map +1 -0
  264. package/dist/schedule/service/wsl.d.ts +57 -0
  265. package/dist/schedule/service/wsl.d.ts.map +1 -0
  266. package/dist/schedule/service/wsl.js +111 -0
  267. package/dist/schedule/service/wsl.js.map +1 -0
  268. package/dist/schedule/store/atomic.d.ts +43 -0
  269. package/dist/schedule/store/atomic.d.ts.map +1 -0
  270. package/dist/schedule/store/atomic.js +135 -0
  271. package/dist/schedule/store/atomic.js.map +1 -0
  272. package/dist/schedule/store/claims.d.ts +26 -0
  273. package/dist/schedule/store/claims.d.ts.map +1 -0
  274. package/dist/schedule/store/claims.js +57 -0
  275. package/dist/schedule/store/claims.js.map +1 -0
  276. package/dist/schedule/store/digest.d.ts +18 -0
  277. package/dist/schedule/store/digest.d.ts.map +1 -0
  278. package/dist/schedule/store/digest.js +139 -0
  279. package/dist/schedule/store/digest.js.map +1 -0
  280. package/dist/schedule/store/history.d.ts +21 -0
  281. package/dist/schedule/store/history.d.ts.map +1 -0
  282. package/dist/schedule/store/history.js +114 -0
  283. package/dist/schedule/store/history.js.map +1 -0
  284. package/dist/schedule/store/jobs.d.ts +61 -0
  285. package/dist/schedule/store/jobs.d.ts.map +1 -0
  286. package/dist/schedule/store/jobs.js +210 -0
  287. package/dist/schedule/store/jobs.js.map +1 -0
  288. package/dist/schedule/store/state.d.ts +19 -0
  289. package/dist/schedule/store/state.d.ts.map +1 -0
  290. package/dist/schedule/store/state.js +38 -0
  291. package/dist/schedule/store/state.js.map +1 -0
  292. package/dist/schedule/types.d.ts +256 -0
  293. package/dist/schedule/types.d.ts.map +1 -0
  294. package/dist/schedule/types.js +9 -0
  295. package/dist/schedule/types.js.map +1 -0
  296. package/dist/skills/catalog.d.ts +96 -0
  297. package/dist/skills/catalog.d.ts.map +1 -0
  298. package/dist/skills/catalog.js +226 -0
  299. package/dist/skills/catalog.js.map +1 -0
  300. package/dist/skills/save.d.ts +148 -0
  301. package/dist/skills/save.d.ts.map +1 -0
  302. package/dist/skills/save.js +344 -0
  303. package/dist/skills/save.js.map +1 -0
  304. package/dist/skills/store.d.ts +103 -16
  305. package/dist/skills/store.d.ts.map +1 -1
  306. package/dist/skills/store.js +227 -30
  307. package/dist/skills/store.js.map +1 -1
  308. package/dist/tui/App.d.ts.map +1 -1
  309. package/dist/tui/App.js +591 -72
  310. package/dist/tui/App.js.map +1 -1
  311. package/dist/tui/LiveActivity.d.ts +8 -1
  312. package/dist/tui/LiveActivity.d.ts.map +1 -1
  313. package/dist/tui/LiveActivity.js +20 -4
  314. package/dist/tui/LiveActivity.js.map +1 -1
  315. package/dist/tui/PermissionOverlay.d.ts +24 -4
  316. package/dist/tui/PermissionOverlay.d.ts.map +1 -1
  317. package/dist/tui/PermissionOverlay.js +113 -15
  318. package/dist/tui/PermissionOverlay.js.map +1 -1
  319. package/dist/tui/SaveSkillOverlay.d.ts +33 -0
  320. package/dist/tui/SaveSkillOverlay.d.ts.map +1 -0
  321. package/dist/tui/SaveSkillOverlay.js +118 -0
  322. package/dist/tui/SaveSkillOverlay.js.map +1 -0
  323. package/dist/tui/agent.d.ts +185 -5
  324. package/dist/tui/agent.d.ts.map +1 -1
  325. package/dist/tui/agent.js +325 -54
  326. package/dist/tui/agent.js.map +1 -1
  327. package/dist/tui/browser-notices.d.ts +33 -0
  328. package/dist/tui/browser-notices.d.ts.map +1 -0
  329. package/dist/tui/browser-notices.js +102 -0
  330. package/dist/tui/browser-notices.js.map +1 -0
  331. package/dist/tui/permission-review.d.ts.map +1 -1
  332. package/dist/tui/permission-review.js +53 -4
  333. package/dist/tui/permission-review.js.map +1 -1
  334. package/dist/tui/schedule/host-commands.d.ts +34 -0
  335. package/dist/tui/schedule/host-commands.d.ts.map +1 -0
  336. package/dist/tui/schedule/host-commands.js +309 -0
  337. package/dist/tui/schedule/host-commands.js.map +1 -0
  338. package/dist/tui/schedule/integration.d.ts +62 -0
  339. package/dist/tui/schedule/integration.d.ts.map +1 -0
  340. package/dist/tui/schedule/integration.js +145 -0
  341. package/dist/tui/schedule/integration.js.map +1 -0
  342. package/dist/tui/schedule/loop-host.d.ts +42 -0
  343. package/dist/tui/schedule/loop-host.d.ts.map +1 -0
  344. package/dist/tui/schedule/loop-host.js +153 -0
  345. package/dist/tui/schedule/loop-host.js.map +1 -0
  346. package/dist/tui/schedule/resume.d.ts +122 -0
  347. package/dist/tui/schedule/resume.d.ts.map +1 -0
  348. package/dist/tui/schedule/resume.js +324 -0
  349. package/dist/tui/schedule/resume.js.map +1 -0
  350. package/dist/tui/schedule/startup.d.ts +11 -0
  351. package/dist/tui/schedule/startup.d.ts.map +1 -0
  352. package/dist/tui/schedule/startup.js +121 -0
  353. package/dist/tui/schedule/startup.js.map +1 -0
  354. package/dist/tui/schedule/tool-host.d.ts +44 -0
  355. package/dist/tui/schedule/tool-host.d.ts.map +1 -0
  356. package/dist/tui/schedule/tool-host.js +294 -0
  357. package/dist/tui/schedule/tool-host.js.map +1 -0
  358. package/dist/tui/skills/learning.d.ts +74 -0
  359. package/dist/tui/skills/learning.d.ts.map +1 -0
  360. package/dist/tui/skills/learning.js +131 -0
  361. package/dist/tui/skills/learning.js.map +1 -0
  362. package/dist/tui/skills/suggest-setting.d.ts +22 -0
  363. package/dist/tui/skills/suggest-setting.d.ts.map +1 -0
  364. package/dist/tui/skills/suggest-setting.js +55 -0
  365. package/dist/tui/skills/suggest-setting.js.map +1 -0
  366. package/dist/tui/skills/suggestion-ledger.d.ts +35 -0
  367. package/dist/tui/skills/suggestion-ledger.d.ts.map +1 -0
  368. package/dist/tui/skills/suggestion-ledger.js +52 -0
  369. package/dist/tui/skills/suggestion-ledger.js.map +1 -0
  370. package/dist/tui/slashCommands.d.ts +20 -0
  371. package/dist/tui/slashCommands.d.ts.map +1 -1
  372. package/dist/tui/slashCommands.js +76 -2
  373. package/dist/tui/slashCommands.js.map +1 -1
  374. package/dist/tui/turn-interruption.d.ts +20 -1
  375. package/dist/tui/turn-interruption.d.ts.map +1 -1
  376. package/dist/tui/turn-interruption.js +43 -0
  377. package/dist/tui/turn-interruption.js.map +1 -1
  378. package/dist/tui/types.d.ts +9 -1
  379. package/dist/tui/types.d.ts.map +1 -1
  380. package/package.json +6 -4
  381. package/skills/README.md +15 -0
  382. package/skills/browser-automation/SKILL.md +84 -0
  383. package/skills/schedule-task/SKILL.md +140 -0
  384. package/skills/skill-creator/SKILL.md +101 -0
@@ -0,0 +1,378 @@
1
+ /**
2
+ * What a scheduled run may do, compiled to the kernel's rules.
3
+ *
4
+ * Order is the meaning (first match wins), and it is:
5
+ *
6
+ * 1. the kernel's dangerous-command floor (`gateFor` puts it first; it DENIES,
7
+ * it never parks — an operator cannot approve `rm -rf /` later);
8
+ * 2. the scheduled-run floor (`floor.ts`, one `predicate` rule): no command
9
+ * that stops, disables or removes the scheduler service, no `schedule`
10
+ * subcommand but a read-only one, and nothing that resolves into
11
+ * `NAMZU_HOME` (a run cannot rewrite its own job, its history, the
12
+ * daemon's endpoint token or the credentials beside them). A command line
13
+ * is decided on the words bash will pass, as the SDK's lexer reads them;
14
+ * 3. every `deny` any config file wrote — user, project, managed — each file
15
+ * read on its own, so a project's allow cannot hide a user's deny;
16
+ * 4. the job's own rules. ALLOWS COME ONLY FROM HERE: no config file can widen
17
+ * a job the operator confirmed;
18
+ * 5. `unmatched`, as the review mode: `park` → `prompt` with every batch held
19
+ * for the operator, `deny` → `strict`, `allow` → `auto` (a path outside the
20
+ * roots and a sandbox escape still hold).
21
+ *
22
+ * The scheduled-run floor reads a command line the way bash does (see
23
+ * `floor.ts`), but it reads a line, not the programs it starts: a script that
24
+ * builds the command from its own data is beyond it. The controls that do not
25
+ * depend on reading are elsewhere: a job folder may not contain `NAMZU_HOME`,
26
+ * and a job file edited behind the CLI's back is held until someone confirms
27
+ * it.
28
+ */
29
+ import { homedir } from 'node:os';
30
+ import { BROWSER_ACT_TOOL_NAME, BROWSER_TOOL_NAME, } from '@namzu/sdk';
31
+ import { isBrowserProfileName } from '../browser/control.js';
32
+ import { canonicalBrowserSiteKey, compileBrowserSites, } from '../permissions/browser-sites.js';
33
+ import { compilePermissions, isPermissionEffect, } from '../permissions/rules.js';
34
+ import { READ_ONLY_VERBS, isFloorRule, scheduledRunFloorRule } from './floor.js';
35
+ const NETWORK_TOOLS = ['web_fetch', 'web_search'];
36
+ /** The browser tools: reached only through a job's browser grant, never through its rules. */
37
+ const BROWSER_TOOLS = [BROWSER_TOOL_NAME, BROWSER_ACT_TOOL_NAME];
38
+ const GRANT_LEVELS = ['read', 'ask', 'act'];
39
+ const WRITE_TOOLS = ['write', 'edit', 'bash'];
40
+ const READ_ONLY = {
41
+ read: 'allow',
42
+ glob: 'allow',
43
+ grep: 'allow',
44
+ ls: 'allow',
45
+ write: 'deny',
46
+ edit: 'deny',
47
+ bash: 'deny',
48
+ web_fetch: 'deny',
49
+ web_search: 'deny',
50
+ };
51
+ /**
52
+ * The presets, expanded at creation and stored verbatim, so a later change to
53
+ * what a preset means never changes an existing job. Neither reaches the
54
+ * network: web access is opt-in, rule by rule.
55
+ */
56
+ export const PRESETS = {
57
+ 'read-only': { rules: READ_ONLY, unmatched: 'deny' },
58
+ 'edit-in-folder': {
59
+ rules: { ...READ_ONLY, write: 'allow', edit: 'allow', bash: 'ask' },
60
+ unmatched: 'park',
61
+ },
62
+ };
63
+ export function isPresetName(value) {
64
+ return value === 'read-only' || value === 'edit-in-folder';
65
+ }
66
+ /**
67
+ * A browser grant as a job stores it: a profile name, at least one site,
68
+ * each key canonical and none of them `*`, each level `read`, `ask` or
69
+ * `act`. `ask` parks the call for the operator, so it needs
70
+ * `unmatched: park`: under `deny` every ask would be refused and under
71
+ * `allow` approved without anyone seeing it.
72
+ */
73
+ export function checkBrowserGrant(input, unmatched) {
74
+ if (!isBrowserProfileName(input.profile)) {
75
+ throw new Error(`"${input.profile}" is not a browser profile name: lowercase letters, digits and single hyphens.`);
76
+ }
77
+ const entries = Object.entries(input.sites);
78
+ if (entries.length === 0) {
79
+ throw new Error('A browser grant needs at least one site, e.g. --browser-site https://github.com=read.');
80
+ }
81
+ const sites = {};
82
+ for (const [raw, level] of entries) {
83
+ if (raw.trim() === '*') {
84
+ throw new Error('A scheduled job cannot grant every site ("*"); every site it does not list is denied. List each site.');
85
+ }
86
+ if (!GRANT_LEVELS.includes(level)) {
87
+ throw new Error(`browser site ${raw}: "${level}" is not read, ask or act.`);
88
+ }
89
+ const key = canonicalBrowserSiteKey(raw);
90
+ if (!key.ok)
91
+ throw new Error(`browser site ${raw}: ${key.reason}`);
92
+ const existing = sites[key.key];
93
+ if (existing !== undefined && existing !== level) {
94
+ throw new Error(`browser site ${key.key} is listed twice, as ${existing} and ${level}.`);
95
+ }
96
+ sites[key.key] = level;
97
+ }
98
+ if (unmatched !== 'park' && Object.values(sites).includes('ask')) {
99
+ throw new Error(`A browser site at "ask" waits for you, which needs unmatched: park; with ${unmatched} it would be ${unmatched === 'deny' ? 'refused every time' : 'approved without asking'}. Use read or act, or --unmatched park.`);
100
+ }
101
+ return {
102
+ profile: input.profile,
103
+ sites,
104
+ ...(input.headed ? { headed: true } : {}),
105
+ };
106
+ }
107
+ /**
108
+ * A preset and/or explicit rules, into the set a job stores. Explicit rules
109
+ * override the preset's per tool. `unmatched` must come from somewhere — the
110
+ * preset or the caller — and `execution` defaults to `host` (the CLI's
111
+ * boundary) but is always written.
112
+ */
113
+ export function expandPermissions(input) {
114
+ if (!input.preset && !input.rules && !input.browser) {
115
+ throw new Error('A permission set needs a preset (read-only, edit-in-folder), rules or a browser grant; there is no default.');
116
+ }
117
+ const named = BROWSER_TOOLS.filter((tool) => input.rules?.[tool] !== undefined);
118
+ if (named.length > 0) {
119
+ throw new Error(`The rules name ${named.join(' and ')}; a scheduled job reaches the browser only through a browser grant (--browser <profile> --browser-site <site>=read|ask|act).`);
120
+ }
121
+ const preset = input.preset ? PRESETS[input.preset] : undefined;
122
+ const unmatched = input.unmatched ?? preset?.unmatched;
123
+ if (!unmatched) {
124
+ throw new Error('unmatched is required: park (wait for the operator), deny, or allow.');
125
+ }
126
+ const rules = { ...(preset?.rules ?? {}), ...(input.rules ?? {}) };
127
+ const compiled = compilePermissions(rules);
128
+ if (compiled.diagnostics.length > 0) {
129
+ throw new Error(`The permission rules do not compile: ${compiled.diagnostics.map(describeDiagnostic).join('; ')}`);
130
+ }
131
+ const browser = input.browser ? checkBrowserGrant(input.browser, unmatched) : undefined;
132
+ return {
133
+ unmatched,
134
+ execution: input.execution ?? 'host',
135
+ rules,
136
+ ...(input.additionalDirectories && input.additionalDirectories.length > 0
137
+ ? { additionalDirectories: [...input.additionalDirectories] }
138
+ : {}),
139
+ preset: input.preset && !input.rules ? input.preset : 'custom',
140
+ ...(browser ? { browser } : {}),
141
+ };
142
+ }
143
+ function describeDiagnostic(d) {
144
+ return `${d.pattern ? `${d.tool}."${d.pattern}"` : d.tool}: ${d.message}`;
145
+ }
146
+ function effectsOf(permission) {
147
+ if (permission === undefined)
148
+ return [];
149
+ if (isPermissionEffect(permission))
150
+ return [permission];
151
+ return Object.values(permission).filter(isPermissionEffect);
152
+ }
153
+ /** Whether the set lets a run reach the network: a web tool not denied, or a browser grant. */
154
+ export function allowsNetwork(set) {
155
+ return (set.browser !== undefined ||
156
+ NETWORK_TOOLS.some((t) => effectsOf(set.rules[t]).some((e) => e !== 'deny')));
157
+ }
158
+ /**
159
+ * Whether a run under this set can run a shell command: a `bash` rule that is
160
+ * not `deny`, or, with no `bash` rule, an `unmatched` that is not `deny`.
161
+ */
162
+ export function allowsCommands(set) {
163
+ const effects = effectsOf(set.rules.bash);
164
+ return effects.length > 0 ? effects.some((e) => e !== 'deny') : set.unmatched !== 'deny';
165
+ }
166
+ /** Whether a run under this set can change the folder (write, edit, bash, or an unmatched call). */
167
+ export function allowsWrites(set) {
168
+ if (set.unmatched !== 'deny')
169
+ return true;
170
+ return WRITE_TOOLS.some((t) => effectsOf(set.rules[t]).some((e) => e !== 'deny'));
171
+ }
172
+ /** Only the `deny` entries of one config file's table. */
173
+ export function denialsOf(table) {
174
+ const out = {};
175
+ for (const [tool, permission] of Object.entries(table)) {
176
+ if (permission === 'deny')
177
+ out[tool] = 'deny';
178
+ else if (permission && typeof permission === 'object') {
179
+ const denied = Object.fromEntries(Object.entries(permission).filter(([, effect]) => effect === 'deny'));
180
+ if (Object.keys(denied).length > 0)
181
+ out[tool] = denied;
182
+ }
183
+ }
184
+ return out;
185
+ }
186
+ /**
187
+ * Rules that keep a scheduled run away from its own scheduler and its own
188
+ * records: one `predicate` rule, decided on the SDK's reading of each command
189
+ * line (see `floor.ts`). `folders` is where the run's relative paths start.
190
+ */
191
+ export function scheduledRunFloor(namzuHome, userHome = homedir(), folders = []) {
192
+ return [scheduledRunFloorRule({ namzuHome, userHome, folders })];
193
+ }
194
+ function modeFor(unmatched) {
195
+ return unmatched === 'park' ? 'prompt' : unmatched === 'deny' ? 'strict' : 'auto';
196
+ }
197
+ function lineFor(tool, permission) {
198
+ if (isPermissionEffect(permission))
199
+ return [`${tool}: ${permission}`];
200
+ return Object.entries(permission).map(([pattern, effect]) => `${tool} "${pattern}": ${effect}`);
201
+ }
202
+ /** Compile a job's permission set against every config file's denies. */
203
+ export function compileJobPolicy(set, options) {
204
+ const diagnostics = [];
205
+ const configDenies = [];
206
+ const denyLines = [];
207
+ for (const layer of options.layers) {
208
+ const denied = denialsOf(layer.permissions);
209
+ const compiled = compilePermissions(denied);
210
+ configDenies.push(...compiled.rules);
211
+ for (const d of compiled.diagnostics)
212
+ diagnostics.push(`${layer.path}: ${describeDiagnostic(d)}`);
213
+ for (const [tool, permission] of Object.entries(denied))
214
+ for (const line of lineFor(tool, permission))
215
+ denyLines.push(`${line} (from ${layer.path})`);
216
+ }
217
+ const own = compilePermissions(set.rules);
218
+ for (const d of own.diagnostics)
219
+ diagnostics.push(`job: ${describeDiagnostic(d)}`);
220
+ const siteDenies = options.layers.flatMap((layer) => (layer.browserDenies ?? []).map((site) => ({ site, path: layer.path })));
221
+ const browser = set.browser ? compileBrowserGrant(set.browser, siteDenies) : undefined;
222
+ if (browser)
223
+ diagnostics.push(...browser.diagnostics.map((d) => `job: ${d}`));
224
+ // Web tools are denied by name unless the job itself lets them run: the
225
+ // gate's read-only default would otherwise approve a fetch. The browser
226
+ // tools always end up here: without a grant nothing else decides them,
227
+ // and with one this catches every call its site rules did not.
228
+ const networkDenied = [
229
+ ...NETWORK_TOOLS.filter((t) => set.rules[t] === undefined),
230
+ ...BROWSER_TOOLS,
231
+ ];
232
+ const rules = [
233
+ ...scheduledRunFloor(options.namzuHome, homedir(), options.folder ? [options.folder.path, options.folder.canonical] : []),
234
+ ...configDenies,
235
+ ...own.rules,
236
+ ...(browser?.rules ?? []),
237
+ { type: 'deny_by_name', toolNames: [...networkDenied] },
238
+ ];
239
+ const lines = [
240
+ 'dangerous commands (rm -rf /, mkfs, curl | sh, sudo …): deny, always',
241
+ `the scheduler's commands (but ${READ_ONLY_VERBS.join(', ')}), and anything naming NAMZU_HOME or the browser's profiles: deny`,
242
+ ...denyLines,
243
+ ...Object.entries(set.rules).flatMap(([tool, permission]) => lineFor(tool, permission)),
244
+ ...(set.browser ? browserGrantLines(set.browser, siteDenies) : []),
245
+ `anything else: ${set.unmatched === 'park' ? 'wait for the operator' : set.unmatched === 'deny' ? 'deny' : 'run without asking'}`,
246
+ ];
247
+ return {
248
+ rules,
249
+ diagnostics,
250
+ mode: modeFor(set.unmatched),
251
+ network: allowsNetwork(set),
252
+ writes: allowsWrites(set),
253
+ lines,
254
+ };
255
+ }
256
+ const GRANT_WORDS = {
257
+ read: 'open and read, never change',
258
+ ask: 'open and read; each change waits for you',
259
+ act: 'open, read and change without asking',
260
+ };
261
+ /**
262
+ * A job's browser grant as gate rules: the sites it lists at their level,
263
+ * any site a config file denies denied (a grant cannot reopen it), every
264
+ * other site denied, looking at the held page allowed, and `back`,
265
+ * `forward` and `reload` allowed (the host still checks where they land).
266
+ * What none of these decides falls to the trailing deny.
267
+ */
268
+ export function compileBrowserGrant(grant, denies = []) {
269
+ const sites = {
270
+ ...grant.sites,
271
+ '*': 'deny',
272
+ };
273
+ for (const { site } of denies)
274
+ sites[site] = 'deny';
275
+ const compiled = compileBrowserSites(sites);
276
+ return {
277
+ rules: [
278
+ ...compiled.rules,
279
+ {
280
+ type: 'argument_pattern',
281
+ toolNames: [BROWSER_TOOL_NAME],
282
+ argument: 'action',
283
+ pattern: '^(?:back|forward|reload)$',
284
+ decision: 'allow',
285
+ },
286
+ ],
287
+ diagnostics: compiled.diagnostics,
288
+ };
289
+ }
290
+ /** The grant in words, one line each, for a confirmation and `schedule show`. */
291
+ export function browserGrantLines(grant, denies = []) {
292
+ const denied = new Map(denies.map((d) => [d.site, d.path]));
293
+ return [
294
+ `browser: profile ${grant.profile}, ${grant.headed ? 'in a visible window' : 'no window'}`,
295
+ ...Object.entries(grant.sites).map(([site, level]) => denied.has(site)
296
+ ? `browser ${site}: deny (from ${denied.get(site)})`
297
+ : `browser ${site}: ${GRANT_WORDS[level]}`),
298
+ 'browser any other site: deny',
299
+ 'browser sign-in, CAPTCHA or a code: the run stops and tells you',
300
+ ];
301
+ }
302
+ /**
303
+ * Tools refused only by `unmatched: deny`: a write or a delegation that no
304
+ * exemption lets through when nothing allows it. The agent tools go
305
+ * together: without `Agent` the rest have nothing to act on.
306
+ */
307
+ const STRICT_UNREACHABLE = [
308
+ 'Agent',
309
+ 'send_message',
310
+ 'cancel_agent',
311
+ 'wait_for_task',
312
+ 'agent_task_list',
313
+ 'agent_models',
314
+ 'save_memory',
315
+ 'update_memory',
316
+ 'delete_memory',
317
+ ];
318
+ /** The background-job tools, which manage what `bash` started. */
319
+ const JOB_TOOLS = ['job', 'wait_for_job'];
320
+ /**
321
+ * Whether `rule` could let `tool` through (allow it or send it to review).
322
+ * Unknown shapes answer yes: withholding a tool the run could have used is the
323
+ * mistake this must not make.
324
+ */
325
+ function mayReach(rule, tool) {
326
+ switch (rule.type) {
327
+ case 'deny_by_name':
328
+ case 'deny_dangerous_patterns':
329
+ return false;
330
+ case 'allow_by_name':
331
+ return rule.toolNames.includes(tool);
332
+ case 'argument_pattern':
333
+ return rule.decision !== 'deny' && rule.toolNames.includes(tool);
334
+ case 'custom_pattern': {
335
+ if (rule.decision === 'deny')
336
+ return false;
337
+ const named = /^\^([A-Za-z0-9_-]+)(?![A-Za-z0-9_-])/.exec(rule.pattern);
338
+ return named ? named[1] === tool : true;
339
+ }
340
+ case 'predicate':
341
+ return !isFloorRule(rule);
342
+ default:
343
+ return true;
344
+ }
345
+ }
346
+ /**
347
+ * Tools a scheduled run under this policy can never use, so their schemas
348
+ * need not be sent with every model call. In a browser job's run, `bash`,
349
+ * `edit`, `write`, the web tools and the agent and memory tools were about
350
+ * half of each request, sent six times a run and refused every time they
351
+ * could have been called.
352
+ *
353
+ * A tool is withheld when a `deny_by_name` names it and no rule before it
354
+ * could let it through; under `unmatched: deny`, also the delegation and
355
+ * memory-writing tools no rule names; and the background-job tools once
356
+ * `bash` is withheld.
357
+ */
358
+ export function withheldTools(set, policy) {
359
+ const out = new Set();
360
+ policy.rules.forEach((rule, index) => {
361
+ if (rule.type !== 'deny_by_name')
362
+ return;
363
+ const earlier = policy.rules.slice(0, index);
364
+ for (const tool of rule.toolNames)
365
+ if (!earlier.some((r) => mayReach(r, tool)))
366
+ out.add(tool);
367
+ });
368
+ if (set.unmatched === 'deny') {
369
+ for (const tool of STRICT_UNREACHABLE)
370
+ if (!policy.rules.some((r) => mayReach(r, tool)))
371
+ out.add(tool);
372
+ }
373
+ if (out.has('bash'))
374
+ for (const tool of JOB_TOOLS)
375
+ out.add(tool);
376
+ return [...out].sort();
377
+ }
378
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/schedule/policy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * The command that opens a scheduled run's conversation, for every place that
3
+ * tells the operator how to answer a park.
4
+ *
5
+ * Conversations are stored per folder, so `namzu resume <id>` finds a run's
6
+ * conversation only from the job's folder; anywhere else it says "not found".
7
+ * The command therefore always carries the folder, and the job's extra roots,
8
+ * which a session answering the park must have. Every path is quoted for a
9
+ * POSIX shell.
10
+ */
11
+ import type { ScheduleJob } from './types.js';
12
+ /** A word as a POSIX shell reads it back: bare when safe, else single-quoted. */
13
+ export declare function shellQuote(value: string): string;
14
+ /** `cd <folder> && namzu [--add-dir <dir>]… resume <session-id>`. */
15
+ export declare function resumeCommand(job: Pick<ScheduleJob, 'folder' | 'permissions'>, sessionId: string): string;
16
+ /**
17
+ * The scheduled job whose run owns `sessionId`, when that conversation lives
18
+ * in another folder than `cwd`: what `namzu resume <id>` says instead of a
19
+ * bare "not found". Reads the job store only; never throws.
20
+ */
21
+ export declare function scheduledSessionElsewhere(home: string, sessionId: string, cwd: string): {
22
+ readonly job: ScheduleJob;
23
+ readonly command: string;
24
+ } | undefined;
25
+ /**
26
+ * What a parked run waits for, in words: `needs you: <reason>` when a tool
27
+ * asked for a person (a sign-in, a CAPTCHA), which no approval answers, and
28
+ * `waiting for your approval` for a held batch. The reason is the tool's own
29
+ * text, recorded by the daemon; it is flattened to one line here.
30
+ */
31
+ export declare function parkedRunWords(run: {
32
+ readonly handoff?: {
33
+ readonly reason: string;
34
+ };
35
+ }): string;
36
+ //# sourceMappingURL=resume-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resume-command.d.ts","sourceRoot":"","sources":["../../src/schedule/resume-command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AASH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE7C,iFAAiF;AACjF,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,qEAAqE;AACrE,wBAAgB,aAAa,CAC5B,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,GAAG,aAAa,CAAC,EAChD,SAAS,EAAE,MAAM,GACf,MAAM,CAKR;AAUD;;;;GAIG;AACH,wBAAgB,yBAAyB,CACxC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,GACT;IAAE,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAmBrE;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE;IAAE,QAAQ,CAAC,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAAG,MAAM,CAG9F"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * The command that opens a scheduled run's conversation, for every place that
3
+ * tells the operator how to answer a park.
4
+ *
5
+ * Conversations are stored per folder, so `namzu resume <id>` finds a run's
6
+ * conversation only from the job's folder; anywhere else it says "not found".
7
+ * The command therefore always carries the folder, and the job's extra roots,
8
+ * which a session answering the park must have. Every path is quoted for a
9
+ * POSIX shell.
10
+ */
11
+ import { realpathSync } from 'node:fs';
12
+ import { resolve } from 'node:path';
13
+ import { sanitizeLine } from '../integrations/notifications/desktop/sanitize.js';
14
+ import { schedulePaths } from './paths.js';
15
+ import { foldHistory, readHistory } from './store/history.js';
16
+ import { listJobs } from './store/jobs.js';
17
+ import { readState } from './store/state.js';
18
+ /** A word as a POSIX shell reads it back: bare when safe, else single-quoted. */
19
+ export function shellQuote(value) {
20
+ return /^[A-Za-z0-9._/@+-]+$/.test(value) ? value : `'${value.replace(/'/g, `'\\''`)}'`;
21
+ }
22
+ /** `cd <folder> && namzu [--add-dir <dir>]… resume <session-id>`. */
23
+ export function resumeCommand(job, sessionId) {
24
+ const addDirs = (job.permissions.additionalDirectories ?? [])
25
+ .map((dir) => ` --add-dir ${shellQuote(dir)}`)
26
+ .join('');
27
+ return `cd ${shellQuote(job.folder.canonical)} && namzu${addDirs} resume ${shellQuote(sessionId)}`;
28
+ }
29
+ function canonical(path) {
30
+ try {
31
+ return realpathSync(path);
32
+ }
33
+ catch {
34
+ return resolve(path);
35
+ }
36
+ }
37
+ /**
38
+ * The scheduled job whose run owns `sessionId`, when that conversation lives
39
+ * in another folder than `cwd`: what `namzu resume <id>` says instead of a
40
+ * bare "not found". Reads the job store only; never throws.
41
+ */
42
+ export function scheduledSessionElsewhere(home, sessionId, cwd) {
43
+ try {
44
+ const paths = schedulePaths(home);
45
+ const here = canonical(cwd);
46
+ for (const job of listJobs(paths).jobs) {
47
+ if (job.folder.canonical === here)
48
+ continue;
49
+ const state = readState(paths, job.id);
50
+ const owns = state.activeRun?.sessionId === sessionId ||
51
+ state.lastRun?.sessionId === sessionId ||
52
+ foldHistory(readHistory(paths, job.id)).some((record) => record.kind === 'run' && record.sessionId === sessionId);
53
+ if (owns)
54
+ return { job, command: resumeCommand(job, sessionId) };
55
+ }
56
+ }
57
+ catch {
58
+ // A job store that cannot be read says nothing; the ordinary refusal stands.
59
+ }
60
+ return undefined;
61
+ }
62
+ /**
63
+ * What a parked run waits for, in words: `needs you: <reason>` when a tool
64
+ * asked for a person (a sign-in, a CAPTCHA), which no approval answers, and
65
+ * `waiting for your approval` for a held batch. The reason is the tool's own
66
+ * text, recorded by the daemon; it is flattened to one line here.
67
+ */
68
+ export function parkedRunWords(run) {
69
+ const reason = run.handoff ? sanitizeLine(run.handoff.reason, 200) : '';
70
+ return reason ? `needs you: ${reason}` : 'waiting for your approval';
71
+ }
72
+ //# sourceMappingURL=resume-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resume-command.js","sourceRoot":"","sources":["../../src/schedule/resume-command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Which supervisor `schedule install --platform auto` picks.
3
+ *
4
+ * macOS → launchd; Windows → Task Scheduler; WSL → Task Scheduler through
5
+ * `wsl.exe` (even when the distro runs systemd, because a unit inside the
6
+ * distro cannot start the distro after a reboot); other Linux with a systemd
7
+ * user manager → systemd. Anything else has no supported supervisor, and the
8
+ * answer says to run `namzu schedule daemon` under one of your own.
9
+ */
10
+ import type { ServicePlatform } from './manifest.js';
11
+ export type PlatformChoice = ServicePlatform | 'auto';
12
+ export declare function detectPlatform(options?: {
13
+ readonly platform?: NodeJS.Platform;
14
+ readonly env?: NodeJS.ProcessEnv;
15
+ readonly systemdUser?: boolean;
16
+ }): {
17
+ platform: ServicePlatform;
18
+ } | {
19
+ platform: null;
20
+ reason: string;
21
+ };
22
+ //# sourceMappingURL=detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../../src/schedule/service/detect.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAEpD,MAAM,MAAM,cAAc,GAAG,eAAe,GAAG,MAAM,CAAA;AAErD,wBAAgB,cAAc,CAC7B,OAAO,GAAE;IACR,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAA;IACnC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;IAChC,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAA;CACzB,GACJ;IAAE,QAAQ,EAAE,eAAe,CAAA;CAAE,GAAG;IAAE,QAAQ,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAcpE"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Which supervisor `schedule install --platform auto` picks.
3
+ *
4
+ * macOS → launchd; Windows → Task Scheduler; WSL → Task Scheduler through
5
+ * `wsl.exe` (even when the distro runs systemd, because a unit inside the
6
+ * distro cannot start the distro after a reboot); other Linux with a systemd
7
+ * user manager → systemd. Anything else has no supported supervisor, and the
8
+ * answer says to run `namzu schedule daemon` under one of your own.
9
+ */
10
+ import { detectWsl } from '../../context/environment.js';
11
+ export function detectPlatform(options = {}) {
12
+ const platform = options.platform ?? process.platform;
13
+ if (platform === 'darwin')
14
+ return { platform: 'launchd' };
15
+ if (platform === 'win32')
16
+ return { platform: 'windows-task' };
17
+ if (platform === 'linux') {
18
+ if (detectWsl(options.env ?? process.env))
19
+ return { platform: 'wsl-windows-task' };
20
+ if (options.systemdUser)
21
+ return { platform: 'systemd-user' };
22
+ return {
23
+ platform: null,
24
+ reason: 'no systemd user manager answers here; run `namzu schedule daemon` under a supervisor of your own',
25
+ };
26
+ }
27
+ return { platform: null, reason: `${platform} has no supported supervisor` };
28
+ }
29
+ //# sourceMappingURL=detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../../src/schedule/service/detect.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAA;AAKxD,MAAM,UAAU,cAAc,CAC7B,UAII,EAAE;IAEN,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAA;IACrD,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAA;IACzD,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAA;IAC7D,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QAC1B,IAAI,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;YAAE,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,CAAA;QAClF,IAAI,OAAO,CAAC,WAAW;YAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAA;QAC5D,OAAO;YACN,QAAQ,EAAE,IAAI;YACd,MAAM,EACL,kGAAkG;SACnG,CAAA;IACF,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,QAAQ,8BAA8B,EAAE,CAAA;AAC7E,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * `schedule install | uninstall | start | stop` over the four supervisors,
3
+ * with the manifest as the record of what exists. The service always runs
4
+ * `"<absolute node>" "<absolute CLI>" schedule daemon --home "<NAMZU_HOME>"`,
5
+ * both paths resolved at install: no shell, no PATH lookup, no profile.
6
+ */
7
+ import type { SchedulePaths } from '../paths.js';
8
+ import { type ServiceManifest, type ServicePlatform } from './manifest.js';
9
+ import type { CommandRunner } from './runner.js';
10
+ import { type ServiceProgram } from './systemd.js';
11
+ import { type WindowsTools } from './wsl.js';
12
+ export interface ServiceContext {
13
+ readonly paths: SchedulePaths;
14
+ readonly run: CommandRunner;
15
+ readonly env: NodeJS.ProcessEnv;
16
+ readonly version: string;
17
+ /** Windows tools under WSL; default the standard `/mnt/c` locations. */
18
+ readonly tools?: WindowsTools;
19
+ }
20
+ export interface InstallRequest {
21
+ readonly platform: ServicePlatform;
22
+ readonly name: string;
23
+ readonly program: ServiceProgram;
24
+ readonly atBoot?: boolean;
25
+ }
26
+ export declare class ServiceRefusal extends Error {
27
+ readonly name = "ServiceRefusal";
28
+ }
29
+ export declare function installService(ctx: ServiceContext, request: InstallRequest): Promise<{
30
+ manifest: ServiceManifest;
31
+ problems: string[];
32
+ notes: string[];
33
+ }>;
34
+ /** Remove exactly what the manifest lists, verify, and remove the manifest last. */
35
+ export declare function uninstallService(ctx: ServiceContext): Promise<{
36
+ problems: string[];
37
+ manifest?: ServiceManifest;
38
+ }>;
39
+ /** Ask the supervisor for its view. */
40
+ export declare function serviceState(ctx: ServiceContext, manifest: ServiceManifest): Promise<string>;
41
+ export declare function startService(ctx: ServiceContext, manifest: ServiceManifest): Promise<string[]>;
42
+ /**
43
+ * Stop through the supervisor, and keep it stopped: the systemd unit and the
44
+ * launchd agent are disabled (else the next login starts them), and a
45
+ * Windows task is disabled (ending it alone is undone by its repetition).
46
+ */
47
+ export declare function stopService(ctx: ServiceContext, manifest: ServiceManifest): Promise<string[]>;
48
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/schedule/service/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAEhD,OAAO,EAEN,KAAK,eAAe,EACpB,KAAK,eAAe,EAIpB,MAAM,eAAe,CAAA;AACtB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,EACN,KAAK,cAAc,EAOnB,MAAM,cAAc,CAAA;AAQrB,OAAO,EACN,KAAK,YAAY,EAQjB,MAAM,UAAU,CAAA;AAEjB,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAA;IAC7B,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAA;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAA;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,wEAAwE;IACxE,QAAQ,CAAC,KAAK,CAAC,EAAE,YAAY,CAAA;CAC7B;AAED,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAA;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAA;IAChC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CACzB;AAED,qBAAa,cAAe,SAAQ,KAAK;IACxC,SAAkB,IAAI,oBAAmB;CACzC;AAkBD,wBAAsB,cAAc,CACnC,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,cAAc,GACrB,OAAO,CAAC;IAAE,QAAQ,EAAE,eAAe,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CA0L7E;AA6CD,oFAAoF;AACpF,wBAAsB,gBAAgB,CACrC,GAAG,EAAE,cAAc,GACjB,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,EAAE,eAAe,CAAA;CAAE,CAAC,CAe7D;AAED,uCAAuC;AACvC,wBAAsB,YAAY,CACjC,GAAG,EAAE,cAAc,EACnB,QAAQ,EAAE,eAAe,GACvB,OAAO,CAAC,MAAM,CAAC,CA0BjB;AAED,wBAAsB,YAAY,CACjC,GAAG,EAAE,cAAc,EACnB,QAAQ,EAAE,eAAe,GACvB,OAAO,CAAC,MAAM,EAAE,CAAC,CA8BnB;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAChC,GAAG,EAAE,cAAc,EACnB,QAAQ,EAAE,eAAe,GACvB,OAAO,CAAC,MAAM,EAAE,CAAC,CA2BnB"}