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.
- package/dist/cli/agent/loop.d.ts.map +1 -1
- package/dist/cli/agent/loop.js +18 -11
- package/dist/cli/agent/loop.js.map +1 -1
- package/dist/cli/agent/permissions.d.ts +16 -0
- package/dist/cli/agent/permissions.d.ts.map +1 -1
- package/dist/cli/agent/permissions.js +74 -5
- package/dist/cli/agent/permissions.js.map +1 -1
- package/dist/cli/agent/sandbox.d.ts.map +1 -1
- package/dist/cli/agent/sandbox.js +3 -0
- package/dist/cli/agent/sandbox.js.map +1 -1
- package/dist/cli/brain/archive.d.ts.map +1 -1
- package/dist/cli/brain/archive.js +48 -18
- package/dist/cli/brain/archive.js.map +1 -1
- package/dist/cli/brain/control-protocol.d.ts +17 -0
- package/dist/cli/brain/control-protocol.d.ts.map +1 -1
- package/dist/cli/brain/control-protocol.js +79 -0
- package/dist/cli/brain/control-protocol.js.map +1 -1
- package/dist/cli/brain/path-guard.d.ts +2 -0
- package/dist/cli/brain/path-guard.d.ts.map +1 -0
- package/dist/cli/brain/path-guard.js +94 -0
- package/dist/cli/brain/path-guard.js.map +1 -0
- package/dist/cli/brain/relay-client.d.ts +2 -0
- package/dist/cli/brain/relay-client.d.ts.map +1 -1
- package/dist/cli/brain/relay-client.js +58 -8
- package/dist/cli/brain/relay-client.js.map +1 -1
- package/dist/cli/brain/server.d.ts.map +1 -1
- package/dist/cli/brain/server.js +235 -23
- package/dist/cli/brain/server.js.map +1 -1
- package/dist/cli/brain/stdout-capture.d.ts +11 -0
- package/dist/cli/brain/stdout-capture.d.ts.map +1 -1
- package/dist/cli/brain/stdout-capture.js +42 -1
- package/dist/cli/brain/stdout-capture.js.map +1 -1
- package/dist/cli/brain/web-chat-handler.d.ts.map +1 -1
- package/dist/cli/brain/web-chat-handler.js +7 -0
- package/dist/cli/brain/web-chat-handler.js.map +1 -1
- package/dist/cli/checkpoints/revert.d.ts +5 -0
- package/dist/cli/checkpoints/revert.d.ts.map +1 -1
- package/dist/cli/checkpoints/revert.js +100 -11
- package/dist/cli/checkpoints/revert.js.map +1 -1
- package/dist/cli/checkpoints/store.d.ts +3 -0
- package/dist/cli/checkpoints/store.d.ts.map +1 -1
- package/dist/cli/checkpoints/store.js.map +1 -1
- package/dist/cli/commands/chat.d.ts.map +1 -1
- package/dist/cli/commands/chat.js +138 -73
- package/dist/cli/commands/chat.js.map +1 -1
- package/dist/cli/config/store.js +1 -1
- package/dist/cli/config/store.js.map +1 -1
- package/dist/cli/core/input.d.ts +0 -1
- package/dist/cli/core/input.d.ts.map +1 -1
- package/dist/cli/core/input.js +9 -17
- package/dist/cli/core/input.js.map +1 -1
- package/dist/cli/jarvis/autonomy.d.ts +13 -1
- package/dist/cli/jarvis/autonomy.d.ts.map +1 -1
- package/dist/cli/jarvis/autonomy.js +33 -1
- package/dist/cli/jarvis/autonomy.js.map +1 -1
- package/dist/cli/jarvis/core-ethics.d.ts +15 -0
- package/dist/cli/jarvis/core-ethics.d.ts.map +1 -1
- package/dist/cli/jarvis/core-ethics.js +110 -9
- package/dist/cli/jarvis/core-ethics.js.map +1 -1
- package/dist/cli/jarvis/daemon.d.ts.map +1 -1
- package/dist/cli/jarvis/daemon.js +8 -0
- package/dist/cli/jarvis/daemon.js.map +1 -1
- package/dist/cli/jarvis/instance-lock.d.ts.map +1 -1
- package/dist/cli/jarvis/instance-lock.js +132 -27
- package/dist/cli/jarvis/instance-lock.js.map +1 -1
- package/dist/cli/jarvis/learning.d.ts +6 -0
- package/dist/cli/jarvis/learning.d.ts.map +1 -1
- package/dist/cli/jarvis/learning.js +17 -3
- package/dist/cli/jarvis/learning.js.map +1 -1
- package/dist/cli/jarvis/notifications.d.ts.map +1 -1
- package/dist/cli/jarvis/notifications.js +75 -10
- package/dist/cli/jarvis/notifications.js.map +1 -1
- package/dist/cli/jarvis/onboarding.d.ts.map +1 -1
- package/dist/cli/jarvis/onboarding.js +32 -2
- package/dist/cli/jarvis/onboarding.js.map +1 -1
- package/dist/cli/jarvis/queue.d.ts +5 -0
- package/dist/cli/jarvis/queue.d.ts.map +1 -1
- package/dist/cli/jarvis/queue.js +23 -6
- package/dist/cli/jarvis/queue.js.map +1 -1
- package/dist/cli/jarvis/scheduler.d.ts +8 -0
- package/dist/cli/jarvis/scheduler.d.ts.map +1 -1
- package/dist/cli/jarvis/scheduler.js +32 -4
- package/dist/cli/jarvis/scheduler.js.map +1 -1
- package/dist/cli/jarvis/sentiment.d.ts +11 -0
- package/dist/cli/jarvis/sentiment.d.ts.map +1 -1
- package/dist/cli/jarvis/sentiment.js +40 -6
- package/dist/cli/jarvis/sentiment.js.map +1 -1
- package/dist/cli/jarvis/skills.d.ts +35 -0
- package/dist/cli/jarvis/skills.d.ts.map +1 -1
- package/dist/cli/jarvis/skills.js +144 -0
- package/dist/cli/jarvis/skills.js.map +1 -1
- package/dist/cli/jarvis/triggers.d.ts.map +1 -1
- package/dist/cli/jarvis/triggers.js +65 -9
- package/dist/cli/jarvis/triggers.js.map +1 -1
- package/dist/cli/jarvis/types.d.ts +10 -0
- package/dist/cli/jarvis/types.d.ts.map +1 -1
- package/dist/cli/jarvis/world-model.d.ts +4 -0
- package/dist/cli/jarvis/world-model.d.ts.map +1 -1
- package/dist/cli/jarvis/world-model.js +23 -1
- package/dist/cli/jarvis/world-model.js.map +1 -1
- package/dist/cli/providers/anthropic.d.ts +5 -1
- package/dist/cli/providers/anthropic.d.ts.map +1 -1
- package/dist/cli/providers/anthropic.js +133 -36
- package/dist/cli/providers/anthropic.js.map +1 -1
- package/dist/cli/providers/model-limits.d.ts +8 -0
- package/dist/cli/providers/model-limits.d.ts.map +1 -1
- package/dist/cli/providers/model-limits.js +42 -0
- package/dist/cli/providers/model-limits.js.map +1 -1
- package/dist/cli/providers/ollama.d.ts +2 -0
- package/dist/cli/providers/ollama.d.ts.map +1 -1
- package/dist/cli/providers/ollama.js +8 -0
- package/dist/cli/providers/ollama.js.map +1 -1
- package/dist/cli/providers/openai.d.ts +5 -1
- package/dist/cli/providers/openai.d.ts.map +1 -1
- package/dist/cli/providers/openai.js +66 -19
- package/dist/cli/providers/openai.js.map +1 -1
- package/dist/cli/providers/rate-limiter.d.ts +58 -20
- package/dist/cli/providers/rate-limiter.d.ts.map +1 -1
- package/dist/cli/providers/rate-limiter.js +212 -96
- package/dist/cli/providers/rate-limiter.js.map +1 -1
- package/dist/cli/providers/registry.d.ts.map +1 -1
- package/dist/cli/providers/registry.js +22 -13
- package/dist/cli/providers/registry.js.map +1 -1
- package/dist/cli/providers/types.d.ts +16 -5
- package/dist/cli/providers/types.d.ts.map +1 -1
- package/dist/spiral/cloud/content-extractor.d.ts.map +1 -1
- package/dist/spiral/cloud/content-extractor.js +6 -4
- package/dist/spiral/cloud/content-extractor.js.map +1 -1
- package/dist/spiral/cloud/search-provider.d.ts.map +1 -1
- package/dist/spiral/cloud/search-provider.js +7 -2
- package/dist/spiral/cloud/search-provider.js.map +1 -1
- package/dist/spiral/cloud/web-enricher.d.ts.map +1 -1
- package/dist/spiral/cloud/web-enricher.js +10 -2
- package/dist/spiral/cloud/web-enricher.js.map +1 -1
- package/dist/spiral/compression.d.ts +5 -2
- package/dist/spiral/compression.d.ts.map +1 -1
- package/dist/spiral/compression.js +23 -6
- package/dist/spiral/compression.js.map +1 -1
- package/dist/spiral/engine.d.ts +7 -1
- package/dist/spiral/engine.d.ts.map +1 -1
- package/dist/spiral/engine.js +83 -35
- package/dist/spiral/engine.js.map +1 -1
- package/dist/storage/database.d.ts.map +1 -1
- package/dist/storage/database.js +41 -0
- package/dist/storage/database.js.map +1 -1
- package/dist/storage/nodes.d.ts +6 -0
- package/dist/storage/nodes.d.ts.map +1 -1
- package/dist/storage/nodes.js +9 -0
- package/dist/storage/nodes.js.map +1 -1
- package/dist/storage/vectors.d.ts +1 -0
- package/dist/storage/vectors.d.ts.map +1 -1
- package/dist/storage/vectors.js +39 -7
- package/dist/storage/vectors.js.map +1 -1
- 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
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
*
|
|
27
|
-
*
|
|
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
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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') &&
|
|
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
|
-
/**
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
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(
|
|
158
|
-
|
|
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
|
-
}
|
|
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
|
|
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;
|
|
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
|
-
|
|
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
|
-
|
|
37
|
-
|
|
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":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
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
|
-
|
|
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
|
|
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,
|
|
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
|
-
|
|
12
|
-
const
|
|
13
|
-
const
|
|
14
|
-
const
|
|
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":"AAAA;;;;;GAKG;AAeH;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,OAAe,EACf,SAAiB,EACjB,KAAa;IAEb,MAAM,YAAY,GAAG,iBAAiB,CAAC,
|
|
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;
|
|
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(
|
|
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(
|
|
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, '')
|