@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
@@ -1,4 +1,5 @@
1
1
  import { capabilityCheckId } from '../../context/capabilities.js';
2
+ import { browserEngineCheck } from './browser.js';
2
3
  import { providerChainCheck } from './chain.js';
3
4
  import { credentialSourcesCheck } from './credentials.js';
4
5
  import { invariantsCheck } from './invariants.js';
@@ -6,6 +7,7 @@ import { loggingPipelineCheck } from './logging.js';
6
7
  import { providersRegisteredCheck } from './providers.js';
7
8
  import { cwdWritableCheck, tmpdirWritableCheck } from './runtime.js';
8
9
  import { sandboxPlatformCheck } from './sandbox.js';
10
+ import { schedulerCheck } from './scheduler.js';
9
11
  import { describeInstalledPackage, telemetryInstalledCheck } from './telemetry.js';
10
12
  import { vaultRegisteredCheck } from './vault.js';
11
13
  /**
@@ -35,12 +37,13 @@ function installedCheck(specifier, category) {
35
37
  export const sandboxInstalledCheck = installedCheck('@namzu/sandbox', 'sandbox');
36
38
  export const filesInstalledCheck = installedCheck('@namzu/files', 'custom');
37
39
  export const computerUseInstalledCheck = installedCheck('@namzu/computer-use', 'custom');
40
+ export const browserInstalledCheck = installedCheck('@namzu/browser', 'custom');
38
41
  // NOTE the fix versus the original submission: sandboxInstalledCheck /
39
42
  // filesInstalledCheck / computerUseInstalledCheck are NOT repeated here.
40
43
  // They already carry their own `export` keyword above; naming them again in
41
44
  // this aggregation block is a duplicate-export declaration and fails
42
45
  // `tsc --build` with TS2323/TS2484 (confirmed by building this exact file).
43
- export { credentialSourcesCheck, providerChainCheck, providersRegisteredCheck, cwdWritableCheck, tmpdirWritableCheck, invariantsCheck, loggingPipelineCheck, sandboxPlatformCheck, telemetryInstalledCheck, vaultRegisteredCheck, };
46
+ export { browserEngineCheck, credentialSourcesCheck, providerChainCheck, providersRegisteredCheck, cwdWritableCheck, tmpdirWritableCheck, invariantsCheck, loggingPipelineCheck, sandboxPlatformCheck, schedulerCheck, telemetryInstalledCheck, vaultRegisteredCheck, };
44
47
  export const builtInDoctorChecks = [
45
48
  sandboxPlatformCheck,
46
49
  cwdWritableCheck,
@@ -55,7 +58,11 @@ export const builtInDoctorChecks = [
55
58
  sandboxInstalledCheck,
56
59
  filesInstalledCheck,
57
60
  computerUseInstalledCheck,
61
+ browserInstalledCheck,
62
+ // After the package check: which browser it would drive here, and how.
63
+ browserEngineCheck,
58
64
  telemetryInstalledCheck,
65
+ schedulerCheck,
59
66
  // Last, deliberately: it reports what the pipeline did to the records
60
67
  // every check above it just produced, so running it first would report a
61
68
  // process that had barely logged anything yet.
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/doctor/checks/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAA;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AACnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAA;AACzD,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AACnD,OAAO,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AAClF,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAEjD;;;;;;;;;;GAUG;AACH,SAAS,cAAc,CAAC,SAAiB,EAAE,QAAiC;IAC3E,OAAO;QACN,EAAE,EAAE,iBAAiB,CAAC,SAAS,CAAC;QAChC,QAAQ;QACR,GAAG,EAAE,GAA+B,EAAE,CAAC,wBAAwB,CAAC,SAAS,CAAC;KAC1E,CAAA;AACF,CAAC;AAED,6EAA6E;AAC7E,4EAA4E;AAC5E,0EAA0E;AAC1E,4EAA4E;AAC5E,0EAA0E;AAC1E,mEAAmE;AACnE,MAAM,CAAC,MAAM,qBAAqB,GAAgB,cAAc,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAA;AAC7F,MAAM,CAAC,MAAM,mBAAmB,GAAgB,cAAc,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAA;AACxF,MAAM,CAAC,MAAM,yBAAyB,GAAgB,cAAc,CACnE,qBAAqB,EACrB,QAAQ,CACR,CAAA;AAED,uEAAuE;AACvE,yEAAyE;AACzE,4EAA4E;AAC5E,qEAAqE;AACrE,4EAA4E;AAC5E,OAAO,EACN,sBAAsB,EACtB,kBAAkB,EAClB,wBAAwB,EACxB,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,oBAAoB,EACpB,oBAAoB,EACpB,uBAAuB,EACvB,oBAAoB,GACpB,CAAA;AAED,MAAM,CAAC,MAAM,mBAAmB,GAA2B;IAC1D,oBAAoB;IACpB,gBAAgB;IAChB,mBAAmB;IACnB,wBAAwB;IACxB,sBAAsB;IACtB,4EAA4E;IAC5E,0EAA0E;IAC1E,wCAAwC;IACxC,kBAAkB;IAClB,oBAAoB;IACpB,qBAAqB;IACrB,mBAAmB;IACnB,yBAAyB;IACzB,uBAAuB;IACvB,sEAAsE;IACtE,yEAAyE;IACzE,+CAA+C;IAC/C,oBAAoB;IACpB,eAAe;CACf,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/doctor/checks/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAA;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AACnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAA;AACzD,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AAClF,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAEjD;;;;;;;;;;GAUG;AACH,SAAS,cAAc,CAAC,SAAiB,EAAE,QAAiC;IAC3E,OAAO;QACN,EAAE,EAAE,iBAAiB,CAAC,SAAS,CAAC;QAChC,QAAQ;QACR,GAAG,EAAE,GAA+B,EAAE,CAAC,wBAAwB,CAAC,SAAS,CAAC;KAC1E,CAAA;AACF,CAAC;AAED,6EAA6E;AAC7E,4EAA4E;AAC5E,0EAA0E;AAC1E,4EAA4E;AAC5E,0EAA0E;AAC1E,mEAAmE;AACnE,MAAM,CAAC,MAAM,qBAAqB,GAAgB,cAAc,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAA;AAC7F,MAAM,CAAC,MAAM,mBAAmB,GAAgB,cAAc,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAA;AACxF,MAAM,CAAC,MAAM,yBAAyB,GAAgB,cAAc,CACnE,qBAAqB,EACrB,QAAQ,CACR,CAAA;AACD,MAAM,CAAC,MAAM,qBAAqB,GAAgB,cAAc,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAA;AAE5F,uEAAuE;AACvE,yEAAyE;AACzE,4EAA4E;AAC5E,qEAAqE;AACrE,4EAA4E;AAC5E,OAAO,EACN,kBAAkB,EAClB,sBAAsB,EACtB,kBAAkB,EAClB,wBAAwB,EACxB,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,oBAAoB,EACpB,oBAAoB,EACpB,cAAc,EACd,uBAAuB,EACvB,oBAAoB,GACpB,CAAA;AAED,MAAM,CAAC,MAAM,mBAAmB,GAA2B;IAC1D,oBAAoB;IACpB,gBAAgB;IAChB,mBAAmB;IACnB,wBAAwB;IACxB,sBAAsB;IACtB,4EAA4E;IAC5E,0EAA0E;IAC1E,wCAAwC;IACxC,kBAAkB;IAClB,oBAAoB;IACpB,qBAAqB;IACrB,mBAAmB;IACnB,yBAAyB;IACzB,qBAAqB;IACrB,uEAAuE;IACvE,kBAAkB;IAClB,uBAAuB;IACvB,cAAc;IACd,sEAAsE;IACtE,yEAAyE;IACzE,+CAA+C;IAC/C,oBAAoB;IACpB,eAAe;CACf,CAAA"}
@@ -0,0 +1,10 @@
1
+ import type { DoctorCheck } from '@namzu/sdk';
2
+ /**
3
+ * The scheduler, as far as files can tell without asking a service manager:
4
+ * whether jobs exist without a scheduler to run them, whether the installed
5
+ * service points at a node and a CLI that still exist, and how long ago the
6
+ * daemon last wrote its heartbeat. `namzu schedule status` asks the service
7
+ * manager too.
8
+ */
9
+ export declare const schedulerCheck: DoctorCheck;
10
+ //# sourceMappingURL=scheduler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../../src/doctor/checks/scheduler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAqB,MAAM,YAAY,CAAA;AAMhE;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,EAAE,WAwD5B,CAAA"}
@@ -0,0 +1,74 @@
1
+ import { readFileSync, realpathSync } from 'node:fs';
2
+ import { resolveNamzuHome } from '../../integrations/state/home.js';
3
+ import { schedulePaths } from '../../schedule/paths.js';
4
+ import { readManifest } from '../../schedule/service/manifest.js';
5
+ import { listJobs } from '../../schedule/store/jobs.js';
6
+ /**
7
+ * The scheduler, as far as files can tell without asking a service manager:
8
+ * whether jobs exist without a scheduler to run them, whether the installed
9
+ * service points at a node and a CLI that still exist, and how long ago the
10
+ * daemon last wrote its heartbeat. `namzu schedule status` asks the service
11
+ * manager too.
12
+ */
13
+ export const schedulerCheck = {
14
+ id: 'scheduler.service',
15
+ category: 'runtime',
16
+ async run(ctx) {
17
+ const paths = schedulePaths(resolveNamzuHome({ env: ctx.env }));
18
+ let jobs = 0;
19
+ try {
20
+ jobs = listJobs(paths).jobs.filter((j) => j.state === 'active').length;
21
+ }
22
+ catch {
23
+ jobs = 0;
24
+ }
25
+ let manifest;
26
+ try {
27
+ manifest = readManifest(paths);
28
+ }
29
+ catch (error) {
30
+ return { status: 'fail', message: error instanceof Error ? error.message : String(error) };
31
+ }
32
+ if (!manifest) {
33
+ return jobs > 0
34
+ ? {
35
+ status: 'warn',
36
+ message: `${jobs} active scheduled job(s) and no scheduler installed; they will not run`,
37
+ remediation: 'namzu schedule install',
38
+ }
39
+ : { status: 'skipped', message: 'no scheduled jobs and no scheduler installed' };
40
+ }
41
+ for (const path of [manifest.nodePath, manifest.binPath]) {
42
+ try {
43
+ realpathSync(path);
44
+ }
45
+ catch {
46
+ return {
47
+ status: 'fail',
48
+ message: `the scheduler service starts ${path}, which no longer exists`,
49
+ remediation: 'namzu schedule install',
50
+ };
51
+ }
52
+ }
53
+ let age;
54
+ try {
55
+ const beat = JSON.parse(readFileSync(paths.heartbeat, 'utf8'));
56
+ age = beat.at ? Date.now() - Date.parse(beat.at) : undefined;
57
+ }
58
+ catch {
59
+ age = undefined;
60
+ }
61
+ if (age === undefined || age > 90_000) {
62
+ return {
63
+ status: 'warn',
64
+ message: `${manifest.name} (${manifest.platform}) is installed but the daemon has not been seen ${age === undefined ? 'yet' : `for ${Math.round(age / 1000)} s`}`,
65
+ remediation: 'namzu schedule status',
66
+ };
67
+ }
68
+ return {
69
+ status: 'pass',
70
+ message: `${manifest.name} (${manifest.platform}) running; ${jobs} active job(s)`,
71
+ };
72
+ },
73
+ };
74
+ //# sourceMappingURL=scheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../../src/doctor/checks/scheduler.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -5,7 +5,7 @@
5
5
  */
6
6
  export { createDoctorRegistry, doctor, DoctorRegistry, registerDoctorCheck, runDoctor, } from './doctor/registry.js';
7
7
  export type { RunDoctorOptions } from './doctor/registry.js';
8
- export { builtInDoctorChecks, computerUseInstalledCheck, credentialSourcesCheck, cwdWritableCheck, filesInstalledCheck, providerChainCheck, providersRegisteredCheck, sandboxInstalledCheck, sandboxPlatformCheck, telemetryInstalledCheck, tmpdirWritableCheck, vaultRegisteredCheck, } from './doctor/checks/index.js';
8
+ export { browserEngineCheck, browserInstalledCheck, builtInDoctorChecks, computerUseInstalledCheck, credentialSourcesCheck, cwdWritableCheck, filesInstalledCheck, providerChainCheck, providersRegisteredCheck, sandboxInstalledCheck, sandboxPlatformCheck, telemetryInstalledCheck, tmpdirWritableCheck, vaultRegisteredCheck, } from './doctor/checks/index.js';
9
9
  export { type CapabilityProbe, NAMZU_OPTIONAL_CAPABILITIES, probeCapabilities, probeOptionalPackage, } from './context/capabilities.js';
10
10
  export { runDoctorCommand } from './commands/doctor.js';
11
11
  export { runCli, type RunCliOptions } from './cli.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACN,oBAAoB,EACpB,MAAM,EACN,cAAc,EACd,mBAAmB,EACnB,SAAS,GACT,MAAM,sBAAsB,CAAA;AAC7B,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAE5D,OAAO,EACN,mBAAmB,EACnB,yBAAyB,EACzB,sBAAsB,EACtB,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,wBAAwB,EACxB,qBAAqB,EACrB,oBAAoB,EACpB,uBAAuB,EACvB,mBAAmB,EACnB,oBAAoB,GACpB,MAAM,0BAA0B,CAAA;AAEjC,OAAO,EACN,KAAK,eAAe,EACpB,2BAA2B,EAC3B,iBAAiB,EACjB,oBAAoB,GACpB,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAGvD,OAAO,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAA;AACrD,YAAY,EACX,cAAc,EACd,UAAU,EACV,cAAc,EACd,kBAAkB,GAClB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EACN,WAAW,EACX,eAAe,EACf,KAAK,eAAe,GACpB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EACN,eAAe,EACf,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,YAAY,GACZ,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACN,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,wBAAwB,EACxB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,GACtB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACN,cAAc,EACd,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,SAAS,GACd,MAAM,oBAAoB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACN,oBAAoB,EACpB,MAAM,EACN,cAAc,EACd,mBAAmB,EACnB,SAAS,GACT,MAAM,sBAAsB,CAAA;AAC7B,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAE5D,OAAO,EACN,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,yBAAyB,EACzB,sBAAsB,EACtB,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,wBAAwB,EACxB,qBAAqB,EACrB,oBAAoB,EACpB,uBAAuB,EACvB,mBAAmB,EACnB,oBAAoB,GACpB,MAAM,0BAA0B,CAAA;AAEjC,OAAO,EACN,KAAK,eAAe,EACpB,2BAA2B,EAC3B,iBAAiB,EACjB,oBAAoB,GACpB,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAGvD,OAAO,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAA;AACrD,YAAY,EACX,cAAc,EACd,UAAU,EACV,cAAc,EACd,kBAAkB,GAClB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EACN,WAAW,EACX,eAAe,EACf,KAAK,eAAe,GACpB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EACN,eAAe,EACf,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,YAAY,GACZ,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACN,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,wBAAwB,EACxB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,GACtB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACN,cAAc,EACd,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,SAAS,GACd,MAAM,oBAAoB,CAAA"}
package/dist/index.js CHANGED
@@ -5,7 +5,7 @@
5
5
  */
6
6
  // Doctor library API (pre-M0; preserved for embedded consumers).
7
7
  export { createDoctorRegistry, doctor, DoctorRegistry, registerDoctorCheck, runDoctor, } from './doctor/registry.js';
8
- export { builtInDoctorChecks, computerUseInstalledCheck, credentialSourcesCheck, cwdWritableCheck, filesInstalledCheck, providerChainCheck, providersRegisteredCheck, sandboxInstalledCheck, sandboxPlatformCheck, telemetryInstalledCheck, tmpdirWritableCheck, vaultRegisteredCheck, } from './doctor/checks/index.js';
8
+ export { browserEngineCheck, browserInstalledCheck, builtInDoctorChecks, computerUseInstalledCheck, credentialSourcesCheck, cwdWritableCheck, filesInstalledCheck, providerChainCheck, providersRegisteredCheck, sandboxInstalledCheck, sandboxPlatformCheck, telemetryInstalledCheck, tmpdirWritableCheck, vaultRegisteredCheck, } from './doctor/checks/index.js';
9
9
  export { NAMZU_OPTIONAL_CAPABILITIES, probeCapabilities, probeOptionalPackage, } from './context/capabilities.js';
10
10
  export { runDoctorCommand } from './commands/doctor.js';
11
11
  // Shell + extension surface for the CLI.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,iEAAiE;AACjE,OAAO,EACN,oBAAoB,EACpB,MAAM,EACN,cAAc,EACd,mBAAmB,EACnB,SAAS,GACT,MAAM,sBAAsB,CAAA;AAG7B,OAAO,EACN,mBAAmB,EACnB,yBAAyB,EACzB,sBAAsB,EACtB,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,wBAAwB,EACxB,qBAAqB,EACrB,oBAAoB,EACpB,uBAAuB,EACvB,mBAAmB,EACnB,oBAAoB,GACpB,MAAM,0BAA0B,CAAA;AAEjC,OAAO,EAEN,2BAA2B,EAC3B,iBAAiB,EACjB,oBAAoB,GACpB,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAEvD,yCAAyC;AACzC,OAAO,EAAE,MAAM,EAAsB,MAAM,UAAU,CAAA;AAOrD,OAAO,EACN,WAAW,EACX,eAAe,GAEf,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EACN,eAAe,EAIf,YAAY,GACZ,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACN,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,wBAAwB,GAKxB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACN,cAAc,GAQd,MAAM,oBAAoB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,iEAAiE;AACjE,OAAO,EACN,oBAAoB,EACpB,MAAM,EACN,cAAc,EACd,mBAAmB,EACnB,SAAS,GACT,MAAM,sBAAsB,CAAA;AAG7B,OAAO,EACN,kBAAkB,EAClB,qBAAqB,EACrB,mBAAmB,EACnB,yBAAyB,EACzB,sBAAsB,EACtB,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,wBAAwB,EACxB,qBAAqB,EACrB,oBAAoB,EACpB,uBAAuB,EACvB,mBAAmB,EACnB,oBAAoB,GACpB,MAAM,0BAA0B,CAAA;AAEjC,OAAO,EAEN,2BAA2B,EAC3B,iBAAiB,EACjB,oBAAoB,GACpB,MAAM,2BAA2B,CAAA;AAElC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAEvD,yCAAyC;AACzC,OAAO,EAAE,MAAM,EAAsB,MAAM,UAAU,CAAA;AAOrD,OAAO,EACN,WAAW,EACX,eAAe,GAEf,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EACN,eAAe,EAIf,YAAY,GACZ,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACN,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,wBAAwB,GAKxB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACN,cAAc,GAQd,MAAM,oBAAoB,CAAA"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * A Linux desktop notification over the session bus: `notify-send` when it
3
+ * is installed (arguments are argv, never a shell), else `gdbus`, whose
4
+ * arguments are GVariant text and so are quoted as GVariant strings here.
5
+ */
6
+ /** A GVariant string literal: single-quoted, backslash and quote escaped. */
7
+ export declare function gvariantString(text: string): string;
8
+ export declare function notifySendArguments(title: string, body: string): string[];
9
+ export declare function gdbusArguments(title: string, body: string): string[];
10
+ //# sourceMappingURL=freedesktop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"freedesktop.d.ts","sourceRoot":"","sources":["../../../../src/integrations/notifications/desktop/freedesktop.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,6EAA6E;AAC7E,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAEzE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAmBpE"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * A Linux desktop notification over the session bus: `notify-send` when it
3
+ * is installed (arguments are argv, never a shell), else `gdbus`, whose
4
+ * arguments are GVariant text and so are quoted as GVariant strings here.
5
+ */
6
+ /** A GVariant string literal: single-quoted, backslash and quote escaped. */
7
+ export function gvariantString(text) {
8
+ return `'${text.replaceAll('\\', '\\\\').replaceAll("'", "\\'")}'`;
9
+ }
10
+ export function notifySendArguments(title, body) {
11
+ return ['--app-name=namzu', '--', title, body];
12
+ }
13
+ export function gdbusArguments(title, body) {
14
+ return [
15
+ 'call',
16
+ '--session',
17
+ '--dest',
18
+ 'org.freedesktop.Notifications',
19
+ '--object-path',
20
+ '/org/freedesktop/Notifications',
21
+ '--method',
22
+ 'org.freedesktop.Notifications.Notify',
23
+ gvariantString('namzu'),
24
+ '0',
25
+ gvariantString(''),
26
+ gvariantString(title),
27
+ gvariantString(body),
28
+ '[]',
29
+ '{}',
30
+ '10000',
31
+ ];
32
+ }
33
+ //# sourceMappingURL=freedesktop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"freedesktop.js","sourceRoot":"","sources":["../../../../src/integrations/notifications/desktop/freedesktop.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,6EAA6E;AAC7E,MAAM,UAAU,cAAc,CAAC,IAAY;IAC1C,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAA;AACnE,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAa,EAAE,IAAY;IAC9D,OAAO,CAAC,kBAAkB,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA;AAC/C,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAa,EAAE,IAAY;IACzD,OAAO;QACN,MAAM;QACN,WAAW;QACX,QAAQ;QACR,+BAA+B;QAC/B,eAAe;QACf,gCAAgC;QAChC,UAAU;QACV,sCAAsC;QACtC,cAAc,CAAC,OAAO,CAAC;QACvB,GAAG;QACH,cAAc,CAAC,EAAE,CAAC;QAClB,cAAc,CAAC,KAAK,CAAC;QACrB,cAAc,CAAC,IAAI,CAAC;QACpB,IAAI;QACJ,IAAI;QACJ,OAAO;KACP,CAAA;AACF,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * A macOS notification through `osascript`. The title and body are argv
3
+ * items the script reads (`item 1 of argv`), never text spliced into it.
4
+ */
5
+ export declare function osascriptArguments(title: string, body: string): string[];
6
+ //# sourceMappingURL=macos.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"macos.d.ts","sourceRoot":"","sources":["../../../../src/integrations/notifications/desktop/macos.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAWxE"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * A macOS notification through `osascript`. The title and body are argv
3
+ * items the script reads (`item 1 of argv`), never text spliced into it.
4
+ */
5
+ export function osascriptArguments(title, body) {
6
+ return [
7
+ '-e',
8
+ 'on run argv',
9
+ '-e',
10
+ 'display notification (item 2 of argv) with title (item 1 of argv)',
11
+ '-e',
12
+ 'end run',
13
+ title,
14
+ body,
15
+ ];
16
+ }
17
+ //# sourceMappingURL=macos.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"macos.js","sourceRoot":"","sources":["../../../../src/integrations/notifications/desktop/macos.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa,EAAE,IAAY;IAC7D,OAAO;QACN,IAAI;QACJ,aAAa;QACb,IAAI;QACJ,mEAAmE;QACnE,IAAI;QACJ,SAAS;QACT,KAAK;QACL,IAAI;KACJ,CAAA;AACF,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Text that crosses into another program — a desktop notification, a history
3
+ * summary — is data, and is made safe to show as data.
4
+ *
5
+ * Control characters (C0, DEL, C1), format characters that render as nothing
6
+ * (zero-width space and joiners, soft hyphen, the byte-order mark) and the
7
+ * bidirectional controls (embeddings, overrides, isolates, marks) are removed;
8
+ * whitespace runs become one space; the result is capped with an ellipsis.
9
+ * Written over code points rather than a regular expression so the ranges are
10
+ * plain numbers a reader can check.
11
+ */
12
+ /** One safe line of at most `max` characters. */
13
+ export declare function sanitizeLine(text: string, max: number): string;
14
+ /** The first non-empty line of `text`, made safe and capped: a run's summary. */
15
+ export declare function summaryOf(text: string, max?: number): string;
16
+ //# sourceMappingURL=sanitize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../../../src/integrations/notifications/desktop/sanitize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAmBH,iDAAiD;AACjD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAU9D;AAED,iFAAiF;AACjF,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,SAAM,GAAG,MAAM,CAMzD"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Text that crosses into another program — a desktop notification, a history
3
+ * summary — is data, and is made safe to show as data.
4
+ *
5
+ * Control characters (C0, DEL, C1), format characters that render as nothing
6
+ * (zero-width space and joiners, soft hyphen, the byte-order mark) and the
7
+ * bidirectional controls (embeddings, overrides, isolates, marks) are removed;
8
+ * whitespace runs become one space; the result is capped with an ellipsis.
9
+ * Written over code points rather than a regular expression so the ranges are
10
+ * plain numbers a reader can check.
11
+ */
12
+ const STRIPPED = [
13
+ [0x0000, 0x001f], // C0 controls (newline and tab too: a notification is one line)
14
+ [0x007f, 0x009f], // DEL and C1 controls
15
+ [0x00ad, 0x00ad], // soft hyphen
16
+ [0x061c, 0x061c], // Arabic letter mark
17
+ [0x180e, 0x180e], // Mongolian vowel separator
18
+ [0x200b, 0x200f], // zero-width space, joiners, LRM, RLM
19
+ [0x2028, 0x202e], // line and paragraph separators, embeddings and overrides
20
+ [0x2060, 0x206f], // word joiner, invisible operators, isolates, deprecated formats
21
+ [0xfeff, 0xfeff], // byte-order mark
22
+ [0xfff9, 0xfffb], // interlinear annotations
23
+ ];
24
+ function stripped(code) {
25
+ return STRIPPED.some(([lo, hi]) => code >= lo && code <= hi);
26
+ }
27
+ /** One safe line of at most `max` characters. */
28
+ export function sanitizeLine(text, max) {
29
+ let out = '';
30
+ for (const ch of text) {
31
+ const code = ch.codePointAt(0) ?? 0;
32
+ if (code === 0x09 || code === 0x0a || code === 0x0d)
33
+ out += ' ';
34
+ else if (!stripped(code))
35
+ out += ch;
36
+ }
37
+ out = out.replace(/\s+/g, ' ').trim();
38
+ const chars = [...out];
39
+ return chars.length > max ? `${chars.slice(0, max - 1).join('')}…` : out;
40
+ }
41
+ /** The first non-empty line of `text`, made safe and capped: a run's summary. */
42
+ export function summaryOf(text, max = 200) {
43
+ const first = text
44
+ .split(/\r?\n/)
45
+ .map((line) => line.replace(/^[#>*\-\s`]+/, '').trim())
46
+ .find((line) => line.length > 0);
47
+ return first ? sanitizeLine(first, max) : '';
48
+ }
49
+ //# sourceMappingURL=sanitize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize.js","sourceRoot":"","sources":["../../../../src/integrations/notifications/desktop/sanitize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,QAAQ,GAA2C;IACxD,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,gEAAgE;IAClF,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,sBAAsB;IACxC,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,cAAc;IAChC,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,qBAAqB;IACvC,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,4BAA4B;IAC9C,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,sCAAsC;IACxD,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,0DAA0D;IAC5E,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,iEAAiE;IACnF,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,kBAAkB;IACpC,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,0BAA0B;CAC5C,CAAA;AAED,SAAS,QAAQ,CAAC,IAAY;IAC7B,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC,CAAA;AAC7D,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,GAAW;IACrD,IAAI,GAAG,GAAG,EAAE,CAAA;IACZ,KAAK,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QACnC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI;YAAE,GAAG,IAAI,GAAG,CAAA;aAC1D,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,GAAG,IAAI,EAAE,CAAA;IACpC,CAAC;IACD,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAA;IACrC,MAAM,KAAK,GAAG,CAAC,GAAG,GAAG,CAAC,CAAA;IACtB,OAAO,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAA;AACzE,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,GAAG,GAAG,GAAG;IAChD,MAAM,KAAK,GAAG,IAAI;SAChB,KAAK,CAAC,OAAO,CAAC;SACd,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;SACtD,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IACjC,OAAO,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;AAC7C,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * At most one notification per job every ten minutes and twenty a day in
3
+ * all; what is held back is counted, for the TUI's next startup line.
4
+ * Kept in `schedule/daemon/notify.json`, written only by the daemon.
5
+ */
6
+ /** Whether a notification for `jobId` may go out now; records it when it may. */
7
+ export declare function admitNotification(path: string, jobId: string, now?: number): boolean;
8
+ /** How many notifications were held back since the count was last taken; resets it. */
9
+ export declare function takeSuppressedCount(path: string): number;
10
+ //# sourceMappingURL=throttle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"throttle.d.ts","sourceRoot":"","sources":["../../../../src/integrations/notifications/desktop/throttle.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAwBH,iFAAiF;AACjF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,OAAO,CAUxF;AAED,uFAAuF;AACvF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIxD"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * At most one notification per job every ten minutes and twenty a day in
3
+ * all; what is held back is counted, for the TUI's next startup line.
4
+ * Kept in `schedule/daemon/notify.json`, written only by the daemon.
5
+ */
6
+ import { readFileSync } from 'node:fs';
7
+ import { writeJsonAtomic } from '../../../schedule/store/atomic.js';
8
+ const PER_JOB_MS = 10 * 60_000;
9
+ const PER_DAY = 20;
10
+ const DAY_MS = 24 * 60 * 60_000;
11
+ function read(path) {
12
+ try {
13
+ const parsed = JSON.parse(readFileSync(path, 'utf8'));
14
+ if (parsed.kind === 'schedule-notify' && Array.isArray(parsed.sent))
15
+ return parsed;
16
+ }
17
+ catch { }
18
+ return { v: 1, kind: 'schedule-notify', sent: [], suppressed: 0 };
19
+ }
20
+ /** Whether a notification for `jobId` may go out now; records it when it may. */
21
+ export function admitNotification(path, jobId, now = Date.now()) {
22
+ const file = read(path);
23
+ const recent = file.sent.filter((s) => now - s.at < DAY_MS);
24
+ const jobRecent = recent.some((s) => s.jobId === jobId && now - s.at < PER_JOB_MS);
25
+ if (jobRecent || recent.length >= PER_DAY) {
26
+ writeJsonAtomic(path, { ...file, sent: recent, suppressed: file.suppressed + 1 });
27
+ return false;
28
+ }
29
+ writeJsonAtomic(path, { ...file, sent: [...recent, { jobId, at: now }] });
30
+ return true;
31
+ }
32
+ /** How many notifications were held back since the count was last taken; resets it. */
33
+ export function takeSuppressedCount(path) {
34
+ const file = read(path);
35
+ if (file.suppressed > 0)
36
+ writeJsonAtomic(path, { ...file, suppressed: 0 });
37
+ return file.suppressed;
38
+ }
39
+ //# sourceMappingURL=throttle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"throttle.js","sourceRoot":"","sources":["../../../../src/integrations/notifications/desktop/throttle.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAA;AAEnE,MAAM,UAAU,GAAG,EAAE,GAAG,MAAM,CAAA;AAC9B,MAAM,OAAO,GAAG,EAAE,CAAA;AAClB,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,CAAA;AAS/B,SAAS,IAAI,CAAC,IAAY;IACzB,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAiB,CAAA;QACrE,IAAI,MAAM,CAAC,IAAI,KAAK,iBAAiB,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;YAAE,OAAO,MAAM,CAAA;IACnF,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IACV,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAA;AAClE,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,KAAa,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IAC9E,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAA;IACvB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,CAAA;IAC3D,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE,GAAG,UAAU,CAAC,CAAA;IAClF,IAAI,SAAS,IAAI,MAAM,CAAC,MAAM,IAAI,OAAO,EAAE,CAAC;QAC3C,eAAe,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC,CAAA;QACjF,OAAO,KAAK,CAAA;IACb,CAAC;IACD,eAAe,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC,GAAG,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAA;IACzE,OAAO,IAAI,CAAA;AACZ,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAA;IACvB,IAAI,IAAI,CAAC,UAAU,GAAG,CAAC;QAAE,eAAe,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAA;IAC1E,OAAO,IAAI,CAAC,UAAU,CAAA;AACvB,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * A Windows toast through PowerShell and the WinRT notification API — no
3
+ * module to install. Used natively and from WSL (through interop).
4
+ *
5
+ * The script is a CONSTANT, sent as `-EncodedCommand` with no arguments after
6
+ * it: `-Command` would join trailing arguments into the script text, which is
7
+ * exactly the injection this avoids. The title and body reach it only through
8
+ * the environment (`NAMZU_NOTIFY_TITLE`, `NAMZU_NOTIFY_BODY`) and are
9
+ * XML-escaped inside the script before they touch the toast's XML.
10
+ */
11
+ export declare const TOAST_SCRIPT: string;
12
+ /** The script as `-EncodedCommand` wants it: base64 of UTF-16LE. */
13
+ export declare function encodedToastScript(): string;
14
+ /** For a test: the script never changes with its input. */
15
+ export declare function toastScriptHash(): string;
16
+ export declare function toastArguments(): string[];
17
+ /**
18
+ * The environment for the PowerShell process. Under WSL a Linux variable
19
+ * reaches a Windows process only when `WSLENV` names it; without this the
20
+ * toast would arrive empty.
21
+ */
22
+ export declare function toastEnvironment(base: NodeJS.ProcessEnv, title: string, body: string, wsl: boolean): NodeJS.ProcessEnv;
23
+ //# sourceMappingURL=windows-toast.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windows-toast.d.ts","sourceRoot":"","sources":["../../../../src/integrations/notifications/desktop/windows-toast.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,eAAO,MAAM,YAAY,QAUb,CAAA;AAEZ,oEAAoE;AACpE,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,2DAA2D;AAC3D,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,cAAc,IAAI,MAAM,EAAE,CASzC;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC/B,IAAI,EAAE,MAAM,CAAC,UAAU,EACvB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,OAAO,GACV,MAAM,CAAC,UAAU,CASnB"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * A Windows toast through PowerShell and the WinRT notification API — no
3
+ * module to install. Used natively and from WSL (through interop).
4
+ *
5
+ * The script is a CONSTANT, sent as `-EncodedCommand` with no arguments after
6
+ * it: `-Command` would join trailing arguments into the script text, which is
7
+ * exactly the injection this avoids. The title and body reach it only through
8
+ * the environment (`NAMZU_NOTIFY_TITLE`, `NAMZU_NOTIFY_BODY`) and are
9
+ * XML-escaped inside the script before they touch the toast's XML.
10
+ */
11
+ import { createHash } from 'node:crypto';
12
+ export const TOAST_SCRIPT = [
13
+ "$ErrorActionPreference = 'Stop'",
14
+ '[Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] | Out-Null',
15
+ '[Windows.Data.Xml.Dom.XmlDocument, Windows.Data.Xml.Dom.XmlDocument, ContentType = WindowsRuntime] | Out-Null',
16
+ '$title = [Security.SecurityElement]::Escape([string]$env:NAMZU_NOTIFY_TITLE)',
17
+ '$body = [Security.SecurityElement]::Escape([string]$env:NAMZU_NOTIFY_BODY)',
18
+ '$xml = New-Object Windows.Data.Xml.Dom.XmlDocument',
19
+ "$xml.LoadXml('<toast><visual><binding template=\"ToastGeneric\"><text>' + $title + '</text><text>' + $body + '</text></binding></visual></toast>')",
20
+ "$app = '{1AC14E77-02E7-4E5D-B744-2EB1AE5198B7}\\WindowsPowerShell\\v1.0\\powershell.exe'",
21
+ '[Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier($app).Show([Windows.UI.Notifications.ToastNotification]::new($xml))',
22
+ ].join('\n');
23
+ /** The script as `-EncodedCommand` wants it: base64 of UTF-16LE. */
24
+ export function encodedToastScript() {
25
+ return Buffer.from(TOAST_SCRIPT, 'utf16le').toString('base64');
26
+ }
27
+ /** For a test: the script never changes with its input. */
28
+ export function toastScriptHash() {
29
+ return createHash('sha256').update(TOAST_SCRIPT).digest('hex');
30
+ }
31
+ export function toastArguments() {
32
+ return [
33
+ '-NoProfile',
34
+ '-NonInteractive',
35
+ '-ExecutionPolicy',
36
+ 'Bypass',
37
+ '-EncodedCommand',
38
+ encodedToastScript(),
39
+ ];
40
+ }
41
+ /**
42
+ * The environment for the PowerShell process. Under WSL a Linux variable
43
+ * reaches a Windows process only when `WSLENV` names it; without this the
44
+ * toast would arrive empty.
45
+ */
46
+ export function toastEnvironment(base, title, body, wsl) {
47
+ const env = { ...base, NAMZU_NOTIFY_TITLE: title, NAMZU_NOTIFY_BODY: body };
48
+ if (wsl) {
49
+ const existing = (base.WSLENV ?? '')
50
+ .split(':')
51
+ .filter((v) => v && !v.startsWith('NAMZU_NOTIFY_'));
52
+ env.WSLENV = [...existing, 'NAMZU_NOTIFY_TITLE', 'NAMZU_NOTIFY_BODY'].join(':');
53
+ }
54
+ return env;
55
+ }
56
+ //# sourceMappingURL=windows-toast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windows-toast.js","sourceRoot":"","sources":["../../../../src/integrations/notifications/desktop/windows-toast.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC,MAAM,CAAC,MAAM,YAAY,GAAG;IAC3B,iCAAiC;IACjC,wHAAwH;IACxH,+GAA+G;IAC/G,8EAA8E;IAC9E,4EAA4E;IAC5E,oDAAoD;IACpD,oJAAoJ;IACpJ,0FAA0F;IAC1F,8IAA8I;CAC9I,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAEZ,oEAAoE;AACpE,MAAM,UAAU,kBAAkB;IACjC,OAAO,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;AAC/D,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,eAAe;IAC9B,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AAC/D,CAAC;AAED,MAAM,UAAU,cAAc;IAC7B,OAAO;QACN,YAAY;QACZ,iBAAiB;QACjB,kBAAkB;QAClB,QAAQ;QACR,iBAAiB;QACjB,kBAAkB,EAAE;KACpB,CAAA;AACF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAC/B,IAAuB,EACvB,KAAa,EACb,IAAY,EACZ,GAAY;IAEZ,MAAM,GAAG,GAAsB,EAAE,GAAG,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAA;IAC9F,IAAI,GAAG,EAAE,CAAC;QACT,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;aAClC,KAAK,CAAC,GAAG,CAAC;aACV,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CAAA;QACpD,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,QAAQ,EAAE,oBAAoB,EAAE,mBAAmB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAChF,CAAC;IACD,OAAO,GAAG,CAAA;AACX,CAAC"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Desktop notifications for scheduled runs.
3
+ *
4
+ * | Backend | When | How |
5
+ * |---|---|---|
6
+ * | `wsl-toast` | WSL with interop and `powershell.exe` | a Windows toast through interop |
7
+ * | `windows-toast` | Windows | the same toast |
8
+ * | `macos` | macOS | `osascript`, title and body as argv |
9
+ * | `freedesktop` | Linux with a session bus | `notify-send`, else `gdbus` |
10
+ * | `none` | nothing works | the reason is kept and shown by `schedule status` |
11
+ *
12
+ * Title and body are DATA: they reach the other program as argv items or
13
+ * environment variables, never as script text, and are stripped of control,
14
+ * format and bidirectional characters first. By default a notification says
15
+ * which job and what happened, nothing from the model; a job opts into its
16
+ * one-line summary with `notify.includeSummary`.
17
+ */
18
+ export type DesktopBackendKind = 'wsl-toast' | 'windows-toast' | 'macos' | 'freedesktop' | 'none';
19
+ export interface DesktopBackend {
20
+ readonly kind: DesktopBackendKind;
21
+ /** Why `none`, or which program the backend runs. */
22
+ readonly detail: string;
23
+ readonly command?: string;
24
+ readonly args?: (title: string, body: string) => string[];
25
+ readonly env?: (base: NodeJS.ProcessEnv, title: string, body: string) => NodeJS.ProcessEnv;
26
+ readonly cwd?: string;
27
+ }
28
+ export interface BackendProbe {
29
+ readonly platform?: NodeJS.Platform;
30
+ readonly env?: NodeJS.ProcessEnv;
31
+ readonly exists?: (path: string) => boolean;
32
+ /** A program on PATH, by name. */
33
+ readonly which?: (name: string) => string | undefined;
34
+ /** `powershell.exe` under WSL, as recorded at install. */
35
+ readonly powershell?: string;
36
+ /** Where WSL mounts the Windows drives; absent reads `/etc/wsl.conf`. */
37
+ readonly mountRoot?: string;
38
+ /** The kernel release (`/proc/sys/kernel/osrelease`); WSL's names Microsoft. */
39
+ readonly osRelease?: () => string | undefined;
40
+ /** WSL's interop sockets (`/run/WSL/*_interop`), each with its modification time. */
41
+ readonly interopSockets?: () => readonly {
42
+ readonly path: string;
43
+ readonly mtimeMs: number;
44
+ }[];
45
+ }
46
+ /**
47
+ * The interop socket a process without `WSL_INTEROP` can use — a systemd
48
+ * service's, which WSL starts outside any session. `1_interop` is the one
49
+ * WSL links for systemd to the distro's own init, so it lives as long as the
50
+ * distro; failing that, the newest session's.
51
+ */
52
+ export declare function findInteropSocket(sockets: readonly {
53
+ readonly path: string;
54
+ readonly mtimeMs: number;
55
+ }[]): string | undefined;
56
+ /** Pick the backend this machine supports. */
57
+ export declare function selectDesktopBackend(probe?: BackendProbe): DesktopBackend;
58
+ export interface DesktopNotification {
59
+ readonly title: string;
60
+ readonly body: string;
61
+ }
62
+ export type DesktopNotifyResult = {
63
+ readonly kind: 'sent';
64
+ } | {
65
+ readonly kind: 'unavailable';
66
+ readonly detail: string;
67
+ } | {
68
+ readonly kind: 'failed';
69
+ readonly detail: string;
70
+ };
71
+ export type Spawn = (command: string, args: readonly string[], options: {
72
+ readonly env: NodeJS.ProcessEnv;
73
+ readonly cwd?: string;
74
+ readonly timeoutMs: number;
75
+ }) => Promise<{
76
+ readonly code: number | null;
77
+ readonly stderr: string;
78
+ }>;
79
+ /** Send one notification. Never throws. */
80
+ export declare function sendDesktopNotification(backend: DesktopBackend, notification: DesktopNotification, options?: {
81
+ readonly env?: NodeJS.ProcessEnv;
82
+ readonly spawn?: Spawn;
83
+ }): Promise<DesktopNotifyResult>;
84
+ //# sourceMappingURL=desktop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"desktop.d.ts","sourceRoot":"","sources":["../../../src/integrations/notifications/desktop.ts"],"names":[],"mappings":"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"}