@archmax-ai/harness 0.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 (351) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +219 -0
  3. package/dist/agent.d.ts +174 -0
  4. package/dist/agent.js +140 -0
  5. package/dist/agent.js.map +1 -0
  6. package/dist/assembly/compose.d.ts +170 -0
  7. package/dist/assembly/compose.js +391 -0
  8. package/dist/assembly/compose.js.map +1 -0
  9. package/dist/assembly/delegation-registry.d.ts +5 -0
  10. package/dist/assembly/delegation-registry.js +118 -0
  11. package/dist/assembly/delegation-registry.js.map +1 -0
  12. package/dist/assembly/index.d.ts +192 -0
  13. package/dist/assembly/index.js +265 -0
  14. package/dist/assembly/index.js.map +1 -0
  15. package/dist/assembly/plain.d.ts +7 -0
  16. package/dist/assembly/plain.js +41 -0
  17. package/dist/assembly/plain.js.map +1 -0
  18. package/dist/authoring-skill/archmax-harness/README.md +76 -0
  19. package/dist/authoring-skill/archmax-harness/SKILL.md +241 -0
  20. package/dist/authoring-skill/archmax-harness/references/backend-integration.md +626 -0
  21. package/dist/authoring-skill/archmax-harness/references/cases.md +41 -0
  22. package/dist/authoring-skill/archmax-harness/references/diagnostics.md +51 -0
  23. package/dist/authoring-skill/archmax-harness/references/hook-and-test-scripts.md +1070 -0
  24. package/dist/authoring-skill/archmax-harness/references/hooks-and-scripts.md +82 -0
  25. package/dist/authoring-skill/archmax-harness/references/wiring.md +101 -0
  26. package/dist/authoring-skill/archmax-harness/references/workflow-schema.md +1631 -0
  27. package/dist/authoring-skill/archmax-harness/references/workflow-yaml.md +241 -0
  28. package/dist/behaviour/support.d.ts +232 -0
  29. package/dist/behaviour/support.js +339 -0
  30. package/dist/behaviour/support.js.map +1 -0
  31. package/dist/cli/banner.d.ts +11 -0
  32. package/dist/cli/banner.js +29 -0
  33. package/dist/cli/banner.js.map +1 -0
  34. package/dist/cli/bootstrap.d.ts +33 -0
  35. package/dist/cli/bootstrap.js +153 -0
  36. package/dist/cli/bootstrap.js.map +1 -0
  37. package/dist/cli/command.d.ts +39 -0
  38. package/dist/cli/command.js +97 -0
  39. package/dist/cli/command.js.map +1 -0
  40. package/dist/cli/state-flow.d.ts +46 -0
  41. package/dist/cli/state-flow.js +268 -0
  42. package/dist/cli/state-flow.js.map +1 -0
  43. package/dist/cli/style.d.ts +41 -0
  44. package/dist/cli/style.js +64 -0
  45. package/dist/cli/style.js.map +1 -0
  46. package/dist/cli/turn.d.ts +41 -0
  47. package/dist/cli/turn.js +161 -0
  48. package/dist/cli/turn.js.map +1 -0
  49. package/dist/cli.d.ts +10 -0
  50. package/dist/cli.js +426 -0
  51. package/dist/cli.js.map +1 -0
  52. package/dist/core/code-description.d.ts +22 -0
  53. package/dist/core/code-description.js +38 -0
  54. package/dist/core/code-description.js.map +1 -0
  55. package/dist/core/deepagents.d.ts +183 -0
  56. package/dist/core/deepagents.js +128 -0
  57. package/dist/core/deepagents.js.map +1 -0
  58. package/dist/core/events.d.ts +350 -0
  59. package/dist/core/events.js +205 -0
  60. package/dist/core/events.js.map +1 -0
  61. package/dist/core/frontmatter.d.ts +15 -0
  62. package/dist/core/frontmatter.js +32 -0
  63. package/dist/core/frontmatter.js.map +1 -0
  64. package/dist/core/listing-redact.d.ts +37 -0
  65. package/dist/core/listing-redact.js +88 -0
  66. package/dist/core/listing-redact.js.map +1 -0
  67. package/dist/core/match.d.ts +26 -0
  68. package/dist/core/match.js +75 -0
  69. package/dist/core/match.js.map +1 -0
  70. package/dist/core/message-readers.d.ts +84 -0
  71. package/dist/core/message-readers.js +159 -0
  72. package/dist/core/message-readers.js.map +1 -0
  73. package/dist/core/messages.d.ts +49 -0
  74. package/dist/core/messages.js +85 -0
  75. package/dist/core/messages.js.map +1 -0
  76. package/dist/core/mount-prompt.d.ts +28 -0
  77. package/dist/core/mount-prompt.js +55 -0
  78. package/dist/core/mount-prompt.js.map +1 -0
  79. package/dist/core/mount-redact.d.ts +28 -0
  80. package/dist/core/mount-redact.js +32 -0
  81. package/dist/core/mount-redact.js.map +1 -0
  82. package/dist/core/mounts.d.ts +88 -0
  83. package/dist/core/mounts.js +147 -0
  84. package/dist/core/mounts.js.map +1 -0
  85. package/dist/core/path-mapping.d.ts +52 -0
  86. package/dist/core/path-mapping.js +113 -0
  87. package/dist/core/path-mapping.js.map +1 -0
  88. package/dist/core/platform-prompt.generated.d.ts +2 -0
  89. package/dist/core/platform-prompt.generated.js +4 -0
  90. package/dist/core/platform-prompt.generated.js.map +1 -0
  91. package/dist/core/prompt.d.ts +42 -0
  92. package/dist/core/prompt.js +75 -0
  93. package/dist/core/prompt.js.map +1 -0
  94. package/dist/core/session-id.d.ts +38 -0
  95. package/dist/core/session-id.js +61 -0
  96. package/dist/core/session-id.js.map +1 -0
  97. package/dist/core/session-store.d.ts +85 -0
  98. package/dist/core/session-store.js +149 -0
  99. package/dist/core/session-store.js.map +1 -0
  100. package/dist/core/session-zone.d.ts +54 -0
  101. package/dist/core/session-zone.js +82 -0
  102. package/dist/core/session-zone.js.map +1 -0
  103. package/dist/core/skill-prompt.d.ts +31 -0
  104. package/dist/core/skill-prompt.js +54 -0
  105. package/dist/core/skill-prompt.js.map +1 -0
  106. package/dist/core/skill-redact.d.ts +15 -0
  107. package/dist/core/skill-redact.js +27 -0
  108. package/dist/core/skill-redact.js.map +1 -0
  109. package/dist/core/skills.d.ts +172 -0
  110. package/dist/core/skills.js +214 -0
  111. package/dist/core/skills.js.map +1 -0
  112. package/dist/core/tool-mocks.d.ts +23 -0
  113. package/dist/core/tool-mocks.js +39 -0
  114. package/dist/core/tool-mocks.js.map +1 -0
  115. package/dist/core/tool-telemetry.d.ts +16 -0
  116. package/dist/core/tool-telemetry.js +40 -0
  117. package/dist/core/tool-telemetry.js.map +1 -0
  118. package/dist/core/usage.d.ts +114 -0
  119. package/dist/core/usage.js +226 -0
  120. package/dist/core/usage.js.map +1 -0
  121. package/dist/core/workspace-context.d.ts +136 -0
  122. package/dist/core/workspace-context.js +178 -0
  123. package/dist/core/workspace-context.js.map +1 -0
  124. package/dist/core/workspace-prompt.d.ts +7 -0
  125. package/dist/core/workspace-prompt.js +102 -0
  126. package/dist/core/workspace-prompt.js.map +1 -0
  127. package/dist/core/workspace-router.d.ts +61 -0
  128. package/dist/core/workspace-router.js +145 -0
  129. package/dist/core/workspace-router.js.map +1 -0
  130. package/dist/core/workspace.d.ts +85 -0
  131. package/dist/core/workspace.js +193 -0
  132. package/dist/core/workspace.js.map +1 -0
  133. package/dist/core/zones.d.ts +181 -0
  134. package/dist/core/zones.js +202 -0
  135. package/dist/core/zones.js.map +1 -0
  136. package/dist/env.d.ts +99 -0
  137. package/dist/env.js +271 -0
  138. package/dist/env.js.map +1 -0
  139. package/dist/index.d.ts +265 -0
  140. package/dist/index.js +197 -0
  141. package/dist/index.js.map +1 -0
  142. package/dist/kernel/kernel.d.ts +192 -0
  143. package/dist/kernel/kernel.js +751 -0
  144. package/dist/kernel/kernel.js.map +1 -0
  145. package/dist/lifecycle/hook-shape.d.ts +44 -0
  146. package/dist/lifecycle/hook-shape.js +66 -0
  147. package/dist/lifecycle/hook-shape.js.map +1 -0
  148. package/dist/lifecycle/runner.d.ts +177 -0
  149. package/dist/lifecycle/runner.js +372 -0
  150. package/dist/lifecycle/runner.js.map +1 -0
  151. package/dist/lifecycle/transcript.d.ts +27 -0
  152. package/dist/lifecycle/transcript.js +43 -0
  153. package/dist/lifecycle/transcript.js.map +1 -0
  154. package/dist/machine/allow.d.ts +65 -0
  155. package/dist/machine/allow.js +107 -0
  156. package/dist/machine/allow.js.map +1 -0
  157. package/dist/machine/delegation.d.ts +9 -0
  158. package/dist/machine/delegation.js +10 -0
  159. package/dist/machine/delegation.js.map +1 -0
  160. package/dist/machine/diagnostic.d.ts +14 -0
  161. package/dist/machine/diagnostic.js +2 -0
  162. package/dist/machine/diagnostic.js.map +1 -0
  163. package/dist/machine/lint-spec.d.ts +4 -0
  164. package/dist/machine/lint-spec.js +266 -0
  165. package/dist/machine/lint-spec.js.map +1 -0
  166. package/dist/machine/load-spec.d.ts +90 -0
  167. package/dist/machine/load-spec.js +120 -0
  168. package/dist/machine/load-spec.js.map +1 -0
  169. package/dist/machine/machine.d.ts +273 -0
  170. package/dist/machine/machine.js +551 -0
  171. package/dist/machine/machine.js.map +1 -0
  172. package/dist/machine/mount-grants.d.ts +25 -0
  173. package/dist/machine/mount-grants.js +24 -0
  174. package/dist/machine/mount-grants.js.map +1 -0
  175. package/dist/machine/slug.d.ts +14 -0
  176. package/dist/machine/slug.js +17 -0
  177. package/dist/machine/slug.js.map +1 -0
  178. package/dist/machine/spec-schema.d.ts +662 -0
  179. package/dist/machine/spec-schema.js +717 -0
  180. package/dist/machine/spec-schema.js.map +1 -0
  181. package/dist/machine/tool-names.d.ts +98 -0
  182. package/dist/machine/tool-names.js +144 -0
  183. package/dist/machine/tool-names.js.map +1 -0
  184. package/dist/machine/triggers.d.ts +114 -0
  185. package/dist/machine/triggers.js +165 -0
  186. package/dist/machine/triggers.js.map +1 -0
  187. package/dist/machine/types.d.ts +186 -0
  188. package/dist/machine/types.js +12 -0
  189. package/dist/machine/types.js.map +1 -0
  190. package/dist/machine/validate-spec.d.ts +42 -0
  191. package/dist/machine/validate-spec.js +29 -0
  192. package/dist/machine/validate-spec.js.map +1 -0
  193. package/dist/machine/variables.d.ts +196 -0
  194. package/dist/machine/variables.js +415 -0
  195. package/dist/machine/variables.js.map +1 -0
  196. package/dist/public/cli.d.ts +15 -0
  197. package/dist/public/cli.js +14 -0
  198. package/dist/public/cli.js.map +1 -0
  199. package/dist/public/messages.d.ts +33 -0
  200. package/dist/public/messages.js +33 -0
  201. package/dist/public/messages.js.map +1 -0
  202. package/dist/public/sandbox.d.ts +99 -0
  203. package/dist/public/sandbox.js +32 -0
  204. package/dist/public/sandbox.js.map +1 -0
  205. package/dist/public/spec.d.ts +147 -0
  206. package/dist/public/spec.js +149 -0
  207. package/dist/public/spec.js.map +1 -0
  208. package/dist/public/testing.d.ts +71 -0
  209. package/dist/public/testing.js +39 -0
  210. package/dist/public/testing.js.map +1 -0
  211. package/dist/rubrics/rubrics.d.ts +135 -0
  212. package/dist/rubrics/rubrics.js +145 -0
  213. package/dist/rubrics/rubrics.js.map +1 -0
  214. package/dist/runtime/contract.d.ts +73 -0
  215. package/dist/runtime/contract.js +96 -0
  216. package/dist/runtime/contract.js.map +1 -0
  217. package/dist/sandbox/assets/parts/core.js +22 -0
  218. package/dist/sandbox/assets/parts/lifecycle-hook.js +47 -0
  219. package/dist/sandbox/bridge.d.ts +16 -0
  220. package/dist/sandbox/bridge.js +95 -0
  221. package/dist/sandbox/bridge.js.map +1 -0
  222. package/dist/sandbox/executor.d.ts +46 -0
  223. package/dist/sandbox/executor.js +119 -0
  224. package/dist/sandbox/executor.js.map +1 -0
  225. package/dist/sandbox/imports.d.ts +33 -0
  226. package/dist/sandbox/imports.js +67 -0
  227. package/dist/sandbox/imports.js.map +1 -0
  228. package/dist/sandbox/prelude.d.ts +12 -0
  229. package/dist/sandbox/prelude.js +51 -0
  230. package/dist/sandbox/prelude.js.map +1 -0
  231. package/dist/sandbox/ptc-gateway.d.ts +104 -0
  232. package/dist/sandbox/ptc-gateway.js +167 -0
  233. package/dist/sandbox/ptc-gateway.js.map +1 -0
  234. package/dist/sandbox/runtime.d.ts +59 -0
  235. package/dist/sandbox/runtime.js +51 -0
  236. package/dist/sandbox/runtime.js.map +1 -0
  237. package/dist/sandbox/tools.d.ts +34 -0
  238. package/dist/sandbox/tools.js +147 -0
  239. package/dist/sandbox/tools.js.map +1 -0
  240. package/dist/sessions/operations.d.ts +79 -0
  241. package/dist/sessions/operations.js +121 -0
  242. package/dist/sessions/operations.js.map +1 -0
  243. package/dist/sessions/resolve.d.ts +97 -0
  244. package/dist/sessions/resolve.js +145 -0
  245. package/dist/sessions/resolve.js.map +1 -0
  246. package/dist/sessions/resume.d.ts +242 -0
  247. package/dist/sessions/resume.js +288 -0
  248. package/dist/sessions/resume.js.map +1 -0
  249. package/dist/sessions/scope.d.ts +99 -0
  250. package/dist/sessions/scope.js +145 -0
  251. package/dist/sessions/scope.js.map +1 -0
  252. package/dist/sessions/summary.d.ts +65 -0
  253. package/dist/sessions/summary.js +56 -0
  254. package/dist/sessions/summary.js.map +1 -0
  255. package/dist/testing/assertions.d.ts +30 -0
  256. package/dist/testing/assertions.js +231 -0
  257. package/dist/testing/assertions.js.map +1 -0
  258. package/dist/testing/case-document.d.ts +141 -0
  259. package/dist/testing/case-document.js +51 -0
  260. package/dist/testing/case-document.js.map +1 -0
  261. package/dist/testing/case-schema.d.ts +29 -0
  262. package/dist/testing/case-schema.js +519 -0
  263. package/dist/testing/case-schema.js.map +1 -0
  264. package/dist/testing/discovery.d.ts +10 -0
  265. package/dist/testing/discovery.js +24 -0
  266. package/dist/testing/discovery.js.map +1 -0
  267. package/dist/testing/driver.d.ts +78 -0
  268. package/dist/testing/driver.js +117 -0
  269. package/dist/testing/driver.js.map +1 -0
  270. package/dist/testing/grade.d.ts +116 -0
  271. package/dist/testing/grade.js +261 -0
  272. package/dist/testing/grade.js.map +1 -0
  273. package/dist/testing/interpreter.d.ts +55 -0
  274. package/dist/testing/interpreter.js +103 -0
  275. package/dist/testing/interpreter.js.map +1 -0
  276. package/dist/testing/mock-middleware.d.ts +5 -0
  277. package/dist/testing/mock-middleware.js +33 -0
  278. package/dist/testing/mock-middleware.js.map +1 -0
  279. package/dist/testing/runner.d.ts +205 -0
  280. package/dist/testing/runner.js +266 -0
  281. package/dist/testing/runner.js.map +1 -0
  282. package/dist/testing/target.d.ts +27 -0
  283. package/dist/testing/target.js +21 -0
  284. package/dist/testing/target.js.map +1 -0
  285. package/dist/validate/validate.d.ts +41 -0
  286. package/dist/validate/validate.js +669 -0
  287. package/dist/validate/validate.js.map +1 -0
  288. package/dist/workflow/agent-tools.d.ts +10 -0
  289. package/dist/workflow/agent-tools.js +10 -0
  290. package/dist/workflow/agent-tools.js.map +1 -0
  291. package/dist/workflow/checkpointer.d.ts +52 -0
  292. package/dist/workflow/checkpointer.js +200 -0
  293. package/dist/workflow/checkpointer.js.map +1 -0
  294. package/dist/workflow/control-tools.d.ts +174 -0
  295. package/dist/workflow/control-tools.js +468 -0
  296. package/dist/workflow/control-tools.js.map +1 -0
  297. package/dist/workflow/governance.d.ts +104 -0
  298. package/dist/workflow/governance.js +546 -0
  299. package/dist/workflow/governance.js.map +1 -0
  300. package/dist/workflow/middleware.d.ts +85 -0
  301. package/dist/workflow/middleware.js +283 -0
  302. package/dist/workflow/middleware.js.map +1 -0
  303. package/dist/workflow/on-error.d.ts +25 -0
  304. package/dist/workflow/on-error.js +58 -0
  305. package/dist/workflow/on-error.js.map +1 -0
  306. package/dist/workflow/parks.d.ts +46 -0
  307. package/dist/workflow/parks.js +513 -0
  308. package/dist/workflow/parks.js.map +1 -0
  309. package/dist/workflow/paths.d.ts +67 -0
  310. package/dist/workflow/paths.js +108 -0
  311. package/dist/workflow/paths.js.map +1 -0
  312. package/dist/workflow/prompt-cache.d.ts +70 -0
  313. package/dist/workflow/prompt-cache.js +103 -0
  314. package/dist/workflow/prompt-cache.js.map +1 -0
  315. package/dist/workflow/prompt-pruning.d.ts +20 -0
  316. package/dist/workflow/prompt-pruning.js +83 -0
  317. package/dist/workflow/prompt-pruning.js.map +1 -0
  318. package/dist/workflow/render-prompt.d.ts +45 -0
  319. package/dist/workflow/render-prompt.js +140 -0
  320. package/dist/workflow/render-prompt.js.map +1 -0
  321. package/dist/workflow/runtime-config.d.ts +7 -0
  322. package/dist/workflow/runtime-config.js +9 -0
  323. package/dist/workflow/runtime-config.js.map +1 -0
  324. package/dist/workflow/session-artifacts.d.ts +90 -0
  325. package/dist/workflow/session-artifacts.js +134 -0
  326. package/dist/workflow/session-artifacts.js.map +1 -0
  327. package/dist/workflow/session-view.d.ts +31 -0
  328. package/dist/workflow/session-view.js +94 -0
  329. package/dist/workflow/session-view.js.map +1 -0
  330. package/dist/workflow/snapshot.d.ts +14 -0
  331. package/dist/workflow/snapshot.js +97 -0
  332. package/dist/workflow/snapshot.js.map +1 -0
  333. package/dist/workflow/state.d.ts +347 -0
  334. package/dist/workflow/state.js +322 -0
  335. package/dist/workflow/state.js.map +1 -0
  336. package/dist/workflow/sub-workflow.d.ts +174 -0
  337. package/dist/workflow/sub-workflow.js +392 -0
  338. package/dist/workflow/sub-workflow.js.map +1 -0
  339. package/dist/workflow/tool-service.d.ts +48 -0
  340. package/dist/workflow/tool-service.js +291 -0
  341. package/dist/workflow/tool-service.js.map +1 -0
  342. package/dist/workflow/turn-boundary.d.ts +39 -0
  343. package/dist/workflow/turn-boundary.js +128 -0
  344. package/dist/workflow/turn-boundary.js.map +1 -0
  345. package/dist/workflow/turn-runner.d.ts +40 -0
  346. package/dist/workflow/turn-runner.js +122 -0
  347. package/dist/workflow/turn-runner.js.map +1 -0
  348. package/dist/workflow/workflow-tools.d.ts +46 -0
  349. package/dist/workflow/workflow-tools.js +90 -0
  350. package/dist/workflow/workflow-tools.js.map +1 -0
  351. package/package.json +119 -0
@@ -0,0 +1,551 @@
1
+ import { createWorkflowEventEmitter } from "../core/events.js";
2
+ import { computeSpecHash } from "../workflow/snapshot.js";
3
+ import { normalizeHooks } from "../lifecycle/hook-shape.js";
4
+ import { argsSatisfy, normalizeAllowEntry, } from "./allow.js";
5
+ import { normalizeMountGrants } from "./mount-grants.js";
6
+ import { describeGlob } from "./variables.js";
7
+ import { loadMachineSpec } from "./load-spec.js";
8
+ import { MANUAL_TRIGGER, triggerBindings, } from "./triggers.js";
9
+ import { ADVANCE_TOOL, ALWAYS_ALLOWED_TOOLS, UNGRANTABLE_TOOLS, ESSENTIAL_TOOLS, GET_VARIABLES_TOOL, RESET_TOOL, SET_VARIABLES_TOOL, WAIT_TOOL, workflowSlugFromToolName, } from "./tool-names.js";
10
+ import { specDisabled, } from "./types.js";
11
+ export { ALWAYS_ALLOWED_TOOLS, ESSENTIAL_TOOLS, UNGRANTABLE_TOOLS };
12
+ /**
13
+ * A declared list, or nothing. `validate` builds a machine from a spec whose
14
+ * schema may have failed — so a governance key can hold a scalar or an object
15
+ * here — and reading one as empty keeps every resolver total instead of throwing
16
+ * mid-diagnostic.
17
+ */
18
+ function list(value) {
19
+ return Array.isArray(value) ? value : [];
20
+ }
21
+ /** Default per-eval timeout (ms) for interpreter and lifecycle scripts. */
22
+ const DEFAULT_TIMEOUT_MS = 15_000;
23
+ /**
24
+ * The compiled workflow: what the runtime consults for transitions, tool
25
+ * surfaces, enabled skills and trigger wiring. A pure view over the parsed
26
+ * `spec` — no workspace, no file access. Declarations are read off `spec`
27
+ * directly (`machine.spec.states[slug].instructions`); the methods here are the
28
+ * derived answers.
29
+ */
30
+ export class WorkflowMachine {
31
+ spec;
32
+ extraEssential;
33
+ /**
34
+ * The entry state: the `manual` start state, else the first declared start
35
+ * state, else the first declared state — so a machine always has one.
36
+ */
37
+ entry;
38
+ bindingsCache;
39
+ constructor(spec,
40
+ /**
41
+ * Host-declared tool names treated as essential — always disclosed and
42
+ * permitted in every state, exactly like the built-in {@link ESSENTIAL_TOOLS}.
43
+ */
44
+ extraEssential = new Set()) {
45
+ this.spec = spec;
46
+ this.extraEssential = extraEssential;
47
+ if (!spec.states || Object.keys(spec.states).length === 0) {
48
+ throw new Error("Invalid machine spec: missing states");
49
+ }
50
+ this.entry =
51
+ this.startStateForTrigger(MANUAL_TRIGGER) ??
52
+ this.startStates()[0]?.state ??
53
+ Object.keys(spec.states)[0];
54
+ }
55
+ /**
56
+ * Load the machine from its two files, or `null` when nothing loads to a
57
+ * usable machine. Load problems other than a missing file are emitted as
58
+ * `warning` events.
59
+ */
60
+ static async load(workspace, paths, onEvent) {
61
+ const emit = createWorkflowEventEmitter(onEvent);
62
+ const { spec, issues, lint, usable } = await loadMachineSpec(workspace, paths);
63
+ for (const issue of [...issues, ...lint]) {
64
+ if (issue.kind !== "missing") {
65
+ emit({ type: "warning", scope: "workflow", message: issue.message });
66
+ }
67
+ }
68
+ return usable && spec ? new WorkflowMachine(spec) : null;
69
+ }
70
+ /** Construct a machine from an already-parsed spec. */
71
+ static fromSpec(spec, extraEssentialTools) {
72
+ return new WorkflowMachine(spec, new Set(extraEssentialTools));
73
+ }
74
+ /**
75
+ * Stable content hash of the spec, written into a session's first checkpoint
76
+ * and compared on resume.
77
+ */
78
+ get specHash() {
79
+ return computeSpecHash(this.spec);
80
+ }
81
+ /** Whether this machine is out of service (see {@link specDisabled}). */
82
+ get disabled() {
83
+ return specDisabled(this.spec);
84
+ }
85
+ /** Runtime knobs from `settings`, defaults applied. */
86
+ get harnessSettings() {
87
+ const s = this.spec.settings ?? {};
88
+ return {
89
+ timeoutMs: s.timeoutMs ?? DEFAULT_TIMEOUT_MS,
90
+ memoryLimitBytes: s.memoryLimitBytes,
91
+ maxPtcCalls: s.maxPtcCalls,
92
+ maxResultChars: s.maxResultChars,
93
+ ...(s.prompt_cache
94
+ ? {
95
+ promptCache: {
96
+ ...(s.prompt_cache.enabled !== undefined ? { enabled: s.prompt_cache.enabled } : {}),
97
+ ...(s.prompt_cache.ttl !== undefined ? { ttl: s.prompt_cache.ttl } : {}),
98
+ },
99
+ }
100
+ : {}),
101
+ };
102
+ }
103
+ /**
104
+ * The model id `state`'s turns run on, or `undefined` when the workflow leaves
105
+ * the choice to the assembly. The one place the chain is derived — the state's
106
+ * `model`, else the root's `settings.model` — so nothing re-implements the
107
+ * precedence. An unknown slug reads as the workflow's own declaration, which is
108
+ * what the runtime wants for a position it cannot resolve.
109
+ */
110
+ modelFor(state) {
111
+ return this.spec.states[state]?.model ?? this.spec.settings?.model;
112
+ }
113
+ /**
114
+ * Every distinct model id this spec declares, in a stable order (the root's
115
+ * first, then each state's in declaration order). What assembly builds a model
116
+ * for, and what it names when an explicit `model` instance makes them inert.
117
+ */
118
+ declaredModels() {
119
+ const ids = new Set();
120
+ if (this.spec.settings?.model)
121
+ ids.add(this.spec.settings.model);
122
+ for (const state of Object.values(this.spec.states)) {
123
+ if (state?.model)
124
+ ids.add(state.model);
125
+ }
126
+ return [...ids];
127
+ }
128
+ // --- Skills ---------------------------------------------------------------------
129
+ /**
130
+ * The skills the workflow grants in **every** state: the root's
131
+ * `allow_always`, resolved against the registry. A state's `skills.allow`
132
+ * adds to this list, exactly as `tools.allow` adds to `tools.allow_always`.
133
+ * An absent key grants nothing, the same as `allow_always: []`. A declared
134
+ * slug the registry does not provide is dropped (and reported by `validate`).
135
+ */
136
+ workflowAlwaysSkills(available) {
137
+ const provided = new Set(available);
138
+ return list(this.spec.skills?.allow_always).filter((slug) => provided.has(slug));
139
+ }
140
+ /** The slugs `skills.forbid_always` denies in every state of this workflow. */
141
+ workflowForbiddenSkills() {
142
+ return list(this.spec.skills?.forbid_always);
143
+ }
144
+ /**
145
+ * The slugs denied while `state` is active, from either level. Declaration
146
+ * order, workflow-wide first, so a caller rendering them is byte-stable.
147
+ */
148
+ forbiddenSkills(state) {
149
+ const workflow = this.workflowForbiddenSkills();
150
+ const own = list(this.spec.states[state]?.skills?.forbid).filter((slug) => !workflow.includes(slug));
151
+ return [...workflow, ...own];
152
+ }
153
+ /**
154
+ * Which level denies `slug` in `state`, or `undefined` if neither does — so a
155
+ * refusal can say whether a list forbade the bundle or nothing granted it.
156
+ */
157
+ skillDenial(state, slug) {
158
+ if (this.workflowForbiddenSkills().includes(slug))
159
+ return "workflow";
160
+ if (list(this.spec.states[state]?.skills?.forbid).includes(slug))
161
+ return "state";
162
+ return undefined;
163
+ }
164
+ /**
165
+ * The skills enabled while `state` is active — the one answer the kernel's
166
+ * skill rule, prompt disclosure, the PTC listing redaction and `validate` all
167
+ * consult.
168
+ *
169
+ * The grant is additive: the state's own `skills.allow` followed by the root's
170
+ * `allow_always`, each in declaration order, deduplicated by slug. The denial
171
+ * beats it: anything `skills.forbid_always` or the state's `skills.forbid`
172
+ * names is removed, so **deny beats allow and no narrower level widens a
173
+ * denial**. Order is declaration order from the frozen spec, so everything
174
+ * rendered from this — the prompt's skills section above all — is byte-stable
175
+ * across the model calls of a turn.
176
+ */
177
+ enabledSkills(state, available) {
178
+ const provided = new Set(available);
179
+ const own = list(this.spec.states[state]?.skills?.allow).filter((slug) => provided.has(slug));
180
+ const always = this.workflowAlwaysSkills(available).filter((slug) => !own.includes(slug));
181
+ const denied = new Set(this.forbiddenSkills(state));
182
+ return [...own, ...always].filter((slug) => !denied.has(slug));
183
+ }
184
+ // --- Mounts ---------------------------------------------------------------------
185
+ /**
186
+ * The governed mounts the workflow enables in **every** state: the root's
187
+ * `mounts.allow_always`, filtered to the names the host declared governed. A
188
+ * state's `mounts.allow` adds to this list, exactly as `skills.allow` adds to
189
+ * `skills.allow_always`. An absent key grants nothing, the same as
190
+ * `allow_always: []`. A name the table does not govern is dropped (and
191
+ * reported by `validate`) — an ungoverned mount needs no grant.
192
+ */
193
+ workflowAlwaysMounts(governed) {
194
+ const table = new Set(governed);
195
+ return normalizeMountGrants(this.spec.mounts?.allow_always)
196
+ .map((grant) => grant.mount)
197
+ .filter((name) => table.has(name));
198
+ }
199
+ /**
200
+ * The names `mounts.forbid_always` denies in every state of this workflow —
201
+ * governed or not, since a denial subtracts an ungoverned mount's standing
202
+ * visibility too.
203
+ */
204
+ workflowForbiddenMounts() {
205
+ return list(this.spec.mounts?.forbid_always);
206
+ }
207
+ /**
208
+ * The mount names denied while `state` is active, from either level.
209
+ * Declaration order, workflow-wide first, so a caller rendering them is
210
+ * byte-stable.
211
+ */
212
+ forbiddenMounts(state) {
213
+ const workflow = this.workflowForbiddenMounts();
214
+ const own = list(this.spec.states[state]?.mounts?.forbid).filter((name) => !workflow.includes(name));
215
+ return [...workflow, ...own];
216
+ }
217
+ /**
218
+ * Which level denies `name` in `state`, or `undefined` if neither does — so a
219
+ * refusal can say whether a list forbade the mount or nothing enabled it.
220
+ */
221
+ mountDenial(state, name) {
222
+ if (this.workflowForbiddenMounts().includes(name))
223
+ return "workflow";
224
+ if (list(this.spec.states[state]?.mounts?.forbid).includes(name))
225
+ return "state";
226
+ return undefined;
227
+ }
228
+ /**
229
+ * The **governed** mounts enabled while `state` is active — the one answer the
230
+ * kernel's mount rule, prompt disclosure, the listing redaction and `validate`
231
+ * all consult. Ungoverned mounts are not in it: they are visible in every
232
+ * state without a grant, and `forbiddenMounts` is what takes one away.
233
+ *
234
+ * The grant is additive: the state's own `mounts.allow` followed by the root's
235
+ * `allow_always`, each in declaration order, deduplicated by name. The denial
236
+ * beats it: anything `mounts.forbid_always` or the state's `mounts.forbid`
237
+ * names is removed, so **deny beats allow and no narrower level widens a
238
+ * denial**. Order is declaration order from the frozen spec, so everything
239
+ * rendered from this is byte-stable across the model calls of a turn.
240
+ */
241
+ enabledMounts(state, governed) {
242
+ const table = new Set(governed);
243
+ const own = normalizeMountGrants(this.spec.states[state]?.mounts?.allow)
244
+ .map((grant) => grant.mount)
245
+ .filter((name) => table.has(name));
246
+ const always = this.workflowAlwaysMounts(governed).filter((name) => !own.includes(name));
247
+ const denied = new Set(this.forbiddenMounts(state));
248
+ return [...own, ...always].filter((name) => !denied.has(name));
249
+ }
250
+ /**
251
+ * Whether writes to `name` are permitted while `state` is active — the second
252
+ * half of a mount grant, beside which states may see it at all.
253
+ *
254
+ * A mount is writable here only when the host declared it writable **and** no
255
+ * applicable grant narrowed it to `read`. Read-only is a restriction, so it
256
+ * behaves like every other restriction in this schema: whichever level asks
257
+ * for it gets it, and no narrower level widens it back. `read_write` on a
258
+ * mount the host serves read-only is therefore inert (reported by `validate`)
259
+ * — the host's posture is the ceiling, not a default to argue with.
260
+ *
261
+ * An ungoverned mount takes the host's posture in every state: it carries no
262
+ * grant to qualify.
263
+ */
264
+ mountWritable(state, name, mounts) {
265
+ if (!mounts.writable.includes(name))
266
+ return false;
267
+ const applicable = [
268
+ ...normalizeMountGrants(this.spec.states[state]?.mounts?.allow),
269
+ ...normalizeMountGrants(this.spec.mounts?.allow_always),
270
+ ].filter((grant) => grant.mount === name);
271
+ return !applicable.some((grant) => grant.access === "read");
272
+ }
273
+ // --- Graph ----------------------------------------------------------------------
274
+ transitionTargets(from) {
275
+ return (this.spec.states[from]?.transitions ?? []).map((t) => t.to);
276
+ }
277
+ getTransition(from, to) {
278
+ return this.spec.states[from]?.transitions?.find((t) => t.to === to);
279
+ }
280
+ /** The state a failed turn routes to (`on_error`), if declared and present. */
281
+ onError(state) {
282
+ const target = this.spec.states[state]?.on_error;
283
+ return target && this.spec.states[target] ? target : undefined;
284
+ }
285
+ /** A state with no declared outgoing transitions is terminal (ends the run). */
286
+ isTerminal(state) {
287
+ return this.transitionTargets(state).length === 0;
288
+ }
289
+ /** Whether a state is a human decision state (a person picks the edge). */
290
+ isHumanState(state) {
291
+ return this.spec.states[state]?.type === "human";
292
+ }
293
+ /**
294
+ * States a run can reach: the start states plus everything transitively
295
+ * reachable through transitions and `on_error` routes. A state no start state
296
+ * reaches is dead in the definition, so nothing it declares widens the surface.
297
+ */
298
+ reachableStates() {
299
+ const seen = new Set();
300
+ const queue = this.startStates().map((s) => s.state);
301
+ while (queue.length > 0) {
302
+ const slug = queue.shift();
303
+ if (seen.has(slug) || !this.spec.states[slug])
304
+ continue;
305
+ seen.add(slug);
306
+ queue.push(...this.transitionTargets(slug));
307
+ const errorTarget = this.onError(slug);
308
+ if (errorTarget)
309
+ queue.push(errorTarget);
310
+ }
311
+ return seen;
312
+ }
313
+ /** Each state's normalized `before`/`after` hook lists, for states declaring any. */
314
+ lifecycleHooks() {
315
+ const map = {};
316
+ for (const [slug, state] of Object.entries(this.spec.states)) {
317
+ const before = normalizeHooks(state.before);
318
+ const after = normalizeHooks(state.after);
319
+ if (before.length || after.length) {
320
+ map[slug] = {
321
+ ...(before.length ? { before } : {}),
322
+ ...(after.length ? { after } : {}),
323
+ };
324
+ }
325
+ }
326
+ return map;
327
+ }
328
+ /**
329
+ * The sibling workflows this machine may delegate to: every
330
+ * `archmax_workflow_<slug>` named in `tools.allow_always` and in the given
331
+ * state's `tools.allow` — or, with no state, in any **reachable** state's.
332
+ * Naming a target in governance *is* declaring the delegation.
333
+ */
334
+ delegationTargets(state) {
335
+ const targets = new Set();
336
+ const collect = (entries) => {
337
+ for (const entry of entries) {
338
+ const { tool } = normalizeAllowEntry(entry);
339
+ const slug = tool ? workflowSlugFromToolName(tool) : undefined;
340
+ if (slug)
341
+ targets.add(slug);
342
+ }
343
+ };
344
+ collect(this.allowAlwaysEntries());
345
+ for (const slug of state !== undefined ? [state] : this.reachableStates()) {
346
+ collect(this.allowEntries(slug));
347
+ }
348
+ return [...targets].sort();
349
+ }
350
+ /** Run variables this state must have set before it may be left. */
351
+ requiredVariables(state) {
352
+ return this.spec.states[state]?.requires ?? [];
353
+ }
354
+ // --- Tool surface ---------------------------------------------------------------
355
+ allowEntries(state) {
356
+ return this.spec.states[state]?.tools?.allow ?? [];
357
+ }
358
+ allowAlwaysEntries() {
359
+ return this.spec.tools?.allow_always ?? [];
360
+ }
361
+ /**
362
+ * The effective essential set: the built-ins plus the host's `essentialTools`.
363
+ * Unconditional — no property of a workspace or a spec adds to it, and `task`
364
+ * is in it under no circumstances (see {@link UNGRANTABLE_TOOLS}).
365
+ */
366
+ essentialTools() {
367
+ const tools = new Set(ESSENTIAL_TOOLS);
368
+ for (const tool of this.extraEssential)
369
+ tools.add(tool);
370
+ return tools;
371
+ }
372
+ /**
373
+ * Every denial entry that applies in `state`: the workflow's `forbid_always`
374
+ * followed by the state's own `forbid`. Order is presentational only — both
375
+ * block, and a denial is evaluated ahead of every grant.
376
+ */
377
+ forbidEntries(state) {
378
+ // `validate` builds a machine from a spec whose schema may have failed, so a
379
+ // key can hold anything here; a non-list is nothing rather than a crash.
380
+ return [...list(this.spec.tools?.forbid_always), ...list(this.spec.states[state]?.tools?.forbid)];
381
+ }
382
+ /**
383
+ * The entries that govern `state`, in precedence order — the one derivation
384
+ * enforcement and disclosure both read. A tool is decided by exactly one tier:
385
+ * the state's own entries when they name it (the narrower constraint, even for
386
+ * an essential tool); else the essential grant; else `allow_always`. An
387
+ * `allow_always` entry for a tool the state mentions or that is essential is
388
+ * therefore inert.
389
+ */
390
+ effectiveEntries(state) {
391
+ const own = this.allowEntries(state).map(normalizeAllowEntry);
392
+ const mentioned = new Set(own.map((e) => e.tool));
393
+ const essential = [...this.essentialTools()]
394
+ .filter((tool) => !mentioned.has(tool))
395
+ .map((tool) => ({ tool, argMatchers: null }));
396
+ const always = this.allowAlwaysEntries()
397
+ .map(normalizeAllowEntry)
398
+ .filter((e) => e.tool && !mentioned.has(e.tool) && !this.essentialTools().has(e.tool));
399
+ return [...own, ...essential, ...always];
400
+ }
401
+ /**
402
+ * Whether a tool call is statically permitted in `state`. Closed by default:
403
+ * the always-allowed controls pass; otherwise some effective entry must name
404
+ * the tool and match its arguments.
405
+ */
406
+ checkAllowed(state, tool, args, ctx) {
407
+ if (ALWAYS_ALLOWED_TOOLS.has(tool))
408
+ return true;
409
+ return this.effectiveEntries(state).some((entry) => entry.tool === tool &&
410
+ argsSatisfy(entry.argMatchers, args, ctx?.variables, (failure) => ctx?.onUnresolved?.(failure)));
411
+ }
412
+ /**
413
+ * The tool names disclosed to the model while `state` is active: every tool
414
+ * an effective entry names plus the controls (`archmax_advance` omitted for a
415
+ * terminal state, where every call to it would be rejected), minus the tools
416
+ * denied here by name. Name-level only — argument enforcement stays with the
417
+ * kernel at call time.
418
+ */
419
+ disclosedTools(state) {
420
+ const disclosed = new Set();
421
+ for (const { tool } of this.effectiveEntries(state))
422
+ if (tool)
423
+ disclosed.add(tool);
424
+ if (!this.isTerminal(state))
425
+ disclosed.add(ADVANCE_TOOL);
426
+ // Reset, wait and the variable tools are disclosed everywhere, terminal
427
+ // states included: restarting, parking for a reply, and the run's working
428
+ // memory all still apply once a run has answered.
429
+ disclosed.add(RESET_TOOL);
430
+ disclosed.add(WAIT_TOOL);
431
+ disclosed.add(GET_VARIABLES_TOOL);
432
+ disclosed.add(SET_VARIABLES_TOOL);
433
+ // A bare denial removes the tool from the model's picture entirely; a
434
+ // guarded one (`{ tool: write_file, paths: [...] }`) denies only some calls,
435
+ // so the tool stays disclosed and the kernel refuses the call — the same
436
+ // rule the grant side follows for a guarded allow entry.
437
+ for (const entry of this.forbidEntries(state)) {
438
+ const { tool, argMatchers } = normalizeAllowEntry(entry);
439
+ if (tool && !argMatchers)
440
+ disclosed.delete(tool);
441
+ }
442
+ return disclosed;
443
+ }
444
+ renderEntry({ tool, argMatchers }) {
445
+ if (!argMatchers)
446
+ return tool ?? "";
447
+ const parts = Object.entries(argMatchers)
448
+ .map(([name, globs]) => `${name}=${globs.join("|")}`)
449
+ .join(", ");
450
+ return `${tool}(${parts})`;
451
+ }
452
+ /**
453
+ * Model-facing description of what `checkAllowed` enforces in a state: the
454
+ * effective entries in precedence order, minus any tool denied here by name,
455
+ * then the always-allowed controls the state discloses. A denial that leaves
456
+ * the tool usable for other arguments (a guarded entry) leaves it listed —
457
+ * the same line disclosure draws — so the model's picture matches enforcement
458
+ * either way.
459
+ */
460
+ describeAllowed(state) {
461
+ const denied = new Set();
462
+ for (const entry of this.forbidEntries(state)) {
463
+ const { tool, argMatchers } = normalizeAllowEntry(entry);
464
+ if (tool && !argMatchers)
465
+ denied.add(tool);
466
+ }
467
+ const parts = this.effectiveEntries(state)
468
+ .filter(({ tool }) => !tool || !denied.has(tool))
469
+ .map((entry) => this.renderEntry(entry));
470
+ const disclosed = this.disclosedTools(state);
471
+ for (const tool of ALWAYS_ALLOWED_TOOLS)
472
+ if (disclosed.has(tool))
473
+ parts.push(tool);
474
+ return parts.join(", ");
475
+ }
476
+ /**
477
+ * Model-facing lines describing the argument constraints that bind in a
478
+ * state, rendered through the same resolver the kernel enforces with so an
479
+ * unresolved reference is shown as unresolved-and-named rather than as a
480
+ * placeholder the model might pass literally. Empty when none bind.
481
+ */
482
+ describeArgConstraints(state, variables = {}) {
483
+ const lines = [];
484
+ for (const { tool, argMatchers } of this.effectiveEntries(state)) {
485
+ if (!tool || !argMatchers)
486
+ continue;
487
+ const constraints = Object.entries(argMatchers)
488
+ .map(([name, globs]) => {
489
+ const rendered = globs.map((g) => describeGlob(g, variables));
490
+ return rendered.length > 1
491
+ ? `${name} must match one of: ${rendered.map((g) => `'${g}'`).join(", ")}`
492
+ : `${name} must match '${rendered[0]}'`;
493
+ })
494
+ .join(" and ");
495
+ lines.push(`- ${tool}: ${constraints}`);
496
+ }
497
+ return lines;
498
+ }
499
+ // --- Triggers -------------------------------------------------------------------
500
+ /**
501
+ * Every trigger the spec declares, read from the states that declare them —
502
+ * computed once per machine.
503
+ */
504
+ triggerBindings() {
505
+ this.bindingsCache ??= triggerBindings(this.spec);
506
+ return this.bindingsCache;
507
+ }
508
+ /** The declared start states as `{ trigger, state }` pairs, in declaration order. */
509
+ startStates() {
510
+ return [...this.triggerBindings().values()].map((binding) => ({
511
+ trigger: binding.id,
512
+ state: binding.entry,
513
+ }));
514
+ }
515
+ /**
516
+ * The state a trigger enters, or `undefined` for an id no state declares.
517
+ * `manual` is the one entry for every ingress — the CLI, an SDK invocation
518
+ * naming no trigger, a host firing that names it, and a delegation.
519
+ */
520
+ startStateForTrigger(id) {
521
+ return this.triggerBindings().get(id)?.entry;
522
+ }
523
+ /** The session path declared for a trigger, if it declares one. */
524
+ sessionPathForTrigger(id) {
525
+ return this.triggerBindings().get(id)?.session;
526
+ }
527
+ /**
528
+ * The host-resolved `message:` declaration for a trigger: the parsed path,
529
+ * `false` for "firings carry no message", or `undefined` when undeclared.
530
+ */
531
+ messagePathForTrigger(id) {
532
+ return this.triggerBindings().get(id)?.message;
533
+ }
534
+ /** The host-resolved `connection:` slug declared for a trigger, if any. */
535
+ connectionForTrigger(id) {
536
+ return this.triggerBindings().get(id)?.connection;
537
+ }
538
+ /** The run variables a firing of this trigger must supply, if declared. */
539
+ requiresForTrigger(id) {
540
+ return this.triggerBindings().get(id)?.requires;
541
+ }
542
+ /**
543
+ * The run variables a run started through this trigger guarantees are set when
544
+ * it completes, if declared — the only variables that cross a sub-run boundary
545
+ * upward.
546
+ */
547
+ returnsForTrigger(id) {
548
+ return this.triggerBindings().get(id)?.returns;
549
+ }
550
+ }
551
+ //# sourceMappingURL=machine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"machine.js","sourceRoot":"","sources":["../../src/machine/machine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { MountAccess, MountGrantEntry } from "./types.js";
2
+ /**
3
+ * One mounts grant, in the one shape every reader consults: the mount's name and
4
+ * the access this level asked for, `undefined` meaning "whatever posture the
5
+ * host declared".
6
+ *
7
+ * The two spellings a grant list accepts — a bare name and
8
+ * `{ mount, access }` — normalize here rather than at each reader, the way
9
+ * `normalizeAllowEntry` normalizes the two spellings of a tool entry: the
10
+ * resolution on {@link WorkflowMachine} and `validate` then read one shape and
11
+ * cannot disagree about what the document said.
12
+ */
13
+ export interface NormalizedMountGrant {
14
+ readonly mount: string;
15
+ readonly access: MountAccess | undefined;
16
+ }
17
+ /**
18
+ * Normalize a mounts grant list, dropping entries no well-formed spelling
19
+ * covers.
20
+ *
21
+ * Tolerant of a malformed value on purpose: `validate` builds a machine from a
22
+ * spec whose schema may have failed, so a key can hold anything here, and a
23
+ * non-list is nothing rather than a crash.
24
+ */
25
+ export declare function normalizeMountGrants(entries: readonly MountGrantEntry[] | undefined): NormalizedMountGrant[];
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Normalize a mounts grant list, dropping entries no well-formed spelling
3
+ * covers.
4
+ *
5
+ * Tolerant of a malformed value on purpose: `validate` builds a machine from a
6
+ * spec whose schema may have failed, so a key can hold anything here, and a
7
+ * non-list is nothing rather than a crash.
8
+ */
9
+ export function normalizeMountGrants(entries) {
10
+ if (!Array.isArray(entries))
11
+ return [];
12
+ const grants = [];
13
+ for (const entry of entries) {
14
+ if (typeof entry === "string") {
15
+ grants.push({ mount: entry, access: undefined });
16
+ continue;
17
+ }
18
+ if (entry !== null && typeof entry === "object" && typeof entry.mount === "string") {
19
+ grants.push({ mount: entry.mount, access: entry.access });
20
+ }
21
+ }
22
+ return grants;
23
+ }
24
+ //# sourceMappingURL=mount-grants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mount-grants.js","sourceRoot":"","sources":["../../src/machine/mount-grants.ts"],"names":[],"mappings":"AAkBA;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAA+C;IAE/C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IACvC,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;YACjD,SAAS;QACX,CAAC;QACD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACnF,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * The one shape a slug takes, at every level that has one: a **state slug** (a
3
+ * state's key in `states`) and a **workflow slug** (the `workflows/<slug>/`
4
+ * directory name, the CLI argument, a delegation tool's target). Deliberately
5
+ * the same shape, so the pattern lives here alone.
6
+ */
7
+ /**
8
+ * **Hyphen-separated kebab-case** — lowercase alphanumeric segments joined by
9
+ * single hyphens. No leading, trailing, or doubled hyphens; no underscores, no
10
+ * uppercase, no spaces.
11
+ */
12
+ export declare const SLUG_PATTERN: RegExp;
13
+ /** Whether a value is a well-formed slug. */
14
+ export declare function isSlug(value: unknown): value is string;
@@ -0,0 +1,17 @@
1
+ /**
2
+ * The one shape a slug takes, at every level that has one: a **state slug** (a
3
+ * state's key in `states`) and a **workflow slug** (the `workflows/<slug>/`
4
+ * directory name, the CLI argument, a delegation tool's target). Deliberately
5
+ * the same shape, so the pattern lives here alone.
6
+ */
7
+ /**
8
+ * **Hyphen-separated kebab-case** — lowercase alphanumeric segments joined by
9
+ * single hyphens. No leading, trailing, or doubled hyphens; no underscores, no
10
+ * uppercase, no spaces.
11
+ */
12
+ export const SLUG_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
13
+ /** Whether a value is a well-formed slug. */
14
+ export function isSlug(value) {
15
+ return typeof value === "string" && SLUG_PATTERN.test(value);
16
+ }
17
+ //# sourceMappingURL=slug.js.map