@llm-dev-ops/agentics-cli 1.3.7 → 1.3.9
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/dist/adapters/base-adapter.d.ts +58 -1
- package/dist/adapters/base-adapter.d.ts.map +1 -1
- package/dist/adapters/base-adapter.js +110 -0
- package/dist/adapters/base-adapter.js.map +1 -1
- package/dist/cli/index.js +992 -16
- package/dist/cli/index.js.map +1 -1
- package/dist/commands/deploy.d.ts +95 -13
- package/dist/commands/deploy.d.ts.map +1 -1
- package/dist/commands/deploy.js +420 -14
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/erp.d.ts +302 -0
- package/dist/commands/erp.d.ts.map +1 -0
- package/dist/commands/erp.js +1064 -0
- package/dist/commands/erp.js.map +1 -0
- package/dist/commands/export.d.ts +40 -13
- package/dist/commands/export.d.ts.map +1 -1
- package/dist/commands/export.js +434 -14
- package/dist/commands/export.js.map +1 -1
- package/dist/commands/index.d.ts +20 -12
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +10 -6
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/inspect.d.ts +84 -18
- package/dist/commands/inspect.d.ts.map +1 -1
- package/dist/commands/inspect.js +585 -131
- package/dist/commands/inspect.js.map +1 -1
- package/dist/commands/logout.d.ts +34 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +73 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/plan.d.ts +147 -14
- package/dist/commands/plan.d.ts.map +1 -1
- package/dist/commands/plan.js +557 -16
- package/dist/commands/plan.js.map +1 -1
- package/dist/commands/policy.d.ts +136 -0
- package/dist/commands/policy.d.ts.map +1 -0
- package/dist/commands/policy.js +460 -0
- package/dist/commands/policy.js.map +1 -0
- package/dist/commands/quantify.d.ts +131 -13
- package/dist/commands/quantify.d.ts.map +1 -1
- package/dist/commands/quantify.js +425 -14
- package/dist/commands/quantify.js.map +1 -1
- package/dist/commands/simulate.d.ts +119 -13
- package/dist/commands/simulate.d.ts.map +1 -1
- package/dist/commands/simulate.js +363 -14
- package/dist/commands/simulate.js.map +1 -1
- package/dist/commands/usage.d.ts +110 -0
- package/dist/commands/usage.d.ts.map +1 -0
- package/dist/commands/usage.js +507 -0
- package/dist/commands/usage.js.map +1 -0
- package/dist/commands/whoami.d.ts +33 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +93 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/config/endpoints.d.ts.map +1 -1
- package/dist/config/endpoints.js +16 -1
- package/dist/config/endpoints.js.map +1 -1
- package/dist/contracts/schemas/index.d.ts +4 -0
- package/dist/contracts/schemas/index.d.ts.map +1 -1
- package/dist/contracts/schemas/index.js +2 -0
- package/dist/contracts/schemas/index.js.map +1 -1
- package/dist/contracts/validator.d.ts.map +1 -1
- package/dist/contracts/validator.js +55 -148
- package/dist/contracts/validator.js.map +1 -1
- package/dist/modules/artifact-handoff.d.ts +5 -0
- package/dist/modules/artifact-handoff.d.ts.map +1 -1
- package/dist/modules/artifact-handoff.js +47 -11
- package/dist/modules/artifact-handoff.js.map +1 -1
- package/dist/modules/command-parser.d.ts +1 -1
- package/dist/modules/command-parser.d.ts.map +1 -1
- package/dist/modules/command-parser.js +6 -1
- package/dist/modules/command-parser.js.map +1 -1
- package/dist/modules/output-renderer.d.ts +1 -0
- package/dist/modules/output-renderer.d.ts.map +1 -1
- package/dist/modules/output-renderer.js +25 -1
- package/dist/modules/output-renderer.js.map +1 -1
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Usage Command - Usage Management and Connectivity Verification
|
|
3
|
+
*
|
|
4
|
+
* ARCHITECTURE:
|
|
5
|
+
* - Main command issues direct HTTP GET request to agentics-usage-ledger
|
|
6
|
+
* - Subcommands provide local stubbed data for history/limits
|
|
7
|
+
* - reset is advisory only and requires --force flag
|
|
8
|
+
*
|
|
9
|
+
* SUBCOMMANDS:
|
|
10
|
+
* - (default) Check current usage balance via ledger service
|
|
11
|
+
* - history Show usage history (stubbed)
|
|
12
|
+
* - limits Show usage limits (stubbed)
|
|
13
|
+
* - reset Reset usage counters (advisory, requires --force)
|
|
14
|
+
*
|
|
15
|
+
* PURPOSE:
|
|
16
|
+
* - Verify CLI-to-usage-ledger connectivity
|
|
17
|
+
* - Display current balance or usage information
|
|
18
|
+
* - Provide org-scoped usage data
|
|
19
|
+
*/
|
|
20
|
+
import type { CommandOptions } from '../types/index.js';
|
|
21
|
+
export declare const USAGE_EXIT_CODES: {
|
|
22
|
+
readonly SUCCESS: 0;
|
|
23
|
+
readonly SERVICE_UNAVAILABLE: 69;
|
|
24
|
+
readonly TIMEOUT: 75;
|
|
25
|
+
readonly NETWORK_ERROR: 120;
|
|
26
|
+
readonly UNEXPECTED_ERROR: 1;
|
|
27
|
+
};
|
|
28
|
+
export interface UsageBalance {
|
|
29
|
+
current_balance?: number;
|
|
30
|
+
credits_remaining?: number;
|
|
31
|
+
credits_used?: number;
|
|
32
|
+
total_credits?: number;
|
|
33
|
+
currency?: string;
|
|
34
|
+
last_updated?: string;
|
|
35
|
+
}
|
|
36
|
+
export interface UsageCommandResult {
|
|
37
|
+
balance: UsageBalance | null;
|
|
38
|
+
connected: boolean;
|
|
39
|
+
timing: number;
|
|
40
|
+
message: string;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Format usage balance for human-readable terminal output.
|
|
44
|
+
*/
|
|
45
|
+
export declare function formatUsageForDisplay(result: UsageCommandResult): string;
|
|
46
|
+
/**
|
|
47
|
+
* Execute the usage command.
|
|
48
|
+
*
|
|
49
|
+
* Verifies connectivity to the usage-ledger service and returns
|
|
50
|
+
* current balance/usage information.
|
|
51
|
+
*/
|
|
52
|
+
export declare function executeUsageCommand(options: CommandOptions): Promise<UsageCommandResult>;
|
|
53
|
+
export interface UsageHistoryInput {
|
|
54
|
+
limit?: number;
|
|
55
|
+
since?: string;
|
|
56
|
+
}
|
|
57
|
+
export interface UsageHistoryEntry {
|
|
58
|
+
id: string;
|
|
59
|
+
action: string;
|
|
60
|
+
credits_used: number;
|
|
61
|
+
timestamp: string;
|
|
62
|
+
command?: string;
|
|
63
|
+
correlation_id?: string;
|
|
64
|
+
}
|
|
65
|
+
export interface UsageHistoryResult {
|
|
66
|
+
history: UsageHistoryEntry[];
|
|
67
|
+
count: number;
|
|
68
|
+
timing: number;
|
|
69
|
+
}
|
|
70
|
+
export interface UsageLimitsInput {
|
|
71
|
+
org_id?: string;
|
|
72
|
+
}
|
|
73
|
+
export interface UsageLimits {
|
|
74
|
+
daily_limit: number;
|
|
75
|
+
monthly_limit: number;
|
|
76
|
+
concurrent_limit: number;
|
|
77
|
+
rate_limit_per_minute: number;
|
|
78
|
+
current_daily_usage: number;
|
|
79
|
+
current_monthly_usage: number;
|
|
80
|
+
reset_at: string;
|
|
81
|
+
}
|
|
82
|
+
export interface UsageLimitsResult {
|
|
83
|
+
limits: UsageLimits;
|
|
84
|
+
timing: number;
|
|
85
|
+
}
|
|
86
|
+
export interface UsageResetInput {
|
|
87
|
+
force: boolean;
|
|
88
|
+
}
|
|
89
|
+
export interface UsageResetResult {
|
|
90
|
+
reset: boolean;
|
|
91
|
+
previous_usage: number;
|
|
92
|
+
advisory: boolean;
|
|
93
|
+
timing: number;
|
|
94
|
+
message: string;
|
|
95
|
+
}
|
|
96
|
+
export declare function formatHistoryForDisplay(history: UsageHistoryEntry[]): string;
|
|
97
|
+
export declare function formatLimitsForDisplay(limits: UsageLimits): string;
|
|
98
|
+
/**
|
|
99
|
+
* Get usage history - returns stubbed data
|
|
100
|
+
*/
|
|
101
|
+
export declare function executeUsageHistoryCommand(input: UsageHistoryInput, _options: CommandOptions): Promise<UsageHistoryResult>;
|
|
102
|
+
/**
|
|
103
|
+
* Get usage limits - returns stubbed data
|
|
104
|
+
*/
|
|
105
|
+
export declare function executeUsageLimitsCommand(_input: UsageLimitsInput, _options: CommandOptions): Promise<UsageLimitsResult>;
|
|
106
|
+
/**
|
|
107
|
+
* Reset usage counters - advisory only, requires --force flag
|
|
108
|
+
*/
|
|
109
|
+
export declare function executeUsageResetCommand(input: UsageResetInput, options: CommandOptions): Promise<UsageResetResult>;
|
|
110
|
+
//# sourceMappingURL=usage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../src/commands/usage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,507 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Usage Command - Usage Management and Connectivity Verification
|
|
3
|
+
*
|
|
4
|
+
* ARCHITECTURE:
|
|
5
|
+
* - Main command issues direct HTTP GET request to agentics-usage-ledger
|
|
6
|
+
* - Subcommands provide local stubbed data for history/limits
|
|
7
|
+
* - reset is advisory only and requires --force flag
|
|
8
|
+
*
|
|
9
|
+
* SUBCOMMANDS:
|
|
10
|
+
* - (default) Check current usage balance via ledger service
|
|
11
|
+
* - history Show usage history (stubbed)
|
|
12
|
+
* - limits Show usage limits (stubbed)
|
|
13
|
+
* - reset Reset usage counters (advisory, requires --force)
|
|
14
|
+
*
|
|
15
|
+
* PURPOSE:
|
|
16
|
+
* - Verify CLI-to-usage-ledger connectivity
|
|
17
|
+
* - Display current balance or usage information
|
|
18
|
+
* - Provide org-scoped usage data
|
|
19
|
+
*/
|
|
20
|
+
import * as fs from 'node:fs';
|
|
21
|
+
import * as path from 'node:path';
|
|
22
|
+
import { CLIError } from '../errors/index.js';
|
|
23
|
+
import { validateEndpointUrl } from '../config/endpoints.js';
|
|
24
|
+
// ============================================================================
|
|
25
|
+
// Usage-Specific Exit Codes
|
|
26
|
+
// ============================================================================
|
|
27
|
+
export const USAGE_EXIT_CODES = {
|
|
28
|
+
SUCCESS: 0,
|
|
29
|
+
SERVICE_UNAVAILABLE: 69,
|
|
30
|
+
TIMEOUT: 75,
|
|
31
|
+
NETWORK_ERROR: 120,
|
|
32
|
+
UNEXPECTED_ERROR: 1,
|
|
33
|
+
};
|
|
34
|
+
// ============================================================================
|
|
35
|
+
// Endpoint Configuration
|
|
36
|
+
// ============================================================================
|
|
37
|
+
/**
|
|
38
|
+
* Get the usage-ledger endpoint URL.
|
|
39
|
+
* Uses environment variable override or production default.
|
|
40
|
+
*/
|
|
41
|
+
function getUsageLedgerUrl() {
|
|
42
|
+
const envUrl = process.env['AGENTICS_USAGE_LEDGER_URL'];
|
|
43
|
+
if (envUrl) {
|
|
44
|
+
return envUrl;
|
|
45
|
+
}
|
|
46
|
+
return 'https://agentics-usage-ledger-1062287243982.us-central1.run.app';
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Get the request timeout in milliseconds.
|
|
50
|
+
*/
|
|
51
|
+
function getRequestTimeout() {
|
|
52
|
+
const envTimeout = process.env['AGENTICS_USAGE_LEDGER_TIMEOUT'];
|
|
53
|
+
if (envTimeout) {
|
|
54
|
+
const parsed = parseInt(envTimeout, 10);
|
|
55
|
+
if (!isNaN(parsed) && parsed > 0) {
|
|
56
|
+
return parsed;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return 15000; // 15 seconds default
|
|
60
|
+
}
|
|
61
|
+
// ============================================================================
|
|
62
|
+
// Output Formatting
|
|
63
|
+
// ============================================================================
|
|
64
|
+
/**
|
|
65
|
+
* Format usage balance for human-readable terminal output.
|
|
66
|
+
*/
|
|
67
|
+
export function formatUsageForDisplay(result) {
|
|
68
|
+
const lines = [];
|
|
69
|
+
if (!result.connected) {
|
|
70
|
+
lines.push('Usage Ledger Status: UNREACHABLE');
|
|
71
|
+
lines.push('');
|
|
72
|
+
lines.push(result.message);
|
|
73
|
+
return lines.join('\n');
|
|
74
|
+
}
|
|
75
|
+
lines.push('Usage Ledger Status: CONNECTED');
|
|
76
|
+
lines.push('');
|
|
77
|
+
if (result.balance === null) {
|
|
78
|
+
lines.push(result.message);
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
// Display balance information
|
|
82
|
+
const b = result.balance;
|
|
83
|
+
if (b.current_balance !== undefined) {
|
|
84
|
+
const currency = b.currency ?? 'credits';
|
|
85
|
+
lines.push(` Current Balance: ${b.current_balance.toLocaleString()} ${currency}`);
|
|
86
|
+
}
|
|
87
|
+
else if (b.credits_remaining !== undefined) {
|
|
88
|
+
lines.push(` Credits Remaining: ${b.credits_remaining.toLocaleString()}`);
|
|
89
|
+
}
|
|
90
|
+
if (b.credits_used !== undefined) {
|
|
91
|
+
lines.push(` Credits Used: ${b.credits_used.toLocaleString()}`);
|
|
92
|
+
}
|
|
93
|
+
if (b.total_credits !== undefined) {
|
|
94
|
+
lines.push(` Total Credits: ${b.total_credits.toLocaleString()}`);
|
|
95
|
+
}
|
|
96
|
+
if (b.last_updated) {
|
|
97
|
+
lines.push(` Last Updated: ${new Date(b.last_updated).toLocaleString()}`);
|
|
98
|
+
}
|
|
99
|
+
// If no specific fields, show the message
|
|
100
|
+
if (lines.length === 2) {
|
|
101
|
+
lines.push(result.message);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
lines.push('');
|
|
105
|
+
lines.push(`Response time: ${result.timing}ms`);
|
|
106
|
+
return lines.join('\n');
|
|
107
|
+
}
|
|
108
|
+
// ============================================================================
|
|
109
|
+
// Direct HTTP Request
|
|
110
|
+
// ============================================================================
|
|
111
|
+
/**
|
|
112
|
+
* Execute a direct HTTP GET request to the usage-ledger service.
|
|
113
|
+
*/
|
|
114
|
+
async function executeHttpGet(url, timeout, correlationId) {
|
|
115
|
+
const startTime = Date.now();
|
|
116
|
+
const controller = new AbortController();
|
|
117
|
+
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
118
|
+
try {
|
|
119
|
+
const response = await fetch(url, {
|
|
120
|
+
method: 'GET',
|
|
121
|
+
headers: {
|
|
122
|
+
'Accept': 'application/json',
|
|
123
|
+
'X-Correlation-ID': correlationId,
|
|
124
|
+
'X-API-Version': 'v1',
|
|
125
|
+
},
|
|
126
|
+
signal: controller.signal,
|
|
127
|
+
});
|
|
128
|
+
clearTimeout(timeoutId);
|
|
129
|
+
const timing = Date.now() - startTime;
|
|
130
|
+
// Parse response body
|
|
131
|
+
let body;
|
|
132
|
+
const contentType = response.headers.get('content-type') ?? '';
|
|
133
|
+
if (contentType.includes('application/json')) {
|
|
134
|
+
body = await response.json();
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
body = await response.text();
|
|
138
|
+
}
|
|
139
|
+
return { body, timing, status: response.status };
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
clearTimeout(timeoutId);
|
|
143
|
+
// Handle abort (timeout)
|
|
144
|
+
if (error instanceof Error && error.name === 'AbortError') {
|
|
145
|
+
throw new CLIError({
|
|
146
|
+
code: 'ECLI-USAGE-TIMEOUT',
|
|
147
|
+
category: 'NETWORK_ERROR',
|
|
148
|
+
message: `Request timed out after ${timeout}ms`,
|
|
149
|
+
details: { timeout_ms: timeout },
|
|
150
|
+
module: 'usage',
|
|
151
|
+
correlationId,
|
|
152
|
+
recoverable: true,
|
|
153
|
+
exitCode: USAGE_EXIT_CODES.TIMEOUT,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
// Handle network errors
|
|
157
|
+
if (error instanceof TypeError) {
|
|
158
|
+
throw new CLIError({
|
|
159
|
+
code: 'ECLI-USAGE-NETWORK',
|
|
160
|
+
category: 'NETWORK_ERROR',
|
|
161
|
+
message: 'Unable to connect to the usage ledger service',
|
|
162
|
+
details: { hint: 'Check your network connection and try again.' },
|
|
163
|
+
module: 'usage',
|
|
164
|
+
correlationId,
|
|
165
|
+
recoverable: true,
|
|
166
|
+
exitCode: USAGE_EXIT_CODES.NETWORK_ERROR,
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
// Re-throw CLIErrors
|
|
170
|
+
if (error instanceof CLIError) {
|
|
171
|
+
throw error;
|
|
172
|
+
}
|
|
173
|
+
// Wrap unknown errors
|
|
174
|
+
throw new CLIError({
|
|
175
|
+
code: 'ECLI-USAGE-UNKNOWN',
|
|
176
|
+
category: 'INTERNAL_ERROR',
|
|
177
|
+
message: error instanceof Error ? error.message : 'An unexpected error occurred',
|
|
178
|
+
module: 'usage',
|
|
179
|
+
correlationId,
|
|
180
|
+
recoverable: false,
|
|
181
|
+
exitCode: USAGE_EXIT_CODES.UNEXPECTED_ERROR,
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
// ============================================================================
|
|
186
|
+
// Usage Command Implementation
|
|
187
|
+
// ============================================================================
|
|
188
|
+
/**
|
|
189
|
+
* Execute the usage command.
|
|
190
|
+
*
|
|
191
|
+
* Verifies connectivity to the usage-ledger service and returns
|
|
192
|
+
* current balance/usage information.
|
|
193
|
+
*/
|
|
194
|
+
export async function executeUsageCommand(options) {
|
|
195
|
+
const correlationId = options.trace_id ?? crypto.randomUUID();
|
|
196
|
+
const startTime = Date.now();
|
|
197
|
+
// Get endpoint configuration
|
|
198
|
+
const baseUrl = getUsageLedgerUrl();
|
|
199
|
+
const timeout = options.timeout ?? getRequestTimeout();
|
|
200
|
+
// Validate endpoint URL (fails fast if localhost without local dev mode)
|
|
201
|
+
validateEndpointUrl('agentics-usage-ledger', baseUrl);
|
|
202
|
+
// Build request URL - try /v1/usage/balance first, fall back to /v1/usage
|
|
203
|
+
const balanceUrl = `${baseUrl}/v1/usage/balance`;
|
|
204
|
+
try {
|
|
205
|
+
const response = await executeHttpGet(balanceUrl, timeout, correlationId);
|
|
206
|
+
// Handle successful response
|
|
207
|
+
if (response.status >= 200 && response.status < 300) {
|
|
208
|
+
const body = response.body;
|
|
209
|
+
// Extract balance information from various response formats
|
|
210
|
+
const balance = {};
|
|
211
|
+
if (typeof body['current_balance'] === 'number') {
|
|
212
|
+
balance.current_balance = body['current_balance'];
|
|
213
|
+
}
|
|
214
|
+
if (typeof body['balance'] === 'number') {
|
|
215
|
+
balance.current_balance = body['balance'];
|
|
216
|
+
}
|
|
217
|
+
if (typeof body['credits_remaining'] === 'number') {
|
|
218
|
+
balance.credits_remaining = body['credits_remaining'];
|
|
219
|
+
}
|
|
220
|
+
if (typeof body['credits_used'] === 'number') {
|
|
221
|
+
balance.credits_used = body['credits_used'];
|
|
222
|
+
}
|
|
223
|
+
if (typeof body['total_credits'] === 'number') {
|
|
224
|
+
balance.total_credits = body['total_credits'];
|
|
225
|
+
}
|
|
226
|
+
if (typeof body['currency'] === 'string') {
|
|
227
|
+
balance.currency = body['currency'];
|
|
228
|
+
}
|
|
229
|
+
if (typeof body['last_updated'] === 'string') {
|
|
230
|
+
balance.last_updated = body['last_updated'];
|
|
231
|
+
}
|
|
232
|
+
const hasBalanceData = Object.keys(balance).length > 0;
|
|
233
|
+
return {
|
|
234
|
+
balance: hasBalanceData ? balance : null,
|
|
235
|
+
connected: true,
|
|
236
|
+
timing: response.timing,
|
|
237
|
+
message: hasBalanceData
|
|
238
|
+
? 'Successfully retrieved usage information.'
|
|
239
|
+
: 'No usage recorded yet.',
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
// Handle 404 - endpoint might be /v1/usage instead
|
|
243
|
+
if (response.status === 404) {
|
|
244
|
+
// Try the alternate endpoint
|
|
245
|
+
const usageUrl = `${baseUrl}/v1/usage`;
|
|
246
|
+
const altResponse = await executeHttpGet(usageUrl, timeout, correlationId);
|
|
247
|
+
if (altResponse.status >= 200 && altResponse.status < 300) {
|
|
248
|
+
const body = altResponse.body;
|
|
249
|
+
const balance = {};
|
|
250
|
+
if (typeof body['current_balance'] === 'number') {
|
|
251
|
+
balance.current_balance = body['current_balance'];
|
|
252
|
+
}
|
|
253
|
+
if (typeof body['balance'] === 'number') {
|
|
254
|
+
balance.current_balance = body['balance'];
|
|
255
|
+
}
|
|
256
|
+
if (typeof body['credits_remaining'] === 'number') {
|
|
257
|
+
balance.credits_remaining = body['credits_remaining'];
|
|
258
|
+
}
|
|
259
|
+
if (typeof body['credits_used'] === 'number') {
|
|
260
|
+
balance.credits_used = body['credits_used'];
|
|
261
|
+
}
|
|
262
|
+
if (typeof body['total_credits'] === 'number') {
|
|
263
|
+
balance.total_credits = body['total_credits'];
|
|
264
|
+
}
|
|
265
|
+
if (typeof body['currency'] === 'string') {
|
|
266
|
+
balance.currency = body['currency'];
|
|
267
|
+
}
|
|
268
|
+
if (typeof body['last_updated'] === 'string') {
|
|
269
|
+
balance.last_updated = body['last_updated'];
|
|
270
|
+
}
|
|
271
|
+
const hasBalanceData = Object.keys(balance).length > 0;
|
|
272
|
+
return {
|
|
273
|
+
balance: hasBalanceData ? balance : null,
|
|
274
|
+
connected: true,
|
|
275
|
+
timing: Date.now() - startTime,
|
|
276
|
+
message: hasBalanceData
|
|
277
|
+
? 'Successfully retrieved usage information.'
|
|
278
|
+
: 'No usage recorded yet.',
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
// Handle service unavailable
|
|
283
|
+
if (response.status === 503 || response.status === 502 || response.status === 504) {
|
|
284
|
+
throw new CLIError({
|
|
285
|
+
code: 'ECLI-USAGE-SERVICE-UNAVAILABLE',
|
|
286
|
+
category: 'NETWORK_ERROR',
|
|
287
|
+
message: 'The usage ledger service is currently unavailable. Please try again later.',
|
|
288
|
+
details: { hint: 'The service may be temporarily down for maintenance.' },
|
|
289
|
+
module: 'usage',
|
|
290
|
+
correlationId,
|
|
291
|
+
recoverable: true,
|
|
292
|
+
exitCode: USAGE_EXIT_CODES.SERVICE_UNAVAILABLE,
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
// Handle other error responses but still indicate connectivity
|
|
296
|
+
let errorMessage = 'Service responded but could not retrieve usage data.';
|
|
297
|
+
if (typeof response.body === 'object' && response.body !== null) {
|
|
298
|
+
const body = response.body;
|
|
299
|
+
if (typeof body['message'] === 'string') {
|
|
300
|
+
errorMessage = body['message'];
|
|
301
|
+
}
|
|
302
|
+
else if (typeof body['error'] === 'string') {
|
|
303
|
+
errorMessage = body['error'];
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
return {
|
|
307
|
+
balance: null,
|
|
308
|
+
connected: true,
|
|
309
|
+
timing: response.timing,
|
|
310
|
+
message: errorMessage,
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
catch (error) {
|
|
314
|
+
// Re-throw CLI errors
|
|
315
|
+
if (error instanceof CLIError) {
|
|
316
|
+
throw error;
|
|
317
|
+
}
|
|
318
|
+
// Unexpected errors
|
|
319
|
+
throw new CLIError({
|
|
320
|
+
code: 'ECLI-USAGE-UNEXPECTED',
|
|
321
|
+
category: 'INTERNAL_ERROR',
|
|
322
|
+
message: error instanceof Error ? error.message : 'An unexpected error occurred',
|
|
323
|
+
module: 'usage',
|
|
324
|
+
correlationId,
|
|
325
|
+
recoverable: false,
|
|
326
|
+
exitCode: USAGE_EXIT_CODES.UNEXPECTED_ERROR,
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
// ============================================================================
|
|
331
|
+
// Local State Storage (for reset tracking)
|
|
332
|
+
// ============================================================================
|
|
333
|
+
function getUsageStateDir() {
|
|
334
|
+
const baseDir = process.env['AGENTICS_DATA_DIR'] ?? process.cwd();
|
|
335
|
+
return path.join(baseDir, '.agentics', 'usage');
|
|
336
|
+
}
|
|
337
|
+
function ensureUsageStateDir() {
|
|
338
|
+
const dir = getUsageStateDir();
|
|
339
|
+
if (!fs.existsSync(dir)) {
|
|
340
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
function getUsageStatePath() {
|
|
344
|
+
return path.join(getUsageStateDir(), 'state.json');
|
|
345
|
+
}
|
|
346
|
+
function loadUsageState() {
|
|
347
|
+
const filePath = getUsageStatePath();
|
|
348
|
+
if (!fs.existsSync(filePath)) {
|
|
349
|
+
return { reset_count: 0, total_credits_used: 0 };
|
|
350
|
+
}
|
|
351
|
+
try {
|
|
352
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
353
|
+
return JSON.parse(content);
|
|
354
|
+
}
|
|
355
|
+
catch {
|
|
356
|
+
return { reset_count: 0, total_credits_used: 0 };
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
function saveUsageState(state) {
|
|
360
|
+
ensureUsageStateDir();
|
|
361
|
+
const filePath = getUsageStatePath();
|
|
362
|
+
fs.writeFileSync(filePath, JSON.stringify(state, null, 2), 'utf-8');
|
|
363
|
+
}
|
|
364
|
+
// ============================================================================
|
|
365
|
+
// Display Formatting
|
|
366
|
+
// ============================================================================
|
|
367
|
+
export function formatHistoryForDisplay(history) {
|
|
368
|
+
if (history.length === 0) {
|
|
369
|
+
return 'No usage history found.';
|
|
370
|
+
}
|
|
371
|
+
const lines = [];
|
|
372
|
+
lines.push(`Usage History (${history.length} entries):`);
|
|
373
|
+
lines.push('');
|
|
374
|
+
for (const entry of history) {
|
|
375
|
+
lines.push(` ${entry.timestamp} - ${entry.action}`);
|
|
376
|
+
lines.push(` Credits: ${entry.credits_used}`);
|
|
377
|
+
if (entry.command) {
|
|
378
|
+
lines.push(` Command: ${entry.command}`);
|
|
379
|
+
}
|
|
380
|
+
lines.push('');
|
|
381
|
+
}
|
|
382
|
+
return lines.join('\n');
|
|
383
|
+
}
|
|
384
|
+
export function formatLimitsForDisplay(limits) {
|
|
385
|
+
const lines = [];
|
|
386
|
+
lines.push('Usage Limits:');
|
|
387
|
+
lines.push('');
|
|
388
|
+
lines.push(` Daily Limit: ${limits.daily_limit.toLocaleString()} credits`);
|
|
389
|
+
lines.push(` Monthly Limit: ${limits.monthly_limit.toLocaleString()} credits`);
|
|
390
|
+
lines.push(` Concurrent Limit: ${limits.concurrent_limit} operations`);
|
|
391
|
+
lines.push(` Rate Limit: ${limits.rate_limit_per_minute} requests/minute`);
|
|
392
|
+
lines.push('');
|
|
393
|
+
lines.push('Current Usage:');
|
|
394
|
+
lines.push(` Daily: ${limits.current_daily_usage.toLocaleString()} / ${limits.daily_limit.toLocaleString()}`);
|
|
395
|
+
lines.push(` Monthly: ${limits.current_monthly_usage.toLocaleString()} / ${limits.monthly_limit.toLocaleString()}`);
|
|
396
|
+
lines.push('');
|
|
397
|
+
lines.push(` Resets at: ${new Date(limits.reset_at).toLocaleString()}`);
|
|
398
|
+
return lines.join('\n');
|
|
399
|
+
}
|
|
400
|
+
// ============================================================================
|
|
401
|
+
// Usage History Command Implementation (Stubbed)
|
|
402
|
+
// ============================================================================
|
|
403
|
+
/**
|
|
404
|
+
* Get usage history - returns stubbed data
|
|
405
|
+
*/
|
|
406
|
+
export async function executeUsageHistoryCommand(input, _options) {
|
|
407
|
+
const startTime = Date.now();
|
|
408
|
+
// Generate stubbed history entries
|
|
409
|
+
const now = new Date();
|
|
410
|
+
const history = [];
|
|
411
|
+
// Create some placeholder entries
|
|
412
|
+
const limit = input.limit ?? 10;
|
|
413
|
+
for (let i = 0; i < Math.min(limit, 5); i++) {
|
|
414
|
+
const timestamp = new Date(now.getTime() - (i * 3600000)); // 1 hour apart
|
|
415
|
+
history.push({
|
|
416
|
+
id: `usage-${Date.now().toString(36)}-${i}`,
|
|
417
|
+
action: i === 0 ? 'usage_check' : i === 1 ? 'simulate_run' : i === 2 ? 'plan_create' : 'api_call',
|
|
418
|
+
credits_used: Math.floor(Math.random() * 10) + 1,
|
|
419
|
+
timestamp: timestamp.toISOString(),
|
|
420
|
+
command: i === 0 ? 'usage' : i === 1 ? 'simulate run' : i === 2 ? 'plan create' : 'inspect',
|
|
421
|
+
correlation_id: crypto.randomUUID(),
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
// If since filter provided, filter (stub behavior - just return less data)
|
|
425
|
+
if (input.since) {
|
|
426
|
+
const sinceDate = new Date(input.since);
|
|
427
|
+
const filtered = history.filter(h => new Date(h.timestamp) >= sinceDate);
|
|
428
|
+
return {
|
|
429
|
+
history: filtered,
|
|
430
|
+
count: filtered.length,
|
|
431
|
+
timing: Date.now() - startTime,
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
return {
|
|
435
|
+
history,
|
|
436
|
+
count: history.length,
|
|
437
|
+
timing: Date.now() - startTime,
|
|
438
|
+
};
|
|
439
|
+
}
|
|
440
|
+
// ============================================================================
|
|
441
|
+
// Usage Limits Command Implementation (Stubbed)
|
|
442
|
+
// ============================================================================
|
|
443
|
+
/**
|
|
444
|
+
* Get usage limits - returns stubbed data
|
|
445
|
+
*/
|
|
446
|
+
export async function executeUsageLimitsCommand(_input, _options) {
|
|
447
|
+
const startTime = Date.now();
|
|
448
|
+
// Get current state for usage numbers
|
|
449
|
+
const state = loadUsageState();
|
|
450
|
+
// Calculate reset time (next midnight UTC)
|
|
451
|
+
const now = new Date();
|
|
452
|
+
const resetAt = new Date(now);
|
|
453
|
+
resetAt.setUTCHours(24, 0, 0, 0);
|
|
454
|
+
const limits = {
|
|
455
|
+
daily_limit: 10000,
|
|
456
|
+
monthly_limit: 100000,
|
|
457
|
+
concurrent_limit: 10,
|
|
458
|
+
rate_limit_per_minute: 60,
|
|
459
|
+
current_daily_usage: state.total_credits_used % 10000, // Stub: roll over at daily limit
|
|
460
|
+
current_monthly_usage: state.total_credits_used,
|
|
461
|
+
reset_at: resetAt.toISOString(),
|
|
462
|
+
};
|
|
463
|
+
return {
|
|
464
|
+
limits,
|
|
465
|
+
timing: Date.now() - startTime,
|
|
466
|
+
};
|
|
467
|
+
}
|
|
468
|
+
// ============================================================================
|
|
469
|
+
// Usage Reset Command Implementation (Advisory)
|
|
470
|
+
// ============================================================================
|
|
471
|
+
/**
|
|
472
|
+
* Reset usage counters - advisory only, requires --force flag
|
|
473
|
+
*/
|
|
474
|
+
export async function executeUsageResetCommand(input, options) {
|
|
475
|
+
const startTime = Date.now();
|
|
476
|
+
const correlationId = options.trace_id ?? crypto.randomUUID();
|
|
477
|
+
if (!input.force) {
|
|
478
|
+
throw new CLIError({
|
|
479
|
+
code: 'ECLI-USAGE-RESET-REQUIRES-FORCE',
|
|
480
|
+
category: 'INPUT_ERROR',
|
|
481
|
+
message: 'Usage reset requires --force flag to confirm',
|
|
482
|
+
details: { hint: 'Run with --force to confirm the reset operation' },
|
|
483
|
+
module: 'usage',
|
|
484
|
+
correlationId,
|
|
485
|
+
recoverable: true,
|
|
486
|
+
exitCode: USAGE_EXIT_CODES.SUCCESS, // Not an error, just requires confirmation
|
|
487
|
+
});
|
|
488
|
+
}
|
|
489
|
+
// Load current state
|
|
490
|
+
const state = loadUsageState();
|
|
491
|
+
const previousUsage = state.total_credits_used;
|
|
492
|
+
// Reset state (advisory - no real billing impact)
|
|
493
|
+
const newState = {
|
|
494
|
+
last_reset_at: new Date().toISOString(),
|
|
495
|
+
reset_count: state.reset_count + 1,
|
|
496
|
+
total_credits_used: 0,
|
|
497
|
+
};
|
|
498
|
+
saveUsageState(newState);
|
|
499
|
+
return {
|
|
500
|
+
reset: true,
|
|
501
|
+
previous_usage: previousUsage,
|
|
502
|
+
advisory: true,
|
|
503
|
+
timing: Date.now() - startTime,
|
|
504
|
+
message: 'Usage counters reset (advisory - no billing impact)',
|
|
505
|
+
};
|
|
506
|
+
}
|
|
507
|
+
//# sourceMappingURL=usage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/commands/usage.ts"],"names":[],"mappings":"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"}
|