@inbrowser/agent 0.0.0-placeholder → 0.1.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/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/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 +52 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -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 +22 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +22 -0
- package/dist/node.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/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 +26 -0
- package/dist/strategy.d.ts.map +1 -0
- package/dist/strategy.js +200 -0
- package/dist/strategy.js.map +1 -0
- package/dist/tools.d.ts +26 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +129 -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 +76 -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 +136 -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 +125 -0
- package/dist/types/trace.d.ts.map +1 -0
- package/dist/types/trace.js +24 -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,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `agent events` — read + filter the per-project mutation event log.
|
|
3
|
+
*
|
|
4
|
+
* Emits one event per NDJSON line. Field filtering (`--fields`)
|
|
5
|
+
* applies to each event. Read-only — never appends.
|
|
6
|
+
*
|
|
7
|
+
* Bookkeeping markers (`migrate_applied`, `migrate_intent`) are
|
|
8
|
+
* **excluded by default** so users querying "what changed?" don't
|
|
9
|
+
* see audit-of-the-audit rows mixed in. Pass `--include-bookkeeping`
|
|
10
|
+
* to opt back in.
|
|
11
|
+
*/
|
|
12
|
+
import { openEventLog } from '../../events/log.js';
|
|
13
|
+
export function eventsCommand(args, io) {
|
|
14
|
+
const projectId = args.options['project'];
|
|
15
|
+
if (!projectId) {
|
|
16
|
+
throw new Error('agent events: --project is required');
|
|
17
|
+
}
|
|
18
|
+
const eventsDir = args.options['events-dir'];
|
|
19
|
+
const openLog = io.openLog ?? openEventLog;
|
|
20
|
+
const log = openLog({
|
|
21
|
+
projectId,
|
|
22
|
+
...(eventsDir ? { logDir: eventsDir } : {}),
|
|
23
|
+
});
|
|
24
|
+
const filter = {};
|
|
25
|
+
if (typeof args.options['session'] === 'string')
|
|
26
|
+
filter.sessionId = args.options['session'];
|
|
27
|
+
if (typeof args.options['tool'] === 'string')
|
|
28
|
+
filter.tool = args.options['tool'];
|
|
29
|
+
if (typeof args.options['agent'] === 'string')
|
|
30
|
+
filter.agent = args.options['agent'];
|
|
31
|
+
if (typeof args.options['phase'] === 'string')
|
|
32
|
+
filter.phase = args.options['phase'];
|
|
33
|
+
if (typeof args.options['since'] === 'string')
|
|
34
|
+
filter.since = args.options['since'];
|
|
35
|
+
if (typeof args.options['until'] === 'string')
|
|
36
|
+
filter.until = args.options['until'];
|
|
37
|
+
if (typeof args.options['target-kind'] === 'string') {
|
|
38
|
+
filter.targetKind = args.options['target-kind'];
|
|
39
|
+
}
|
|
40
|
+
const includeBookkeeping = Boolean(args.options['include-bookkeeping']);
|
|
41
|
+
try {
|
|
42
|
+
const events = log.read(filter).filter((e) => {
|
|
43
|
+
if (includeBookkeeping)
|
|
44
|
+
return true;
|
|
45
|
+
const type = e.metadata?.type;
|
|
46
|
+
return type !== 'migrate_applied' && type !== 'migrate_intent';
|
|
47
|
+
});
|
|
48
|
+
for (const event of events) {
|
|
49
|
+
io.emit.event(event, () => `${event.ts} ${event.phase.padEnd(8)} ${event.tool.padEnd(20)} ${event.target.kind}:${event.target.path}` +
|
|
50
|
+
(event.reversible ? '' : ' [irreversible]'));
|
|
51
|
+
}
|
|
52
|
+
io.emit.finish();
|
|
53
|
+
return 0;
|
|
54
|
+
}
|
|
55
|
+
finally {
|
|
56
|
+
log.close();
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/cli/commands/events.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `agent fleet` — launch N concurrent sessions for isolation testing.
|
|
3
|
+
* Reuses the same event vocabulary as `agent run` but adds a final
|
|
4
|
+
* `fleet_summary` event with per-session totals + the isolation flag.
|
|
5
|
+
*/
|
|
6
|
+
import type { Emitter } from '../output.js';
|
|
7
|
+
import type { ParsedArgs } from '../parse.js';
|
|
8
|
+
import { openSessionLog } from '../session-log.js';
|
|
9
|
+
export interface FleetCommandIO {
|
|
10
|
+
emit: Emitter;
|
|
11
|
+
now?: () => string;
|
|
12
|
+
openLog?: typeof openSessionLog;
|
|
13
|
+
}
|
|
14
|
+
export declare function fleetCommand(args: ParsedArgs, io: FleetCommandIO): Promise<number>;
|
|
15
|
+
//# sourceMappingURL=fleet.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fleet.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/fleet.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,cAAc,CAAC;CACjC;AAoBD,wBAAsB,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CA4JxF"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `agent fleet` — launch N concurrent sessions for isolation testing.
|
|
3
|
+
* Reuses the same event vocabulary as `agent run` but adds a final
|
|
4
|
+
* `fleet_summary` event with per-session totals + the isolation flag.
|
|
5
|
+
*/
|
|
6
|
+
import { createMetricsCollector } from '../../metrics.js';
|
|
7
|
+
import { createAgentSession } from '../../session.js';
|
|
8
|
+
import { createReactLoopStrategy } from '../../strategy.js';
|
|
9
|
+
import { createDispatch, createToolRegistry } from '../../tools.js';
|
|
10
|
+
import { fakeSandbox, scriptedLlm, writeRulesTool } from '../fixtures.js';
|
|
11
|
+
import { openSessionLog } from '../session-log.js';
|
|
12
|
+
function plan(size) {
|
|
13
|
+
const presets = ['chess', 'lobby', 'owner', 'corpus', 'forum'];
|
|
14
|
+
return Array.from({ length: size }, (_, i) => {
|
|
15
|
+
const preset = presets[i % presets.length];
|
|
16
|
+
return {
|
|
17
|
+
id: `s${i + 1}`,
|
|
18
|
+
presetId: preset,
|
|
19
|
+
prompt: `Session ${i + 1}: write rules for ${preset}`,
|
|
20
|
+
};
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
export async function fleetCommand(args, io) {
|
|
24
|
+
const emit = io.emit;
|
|
25
|
+
const now = io.now ?? (() => new Date().toISOString());
|
|
26
|
+
const openLog = io.openLog ?? openSessionLog;
|
|
27
|
+
const size = args.options['size'] ?? 3;
|
|
28
|
+
if (size < 1 || size > 64) {
|
|
29
|
+
throw new Error('--size must be 1..64');
|
|
30
|
+
}
|
|
31
|
+
const logDir = args.options['log-dir'] ?? null;
|
|
32
|
+
const disableLog = Boolean(args.options['no-log']);
|
|
33
|
+
const members = plan(size);
|
|
34
|
+
if (args.options['dry-run']) {
|
|
35
|
+
emit.event({
|
|
36
|
+
type: 'dry_run_plan',
|
|
37
|
+
ts: now(),
|
|
38
|
+
command: 'fleet',
|
|
39
|
+
size,
|
|
40
|
+
members: members.map((m) => ({ id: m.id, presetId: m.presetId })),
|
|
41
|
+
logDir: logDir ?? '~/.pyric/sessions',
|
|
42
|
+
}, () => `[plan] fleet · size=${size} · members=${members.map((m) => m.id).join(',')}`);
|
|
43
|
+
emit.finish();
|
|
44
|
+
return 0;
|
|
45
|
+
}
|
|
46
|
+
emit.event({ type: 'fleet_start', ts: now(), size, members: members.map((m) => m.id) }, () => `[fleet] launching ${size} sessions`);
|
|
47
|
+
const startedAt = performance.now();
|
|
48
|
+
const results = await Promise.all(members.map(async (member) => {
|
|
49
|
+
const registry = createToolRegistry();
|
|
50
|
+
registry.register(writeRulesTool);
|
|
51
|
+
const metrics = createMetricsCollector();
|
|
52
|
+
const sandbox = fakeSandbox();
|
|
53
|
+
const log = openLog({ logDir, sessionId: member.id, disabled: disableLog });
|
|
54
|
+
const session = createAgentSession({
|
|
55
|
+
strategy: createReactLoopStrategy(),
|
|
56
|
+
llm: scriptedLlm('write-rules', member.id),
|
|
57
|
+
tools: createDispatch(registry),
|
|
58
|
+
toolList: registry.list(),
|
|
59
|
+
toolContext: () => ({
|
|
60
|
+
workspace: session.workspace,
|
|
61
|
+
runtime: session.runtime,
|
|
62
|
+
sandbox,
|
|
63
|
+
lint: () => ({ warnings: [] }),
|
|
64
|
+
signal: new AbortController().signal,
|
|
65
|
+
}),
|
|
66
|
+
systemPromptBuilder: (w) => `Session ${member.id} preset=${w.presetId || member.presetId}`,
|
|
67
|
+
metrics,
|
|
68
|
+
history: [],
|
|
69
|
+
id: member.id,
|
|
70
|
+
});
|
|
71
|
+
log.write({
|
|
72
|
+
type: 'session_start',
|
|
73
|
+
ts: now(),
|
|
74
|
+
sessionId: member.id,
|
|
75
|
+
scenario: 'write-rules',
|
|
76
|
+
});
|
|
77
|
+
let eventCount = 0;
|
|
78
|
+
for await (const ev of session.submit(member.prompt, AbortSignal.timeout(30_000))) {
|
|
79
|
+
eventCount += 1;
|
|
80
|
+
if (ev.kind === 'turn_completed') {
|
|
81
|
+
const turnEvent = {
|
|
82
|
+
type: 'turn_end',
|
|
83
|
+
ts: now(),
|
|
84
|
+
sessionId: member.id,
|
|
85
|
+
turn: ev.turnId,
|
|
86
|
+
metrics: {
|
|
87
|
+
tokensIn: ev.metrics.tokensIn,
|
|
88
|
+
tokensOut: ev.metrics.tokensOut,
|
|
89
|
+
costUsd: ev.metrics.costUsd,
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
log.write(turnEvent);
|
|
93
|
+
emit.event(turnEvent, () => `[${member.id}] turn done · ${ev.metrics.tokensIn}+${ev.metrics.tokensOut}t`);
|
|
94
|
+
}
|
|
95
|
+
else if (ev.kind === 'tool_finished') {
|
|
96
|
+
const toolEvent = {
|
|
97
|
+
type: 'tool_result',
|
|
98
|
+
ts: now(),
|
|
99
|
+
sessionId: member.id,
|
|
100
|
+
callId: ev.callId,
|
|
101
|
+
ok: ev.result.ok,
|
|
102
|
+
summary: ev.result.summary,
|
|
103
|
+
};
|
|
104
|
+
log.write(toolEvent);
|
|
105
|
+
emit.event(toolEvent, () => `[${member.id}] tool ${ev.callId} ${ev.result.ok ? 'ok' : 'fail'}`);
|
|
106
|
+
}
|
|
107
|
+
else if (ev.kind === 'error') {
|
|
108
|
+
const errEvent = {
|
|
109
|
+
type: 'session_error',
|
|
110
|
+
ts: now(),
|
|
111
|
+
sessionId: member.id,
|
|
112
|
+
message: ev.message,
|
|
113
|
+
};
|
|
114
|
+
log.write(errEvent);
|
|
115
|
+
emit.event(errEvent, () => `[${member.id}] error: ${ev.message}`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
const totals = metrics.totals();
|
|
119
|
+
const summary = {
|
|
120
|
+
id: member.id,
|
|
121
|
+
presetId: member.presetId,
|
|
122
|
+
rulesLength: session.workspace.rules.length,
|
|
123
|
+
ownIdInRules: session.workspace.rules.includes(member.id),
|
|
124
|
+
tokens: totals.tokensTotal,
|
|
125
|
+
costUsd: totals.costUsdTotal,
|
|
126
|
+
turns: totals.turnCount,
|
|
127
|
+
events: eventCount,
|
|
128
|
+
logPath: log.path,
|
|
129
|
+
};
|
|
130
|
+
log.write({ type: 'session_end', ts: now(), sessionId: member.id, totals: summary });
|
|
131
|
+
log.close();
|
|
132
|
+
return summary;
|
|
133
|
+
}));
|
|
134
|
+
const elapsedMs = performance.now() - startedAt;
|
|
135
|
+
const allIsolated = results.every((r) => r.ownIdInRules);
|
|
136
|
+
emit.event({
|
|
137
|
+
type: 'fleet_summary',
|
|
138
|
+
ts: now(),
|
|
139
|
+
size,
|
|
140
|
+
elapsedMs,
|
|
141
|
+
isolated: allIsolated,
|
|
142
|
+
aggregateTokens: results.reduce((sum, r) => sum + r.tokens, 0),
|
|
143
|
+
aggregateCostUsd: results.reduce((sum, r) => sum + r.costUsd, 0),
|
|
144
|
+
results,
|
|
145
|
+
}, () => `[fleet] done · ${size} sessions · ${elapsedMs.toFixed(1)}ms · isolation=${allIsolated ? 'ok' : 'LEAK'} · tokens=${results.reduce((s, r) => s + r.tokens, 0)}`);
|
|
146
|
+
emit.finish();
|
|
147
|
+
return allIsolated ? 0 : 1;
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=fleet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fleet.js","sourceRoot":"","sources":["../../../src/cli/commands/fleet.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `agent help` — render top-level help in text mode, or emit the full
|
|
3
|
+
* schema (same as `agent schema`) in ndjson/json mode. Honors a
|
|
4
|
+
* subcommand argument: `agent help run` scopes to one command.
|
|
5
|
+
*
|
|
6
|
+
* Per the Agent DX rubric: `--help --json` MUST give the machine-
|
|
7
|
+
* readable description. We achieve that by deferring to the emitter
|
|
8
|
+
* — if the caller passed --output json or stdout isn't a TTY, the
|
|
9
|
+
* help payload is the JSON schema, not prose.
|
|
10
|
+
*/
|
|
11
|
+
import type { Emitter } from '../output.js';
|
|
12
|
+
import type { ParsedArgs } from '../parse.js';
|
|
13
|
+
export declare function helpCommand(args: ParsedArgs, emit: Emitter): number;
|
|
14
|
+
export declare function versionCommand(emit: Emitter): number;
|
|
15
|
+
//# sourceMappingURL=help.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/help.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAwD9C,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CAgCnE;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAOpD"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `agent help` — render top-level help in text mode, or emit the full
|
|
3
|
+
* schema (same as `agent schema`) in ndjson/json mode. Honors a
|
|
4
|
+
* subcommand argument: `agent help run` scopes to one command.
|
|
5
|
+
*
|
|
6
|
+
* Per the Agent DX rubric: `--help --json` MUST give the machine-
|
|
7
|
+
* readable description. We achieve that by deferring to the emitter
|
|
8
|
+
* — if the caller passed --output json or stdout isn't a TTY, the
|
|
9
|
+
* help payload is the JSON schema, not prose.
|
|
10
|
+
*/
|
|
11
|
+
import { CLI_SPEC, findCommand } from '../spec.js';
|
|
12
|
+
function renderTextHelp(commandName) {
|
|
13
|
+
if (commandName) {
|
|
14
|
+
const cmd = findCommand(commandName);
|
|
15
|
+
if (!cmd)
|
|
16
|
+
return `unknown command: ${commandName}`;
|
|
17
|
+
const lines = [];
|
|
18
|
+
lines.push(`agent ${cmd.name} — ${cmd.description}`);
|
|
19
|
+
lines.push('');
|
|
20
|
+
if (cmd.positional)
|
|
21
|
+
lines.push(`Positional: <${cmd.positional.name}> — ${cmd.positional.description}`);
|
|
22
|
+
if (cmd.options.length > 0) {
|
|
23
|
+
lines.push('Options:');
|
|
24
|
+
for (const o of cmd.options) {
|
|
25
|
+
const flag = o.short ? `${o.name}, ${o.short}` : o.name;
|
|
26
|
+
const dflt = o.default !== undefined ? ` (default: ${JSON.stringify(o.default)})` : '';
|
|
27
|
+
lines.push(` ${flag.padEnd(24)} ${o.description}${dflt}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
if (cmd.examples) {
|
|
31
|
+
lines.push('');
|
|
32
|
+
lines.push('Examples:');
|
|
33
|
+
for (const e of cmd.examples) {
|
|
34
|
+
lines.push(` $ ${e.input}`);
|
|
35
|
+
lines.push(` ${e.description}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return lines.join('\n');
|
|
39
|
+
}
|
|
40
|
+
const lines = [];
|
|
41
|
+
lines.push(`${CLI_SPEC.name} v${CLI_SPEC.version} — ${CLI_SPEC.description}`);
|
|
42
|
+
lines.push('');
|
|
43
|
+
lines.push('Commands:');
|
|
44
|
+
for (const c of CLI_SPEC.commands) {
|
|
45
|
+
lines.push(` ${c.name.padEnd(10)} ${c.description}`);
|
|
46
|
+
}
|
|
47
|
+
lines.push('');
|
|
48
|
+
lines.push('Global options:');
|
|
49
|
+
for (const o of CLI_SPEC.globalOptions) {
|
|
50
|
+
const flag = o.short ? `${o.name}, ${o.short}` : o.name;
|
|
51
|
+
lines.push(` ${flag.padEnd(20)} ${o.description}`);
|
|
52
|
+
}
|
|
53
|
+
lines.push('');
|
|
54
|
+
lines.push('Agent integration tips:\n' +
|
|
55
|
+
' • Pipe-friendly: NDJSON is the default when stdout is not a TTY.\n' +
|
|
56
|
+
' • Discover the full schema with `agent schema` or `agent describe`.\n' +
|
|
57
|
+
' • Always validate with `--dry-run` before mutating commands.\n' +
|
|
58
|
+
' • Filter event fields with `--fields ts,type,sessionId,...` to save tokens.\n' +
|
|
59
|
+
' • See AGENTS.md for invariants.');
|
|
60
|
+
return lines.join('\n');
|
|
61
|
+
}
|
|
62
|
+
export function helpCommand(args, emit) {
|
|
63
|
+
const subject = args.positional[0];
|
|
64
|
+
if (subject) {
|
|
65
|
+
const cmd = findCommand(subject);
|
|
66
|
+
if (!cmd) {
|
|
67
|
+
emit.event({ type: 'error', name: 'UsageError', message: `unknown command: ${subject}` }, () => `unknown command: ${subject}`);
|
|
68
|
+
emit.finish();
|
|
69
|
+
return 64;
|
|
70
|
+
}
|
|
71
|
+
emit.event({ type: 'help', command: cmd }, () => renderTextHelp(subject));
|
|
72
|
+
emit.finish();
|
|
73
|
+
return 0;
|
|
74
|
+
}
|
|
75
|
+
emit.event({
|
|
76
|
+
type: 'help',
|
|
77
|
+
cli: { name: CLI_SPEC.name, version: CLI_SPEC.version, description: CLI_SPEC.description },
|
|
78
|
+
commands: CLI_SPEC.commands.map((c) => ({
|
|
79
|
+
name: c.name,
|
|
80
|
+
description: c.description,
|
|
81
|
+
mutating: c.mutating,
|
|
82
|
+
})),
|
|
83
|
+
globalOptions: CLI_SPEC.globalOptions,
|
|
84
|
+
}, () => renderTextHelp());
|
|
85
|
+
emit.finish();
|
|
86
|
+
return 0;
|
|
87
|
+
}
|
|
88
|
+
export function versionCommand(emit) {
|
|
89
|
+
emit.event({ type: 'version', version: CLI_SPEC.version, name: CLI_SPEC.name }, () => CLI_SPEC.version);
|
|
90
|
+
emit.finish();
|
|
91
|
+
return 0;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=help.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../../src/cli/commands/help.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `agent migrate` — plan + record the forward replay of a project's
|
|
3
|
+
* mutation event log against a (host-supplied) production dispatch.
|
|
4
|
+
*
|
|
5
|
+
* Mirrors the controller/runtime split established by `agent undo`:
|
|
6
|
+
* - The CLI plans the replay (lists every commit event that would
|
|
7
|
+
* fire) and optionally records a `migrate_intent` marker. It does
|
|
8
|
+
* NOT dispatch tools — that requires a real dispatch wired to
|
|
9
|
+
* services (e.g. live Firestore).
|
|
10
|
+
* - The host (a script, a deploy agent, an automation pipeline)
|
|
11
|
+
* reads the intent and calls `replayEvents()` from the library
|
|
12
|
+
* surface against its production registry. The library function
|
|
13
|
+
* writes `migrate_applied` markers as it goes.
|
|
14
|
+
*
|
|
15
|
+
* Output: NDJSON, one `migrate_plan` event per commit + a final
|
|
16
|
+
* `migrate_intent_recorded` line when `--record` is set.
|
|
17
|
+
*/
|
|
18
|
+
import { openEventLog } from '../../events/log.js';
|
|
19
|
+
import type { Emitter } from '../output.js';
|
|
20
|
+
import type { ParsedArgs } from '../parse.js';
|
|
21
|
+
export interface MigrateCommandIO {
|
|
22
|
+
emit: Emitter;
|
|
23
|
+
openLog?: typeof openEventLog;
|
|
24
|
+
now?: () => string;
|
|
25
|
+
}
|
|
26
|
+
export declare function migrateCommand(args: ParsedArgs, io: MigrateCommandIO): number;
|
|
27
|
+
//# sourceMappingURL=migrate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/migrate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,YAAY,CAAC;IAC9B,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,gBAAgB,GAAG,MAAM,CA+G7E"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `agent migrate` — plan + record the forward replay of a project's
|
|
3
|
+
* mutation event log against a (host-supplied) production dispatch.
|
|
4
|
+
*
|
|
5
|
+
* Mirrors the controller/runtime split established by `agent undo`:
|
|
6
|
+
* - The CLI plans the replay (lists every commit event that would
|
|
7
|
+
* fire) and optionally records a `migrate_intent` marker. It does
|
|
8
|
+
* NOT dispatch tools — that requires a real dispatch wired to
|
|
9
|
+
* services (e.g. live Firestore).
|
|
10
|
+
* - The host (a script, a deploy agent, an automation pipeline)
|
|
11
|
+
* reads the intent and calls `replayEvents()` from the library
|
|
12
|
+
* surface against its production registry. The library function
|
|
13
|
+
* writes `migrate_applied` markers as it goes.
|
|
14
|
+
*
|
|
15
|
+
* Output: NDJSON, one `migrate_plan` event per commit + a final
|
|
16
|
+
* `migrate_intent_recorded` line when `--record` is set.
|
|
17
|
+
*/
|
|
18
|
+
import { openEventLog } from '../../events/log.js';
|
|
19
|
+
export function migrateCommand(args, io) {
|
|
20
|
+
const projectId = args.options['project'];
|
|
21
|
+
if (!projectId)
|
|
22
|
+
throw new Error('agent migrate: --project is required');
|
|
23
|
+
const eventsDir = args.options['events-dir'];
|
|
24
|
+
const since = args.options['since-event'];
|
|
25
|
+
const toolsCsv = args.options['tools'];
|
|
26
|
+
const recordIntent = Boolean(args.options['record']);
|
|
27
|
+
const openLog = io.openLog ?? openEventLog;
|
|
28
|
+
const now = io.now ?? (() => new Date().toISOString());
|
|
29
|
+
const toolAllow = (() => {
|
|
30
|
+
if (Array.isArray(toolsCsv))
|
|
31
|
+
return new Set(toolsCsv);
|
|
32
|
+
if (typeof toolsCsv === 'string')
|
|
33
|
+
return new Set(toolsCsv
|
|
34
|
+
.split(',')
|
|
35
|
+
.map((s) => s.trim())
|
|
36
|
+
.filter(Boolean));
|
|
37
|
+
return null;
|
|
38
|
+
})();
|
|
39
|
+
const log = openLog({
|
|
40
|
+
projectId,
|
|
41
|
+
...(eventsDir ? { logDir: eventsDir } : {}),
|
|
42
|
+
});
|
|
43
|
+
try {
|
|
44
|
+
const candidates = log
|
|
45
|
+
.read({ phase: 'commit' })
|
|
46
|
+
// Don't replay our own bookkeeping markers from prior runs.
|
|
47
|
+
.filter((e) => e.metadata?.type !== 'migrate_applied' &&
|
|
48
|
+
e.metadata?.type !== 'migrate_intent')
|
|
49
|
+
.filter((e) => (since ? e.id >= since : true))
|
|
50
|
+
.filter((e) => (toolAllow ? toolAllow.has(e.tool) : true));
|
|
51
|
+
const eligibleWithArgs = candidates.filter((e) => e.args !== undefined);
|
|
52
|
+
const skippedLegacy = candidates.length - eligibleWithArgs.length;
|
|
53
|
+
for (const event of eligibleWithArgs) {
|
|
54
|
+
io.emit.event({
|
|
55
|
+
type: 'migrate_plan',
|
|
56
|
+
ts: now(),
|
|
57
|
+
eventId: event.id,
|
|
58
|
+
tool: event.tool,
|
|
59
|
+
target: event.target,
|
|
60
|
+
args: event.args,
|
|
61
|
+
}, () => `[plan] ${event.id} → ${event.tool}(${JSON.stringify(event.args)}) on ${event.target.kind}:${event.target.path}`);
|
|
62
|
+
}
|
|
63
|
+
if (recordIntent) {
|
|
64
|
+
const intent = log.append({
|
|
65
|
+
agent: 'host',
|
|
66
|
+
sessionId: `migrate-${Date.now().toString(36)}`,
|
|
67
|
+
tool: 'migrate',
|
|
68
|
+
phase: 'commit',
|
|
69
|
+
target: { kind: 'other', path: `migrate/intent` },
|
|
70
|
+
reversible: false,
|
|
71
|
+
irreversibleReason: 'migrate_intent markers are bookkeeping, not state changes',
|
|
72
|
+
metadata: {
|
|
73
|
+
type: 'migrate_intent',
|
|
74
|
+
...(since ? { sinceEventId: since } : {}),
|
|
75
|
+
...(toolAllow ? { toolAllowlist: Array.from(toolAllow) } : {}),
|
|
76
|
+
plannedEventIds: eligibleWithArgs.map((e) => e.id),
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
io.emit.event({
|
|
80
|
+
type: 'migrate_intent_recorded',
|
|
81
|
+
ts: now(),
|
|
82
|
+
intentEventId: intent.id,
|
|
83
|
+
plannedCount: eligibleWithArgs.length,
|
|
84
|
+
skippedLegacy,
|
|
85
|
+
nextStep: `Invoke replayEvents() from @inbrowser/agent against your production ToolDispatch. ` +
|
|
86
|
+
`Pass { log, dispatch, toolContext } plus the same filters (sinceEventId, toolAllowlist) recorded on this intent.`,
|
|
87
|
+
}, () => `[recorded] migrate intent ${intent.id}\n` +
|
|
88
|
+
` planned: ${eligibleWithArgs.length} events\n` +
|
|
89
|
+
(skippedLegacy > 0 ? ` skipped (legacy / no args): ${skippedLegacy}\n` : '') +
|
|
90
|
+
` next: invoke replayEvents() against your production ToolDispatch.`);
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
io.emit.event({
|
|
94
|
+
type: 'migrate_summary',
|
|
95
|
+
ts: now(),
|
|
96
|
+
plannedCount: eligibleWithArgs.length,
|
|
97
|
+
skippedLegacy,
|
|
98
|
+
}, () => `[summary] ${eligibleWithArgs.length} replayable events` +
|
|
99
|
+
(skippedLegacy > 0 ? ` · ${skippedLegacy} legacy (no args)` : '') +
|
|
100
|
+
`\n add --record to append a migrate_intent marker for host pickup.`);
|
|
101
|
+
}
|
|
102
|
+
io.emit.finish();
|
|
103
|
+
return 0;
|
|
104
|
+
}
|
|
105
|
+
finally {
|
|
106
|
+
log.close();
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../../src/cli/commands/migrate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
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 type { ChatMessage } from '../../index.js';
|
|
15
|
+
import type { ScenarioId } from '../fixtures.js';
|
|
16
|
+
import type { Emitter } from '../output.js';
|
|
17
|
+
import type { ParsedArgs } from '../parse.js';
|
|
18
|
+
import { openSessionLog } from '../session-log.js';
|
|
19
|
+
export interface RunPayload {
|
|
20
|
+
prompt: string;
|
|
21
|
+
scenario?: ScenarioId;
|
|
22
|
+
maxTurns?: number;
|
|
23
|
+
sessionId?: string;
|
|
24
|
+
history?: ChatMessage[];
|
|
25
|
+
}
|
|
26
|
+
export interface RunCommandIO {
|
|
27
|
+
emit: Emitter;
|
|
28
|
+
/** Reads --json file content. Defaults to fs.readFileSync. */
|
|
29
|
+
readFile?: (path: string) => string;
|
|
30
|
+
/** Reads stdin synchronously. Defaults to a Bun/Node compatible reader. */
|
|
31
|
+
readStdin?: () => string;
|
|
32
|
+
/** Override the timer for deterministic tests. */
|
|
33
|
+
now?: () => string;
|
|
34
|
+
/** Inject a session-log factory (tests pass a no-op or an in-memory one). */
|
|
35
|
+
openLog?: typeof openSessionLog;
|
|
36
|
+
}
|
|
37
|
+
export declare function runCommand(args: ParsedArgs, io: RunCommandIO): Promise<number>;
|
|
38
|
+
//# sourceMappingURL=run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,OAAO,KAAK,EACV,WAAW,EAKZ,MAAM,gBAAgB,CAAC;AAOxB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAmB,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEpE,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,UAAU,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACpC,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,MAAM,CAAC;IACzB,kDAAkD;IAClD,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,6EAA6E;IAC7E,OAAO,CAAC,EAAE,OAAO,cAAc,CAAC;CACjC;AAkQD,wBAAsB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CA4UpF"}
|