@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.
- package/AGENTS.md +270 -0
- package/LICENSE +21 -0
- package/README.md +117 -2
- package/bin/agent.ts +10 -0
- package/dist/cli/commands/describe.d.ts +14 -0
- package/dist/cli/commands/describe.d.ts.map +1 -0
- package/dist/cli/commands/describe.js +179 -0
- package/dist/cli/commands/describe.js.map +1 -0
- package/dist/cli/commands/events.d.ts +21 -0
- package/dist/cli/commands/events.d.ts.map +1 -0
- package/dist/cli/commands/events.js +59 -0
- package/dist/cli/commands/events.js.map +1 -0
- package/dist/cli/commands/fleet.d.ts +15 -0
- package/dist/cli/commands/fleet.d.ts.map +1 -0
- package/dist/cli/commands/fleet.js +149 -0
- package/dist/cli/commands/fleet.js.map +1 -0
- package/dist/cli/commands/help.d.ts +15 -0
- package/dist/cli/commands/help.d.ts.map +1 -0
- package/dist/cli/commands/help.js +93 -0
- package/dist/cli/commands/help.js.map +1 -0
- package/dist/cli/commands/migrate.d.ts +27 -0
- package/dist/cli/commands/migrate.d.ts.map +1 -0
- package/dist/cli/commands/migrate.js +109 -0
- package/dist/cli/commands/migrate.js.map +1 -0
- package/dist/cli/commands/run.d.ts +38 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/run.js +535 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/schema.d.ts +8 -0
- package/dist/cli/commands/schema.d.ts.map +1 -0
- package/dist/cli/commands/schema.js +12 -0
- package/dist/cli/commands/schema.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +39 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/serve.js +65 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/undo.d.ts +36 -0
- package/dist/cli/commands/undo.d.ts.map +1 -0
- package/dist/cli/commands/undo.js +132 -0
- package/dist/cli/commands/undo.js.map +1 -0
- package/dist/cli/fixtures.d.ts +17 -0
- package/dist/cli/fixtures.d.ts.map +1 -0
- package/dist/cli/fixtures.js +107 -0
- package/dist/cli/fixtures.js.map +1 -0
- package/dist/cli/hardening.d.ts +39 -0
- package/dist/cli/hardening.d.ts.map +1 -0
- package/dist/cli/hardening.js +68 -0
- package/dist/cli/hardening.js.map +1 -0
- package/dist/cli/index.d.ts +28 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +19 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/llm/openrouter.d.ts +33 -0
- package/dist/cli/llm/openrouter.d.ts.map +1 -0
- package/dist/cli/llm/openrouter.js +285 -0
- package/dist/cli/llm/openrouter.js.map +1 -0
- package/dist/cli/main.d.ts +32 -0
- package/dist/cli/main.d.ts.map +1 -0
- package/dist/cli/main.js +106 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/output.d.ts +36 -0
- package/dist/cli/output.d.ts.map +1 -0
- package/dist/cli/output.js +95 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/cli/parse.d.ts +26 -0
- package/dist/cli/parse.d.ts.map +1 -0
- package/dist/cli/parse.js +160 -0
- package/dist/cli/parse.js.map +1 -0
- package/dist/cli/session-log.d.ts +34 -0
- package/dist/cli/session-log.d.ts.map +1 -0
- package/dist/cli/session-log.js +52 -0
- package/dist/cli/session-log.js.map +1 -0
- package/dist/cli/spec.d.ts +62 -0
- package/dist/cli/spec.d.ts.map +1 -0
- package/dist/cli/spec.js +510 -0
- package/dist/cli/spec.js.map +1 -0
- package/dist/cli/ui/RunView.d.ts +134 -0
- package/dist/cli/ui/RunView.d.ts.map +1 -0
- package/dist/cli/ui/RunView.js +341 -0
- package/dist/cli/ui/RunView.js.map +1 -0
- package/dist/diagnostics/index.d.ts +5 -0
- package/dist/diagnostics/index.d.ts.map +1 -0
- package/dist/diagnostics/index.js +3 -0
- package/dist/diagnostics/index.js.map +1 -0
- package/dist/diagnostics/timing.d.ts +48 -0
- package/dist/diagnostics/timing.d.ts.map +1 -0
- package/dist/diagnostics/timing.js +85 -0
- package/dist/diagnostics/timing.js.map +1 -0
- package/dist/diagnostics/truthfulness.d.ts +36 -0
- package/dist/diagnostics/truthfulness.d.ts.map +1 -0
- package/dist/diagnostics/truthfulness.js +180 -0
- package/dist/diagnostics/truthfulness.js.map +1 -0
- package/dist/dispatch-memoization.d.ts +84 -0
- package/dist/dispatch-memoization.d.ts.map +1 -0
- package/dist/dispatch-memoization.js +197 -0
- package/dist/dispatch-memoization.js.map +1 -0
- package/dist/eval/comparison-report.d.ts +164 -0
- package/dist/eval/comparison-report.d.ts.map +1 -0
- package/dist/eval/comparison-report.js +316 -0
- package/dist/eval/comparison-report.js.map +1 -0
- package/dist/eval/fixture.d.ts +74 -0
- package/dist/eval/fixture.d.ts.map +1 -0
- package/dist/eval/fixture.js +217 -0
- package/dist/eval/fixture.js.map +1 -0
- package/dist/eval/index.d.ts +13 -0
- package/dist/eval/index.d.ts.map +1 -0
- package/dist/eval/index.js +7 -0
- package/dist/eval/index.js.map +1 -0
- package/dist/eval/load-node.d.ts +16 -0
- package/dist/eval/load-node.d.ts.map +1 -0
- package/dist/eval/load-node.js +58 -0
- package/dist/eval/load-node.js.map +1 -0
- package/dist/eval/metric-collector.d.ts +209 -0
- package/dist/eval/metric-collector.d.ts.map +1 -0
- package/dist/eval/metric-collector.js +293 -0
- package/dist/eval/metric-collector.js.map +1 -0
- package/dist/eval/run-record.d.ts +76 -0
- package/dist/eval/run-record.d.ts.map +1 -0
- package/dist/eval/run-record.js +32 -0
- package/dist/eval/run-record.js.map +1 -0
- package/dist/eval/runner.d.ts +140 -0
- package/dist/eval/runner.d.ts.map +1 -0
- package/dist/eval/runner.js +310 -0
- package/dist/eval/runner.js.map +1 -0
- package/dist/eval/spec-framework.d.ts +113 -0
- package/dist/eval/spec-framework.d.ts.map +1 -0
- package/dist/eval/spec-framework.js +100 -0
- package/dist/eval/spec-framework.js.map +1 -0
- package/dist/eval/spec-helpers.d.ts +245 -0
- package/dist/eval/spec-helpers.d.ts.map +1 -0
- package/dist/eval/spec-helpers.js +605 -0
- package/dist/eval/spec-helpers.js.map +1 -0
- package/dist/events/codec.d.ts +79 -0
- package/dist/events/codec.d.ts.map +1 -0
- package/dist/events/codec.js +142 -0
- package/dist/events/codec.js.map +1 -0
- package/dist/events/log-core.d.ts +76 -0
- package/dist/events/log-core.d.ts.map +1 -0
- package/dist/events/log-core.js +73 -0
- package/dist/events/log-core.js.map +1 -0
- package/dist/events/log.d.ts +60 -0
- package/dist/events/log.d.ts.map +1 -0
- package/dist/events/log.js +193 -0
- package/dist/events/log.js.map +1 -0
- package/dist/events/replay.d.ts +106 -0
- package/dist/events/replay.d.ts.map +1 -0
- package/dist/events/replay.js +137 -0
- package/dist/events/replay.js.map +1 -0
- package/dist/events/wrap.d.ts +100 -0
- package/dist/events/wrap.d.ts.map +1 -0
- package/dist/events/wrap.js +141 -0
- package/dist/events/wrap.js.map +1 -0
- package/dist/index.d.ts +73 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +47 -0
- package/dist/index.js.map +1 -0
- package/dist/llm-adapter.d.ts +96 -0
- package/dist/llm-adapter.d.ts.map +1 -0
- package/dist/llm-adapter.js +132 -0
- package/dist/llm-adapter.js.map +1 -0
- package/dist/mcp/serve.d.ts +70 -0
- package/dist/mcp/serve.d.ts.map +1 -0
- package/dist/mcp/serve.js +154 -0
- package/dist/mcp/serve.js.map +1 -0
- package/dist/metrics/runs.d.ts +58 -0
- package/dist/metrics/runs.d.ts.map +1 -0
- package/dist/metrics/runs.js +99 -0
- package/dist/metrics/runs.js.map +1 -0
- package/dist/metrics.d.ts +38 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +123 -0
- package/dist/metrics.js.map +1 -0
- package/dist/node.d.ts +23 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +23 -0
- package/dist/node.js.map +1 -0
- package/dist/planner-executor.d.ts +132 -0
- package/dist/planner-executor.d.ts.map +1 -0
- package/dist/planner-executor.js +274 -0
- package/dist/planner-executor.js.map +1 -0
- package/dist/session.d.ts +10 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +179 -0
- package/dist/session.js.map +1 -0
- package/dist/skill-catalog.d.ts +81 -0
- package/dist/skill-catalog.d.ts.map +1 -0
- package/dist/skill-catalog.js +388 -0
- package/dist/skill-catalog.js.map +1 -0
- package/dist/skill-router.d.ts +95 -0
- package/dist/skill-router.d.ts.map +1 -0
- package/dist/skill-router.js +130 -0
- package/dist/skill-router.js.map +1 -0
- package/dist/storage.d.ts +14 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +58 -0
- package/dist/storage.js.map +1 -0
- package/dist/strategy.d.ts +45 -0
- package/dist/strategy.d.ts.map +1 -0
- package/dist/strategy.js +520 -0
- package/dist/strategy.js.map +1 -0
- package/dist/tools.d.ts +40 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +147 -0
- package/dist/tools.js.map +1 -0
- package/dist/types/agent.d.ts +94 -0
- package/dist/types/agent.d.ts.map +1 -0
- package/dist/types/agent.js +17 -0
- package/dist/types/agent.js.map +1 -0
- package/dist/types/capabilities.d.ts +17 -0
- package/dist/types/capabilities.d.ts.map +1 -0
- package/dist/types/capabilities.js +13 -0
- package/dist/types/capabilities.js.map +1 -0
- package/dist/types/chat.d.ts +74 -0
- package/dist/types/chat.d.ts.map +1 -0
- package/dist/types/chat.js +10 -0
- package/dist/types/chat.js.map +1 -0
- package/dist/types/events.d.ts +115 -0
- package/dist/types/events.d.ts.map +1 -0
- package/dist/types/events.js +30 -0
- package/dist/types/events.js.map +1 -0
- package/dist/types/llm.d.ts +89 -0
- package/dist/types/llm.d.ts.map +1 -0
- package/dist/types/llm.js +12 -0
- package/dist/types/llm.js.map +1 -0
- package/dist/types/metrics.d.ts +34 -0
- package/dist/types/metrics.d.ts.map +1 -0
- package/dist/types/metrics.js +10 -0
- package/dist/types/metrics.js.map +1 -0
- package/dist/types/observer.d.ts +41 -0
- package/dist/types/observer.d.ts.map +1 -0
- package/dist/types/observer.js +41 -0
- package/dist/types/observer.js.map +1 -0
- package/dist/types/project-context.d.ts +18 -0
- package/dist/types/project-context.d.ts.map +1 -0
- package/dist/types/project-context.js +11 -0
- package/dist/types/project-context.js.map +1 -0
- package/dist/types/runtime.d.ts +71 -0
- package/dist/types/runtime.d.ts.map +1 -0
- package/dist/types/runtime.js +21 -0
- package/dist/types/runtime.js.map +1 -0
- package/dist/types/session.d.ts +103 -0
- package/dist/types/session.d.ts.map +1 -0
- package/dist/types/session.js +11 -0
- package/dist/types/session.js.map +1 -0
- package/dist/types/storage.d.ts +20 -0
- package/dist/types/storage.d.ts.map +1 -0
- package/dist/types/storage.js +41 -0
- package/dist/types/storage.js.map +1 -0
- package/dist/types/strategy.d.ts +124 -0
- package/dist/types/strategy.d.ts.map +1 -0
- package/dist/types/strategy.js +10 -0
- package/dist/types/strategy.js.map +1 -0
- package/dist/types/tools.d.ts +154 -0
- package/dist/types/tools.d.ts.map +1 -0
- package/dist/types/tools.js +11 -0
- package/dist/types/tools.js.map +1 -0
- package/dist/types/trace.d.ts +175 -0
- package/dist/types/trace.d.ts.map +1 -0
- package/dist/types/trace.js +26 -0
- package/dist/types/trace.js.map +1 -0
- package/dist/types/workspace.d.ts +29 -0
- package/dist/types/workspace.d.ts.map +1 -0
- package/dist/types/workspace.js +18 -0
- package/dist/types/workspace.js.map +1 -0
- package/package.json +45 -14
- package/skills/agent-cli.md +218 -0
- 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":"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"}
|
|
@@ -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"}
|