@soleri/core 0.0.1 → 1.0.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.
Files changed (63) hide show
  1. package/dist/brain/brain.d.ts +76 -0
  2. package/dist/brain/brain.d.ts.map +1 -0
  3. package/dist/brain/brain.js +431 -0
  4. package/dist/brain/brain.js.map +1 -0
  5. package/dist/facades/facade-factory.d.ts +5 -0
  6. package/dist/facades/facade-factory.d.ts.map +1 -0
  7. package/dist/facades/facade-factory.js +49 -0
  8. package/dist/facades/facade-factory.js.map +1 -0
  9. package/dist/facades/types.d.ts +42 -0
  10. package/dist/facades/types.d.ts.map +1 -0
  11. package/dist/facades/types.js +6 -0
  12. package/dist/facades/types.js.map +1 -0
  13. package/dist/index.d.ts +17 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +17 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/intelligence/loader.d.ts +3 -0
  18. package/dist/intelligence/loader.d.ts.map +1 -0
  19. package/dist/intelligence/loader.js +41 -0
  20. package/dist/intelligence/loader.js.map +1 -0
  21. package/dist/intelligence/types.d.ts +20 -0
  22. package/dist/intelligence/types.d.ts.map +1 -0
  23. package/dist/intelligence/types.js +2 -0
  24. package/dist/intelligence/types.js.map +1 -0
  25. package/dist/llm/key-pool.d.ts +38 -0
  26. package/dist/llm/key-pool.d.ts.map +1 -0
  27. package/dist/llm/key-pool.js +154 -0
  28. package/dist/llm/key-pool.js.map +1 -0
  29. package/dist/llm/types.d.ts +80 -0
  30. package/dist/llm/types.d.ts.map +1 -0
  31. package/dist/llm/types.js +37 -0
  32. package/dist/llm/types.js.map +1 -0
  33. package/dist/llm/utils.d.ts +26 -0
  34. package/dist/llm/utils.d.ts.map +1 -0
  35. package/dist/llm/utils.js +197 -0
  36. package/dist/llm/utils.js.map +1 -0
  37. package/dist/planning/planner.d.ts +48 -0
  38. package/dist/planning/planner.d.ts.map +1 -0
  39. package/dist/planning/planner.js +109 -0
  40. package/dist/planning/planner.js.map +1 -0
  41. package/dist/vault/vault.d.ts +80 -0
  42. package/dist/vault/vault.d.ts.map +1 -0
  43. package/dist/vault/vault.js +353 -0
  44. package/dist/vault/vault.js.map +1 -0
  45. package/package.json +56 -4
  46. package/src/__tests__/brain.test.ts +545 -0
  47. package/src/__tests__/llm.test.ts +556 -0
  48. package/src/__tests__/loader.test.ts +176 -0
  49. package/src/__tests__/planner.test.ts +261 -0
  50. package/src/__tests__/vault.test.ts +494 -0
  51. package/src/brain/brain.ts +581 -0
  52. package/src/facades/facade-factory.ts +64 -0
  53. package/src/facades/types.ts +42 -0
  54. package/src/index.ts +64 -0
  55. package/src/intelligence/loader.ts +42 -0
  56. package/src/intelligence/types.ts +20 -0
  57. package/src/llm/key-pool.ts +190 -0
  58. package/src/llm/types.ts +116 -0
  59. package/src/llm/utils.ts +248 -0
  60. package/src/planning/planner.ts +151 -0
  61. package/src/vault/vault.ts +455 -0
  62. package/tsconfig.json +22 -0
  63. package/vitest.config.ts +15 -0
@@ -0,0 +1,17 @@
1
+ export type { IntelligenceEntry, IntelligenceBundle } from './intelligence/types.js';
2
+ export { loadIntelligenceData } from './intelligence/loader.js';
3
+ export { Vault } from './vault/vault.js';
4
+ export type { SearchResult, VaultStats, ProjectInfo, Memory, MemoryStats } from './vault/vault.js';
5
+ export { Brain } from './brain/brain.js';
6
+ export type { ScoringWeights, ScoreBreakdown, RankedResult, SearchOptions, CaptureResult, BrainStats, QueryContext, } from './brain/brain.js';
7
+ export { Planner } from './planning/planner.js';
8
+ export type { PlanStatus, TaskStatus, PlanTask, Plan, PlanStore } from './planning/planner.js';
9
+ export { SecretString, LLMError } from './llm/types.js';
10
+ export type { LLMCallOptions, LLMCallResult, CircuitState, CircuitBreakerConfig, CircuitBreakerSnapshot, KeyPoolConfig, KeyStatus, RouteEntry, RoutingConfig, RateLimitInfo, RetryConfig, } from './llm/types.js';
11
+ export { CircuitBreaker, CircuitOpenError, computeDelay, retry, parseRateLimitHeaders, } from './llm/utils.js';
12
+ export { KeyPool, loadKeyPoolConfig } from './llm/key-pool.js';
13
+ export type { KeyPoolFiles } from './llm/key-pool.js';
14
+ export { registerFacade, registerAllFacades } from './facades/facade-factory.js';
15
+ export { facadeInputSchema } from './facades/types.js';
16
+ export type { OpHandler, AuthLevel, OpDefinition, FacadeConfig, FacadeResponse, FacadeInput, } from './facades/types.js';
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AACrF,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAGhE,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGnG,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,YAAY,EACV,cAAc,EACd,cAAc,EACd,YAAY,EACZ,aAAa,EACb,aAAa,EACb,UAAU,EACV,YAAY,GACb,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAG/F,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACxD,YAAY,EACV,cAAc,EACd,aAAa,EACb,YAAY,EACZ,oBAAoB,EACpB,sBAAsB,EACtB,aAAa,EACb,SAAS,EACT,UAAU,EACV,aAAa,EACb,aAAa,EACb,WAAW,GACZ,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,KAAK,EACL,qBAAqB,GACtB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC/D,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGtD,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,YAAY,EACV,SAAS,EACT,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,WAAW,GACZ,MAAM,oBAAoB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,17 @@
1
+ export { loadIntelligenceData } from './intelligence/loader.js';
2
+ // ─── Vault ───────────────────────────────────────────────────────────
3
+ export { Vault } from './vault/vault.js';
4
+ // ─── Brain ───────────────────────────────────────────────────────────
5
+ export { Brain } from './brain/brain.js';
6
+ // ─── Planning ────────────────────────────────────────────────────────
7
+ export { Planner } from './planning/planner.js';
8
+ // ─── LLM Types ───────────────────────────────────────────────────────
9
+ export { SecretString, LLMError } from './llm/types.js';
10
+ // ─── LLM Utils ───────────────────────────────────────────────────────
11
+ export { CircuitBreaker, CircuitOpenError, computeDelay, retry, parseRateLimitHeaders, } from './llm/utils.js';
12
+ // ─── LLM Key Pool ───────────────────────────────────────────────────
13
+ export { KeyPool, loadKeyPoolConfig } from './llm/key-pool.js';
14
+ // ─── Facades ─────────────────────────────────────────────────────────
15
+ export { registerFacade, registerAllFacades } from './facades/facade-factory.js';
16
+ export { facadeInputSchema } from './facades/types.js';
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAEhE,wEAAwE;AACxE,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAGzC,wEAAwE;AACxE,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAWzC,wEAAwE;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAGhD,wEAAwE;AACxE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAexD,wEAAwE;AACxE,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,KAAK,EACL,qBAAqB,GACtB,MAAM,gBAAgB,CAAC;AAExB,uEAAuE;AACvE,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAG/D,wEAAwE;AACxE,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { IntelligenceEntry } from './types.js';
2
+ export declare function loadIntelligenceData(dataDir: string): IntelligenceEntry[];
3
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/intelligence/loader.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAsB,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAExE,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAuBzE"}
@@ -0,0 +1,41 @@
1
+ import { readFileSync, readdirSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ export function loadIntelligenceData(dataDir) {
4
+ const entries = [];
5
+ let files;
6
+ try {
7
+ files = readdirSync(dataDir).filter((f) => f.endsWith('.json'));
8
+ }
9
+ catch {
10
+ console.warn('Intelligence data directory not found: ' + dataDir);
11
+ return entries;
12
+ }
13
+ for (const file of files) {
14
+ try {
15
+ const raw = readFileSync(join(dataDir, file), 'utf-8');
16
+ const bundle = JSON.parse(raw);
17
+ if (!bundle.entries || !Array.isArray(bundle.entries))
18
+ continue;
19
+ for (const entry of bundle.entries) {
20
+ if (validateEntry(entry))
21
+ entries.push(entry);
22
+ }
23
+ }
24
+ catch (err) {
25
+ console.warn('Failed to load ' + file + ': ' + (err instanceof Error ? err.message : err));
26
+ }
27
+ }
28
+ return entries;
29
+ }
30
+ function validateEntry(entry) {
31
+ return (typeof entry.id === 'string' &&
32
+ entry.id.length > 0 &&
33
+ ['pattern', 'anti-pattern', 'rule'].includes(entry.type) &&
34
+ typeof entry.title === 'string' &&
35
+ entry.title.length > 0 &&
36
+ typeof entry.description === 'string' &&
37
+ entry.description.length > 0 &&
38
+ ['critical', 'warning', 'suggestion'].includes(entry.severity) &&
39
+ Array.isArray(entry.tags));
40
+ }
41
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/intelligence/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,MAAM,OAAO,GAAwB,EAAE,CAAC;IACxC,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,IAAI,CAAC,yCAAyC,GAAG,OAAO,CAAC,CAAC;QAClE,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;YACvD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAuB,CAAC;YACrD,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;gBAAE,SAAS;YAChE,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnC,IAAI,aAAa,CAAC,KAAK,CAAC;oBAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,iBAAiB,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7F,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,aAAa,CAAC,KAAwB;IAC7C,OAAO,CACL,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ;QAC5B,KAAK,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC;QACnB,CAAC,SAAS,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;QACxD,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;QAC/B,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;QACtB,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ;QACrC,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;QAC5B,CAAC,UAAU,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC;QAC9D,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAC1B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,20 @@
1
+ export interface IntelligenceEntry {
2
+ id: string;
3
+ type: 'pattern' | 'anti-pattern' | 'rule';
4
+ domain: string;
5
+ title: string;
6
+ severity: 'critical' | 'warning' | 'suggestion';
7
+ description: string;
8
+ context?: string;
9
+ example?: string;
10
+ counterExample?: string;
11
+ why?: string;
12
+ tags: string[];
13
+ appliesTo?: string[];
14
+ }
15
+ export interface IntelligenceBundle {
16
+ domain: string;
17
+ version: string;
18
+ entries: IntelligenceEntry[];
19
+ }
20
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/intelligence/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,SAAS,GAAG,cAAc,GAAG,MAAM,CAAC;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,UAAU,GAAG,SAAS,GAAG,YAAY,CAAC;IAChD,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,iBAAiB,EAAE,CAAC;CAC9B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/intelligence/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,38 @@
1
+ import { SecretString } from './types.js';
2
+ import type { KeyPoolConfig, KeyStatus } from './types.js';
3
+ export declare class KeyPool {
4
+ private keys;
5
+ private activeIndex;
6
+ private keyBreakers;
7
+ private remainingQuota;
8
+ private readonly preemptiveThreshold;
9
+ constructor(config: KeyPoolConfig);
10
+ get hasKeys(): boolean;
11
+ getActiveKey(): SecretString;
12
+ get activeKeyIndex(): number;
13
+ get poolSize(): number;
14
+ get exhausted(): boolean;
15
+ rotateOnError(): SecretString | null;
16
+ rotatePreemptive(): boolean;
17
+ updateQuota(keyIndex: number, remaining: number): void;
18
+ getStatus(): {
19
+ poolSize: number;
20
+ activeKeyIndex: number;
21
+ exhausted: boolean;
22
+ perKeyStatus: KeyStatus[];
23
+ };
24
+ private findNextHealthyKey;
25
+ }
26
+ export interface KeyPoolFiles {
27
+ openai: KeyPoolConfig;
28
+ anthropic: KeyPoolConfig;
29
+ }
30
+ /**
31
+ * Load key pool configuration for an agent.
32
+ * Key loading priority:
33
+ * 1. ~/.{agentId}/keys.json
34
+ * 2. Fallback: OPENAI_API_KEY / ANTHROPIC_API_KEY env vars
35
+ * 3. Empty pool
36
+ */
37
+ export declare function loadKeyPoolConfig(agentId: string): KeyPoolFiles;
38
+ //# sourceMappingURL=key-pool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key-pool.d.ts","sourceRoot":"","sources":["../../src/llm/key-pool.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAa3D,qBAAa,OAAO;IAClB,OAAO,CAAC,IAAI,CAAiB;IAC7B,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,WAAW,CAA0C;IAC7D,OAAO,CAAC,cAAc,CAAkC;IACxD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;gBAEjC,MAAM,EAAE,aAAa;IAoBjC,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,YAAY,IAAI,YAAY;IAO5B,IAAI,cAAc,IAAI,MAAM,CAE3B;IAED,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,IAAI,SAAS,IAAI,OAAO,CAOvB;IAED,aAAa,IAAI,YAAY,GAAG,IAAI;IAQpC,gBAAgB,IAAI,OAAO;IAe3B,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAItD,SAAS,IAAI;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,cAAc,EAAE,MAAM,CAAC;QACvB,SAAS,EAAE,OAAO,CAAC;QACnB,YAAY,EAAE,SAAS,EAAE,CAAC;KAC3B;IAiBD,OAAO,CAAC,kBAAkB;CAa3B;AAMD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,EAAE,aAAa,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,CAqC/D"}
@@ -0,0 +1,154 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ import { SecretString } from './types.js';
5
+ import { CircuitBreaker } from './utils.js';
6
+ // =============================================================================
7
+ // CONSTANTS
8
+ // =============================================================================
9
+ const DEFAULT_PREEMPTIVE_THRESHOLD = 50;
10
+ // =============================================================================
11
+ // KEY POOL
12
+ // =============================================================================
13
+ export class KeyPool {
14
+ keys;
15
+ activeIndex = 0;
16
+ keyBreakers = new Map();
17
+ remainingQuota = new Map();
18
+ preemptiveThreshold;
19
+ constructor(config) {
20
+ this.keys = config.keys.filter((k) => k.length > 0).map((k) => new SecretString(k));
21
+ this.preemptiveThreshold = config.preemptiveThreshold ?? DEFAULT_PREEMPTIVE_THRESHOLD;
22
+ for (let i = 0; i < this.keys.length; i++) {
23
+ this.keyBreakers.set(i, new CircuitBreaker({
24
+ name: `key-pool-${i}`,
25
+ failureThreshold: 3,
26
+ resetTimeoutMs: 30_000,
27
+ }));
28
+ }
29
+ if (this.keys.length > 1) {
30
+ console.error(`[LLM] KeyPool initialized with ${this.keys.length} keys`);
31
+ }
32
+ }
33
+ get hasKeys() {
34
+ return this.keys.length > 0;
35
+ }
36
+ getActiveKey() {
37
+ if (this.keys.length === 0) {
38
+ throw new Error('KeyPool has no keys — cannot get active key');
39
+ }
40
+ return this.keys[this.activeIndex];
41
+ }
42
+ get activeKeyIndex() {
43
+ return this.activeIndex;
44
+ }
45
+ get poolSize() {
46
+ return this.keys.length;
47
+ }
48
+ get exhausted() {
49
+ if (this.keys.length === 0)
50
+ return true;
51
+ for (let i = 0; i < this.keys.length; i++) {
52
+ const breaker = this.keyBreakers.get(i);
53
+ if (!breaker.isOpen())
54
+ return false;
55
+ }
56
+ return true;
57
+ }
58
+ rotateOnError() {
59
+ const breaker = this.keyBreakers.get(this.activeIndex);
60
+ if (breaker) {
61
+ breaker.recordFailure();
62
+ }
63
+ return this.findNextHealthyKey();
64
+ }
65
+ rotatePreemptive() {
66
+ const previousIndex = this.activeIndex;
67
+ const remaining = this.remainingQuota.get(previousIndex);
68
+ if (remaining !== undefined && remaining < this.preemptiveThreshold) {
69
+ const next = this.findNextHealthyKey();
70
+ if (next) {
71
+ console.error(`[LLM] KeyPool preemptive rotation: key ${previousIndex} remaining=${remaining} < threshold=${this.preemptiveThreshold}`);
72
+ return true;
73
+ }
74
+ }
75
+ return false;
76
+ }
77
+ updateQuota(keyIndex, remaining) {
78
+ this.remainingQuota.set(keyIndex, remaining);
79
+ }
80
+ getStatus() {
81
+ const perKeyStatus = [];
82
+ for (let i = 0; i < this.keys.length; i++) {
83
+ perKeyStatus.push({
84
+ index: i,
85
+ circuitState: this.keyBreakers.get(i).getState(),
86
+ remainingQuota: this.remainingQuota.get(i) ?? null,
87
+ });
88
+ }
89
+ return {
90
+ poolSize: this.poolSize,
91
+ activeKeyIndex: this.activeIndex,
92
+ exhausted: this.exhausted,
93
+ perKeyStatus,
94
+ };
95
+ }
96
+ findNextHealthyKey() {
97
+ const startIndex = this.activeIndex;
98
+ for (let offset = 1; offset <= this.keys.length; offset++) {
99
+ const candidateIndex = (startIndex + offset) % this.keys.length;
100
+ const breaker = this.keyBreakers.get(candidateIndex);
101
+ if (!breaker.isOpen()) {
102
+ this.activeIndex = candidateIndex;
103
+ return this.keys[candidateIndex];
104
+ }
105
+ }
106
+ console.error('[LLM] KeyPool: all keys exhausted — no healthy key available');
107
+ return null;
108
+ }
109
+ }
110
+ /**
111
+ * Load key pool configuration for an agent.
112
+ * Key loading priority:
113
+ * 1. ~/.{agentId}/keys.json
114
+ * 2. Fallback: OPENAI_API_KEY / ANTHROPIC_API_KEY env vars
115
+ * 3. Empty pool
116
+ */
117
+ export function loadKeyPoolConfig(agentId) {
118
+ if (!agentId || /[/\\]/.test(agentId) || agentId.includes('..')) {
119
+ throw new Error(`Invalid agentId: ${agentId}`);
120
+ }
121
+ const keysFilePath = path.join(homedir(), `.${agentId}`, 'keys.json');
122
+ let openaiKeys = [];
123
+ let anthropicKeys = [];
124
+ try {
125
+ if (fs.existsSync(keysFilePath)) {
126
+ const data = JSON.parse(fs.readFileSync(keysFilePath, 'utf-8'));
127
+ if (data?.openai && Array.isArray(data.openai)) {
128
+ openaiKeys = data.openai;
129
+ }
130
+ if (data?.anthropic && Array.isArray(data.anthropic)) {
131
+ anthropicKeys = data.anthropic;
132
+ }
133
+ }
134
+ }
135
+ catch {
136
+ console.error('[LLM] Could not read keys.json, falling back to env vars');
137
+ }
138
+ // Fallback: environment variables
139
+ if (openaiKeys.length === 0) {
140
+ const envKey = process.env.OPENAI_API_KEY || '';
141
+ if (envKey)
142
+ openaiKeys = [envKey];
143
+ }
144
+ if (anthropicKeys.length === 0) {
145
+ const envKey = process.env.ANTHROPIC_API_KEY || '';
146
+ if (envKey)
147
+ anthropicKeys = [envKey];
148
+ }
149
+ return {
150
+ openai: { keys: openaiKeys },
151
+ anthropic: { keys: anthropicKeys },
152
+ };
153
+ }
154
+ //# sourceMappingURL=key-pool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key-pool.js","sourceRoot":"","sources":["../../src/llm/key-pool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ export declare class SecretString {
2
+ #private;
3
+ constructor(value: string);
4
+ expose(): string;
5
+ get isSet(): boolean;
6
+ toString(): string;
7
+ toJSON(): string;
8
+ [Symbol.toPrimitive](): string;
9
+ }
10
+ export declare class LLMError extends Error {
11
+ retryable: boolean;
12
+ statusCode?: number;
13
+ constructor(message: string, options?: {
14
+ retryable?: boolean;
15
+ statusCode?: number;
16
+ });
17
+ }
18
+ export interface LLMCallOptions {
19
+ provider: 'openai' | 'anthropic';
20
+ model: string;
21
+ systemPrompt: string;
22
+ userPrompt: string;
23
+ temperature?: number;
24
+ maxTokens?: number;
25
+ caller: string;
26
+ task?: string;
27
+ }
28
+ export interface LLMCallResult {
29
+ text: string;
30
+ model: string;
31
+ provider: 'openai' | 'anthropic';
32
+ inputTokens?: number;
33
+ outputTokens?: number;
34
+ durationMs: number;
35
+ }
36
+ export type CircuitState = 'closed' | 'open' | 'half-open';
37
+ export interface CircuitBreakerConfig {
38
+ failureThreshold: number;
39
+ resetTimeoutMs: number;
40
+ name: string;
41
+ }
42
+ export interface CircuitBreakerSnapshot {
43
+ state: CircuitState;
44
+ failureCount: number;
45
+ lastFailureAt: number | null;
46
+ }
47
+ export interface KeyPoolConfig {
48
+ keys: string[];
49
+ preemptiveThreshold?: number;
50
+ }
51
+ export interface KeyStatus {
52
+ index: number;
53
+ circuitState: CircuitBreakerSnapshot;
54
+ remainingQuota: number | null;
55
+ }
56
+ export interface RouteEntry {
57
+ caller: string;
58
+ task?: string;
59
+ model: string;
60
+ provider: 'openai' | 'anthropic';
61
+ }
62
+ export interface RoutingConfig {
63
+ routes: RouteEntry[];
64
+ defaultOpenAIModel: string;
65
+ defaultAnthropicModel: string;
66
+ }
67
+ export interface RateLimitInfo {
68
+ remaining: number | null;
69
+ resetMs: number | null;
70
+ retryAfterMs: number | null;
71
+ }
72
+ export interface RetryConfig {
73
+ maxAttempts: number;
74
+ baseDelayMs: number;
75
+ maxDelayMs: number;
76
+ jitter: number;
77
+ shouldRetry?: (error: unknown) => boolean;
78
+ onRetry?: (error: unknown, attempt: number, delayMs: number) => void;
79
+ }
80
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/llm/types.ts"],"names":[],"mappings":"AAEA,qBAAa,YAAY;;gBAGX,KAAK,EAAE,MAAM;IAIzB,MAAM,IAAI,MAAM;IAIhB,IAAI,KAAK,IAAI,OAAO,CAEnB;IAED,QAAQ,IAAI,MAAM;IAGlB,MAAM,IAAI,MAAM;IAGhB,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,MAAM;CAM/B;AAED,qBAAa,QAAS,SAAQ,KAAK;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;gBAER,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE;CAOpF;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,QAAQ,GAAG,WAAW,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,QAAQ,GAAG,WAAW,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;AAE3D,MAAM,WAAW,oBAAoB;IACnC,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,YAAY,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,sBAAsB,CAAC;IACrC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,QAAQ,GAAG,WAAW,CAAC;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;IAC1C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACtE"}
@@ -0,0 +1,37 @@
1
+ const REDACTED = '[REDACTED]';
2
+ export class SecretString {
3
+ #value;
4
+ constructor(value) {
5
+ this.#value = value;
6
+ }
7
+ expose() {
8
+ return this.#value;
9
+ }
10
+ get isSet() {
11
+ return this.#value.length > 0;
12
+ }
13
+ toString() {
14
+ return REDACTED;
15
+ }
16
+ toJSON() {
17
+ return REDACTED;
18
+ }
19
+ [Symbol.toPrimitive]() {
20
+ return REDACTED;
21
+ }
22
+ [Symbol.for('nodejs.util.inspect.custom')]() {
23
+ return REDACTED;
24
+ }
25
+ }
26
+ export class LLMError extends Error {
27
+ retryable;
28
+ statusCode;
29
+ constructor(message, options) {
30
+ super(message);
31
+ this.name = 'LLMError';
32
+ this.retryable = options?.retryable ?? false;
33
+ this.statusCode = options?.statusCode;
34
+ Object.setPrototypeOf(this, LLMError.prototype);
35
+ }
36
+ }
37
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/llm/types.ts"],"names":[],"mappings":"AAAA,MAAM,QAAQ,GAAG,YAAY,CAAC;AAE9B,MAAM,OAAO,YAAY;IACvB,MAAM,CAAS;IAEf,YAAY,KAAa;QACvB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACtB,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IAChC,CAAC;IAED,QAAQ;QACN,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM;QACJ,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,CAAC,MAAM,CAAC,WAAW,CAAC;QAClB,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,CAAC,MAAM,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QACxC,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF;AAED,MAAM,OAAO,QAAS,SAAQ,KAAK;IACjC,SAAS,CAAU;IACnB,UAAU,CAAU;IAEpB,YAAY,OAAe,EAAE,OAAsD;QACjF,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,KAAK,CAAC;QAC7C,IAAI,CAAC,UAAU,GAAG,OAAO,EAAE,UAAU,CAAC;QACtC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;IAClD,CAAC;CACF"}
@@ -0,0 +1,26 @@
1
+ import type { CircuitBreakerConfig, CircuitBreakerSnapshot, RateLimitInfo, RetryConfig } from './types.js';
2
+ export declare class CircuitOpenError extends Error {
3
+ retryable: boolean;
4
+ constructor(name: string);
5
+ }
6
+ export declare class CircuitBreaker {
7
+ private state;
8
+ private failureCount;
9
+ private lastFailureAt;
10
+ private readonly config;
11
+ constructor(config?: Partial<CircuitBreakerConfig>);
12
+ call<T>(fn: () => Promise<T>): Promise<T>;
13
+ getState(): CircuitBreakerSnapshot;
14
+ isOpen(): boolean;
15
+ reset(): void;
16
+ /** Synchronously record a failure (used by KeyPool to trip breaker without async) */
17
+ recordFailure(): void;
18
+ private onSuccess;
19
+ private onFailure;
20
+ private shouldProbe;
21
+ private transitionTo;
22
+ }
23
+ export declare function computeDelay(error: unknown, attempt: number, config: RetryConfig): number;
24
+ export declare function retry<T>(fn: () => Promise<T>, config?: Partial<RetryConfig>): Promise<T>;
25
+ export declare function parseRateLimitHeaders(headers: Headers): RateLimitInfo;
26
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/llm/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,sBAAsB,EAGtB,aAAa,EACb,WAAW,EACZ,MAAM,YAAY,CAAC;AA2BpB,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,SAAS,UAAS;gBACN,IAAI,EAAE,MAAM;CAKzB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;gBAElC,MAAM,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC;IAI5C,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAmB/C,QAAQ,IAAI,sBAAsB;IAWlC,MAAM,IAAI,OAAO;IAIjB,KAAK,IAAI,IAAI;IAMb,qFAAqF;IACrF,aAAa,IAAI,IAAI;IAerB,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,SAAS;IAqBjB,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,YAAY;CAKrB;AAaD,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,MAAM,CAazF;AAED,wBAAsB,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CA2B9F;AAMD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,aAAa,CAWrE"}