helixmind 0.6.4 → 0.7.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 (154) hide show
  1. package/dist/cli/agent/loop.d.ts.map +1 -1
  2. package/dist/cli/agent/loop.js +18 -11
  3. package/dist/cli/agent/loop.js.map +1 -1
  4. package/dist/cli/agent/permissions.d.ts +16 -0
  5. package/dist/cli/agent/permissions.d.ts.map +1 -1
  6. package/dist/cli/agent/permissions.js +74 -5
  7. package/dist/cli/agent/permissions.js.map +1 -1
  8. package/dist/cli/agent/sandbox.d.ts.map +1 -1
  9. package/dist/cli/agent/sandbox.js +3 -0
  10. package/dist/cli/agent/sandbox.js.map +1 -1
  11. package/dist/cli/brain/archive.d.ts.map +1 -1
  12. package/dist/cli/brain/archive.js +48 -18
  13. package/dist/cli/brain/archive.js.map +1 -1
  14. package/dist/cli/brain/control-protocol.d.ts +17 -0
  15. package/dist/cli/brain/control-protocol.d.ts.map +1 -1
  16. package/dist/cli/brain/control-protocol.js +79 -0
  17. package/dist/cli/brain/control-protocol.js.map +1 -1
  18. package/dist/cli/brain/path-guard.d.ts +2 -0
  19. package/dist/cli/brain/path-guard.d.ts.map +1 -0
  20. package/dist/cli/brain/path-guard.js +94 -0
  21. package/dist/cli/brain/path-guard.js.map +1 -0
  22. package/dist/cli/brain/relay-client.d.ts +2 -0
  23. package/dist/cli/brain/relay-client.d.ts.map +1 -1
  24. package/dist/cli/brain/relay-client.js +58 -8
  25. package/dist/cli/brain/relay-client.js.map +1 -1
  26. package/dist/cli/brain/server.d.ts.map +1 -1
  27. package/dist/cli/brain/server.js +235 -23
  28. package/dist/cli/brain/server.js.map +1 -1
  29. package/dist/cli/brain/stdout-capture.d.ts +11 -0
  30. package/dist/cli/brain/stdout-capture.d.ts.map +1 -1
  31. package/dist/cli/brain/stdout-capture.js +42 -1
  32. package/dist/cli/brain/stdout-capture.js.map +1 -1
  33. package/dist/cli/brain/web-chat-handler.d.ts.map +1 -1
  34. package/dist/cli/brain/web-chat-handler.js +7 -0
  35. package/dist/cli/brain/web-chat-handler.js.map +1 -1
  36. package/dist/cli/checkpoints/revert.d.ts +5 -0
  37. package/dist/cli/checkpoints/revert.d.ts.map +1 -1
  38. package/dist/cli/checkpoints/revert.js +100 -11
  39. package/dist/cli/checkpoints/revert.js.map +1 -1
  40. package/dist/cli/checkpoints/store.d.ts +3 -0
  41. package/dist/cli/checkpoints/store.d.ts.map +1 -1
  42. package/dist/cli/checkpoints/store.js.map +1 -1
  43. package/dist/cli/commands/chat.d.ts.map +1 -1
  44. package/dist/cli/commands/chat.js +138 -73
  45. package/dist/cli/commands/chat.js.map +1 -1
  46. package/dist/cli/config/store.js +1 -1
  47. package/dist/cli/config/store.js.map +1 -1
  48. package/dist/cli/core/input.d.ts +0 -1
  49. package/dist/cli/core/input.d.ts.map +1 -1
  50. package/dist/cli/core/input.js +9 -17
  51. package/dist/cli/core/input.js.map +1 -1
  52. package/dist/cli/jarvis/autonomy.d.ts +13 -1
  53. package/dist/cli/jarvis/autonomy.d.ts.map +1 -1
  54. package/dist/cli/jarvis/autonomy.js +33 -1
  55. package/dist/cli/jarvis/autonomy.js.map +1 -1
  56. package/dist/cli/jarvis/core-ethics.d.ts +15 -0
  57. package/dist/cli/jarvis/core-ethics.d.ts.map +1 -1
  58. package/dist/cli/jarvis/core-ethics.js +110 -9
  59. package/dist/cli/jarvis/core-ethics.js.map +1 -1
  60. package/dist/cli/jarvis/daemon.d.ts.map +1 -1
  61. package/dist/cli/jarvis/daemon.js +8 -0
  62. package/dist/cli/jarvis/daemon.js.map +1 -1
  63. package/dist/cli/jarvis/instance-lock.d.ts.map +1 -1
  64. package/dist/cli/jarvis/instance-lock.js +132 -27
  65. package/dist/cli/jarvis/instance-lock.js.map +1 -1
  66. package/dist/cli/jarvis/learning.d.ts +6 -0
  67. package/dist/cli/jarvis/learning.d.ts.map +1 -1
  68. package/dist/cli/jarvis/learning.js +17 -3
  69. package/dist/cli/jarvis/learning.js.map +1 -1
  70. package/dist/cli/jarvis/notifications.d.ts.map +1 -1
  71. package/dist/cli/jarvis/notifications.js +75 -10
  72. package/dist/cli/jarvis/notifications.js.map +1 -1
  73. package/dist/cli/jarvis/onboarding.d.ts.map +1 -1
  74. package/dist/cli/jarvis/onboarding.js +32 -2
  75. package/dist/cli/jarvis/onboarding.js.map +1 -1
  76. package/dist/cli/jarvis/queue.d.ts +5 -0
  77. package/dist/cli/jarvis/queue.d.ts.map +1 -1
  78. package/dist/cli/jarvis/queue.js +23 -6
  79. package/dist/cli/jarvis/queue.js.map +1 -1
  80. package/dist/cli/jarvis/scheduler.d.ts +8 -0
  81. package/dist/cli/jarvis/scheduler.d.ts.map +1 -1
  82. package/dist/cli/jarvis/scheduler.js +32 -4
  83. package/dist/cli/jarvis/scheduler.js.map +1 -1
  84. package/dist/cli/jarvis/sentiment.d.ts +11 -0
  85. package/dist/cli/jarvis/sentiment.d.ts.map +1 -1
  86. package/dist/cli/jarvis/sentiment.js +40 -6
  87. package/dist/cli/jarvis/sentiment.js.map +1 -1
  88. package/dist/cli/jarvis/skills.d.ts +35 -0
  89. package/dist/cli/jarvis/skills.d.ts.map +1 -1
  90. package/dist/cli/jarvis/skills.js +144 -0
  91. package/dist/cli/jarvis/skills.js.map +1 -1
  92. package/dist/cli/jarvis/triggers.d.ts.map +1 -1
  93. package/dist/cli/jarvis/triggers.js +65 -9
  94. package/dist/cli/jarvis/triggers.js.map +1 -1
  95. package/dist/cli/jarvis/types.d.ts +10 -0
  96. package/dist/cli/jarvis/types.d.ts.map +1 -1
  97. package/dist/cli/jarvis/world-model.d.ts +4 -0
  98. package/dist/cli/jarvis/world-model.d.ts.map +1 -1
  99. package/dist/cli/jarvis/world-model.js +23 -1
  100. package/dist/cli/jarvis/world-model.js.map +1 -1
  101. package/dist/cli/providers/anthropic.d.ts +5 -1
  102. package/dist/cli/providers/anthropic.d.ts.map +1 -1
  103. package/dist/cli/providers/anthropic.js +133 -36
  104. package/dist/cli/providers/anthropic.js.map +1 -1
  105. package/dist/cli/providers/model-limits.d.ts +8 -0
  106. package/dist/cli/providers/model-limits.d.ts.map +1 -1
  107. package/dist/cli/providers/model-limits.js +42 -0
  108. package/dist/cli/providers/model-limits.js.map +1 -1
  109. package/dist/cli/providers/ollama.d.ts +2 -0
  110. package/dist/cli/providers/ollama.d.ts.map +1 -1
  111. package/dist/cli/providers/ollama.js +8 -0
  112. package/dist/cli/providers/ollama.js.map +1 -1
  113. package/dist/cli/providers/openai.d.ts +5 -1
  114. package/dist/cli/providers/openai.d.ts.map +1 -1
  115. package/dist/cli/providers/openai.js +66 -19
  116. package/dist/cli/providers/openai.js.map +1 -1
  117. package/dist/cli/providers/rate-limiter.d.ts +58 -20
  118. package/dist/cli/providers/rate-limiter.d.ts.map +1 -1
  119. package/dist/cli/providers/rate-limiter.js +212 -96
  120. package/dist/cli/providers/rate-limiter.js.map +1 -1
  121. package/dist/cli/providers/registry.d.ts.map +1 -1
  122. package/dist/cli/providers/registry.js +22 -13
  123. package/dist/cli/providers/registry.js.map +1 -1
  124. package/dist/cli/providers/types.d.ts +16 -5
  125. package/dist/cli/providers/types.d.ts.map +1 -1
  126. package/dist/spiral/cloud/content-extractor.d.ts.map +1 -1
  127. package/dist/spiral/cloud/content-extractor.js +6 -4
  128. package/dist/spiral/cloud/content-extractor.js.map +1 -1
  129. package/dist/spiral/cloud/search-provider.d.ts.map +1 -1
  130. package/dist/spiral/cloud/search-provider.js +7 -2
  131. package/dist/spiral/cloud/search-provider.js.map +1 -1
  132. package/dist/spiral/cloud/web-enricher.d.ts.map +1 -1
  133. package/dist/spiral/cloud/web-enricher.js +10 -2
  134. package/dist/spiral/cloud/web-enricher.js.map +1 -1
  135. package/dist/spiral/compression.d.ts +5 -2
  136. package/dist/spiral/compression.d.ts.map +1 -1
  137. package/dist/spiral/compression.js +23 -6
  138. package/dist/spiral/compression.js.map +1 -1
  139. package/dist/spiral/engine.d.ts +7 -1
  140. package/dist/spiral/engine.d.ts.map +1 -1
  141. package/dist/spiral/engine.js +83 -35
  142. package/dist/spiral/engine.js.map +1 -1
  143. package/dist/storage/database.d.ts.map +1 -1
  144. package/dist/storage/database.js +41 -0
  145. package/dist/storage/database.js.map +1 -1
  146. package/dist/storage/nodes.d.ts +6 -0
  147. package/dist/storage/nodes.d.ts.map +1 -1
  148. package/dist/storage/nodes.js +9 -0
  149. package/dist/storage/nodes.js.map +1 -1
  150. package/dist/storage/vectors.d.ts +1 -0
  151. package/dist/storage/vectors.d.ts.map +1 -1
  152. package/dist/storage/vectors.js +39 -7
  153. package/dist/storage/vectors.js.map +1 -1
  154. package/package.json +3 -3
@@ -2,6 +2,10 @@
2
2
  * Intelligent rate limiter with exponential backoff and proactive throttling.
3
3
  * Tracks API call timing, parses retry-after headers from errors,
4
4
  * and preemptively delays when approaching rate limits.
5
+ *
6
+ * FIX: PROVIDERS-C2 — Converted module-global state to a RateLimiter class.
7
+ * A default singleton is kept so module-level exports stay backward compatible,
8
+ * but each Provider should now own a private RateLimiter instance.
5
9
  */
6
10
  /** Backoff delays in ms: 2s, 5s, 10s, 20s, 30s, 60s */
7
11
  const BACKOFF_DELAYS = [2000, 5000, 10000, 20000, 30000, 60000];
@@ -11,110 +15,223 @@ const WINDOW_MS = 60_000;
11
15
  const PROACTIVE_THRESHOLD = 25;
12
16
  /** Minimum gap between calls in ms (prevents burst) */
13
17
  const MIN_GAP_MS = 500;
14
- let state = {
15
- callTimestamps: [],
16
- nextAllowedAt: 0,
17
- backoffLevel: 0,
18
- totalRetries: 0,
19
- };
20
- let onWait = null;
21
- /** Register a listener for rate limit wait events */
22
- export function onRateLimitWait(listener) {
23
- onWait = listener;
18
+ /** FIX: PROVIDERS-m1 — Never block longer than 2 minutes, even on repeated errors */
19
+ const MAX_WAIT_MS = 120_000;
20
+ /** FIX: PROVIDERS-s1 — Pre-compile regexes at module scope */
21
+ const RETRY_AFTER_REGEX = /retry.?after[:\s]*(\d+)/i;
22
+ const TOKENS_PER_MINUTE_REGEX = /(\d+[,.]?\d*)\s*input tokens per minute/i;
23
+ /**
24
+ * Extract a retry-after value in ms from the headers attached to an HTTP error.
25
+ * Honors both `retry-after-ms` (Anthropic) and `retry-after` (seconds, RFC).
26
+ * FIX: PROVIDERS-M4 — Prefer real headers over regex against message body.
27
+ */
28
+ function getRetryAfterFromHeaders(error) {
29
+ const headers = error?.headers ??
30
+ error?.response?.headers ??
31
+ error?.error?.headers;
32
+ if (!headers)
33
+ return null;
34
+ const get = (k) => typeof headers.get === 'function' ? headers.get(k) : headers[k];
35
+ const ms = get('retry-after-ms');
36
+ if (ms) {
37
+ const n = parseInt(ms, 10);
38
+ if (Number.isFinite(n) && n > 0)
39
+ return n;
40
+ }
41
+ const secs = get('retry-after');
42
+ if (secs) {
43
+ const n = parseInt(secs, 10);
44
+ if (Number.isFinite(n) && n > 0)
45
+ return n * 1000;
46
+ }
47
+ return null;
24
48
  }
25
49
  /**
26
- * Wait if needed before making an API call.
27
- * Call this BEFORE every LLM API request.
28
- * Returns the actual wait time in ms (0 if no wait needed).
50
+ * Per-provider rate limiter.
51
+ * Holds its own state so two providers on different keys/hosts don't share a cooldown.
29
52
  */
30
- export async function waitIfNeeded(signal) {
31
- const now = Date.now();
32
- // Clean old timestamps outside the window
33
- state.callTimestamps = state.callTimestamps.filter(t => now - t < WINDOW_MS);
34
- let waitMs = 0;
35
- let reason = '';
36
- // 1. Hard limit from previous rate limit error
37
- if (state.nextAllowedAt > now) {
38
- waitMs = state.nextAllowedAt - now;
39
- reason = 'rate limit cooldown';
53
+ export class RateLimiter {
54
+ state = {
55
+ callTimestamps: [],
56
+ nextAllowedAt: 0,
57
+ backoffLevel: 0,
58
+ totalRetries: 0,
59
+ };
60
+ onWait = null;
61
+ providerName = 'default';
62
+ constructor(providerName) {
63
+ if (providerName)
64
+ this.providerName = providerName;
65
+ }
66
+ /** Register a listener invoked every time this limiter blocks for a wait. */
67
+ setOnWait(listener) {
68
+ this.onWait = listener;
40
69
  }
41
- // 2. Proactive throttling: if approaching rate limit within window
42
- if (waitMs === 0 && state.callTimestamps.length >= PROACTIVE_THRESHOLD) {
43
- // Calculate average gap needed to spread calls evenly
44
- const oldest = state.callTimestamps[0];
45
- const elapsed = now - oldest;
46
- const avgGap = elapsed / state.callTimestamps.length;
47
- const neededGap = WINDOW_MS / PROACTIVE_THRESHOLD;
48
- if (avgGap < neededGap) {
49
- waitMs = Math.min(neededGap - avgGap, 5000);
50
- reason = 'proactive throttle';
70
+ /** Label used in telemetry / listener reason strings. */
71
+ setProviderName(name) {
72
+ this.providerName = name;
73
+ }
74
+ getProviderName() {
75
+ return this.providerName;
76
+ }
77
+ /**
78
+ * Wait if needed before making an API call.
79
+ * Returns actual wait time in ms (0 if no wait needed).
80
+ */
81
+ async waitIfNeeded(signal) {
82
+ const now = Date.now();
83
+ // Clean old timestamps outside the window
84
+ this.state.callTimestamps = this.state.callTimestamps.filter((t) => now - t < WINDOW_MS);
85
+ let waitMs = 0;
86
+ let reason = '';
87
+ // 1. Hard limit from previous rate limit error
88
+ if (this.state.nextAllowedAt > now) {
89
+ waitMs = this.state.nextAllowedAt - now;
90
+ reason = 'rate limit cooldown';
91
+ }
92
+ // 2. Proactive throttling: if approaching rate limit within window
93
+ if (waitMs === 0 && this.state.callTimestamps.length >= PROACTIVE_THRESHOLD) {
94
+ const oldest = this.state.callTimestamps[0];
95
+ const elapsed = now - oldest;
96
+ const avgGap = elapsed / this.state.callTimestamps.length;
97
+ const neededGap = WINDOW_MS / PROACTIVE_THRESHOLD;
98
+ if (avgGap < neededGap) {
99
+ waitMs = Math.min(neededGap - avgGap, 5000);
100
+ reason = 'proactive throttle';
101
+ }
102
+ }
103
+ // 3. Minimum gap between calls
104
+ if (waitMs === 0 && this.state.callTimestamps.length > 0) {
105
+ const lastCall = this.state.callTimestamps[this.state.callTimestamps.length - 1];
106
+ const gap = now - lastCall;
107
+ if (gap < MIN_GAP_MS) {
108
+ waitMs = MIN_GAP_MS - gap;
109
+ reason = 'min gap';
110
+ }
111
+ }
112
+ // FIX: PROVIDERS-m1 — Never block longer than MAX_WAIT_MS
113
+ if (waitMs > MAX_WAIT_MS)
114
+ waitMs = MAX_WAIT_MS;
115
+ if (waitMs > 0) {
116
+ this.onWait?.(waitMs, reason);
117
+ await sleep(waitMs, signal);
51
118
  }
119
+ // Record this call
120
+ this.state.callTimestamps.push(Date.now());
121
+ return waitMs;
52
122
  }
53
- // 3. Minimum gap between calls
54
- if (waitMs === 0 && state.callTimestamps.length > 0) {
55
- const lastCall = state.callTimestamps[state.callTimestamps.length - 1];
56
- const gap = now - lastCall;
57
- if (gap < MIN_GAP_MS) {
58
- waitMs = MIN_GAP_MS - gap;
59
- reason = 'min gap';
123
+ /** Same as waitIfNeeded alias kept for API symmetry. */
124
+ async recordCall() {
125
+ this.state.callTimestamps.push(Date.now());
126
+ }
127
+ /** Report a successful API call. Resets backoff. */
128
+ reportSuccess() {
129
+ this.state.backoffLevel = 0;
130
+ }
131
+ /**
132
+ * Handle a rate limit error. Parses retry-after and applies backoff.
133
+ * Returns the recommended wait time in ms (clamped to MAX_WAIT_MS).
134
+ * FIX: PROVIDERS-M4 — Headers take priority over regex.
135
+ */
136
+ handleRateLimitError(error) {
137
+ this.state.totalRetries++;
138
+ let retryAfterMs = 0;
139
+ // 1. Real headers first — authoritative source.
140
+ const headerMs = getRetryAfterFromHeaders(error);
141
+ if (headerMs !== null) {
142
+ retryAfterMs = headerMs;
143
+ }
144
+ // 2. Regex fallback on error message body.
145
+ if (retryAfterMs === 0 && error instanceof Error) {
146
+ const msg = error.message;
147
+ const retryMatch = msg.match(RETRY_AFTER_REGEX);
148
+ if (retryMatch) {
149
+ retryAfterMs = parseInt(retryMatch[1], 10) * 1000;
150
+ }
151
+ if (retryAfterMs === 0) {
152
+ const tokenMatch = msg.match(TOKENS_PER_MINUTE_REGEX);
153
+ if (tokenMatch) {
154
+ retryAfterMs = 30_000;
155
+ }
156
+ }
60
157
  }
158
+ // 3. Exponential backoff fallback
159
+ if (retryAfterMs === 0) {
160
+ const level = Math.min(this.state.backoffLevel, BACKOFF_DELAYS.length - 1);
161
+ retryAfterMs = BACKOFF_DELAYS[level];
162
+ }
163
+ // FIX: PROVIDERS-M4 — Clamp to MAX_WAIT_MS so a misconfigured header can't freeze the CLI.
164
+ retryAfterMs = Math.min(retryAfterMs, MAX_WAIT_MS);
165
+ this.state.backoffLevel++;
166
+ this.state.nextAllowedAt = Date.now() + retryAfterMs;
167
+ return retryAfterMs;
168
+ }
169
+ /** Get current rate limiter stats */
170
+ getStats() {
171
+ const now = Date.now();
172
+ this.state.callTimestamps = this.state.callTimestamps.filter((t) => now - t < WINDOW_MS);
173
+ return {
174
+ callsInWindow: this.state.callTimestamps.length,
175
+ backoffLevel: this.state.backoffLevel,
176
+ totalRetries: this.state.totalRetries,
177
+ };
61
178
  }
62
- if (waitMs > 0) {
63
- onWait?.(waitMs, reason);
64
- await sleep(waitMs, signal);
179
+ /** Reset all state — useful in tests. */
180
+ reset() {
181
+ this.state = {
182
+ callTimestamps: [],
183
+ nextAllowedAt: 0,
184
+ backoffLevel: 0,
185
+ totalRetries: 0,
186
+ };
65
187
  }
66
- // Record this call
67
- state.callTimestamps.push(Date.now());
68
- return waitMs;
69
188
  }
70
- /**
71
- * Report a successful API call. Resets backoff.
72
- */
189
+ // ---------------------------------------------------------------------------
190
+ // Default singleton + backward-compatible module-level API.
191
+ // FIX: PROVIDERS-C2 — `chat.ts` and tests still import these names.
192
+ // ---------------------------------------------------------------------------
193
+ const defaultLimiter = new RateLimiter('default');
194
+ /** Register a listener for rate limit wait events on the default singleton. */
195
+ export function onRateLimitWait(listener) {
196
+ defaultLimiter.setOnWait(listener);
197
+ }
198
+ /** Wait if needed — delegates to the default singleton. */
199
+ export async function waitIfNeeded(signal) {
200
+ return defaultLimiter.waitIfNeeded(signal);
201
+ }
202
+ /** Report a successful API call on the default singleton. */
73
203
  export function reportSuccess() {
74
- state.backoffLevel = 0;
204
+ defaultLimiter.reportSuccess();
75
205
  }
76
- /**
77
- * Handle a rate limit error. Parses retry-after and applies backoff.
78
- * Returns the recommended wait time in ms.
79
- */
206
+ /** Handle a rate-limit error on the default singleton. */
80
207
  export function handleRateLimitError(error) {
81
- state.totalRetries++;
82
- // Try to parse retry-after from error message or headers
83
- let retryAfterMs = 0;
84
- if (error instanceof Error) {
85
- const msg = error.message;
86
- // Parse "retry-after" seconds from error body
87
- const retryMatch = msg.match(/retry.?after[:\s]*(\d+)/i);
88
- if (retryMatch) {
89
- retryAfterMs = parseInt(retryMatch[1], 10) * 1000;
90
- }
91
- // Parse Anthropic-specific rate limit info
92
- const tokenMatch = msg.match(/(\d+[,.]?\d*)\s*input tokens per minute/i);
93
- if (tokenMatch && !retryAfterMs) {
94
- // Wait proportional to the window — typically 30-60s
95
- retryAfterMs = 30_000;
96
- }
97
- }
98
- // Apply exponential backoff if no retry-after
99
- if (retryAfterMs === 0) {
100
- const level = Math.min(state.backoffLevel, BACKOFF_DELAYS.length - 1);
101
- retryAfterMs = BACKOFF_DELAYS[level];
102
- }
103
- state.backoffLevel++;
104
- state.nextAllowedAt = Date.now() + retryAfterMs;
105
- return retryAfterMs;
208
+ return defaultLimiter.handleRateLimitError(error);
106
209
  }
210
+ /** Get stats for the default singleton. */
211
+ export function getRateLimitStats() {
212
+ return defaultLimiter.getStats();
213
+ }
214
+ // ---------------------------------------------------------------------------
215
+ // Shared helpers
216
+ // ---------------------------------------------------------------------------
107
217
  /**
108
218
  * Check if an error is a rate limit error (429).
219
+ * FIX: PROVIDERS-m3 — Prefer numeric status code over regex.
109
220
  */
110
221
  export function isRateLimitError(error) {
222
+ if (!error)
223
+ return false;
224
+ // Most SDKs expose .status / .statusCode on the error object
225
+ const status = error?.status ?? error?.statusCode;
226
+ if (status === 429)
227
+ return true;
111
228
  if (!(error instanceof Error))
112
229
  return false;
113
230
  const msg = error.message.toLowerCase();
114
- return msg.includes('429') ||
231
+ return (msg.includes('429') ||
115
232
  msg.includes('rate_limit') ||
116
233
  msg.includes('rate limit') ||
117
- msg.includes('too many requests');
234
+ msg.includes('too many requests'));
118
235
  }
119
236
  /**
120
237
  * Check if an error indicates exhausted credits/balance (402/403).
@@ -128,7 +245,8 @@ export function detectCreditsExhausted(error) {
128
245
  if (msg.includes('402'))
129
246
  return 'Credits balance is 0 — payment required';
130
247
  // Common API error patterns for exhausted credits
131
- if (msg.includes('insufficient') && (msg.includes('balance') || msg.includes('credit') || msg.includes('quota') || msg.includes('fund')))
248
+ if (msg.includes('insufficient') &&
249
+ (msg.includes('balance') || msg.includes('credit') || msg.includes('quota') || msg.includes('fund')))
132
250
  return 'Insufficient credits balance';
133
251
  if (msg.includes('quota') && msg.includes('exceed'))
134
252
  return 'API quota exceeded';
@@ -138,27 +256,25 @@ export function detectCreditsExhausted(error) {
138
256
  return 'Access denied — API key may be invalid or credits exhausted';
139
257
  return null;
140
258
  }
141
- /** Get current rate limiter stats */
142
- export function getRateLimitStats() {
143
- const now = Date.now();
144
- state.callTimestamps = state.callTimestamps.filter(t => now - t < WINDOW_MS);
145
- return {
146
- callsInWindow: state.callTimestamps.length,
147
- backoffLevel: state.backoffLevel,
148
- totalRetries: state.totalRetries,
149
- };
150
- }
151
- function sleep(ms, signal) {
259
+ /**
260
+ * Abort-signal aware sleep.
261
+ * FIX: PROVIDERS-C3 — Exported so providers + agent loop can use a cancellable sleep.
262
+ */
263
+ export function sleep(ms, signal) {
152
264
  return new Promise((resolve, reject) => {
153
265
  if (signal?.aborted) {
154
266
  reject(new Error('Aborted'));
155
267
  return;
156
268
  }
157
- const timer = setTimeout(resolve, ms);
158
- signal?.addEventListener('abort', () => {
269
+ const timer = setTimeout(() => {
270
+ signal?.removeEventListener('abort', onAbort);
271
+ resolve();
272
+ }, ms);
273
+ const onAbort = () => {
159
274
  clearTimeout(timer);
160
275
  reject(new Error('Aborted'));
161
- }, { once: true });
276
+ };
277
+ signal?.addEventListener('abort', onAbort, { once: true });
162
278
  });
163
279
  }
164
280
  //# sourceMappingURL=rate-limiter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../../src/cli/providers/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH,uDAAuD;AACvD,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AAEhE,kDAAkD;AAClD,MAAM,SAAS,GAAG,MAAM,CAAC;AAEzB,uDAAuD;AACvD,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAE/B,uDAAuD;AACvD,MAAM,UAAU,GAAG,GAAG,CAAC;AAEvB,IAAI,KAAK,GAAmB;IAC1B,cAAc,EAAE,EAAE;IAClB,aAAa,EAAE,CAAC;IAChB,YAAY,EAAE,CAAC;IACf,YAAY,EAAE,CAAC;CAChB,CAAC;AAIF,IAAI,MAAM,GAAwB,IAAI,CAAC;AAEvC,qDAAqD;AACrD,MAAM,UAAU,eAAe,CAAC,QAAsB;IACpD,MAAM,GAAG,QAAQ,CAAC;AACpB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAoB;IACrD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEvB,0CAA0C;IAC1C,KAAK,CAAC,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC;IAE7E,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,MAAM,GAAG,EAAE,CAAC;IAEhB,+CAA+C;IAC/C,IAAI,KAAK,CAAC,aAAa,GAAG,GAAG,EAAE,CAAC;QAC9B,MAAM,GAAG,KAAK,CAAC,aAAa,GAAG,GAAG,CAAC;QACnC,MAAM,GAAG,qBAAqB,CAAC;IACjC,CAAC;IAED,mEAAmE;IACnE,IAAI,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,cAAc,CAAC,MAAM,IAAI,mBAAmB,EAAE,CAAC;QACvE,sDAAsD;QACtD,MAAM,MAAM,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,GAAG,GAAG,MAAM,CAAC;QAC7B,MAAM,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC;QACrD,MAAM,SAAS,GAAG,SAAS,GAAG,mBAAmB,CAAC;QAElD,IAAI,MAAM,GAAG,SAAS,EAAE,CAAC;YACvB,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,MAAM,EAAE,IAAI,CAAC,CAAC;YAC5C,MAAM,GAAG,oBAAoB,CAAC;QAChC,CAAC;IACH,CAAC;IAED,+BAA+B;IAC/B,IAAI,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpD,MAAM,QAAQ,GAAG,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACvE,MAAM,GAAG,GAAG,GAAG,GAAG,QAAQ,CAAC;QAC3B,IAAI,GAAG,GAAG,UAAU,EAAE,CAAC;YACrB,MAAM,GAAG,UAAU,GAAG,GAAG,CAAC;YAC1B,MAAM,GAAG,SAAS,CAAC;QACrB,CAAC;IACH,CAAC;IAED,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QACf,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACzB,MAAM,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,CAAC;IAED,mBAAmB;IACnB,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAEtC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC;AACzB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,KAAK,CAAC,YAAY,EAAE,CAAC;IAErB,yDAAyD;IACzD,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC;QAE1B,8CAA8C;QAC9C,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;QACzD,IAAI,UAAU,EAAE,CAAC;YACf,YAAY,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC;QACpD,CAAC;QAED,2CAA2C;QAC3C,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;QACzE,IAAI,UAAU,IAAI,CAAC,YAAY,EAAE,CAAC;YAChC,qDAAqD;YACrD,YAAY,GAAG,MAAM,CAAC;QACxB,CAAC;IACH,CAAC;IAED,8CAA8C;IAC9C,IAAI,YAAY,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,EAAE,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACtE,YAAY,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,YAAY,EAAE,CAAC;IACrB,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY,CAAC;IAEhD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5C,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;IACxC,OAAO,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;QACxB,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC;QAC1B,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC;QAC1B,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;AACtC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAAc;IACnD,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3C,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;IAExC,4BAA4B;IAC5B,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,yCAAyC,CAAC;IAE1E,kDAAkD;IAClD,IAAI,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACtI,OAAO,8BAA8B,CAAC;IACxC,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACjD,OAAO,oBAAoB,CAAC;IAC9B,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC;QACpD,OAAO,4CAA4C,CAAC;IACtD,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAC9E,OAAO,6DAA6D,CAAC;IAEvE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,qCAAqC;AACrC,MAAM,UAAU,iBAAiB;IAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,KAAK,CAAC,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC;IAC7E,OAAO;QACL,aAAa,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM;QAC1C,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,YAAY,EAAE,KAAK,CAAC,YAAY;KACjC,CAAC;AACJ,CAAC;AAED,SAAS,KAAK,CAAC,EAAU,EAAE,MAAoB;IAC7C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YAAC,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QAC9D,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACtC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;YACrC,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;QAC/B,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACrB,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../../src/cli/providers/rate-limiter.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/cli/providers/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAI9C,8DAA8D;AAC9D,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE;IAC3C,IAAI,EAAE,WAAW,GAAG,mBAAmB,CAAC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB,CAwEA,CAAC;AAEF,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM,GACf,WAAW,CAUb;AAED,mCAAmC;AACnC,wBAAgB,gBAAgB,IAAI,MAAM,EAAE,CAE3C;AAED,iEAAiE;AACjE,eAAO,MAAM,WAAW,aAGtB,CAAC;AAEH,+BAA+B;AAC/B,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,kEAAkE;AAClE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAErD;AAED,uCAAuC;AACvC,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAEvD"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/cli/providers/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAiB9C,8DAA8D;AAC9D,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE;IAC3C,IAAI,EAAE,WAAW,GAAG,mBAAmB,CAAC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB,CAwEA,CAAC;AAEF,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM,GACf,WAAW,CAUb;AAED,mCAAmC;AACnC,wBAAgB,gBAAgB,IAAI,MAAM,EAAE,CAE3C;AAED,iEAAiE;AACjE,eAAO,MAAM,WAAW,aAGtB,CAAC;AAEH,+BAA+B;AAC/B,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,kEAAkE;AAClE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAErD;AAED,uCAAuC;AACvC,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAEvD"}
@@ -1,10 +1,27 @@
1
1
  import { AnthropicProvider } from './anthropic.js';
2
2
  import { OpenAIProvider } from './openai.js';
3
+ import { RECOMMENDED_MODELS } from './ollama.js';
4
+ // FIX: PROVIDERS-s4 — derive ollama.models from RECOMMENDED_MODELS (single source of truth).
5
+ // Any additional local-only aliases are appended after the recommended list.
6
+ const OLLAMA_EXTRA_MODELS = [
7
+ 'deepseek-r1:14b',
8
+ 'llama3.3',
9
+ 'codellama:34b',
10
+ ];
11
+ const OLLAMA_DERIVED_MODELS = Array.from(new Set([...RECOMMENDED_MODELS.map((m) => m.name), ...OLLAMA_EXTRA_MODELS]));
3
12
  /** Known providers with their base URLs and default models */
4
13
  export const KNOWN_PROVIDERS = {
5
14
  anthropic: {
6
15
  type: 'anthropic',
7
- models: ['claude-sonnet-4-6', 'claude-opus-4-6', 'claude-haiku-4-5-20251001'],
16
+ // FIX: PROVIDERS-M5 — Added opus-4-7 + 1M context variants.
17
+ models: [
18
+ 'claude-opus-4-7',
19
+ 'claude-opus-4-7-1m',
20
+ 'claude-sonnet-4-6',
21
+ 'claude-sonnet-4-6-1m',
22
+ 'claude-opus-4-6',
23
+ 'claude-haiku-4-5-20251001',
24
+ ],
8
25
  defaultModel: 'claude-sonnet-4-6',
9
26
  },
10
27
  openai: {
@@ -33,17 +50,8 @@ export const KNOWN_PROVIDERS = {
33
50
  ollama: {
34
51
  type: 'openai-compatible',
35
52
  baseURL: 'http://localhost:11434/v1',
36
- models: [
37
- 'qwen3-coder:30b',
38
- 'qwen2.5-coder:32b',
39
- 'qwen2.5-coder:14b',
40
- 'qwen2.5-coder:7b',
41
- 'deepseek-r1:32b',
42
- 'deepseek-r1:14b',
43
- 'deepseek-coder-v2:16b',
44
- 'llama3.3',
45
- 'codellama:34b',
46
- ],
53
+ // FIX: PROVIDERS-s4 — single source of truth (RECOMMENDED_MODELS).
54
+ models: OLLAMA_DERIVED_MODELS,
47
55
  defaultModel: 'qwen2.5-coder:32b',
48
56
  },
49
57
  zai: {
@@ -51,6 +59,7 @@ export const KNOWN_PROVIDERS = {
51
59
  baseURL: 'https://api.z.ai/api/coding/paas/v4',
52
60
  models: [
53
61
  // Premium
62
+ 'glm-5.1',
54
63
  'glm-5',
55
64
  'glm-5-code',
56
65
  // Standard
@@ -65,7 +74,7 @@ export const KNOWN_PROVIDERS = {
65
74
  'glm-4.7-flash',
66
75
  'glm-4.5-flash',
67
76
  ],
68
- defaultModel: 'glm-5',
77
+ defaultModel: 'glm-5.1',
69
78
  },
70
79
  openrouter: {
71
80
  type: 'openai-compatible',
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/cli/providers/registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/cli/providers/registry.ts"],"names":[],"mappings":"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"}
@@ -51,20 +51,31 @@ export interface ToolDefinition {
51
51
  required?: string[];
52
52
  };
53
53
  }
54
+ /**
55
+ * Token usage reported by the provider.
56
+ * FIX: PROVIDERS-M1 — cache_creation_input_tokens / cache_read_input_tokens are
57
+ * Anthropic-specific and optional for other providers.
58
+ */
59
+ export interface TokenUsage {
60
+ input_tokens: number;
61
+ output_tokens: number;
62
+ /** Anthropic prompt caching: tokens written to the cache on this request */
63
+ cache_creation_input_tokens?: number;
64
+ /** Anthropic prompt caching: tokens read from the cache on this request */
65
+ cache_read_input_tokens?: number;
66
+ }
54
67
  export interface ToolResponse {
55
68
  content: ContentBlock[];
56
69
  stop_reason: 'end_turn' | 'tool_use' | 'max_tokens' | 'stop_sequence';
57
- usage?: {
58
- input_tokens: number;
59
- output_tokens: number;
60
- };
70
+ usage?: TokenUsage;
61
71
  }
62
72
  export interface LLMProvider {
63
73
  name: string;
64
74
  model: string;
65
75
  /** Context window size in tokens — used for auto-trimming */
66
76
  maxContextLength: number;
67
- stream(messages: ChatMessage[], systemPrompt: string): AsyncGenerator<StreamEvent>;
77
+ /** FIX: PROVIDERS-C1 stream() now accepts an AbortSignal for hard cancel. */
78
+ stream(messages: ChatMessage[], systemPrompt: string, signal?: AbortSignal): AsyncGenerator<StreamEvent>;
68
79
  /** Chat with tool use support. Returns full response (non-streaming for tool calls). */
69
80
  chatWithTools(messages: ToolMessage[], systemPrompt: string, tools: ToolDefinition[], signal?: AbortSignal): Promise<ToolResponse>;
70
81
  countTokens?(text: string): Promise<number>;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/cli/providers/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,+CAA+C;AAC/C,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,UAAU,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wEAAwE;AACxE,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,8CAA8C;AAC9C,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE,WAAW,GAAG,YAAY,GAAG,YAAY,GAAG,WAAW,CAAC;QACpE,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,YAAY,GAAG,cAAc,GAAG,UAAU,CAAC;AAElF,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,aAAa,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,EAAE,YAAY,EAAE,GAAG,eAAe,EAAE,GAAG,MAAM,CAAC;CACtD;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE;QACZ,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACpC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;CACH;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,WAAW,EAAE,UAAU,GAAG,UAAU,GAAG,YAAY,GAAG,eAAe,CAAC;IACtE,KAAK,CAAC,EAAE;QACN,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,6DAA6D;IAC7D,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,CACJ,QAAQ,EAAE,WAAW,EAAE,EACvB,YAAY,EAAE,MAAM,GACnB,cAAc,CAAC,WAAW,CAAC,CAAC;IAE/B,wFAAwF;IACxF,aAAa,CACX,QAAQ,EAAE,WAAW,EAAE,EACvB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,cAAc,EAAE,EACvB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,YAAY,CAAC,CAAC;IAEzB,WAAW,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC7C"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/cli/providers/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"content-extractor.d.ts","sourceRoot":"","sources":["../../../src/spiral/cloud/content-extractor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,kBAAkB;IACjC,wCAAwC;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,0BAA0B;IAC1B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,kCAAkC;IAClC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,iBAAiB;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,kBAAkB,CAapB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,kBAAkB,EAC7B,KAAK,EAAE,MAAM,GACZ,MAAM,CA6BR"}
1
+ {"version":3,"file":"content-extractor.d.ts","sourceRoot":"","sources":["../../../src/spiral/cloud/content-extractor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,kBAAkB;IACjC,wCAAwC;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,0BAA0B;IAC1B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,kCAAkC;IAClC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,iBAAiB;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,kBAAkB,CAepB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,kBAAkB,EAC7B,KAAK,EAAE,MAAM,GACZ,MAAM,CA6BR"}
@@ -8,10 +8,12 @@
8
8
  * Extract structured knowledge from page content.
9
9
  */
10
10
  export function extractKnowledge(content, sourceUrl, topic) {
11
- const codeExamples = extractCodeBlocks(content);
12
- const keyPoints = extractKeyPoints(content, topic);
13
- const summary = buildSummary(content, topic, keyPoints);
14
- const quality = assessQuality(content, codeExamples, keyPoints, topic);
11
+ // FIX: WIDE-SPIRAL-011 — cap input size before regex-heavy passes to block ReDoS.
12
+ const safeContent = content.slice(0, 200_000);
13
+ const codeExamples = extractCodeBlocks(safeContent);
14
+ const keyPoints = extractKeyPoints(safeContent, topic);
15
+ const summary = buildSummary(safeContent, topic, keyPoints);
16
+ const quality = assessQuality(safeContent, codeExamples, keyPoints, topic);
15
17
  return {
16
18
  summary,
17
19
  codeExamples: codeExamples.slice(0, 3), // Max 3 code examples
@@ -1 +1 @@
1
- {"version":3,"file":"content-extractor.js","sourceRoot":"","sources":["../../../src/spiral/cloud/content-extractor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"content-extractor.js","sourceRoot":"","sources":["../../../src/spiral/cloud/content-extractor.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"search-provider.d.ts","sourceRoot":"","sources":["../../../src/spiral/cloud/search-provider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,KAAK,EAAE,MAAM,EACb,UAAU,GAAE,MAAU,EACtB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,YAAY,EAAE,CAAC,CA4BzB;AAmED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,EACX,SAAS,GAAE,MAAa,EACxB,MAAM,CAAC,EAAE,WAAW,EACpB,cAAc,GAAE,MAAU,GACzB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA+DxB"}
1
+ {"version":3,"file":"search-provider.d.ts","sourceRoot":"","sources":["../../../src/spiral/cloud/search-provider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,KAAK,EAAE,MAAM,EACb,UAAU,GAAE,MAAU,EACtB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,YAAY,EAAE,CAAC,CA4BzB;AAsED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,EACX,SAAS,GAAE,MAAa,EACxB,MAAM,CAAC,EAAE,WAAW,EACpB,cAAc,GAAE,MAAU,GACzB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA+DxB"}
@@ -39,7 +39,10 @@ export async function webSearch(query, maxResults = 5, signal) {
39
39
  * Parse DuckDuckGo Lite HTML results.
40
40
  * The Lite version returns a simple table-based layout.
41
41
  */
42
- function parseDuckDuckGoLite(html, maxResults) {
42
+ function parseDuckDuckGoLite(rawHtml, maxResults) {
43
+ // FIX: WIDE-SPIRAL-011 — cap HTML input size to prevent catastrophic backtracking
44
+ // on adversarial or pathological input.
45
+ const html = rawHtml.slice(0, 200_000);
43
46
  const results = [];
44
47
  // DDG Lite puts results in table rows with class "result-link" or similar
45
48
  // Each result has: <a class="result-link" href="URL">Title</a>
@@ -159,7 +162,9 @@ export async function fetchPageContent(url, maxLength = 8000, signal, _redirectD
159
162
  * Extract the main readable content from HTML.
160
163
  * Focuses on article body, code blocks, and paragraphs.
161
164
  */
162
- function extractMainContent(html) {
165
+ function extractMainContent(rawHtml) {
166
+ // FIX: WIDE-SPIRAL-011 — cap HTML input size to prevent catastrophic backtracking.
167
+ const html = rawHtml.slice(0, 200_000);
163
168
  // Remove script, style, nav, header, footer
164
169
  let text = html
165
170
  .replace(/<script[\s\S]*?<\/script>/gi, '')