milens 0.6.2 → 0.6.3

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 (96) hide show
  1. package/README.md +157 -14
  2. package/dist/analyzer/engine.d.ts +1 -0
  3. package/dist/analyzer/engine.d.ts.map +1 -1
  4. package/dist/analyzer/engine.js +27 -8
  5. package/dist/analyzer/engine.js.map +1 -1
  6. package/dist/analyzer/review.d.ts +23 -0
  7. package/dist/analyzer/review.d.ts.map +1 -0
  8. package/dist/analyzer/review.js +143 -0
  9. package/dist/analyzer/review.js.map +1 -0
  10. package/dist/analyzer/testplan.d.ts +59 -0
  11. package/dist/analyzer/testplan.d.ts.map +1 -0
  12. package/dist/analyzer/testplan.js +218 -0
  13. package/dist/analyzer/testplan.js.map +1 -0
  14. package/dist/cli.js +2 -0
  15. package/dist/cli.js.map +1 -1
  16. package/dist/gateway/analyzer.d.ts +6 -0
  17. package/dist/gateway/analyzer.d.ts.map +1 -0
  18. package/dist/gateway/analyzer.js +218 -0
  19. package/dist/gateway/analyzer.js.map +1 -0
  20. package/dist/gateway/cache.d.ts +35 -0
  21. package/dist/gateway/cache.d.ts.map +1 -0
  22. package/dist/gateway/cache.js +175 -0
  23. package/dist/gateway/cache.js.map +1 -0
  24. package/dist/gateway/config.d.ts +10 -0
  25. package/dist/gateway/config.d.ts.map +1 -0
  26. package/dist/gateway/config.js +167 -0
  27. package/dist/gateway/config.js.map +1 -0
  28. package/dist/gateway/context-memory.d.ts +68 -0
  29. package/dist/gateway/context-memory.d.ts.map +1 -0
  30. package/dist/gateway/context-memory.js +157 -0
  31. package/dist/gateway/context-memory.js.map +1 -0
  32. package/dist/gateway/observability.d.ts +83 -0
  33. package/dist/gateway/observability.d.ts.map +1 -0
  34. package/dist/gateway/observability.js +152 -0
  35. package/dist/gateway/observability.js.map +1 -0
  36. package/dist/gateway/privacy.d.ts +27 -0
  37. package/dist/gateway/privacy.d.ts.map +1 -0
  38. package/dist/gateway/privacy.js +139 -0
  39. package/dist/gateway/privacy.js.map +1 -0
  40. package/dist/gateway/providers.d.ts +66 -0
  41. package/dist/gateway/providers.d.ts.map +1 -0
  42. package/dist/gateway/providers.js +377 -0
  43. package/dist/gateway/providers.js.map +1 -0
  44. package/dist/gateway/router.d.ts +18 -0
  45. package/dist/gateway/router.d.ts.map +1 -0
  46. package/dist/gateway/router.js +102 -0
  47. package/dist/gateway/router.js.map +1 -0
  48. package/dist/gateway/server.d.ts +20 -0
  49. package/dist/gateway/server.d.ts.map +1 -0
  50. package/dist/gateway/server.js +387 -0
  51. package/dist/gateway/server.js.map +1 -0
  52. package/dist/gateway/translator.d.ts +19 -0
  53. package/dist/gateway/translator.d.ts.map +1 -0
  54. package/dist/gateway/translator.js +340 -0
  55. package/dist/gateway/translator.js.map +1 -0
  56. package/dist/gateway/types.d.ts +215 -0
  57. package/dist/gateway/types.d.ts.map +1 -0
  58. package/dist/gateway/types.js +3 -0
  59. package/dist/gateway/types.js.map +1 -0
  60. package/dist/parser/extract.d.ts +1 -0
  61. package/dist/parser/extract.d.ts.map +1 -1
  62. package/dist/parser/extract.js +8 -0
  63. package/dist/parser/extract.js.map +1 -1
  64. package/dist/parser/lang-go.d.ts.map +1 -1
  65. package/dist/parser/lang-go.js +41 -5
  66. package/dist/parser/lang-go.js.map +1 -1
  67. package/dist/parser/lang-java.d.ts.map +1 -1
  68. package/dist/parser/lang-java.js +1 -0
  69. package/dist/parser/lang-java.js.map +1 -1
  70. package/dist/parser/lang-py.d.ts.map +1 -1
  71. package/dist/parser/lang-py.js +22 -0
  72. package/dist/parser/lang-py.js.map +1 -1
  73. package/dist/parser/lang-ruby.d.ts.map +1 -1
  74. package/dist/parser/lang-ruby.js +1 -0
  75. package/dist/parser/lang-ruby.js.map +1 -1
  76. package/dist/server/mcp.d.ts.map +1 -1
  77. package/dist/server/mcp.js +615 -106
  78. package/dist/server/mcp.js.map +1 -1
  79. package/dist/skills.js +32 -0
  80. package/dist/skills.js.map +1 -1
  81. package/dist/store/db.d.ts +44 -0
  82. package/dist/store/db.d.ts.map +1 -1
  83. package/dist/store/db.js +142 -25
  84. package/dist/store/db.js.map +1 -1
  85. package/dist/store/gateway-schema.sql +53 -0
  86. package/dist/store/schema.sql +33 -0
  87. package/dist/store/vectors.d.ts +65 -0
  88. package/dist/store/vectors.d.ts.map +1 -0
  89. package/dist/store/vectors.js +212 -0
  90. package/dist/store/vectors.js.map +1 -0
  91. package/dist/utils.d.ts +3 -0
  92. package/dist/utils.d.ts.map +1 -0
  93. package/dist/utils.js +9 -0
  94. package/dist/utils.js.map +1 -0
  95. package/docs/diagram2.svg +1 -1
  96. package/package.json +2 -1
@@ -0,0 +1,340 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"translator.js","sourceRoot":"","sources":["../../src/gateway/translator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,215 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/gateway/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ // ── Gateway types for milens code-aware AI routing ──
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/gateway/types.ts"],"names":[],"mappings":"AAAA,uDAAuD"}
@@ -5,6 +5,7 @@ export interface LangSpec {
5
5
  extensions: string[];
6
6
  wasmName: string;
7
7
  allTopLevelExported?: boolean;
8
+ uppercaseExported?: boolean;
8
9
  queries: {
9
10
  functions?: string;
10
11
  classes?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../src/parser/extract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAC;AAC1C,OAAO,KAAK,EAAuI,gBAAgB,EAAc,MAAM,aAAa,CAAC;AAIrM,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,OAAO,EAAE;QACP,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;KAC7B,CAAC;IACF,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC;CAC5G;AAiCD,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AAqLD,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,CAAC,IAAI,EACjB,IAAI,EAAE,MAAM,CAAC,QAAQ,EACrB,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,MAAM,GACf,gBAAgB,CA0QlB"}
1
+ {"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../src/parser/extract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAC;AAC1C,OAAO,KAAK,EAAuI,gBAAgB,EAAc,MAAM,aAAa,CAAC;AAIrM,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,OAAO,EAAE;QACP,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;KAC7B,CAAC;IACF,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC;CAC5G;AAiCD,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AAqLD,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,CAAC,IAAI,EACjB,IAAI,EAAE,MAAM,CAAC,QAAQ,EACrB,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,MAAM,GACf,gBAAgB,CAmRlB"}
@@ -272,6 +272,14 @@ export function extractFromTree(tree, lang, spec, filePath) {
272
272
  sym.exported = true;
273
273
  }
274
274
  }
275
+ // Go convention: uppercase first letter = exported
276
+ if (spec.uppercaseExported) {
277
+ for (const sym of symbols) {
278
+ if (sym.name[0] && sym.name[0] === sym.name[0].toUpperCase() && /[A-Z]/.test(sym.name[0])) {
279
+ sym.exported = true;
280
+ }
281
+ }
282
+ }
275
283
  // ── Extract imports ──
276
284
  if (spec.queries.imports) {
277
285
  for (const match of runQuery(spec.queries.imports)) {