@namzu/cli 29.0.0 → 29.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (390) hide show
  1. package/CHANGELOG.md +146 -0
  2. package/README.md +20 -0
  3. package/dist/browser/commands.d.ts +29 -0
  4. package/dist/browser/commands.d.ts.map +1 -0
  5. package/dist/browser/commands.js +361 -0
  6. package/dist/browser/commands.js.map +1 -0
  7. package/dist/browser/control.d.ts +79 -0
  8. package/dist/browser/control.d.ts.map +1 -0
  9. package/dist/browser/control.js +140 -0
  10. package/dist/browser/control.js.map +1 -0
  11. package/dist/browser/describe.d.ts +12 -0
  12. package/dist/browser/describe.d.ts.map +1 -0
  13. package/dist/browser/describe.js +27 -0
  14. package/dist/browser/describe.js.map +1 -0
  15. package/dist/cli.d.ts.map +1 -1
  16. package/dist/cli.js +29 -2
  17. package/dist/cli.js.map +1 -1
  18. package/dist/commands/acp.d.ts.map +1 -1
  19. package/dist/commands/acp.js +1 -0
  20. package/dist/commands/acp.js.map +1 -1
  21. package/dist/commands/browser.d.ts +7 -0
  22. package/dist/commands/browser.d.ts.map +1 -0
  23. package/dist/commands/browser.js +16 -0
  24. package/dist/commands/browser.js.map +1 -0
  25. package/dist/commands/drain.d.ts +2 -1
  26. package/dist/commands/drain.d.ts.map +1 -1
  27. package/dist/commands/drain.js +6 -3
  28. package/dist/commands/drain.js.map +1 -1
  29. package/dist/commands/exec-flags.d.ts +2 -1
  30. package/dist/commands/exec-flags.d.ts.map +1 -1
  31. package/dist/commands/exec-flags.js +6 -3
  32. package/dist/commands/exec-flags.js.map +1 -1
  33. package/dist/commands/exec-json.d.ts.map +1 -1
  34. package/dist/commands/exec-json.js +2 -1
  35. package/dist/commands/exec-json.js.map +1 -1
  36. package/dist/commands/exec.d.ts.map +1 -1
  37. package/dist/commands/exec.js +2 -1
  38. package/dist/commands/exec.js.map +1 -1
  39. package/dist/commands/host-queries.d.ts.map +1 -1
  40. package/dist/commands/host-queries.js +10 -3
  41. package/dist/commands/host-queries.js.map +1 -1
  42. package/dist/commands/schedule.d.ts +9 -0
  43. package/dist/commands/schedule.d.ts.map +1 -0
  44. package/dist/commands/schedule.js +126 -0
  45. package/dist/commands/schedule.js.map +1 -0
  46. package/dist/commands/serve.d.ts +3 -1
  47. package/dist/commands/serve.d.ts.map +1 -1
  48. package/dist/commands/serve.js +5 -3
  49. package/dist/commands/serve.js.map +1 -1
  50. package/dist/commands/skills.d.ts +10 -0
  51. package/dist/commands/skills.d.ts.map +1 -1
  52. package/dist/commands/skills.js +23 -7
  53. package/dist/commands/skills.js.map +1 -1
  54. package/dist/commands/upgrade.d.ts +5 -0
  55. package/dist/commands/upgrade.d.ts.map +1 -1
  56. package/dist/commands/upgrade.js +11 -0
  57. package/dist/commands/upgrade.js.map +1 -1
  58. package/dist/config/load.d.ts +39 -0
  59. package/dist/config/load.d.ts.map +1 -1
  60. package/dist/config/load.js +232 -1
  61. package/dist/config/load.js.map +1 -1
  62. package/dist/config/schema.d.ts +78 -0
  63. package/dist/config/schema.d.ts.map +1 -1
  64. package/dist/config/schema.js.map +1 -1
  65. package/dist/config/user-config.d.ts +23 -0
  66. package/dist/config/user-config.d.ts.map +1 -0
  67. package/dist/config/user-config.js +48 -0
  68. package/dist/config/user-config.js.map +1 -0
  69. package/dist/context/capabilities.d.ts +1 -1
  70. package/dist/context/capabilities.d.ts.map +1 -1
  71. package/dist/context/capabilities.js +1 -0
  72. package/dist/context/capabilities.js.map +1 -1
  73. package/dist/doctor/checks/browser.d.ts +15 -0
  74. package/dist/doctor/checks/browser.d.ts.map +1 -0
  75. package/dist/doctor/checks/browser.js +63 -0
  76. package/dist/doctor/checks/browser.js.map +1 -0
  77. package/dist/doctor/checks/index.d.ts +4 -1
  78. package/dist/doctor/checks/index.d.ts.map +1 -1
  79. package/dist/doctor/checks/index.js +8 -1
  80. package/dist/doctor/checks/index.js.map +1 -1
  81. package/dist/doctor/checks/scheduler.d.ts +10 -0
  82. package/dist/doctor/checks/scheduler.d.ts.map +1 -0
  83. package/dist/doctor/checks/scheduler.js +74 -0
  84. package/dist/doctor/checks/scheduler.js.map +1 -0
  85. package/dist/index.d.ts +1 -1
  86. package/dist/index.d.ts.map +1 -1
  87. package/dist/index.js +1 -1
  88. package/dist/index.js.map +1 -1
  89. package/dist/integrations/notifications/desktop/freedesktop.d.ts +10 -0
  90. package/dist/integrations/notifications/desktop/freedesktop.d.ts.map +1 -0
  91. package/dist/integrations/notifications/desktop/freedesktop.js +33 -0
  92. package/dist/integrations/notifications/desktop/freedesktop.js.map +1 -0
  93. package/dist/integrations/notifications/desktop/macos.d.ts +6 -0
  94. package/dist/integrations/notifications/desktop/macos.d.ts.map +1 -0
  95. package/dist/integrations/notifications/desktop/macos.js +17 -0
  96. package/dist/integrations/notifications/desktop/macos.js.map +1 -0
  97. package/dist/integrations/notifications/desktop/sanitize.d.ts +16 -0
  98. package/dist/integrations/notifications/desktop/sanitize.d.ts.map +1 -0
  99. package/dist/integrations/notifications/desktop/sanitize.js +49 -0
  100. package/dist/integrations/notifications/desktop/sanitize.js.map +1 -0
  101. package/dist/integrations/notifications/desktop/throttle.d.ts +10 -0
  102. package/dist/integrations/notifications/desktop/throttle.d.ts.map +1 -0
  103. package/dist/integrations/notifications/desktop/throttle.js +39 -0
  104. package/dist/integrations/notifications/desktop/throttle.js.map +1 -0
  105. package/dist/integrations/notifications/desktop/windows-toast.d.ts +23 -0
  106. package/dist/integrations/notifications/desktop/windows-toast.d.ts.map +1 -0
  107. package/dist/integrations/notifications/desktop/windows-toast.js +56 -0
  108. package/dist/integrations/notifications/desktop/windows-toast.js.map +1 -0
  109. package/dist/integrations/notifications/desktop.d.ts +82 -0
  110. package/dist/integrations/notifications/desktop.d.ts.map +1 -0
  111. package/dist/integrations/notifications/desktop.js +198 -0
  112. package/dist/integrations/notifications/desktop.js.map +1 -0
  113. package/dist/integrations/resident/session-step.d.ts.map +1 -1
  114. package/dist/integrations/resident/session-step.js +1 -0
  115. package/dist/integrations/resident/session-step.js.map +1 -1
  116. package/dist/integrations/subagents/runtime.d.ts +6 -0
  117. package/dist/integrations/subagents/runtime.d.ts.map +1 -1
  118. package/dist/integrations/subagents/runtime.js +14 -5
  119. package/dist/integrations/subagents/runtime.js.map +1 -1
  120. package/dist/permissions/browser-sites.d.ts +95 -0
  121. package/dist/permissions/browser-sites.d.ts.map +1 -0
  122. package/dist/permissions/browser-sites.js +270 -0
  123. package/dist/permissions/browser-sites.js.map +1 -0
  124. package/dist/permissions/checks.d.ts.map +1 -1
  125. package/dist/permissions/checks.js +7 -1
  126. package/dist/permissions/checks.js.map +1 -1
  127. package/dist/permissions/rules.d.ts.map +1 -1
  128. package/dist/permissions/rules.js +4 -8
  129. package/dist/permissions/rules.js.map +1 -1
  130. package/dist/schedule/build.d.ts +79 -0
  131. package/dist/schedule/build.d.ts.map +1 -0
  132. package/dist/schedule/build.js +246 -0
  133. package/dist/schedule/build.js.map +1 -0
  134. package/dist/schedule/changes.d.ts +22 -0
  135. package/dist/schedule/changes.d.ts.map +1 -0
  136. package/dist/schedule/changes.js +55 -0
  137. package/dist/schedule/changes.js.map +1 -0
  138. package/dist/schedule/commands/add.d.ts +24 -0
  139. package/dist/schedule/commands/add.d.ts.map +1 -0
  140. package/dist/schedule/commands/add.js +459 -0
  141. package/dist/schedule/commands/add.js.map +1 -0
  142. package/dist/schedule/commands/args.d.ts +22 -0
  143. package/dist/schedule/commands/args.d.ts.map +1 -0
  144. package/dist/schedule/commands/args.js +80 -0
  145. package/dist/schedule/commands/args.js.map +1 -0
  146. package/dist/schedule/commands/confirm-prompt.d.ts +6 -0
  147. package/dist/schedule/commands/confirm-prompt.d.ts.map +1 -0
  148. package/dist/schedule/commands/confirm-prompt.js +21 -0
  149. package/dist/schedule/commands/confirm-prompt.js.map +1 -0
  150. package/dist/schedule/commands/lifecycle.d.ts +39 -0
  151. package/dist/schedule/commands/lifecycle.d.ts.map +1 -0
  152. package/dist/schedule/commands/lifecycle.js +585 -0
  153. package/dist/schedule/commands/lifecycle.js.map +1 -0
  154. package/dist/schedule/commands/list.d.ts +33 -0
  155. package/dist/schedule/commands/list.d.ts.map +1 -0
  156. package/dist/schedule/commands/list.js +202 -0
  157. package/dist/schedule/commands/list.js.map +1 -0
  158. package/dist/schedule/commands/logs.d.ts +7 -0
  159. package/dist/schedule/commands/logs.d.ts.map +1 -0
  160. package/dist/schedule/commands/logs.js +106 -0
  161. package/dist/schedule/commands/logs.js.map +1 -0
  162. package/dist/schedule/commands/service.d.ts +16 -0
  163. package/dist/schedule/commands/service.d.ts.map +1 -0
  164. package/dist/schedule/commands/service.js +458 -0
  165. package/dist/schedule/commands/service.js.map +1 -0
  166. package/dist/schedule/daemon/daemon.d.ts +156 -0
  167. package/dist/schedule/daemon/daemon.d.ts.map +1 -0
  168. package/dist/schedule/daemon/daemon.js +1248 -0
  169. package/dist/schedule/daemon/daemon.js.map +1 -0
  170. package/dist/schedule/daemon/endpoint.d.ts +38 -0
  171. package/dist/schedule/daemon/endpoint.d.ts.map +1 -0
  172. package/dist/schedule/daemon/endpoint.js +158 -0
  173. package/dist/schedule/daemon/endpoint.js.map +1 -0
  174. package/dist/schedule/daemon/exit.d.ts +8 -0
  175. package/dist/schedule/daemon/exit.d.ts.map +1 -0
  176. package/dist/schedule/daemon/exit.js +8 -0
  177. package/dist/schedule/daemon/exit.js.map +1 -0
  178. package/dist/schedule/daemon/log.d.ts +12 -0
  179. package/dist/schedule/daemon/log.d.ts.map +1 -0
  180. package/dist/schedule/daemon/log.js +53 -0
  181. package/dist/schedule/daemon/log.js.map +1 -0
  182. package/dist/schedule/daemon/notify.d.ts +31 -0
  183. package/dist/schedule/daemon/notify.d.ts.map +1 -0
  184. package/dist/schedule/daemon/notify.js +89 -0
  185. package/dist/schedule/daemon/notify.js.map +1 -0
  186. package/dist/schedule/daemon/retention.d.ts +16 -0
  187. package/dist/schedule/daemon/retention.d.ts.map +1 -0
  188. package/dist/schedule/daemon/retention.js +46 -0
  189. package/dist/schedule/daemon/retention.js.map +1 -0
  190. package/dist/schedule/daemon/sessions.d.ts +23 -0
  191. package/dist/schedule/daemon/sessions.d.ts.map +1 -0
  192. package/dist/schedule/daemon/sessions.js +52 -0
  193. package/dist/schedule/daemon/sessions.js.map +1 -0
  194. package/dist/schedule/env.d.ts +28 -0
  195. package/dist/schedule/env.d.ts.map +1 -0
  196. package/dist/schedule/env.js +99 -0
  197. package/dist/schedule/env.js.map +1 -0
  198. package/dist/schedule/fire/browser-preflight.d.ts +41 -0
  199. package/dist/schedule/fire/browser-preflight.d.ts.map +1 -0
  200. package/dist/schedule/fire/browser-preflight.js +73 -0
  201. package/dist/schedule/fire/browser-preflight.js.map +1 -0
  202. package/dist/schedule/fire/fire.d.ts +78 -0
  203. package/dist/schedule/fire/fire.d.ts.map +1 -0
  204. package/dist/schedule/fire/fire.js +482 -0
  205. package/dist/schedule/fire/fire.js.map +1 -0
  206. package/dist/schedule/fire/result.d.ts +13 -0
  207. package/dist/schedule/fire/result.d.ts.map +1 -0
  208. package/dist/schedule/fire/result.js +18 -0
  209. package/dist/schedule/fire/result.js.map +1 -0
  210. package/dist/schedule/fire/unattended-note.d.ts +22 -0
  211. package/dist/schedule/fire/unattended-note.d.ts.map +1 -0
  212. package/dist/schedule/fire/unattended-note.js +46 -0
  213. package/dist/schedule/fire/unattended-note.js.map +1 -0
  214. package/dist/schedule/floor.d.ts +116 -0
  215. package/dist/schedule/floor.d.ts.map +1 -0
  216. package/dist/schedule/floor.js +1051 -0
  217. package/dist/schedule/floor.js.map +1 -0
  218. package/dist/schedule/folder.d.ts +34 -0
  219. package/dist/schedule/folder.d.ts.map +1 -0
  220. package/dist/schedule/folder.js +84 -0
  221. package/dist/schedule/folder.js.map +1 -0
  222. package/dist/schedule/paths.d.ts +49 -0
  223. package/dist/schedule/paths.d.ts.map +1 -0
  224. package/dist/schedule/paths.js +53 -0
  225. package/dist/schedule/paths.js.map +1 -0
  226. package/dist/schedule/policy.d.ts +141 -0
  227. package/dist/schedule/policy.d.ts.map +1 -0
  228. package/dist/schedule/policy.js +378 -0
  229. package/dist/schedule/policy.js.map +1 -0
  230. package/dist/schedule/resume-command.d.ts +36 -0
  231. package/dist/schedule/resume-command.d.ts.map +1 -0
  232. package/dist/schedule/resume-command.js +72 -0
  233. package/dist/schedule/resume-command.js.map +1 -0
  234. package/dist/schedule/service/detect.d.ts +22 -0
  235. package/dist/schedule/service/detect.d.ts.map +1 -0
  236. package/dist/schedule/service/detect.js +29 -0
  237. package/dist/schedule/service/detect.js.map +1 -0
  238. package/dist/schedule/service/index.d.ts +48 -0
  239. package/dist/schedule/service/index.d.ts.map +1 -0
  240. package/dist/schedule/service/index.js +352 -0
  241. package/dist/schedule/service/index.js.map +1 -0
  242. package/dist/schedule/service/launchd.d.ts +24 -0
  243. package/dist/schedule/service/launchd.d.ts.map +1 -0
  244. package/dist/schedule/service/launchd.js +84 -0
  245. package/dist/schedule/service/launchd.js.map +1 -0
  246. package/dist/schedule/service/manifest.d.ts +44 -0
  247. package/dist/schedule/service/manifest.d.ts.map +1 -0
  248. package/dist/schedule/service/manifest.js +16 -0
  249. package/dist/schedule/service/manifest.js.map +1 -0
  250. package/dist/schedule/service/names.d.ts +9 -0
  251. package/dist/schedule/service/names.d.ts.map +1 -0
  252. package/dist/schedule/service/names.js +22 -0
  253. package/dist/schedule/service/names.js.map +1 -0
  254. package/dist/schedule/service/quote.d.ts +24 -0
  255. package/dist/schedule/service/quote.d.ts.map +1 -0
  256. package/dist/schedule/service/quote.js +64 -0
  257. package/dist/schedule/service/quote.js.map +1 -0
  258. package/dist/schedule/service/runner.d.ts +17 -0
  259. package/dist/schedule/service/runner.d.ts.map +1 -0
  260. package/dist/schedule/service/runner.js +31 -0
  261. package/dist/schedule/service/runner.js.map +1 -0
  262. package/dist/schedule/service/systemd.d.ts +37 -0
  263. package/dist/schedule/service/systemd.d.ts.map +1 -0
  264. package/dist/schedule/service/systemd.js +96 -0
  265. package/dist/schedule/service/systemd.js.map +1 -0
  266. package/dist/schedule/service/windows-task.d.ts +51 -0
  267. package/dist/schedule/service/windows-task.d.ts.map +1 -0
  268. package/dist/schedule/service/windows-task.js +134 -0
  269. package/dist/schedule/service/windows-task.js.map +1 -0
  270. package/dist/schedule/service/wsl.d.ts +57 -0
  271. package/dist/schedule/service/wsl.d.ts.map +1 -0
  272. package/dist/schedule/service/wsl.js +111 -0
  273. package/dist/schedule/service/wsl.js.map +1 -0
  274. package/dist/schedule/store/atomic.d.ts +43 -0
  275. package/dist/schedule/store/atomic.d.ts.map +1 -0
  276. package/dist/schedule/store/atomic.js +135 -0
  277. package/dist/schedule/store/atomic.js.map +1 -0
  278. package/dist/schedule/store/claims.d.ts +26 -0
  279. package/dist/schedule/store/claims.d.ts.map +1 -0
  280. package/dist/schedule/store/claims.js +57 -0
  281. package/dist/schedule/store/claims.js.map +1 -0
  282. package/dist/schedule/store/digest.d.ts +18 -0
  283. package/dist/schedule/store/digest.d.ts.map +1 -0
  284. package/dist/schedule/store/digest.js +139 -0
  285. package/dist/schedule/store/digest.js.map +1 -0
  286. package/dist/schedule/store/history.d.ts +21 -0
  287. package/dist/schedule/store/history.d.ts.map +1 -0
  288. package/dist/schedule/store/history.js +114 -0
  289. package/dist/schedule/store/history.js.map +1 -0
  290. package/dist/schedule/store/jobs.d.ts +61 -0
  291. package/dist/schedule/store/jobs.d.ts.map +1 -0
  292. package/dist/schedule/store/jobs.js +210 -0
  293. package/dist/schedule/store/jobs.js.map +1 -0
  294. package/dist/schedule/store/state.d.ts +19 -0
  295. package/dist/schedule/store/state.d.ts.map +1 -0
  296. package/dist/schedule/store/state.js +38 -0
  297. package/dist/schedule/store/state.js.map +1 -0
  298. package/dist/schedule/types.d.ts +256 -0
  299. package/dist/schedule/types.d.ts.map +1 -0
  300. package/dist/schedule/types.js +9 -0
  301. package/dist/schedule/types.js.map +1 -0
  302. package/dist/skills/catalog.d.ts +96 -0
  303. package/dist/skills/catalog.d.ts.map +1 -0
  304. package/dist/skills/catalog.js +226 -0
  305. package/dist/skills/catalog.js.map +1 -0
  306. package/dist/skills/save.d.ts +148 -0
  307. package/dist/skills/save.d.ts.map +1 -0
  308. package/dist/skills/save.js +344 -0
  309. package/dist/skills/save.js.map +1 -0
  310. package/dist/skills/store.d.ts +103 -16
  311. package/dist/skills/store.d.ts.map +1 -1
  312. package/dist/skills/store.js +230 -29
  313. package/dist/skills/store.js.map +1 -1
  314. package/dist/tui/App.d.ts.map +1 -1
  315. package/dist/tui/App.js +591 -72
  316. package/dist/tui/App.js.map +1 -1
  317. package/dist/tui/LiveActivity.d.ts +8 -1
  318. package/dist/tui/LiveActivity.d.ts.map +1 -1
  319. package/dist/tui/LiveActivity.js +20 -4
  320. package/dist/tui/LiveActivity.js.map +1 -1
  321. package/dist/tui/PermissionOverlay.d.ts +24 -4
  322. package/dist/tui/PermissionOverlay.d.ts.map +1 -1
  323. package/dist/tui/PermissionOverlay.js +113 -15
  324. package/dist/tui/PermissionOverlay.js.map +1 -1
  325. package/dist/tui/SaveSkillOverlay.d.ts +33 -0
  326. package/dist/tui/SaveSkillOverlay.d.ts.map +1 -0
  327. package/dist/tui/SaveSkillOverlay.js +118 -0
  328. package/dist/tui/SaveSkillOverlay.js.map +1 -0
  329. package/dist/tui/agent.d.ts +185 -5
  330. package/dist/tui/agent.d.ts.map +1 -1
  331. package/dist/tui/agent.js +325 -54
  332. package/dist/tui/agent.js.map +1 -1
  333. package/dist/tui/browser-notices.d.ts +33 -0
  334. package/dist/tui/browser-notices.d.ts.map +1 -0
  335. package/dist/tui/browser-notices.js +102 -0
  336. package/dist/tui/browser-notices.js.map +1 -0
  337. package/dist/tui/permission-review.d.ts.map +1 -1
  338. package/dist/tui/permission-review.js +53 -4
  339. package/dist/tui/permission-review.js.map +1 -1
  340. package/dist/tui/schedule/host-commands.d.ts +34 -0
  341. package/dist/tui/schedule/host-commands.d.ts.map +1 -0
  342. package/dist/tui/schedule/host-commands.js +309 -0
  343. package/dist/tui/schedule/host-commands.js.map +1 -0
  344. package/dist/tui/schedule/integration.d.ts +62 -0
  345. package/dist/tui/schedule/integration.d.ts.map +1 -0
  346. package/dist/tui/schedule/integration.js +145 -0
  347. package/dist/tui/schedule/integration.js.map +1 -0
  348. package/dist/tui/schedule/loop-host.d.ts +42 -0
  349. package/dist/tui/schedule/loop-host.d.ts.map +1 -0
  350. package/dist/tui/schedule/loop-host.js +153 -0
  351. package/dist/tui/schedule/loop-host.js.map +1 -0
  352. package/dist/tui/schedule/resume.d.ts +122 -0
  353. package/dist/tui/schedule/resume.d.ts.map +1 -0
  354. package/dist/tui/schedule/resume.js +324 -0
  355. package/dist/tui/schedule/resume.js.map +1 -0
  356. package/dist/tui/schedule/startup.d.ts +11 -0
  357. package/dist/tui/schedule/startup.d.ts.map +1 -0
  358. package/dist/tui/schedule/startup.js +121 -0
  359. package/dist/tui/schedule/startup.js.map +1 -0
  360. package/dist/tui/schedule/tool-host.d.ts +44 -0
  361. package/dist/tui/schedule/tool-host.d.ts.map +1 -0
  362. package/dist/tui/schedule/tool-host.js +294 -0
  363. package/dist/tui/schedule/tool-host.js.map +1 -0
  364. package/dist/tui/skills/learning.d.ts +74 -0
  365. package/dist/tui/skills/learning.d.ts.map +1 -0
  366. package/dist/tui/skills/learning.js +131 -0
  367. package/dist/tui/skills/learning.js.map +1 -0
  368. package/dist/tui/skills/suggest-setting.d.ts +22 -0
  369. package/dist/tui/skills/suggest-setting.d.ts.map +1 -0
  370. package/dist/tui/skills/suggest-setting.js +55 -0
  371. package/dist/tui/skills/suggest-setting.js.map +1 -0
  372. package/dist/tui/skills/suggestion-ledger.d.ts +35 -0
  373. package/dist/tui/skills/suggestion-ledger.d.ts.map +1 -0
  374. package/dist/tui/skills/suggestion-ledger.js +52 -0
  375. package/dist/tui/skills/suggestion-ledger.js.map +1 -0
  376. package/dist/tui/slashCommands.d.ts +20 -0
  377. package/dist/tui/slashCommands.d.ts.map +1 -1
  378. package/dist/tui/slashCommands.js +76 -2
  379. package/dist/tui/slashCommands.js.map +1 -1
  380. package/dist/tui/turn-interruption.d.ts +20 -1
  381. package/dist/tui/turn-interruption.d.ts.map +1 -1
  382. package/dist/tui/turn-interruption.js +43 -0
  383. package/dist/tui/turn-interruption.js.map +1 -1
  384. package/dist/tui/types.d.ts +9 -1
  385. package/dist/tui/types.d.ts.map +1 -1
  386. package/package.json +5 -3
  387. package/skills/README.md +15 -0
  388. package/skills/browser-automation/SKILL.md +84 -0
  389. package/skills/schedule-task/SKILL.md +140 -0
  390. package/skills/skill-creator/SKILL.md +101 -0
@@ -0,0 +1,121 @@
1
+ /**
2
+ * The one line the TUI prints on open about scheduled work since it last
3
+ * looked: runs that finished or failed, runs waiting for approval, jobs on
4
+ * hold or paused by failures, a scheduler that is not installed or not
5
+ * running, a run working in this folder right now. Nothing when there is
6
+ * nothing to say. Reads are bounded (each job's history tail), and the caller
7
+ * gives it a time budget so a slow disk never delays the first paint.
8
+ */
9
+ import { readFileSync } from 'node:fs';
10
+ import { join } from 'node:path';
11
+ import { takeSuppressedCount } from '../../integrations/notifications/desktop/throttle.js';
12
+ import { schedulePaths } from '../../schedule/paths.js';
13
+ import { parkedRunWords } from '../../schedule/resume-command.js';
14
+ import { readManifest } from '../../schedule/service/manifest.js';
15
+ import { writeJsonAtomic } from '../../schedule/store/atomic.js';
16
+ import { readHistory } from '../../schedule/store/history.js';
17
+ import { confirmationHolds, listJobs } from '../../schedule/store/jobs.js';
18
+ import { readState } from '../../schedule/store/state.js';
19
+ function ago(ms) {
20
+ if (ms < 3_600_000)
21
+ return `${Math.max(1, Math.round(ms / 60_000))} min`;
22
+ if (ms < 172_800_000)
23
+ return `${Math.round(ms / 3_600_000)} h`;
24
+ return `${Math.round(ms / 86_400_000)} d`;
25
+ }
26
+ /** Compute the line and record that it was shown. `undefined` when there is nothing to say. */
27
+ export function scheduleStartupLine(home, cwd, now = Date.now()) {
28
+ const paths = schedulePaths(home);
29
+ const { jobs } = listJobs(paths);
30
+ if (jobs.length === 0)
31
+ return undefined;
32
+ let since = now - 24 * 3_600_000;
33
+ try {
34
+ const seen = JSON.parse(readFileSync(paths.seen, 'utf8'));
35
+ if (seen.lastSummaryAt)
36
+ since = Date.parse(seen.lastSummaryAt);
37
+ }
38
+ catch { }
39
+ const parts = [];
40
+ let finished = 0;
41
+ const failed = [];
42
+ const waiting = [];
43
+ const needsYou = [];
44
+ const held = [];
45
+ const failingPaused = [];
46
+ const hereNow = [];
47
+ for (const job of jobs) {
48
+ const state = readState(paths, job.id);
49
+ if (state.activeRun?.status === 'awaiting-approval') {
50
+ if (state.activeRun.handoff)
51
+ needsYou.push(`${job.name} ${parkedRunWords(state.activeRun)}`);
52
+ else
53
+ waiting.push(job.name);
54
+ }
55
+ if (state.activeRun?.status === 'running' && job.folder.canonical === cwd)
56
+ hereNow.push(job.name);
57
+ if (job.state === 'pending-confirmation' || (job.state === 'active' && !confirmationHolds(job)))
58
+ held.push(job.name);
59
+ if (job.state === 'paused' && job.pausedBy === 'auto-failure-streak')
60
+ failingPaused.push(job.name);
61
+ for (const record of readHistory(paths, job.id).slice(-200)) {
62
+ if (record.kind !== 'run' || Date.parse(record.at) <= since)
63
+ continue;
64
+ if (record.status === 'completed')
65
+ finished++;
66
+ else if (record.status !== 'running' && record.status !== 'awaiting-approval') {
67
+ failed.push(`${job.name} ${record.status}${record.reason ? ` (${record.reason.slice(0, 60)})` : ''}`);
68
+ }
69
+ }
70
+ }
71
+ if (finished + failed.length > 0 || waiting.length > 0 || needsYou.length > 0) {
72
+ const bits = [
73
+ ...(finished > 0 ? [`${finished} finished`] : []),
74
+ ...(failed.length > 0 ? [`${failed.length} failed: ${failed.slice(0, 2).join('; ')}`] : []),
75
+ ...(waiting.length > 0 ? [`waiting for approval: ${waiting.join(', ')}`] : []),
76
+ ...needsYou,
77
+ ];
78
+ parts.push(`Scheduled: ${bits.join(' · ')}`);
79
+ }
80
+ for (const name of held)
81
+ parts.push(`Scheduled: job ${name} is on hold until confirmed`);
82
+ for (const name of failingPaused)
83
+ parts.push(`Scheduled: job ${name} paused after repeated failures`);
84
+ if (hereNow.length > 0)
85
+ parts.push(`A scheduled run (${hereNow.join(', ')}) is working in this folder now`);
86
+ const active = jobs.some((j) => j.state === 'active');
87
+ let manifest;
88
+ try {
89
+ manifest = readManifest(paths);
90
+ }
91
+ catch {
92
+ manifest = undefined;
93
+ }
94
+ if (active && !manifest) {
95
+ parts.push('Scheduled jobs exist but the scheduler is not installed — namzu schedule install');
96
+ }
97
+ else if (manifest) {
98
+ try {
99
+ const beat = JSON.parse(readFileSync(paths.heartbeat, 'utf8'));
100
+ const age = beat.at ? now - Date.parse(beat.at) : Number.POSITIVE_INFINITY;
101
+ if (age > 90_000)
102
+ parts.push(`The scheduler is installed but not running (last seen ${ago(age)} ago) — namzu schedule status`);
103
+ }
104
+ catch {
105
+ parts.push('The scheduler is installed but has not started — namzu schedule status');
106
+ }
107
+ }
108
+ const suppressed = takeSuppressedCount(join(paths.daemon, 'notify.json'));
109
+ if (suppressed > 0)
110
+ parts.push(`${suppressed} scheduled notification(s) were held back`);
111
+ try {
112
+ writeJsonAtomic(paths.seen, {
113
+ v: 1,
114
+ kind: 'schedule-seen',
115
+ lastSummaryAt: new Date(now).toISOString(),
116
+ });
117
+ }
118
+ catch { }
119
+ return parts.length > 0 ? `${parts.join('. ')}. /schedule` : undefined;
120
+ }
121
+ //# sourceMappingURL=startup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startup.js","sourceRoot":"","sources":["../../../src/tui/schedule/startup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * The TUI's side of the `schedule` tool: it computes everything the person
3
+ * confirming is shown — from the job the CLI would build, never from the
4
+ * model's words — and asks on the terminal.
5
+ *
6
+ * The confirmation is the TUI's own question, answered with a keypress:
7
+ * "Cancel" is the first (default) choice, and nothing but "Create" or
8
+ * "Create paused" creates a job. A job created here records
9
+ * `confirmation.surface: tool-confirmed`.
10
+ */
11
+ import { type ScheduleConfirmRequest, type ScheduleJobDraft, type ScheduleToolHost } from '@namzu/sdk';
12
+ import type { NamzuCliConfig } from '../../config/schema.js';
13
+ import type { ScheduleJob } from '../../schedule/types.js';
14
+ import type { QuestionFn } from '../agent.js';
15
+ export interface ScheduleUi {
16
+ /** `NAMZU_HOME`. */
17
+ readonly home: () => string;
18
+ /** The session's working directory. */
19
+ readonly cwd: () => string;
20
+ /** Directories besides the working directory the session's tools reach. */
21
+ readonly extraRoots: () => readonly string[];
22
+ /** The session's model; a proposed job runs on it. */
23
+ readonly model: () => {
24
+ readonly provider: string;
25
+ readonly model?: string;
26
+ } | undefined;
27
+ readonly config: () => Pick<NamzuCliConfig, 'limits'>;
28
+ readonly sessionId: () => string | undefined;
29
+ /** Show a system line in the transcript. */
30
+ readonly say: (text: string) => void;
31
+ /** Ask the person on the terminal. */
32
+ readonly ask: QuestionFn;
33
+ }
34
+ /** The preview lines, the full prompt with hidden characters shown, and the tripwire's findings. */
35
+ export declare function renderConfirmation(request: ScheduleConfirmRequest, lines: readonly string[]): string;
36
+ /**
37
+ * Each optional value the model set to something other than what the
38
+ * operator would get by leaving it out, in words. Models fill optional fields
39
+ * in: one proposal set the time zone to America/New_York on a machine in
40
+ * Istanbul and ran commands in the sandbox, which nobody had asked for.
41
+ */
42
+ export declare function chosenByTheModel(draft: ScheduleJobDraft, job: ScheduleJob, cwd: string, config: Pick<NamzuCliConfig, 'limits'>): string[];
43
+ export declare function createScheduleToolHost(ui: ScheduleUi): ScheduleToolHost;
44
+ //# sourceMappingURL=tool-host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-host.d.ts","sourceRoot":"","sources":["../../../src/tui/schedule/tool-host.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAEN,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EAGrB,KAAK,gBAAgB,EAKrB,MAAM,YAAY,CAAA;AAEnB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAiB5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAE7C,MAAM,WAAW,UAAU;IAC1B,oBAAoB;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,MAAM,CAAA;IAC3B,uCAAuC;IACvC,QAAQ,CAAC,GAAG,EAAE,MAAM,MAAM,CAAA;IAC1B,2EAA2E;IAC3E,QAAQ,CAAC,UAAU,EAAE,MAAM,SAAS,MAAM,EAAE,CAAA;IAC5C,sDAAsD;IACtD,QAAQ,CAAC,KAAK,EAAE,MAAM;QAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAA;IACxF,QAAQ,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAA;IACrD,QAAQ,CAAC,SAAS,EAAE,MAAM,MAAM,GAAG,SAAS,CAAA;IAC5C,4CAA4C;IAC5C,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACpC,sCAAsC;IACtC,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAA;CACxB;AAqCD,oGAAoG;AACpG,wBAAgB,kBAAkB,CACjC,OAAO,EAAE,sBAAsB,EAC/B,KAAK,EAAE,SAAS,MAAM,EAAE,GACtB,MAAM,CAaR;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC/B,KAAK,EAAE,gBAAgB,EACvB,GAAG,EAAE,WAAW,EAChB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,GACpC,MAAM,EAAE,CA0BV;AAED,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,UAAU,GAAG,gBAAgB,CA6NvE"}
@@ -0,0 +1,294 @@
1
+ /**
2
+ * The TUI's side of the `schedule` tool: it computes everything the person
3
+ * confirming is shown — from the job the CLI would build, never from the
4
+ * model's words — and asks on the terminal.
5
+ *
6
+ * The confirmation is the TUI's own question, answered with a keypress:
7
+ * "Cancel" is the first (default) choice, and nothing but "Create" or
8
+ * "Create paused" creates a job. A job created here records
9
+ * `confirmation.surface: tool-confirmed`.
10
+ */
11
+ import { isAbsolute, relative, resolve } from 'node:path';
12
+ import { describeSchedule, hostTimeZone, revealHiddenCharacters, upcomingFireTimes, } from '@namzu/sdk';
13
+ import { readPermissionLayers } from '../../config/load.js';
14
+ import { discoverProviders } from '../../integrations/providers/discover.js';
15
+ import { DEFAULT_MAX_ITERATIONS, DEFAULT_TIMEOUT_MS, DEFAULT_TOKEN_BUDGET, buildJob, confirmJob, previewLines, runsPerDay, } from '../../schedule/build.js';
16
+ import { schedulePaths } from '../../schedule/paths.js';
17
+ import { compileJobPolicy } from '../../schedule/policy.js';
18
+ import { readManifest } from '../../schedule/service/manifest.js';
19
+ import { appendHistory } from '../../schedule/store/history.js';
20
+ import { createJob, deleteJob, findJob, listJobs, updateJob } from '../../schedule/store/jobs.js';
21
+ import { nextFireOf, readState } from '../../schedule/store/state.js';
22
+ function within(root, path) {
23
+ const rel = relative(root, path);
24
+ return rel === '' || (!rel.startsWith('..') && !isAbsolute(rel));
25
+ }
26
+ function summary(job, withPrompt, home) {
27
+ const tz = job.schedule.kind === 'cron' ? job.schedule.tz : hostTimeZone();
28
+ const state = readState(schedulePaths(home), job.id);
29
+ return {
30
+ name: job.name,
31
+ folder: job.folder.canonical,
32
+ state: job.state,
33
+ schedule: describeSchedule(job.schedule, { tz }),
34
+ ...(nextFireOf(job, state) ? { nextFireAt: nextFireOf(job, state) } : {}),
35
+ ...(state.lastRun ? { lastStatus: state.lastRun.status } : {}),
36
+ ...(withPrompt ? { prompt: job.prompt } : {}),
37
+ };
38
+ }
39
+ async function credentialText(provider) {
40
+ try {
41
+ const found = (await discoverProviders({ skipProbes: true })).find((d) => d.entry.id === provider);
42
+ if (!found)
43
+ return `no ${provider} credential found here; the scheduler must find one (namzu login or daemon.env)`;
44
+ const source = found.source;
45
+ return source.kind === 'env'
46
+ ? `environment variable ${source.envName ?? ''} (a service does not see your shell's variables)`
47
+ : `${source.kind}${source.path ? ` (${source.path})` : ''}`;
48
+ }
49
+ catch {
50
+ return 'unknown';
51
+ }
52
+ }
53
+ /** The preview lines, the full prompt with hidden characters shown, and the tripwire's findings. */
54
+ export function renderConfirmation(request, lines) {
55
+ const p = request.preview;
56
+ return [
57
+ '⏲ PROPOSED BY THE MODEL, NOT BY YOU — a scheduled job that runs later with nobody watching.',
58
+ ...lines,
59
+ `Credential ${p.credentialSource ?? 'unknown'}`,
60
+ ...p.warnings.map((w) => `Warning ${w}`),
61
+ ...request.promptFindings.map((f) => `Warning ${f}`),
62
+ 'Prompt (exactly as the run will read it)',
63
+ ...revealHiddenCharacters(p.prompt)
64
+ .split('\n')
65
+ .map((l) => ` │ ${l}`),
66
+ ].join('\n');
67
+ }
68
+ /**
69
+ * Each optional value the model set to something other than what the
70
+ * operator would get by leaving it out, in words. Models fill optional fields
71
+ * in: one proposal set the time zone to America/New_York on a machine in
72
+ * Istanbul and ran commands in the sandbox, which nobody had asked for.
73
+ */
74
+ export function chosenByTheModel(draft, job, cwd, config) {
75
+ const zone = hostTimeZone();
76
+ const limits = config.limits ?? {};
77
+ const out = [];
78
+ if (draft.tz !== undefined && draft.tz !== zone)
79
+ out.push(`time zone ${draft.tz}, not this machine's ${zone}`);
80
+ const session = resolve(cwd);
81
+ if (draft.folder !== undefined && resolve(session, draft.folder) !== session)
82
+ out.push(`folder ${job.folder.canonical}, not this session's`);
83
+ if (draft.permissions.execution === 'sandbox')
84
+ out.push('commands run in the sandbox; the default is this machine');
85
+ const iterations = limits.maxIterations || DEFAULT_MAX_ITERATIONS;
86
+ if (draft.budget?.maxIterations !== undefined && draft.budget.maxIterations !== iterations)
87
+ out.push(`${draft.budget.maxIterations} iterations per run (the default is ${iterations})`);
88
+ const tokens = limits.tokenBudget || DEFAULT_TOKEN_BUDGET;
89
+ if (draft.budget?.tokenBudget !== undefined && draft.budget.tokenBudget !== tokens)
90
+ out.push(`${draft.budget.tokenBudget.toLocaleString('en-US')} tokens per run (the default is ${tokens.toLocaleString('en-US')})`);
91
+ const timeout = limits.timeoutMs || DEFAULT_TIMEOUT_MS;
92
+ if (draft.budget?.timeoutMs !== undefined && draft.budget.timeoutMs !== timeout)
93
+ out.push(`${Math.round(draft.budget.timeoutMs / 1000)} s per run (the default is ${Math.round(timeout / 60_000)} min)`);
94
+ if (draft.permissions.browser?.headed)
95
+ out.push('a visible browser window during each run');
96
+ return out;
97
+ }
98
+ export function createScheduleToolHost(ui) {
99
+ const built = new WeakMap();
100
+ const paths = () => schedulePaths(ui.home());
101
+ const history = (job, action) => appendHistory(paths(), job.id, {
102
+ v: 1,
103
+ kind: 'job',
104
+ at: new Date().toISOString(),
105
+ action,
106
+ by: 'tool',
107
+ });
108
+ return {
109
+ // The job stores the grant, the fire enforces it, and the
110
+ // confirmation shows it line by line, so the model may propose one.
111
+ browserGrants: true,
112
+ async preview(draft) {
113
+ const model = ui.model();
114
+ if (!model)
115
+ throw new Error('This session has no model; a scheduled job runs on the session’s model.');
116
+ const now = new Date();
117
+ const folder = resolve(ui.cwd(), draft.folder ?? '.');
118
+ const job = buildJob({
119
+ name: draft.name,
120
+ prompt: draft.prompt,
121
+ when: draft.when,
122
+ folder,
123
+ ...(draft.tz ? { tz: draft.tz } : {}),
124
+ permissions: {
125
+ ...(draft.permissions.preset ? { preset: draft.permissions.preset } : {}),
126
+ ...(draft.permissions.rules ? { rules: draft.permissions.rules } : {}),
127
+ unmatched: draft.permissions.unmatched,
128
+ ...(draft.permissions.execution ? { execution: draft.permissions.execution } : {}),
129
+ ...(draft.permissions.browser ? { browser: draft.permissions.browser } : {}),
130
+ },
131
+ ...(draft.budget ? { budget: draft.budget } : {}),
132
+ model: `${model.provider}${model.model ? `/${model.model}` : ''}`,
133
+ createdBy: {
134
+ surface: 'tool',
135
+ ...(ui.sessionId() ? { sessionId: ui.sessionId() } : {}),
136
+ },
137
+ }, { paths: paths(), config: ui.config(), now });
138
+ const policy = compileJobPolicy(job.permissions, {
139
+ layers: readPermissionLayers({ cwd: job.folder.canonical }),
140
+ namzuHome: ui.home(),
141
+ folder: job.folder,
142
+ });
143
+ if (policy.diagnostics.length > 0)
144
+ throw new Error(`The rules do not compile: ${policy.diagnostics.join('; ')}`);
145
+ const roots = [ui.cwd(), ...ui.extraRoots()];
146
+ const outside = !roots.some((root) => within(root, job.folder.canonical));
147
+ const perDay = runsPerDay(job.schedule, now);
148
+ const warnings = [
149
+ ...(outside
150
+ ? ['The folder is outside this session’s working directory and added directories.']
151
+ : []),
152
+ ...(policy.network ? ['This run can reach the network.'] : []),
153
+ ...(job.permissions.browser
154
+ ? [
155
+ `This run drives the browser signed in as you (profile ${job.permissions.browser.profile}) on ${Object.keys(job.permissions.browser.sites).join(', ')}.`,
156
+ ]
157
+ : []),
158
+ ...chosenByTheModel(draft, job, ui.cwd(), ui.config()).map((line) => `Chosen by the model, not the default: ${line}`),
159
+ ];
160
+ const preview = {
161
+ name: job.name,
162
+ folder: job.folder.canonical,
163
+ outsideSessionRoots: outside,
164
+ prompt: job.prompt,
165
+ schedule: describeSchedule(job.schedule, {
166
+ tz: job.schedule.kind === 'cron' ? job.schedule.tz : hostTimeZone(),
167
+ }),
168
+ nextFireTimes: upcomingFireTimes(job.schedule, now, 3).map((t) => t.toISOString()),
169
+ rules: policy.lines,
170
+ unmatched: job.permissions.unmatched,
171
+ execution: job.permissions.execution,
172
+ networkAccess: policy.network,
173
+ budget: {
174
+ maxIterations: job.budget.maxIterations,
175
+ tokenBudget: job.budget.tokenBudget,
176
+ timeoutMs: job.budget.timeoutMs,
177
+ },
178
+ ...(job.schedule.kind === 'at'
179
+ ? {}
180
+ : { dailyTokenCeiling: perDay * job.budget.tokenBudget }),
181
+ model: `${job.model.provider}${job.model.model ? `/${job.model.model}` : ''}`,
182
+ credentialSource: await credentialText(job.model.provider),
183
+ warnings,
184
+ };
185
+ built.set(preview, { job, lines: previewLines(job, policy, now) });
186
+ return preview;
187
+ },
188
+ async confirm(request, signal) {
189
+ const entry = built.get(request.preview);
190
+ if (!entry)
191
+ return 'cancel';
192
+ ui.say(renderConfirmation(request, entry.lines));
193
+ const answer = await ui.ask({
194
+ questionId: `schedule:${entry.job.id}`,
195
+ question: `Create the scheduled job "${entry.job.name}" the model proposed? (details above)`,
196
+ header: 'Proposed by the model',
197
+ options: [
198
+ { id: 'cancel', label: 'Cancel', description: 'Create nothing' },
199
+ {
200
+ id: 'create-paused',
201
+ label: 'Create paused',
202
+ description: 'Create it, but do not run it until /schedule resume',
203
+ },
204
+ {
205
+ id: 'create',
206
+ label: 'Create',
207
+ description: 'It runs on schedule with the permissions above',
208
+ },
209
+ ],
210
+ multiSelect: false,
211
+ allowFreeText: false,
212
+ }, signal);
213
+ if (answer.kind !== 'answer')
214
+ return 'cancel';
215
+ const id = answer.selectedOptionIds[0];
216
+ return id === 'create' || id === 'create-paused' ? id : 'cancel';
217
+ },
218
+ async create(_draft, preview, options) {
219
+ const entry = built.get(preview);
220
+ if (!entry)
221
+ throw new Error('That proposal is no longer current; propose it again.');
222
+ const job = createJob(paths(), confirmJob(entry.job, 'tool-confirmed', new Date(), { paused: options.paused }));
223
+ history(job, 'created');
224
+ // A job with no scheduler to run it does nothing, and the model's
225
+ // "done" said nothing about that.
226
+ const installed = readManifest(paths()) !== undefined;
227
+ ui.say(`⏲ Scheduled job ${job.name} created${options.paused ? ' (paused)' : ''}. /schedule lists it.${installed ? '' : ' The scheduler is not installed, so it does not run until you install it: namzu schedule install.'}`);
228
+ return {
229
+ name: job.name,
230
+ ...(installed
231
+ ? {}
232
+ : {
233
+ note: 'No scheduler is installed on this machine, so the job does not run until the operator runs `namzu schedule install`. Tell them; do not say it will run.',
234
+ }),
235
+ };
236
+ },
237
+ async list(options) {
238
+ const cwd = ui.cwd();
239
+ return listJobs(paths())
240
+ .jobs.filter((job) => options.allFolders || job.folder.canonical === cwd)
241
+ .map((job) => summary(job, job.folder.canonical === cwd, ui.home()));
242
+ },
243
+ async find(ref) {
244
+ try {
245
+ const job = findJob(paths(), ref);
246
+ return summary(job, job.folder.canonical === ui.cwd(), ui.home());
247
+ }
248
+ catch {
249
+ return undefined;
250
+ }
251
+ },
252
+ async confirmAction(job, action, signal) {
253
+ const answer = await ui.ask({
254
+ questionId: `schedule-${action}:${job.name}`,
255
+ question: `${action === 'delete' ? 'Delete' : 'Resume'} the scheduled job "${job.name}" (${job.schedule}, in ${job.folder})? The model asked.`,
256
+ header: 'Proposed by the model',
257
+ options: [
258
+ { id: 'no', label: 'No', description: 'Leave it as it is' },
259
+ { id: 'yes', label: action === 'delete' ? 'Delete it' : 'Resume it', description: '' },
260
+ ],
261
+ multiSelect: false,
262
+ allowFreeText: false,
263
+ }, signal);
264
+ return answer.kind === 'answer' && answer.selectedOptionIds.includes('yes');
265
+ },
266
+ async pause(ref) {
267
+ const job = findJob(paths(), ref);
268
+ updateJob(paths(), job.id, job.revision, (j) => ({
269
+ ...j,
270
+ state: 'paused',
271
+ pausedAt: new Date().toISOString(),
272
+ pausedBy: 'tool',
273
+ }));
274
+ history(job, 'paused');
275
+ ui.say(`⏲ The model paused the scheduled job ${job.name}. /schedule resume ${job.name} starts it again.`);
276
+ },
277
+ async resume(ref) {
278
+ const job = findJob(paths(), ref);
279
+ updateJob(paths(), job.id, job.revision, (j) => ({
280
+ ...j,
281
+ state: 'active',
282
+ pausedAt: undefined,
283
+ pausedBy: undefined,
284
+ }));
285
+ history(job, 'resumed');
286
+ },
287
+ async delete(ref) {
288
+ const job = findJob(paths(), ref);
289
+ deleteJob(paths(), job.id);
290
+ history(job, 'removed');
291
+ },
292
+ };
293
+ }
294
+ //# sourceMappingURL=tool-host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-host.js","sourceRoot":"","sources":["../../../src/tui/schedule/tool-host.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Whether a finished turn is worth proposing as a skill.
3
+ *
4
+ * The interactive TUI's alone: `exec`, `drain`, ACP, a scheduled run and a
5
+ * sub-agent never import this (a test says so). Nothing here saves anything
6
+ * or costs a model call; it only decides whether one dim line is printed
7
+ * under the reply. Saving is `/skills save`, which the operator types.
8
+ *
9
+ * Pure: it reads the turn's `AgentEvent`s and the facts the App passes in.
10
+ * Persistence of the anti-nag counter lives in `suggestion-ledger.ts`.
11
+ */
12
+ import type { AgentEvent } from '../agent.js';
13
+ /** `skills.suggestMinToolCalls` when the config does not say. */
14
+ export declare const DEFAULT_SUGGEST_MIN_TOOL_CALLS = 6;
15
+ /** Distinct tools a turn must have used. One tool run many times is a loop, not a procedure. */
16
+ export declare const SUGGEST_MIN_DISTINCT_TOOLS = 2;
17
+ /** How many of the last tool results must have succeeded. */
18
+ export declare const SUGGEST_CLEAN_TAIL = 3;
19
+ /** One turn, observed. Mutable so the App can feed it event by event. */
20
+ export interface TurnActivity {
21
+ /** Successful tool results, bookkeeping writes left out. */
22
+ steps: number;
23
+ readonly tools: Set<string>;
24
+ /** A successful call whose tool does not declare itself read-only for its input. */
25
+ changedSomething: boolean;
26
+ /** Every result in order, true when it succeeded (bookkeeping included). */
27
+ readonly results: boolean[];
28
+ /** Tool names refused and not later run successfully. */
29
+ readonly unresolvedDenials: Set<string>;
30
+ /** The turn loaded a skill with the skill tool. */
31
+ skillUsed: boolean;
32
+ /** The turn called `save_skill`: it was already saving one. */
33
+ savedSkill: boolean;
34
+ /** How the turn ended. `running` until a terminal event arrives. */
35
+ ending: 'running' | 'answered' | 'stopped' | 'paused' | 'failed';
36
+ readonly started: Map<string, {
37
+ readonly toolName: string;
38
+ readonly readOnly: boolean;
39
+ }>;
40
+ }
41
+ export declare function createTurnActivity(): TurnActivity;
42
+ /** Feed one event of the turn. Events of other kinds are ignored. */
43
+ export declare function observeTurnEvent(activity: TurnActivity, event: AgentEvent): void;
44
+ /** What the App knows that the events do not. */
45
+ export interface SuggestionContext {
46
+ /** `skills.suggest`; only `false` turns proposals off. */
47
+ readonly suggest?: boolean;
48
+ /** `skills.suggestMinToolCalls`. */
49
+ readonly minToolCalls?: number;
50
+ /** The turn ran in `plan` mode, or the mode is `plan` now. */
51
+ readonly planMode: boolean;
52
+ /** A skill was loaded earlier in this conversation (skill tool or `/skills <name>`). */
53
+ readonly skillUsedInConversation: boolean;
54
+ /** This conversation already proposed one (or said proposals stopped). */
55
+ readonly proposedInConversation: boolean;
56
+ /** The turn was sent by `/skills save` or `/skills new`. */
57
+ readonly skillFlowTurn: boolean;
58
+ }
59
+ export type SuggestionVerdict = {
60
+ readonly suggest: true;
61
+ readonly steps: number;
62
+ readonly tools: number;
63
+ } | {
64
+ readonly suggest: false;
65
+ readonly reason: SuggestionRefusal;
66
+ };
67
+ export type SuggestionRefusal = 'turned-off' | 'not-answered' | 'plan-mode' | 'already-proposed' | 'skill-used' | 'skill-flow' | 'too-few-steps' | 'one-tool' | 'read-only' | 'failing-tail' | 'unresolved-denial';
68
+ /** Whether this turn earns the proposal. The order is cheapest reason first. */
69
+ export declare function judgeSkillSuggestion(activity: TurnActivity, context: SuggestionContext): SuggestionVerdict;
70
+ /** The dim row under the reply. */
71
+ export declare function skillSuggestionNotice(steps: number, tools: number): string;
72
+ /** Said once, in place of the proposal that would have followed three ignored ones. */
73
+ export declare const SUGGESTIONS_STOPPED_NOTICE = "Not suggesting skills any more: the last three suggestions went unused. /skills save on turns them back on.";
74
+ //# sourceMappingURL=learning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"learning.d.ts","sourceRoot":"","sources":["../../../src/tui/skills/learning.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAE7C,iEAAiE;AACjE,eAAO,MAAM,8BAA8B,IAAI,CAAA;AAC/C,gGAAgG;AAChG,eAAO,MAAM,0BAA0B,IAAI,CAAA;AAC3C,6DAA6D;AAC7D,eAAO,MAAM,kBAAkB,IAAI,CAAA;AASnC,yEAAyE;AACzE,MAAM,WAAW,YAAY;IAC5B,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC3B,oFAAoF;IACpF,gBAAgB,EAAE,OAAO,CAAA;IACzB,4EAA4E;IAC5E,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,CAAA;IAC3B,yDAAyD;IACzD,QAAQ,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACvC,mDAAmD;IACnD,SAAS,EAAE,OAAO,CAAA;IAClB,+DAA+D;IAC/D,UAAU,EAAE,OAAO,CAAA;IACnB,oEAAoE;IACpE,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAA;IAChE,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;CACxF;AAED,wBAAgB,kBAAkB,IAAI,YAAY,CAYjD;AAED,qEAAqE;AACrE,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,CA2ChF;AAED,iDAAiD;AACjD,MAAM,WAAW,iBAAiB;IACjC,0DAA0D;IAC1D,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;IAC1B,oCAAoC;IACpC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAC9B,8DAA8D;IAC9D,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,wFAAwF;IACxF,QAAQ,CAAC,uBAAuB,EAAE,OAAO,CAAA;IACzC,0EAA0E;IAC1E,QAAQ,CAAC,sBAAsB,EAAE,OAAO,CAAA;IACxC,4DAA4D;IAC5D,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAA;CAC/B;AAED,MAAM,MAAM,iBAAiB,GAC1B;IAAE,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC1E;IAAE,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAA;CAAE,CAAA;AAElE,MAAM,MAAM,iBAAiB,GAC1B,YAAY,GACZ,cAAc,GACd,WAAW,GACX,kBAAkB,GAClB,YAAY,GACZ,YAAY,GACZ,eAAe,GACf,UAAU,GACV,WAAW,GACX,cAAc,GACd,mBAAmB,CAAA;AAEtB,gFAAgF;AAChF,wBAAgB,oBAAoB,CACnC,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE,iBAAiB,GACxB,iBAAiB,CAgBnB;AAQD,mCAAmC;AACnC,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE1E;AAED,uFAAuF;AACvF,eAAO,MAAM,0BAA0B,gHACuE,CAAA"}