exempclaw 0.4.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/LICENSE +21 -0
- package/README.md +306 -0
- package/dist/agent/agent.d.ts +91 -0
- package/dist/agent/agent.js +258 -0
- package/dist/agent/agent.js.map +1 -0
- package/dist/agent/config.d.ts +49 -0
- package/dist/agent/config.js +58 -0
- package/dist/agent/config.js.map +1 -0
- package/dist/agent/persona.d.ts +39 -0
- package/dist/agent/persona.js +81 -0
- package/dist/agent/persona.js.map +1 -0
- package/dist/agents/registry.d.ts +21 -0
- package/dist/agents/registry.js +51 -0
- package/dist/agents/registry.js.map +1 -0
- package/dist/cli/approve.d.ts +17 -0
- package/dist/cli/approve.js +50 -0
- package/dist/cli/approve.js.map +1 -0
- package/dist/cli/chat.d.ts +16 -0
- package/dist/cli/chat.js +148 -0
- package/dist/cli/chat.js.map +1 -0
- package/dist/cli/demo.d.ts +7 -0
- package/dist/cli/demo.js +82 -0
- package/dist/cli/demo.js.map +1 -0
- package/dist/cli/init.d.ts +17 -0
- package/dist/cli/init.js +89 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/live.d.ts +10 -0
- package/dist/cli/live.js +109 -0
- package/dist/cli/live.js.map +1 -0
- package/dist/cli/offline.d.ts +23 -0
- package/dist/cli/offline.js +236 -0
- package/dist/cli/offline.js.map +1 -0
- package/dist/cli/probe.d.ts +23 -0
- package/dist/cli/probe.js +140 -0
- package/dist/cli/probe.js.map +1 -0
- package/dist/cli/render.d.ts +15 -0
- package/dist/cli/render.js +50 -0
- package/dist/cli/render.js.map +1 -0
- package/dist/cli/tui.d.ts +101 -0
- package/dist/cli/tui.js +334 -0
- package/dist/cli/tui.js.map +1 -0
- package/dist/config/index.d.ts +33 -0
- package/dist/config/index.js +48 -0
- package/dist/config/index.js.map +1 -0
- package/dist/connectors/connector.d.ts +58 -0
- package/dist/connectors/connector.js +30 -0
- package/dist/connectors/connector.js.map +1 -0
- package/dist/connectors/email/email-connector.d.ts +43 -0
- package/dist/connectors/email/email-connector.js +364 -0
- package/dist/connectors/email/email-connector.js.map +1 -0
- package/dist/connectors/github/github-connector.d.ts +52 -0
- package/dist/connectors/github/github-connector.js +271 -0
- package/dist/connectors/github/github-connector.js.map +1 -0
- package/dist/connectors/http.d.ts +34 -0
- package/dist/connectors/http.js +78 -0
- package/dist/connectors/http.js.map +1 -0
- package/dist/connectors/index.d.ts +34 -0
- package/dist/connectors/index.js +86 -0
- package/dist/connectors/index.js.map +1 -0
- package/dist/connectors/notion/notion-connector.d.ts +45 -0
- package/dist/connectors/notion/notion-connector.js +222 -0
- package/dist/connectors/notion/notion-connector.js.map +1 -0
- package/dist/connectors/slack/slack-connector.d.ts +43 -0
- package/dist/connectors/slack/slack-connector.js +291 -0
- package/dist/connectors/slack/slack-connector.js.map +1 -0
- package/dist/core/errors.d.ts +36 -0
- package/dist/core/errors.js +40 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/logger.d.ts +14 -0
- package/dist/core/logger.js +44 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/run-log.d.ts +37 -0
- package/dist/core/run-log.js +37 -0
- package/dist/core/run-log.js.map +1 -0
- package/dist/core/usage.d.ts +22 -0
- package/dist/core/usage.js +58 -0
- package/dist/core/usage.js.map +1 -0
- package/dist/dashboard/data.d.ts +62 -0
- package/dist/dashboard/data.js +84 -0
- package/dist/dashboard/data.js.map +1 -0
- package/dist/dashboard/page.d.ts +9 -0
- package/dist/dashboard/page.js +421 -0
- package/dist/dashboard/page.js.map +1 -0
- package/dist/dashboard/server.d.ts +19 -0
- package/dist/dashboard/server.js +44 -0
- package/dist/dashboard/server.js.map +1 -0
- package/dist/demo/bootstrap.d.ts +25 -0
- package/dist/demo/bootstrap.js +60 -0
- package/dist/demo/bootstrap.js.map +1 -0
- package/dist/demo/claude.d.ts +31 -0
- package/dist/demo/claude.js +230 -0
- package/dist/demo/claude.js.map +1 -0
- package/dist/demo/demo-connector.d.ts +19 -0
- package/dist/demo/demo-connector.js +168 -0
- package/dist/demo/demo-connector.js.map +1 -0
- package/dist/demo/world.d.ts +60 -0
- package/dist/demo/world.js +117 -0
- package/dist/demo/world.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +396 -0
- package/dist/index.js.map +1 -0
- package/dist/ingest/ingest.d.ts +63 -0
- package/dist/ingest/ingest.js +258 -0
- package/dist/ingest/ingest.js.map +1 -0
- package/dist/llm/claude.d.ts +97 -0
- package/dist/llm/claude.js +163 -0
- package/dist/llm/claude.js.map +1 -0
- package/dist/memory/compaction.d.ts +22 -0
- package/dist/memory/compaction.js +79 -0
- package/dist/memory/compaction.js.map +1 -0
- package/dist/memory/file-store.d.ts +28 -0
- package/dist/memory/file-store.js +110 -0
- package/dist/memory/file-store.js.map +1 -0
- package/dist/memory/store.d.ts +32 -0
- package/dist/memory/store.js +2 -0
- package/dist/memory/store.js.map +1 -0
- package/dist/orchestrator/orchestrator.d.ts +63 -0
- package/dist/orchestrator/orchestrator.js +181 -0
- package/dist/orchestrator/orchestrator.js.map +1 -0
- package/dist/orchestrator/scheduler.d.ts +33 -0
- package/dist/orchestrator/scheduler.js +67 -0
- package/dist/orchestrator/scheduler.js.map +1 -0
- package/dist/orchestrator/seen-events.d.ts +21 -0
- package/dist/orchestrator/seen-events.js +71 -0
- package/dist/orchestrator/seen-events.js.map +1 -0
- package/dist/plugins/apply.d.ts +9 -0
- package/dist/plugins/apply.js +17 -0
- package/dist/plugins/apply.js.map +1 -0
- package/dist/plugins/define.d.ts +29 -0
- package/dist/plugins/define.js +30 -0
- package/dist/plugins/define.js.map +1 -0
- package/dist/plugins/loader.d.ts +31 -0
- package/dist/plugins/loader.js +61 -0
- package/dist/plugins/loader.js.map +1 -0
- package/dist/plugins/scaffold.d.ts +5 -0
- package/dist/plugins/scaffold.js +72 -0
- package/dist/plugins/scaffold.js.map +1 -0
- package/dist/tools/builtin.d.ts +8 -0
- package/dist/tools/builtin.js +63 -0
- package/dist/tools/builtin.js.map +1 -0
- package/dist/tools/tool.d.ts +84 -0
- package/dist/tools/tool.js +70 -0
- package/dist/tools/tool.js.map +1 -0
- package/dist/ui/agent-view.test.d.ts +1 -0
- package/dist/ui/agent-view.test.js +54 -0
- package/dist/ui/agent-view.test.js.map +1 -0
- package/dist/ui/agents-data.d.ts +7 -0
- package/dist/ui/agents-data.js +25 -0
- package/dist/ui/agents-data.js.map +1 -0
- package/dist/ui/app.d.ts +24 -0
- package/dist/ui/app.js +59 -0
- package/dist/ui/app.js.map +1 -0
- package/dist/ui/app.test.d.ts +1 -0
- package/dist/ui/app.test.js +47 -0
- package/dist/ui/app.test.js.map +1 -0
- package/dist/ui/components/key-hints.d.ts +4 -0
- package/dist/ui/components/key-hints.js +6 -0
- package/dist/ui/components/key-hints.js.map +1 -0
- package/dist/ui/components/menu.d.ts +11 -0
- package/dist/ui/components/menu.js +20 -0
- package/dist/ui/components/menu.js.map +1 -0
- package/dist/ui/create-wizard.test.d.ts +1 -0
- package/dist/ui/create-wizard.test.js +58 -0
- package/dist/ui/create-wizard.test.js.map +1 -0
- package/dist/ui/doctor-data.d.ts +6 -0
- package/dist/ui/doctor-data.js +29 -0
- package/dist/ui/doctor-data.js.map +1 -0
- package/dist/ui/history-data.d.ts +2 -0
- package/dist/ui/history-data.js +18 -0
- package/dist/ui/history-data.js.map +1 -0
- package/dist/ui/screens/agent.d.ts +8 -0
- package/dist/ui/screens/agent.js +95 -0
- package/dist/ui/screens/agent.js.map +1 -0
- package/dist/ui/screens/agents.d.ts +7 -0
- package/dist/ui/screens/agents.js +47 -0
- package/dist/ui/screens/agents.js.map +1 -0
- package/dist/ui/screens/create.d.ts +7 -0
- package/dist/ui/screens/create.js +141 -0
- package/dist/ui/screens/create.js.map +1 -0
- package/dist/ui/screens/doctor.d.ts +5 -0
- package/dist/ui/screens/doctor.js +13 -0
- package/dist/ui/screens/doctor.js.map +1 -0
- package/dist/ui/screens/history.d.ts +7 -0
- package/dist/ui/screens/history.js +50 -0
- package/dist/ui/screens/history.js.map +1 -0
- package/dist/ui/screens/home.d.ts +8 -0
- package/dist/ui/screens/home.js +35 -0
- package/dist/ui/screens/home.js.map +1 -0
- package/dist/ui/screens/plugins.d.ts +7 -0
- package/dist/ui/screens/plugins.js +40 -0
- package/dist/ui/screens/plugins.js.map +1 -0
- package/dist/ui/services.d.ts +33 -0
- package/dist/ui/services.js +67 -0
- package/dist/ui/services.js.map +1 -0
- package/dist/ui/start.d.ts +1 -0
- package/dist/ui/start.js +16 -0
- package/dist/ui/start.js.map +1 -0
- package/dist/ui/theme.d.ts +6 -0
- package/dist/ui/theme.js +26 -0
- package/dist/ui/theme.js.map +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed error hierarchy. Every thrown error in Exempclaw should be (or extend)
|
|
3
|
+
* an ExempclawError so the runtime can distinguish recoverable failures
|
|
4
|
+
* (rate limits, connector outages) from programming errors.
|
|
5
|
+
*/
|
|
6
|
+
export class ExempclawError extends Error {
|
|
7
|
+
/** Whether retrying the same operation could plausibly succeed. */
|
|
8
|
+
retryable;
|
|
9
|
+
constructor(message, options = {}) {
|
|
10
|
+
super(message, options.cause !== undefined ? { cause: options.cause } : undefined);
|
|
11
|
+
this.name = this.constructor.name;
|
|
12
|
+
this.retryable = options.retryable ?? false;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/** A required config value was missing or malformed. */
|
|
16
|
+
export class ConfigError extends ExempclawError {
|
|
17
|
+
}
|
|
18
|
+
/** A connector (email, Slack, …) failed to reach its upstream service. */
|
|
19
|
+
export class ConnectorError extends ExempclawError {
|
|
20
|
+
connector;
|
|
21
|
+
constructor(connector, message, options = {}) {
|
|
22
|
+
super(`[${connector}] ${message}`, options);
|
|
23
|
+
this.connector = connector;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/** A tool threw while executing. Carried back into the agent loop as a tool_result error. */
|
|
27
|
+
export class ToolExecutionError extends ExempclawError {
|
|
28
|
+
tool;
|
|
29
|
+
constructor(tool, message, options = {}) {
|
|
30
|
+
super(`tool "${tool}" failed: ${message}`, options);
|
|
31
|
+
this.tool = tool;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/** A human (or policy) denied an outward action. Not an error condition the model can retry. */
|
|
35
|
+
export class ActionDeniedError extends ExempclawError {
|
|
36
|
+
constructor(message) {
|
|
37
|
+
super(message, { retryable: false });
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,OAAO,cAAe,SAAQ,KAAK;IACvC,mEAAmE;IAC1D,SAAS,CAAU;IAE5B,YAAY,OAAe,EAAE,UAAoD,EAAE;QACjF,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACnF,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QAClC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC;IAC9C,CAAC;CACF;AAED,wDAAwD;AACxD,MAAM,OAAO,WAAY,SAAQ,cAAc;CAAG;AAElD,0EAA0E;AAC1E,MAAM,OAAO,cAAe,SAAQ,cAAc;IACvC,SAAS,CAAS;IAC3B,YAAY,SAAiB,EAAE,OAAe,EAAE,UAAoD,EAAE;QACpG,KAAK,CAAC,IAAI,SAAS,KAAK,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;QAC5C,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF;AAED,6FAA6F;AAC7F,MAAM,OAAO,kBAAmB,SAAQ,cAAc;IAC3C,IAAI,CAAS;IACtB,YAAY,IAAY,EAAE,OAAe,EAAE,UAAoD,EAAE;QAC/F,KAAK,CAAC,SAAS,IAAI,aAAa,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;QACpD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,gGAAgG;AAChG,MAAM,OAAO,iBAAkB,SAAQ,cAAc;IACnD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IACvC,CAAC;CACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tiny structured logger. No external dependency so the foundation stays
|
|
3
|
+
* install-light; swap for pino/winston later behind the same interface.
|
|
4
|
+
*/
|
|
5
|
+
export type LogLevel = "debug" | "info" | "warn" | "error";
|
|
6
|
+
export interface Logger {
|
|
7
|
+
debug(msg: string, fields?: Record<string, unknown>): void;
|
|
8
|
+
info(msg: string, fields?: Record<string, unknown>): void;
|
|
9
|
+
warn(msg: string, fields?: Record<string, unknown>): void;
|
|
10
|
+
error(msg: string, fields?: Record<string, unknown>): void;
|
|
11
|
+
/** Returns a child logger that prefixes every line with these bound fields. */
|
|
12
|
+
child(bindings: Record<string, unknown>): Logger;
|
|
13
|
+
}
|
|
14
|
+
export declare function createLogger(level?: LogLevel): Logger;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tiny structured logger. No external dependency so the foundation stays
|
|
3
|
+
* install-light; swap for pino/winston later behind the same interface.
|
|
4
|
+
*/
|
|
5
|
+
const LEVEL_ORDER = { debug: 10, info: 20, warn: 30, error: 40 };
|
|
6
|
+
const COLORS = {
|
|
7
|
+
debug: "\x1b[90m", // grey
|
|
8
|
+
info: "\x1b[36m", // cyan
|
|
9
|
+
warn: "\x1b[33m", // yellow
|
|
10
|
+
error: "\x1b[31m", // red
|
|
11
|
+
};
|
|
12
|
+
const RESET = "\x1b[0m";
|
|
13
|
+
class ConsoleLogger {
|
|
14
|
+
threshold;
|
|
15
|
+
bindings;
|
|
16
|
+
constructor(threshold, bindings = {}) {
|
|
17
|
+
this.threshold = threshold;
|
|
18
|
+
this.bindings = bindings;
|
|
19
|
+
}
|
|
20
|
+
write(level, msg, fields) {
|
|
21
|
+
if (LEVEL_ORDER[level] < LEVEL_ORDER[this.threshold])
|
|
22
|
+
return;
|
|
23
|
+
const merged = { ...this.bindings, ...fields };
|
|
24
|
+
const scope = typeof merged.scope === "string" ? ` (${merged.scope})` : "";
|
|
25
|
+
const extra = Object.entries(merged)
|
|
26
|
+
.filter(([k]) => k !== "scope")
|
|
27
|
+
.map(([k, v]) => `${k}=${typeof v === "string" ? v : JSON.stringify(v)}`)
|
|
28
|
+
.join(" ");
|
|
29
|
+
const ts = new Date().toISOString();
|
|
30
|
+
const tag = `${COLORS[level]}${level.toUpperCase().padEnd(5)}${RESET}`;
|
|
31
|
+
process.stderr.write(`${ts} ${tag}${scope} ${msg}${extra ? ` ${extra}` : ""}\n`);
|
|
32
|
+
}
|
|
33
|
+
debug(msg, fields) { this.write("debug", msg, fields); }
|
|
34
|
+
info(msg, fields) { this.write("info", msg, fields); }
|
|
35
|
+
warn(msg, fields) { this.write("warn", msg, fields); }
|
|
36
|
+
error(msg, fields) { this.write("error", msg, fields); }
|
|
37
|
+
child(bindings) {
|
|
38
|
+
return new ConsoleLogger(this.threshold, { ...this.bindings, ...bindings });
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export function createLogger(level = "info") {
|
|
42
|
+
return new ConsoleLogger(level);
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/core/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { UsageTotals } from "./usage.js";
|
|
2
|
+
/**
|
|
3
|
+
* Append-only audit trail of agent runs. One JSONL file per agent under
|
|
4
|
+
* <dataDir>/agents/<id>/runs.jsonl. This is the substrate for the `costs`
|
|
5
|
+
* command and for answering "what did this agent do, and who approved it".
|
|
6
|
+
*/
|
|
7
|
+
export type TriggerKind = "cli" | "chat" | "event" | "schedule" | "ingest";
|
|
8
|
+
export interface OutwardActionRecord {
|
|
9
|
+
tool: string;
|
|
10
|
+
approved: boolean;
|
|
11
|
+
summary: string;
|
|
12
|
+
at: string;
|
|
13
|
+
}
|
|
14
|
+
export interface RunRecord {
|
|
15
|
+
runId: string;
|
|
16
|
+
agentId: string;
|
|
17
|
+
trigger: {
|
|
18
|
+
kind: TriggerKind;
|
|
19
|
+
detail?: string;
|
|
20
|
+
};
|
|
21
|
+
startedAt: string;
|
|
22
|
+
finishedAt: string;
|
|
23
|
+
model: string;
|
|
24
|
+
iterations: number;
|
|
25
|
+
stopReason: string | null;
|
|
26
|
+
usage: UsageTotals;
|
|
27
|
+
costUsd: number | null;
|
|
28
|
+
outwardActions: OutwardActionRecord[];
|
|
29
|
+
error?: string;
|
|
30
|
+
}
|
|
31
|
+
export declare class RunLog {
|
|
32
|
+
private readonly path;
|
|
33
|
+
constructor(dataDir: string, agentId: string);
|
|
34
|
+
append(record: RunRecord): Promise<void>;
|
|
35
|
+
/** Reads every record, skipping lines that fail to parse (torn writes). */
|
|
36
|
+
readAll(): Promise<RunRecord[]>;
|
|
37
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { appendFile, mkdir, readFile } from "node:fs/promises";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
export class RunLog {
|
|
4
|
+
path;
|
|
5
|
+
constructor(dataDir, agentId) {
|
|
6
|
+
this.path = join(dataDir, "agents", agentId, "runs.jsonl");
|
|
7
|
+
}
|
|
8
|
+
async append(record) {
|
|
9
|
+
await mkdir(dirname(this.path), { recursive: true });
|
|
10
|
+
await appendFile(this.path, `${JSON.stringify(record)}\n`, "utf8");
|
|
11
|
+
}
|
|
12
|
+
/** Reads every record, skipping lines that fail to parse (torn writes). */
|
|
13
|
+
async readAll() {
|
|
14
|
+
let raw;
|
|
15
|
+
try {
|
|
16
|
+
raw = await readFile(this.path, "utf8");
|
|
17
|
+
}
|
|
18
|
+
catch (err) {
|
|
19
|
+
if (err.code === "ENOENT")
|
|
20
|
+
return [];
|
|
21
|
+
throw err;
|
|
22
|
+
}
|
|
23
|
+
const records = [];
|
|
24
|
+
for (const line of raw.split("\n")) {
|
|
25
|
+
if (!line.trim())
|
|
26
|
+
continue;
|
|
27
|
+
try {
|
|
28
|
+
records.push(JSON.parse(line));
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// torn or corrupt line — skip rather than fail the whole read
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return records;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=run-log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-log.js","sourceRoot":"","sources":["../../src/core/run-log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAiC1C,MAAM,OAAO,MAAM;IACA,IAAI,CAAS;IAE9B,YAAY,OAAe,EAAE,OAAe;QAC1C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAiB;QAC5B,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACrE,CAAC;IAED,2EAA2E;IAC3E,KAAK,CAAC,OAAO;QACX,IAAI,GAAW,CAAC;QAChB,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,EAAE,CAAC;YAChE,MAAM,GAAG,CAAC;QACZ,CAAC;QACD,MAAM,OAAO,GAAgB,EAAE,CAAC;QAChC,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;gBAAE,SAAS;YAC3B,IAAI,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAc,CAAC,CAAC;YAC9C,CAAC;YAAC,MAAM,CAAC;gBACP,8DAA8D;YAChE,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type Anthropic from "@anthropic-ai/sdk";
|
|
2
|
+
/**
|
|
3
|
+
* Token accounting shared by the agent runtime, run records, and the `costs`
|
|
4
|
+
* CLI. Cache reads/writes are tracked separately because they bill at
|
|
5
|
+
* different rates (~0.1x and 1.25x the input price respectively).
|
|
6
|
+
*/
|
|
7
|
+
export interface UsageTotals {
|
|
8
|
+
inputTokens: number;
|
|
9
|
+
outputTokens: number;
|
|
10
|
+
cacheReadTokens: number;
|
|
11
|
+
cacheWriteTokens: number;
|
|
12
|
+
/** Number of API turns these totals cover. */
|
|
13
|
+
turns: number;
|
|
14
|
+
}
|
|
15
|
+
export declare function emptyUsage(): UsageTotals;
|
|
16
|
+
/** Folds one API response's usage into a running total (returns a new object). */
|
|
17
|
+
export declare function addUsage(totals: UsageTotals, usage: Anthropic.Usage): UsageTotals;
|
|
18
|
+
export declare function addTotals(a: UsageTotals, b: UsageTotals): UsageTotals;
|
|
19
|
+
/** The total prompt size the model saw on the last turn (cached or not). */
|
|
20
|
+
export declare function contextTokens(usage: Anthropic.Usage): number;
|
|
21
|
+
export declare function estimateCostUsd(model: string, totals: UsageTotals): number | null;
|
|
22
|
+
export declare function formatUsd(value: number | null): string;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
export function emptyUsage() {
|
|
2
|
+
return { inputTokens: 0, outputTokens: 0, cacheReadTokens: 0, cacheWriteTokens: 0, turns: 0 };
|
|
3
|
+
}
|
|
4
|
+
/** Folds one API response's usage into a running total (returns a new object). */
|
|
5
|
+
export function addUsage(totals, usage) {
|
|
6
|
+
return {
|
|
7
|
+
inputTokens: totals.inputTokens + usage.input_tokens,
|
|
8
|
+
outputTokens: totals.outputTokens + usage.output_tokens,
|
|
9
|
+
cacheReadTokens: totals.cacheReadTokens + (usage.cache_read_input_tokens ?? 0),
|
|
10
|
+
cacheWriteTokens: totals.cacheWriteTokens + (usage.cache_creation_input_tokens ?? 0),
|
|
11
|
+
turns: totals.turns + 1,
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
export function addTotals(a, b) {
|
|
15
|
+
return {
|
|
16
|
+
inputTokens: a.inputTokens + b.inputTokens,
|
|
17
|
+
outputTokens: a.outputTokens + b.outputTokens,
|
|
18
|
+
cacheReadTokens: a.cacheReadTokens + b.cacheReadTokens,
|
|
19
|
+
cacheWriteTokens: a.cacheWriteTokens + b.cacheWriteTokens,
|
|
20
|
+
turns: a.turns + b.turns,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/** The total prompt size the model saw on the last turn (cached or not). */
|
|
24
|
+
export function contextTokens(usage) {
|
|
25
|
+
return usage.input_tokens + (usage.cache_read_input_tokens ?? 0) + (usage.cache_creation_input_tokens ?? 0);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* USD per million tokens. Matched by model-id prefix so dated variants
|
|
29
|
+
* (claude-haiku-4-5-20251001) resolve to their family. Unknown models return
|
|
30
|
+
* null cost — token counts are still tracked.
|
|
31
|
+
*/
|
|
32
|
+
const MODEL_PRICES = [
|
|
33
|
+
{ prefix: "claude-demo", inputPerMTok: 0, outputPerMTok: 0 },
|
|
34
|
+
{ prefix: "claude-fable-5", inputPerMTok: 10, outputPerMTok: 50 },
|
|
35
|
+
{ prefix: "claude-mythos-5", inputPerMTok: 10, outputPerMTok: 50 },
|
|
36
|
+
{ prefix: "claude-opus-4", inputPerMTok: 5, outputPerMTok: 25 },
|
|
37
|
+
{ prefix: "claude-sonnet-4", inputPerMTok: 3, outputPerMTok: 15 },
|
|
38
|
+
{ prefix: "claude-haiku-4", inputPerMTok: 1, outputPerMTok: 5 },
|
|
39
|
+
];
|
|
40
|
+
const CACHE_READ_MULTIPLIER = 0.1;
|
|
41
|
+
const CACHE_WRITE_MULTIPLIER = 1.25;
|
|
42
|
+
export function estimateCostUsd(model, totals) {
|
|
43
|
+
const price = MODEL_PRICES.find((p) => model.startsWith(p.prefix));
|
|
44
|
+
if (!price)
|
|
45
|
+
return null;
|
|
46
|
+
const perTokIn = price.inputPerMTok / 1_000_000;
|
|
47
|
+
const perTokOut = price.outputPerMTok / 1_000_000;
|
|
48
|
+
return (totals.inputTokens * perTokIn +
|
|
49
|
+
totals.outputTokens * perTokOut +
|
|
50
|
+
totals.cacheReadTokens * perTokIn * CACHE_READ_MULTIPLIER +
|
|
51
|
+
totals.cacheWriteTokens * perTokIn * CACHE_WRITE_MULTIPLIER);
|
|
52
|
+
}
|
|
53
|
+
export function formatUsd(value) {
|
|
54
|
+
if (value === null)
|
|
55
|
+
return "n/a";
|
|
56
|
+
return value < 0.01 && value > 0 ? `$${value.toFixed(4)}` : `$${value.toFixed(2)}`;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=usage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/core/usage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { type UsageTotals } from "../core/usage.js";
|
|
2
|
+
import type { Persona } from "../agent/persona.js";
|
|
3
|
+
/**
|
|
4
|
+
* Assembles the read-only fleet snapshot served to the dashboard. Everything
|
|
5
|
+
* comes from the data dir (runs.jsonl, memory.json); agent configs passed on
|
|
6
|
+
* the CLI enrich entries with persona details.
|
|
7
|
+
*/
|
|
8
|
+
export interface AgentMeta {
|
|
9
|
+
persona: Persona;
|
|
10
|
+
model?: string;
|
|
11
|
+
connectors: string[];
|
|
12
|
+
}
|
|
13
|
+
export interface AgentSnapshot {
|
|
14
|
+
id: string;
|
|
15
|
+
persona?: {
|
|
16
|
+
name: string;
|
|
17
|
+
role: string;
|
|
18
|
+
succeeds?: string;
|
|
19
|
+
disclosure: string;
|
|
20
|
+
};
|
|
21
|
+
model?: string;
|
|
22
|
+
connectors: string[];
|
|
23
|
+
memoryCount: number;
|
|
24
|
+
recentMemories: Array<{
|
|
25
|
+
text: string;
|
|
26
|
+
source: string;
|
|
27
|
+
tags: string[];
|
|
28
|
+
createdAt: string;
|
|
29
|
+
}>;
|
|
30
|
+
runs: {
|
|
31
|
+
total: number;
|
|
32
|
+
lastAt?: string;
|
|
33
|
+
recent: Array<{
|
|
34
|
+
runId: string;
|
|
35
|
+
trigger: string;
|
|
36
|
+
startedAt: string;
|
|
37
|
+
iterations: number;
|
|
38
|
+
stopReason: string | null;
|
|
39
|
+
tokens: number;
|
|
40
|
+
costUsd: number | null;
|
|
41
|
+
outward: Array<{
|
|
42
|
+
tool: string;
|
|
43
|
+
approved: boolean;
|
|
44
|
+
summary: string;
|
|
45
|
+
}>;
|
|
46
|
+
error?: string;
|
|
47
|
+
}>;
|
|
48
|
+
};
|
|
49
|
+
usage: UsageTotals;
|
|
50
|
+
costUsd: number | null;
|
|
51
|
+
outward: {
|
|
52
|
+
total: number;
|
|
53
|
+
denied: number;
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
export interface FleetSnapshot {
|
|
57
|
+
generatedAt: string;
|
|
58
|
+
dataDir: string;
|
|
59
|
+
agents: AgentSnapshot[];
|
|
60
|
+
}
|
|
61
|
+
export declare function buildFleetSnapshot(dataDir: string, metas?: Map<string, AgentMeta>): Promise<FleetSnapshot>;
|
|
62
|
+
export declare function buildAgentSnapshot(dataDir: string, id: string, meta?: AgentMeta): Promise<AgentSnapshot>;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { readdir } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { RunLog } from "../core/run-log.js";
|
|
4
|
+
import { addTotals, emptyUsage, estimateCostUsd } from "../core/usage.js";
|
|
5
|
+
import { FileMemoryStore } from "../memory/file-store.js";
|
|
6
|
+
export async function buildFleetSnapshot(dataDir, metas = new Map()) {
|
|
7
|
+
let ids = [];
|
|
8
|
+
try {
|
|
9
|
+
ids = (await readdir(join(dataDir, "agents"), { withFileTypes: true }))
|
|
10
|
+
.filter((e) => e.isDirectory())
|
|
11
|
+
.map((e) => e.name);
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
// no data yet
|
|
15
|
+
}
|
|
16
|
+
for (const id of metas.keys()) {
|
|
17
|
+
if (!ids.includes(id))
|
|
18
|
+
ids.push(id); // configured but not yet run
|
|
19
|
+
}
|
|
20
|
+
const agents = await Promise.all(ids.sort().map((id) => buildAgentSnapshot(dataDir, id, metas.get(id))));
|
|
21
|
+
return { generatedAt: new Date().toISOString(), dataDir, agents };
|
|
22
|
+
}
|
|
23
|
+
export async function buildAgentSnapshot(dataDir, id, meta) {
|
|
24
|
+
const store = new FileMemoryStore(dataDir, id);
|
|
25
|
+
const memories = await store.allMemories().catch(() => []);
|
|
26
|
+
const records = await new RunLog(dataDir, id).readAll().catch(() => []);
|
|
27
|
+
let usage = emptyUsage();
|
|
28
|
+
let cost = 0;
|
|
29
|
+
let hasCost = false;
|
|
30
|
+
let outwardTotal = 0;
|
|
31
|
+
let outwardDenied = 0;
|
|
32
|
+
for (const record of records) {
|
|
33
|
+
usage = addTotals(usage, record.usage);
|
|
34
|
+
const recordCost = record.costUsd ?? estimateCostUsd(record.model, record.usage);
|
|
35
|
+
if (recordCost !== null) {
|
|
36
|
+
cost += recordCost;
|
|
37
|
+
hasCost = true;
|
|
38
|
+
}
|
|
39
|
+
outwardTotal += record.outwardActions.length;
|
|
40
|
+
outwardDenied += record.outwardActions.filter((a) => !a.approved).length;
|
|
41
|
+
}
|
|
42
|
+
const recent = records.slice(-30).reverse();
|
|
43
|
+
return {
|
|
44
|
+
id,
|
|
45
|
+
...(meta
|
|
46
|
+
? {
|
|
47
|
+
persona: {
|
|
48
|
+
name: meta.persona.name,
|
|
49
|
+
role: meta.persona.role,
|
|
50
|
+
...(meta.persona.succeeds ? { succeeds: meta.persona.succeeds } : {}),
|
|
51
|
+
disclosure: meta.persona.disclosure,
|
|
52
|
+
},
|
|
53
|
+
model: meta.model,
|
|
54
|
+
}
|
|
55
|
+
: {}),
|
|
56
|
+
connectors: meta?.connectors ?? [],
|
|
57
|
+
memoryCount: memories.length,
|
|
58
|
+
recentMemories: memories.slice(-12).reverse().map((m) => ({
|
|
59
|
+
text: m.text,
|
|
60
|
+
source: m.source,
|
|
61
|
+
tags: m.tags,
|
|
62
|
+
createdAt: m.createdAt,
|
|
63
|
+
})),
|
|
64
|
+
runs: {
|
|
65
|
+
total: records.length,
|
|
66
|
+
...(records.length > 0 ? { lastAt: records[records.length - 1].finishedAt } : {}),
|
|
67
|
+
recent: recent.map((r) => ({
|
|
68
|
+
runId: r.runId,
|
|
69
|
+
trigger: r.trigger.detail ? `${r.trigger.kind} · ${r.trigger.detail}` : r.trigger.kind,
|
|
70
|
+
startedAt: r.startedAt,
|
|
71
|
+
iterations: r.iterations,
|
|
72
|
+
stopReason: r.stopReason,
|
|
73
|
+
tokens: r.usage.inputTokens + r.usage.outputTokens + r.usage.cacheReadTokens + r.usage.cacheWriteTokens,
|
|
74
|
+
costUsd: r.costUsd ?? estimateCostUsd(r.model, r.usage),
|
|
75
|
+
outward: r.outwardActions.map((a) => ({ tool: a.tool, approved: a.approved, summary: a.summary })),
|
|
76
|
+
...(r.error ? { error: r.error } : {}),
|
|
77
|
+
})),
|
|
78
|
+
},
|
|
79
|
+
usage,
|
|
80
|
+
costUsd: hasCost ? cost : null,
|
|
81
|
+
outward: { total: outwardTotal, denied: outwardDenied },
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data.js","sourceRoot":"","sources":["../../src/dashboard/data.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The dashboard UI: a single self-contained HTML document, no build step.
|
|
3
|
+
*
|
|
4
|
+
* Design: "the succession ledger" — a personnel-dossier / ledger aesthetic
|
|
5
|
+
* for software whose whole job is stepping into someone's vacated role.
|
|
6
|
+
* Ink-black paper, amber phosphor, ruled lines, stamped disclosure modes,
|
|
7
|
+
* tabular monospace figures. Fraunces for display, IBM Plex Mono for data.
|
|
8
|
+
*/
|
|
9
|
+
export declare function dashboardPage(): string;
|