milens 0.6.3 → 0.6.4

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.
Files changed (137) hide show
  1. package/.agents/skills/adapters/SKILL.md +31 -0
  2. package/.agents/skills/analyzer/SKILL.md +55 -0
  3. package/.agents/skills/apps/SKILL.md +42 -0
  4. package/.agents/skills/docs/SKILL.md +46 -0
  5. package/.agents/skills/milens/SKILL.md +168 -0
  6. package/.agents/skills/milens-code-review/SKILL.md +186 -0
  7. package/.agents/skills/milens-eval/SKILL.md +221 -0
  8. package/.agents/skills/milens-plan/SKILL.md +227 -0
  9. package/.agents/skills/milens-refactor-clean/SKILL.md +209 -0
  10. package/.agents/skills/milens-security-review/SKILL.md +224 -0
  11. package/.agents/skills/milens-tdd/SKILL.md +156 -0
  12. package/.agents/skills/parser/SKILL.md +60 -0
  13. package/.agents/skills/root/SKILL.md +64 -0
  14. package/.agents/skills/scripts/SKILL.md +27 -0
  15. package/.agents/skills/security/SKILL.md +44 -0
  16. package/.agents/skills/server/SKILL.md +46 -0
  17. package/.agents/skills/store/SKILL.md +53 -0
  18. package/.agents/skills/test/SKILL.md +73 -0
  19. package/LICENSE +75 -75
  20. package/README.md +508 -432
  21. package/adapters/README.md +107 -0
  22. package/adapters/claude-code/.claude/mcp.json +9 -0
  23. package/adapters/claude-code/CLAUDE.md +58 -0
  24. package/adapters/codex/.codex/codex.md +52 -0
  25. package/adapters/copilot/.github/copilot-instructions.md +62 -0
  26. package/adapters/cursor/.cursorrules +9 -0
  27. package/adapters/gemini/.gemini/context.md +58 -0
  28. package/adapters/opencode/.opencode/config.json +9 -0
  29. package/adapters/opencode/AGENTS.md +58 -0
  30. package/adapters/zed/.zed/settings.json +8 -0
  31. package/dist/agents-md.d.ts +3 -0
  32. package/dist/agents-md.d.ts.map +1 -0
  33. package/dist/agents-md.js +112 -0
  34. package/dist/agents-md.js.map +1 -0
  35. package/dist/analyzer/engine.js +1 -1
  36. package/dist/analyzer/engine.js.map +1 -1
  37. package/dist/cli.js +1190 -401
  38. package/dist/cli.js.map +1 -1
  39. package/dist/metrics.d.ts +51 -0
  40. package/dist/metrics.d.ts.map +1 -0
  41. package/dist/metrics.js +64 -0
  42. package/dist/metrics.js.map +1 -0
  43. package/dist/parser/lang-go.js +47 -47
  44. package/dist/parser/lang-java.js +29 -29
  45. package/dist/parser/lang-js.js +105 -105
  46. package/dist/parser/lang-php.js +38 -38
  47. package/dist/parser/lang-py.js +34 -34
  48. package/dist/parser/lang-ruby.js +14 -14
  49. package/dist/parser/lang-rust.js +30 -30
  50. package/dist/parser/lang-ts.js +191 -191
  51. package/dist/security/deps.d.ts +38 -0
  52. package/dist/security/deps.d.ts.map +1 -0
  53. package/dist/security/deps.js +685 -0
  54. package/dist/security/deps.js.map +1 -0
  55. package/dist/security/rules.d.ts +42 -0
  56. package/dist/security/rules.d.ts.map +1 -0
  57. package/dist/security/rules.js +940 -0
  58. package/dist/security/rules.js.map +1 -0
  59. package/dist/server/hooks.d.ts +26 -0
  60. package/dist/server/hooks.d.ts.map +1 -0
  61. package/dist/server/hooks.js +253 -0
  62. package/dist/server/hooks.js.map +1 -0
  63. package/dist/server/mcp-prompts.d.ts +277 -0
  64. package/dist/server/mcp-prompts.d.ts.map +1 -0
  65. package/dist/server/mcp-prompts.js +627 -0
  66. package/dist/server/mcp-prompts.js.map +1 -0
  67. package/dist/server/mcp.d.ts.map +1 -1
  68. package/dist/server/mcp.js +618 -643
  69. package/dist/server/mcp.js.map +1 -1
  70. package/dist/server/test-plan.d.ts +20 -0
  71. package/dist/server/test-plan.d.ts.map +1 -0
  72. package/dist/server/test-plan.js +100 -0
  73. package/dist/server/test-plan.js.map +1 -0
  74. package/dist/skills.js +152 -152
  75. package/dist/store/annotations.d.ts +41 -0
  76. package/dist/store/annotations.d.ts.map +1 -0
  77. package/dist/store/annotations.js +192 -0
  78. package/dist/store/annotations.js.map +1 -0
  79. package/dist/store/confidence.d.ts +18 -0
  80. package/dist/store/confidence.d.ts.map +1 -0
  81. package/dist/store/confidence.js +82 -0
  82. package/dist/store/confidence.js.map +1 -0
  83. package/dist/store/db.d.ts +37 -14
  84. package/dist/store/db.d.ts.map +1 -1
  85. package/dist/store/db.js +332 -239
  86. package/dist/store/db.js.map +1 -1
  87. package/dist/store/schema.sql +128 -116
  88. package/dist/store/vectors.js +2 -2
  89. package/dist/types.d.ts +101 -0
  90. package/dist/types.d.ts.map +1 -1
  91. package/docs/README.md +24 -0
  92. package/package.json +80 -66
  93. package/dist/gateway/analyzer.d.ts +0 -6
  94. package/dist/gateway/analyzer.d.ts.map +0 -1
  95. package/dist/gateway/analyzer.js +0 -218
  96. package/dist/gateway/analyzer.js.map +0 -1
  97. package/dist/gateway/cache.d.ts +0 -35
  98. package/dist/gateway/cache.d.ts.map +0 -1
  99. package/dist/gateway/cache.js +0 -175
  100. package/dist/gateway/cache.js.map +0 -1
  101. package/dist/gateway/config.d.ts +0 -10
  102. package/dist/gateway/config.d.ts.map +0 -1
  103. package/dist/gateway/config.js +0 -167
  104. package/dist/gateway/config.js.map +0 -1
  105. package/dist/gateway/context-memory.d.ts +0 -68
  106. package/dist/gateway/context-memory.d.ts.map +0 -1
  107. package/dist/gateway/context-memory.js +0 -157
  108. package/dist/gateway/context-memory.js.map +0 -1
  109. package/dist/gateway/observability.d.ts +0 -83
  110. package/dist/gateway/observability.d.ts.map +0 -1
  111. package/dist/gateway/observability.js +0 -152
  112. package/dist/gateway/observability.js.map +0 -1
  113. package/dist/gateway/privacy.d.ts +0 -27
  114. package/dist/gateway/privacy.d.ts.map +0 -1
  115. package/dist/gateway/privacy.js +0 -139
  116. package/dist/gateway/privacy.js.map +0 -1
  117. package/dist/gateway/providers.d.ts +0 -66
  118. package/dist/gateway/providers.d.ts.map +0 -1
  119. package/dist/gateway/providers.js +0 -377
  120. package/dist/gateway/providers.js.map +0 -1
  121. package/dist/gateway/router.d.ts +0 -18
  122. package/dist/gateway/router.d.ts.map +0 -1
  123. package/dist/gateway/router.js +0 -102
  124. package/dist/gateway/router.js.map +0 -1
  125. package/dist/gateway/server.d.ts +0 -20
  126. package/dist/gateway/server.d.ts.map +0 -1
  127. package/dist/gateway/server.js +0 -387
  128. package/dist/gateway/server.js.map +0 -1
  129. package/dist/gateway/translator.d.ts +0 -19
  130. package/dist/gateway/translator.d.ts.map +0 -1
  131. package/dist/gateway/translator.js +0 -340
  132. package/dist/gateway/translator.js.map +0 -1
  133. package/dist/gateway/types.d.ts +0 -215
  134. package/dist/gateway/types.d.ts.map +0 -1
  135. package/dist/gateway/types.js +0 -3
  136. package/dist/gateway/types.js.map +0 -1
  137. package/dist/store/gateway-schema.sql +0 -53
@@ -1,340 +0,0 @@
1
- // ── Format translation: OpenAI ↔ Anthropic ↔ Gemini ──
2
- // Pure functions — no side effects, no SDK dependencies
3
- // ── OpenAI (canonical format — passthrough) ──
4
- export function toOpenAIRequest(req) {
5
- const body = {
6
- model: req.model,
7
- messages: req.messages,
8
- stream: req.stream ?? false,
9
- };
10
- if (req.temperature !== undefined)
11
- body.temperature = req.temperature;
12
- if (req.max_tokens !== undefined)
13
- body.max_tokens = req.max_tokens;
14
- if (req.top_p !== undefined)
15
- body.top_p = req.top_p;
16
- if (req.stop !== undefined)
17
- body.stop = req.stop;
18
- if (req.tools?.length)
19
- body.tools = req.tools;
20
- if (req.tool_choice !== undefined)
21
- body.tool_choice = req.tool_choice;
22
- return body;
23
- }
24
- export function toAnthropicRequest(req) {
25
- // Extract system message
26
- let system;
27
- const messages = [];
28
- for (const msg of req.messages) {
29
- if (msg.role === 'system') {
30
- const text = typeof msg.content === 'string'
31
- ? msg.content
32
- : msg.content.filter(p => p.type === 'text').map(p => p.text).join('\n');
33
- system = system ? system + '\n\n' + text : text;
34
- continue;
35
- }
36
- if (msg.role === 'tool') {
37
- // Tool results → user message with tool_result content
38
- messages.push({
39
- role: 'user',
40
- content: [{
41
- type: 'tool_result',
42
- tool_use_id: msg.tool_call_id,
43
- content: typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content),
44
- }],
45
- });
46
- continue;
47
- }
48
- if (msg.role === 'assistant' && msg.tool_calls?.length) {
49
- // Tool calls from assistant
50
- const content = [];
51
- if (msg.content) {
52
- const text = typeof msg.content === 'string' ? msg.content
53
- : msg.content.filter(p => p.type === 'text').map(p => p.text).join('');
54
- if (text)
55
- content.push({ type: 'text', text });
56
- }
57
- for (const tc of msg.tool_calls) {
58
- content.push({
59
- type: 'tool_use',
60
- id: tc.id,
61
- name: tc.function.name,
62
- input: JSON.parse(tc.function.arguments),
63
- });
64
- }
65
- messages.push({ role: 'assistant', content });
66
- continue;
67
- }
68
- // Regular user/assistant messages
69
- const role = msg.role === 'user' ? 'user' : 'assistant';
70
- if (typeof msg.content === 'string') {
71
- messages.push({ role, content: msg.content });
72
- }
73
- else if (Array.isArray(msg.content)) {
74
- const content = [];
75
- for (const part of msg.content) {
76
- if (part.type === 'text') {
77
- content.push({ type: 'text', text: part.text });
78
- }
79
- else if (part.type === 'image_url' && part.image_url) {
80
- // Convert data URL to Anthropic base64 format
81
- const match = part.image_url.url.match(/^data:(.+?);base64,(.+)$/);
82
- if (match) {
83
- content.push({
84
- type: 'image',
85
- source: { type: 'base64', media_type: match[1], data: match[2] },
86
- });
87
- }
88
- }
89
- }
90
- messages.push({ role, content });
91
- }
92
- }
93
- // Merge consecutive same-role messages (Anthropic requires alternating roles)
94
- const merged = mergeConsecutiveMessages(messages);
95
- const body = {
96
- model: req.model,
97
- messages: merged,
98
- max_tokens: req.max_tokens ?? 4096,
99
- stream: req.stream ?? false,
100
- };
101
- if (system)
102
- body.system = system;
103
- if (req.temperature !== undefined)
104
- body.temperature = req.temperature;
105
- if (req.top_p !== undefined)
106
- body.top_p = req.top_p;
107
- if (req.stop !== undefined)
108
- body.stop_sequences = Array.isArray(req.stop) ? req.stop : [req.stop];
109
- if (req.tools?.length) {
110
- body.tools = req.tools.map(t => ({
111
- name: t.function.name,
112
- description: t.function.description,
113
- input_schema: t.function.parameters ?? { type: 'object', properties: {} },
114
- }));
115
- }
116
- return body;
117
- }
118
- function mergeConsecutiveMessages(messages) {
119
- const result = [];
120
- for (const msg of messages) {
121
- const last = result[result.length - 1];
122
- if (last && last.role === msg.role) {
123
- // Merge content
124
- const lastContent = typeof last.content === 'string'
125
- ? [{ type: 'text', text: last.content }] : last.content;
126
- const newContent = typeof msg.content === 'string'
127
- ? [{ type: 'text', text: msg.content }] : msg.content;
128
- last.content = [...lastContent, ...newContent];
129
- }
130
- else {
131
- result.push({ ...msg });
132
- }
133
- }
134
- return result;
135
- }
136
- export function fromAnthropicResponse(data) {
137
- const content = [];
138
- const toolCalls = [];
139
- for (const block of data.content ?? []) {
140
- if (block.type === 'text')
141
- content.push(block.text);
142
- if (block.type === 'tool_use') {
143
- toolCalls.push({
144
- id: block.id,
145
- type: 'function',
146
- function: { name: block.name, arguments: JSON.stringify(block.input) },
147
- });
148
- }
149
- }
150
- const message = {
151
- role: 'assistant',
152
- content: content.join(''),
153
- };
154
- if (toolCalls.length)
155
- message.tool_calls = toolCalls;
156
- return {
157
- message,
158
- usage: {
159
- prompt_tokens: data.usage?.input_tokens ?? 0,
160
- completion_tokens: data.usage?.output_tokens ?? 0,
161
- total_tokens: (data.usage?.input_tokens ?? 0) + (data.usage?.output_tokens ?? 0),
162
- },
163
- model: data.model ?? '',
164
- finishReason: mapAnthropicStopReason(data.stop_reason),
165
- };
166
- }
167
- export function fromAnthropicStreamEvent(event) {
168
- switch (event.type) {
169
- case 'content_block_delta':
170
- if (event.delta?.type === 'text_delta') {
171
- return { index: 0, delta: { content: event.delta.text }, finish_reason: null };
172
- }
173
- if (event.delta?.type === 'input_json_delta') {
174
- // Streaming tool input — accumulate in caller
175
- return { index: 0, delta: { content: event.delta.partial_json }, finish_reason: null };
176
- }
177
- return null;
178
- case 'message_delta':
179
- return {
180
- index: 0,
181
- delta: {},
182
- finish_reason: mapAnthropicStopReason(event.delta?.stop_reason),
183
- };
184
- default:
185
- return null;
186
- }
187
- }
188
- function mapAnthropicStopReason(reason) {
189
- switch (reason) {
190
- case 'end_turn': return 'stop';
191
- case 'max_tokens': return 'length';
192
- case 'tool_use': return 'tool_calls';
193
- default: return reason ?? 'stop';
194
- }
195
- }
196
- export function toGeminiRequest(req) {
197
- const contents = [];
198
- let systemInstruction;
199
- for (const msg of req.messages) {
200
- if (msg.role === 'system') {
201
- const text = typeof msg.content === 'string'
202
- ? msg.content
203
- : msg.content.filter(p => p.type === 'text').map(p => p.text).join('\n');
204
- if (systemInstruction) {
205
- systemInstruction.parts.push({ text });
206
- }
207
- else {
208
- systemInstruction = { parts: [{ text }] };
209
- }
210
- continue;
211
- }
212
- if (msg.role === 'tool') {
213
- contents.push({
214
- role: 'model',
215
- parts: [{
216
- functionResponse: {
217
- name: '', // Gemini requires name, but it comes from context
218
- response: { content: msg.content },
219
- },
220
- }],
221
- });
222
- continue;
223
- }
224
- const role = msg.role === 'assistant' ? 'model' : 'user';
225
- const parts = [];
226
- if (msg.tool_calls?.length) {
227
- for (const tc of msg.tool_calls) {
228
- parts.push({
229
- functionCall: {
230
- name: tc.function.name,
231
- args: JSON.parse(tc.function.arguments),
232
- },
233
- });
234
- }
235
- }
236
- if (typeof msg.content === 'string') {
237
- if (msg.content)
238
- parts.push({ text: msg.content });
239
- }
240
- else if (Array.isArray(msg.content)) {
241
- for (const part of msg.content) {
242
- if (part.type === 'text' && part.text) {
243
- parts.push({ text: part.text });
244
- }
245
- else if (part.type === 'image_url' && part.image_url) {
246
- const match = part.image_url.url.match(/^data:(.+?);base64,(.+)$/);
247
- if (match) {
248
- parts.push({ inlineData: { mimeType: match[1], data: match[2] } });
249
- }
250
- }
251
- }
252
- }
253
- if (parts.length)
254
- contents.push({ role, parts });
255
- }
256
- const body = { contents };
257
- if (systemInstruction)
258
- body.systemInstruction = systemInstruction;
259
- const generationConfig = {};
260
- if (req.temperature !== undefined)
261
- generationConfig.temperature = req.temperature;
262
- if (req.max_tokens !== undefined)
263
- generationConfig.maxOutputTokens = req.max_tokens;
264
- if (req.top_p !== undefined)
265
- generationConfig.topP = req.top_p;
266
- if (req.stop !== undefined)
267
- generationConfig.stopSequences = Array.isArray(req.stop) ? req.stop : [req.stop];
268
- if (Object.keys(generationConfig).length)
269
- body.generationConfig = generationConfig;
270
- if (req.tools?.length) {
271
- body.tools = [{
272
- functionDeclarations: req.tools.map(t => ({
273
- name: t.function.name,
274
- description: t.function.description,
275
- parameters: t.function.parameters,
276
- })),
277
- }];
278
- }
279
- return body;
280
- }
281
- export function fromGeminiResponse(data) {
282
- const candidate = data.candidates?.[0];
283
- const parts = candidate?.content?.parts ?? [];
284
- const content = [];
285
- const toolCalls = [];
286
- let tcIndex = 0;
287
- for (const part of parts) {
288
- if (part.text)
289
- content.push(part.text);
290
- if (part.functionCall) {
291
- toolCalls.push({
292
- id: `call_${tcIndex++}`,
293
- type: 'function',
294
- function: {
295
- name: part.functionCall.name,
296
- arguments: JSON.stringify(part.functionCall.args ?? {}),
297
- },
298
- });
299
- }
300
- }
301
- const message = { role: 'assistant', content: content.join('') };
302
- if (toolCalls.length)
303
- message.tool_calls = toolCalls;
304
- const meta = data.usageMetadata ?? {};
305
- return {
306
- message,
307
- usage: {
308
- prompt_tokens: meta.promptTokenCount ?? 0,
309
- completion_tokens: meta.candidatesTokenCount ?? 0,
310
- total_tokens: meta.totalTokenCount ?? 0,
311
- },
312
- model: data.modelVersion ?? '',
313
- finishReason: mapGeminiFinishReason(candidate?.finishReason),
314
- };
315
- }
316
- export function fromGeminiStreamChunk(data) {
317
- const candidate = data.candidates?.[0];
318
- if (!candidate?.content?.parts?.length)
319
- return null;
320
- const text = candidate.content.parts
321
- .filter((p) => p.text)
322
- .map((p) => p.text)
323
- .join('');
324
- return {
325
- index: 0,
326
- delta: { role: 'assistant', content: text },
327
- finish_reason: candidate.finishReason === 'STOP' ? 'stop'
328
- : candidate.finishReason === 'MAX_TOKENS' ? 'length'
329
- : null,
330
- };
331
- }
332
- function mapGeminiFinishReason(reason) {
333
- switch (reason) {
334
- case 'STOP': return 'stop';
335
- case 'MAX_TOKENS': return 'length';
336
- case 'SAFETY': return 'content_filter';
337
- default: return reason ?? 'stop';
338
- }
339
- }
340
- //# sourceMappingURL=translator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"translator.js","sourceRoot":"","sources":["../../src/gateway/translator.ts"],"names":[],"mappings":"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"}
@@ -1,215 +0,0 @@
1
- import type { CodeSymbol } from '../types.js';
2
- export type Tier = 'premium' | 'standard' | 'economy' | 'local';
3
- export type ProviderFormat = 'openai' | 'anthropic' | 'gemini';
4
- export type ProviderStatus = 'healthy' | 'degraded' | 'down';
5
- export interface ProviderConfig {
6
- id: string;
7
- name: string;
8
- tier: Tier;
9
- format: ProviderFormat;
10
- endpoint: string;
11
- apiKey: string;
12
- models: string[];
13
- maxRetries?: number;
14
- timeoutMs?: number;
15
- headers?: Record<string, string>;
16
- }
17
- export interface ProviderState {
18
- config: ProviderConfig;
19
- status: ProviderStatus;
20
- consecutiveFailures: number;
21
- lastUsed: number;
22
- lastError?: string;
23
- totalRequests: number;
24
- totalTokens: number;
25
- }
26
- export interface ChatMessage {
27
- role: 'system' | 'user' | 'assistant' | 'tool';
28
- content: string | ContentPart[];
29
- name?: string;
30
- tool_calls?: ToolCall[];
31
- tool_call_id?: string;
32
- }
33
- export interface ContentPart {
34
- type: 'text' | 'image_url';
35
- text?: string;
36
- image_url?: {
37
- url: string;
38
- detail?: string;
39
- };
40
- }
41
- export interface ToolCall {
42
- id: string;
43
- type: 'function';
44
- function: {
45
- name: string;
46
- arguments: string;
47
- };
48
- }
49
- export interface ToolDefinition {
50
- type: 'function';
51
- function: {
52
- name: string;
53
- description?: string;
54
- parameters?: Record<string, unknown>;
55
- };
56
- }
57
- export interface ChatRequest {
58
- model: string;
59
- messages: ChatMessage[];
60
- stream?: boolean;
61
- temperature?: number;
62
- max_tokens?: number;
63
- top_p?: number;
64
- stop?: string | string[];
65
- tools?: ToolDefinition[];
66
- tool_choice?: string | {
67
- type: string;
68
- function?: {
69
- name: string;
70
- };
71
- };
72
- _gateway?: {
73
- originalModel: string;
74
- tier?: Tier;
75
- forceProvider?: string;
76
- };
77
- }
78
- export interface ChatResponse {
79
- id: string;
80
- object: 'chat.completion';
81
- created: number;
82
- model: string;
83
- choices: ChatChoice[];
84
- usage?: TokenUsage;
85
- }
86
- export interface ChatChoice {
87
- index: number;
88
- message: ChatMessage;
89
- finish_reason: string | null;
90
- }
91
- export interface TokenUsage {
92
- prompt_tokens: number;
93
- completion_tokens: number;
94
- total_tokens: number;
95
- }
96
- export interface SSEChunk {
97
- id: string;
98
- object: 'chat.completion.chunk';
99
- created: number;
100
- model: string;
101
- choices: SSEChoiceDelta[];
102
- usage?: TokenUsage;
103
- }
104
- export interface SSEChoiceDelta {
105
- index: number;
106
- delta: Partial<ChatMessage>;
107
- finish_reason: string | null;
108
- }
109
- export type Intent = 'generate' | 'refactor' | 'review' | 'test' | 'debug' | 'explain' | 'docstring' | 'unknown';
110
- export interface MessageAnalysis {
111
- files: string[];
112
- symbolNames: string[];
113
- symbols: CodeSymbol[];
114
- intent: Intent;
115
- complexity: number;
116
- codeBlocks: string[];
117
- }
118
- export interface RoutingDecision {
119
- provider: ProviderConfig;
120
- tier: Tier;
121
- reason: string;
122
- complexity: number;
123
- intent: Intent;
124
- fallbackChain: ProviderConfig[];
125
- contextInjection?: string;
126
- }
127
- export interface CacheEntry {
128
- id: string;
129
- astHash: string;
130
- requestHash: string;
131
- response: string;
132
- model: string;
133
- provider: string;
134
- tokensIn: number;
135
- tokensOut: number;
136
- costEstimate: number;
137
- createdAt: string;
138
- hitCount: number;
139
- lastHitAt: string | null;
140
- ttlHours: number;
141
- }
142
- export type PrivacyAction = 'block' | 'mask' | 'local-only';
143
- export interface PrivacyRule {
144
- pathPattern: string;
145
- action: PrivacyAction;
146
- reason?: string;
147
- }
148
- export interface PrivacyDecision {
149
- action: PrivacyAction | 'allow';
150
- matchedRules: PrivacyRule[];
151
- maskedContent?: string;
152
- unmaskMap?: Map<string, string>;
153
- }
154
- export interface CostRecord {
155
- requestId: string;
156
- timestamp: string;
157
- provider: string;
158
- model: string;
159
- tokensIn: number;
160
- tokensOut: number;
161
- costEstimate: number;
162
- durationMs: number;
163
- symbolIds: string[];
164
- filePaths: string[];
165
- intent: Intent;
166
- complexityScore: number;
167
- tier: Tier;
168
- cacheHit: boolean;
169
- }
170
- export interface CostBreakdown {
171
- total: number;
172
- byFile: Record<string, number>;
173
- byModule: Record<string, number>;
174
- byIntent: Record<string, number>;
175
- byProvider: Record<string, number>;
176
- cacheSavings: number;
177
- }
178
- export interface RoutingConfig {
179
- thresholds: {
180
- economy: number;
181
- standard: number;
182
- };
183
- intentMultipliers: Partial<Record<Intent, number>>;
184
- defaultTier: Tier;
185
- }
186
- export interface CacheConfig {
187
- enabled: boolean;
188
- ttlHours: number;
189
- maxEntries: number;
190
- }
191
- export interface ContextInjectionConfig {
192
- enabled: boolean;
193
- maxTokens: number;
194
- includeCallers: boolean;
195
- includeDependencies: boolean;
196
- includeBlastRadius: boolean;
197
- }
198
- export interface GatewayConfig {
199
- port: number;
200
- host: string;
201
- apiKey?: string;
202
- providers: ProviderConfig[];
203
- routing: RoutingConfig;
204
- privacy: {
205
- rules: PrivacyRule[];
206
- defaultAction: string;
207
- };
208
- cache: CacheConfig;
209
- contextInjection: ContextInjectionConfig;
210
- rateLimit?: {
211
- windowMs: number;
212
- maxRequests: number;
213
- };
214
- }
215
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/gateway/types.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- // ── Gateway types for milens code-aware AI routing ──
2
- export {};
3
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/gateway/types.ts"],"names":[],"mappings":"AAAA,uDAAuD"}
@@ -1,53 +0,0 @@
1
- -- milens gateway schema — cache + observability + privacy tables
2
- -- Applied alongside main schema.sql in the same SQLite database
3
-
4
- CREATE TABLE IF NOT EXISTS gateway_cache (
5
- id TEXT PRIMARY KEY,
6
- ast_hash TEXT NOT NULL,
7
- request_hash TEXT NOT NULL,
8
- response TEXT NOT NULL,
9
- model TEXT,
10
- provider TEXT,
11
- tokens_in INTEGER DEFAULT 0,
12
- tokens_out INTEGER DEFAULT 0,
13
- cost_estimate REAL DEFAULT 0,
14
- created_at TEXT NOT NULL DEFAULT (datetime('now')),
15
- hit_count INTEGER DEFAULT 0,
16
- last_hit_at TEXT,
17
- ttl_hours INTEGER DEFAULT 24
18
- );
19
-
20
- CREATE INDEX IF NOT EXISTS idx_gcache_ast ON gateway_cache(ast_hash);
21
- CREATE INDEX IF NOT EXISTS idx_gcache_req ON gateway_cache(request_hash);
22
- CREATE INDEX IF NOT EXISTS idx_gcache_created ON gateway_cache(created_at);
23
-
24
- CREATE TABLE IF NOT EXISTS gateway_cost_log (
25
- id INTEGER PRIMARY KEY AUTOINCREMENT,
26
- request_id TEXT NOT NULL,
27
- timestamp TEXT NOT NULL DEFAULT (datetime('now')),
28
- provider TEXT NOT NULL,
29
- model TEXT NOT NULL,
30
- tokens_in INTEGER DEFAULT 0,
31
- tokens_out INTEGER DEFAULT 0,
32
- cost_estimate REAL DEFAULT 0,
33
- duration_ms INTEGER DEFAULT 0,
34
- symbol_ids TEXT,
35
- file_paths TEXT,
36
- intent TEXT,
37
- complexity_score REAL DEFAULT 0,
38
- tier TEXT,
39
- cache_hit INTEGER DEFAULT 0
40
- );
41
-
42
- CREATE INDEX IF NOT EXISTS idx_gcost_ts ON gateway_cost_log(timestamp);
43
- CREATE INDEX IF NOT EXISTS idx_gcost_provider ON gateway_cost_log(provider);
44
- CREATE INDEX IF NOT EXISTS idx_gcost_tier ON gateway_cost_log(tier);
45
- CREATE INDEX IF NOT EXISTS idx_gcost_intent ON gateway_cost_log(intent);
46
-
47
- CREATE TABLE IF NOT EXISTS gateway_privacy_rules (
48
- id INTEGER PRIMARY KEY AUTOINCREMENT,
49
- path_pattern TEXT NOT NULL,
50
- action TEXT NOT NULL CHECK(action IN ('block', 'mask', 'local-only')),
51
- reason TEXT,
52
- created_at TEXT NOT NULL DEFAULT (datetime('now'))
53
- );