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,27 +0,0 @@
1
- import type { ChatMessage, PrivacyRule, PrivacyDecision, MessageAnalysis } from './types.js';
2
- import type BetterSqlite3 from 'better-sqlite3';
3
- export declare class PrivacyFilter {
4
- private rawDb;
5
- private defaultRules;
6
- private rulesCache;
7
- private stmts;
8
- constructor(rawDb: BetterSqlite3.Database, defaultRules?: PrivacyRule[]);
9
- private prepareStatements;
10
- /** Evaluate privacy decision for a request based on referenced files */
11
- evaluate(analysis: MessageAnalysis): PrivacyDecision;
12
- /** Mask sensitive content in messages — returns masked messages + unmask map */
13
- maskMessages(messages: ChatMessage[], rules: PrivacyRule[]): {
14
- masked: ChatMessage[];
15
- unmaskMap: Map<string, string>;
16
- };
17
- /** Restore original content from masked tokens */
18
- unmask(text: string, unmaskMap: Map<string, string>): string;
19
- /** Add a privacy rule (persisted to DB) */
20
- addRule(rule: PrivacyRule): void;
21
- /** Remove a privacy rule */
22
- removeRule(pathPattern: string): boolean;
23
- /** List all rules */
24
- listRules(): PrivacyRule[];
25
- private loadRules;
26
- }
27
- //# sourceMappingURL=privacy.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"privacy.d.ts","sourceRoot":"","sources":["../../src/gateway/privacy.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAiB,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC5G,OAAO,KAAK,aAAa,MAAM,gBAAgB,CAAC;AAEhD,qBAAa,aAAa;IAKtB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,YAAY;IALtB,OAAO,CAAC,UAAU,CAA8B;IAChD,OAAO,CAAC,KAAK,CAAiD;gBAGpD,KAAK,EAAE,aAAa,CAAC,QAAQ,EAC7B,YAAY,GAAE,WAAW,EAAO;IAK1C,OAAO,CAAC,iBAAiB;IAUzB,wEAAwE;IACxE,QAAQ,CAAC,QAAQ,EAAE,eAAe,GAAG,eAAe;IA6BpD,gFAAgF;IAChF,YAAY,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG;QAAE,MAAM,EAAE,WAAW,EAAE,CAAC;QAAC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE;IAsBtH,kDAAkD;IAClD,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM;IAQ5D,2CAA2C;IAC3C,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;IAKhC,4BAA4B;IAC5B,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAMxC,qBAAqB;IACrB,SAAS,IAAI,WAAW,EAAE;IAI1B,OAAO,CAAC,SAAS;CAUlB"}
@@ -1,139 +0,0 @@
1
- // ── Privacy filter — path-based sensitivity rules with masking ──
2
- import { randomBytes } from 'node:crypto';
3
- export class PrivacyFilter {
4
- rawDb;
5
- defaultRules;
6
- rulesCache = null;
7
- stmts;
8
- constructor(rawDb, defaultRules = []) {
9
- this.rawDb = rawDb;
10
- this.defaultRules = defaultRules;
11
- this.stmts = this.prepareStatements();
12
- }
13
- prepareStatements() {
14
- return {
15
- listRules: this.rawDb.prepare('SELECT * FROM gateway_privacy_rules ORDER BY path_pattern'),
16
- addRule: this.rawDb.prepare(`INSERT OR REPLACE INTO gateway_privacy_rules (path_pattern, action, reason) VALUES (?, ?, ?)`),
17
- removeRule: this.rawDb.prepare('DELETE FROM gateway_privacy_rules WHERE path_pattern = ?'),
18
- };
19
- }
20
- /** Evaluate privacy decision for a request based on referenced files */
21
- evaluate(analysis) {
22
- const rules = this.loadRules();
23
- const matched = [];
24
- let highestAction = 'allow';
25
- for (const file of analysis.files) {
26
- for (const rule of rules) {
27
- if (matchGlob(file, rule.pathPattern)) {
28
- matched.push(rule);
29
- highestAction = promoteAction(highestAction, rule.action);
30
- }
31
- }
32
- }
33
- // Also check symbol file paths
34
- for (const sym of analysis.symbols) {
35
- for (const rule of rules) {
36
- if (matchGlob(sym.filePath, rule.pathPattern)) {
37
- if (!matched.some(m => m.pathPattern === rule.pathPattern)) {
38
- matched.push(rule);
39
- highestAction = promoteAction(highestAction, rule.action);
40
- }
41
- }
42
- }
43
- }
44
- return { action: highestAction, matchedRules: matched };
45
- }
46
- /** Mask sensitive content in messages — returns masked messages + unmask map */
47
- maskMessages(messages, rules) {
48
- const unmaskMap = new Map();
49
- const masked = messages.map(msg => {
50
- const content = typeof msg.content === 'string' ? msg.content : '';
51
- if (!content)
52
- return msg;
53
- let result = content;
54
- for (const rule of rules) {
55
- if (rule.action !== 'mask')
56
- continue;
57
- result = maskPatternOccurrences(result, rule.pathPattern, unmaskMap);
58
- }
59
- // Mask inline @sensitive annotations
60
- result = maskSensitiveAnnotations(result, unmaskMap);
61
- return { ...msg, content: result };
62
- });
63
- return { masked, unmaskMap };
64
- }
65
- /** Restore original content from masked tokens */
66
- unmask(text, unmaskMap) {
67
- let result = text;
68
- for (const [token, original] of unmaskMap) {
69
- result = result.replaceAll(token, original);
70
- }
71
- return result;
72
- }
73
- /** Add a privacy rule (persisted to DB) */
74
- addRule(rule) {
75
- this.stmts.addRule.run(rule.pathPattern, rule.action, rule.reason ?? null);
76
- this.rulesCache = null;
77
- }
78
- /** Remove a privacy rule */
79
- removeRule(pathPattern) {
80
- const r = this.stmts.removeRule.run(pathPattern);
81
- this.rulesCache = null;
82
- return r.changes > 0;
83
- }
84
- /** List all rules */
85
- listRules() {
86
- return this.loadRules();
87
- }
88
- loadRules() {
89
- if (this.rulesCache)
90
- return this.rulesCache;
91
- const dbRules = this.stmts.listRules.all().map(r => ({
92
- pathPattern: r.path_pattern,
93
- action: r.action,
94
- reason: r.reason ?? undefined,
95
- }));
96
- this.rulesCache = [...this.defaultRules, ...dbRules];
97
- return this.rulesCache;
98
- }
99
- }
100
- // ── Helpers ──
101
- /** Simple glob matching: supports * and ** */
102
- function matchGlob(filePath, pattern) {
103
- const regex = pattern
104
- .replace(/[.+^${}()|[\]\\]/g, '\\$&') // Escape special regex chars
105
- .replace(/\*\*/g, '{{GLOBSTAR}}') // Temp placeholder
106
- .replace(/\*/g, '[^/]*') // Single glob
107
- .replace(/{{GLOBSTAR}}/g, '.*'); // Double glob
108
- return new RegExp(`^${regex}$`).test(filePath);
109
- }
110
- /** Promote to higher severity: block > local-only > mask > allow */
111
- function promoteAction(current, incoming) {
112
- const priority = { allow: 0, mask: 1, 'local-only': 2, block: 3 };
113
- return (priority[incoming] ?? 0) > (priority[current] ?? 0) ? incoming : current;
114
- }
115
- /** Replace occurrences matching a glob pattern in text with masked tokens */
116
- function maskPatternOccurrences(text, pathPattern, unmaskMap) {
117
- // Extract a searchable pattern from the glob (e.g., "secrets/**" → "secrets/")
118
- const literalPrefix = pathPattern.replace(/\*.*$/, '');
119
- if (!literalPrefix || !text.includes(literalPrefix))
120
- return text;
121
- // Find all file-path-like substrings starting with the literal prefix
122
- const filePathRe = new RegExp(literalPrefix.replace(/[.+^${}()|[\]\\]/g, '\\$&') + '[\\w/._-]*', 'g');
123
- return text.replace(filePathRe, match => {
124
- if (!matchGlob(match, pathPattern))
125
- return match;
126
- const token = `[REDACTED_${randomBytes(4).toString('hex')}]`;
127
- unmaskMap.set(token, match);
128
- return token;
129
- });
130
- }
131
- /** Mask content wrapped in @sensitive{...} annotations */
132
- function maskSensitiveAnnotations(text, unmaskMap) {
133
- return text.replace(/@sensitive\{([^}]+)\}/g, (_match, inner) => {
134
- const token = `[REDACTED_${randomBytes(4).toString('hex')}]`;
135
- unmaskMap.set(token, inner);
136
- return token;
137
- });
138
- }
139
- //# sourceMappingURL=privacy.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"privacy.js","sourceRoot":"","sources":["../../src/gateway/privacy.ts"],"names":[],"mappings":"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"}
@@ -1,66 +0,0 @@
1
- import type { ProviderConfig, ProviderState, ProviderStatus, Tier, ChatRequest, SSEChunk, SSEChoiceDelta, ChatResponse } from './types.js';
2
- export interface ChatResult {
3
- response: ChatResponse;
4
- durationMs: number;
5
- }
6
- export interface StreamChunk {
7
- chunk: SSEChunk;
8
- raw?: string;
9
- }
10
- export declare abstract class BaseAdapter {
11
- protected config: ProviderConfig;
12
- constructor(config: ProviderConfig);
13
- abstract chat(req: ChatRequest): Promise<ChatResult>;
14
- abstract chatStream(req: ChatRequest): AsyncGenerator<StreamChunk>;
15
- protected fetchWithTimeout(url: string, init: RequestInit): Promise<Response>;
16
- protected makeSSEChunk(delta: SSEChoiceDelta, model: string): SSEChunk;
17
- }
18
- export declare class OpenAIAdapter extends BaseAdapter {
19
- chat(req: ChatRequest): Promise<ChatResult>;
20
- chatStream(req: ChatRequest): AsyncGenerator<StreamChunk>;
21
- private headers;
22
- private parseSSEStream;
23
- }
24
- export declare class AnthropicAdapter extends BaseAdapter {
25
- chat(req: ChatRequest): Promise<ChatResult>;
26
- chatStream(req: ChatRequest): AsyncGenerator<StreamChunk>;
27
- private headers;
28
- }
29
- export declare class GeminiAdapter extends BaseAdapter {
30
- chat(req: ChatRequest): Promise<ChatResult>;
31
- chatStream(req: ChatRequest): AsyncGenerator<StreamChunk>;
32
- private buildUrl;
33
- }
34
- export declare class ProviderRegistry {
35
- private providers;
36
- private adapters;
37
- private roundRobinIndex;
38
- addProvider(config: ProviderConfig): void;
39
- removeProvider(id: string): void;
40
- getAdapter(id: string): BaseAdapter | undefined;
41
- getState(id: string): ProviderState | undefined;
42
- /** Get all providers for a tier, ordered by round-robin */
43
- getByTier(tier: Tier): ProviderConfig[];
44
- /** Build a fallback chain: requested tier → lower tiers */
45
- buildFallbackChain(startTier: Tier): ProviderConfig[];
46
- /** Mark a provider as used, update stats */
47
- recordUse(id: string, tokens: number): void;
48
- /** Mark a provider failure */
49
- recordFailure(id: string, error: string): void;
50
- /** List all model IDs across all providers */
51
- listModels(): Array<{
52
- id: string;
53
- provider: string;
54
- tier: Tier;
55
- }>;
56
- /** Find which provider has a specific model */
57
- findByModel(model: string): ProviderConfig | undefined;
58
- /** Get health status for all providers */
59
- getHealthStatus(): Array<{
60
- id: string;
61
- status: ProviderStatus;
62
- tier: Tier;
63
- requests: number;
64
- }>;
65
- }
66
- //# sourceMappingURL=providers.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../src/gateway/providers.ts"],"names":[],"mappings":"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"}
@@ -1,377 +0,0 @@
1
- // ── Provider registry + API adapters ──
2
- // Native fetch + ReadableStream SSE — no SDK dependencies
3
- import { toOpenAIRequest, toAnthropicRequest, fromAnthropicResponse, fromAnthropicStreamEvent, toGeminiRequest, fromGeminiResponse, fromGeminiStreamChunk, } from './translator.js';
4
- import { randomUUID } from 'node:crypto';
5
- export class BaseAdapter {
6
- config;
7
- constructor(config) {
8
- this.config = config;
9
- }
10
- async fetchWithTimeout(url, init) {
11
- const timeout = this.config.timeoutMs ?? 120_000;
12
- const controller = new AbortController();
13
- const timer = setTimeout(() => controller.abort(), timeout);
14
- try {
15
- const res = await fetch(url, { ...init, signal: controller.signal });
16
- return res;
17
- }
18
- finally {
19
- clearTimeout(timer);
20
- }
21
- }
22
- makeSSEChunk(delta, model) {
23
- return {
24
- id: `chatcmpl-${randomUUID().slice(0, 8)}`,
25
- object: 'chat.completion.chunk',
26
- created: Math.floor(Date.now() / 1000),
27
- model,
28
- choices: [delta],
29
- };
30
- }
31
- }
32
- // ── OpenAI-compatible adapter ──
33
- // Works for: OpenAI, Groq, Together, GLM, MiniMax, DeepSeek, Ollama, vLLM, etc.
34
- export class OpenAIAdapter extends BaseAdapter {
35
- async chat(req) {
36
- const start = Date.now();
37
- const body = toOpenAIRequest({ ...req, stream: false });
38
- const url = `${this.config.endpoint}/chat/completions`;
39
- const res = await this.fetchWithTimeout(url, {
40
- method: 'POST',
41
- headers: this.headers(),
42
- body: JSON.stringify(body),
43
- });
44
- if (!res.ok) {
45
- const text = await res.text().catch(() => '');
46
- throw new Error(`OpenAI API error ${res.status}: ${text.slice(0, 300)}`);
47
- }
48
- const data = await res.json();
49
- return { response: data, durationMs: Date.now() - start };
50
- }
51
- async *chatStream(req) {
52
- const body = toOpenAIRequest({ ...req, stream: true });
53
- const url = `${this.config.endpoint}/chat/completions`;
54
- const res = await this.fetchWithTimeout(url, {
55
- method: 'POST',
56
- headers: this.headers(),
57
- body: JSON.stringify(body),
58
- });
59
- if (!res.ok) {
60
- const text = await res.text().catch(() => '');
61
- throw new Error(`OpenAI API error ${res.status}: ${text.slice(0, 300)}`);
62
- }
63
- yield* this.parseSSEStream(res, req.model);
64
- }
65
- headers() {
66
- return {
67
- 'Content-Type': 'application/json',
68
- 'Authorization': `Bearer ${this.config.apiKey}`,
69
- ...this.config.headers,
70
- };
71
- }
72
- async *parseSSEStream(res, model) {
73
- const reader = res.body?.getReader();
74
- if (!reader)
75
- return;
76
- const decoder = new TextDecoder();
77
- let buffer = '';
78
- try {
79
- while (true) {
80
- const { done, value } = await reader.read();
81
- if (done)
82
- break;
83
- buffer += decoder.decode(value, { stream: true });
84
- const lines = buffer.split('\n');
85
- buffer = lines.pop() ?? '';
86
- for (const line of lines) {
87
- const trimmed = line.trim();
88
- if (!trimmed || trimmed === 'data: [DONE]')
89
- continue;
90
- if (!trimmed.startsWith('data: '))
91
- continue;
92
- try {
93
- const chunk = JSON.parse(trimmed.slice(6));
94
- yield { chunk, raw: trimmed };
95
- }
96
- catch { /* skip malformed chunks */ }
97
- }
98
- }
99
- }
100
- finally {
101
- reader.releaseLock();
102
- }
103
- }
104
- }
105
- // ── Anthropic adapter ──
106
- export class AnthropicAdapter extends BaseAdapter {
107
- async chat(req) {
108
- const start = Date.now();
109
- const body = toAnthropicRequest({ ...req, stream: false });
110
- const url = `${this.config.endpoint}/messages`;
111
- const res = await this.fetchWithTimeout(url, {
112
- method: 'POST',
113
- headers: this.headers(),
114
- body: JSON.stringify(body),
115
- });
116
- if (!res.ok) {
117
- const text = await res.text().catch(() => '');
118
- throw new Error(`Anthropic API error ${res.status}: ${text.slice(0, 300)}`);
119
- }
120
- const data = await res.json();
121
- const parsed = fromAnthropicResponse(data);
122
- const response = {
123
- id: data.id ?? `msg_${randomUUID().slice(0, 8)}`,
124
- object: 'chat.completion',
125
- created: Math.floor(Date.now() / 1000),
126
- model: parsed.model || req.model,
127
- choices: [{ index: 0, message: parsed.message, finish_reason: parsed.finishReason }],
128
- usage: parsed.usage,
129
- };
130
- return { response, durationMs: Date.now() - start };
131
- }
132
- async *chatStream(req) {
133
- const body = toAnthropicRequest({ ...req, stream: true });
134
- const url = `${this.config.endpoint}/messages`;
135
- const res = await this.fetchWithTimeout(url, {
136
- method: 'POST',
137
- headers: this.headers(),
138
- body: JSON.stringify(body),
139
- });
140
- if (!res.ok) {
141
- const text = await res.text().catch(() => '');
142
- throw new Error(`Anthropic API error ${res.status}: ${text.slice(0, 300)}`);
143
- }
144
- const reader = res.body?.getReader();
145
- if (!reader)
146
- return;
147
- const decoder = new TextDecoder();
148
- let buffer = '';
149
- try {
150
- while (true) {
151
- const { done, value } = await reader.read();
152
- if (done)
153
- break;
154
- buffer += decoder.decode(value, { stream: true });
155
- const lines = buffer.split('\n');
156
- buffer = lines.pop() ?? '';
157
- for (const line of lines) {
158
- const trimmed = line.trim();
159
- if (!trimmed.startsWith('data: '))
160
- continue;
161
- try {
162
- const event = JSON.parse(trimmed.slice(6));
163
- const delta = fromAnthropicStreamEvent(event);
164
- if (delta) {
165
- yield { chunk: this.makeSSEChunk(delta, req.model) };
166
- }
167
- }
168
- catch { /* skip */ }
169
- }
170
- }
171
- }
172
- finally {
173
- reader.releaseLock();
174
- }
175
- }
176
- headers() {
177
- return {
178
- 'Content-Type': 'application/json',
179
- 'x-api-key': this.config.apiKey,
180
- 'anthropic-version': '2023-06-01',
181
- ...this.config.headers,
182
- };
183
- }
184
- }
185
- // ── Gemini adapter ──
186
- export class GeminiAdapter extends BaseAdapter {
187
- async chat(req) {
188
- const start = Date.now();
189
- const body = toGeminiRequest({ ...req, stream: false });
190
- const url = this.buildUrl(req.model, false);
191
- const res = await this.fetchWithTimeout(url, {
192
- method: 'POST',
193
- headers: { 'Content-Type': 'application/json' },
194
- body: JSON.stringify(body),
195
- });
196
- if (!res.ok) {
197
- const text = await res.text().catch(() => '');
198
- throw new Error(`Gemini API error ${res.status}: ${text.slice(0, 300)}`);
199
- }
200
- const data = await res.json();
201
- const parsed = fromGeminiResponse(data);
202
- const response = {
203
- id: `gemini-${randomUUID().slice(0, 8)}`,
204
- object: 'chat.completion',
205
- created: Math.floor(Date.now() / 1000),
206
- model: parsed.model || req.model,
207
- choices: [{ index: 0, message: parsed.message, finish_reason: parsed.finishReason }],
208
- usage: parsed.usage,
209
- };
210
- return { response, durationMs: Date.now() - start };
211
- }
212
- async *chatStream(req) {
213
- const body = toGeminiRequest({ ...req, stream: true });
214
- const url = this.buildUrl(req.model, true);
215
- const res = await this.fetchWithTimeout(url, {
216
- method: 'POST',
217
- headers: { 'Content-Type': 'application/json' },
218
- body: JSON.stringify(body),
219
- });
220
- if (!res.ok) {
221
- const text = await res.text().catch(() => '');
222
- throw new Error(`Gemini API error ${res.status}: ${text.slice(0, 300)}`);
223
- }
224
- const reader = res.body?.getReader();
225
- if (!reader)
226
- return;
227
- const decoder = new TextDecoder();
228
- let buffer = '';
229
- try {
230
- while (true) {
231
- const { done, value } = await reader.read();
232
- if (done)
233
- break;
234
- buffer += decoder.decode(value, { stream: true });
235
- // Gemini streams as JSON array chunks or newline-separated JSON
236
- const lines = buffer.split('\n');
237
- buffer = lines.pop() ?? '';
238
- for (const line of lines) {
239
- const trimmed = line.trim().replace(/^,/, '').replace(/^\[/, '').replace(/\]$/, '');
240
- if (!trimmed || trimmed === '[' || trimmed === ']')
241
- continue;
242
- try {
243
- const data = JSON.parse(trimmed);
244
- const delta = fromGeminiStreamChunk(data);
245
- if (delta) {
246
- yield { chunk: this.makeSSEChunk(delta, req.model) };
247
- }
248
- }
249
- catch { /* skip */ }
250
- }
251
- }
252
- }
253
- finally {
254
- reader.releaseLock();
255
- }
256
- }
257
- buildUrl(model, stream) {
258
- const base = this.config.endpoint || 'https://generativelanguage.googleapis.com/v1beta';
259
- const action = stream ? 'streamGenerateContent?alt=sse' : 'generateContent';
260
- return `${base}/models/${model}:${action}&key=${this.config.apiKey}`;
261
- }
262
- }
263
- // ── Provider Registry ──
264
- export class ProviderRegistry {
265
- providers = new Map();
266
- adapters = new Map();
267
- roundRobinIndex = new Map();
268
- addProvider(config) {
269
- this.providers.set(config.id, {
270
- config,
271
- status: 'healthy',
272
- consecutiveFailures: 0,
273
- lastUsed: 0,
274
- totalRequests: 0,
275
- totalTokens: 0,
276
- });
277
- this.adapters.set(config.id, createAdapter(config));
278
- }
279
- removeProvider(id) {
280
- this.providers.delete(id);
281
- this.adapters.delete(id);
282
- }
283
- getAdapter(id) {
284
- return this.adapters.get(id);
285
- }
286
- getState(id) {
287
- return this.providers.get(id);
288
- }
289
- /** Get all providers for a tier, ordered by round-robin */
290
- getByTier(tier) {
291
- const matching = Array.from(this.providers.values())
292
- .filter(p => p.config.tier === tier && p.status !== 'down')
293
- .sort((a, b) => a.lastUsed - b.lastUsed)
294
- .map(p => p.config);
295
- return matching;
296
- }
297
- /** Build a fallback chain: requested tier → lower tiers */
298
- buildFallbackChain(startTier) {
299
- const tierOrder = ['premium', 'standard', 'economy', 'local'];
300
- const startIdx = tierOrder.indexOf(startTier);
301
- const chain = [];
302
- for (let i = startIdx; i < tierOrder.length; i++) {
303
- chain.push(...this.getByTier(tierOrder[i]));
304
- }
305
- return chain;
306
- }
307
- /** Mark a provider as used, update stats */
308
- recordUse(id, tokens) {
309
- const state = this.providers.get(id);
310
- if (!state)
311
- return;
312
- state.lastUsed = Date.now();
313
- state.totalRequests++;
314
- state.totalTokens += tokens;
315
- state.consecutiveFailures = 0;
316
- state.status = 'healthy';
317
- }
318
- /** Mark a provider failure */
319
- recordFailure(id, error) {
320
- const state = this.providers.get(id);
321
- if (!state)
322
- return;
323
- state.consecutiveFailures++;
324
- state.lastError = error;
325
- if (state.consecutiveFailures >= (state.config.maxRetries ?? 3)) {
326
- state.status = 'down';
327
- // Auto-recover after 5 minutes
328
- setTimeout(() => {
329
- const s = this.providers.get(id);
330
- if (s && s.status === 'down') {
331
- s.status = 'degraded';
332
- s.consecutiveFailures = 0;
333
- }
334
- }, 5 * 60_000);
335
- }
336
- else {
337
- state.status = 'degraded';
338
- }
339
- }
340
- /** List all model IDs across all providers */
341
- listModels() {
342
- const models = [];
343
- for (const state of this.providers.values()) {
344
- for (const model of state.config.models) {
345
- models.push({ id: model, provider: state.config.id, tier: state.config.tier });
346
- }
347
- }
348
- return models;
349
- }
350
- /** Find which provider has a specific model */
351
- findByModel(model) {
352
- for (const state of this.providers.values()) {
353
- if (state.config.models.includes(model) && state.status !== 'down') {
354
- return state.config;
355
- }
356
- }
357
- return undefined;
358
- }
359
- /** Get health status for all providers */
360
- getHealthStatus() {
361
- return Array.from(this.providers.values()).map(p => ({
362
- id: p.config.id,
363
- status: p.status,
364
- tier: p.config.tier,
365
- requests: p.totalRequests,
366
- }));
367
- }
368
- }
369
- function createAdapter(config) {
370
- switch (config.format) {
371
- case 'anthropic': return new AnthropicAdapter(config);
372
- case 'gemini': return new GeminiAdapter(config);
373
- case 'openai':
374
- default: return new OpenAIAdapter(config);
375
- }
376
- }
377
- //# sourceMappingURL=providers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/gateway/providers.ts"],"names":[],"mappings":"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"}