@soleri/core 0.0.1 → 2.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 (74) hide show
  1. package/dist/brain/brain.d.ts +85 -0
  2. package/dist/brain/brain.d.ts.map +1 -0
  3. package/dist/brain/brain.js +506 -0
  4. package/dist/brain/brain.js.map +1 -0
  5. package/dist/cognee/client.d.ts +35 -0
  6. package/dist/cognee/client.d.ts.map +1 -0
  7. package/dist/cognee/client.js +289 -0
  8. package/dist/cognee/client.js.map +1 -0
  9. package/dist/cognee/types.d.ts +46 -0
  10. package/dist/cognee/types.d.ts.map +1 -0
  11. package/dist/cognee/types.js +3 -0
  12. package/dist/cognee/types.js.map +1 -0
  13. package/dist/facades/facade-factory.d.ts +5 -0
  14. package/dist/facades/facade-factory.d.ts.map +1 -0
  15. package/dist/facades/facade-factory.js +49 -0
  16. package/dist/facades/facade-factory.js.map +1 -0
  17. package/dist/facades/types.d.ts +42 -0
  18. package/dist/facades/types.d.ts.map +1 -0
  19. package/dist/facades/types.js +6 -0
  20. package/dist/facades/types.js.map +1 -0
  21. package/dist/index.d.ts +19 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +19 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/intelligence/loader.d.ts +3 -0
  26. package/dist/intelligence/loader.d.ts.map +1 -0
  27. package/dist/intelligence/loader.js +41 -0
  28. package/dist/intelligence/loader.js.map +1 -0
  29. package/dist/intelligence/types.d.ts +20 -0
  30. package/dist/intelligence/types.d.ts.map +1 -0
  31. package/dist/intelligence/types.js +2 -0
  32. package/dist/intelligence/types.js.map +1 -0
  33. package/dist/llm/key-pool.d.ts +38 -0
  34. package/dist/llm/key-pool.d.ts.map +1 -0
  35. package/dist/llm/key-pool.js +154 -0
  36. package/dist/llm/key-pool.js.map +1 -0
  37. package/dist/llm/types.d.ts +80 -0
  38. package/dist/llm/types.d.ts.map +1 -0
  39. package/dist/llm/types.js +37 -0
  40. package/dist/llm/types.js.map +1 -0
  41. package/dist/llm/utils.d.ts +26 -0
  42. package/dist/llm/utils.d.ts.map +1 -0
  43. package/dist/llm/utils.js +197 -0
  44. package/dist/llm/utils.js.map +1 -0
  45. package/dist/planning/planner.d.ts +48 -0
  46. package/dist/planning/planner.d.ts.map +1 -0
  47. package/dist/planning/planner.js +109 -0
  48. package/dist/planning/planner.js.map +1 -0
  49. package/dist/vault/vault.d.ts +80 -0
  50. package/dist/vault/vault.d.ts.map +1 -0
  51. package/dist/vault/vault.js +353 -0
  52. package/dist/vault/vault.js.map +1 -0
  53. package/package.json +56 -4
  54. package/src/__tests__/brain.test.ts +740 -0
  55. package/src/__tests__/cognee-client.test.ts +524 -0
  56. package/src/__tests__/llm.test.ts +556 -0
  57. package/src/__tests__/loader.test.ts +176 -0
  58. package/src/__tests__/planner.test.ts +261 -0
  59. package/src/__tests__/vault.test.ts +494 -0
  60. package/src/brain/brain.ts +678 -0
  61. package/src/cognee/client.ts +350 -0
  62. package/src/cognee/types.ts +62 -0
  63. package/src/facades/facade-factory.ts +64 -0
  64. package/src/facades/types.ts +42 -0
  65. package/src/index.ts +75 -0
  66. package/src/intelligence/loader.ts +42 -0
  67. package/src/intelligence/types.ts +20 -0
  68. package/src/llm/key-pool.ts +190 -0
  69. package/src/llm/types.ts +116 -0
  70. package/src/llm/utils.ts +248 -0
  71. package/src/planning/planner.ts +151 -0
  72. package/src/vault/vault.ts +455 -0
  73. package/tsconfig.json +22 -0
  74. package/vitest.config.ts +15 -0
@@ -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"}
@@ -0,0 +1,197 @@
1
+ // =============================================================================
2
+ // HELPERS
3
+ // =============================================================================
4
+ function isRetryable(error) {
5
+ if (error && typeof error === 'object' && 'retryable' in error) {
6
+ return error.retryable === true;
7
+ }
8
+ return false;
9
+ }
10
+ function sleep(ms) {
11
+ return new Promise((resolve) => setTimeout(resolve, ms));
12
+ }
13
+ // =============================================================================
14
+ // CIRCUIT BREAKER
15
+ // =============================================================================
16
+ const DEFAULT_CB_CONFIG = {
17
+ failureThreshold: 5,
18
+ resetTimeoutMs: 60_000,
19
+ name: 'default',
20
+ };
21
+ export class CircuitOpenError extends Error {
22
+ retryable = false;
23
+ constructor(name) {
24
+ super(`${name} circuit breaker is open — calls are being rejected`);
25
+ this.name = 'CircuitOpenError';
26
+ Object.setPrototypeOf(this, CircuitOpenError.prototype);
27
+ }
28
+ }
29
+ export class CircuitBreaker {
30
+ state = 'closed';
31
+ failureCount = 0;
32
+ lastFailureAt = null;
33
+ config;
34
+ constructor(config) {
35
+ this.config = { ...DEFAULT_CB_CONFIG, ...config };
36
+ }
37
+ async call(fn) {
38
+ if (this.state === 'open') {
39
+ if (this.shouldProbe()) {
40
+ this.transitionTo('half-open');
41
+ }
42
+ else {
43
+ throw new CircuitOpenError(this.config.name);
44
+ }
45
+ }
46
+ try {
47
+ const result = await fn();
48
+ this.onSuccess();
49
+ return result;
50
+ }
51
+ catch (error) {
52
+ this.onFailure(error);
53
+ throw error;
54
+ }
55
+ }
56
+ getState() {
57
+ if (this.state === 'open' && this.shouldProbe()) {
58
+ this.transitionTo('half-open');
59
+ }
60
+ return {
61
+ state: this.state,
62
+ failureCount: this.failureCount,
63
+ lastFailureAt: this.lastFailureAt,
64
+ };
65
+ }
66
+ isOpen() {
67
+ return this.state === 'open' && !this.shouldProbe();
68
+ }
69
+ reset() {
70
+ this.transitionTo('closed');
71
+ this.failureCount = 0;
72
+ this.lastFailureAt = null;
73
+ }
74
+ /** Synchronously record a failure (used by KeyPool to trip breaker without async) */
75
+ recordFailure() {
76
+ this.failureCount++;
77
+ this.lastFailureAt = Date.now();
78
+ if (this.state === 'half-open') {
79
+ this.transitionTo('open');
80
+ return;
81
+ }
82
+ if (this.failureCount >= this.config.failureThreshold) {
83
+ console.error(`[LLM] CircuitBreaker:${this.config.name} threshold reached (${this.failureCount}/${this.config.failureThreshold}) — opening`);
84
+ this.transitionTo('open');
85
+ }
86
+ }
87
+ onSuccess() {
88
+ this.failureCount = 0;
89
+ this.transitionTo('closed');
90
+ }
91
+ onFailure(error) {
92
+ if (!isRetryable(error)) {
93
+ return;
94
+ }
95
+ this.failureCount++;
96
+ this.lastFailureAt = Date.now();
97
+ if (this.state === 'half-open') {
98
+ this.transitionTo('open');
99
+ return;
100
+ }
101
+ if (this.failureCount >= this.config.failureThreshold) {
102
+ console.error(`[LLM] CircuitBreaker:${this.config.name} threshold reached (${this.failureCount}/${this.config.failureThreshold}) — opening`);
103
+ this.transitionTo('open');
104
+ }
105
+ }
106
+ shouldProbe() {
107
+ if (this.lastFailureAt === null)
108
+ return false;
109
+ return Date.now() - this.lastFailureAt >= this.config.resetTimeoutMs;
110
+ }
111
+ transitionTo(newState) {
112
+ if (this.state !== newState) {
113
+ this.state = newState;
114
+ }
115
+ }
116
+ }
117
+ // =============================================================================
118
+ // RETRY
119
+ // =============================================================================
120
+ const DEFAULT_RETRY_CONFIG = {
121
+ maxAttempts: 3,
122
+ baseDelayMs: 1000,
123
+ maxDelayMs: 30000,
124
+ jitter: 0.1,
125
+ };
126
+ export function computeDelay(error, attempt, config) {
127
+ const retryAfterMs = error?.retryAfterMs;
128
+ if (retryAfterMs !== undefined && retryAfterMs > 0) {
129
+ return Math.min(retryAfterMs, config.maxDelayMs);
130
+ }
131
+ const exponential = config.baseDelayMs * Math.pow(2, attempt);
132
+ const capped = Math.min(exponential, config.maxDelayMs);
133
+ const jitterRange = capped * config.jitter;
134
+ const jitterOffset = (Math.random() * 2 - 1) * jitterRange;
135
+ return Math.max(0, Math.round(capped + jitterOffset));
136
+ }
137
+ export async function retry(fn, config) {
138
+ const resolved = { ...DEFAULT_RETRY_CONFIG, ...config };
139
+ if (resolved.maxAttempts < 1) {
140
+ throw new Error(`retry maxAttempts must be >= 1, got ${resolved.maxAttempts}`);
141
+ }
142
+ const shouldRetry = resolved.shouldRetry ?? isRetryable;
143
+ let lastError;
144
+ for (let attempt = 0; attempt < resolved.maxAttempts; attempt++) {
145
+ try {
146
+ return await fn();
147
+ }
148
+ catch (error) {
149
+ lastError = error;
150
+ if (attempt >= resolved.maxAttempts - 1 || !shouldRetry(error)) {
151
+ throw error;
152
+ }
153
+ const delay = computeDelay(error, attempt, resolved);
154
+ resolved.onRetry?.(error, attempt + 1, delay);
155
+ await sleep(delay);
156
+ }
157
+ }
158
+ throw lastError;
159
+ }
160
+ // =============================================================================
161
+ // RATE LIMIT HEADER PARSER
162
+ // =============================================================================
163
+ export function parseRateLimitHeaders(headers) {
164
+ const remaining = headers.get('x-ratelimit-remaining-requests');
165
+ const reset = headers.get('x-ratelimit-reset-requests');
166
+ const retryAfter = headers.get('retry-after');
167
+ return {
168
+ remaining: remaining !== null ? (isNaN(parseInt(remaining, 10)) ? null : parseInt(remaining, 10)) : null,
169
+ resetMs: reset !== null ? parseResetDuration(reset) : null,
170
+ retryAfterMs: retryAfter !== null ? parseRetryAfter(retryAfter) : null,
171
+ };
172
+ }
173
+ function parseResetDuration(value) {
174
+ let totalMs = 0;
175
+ let matched = false;
176
+ const minMatch = value.match(/(\d+)m(?!\s*s)/);
177
+ if (minMatch) {
178
+ totalMs += parseInt(minMatch[1], 10) * 60_000;
179
+ matched = true;
180
+ }
181
+ const msMatch = value.match(/(\d+)ms/);
182
+ if (msMatch) {
183
+ totalMs += parseInt(msMatch[1], 10);
184
+ matched = true;
185
+ }
186
+ const secMatch = value.match(/(\d+)(?<!m)s/);
187
+ if (secMatch) {
188
+ totalMs += parseInt(secMatch[1], 10) * 1000;
189
+ matched = true;
190
+ }
191
+ return matched ? totalMs : null;
192
+ }
193
+ function parseRetryAfter(value) {
194
+ const seconds = parseFloat(value);
195
+ return isNaN(seconds) ? null : Math.ceil(seconds * 1000);
196
+ }
197
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/llm/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ export type PlanStatus = 'draft' | 'approved' | 'executing' | 'completed';
2
+ export type TaskStatus = 'pending' | 'in_progress' | 'completed' | 'skipped' | 'failed';
3
+ export interface PlanTask {
4
+ id: string;
5
+ title: string;
6
+ description: string;
7
+ status: TaskStatus;
8
+ updatedAt: number;
9
+ }
10
+ export interface Plan {
11
+ id: string;
12
+ objective: string;
13
+ scope: string;
14
+ status: PlanStatus;
15
+ decisions: string[];
16
+ tasks: PlanTask[];
17
+ createdAt: number;
18
+ updatedAt: number;
19
+ }
20
+ export interface PlanStore {
21
+ version: string;
22
+ plans: Plan[];
23
+ }
24
+ export declare class Planner {
25
+ private filePath;
26
+ private store;
27
+ constructor(filePath: string);
28
+ private load;
29
+ private save;
30
+ create(params: {
31
+ objective: string;
32
+ scope: string;
33
+ decisions?: string[];
34
+ tasks?: Array<{
35
+ title: string;
36
+ description: string;
37
+ }>;
38
+ }): Plan;
39
+ get(planId: string): Plan | null;
40
+ list(): Plan[];
41
+ approve(planId: string): Plan;
42
+ startExecution(planId: string): Plan;
43
+ updateTask(planId: string, taskId: string, status: TaskStatus): Plan;
44
+ complete(planId: string): Plan;
45
+ getExecuting(): Plan[];
46
+ getActive(): Plan[];
47
+ }
48
+ //# sourceMappingURL=planner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planner.d.ts","sourceRoot":"","sources":["../../src/planning/planner.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,UAAU,GAAG,WAAW,GAAG,WAAW,CAAC;AAC1E,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,aAAa,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;AAExF,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,UAAU,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,IAAI,EAAE,CAAC;CACf;AAED,qBAAa,OAAO;IAClB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,KAAK,CAAY;gBAEb,QAAQ,EAAE,MAAM;IAK5B,OAAO,CAAC,IAAI;IAYZ,OAAO,CAAC,IAAI;IAKZ,MAAM,CAAC,MAAM,EAAE;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QACrB,KAAK,CAAC,EAAE,KAAK,CAAC;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACvD,GAAG,IAAI;IAuBR,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAIhC,IAAI,IAAI,IAAI,EAAE;IAId,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAW7B,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAWpC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI;IAgBpE,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAW9B,YAAY,IAAI,IAAI,EAAE;IAItB,SAAS,IAAI,IAAI,EAAE;CAKpB"}