@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,361 @@
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 { mkdirSync, rmSync, rmdirSync, writeFileSync } from 'node:fs';
8
+ import { userInfo } from 'node:os';
9
+ import { isAbsolute, join } from 'node:path';
10
+ import { installLaunchd, launchdLabel, launchdPlistPath, uninstallLaunchd } from './launchd.js';
11
+ import { readManifest, removeManifest, writeManifest, } from './manifest.js';
12
+ import { installSystemd, startSystemd, stopSystemd, systemdState, systemdUnitPath, uninstallSystemd, } from './systemd.js';
13
+ import { describeTaskResult, parseTaskQuery, removeEmptyTaskFolderArguments, taskPath, taskXml, taskXmlBytes, } from './windows-task.js';
14
+ import { isEphemeralBin, probeInterop, toWindowsPath, windowsTools, windowsUser, wslTaskDefinition, wslTaskName, } from './wsl.js';
15
+ /**
16
+ * Where a Windows program a WSL-installed task needs is started: `C:` under
17
+ * this machine's drive mount root. Nothing for a supervisor that is not WSL's.
18
+ */
19
+ function windowsCwd(ctx, manifest) {
20
+ return manifest.platform === 'wsl-windows-task'
21
+ ? { cwd: (ctx.tools ?? windowsTools()).drive }
22
+ : {};
23
+ }
24
+ export class ServiceRefusal extends Error {
25
+ name = 'ServiceRefusal';
26
+ }
27
+ function refuseUnsafeProgram(program) {
28
+ if (!isAbsolute(program.node) && !/^[A-Za-z]:\\/.test(program.node)) {
29
+ throw new ServiceRefusal(`node must be an absolute path, got ${program.node}`);
30
+ }
31
+ if (isEphemeralBin(program.bin)) {
32
+ throw new ServiceRefusal(`namzu is running from the npx cache (${program.bin}), which is not kept; install it (npm i -g @namzu/cli) and run schedule install from that`);
33
+ }
34
+ }
35
+ async function lingerEnabled(run, user) {
36
+ const result = await run('loginctl', ['show-user', user, '-p', 'Linger']);
37
+ return /Linger=yes/.test(result.stdout);
38
+ }
39
+ export async function installService(ctx, request) {
40
+ refuseUnsafeProgram(request.program);
41
+ const { paths, run } = ctx;
42
+ const notes = [];
43
+ const base = {
44
+ v: 1,
45
+ kind: 'schedule-service',
46
+ platform: request.platform,
47
+ name: request.name,
48
+ installedAt: new Date().toISOString(),
49
+ cliVersion: ctx.version,
50
+ nodePath: request.program.node,
51
+ binPath: request.program.bin,
52
+ namzuHome: request.program.namzuHome,
53
+ };
54
+ switch (request.platform) {
55
+ case 'systemd-user': {
56
+ const unit = systemdUnitPath(request.name, ctx.env);
57
+ const problems = await installSystemd(request.name, request.program, { run }, unit);
58
+ let enabledLinger = false;
59
+ if (request.atBoot) {
60
+ const user = userInfo().username;
61
+ if (!(await lingerEnabled(run, user))) {
62
+ const result = await run('loginctl', ['enable-linger', user]);
63
+ if (result.code === 0)
64
+ enabledLinger = true;
65
+ else
66
+ problems.push(`loginctl enable-linger ${user}: ${result.stderr.trim() || `exit ${result.code}`}`);
67
+ }
68
+ }
69
+ else {
70
+ notes.push('The daemon starts when you log in; --at-boot keeps it running without a login (linger).');
71
+ }
72
+ const manifest = {
73
+ ...base,
74
+ enabledLinger,
75
+ artifacts: [
76
+ { type: 'file', path: unit },
77
+ { type: 'systemd-unit', name: `${request.name}.service` },
78
+ ],
79
+ };
80
+ writeManifest(paths, manifest);
81
+ return { manifest, problems, notes };
82
+ }
83
+ case 'launchd': {
84
+ const label = launchdLabel(request.name);
85
+ const plist = launchdPlistPath(label);
86
+ const { domain, problems } = await installLaunchd(label, request.program, {
87
+ run,
88
+ uid: process.getuid?.() ?? 501,
89
+ }, plist);
90
+ const manifest = {
91
+ ...base,
92
+ artifacts: [
93
+ { type: 'file', path: plist },
94
+ { type: 'launchd-agent', label, domain },
95
+ ],
96
+ };
97
+ writeManifest(paths, manifest);
98
+ notes.push('A LaunchAgent starts at login, not at boot.');
99
+ return { manifest, problems, notes };
100
+ }
101
+ case 'windows-task': {
102
+ const root = ctx.env.SystemRoot ?? 'C:\\Windows';
103
+ const schtasks = `${root}\\System32\\schtasks.exe`;
104
+ const who = await run(`${root}\\System32\\whoami.exe`, []);
105
+ const userId = who.stdout.trim();
106
+ if (who.code !== 0 || !userId.includes('\\'))
107
+ throw new ServiceRefusal('could not read the Windows user from whoami.exe');
108
+ const path = taskPath(request.name);
109
+ const xml = taskXml({
110
+ userId,
111
+ description: `namzu scheduler for NAMZU_HOME=${request.program.namzuHome}`,
112
+ command: `${root}\\System32\\conhost.exe`,
113
+ args: [
114
+ '--headless',
115
+ request.program.node,
116
+ request.program.bin,
117
+ 'schedule',
118
+ 'daemon',
119
+ '--home',
120
+ request.program.namzuHome,
121
+ ],
122
+ });
123
+ const file = join(paths.daemon, `${request.name}.task.xml`);
124
+ mkdirSync(paths.daemon, { recursive: true });
125
+ writeFileSync(file, taskXmlBytes(xml));
126
+ const problems = [];
127
+ try {
128
+ const created = await run(schtasks, ['/Create', '/TN', path, '/XML', file, '/F']);
129
+ if (created.code !== 0)
130
+ problems.push(`schtasks /Create: ${created.stderr.trim() || created.stdout.trim()}`);
131
+ else
132
+ await run(schtasks, ['/Run', '/TN', path]);
133
+ }
134
+ finally {
135
+ rmSync(file, { force: true });
136
+ }
137
+ const manifest = {
138
+ ...base,
139
+ artifacts: [{ type: 'windows-task', taskPath: path }],
140
+ windows: { taskPath: path, schtasks },
141
+ };
142
+ writeManifest(paths, manifest);
143
+ notes.push('The task starts at logon; jobs run while you are logged on.');
144
+ return { manifest, problems, notes };
145
+ }
146
+ case 'wsl-windows-task': {
147
+ const tools = ctx.tools ?? windowsTools();
148
+ const interop = await probeInterop(run, tools, ctx.env);
149
+ if (!interop.ok)
150
+ throw new ServiceRefusal(`WSL interop is not usable: ${interop.reason}. Use --platform systemd-user instead.`);
151
+ const distro = ctx.env.WSL_DISTRO_NAME;
152
+ if (!distro)
153
+ throw new ServiceRefusal('WSL_DISTRO_NAME is not set; cannot name the distro for wsl.exe');
154
+ const userId = await windowsUser(run, tools);
155
+ const definition = wslTaskDefinition({
156
+ userId,
157
+ distro,
158
+ linuxUser: userInfo().username,
159
+ node: request.program.node,
160
+ bin: request.program.bin,
161
+ namzuHome: request.program.namzuHome,
162
+ });
163
+ const name = wslTaskName(request.name, distro);
164
+ const path = taskPath(name);
165
+ // The XML goes where Windows can read it without a UNC path.
166
+ const localAppData = (await run(tools.cmd, ['/d', '/c', 'echo', '%LOCALAPPDATA%'], { cwd: tools.drive })).stdout.trim();
167
+ if (!/^[A-Za-z]:\\/.test(localAppData))
168
+ throw new ServiceRefusal('could not resolve %LOCALAPPDATA% through interop');
169
+ const linuxDir = (await run('wslpath', ['-u', `${localAppData}\\namzu`])).stdout.trim();
170
+ if (!linuxDir.startsWith(tools.mountRoot))
171
+ throw new ServiceRefusal(`could not map ${localAppData} into WSL`);
172
+ mkdirSync(linuxDir, { recursive: true });
173
+ const linuxFile = join(linuxDir, `${name}.xml`);
174
+ writeFileSync(linuxFile, taskXmlBytes(taskXml(definition)));
175
+ const problems = [];
176
+ try {
177
+ const windowsFile = await toWindowsPath(run, linuxFile);
178
+ const created = await run(tools.schtasks, ['/Create', '/TN', path, '/XML', windowsFile, '/F'], { cwd: tools.drive });
179
+ if (created.code !== 0)
180
+ problems.push(`schtasks.exe /Create: ${created.stderr.trim() || created.stdout.trim()}`);
181
+ else {
182
+ const started = await run(tools.schtasks, ['/Run', '/TN', path], { cwd: tools.drive });
183
+ if (started.code !== 0)
184
+ problems.push(`schtasks.exe /Run: ${started.stderr.trim() || started.stdout.trim()}`);
185
+ }
186
+ }
187
+ finally {
188
+ rmSync(linuxFile, { force: true });
189
+ // The staging folder, when this install made it and nothing else uses it.
190
+ try {
191
+ rmdirSync(linuxDir);
192
+ }
193
+ catch { }
194
+ }
195
+ const manifest = {
196
+ ...base,
197
+ name,
198
+ artifacts: [{ type: 'windows-task', taskPath: path }],
199
+ windows: {
200
+ taskPath: path,
201
+ schtasks: tools.schtasks,
202
+ powershell: tools.powershell,
203
+ distro,
204
+ user: userId,
205
+ },
206
+ };
207
+ writeManifest(paths, manifest);
208
+ notes.push('Windows Task Scheduler starts the daemon in this distro at logon and re-checks it every 5 minutes; jobs run while you are logged on to Windows.');
209
+ return { manifest, problems, notes };
210
+ }
211
+ }
212
+ }
213
+ async function removeArtifact(ctx, manifest, artifact) {
214
+ switch (artifact.type) {
215
+ case 'file':
216
+ rmSync(artifact.path, { force: true });
217
+ return [];
218
+ case 'systemd-unit': {
219
+ const unitFile = manifest.artifacts.find((a) => a.type === 'file');
220
+ return uninstallSystemd(artifact.name.replace(/\.service$/, ''), { run: ctx.run }, unitFile?.type === 'file' ? unitFile.path : systemdUnitPath(manifest.name, ctx.env));
221
+ }
222
+ case 'launchd-agent':
223
+ return uninstallLaunchd(artifact.label, artifact.domain, {
224
+ run: ctx.run,
225
+ uid: process.getuid?.() ?? 501,
226
+ });
227
+ case 'windows-task': {
228
+ const schtasks = manifest.windows?.schtasks ?? 'schtasks.exe';
229
+ const cwd = windowsCwd(ctx, manifest);
230
+ await ctx.run(schtasks, ['/End', '/TN', artifact.taskPath], cwd);
231
+ await ctx.run(schtasks, ['/Delete', '/TN', artifact.taskPath, '/F'], cwd);
232
+ const queried = await ctx.run(schtasks, ['/Query', '/TN', artifact.taskPath], cwd);
233
+ if (queried.code === 0)
234
+ return [`task ${artifact.taskPath} is still registered`];
235
+ // The `\namzu` folder `/Create` made, once nothing else is in it.
236
+ const powershell = manifest.windows?.powershell ??
237
+ (manifest.platform === 'wsl-windows-task'
238
+ ? (ctx.tools ?? windowsTools()).powershell
239
+ : `${ctx.env.SystemRoot ?? 'C:\\Windows'}\\System32\\WindowsPowerShell\\v1.0\\powershell.exe`);
240
+ const folder = await ctx.run(powershell, removeEmptyTaskFolderArguments(), cwd);
241
+ return folder.code === 0
242
+ ? []
243
+ : ['the empty Task Scheduler folder \\namzu is still there; delete it in Task Scheduler'];
244
+ }
245
+ }
246
+ }
247
+ /** Remove exactly what the manifest lists, verify, and remove the manifest last. */
248
+ export async function uninstallService(ctx) {
249
+ const manifest = readManifest(ctx.paths);
250
+ if (!manifest)
251
+ return { problems: [] };
252
+ const problems = [];
253
+ // The supervisor first, then the files it read.
254
+ const ordered = [...manifest.artifacts].sort((a, b) => (a.type === 'file' ? 1 : 0) - (b.type === 'file' ? 1 : 0));
255
+ for (const artifact of ordered)
256
+ problems.push(...(await removeArtifact(ctx, manifest, artifact)));
257
+ if (manifest.enabledLinger) {
258
+ const result = await ctx.run('loginctl', ['disable-linger', userInfo().username]);
259
+ if (result.code !== 0)
260
+ problems.push('loginctl disable-linger failed (install had enabled it)');
261
+ }
262
+ if (problems.length === 0)
263
+ removeManifest(ctx.paths);
264
+ return { problems, manifest };
265
+ }
266
+ /** Ask the supervisor for its view. */
267
+ export async function serviceState(ctx, manifest) {
268
+ switch (manifest.platform) {
269
+ case 'systemd-user':
270
+ return `systemd: ${await systemdState(manifest.name, { run: ctx.run })}`;
271
+ case 'launchd': {
272
+ const agent = manifest.artifacts.find((a) => a.type === 'launchd-agent');
273
+ if (agent?.type !== 'launchd-agent')
274
+ return 'launchd: unknown';
275
+ const printed = await ctx.run('launchctl', ['print', `${agent.domain}/${agent.label}`]);
276
+ return printed.code === 0
277
+ ? `launchd: loaded (${/state = (\w+)/.exec(printed.stdout)?.[1] ?? 'unknown'})`
278
+ : 'launchd: not loaded';
279
+ }
280
+ case 'windows-task':
281
+ case 'wsl-windows-task': {
282
+ const schtasks = manifest.windows?.schtasks ?? 'schtasks.exe';
283
+ const cwd = windowsCwd(ctx, manifest);
284
+ const queried = await ctx.run(schtasks, ['/Query', '/TN', manifest.windows?.taskPath ?? '', '/FO', 'LIST', '/V'], cwd);
285
+ if (queried.code !== 0)
286
+ return 'Task Scheduler: task not found';
287
+ const fields = parseTaskQuery(queried.stdout);
288
+ return `Task Scheduler: ${fields.status ?? 'unknown'}${fields.state ? `, ${fields.state.toLowerCase()}` : ''}${fields.lastResult ? `, last result: ${describeTaskResult(fields.lastResult)}` : ''}`;
289
+ }
290
+ }
291
+ }
292
+ export async function startService(ctx, manifest) {
293
+ switch (manifest.platform) {
294
+ case 'systemd-user':
295
+ return startSystemd(manifest.name, { run: ctx.run });
296
+ case 'launchd': {
297
+ const agent = manifest.artifacts.find((a) => a.type === 'launchd-agent');
298
+ if (agent?.type !== 'launchd-agent')
299
+ return ['no launchd agent in the manifest'];
300
+ const plist = manifest.artifacts.find((a) => a.type === 'file');
301
+ // `stop` disabled it; a disabled label is not loaded at all.
302
+ await ctx.run('launchctl', ['enable', `${agent.domain}/${agent.label}`]);
303
+ const booted = await ctx.run('launchctl', [
304
+ 'bootstrap',
305
+ agent.domain,
306
+ plist?.type === 'file' ? plist.path : '',
307
+ ]);
308
+ if (booted.code === 0)
309
+ return [];
310
+ const kicked = await ctx.run('launchctl', ['kickstart', `${agent.domain}/${agent.label}`]);
311
+ return kicked.code === 0 ? [] : [kicked.stderr.trim() || 'launchctl kickstart failed'];
312
+ }
313
+ case 'windows-task':
314
+ case 'wsl-windows-task': {
315
+ const schtasks = manifest.windows?.schtasks ?? 'schtasks.exe';
316
+ const cwd = windowsCwd(ctx, manifest);
317
+ const task = manifest.windows?.taskPath ?? '';
318
+ const enabled = await ctx.run(schtasks, ['/Change', '/TN', task, '/ENABLE'], cwd);
319
+ if (enabled.code !== 0)
320
+ return [enabled.stderr.trim() || 'schtasks /Change /ENABLE failed'];
321
+ const ran = await ctx.run(schtasks, ['/Run', '/TN', task], cwd);
322
+ return ran.code === 0 ? [] : [ran.stderr.trim() || 'schtasks /Run failed'];
323
+ }
324
+ }
325
+ }
326
+ /**
327
+ * Stop through the supervisor, and keep it stopped: the systemd unit and the
328
+ * launchd agent are disabled (else the next login starts them), and a
329
+ * Windows task is disabled (ending it alone is undone by its repetition).
330
+ */
331
+ export async function stopService(ctx, manifest) {
332
+ switch (manifest.platform) {
333
+ case 'systemd-user':
334
+ return stopSystemd(manifest.name, { run: ctx.run });
335
+ case 'launchd': {
336
+ const agent = manifest.artifacts.find((a) => a.type === 'launchd-agent');
337
+ if (agent?.type !== 'launchd-agent')
338
+ return ['no launchd agent in the manifest'];
339
+ // Disabled as well as booted out: the plist stays in LaunchAgents, and
340
+ // with RunAtLoad and KeepAlive the next login would start the daemon,
341
+ // which would find the stop request, exit and be started again.
342
+ const disabled = await ctx.run('launchctl', ['disable', `${agent.domain}/${agent.label}`]);
343
+ const out = await ctx.run('launchctl', ['bootout', `${agent.domain}/${agent.label}`]);
344
+ if (disabled.code !== 0)
345
+ return [disabled.stderr.trim() || 'launchctl disable failed'];
346
+ return out.code === 0 ? [] : [out.stderr.trim() || 'launchctl bootout failed'];
347
+ }
348
+ case 'windows-task':
349
+ case 'wsl-windows-task': {
350
+ const schtasks = manifest.windows?.schtasks ?? 'schtasks.exe';
351
+ const cwd = windowsCwd(ctx, manifest);
352
+ const task = manifest.windows?.taskPath ?? '';
353
+ const disabled = await ctx.run(schtasks, ['/Change', '/TN', task, '/DISABLE'], cwd);
354
+ await ctx.run(schtasks, ['/End', '/TN', task], cwd);
355
+ return disabled.code === 0
356
+ ? []
357
+ : [disabled.stderr.trim() || 'schtasks /Change /DISABLE failed'];
358
+ }
359
+ }
360
+ }
361
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/schedule/service/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * macOS: a LaunchAgent. `KeepAlive=true` so the daemon comes back after any
3
+ * exit (an upgrade's planned exit 0 included), `AbandonProcessGroup` so runs
4
+ * in progress outlive a daemon restart, `LimitLoadToSessionType=Aqua` so the
5
+ * agent lives in the graphical session that can show notifications.
6
+ * A LaunchAgent starts at login, not at boot. Tested here by its generated
7
+ * file only; see the manual check list in docs/cli/scheduler-service.md.
8
+ */
9
+ import type { CommandRunner } from './runner.js';
10
+ import type { ServiceProgram } from './systemd.js';
11
+ export declare function launchdLabel(name: string): string;
12
+ export declare function launchdPlistPath(label: string, home?: string): string;
13
+ export declare function launchdPlist(label: string, program: ServiceProgram): string;
14
+ export interface LaunchdSteps {
15
+ readonly run: CommandRunner;
16
+ readonly uid: number;
17
+ }
18
+ /** Bootstrap into the GUI domain, falling back to the user domain. Returns the domain used. */
19
+ export declare function installLaunchd(label: string, program: ServiceProgram, steps: LaunchdSteps, plistPath?: string): Promise<{
20
+ domain: string;
21
+ problems: string[];
22
+ }>;
23
+ export declare function uninstallLaunchd(label: string, domain: string, steps: LaunchdSteps, plistPath?: string): Promise<string[]>;
24
+ //# sourceMappingURL=launchd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launchd.d.ts","sourceRoot":"","sources":["../../../src/schedule/service/launchd.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAElD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIjD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,SAAY,GAAG,MAAM,CAExE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,MAAM,CAuC3E;AAED,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAA;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CACpB;AAED,+FAA+F;AAC/F,wBAAsB,cAAc,CACnC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,YAAY,EACnB,SAAS,SAA0B,GACjC,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CASjD;AAED,wBAAsB,gBAAgB,CACrC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,YAAY,EACnB,SAAS,SAA0B,GACjC,OAAO,CAAC,MAAM,EAAE,CAAC,CAQnB"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * macOS: a LaunchAgent. `KeepAlive=true` so the daemon comes back after any
3
+ * exit (an upgrade's planned exit 0 included), `AbandonProcessGroup` so runs
4
+ * in progress outlive a daemon restart, `LimitLoadToSessionType=Aqua` so the
5
+ * agent lives in the graphical session that can show notifications.
6
+ * A LaunchAgent starts at login, not at boot. Tested here by its generated
7
+ * file only; see the manual check list in docs/cli/scheduler-service.md.
8
+ */
9
+ import { existsSync, mkdirSync, rmSync, writeFileSync } from 'node:fs';
10
+ import { homedir } from 'node:os';
11
+ import { dirname, join } from 'node:path';
12
+ import { xmlText } from './quote.js';
13
+ export function launchdLabel(name) {
14
+ return name === 'namzu-scheduler'
15
+ ? 'com.namzu.scheduler'
16
+ : `com.namzu.${name.replace(/^namzu-/, '')}`;
17
+ }
18
+ export function launchdPlistPath(label, home = homedir()) {
19
+ return join(home, 'Library', 'LaunchAgents', `${label}.plist`);
20
+ }
21
+ export function launchdPlist(label, program) {
22
+ const args = [program.node, program.bin, 'schedule', 'daemon', '--home', program.namzuHome];
23
+ const log = join(program.namzuHome, 'schedule', 'daemon');
24
+ return [
25
+ '<?xml version="1.0" encoding="UTF-8"?>',
26
+ '<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">',
27
+ '<plist version="1.0">',
28
+ '<dict>',
29
+ '\t<key>Label</key>',
30
+ `\t<string>${xmlText(label)}</string>`,
31
+ '\t<key>ProgramArguments</key>',
32
+ '\t<array>',
33
+ ...args.map((a) => `\t\t<string>${xmlText(a)}</string>`),
34
+ '\t</array>',
35
+ '\t<key>EnvironmentVariables</key>',
36
+ '\t<dict>',
37
+ '\t\t<key>NAMZU_HOME</key>',
38
+ `\t\t<string>${xmlText(program.namzuHome)}</string>`,
39
+ '\t</dict>',
40
+ '\t<key>RunAtLoad</key>',
41
+ '\t<true/>',
42
+ '\t<key>KeepAlive</key>',
43
+ '\t<true/>',
44
+ '\t<key>ThrottleInterval</key>',
45
+ '\t<integer>10</integer>',
46
+ '\t<key>ProcessType</key>',
47
+ '\t<string>Background</string>',
48
+ '\t<key>AbandonProcessGroup</key>',
49
+ '\t<true/>',
50
+ '\t<key>LimitLoadToSessionType</key>',
51
+ '\t<string>Aqua</string>',
52
+ '\t<key>StandardOutPath</key>',
53
+ `\t<string>${xmlText(join(log, 'launchd.out.log'))}</string>`,
54
+ '\t<key>StandardErrorPath</key>',
55
+ `\t<string>${xmlText(join(log, 'launchd.err.log'))}</string>`,
56
+ '</dict>',
57
+ '</plist>',
58
+ '',
59
+ ].join('\n');
60
+ }
61
+ /** Bootstrap into the GUI domain, falling back to the user domain. Returns the domain used. */
62
+ export async function installLaunchd(label, program, steps, plistPath = launchdPlistPath(label)) {
63
+ mkdirSync(dirname(plistPath), { recursive: true });
64
+ writeFileSync(plistPath, launchdPlist(label, program), { mode: 0o644 });
65
+ for (const domain of [`gui/${steps.uid}`, `user/${steps.uid}`]) {
66
+ await steps.run('launchctl', ['bootout', `${domain}/${label}`]);
67
+ const result = await steps.run('launchctl', ['bootstrap', domain, plistPath]);
68
+ if (result.code === 0)
69
+ return { domain, problems: [] };
70
+ }
71
+ return { domain: `gui/${steps.uid}`, problems: [`launchctl bootstrap failed for ${plistPath}`] };
72
+ }
73
+ export async function uninstallLaunchd(label, domain, steps, plistPath = launchdPlistPath(label)) {
74
+ await steps.run('launchctl', ['bootout', `${domain}/${label}`]);
75
+ rmSync(plistPath, { force: true });
76
+ const problems = [];
77
+ if (existsSync(plistPath))
78
+ problems.push(`${plistPath} is still there`);
79
+ const printed = await steps.run('launchctl', ['print', `${domain}/${label}`]);
80
+ if (printed.code === 0)
81
+ problems.push(`${label} is still loaded in ${domain}`);
82
+ return problems;
83
+ }
84
+ //# sourceMappingURL=launchd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launchd.js","sourceRoot":"","sources":["../../../src/schedule/service/launchd.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAIpC,MAAM,UAAU,YAAY,CAAC,IAAY;IACxC,OAAO,IAAI,KAAK,iBAAiB;QAChC,CAAC,CAAC,qBAAqB;QACvB,CAAC,CAAC,aAAa,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,EAAE,CAAA;AAC9C,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAa,EAAE,IAAI,GAAG,OAAO,EAAE;IAC/D,OAAO,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,KAAK,QAAQ,CAAC,CAAA;AAC/D,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,OAAuB;IAClE,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,SAAS,CAAC,CAAA;IAC3F,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAA;IACzD,OAAO;QACN,wCAAwC;QACxC,wGAAwG;QACxG,uBAAuB;QACvB,QAAQ;QACR,oBAAoB;QACpB,aAAa,OAAO,CAAC,KAAK,CAAC,WAAW;QACtC,+BAA+B;QAC/B,WAAW;QACX,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC;QACxD,YAAY;QACZ,mCAAmC;QACnC,UAAU;QACV,2BAA2B;QAC3B,eAAe,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,WAAW;QACpD,WAAW;QACX,wBAAwB;QACxB,WAAW;QACX,wBAAwB;QACxB,WAAW;QACX,+BAA+B;QAC/B,yBAAyB;QACzB,0BAA0B;QAC1B,+BAA+B;QAC/B,kCAAkC;QAClC,WAAW;QACX,qCAAqC;QACrC,yBAAyB;QACzB,8BAA8B;QAC9B,aAAa,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC,WAAW;QAC7D,gCAAgC;QAChC,aAAa,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC,WAAW;QAC7D,SAAS;QACT,UAAU;QACV,EAAE;KACF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACb,CAAC;AAOD,+FAA+F;AAC/F,MAAM,CAAC,KAAK,UAAU,cAAc,CACnC,KAAa,EACb,OAAuB,EACvB,KAAmB,EACnB,SAAS,GAAG,gBAAgB,CAAC,KAAK,CAAC;IAEnC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAClD,aAAa,CAAC,SAAS,EAAE,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IACvE,KAAK,MAAM,MAAM,IAAI,CAAC,OAAO,KAAK,CAAC,GAAG,EAAE,EAAE,QAAQ,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;QAChE,MAAM,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,SAAS,EAAE,GAAG,MAAM,IAAI,KAAK,EAAE,CAAC,CAAC,CAAA;QAC/D,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAA;QAC7E,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAA;IACvD,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,OAAO,KAAK,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,CAAC,kCAAkC,SAAS,EAAE,CAAC,EAAE,CAAA;AACjG,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACrC,KAAa,EACb,MAAc,EACd,KAAmB,EACnB,SAAS,GAAG,gBAAgB,CAAC,KAAK,CAAC;IAEnC,MAAM,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,SAAS,EAAE,GAAG,MAAM,IAAI,KAAK,EAAE,CAAC,CAAC,CAAA;IAC/D,MAAM,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IAClC,MAAM,QAAQ,GAAa,EAAE,CAAA;IAC7B,IAAI,UAAU,CAAC,SAAS,CAAC;QAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,SAAS,iBAAiB,CAAC,CAAA;IACvE,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,GAAG,MAAM,IAAI,KAAK,EAAE,CAAC,CAAC,CAAA;IAC7E,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC;QAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,uBAAuB,MAAM,EAAE,CAAC,CAAA;IAC9E,OAAO,QAAQ,CAAA;AAChB,CAAC"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * `schedule/service.json`: what `schedule install` created, so `uninstall`
3
+ * removes exactly that and verifies each piece is gone.
4
+ */
5
+ import type { SchedulePaths } from '../paths.js';
6
+ export type ServicePlatform = 'systemd-user' | 'launchd' | 'windows-task' | 'wsl-windows-task';
7
+ export type ServiceArtifact = {
8
+ readonly type: 'file';
9
+ readonly path: string;
10
+ } | {
11
+ readonly type: 'systemd-unit';
12
+ readonly name: string;
13
+ } | {
14
+ readonly type: 'launchd-agent';
15
+ readonly label: string;
16
+ readonly domain: string;
17
+ } | {
18
+ readonly type: 'windows-task';
19
+ readonly taskPath: string;
20
+ };
21
+ export interface ServiceManifest {
22
+ readonly v: 1;
23
+ readonly kind: 'schedule-service';
24
+ readonly platform: ServicePlatform;
25
+ readonly name: string;
26
+ readonly installedAt: string;
27
+ readonly cliVersion: string;
28
+ readonly nodePath: string;
29
+ readonly binPath: string;
30
+ readonly namzuHome: string;
31
+ readonly enabledLinger?: boolean;
32
+ readonly artifacts: readonly ServiceArtifact[];
33
+ readonly windows?: {
34
+ readonly taskPath: string;
35
+ readonly schtasks: string;
36
+ readonly powershell?: string;
37
+ readonly distro?: string;
38
+ readonly user?: string;
39
+ };
40
+ }
41
+ export declare function readManifest(paths: SchedulePaths): ServiceManifest | undefined;
42
+ export declare function writeManifest(paths: SchedulePaths, manifest: ServiceManifest): void;
43
+ export declare function removeManifest(paths: SchedulePaths): void;
44
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../src/schedule/service/manifest.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAGhD,MAAM,MAAM,eAAe,GAAG,cAAc,GAAG,SAAS,GAAG,cAAc,GAAG,kBAAkB,CAAA;AAE9F,MAAM,MAAM,eAAe,GACxB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACxD;IAAE,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACnF;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAA;AAE/D,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAA;IACb,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAA;IACjC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAA;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAA;IAChC,QAAQ,CAAC,SAAS,EAAE,SAAS,eAAe,EAAE,CAAA;IAC9C,QAAQ,CAAC,OAAO,CAAC,EAAE;QAClB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;QACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;QACzB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;QAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;QACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KACtB,CAAA;CACD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,aAAa,GAAG,eAAe,GAAG,SAAS,CAE9E;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,eAAe,GAAG,IAAI,CAEnF;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAEzD"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * `schedule/service.json`: what `schedule install` created, so `uninstall`
3
+ * removes exactly that and verifies each piece is gone.
4
+ */
5
+ import { rmSync } from 'node:fs';
6
+ import { readVersioned, writeJsonAtomic } from '../store/atomic.js';
7
+ export function readManifest(paths) {
8
+ return readVersioned(paths.service, 'schedule-service');
9
+ }
10
+ export function writeManifest(paths, manifest) {
11
+ writeJsonAtomic(paths.service, manifest);
12
+ }
13
+ export function removeManifest(paths) {
14
+ rmSync(paths.service, { force: true });
15
+ }
16
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../src/schedule/service/manifest.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAEhC,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AA+BnE,MAAM,UAAU,YAAY,CAAC,KAAoB;IAChD,OAAO,aAAa,CAAkB,KAAK,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAA;AACzE,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAoB,EAAE,QAAyB;IAC5E,eAAe,CAAC,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;AACzC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAoB;IAClD,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;AACvC,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * The service's name: `namzu-scheduler` for the default home, otherwise
3
+ * `namzu-scheduler-<8 hex of the home's hash>`, so two homes never share a
4
+ * service. `--name` overrides it (the real-machine test uses a unique one).
5
+ */
6
+ export declare const SERVICE_NAME: RegExp;
7
+ export declare function defaultServiceName(namzuHome: string, osHome?: string): string;
8
+ export declare function checkServiceName(name: string): string;
9
+ //# sourceMappingURL=names.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"names.d.ts","sourceRoot":"","sources":["../../../src/schedule/service/names.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,eAAO,MAAM,YAAY,QAAsC,CAAA;AAE/D,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,SAAY,GAAG,MAAM,CAIhF;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOrD"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * The service's name: `namzu-scheduler` for the default home, otherwise
3
+ * `namzu-scheduler-<8 hex of the home's hash>`, so two homes never share a
4
+ * service. `--name` overrides it (the real-machine test uses a unique one).
5
+ */
6
+ import { createHash } from 'node:crypto';
7
+ import { homedir } from 'node:os';
8
+ import { join, resolve } from 'node:path';
9
+ export const SERVICE_NAME = /^[A-Za-z0-9][A-Za-z0-9._-]{0,62}$/;
10
+ export function defaultServiceName(namzuHome, osHome = homedir()) {
11
+ if (resolve(namzuHome) === resolve(join(osHome, '.namzu')))
12
+ return 'namzu-scheduler';
13
+ const h8 = createHash('sha256').update(resolve(namzuHome)).digest('hex').slice(0, 8);
14
+ return `namzu-scheduler-${h8}`;
15
+ }
16
+ export function checkServiceName(name) {
17
+ if (!SERVICE_NAME.test(name)) {
18
+ throw new Error(`"${name}" is not a service name: letters, digits, dot, dash and underscore only`);
19
+ }
20
+ return name;
21
+ }
22
+ //# sourceMappingURL=names.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"names.js","sourceRoot":"","sources":["../../../src/schedule/service/names.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEzC,MAAM,CAAC,MAAM,YAAY,GAAG,mCAAmC,CAAA;AAE/D,MAAM,UAAU,kBAAkB,CAAC,SAAiB,EAAE,MAAM,GAAG,OAAO,EAAE;IACvE,IAAI,OAAO,CAAC,SAAS,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAAE,OAAO,iBAAiB,CAAA;IACpF,MAAM,EAAE,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACpF,OAAO,mBAAmB,EAAE,EAAE,CAAA;AAC/B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC5C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CACd,IAAI,IAAI,yEAAyE,CACjF,CAAA;IACF,CAAC;IACD,OAAO,IAAI,CAAA;AACZ,CAAC"}