@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,97 @@
1
+ /**
2
+ * The CLI's command vocabulary: the shape of a command-table entry, the two
3
+ * error classes an invocation can end in, strict parsing through Node's own
4
+ * `util.parseArgs`, help text generated from the table, and the two output
5
+ * primitives every command writes through (results to stdout, narration to
6
+ * stderr).
7
+ */
8
+ import { parseArgs as parseNodeArgs } from "node:util";
9
+ /** A failure of the invocation itself: exit 2, one line, a `--help` hint — never a usage dump. */
10
+ export class UsageError extends Error {
11
+ }
12
+ /** A failure the command established after parsing: exit 1, one line. */
13
+ export class CliError extends Error {
14
+ }
15
+ export const GLOBAL_OPTIONS = {
16
+ root: {
17
+ type: "string",
18
+ placeholder: "<dir>",
19
+ description: "Workspace root (default: current directory); .env is loaded from it",
20
+ },
21
+ help: { type: "boolean", short: "h", description: "Show help for this command" },
22
+ };
23
+ export const out = (line) => console.log(line);
24
+ export const err = (line) => console.error(line);
25
+ export function parseInvocation(cmd, args) {
26
+ const options = Object.fromEntries(Object.entries({ ...GLOBAL_OPTIONS, ...cmd.options }).map(([name, spec]) => [
27
+ name,
28
+ { type: spec.type, ...(spec.short ? { short: spec.short } : {}) },
29
+ ]));
30
+ let parsed;
31
+ try {
32
+ parsed = parseNodeArgs({ args, options, strict: true, allowPositionals: true });
33
+ }
34
+ catch (e) {
35
+ throw new UsageError(String(e.message).split(". ")[0] ?? "invalid arguments");
36
+ }
37
+ const values = parsed.values;
38
+ const root = typeof values.root === "string" ? values.root : undefined;
39
+ if (values.help)
40
+ return { positionals: parsed.positionals, values, root };
41
+ // A `rest` positional (the last one) absorbs the remainder of the line; a
42
+ // command without one refuses extra arguments rather than dropping them.
43
+ const positionals = [...parsed.positionals];
44
+ const restAt = cmd.positionals.findIndex((p) => p.rest);
45
+ if (restAt >= 0) {
46
+ const rest = positionals.splice(restAt).join(" ").trim();
47
+ if (rest)
48
+ positionals.push(rest);
49
+ }
50
+ else if (positionals.length > cmd.positionals.length) {
51
+ throw new UsageError(`unexpected argument '${positionals[cmd.positionals.length]}'`);
52
+ }
53
+ return { positionals, values, root };
54
+ }
55
+ function usageLine(cmd) {
56
+ const args = cmd.positionals
57
+ .map((p) => p.required ? `<${p.name}${p.rest ? "..." : ""}>` : `[${p.name}${p.rest ? "..." : ""}]`)
58
+ .join(" ");
59
+ return `archmax ${cmd.name}${args ? ` ${args}` : ""} [options]`;
60
+ }
61
+ function columns(rows) {
62
+ const width = Math.max(...rows.map(([left]) => left.length));
63
+ return rows.map(([left, right]) => ` ${left.padEnd(width)} ${right}`).join("\n");
64
+ }
65
+ function optionRows(options) {
66
+ return Object.entries(options).map(([name, spec]) => [
67
+ `--${name}${spec.short ? `, -${spec.short}` : ""}${spec.placeholder ? ` ${spec.placeholder}` : ""}`,
68
+ spec.description,
69
+ ]);
70
+ }
71
+ export function commandHelp(cmd) {
72
+ const sections = [`Usage: ${usageLine(cmd)}`, "", cmd.description ?? cmd.summary];
73
+ if (cmd.positionals.length) {
74
+ sections.push("", "Arguments:", columns(cmd.positionals.map((p) => [`<${p.name}>`, p.description])));
75
+ }
76
+ sections.push("", "Options:", columns(optionRows({ ...cmd.options, ...GLOBAL_OPTIONS })));
77
+ return sections.join("\n");
78
+ }
79
+ export function topLevelHelp(commands) {
80
+ return [
81
+ "Usage: archmax <command> [arguments] [options]",
82
+ "",
83
+ "Commands:",
84
+ columns(commands.map((cmd) => [
85
+ usageLine(cmd)
86
+ .replace(/^archmax /, "")
87
+ .replace(/ \[options\]$/, ""),
88
+ cmd.summary,
89
+ ])),
90
+ "",
91
+ "Global options:",
92
+ columns(optionRows(GLOBAL_OPTIONS)),
93
+ "",
94
+ "Run 'archmax help <command>' for a command's arguments and options.",
95
+ ].join("\n");
96
+ }
97
+ //# sourceMappingURL=command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/cli/command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import { type WorkflowEventInput } from "../core/events.js";
2
+ import { type CaseResult, type SuiteSkip } from "../testing/runner.js";
3
+ import { type Style } from "./style.js";
4
+ export interface StateFlowWriter {
5
+ write(chunk: string): unknown;
6
+ }
7
+ export interface StateFlowRenderer {
8
+ /** Accepts events with or without a `level` (the renderer keys off `type`). */
9
+ onEvent(event: WorkflowEventInput): void;
10
+ }
11
+ /**
12
+ * Build a renderer that writes an append-only, hierarchical state flow to
13
+ * `stream`. Assembly-time events (`interpreter-enabled`,
14
+ * `hooks-summary`, `graph-topology`, `workflow-reset`) are ignored — the CLI
15
+ * prints its own session header. The `advance` event only renders the agent's
16
+ * one-sentence `reason` (the target itself is shown by the following `state-leave`).
17
+ */
18
+ export declare function createStateFlowRenderer(stream: StateFlowWriter, styleOverride?: Style): StateFlowRenderer;
19
+ export interface TestView {
20
+ /**
21
+ * Reporter hook for `RunTestsOptions.onCaseStart`: dimmed case header + fresh
22
+ * trail. Given the case's session id, the trail shows only that session's
23
+ * events (and its child sessions'), so a run that outlives its case cannot
24
+ * paint under the next case's heading.
25
+ */
26
+ onCaseStart(file: string, sessionId?: string): void;
27
+ /** Reporter hook for `RunTestsOptions.onCaseResult`: styled verdict line with details. */
28
+ onCaseResult(result: CaseResult): void;
29
+ /** Workflow event hook: forwards to the current case's state-flow renderer. */
30
+ onEvent(event: WorkflowEventInput): void;
31
+ /** Closing overview: counts plus named failed/passed/skipped lists. */
32
+ renderSummary(results: CaseResult[]): void;
33
+ /**
34
+ * The whole suite was skipped rather than run — a disabled workflow runs
35
+ * nothing. One line in place of the summary, never a failure.
36
+ */
37
+ renderSuiteSkipped(workflow: string, reason: SuiteSkip): void;
38
+ }
39
+ /** One line naming a case and its outcome — the same shape in the per-case verdict and the summary. */
40
+ export declare function caseVerdictLine(s: Style, result: CaseResult): string;
41
+ /**
42
+ * Build the `archmax test` view writing to `stream` (normally `process.stderr`).
43
+ * Each case gets its own state-flow renderer so trails from sequential cases
44
+ * never share state.
45
+ */
46
+ export declare function createTestView(stream: StateFlowWriter, styleOverride?: Style): TestView;
@@ -0,0 +1,268 @@
1
+ /**
2
+ * The CLI's renderer of the typed event stream — the **state flow** — with two
3
+ * entry points:
4
+ *
5
+ * - {@link createStateFlowRenderer}: the live, colorized trail `archmax run`
6
+ * writes to `stderr`, one line per lifecycle event, append-only.
7
+ * - {@link createTestView}: what `archmax test` builds on top of it — a fresh
8
+ * trail per case under a dimmed case header, a styled verdict line per case,
9
+ * and the closing summary.
10
+ *
11
+ * The trail uses two indentation tiers so a session reads as a hierarchy:
12
+ * state changes (`state-enter`, `state-leave`) sit at the outer margin, and
13
+ * what happened *inside* a state (hooks, tool calls, the agent's own text,
14
+ * quoted) is indented beneath it. Lifecycle phases are colour-coded — `before`
15
+ * in blue, `after` in magenta. Assembly-time and high-frequency telemetry
16
+ * events are dropped to keep the trail readable.
17
+ */
18
+ import { isChildSessionOf } from "../sessions/scope.js";
19
+ import { originLabel } from "../core/events.js";
20
+ import { ADVANCE_TOOL } from "../machine/tool-names.js";
21
+ import { exitCodeForVerdict } from "../testing/runner.js";
22
+ import { createStyle, icons } from "./style.js";
23
+ /** Indentation for per-state action lines (hooks, agent text). */
24
+ const ACTION_INDENT = " ";
25
+ /** Deeper indentation for output nested under an action (e.g. script stdout). */
26
+ const OUTPUT_INDENT = " ";
27
+ /** Indentation for failure details nested under a verdict line. */
28
+ const DETAIL_INDENT = " ";
29
+ /** Indentation for the summary's named case lists. */
30
+ const LIST_INDENT = " ";
31
+ /**
32
+ * Build a renderer that writes an append-only, hierarchical state flow to
33
+ * `stream`. Assembly-time events (`interpreter-enabled`,
34
+ * `hooks-summary`, `graph-topology`, `workflow-reset`) are ignored — the CLI
35
+ * prints its own session header. The `advance` event only renders the agent's
36
+ * one-sentence `reason` (the target itself is shown by the following `state-leave`).
37
+ */
38
+ export function createStateFlowRenderer(stream, styleOverride) {
39
+ const s = styleOverride ?? createStyle();
40
+ const phaseColor = (phase) => (phase === "before" ? s.blue : s.magenta);
41
+ const write = (line) => stream.write(`${line}\n`);
42
+ const writeAgentText = (text) => {
43
+ for (const line of text.split("\n"))
44
+ write(`${ACTION_INDENT}${s.gray(icons.quote)} ${line}`);
45
+ };
46
+ return {
47
+ onEvent(event) {
48
+ // Everything a *child session* emits is folded into its dispatch lines:
49
+ // a sub-workflow shares its caller's event handler, so rendering its
50
+ // states inline would read as the parent walking into a machine it never
51
+ // entered. The dispatch's own start/result lines say what ran.
52
+ if (event.subWorkflowDispatchId) {
53
+ if (event.type !== "sub-workflow-start" && event.type !== "sub-workflow-result")
54
+ return;
55
+ }
56
+ switch (event.type) {
57
+ case "state-enter":
58
+ write("");
59
+ write(`${s.cyan(icons.inProgress)} ${s.bold(event.state)}`);
60
+ break;
61
+ case "state-leave":
62
+ write(`${s.green(icons.check)} ${event.state} ${s.dim(icons.arrow)} ${s.cyan(event.next)}`);
63
+ break;
64
+ case "state-error-routed":
65
+ write(`${s.yellow(icons.warn)} ${event.state} ${s.dim(icons.arrow)} ${s.yellow(event.to)} ` +
66
+ s.dim(`(on_error: ${event.reason})`));
67
+ break;
68
+ case "hook-start":
69
+ write(`${ACTION_INDENT}${phaseColor(event.phase)(`${icons.bullet} ${event.phase}`)} ${s.dim(event.label)}`);
70
+ break;
71
+ case "hook-output":
72
+ write(`${OUTPUT_INDENT}${s.dim(event.line)}`);
73
+ break;
74
+ case "hook-passed":
75
+ write(`${ACTION_INDENT}${s.green(icons.check)} ${s.dim(`${event.phase} passed`)}`);
76
+ break;
77
+ case "hook-verdict": {
78
+ const missing = event.missing?.length ? ` (missing: ${event.missing.join(", ")})` : "";
79
+ const mark = event.verdict === "ok"
80
+ ? s.green(icons.check)
81
+ : event.verdict === "veto"
82
+ ? s.red(icons.cross)
83
+ : s.yellow(icons.inProgress);
84
+ write(`${ACTION_INDENT}${mark} ${phaseColor(event.phase)(event.phase)} ` +
85
+ `${s.dim(`${event.verdict} — ${event.reason}${missing}`)}`);
86
+ break;
87
+ }
88
+ case "hook-rejected":
89
+ write(`${ACTION_INDENT}${s.red(icons.cross)} ${s.red(`${event.phase} rejected`)} ${s.dim(event.reason)}`);
90
+ break;
91
+ case "tool-called":
92
+ // The transition tool is reported by the state lines and the advance
93
+ // reason, so its call would be the same event twice.
94
+ if (event.tool === ADVANCE_TOOL)
95
+ break;
96
+ write(`${ACTION_INDENT}${s.gray(icons.bullet)} ${s.dim(event.tool)}` +
97
+ `${event.detail ? ` ${s.gray(event.detail)}` : ""}` +
98
+ `${event.origin ? s.gray(` via ${originLabel(event.origin)}`) : ""}`);
99
+ break;
100
+ case "tool-blocked":
101
+ write(`${ACTION_INDENT}${s.yellow(`${icons.warn} blocked ${event.tool}`)} ` +
102
+ `${s.dim(`(not allowed in ${event.state}${event.origin ? `, from a ${originLabel(event.origin)}` : ""})`)}`);
103
+ break;
104
+ case "agent-text":
105
+ writeAgentText(event.text);
106
+ break;
107
+ case "advance":
108
+ if (event.reason?.trim())
109
+ write(`${ACTION_INDENT}${s.dim(`${icons.arrow} ${event.reason.trim()}`)}`);
110
+ break;
111
+ case "parked": {
112
+ // Both park channels render here; naming which one a reader is
113
+ // looking at is the whole point of the channel on the event.
114
+ const input = event.awaiting === "input";
115
+ const label = input ? "awaiting input" : "awaiting human decision";
116
+ const why = input && event.reason?.trim() ? ` — ${event.reason.trim()}` : "";
117
+ const due = input && event.resumeAt ? ` (due ${event.resumeAt})` : "";
118
+ write(`${ACTION_INDENT}${s.yellow(`${icons.warn} ${label}`)} ` +
119
+ `${s.dim(`${input ? "in" : "at"} ${event.node}${why}${due}`)}`);
120
+ break;
121
+ }
122
+ // A state's delegations render as nested activity, not as trail steps
123
+ // of their own: the session has not moved — one state is running whole
124
+ // workflows inside itself, which a reader needs to see as *depth*.
125
+ case "sub-workflow-start":
126
+ write(`${ACTION_INDENT}${s.cyan(icons.inProgress)} ${s.dim(`sub-workflow ${event.workflow}`)}` +
127
+ `${event.depth > 1 ? s.gray(` (depth ${event.depth})`) : ""}`);
128
+ break;
129
+ case "sub-workflow-result":
130
+ if (event.status === "parked") {
131
+ write(`${ACTION_INDENT}${s.yellow(icons.warn)} ` +
132
+ `${s.dim(`sub-workflow ${event.workflow} parked — the session suspends with it`)}`);
133
+ }
134
+ else if (event.status === "ok") {
135
+ write(`${ACTION_INDENT}${s.green(icons.check)} ${s.dim(`sub-workflow ${event.workflow} (${event.durationMs}ms)`)}`);
136
+ }
137
+ else {
138
+ write(`${ACTION_INDENT}${s.red(icons.cross)} ${s.red(`sub-workflow ${event.workflow} failed`)} ` +
139
+ `${s.dim(event.reason ?? "")}`);
140
+ }
141
+ break;
142
+ case "decided":
143
+ write(`${ACTION_INDENT}${s.green(icons.check)} ${s.dim(`decision -> ${event.to}`)}`);
144
+ break;
145
+ // The conversation continuing while parked. Only the inbound side
146
+ // renders: the reply arrives as `agent-text` like anything else the
147
+ // model says, and showing it twice would read as two replies.
148
+ case "park-message":
149
+ if (event.direction === "inbound") {
150
+ write(`${ACTION_INDENT}${s.yellow(icons.arrow)} ${s.dim(`message to the parked session at ${event.node}`)}`);
151
+ writeAgentText(event.text);
152
+ }
153
+ break;
154
+ case "delivered":
155
+ write(`${ACTION_INDENT}${s.green(icons.check)} ${s.dim(`${event.trigger} delivered, resuming ${event.node}`)}`);
156
+ break;
157
+ case "warning":
158
+ write(`${s.yellow(`${icons.warn} [${event.scope}]`)} ${s.dim(event.message)}`);
159
+ break;
160
+ case "workflow-reset":
161
+ case "interpreter-enabled":
162
+ case "hooks-summary":
163
+ case "graph-topology":
164
+ case "agent-text-delta":
165
+ case "tool-result":
166
+ case "rubric-start":
167
+ case "rubric-result":
168
+ case "model-usage":
169
+ case "prompt-shaping":
170
+ // Lifecycle summaries and high-frequency (GUI-oriented) telemetry.
171
+ break;
172
+ }
173
+ },
174
+ };
175
+ }
176
+ /** One line naming a case and its outcome — the same shape in the per-case verdict and the summary. */
177
+ export function caseVerdictLine(s, result) {
178
+ const title = result.title ? ` ${s.dim(`— ${result.title}`)}` : "";
179
+ switch (result.verdict.status) {
180
+ case "passed":
181
+ return `${s.green(icons.check)} ${result.id}${title}`;
182
+ case "skipped":
183
+ return `${s.yellow(icons.pending)} ${result.id}${title}${result.skipReason ? ` ${s.dim(`(${result.skipReason})`)}` : ""}`;
184
+ case "failed":
185
+ return `${s.red(icons.cross)} ${result.id}${title}`;
186
+ }
187
+ }
188
+ /**
189
+ * Build the `archmax test` view writing to `stream` (normally `process.stderr`).
190
+ * Each case gets its own state-flow renderer so trails from sequential cases
191
+ * never share state.
192
+ */
193
+ export function createTestView(stream, styleOverride) {
194
+ const s = styleOverride ?? createStyle();
195
+ const write = (line) => stream.write(`${line}\n`);
196
+ let stateFlow = null;
197
+ let currentSession;
198
+ return {
199
+ onCaseStart(file, sessionId) {
200
+ currentSession = sessionId;
201
+ stateFlow = createStateFlowRenderer(stream, s);
202
+ write("");
203
+ write(s.dim(`${icons.diamond} case ${file}`));
204
+ },
205
+ onCaseResult(result) {
206
+ write("");
207
+ write(caseVerdictLine(s, result));
208
+ for (const failure of result.verdict.failures)
209
+ write(`${DETAIL_INDENT}${s.red(icons.cross)} ${s.dim(failure)}`);
210
+ // A grade is otherwise invisible when it passes — only failures print —
211
+ // so print every graded record that ran, passing or not. An un-run one
212
+ // has no score, and `0 / 0.7` would read as a grade of zero; those are
213
+ // covered by the not-executed count below.
214
+ for (const graded of result.records.filter((r) => r.threshold != null && r.status !== "not-executed")) {
215
+ const mark = graded.status === "passed" ? s.green(icons.check) : s.yellow(icons.warn);
216
+ write(`${DETAIL_INDENT}${mark} ${s.dim(`${graded.kind} ${graded.score ?? 0} / ${graded.threshold}`)}`);
217
+ }
218
+ // Without this, a halted case's remaining assertions read as if they had passed.
219
+ const notExecuted = result.records.filter((r) => r.status === "not-executed").length;
220
+ if (notExecuted > 0) {
221
+ const line = `${notExecuted} ${notExecuted === 1 ? "assertion" : "assertions"} not executed`;
222
+ write(`${DETAIL_INDENT}${s.yellow(icons.pending)} ${s.dim(line)}`);
223
+ }
224
+ },
225
+ onEvent(event) {
226
+ // An event bound to another session belongs to a case that already ended
227
+ // (a timed-out run still winding down); it is not this case's trail.
228
+ const bound = event.sessionId;
229
+ if (currentSession &&
230
+ bound &&
231
+ bound !== currentSession &&
232
+ !isChildSessionOf(bound, currentSession)) {
233
+ return;
234
+ }
235
+ // Events can arrive before the first case (agent assembly); give them a
236
+ // renderer too so e.g. warnings are not dropped.
237
+ stateFlow ??= createStateFlowRenderer(stream, s);
238
+ stateFlow.onEvent(event);
239
+ },
240
+ renderSuiteSkipped(workflow, reason) {
241
+ const why = reason === "disabled" ? "the workflow is disabled" : reason;
242
+ write("");
243
+ write(`${s.yellow(icons.pending)} ${s.bold("suite skipped")} ${s.dim(`— ${why} (${workflow}); no case ran`)}`);
244
+ },
245
+ renderSummary(results) {
246
+ const skipped = results.filter((r) => r.verdict.status === "skipped");
247
+ // Failed-ness reuses the exit-code semantics, so the summary and the
248
+ // process agree by construction.
249
+ const failed = results.filter((r) => r.verdict.status !== "skipped" && exitCodeForVerdict(r.verdict) !== 0);
250
+ const passed = results.filter((r) => !skipped.includes(r) && !failed.includes(r));
251
+ write("");
252
+ write(`${s.cyan(s.bold(`${icons.diamond} summary`))} ` +
253
+ s.dim(`${passed.length} passed, ${failed.length} failed, ${skipped.length} skipped`));
254
+ if (results.length > 0 && failed.length === 0 && skipped.length === 0) {
255
+ write(`${LIST_INDENT}${s.green(icons.check)} all ${results.length} case(s) passed`);
256
+ return;
257
+ }
258
+ const name = (r) => (r.title ? `${r.id} ${s.dim(`— ${r.title}`)}` : r.id);
259
+ for (const r of failed)
260
+ write(`${LIST_INDENT}${s.red(icons.cross)} ${name(r)}`);
261
+ for (const r of passed)
262
+ write(`${LIST_INDENT}${s.green(icons.check)} ${name(r)}`);
263
+ for (const r of skipped)
264
+ write(`${LIST_INDENT}${s.yellow(icons.pending)} ${name(r)}`);
265
+ },
266
+ };
267
+ }
268
+ //# sourceMappingURL=state-flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-flow.js","sourceRoot":"","sources":["../../src/cli/state-flow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,WAAW,EAA2B,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAmC,MAAM,sBAAsB,CAAC;AAC3F,OAAO,EAAE,WAAW,EAAE,KAAK,EAAc,MAAM,YAAY,CAAC;AAW5D,kEAAkE;AAClE,MAAM,aAAa,GAAG,MAAM,CAAC;AAC7B,iFAAiF;AACjF,MAAM,aAAa,GAAG,QAAQ,CAAC;AAC/B,mEAAmE;AACnE,MAAM,aAAa,GAAG,QAAQ,CAAC;AAC/B,sDAAsD;AACtD,MAAM,WAAW,GAAG,IAAI,CAAC;AAEzB;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CACrC,MAAuB,EACvB,aAAqB;IAErB,MAAM,CAAC,GAAG,aAAa,IAAI,WAAW,EAAE,CAAC;IACzC,MAAM,UAAU,GAAG,CAAC,KAAyB,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC5F,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;IAC1D,MAAM,cAAc,GAAG,CAAC,IAAY,EAAE,EAAE;QACtC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,KAAK,CAAC,GAAG,aAAa,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAC/F,CAAC,CAAC;IAEF,OAAO;QACL,OAAO,CAAC,KAAyB;YAC/B,wEAAwE;YACxE,qEAAqE;YACrE,yEAAyE;YACzE,+DAA+D;YAC/D,IAAK,KAA4C,CAAC,qBAAqB,EAAE,CAAC;gBACxE,IAAI,KAAK,CAAC,IAAI,KAAK,oBAAoB,IAAI,KAAK,CAAC,IAAI,KAAK,qBAAqB;oBAAE,OAAO;YAC1F,CAAC;YACD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;gBACnB,KAAK,aAAa;oBAChB,KAAK,CAAC,EAAE,CAAC,CAAC;oBACV,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;oBAC5D,MAAM;gBACR,KAAK,aAAa;oBAChB,KAAK,CACH,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CACrF,CAAC;oBACF,MAAM;gBACR,KAAK,oBAAoB;oBACvB,KAAK,CACH,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG;wBACnF,CAAC,CAAC,GAAG,CAAC,cAAc,KAAK,CAAC,MAAM,GAAG,CAAC,CACvC,CAAC;oBACF,MAAM;gBACR,KAAK,YAAY;oBACf,KAAK,CACH,GAAG,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CACrG,CAAC;oBACF,MAAM;gBACR,KAAK,aAAa;oBAChB,KAAK,CAAC,GAAG,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBAC9C,MAAM;gBACR,KAAK,aAAa;oBAChB,KAAK,CAAC,GAAG,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,SAAS,CAAC,EAAE,CAAC,CAAC;oBACnF,MAAM;gBACR,KAAK,cAAc,CAAC,CAAC,CAAC;oBACpB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,cAAc,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBACvF,MAAM,IAAI,GACR,KAAK,CAAC,OAAO,KAAK,IAAI;wBACpB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;wBACtB,CAAC,CAAC,KAAK,CAAC,OAAO,KAAK,MAAM;4BACxB,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC;4BACpB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;oBACnC,KAAK,CACH,GAAG,aAAa,GAAG,IAAI,IAAI,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG;wBAChE,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,MAAM,KAAK,CAAC,MAAM,GAAG,OAAO,EAAE,CAAC,EAAE,CAC7D,CAAC;oBACF,MAAM;gBACR,CAAC;gBACD,KAAK,eAAe;oBAClB,KAAK,CACH,GAAG,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CACnG,CAAC;oBACF,MAAM;gBACR,KAAK,aAAa;oBAChB,qEAAqE;oBACrE,qDAAqD;oBACrD,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;wBAAE,MAAM;oBACvC,KAAK,CACH,GAAG,aAAa,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;wBAC5D,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;wBACnD,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CACvE,CAAC;oBACF,MAAM;gBACR,KAAK,cAAc;oBACjB,KAAK,CACH,GAAG,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,YAAY,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG;wBACnE,GAAG,CAAC,CAAC,GAAG,CAAC,mBAAmB,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAC9G,CAAC;oBACF,MAAM;gBACR,KAAK,YAAY;oBACf,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAC3B,MAAM;gBACR,KAAK,SAAS;oBACZ,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE;wBACtB,KAAK,CAAC,GAAG,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;oBAC7E,MAAM;gBACR,KAAK,QAAQ,CAAC,CAAC,CAAC;oBACd,+DAA+D;oBAC/D,6DAA6D;oBAC7D,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,KAAK,OAAO,CAAC;oBACzC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,yBAAyB,CAAC;oBACnE,MAAM,GAAG,GAAG,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC7E,MAAM,GAAG,GAAG,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBACtE,KAAK,CACH,GAAG,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,EAAE,CAAC,GAAG;wBACtD,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC,EAAE,CACjE,CAAC;oBACF,MAAM;gBACR,CAAC;gBACD,sEAAsE;gBACtE,uEAAuE;gBACvE,mEAAmE;gBACnE,KAAK,oBAAoB;oBACvB,KAAK,CACH,GAAG,aAAa,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,QAAQ,EAAE,CAAC,EAAE;wBACtF,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAChE,CAAC;oBACF,MAAM;gBACR,KAAK,qBAAqB;oBACxB,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;wBAC9B,KAAK,CACH,GAAG,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG;4BACxC,GAAG,CAAC,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,QAAQ,wCAAwC,CAAC,EAAE,CACrF,CAAC;oBACJ,CAAC;yBAAM,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;wBACjC,KAAK,CACH,GAAG,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,UAAU,KAAK,CAAC,EAAE,CAC7G,CAAC;oBACJ,CAAC;yBAAM,CAAC;wBACN,KAAK,CACH,GAAG,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,QAAQ,SAAS,CAAC,GAAG;4BACxF,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CACjC,CAAC;oBACJ,CAAC;oBACD,MAAM;gBACR,KAAK,SAAS;oBACZ,KAAK,CAAC,GAAG,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;oBACrF,MAAM;gBACR,kEAAkE;gBAClE,oEAAoE;gBACpE,8DAA8D;gBAC9D,KAAK,cAAc;oBACjB,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;wBAClC,KAAK,CACH,GAAG,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,oCAAoC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,CACtG,CAAC;wBACF,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBAC7B,CAAC;oBACD,MAAM;gBACR,KAAK,WAAW;oBACd,KAAK,CACH,GAAG,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,wBAAwB,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,CACzG,CAAC;oBACF,MAAM;gBACR,KAAK,SAAS;oBACZ,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;oBAC/E,MAAM;gBACR,KAAK,gBAAgB,CAAC;gBACtB,KAAK,qBAAqB,CAAC;gBAC3B,KAAK,eAAe,CAAC;gBACrB,KAAK,gBAAgB,CAAC;gBACtB,KAAK,kBAAkB,CAAC;gBACxB,KAAK,aAAa,CAAC;gBACnB,KAAK,cAAc,CAAC;gBACpB,KAAK,eAAe,CAAC;gBACrB,KAAK,aAAa,CAAC;gBACnB,KAAK,gBAAgB;oBACnB,mEAAmE;oBACnE,MAAM;YACV,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAuBD,uGAAuG;AACvG,MAAM,UAAU,eAAe,CAAC,CAAQ,EAAE,MAAkB;IAC1D,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACnE,QAAQ,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QAC9B,KAAK,QAAQ;YACX,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC;QACxD,KAAK,SAAS;YACZ,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,EAAE,GAAG,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAC5H,KAAK,QAAQ;YACX,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC;IACxD,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,MAAuB,EAAE,aAAqB;IAC3E,MAAM,CAAC,GAAG,aAAa,IAAI,WAAW,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;IAC1D,IAAI,SAAS,GAA6B,IAAI,CAAC;IAC/C,IAAI,cAAkC,CAAC;IAEvC,OAAO;QACL,WAAW,CAAC,IAAI,EAAE,SAAS;YACzB,cAAc,GAAG,SAAS,CAAC;YAC3B,SAAS,GAAG,uBAAuB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAC/C,KAAK,CAAC,EAAE,CAAC,CAAC;YACV,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC;QAChD,CAAC;QAED,YAAY,CAAC,MAAM;YACjB,KAAK,CAAC,EAAE,CAAC,CAAC;YACV,KAAK,CAAC,eAAe,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;YAClC,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ;gBAC3C,KAAK,CAAC,GAAG,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACnE,wEAAwE;YACxE,uEAAuE;YACvE,uEAAuE;YACvE,2CAA2C;YAC3C,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CACxC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,IAAI,IAAI,CAAC,CAAC,MAAM,KAAK,cAAc,CAC1D,EAAE,CAAC;gBACF,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACtF,KAAK,CACH,GAAG,aAAa,GAAG,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,IAAI,CAAC,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC,EAAE,CAChG,CAAC;YACJ,CAAC;YACD,iFAAiF;YACjF,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,cAAc,CAAC,CAAC,MAAM,CAAC;YACrF,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;gBACpB,MAAM,IAAI,GAAG,GAAG,WAAW,IAAI,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,eAAe,CAAC;gBAC7F,KAAK,CAAC,GAAG,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;QAED,OAAO,CAAC,KAAK;YACX,yEAAyE;YACzE,qEAAqE;YACrE,MAAM,KAAK,GAAI,KAAgC,CAAC,SAAS,CAAC;YAC1D,IACE,cAAc;gBACd,KAAK;gBACL,KAAK,KAAK,cAAc;gBACxB,CAAC,gBAAgB,CAAC,KAAK,EAAE,cAAc,CAAC,EACxC,CAAC;gBACD,OAAO;YACT,CAAC;YACD,wEAAwE;YACxE,iDAAiD;YACjD,SAAS,KAAK,uBAAuB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACjD,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;QAED,kBAAkB,CAAC,QAAQ,EAAE,MAAM;YACjC,MAAM,GAAG,GAAG,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,MAAM,CAAC;YACxE,KAAK,CAAC,EAAE,CAAC,CAAC;YACV,KAAK,CACH,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,KAAK,QAAQ,gBAAgB,CAAC,EAAE,CACxG,CAAC;QACJ,CAAC;QAED,aAAa,CAAC,OAAO;YACnB,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;YACtE,qEAAqE;YACrE,iCAAiC;YACjC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAC3B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,kBAAkB,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAC7E,CAAC;YACF,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YAElF,KAAK,CAAC,EAAE,CAAC,CAAC;YACV,KAAK,CACH,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC,GAAG;gBAC9C,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,YAAY,MAAM,CAAC,MAAM,YAAY,OAAO,CAAC,MAAM,UAAU,CAAC,CACvF,CAAC;YACF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtE,KAAK,CAAC,GAAG,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,OAAO,CAAC,MAAM,iBAAiB,CAAC,CAAC;gBACpF,OAAO;YACT,CAAC;YACD,MAAM,IAAI,GAAG,CAAC,CAAa,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACtF,KAAK,MAAM,CAAC,IAAI,MAAM;gBAAE,KAAK,CAAC,GAAG,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAChF,KAAK,MAAM,CAAC,IAAI,MAAM;gBAAE,KAAK,CAAC,GAAG,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAClF,KAAK,MAAM,CAAC,IAAI,OAAO;gBAAE,KAAK,CAAC,GAAG,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACxF,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Zero-dependency ANSI styling shared by the CLI's own output (banner,
3
+ * starter message, state-flow view). Color is suppressed — falling back to
4
+ * plain text with icons intact — when the `NO_COLOR` convention is set or the
5
+ * target stream is not a TTY.
6
+ */
7
+ /** Icon constants used by CLI-rendered output; these never change with color suppression. */
8
+ export declare const icons: {
9
+ readonly check: "✔";
10
+ readonly cross: "✖";
11
+ readonly inProgress: "●";
12
+ readonly pending: "○";
13
+ readonly arrow: "→";
14
+ readonly diamond: "◆";
15
+ readonly bullet: "›";
16
+ readonly quote: "│";
17
+ readonly warn: "⚠";
18
+ };
19
+ export interface ColorContext {
20
+ /** Env to check for `NO_COLOR` (defaults to `process.env`). */
21
+ env?: NodeJS.ProcessEnv;
22
+ /** Whether the target stream is a TTY (defaults to `process.stderr.isTTY`). */
23
+ isTTY?: boolean;
24
+ }
25
+ /** True when ANSI color codes should be emitted for the given context. */
26
+ export declare function shouldUseColor(ctx?: ColorContext): boolean;
27
+ export interface Style {
28
+ bold(text: string): string;
29
+ dim(text: string): string;
30
+ red(text: string): string;
31
+ green(text: string): string;
32
+ yellow(text: string): string;
33
+ blue(text: string): string;
34
+ magenta(text: string): string;
35
+ cyan(text: string): string;
36
+ gray(text: string): string;
37
+ }
38
+ /** Build a {@link Style} whose helpers are no-op passthroughs when color is suppressed. */
39
+ export declare function createStyle(ctx?: ColorContext): Style;
40
+ /** Default style instance resolved against the live process env/TTY state. */
41
+ export declare const style: Style;
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Zero-dependency ANSI styling shared by the CLI's own output (banner,
3
+ * starter message, state-flow view). Color is suppressed — falling back to
4
+ * plain text with icons intact — when the `NO_COLOR` convention is set or the
5
+ * target stream is not a TTY.
6
+ */
7
+ const ESC = "\x1b[";
8
+ const RESET = `${ESC}0m`;
9
+ const CODES = {
10
+ bold: "1",
11
+ dim: "2",
12
+ red: "31",
13
+ green: "32",
14
+ yellow: "33",
15
+ blue: "34",
16
+ magenta: "35",
17
+ cyan: "36",
18
+ gray: "90",
19
+ };
20
+ /** Icon constants used by CLI-rendered output; these never change with color suppression. */
21
+ export const icons = {
22
+ check: "✔",
23
+ cross: "✖",
24
+ inProgress: "●",
25
+ pending: "○",
26
+ arrow: "→",
27
+ diamond: "◆",
28
+ bullet: "›",
29
+ quote: "│",
30
+ warn: "⚠",
31
+ };
32
+ /** True when ANSI color codes should be emitted for the given context. */
33
+ export function shouldUseColor(ctx = {}) {
34
+ const env = ctx.env ?? process.env;
35
+ const isTTY = ctx.isTTY ?? Boolean(process.stderr.isTTY);
36
+ if (env.NO_COLOR !== undefined && env.NO_COLOR !== "")
37
+ return false;
38
+ if (!isTTY)
39
+ return false;
40
+ return true;
41
+ }
42
+ function wrap(code, useColor) {
43
+ if (!useColor)
44
+ return (text) => text;
45
+ return (text) => `${ESC}${code}m${text}${RESET}`;
46
+ }
47
+ /** Build a {@link Style} whose helpers are no-op passthroughs when color is suppressed. */
48
+ export function createStyle(ctx = {}) {
49
+ const useColor = shouldUseColor(ctx);
50
+ return {
51
+ bold: wrap(CODES.bold, useColor),
52
+ dim: wrap(CODES.dim, useColor),
53
+ red: wrap(CODES.red, useColor),
54
+ green: wrap(CODES.green, useColor),
55
+ yellow: wrap(CODES.yellow, useColor),
56
+ blue: wrap(CODES.blue, useColor),
57
+ magenta: wrap(CODES.magenta, useColor),
58
+ cyan: wrap(CODES.cyan, useColor),
59
+ gray: wrap(CODES.gray, useColor),
60
+ };
61
+ }
62
+ /** Default style instance resolved against the live process env/TTY state. */
63
+ export const style = createStyle();
64
+ //# sourceMappingURL=style.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style.js","sourceRoot":"","sources":["../../src/cli/style.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,GAAG,GAAG,OAAO,CAAC;AACpB,MAAM,KAAK,GAAG,GAAG,GAAG,IAAI,CAAC;AAEzB,MAAM,KAAK,GAAG;IACZ,IAAI,EAAE,GAAG;IACT,GAAG,EAAE,GAAG;IACR,GAAG,EAAE,IAAI;IACT,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,IAAI;IACZ,IAAI,EAAE,IAAI;IACV,OAAO,EAAE,IAAI;IACb,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;CACF,CAAC;AAEX,6FAA6F;AAC7F,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,KAAK,EAAE,GAAG;IACV,KAAK,EAAE,GAAG;IACV,UAAU,EAAE,GAAG;IACf,OAAO,EAAE,GAAG;IACZ,KAAK,EAAE,GAAG;IACV,OAAO,EAAE,GAAG;IACZ,MAAM,EAAE,GAAG;IACX,KAAK,EAAE,GAAG;IACV,IAAI,EAAE,GAAG;CACD,CAAC;AASX,0EAA0E;AAC1E,MAAM,UAAU,cAAc,CAAC,MAAoB,EAAE;IACnD,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACnC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAEzD,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,GAAG,CAAC,QAAQ,KAAK,EAAE;QAAE,OAAO,KAAK,CAAC;IACpE,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,OAAO,IAAI,CAAC;AACd,CAAC;AAcD,SAAS,IAAI,CAAC,IAAY,EAAE,QAAiB;IAC3C,IAAI,CAAC,QAAQ;QAAE,OAAO,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC;IAC7C,OAAO,CAAC,IAAY,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;AAC3D,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,WAAW,CAAC,MAAoB,EAAE;IAChD,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IACrC,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC;QAChC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,CAAC;QAC9B,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,CAAC;QAC9B,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC;QAClC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC;QACpC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC;QAChC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC;QACtC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC;QAChC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC;KACjC,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,MAAM,CAAC,MAAM,KAAK,GAAU,WAAW,EAAE,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * One turn on a session, as the CLI drives it, and how its outcome is reported:
3
+ * the reply or the park on stdout, the resume hints on stderr. `run` sends a
4
+ * turn through `agent.workflow.send`; `decide` / `reply` / `deliver` each
5
+ * resume one, and every outcome is described the same way.
6
+ */
7
+ import type { Agent } from "../agent.js";
8
+ import type { TriggerInput } from "../machine/triggers.js";
9
+ import type { DecideOutcome, Outcome, ReplyOutcome } from "../sessions/resume.js";
10
+ import type { WorkflowMachine } from "../machine/machine.js";
11
+ import { type UsageTracker } from "../core/usage.js";
12
+ import { type Style } from "./style.js";
13
+ /** Token usage on stderr — never a row of zeros, never on stdout. */
14
+ export declare function printUsageFooter(style: Style, usage: UsageTracker, sessionId?: string): void;
15
+ type Transition = {
16
+ to: string;
17
+ description?: string;
18
+ type?: string;
19
+ };
20
+ /** The context a person needs to decide a parked human state, from the spec — nothing is rendered to a file. */
21
+ export declare function printDecisionContext(machine: WorkflowMachine, state: string, transitions: Transition[], evidence?: string[], write?: (line: string) => void): void;
22
+ export declare function printResumed(style: Style, sessionId: string, verb: string, outcome: DecideOutcome): void;
23
+ export declare function printReply(style: Style, sessionId: string, outcome: ReplyOutcome): void;
24
+ export interface RunTurnInput {
25
+ workflow: string;
26
+ prompt: string;
27
+ trigger?: TriggerInput;
28
+ variables?: Record<string, unknown>;
29
+ sessionId?: string;
30
+ sessionPath?: string;
31
+ }
32
+ /** Report a turn's {@link Outcome}: an answer, a park (with what resumes it), or a resume's result. */
33
+ export declare function printOutcome(style: Style, machine: WorkflowMachine, sessionId: string, outcome: Outcome): void;
34
+ /**
35
+ * Drive one turn: name the session the firing belongs to, send the turn through
36
+ * `workflow.send` — which delivers, replies or opens a turn as the session's
37
+ * state dictates — and report how it ended. Returns the exit code; a park is a
38
+ * successful outcome.
39
+ */
40
+ export declare function driveTurn(agent: Agent, style: Style, usage: UsageTracker, input: RunTurnInput): Promise<number>;
41
+ export {};