paygate-mcp 10.5.0 → 10.7.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.
@@ -0,0 +1,245 @@
1
+ /**
2
+ * A2A Protocol Support — Agent-to-Agent communication alongside MCP.
3
+ *
4
+ * Implements core A2A (Agent-to-Agent) protocol primitives for inter-agent
5
+ * communication, task delegation, and capability discovery. Supports:
6
+ *
7
+ * - Agent Cards (/.well-known/agent.json): Advertise agent capabilities
8
+ * - Task lifecycle: create → working → completed/failed/canceled
9
+ * - Message exchange with typed parts (text, file, data)
10
+ * - Agent skill discovery and matching
11
+ * - Billing hooks for task-based pricing
12
+ *
13
+ * A2A protocol specification: https://google.github.io/A2A/
14
+ *
15
+ * Zero external dependencies.
16
+ */
17
+ /** Agent capability advertised via Agent Card. */
18
+ export interface AgentSkill {
19
+ /** Unique skill ID. */
20
+ id: string;
21
+ /** Human-readable skill name. */
22
+ name: string;
23
+ /** Description of what this skill does. */
24
+ description?: string;
25
+ /** Tags for discoverability. */
26
+ tags?: string[];
27
+ /** Example prompts that invoke this skill. */
28
+ examples?: string[];
29
+ /** MIME types this skill accepts as input. */
30
+ inputModes?: string[];
31
+ /** MIME types this skill can produce as output. */
32
+ outputModes?: string[];
33
+ }
34
+ /** Agent Card served at /.well-known/agent.json. */
35
+ export interface AgentCard {
36
+ /** Agent name. */
37
+ name: string;
38
+ /** Agent description. */
39
+ description?: string;
40
+ /** Agent provider info. */
41
+ provider?: {
42
+ organization: string;
43
+ url?: string;
44
+ };
45
+ /** Agent version. */
46
+ version: string;
47
+ /** URL where A2A protocol requests are accepted. */
48
+ url: string;
49
+ /** Skills this agent provides. */
50
+ skills: AgentSkill[];
51
+ /** Supported A2A capabilities. */
52
+ capabilities?: {
53
+ streaming?: boolean;
54
+ pushNotifications?: boolean;
55
+ stateTransitionHistory?: boolean;
56
+ };
57
+ /** Authentication requirements. */
58
+ authentication?: {
59
+ schemes: string[];
60
+ credentials?: string;
61
+ };
62
+ /** Default input MIME types. */
63
+ defaultInputModes?: string[];
64
+ /** Default output MIME types. */
65
+ defaultOutputModes?: string[];
66
+ }
67
+ /** Status of an A2A task. */
68
+ export type A2ATaskStatus = 'submitted' | 'working' | 'input-required' | 'completed' | 'failed' | 'canceled';
69
+ /** A part of a message (text, file, or data). */
70
+ export interface MessagePart {
71
+ type: 'text' | 'file' | 'data';
72
+ /** Text content (for type='text'). */
73
+ text?: string;
74
+ /** File reference (for type='file'). */
75
+ file?: {
76
+ name?: string;
77
+ mimeType?: string;
78
+ uri?: string;
79
+ bytes?: string;
80
+ };
81
+ /** Structured data (for type='data'). */
82
+ data?: Record<string, unknown>;
83
+ /** Metadata about this part. */
84
+ metadata?: Record<string, unknown>;
85
+ }
86
+ /** A message in the A2A conversation. */
87
+ export interface A2AMessage {
88
+ /** Unique message ID. */
89
+ messageId: string;
90
+ /** Who sent this: 'user' (requesting agent) or 'agent' (this agent). */
91
+ role: 'user' | 'agent';
92
+ /** Message parts. */
93
+ parts: MessagePart[];
94
+ /** ISO timestamp. */
95
+ timestamp: string;
96
+ /** Arbitrary metadata. */
97
+ metadata?: Record<string, unknown>;
98
+ }
99
+ /** Status update for a task. */
100
+ export interface TaskStatus {
101
+ state: A2ATaskStatus;
102
+ message?: A2AMessage;
103
+ timestamp: string;
104
+ }
105
+ /** An A2A task. */
106
+ export interface A2ATask {
107
+ /** Unique task ID. */
108
+ id: string;
109
+ /** Session ID for multi-turn conversations. */
110
+ sessionId: string;
111
+ /** Current status. */
112
+ status: TaskStatus;
113
+ /** History of status transitions. */
114
+ history: TaskStatus[];
115
+ /** Artifacts produced by the task. */
116
+ artifacts: A2AArtifact[];
117
+ /** ISO creation timestamp. */
118
+ createdAt: string;
119
+ /** ISO last update timestamp. */
120
+ updatedAt: string;
121
+ /** Metadata. */
122
+ metadata?: Record<string, unknown>;
123
+ }
124
+ /** An artifact produced by a task. */
125
+ export interface A2AArtifact {
126
+ /** Unique artifact ID. */
127
+ id: string;
128
+ /** Artifact name. */
129
+ name?: string;
130
+ /** Artifact parts. */
131
+ parts: MessagePart[];
132
+ /** Whether this artifact is the final result. */
133
+ lastChunk?: boolean;
134
+ /** Artifact index (for multi-artifact tasks). */
135
+ index?: number;
136
+ /** Metadata. */
137
+ metadata?: Record<string, unknown>;
138
+ }
139
+ /** A2A JSON-RPC methods. */
140
+ export type A2AMethod = 'tasks/send' | 'tasks/get' | 'tasks/cancel' | 'tasks/pushNotification/set' | 'tasks/pushNotification/get' | 'tasks/sendSubscribe';
141
+ /** A2A JSON-RPC request. */
142
+ export interface A2ARequest {
143
+ jsonrpc: '2.0';
144
+ id?: string | number;
145
+ method: A2AMethod;
146
+ params?: Record<string, unknown>;
147
+ }
148
+ /** A2A JSON-RPC response. */
149
+ export interface A2AResponse {
150
+ jsonrpc: '2.0';
151
+ id?: string | number;
152
+ result?: unknown;
153
+ error?: {
154
+ code: number;
155
+ message: string;
156
+ data?: unknown;
157
+ };
158
+ }
159
+ export interface A2AManagerConfig {
160
+ /** This agent's card. */
161
+ agentCard: AgentCard;
162
+ /** Max tasks to retain. Default: 10000. */
163
+ maxTasks?: number;
164
+ /** Max task age in ms. Default: 86400000 (24h). */
165
+ maxTaskAgeMs?: number;
166
+ /** Whether to record state transition history. Default: true. */
167
+ recordHistory?: boolean;
168
+ }
169
+ export interface A2AStats {
170
+ /** Total tasks created. */
171
+ totalTasks: number;
172
+ /** Tasks by status. */
173
+ byStatus: Record<string, number>;
174
+ /** Total messages exchanged. */
175
+ totalMessages: number;
176
+ /** Total artifacts produced. */
177
+ totalArtifacts: number;
178
+ /** Active (non-terminal) tasks. */
179
+ activeTasks: number;
180
+ }
181
+ export declare class A2AManager {
182
+ private agentCard;
183
+ private tasks;
184
+ private maxTasks;
185
+ private maxTaskAgeMs;
186
+ private recordHistory;
187
+ private stats;
188
+ constructor(config: A2AManagerConfig);
189
+ /** Get the agent card for /.well-known/agent.json. */
190
+ getAgentCard(): AgentCard;
191
+ /** Update agent card. */
192
+ updateAgentCard(card: Partial<AgentCard>): void;
193
+ /**
194
+ * Handle an incoming A2A JSON-RPC request.
195
+ * Routes to the appropriate handler based on method.
196
+ */
197
+ handleRequest(request: A2ARequest): A2AResponse;
198
+ /**
199
+ * Create a new task or send a message to an existing task.
200
+ */
201
+ private handleTaskSend;
202
+ /**
203
+ * Get task status.
204
+ */
205
+ private handleTaskGet;
206
+ /**
207
+ * Cancel a task.
208
+ */
209
+ private handleTaskCancel;
210
+ /**
211
+ * Transition a task to a new state (for use by task handlers).
212
+ */
213
+ transitionTask(taskOrId: A2ATask | string, newState: A2ATaskStatus, message?: A2AMessage, artifact?: A2AArtifact): A2ATask | null;
214
+ /**
215
+ * Get a task by ID.
216
+ */
217
+ getTask(taskId: string): A2ATask | null;
218
+ /**
219
+ * List tasks with optional filters.
220
+ */
221
+ listTasks(opts?: {
222
+ sessionId?: string;
223
+ status?: A2ATaskStatus;
224
+ limit?: number;
225
+ }): A2ATask[];
226
+ /**
227
+ * Find skills matching a query.
228
+ */
229
+ findSkills(query: string): AgentSkill[];
230
+ /**
231
+ * Get stats.
232
+ */
233
+ getStats(): A2AStats;
234
+ /**
235
+ * Clean up old tasks.
236
+ */
237
+ cleanup(maxAgeMs?: number): number;
238
+ /**
239
+ * Destroy and release resources.
240
+ */
241
+ destroy(): void;
242
+ private sanitizeTask;
243
+ private evictOldTasks;
244
+ }
245
+ //# sourceMappingURL=a2a-protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a2a-protocol.d.ts","sourceRoot":"","sources":["../src/a2a-protocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,288 @@
1
+ "use strict";
2
+ /**
3
+ * A2A Protocol Support — Agent-to-Agent communication alongside MCP.
4
+ *
5
+ * Implements core A2A (Agent-to-Agent) protocol primitives for inter-agent
6
+ * communication, task delegation, and capability discovery. Supports:
7
+ *
8
+ * - Agent Cards (/.well-known/agent.json): Advertise agent capabilities
9
+ * - Task lifecycle: create → working → completed/failed/canceled
10
+ * - Message exchange with typed parts (text, file, data)
11
+ * - Agent skill discovery and matching
12
+ * - Billing hooks for task-based pricing
13
+ *
14
+ * A2A protocol specification: https://google.github.io/A2A/
15
+ *
16
+ * Zero external dependencies.
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.A2AManager = void 0;
20
+ // ─── A2A Manager ─────────────────────────────────────────────────────────────
21
+ class A2AManager {
22
+ agentCard;
23
+ tasks = new Map();
24
+ maxTasks;
25
+ maxTaskAgeMs;
26
+ recordHistory;
27
+ stats = {
28
+ totalTasks: 0,
29
+ byStatus: {},
30
+ totalMessages: 0,
31
+ totalArtifacts: 0,
32
+ activeTasks: 0,
33
+ };
34
+ constructor(config) {
35
+ this.agentCard = config.agentCard;
36
+ this.maxTasks = config.maxTasks ?? 10_000;
37
+ this.maxTaskAgeMs = config.maxTaskAgeMs ?? 86_400_000;
38
+ this.recordHistory = config.recordHistory ?? true;
39
+ }
40
+ /** Get the agent card for /.well-known/agent.json. */
41
+ getAgentCard() {
42
+ return { ...this.agentCard };
43
+ }
44
+ /** Update agent card. */
45
+ updateAgentCard(card) {
46
+ Object.assign(this.agentCard, card);
47
+ }
48
+ /**
49
+ * Handle an incoming A2A JSON-RPC request.
50
+ * Routes to the appropriate handler based on method.
51
+ */
52
+ handleRequest(request) {
53
+ const base = { jsonrpc: '2.0', id: request.id };
54
+ switch (request.method) {
55
+ case 'tasks/send':
56
+ return { ...base, ...this.handleTaskSend(request.params ?? {}) };
57
+ case 'tasks/get':
58
+ return { ...base, ...this.handleTaskGet(request.params ?? {}) };
59
+ case 'tasks/cancel':
60
+ return { ...base, ...this.handleTaskCancel(request.params ?? {}) };
61
+ default:
62
+ return { ...base, error: { code: -32601, message: `Unknown A2A method: ${request.method}` } };
63
+ }
64
+ }
65
+ /**
66
+ * Create a new task or send a message to an existing task.
67
+ */
68
+ handleTaskSend(params) {
69
+ const taskId = params.id;
70
+ const sessionId = params.sessionId ?? `session_${Date.now()}`;
71
+ const messageParts = params.message;
72
+ if (!messageParts?.parts || messageParts.parts.length === 0) {
73
+ return { error: { code: -32602, message: 'Message with parts is required' } };
74
+ }
75
+ const message = {
76
+ messageId: `msg_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,
77
+ role: messageParts.role ?? 'user',
78
+ parts: messageParts.parts,
79
+ timestamp: new Date().toISOString(),
80
+ metadata: params.metadata,
81
+ };
82
+ this.stats.totalMessages++;
83
+ // Existing task — append message
84
+ if (taskId && this.tasks.has(taskId)) {
85
+ const task = this.tasks.get(taskId);
86
+ const newStatus = {
87
+ state: 'working',
88
+ message,
89
+ timestamp: new Date().toISOString(),
90
+ };
91
+ if (this.recordHistory) {
92
+ task.history.push(task.status);
93
+ }
94
+ task.status = newStatus;
95
+ task.updatedAt = new Date().toISOString();
96
+ return { result: this.sanitizeTask(task) };
97
+ }
98
+ // New task
99
+ this.evictOldTasks();
100
+ const newTaskId = taskId ?? `task_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
101
+ const status = {
102
+ state: 'submitted',
103
+ message,
104
+ timestamp: new Date().toISOString(),
105
+ };
106
+ const task = {
107
+ id: newTaskId,
108
+ sessionId,
109
+ status,
110
+ history: [],
111
+ artifacts: [],
112
+ createdAt: new Date().toISOString(),
113
+ updatedAt: new Date().toISOString(),
114
+ metadata: params.metadata,
115
+ };
116
+ this.tasks.set(newTaskId, task);
117
+ this.stats.totalTasks++;
118
+ this.stats.activeTasks++;
119
+ this.stats.byStatus['submitted'] = (this.stats.byStatus['submitted'] ?? 0) + 1;
120
+ return { result: this.sanitizeTask(task) };
121
+ }
122
+ /**
123
+ * Get task status.
124
+ */
125
+ handleTaskGet(params) {
126
+ const taskId = params.id;
127
+ if (!taskId) {
128
+ return { error: { code: -32602, message: 'Task ID is required' } };
129
+ }
130
+ const task = this.tasks.get(taskId);
131
+ if (!task) {
132
+ return { error: { code: -32001, message: `Task not found: ${taskId}` } };
133
+ }
134
+ return { result: this.sanitizeTask(task) };
135
+ }
136
+ /**
137
+ * Cancel a task.
138
+ */
139
+ handleTaskCancel(params) {
140
+ const taskId = params.id;
141
+ if (!taskId) {
142
+ return { error: { code: -32602, message: 'Task ID is required' } };
143
+ }
144
+ const task = this.tasks.get(taskId);
145
+ if (!task) {
146
+ return { error: { code: -32001, message: `Task not found: ${taskId}` } };
147
+ }
148
+ const terminalStates = ['completed', 'failed', 'canceled'];
149
+ if (terminalStates.includes(task.status.state)) {
150
+ return { error: { code: -32002, message: `Task already in terminal state: ${task.status.state}` } };
151
+ }
152
+ this.transitionTask(task, 'canceled');
153
+ return { result: this.sanitizeTask(task) };
154
+ }
155
+ /**
156
+ * Transition a task to a new state (for use by task handlers).
157
+ */
158
+ transitionTask(taskOrId, newState, message, artifact) {
159
+ const task = typeof taskOrId === 'string' ? this.tasks.get(taskOrId) : taskOrId;
160
+ if (!task)
161
+ return null;
162
+ const oldState = task.status.state;
163
+ if (this.recordHistory) {
164
+ task.history.push(task.status);
165
+ }
166
+ const newStatus = {
167
+ state: newState,
168
+ message,
169
+ timestamp: new Date().toISOString(),
170
+ };
171
+ task.status = newStatus;
172
+ task.updatedAt = new Date().toISOString();
173
+ if (artifact) {
174
+ task.artifacts.push(artifact);
175
+ this.stats.totalArtifacts++;
176
+ }
177
+ // Update stats
178
+ this.stats.byStatus[oldState] = Math.max(0, (this.stats.byStatus[oldState] ?? 0) - 1);
179
+ this.stats.byStatus[newState] = (this.stats.byStatus[newState] ?? 0) + 1;
180
+ const terminalStates = ['completed', 'failed', 'canceled'];
181
+ if (terminalStates.includes(newState) && !terminalStates.includes(oldState)) {
182
+ this.stats.activeTasks = Math.max(0, this.stats.activeTasks - 1);
183
+ }
184
+ return task;
185
+ }
186
+ /**
187
+ * Get a task by ID.
188
+ */
189
+ getTask(taskId) {
190
+ const task = this.tasks.get(taskId);
191
+ return task ? this.sanitizeTask(task) : null;
192
+ }
193
+ /**
194
+ * List tasks with optional filters.
195
+ */
196
+ listTasks(opts) {
197
+ let tasks = [...this.tasks.values()];
198
+ if (opts?.sessionId) {
199
+ tasks = tasks.filter(t => t.sessionId === opts.sessionId);
200
+ }
201
+ if (opts?.status) {
202
+ tasks = tasks.filter(t => t.status.state === opts.status);
203
+ }
204
+ tasks.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));
205
+ if (opts?.limit) {
206
+ tasks = tasks.slice(0, opts.limit);
207
+ }
208
+ return tasks.map(t => this.sanitizeTask(t));
209
+ }
210
+ /**
211
+ * Find skills matching a query.
212
+ */
213
+ findSkills(query) {
214
+ const q = query.toLowerCase();
215
+ return this.agentCard.skills.filter(s => {
216
+ if (s.name.toLowerCase().includes(q))
217
+ return true;
218
+ if (s.description?.toLowerCase().includes(q))
219
+ return true;
220
+ if (s.tags?.some(t => t.toLowerCase().includes(q)))
221
+ return true;
222
+ return false;
223
+ });
224
+ }
225
+ /**
226
+ * Get stats.
227
+ */
228
+ getStats() {
229
+ return { ...this.stats, byStatus: { ...this.stats.byStatus } };
230
+ }
231
+ /**
232
+ * Clean up old tasks.
233
+ */
234
+ cleanup(maxAgeMs) {
235
+ const threshold = maxAgeMs ?? this.maxTaskAgeMs;
236
+ const cutoff = Date.now() - threshold;
237
+ let cleaned = 0;
238
+ for (const [id, task] of this.tasks) {
239
+ if (new Date(task.updatedAt).getTime() < cutoff) {
240
+ const terminalStates = ['completed', 'failed', 'canceled'];
241
+ if (!terminalStates.includes(task.status.state)) {
242
+ this.stats.activeTasks = Math.max(0, this.stats.activeTasks - 1);
243
+ }
244
+ this.tasks.delete(id);
245
+ cleaned++;
246
+ }
247
+ }
248
+ return cleaned;
249
+ }
250
+ /**
251
+ * Destroy and release resources.
252
+ */
253
+ destroy() {
254
+ this.tasks.clear();
255
+ this.stats = {
256
+ totalTasks: 0,
257
+ byStatus: {},
258
+ totalMessages: 0,
259
+ totalArtifacts: 0,
260
+ activeTasks: 0,
261
+ };
262
+ }
263
+ // ─── Private ─────────────────────────────────────────────────────────────
264
+ sanitizeTask(task) {
265
+ return {
266
+ ...task,
267
+ history: this.recordHistory ? [...task.history] : [],
268
+ artifacts: [...task.artifacts],
269
+ };
270
+ }
271
+ evictOldTasks() {
272
+ if (this.tasks.size < this.maxTasks)
273
+ return;
274
+ // Remove oldest completed tasks first
275
+ const entries = [...this.tasks.entries()]
276
+ .sort((a, b) => a[1].updatedAt.localeCompare(b[1].updatedAt));
277
+ const terminalStates = ['completed', 'failed', 'canceled'];
278
+ for (const [id, task] of entries) {
279
+ if (this.tasks.size < this.maxTasks * 0.8)
280
+ break; // Keep 80% capacity
281
+ if (terminalStates.includes(task.status.state)) {
282
+ this.tasks.delete(id);
283
+ }
284
+ }
285
+ }
286
+ }
287
+ exports.A2AManager = A2AManager;
288
+ //# sourceMappingURL=a2a-protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a2a-protocol.js","sourceRoot":"","sources":["../src/a2a-protocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Billable Metric Expressions — Config-driven pricing formulas.
3
+ *
4
+ * Instead of flat per-call pricing, define expressions that compute
5
+ * cost based on request/response attributes:
6
+ *
7
+ * cost = input_tokens * 0.001 + output_tokens * 0.003
8
+ * cost = max(1, file_size_kb * 0.5)
9
+ * cost = base_cost + (duration_ms / 1000) * 2
10
+ *
11
+ * SECURITY: Expressions are parsed with a safe recursive descent parser.
12
+ * NO JavaScript eval(), NO Function constructor. The parser only
13
+ * supports arithmetic (+, -, *, /, %), built-in math functions
14
+ * (min, max, ceil, floor, round, abs, sqrt, log, pow),
15
+ * numeric literals, and named variables.
16
+ *
17
+ * Features:
18
+ * - Safe expression parsing (AST-based, no code execution)
19
+ * - Built-in math functions: min, max, ceil, floor, round, abs
20
+ * - Variable binding from tool args and response fields
21
+ * - Per-tool metric definitions
22
+ * - Fallback to flat pricing if expression errors
23
+ * - Statistics and audit trail
24
+ *
25
+ * Zero external dependencies.
26
+ */
27
+ export interface BillableMetric {
28
+ /** Unique metric ID. */
29
+ id: string;
30
+ /** Human-readable name. */
31
+ name: string;
32
+ /** Expression string (e.g., 'input_tokens * 0.001 + output_tokens * 0.003'). */
33
+ expression: string;
34
+ /** Tools this metric applies to. Empty = all. */
35
+ tools: string[];
36
+ /** Minimum cost (floor). Default: 0. */
37
+ minCost?: number;
38
+ /** Maximum cost (ceiling). Default: Infinity. */
39
+ maxCost?: number;
40
+ /** Whether this metric is active. Default: true. */
41
+ active: boolean;
42
+ /** Description. */
43
+ description?: string;
44
+ /** Fallback flat cost if expression fails. Default: 1. */
45
+ fallbackCost?: number;
46
+ }
47
+ export interface MetricContext {
48
+ /** Tool name. */
49
+ tool: string;
50
+ /** Input arguments (flattened key-value). */
51
+ inputArgs: Record<string, unknown>;
52
+ /** Response content (if post-call). */
53
+ responseContent?: string;
54
+ /** Response size in bytes. */
55
+ responseSizeBytes?: number;
56
+ /** Call duration in ms. */
57
+ durationMs?: number;
58
+ /** Input size in bytes. */
59
+ inputSizeBytes?: number;
60
+ /** Custom variables injected by caller. */
61
+ customVars?: Record<string, number>;
62
+ }
63
+ export interface MetricResult {
64
+ /** Computed cost in credits. */
65
+ cost: number;
66
+ /** Metric ID used. */
67
+ metricId: string;
68
+ /** Whether fallback was used. */
69
+ usedFallback: boolean;
70
+ /** Error if expression failed. */
71
+ error?: string;
72
+ /** Variables resolved for the expression. */
73
+ resolvedVars: Record<string, number>;
74
+ }
75
+ export interface BillableMetricStats {
76
+ /** Total evaluations. */
77
+ totalEvaluations: number;
78
+ /** Successful expression evaluations. */
79
+ successfulEvals: number;
80
+ /** Fallback evaluations (expression error). */
81
+ fallbackEvals: number;
82
+ /** Total credits computed. */
83
+ totalCreditsComputed: number;
84
+ /** Evaluations by metric ID. */
85
+ byMetric: Record<string, number>;
86
+ /** Evaluations by tool. */
87
+ byTool: Record<string, number>;
88
+ }
89
+ /**
90
+ * Safely compute a math expression with named variables.
91
+ *
92
+ * Uses a recursive descent parser. No JavaScript code execution.
93
+ * Only supports: numbers, variables, +, -, *, /, %, parentheses,
94
+ * and built-in math functions (min, max, ceil, floor, round, abs, sqrt, log, pow).
95
+ */
96
+ export declare function computeExpression(expression: string, vars: Record<string, number>): number;
97
+ export declare class BillableMetricEngine {
98
+ private metrics;
99
+ private stats;
100
+ constructor(metrics?: BillableMetric[]);
101
+ /** Get all metrics. */
102
+ getMetrics(): BillableMetric[];
103
+ /** Add or update a metric. */
104
+ upsertMetric(metric: BillableMetric): BillableMetric;
105
+ /** Remove a metric by ID. */
106
+ removeMetric(id: string): boolean;
107
+ /**
108
+ * Find the matching metric for a tool.
109
+ * Returns the first active metric whose tool list matches.
110
+ */
111
+ findMetric(tool: string): BillableMetric | null;
112
+ /**
113
+ * Compute cost for a tool call using billable metric expressions.
114
+ *
115
+ * @param context - Context with args, response, timing data
116
+ * @returns Result with computed cost, or null if no metric matches
117
+ */
118
+ computeCost(context: MetricContext): MetricResult | null;
119
+ /** Get statistics. */
120
+ getStats(): BillableMetricStats;
121
+ /** Reset stats. */
122
+ resetStats(): void;
123
+ /** Export metrics for backup/serialization. */
124
+ exportMetrics(): BillableMetric[];
125
+ /** Import metrics. */
126
+ importMetrics(metrics: BillableMetric[], mode?: 'merge' | 'replace'): number;
127
+ /** Destroy. */
128
+ destroy(): void;
129
+ }
130
+ //# sourceMappingURL=billable-metrics.d.ts.map