autotel-agents 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/LICENSE +21 -0
- package/README.md +67 -0
- package/dist/index.cjs +702 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +335 -0
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.ts +335 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +676 -0
- package/dist/index.js.map +1 -0
- package/package.json +57 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
//#region src/tool-taxonomy.d.ts
|
|
2
|
+
type ToolCategory = 'file' | 'shell' | 'search' | 'web' | 'todo' | 'subagent' | 'skill' | 'mcp' | 'other';
|
|
3
|
+
declare const TOOL_CATEGORIES: readonly ToolCategory[];
|
|
4
|
+
declare function classifyTool(name: string): ToolCategory;
|
|
5
|
+
/** Sub-agent type, when the agent happens to emit it (defensive — often absent). */
|
|
6
|
+
declare function readSubAgentType(attributes: Attributes): string | undefined;
|
|
7
|
+
/** Skill name, when present (defensive — often absent). */
|
|
8
|
+
declare function readSkillName(attributes: Attributes): string | undefined;
|
|
9
|
+
//#endregion
|
|
10
|
+
//#region src/types.d.ts
|
|
11
|
+
type AttrValue = string | number | boolean | null | AttrValue[] | {
|
|
12
|
+
[key: string]: AttrValue;
|
|
13
|
+
};
|
|
14
|
+
type Attributes = Record<string, AttrValue>;
|
|
15
|
+
interface OtelScope {
|
|
16
|
+
name?: string;
|
|
17
|
+
version?: string;
|
|
18
|
+
}
|
|
19
|
+
/** One numeric data point of an OTLP metric (sum / gauge / histogram count). */
|
|
20
|
+
interface OtelDataPoint {
|
|
21
|
+
value: number;
|
|
22
|
+
attributes: Attributes;
|
|
23
|
+
/** Epoch milliseconds (server converts from OTLP's `timeUnixNano`). */
|
|
24
|
+
timestamp: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Aggregation temporality of a counter. `delta` points carry the change since
|
|
28
|
+
* the last export (safe to sum); `cumulative` points carry a running total
|
|
29
|
+
* (must be differenced per series, or you over-count on every export). Claude
|
|
30
|
+
* Code defaults to `delta`; most other SDKs default to `cumulative`.
|
|
31
|
+
*/
|
|
32
|
+
type MetricTemporality = 'delta' | 'cumulative';
|
|
33
|
+
/** A decoded OTLP metric — the server fills `dataPoints` from any instrument type. */
|
|
34
|
+
interface OtelMetricRecord {
|
|
35
|
+
name: string;
|
|
36
|
+
unit?: string;
|
|
37
|
+
description?: string;
|
|
38
|
+
/** Counter temporality. Absent ⇒ treated as `delta` (Claude Code's default). */
|
|
39
|
+
temporality?: MetricTemporality;
|
|
40
|
+
dataPoints: OtelDataPoint[];
|
|
41
|
+
resource: Attributes;
|
|
42
|
+
scope?: OtelScope;
|
|
43
|
+
}
|
|
44
|
+
/** A decoded OTLP log record (Claude Code / opencode emit their events as logs). */
|
|
45
|
+
interface AgentRawEvent {
|
|
46
|
+
/** Best-effort event name: OTLP `EventName`, else the `event.name` attribute. */
|
|
47
|
+
eventName: string;
|
|
48
|
+
/** Epoch milliseconds. */
|
|
49
|
+
timestamp: number;
|
|
50
|
+
body?: unknown;
|
|
51
|
+
attributes: Attributes;
|
|
52
|
+
resource: Attributes;
|
|
53
|
+
scope?: OtelScope;
|
|
54
|
+
}
|
|
55
|
+
type AgentKind = 'claude-code' | 'opencode' | 'codex' | 'unknown';
|
|
56
|
+
type AgentEventType = 'user_prompt' | 'api_request' | 'api_error' | 'tool_result' | 'tool_decision' | 'other';
|
|
57
|
+
type ToolDecision = 'accept' | 'reject';
|
|
58
|
+
/**
|
|
59
|
+
* A tool the agent invoked. MCP tools follow Claude Code's `mcp__<server>__<tool>`
|
|
60
|
+
* naming, so we can split server/tool out of the name — that's what powers the
|
|
61
|
+
* "which MCP servers is the agent using" breakdown.
|
|
62
|
+
*/
|
|
63
|
+
interface ToolRef {
|
|
64
|
+
/** Raw tool name, e.g. `"Edit"`, `"Task"`, `"Skill"` or `"mcp__github__create_issue"`. */
|
|
65
|
+
name: string;
|
|
66
|
+
/** What kind of work this tool represents (file/shell/subagent/skill/mcp/…). */
|
|
67
|
+
category: ToolCategory;
|
|
68
|
+
isMcp: boolean;
|
|
69
|
+
/** MCP server id, e.g. `"github"` (only when `isMcp`). */
|
|
70
|
+
mcpServer?: string;
|
|
71
|
+
/** MCP tool name, e.g. `"create_issue"` (only when `isMcp`). */
|
|
72
|
+
mcpTool?: string;
|
|
73
|
+
/** Sub-agent type for `Task` calls, when the agent emits it. */
|
|
74
|
+
subAgentType?: string;
|
|
75
|
+
/** Skill name for `Skill` calls, when the agent emits it. */
|
|
76
|
+
skillName?: string;
|
|
77
|
+
}
|
|
78
|
+
type CostSource = 'reported' | 'estimated';
|
|
79
|
+
/** A single normalized agent interaction (a row on the session timeline). */
|
|
80
|
+
interface AgentEvent {
|
|
81
|
+
id: string;
|
|
82
|
+
sessionId: string;
|
|
83
|
+
agent: AgentKind;
|
|
84
|
+
type: AgentEventType;
|
|
85
|
+
/** The agent's own event name, e.g. `"api_request"`. */
|
|
86
|
+
rawEventName: string;
|
|
87
|
+
timestamp: number;
|
|
88
|
+
model?: string;
|
|
89
|
+
costUsd?: number;
|
|
90
|
+
costSource?: CostSource;
|
|
91
|
+
inputTokens?: number;
|
|
92
|
+
outputTokens?: number;
|
|
93
|
+
cacheReadTokens?: number;
|
|
94
|
+
cacheCreationTokens?: number;
|
|
95
|
+
durationMs?: number;
|
|
96
|
+
tool?: ToolRef;
|
|
97
|
+
decision?: ToolDecision;
|
|
98
|
+
success?: boolean;
|
|
99
|
+
promptLength?: number;
|
|
100
|
+
/** Only present when prompt capture is explicitly enabled. */
|
|
101
|
+
promptText?: string;
|
|
102
|
+
errorMessage?: string;
|
|
103
|
+
statusCode?: number;
|
|
104
|
+
attributes: Attributes;
|
|
105
|
+
}
|
|
106
|
+
/** Per-tool usage tally within a session. */
|
|
107
|
+
interface ToolUsage {
|
|
108
|
+
name: string;
|
|
109
|
+
category: ToolCategory;
|
|
110
|
+
isMcp: boolean;
|
|
111
|
+
mcpServer?: string;
|
|
112
|
+
count: number;
|
|
113
|
+
accepted: number;
|
|
114
|
+
rejected: number;
|
|
115
|
+
failures: number;
|
|
116
|
+
totalDurationMs: number;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Running totals for a session. Kept indefinitely even as the raw `timeline`
|
|
120
|
+
* is ring-buffered, so headline numbers never drift. Per the source-of-truth
|
|
121
|
+
* rule, cost/token totals come from `api_request` *events* only — the
|
|
122
|
+
* `token.usage`/`cost.usage` *metrics* are intentionally NOT summed in here.
|
|
123
|
+
*/
|
|
124
|
+
interface AgentSessionRollup {
|
|
125
|
+
costUsd: number;
|
|
126
|
+
costReportedUsd: number;
|
|
127
|
+
costEstimatedUsd: number;
|
|
128
|
+
inputTokens: number;
|
|
129
|
+
outputTokens: number;
|
|
130
|
+
cacheReadTokens: number;
|
|
131
|
+
cacheCreationTokens: number;
|
|
132
|
+
apiRequests: number;
|
|
133
|
+
apiErrors: number;
|
|
134
|
+
prompts: number;
|
|
135
|
+
toolCalls: number;
|
|
136
|
+
accepted: number;
|
|
137
|
+
rejected: number;
|
|
138
|
+
linesAdded: number;
|
|
139
|
+
linesRemoved: number;
|
|
140
|
+
commits: number;
|
|
141
|
+
pullRequests: number;
|
|
142
|
+
activeTimeSeconds: number;
|
|
143
|
+
/** model id → api_request count. */
|
|
144
|
+
models: Record<string, number>;
|
|
145
|
+
/** tool name → usage. */
|
|
146
|
+
tools: Record<string, ToolUsage>;
|
|
147
|
+
/** tool category → call count (file/shell/subagent/skill/mcp/…). */
|
|
148
|
+
toolCategories: Record<ToolCategory, number>;
|
|
149
|
+
/** sub-agent type (or `"subagent"` when type unknown) → invocation count. */
|
|
150
|
+
subAgents: Record<string, number>;
|
|
151
|
+
/** skill name (or `"skill"` when name unknown) → invocation count. */
|
|
152
|
+
skills: Record<string, number>;
|
|
153
|
+
}
|
|
154
|
+
interface AgentSession {
|
|
155
|
+
id: string;
|
|
156
|
+
agent: AgentKind;
|
|
157
|
+
user?: string;
|
|
158
|
+
organization?: string;
|
|
159
|
+
terminal?: string;
|
|
160
|
+
appVersion?: string;
|
|
161
|
+
firstSeen: number;
|
|
162
|
+
lastSeen: number;
|
|
163
|
+
/** Total events ever seen (drives stable event ids; survives timeline eviction). */
|
|
164
|
+
eventCount: number;
|
|
165
|
+
/**
|
|
166
|
+
* Internal reducer state (not for UI): last-seen value per cumulative metric
|
|
167
|
+
* series, so re-exported cumulative counters are differenced instead of summed.
|
|
168
|
+
* Keyed by metric kind + datapoint attributes.
|
|
169
|
+
*/
|
|
170
|
+
metricState: Record<string, number>;
|
|
171
|
+
rollup: AgentSessionRollup;
|
|
172
|
+
/** Ring-buffered raw interactions (newest last), bounded by the reducer caller. */
|
|
173
|
+
timeline: AgentEvent[];
|
|
174
|
+
}
|
|
175
|
+
type AgentSessionStore = Map<string, AgentSession>;
|
|
176
|
+
//#endregion
|
|
177
|
+
//#region src/adapters/types.d.ts
|
|
178
|
+
/** A metric-only signal (lines of code, commits, active time, …) keyed to a session. */
|
|
179
|
+
interface AgentMetricSignal {
|
|
180
|
+
agent: AgentKind;
|
|
181
|
+
/** session.id from the data point / resource, when present. */
|
|
182
|
+
sessionId?: string;
|
|
183
|
+
identity: SessionIdentity;
|
|
184
|
+
kind: AgentMetricKind;
|
|
185
|
+
value: number;
|
|
186
|
+
/** Counter temporality — `cumulative` values are differenced per series. */
|
|
187
|
+
temporality?: MetricTemporality;
|
|
188
|
+
timestamp: number;
|
|
189
|
+
/** Original data-point attributes (e.g. `type: "input"` on token usage). */
|
|
190
|
+
attributes: Record<string, unknown>;
|
|
191
|
+
}
|
|
192
|
+
type AgentMetricKind = 'lines_of_code' | 'commit' | 'pull_request' | 'active_time' | 'other';
|
|
193
|
+
/** Common identity attributes shared by every signal in a session. */
|
|
194
|
+
interface SessionIdentity {
|
|
195
|
+
user?: string;
|
|
196
|
+
organization?: string;
|
|
197
|
+
terminal?: string;
|
|
198
|
+
appVersion?: string;
|
|
199
|
+
model?: string;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* An adapter recognizes one agent's telemetry (by instrumentation scope and/or
|
|
203
|
+
* metric/event-name prefix) and normalizes it to the shared model. Adding Codex
|
|
204
|
+
* or another agent = adding one adapter; no UI or reducer changes.
|
|
205
|
+
*/
|
|
206
|
+
interface AgentAdapter {
|
|
207
|
+
kind: AgentKind;
|
|
208
|
+
matchesMetric(record: OtelMetricRecord): boolean;
|
|
209
|
+
matchesEvent(record: AgentRawEvent): boolean;
|
|
210
|
+
normalizeEvent(record: AgentRawEvent): AgentEvent | null;
|
|
211
|
+
normalizeMetric(record: OtelMetricRecord): AgentMetricSignal[];
|
|
212
|
+
}
|
|
213
|
+
//#endregion
|
|
214
|
+
//#region src/adapters/registry.d.ts
|
|
215
|
+
/**
|
|
216
|
+
* Ordered adapter registry. First match claims the record. Claude Code is most
|
|
217
|
+
* specific (dedicated scope), so it leads. Add Codex here when its contract
|
|
218
|
+
* lands — one line, no other changes.
|
|
219
|
+
*/
|
|
220
|
+
declare const adapters: readonly AgentAdapter[];
|
|
221
|
+
declare function detectAdapterForMetric(record: OtelMetricRecord): AgentAdapter | undefined;
|
|
222
|
+
declare function detectAdapterForEvent(record: AgentRawEvent): AgentAdapter | undefined;
|
|
223
|
+
/** True if any adapter recognizes this metric — used for zero-config "agent detected" toasts. */
|
|
224
|
+
declare function isAgentMetric(record: OtelMetricRecord): boolean;
|
|
225
|
+
/** True if any adapter recognizes this log event. */
|
|
226
|
+
declare function isAgentEvent(record: AgentRawEvent): boolean;
|
|
227
|
+
//#endregion
|
|
228
|
+
//#region src/adapters/prefix-adapter.d.ts
|
|
229
|
+
interface PrefixAdapterConfig {
|
|
230
|
+
kind: AgentAdapter['kind'];
|
|
231
|
+
/** e.g. `"claude_code."` or `"opencode."`. */
|
|
232
|
+
prefix: string;
|
|
233
|
+
/** Substring expected in the instrumentation scope name, e.g. `"claude_code"`. */
|
|
234
|
+
scopeHint: string;
|
|
235
|
+
/** Expected `service.name` resource value, e.g. `"claude-code"`. */
|
|
236
|
+
serviceHint: string;
|
|
237
|
+
}
|
|
238
|
+
declare function createPrefixAdapter(config: PrefixAdapterConfig): AgentAdapter;
|
|
239
|
+
//#endregion
|
|
240
|
+
//#region src/adapters/claude-code.d.ts
|
|
241
|
+
/**
|
|
242
|
+
* Claude Code: metrics/events prefixed `claude_code.*`, emitted under the
|
|
243
|
+
* `com.anthropic.claude_code` instrumentation scope.
|
|
244
|
+
* Contract: https://code.claude.com/docs/en/monitoring-usage
|
|
245
|
+
*/
|
|
246
|
+
declare const claudeCodeAdapter: AgentAdapter;
|
|
247
|
+
//#endregion
|
|
248
|
+
//#region src/adapters/opencode.d.ts
|
|
249
|
+
/**
|
|
250
|
+
* opencode: the opencode-plugin-otel project mirrors Claude Code's exact
|
|
251
|
+
* instrument and event names under an `opencode.*` prefix and the `com.opencode`
|
|
252
|
+
* scope. Same shape → same factory.
|
|
253
|
+
*/
|
|
254
|
+
declare const opencodeAdapter: AgentAdapter;
|
|
255
|
+
//#endregion
|
|
256
|
+
//#region src/reduce.d.ts
|
|
257
|
+
declare const DEFAULT_TIMELINE_LIMIT = 500;
|
|
258
|
+
interface IngestOptions {
|
|
259
|
+
timelineLimit?: number;
|
|
260
|
+
}
|
|
261
|
+
/** Fold a normalized event into a session rollup + timeline. Returns the session. */
|
|
262
|
+
declare function foldEvent(session: AgentSession, event: AgentEvent, timelineLimit?: number): AgentSession;
|
|
263
|
+
/** Fold a metric-only signal (lines, commits, PRs, active time) into the rollup. */
|
|
264
|
+
declare function foldMetricSignal(session: AgentSession, signal: AgentMetricSignal): void;
|
|
265
|
+
/**
|
|
266
|
+
* Ingest a decoded OTLP log record. No-op (returns null) if no adapter claims it
|
|
267
|
+
* or the record lacks a session id.
|
|
268
|
+
*/
|
|
269
|
+
declare function ingestEventRecord(store: AgentSessionStore, record: AgentRawEvent, options?: IngestOptions): AgentSession | null;
|
|
270
|
+
/** Ingest a decoded OTLP metric. Returns sessions touched (may be several). */
|
|
271
|
+
declare function ingestMetricRecord(store: AgentSessionStore, record: OtelMetricRecord): AgentSession[];
|
|
272
|
+
/** Batch-ingest decoded OTLP log records. */
|
|
273
|
+
declare function ingestAgentEvents(store: AgentSessionStore, records: AgentRawEvent[], options?: IngestOptions): void;
|
|
274
|
+
/** Batch-ingest decoded OTLP metric records. */
|
|
275
|
+
declare function ingestAgentMetrics(store: AgentSessionStore, records: OtelMetricRecord[]): void;
|
|
276
|
+
interface AgentAggregate {
|
|
277
|
+
sessions: number;
|
|
278
|
+
costUsd: number;
|
|
279
|
+
inputTokens: number;
|
|
280
|
+
outputTokens: number;
|
|
281
|
+
apiRequests: number;
|
|
282
|
+
apiErrors: number;
|
|
283
|
+
accepted: number;
|
|
284
|
+
rejected: number;
|
|
285
|
+
models: Record<string, number>;
|
|
286
|
+
/** tool name → call count, MCP and built-in together. */
|
|
287
|
+
tools: Record<string, number>;
|
|
288
|
+
/** tool category → call count. */
|
|
289
|
+
toolCategories: Record<ToolCategory, number>;
|
|
290
|
+
/** MCP server id → call count. */
|
|
291
|
+
mcpServers: Record<string, number>;
|
|
292
|
+
/** sub-agent type (or `"subagent"`) → invocation count. */
|
|
293
|
+
subAgents: Record<string, number>;
|
|
294
|
+
/** skill name (or `"skill"`) → invocation count. */
|
|
295
|
+
skills: Record<string, number>;
|
|
296
|
+
}
|
|
297
|
+
declare function summarizeSessions(sessions: Iterable<AgentSession>): AgentAggregate;
|
|
298
|
+
//#endregion
|
|
299
|
+
//#region src/mcp.d.ts
|
|
300
|
+
/**
|
|
301
|
+
* Tool-name parsing. Claude Code (and opencode) expose MCP tools to the model
|
|
302
|
+
* under the `mcp__<server>__<tool>` convention, and those names flow through the
|
|
303
|
+
* `tool_result` / `tool_decision` events. Splitting the name is what lets the
|
|
304
|
+
* Agents tab answer "which MCP servers/tools is the agent actually using?".
|
|
305
|
+
*/
|
|
306
|
+
/** MCP-aware breakdown of a tool name (category is added by the taxonomy layer). */
|
|
307
|
+
interface ParsedToolName {
|
|
308
|
+
name: string;
|
|
309
|
+
isMcp: boolean;
|
|
310
|
+
mcpServer?: string;
|
|
311
|
+
mcpTool?: string;
|
|
312
|
+
}
|
|
313
|
+
declare function parseToolName(name: string): ParsedToolName;
|
|
314
|
+
declare function isMcpTool(name: string): boolean;
|
|
315
|
+
//#endregion
|
|
316
|
+
//#region src/cost.d.ts
|
|
317
|
+
/**
|
|
318
|
+
* Fallback cost estimation. Reported cost (`cost_usd` on `api_request`) always
|
|
319
|
+
* wins — Claude Code computes it cache-accurately. This table is ONLY used when
|
|
320
|
+
* an agent reports tokens but not cost (e.g. a future agent, or a misconfigured
|
|
321
|
+
* run). Estimated values are badged `estimated` in the UI.
|
|
322
|
+
*
|
|
323
|
+
* Prices are USD per 1,000,000 tokens. Matched by substring so model ids like
|
|
324
|
+
* `claude-sonnet-4-6` or `claude-3-5-sonnet-20241022` resolve to a family rate.
|
|
325
|
+
* Keep deliberately small — this is a safety net, not a billing source.
|
|
326
|
+
*/
|
|
327
|
+
declare function estimateCostUsd(model: string | undefined, inputTokens: number | undefined, outputTokens: number | undefined): number | undefined;
|
|
328
|
+
//#endregion
|
|
329
|
+
//#region src/identity.d.ts
|
|
330
|
+
declare function mergeAttrs(...sources: Attributes[]): Attributes;
|
|
331
|
+
/** Pull the common identity attributes shared by every signal in a session. */
|
|
332
|
+
declare function readIdentity(attrs: Attributes): SessionIdentity;
|
|
333
|
+
//#endregion
|
|
334
|
+
export { type AgentAdapter, type AgentAggregate, type AgentEvent, type AgentEventType, type AgentKind, type AgentMetricKind, type AgentMetricSignal, type AgentRawEvent, type AgentSession, type AgentSessionRollup, type AgentSessionStore, type AttrValue, type Attributes, type CostSource, DEFAULT_TIMELINE_LIMIT, type IngestOptions, type MetricTemporality, type OtelDataPoint, type OtelMetricRecord, type OtelScope, type ParsedToolName, type SessionIdentity, TOOL_CATEGORIES, type ToolCategory, type ToolDecision, type ToolRef, type ToolUsage, adapters, classifyTool, claudeCodeAdapter, createPrefixAdapter, detectAdapterForEvent, detectAdapterForMetric, estimateCostUsd, foldEvent, foldMetricSignal, ingestAgentEvents, ingestAgentMetrics, ingestEventRecord, ingestMetricRecord, isAgentEvent, isAgentMetric, isMcpTool, mergeAttrs, opencodeAdapter, parseToolName, readIdentity, readSkillName, readSubAgentType, summarizeSessions };
|
|
335
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/tool-taxonomy.ts","../src/types.ts","../src/adapters/types.ts","../src/adapters/registry.ts","../src/adapters/prefix-adapter.ts","../src/adapters/claude-code.ts","../src/adapters/opencode.ts","../src/reduce.ts","../src/mcp.ts","../src/cost.ts","../src/identity.ts"],"mappings":"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"}
|