@inbrowser/agent 0.0.0-placeholder → 0.2.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 (267) hide show
  1. package/AGENTS.md +270 -0
  2. package/LICENSE +21 -0
  3. package/README.md +117 -2
  4. package/bin/agent.ts +10 -0
  5. package/dist/cli/commands/describe.d.ts +14 -0
  6. package/dist/cli/commands/describe.d.ts.map +1 -0
  7. package/dist/cli/commands/describe.js +179 -0
  8. package/dist/cli/commands/describe.js.map +1 -0
  9. package/dist/cli/commands/events.d.ts +21 -0
  10. package/dist/cli/commands/events.d.ts.map +1 -0
  11. package/dist/cli/commands/events.js +59 -0
  12. package/dist/cli/commands/events.js.map +1 -0
  13. package/dist/cli/commands/fleet.d.ts +15 -0
  14. package/dist/cli/commands/fleet.d.ts.map +1 -0
  15. package/dist/cli/commands/fleet.js +149 -0
  16. package/dist/cli/commands/fleet.js.map +1 -0
  17. package/dist/cli/commands/help.d.ts +15 -0
  18. package/dist/cli/commands/help.d.ts.map +1 -0
  19. package/dist/cli/commands/help.js +93 -0
  20. package/dist/cli/commands/help.js.map +1 -0
  21. package/dist/cli/commands/migrate.d.ts +27 -0
  22. package/dist/cli/commands/migrate.d.ts.map +1 -0
  23. package/dist/cli/commands/migrate.js +109 -0
  24. package/dist/cli/commands/migrate.js.map +1 -0
  25. package/dist/cli/commands/run.d.ts +38 -0
  26. package/dist/cli/commands/run.d.ts.map +1 -0
  27. package/dist/cli/commands/run.js +535 -0
  28. package/dist/cli/commands/run.js.map +1 -0
  29. package/dist/cli/commands/schema.d.ts +8 -0
  30. package/dist/cli/commands/schema.d.ts.map +1 -0
  31. package/dist/cli/commands/schema.js +12 -0
  32. package/dist/cli/commands/schema.js.map +1 -0
  33. package/dist/cli/commands/serve.d.ts +39 -0
  34. package/dist/cli/commands/serve.d.ts.map +1 -0
  35. package/dist/cli/commands/serve.js +65 -0
  36. package/dist/cli/commands/serve.js.map +1 -0
  37. package/dist/cli/commands/undo.d.ts +36 -0
  38. package/dist/cli/commands/undo.d.ts.map +1 -0
  39. package/dist/cli/commands/undo.js +132 -0
  40. package/dist/cli/commands/undo.js.map +1 -0
  41. package/dist/cli/fixtures.d.ts +17 -0
  42. package/dist/cli/fixtures.d.ts.map +1 -0
  43. package/dist/cli/fixtures.js +107 -0
  44. package/dist/cli/fixtures.js.map +1 -0
  45. package/dist/cli/hardening.d.ts +39 -0
  46. package/dist/cli/hardening.d.ts.map +1 -0
  47. package/dist/cli/hardening.js +68 -0
  48. package/dist/cli/hardening.js.map +1 -0
  49. package/dist/cli/index.d.ts +28 -0
  50. package/dist/cli/index.d.ts.map +1 -0
  51. package/dist/cli/index.js +19 -0
  52. package/dist/cli/index.js.map +1 -0
  53. package/dist/cli/llm/openrouter.d.ts +33 -0
  54. package/dist/cli/llm/openrouter.d.ts.map +1 -0
  55. package/dist/cli/llm/openrouter.js +285 -0
  56. package/dist/cli/llm/openrouter.js.map +1 -0
  57. package/dist/cli/main.d.ts +32 -0
  58. package/dist/cli/main.d.ts.map +1 -0
  59. package/dist/cli/main.js +106 -0
  60. package/dist/cli/main.js.map +1 -0
  61. package/dist/cli/output.d.ts +36 -0
  62. package/dist/cli/output.d.ts.map +1 -0
  63. package/dist/cli/output.js +95 -0
  64. package/dist/cli/output.js.map +1 -0
  65. package/dist/cli/parse.d.ts +26 -0
  66. package/dist/cli/parse.d.ts.map +1 -0
  67. package/dist/cli/parse.js +160 -0
  68. package/dist/cli/parse.js.map +1 -0
  69. package/dist/cli/session-log.d.ts +34 -0
  70. package/dist/cli/session-log.d.ts.map +1 -0
  71. package/dist/cli/session-log.js +52 -0
  72. package/dist/cli/session-log.js.map +1 -0
  73. package/dist/cli/spec.d.ts +62 -0
  74. package/dist/cli/spec.d.ts.map +1 -0
  75. package/dist/cli/spec.js +510 -0
  76. package/dist/cli/spec.js.map +1 -0
  77. package/dist/cli/ui/RunView.d.ts +134 -0
  78. package/dist/cli/ui/RunView.d.ts.map +1 -0
  79. package/dist/cli/ui/RunView.js +341 -0
  80. package/dist/cli/ui/RunView.js.map +1 -0
  81. package/dist/diagnostics/index.d.ts +5 -0
  82. package/dist/diagnostics/index.d.ts.map +1 -0
  83. package/dist/diagnostics/index.js +3 -0
  84. package/dist/diagnostics/index.js.map +1 -0
  85. package/dist/diagnostics/timing.d.ts +48 -0
  86. package/dist/diagnostics/timing.d.ts.map +1 -0
  87. package/dist/diagnostics/timing.js +85 -0
  88. package/dist/diagnostics/timing.js.map +1 -0
  89. package/dist/diagnostics/truthfulness.d.ts +36 -0
  90. package/dist/diagnostics/truthfulness.d.ts.map +1 -0
  91. package/dist/diagnostics/truthfulness.js +180 -0
  92. package/dist/diagnostics/truthfulness.js.map +1 -0
  93. package/dist/dispatch-memoization.d.ts +84 -0
  94. package/dist/dispatch-memoization.d.ts.map +1 -0
  95. package/dist/dispatch-memoization.js +197 -0
  96. package/dist/dispatch-memoization.js.map +1 -0
  97. package/dist/eval/comparison-report.d.ts +164 -0
  98. package/dist/eval/comparison-report.d.ts.map +1 -0
  99. package/dist/eval/comparison-report.js +316 -0
  100. package/dist/eval/comparison-report.js.map +1 -0
  101. package/dist/eval/fixture.d.ts +74 -0
  102. package/dist/eval/fixture.d.ts.map +1 -0
  103. package/dist/eval/fixture.js +217 -0
  104. package/dist/eval/fixture.js.map +1 -0
  105. package/dist/eval/index.d.ts +13 -0
  106. package/dist/eval/index.d.ts.map +1 -0
  107. package/dist/eval/index.js +7 -0
  108. package/dist/eval/index.js.map +1 -0
  109. package/dist/eval/load-node.d.ts +16 -0
  110. package/dist/eval/load-node.d.ts.map +1 -0
  111. package/dist/eval/load-node.js +58 -0
  112. package/dist/eval/load-node.js.map +1 -0
  113. package/dist/eval/metric-collector.d.ts +209 -0
  114. package/dist/eval/metric-collector.d.ts.map +1 -0
  115. package/dist/eval/metric-collector.js +293 -0
  116. package/dist/eval/metric-collector.js.map +1 -0
  117. package/dist/eval/run-record.d.ts +76 -0
  118. package/dist/eval/run-record.d.ts.map +1 -0
  119. package/dist/eval/run-record.js +32 -0
  120. package/dist/eval/run-record.js.map +1 -0
  121. package/dist/eval/runner.d.ts +140 -0
  122. package/dist/eval/runner.d.ts.map +1 -0
  123. package/dist/eval/runner.js +310 -0
  124. package/dist/eval/runner.js.map +1 -0
  125. package/dist/eval/spec-framework.d.ts +113 -0
  126. package/dist/eval/spec-framework.d.ts.map +1 -0
  127. package/dist/eval/spec-framework.js +100 -0
  128. package/dist/eval/spec-framework.js.map +1 -0
  129. package/dist/eval/spec-helpers.d.ts +245 -0
  130. package/dist/eval/spec-helpers.d.ts.map +1 -0
  131. package/dist/eval/spec-helpers.js +605 -0
  132. package/dist/eval/spec-helpers.js.map +1 -0
  133. package/dist/events/codec.d.ts +79 -0
  134. package/dist/events/codec.d.ts.map +1 -0
  135. package/dist/events/codec.js +142 -0
  136. package/dist/events/codec.js.map +1 -0
  137. package/dist/events/log-core.d.ts +76 -0
  138. package/dist/events/log-core.d.ts.map +1 -0
  139. package/dist/events/log-core.js +73 -0
  140. package/dist/events/log-core.js.map +1 -0
  141. package/dist/events/log.d.ts +60 -0
  142. package/dist/events/log.d.ts.map +1 -0
  143. package/dist/events/log.js +193 -0
  144. package/dist/events/log.js.map +1 -0
  145. package/dist/events/replay.d.ts +106 -0
  146. package/dist/events/replay.d.ts.map +1 -0
  147. package/dist/events/replay.js +137 -0
  148. package/dist/events/replay.js.map +1 -0
  149. package/dist/events/wrap.d.ts +100 -0
  150. package/dist/events/wrap.d.ts.map +1 -0
  151. package/dist/events/wrap.js +141 -0
  152. package/dist/events/wrap.js.map +1 -0
  153. package/dist/index.d.ts +73 -0
  154. package/dist/index.d.ts.map +1 -0
  155. package/dist/index.js +47 -0
  156. package/dist/index.js.map +1 -0
  157. package/dist/llm-adapter.d.ts +96 -0
  158. package/dist/llm-adapter.d.ts.map +1 -0
  159. package/dist/llm-adapter.js +132 -0
  160. package/dist/llm-adapter.js.map +1 -0
  161. package/dist/mcp/serve.d.ts +70 -0
  162. package/dist/mcp/serve.d.ts.map +1 -0
  163. package/dist/mcp/serve.js +154 -0
  164. package/dist/mcp/serve.js.map +1 -0
  165. package/dist/metrics/runs.d.ts +58 -0
  166. package/dist/metrics/runs.d.ts.map +1 -0
  167. package/dist/metrics/runs.js +99 -0
  168. package/dist/metrics/runs.js.map +1 -0
  169. package/dist/metrics.d.ts +38 -0
  170. package/dist/metrics.d.ts.map +1 -0
  171. package/dist/metrics.js +123 -0
  172. package/dist/metrics.js.map +1 -0
  173. package/dist/node.d.ts +23 -0
  174. package/dist/node.d.ts.map +1 -0
  175. package/dist/node.js +23 -0
  176. package/dist/node.js.map +1 -0
  177. package/dist/planner-executor.d.ts +132 -0
  178. package/dist/planner-executor.d.ts.map +1 -0
  179. package/dist/planner-executor.js +274 -0
  180. package/dist/planner-executor.js.map +1 -0
  181. package/dist/session.d.ts +10 -0
  182. package/dist/session.d.ts.map +1 -0
  183. package/dist/session.js +179 -0
  184. package/dist/session.js.map +1 -0
  185. package/dist/skill-catalog.d.ts +81 -0
  186. package/dist/skill-catalog.d.ts.map +1 -0
  187. package/dist/skill-catalog.js +388 -0
  188. package/dist/skill-catalog.js.map +1 -0
  189. package/dist/skill-router.d.ts +95 -0
  190. package/dist/skill-router.d.ts.map +1 -0
  191. package/dist/skill-router.js +130 -0
  192. package/dist/skill-router.js.map +1 -0
  193. package/dist/storage.d.ts +14 -0
  194. package/dist/storage.d.ts.map +1 -0
  195. package/dist/storage.js +58 -0
  196. package/dist/storage.js.map +1 -0
  197. package/dist/strategy.d.ts +45 -0
  198. package/dist/strategy.d.ts.map +1 -0
  199. package/dist/strategy.js +520 -0
  200. package/dist/strategy.js.map +1 -0
  201. package/dist/tools.d.ts +40 -0
  202. package/dist/tools.d.ts.map +1 -0
  203. package/dist/tools.js +147 -0
  204. package/dist/tools.js.map +1 -0
  205. package/dist/types/agent.d.ts +94 -0
  206. package/dist/types/agent.d.ts.map +1 -0
  207. package/dist/types/agent.js +17 -0
  208. package/dist/types/agent.js.map +1 -0
  209. package/dist/types/capabilities.d.ts +17 -0
  210. package/dist/types/capabilities.d.ts.map +1 -0
  211. package/dist/types/capabilities.js +13 -0
  212. package/dist/types/capabilities.js.map +1 -0
  213. package/dist/types/chat.d.ts +74 -0
  214. package/dist/types/chat.d.ts.map +1 -0
  215. package/dist/types/chat.js +10 -0
  216. package/dist/types/chat.js.map +1 -0
  217. package/dist/types/events.d.ts +115 -0
  218. package/dist/types/events.d.ts.map +1 -0
  219. package/dist/types/events.js +30 -0
  220. package/dist/types/events.js.map +1 -0
  221. package/dist/types/llm.d.ts +89 -0
  222. package/dist/types/llm.d.ts.map +1 -0
  223. package/dist/types/llm.js +12 -0
  224. package/dist/types/llm.js.map +1 -0
  225. package/dist/types/metrics.d.ts +34 -0
  226. package/dist/types/metrics.d.ts.map +1 -0
  227. package/dist/types/metrics.js +10 -0
  228. package/dist/types/metrics.js.map +1 -0
  229. package/dist/types/observer.d.ts +41 -0
  230. package/dist/types/observer.d.ts.map +1 -0
  231. package/dist/types/observer.js +41 -0
  232. package/dist/types/observer.js.map +1 -0
  233. package/dist/types/project-context.d.ts +18 -0
  234. package/dist/types/project-context.d.ts.map +1 -0
  235. package/dist/types/project-context.js +11 -0
  236. package/dist/types/project-context.js.map +1 -0
  237. package/dist/types/runtime.d.ts +71 -0
  238. package/dist/types/runtime.d.ts.map +1 -0
  239. package/dist/types/runtime.js +21 -0
  240. package/dist/types/runtime.js.map +1 -0
  241. package/dist/types/session.d.ts +103 -0
  242. package/dist/types/session.d.ts.map +1 -0
  243. package/dist/types/session.js +11 -0
  244. package/dist/types/session.js.map +1 -0
  245. package/dist/types/storage.d.ts +20 -0
  246. package/dist/types/storage.d.ts.map +1 -0
  247. package/dist/types/storage.js +41 -0
  248. package/dist/types/storage.js.map +1 -0
  249. package/dist/types/strategy.d.ts +124 -0
  250. package/dist/types/strategy.d.ts.map +1 -0
  251. package/dist/types/strategy.js +10 -0
  252. package/dist/types/strategy.js.map +1 -0
  253. package/dist/types/tools.d.ts +154 -0
  254. package/dist/types/tools.d.ts.map +1 -0
  255. package/dist/types/tools.js +11 -0
  256. package/dist/types/tools.js.map +1 -0
  257. package/dist/types/trace.d.ts +175 -0
  258. package/dist/types/trace.d.ts.map +1 -0
  259. package/dist/types/trace.js +26 -0
  260. package/dist/types/trace.js.map +1 -0
  261. package/dist/types/workspace.d.ts +29 -0
  262. package/dist/types/workspace.d.ts.map +1 -0
  263. package/dist/types/workspace.js +18 -0
  264. package/dist/types/workspace.js.map +1 -0
  265. package/package.json +45 -14
  266. package/skills/agent-cli.md +218 -0
  267. package/index.js +0 -2
@@ -0,0 +1,535 @@
1
+ /**
2
+ * `agent run` — single-session headless runner.
3
+ *
4
+ * Inputs (via parsed args): prompt (positional or --prompt) OR a full
5
+ * JSON payload via --json (stdin or file). Emits events to the chosen
6
+ * Emitter (ndjson default in non-TTY, text default in TTY) AND writes
7
+ * the same NDJSON stream to <log-dir>/<sessionId>.ndjson unless
8
+ * --no-log is set. The final `session_end` event includes the metrics
9
+ * totals so the log file is self-describing.
10
+ *
11
+ * --dry-run short-circuits: emits a single `dry_run_plan` event and
12
+ * returns 0. No LLM call, no tool dispatch, no sandbox.
13
+ */
14
+ import { existsSync, readFileSync } from 'node:fs';
15
+ import { dirname, resolve } from 'node:path';
16
+ import { fileURLToPath } from 'node:url';
17
+ import { createElement } from 'react';
18
+ import { createMetricsCollector } from '../../metrics.js';
19
+ import { createAgentSession } from '../../session.js';
20
+ import { createReactLoopStrategy } from '../../strategy.js';
21
+ import { createDispatch, createToolRegistry } from '../../tools.js';
22
+ import { combineObservers } from '../../types/observer.js';
23
+ import { fakeSandbox, scriptedLlm, writeCodeTool, writeRulesTool } from '../fixtures.js';
24
+ import { openRouterClient } from '../llm/openrouter.js';
25
+ import { errorEvent } from '../output.js';
26
+ import { openSessionLog } from '../session-log.js';
27
+ function readStdinSync() {
28
+ // Bun and modern Node both support readFileSync('/dev/stdin'). It blocks
29
+ // until EOF, which is what we want for an agent piping a small payload.
30
+ try {
31
+ return readFileSync(0, 'utf8');
32
+ }
33
+ catch {
34
+ return '';
35
+ }
36
+ }
37
+ /**
38
+ * Load `packages/agent/.env` into `process.env` if present. Bun
39
+ * auto-loads `.env` from CWD; this fallback covers the case where the
40
+ * user runs `bun packages/agent/bin/agent.ts run ...` from the
41
+ * worktree root (CWD is worktree root, not packages/agent). Existing
42
+ * process.env values are NOT overwritten — explicit env beats the
43
+ * file.
44
+ */
45
+ function loadPackageEnv() {
46
+ try {
47
+ // src/cli/commands → ../../.. → packages/agent
48
+ const here = dirname(fileURLToPath(import.meta.url));
49
+ const pkgRoot = resolve(here, '..', '..', '..');
50
+ const envPath = resolve(pkgRoot, '.env');
51
+ if (!existsSync(envPath))
52
+ return;
53
+ const text = readFileSync(envPath, 'utf8');
54
+ for (const rawLine of text.split('\n')) {
55
+ const line = rawLine.trim();
56
+ if (!line || line.startsWith('#'))
57
+ continue;
58
+ const eq = line.indexOf('=');
59
+ if (eq < 0)
60
+ continue;
61
+ const key = line.slice(0, eq).trim();
62
+ const raw = line.slice(eq + 1).trim();
63
+ // Strip surrounding single/double quotes if present.
64
+ const value = raw.replace(/^["']|["']$/g, '');
65
+ if (key && process.env[key] === undefined)
66
+ process.env[key] = value;
67
+ }
68
+ }
69
+ catch {
70
+ // Silent — env file is a convenience, not load-bearing.
71
+ }
72
+ }
73
+ // ─── TUI mode ────────────────────────────────────────────────────────
74
+ /**
75
+ * Map a SessionEvent to the NDJSON shape that goes into the session
76
+ * log file. Used by both the existing text/NDJSON emitter (via inline
77
+ * objects in the switch below) and by the TUI mode's log-tee
78
+ * (lifted here so the on-disk format stays identical regardless of
79
+ * which stdout renderer is in use). `runtime_changed` + `completed`
80
+ * return null — they don't surface to the log.
81
+ */
82
+ function eventToLogShape(ev, now, sessionId) {
83
+ switch (ev.kind) {
84
+ case 'turn_started':
85
+ return { type: 'turn_start', ts: now(), sessionId, turn: ev.turnId };
86
+ case 'thinking':
87
+ return { type: 'thinking', ts: now(), sessionId, chunk: ev.chunk };
88
+ case 'text':
89
+ return { type: 'text', ts: now(), sessionId, chunk: ev.chunk };
90
+ case 'tool_started':
91
+ return {
92
+ type: 'tool_call',
93
+ ts: now(),
94
+ sessionId,
95
+ name: ev.name,
96
+ callId: ev.callId,
97
+ args: ev.args,
98
+ };
99
+ case 'tool_finished':
100
+ return {
101
+ type: 'tool_result',
102
+ ts: now(),
103
+ sessionId,
104
+ callId: ev.callId,
105
+ ok: ev.result.ok,
106
+ summary: ev.result.summary,
107
+ };
108
+ case 'workspace_changed':
109
+ return {
110
+ type: 'workspace_changed',
111
+ ts: now(),
112
+ sessionId,
113
+ rulesLength: ev.workspace.rules.length,
114
+ codeLength: ev.workspace.code.length,
115
+ };
116
+ case 'turn_completed':
117
+ return {
118
+ type: 'turn_end',
119
+ ts: now(),
120
+ sessionId,
121
+ turn: ev.turnId,
122
+ metrics: {
123
+ tokensIn: ev.metrics.tokensIn,
124
+ tokensOut: ev.metrics.tokensOut,
125
+ costUsd: ev.metrics.costUsd,
126
+ },
127
+ };
128
+ case 'strategy_event':
129
+ return { type: 'strategy_event', ts: now(), sessionId, name: ev.name, data: ev.data };
130
+ case 'error':
131
+ return { type: 'session_error', ts: now(), sessionId, message: ev.message };
132
+ case 'runtime_changed':
133
+ case 'completed':
134
+ return null;
135
+ }
136
+ }
137
+ /**
138
+ * Drive the session stream through the OpenTUI/React `RunView`
139
+ * renderer. The TUI is the only consumer; it tees each event back to
140
+ * the session log file so the persisted record matches NDJSON mode
141
+ * byte-for-byte. On completion (or error) the renderer tears down
142
+ * and a one-line summary lands on stdout AFTER the alt-screen exits —
143
+ * preserves the "you can scroll back and see what ran" affordance.
144
+ */
145
+ async function runWithTui(input) {
146
+ // Lazy-import OpenTUI + RunView so the NDJSON / non-TTY path doesn't
147
+ // pay the native-binary load cost (the Zig core compiles + loads on
148
+ // import), and so `@opentui/react`'s internal extensionless ESM
149
+ // imports don't break consumers that only need the non-TUI surface.
150
+ const [{ createCliRenderer }, { createRoot }, { RunView }] = await Promise.all([
151
+ import('@opentui/core'),
152
+ import('@opentui/react'),
153
+ import('../ui/RunView.js'),
154
+ ]);
155
+ // Tee the session stream: write each event to the log file BEFORE
156
+ // forwarding to the TUI. RunView's pumpEvents consumes the
157
+ // forwarded events from `events`.
158
+ const teed = (async function* () {
159
+ for await (const ev of input.stream) {
160
+ const shape = eventToLogShape(ev, input.now, input.sessionId);
161
+ if (shape)
162
+ input.log.write(shape);
163
+ yield ev;
164
+ }
165
+ })();
166
+ const renderer = await createCliRenderer({ exitOnCtrlC: true });
167
+ const exit = 0;
168
+ // Wait for the user to press `q` / Escape AFTER the session has
169
+ // ended. The TUI stays alive between session_end and user-quit so
170
+ // the FinalSummary is readable — destroying immediately would flash
171
+ // the summary for one frame and clear the alt-screen.
172
+ await new Promise((resolve) => {
173
+ createRoot(renderer).render(createElement(RunView, {
174
+ events: teed,
175
+ bootstrap: {
176
+ sessionId: input.sessionId,
177
+ scenario: input.scenario,
178
+ llmLabel: input.llmLabel,
179
+ ...(input.llmFallbackReason ? { llmFallbackReason: input.llmFallbackReason } : {}),
180
+ promptPreview: input.promptPreview,
181
+ ...(input.log.path ? { logPath: input.log.path } : {}),
182
+ },
183
+ onQuit: () => resolve(),
184
+ }));
185
+ });
186
+ await renderer.destroy();
187
+ // Final summary lands on stdout after the alt-screen tears down so
188
+ // it stays in the user's scrollback.
189
+ const totals = input.metrics.totals();
190
+ const finalShape = {
191
+ type: 'session_end',
192
+ ts: input.now(),
193
+ sessionId: input.sessionId,
194
+ totals: {
195
+ turnCount: totals.turnCount,
196
+ tokensTotal: totals.tokensTotal,
197
+ tokensIn: totals.tokensIn,
198
+ tokensOut: totals.tokensOut,
199
+ tokensCached: totals.tokensCached,
200
+ tokensReasoning: totals.tokensReasoning,
201
+ costUsd: totals.costUsdTotal,
202
+ },
203
+ logPath: input.log.path,
204
+ exit,
205
+ };
206
+ input.log.write(finalShape);
207
+ input.log.close();
208
+ // Multi-line summary lands in scrollback so the user can see all
209
+ // the run metadata after the TUI tears down. The TUI's
210
+ // <FinalSummary> shows the same data inside the alt-screen, but
211
+ // that disappears on destroy; this is the persisted version. Plain
212
+ // text — ANSI codes intentionally omitted so it pipes/grep's
213
+ // cleanly.
214
+ const lines = [
215
+ '',
216
+ '─── session complete ──────────────────────────────',
217
+ ` status ${exit === 0 ? 'ok' : 'failed'}`,
218
+ ` turns ${totals.turnCount}`,
219
+ ` tokens ${totals.tokensTotal.toLocaleString()}` +
220
+ ` (in ${totals.tokensIn.toLocaleString()}` +
221
+ ` · out ${totals.tokensOut.toLocaleString()}` +
222
+ (totals.tokensCached > 0 ? ` · cached ${totals.tokensCached.toLocaleString()}` : '') +
223
+ (totals.tokensReasoning > 0
224
+ ? ` · reasoning ${totals.tokensReasoning.toLocaleString()}`
225
+ : '') +
226
+ ')',
227
+ ` cost $${totals.costUsdTotal.toFixed(6)}`,
228
+ ];
229
+ if (input.log.path)
230
+ lines.push(` log ${input.log.path}`);
231
+ lines.push('───────────────────────────────────────────────────');
232
+ lines.push('');
233
+ process.stdout.write(lines.join('\n'));
234
+ return exit;
235
+ }
236
+ function parsePayload(raw) {
237
+ let obj;
238
+ try {
239
+ obj = JSON.parse(raw);
240
+ }
241
+ catch (err) {
242
+ throw new Error(`--json payload is not valid JSON: ${err.message}`);
243
+ }
244
+ if (!obj || typeof obj !== 'object' || Array.isArray(obj)) {
245
+ throw new Error('--json payload must be a JSON object');
246
+ }
247
+ const p = obj;
248
+ if (typeof p['prompt'] !== 'string' || p['prompt'].length === 0) {
249
+ throw new Error('--json payload missing required string field "prompt"');
250
+ }
251
+ const out = { prompt: p['prompt'] };
252
+ if (typeof p['scenario'] === 'string')
253
+ out.scenario = p['scenario'];
254
+ if (typeof p['maxTurns'] === 'number')
255
+ out.maxTurns = p['maxTurns'];
256
+ if (typeof p['sessionId'] === 'string')
257
+ out.sessionId = p['sessionId'];
258
+ if (Array.isArray(p['history']))
259
+ out.history = p['history'];
260
+ return out;
261
+ }
262
+ function genSessionId(now) {
263
+ const ts = now().replace(/[:.]/g, '-');
264
+ const rand = Math.random().toString(36).slice(2, 8);
265
+ return `sess-${ts}-${rand}`;
266
+ }
267
+ export async function runCommand(args, io) {
268
+ loadPackageEnv();
269
+ const emit = io.emit;
270
+ const readFile = io.readFile ?? ((path) => readFileSync(path, 'utf8'));
271
+ const readStdin = io.readStdin ?? readStdinSync;
272
+ const now = io.now ?? (() => new Date().toISOString());
273
+ const openLog = io.openLog ?? openSessionLog;
274
+ // Resolve payload — either from --json or from --prompt/positional.
275
+ let payload;
276
+ if (args.options['json'] !== undefined) {
277
+ const target = args.options['json'];
278
+ const raw = target === '-' ? readStdin() : readFile(target);
279
+ if (!raw || raw.trim().length === 0) {
280
+ throw new Error('--json payload is empty');
281
+ }
282
+ payload = parsePayload(raw);
283
+ }
284
+ else {
285
+ const prompt = args.options['prompt'] ??
286
+ (args.positional.length > 0 ? args.positional.join(' ') : '');
287
+ if (!prompt) {
288
+ throw new Error('missing prompt: pass --prompt, a positional, or --json -');
289
+ }
290
+ payload = {
291
+ prompt,
292
+ scenario: args.options['scenario'] ?? 'echo',
293
+ maxTurns: args.options['max-turns'] ?? 8,
294
+ sessionId: args.options['session-id'],
295
+ };
296
+ }
297
+ if (payload.maxTurns !== undefined && (payload.maxTurns < 1 || payload.maxTurns > 64)) {
298
+ throw new Error('maxTurns must be 1..64');
299
+ }
300
+ const sessionId = payload.sessionId ?? genSessionId(now);
301
+ const scenario = payload.scenario ?? 'echo';
302
+ const logDir = args.options['log-dir'] ?? null;
303
+ const disableLog = Boolean(args.options['no-log']);
304
+ if (args.options['dry-run']) {
305
+ emit.event({
306
+ type: 'dry_run_plan',
307
+ ts: now(),
308
+ command: 'run',
309
+ sessionId,
310
+ scenario,
311
+ maxTurns: payload.maxTurns ?? 8,
312
+ promptPreview: payload.prompt.slice(0, 120),
313
+ logPath: disableLog ? null : `${logDir ?? '~/.pyric/sessions'}/${sessionId}.ndjson`,
314
+ }, () => `[plan] run · session=${sessionId} · scenario=${scenario} · turns<=${payload.maxTurns ?? 8} · prompt=${JSON.stringify(payload.prompt.slice(0, 60))}`);
315
+ emit.finish();
316
+ return 0;
317
+ }
318
+ const log = openLog({ logDir, sessionId, disabled: disableLog });
319
+ const emitBoth = (event, plain) => {
320
+ emit.event(event, plain);
321
+ log.write(event);
322
+ };
323
+ emitBoth({ type: 'session_start', ts: now(), sessionId, scenario, maxTurns: payload.maxTurns ?? 8 }, () => `[run] session ${sessionId} (${scenario})`);
324
+ const registry = createToolRegistry();
325
+ registry.register(writeRulesTool);
326
+ registry.register(writeCodeTool);
327
+ const metrics = createMetricsCollector();
328
+ const sandbox = fakeSandbox();
329
+ const sandboxObserver = {
330
+ onEvent(event) {
331
+ emitBoth({
332
+ type: 'sandbox_event',
333
+ ts: now(),
334
+ sessionId,
335
+ kind: event.kind,
336
+ detail: event.detail,
337
+ }, () => `[sandbox.${event.kind}] ${JSON.stringify(event.detail).slice(0, 120)}`);
338
+ },
339
+ };
340
+ void combineObservers(sandboxObserver);
341
+ // LLM selection. `--llm openrouter` (or its env-driven default when
342
+ // OPENROUTER_API_KEY is set) routes to a real model; otherwise we
343
+ // fall back to the scripted-fixture LLM for headless CI work.
344
+ // `bun run` auto-loads a `.env` from CWD, so dropping
345
+ // OPENROUTER_API_KEY=sk-or-...
346
+ // OPENROUTER_MODEL=z-ai/glm-4.6 # optional
347
+ // into `packages/agent/.env` and running from that directory is the
348
+ // easiest path. Explicit `--llm` / `--model` flags override env.
349
+ const llmFlag = args.options['llm'] ?? 'auto';
350
+ const modelFlag = args.options['model'] ?? undefined;
351
+ const reasoningFlag = args.options['reasoning'];
352
+ const apiKey = process.env.OPENROUTER_API_KEY;
353
+ const envModel = process.env.OPENROUTER_MODEL;
354
+ const wantOpenRouter = llmFlag === 'openrouter' || (llmFlag === 'auto' && apiKey);
355
+ let llm;
356
+ let llmLabel;
357
+ let llmFallbackReason;
358
+ if (wantOpenRouter) {
359
+ if (!apiKey) {
360
+ throw new Error('--llm openrouter requires OPENROUTER_API_KEY in env. Drop a `.env` ' +
361
+ 'with the key into packages/agent/ (auto-loaded regardless of CWD) ' +
362
+ 'or pass --llm scripted to use the fixture LLM.');
363
+ }
364
+ const model = modelFlag ?? envModel ?? 'z-ai/glm-4.6';
365
+ llm = openRouterClient({
366
+ apiKey,
367
+ model,
368
+ ...(reasoningFlag ? { reasoningEffort: reasoningFlag } : {}),
369
+ referer: 'https://github.com/davideast/inbrowser-agent',
370
+ title: '@inbrowser/agent CLI',
371
+ });
372
+ llmLabel = `openrouter:${model}`;
373
+ }
374
+ else {
375
+ llm = scriptedLlm(scenario, sessionId.slice(0, 8));
376
+ llmLabel = `scripted:${scenario}`;
377
+ if (llmFlag === 'auto') {
378
+ // Surface WHY we chose scripted, so the user sees `[llm]
379
+ // scripted:echo (no OPENROUTER_API_KEY in env; drop one in
380
+ // packages/agent/.env)` instead of silently going to fixtures.
381
+ llmFallbackReason =
382
+ 'no OPENROUTER_API_KEY in env; drop one in packages/agent/.env or pass --llm openrouter';
383
+ }
384
+ }
385
+ emitBoth({
386
+ type: 'llm_selected',
387
+ ts: now(),
388
+ sessionId,
389
+ llm: llmLabel,
390
+ ...(llmFallbackReason ? { fallbackReason: llmFallbackReason } : {}),
391
+ }, () => `[llm] ${llmLabel}${llmFallbackReason ? ` (${llmFallbackReason})` : ''}`);
392
+ const session = createAgentSession({
393
+ strategy: createReactLoopStrategy(),
394
+ llm,
395
+ tools: createDispatch(registry),
396
+ toolList: registry.list(),
397
+ toolContext: () => ({
398
+ workspace: session.workspace,
399
+ runtime: session.runtime,
400
+ sandbox,
401
+ lint: () => ({ warnings: [] }),
402
+ signal: new AbortController().signal,
403
+ }),
404
+ systemPromptBuilder: (w, r) => `Headless agent. preset=${w.presetId || '(none)'} errors=${r.uiErrors.length}`,
405
+ metrics,
406
+ history: payload.history ?? [],
407
+ id: sessionId,
408
+ });
409
+ // The fixture LLM is instant; real models stream for seconds → minutes.
410
+ // 30s was the fixture's safety net; bump to 5min when an external LLM
411
+ // drives the loop.
412
+ const submitTimeoutMs = wantOpenRouter ? 300_000 : 30_000;
413
+ // TUI mode: when emit is text mode AND stdout is a real TTY, mount
414
+ // the OpenTUI/React `RunView` instead of streaming per-event prose
415
+ // to stdout. Forcing text mode in a piped context (`--output text |
416
+ // tee log`) doesn't qualify — we still need cursor control. NDJSON
417
+ // and piped-text both fall through to the existing event emitter
418
+ // below.
419
+ const tuiEligible = emit.mode === 'text' && Boolean(process.stdout.isTTY) && !args.options['no-tui'];
420
+ if (tuiEligible) {
421
+ return await runWithTui({
422
+ stream: session.submit(payload.prompt, AbortSignal.timeout(submitTimeoutMs)),
423
+ log,
424
+ now,
425
+ sessionId,
426
+ llmLabel,
427
+ ...(llmFallbackReason ? { llmFallbackReason } : {}),
428
+ scenario,
429
+ promptPreview: payload.prompt.slice(0, 80),
430
+ metrics,
431
+ });
432
+ }
433
+ let exit = 0;
434
+ try {
435
+ const stream = session.submit(payload.prompt, AbortSignal.timeout(submitTimeoutMs));
436
+ for await (const ev of stream) {
437
+ switch (ev.kind) {
438
+ case 'turn_started':
439
+ emitBoth({ type: 'turn_start', ts: now(), sessionId, turn: ev.turnId }, () => `[turn ${ev.turnId.slice(0, 12)} start]`);
440
+ break;
441
+ case 'thinking':
442
+ emitBoth({ type: 'thinking', ts: now(), sessionId, chunk: ev.chunk }, () => `[thinking] ${ev.chunk.trim()}`);
443
+ break;
444
+ case 'text':
445
+ emitBoth({ type: 'text', ts: now(), sessionId, chunk: ev.chunk }, () => ev.chunk.trimEnd());
446
+ break;
447
+ case 'tool_started':
448
+ emitBoth({
449
+ type: 'tool_call',
450
+ ts: now(),
451
+ sessionId,
452
+ name: ev.name,
453
+ callId: ev.callId,
454
+ args: ev.args,
455
+ }, () => `[tool ${ev.name}(${ev.callId})]`);
456
+ break;
457
+ case 'tool_finished':
458
+ emitBoth({
459
+ type: 'tool_result',
460
+ ts: now(),
461
+ sessionId,
462
+ callId: ev.callId,
463
+ ok: ev.result.ok,
464
+ summary: ev.result.summary,
465
+ }, () => `[tool ${ev.callId} ${ev.result.ok ? 'ok' : 'fail'}] ${ev.result.summary ?? ''}`);
466
+ break;
467
+ case 'workspace_changed':
468
+ emitBoth({
469
+ type: 'workspace_changed',
470
+ ts: now(),
471
+ sessionId,
472
+ rulesLength: ev.workspace.rules.length,
473
+ codeLength: ev.workspace.code.length,
474
+ }, () => `[workspace] rules=${ev.workspace.rules.length} code=${ev.workspace.code.length}`);
475
+ break;
476
+ case 'turn_completed':
477
+ emitBoth({
478
+ type: 'turn_end',
479
+ ts: now(),
480
+ sessionId,
481
+ turn: ev.turnId,
482
+ metrics: {
483
+ tokensIn: ev.metrics.tokensIn,
484
+ tokensOut: ev.metrics.tokensOut,
485
+ costUsd: ev.metrics.costUsd,
486
+ },
487
+ }, () => `[turn ${ev.turnId.slice(0, 12)} done] ${ev.metrics.tokensIn}+${ev.metrics.tokensOut}t · $${ev.metrics.costUsd.toFixed(6)}`);
488
+ break;
489
+ case 'strategy_event':
490
+ emitBoth({ type: 'strategy_event', ts: now(), sessionId, name: ev.name, data: ev.data }, () => `[strategy] ${ev.name}`);
491
+ break;
492
+ case 'error':
493
+ emitBoth({ type: 'session_error', ts: now(), sessionId, message: ev.message }, () => `[error] ${ev.message}`);
494
+ exit = exit || 1;
495
+ break;
496
+ case 'runtime_changed':
497
+ // No-op for the CLI surface.
498
+ break;
499
+ case 'completed':
500
+ // session_end emitted below with totals.
501
+ break;
502
+ }
503
+ }
504
+ }
505
+ catch (err) {
506
+ emitBoth(errorEvent(err));
507
+ exit = 2;
508
+ }
509
+ const totals = metrics.totals();
510
+ emitBoth({
511
+ type: 'session_end',
512
+ ts: now(),
513
+ sessionId,
514
+ totals: {
515
+ turnCount: totals.turnCount,
516
+ tokensTotal: totals.tokensTotal,
517
+ tokensIn: totals.tokensIn,
518
+ tokensOut: totals.tokensOut,
519
+ tokensCached: totals.tokensCached,
520
+ tokensReasoning: totals.tokensReasoning,
521
+ costUsd: totals.costUsdTotal,
522
+ },
523
+ workspace: {
524
+ rulesLength: session.workspace.rules.length,
525
+ codeLength: session.workspace.code.length,
526
+ },
527
+ logPath: log.path,
528
+ exit,
529
+ }, () => `[run] done · ${totals.turnCount} turns · ${totals.tokensTotal} tokens · $${totals.costUsdTotal.toFixed(6)}` +
530
+ (log.path ? ` · log=${log.path}` : ''));
531
+ log.close();
532
+ emit.finish();
533
+ return exit;
534
+ }
535
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/cli/commands/run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAQtC,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEzF,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAmB,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAsBpE,SAAS,aAAa;IACpB,yEAAyE;IACzE,wEAAwE;IACxE,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,cAAc;IACrB,IAAI,CAAC;QACH,+CAA+C;QAC/C,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;YAAE,OAAO;QACjC,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC3C,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACvC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,SAAS;YAC5C,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC7B,IAAI,EAAE,GAAG,CAAC;gBAAE,SAAS;YACrB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACrC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACtC,qDAAqD;YACrD,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;YAC9C,IAAI,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS;gBAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACtE,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,wDAAwD;IAC1D,CAAC;AACH,CAAC;AAED,wEAAwE;AAExE;;;;;;;GAOG;AACH,SAAS,eAAe,CACtB,EAAgB,EAChB,GAAiB,EACjB,SAAiB;IAEjB,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;QAChB,KAAK,cAAc;YACjB,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC;QACvE,KAAK,UAAU;YACb,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC;QACrE,KAAK,MAAM;YACT,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC;QACjE,KAAK,cAAc;YACjB,OAAO;gBACL,IAAI,EAAE,WAAW;gBACjB,EAAE,EAAE,GAAG,EAAE;gBACT,SAAS;gBACT,IAAI,EAAE,EAAE,CAAC,IAAI;gBACb,MAAM,EAAE,EAAE,CAAC,MAAM;gBACjB,IAAI,EAAE,EAAE,CAAC,IAAI;aACd,CAAC;QACJ,KAAK,eAAe;YAClB,OAAO;gBACL,IAAI,EAAE,aAAa;gBACnB,EAAE,EAAE,GAAG,EAAE;gBACT,SAAS;gBACT,MAAM,EAAE,EAAE,CAAC,MAAM;gBACjB,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE;gBAChB,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO;aAC3B,CAAC;QACJ,KAAK,mBAAmB;YACtB,OAAO;gBACL,IAAI,EAAE,mBAAmB;gBACzB,EAAE,EAAE,GAAG,EAAE;gBACT,SAAS;gBACT,WAAW,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM;gBACtC,UAAU,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM;aACrC,CAAC;QACJ,KAAK,gBAAgB;YACnB,OAAO;gBACL,IAAI,EAAE,UAAU;gBAChB,EAAE,EAAE,GAAG,EAAE;gBACT,SAAS;gBACT,IAAI,EAAE,EAAE,CAAC,MAAM;gBACf,OAAO,EAAE;oBACP,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ;oBAC7B,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS;oBAC/B,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO;iBAC5B;aACF,CAAC;QACJ,KAAK,gBAAgB;YACnB,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;QACxF,KAAK,OAAO;YACV,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC;QAC9E,KAAK,iBAAiB,CAAC;QACvB,KAAK,WAAW;YACd,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAcD;;;;;;;GAOG;AACH,KAAK,UAAU,UAAU,CAAC,KAAsB;IAC9C,qEAAqE;IACrE,oEAAoE;IACpE,gEAAgE;IAChE,oEAAoE;IACpE,MAAM,CAAC,EAAE,iBAAiB,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC7E,MAAM,CAAC,eAAe,CAAC;QACvB,MAAM,CAAC,gBAAgB,CAAC;QACxB,MAAM,CAAC,kBAAkB,CAAC;KAC3B,CAAC,CAAC;IAEH,kEAAkE;IAClE,2DAA2D;IAC3D,kCAAkC;IAClC,MAAM,IAAI,GAAgC,CAAC,KAAK,SAAS,CAAC;QACxD,IAAI,KAAK,EAAE,MAAM,EAAE,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,eAAe,CAAC,EAAE,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;YAC9D,IAAI,KAAK;gBAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAClC,MAAM,EAAE,CAAC;QACX,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;IAEL,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,MAAM,IAAI,GAAG,CAAC,CAAC;IACf,gEAAgE;IAChE,kEAAkE;IAClE,oEAAoE;IACpE,sDAAsD;IACtD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAClC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CACzB,aAAa,CAAC,OAAO,EAAE;YACrB,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE;gBACT,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,GAAG,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,KAAK,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClF,aAAa,EAAE,KAAK,CAAC,aAAa;gBAClC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACvD;YACD,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE;SACxB,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;IAEzB,mEAAmE;IACnE,qCAAqC;IACrC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;IACtC,MAAM,UAAU,GAAG;QACjB,IAAI,EAAE,aAAa;QACnB,EAAE,EAAE,KAAK,CAAC,GAAG,EAAE;QACf,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,MAAM,EAAE;YACN,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,eAAe,EAAE,MAAM,CAAC,eAAe;YACvC,OAAO,EAAE,MAAM,CAAC,YAAY;SAC7B;QACD,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI;QACvB,IAAI;KACL,CAAC;IACF,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC5B,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;IAElB,iEAAiE;IACjE,uDAAuD;IACvD,gEAAgE;IAChE,mEAAmE;IACnE,6DAA6D;IAC7D,WAAW;IACX,MAAM,KAAK,GAAa;QACtB,EAAE;QACF,qDAAqD;QACrD,eAAe,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE;QAC7C,eAAe,MAAM,CAAC,SAAS,EAAE;QACjC,eAAe,MAAM,CAAC,WAAW,CAAC,cAAc,EAAE,EAAE;YAClD,QAAQ,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,EAAE;YAC1C,UAAU,MAAM,CAAC,SAAS,CAAC,cAAc,EAAE,EAAE;YAC7C,CAAC,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,MAAM,CAAC,YAAY,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACpF,CAAC,MAAM,CAAC,eAAe,GAAG,CAAC;gBACzB,CAAC,CAAC,gBAAgB,MAAM,CAAC,eAAe,CAAC,cAAc,EAAE,EAAE;gBAC3D,CAAC,CAAC,EAAE,CAAC;YACP,GAAG;QACL,gBAAgB,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;KACjD,CAAC;IACF,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,eAAe,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAChE,KAAK,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;IAClE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACvC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,YAAY,CAAC,GAAW;IAC/B,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,qCAAsC,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IACjF,CAAC;IACD,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IACD,MAAM,CAAC,GAAG,GAA8B,CAAC;IACzC,IAAI,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;IACD,MAAM,GAAG,GAAe,EAAE,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;IAChD,IAAI,OAAO,CAAC,CAAC,UAAU,CAAC,KAAK,QAAQ;QAAE,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,UAAU,CAAe,CAAC;IAClF,IAAI,OAAO,CAAC,CAAC,UAAU,CAAC,KAAK,QAAQ;QAAE,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;IACpE,IAAI,OAAO,CAAC,CAAC,WAAW,CAAC,KAAK,QAAQ;QAAE,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC;IACvE,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAAE,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,SAAS,CAAkB,CAAC;IAC7E,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,YAAY,CAAC,GAAiB;IACrC,MAAM,EAAE,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpD,OAAO,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAgB,EAAE,EAAgB;IACjE,cAAc,EAAE,CAAC;IACjB,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC;IACrB,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/E,MAAM,SAAS,GAAG,EAAE,CAAC,SAAS,IAAI,aAAa,CAAC;IAChD,MAAM,GAAG,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,IAAI,cAAc,CAAC;IAE7C,oEAAoE;IACpE,IAAI,OAAmB,CAAC;IACxB,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,SAAS,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAW,CAAC;QAC9C,MAAM,GAAG,GAAG,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC5D,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;SAAM,CAAC;QACN,MAAM,MAAM,GACT,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAwB;YAC9C,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAChE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAC9E,CAAC;QACD,OAAO,GAAG;YACR,MAAM;YACN,QAAQ,EAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAA4B,IAAI,MAAM;YACxE,QAAQ,EAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAwB,IAAI,CAAC;YAChE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAuB;SAC5D,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,QAAQ,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC;QACtF,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC;IACzD,MAAM,QAAQ,GAAe,OAAO,CAAC,QAAQ,IAAI,MAAM,CAAC;IACxD,MAAM,MAAM,GAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAwB,IAAI,IAAI,CAAC;IACvE,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEnD,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CACR;YACE,IAAI,EAAE,cAAc;YACpB,EAAE,EAAE,GAAG,EAAE;YACT,OAAO,EAAE,KAAK;YACd,SAAS;YACT,QAAQ;YACR,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,CAAC;YAC/B,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;YAC3C,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,mBAAmB,IAAI,SAAS,SAAS;SACpF,EACD,GAAG,EAAE,CACH,wBAAwB,SAAS,eAAe,QAAQ,aAAa,OAAO,CAAC,QAAQ,IAAI,CAAC,aAAa,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CACvJ,CAAC;QACF,IAAI,CAAC,MAAM,EAAE,CAAC;QACd,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;IAEjE,MAAM,QAAQ,GAAG,CAAC,KAA8B,EAAE,KAAoB,EAAE,EAAE;QACxE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACzB,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC,CAAC;IAEF,QAAQ,CACN,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,CAAC,EAAE,EAC1F,GAAG,EAAE,CAAC,iBAAiB,SAAS,KAAK,QAAQ,GAAG,CACjD,CAAC;IAEF,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;IACtC,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IAClC,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IAEjC,MAAM,OAAO,GAAG,sBAAsB,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;IAE9B,MAAM,eAAe,GAAG;QACtB,OAAO,CAAC,KAAoB;YAC1B,QAAQ,CACN;gBACE,IAAI,EAAE,eAAe;gBACrB,EAAE,EAAE,GAAG,EAAE;gBACT,SAAS;gBACT,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,MAAM,EAAE,KAAK,CAAC,MAAM;aACrB,EACD,GAAG,EAAE,CAAC,YAAY,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAC9E,CAAC;QACJ,CAAC;KACF,CAAC;IACF,KAAK,gBAAgB,CAAC,eAAe,CAAC,CAAC;IAEvC,oEAAoE;IACpE,kEAAkE;IAClE,8DAA8D;IAC9D,sDAAsD;IACtD,iCAAiC;IACjC,+CAA+C;IAC/C,oEAAoE;IACpE,iEAAiE;IACjE,MAAM,OAAO,GAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAwB,IAAI,MAAM,CAAC;IACtE,MAAM,SAAS,GAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAwB,IAAI,SAAS,CAAC;IAC7E,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAkD,CAAC;IACjG,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IAC9C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IAC9C,MAAM,cAAc,GAAG,OAAO,KAAK,YAAY,IAAI,CAAC,OAAO,KAAK,MAAM,IAAI,MAAM,CAAC,CAAC;IAElF,IAAI,GAAc,CAAC;IACnB,IAAI,QAAgB,CAAC;IACrB,IAAI,iBAAqC,CAAC;IAC1C,IAAI,cAAc,EAAE,CAAC;QACnB,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CACb,qEAAqE;gBACnE,oEAAoE;gBACpE,gDAAgD,CACnD,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,GAAG,SAAS,IAAI,QAAQ,IAAI,cAAc,CAAC;QACtD,GAAG,GAAG,gBAAgB,CAAC;YACrB,MAAM;YACN,KAAK;YACL,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5D,OAAO,EAAE,8CAA8C;YACvD,KAAK,EAAE,sBAAsB;SAC9B,CAAC,CAAC;QACH,QAAQ,GAAG,cAAc,KAAK,EAAE,CAAC;IACnC,CAAC;SAAM,CAAC;QACN,GAAG,GAAG,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACnD,QAAQ,GAAG,YAAY,QAAQ,EAAE,CAAC;QAClC,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;YACvB,yDAAyD;YACzD,2DAA2D;YAC3D,+DAA+D;YAC/D,iBAAiB;gBACf,wFAAwF,CAAC;QAC7F,CAAC;IACH,CAAC;IAED,QAAQ,CACN;QACE,IAAI,EAAE,cAAc;QACpB,EAAE,EAAE,GAAG,EAAE;QACT,SAAS;QACT,GAAG,EAAE,QAAQ;QACb,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpE,EACD,GAAG,EAAE,CAAC,SAAS,QAAQ,GAAG,iBAAiB,CAAC,CAAC,CAAC,KAAK,iBAAiB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC/E,CAAC;IAEF,MAAM,OAAO,GAAG,kBAAkB,CAAC;QACjC,QAAQ,EAAE,uBAAuB,EAAE;QACnC,GAAG;QACH,KAAK,EAAE,cAAc,CAAC,QAAQ,CAAC;QAC/B,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE;QACzB,WAAW,EAAE,GAAgB,EAAE,CAAC,CAAC;YAC/B,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,OAAO;YACP,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;YAC9B,MAAM,EAAE,IAAI,eAAe,EAAE,CAAC,MAAM;SACrC,CAAC;QACF,mBAAmB,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC5B,0BAA0B,CAAC,CAAC,QAAQ,IAAI,QAAQ,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE;QAChF,OAAO;QACP,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;QAC9B,EAAE,EAAE,SAAS;KACd,CAAC,CAAC;IAEH,wEAAwE;IACxE,sEAAsE;IACtE,mBAAmB;IACnB,MAAM,eAAe,GAAG,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;IAE1D,mEAAmE;IACnE,mEAAmE;IACnE,oEAAoE;IACpE,mEAAmE;IACnE,iEAAiE;IACjE,SAAS;IACT,MAAM,WAAW,GACf,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnF,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,MAAM,UAAU,CAAC;YACtB,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;YAC5E,GAAG;YACH,GAAG;YACH,SAAS;YACT,QAAQ;YACR,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnD,QAAQ;YACR,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;YAC1C,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAED,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC;QACpF,IAAI,KAAK,EAAE,MAAM,EAAE,IAAI,MAAqC,EAAE,CAAC;YAC7D,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;gBAChB,KAAK,cAAc;oBACjB,QAAQ,CACN,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,EAC7D,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAC/C,CAAC;oBACF,MAAM;gBACR,KAAK,UAAU;oBACb,QAAQ,CACN,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,EAC3D,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CACtC,CAAC;oBACF,MAAM;gBACR,KAAK,MAAM;oBACT,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,CACrE,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,CACnB,CAAC;oBACF,MAAM;gBACR,KAAK,cAAc;oBACjB,QAAQ,CACN;wBACE,IAAI,EAAE,WAAW;wBACjB,EAAE,EAAE,GAAG,EAAE;wBACT,SAAS;wBACT,IAAI,EAAE,EAAE,CAAC,IAAI;wBACb,MAAM,EAAE,EAAE,CAAC,MAAM;wBACjB,IAAI,EAAE,EAAE,CAAC,IAAI;qBACd,EACD,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,MAAM,IAAI,CACxC,CAAC;oBACF,MAAM;gBACR,KAAK,eAAe;oBAClB,QAAQ,CACN;wBACE,IAAI,EAAE,aAAa;wBACnB,EAAE,EAAE,GAAG,EAAE;wBACT,SAAS;wBACT,MAAM,EAAE,EAAE,CAAC,MAAM;wBACjB,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE;wBAChB,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO;qBAC3B,EACD,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,KAAK,EAAE,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,EAAE,CACvF,CAAC;oBACF,MAAM;gBACR,KAAK,mBAAmB;oBACtB,QAAQ,CACN;wBACE,IAAI,EAAE,mBAAmB;wBACzB,EAAE,EAAE,GAAG,EAAE;wBACT,SAAS;wBACT,WAAW,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM;wBACtC,UAAU,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM;qBACrC,EACD,GAAG,EAAE,CAAC,qBAAqB,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,SAAS,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,CACxF,CAAC;oBACF,MAAM;gBACR,KAAK,gBAAgB;oBACnB,QAAQ,CACN;wBACE,IAAI,EAAE,UAAU;wBAChB,EAAE,EAAE,GAAG,EAAE;wBACT,SAAS;wBACT,IAAI,EAAE,EAAE,CAAC,MAAM;wBACf,OAAO,EAAE;4BACP,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ;4BAC7B,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS;4BAC/B,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO;yBAC5B;qBACF,EACD,GAAG,EAAE,CACH,SAAS,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,OAAO,CAAC,SAAS,QAAQ,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAC9H,CAAC;oBACF,MAAM;gBACR,KAAK,gBAAgB;oBACnB,QAAQ,CACN,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAC9E,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC,IAAI,EAAE,CAC9B,CAAC;oBACF,MAAM;gBACR,KAAK,OAAO;oBACV,QAAQ,CACN,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,EACpE,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,CAC9B,CAAC;oBACF,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC;oBACjB,MAAM;gBACR,KAAK,iBAAiB;oBACpB,6BAA6B;oBAC7B,MAAM;gBACR,KAAK,WAAW;oBACd,yCAAyC;oBACzC,MAAM;YACV,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1B,IAAI,GAAG,CAAC,CAAC;IACX,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAChC,QAAQ,CACN;QACE,IAAI,EAAE,aAAa;QACnB,EAAE,EAAE,GAAG,EAAE;QACT,SAAS;QACT,MAAM,EAAE;YACN,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,eAAe,EAAE,MAAM,CAAC,eAAe;YACvC,OAAO,EAAE,MAAM,CAAC,YAAY;SAC7B;QACD,SAAS,EAAE;YACT,WAAW,EAAE,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM;YAC3C,UAAU,EAAE,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM;SAC1C;QACD,OAAO,EAAE,GAAG,CAAC,IAAI;QACjB,IAAI;KACL,EACD,GAAG,EAAE,CACH,gBAAgB,MAAM,CAAC,SAAS,YAAY,MAAM,CAAC,WAAW,cAAc,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;QAC5G,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CACzC,CAAC;IAEF,GAAG,CAAC,KAAK,EAAE,CAAC;IACZ,IAAI,CAAC,MAAM,EAAE,CAAC;IACd,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * `agent schema` — emit the full CliSpec as JSON. Stable contract for
3
+ * agent integrations: introspect once, cache the schema, and drive
4
+ * the CLI without reading `--help` text.
5
+ */
6
+ import type { Emitter } from '../output.js';
7
+ export declare function schemaCommand(emit: Emitter): number;
8
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/schema.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAG5C,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAInD"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * `agent schema` — emit the full CliSpec as JSON. Stable contract for
3
+ * agent integrations: introspect once, cache the schema, and drive
4
+ * the CLI without reading `--help` text.
5
+ */
6
+ import { CLI_SPEC } from '../spec.js';
7
+ export function schemaCommand(emit) {
8
+ emit.event({ type: 'schema', ...CLI_SPEC }, () => JSON.stringify(CLI_SPEC, null, 2));
9
+ emit.finish();
10
+ return 0;
11
+ }
12
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/cli/commands/schema.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,MAAM,UAAU,aAAa,CAAC,IAAa;IACzC,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,QAAQ,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACrF,IAAI,CAAC,MAAM,EAAE,CAAC;IACd,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * `agent serve` — inverse-mode MCP server entrypoint.
3
+ *
4
+ * Boots a stdio MCP server exposing every injected agent's tools as
5
+ * one flat catalog to an external host (Claude Code, Claude Desktop,
6
+ * Cursor, ...). Tool-surface minimization is the host's concern
7
+ * (allowlists in Claude Code settings, etc.); this command doesn't
8
+ * filter.
9
+ *
10
+ * The process holds stdin/stdout for the MCP transport, so:
11
+ * - no events go to stdout outside of --dry-run
12
+ * - the function never returns under normal operation; it resolves
13
+ * when the parent closes the transport.
14
+ *
15
+ * Agents come from `io.agents`. The CLI itself ships zero built-in
16
+ * agents — host packages (e.g. `firebase-agent-sdk`) wire their own
17
+ * agent definitions and call this command as a library.
18
+ */
19
+ import { serveAgentsOverStdio } from '../../mcp/serve.js';
20
+ import type { AgentDefinition } from '../../types/agent.js';
21
+ import type { ProjectContext } from '../../types/project-context.js';
22
+ import type { Emitter } from '../output.js';
23
+ import type { ParsedArgs } from '../parse.js';
24
+ export interface ServeCommandIO {
25
+ emit: Emitter;
26
+ now?: () => string;
27
+ /** Override the MCP serve function for tests. */
28
+ serve?: typeof serveAgentsOverStdio;
29
+ /** Agents to expose. Required — no built-ins. */
30
+ agents?: AgentDefinition[];
31
+ /**
32
+ * Pre-built `ProjectContext` for live-mode tools (e.g. Firestore
33
+ * audit's projectId mode). Hosts that own Firebase credentials wire
34
+ * this; agents that don't need live data ignore it.
35
+ */
36
+ agentApp?: ProjectContext;
37
+ }
38
+ export declare function serveCommand(args: ParsedArgs, io: ServeCommandIO): Promise<number>;
39
+ //# sourceMappingURL=serve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/serve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG9C,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,iDAAiD;IACjD,KAAK,CAAC,EAAE,OAAO,oBAAoB,CAAC;IACpC,iDAAiD;IACjD,MAAM,CAAC,EAAE,eAAe,EAAE,CAAC;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CA8DxF"}