@namzu/sdk 44.3.0 → 45.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 (271) hide show
  1. package/CHANGELOG.md +94 -0
  2. package/dist/authorization/command-line.d.ts +66 -19
  3. package/dist/authorization/command-line.d.ts.map +1 -1
  4. package/dist/authorization/command-line.js +130 -270
  5. package/dist/authorization/command-line.js.map +1 -1
  6. package/dist/authorization/gate.d.ts +7 -0
  7. package/dist/authorization/gate.d.ts.map +1 -1
  8. package/dist/authorization/gate.js +13 -3
  9. package/dist/authorization/gate.js.map +1 -1
  10. package/dist/authorization/rules.d.ts +10 -1
  11. package/dist/authorization/rules.d.ts.map +1 -1
  12. package/dist/authorization/rules.js +55 -8
  13. package/dist/authorization/rules.js.map +1 -1
  14. package/dist/authorization/shell-lexer.d.ts +152 -0
  15. package/dist/authorization/shell-lexer.d.ts.map +1 -0
  16. package/dist/authorization/shell-lexer.js +2156 -0
  17. package/dist/authorization/shell-lexer.js.map +1 -0
  18. package/dist/authorization/skill-grant.d.ts +182 -0
  19. package/dist/authorization/skill-grant.d.ts.map +1 -0
  20. package/dist/authorization/skill-grant.js +314 -0
  21. package/dist/authorization/skill-grant.js.map +1 -0
  22. package/dist/bridge/a2a/mapper.d.ts.map +1 -1
  23. package/dist/bridge/a2a/mapper.js +2 -0
  24. package/dist/bridge/a2a/mapper.js.map +1 -1
  25. package/dist/bridge/sse/mapper.d.ts.map +1 -1
  26. package/dist/bridge/sse/mapper.js +1 -0
  27. package/dist/bridge/sse/mapper.js.map +1 -1
  28. package/dist/directory/types.d.ts +2 -0
  29. package/dist/directory/types.d.ts.map +1 -1
  30. package/dist/directory/types.js.map +1 -1
  31. package/dist/manager/resident/outbox.d.ts +4 -4
  32. package/dist/persona/assembler.d.ts.map +1 -1
  33. package/dist/persona/assembler.js +5 -2
  34. package/dist/persona/assembler.js.map +1 -1
  35. package/dist/prompt/coding-agent-doctrine.d.ts +1 -1
  36. package/dist/prompt/coding-agent-doctrine.d.ts.map +1 -1
  37. package/dist/prompt/coding-agent-doctrine.js +1 -0
  38. package/dist/prompt/coding-agent-doctrine.js.map +1 -1
  39. package/dist/public-runtime.d.ts +5 -1
  40. package/dist/public-runtime.d.ts.map +1 -1
  41. package/dist/public-runtime.js +15 -1
  42. package/dist/public-runtime.js.map +1 -1
  43. package/dist/public-tools.d.ts +4 -0
  44. package/dist/public-tools.d.ts.map +1 -1
  45. package/dist/public-tools.js +12 -1
  46. package/dist/public-tools.js.map +1 -1
  47. package/dist/public-types.d.ts +9 -1
  48. package/dist/public-types.d.ts.map +1 -1
  49. package/dist/runtime/jobs/registry.d.ts +2 -2
  50. package/dist/runtime/jobs/registry.d.ts.map +1 -1
  51. package/dist/runtime/jobs/registry.js +6 -2
  52. package/dist/runtime/jobs/registry.js.map +1 -1
  53. package/dist/runtime/query/declined.d.ts +12 -0
  54. package/dist/runtime/query/declined.d.ts.map +1 -0
  55. package/dist/runtime/query/declined.js +12 -0
  56. package/dist/runtime/query/declined.js.map +1 -0
  57. package/dist/runtime/query/executor.d.ts +36 -40
  58. package/dist/runtime/query/executor.d.ts.map +1 -1
  59. package/dist/runtime/query/executor.js +95 -53
  60. package/dist/runtime/query/executor.js.map +1 -1
  61. package/dist/runtime/query/index.d.ts.map +1 -1
  62. package/dist/runtime/query/index.js +8 -0
  63. package/dist/runtime/query/index.js.map +1 -1
  64. package/dist/runtime/query/iteration/index.d.ts.map +1 -1
  65. package/dist/runtime/query/iteration/index.js +13 -0
  66. package/dist/runtime/query/iteration/index.js.map +1 -1
  67. package/dist/runtime/query/iteration/phases/context.d.ts +13 -0
  68. package/dist/runtime/query/iteration/phases/context.d.ts.map +1 -1
  69. package/dist/runtime/query/iteration/phases/context.js.map +1 -1
  70. package/dist/runtime/query/iteration/phases/handoff.d.ts +22 -0
  71. package/dist/runtime/query/iteration/phases/handoff.d.ts.map +1 -0
  72. package/dist/runtime/query/iteration/phases/handoff.js +65 -0
  73. package/dist/runtime/query/iteration/phases/handoff.js.map +1 -0
  74. package/dist/runtime/query/iteration/phases/index.d.ts +1 -0
  75. package/dist/runtime/query/iteration/phases/index.d.ts.map +1 -1
  76. package/dist/runtime/query/iteration/phases/index.js +1 -0
  77. package/dist/runtime/query/iteration/phases/index.js.map +1 -1
  78. package/dist/runtime/query/iteration/phases/tool-review.d.ts.map +1 -1
  79. package/dist/runtime/query/iteration/phases/tool-review.js +56 -3
  80. package/dist/runtime/query/iteration/phases/tool-review.js.map +1 -1
  81. package/dist/runtime/query/resume-pending.d.ts.map +1 -1
  82. package/dist/runtime/query/resume-pending.js +3 -2
  83. package/dist/runtime/query/resume-pending.js.map +1 -1
  84. package/dist/runtime/query/review-policy.d.ts +11 -0
  85. package/dist/runtime/query/review-policy.d.ts.map +1 -1
  86. package/dist/runtime/query/review-policy.js +36 -3
  87. package/dist/runtime/query/review-policy.js.map +1 -1
  88. package/dist/runtime/query/tooling.d.ts +3 -0
  89. package/dist/runtime/query/tooling.d.ts.map +1 -1
  90. package/dist/runtime/query/tooling.js +1 -0
  91. package/dist/runtime/query/tooling.js.map +1 -1
  92. package/dist/schedules/cron.d.ts +21 -0
  93. package/dist/schedules/cron.d.ts.map +1 -0
  94. package/dist/schedules/cron.js +167 -0
  95. package/dist/schedules/cron.js.map +1 -0
  96. package/dist/schedules/describe.d.ts +14 -0
  97. package/dist/schedules/describe.d.ts.map +1 -0
  98. package/dist/schedules/describe.js +133 -0
  99. package/dist/schedules/describe.js.map +1 -0
  100. package/dist/schedules/errors.d.ts +11 -0
  101. package/dist/schedules/errors.d.ts.map +1 -0
  102. package/dist/schedules/errors.js +15 -0
  103. package/dist/schedules/errors.js.map +1 -0
  104. package/dist/schedules/evaluate.d.ts +35 -0
  105. package/dist/schedules/evaluate.d.ts.map +1 -0
  106. package/dist/schedules/evaluate.js +158 -0
  107. package/dist/schedules/evaluate.js.map +1 -0
  108. package/dist/schedules/index.d.ts +11 -0
  109. package/dist/schedules/index.d.ts.map +1 -0
  110. package/dist/schedules/index.js +8 -0
  111. package/dist/schedules/index.js.map +1 -0
  112. package/dist/schedules/next-fire.d.ts +50 -0
  113. package/dist/schedules/next-fire.d.ts.map +1 -0
  114. package/dist/schedules/next-fire.js +250 -0
  115. package/dist/schedules/next-fire.js.map +1 -0
  116. package/dist/schedules/spec.d.ts +30 -0
  117. package/dist/schedules/spec.d.ts.map +1 -0
  118. package/dist/schedules/spec.js +169 -0
  119. package/dist/schedules/spec.js.map +1 -0
  120. package/dist/schedules/types.d.ts +144 -0
  121. package/dist/schedules/types.d.ts.map +1 -0
  122. package/dist/schedules/types.js +11 -0
  123. package/dist/schedules/types.js.map +1 -0
  124. package/dist/schedules/tz.d.ts +44 -0
  125. package/dist/schedules/tz.d.ts.map +1 -0
  126. package/dist/schedules/tz.js +141 -0
  127. package/dist/schedules/tz.js.map +1 -0
  128. package/dist/skills/index.d.ts +1 -1
  129. package/dist/skills/index.d.ts.map +1 -1
  130. package/dist/skills/index.js +1 -1
  131. package/dist/skills/index.js.map +1 -1
  132. package/dist/skills/loader.d.ts +21 -0
  133. package/dist/skills/loader.d.ts.map +1 -1
  134. package/dist/skills/loader.js +51 -1
  135. package/dist/skills/loader.js.map +1 -1
  136. package/dist/tools/builtins/bash.d.ts.map +1 -1
  137. package/dist/tools/builtins/bash.js +18 -6
  138. package/dist/tools/builtins/bash.js.map +1 -1
  139. package/dist/tools/builtins/browser-url.d.ts +83 -0
  140. package/dist/tools/builtins/browser-url.d.ts.map +1 -0
  141. package/dist/tools/builtins/browser-url.js +240 -0
  142. package/dist/tools/builtins/browser-url.js.map +1 -0
  143. package/dist/tools/builtins/browser.d.ts +367 -0
  144. package/dist/tools/builtins/browser.d.ts.map +1 -0
  145. package/dist/tools/builtins/browser.js +704 -0
  146. package/dist/tools/builtins/browser.js.map +1 -0
  147. package/dist/tools/builtins/skill.d.ts +2 -9
  148. package/dist/tools/builtins/skill.d.ts.map +1 -1
  149. package/dist/tools/builtins/skill.js +74 -51
  150. package/dist/tools/builtins/skill.js.map +1 -1
  151. package/dist/tools/command-shell.d.ts +90 -0
  152. package/dist/tools/command-shell.d.ts.map +1 -0
  153. package/dist/tools/command-shell.js +129 -0
  154. package/dist/tools/command-shell.js.map +1 -0
  155. package/dist/tools/defineTool.d.ts +13 -0
  156. package/dist/tools/defineTool.d.ts.map +1 -1
  157. package/dist/tools/defineTool.js +30 -1
  158. package/dist/tools/defineTool.js.map +1 -1
  159. package/dist/tools/schedules/index.d.ts +5 -0
  160. package/dist/tools/schedules/index.d.ts.map +1 -0
  161. package/dist/tools/schedules/index.js +4 -0
  162. package/dist/tools/schedules/index.js.map +1 -0
  163. package/dist/tools/schedules/loop-tool.d.ts +14 -0
  164. package/dist/tools/schedules/loop-tool.d.ts.map +1 -0
  165. package/dist/tools/schedules/loop-tool.js +81 -0
  166. package/dist/tools/schedules/loop-tool.js.map +1 -0
  167. package/dist/tools/schedules/present.d.ts +16 -0
  168. package/dist/tools/schedules/present.d.ts.map +1 -0
  169. package/dist/tools/schedules/present.js +69 -0
  170. package/dist/tools/schedules/present.js.map +1 -0
  171. package/dist/tools/schedules/prompt-scan.d.ts +17 -0
  172. package/dist/tools/schedules/prompt-scan.d.ts.map +1 -0
  173. package/dist/tools/schedules/prompt-scan.js +92 -0
  174. package/dist/tools/schedules/prompt-scan.js.map +1 -0
  175. package/dist/tools/schedules/schedule-tool.d.ts +16 -0
  176. package/dist/tools/schedules/schedule-tool.d.ts.map +1 -0
  177. package/dist/tools/schedules/schedule-tool.js +327 -0
  178. package/dist/tools/schedules/schedule-tool.js.map +1 -0
  179. package/dist/tools/schedules/types.d.ts +184 -0
  180. package/dist/tools/schedules/types.d.ts.map +1 -0
  181. package/dist/tools/schedules/types.js +11 -0
  182. package/dist/tools/schedules/types.js.map +1 -0
  183. package/dist/types/authorization/index.d.ts +86 -9
  184. package/dist/types/authorization/index.d.ts.map +1 -1
  185. package/dist/types/authorization/index.js +11 -1
  186. package/dist/types/authorization/index.js.map +1 -1
  187. package/dist/types/browser/index.d.ts +280 -0
  188. package/dist/types/browser/index.d.ts.map +1 -0
  189. package/dist/types/browser/index.js +12 -0
  190. package/dist/types/browser/index.js.map +1 -0
  191. package/dist/types/hitl/index.d.ts +23 -0
  192. package/dist/types/hitl/index.d.ts.map +1 -1
  193. package/dist/types/hitl/index.js.map +1 -1
  194. package/dist/types/session/events.d.ts +6 -0
  195. package/dist/types/session/events.d.ts.map +1 -1
  196. package/dist/types/session/events.js.map +1 -1
  197. package/dist/types/session/records.d.ts +23 -0
  198. package/dist/types/session/records.d.ts.map +1 -1
  199. package/dist/types/session/records.js +9 -0
  200. package/dist/types/session/records.js.map +1 -1
  201. package/dist/types/tool/index.d.ts +108 -5
  202. package/dist/types/tool/index.d.ts.map +1 -1
  203. package/dist/types/tool/index.js.map +1 -1
  204. package/dist/types/tool/presentation.d.ts +7 -0
  205. package/dist/types/tool/presentation.d.ts.map +1 -1
  206. package/dist/utils/frontmatter.d.ts +35 -3
  207. package/dist/utils/frontmatter.d.ts.map +1 -1
  208. package/dist/utils/frontmatter.js +45 -5
  209. package/dist/utils/frontmatter.js.map +1 -1
  210. package/dist/utils/id.d.ts +8 -0
  211. package/dist/utils/id.d.ts.map +1 -1
  212. package/dist/utils/id.js +12 -0
  213. package/dist/utils/id.js.map +1 -1
  214. package/package.json +1 -1
  215. package/src/authorization/command-line.ts +148 -293
  216. package/src/authorization/gate.ts +22 -2
  217. package/src/authorization/rules.ts +67 -8
  218. package/src/authorization/shell-lexer.ts +2349 -0
  219. package/src/authorization/skill-grant.ts +400 -0
  220. package/src/bridge/a2a/mapper.ts +2 -0
  221. package/src/bridge/sse/mapper.ts +1 -0
  222. package/src/directory/types.ts +2 -0
  223. package/src/persona/assembler.ts +5 -2
  224. package/src/prompt/coding-agent-doctrine.ts +1 -0
  225. package/src/public-runtime.ts +37 -0
  226. package/src/public-tools.ts +37 -1
  227. package/src/public-types.ts +57 -0
  228. package/src/runtime/jobs/registry.ts +19 -11
  229. package/src/runtime/query/declined.ts +12 -0
  230. package/src/runtime/query/executor.ts +116 -56
  231. package/src/runtime/query/index.ts +8 -0
  232. package/src/runtime/query/iteration/index.ts +13 -0
  233. package/src/runtime/query/iteration/phases/context.ts +13 -0
  234. package/src/runtime/query/iteration/phases/handoff.ts +74 -0
  235. package/src/runtime/query/iteration/phases/index.ts +1 -0
  236. package/src/runtime/query/iteration/phases/tool-review.ts +55 -3
  237. package/src/runtime/query/resume-pending.ts +3 -2
  238. package/src/runtime/query/review-policy.ts +57 -3
  239. package/src/runtime/query/tooling.ts +4 -0
  240. package/src/schedules/cron.ts +202 -0
  241. package/src/schedules/describe.ts +138 -0
  242. package/src/schedules/errors.ts +15 -0
  243. package/src/schedules/evaluate.ts +178 -0
  244. package/src/schedules/index.ts +18 -0
  245. package/src/schedules/next-fire.ts +257 -0
  246. package/src/schedules/spec.ts +210 -0
  247. package/src/schedules/types.ts +163 -0
  248. package/src/schedules/tz.ts +155 -0
  249. package/src/skills/index.ts +1 -1
  250. package/src/skills/loader.ts +59 -1
  251. package/src/tools/builtins/bash.ts +24 -6
  252. package/src/tools/builtins/browser-url.ts +251 -0
  253. package/src/tools/builtins/browser.ts +817 -0
  254. package/src/tools/builtins/skill.ts +92 -53
  255. package/src/tools/command-shell.ts +166 -0
  256. package/src/tools/defineTool.ts +36 -1
  257. package/src/tools/schedules/index.ts +4 -0
  258. package/src/tools/schedules/loop-tool.ts +85 -0
  259. package/src/tools/schedules/present.ts +86 -0
  260. package/src/tools/schedules/prompt-scan.ts +96 -0
  261. package/src/tools/schedules/schedule-tool.ts +376 -0
  262. package/src/tools/schedules/types.ts +197 -0
  263. package/src/types/authorization/index.ts +60 -2
  264. package/src/types/browser/index.ts +341 -0
  265. package/src/types/hitl/index.ts +21 -0
  266. package/src/types/session/events.ts +6 -0
  267. package/src/types/session/records.ts +10 -0
  268. package/src/types/tool/index.ts +109 -5
  269. package/src/types/tool/presentation.ts +7 -0
  270. package/src/utils/frontmatter.ts +81 -5
  271. package/src/utils/id.ts +14 -0
@@ -0,0 +1,144 @@
1
+ /**
2
+ * Types of the schedule time engine and evaluator.
3
+ *
4
+ * The SDK owns WHEN something is due and nothing about how a host stores a
5
+ * job or runs it: the CLI keeps its job files, claims and history records to
6
+ * itself, so its on-disk format is not SDK API. The unions exported here
7
+ * (`ScheduleDecision`, `ScheduleSkipReason`, `ScheduleMissedReason`) may grow
8
+ * in a minor release; switch over them with a `default:` branch.
9
+ */
10
+ /** A single instant (ISO-8601 UTC). */
11
+ export interface ScheduleAtSpec {
12
+ readonly kind: 'at';
13
+ readonly at: string;
14
+ }
15
+ /**
16
+ * Elapsed time from an anchor: `anchorAt + k * everyMs` for k ≥ 1. Pure UTC
17
+ * arithmetic, so `every 24h` drifts against the wall clock across a DST
18
+ * change; a cron spec is the way to say "every day at 09:00".
19
+ */
20
+ export interface ScheduleEverySpec {
21
+ readonly kind: 'every';
22
+ /** At least one minute, and a whole number of minutes. */
23
+ readonly everyMs: number;
24
+ readonly anchorAt: string;
25
+ }
26
+ /** Five-field cron, evaluated in an IANA time zone the spec carries. */
27
+ export interface ScheduleCronSpec {
28
+ readonly kind: 'cron';
29
+ /** Normalised five-field text; macros are expanded. */
30
+ readonly expr: string;
31
+ readonly tz: string;
32
+ }
33
+ export type ScheduleSpec = ScheduleAtSpec | ScheduleEverySpec | ScheduleCronSpec;
34
+ /** A parsed cron expression: each field as the sorted set of values it allows. */
35
+ export interface CronExpression {
36
+ readonly source: string;
37
+ readonly minutes: readonly number[];
38
+ readonly hours: readonly number[];
39
+ readonly daysOfMonth: readonly number[];
40
+ readonly months: readonly number[];
41
+ /** 0-6, Sunday = 0 (a written 7 is folded into 0). */
42
+ readonly daysOfWeek: readonly number[];
43
+ /** The day-of-month field does not start with `*`. */
44
+ readonly domRestricted: boolean;
45
+ /** The day-of-week field does not start with `*`. */
46
+ readonly dowRestricted: boolean;
47
+ /**
48
+ * Minute and hour are single values or lists with no `*` or step. Decides
49
+ * the DST rule (cronie's): a fixed-time job fires once per day across a
50
+ * DST change, a wildcard job fires at every instant whose wall time
51
+ * matches.
52
+ */
53
+ readonly fixedTime: boolean;
54
+ }
55
+ /** Why an occurrence did not run. May grow in a minor release. */
56
+ export type ScheduleSkipReason = 'previous-run-active' | 'previous-run-awaiting-approval' | 'paused' | 'awaiting-confirmation' | 'beyond-catch-up-window' | 'one-shot-expired' | 'quota-hold';
57
+ /** Why occurrences were missed. Best effort; may grow in a minor release. */
58
+ export type ScheduleMissedReason = 'daemon-not-running' | 'machine-asleep' | 'clock-jumped-forward';
59
+ /** The lifecycle a job is in, as far as the evaluator cares. */
60
+ export type ScheduleJobLifecycle = 'pending-confirmation' | 'active' | 'paused' | 'completed' | 'expired';
61
+ /** The evaluator's structural view of a job: what it needs and nothing else. */
62
+ export interface ScheduleEvaluationJob {
63
+ readonly spec: ScheduleSpec;
64
+ readonly state: ScheduleJobLifecycle;
65
+ /** Catch-up window; default {@link SCHEDULE_CATCH_UP_WINDOW_MS}. */
66
+ readonly catchUp?: {
67
+ readonly windowMs: number;
68
+ };
69
+ readonly createdAt: string;
70
+ readonly updatedAt: string;
71
+ /** Bumped on every definition change. */
72
+ readonly revision: number;
73
+ }
74
+ /** What the host remembers between evaluations of one job. */
75
+ export interface ScheduleEvaluationState {
76
+ /** Everything up to and including this instant has been decided. */
77
+ readonly lastEvaluatedAt?: string;
78
+ /** The job revision `lastEvaluatedAt` was computed under. */
79
+ readonly jobRevision?: number;
80
+ /** A run of this job that has not finished (or a fire queued but not started). */
81
+ readonly activeRun?: {
82
+ readonly status: 'queued' | 'running' | 'awaiting-approval';
83
+ };
84
+ /** Provider asked to be left alone until this instant. */
85
+ readonly quotaHoldUntil?: string;
86
+ }
87
+ export interface ScheduleObservedGap {
88
+ readonly from: Date;
89
+ readonly to: Date;
90
+ readonly kind: 'asleep' | 'clock-forward' | 'clock-backward';
91
+ }
92
+ export interface ScheduleEvaluationInput {
93
+ readonly job: ScheduleEvaluationJob;
94
+ readonly state: ScheduleEvaluationState;
95
+ readonly now: Date;
96
+ /** When this daemon instance started, and a gap it observed itself. */
97
+ readonly daemon: {
98
+ readonly startedAt: Date;
99
+ readonly observedGap?: ScheduleObservedGap;
100
+ };
101
+ /** How late a fire may be and still count as on time; default {@link SCHEDULE_LATE_GRACE_MS}. */
102
+ readonly lateGraceMs?: number;
103
+ /** Whether an occurrence key was already started (claimed) by someone. */
104
+ readonly isClaimed?: (key: string) => boolean;
105
+ }
106
+ export type ScheduleFireTrigger = 'scheduled' | 'late' | 'catch-up';
107
+ /** What to do about one job now. May grow in a minor release. */
108
+ export interface ScheduleDecision {
109
+ readonly fire?: {
110
+ /** Occurrence key: the scheduled instant in epoch milliseconds. */
111
+ readonly key: string;
112
+ readonly scheduledFor: Date;
113
+ readonly trigger: ScheduleFireTrigger;
114
+ };
115
+ /** Occurrences that will not run, collapsed: one entry per reason. */
116
+ readonly skip: readonly {
117
+ readonly scheduledFor: Date;
118
+ readonly reason: ScheduleSkipReason;
119
+ readonly count: number;
120
+ }[];
121
+ readonly missed?: {
122
+ readonly from: Date;
123
+ readonly to: Date;
124
+ readonly count: number;
125
+ /** The count stopped at the cap; the real number is at least `count`. */
126
+ readonly capped: boolean;
127
+ readonly reason: ScheduleMissedReason;
128
+ };
129
+ readonly jobTransition?: 'completed' | 'expired';
130
+ readonly nextState: {
131
+ readonly lastEvaluatedAt: Date;
132
+ readonly nextFireAt?: Date;
133
+ readonly jobRevision: number;
134
+ };
135
+ }
136
+ /** How occurrences in a window were counted. */
137
+ export interface OccurrenceCount {
138
+ readonly count: number;
139
+ /** The count stopped at the cap. */
140
+ readonly capped: boolean;
141
+ readonly first?: Date;
142
+ readonly latest?: Date;
143
+ }
144
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/schedules/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Types of the schedule time engine and evaluator.
3
+ *
4
+ * The SDK owns WHEN something is due and nothing about how a host stores a
5
+ * job or runs it: the CLI keeps its job files, claims and history records to
6
+ * itself, so its on-disk format is not SDK API. The unions exported here
7
+ * (`ScheduleDecision`, `ScheduleSkipReason`, `ScheduleMissedReason`) may grow
8
+ * in a minor release; switch over them with a `default:` branch.
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/schedules/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Time-zone arithmetic over `Intl` alone.
3
+ *
4
+ * The SDK carries no time-zone database of its own: the runtime's ICU data is
5
+ * the source, read through `Intl.DateTimeFormat#formatToParts`. Everything in
6
+ * this file is expressed in "wall" milliseconds — a local date and time
7
+ * written as if it were UTC (`Date.UTC(y, m - 1, d, h, min)`) — so local
8
+ * arithmetic is plain integer arithmetic and only the conversions touch Intl.
9
+ */
10
+ /**
11
+ * Throw unless `tz` is an IANA zone this runtime knows. Returns the zone as
12
+ * the runtime spells it (`europe/istanbul` → `Europe/Istanbul`).
13
+ */
14
+ export declare function validateTimeZone(tz: string): string;
15
+ /** The zone this host is in, as the runtime reports it. */
16
+ export declare function hostTimeZone(): string;
17
+ /** The wall clock of `instant` in `tz`, as wall milliseconds (seconds dropped). */
18
+ export declare function wallOf(instant: number, tz: string): number;
19
+ /** `tz`'s offset from UTC at `instant`, in milliseconds, minute precision. */
20
+ export declare function offsetAt(instant: number, tz: string): number;
21
+ /**
22
+ * Every instant whose wall clock in `tz` reads `wall`.
23
+ *
24
+ * One instant normally, two in the hour a fall-back repeats (earliest first),
25
+ * none in the hour a spring-forward skips.
26
+ */
27
+ export declare function instantsForWall(wall: number, tz: string): number[];
28
+ /**
29
+ * The first instant whose wall clock is later than `wall`, for a `wall` that
30
+ * falls inside a spring-forward gap: the moment the clocks jumped.
31
+ */
32
+ export declare function firstInstantAfterGap(wall: number, tz: string): number;
33
+ /** Civil date parts of a wall value. */
34
+ export declare function civil(wall: number): {
35
+ year: number;
36
+ month: number;
37
+ day: number;
38
+ hour: number;
39
+ minute: number;
40
+ weekday: number;
41
+ };
42
+ /** `YYYY-MM-DD HH:MM` for an instant in `tz`. */
43
+ export declare function formatWall(instant: number, tz: string): string;
44
+ //# sourceMappingURL=tz.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tz.d.ts","sourceRoot":"","sources":["../../src/schedules/tz.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA2BH;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CASnD;AAED,2DAA2D;AAC3D,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,mFAAmF;AACnF,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CA2B1D;AAED,8EAA8E;AAC9E,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAG5D;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,CAYlE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAYrE;AAED,wCAAwC;AACxC,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG;IACpC,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;CACf,CAUA;AAED,iDAAiD;AACjD,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAI9D"}
@@ -0,0 +1,141 @@
1
+ /**
2
+ * Time-zone arithmetic over `Intl` alone.
3
+ *
4
+ * The SDK carries no time-zone database of its own: the runtime's ICU data is
5
+ * the source, read through `Intl.DateTimeFormat#formatToParts`. Everything in
6
+ * this file is expressed in "wall" milliseconds — a local date and time
7
+ * written as if it were UTC (`Date.UTC(y, m - 1, d, h, min)`) — so local
8
+ * arithmetic is plain integer arithmetic and only the conversions touch Intl.
9
+ */
10
+ import { ScheduleValidationError } from './errors.js';
11
+ const MINUTE = 60_000;
12
+ const HOUR = 60 * MINUTE;
13
+ const formatters = new Map();
14
+ function formatterFor(tz) {
15
+ let f = formatters.get(tz);
16
+ if (!f) {
17
+ f = new Intl.DateTimeFormat('en-US', {
18
+ timeZone: tz,
19
+ hourCycle: 'h23',
20
+ year: 'numeric',
21
+ month: 'numeric',
22
+ day: 'numeric',
23
+ hour: 'numeric',
24
+ minute: 'numeric',
25
+ second: 'numeric',
26
+ });
27
+ formatters.set(tz, f);
28
+ }
29
+ return f;
30
+ }
31
+ /**
32
+ * Throw unless `tz` is an IANA zone this runtime knows. Returns the zone as
33
+ * the runtime spells it (`europe/istanbul` → `Europe/Istanbul`).
34
+ */
35
+ export function validateTimeZone(tz) {
36
+ if (typeof tz !== 'string' || tz.trim() === '') {
37
+ throw new ScheduleValidationError('a time zone is required', String(tz));
38
+ }
39
+ try {
40
+ return new Intl.DateTimeFormat('en-US', { timeZone: tz.trim() }).resolvedOptions().timeZone;
41
+ }
42
+ catch {
43
+ throw new ScheduleValidationError(`unknown time zone "${tz}"`, tz);
44
+ }
45
+ }
46
+ /** The zone this host is in, as the runtime reports it. */
47
+ export function hostTimeZone() {
48
+ return Intl.DateTimeFormat().resolvedOptions().timeZone || 'UTC';
49
+ }
50
+ /** The wall clock of `instant` in `tz`, as wall milliseconds (seconds dropped). */
51
+ export function wallOf(instant, tz) {
52
+ const parts = formatterFor(tz).formatToParts(new Date(instant));
53
+ let year = 0;
54
+ let month = 1;
55
+ let day = 1;
56
+ let hour = 0;
57
+ let minute = 0;
58
+ for (const part of parts) {
59
+ switch (part.type) {
60
+ case 'year':
61
+ year = Number(part.value);
62
+ break;
63
+ case 'month':
64
+ month = Number(part.value);
65
+ break;
66
+ case 'day':
67
+ day = Number(part.value);
68
+ break;
69
+ case 'hour':
70
+ hour = Number(part.value) % 24;
71
+ break;
72
+ case 'minute':
73
+ minute = Number(part.value);
74
+ break;
75
+ }
76
+ }
77
+ return Date.UTC(year, month - 1, day, hour, minute);
78
+ }
79
+ /** `tz`'s offset from UTC at `instant`, in milliseconds, minute precision. */
80
+ export function offsetAt(instant, tz) {
81
+ const floored = Math.floor(instant / MINUTE) * MINUTE;
82
+ return wallOf(floored, tz) - floored;
83
+ }
84
+ /**
85
+ * Every instant whose wall clock in `tz` reads `wall`.
86
+ *
87
+ * One instant normally, two in the hour a fall-back repeats (earliest first),
88
+ * none in the hour a spring-forward skips.
89
+ */
90
+ export function instantsForWall(wall, tz) {
91
+ const offsets = new Set([
92
+ offsetAt(wall - 26 * HOUR, tz),
93
+ offsetAt(wall, tz),
94
+ offsetAt(wall + 26 * HOUR, tz),
95
+ ]);
96
+ const found = new Set();
97
+ for (const offset of offsets) {
98
+ const candidate = wall - offset;
99
+ if (wallOf(candidate, tz) === wall)
100
+ found.add(candidate);
101
+ }
102
+ return [...found].sort((a, b) => a - b);
103
+ }
104
+ /**
105
+ * The first instant whose wall clock is later than `wall`, for a `wall` that
106
+ * falls inside a spring-forward gap: the moment the clocks jumped.
107
+ */
108
+ export function firstInstantAfterGap(wall, tz) {
109
+ const a = offsetAt(wall - 26 * HOUR, tz);
110
+ const b = offsetAt(wall + 26 * HOUR, tz);
111
+ let lo = Math.floor((wall - Math.max(a, b)) / MINUTE);
112
+ let hi = Math.ceil((wall - Math.min(a, b)) / MINUTE);
113
+ // Smallest minute m in [lo, hi] with wallOf(m) > wall.
114
+ while (lo < hi) {
115
+ const mid = Math.floor((lo + hi) / 2);
116
+ if (wallOf(mid * MINUTE, tz) > wall)
117
+ hi = mid;
118
+ else
119
+ lo = mid + 1;
120
+ }
121
+ return lo * MINUTE;
122
+ }
123
+ /** Civil date parts of a wall value. */
124
+ export function civil(wall) {
125
+ const d = new Date(wall);
126
+ return {
127
+ year: d.getUTCFullYear(),
128
+ month: d.getUTCMonth() + 1,
129
+ day: d.getUTCDate(),
130
+ hour: d.getUTCHours(),
131
+ minute: d.getUTCMinutes(),
132
+ weekday: d.getUTCDay(),
133
+ };
134
+ }
135
+ /** `YYYY-MM-DD HH:MM` for an instant in `tz`. */
136
+ export function formatWall(instant, tz) {
137
+ const c = civil(wallOf(instant, tz));
138
+ const p = (n) => String(n).padStart(2, '0');
139
+ return `${c.year}-${p(c.month)}-${p(c.day)} ${p(c.hour)}:${p(c.minute)}`;
140
+ }
141
+ //# sourceMappingURL=tz.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tz.js","sourceRoot":"","sources":["../../src/schedules/tz.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- export { loadSkill, discoverSkills } from './loader.js';
1
+ export { SKILL_FRONTMATTER_KEYS, loadSkill, discoverSkills } from './loader.js';
2
2
  export { SkillRegistry, resolveSkillChain } from './registry.js';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AACvD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC/E,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA"}
@@ -1,3 +1,3 @@
1
- export { loadSkill, discoverSkills } from './loader.js';
1
+ export { SKILL_FRONTMATTER_KEYS, loadSkill, discoverSkills } from './loader.js';
2
2
  export { SkillRegistry, resolveSkillChain } from './registry.js';
3
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AACvD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC/E,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA"}
@@ -1,6 +1,27 @@
1
1
  import type { SkillDisclosureLevel, SkillLoadResult } from '../types/skills/index.js';
2
2
  import { type Logger } from '../utils/logger.js';
3
3
  export declare const SKILL_FILENAME = "SKILL.md";
4
+ /**
5
+ * The frontmatter keys this loader reads.
6
+ *
7
+ * Every other key is skipped whole, whatever YAML it is written in, so a
8
+ * skill written for another agent — `argument-hint: [file]`, a `hooks:`
9
+ * block, `user-invocable: false` — loads here with those fields ignored
10
+ * instead of being refused over syntax in a field nothing reads. The keys
11
+ * listed are still parsed strictly: a value this loader USES is never read
12
+ * wrongly.
13
+ */
14
+ export declare const SKILL_FRONTMATTER_KEYS: readonly string[];
15
+ /**
16
+ * How this loader reads frontmatter. `allowed-tools` may be a YAML list: the
17
+ * Agent Skills format writes it space-separated, comma-separated or as a
18
+ * list, and all three must mean the same grant; the reader joins a list into
19
+ * the comma form. Keys the loader does not read are skipped whole.
20
+ */
21
+ export declare const SKILL_FRONTMATTER_OPTIONS: {
22
+ readonly lists: readonly ["allowed-tools"];
23
+ readonly readsKey: (key: string) => boolean;
24
+ };
4
25
  export declare function loadSkill(dirPath: string, level?: SkillDisclosureLevel, log?: Logger): Promise<SkillLoadResult>;
5
26
  export declare function discoverSkills(parentDir: string, log?: Logger): Promise<string[]>;
6
27
  //# sourceMappingURL=loader.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/skills/loader.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEX,oBAAoB,EACpB,eAAe,EAEf,MAAM,0BAA0B,CAAA;AAGjC,OAAO,EAAE,KAAK,MAAM,EAAiB,MAAM,oBAAoB,CAAA;AAE/D,eAAO,MAAM,cAAc,aAAa,CAAA;AAuIxC,wBAAsB,SAAS,CAC9B,OAAO,EAAE,MAAM,EACf,KAAK,GAAE,oBAAiC,EACxC,GAAG,CAAC,EAAE,MAAM,GACV,OAAO,CAAC,eAAe,CAAC,CAwC1B;AAED,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAyBvF"}
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/skills/loader.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEX,oBAAoB,EACpB,eAAe,EAEf,MAAM,0BAA0B,CAAA;AAGjC,OAAO,EAAE,KAAK,MAAM,EAAiB,MAAM,oBAAoB,CAAA;AAE/D,eAAO,MAAM,cAAc,aAAa,CAAA;AAExC;;;;;;;;;GASG;AACH,eAAO,MAAM,sBAAsB,EAAE,SAAS,MAAM,EASlD,CAAA;AAIF;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB;;6BARR,MAAM,KAAG,OAAO;CAWpC,CAAA;AA+JV,wBAAsB,SAAS,CAC9B,OAAO,EAAE,MAAM,EACf,KAAK,GAAE,oBAAiC,EACxC,GAAG,CAAC,EAAE,MAAM,GACV,OAAO,CAAC,eAAe,CAAC,CAwC1B;AAED,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAyBvF"}
@@ -4,6 +4,37 @@ import { parseFrontmatter } from '../utils/frontmatter.js';
4
4
  import { SCOPE_ATTRIBUTE } from '../utils/log/types.js';
5
5
  import { resolveLogger } from '../utils/logger.js';
6
6
  export const SKILL_FILENAME = 'SKILL.md';
7
+ /**
8
+ * The frontmatter keys this loader reads.
9
+ *
10
+ * Every other key is skipped whole, whatever YAML it is written in, so a
11
+ * skill written for another agent — `argument-hint: [file]`, a `hooks:`
12
+ * block, `user-invocable: false` — loads here with those fields ignored
13
+ * instead of being refused over syntax in a field nothing reads. The keys
14
+ * listed are still parsed strictly: a value this loader USES is never read
15
+ * wrongly.
16
+ */
17
+ export const SKILL_FRONTMATTER_KEYS = Object.freeze([
18
+ 'name',
19
+ 'description',
20
+ 'license',
21
+ 'compatibility',
22
+ 'allowed-tools',
23
+ 'invocation',
24
+ 'disable-model-invocation',
25
+ 'metadata',
26
+ ]);
27
+ const READS_SKILL_KEY = (key) => SKILL_FRONTMATTER_KEYS.includes(key);
28
+ /**
29
+ * How this loader reads frontmatter. `allowed-tools` may be a YAML list: the
30
+ * Agent Skills format writes it space-separated, comma-separated or as a
31
+ * list, and all three must mean the same grant; the reader joins a list into
32
+ * the comma form. Keys the loader does not read are skipped whole.
33
+ */
34
+ export const SKILL_FRONTMATTER_OPTIONS = {
35
+ lists: ['allowed-tools'],
36
+ readsKey: READS_SKILL_KEY,
37
+ };
7
38
  /**
8
39
  * How this file's errors name themselves. Passed to the shared reader so a
9
40
  * frontmatter failure still reads as a `SKILL.md` failure — the reader is
@@ -80,6 +111,25 @@ function toSkillMetadata(parsed, dirPath) {
80
111
  }
81
112
  skillMetadata.invocation = invocation;
82
113
  }
114
+ // The other common spelling of "the model may not pick this":
115
+ // `disable-model-invocation: true` is `invocation: operator`. Read here,
116
+ // at the one parser, so a registry that re-reads the file on every load
117
+ // cannot lose it — a host-side override would be dropped by the first
118
+ // freshness reload and the model could then load an operator-only skill.
119
+ const disableModel = scalarAt(values, 'disable-model-invocation');
120
+ if (disableModel !== undefined) {
121
+ if (disableModel !== 'true' && disableModel !== 'false') {
122
+ // Refused for the reason `invocation` is: `yes` quietly reading as
123
+ // "not disabled" would put the skill back in front of the model.
124
+ throw new Error(`${source}: disable-model-invocation must be true or false — got "${disableModel}"`);
125
+ }
126
+ if (disableModel === 'true') {
127
+ if (skillMetadata.invocation !== undefined && skillMetadata.invocation !== 'operator') {
128
+ throw new Error(`${source}: disable-model-invocation: true contradicts invocation: ${skillMetadata.invocation}`);
129
+ }
130
+ skillMetadata.invocation = 'operator';
131
+ }
132
+ }
83
133
  const extra = mappingAt(values, 'metadata');
84
134
  if (extra && Object.keys(extra).length > 0) {
85
135
  skillMetadata.metadata = { ...extra };
@@ -114,7 +164,7 @@ function estimateTokens(text) {
114
164
  export async function loadSkill(dirPath, level = 'metadata', log) {
115
165
  const skillMdPath = join(dirPath, SKILL_FILENAME);
116
166
  const raw = await readFile(skillMdPath, 'utf-8');
117
- const parsed = parseFrontmatter(raw, sourceLabel(dirPath));
167
+ const parsed = parseFrontmatter(raw, sourceLabel(dirPath), SKILL_FRONTMATTER_OPTIONS);
118
168
  const metadata = toSkillMetadata(parsed, dirPath);
119
169
  const skill = {
120
170
  metadata,
@@ -1 +1 @@
1
- {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/skills/loader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/skills/loader.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../../src/tools/builtins/bash.ts"],"names":[],"mappings":"AA2RA,6GAA6G;AAC7G,eAAO,MAAM,qBAAqB,4NACwL,CAAA;AAE1N;;;GAGG;AACH,eAAO,MAAM,2BAA2B,sSAC4P,CAAA;AAEpS,eAAO,MAAM,QAAQ;;;;;EA8PnB,CAAA"}
1
+ {"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../../src/tools/builtins/bash.ts"],"names":[],"mappings":"AAwSA,6GAA6G;AAC7G,eAAO,MAAM,qBAAqB,4NACwL,CAAA;AAE1N;;;GAGG;AACH,eAAO,MAAM,2BAA2B,sSAC4P,CAAA;AAEpS,eAAO,MAAM,QAAQ;;;;;EAmQnB,CAAA"}
@@ -6,6 +6,7 @@ import { DANGEROUS_PATTERNS } from '../../constants/tools/index.js';
6
6
  import { killTree } from '../../process/kill-tree.js';
7
7
  import { subscribeToAbort } from '../../utils/abort.js';
8
8
  import { readPositiveIntEnv } from '../../utils/env.js';
9
+ import { bashToolDialect, hostShellSpawn, sandboxShellSpawn, withoutBashStartup, } from '../command-shell.js';
9
10
  import { defineTool } from '../defineTool.js';
10
11
  import { scrubInheritedEnv } from '../env-scrub.js';
11
12
  // Namzu owns its own bash timeout knob — `NAMZU_BASH_TIMEOUT_MS`.
@@ -115,13 +116,19 @@ function shellProgress(report) {
115
116
  function execHostShell(command, options) {
116
117
  options.signal?.throwIfAborted();
117
118
  return new Promise((resolve, reject) => {
118
- const child = spawn(command, {
119
+ // bash where the host has it, `/bin/sh` where it does not; the
120
+ // permission rules read the line in the matching dialect. See
121
+ // `../command-shell.ts`.
122
+ const shell = hostShellSpawn(command, options.env);
123
+ const spawnOptions = {
119
124
  cwd: options.cwd,
120
- env: options.env,
121
- shell: true,
125
+ env: shell.env,
122
126
  // killTree's negative PID must never target the caller's own group.
123
127
  detached: process.platform !== 'win32',
124
- });
128
+ };
129
+ const child = shell.file === undefined
130
+ ? spawn(command, { ...spawnOptions, shell: true })
131
+ : spawn(shell.file, [...shell.args], spawnOptions);
125
132
  const captures = {
126
133
  stdout: {
127
134
  chunks: [],
@@ -262,6 +269,8 @@ export const BashTool = defineTool({
262
269
  // so a permission rule about it is a rule about several commands more often
263
270
  // than not. Naming the argument is what lets the gate read it that way.
264
271
  commandArgument: 'command',
272
+ // The shell that runs it, so the rules read the line as that shell will.
273
+ commandDialect: bashToolDialect,
265
274
  // The kernel reviews a call that sets it under a sandbox every time and
266
275
  // confirms it only by id; see `ToolDefinition.sandboxEscapeArgument`.
267
276
  sandboxEscapeArgument: 'dangerously_disable_sandbox',
@@ -369,9 +378,12 @@ export const BashTool = defineTool({
369
378
  // builtin doesn't have that requirement today.
370
379
  const onOutput = shellProgress(context.report);
371
380
  if (context.sandbox && !leaveSandbox) {
372
- const result = await context.sandbox.exec('/bin/sh', ['-c', input.command], {
381
+ // bash if the guest has it, `/bin/sh` if not; read in the `sh`
382
+ // dialect, which holds for both.
383
+ const launch = sandboxShellSpawn(input.command);
384
+ const result = await context.sandbox.exec(launch.file, launch.args, {
373
385
  timeout: input.timeout,
374
- env: context.env,
386
+ ...(context.env ? { env: withoutBashStartup(context.env) } : {}),
375
387
  // Same reason as the host path below: a Stop must reach the
376
388
  // process, not just the promise waiting on it.
377
389
  signal: context.abortSignal,