cto-ai-cli 5.2.0 → 7.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.
Binary file
@@ -1,281 +0,0 @@
1
- type ProviderName = 'openai' | 'anthropic' | 'google' | 'azure-openai' | 'custom';
2
- interface ProviderConfig {
3
- name: ProviderName;
4
- displayName: string;
5
- baseUrl: string;
6
- authHeader: string;
7
- chatPath: string;
8
- models: ModelConfig[];
9
- parseRequest: (body: Record<string, unknown>) => ParsedRequest;
10
- parseResponse: (body: Record<string, unknown>, streaming: boolean) => ParsedResponse;
11
- detectProvider: (url: string, headers: Record<string, string>) => boolean;
12
- }
13
- interface ModelConfig {
14
- id: string;
15
- contextWindow: number;
16
- costPerMInput: number;
17
- costPerMOutput: number;
18
- maxOutput: number;
19
- }
20
- interface ParsedRequest {
21
- model: string;
22
- messages: Message[];
23
- stream: boolean;
24
- maxTokens?: number;
25
- temperature?: number;
26
- }
27
- interface ParsedResponse {
28
- model: string;
29
- inputTokens: number;
30
- outputTokens: number;
31
- content: string;
32
- finishReason: string;
33
- }
34
- interface Message {
35
- role: 'system' | 'user' | 'assistant' | 'tool';
36
- content: string;
37
- }
38
- interface GatewayConfig {
39
- port: number;
40
- host: string;
41
- optimize: boolean;
42
- projectPath: string;
43
- budget: number;
44
- redactSecrets: boolean;
45
- blockOnSecrets: boolean;
46
- apiKey: string;
47
- allowedTargetDomains: string[];
48
- maxBodyBytes: number;
49
- upstreamTimeoutMs: number;
50
- costTracking: boolean;
51
- budgetDaily: number;
52
- budgetMonthly: number;
53
- alertThreshold: number;
54
- auditLog: boolean;
55
- logDir: string;
56
- dashboard: boolean;
57
- dashboardPath: string;
58
- }
59
- declare const DEFAULT_GATEWAY_CONFIG: GatewayConfig;
60
- interface UsageRecord {
61
- id: string;
62
- timestamp: Date;
63
- provider: ProviderName;
64
- model: string;
65
- inputTokens: number;
66
- outputTokens: number;
67
- costUSD: number;
68
- originalTokens: number;
69
- optimizedTokens: number;
70
- savedTokens: number;
71
- savedUSD: number;
72
- secretsRedacted: number;
73
- secretsBlocked: boolean;
74
- projectPath: string;
75
- latencyMs: number;
76
- stream: boolean;
77
- error?: string;
78
- }
79
- interface UsageSummary {
80
- period: 'day' | 'week' | 'month' | 'all';
81
- totalRequests: number;
82
- totalInputTokens: number;
83
- totalOutputTokens: number;
84
- totalCostUSD: number;
85
- totalSavedTokens: number;
86
- totalSavedUSD: number;
87
- totalSecretsRedacted: number;
88
- byModel: Record<string, {
89
- requests: number;
90
- costUSD: number;
91
- tokens: number;
92
- }>;
93
- byProvider: Record<string, {
94
- requests: number;
95
- costUSD: number;
96
- }>;
97
- }
98
- interface InterceptResult {
99
- modified: boolean;
100
- messages: Message[];
101
- originalTokens: number;
102
- optimizedTokens: number;
103
- secretsRedacted: number;
104
- secretsBlocked: boolean;
105
- contextInjected: boolean;
106
- decisions: string[];
107
- }
108
- type GatewayEvent = {
109
- type: 'request';
110
- record: UsageRecord;
111
- } | {
112
- type: 'budget-alert';
113
- current: number;
114
- limit: number;
115
- period: string;
116
- } | {
117
- type: 'budget-exceeded';
118
- current: number;
119
- limit: number;
120
- period: string;
121
- } | {
122
- type: 'secret-blocked';
123
- file: string;
124
- count: number;
125
- } | {
126
- type: 'error';
127
- message: string;
128
- error?: Error;
129
- };
130
- type GatewayEventHandler = (event: GatewayEvent) => void;
131
-
132
- declare class UsageTracker {
133
- private logDir;
134
- private config;
135
- private eventHandlers;
136
- private cache;
137
- private cacheMonth;
138
- private memRecords;
139
- constructor(config: GatewayConfig);
140
- onEvent(handler: GatewayEventHandler): void;
141
- private emit;
142
- record(params: {
143
- provider: ProviderName;
144
- model: string;
145
- inputTokens: number;
146
- outputTokens: number;
147
- costUSD: number;
148
- originalTokens: number;
149
- optimizedTokens: number;
150
- savedTokens: number;
151
- savedUSD: number;
152
- secretsRedacted: number;
153
- secretsBlocked: boolean;
154
- projectPath: string;
155
- latencyMs: number;
156
- stream: boolean;
157
- error?: string;
158
- }): UsageRecord;
159
- private checkBudget;
160
- isDailyBudgetExceeded(now?: Date): boolean;
161
- isMonthlyBudgetExceeded(now?: Date): boolean;
162
- getDailyCost(date?: Date): number;
163
- getMonthlyCost(date?: Date): number;
164
- private mergeWithMemRecords;
165
- getSummary(period?: 'day' | 'week' | 'month' | 'all'): UsageSummary;
166
- private getMonthKey;
167
- private getMonthRecordsByKey;
168
- private getMonthRecords;
169
- private getAllRecords;
170
- }
171
-
172
- declare class ContextGateway {
173
- private config;
174
- private tracker;
175
- private analysis;
176
- private analysisPromise;
177
- private eventHandlers;
178
- private server;
179
- private httpAgent;
180
- private httpsAgent;
181
- private budgetLock;
182
- constructor(config?: Partial<GatewayConfig>);
183
- onEvent(handler: GatewayEventHandler): void;
184
- private emit;
185
- start(): Promise<void>;
186
- stop(): Promise<void>;
187
- getTracker(): UsageTracker;
188
- private refreshAnalysis;
189
- private handleRequest;
190
- private proxyRequest;
191
- private handleStreamResponse;
192
- private handleBufferedResponse;
193
- private serveDashboard;
194
- }
195
-
196
- declare const PROVIDERS: Record<ProviderName, ProviderConfig>;
197
- declare function detectProvider(url: string, headers: Record<string, string>): ProviderConfig;
198
- declare function getModelConfig(provider: ProviderConfig, modelId: string): ModelConfig | undefined;
199
- declare function estimateCost(provider: ProviderConfig, modelId: string, inputTokens: number, outputTokens: number): number;
200
-
201
- interface AnalyzedFile {
202
- path: string;
203
- relativePath: string;
204
- extension: string;
205
- size: number;
206
- tokens: number;
207
- lines: number;
208
- lastModified: Date;
209
- kind: FileKind;
210
- imports: string[];
211
- importedBy: string[];
212
- isHub: boolean;
213
- complexity: number;
214
- riskScore: number;
215
- riskFactors: RiskFactor[];
216
- exclusionImpact: ExclusionImpact;
217
- }
218
- type FileKind = 'source' | 'type' | 'test' | 'config' | 'entry' | 'asset';
219
- type ExclusionImpact = 'critical' | 'high' | 'medium' | 'low' | 'none';
220
- interface ProjectAnalysis {
221
- projectPath: string;
222
- projectName: string;
223
- analyzedAt: Date;
224
- hash: string;
225
- files: AnalyzedFile[];
226
- totalFiles: number;
227
- totalTokens: number;
228
- graph: ProjectGraph;
229
- riskProfile: RiskProfile;
230
- stack: string[];
231
- tokenMethod: 'chars4' | 'tiktoken';
232
- }
233
- interface ProjectGraph {
234
- nodes: string[];
235
- edges: GraphEdge[];
236
- hubs: HubNode[];
237
- leaves: string[];
238
- orphans: string[];
239
- clusters: FileCluster[];
240
- }
241
- interface GraphEdge {
242
- from: string;
243
- to: string;
244
- type: 'import' | 'export' | 're-export';
245
- }
246
- interface HubNode {
247
- relativePath: string;
248
- dependents: number;
249
- dependencies: number;
250
- score: number;
251
- }
252
- interface FileCluster {
253
- id: string;
254
- name: string;
255
- files: string[];
256
- totalTokens: number;
257
- internalEdges: number;
258
- externalEdges: number;
259
- cohesion: number;
260
- }
261
- interface RiskProfile {
262
- distribution: {
263
- critical: number;
264
- high: number;
265
- medium: number;
266
- low: number;
267
- };
268
- topRiskFiles: AnalyzedFile[];
269
- overallComplexity: number;
270
- }
271
- interface RiskFactor {
272
- type: RiskFactorType;
273
- score: number;
274
- weight: number;
275
- detail: string;
276
- }
277
- type RiskFactorType = 'hub' | 'type-provider' | 'complexity' | 'recency' | 'config' | 'churn';
278
-
279
- declare function interceptRequest(messages: Message[], config: GatewayConfig, analysis: ProjectAnalysis | null): Promise<InterceptResult>;
280
-
281
- export { ContextGateway, DEFAULT_GATEWAY_CONFIG, type GatewayConfig, type GatewayEvent, type GatewayEventHandler, type InterceptResult, type Message, type ModelConfig, PROVIDERS, type ParsedRequest, type ParsedResponse, type ProviderConfig, type ProviderName, type UsageRecord, type UsageSummary, UsageTracker, detectProvider, estimateCost, getModelConfig, interceptRequest };