@namzu/sdk 45.0.0 → 46.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 (281) hide show
  1. package/CHANGELOG.md +166 -0
  2. package/dist/authorization/gate.d.ts +5 -2
  3. package/dist/authorization/gate.d.ts.map +1 -1
  4. package/dist/authorization/gate.js +35 -4
  5. package/dist/authorization/gate.js.map +1 -1
  6. package/dist/authorization/rules.d.ts.map +1 -1
  7. package/dist/authorization/rules.js +56 -6
  8. package/dist/authorization/rules.js.map +1 -1
  9. package/dist/authorization/shell-lexer.d.ts +38 -0
  10. package/dist/authorization/shell-lexer.d.ts.map +1 -1
  11. package/dist/authorization/shell-lexer.js +88 -57
  12. package/dist/authorization/shell-lexer.js.map +1 -1
  13. package/dist/bridge/a2a/mapper.d.ts.map +1 -1
  14. package/dist/bridge/a2a/mapper.js +2 -0
  15. package/dist/bridge/a2a/mapper.js.map +1 -1
  16. package/dist/bridge/sse/mapper.d.ts.map +1 -1
  17. package/dist/bridge/sse/mapper.js +1 -0
  18. package/dist/bridge/sse/mapper.js.map +1 -1
  19. package/dist/directory/types.d.ts +2 -0
  20. package/dist/directory/types.d.ts.map +1 -1
  21. package/dist/directory/types.js.map +1 -1
  22. package/dist/manager/resident/outbox.d.ts +4 -4
  23. package/dist/pricing/catalogue.generated.d.ts.map +1 -1
  24. package/dist/pricing/catalogue.generated.js +28 -4
  25. package/dist/pricing/catalogue.generated.js.map +1 -1
  26. package/dist/prompt/coding-agent-doctrine.d.ts +1 -1
  27. package/dist/prompt/coding-agent-doctrine.d.ts.map +1 -1
  28. package/dist/prompt/coding-agent-doctrine.js +1 -0
  29. package/dist/prompt/coding-agent-doctrine.js.map +1 -1
  30. package/dist/public-runtime.d.ts +6 -3
  31. package/dist/public-runtime.d.ts.map +1 -1
  32. package/dist/public-runtime.js +14 -2
  33. package/dist/public-runtime.js.map +1 -1
  34. package/dist/public-tools.d.ts +7 -2
  35. package/dist/public-tools.d.ts.map +1 -1
  36. package/dist/public-tools.js +15 -2
  37. package/dist/public-tools.js.map +1 -1
  38. package/dist/public-types.d.ts +8 -2
  39. package/dist/public-types.d.ts.map +1 -1
  40. package/dist/registry/tool/callable.d.ts +22 -0
  41. package/dist/registry/tool/callable.d.ts.map +1 -0
  42. package/dist/registry/tool/callable.js +29 -0
  43. package/dist/registry/tool/callable.js.map +1 -0
  44. package/dist/registry/tool/execute.d.ts.map +1 -1
  45. package/dist/registry/tool/execute.js +8 -1
  46. package/dist/registry/tool/execute.js.map +1 -1
  47. package/dist/runtime/query/declined.d.ts +12 -0
  48. package/dist/runtime/query/declined.d.ts.map +1 -0
  49. package/dist/runtime/query/declined.js +12 -0
  50. package/dist/runtime/query/declined.js.map +1 -0
  51. package/dist/runtime/query/executor/tool-call-admission.d.ts +37 -11
  52. package/dist/runtime/query/executor/tool-call-admission.d.ts.map +1 -1
  53. package/dist/runtime/query/executor/tool-call-admission.js +38 -12
  54. package/dist/runtime/query/executor/tool-call-admission.js.map +1 -1
  55. package/dist/runtime/query/executor.d.ts +7 -3
  56. package/dist/runtime/query/executor.d.ts.map +1 -1
  57. package/dist/runtime/query/executor.js +32 -7
  58. package/dist/runtime/query/executor.js.map +1 -1
  59. package/dist/runtime/query/index.d.ts.map +1 -1
  60. package/dist/runtime/query/index.js +1 -0
  61. package/dist/runtime/query/index.js.map +1 -1
  62. package/dist/runtime/query/iteration/index.d.ts.map +1 -1
  63. package/dist/runtime/query/iteration/index.js +7 -0
  64. package/dist/runtime/query/iteration/index.js.map +1 -1
  65. package/dist/runtime/query/iteration/phases/context.d.ts +6 -0
  66. package/dist/runtime/query/iteration/phases/context.d.ts.map +1 -1
  67. package/dist/runtime/query/iteration/phases/context.js.map +1 -1
  68. package/dist/runtime/query/iteration/phases/handoff.d.ts +22 -0
  69. package/dist/runtime/query/iteration/phases/handoff.d.ts.map +1 -0
  70. package/dist/runtime/query/iteration/phases/handoff.js +65 -0
  71. package/dist/runtime/query/iteration/phases/handoff.js.map +1 -0
  72. package/dist/runtime/query/iteration/phases/index.d.ts +1 -0
  73. package/dist/runtime/query/iteration/phases/index.d.ts.map +1 -1
  74. package/dist/runtime/query/iteration/phases/index.js +1 -0
  75. package/dist/runtime/query/iteration/phases/index.js.map +1 -1
  76. package/dist/runtime/query/iteration/phases/tool-review.d.ts.map +1 -1
  77. package/dist/runtime/query/iteration/phases/tool-review.js +8 -3
  78. package/dist/runtime/query/iteration/phases/tool-review.js.map +1 -1
  79. package/dist/runtime/query/resume-pending.d.ts.map +1 -1
  80. package/dist/runtime/query/resume-pending.js +3 -2
  81. package/dist/runtime/query/resume-pending.js.map +1 -1
  82. package/dist/runtime/query/review-policy.d.ts +43 -0
  83. package/dist/runtime/query/review-policy.d.ts.map +1 -1
  84. package/dist/runtime/query/review-policy.js +63 -19
  85. package/dist/runtime/query/review-policy.js.map +1 -1
  86. package/dist/schedules/cron.d.ts +21 -0
  87. package/dist/schedules/cron.d.ts.map +1 -0
  88. package/dist/schedules/cron.js +167 -0
  89. package/dist/schedules/cron.js.map +1 -0
  90. package/dist/schedules/describe.d.ts +14 -0
  91. package/dist/schedules/describe.d.ts.map +1 -0
  92. package/dist/schedules/describe.js +133 -0
  93. package/dist/schedules/describe.js.map +1 -0
  94. package/dist/schedules/errors.d.ts +11 -0
  95. package/dist/schedules/errors.d.ts.map +1 -0
  96. package/dist/schedules/errors.js +15 -0
  97. package/dist/schedules/errors.js.map +1 -0
  98. package/dist/schedules/evaluate.d.ts +35 -0
  99. package/dist/schedules/evaluate.d.ts.map +1 -0
  100. package/dist/schedules/evaluate.js +158 -0
  101. package/dist/schedules/evaluate.js.map +1 -0
  102. package/dist/schedules/index.d.ts +11 -0
  103. package/dist/schedules/index.d.ts.map +1 -0
  104. package/dist/schedules/index.js +8 -0
  105. package/dist/schedules/index.js.map +1 -0
  106. package/dist/schedules/next-fire.d.ts +50 -0
  107. package/dist/schedules/next-fire.d.ts.map +1 -0
  108. package/dist/schedules/next-fire.js +250 -0
  109. package/dist/schedules/next-fire.js.map +1 -0
  110. package/dist/schedules/spec.d.ts +30 -0
  111. package/dist/schedules/spec.d.ts.map +1 -0
  112. package/dist/schedules/spec.js +169 -0
  113. package/dist/schedules/spec.js.map +1 -0
  114. package/dist/schedules/types.d.ts +144 -0
  115. package/dist/schedules/types.d.ts.map +1 -0
  116. package/dist/schedules/types.js +11 -0
  117. package/dist/schedules/types.js.map +1 -0
  118. package/dist/schedules/tz.d.ts +44 -0
  119. package/dist/schedules/tz.d.ts.map +1 -0
  120. package/dist/schedules/tz.js +141 -0
  121. package/dist/schedules/tz.js.map +1 -0
  122. package/dist/skills/index.d.ts +1 -1
  123. package/dist/skills/index.d.ts.map +1 -1
  124. package/dist/skills/index.js +1 -1
  125. package/dist/skills/index.js.map +1 -1
  126. package/dist/skills/loader.d.ts +16 -3
  127. package/dist/skills/loader.d.ts.map +1 -1
  128. package/dist/skills/loader.js +48 -4
  129. package/dist/skills/loader.js.map +1 -1
  130. package/dist/skills/registry.d.ts +6 -0
  131. package/dist/skills/registry.d.ts.map +1 -1
  132. package/dist/skills/registry.js +1 -0
  133. package/dist/skills/registry.js.map +1 -1
  134. package/dist/tools/builtins/browser-url.d.ts +83 -0
  135. package/dist/tools/builtins/browser-url.d.ts.map +1 -0
  136. package/dist/tools/builtins/browser-url.js +240 -0
  137. package/dist/tools/builtins/browser-url.js.map +1 -0
  138. package/dist/tools/builtins/browser.d.ts +367 -0
  139. package/dist/tools/builtins/browser.d.ts.map +1 -0
  140. package/dist/tools/builtins/browser.js +704 -0
  141. package/dist/tools/builtins/browser.js.map +1 -0
  142. package/dist/tools/builtins/computer-use-coordinates.d.ts +65 -0
  143. package/dist/tools/builtins/computer-use-coordinates.d.ts.map +1 -0
  144. package/dist/tools/builtins/computer-use-coordinates.js +123 -0
  145. package/dist/tools/builtins/computer-use-coordinates.js.map +1 -0
  146. package/dist/tools/builtins/computer-use-image.d.ts +77 -0
  147. package/dist/tools/builtins/computer-use-image.d.ts.map +1 -0
  148. package/dist/tools/builtins/computer-use-image.js +223 -0
  149. package/dist/tools/builtins/computer-use-image.js.map +1 -0
  150. package/dist/tools/builtins/computer-use.d.ts +519 -14
  151. package/dist/tools/builtins/computer-use.d.ts.map +1 -1
  152. package/dist/tools/builtins/computer-use.js +1188 -183
  153. package/dist/tools/builtins/computer-use.js.map +1 -1
  154. package/dist/tools/builtins/index.d.ts +2 -1
  155. package/dist/tools/builtins/index.d.ts.map +1 -1
  156. package/dist/tools/builtins/index.js +1 -1
  157. package/dist/tools/builtins/index.js.map +1 -1
  158. package/dist/tools/builtins/skill.d.ts +74 -0
  159. package/dist/tools/builtins/skill.d.ts.map +1 -1
  160. package/dist/tools/builtins/skill.js +214 -159
  161. package/dist/tools/builtins/skill.js.map +1 -1
  162. package/dist/tools/defineTool.d.ts +4 -0
  163. package/dist/tools/defineTool.d.ts.map +1 -1
  164. package/dist/tools/defineTool.js +8 -0
  165. package/dist/tools/defineTool.js.map +1 -1
  166. package/dist/tools/schedules/index.d.ts +5 -0
  167. package/dist/tools/schedules/index.d.ts.map +1 -0
  168. package/dist/tools/schedules/index.js +4 -0
  169. package/dist/tools/schedules/index.js.map +1 -0
  170. package/dist/tools/schedules/loop-tool.d.ts +14 -0
  171. package/dist/tools/schedules/loop-tool.d.ts.map +1 -0
  172. package/dist/tools/schedules/loop-tool.js +81 -0
  173. package/dist/tools/schedules/loop-tool.js.map +1 -0
  174. package/dist/tools/schedules/present.d.ts +16 -0
  175. package/dist/tools/schedules/present.d.ts.map +1 -0
  176. package/dist/tools/schedules/present.js +71 -0
  177. package/dist/tools/schedules/present.js.map +1 -0
  178. package/dist/tools/schedules/prompt-scan.d.ts +17 -0
  179. package/dist/tools/schedules/prompt-scan.d.ts.map +1 -0
  180. package/dist/tools/schedules/prompt-scan.js +92 -0
  181. package/dist/tools/schedules/prompt-scan.js.map +1 -0
  182. package/dist/tools/schedules/schedule-tool.d.ts +17 -0
  183. package/dist/tools/schedules/schedule-tool.d.ts.map +1 -0
  184. package/dist/tools/schedules/schedule-tool.js +418 -0
  185. package/dist/tools/schedules/schedule-tool.js.map +1 -0
  186. package/dist/tools/schedules/types.d.ts +252 -0
  187. package/dist/tools/schedules/types.d.ts.map +1 -0
  188. package/dist/tools/schedules/types.js +11 -0
  189. package/dist/tools/schedules/types.js.map +1 -0
  190. package/dist/types/authorization/index.d.ts +107 -9
  191. package/dist/types/authorization/index.d.ts.map +1 -1
  192. package/dist/types/authorization/index.js +16 -1
  193. package/dist/types/authorization/index.js.map +1 -1
  194. package/dist/types/browser/index.d.ts +280 -0
  195. package/dist/types/browser/index.d.ts.map +1 -0
  196. package/dist/types/browser/index.js +12 -0
  197. package/dist/types/browser/index.js.map +1 -0
  198. package/dist/types/computer-use/index.d.ts +176 -0
  199. package/dist/types/computer-use/index.d.ts.map +1 -1
  200. package/dist/types/computer-use/index.js.map +1 -1
  201. package/dist/types/session/events.d.ts +6 -0
  202. package/dist/types/session/events.d.ts.map +1 -1
  203. package/dist/types/session/events.js.map +1 -1
  204. package/dist/types/session/records.d.ts +23 -0
  205. package/dist/types/session/records.d.ts.map +1 -1
  206. package/dist/types/session/records.js +9 -0
  207. package/dist/types/session/records.js.map +1 -1
  208. package/dist/types/tool/index.d.ts +60 -0
  209. package/dist/types/tool/index.d.ts.map +1 -1
  210. package/dist/types/tool/index.js.map +1 -1
  211. package/dist/types/tool/presentation.d.ts +7 -0
  212. package/dist/types/tool/presentation.d.ts.map +1 -1
  213. package/dist/utils/frontmatter.d.ts +18 -2
  214. package/dist/utils/frontmatter.d.ts.map +1 -1
  215. package/dist/utils/frontmatter.js +13 -3
  216. package/dist/utils/frontmatter.js.map +1 -1
  217. package/dist/utils/id.d.ts +8 -0
  218. package/dist/utils/id.d.ts.map +1 -1
  219. package/dist/utils/id.js +12 -0
  220. package/dist/utils/id.js.map +1 -1
  221. package/package.json +3 -1
  222. package/src/authorization/gate.ts +37 -4
  223. package/src/authorization/rules.ts +55 -7
  224. package/src/authorization/shell-lexer.ts +109 -51
  225. package/src/bridge/a2a/mapper.ts +2 -0
  226. package/src/bridge/sse/mapper.ts +1 -0
  227. package/src/directory/types.ts +2 -0
  228. package/src/pricing/catalogue.generated.ts +28 -4
  229. package/src/pricing/rates.source.json +27 -6
  230. package/src/prompt/coding-agent-doctrine.ts +1 -0
  231. package/src/public-runtime.ts +43 -1
  232. package/src/public-tools.ts +54 -1
  233. package/src/public-types.ts +55 -0
  234. package/src/registry/tool/callable.ts +37 -0
  235. package/src/registry/tool/execute.ts +8 -1
  236. package/src/runtime/query/declined.ts +12 -0
  237. package/src/runtime/query/executor/tool-call-admission.ts +60 -16
  238. package/src/runtime/query/executor.ts +36 -5
  239. package/src/runtime/query/index.ts +1 -0
  240. package/src/runtime/query/iteration/index.ts +8 -0
  241. package/src/runtime/query/iteration/phases/context.ts +6 -0
  242. package/src/runtime/query/iteration/phases/handoff.ts +74 -0
  243. package/src/runtime/query/iteration/phases/index.ts +1 -0
  244. package/src/runtime/query/iteration/phases/tool-review.ts +11 -4
  245. package/src/runtime/query/resume-pending.ts +3 -2
  246. package/src/runtime/query/review-policy.ts +107 -18
  247. package/src/schedules/cron.ts +202 -0
  248. package/src/schedules/describe.ts +138 -0
  249. package/src/schedules/errors.ts +15 -0
  250. package/src/schedules/evaluate.ts +178 -0
  251. package/src/schedules/index.ts +18 -0
  252. package/src/schedules/next-fire.ts +257 -0
  253. package/src/schedules/spec.ts +210 -0
  254. package/src/schedules/types.ts +163 -0
  255. package/src/schedules/tz.ts +155 -0
  256. package/src/skills/index.ts +1 -1
  257. package/src/skills/loader.ts +55 -4
  258. package/src/skills/registry.ts +8 -0
  259. package/src/tools/builtins/browser-url.ts +251 -0
  260. package/src/tools/builtins/browser.ts +817 -0
  261. package/src/tools/builtins/computer-use-coordinates.ts +144 -0
  262. package/src/tools/builtins/computer-use-image.ts +278 -0
  263. package/src/tools/builtins/computer-use.ts +1485 -191
  264. package/src/tools/builtins/index.ts +7 -1
  265. package/src/tools/builtins/skill.ts +304 -156
  266. package/src/tools/defineTool.ts +13 -0
  267. package/src/tools/schedules/index.ts +4 -0
  268. package/src/tools/schedules/loop-tool.ts +85 -0
  269. package/src/tools/schedules/present.ts +88 -0
  270. package/src/tools/schedules/prompt-scan.ts +96 -0
  271. package/src/tools/schedules/schedule-tool.ts +482 -0
  272. package/src/tools/schedules/types.ts +265 -0
  273. package/src/types/authorization/index.ts +81 -2
  274. package/src/types/browser/index.ts +341 -0
  275. package/src/types/computer-use/index.ts +202 -0
  276. package/src/types/session/events.ts +6 -0
  277. package/src/types/session/records.ts +10 -0
  278. package/src/types/tool/index.ts +61 -0
  279. package/src/types/tool/presentation.ts +7 -0
  280. package/src/utils/frontmatter.ts +29 -3
  281. package/src/utils/id.ts +14 -0
@@ -0,0 +1,418 @@
1
+ import { z } from 'zod';
2
+ import { canonicalizeBrowserSitePattern } from '../builtins/browser-url.js';
3
+ import { defineTool } from '../defineTool.js';
4
+ import { presentScheduleCall, presentScheduleResult } from './present.js';
5
+ import { scanSchedulePrompt } from './prompt-scan.js';
6
+ export const SCHEDULE_TOOL_NAME = 'schedule';
7
+ /**
8
+ * A person reads the whole proposal — the prompt, the rules, the schedule,
9
+ * the credential source — before answering `create`, `update`, `resume` or
10
+ * `delete`.
11
+ * The executor's `DEFAULT_TOOL_TIMEOUT_MS` (two minutes) is sized for a tool
12
+ * call, not a person on the other end of a screen, and would abandon the
13
+ * call out from under them mid-read. `save_skill`
14
+ * (`packages/cli/src/skills/save.ts`) waits on the same kind of answer and
15
+ * uses the same thirty minutes, for the same reason.
16
+ */
17
+ const OPERATOR_CONFIRM_TIMEOUT_MS = 30 * 60_000;
18
+ const EFFECT = z.enum(['allow', 'ask', 'deny']);
19
+ const NETWORK_TOOLS = ['web_fetch', 'web_search'];
20
+ const BROWSER_PROFILE = /^[a-z0-9][a-z0-9-]{0,62}$/;
21
+ const inputSchema = z.object({
22
+ action: z
23
+ .enum(['create', 'list', 'update', 'pause', 'resume', 'delete'])
24
+ .describe('What to do. create, update, resume and delete ask the operator first. To change a job, update it: deleting and creating it again loses its history.'),
25
+ name: z
26
+ .string()
27
+ .regex(/^[a-z0-9][a-z0-9-]{0,62}$/)
28
+ .optional()
29
+ .describe('create: job name, lowercase letters, digits and dashes'),
30
+ prompt: z
31
+ .string()
32
+ .min(1)
33
+ .max(20_000)
34
+ .optional()
35
+ .describe('create, update: what the run is asked to do'),
36
+ when: z
37
+ .string()
38
+ .optional()
39
+ .describe('create, update: "every 30m", "0 9 * * 1-5" (cron), "at 2026-09-24 09:00", "in 2h"'),
40
+ folder: z
41
+ .string()
42
+ .optional()
43
+ .describe("create: folder to run in; leave unset for the session's unless the user named one"),
44
+ tz: z
45
+ .string()
46
+ .optional()
47
+ .describe("create: IANA time zone; leave unset for the operator's own zone unless the user named another"),
48
+ permissions: z
49
+ .object({
50
+ preset: z
51
+ .enum(['read-only', 'edit-in-folder'])
52
+ .optional()
53
+ .describe('read-only: read/glob/grep/ls only. edit-in-folder: also edit and write, bash asks'),
54
+ unmatched: z
55
+ .enum(['park', 'deny'])
56
+ .describe('A call no rule covers: park (wait for the operator) or deny'),
57
+ execution: z
58
+ .enum(['host', 'sandbox'])
59
+ .optional()
60
+ .describe('Where commands run; leave unset (this machine) unless the user asked for a sandbox'),
61
+ rules: z
62
+ .record(z.string(), z.union([EFFECT, z.record(z.string(), EFFECT)]))
63
+ .optional()
64
+ .describe('Extra rules, e.g. {"bash": {"npm test*": "allow"}}'),
65
+ browser: z
66
+ .object({
67
+ profile: z
68
+ .string()
69
+ .regex(BROWSER_PROFILE)
70
+ .describe('Browser profile the operator signed in with, e.g. "work"'),
71
+ sites: z
72
+ .record(z.string(), z.enum(['read', 'ask', 'act']))
73
+ .describe('Site to level, e.g. {"https://github.com": "read"}. read: open and read only; ask: changes wait for the operator; act: changes run unasked. Unlisted sites are denied; there is no "*".'),
74
+ headed: z.boolean().optional().describe('Show the browser window; default no window'),
75
+ })
76
+ .optional()
77
+ .describe('Browser access; omit for none'),
78
+ })
79
+ .optional()
80
+ .describe('create: REQUIRED explicit permission set; there is no default. update: the whole new set, only when the permissions change'),
81
+ budget: z
82
+ .object({
83
+ maxIterations: z
84
+ .number()
85
+ .int()
86
+ .positive()
87
+ .optional()
88
+ .describe('Model steps one run may take (each model call with its tool calls is one step), not how many times the job runs. Omit for the default; a browser task takes 10 or more.'),
89
+ tokenBudget: z
90
+ .number()
91
+ .int()
92
+ .positive()
93
+ .optional()
94
+ .describe('Tokens one run may spend in total. Every model call resends the whole prompt (often 10,000-30,000 tokens each), so a run needs far more than its answer; omit for the default.'),
95
+ timeoutMs: z
96
+ .number()
97
+ .int()
98
+ .positive()
99
+ .optional()
100
+ .describe('Wall clock of one run, in milliseconds'),
101
+ })
102
+ .optional()
103
+ .describe('Limits of ONE run; omit to use the defaults'),
104
+ job: z.string().optional().describe('update/pause/resume/delete: job name'),
105
+ allFolders: z.boolean().optional().describe('list: include jobs of other folders (names only)'),
106
+ });
107
+ function refuse(error) {
108
+ return { success: false, output: '', error };
109
+ }
110
+ function effectsOf(rule) {
111
+ if (typeof rule === 'string')
112
+ return [rule];
113
+ if (rule && typeof rule === 'object')
114
+ return Object.values(rule);
115
+ return [];
116
+ }
117
+ /**
118
+ * Refuse a network tool beside a shell that runs on the host: a scheduled run
119
+ * that can both read the machine and reach the internet, unattended, is the
120
+ * exfiltration shape, and only the operator can choose it.
121
+ */
122
+ function networkWithHostShell(draft) {
123
+ const rules = draft.permissions.rules ?? {};
124
+ const network = draft.permissions.browser !== undefined ||
125
+ NETWORK_TOOLS.some((t) => effectsOf(rules[t]).some((e) => e === 'allow' || e === 'ask'));
126
+ if (!network)
127
+ return false;
128
+ const bashEffects = effectsOf(rules.bash);
129
+ // The read-only preset denies bash; its rules are expanded by the host,
130
+ // so the draft carries only its name.
131
+ const shellPossible = bashEffects.length > 0
132
+ ? bashEffects.some((e) => e !== 'deny')
133
+ : draft.permissions.preset !== 'read-only' && draft.permissions.unmatched !== 'deny';
134
+ return shellPossible && (draft.permissions.execution ?? 'host') === 'host';
135
+ }
136
+ /**
137
+ * The browser grant with its site keys canonicalised, or why it is refused.
138
+ * Keys are rewritten so the host, the confirmation and the compiled rules
139
+ * all see one spelling of each site.
140
+ */
141
+ function browserGrant(host, proposed) {
142
+ if (host.browserGrants !== true) {
143
+ return {
144
+ ok: false,
145
+ error: 'This host cannot give a scheduled job browser access. Propose the job without permissions.browser, or ask the operator to add it with `namzu schedule add`.',
146
+ };
147
+ }
148
+ const entries = Object.entries(proposed.sites);
149
+ if (entries.length === 0) {
150
+ return {
151
+ ok: false,
152
+ error: 'permissions.browser.sites is empty; list each site the run may open, e.g. {"https://github.com": "read"}.',
153
+ };
154
+ }
155
+ const sites = {};
156
+ for (const [key, level] of entries) {
157
+ if (key.trim() === '*') {
158
+ return {
159
+ ok: false,
160
+ error: 'A scheduled job cannot grant every site ("*"); unlisted sites are always denied. List each site.',
161
+ };
162
+ }
163
+ const verdict = canonicalizeBrowserSitePattern(key);
164
+ if (!verdict.ok)
165
+ return { ok: false, error: `permissions.browser.sites: ${verdict.reason}` };
166
+ if (verdict.pattern in sites && sites[verdict.pattern] !== level) {
167
+ return {
168
+ ok: false,
169
+ error: `permissions.browser.sites names ${verdict.pattern} twice with different levels.`,
170
+ };
171
+ }
172
+ sites[verdict.pattern] = level;
173
+ }
174
+ return {
175
+ ok: true,
176
+ grant: {
177
+ profile: proposed.profile,
178
+ sites,
179
+ ...(proposed.headed !== undefined ? { headed: proposed.headed } : {}),
180
+ },
181
+ };
182
+ }
183
+ /** A proposed permission set as a draft carries it, or why it is refused. */
184
+ function checkPermissions(host, proposed) {
185
+ if (!proposed.preset && !proposed.rules && !proposed.browser) {
186
+ return {
187
+ ok: false,
188
+ error: 'permissions needs a preset, rules or a browser grant; an empty permission set is not a choice.',
189
+ };
190
+ }
191
+ if (!proposed.browser)
192
+ return { ok: true, permissions: proposed };
193
+ const grant = browserGrant(host, proposed.browser);
194
+ if (!grant.ok)
195
+ return grant;
196
+ return { ok: true, permissions: { ...proposed, browser: grant.grant } };
197
+ }
198
+ const NETWORK_WITH_HOST_SHELL = 'A scheduled job proposed here cannot combine web or browser access with a shell on the host. Deny bash, use execution "sandbox", or ask the operator to create it with `namzu schedule add`.';
199
+ async function create(host, input, signal) {
200
+ const missing = ['name', 'prompt', 'when', 'permissions'].filter((k) => input[k] === undefined);
201
+ if (missing.length > 0) {
202
+ return refuse(`create needs ${missing.join(', ')}. permissions is required: propose an explicit set (a preset and/or rules, plus unmatched).`);
203
+ }
204
+ const checked = checkPermissions(host, input.permissions);
205
+ if (!checked.ok)
206
+ return refuse(checked.error);
207
+ const permissions = checked.permissions;
208
+ const draft = {
209
+ name: input.name,
210
+ prompt: input.prompt,
211
+ when: input.when,
212
+ ...(input.folder !== undefined ? { folder: input.folder } : {}),
213
+ ...(input.tz !== undefined ? { tz: input.tz } : {}),
214
+ permissions,
215
+ ...(input.budget ? { budget: input.budget } : {}),
216
+ };
217
+ if (networkWithHostShell(draft))
218
+ return refuse(NETWORK_WITH_HOST_SHELL);
219
+ let preview;
220
+ try {
221
+ preview = await host.preview(draft);
222
+ }
223
+ catch (error) {
224
+ return refuse(error instanceof Error ? error.message : String(error));
225
+ }
226
+ let answer;
227
+ try {
228
+ answer = await host.confirm({
229
+ preview,
230
+ promptFindings: scanSchedulePrompt(preview.prompt),
231
+ proposedBy: 'model',
232
+ }, signal);
233
+ }
234
+ catch {
235
+ answer = 'cancel';
236
+ }
237
+ // The deadline or the turn can settle `host.confirm` from underneath a
238
+ // host that resolves optimistically on its own close; never create on an
239
+ // answer that arrived after the operator was no longer being asked.
240
+ if (signal?.aborted)
241
+ answer = 'cancel';
242
+ if (answer !== 'create' && answer !== 'create-paused') {
243
+ return {
244
+ success: false,
245
+ output: '',
246
+ error: 'The operator did not confirm the job, so it was not created.',
247
+ data: { cancelled: true },
248
+ };
249
+ }
250
+ const created = await host.create(draft, preview, { paused: answer === 'create-paused' });
251
+ const said = answer === 'create-paused'
252
+ ? `Job "${created.name}" was created paused. The operator can resume it with /schedule.`
253
+ : `Job "${created.name}" was created. It runs ${preview.schedule}, with nobody watching; results arrive as a notification and a session.`;
254
+ return {
255
+ success: true,
256
+ output: created.note ? `${said} ${created.note}` : said,
257
+ data: { name: created.name, paused: answer === 'create-paused' },
258
+ };
259
+ }
260
+ async function list(host, input) {
261
+ const jobs = await host.list({ allFolders: input.allFolders === true });
262
+ if (jobs.length === 0)
263
+ return { success: true, output: 'No scheduled jobs.', data: { jobs: [] } };
264
+ const lines = jobs.map((j) => `${j.name} · ${j.state} · ${j.schedule}${j.nextFireAt ? ` · next ${j.nextFireAt}` : ''}${j.lastStatus ? ` · last ${j.lastStatus}` : ''} · ${j.folder}${j.inSessionFolder ? ' (this folder)' : ''}`);
265
+ return { success: true, output: lines.join('\n'), data: { jobs } };
266
+ }
267
+ /** The fields `update` may change, as the model set them. */
268
+ const CHANGEABLE = ['prompt', 'when', 'folder', 'tz', 'permissions', 'budget'];
269
+ async function update(host, input, signal) {
270
+ if (!host.previewUpdate || !host.confirmUpdate || !host.update) {
271
+ return refuse('This host cannot change a scheduled job. Ask the operator to change it themselves; do not delete and create it again, which loses its history.');
272
+ }
273
+ if (!input.job)
274
+ return refuse("update needs job (the job's name) and the fields to change.");
275
+ if (input.name !== undefined) {
276
+ return refuse('update cannot rename a job: name the job to change with job, and leave name out.');
277
+ }
278
+ const given = CHANGEABLE.filter((k) => input[k] !== undefined);
279
+ if (given.length === 0) {
280
+ return refuse(`update needs at least one of ${CHANGEABLE.join(', ')} to change.`);
281
+ }
282
+ let permissions;
283
+ if (input.permissions) {
284
+ const checked = checkPermissions(host, input.permissions);
285
+ if (!checked.ok)
286
+ return refuse(checked.error);
287
+ permissions = checked.permissions;
288
+ if (networkWithHostShell({ name: '', prompt: '', when: '', permissions }))
289
+ return refuse(NETWORK_WITH_HOST_SHELL);
290
+ }
291
+ const changes = {
292
+ ...(input.prompt !== undefined ? { prompt: input.prompt } : {}),
293
+ ...(input.when !== undefined ? { when: input.when } : {}),
294
+ ...(input.folder !== undefined ? { folder: input.folder } : {}),
295
+ ...(input.tz !== undefined ? { tz: input.tz } : {}),
296
+ ...(permissions ? { permissions } : {}),
297
+ ...(input.budget ? { budget: input.budget } : {}),
298
+ };
299
+ let proposal;
300
+ try {
301
+ proposal = await host.previewUpdate(input.job, changes);
302
+ }
303
+ catch (error) {
304
+ return refuse(error instanceof Error ? error.message : String(error));
305
+ }
306
+ let confirmed = false;
307
+ try {
308
+ confirmed = await host.confirmUpdate({
309
+ ...proposal,
310
+ promptFindings: scanSchedulePrompt(proposal.preview.prompt),
311
+ proposedBy: 'model',
312
+ }, signal);
313
+ }
314
+ catch {
315
+ confirmed = false;
316
+ }
317
+ // As for `create`: never save on an answer that came after the
318
+ // operator was no longer being asked.
319
+ if (signal?.aborted)
320
+ confirmed = false;
321
+ if (!confirmed) {
322
+ return {
323
+ ...refuse(`The operator did not confirm the change; "${proposal.preview.name}" was not changed.`),
324
+ data: { cancelled: true },
325
+ };
326
+ }
327
+ let saved;
328
+ try {
329
+ saved = await host.update(proposal.preview);
330
+ }
331
+ catch (error) {
332
+ return refuse(error instanceof Error ? error.message : String(error));
333
+ }
334
+ const said = `Job "${saved.name}" was updated in place and keeps its history. It runs ${proposal.preview.schedule}.`;
335
+ return {
336
+ success: true,
337
+ output: saved.note ? `${said} ${saved.note}` : said,
338
+ data: { name: saved.name, updated: true, changes: proposal.changes },
339
+ };
340
+ }
341
+ async function lifecycle(host, input, action, signal) {
342
+ if (!input.job)
343
+ return refuse(`${action} needs job (the job's name).`);
344
+ const job = await host.find(input.job);
345
+ if (!job)
346
+ return refuse(`No scheduled job is named "${input.job}".`);
347
+ if (action !== 'pause') {
348
+ let confirmed = false;
349
+ try {
350
+ confirmed = await host.confirmAction(job, action, signal);
351
+ }
352
+ catch {
353
+ confirmed = false;
354
+ }
355
+ if (signal?.aborted)
356
+ confirmed = false;
357
+ if (!confirmed)
358
+ return {
359
+ ...refuse(`The operator did not confirm; "${job.name}" was not changed.`),
360
+ data: { cancelled: true },
361
+ };
362
+ }
363
+ if (action === 'pause')
364
+ await host.pause(job.name);
365
+ else if (action === 'resume')
366
+ await host.resume(job.name);
367
+ else
368
+ await host.delete(job.name);
369
+ const verb = action === 'pause' ? 'paused' : action === 'resume' ? 'resumed' : 'deleted';
370
+ return { success: true, output: `Job "${job.name}" ${verb}.`, data: { name: job.name, action } };
371
+ }
372
+ /**
373
+ * The `schedule` tool: create, list, update, pause, resume and delete the
374
+ * operator's scheduled jobs from a conversation.
375
+ *
376
+ * Creation, updating, resuming and deleting are confirmed by a person
377
+ * through the host (`ScheduleToolHost.confirm`, `confirmUpdate`), on a
378
+ * screen the host draws from its own computation. An update changes the
379
+ * job in place, so it keeps its id and its history. The model cannot propose that uncovered calls run without
380
+ * asking, nor web access beside a host shell. Register it only where a person
381
+ * is present to confirm: never in a headless run, a scheduled run or a
382
+ * sub-agent.
383
+ */
384
+ export function buildScheduleTools(host) {
385
+ return [
386
+ defineTool({
387
+ name: SCHEDULE_TOOL_NAME,
388
+ description: "Manage the operator's scheduled jobs: prompts that run later in a folder, with nobody watching, under an explicit permission set. Use it only when the user asks for something to happen on a schedule. create, update, resume and delete are confirmed by the operator; pause is not. A job needs name, prompt, when and permissions (unmatched: park or deny, plus a preset, rules or a browser grant). To change a job, update it with job and only the fields that change; do not delete and recreate it. Leave every other field (folder, tz, execution, budget, headed) unset unless the user asked for it: the defaults are the operator's, and the confirmation marks each value you chose. Scheduled runs cannot ask questions.",
389
+ inputSchema,
390
+ category: 'custom',
391
+ permissions: [],
392
+ readOnly: (input) => input.action === 'list',
393
+ // `delete` removes a job only after the operator confirms it on the
394
+ // host's own screen; a destructive flag would put a second review,
395
+ // over the raw arguments, in front of that confirmation.
396
+ destructive: false,
397
+ concurrencySafe: false,
398
+ presentCall: presentScheduleCall,
399
+ presentResult: presentScheduleResult,
400
+ // A person, not a tool, answers `create`/`update`/`resume`/`delete`;
401
+ // see `OPERATOR_CONFIRM_TIMEOUT_MS`.
402
+ timeoutMs: OPERATOR_CONFIRM_TIMEOUT_MS,
403
+ async execute(input, context) {
404
+ switch (input.action) {
405
+ case 'create':
406
+ return create(host, input, context.abortSignal);
407
+ case 'list':
408
+ return list(host, input);
409
+ case 'update':
410
+ return update(host, input, context.abortSignal);
411
+ default:
412
+ return lifecycle(host, input, input.action, context.abortSignal);
413
+ }
414
+ },
415
+ }),
416
+ ];
417
+ }
418
+ //# sourceMappingURL=schedule-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedule-tool.js","sourceRoot":"","sources":["../../../src/tools/schedules/schedule-tool.ts"],"names":[],"mappings":"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"}