@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,285 @@
1
+ /**
2
+ * OpenRouter `LlmClient` for the CLI's `agent run`.
3
+ *
4
+ * Distinct from the playground's `openrouterProvider` in
5
+ * `examples/admin-compat-browser/src/openrouter.ts` (which is browser-
6
+ * specific — reads keys from localStorage, surfaces BYOK forms, etc.).
7
+ * This module is CLI-native: it takes its config explicitly at
8
+ * construction time (no env-var sniffing here — the caller decides
9
+ * how to source the key) and implements the narrow `LlmClient`
10
+ * contract that `@inbrowser/agent`' strategy + session expect.
11
+ *
12
+ * Streams via OpenAI-compatible SSE. Function-calling supported via
13
+ * `tools` + `tool_choice: 'auto'`. Reasoning surfaced through
14
+ * `reasoning.effort` + `include_reasoning` headers for models that
15
+ * carry extended thinking (GLM, DeepSeek-R1, Claude, GPT reasoning
16
+ * models). Cost surfaced through OpenRouter's per-call `usage.cost`
17
+ * field so the agent's `MetricsCollector` doesn't need a per-model
18
+ * pricing table for OpenRouter-served models.
19
+ */
20
+ const ENDPOINT = 'https://openrouter.ai/api/v1/chat/completions';
21
+ export function openRouterClient(config) {
22
+ const endpoint = config.baseUrl ?? ENDPOINT;
23
+ const effort = config.reasoningEffort ?? 'off';
24
+ return {
25
+ id: `openrouter:${config.model}`,
26
+ supportsTools: true,
27
+ async *chat(req, signal) {
28
+ const messages = toOaiMessages(req.messages);
29
+ const tools = req.toolUseEnabled && req.tools.length > 0
30
+ ? req.tools.map((t) => ({
31
+ type: 'function',
32
+ function: {
33
+ name: t.name,
34
+ description: t.description,
35
+ parameters: t.parameters,
36
+ },
37
+ }))
38
+ : undefined;
39
+ const body = {
40
+ model: config.model,
41
+ messages,
42
+ stream: true,
43
+ ...(tools ? { tools, tool_choice: 'auto' } : {}),
44
+ ...(effort !== 'off'
45
+ ? {
46
+ reasoning: { effort, summary: 'auto' },
47
+ include_reasoning: true,
48
+ }
49
+ : {}),
50
+ };
51
+ const headers = {
52
+ 'content-type': 'application/json',
53
+ authorization: `Bearer ${config.apiKey}`,
54
+ };
55
+ if (config.referer)
56
+ headers['http-referer'] = config.referer;
57
+ if (config.title)
58
+ headers['x-title'] = config.title;
59
+ let res;
60
+ try {
61
+ res = await fetch(endpoint, {
62
+ method: 'POST',
63
+ headers,
64
+ body: JSON.stringify(body),
65
+ signal,
66
+ });
67
+ }
68
+ catch (err) {
69
+ yield { kind: 'error', message: `OpenRouter network error: ${errMsg(err)}` };
70
+ return;
71
+ }
72
+ if (!res.ok || !res.body) {
73
+ const detail = await res.text().catch(() => '');
74
+ yield {
75
+ kind: 'error',
76
+ message: `OpenRouter ${res.status}: ${detail || res.statusText}`,
77
+ };
78
+ return;
79
+ }
80
+ // Accumulators for the streaming turn.
81
+ const details = { requestedModel: config.model };
82
+ const toolBuf = new Map();
83
+ let usage;
84
+ let aborted = false;
85
+ try {
86
+ for await (const chunk of streamSse(res.body, signal)) {
87
+ if (signal.aborted) {
88
+ aborted = true;
89
+ break;
90
+ }
91
+ const c = chunk;
92
+ // Provenance — last-write-wins. The fields the agent's
93
+ // TurnDetails actually carries are `servedModel`,
94
+ // `fingerprint`, and free-form `routing`; OpenRouter's
95
+ // response id goes into routing alongside any other
96
+ // provider-specific signals.
97
+ if (c.model && !details.servedModel)
98
+ details.servedModel = c.model;
99
+ if (c.system_fingerprint && !details.fingerprint) {
100
+ details.fingerprint = c.system_fingerprint;
101
+ }
102
+ if (c.id) {
103
+ details.routing = { ...(details.routing ?? {}), responseId: c.id };
104
+ }
105
+ const choice = c.choices?.[0];
106
+ if (choice) {
107
+ const delta = choice.delta ?? {};
108
+ if (typeof delta.content === 'string' && delta.content.length > 0) {
109
+ yield { kind: 'text', chunk: delta.content };
110
+ }
111
+ // Reasoning: flat string OR structured array. Both → thinking events.
112
+ // Reasoning surface — providers send ONE of three shapes per
113
+ // chunk, but some (e.g. GLM) send both `reasoning` and
114
+ // `reasoning_content` for legacy-proxy compat. Pick the
115
+ // first non-empty shape and ignore the rest, otherwise the
116
+ // thinking pane shows every token twice. Matches the
117
+ // playground's openrouter.ts ordering.
118
+ const thinkingChunk = pickReasoning(delta.reasoning, delta.reasoning_content, delta.reasoning_details);
119
+ if (thinkingChunk)
120
+ yield { kind: 'thinking', chunk: thinkingChunk };
121
+ // Tool calls — accumulated per index, emitted at finish.
122
+ if (Array.isArray(delta.tool_calls)) {
123
+ for (const tc of delta.tool_calls) {
124
+ const i = tc.index;
125
+ const slot = toolBuf.get(i) ?? { id: '', name: '', argsBuf: '' };
126
+ if (tc.id)
127
+ slot.id = tc.id;
128
+ if (tc.function?.name)
129
+ slot.name = tc.function.name;
130
+ if (tc.function?.arguments)
131
+ slot.argsBuf += tc.function.arguments;
132
+ toolBuf.set(i, slot);
133
+ }
134
+ }
135
+ }
136
+ if (c.usage) {
137
+ usage = {
138
+ promptTokens: c.usage.prompt_tokens ?? 0,
139
+ completionTokens: c.usage.completion_tokens ?? 0,
140
+ ...(c.usage.prompt_tokens_details?.cached_tokens !== undefined
141
+ ? { cachedTokens: c.usage.prompt_tokens_details.cached_tokens }
142
+ : {}),
143
+ ...(c.usage.cost !== undefined ? { costUsd: c.usage.cost } : {}),
144
+ };
145
+ }
146
+ }
147
+ }
148
+ catch (err) {
149
+ if (signal.aborted) {
150
+ aborted = true;
151
+ }
152
+ else {
153
+ yield { kind: 'error', message: `OpenRouter stream error: ${errMsg(err)}` };
154
+ return;
155
+ }
156
+ }
157
+ // Emit accumulated tool calls before the turn-complete sentinel.
158
+ for (const slot of toolBuf.values()) {
159
+ if (!slot.name)
160
+ continue;
161
+ let args = slot.argsBuf;
162
+ if (slot.argsBuf.length > 0) {
163
+ try {
164
+ args = JSON.parse(slot.argsBuf);
165
+ }
166
+ catch {
167
+ // Leave as raw string; let the dispatcher surface the parse error.
168
+ }
169
+ }
170
+ else {
171
+ args = {};
172
+ }
173
+ yield {
174
+ kind: 'tool_call',
175
+ id: slot.id || `tc_${Math.random().toString(36).slice(2, 10)}`,
176
+ name: slot.name,
177
+ args,
178
+ };
179
+ }
180
+ if (aborted) {
181
+ yield { kind: 'error', message: 'OpenRouter stream aborted' };
182
+ return;
183
+ }
184
+ yield {
185
+ kind: 'turn_complete',
186
+ usage: usage ?? { promptTokens: 0, completionTokens: 0 },
187
+ details,
188
+ };
189
+ },
190
+ };
191
+ }
192
+ // ─── helpers ─────────────────────────────────────────────────────────
193
+ /**
194
+ * Pick the right reasoning surface from a chunk. Providers can fill
195
+ * `delta.reasoning` (flat string — DeepSeek-R1, Claude, GLM, Kimi,
196
+ * Minimax), `delta.reasoning_content` (legacy alias some proxies
197
+ * still emit alongside `reasoning`), or `delta.reasoning_details[]`
198
+ * (structured — OpenAI GPT-5 series). Returns the first non-empty
199
+ * value found; subsequent ones are dropped to avoid duplicated
200
+ * thinking output.
201
+ */
202
+ function pickReasoning(flat, alias, details) {
203
+ if (typeof flat === 'string' && flat.length > 0)
204
+ return flat;
205
+ if (typeof alias === 'string' && alias.length > 0)
206
+ return alias;
207
+ if (Array.isArray(details)) {
208
+ const parts = [];
209
+ for (const r of details) {
210
+ const text = r.summary ?? r.text;
211
+ if (typeof text === 'string' && text.length > 0)
212
+ parts.push(text);
213
+ }
214
+ if (parts.length > 0)
215
+ return parts.join('');
216
+ }
217
+ return null;
218
+ }
219
+ function toOaiMessages(messages) {
220
+ const out = [];
221
+ for (const m of messages) {
222
+ if (m.role === 'tool') {
223
+ out.push({
224
+ role: 'tool',
225
+ content: m.resultJson ?? '',
226
+ tool_call_id: m.callId ?? '',
227
+ });
228
+ continue;
229
+ }
230
+ const msg = { role: m.role, content: m.text };
231
+ if (m.role === 'assistant' && m.toolCalls && m.toolCalls.length > 0) {
232
+ msg.tool_calls = m.toolCalls.map((tc) => ({
233
+ id: tc.callId,
234
+ type: 'function',
235
+ function: { name: tc.name, arguments: JSON.stringify(tc.args ?? {}) },
236
+ }));
237
+ }
238
+ out.push(msg);
239
+ }
240
+ return out;
241
+ }
242
+ /**
243
+ * Async iterator over OpenAI-compatible SSE chunks. Yields parsed JSON
244
+ * objects, stops on `data: [DONE]`. Lines that aren't `data: ...` or
245
+ * that fail to parse are silently dropped — the OpenAI streaming spec
246
+ * permits comments + heartbeats.
247
+ */
248
+ async function* streamSse(body, signal) {
249
+ const reader = body.getReader();
250
+ const decoder = new TextDecoder('utf-8');
251
+ let buf = '';
252
+ try {
253
+ while (!signal.aborted) {
254
+ const { done, value } = await reader.read();
255
+ if (done)
256
+ break;
257
+ buf += decoder.decode(value, { stream: true });
258
+ // SSE messages are separated by blank lines. Process complete
259
+ // events; keep the trailing partial in the buffer.
260
+ let idx;
261
+ while ((idx = buf.indexOf('\n')) >= 0) {
262
+ const rawLine = buf.slice(0, idx).replace(/\r$/, '');
263
+ buf = buf.slice(idx + 1);
264
+ if (!rawLine.startsWith('data:'))
265
+ continue;
266
+ const payload = rawLine.slice(5).trim();
267
+ if (payload === '[DONE]')
268
+ return;
269
+ try {
270
+ yield JSON.parse(payload);
271
+ }
272
+ catch {
273
+ // Drop malformed chunk; keep streaming.
274
+ }
275
+ }
276
+ }
277
+ }
278
+ finally {
279
+ reader.releaseLock();
280
+ }
281
+ }
282
+ function errMsg(e) {
283
+ return e instanceof Error ? e.message : String(e);
284
+ }
285
+ //# sourceMappingURL=openrouter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openrouter.js","sourceRoot":"","sources":["../../../src/cli/llm/openrouter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * `agent` CLI entry. The `bin/agent.ts` shebang script is a one-liner
3
+ * that imports `main` from here so the dispatching logic stays
4
+ * importable + unit-testable.
5
+ *
6
+ * Top-level guarantees:
7
+ * - argv is parsed against `spec.ts` with input hardening enforced
8
+ * before any side effect.
9
+ * - Errors are emitted as a single structured event and surface as
10
+ * non-zero exit codes (64 for usage/hardening, 1 for runtime).
11
+ * - Output mode auto-selects: NDJSON when stdout is not a TTY,
12
+ * text when it is, overridden by --output.
13
+ */
14
+ import type { AgentDefinition } from '../types/agent.js';
15
+ import type { ProjectContext } from '../types/project-context.js';
16
+ export interface MainOptions {
17
+ argv?: readonly string[];
18
+ cwd?: string;
19
+ stdout?: NodeJS.WriteStream;
20
+ stderr?: NodeJS.WriteStream;
21
+ now?: () => string;
22
+ /**
23
+ * Agents to expose under `agent serve`. The bare CLI ships zero
24
+ * built-ins; host packages wire their own here. Ignored by every
25
+ * other subcommand.
26
+ */
27
+ serveAgents?: AgentDefinition[];
28
+ /** Pre-built `ProjectContext` for `agent serve` live-mode tools. */
29
+ serveAgentApp?: ProjectContext;
30
+ }
31
+ export declare function main(opts?: MainOptions): Promise<number>;
32
+ //# sourceMappingURL=main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAclE,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB;;;;OAIG;IACH,WAAW,CAAC,EAAE,eAAe,EAAE,CAAC;IAChC,oEAAoE;IACpE,aAAa,CAAC,EAAE,cAAc,CAAC;CAChC;AAED,wBAAsB,IAAI,CAAC,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CA4FlE"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * `agent` CLI entry. The `bin/agent.ts` shebang script is a one-liner
3
+ * that imports `main` from here so the dispatching logic stays
4
+ * importable + unit-testable.
5
+ *
6
+ * Top-level guarantees:
7
+ * - argv is parsed against `spec.ts` with input hardening enforced
8
+ * before any side effect.
9
+ * - Errors are emitted as a single structured event and surface as
10
+ * non-zero exit codes (64 for usage/hardening, 1 for runtime).
11
+ * - Output mode auto-selects: NDJSON when stdout is not a TTY,
12
+ * text when it is, overridden by --output.
13
+ */
14
+ import { describeCommand } from './commands/describe.js';
15
+ import { eventsCommand } from './commands/events.js';
16
+ import { fleetCommand } from './commands/fleet.js';
17
+ import { helpCommand, versionCommand } from './commands/help.js';
18
+ import { migrateCommand } from './commands/migrate.js';
19
+ import { runCommand } from './commands/run.js';
20
+ import { schemaCommand } from './commands/schema.js';
21
+ import { serveCommand } from './commands/serve.js';
22
+ import { undoCommand } from './commands/undo.js';
23
+ import { createEmitter, errorEvent, pickMode } from './output.js';
24
+ import { InputHardeningError, UsageError, parseArgs } from './parse.js';
25
+ export async function main(opts = {}) {
26
+ const argv = opts.argv ?? process.argv.slice(2);
27
+ const cwd = opts.cwd ?? process.cwd();
28
+ const stdout = opts.stdout ?? process.stdout;
29
+ let mode = pickMode(undefined, stdout);
30
+ let emit = createEmitter({ mode }, stdout);
31
+ let args;
32
+ try {
33
+ args = parseArgs(argv, cwd);
34
+ }
35
+ catch (err) {
36
+ if (err instanceof InputHardeningError) {
37
+ emit.event(errorEvent(err), () => `error: ${err.message}`);
38
+ emit.finish();
39
+ return 64;
40
+ }
41
+ if (err instanceof UsageError) {
42
+ emit.event({ type: 'error', name: 'UsageError', message: err.message, hint: err.hint }, () => `error: ${err.message}${err.hint ? `\n hint: ${err.hint}` : ''}`);
43
+ emit.finish();
44
+ return 64;
45
+ }
46
+ emit.event(errorEvent(err));
47
+ emit.finish();
48
+ return 2;
49
+ }
50
+ // Honor --output / --fields globally (re-create the emitter now that we know).
51
+ const requested = args.options['output'] ?? undefined;
52
+ mode = pickMode(requested, stdout);
53
+ const rawFields = args.options['fields'];
54
+ const fields = Array.isArray(rawFields) ? rawFields : undefined;
55
+ emit = createEmitter({ mode, fields }, stdout);
56
+ // --help on any subcommand: re-route to the help command scoped to it.
57
+ if (args.options['help']) {
58
+ return helpCommand({ command: 'help', options: {}, positional: [args.command], remainder: [] }, emit);
59
+ }
60
+ try {
61
+ switch (args.command) {
62
+ case 'run':
63
+ return await runCommand(args, { emit, now: opts.now });
64
+ case 'fleet':
65
+ return await fleetCommand(args, { emit, now: opts.now });
66
+ case 'describe':
67
+ return describeCommand(args, emit);
68
+ case 'schema':
69
+ return schemaCommand(emit);
70
+ case 'events':
71
+ return eventsCommand(args, { emit });
72
+ case 'undo':
73
+ return undoCommand(args, { emit, now: opts.now });
74
+ case 'serve':
75
+ return await serveCommand(args, {
76
+ emit,
77
+ now: opts.now,
78
+ ...(opts.serveAgents ? { agents: opts.serveAgents } : {}),
79
+ ...(opts.serveAgentApp ? { agentApp: opts.serveAgentApp } : {}),
80
+ });
81
+ case 'migrate':
82
+ return migrateCommand(args, { emit, now: opts.now });
83
+ case 'version':
84
+ return versionCommand(emit);
85
+ case 'help':
86
+ default:
87
+ return helpCommand(args, emit);
88
+ }
89
+ }
90
+ catch (err) {
91
+ if (err instanceof InputHardeningError) {
92
+ emit.event(errorEvent(err), () => `error: ${err.message}`);
93
+ emit.finish();
94
+ return 64;
95
+ }
96
+ if (err instanceof UsageError) {
97
+ emit.event({ type: 'error', name: 'UsageError', message: err.message, hint: err.hint }, () => `error: ${err.message}${err.hint ? `\n hint: ${err.hint}` : ''}`);
98
+ emit.finish();
99
+ return 64;
100
+ }
101
+ emit.event(errorEvent(err), () => `error: ${err instanceof Error ? err.message : String(err)}`);
102
+ emit.finish();
103
+ return 1;
104
+ }
105
+ }
106
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAElE,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAkBxE,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,OAAoB,EAAE;IAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAChD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACtC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IAE7C,IAAI,IAAI,GAAe,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACnD,IAAI,IAAI,GAAG,aAAa,CAAC,EAAE,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;IAE3C,IAAI,IAAI,CAAC;IACT,IAAI,CAAC;QACH,IAAI,GAAG,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,mBAAmB,EAAE,CAAC;YACvC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC3D,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,IAAI,GAAG,YAAY,UAAU,EAAE,CAAC;YAC9B,IAAI,CAAC,KAAK,CACR,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,EAC3E,GAAG,EAAE,CAAC,UAAU,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CACxE,CAAC;YACF,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5B,IAAI,CAAC,MAAM,EAAE,CAAC;QACd,OAAO,CAAC,CAAC;IACX,CAAC;IAED,+EAA+E;IAC/E,MAAM,SAAS,GAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAA4B,IAAI,SAAS,CAAC;IAClF,IAAI,GAAG,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACnC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAChE,IAAI,GAAG,aAAa,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC;IAE/C,uEAAuE;IACvE,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,OAAO,WAAW,CAChB,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,EAC3E,IAAI,CACL,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,QAAQ,IAAI,CAAC,OAAO,EAAE,CAAC;YACrB,KAAK,KAAK;gBACR,OAAO,MAAM,UAAU,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YACzD,KAAK,OAAO;gBACV,OAAO,MAAM,YAAY,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YAC3D,KAAK,UAAU;gBACb,OAAO,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACrC,KAAK,QAAQ;gBACX,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC;YAC7B,KAAK,QAAQ;gBACX,OAAO,aAAa,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;YACvC,KAAK,MAAM;gBACT,OAAO,WAAW,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YACpD,KAAK,OAAO;gBACV,OAAO,MAAM,YAAY,CAAC,IAAI,EAAE;oBAC9B,IAAI;oBACJ,GAAG,EAAE,IAAI,CAAC,GAAG;oBACb,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACzD,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAChE,CAAC,CAAC;YACL,KAAK,SAAS;gBACZ,OAAO,cAAc,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YACvD,KAAK,SAAS;gBACZ,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC;YAC9B,KAAK,MAAM,CAAC;YACZ;gBACE,OAAO,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,mBAAmB,EAAE,CAAC;YACvC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,UAAU,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC3D,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,IAAI,GAAG,YAAY,UAAU,EAAE,CAAC;YAC9B,IAAI,CAAC,KAAK,CACR,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,EAC3E,GAAG,EAAE,CAAC,UAAU,GAAG,CAAC,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CACxE,CAAC;YACF,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChG,IAAI,CAAC,MAAM,EAAE,CAAC;QACd,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Output layer — Agent DX axes 1 (machine-readable) + 4 (context window
3
+ * discipline). Three modes:
4
+ *
5
+ * - `ndjson` — one JSON object per line, flushed as it's emitted.
6
+ * Default when stdout is not a TTY. Streams paginated/long
7
+ * results.
8
+ * - `json` — single buffered JSON object at the end (for describe /
9
+ * schema / one-shot help).
10
+ * - `text` — human-readable, ANSI-styled. Default in a TTY.
11
+ *
12
+ * Field filtering via `--fields` applies to ndjson and json. Field
13
+ * names are matched literally against the top-level keys of the
14
+ * emitted object. Unmatched fields are dropped silently.
15
+ */
16
+ import type { WriteStream } from 'node:tty';
17
+ export type OutputMode = 'ndjson' | 'json' | 'text';
18
+ export interface OutputOptions {
19
+ mode: OutputMode;
20
+ /** Allowlist of top-level fields to include in ndjson/json output. */
21
+ fields?: readonly string[];
22
+ /** Disable ANSI styling. Auto-true when not a TTY. */
23
+ noColor?: boolean;
24
+ }
25
+ export interface Emitter {
26
+ readonly mode: OutputMode;
27
+ /** Emit one event (NDJSON line) or buffer it (JSON). Pass `text` for plain text mode. */
28
+ event(obj: Record<string, unknown>, plain?: () => string): void;
29
+ /** Flush buffered output. For ndjson + text this is a no-op. */
30
+ finish(): void;
31
+ }
32
+ export declare function pickMode(preferred: OutputMode | undefined, stream: NodeJS.WriteStream | WriteStream): OutputMode;
33
+ export declare function createEmitter(opts: OutputOptions, stream?: NodeJS.WriteStream): Emitter;
34
+ /** Convenience: bundle an Error into a structured event. */
35
+ export declare function errorEvent(err: unknown): Record<string, unknown>;
36
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/cli/output.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;AAEpD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,UAAU,CAAC;IACjB,sEAAsE;IACtE,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,sDAAsD;IACtD,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,yFAAyF;IACzF,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IAChE,gEAAgE;IAChE,MAAM,IAAI,IAAI,CAAC;CAChB;AAcD,wBAAgB,QAAQ,CACtB,SAAS,EAAE,UAAU,GAAG,SAAS,EACjC,MAAM,EAAE,MAAM,CAAC,WAAW,GAAG,WAAW,GACvC,UAAU,CAGZ;AAED,wBAAgB,aAAa,CAC3B,IAAI,EAAE,aAAa,EACnB,MAAM,GAAE,MAAM,CAAC,WAA4B,GAC1C,OAAO,CAuCT;AAED,4DAA4D;AAC5D,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAoBhE"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Output layer — Agent DX axes 1 (machine-readable) + 4 (context window
3
+ * discipline). Three modes:
4
+ *
5
+ * - `ndjson` — one JSON object per line, flushed as it's emitted.
6
+ * Default when stdout is not a TTY. Streams paginated/long
7
+ * results.
8
+ * - `json` — single buffered JSON object at the end (for describe /
9
+ * schema / one-shot help).
10
+ * - `text` — human-readable, ANSI-styled. Default in a TTY.
11
+ *
12
+ * Field filtering via `--fields` applies to ndjson and json. Field
13
+ * names are matched literally against the top-level keys of the
14
+ * emitted object. Unmatched fields are dropped silently.
15
+ */
16
+ function projectFields(obj, fields) {
17
+ if (!fields || fields.length === 0)
18
+ return obj;
19
+ const out = {};
20
+ for (const f of fields) {
21
+ if (Object.prototype.hasOwnProperty.call(obj, f))
22
+ out[f] = obj[f];
23
+ }
24
+ return out;
25
+ }
26
+ export function pickMode(preferred, stream) {
27
+ if (preferred)
28
+ return preferred;
29
+ return stream.isTTY ? 'text' : 'ndjson';
30
+ }
31
+ export function createEmitter(opts, stream = process.stdout) {
32
+ const fields = opts.fields;
33
+ if (opts.mode === 'ndjson') {
34
+ return {
35
+ mode: 'ndjson',
36
+ event(obj) {
37
+ stream.write(JSON.stringify(projectFields(obj, fields)) + '\n');
38
+ },
39
+ finish() { },
40
+ };
41
+ }
42
+ if (opts.mode === 'json') {
43
+ const buf = [];
44
+ return {
45
+ mode: 'json',
46
+ event(obj) {
47
+ buf.push(projectFields(obj, fields));
48
+ },
49
+ finish() {
50
+ // Emit a single object when there's exactly one event (describe / schema /
51
+ // help shapes). Otherwise emit an array — preserves stream-like callers
52
+ // that only buffered for terminal output.
53
+ const payload = buf.length === 1 ? buf[0] : buf;
54
+ stream.write(JSON.stringify(payload, null, 2) + '\n');
55
+ },
56
+ };
57
+ }
58
+ // text — ignore fields, prefer the `plain()` thunk if provided.
59
+ return {
60
+ mode: 'text',
61
+ event(obj, plain) {
62
+ if (plain) {
63
+ stream.write(plain() + '\n');
64
+ }
65
+ else {
66
+ stream.write(JSON.stringify(obj) + '\n');
67
+ }
68
+ },
69
+ finish() { },
70
+ };
71
+ }
72
+ /** Convenience: bundle an Error into a structured event. */
73
+ export function errorEvent(err) {
74
+ if (err instanceof Error) {
75
+ const out = {
76
+ type: 'error',
77
+ ts: new Date().toISOString(),
78
+ name: err.name,
79
+ message: err.message,
80
+ };
81
+ // Surface our own fields (InputHardeningError carries field/reason).
82
+ for (const k of Object.keys(err)) {
83
+ if (k === 'message' || k === 'stack' || k === 'name')
84
+ continue;
85
+ out[k] = err[k];
86
+ }
87
+ return out;
88
+ }
89
+ return {
90
+ type: 'error',
91
+ ts: new Date().toISOString(),
92
+ message: String(err),
93
+ };
94
+ }
95
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/cli/output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Schema-driven arg parser. Inputs flow through `hardenString`/`hardenPath`
3
+ * per the rules declared in `spec.ts` — there is no second source of
4
+ * truth. Returns a typed `ParsedArgs` or throws `InputHardeningError`
5
+ * (already structured for NDJSON emission).
6
+ */
7
+ import { InputHardeningError } from './hardening.js';
8
+ export interface ParsedArgs {
9
+ command: string;
10
+ options: Record<string, string | number | boolean | string[]>;
11
+ positional: string[];
12
+ /** Original argv minus the parsed command, useful for diagnostics. */
13
+ remainder: string[];
14
+ }
15
+ export declare class UsageError extends Error {
16
+ readonly hint?: string | undefined;
17
+ readonly name = "UsageError";
18
+ constructor(message: string, hint?: string | undefined);
19
+ }
20
+ /**
21
+ * Parse argv into `{command, options, positional}`. The first
22
+ * non-option token is the command. Unknown flags throw `UsageError`.
23
+ */
24
+ export declare function parseArgs(argv: readonly string[], cwd?: string): ParsedArgs;
25
+ export { InputHardeningError };
26
+ //# sourceMappingURL=parse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../src/cli/parse.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,mBAAmB,EAA4B,MAAM,gBAAgB,CAAC;AAI/E,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,CAAC,CAAC;IAC9D,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,sEAAsE;IACtE,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,qBAAa,UAAW,SAAQ,KAAK;IAIjC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM;IAHxB,SAAkB,IAAI,gBAAgB;gBAEpC,OAAO,EAAE,MAAM,EACN,IAAI,CAAC,EAAE,MAAM,YAAA;CAIzB;AAoED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,GAAG,GAAE,MAAsB,GAAG,UAAU,CAiG1F;AAED,OAAO,EAAE,mBAAmB,EAAE,CAAC"}