replicas-engine 0.1.375 → 0.1.377

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 (2) hide show
  1. package/dist/src/index.js +200 -155
  2. package/package.json +2 -2
package/dist/src/index.js CHANGED
@@ -130,11 +130,190 @@ function detectLanguageByPath(filePath) {
130
130
  return EXT_TO_LANGUAGE[ext] ?? null;
131
131
  }
132
132
 
133
+ // ../shared/src/engine/types.ts
134
+ var DEFAULT_CHAT_TITLES = {
135
+ claude: "Claude Code",
136
+ codex: "Codex",
137
+ cursor: "Cursor",
138
+ opencode: "Opencode",
139
+ relay: "Relay"
140
+ };
141
+ var CLAUDE_OPUS_1M_MODEL = "opus[1m]";
142
+ var LEGACY_CLAUDE_OPUS_1M_MODEL = "opus-1m";
143
+ var CLAUDE_FABLE_5_MODEL = "claude-fable-5";
144
+ var CLAUDE_OPUS_4_8_MODEL = "claude-opus-4-8";
145
+ var CLAUDE_SONNET_5_MODEL = "claude-sonnet-5";
146
+ var CLAUDE_HAIKU_4_5_MODEL = "claude-haiku-4-5";
147
+ var CLAUDE_FABLE_5_BEDROCK_MODEL = "anthropic.claude-fable-5";
148
+ var CLAUDE_OPUS_4_8_BEDROCK_MODEL = "us.anthropic.claude-opus-4-8";
149
+ var CLAUDE_SONNET_5_BEDROCK_MODEL = "anthropic.claude-sonnet-5";
150
+ var CLAUDE_HAIKU_4_5_BEDROCK_MODEL = "us.anthropic.claude-haiku-4-5-20251001-v1:0";
151
+ var DEFAULT_CLAUDE_MODEL = CLAUDE_OPUS_4_8_MODEL;
152
+ var DEFAULT_CODEX_MODEL = "gpt-5.5";
153
+ var DEFAULT_CURSOR_MODEL = "composer-2.5";
154
+ var DEFAULT_OPENCODE_MODEL = "z-ai/glm-5.2";
155
+ function normalizeClaudeModel(model) {
156
+ if (model === "opus" || model === CLAUDE_OPUS_1M_MODEL || model === LEGACY_CLAUDE_OPUS_1M_MODEL) {
157
+ return DEFAULT_CLAUDE_MODEL;
158
+ }
159
+ if (model === "fable") {
160
+ return CLAUDE_FABLE_5_MODEL;
161
+ }
162
+ if (model === "sonnet") {
163
+ return CLAUDE_SONNET_5_MODEL;
164
+ }
165
+ if (model === "haiku") {
166
+ return CLAUDE_HAIKU_4_5_MODEL;
167
+ }
168
+ return model;
169
+ }
170
+ var CLAUDE_MODEL_CONTEXT_WINDOWS = {
171
+ [CLAUDE_FABLE_5_MODEL]: 1e6,
172
+ [CLAUDE_OPUS_4_8_MODEL]: 1e6,
173
+ [CLAUDE_SONNET_5_MODEL]: 1e6,
174
+ [CLAUDE_HAIKU_4_5_MODEL]: 2e5,
175
+ [CLAUDE_FABLE_5_BEDROCK_MODEL]: 1e6,
176
+ [CLAUDE_OPUS_4_8_BEDROCK_MODEL]: 1e6,
177
+ [CLAUDE_SONNET_5_BEDROCK_MODEL]: 1e6,
178
+ [CLAUDE_HAIKU_4_5_BEDROCK_MODEL]: 2e5,
179
+ "anthropic.claude-opus-4-8": 1e6,
180
+ "us.anthropic.claude-sonnet-5": 1e6,
181
+ "anthropic.claude-haiku-4-5": 2e5,
182
+ "claude-haiku-4-5-20251001": 2e5,
183
+ "claude-haiku-4-5@20251001": 2e5
184
+ };
185
+ function getClaudeModelContextWindow(model) {
186
+ if (!model) return null;
187
+ const normalized = normalizeClaudeModel(model) ?? model;
188
+ return CLAUDE_MODEL_CONTEXT_WINDOWS[normalized] ?? CLAUDE_MODEL_CONTEXT_WINDOWS[model] ?? null;
189
+ }
190
+ function canUseClaudeFastMode(model) {
191
+ return normalizeClaudeModel(model) === CLAUDE_OPUS_4_8_MODEL || model === "claude-opus-4-7";
192
+ }
193
+ var AGENT_MODELS = {
194
+ claude: [CLAUDE_FABLE_5_MODEL, DEFAULT_CLAUDE_MODEL, CLAUDE_SONNET_5_MODEL, CLAUDE_HAIKU_4_5_MODEL],
195
+ codex: [DEFAULT_CODEX_MODEL, "gpt-5.4", "gpt-5.4-mini", "gpt-5.3-codex", "gpt-5.2"],
196
+ cursor: [
197
+ CLAUDE_FABLE_5_MODEL,
198
+ CLAUDE_OPUS_4_8_MODEL,
199
+ "gpt-5.5",
200
+ "composer-2.5",
201
+ CLAUDE_SONNET_5_MODEL,
202
+ "claude-opus-4-7",
203
+ "gpt-5.4",
204
+ "gpt-5.4-mini",
205
+ "gpt-5.4-nano",
206
+ "gpt-5.3-codex",
207
+ "gpt-5.2",
208
+ "gpt-5.2-codex",
209
+ "gpt-5.1",
210
+ "gpt-5.1-codex-max",
211
+ "gpt-5.1-codex-mini",
212
+ "gpt-5-mini",
213
+ "gemini-3.1-pro",
214
+ "gemini-3-flash",
215
+ "grok-4.3",
216
+ CLAUDE_HAIKU_4_5_MODEL,
217
+ "kimi-k2.5"
218
+ ],
219
+ opencode: [DEFAULT_OPENCODE_MODEL, "minimax/minimax-m3", "xiaomi/mimo-v2.5-pro", "moonshotai/kimi-k2.6"],
220
+ relay: [CLAUDE_FABLE_5_MODEL, DEFAULT_CLAUDE_MODEL, CLAUDE_SONNET_5_MODEL]
221
+ };
222
+ var MODEL_LABELS = {
223
+ fable: "Fable 5",
224
+ [CLAUDE_FABLE_5_MODEL]: "Fable 5",
225
+ sonnet: "Sonnet 5",
226
+ "claude-sonnet-5": "Sonnet 5",
227
+ opus: "Opus 4.8",
228
+ [CLAUDE_OPUS_1M_MODEL]: "Opus 4.8 (1M)",
229
+ [LEGACY_CLAUDE_OPUS_1M_MODEL]: "Opus 4.8 (1M)",
230
+ haiku: "Haiku 4.5",
231
+ [DEFAULT_CODEX_MODEL]: "GPT-5.5",
232
+ [DEFAULT_OPENCODE_MODEL]: "GLM 5.2 via OpenRouter",
233
+ "minimax/minimax-m3": "MiniMax M3 via OpenRouter",
234
+ "xiaomi/mimo-v2.5-pro": "MiMo V2.5 Pro via OpenRouter",
235
+ "moonshotai/kimi-k2.6": "Kimi K2.6 via OpenRouter",
236
+ "gpt-5.4": "GPT-5.4",
237
+ "gpt-5.4-mini": "GPT-5.4 Mini",
238
+ "gpt-5.4-nano": "GPT-5.4 Nano",
239
+ "gpt-5.3-codex": "GPT-5.3 Codex",
240
+ "gpt-5.2": "GPT-5.2",
241
+ "gpt-5.2-codex": "GPT-5.2 Codex",
242
+ "gpt-5.1": "GPT-5.1",
243
+ "gpt-5.1-codex-max": "GPT-5.1 Codex Max",
244
+ "gpt-5.1-codex-mini": "GPT-5.1 Codex Mini",
245
+ "gpt-5-mini": "GPT-5 Mini",
246
+ "composer-2.5": "Composer 2.5",
247
+ [CLAUDE_OPUS_4_8_MODEL]: "Opus 4.8",
248
+ "claude-opus-4-7": "Opus 4.7",
249
+ [CLAUDE_HAIKU_4_5_MODEL]: "Haiku 4.5",
250
+ "gemini-3.1-pro": "Gemini 3.1 Pro",
251
+ "gemini-3-flash": "Gemini 3 Flash",
252
+ "grok-4.3": "Grok 4.3",
253
+ "kimi-k2.5": "Kimi K2.5"
254
+ };
255
+ var IMAGE_MEDIA_TYPES = ["image/png", "image/jpeg", "image/gif", "image/webp"];
256
+ var MAX_CANVAS_FILE_BYTES = 5 * 1024 * 1024;
257
+ function isCanvasTextKind(kind) {
258
+ return kind === "markdown" || kind === "html";
259
+ }
260
+ function sanitizeCanvasFilename(filename) {
261
+ const safe = filename.split(/[\\/]/).pop() ?? "";
262
+ if (!safe || safe !== filename || safe.startsWith(".")) return null;
263
+ return safe;
264
+ }
265
+ function bytesToBase64(bytes) {
266
+ let binary = "";
267
+ const chunkSize = 32768;
268
+ for (let i = 0; i < bytes.length; i += chunkSize) {
269
+ binary += String.fromCharCode(...bytes.subarray(i, i + chunkSize));
270
+ }
271
+ return btoa(binary);
272
+ }
273
+ function serializeCanvasContentResponse(input) {
274
+ const base = {
275
+ filename: input.filename,
276
+ kind: input.kind,
277
+ sizeBytes: input.sizeBytes,
278
+ mimeType: input.mimeType
279
+ };
280
+ if (isCanvasTextKind(input.kind)) {
281
+ return { ...base, content: new TextDecoder().decode(input.bytes) };
282
+ }
283
+ return { ...base, base64: bytesToBase64(input.bytes) };
284
+ }
285
+ var CANVAS_KIND_BY_EXTENSION = {
286
+ ".md": { kind: "markdown", mimeType: "text/markdown; charset=utf-8" },
287
+ ".markdown": { kind: "markdown", mimeType: "text/markdown; charset=utf-8" },
288
+ ".html": { kind: "html", mimeType: "text/html; charset=utf-8" },
289
+ ".htm": { kind: "html", mimeType: "text/html; charset=utf-8" },
290
+ ".png": { kind: "image", mimeType: "image/png" },
291
+ ".jpg": { kind: "image", mimeType: "image/jpeg" },
292
+ ".jpeg": { kind: "image", mimeType: "image/jpeg" },
293
+ ".gif": { kind: "image", mimeType: "image/gif" },
294
+ ".webp": { kind: "image", mimeType: "image/webp" },
295
+ ".svg": { kind: "image", mimeType: "image/svg+xml" },
296
+ ".mp4": { kind: "video", mimeType: "video/mp4" },
297
+ ".webm": { kind: "video", mimeType: "video/webm" },
298
+ ".mov": { kind: "video", mimeType: "video/quicktime" },
299
+ ".mp3": { kind: "audio", mimeType: "audio/mpeg" },
300
+ ".wav": { kind: "audio", mimeType: "audio/wav" },
301
+ ".ogg": { kind: "audio", mimeType: "audio/ogg" }
302
+ };
303
+ function classifyCanvasFilename(filename) {
304
+ const idx = filename.lastIndexOf(".");
305
+ const ext = idx === -1 ? "" : filename.slice(idx).toLowerCase();
306
+ return CANVAS_KIND_BY_EXTENSION[ext] ?? { kind: "other", mimeType: "application/octet-stream" };
307
+ }
308
+
133
309
  // ../shared/src/context-usage.ts
134
310
  var CODEX_CATEGORY_COLORS = {
135
311
  input: "#3eeba3",
136
312
  output: "#56b6c2"
137
313
  };
314
+ function numberOrNull(value) {
315
+ return typeof value === "number" && Number.isFinite(value) ? value : null;
316
+ }
138
317
  function clampPercentage(value) {
139
318
  if (!Number.isFinite(value)) return 0;
140
319
  if (value < 0) return 0;
@@ -148,6 +327,16 @@ function percentage(tokens, maxTokens) {
148
327
  function autoCompactThresholdField(autoCompactThreshold) {
149
328
  return typeof autoCompactThreshold === "number" && Number.isFinite(autoCompactThreshold) ? { autoCompactThreshold } : {};
150
329
  }
330
+ function normalizeAutoCompactThreshold(threshold, maxTokens) {
331
+ const value = numberOrNull(threshold);
332
+ if (value === null) return null;
333
+ if (value <= 0) return null;
334
+ if (value > 100) {
335
+ return maxTokens && maxTokens > 0 ? percentage(value, maxTokens) : null;
336
+ }
337
+ if (value > 0 && value <= 1) return clampPercentage(value * 100);
338
+ return clampPercentage(value);
339
+ }
151
340
  function clampTokensToWindow(rawTokens, maxTokens) {
152
341
  if (!maxTokens || maxTokens <= 0) return { totalTokens: rawTokens };
153
342
  if (rawTokens <= maxTokens) return { totalTokens: rawTokens };
@@ -295,7 +484,7 @@ var WORKSPACE_SIZES = ["small", "large"];
295
484
  var INVALID_WORKSPACE_SIZE_ERROR = `Invalid size: must be one of ${WORKSPACE_SIZES.join(", ")}`;
296
485
 
297
486
  // ../shared/src/e2b.ts
298
- var E2B_TEMPLATE_NAME = "replicas-sandbox-2026-07-01-v1";
487
+ var E2B_TEMPLATE_NAME = "replicas-sandbox-2026-07-01-v3";
299
488
 
300
489
  // ../shared/src/runtime-env.ts
301
490
  function parsePosixEnvFile(content) {
@@ -2244,154 +2433,6 @@ function isCodexAuthError(error) {
2244
2433
  // ../shared/src/engine/environment.ts
2245
2434
  var DESKTOP_NOVNC_PORT = 6080;
2246
2435
 
2247
- // ../shared/src/engine/types.ts
2248
- var DEFAULT_CHAT_TITLES = {
2249
- claude: "Claude Code",
2250
- codex: "Codex",
2251
- cursor: "Cursor",
2252
- opencode: "Opencode",
2253
- relay: "Relay"
2254
- };
2255
- var CLAUDE_OPUS_1M_MODEL = "opus[1m]";
2256
- var LEGACY_CLAUDE_OPUS_1M_MODEL = "opus-1m";
2257
- var CLAUDE_OPUS_4_8_MODEL = "claude-opus-4-8";
2258
- var CLAUDE_SONNET_5_MODEL = "claude-sonnet-5";
2259
- var CLAUDE_HAIKU_4_5_MODEL = "claude-haiku-4-5";
2260
- var CLAUDE_OPUS_4_8_BEDROCK_MODEL = "us.anthropic.claude-opus-4-8";
2261
- var CLAUDE_SONNET_5_BEDROCK_MODEL = "anthropic.claude-sonnet-5";
2262
- var CLAUDE_HAIKU_4_5_BEDROCK_MODEL = "us.anthropic.claude-haiku-4-5-20251001-v1:0";
2263
- var DEFAULT_CLAUDE_MODEL = CLAUDE_OPUS_4_8_MODEL;
2264
- var DEFAULT_CODEX_MODEL = "gpt-5.5";
2265
- var DEFAULT_CURSOR_MODEL = "composer-2.5";
2266
- var DEFAULT_OPENCODE_MODEL = "z-ai/glm-5.2";
2267
- function normalizeClaudeModel(model) {
2268
- if (model === "opus" || model === CLAUDE_OPUS_1M_MODEL || model === LEGACY_CLAUDE_OPUS_1M_MODEL) {
2269
- return DEFAULT_CLAUDE_MODEL;
2270
- }
2271
- if (model === "sonnet") {
2272
- return CLAUDE_SONNET_5_MODEL;
2273
- }
2274
- if (model === "haiku") {
2275
- return CLAUDE_HAIKU_4_5_MODEL;
2276
- }
2277
- return model;
2278
- }
2279
- function canUseClaudeFastMode(model) {
2280
- return normalizeClaudeModel(model) === CLAUDE_OPUS_4_8_MODEL || model === "claude-opus-4-7";
2281
- }
2282
- var AGENT_MODELS = {
2283
- claude: [DEFAULT_CLAUDE_MODEL, CLAUDE_SONNET_5_MODEL, CLAUDE_HAIKU_4_5_MODEL],
2284
- codex: [DEFAULT_CODEX_MODEL, "gpt-5.4", "gpt-5.4-mini", "gpt-5.3-codex", "gpt-5.2"],
2285
- cursor: [
2286
- CLAUDE_OPUS_4_8_MODEL,
2287
- "gpt-5.5",
2288
- "composer-2.5",
2289
- CLAUDE_SONNET_5_MODEL,
2290
- "claude-opus-4-7",
2291
- "gpt-5.4",
2292
- "gpt-5.4-mini",
2293
- "gpt-5.4-nano",
2294
- "gpt-5.3-codex",
2295
- "gpt-5.2",
2296
- "gpt-5.2-codex",
2297
- "gpt-5.1",
2298
- "gpt-5.1-codex-max",
2299
- "gpt-5.1-codex-mini",
2300
- "gpt-5-mini",
2301
- "gemini-3.1-pro",
2302
- "gemini-3-flash",
2303
- "grok-4.3",
2304
- CLAUDE_HAIKU_4_5_MODEL,
2305
- "kimi-k2.5"
2306
- ],
2307
- opencode: [DEFAULT_OPENCODE_MODEL, "minimax/minimax-m3", "xiaomi/mimo-v2.5-pro", "moonshotai/kimi-k2.6"],
2308
- relay: [DEFAULT_CLAUDE_MODEL, CLAUDE_SONNET_5_MODEL]
2309
- };
2310
- var MODEL_LABELS = {
2311
- sonnet: "Sonnet 5",
2312
- "claude-sonnet-5": "Sonnet 5",
2313
- opus: "Opus 4.8",
2314
- [CLAUDE_OPUS_1M_MODEL]: "Opus 4.8 (1M)",
2315
- [LEGACY_CLAUDE_OPUS_1M_MODEL]: "Opus 4.8 (1M)",
2316
- haiku: "Haiku 4.5",
2317
- [DEFAULT_CODEX_MODEL]: "GPT-5.5",
2318
- [DEFAULT_OPENCODE_MODEL]: "GLM 5.2 via OpenRouter",
2319
- "minimax/minimax-m3": "MiniMax M3 via OpenRouter",
2320
- "xiaomi/mimo-v2.5-pro": "MiMo V2.5 Pro via OpenRouter",
2321
- "moonshotai/kimi-k2.6": "Kimi K2.6 via OpenRouter",
2322
- "gpt-5.4": "GPT-5.4",
2323
- "gpt-5.4-mini": "GPT-5.4 Mini",
2324
- "gpt-5.4-nano": "GPT-5.4 Nano",
2325
- "gpt-5.3-codex": "GPT-5.3 Codex",
2326
- "gpt-5.2": "GPT-5.2",
2327
- "gpt-5.2-codex": "GPT-5.2 Codex",
2328
- "gpt-5.1": "GPT-5.1",
2329
- "gpt-5.1-codex-max": "GPT-5.1 Codex Max",
2330
- "gpt-5.1-codex-mini": "GPT-5.1 Codex Mini",
2331
- "gpt-5-mini": "GPT-5 Mini",
2332
- "composer-2.5": "Composer 2.5",
2333
- [CLAUDE_OPUS_4_8_MODEL]: "Opus 4.8",
2334
- "claude-opus-4-7": "Opus 4.7",
2335
- [CLAUDE_HAIKU_4_5_MODEL]: "Haiku 4.5",
2336
- "gemini-3.1-pro": "Gemini 3.1 Pro",
2337
- "gemini-3-flash": "Gemini 3 Flash",
2338
- "grok-4.3": "Grok 4.3",
2339
- "kimi-k2.5": "Kimi K2.5"
2340
- };
2341
- var IMAGE_MEDIA_TYPES = ["image/png", "image/jpeg", "image/gif", "image/webp"];
2342
- var MAX_CANVAS_FILE_BYTES = 5 * 1024 * 1024;
2343
- function isCanvasTextKind(kind) {
2344
- return kind === "markdown" || kind === "html";
2345
- }
2346
- function sanitizeCanvasFilename(filename) {
2347
- const safe = filename.split(/[\\/]/).pop() ?? "";
2348
- if (!safe || safe !== filename || safe.startsWith(".")) return null;
2349
- return safe;
2350
- }
2351
- function bytesToBase64(bytes) {
2352
- let binary = "";
2353
- const chunkSize = 32768;
2354
- for (let i = 0; i < bytes.length; i += chunkSize) {
2355
- binary += String.fromCharCode(...bytes.subarray(i, i + chunkSize));
2356
- }
2357
- return btoa(binary);
2358
- }
2359
- function serializeCanvasContentResponse(input) {
2360
- const base = {
2361
- filename: input.filename,
2362
- kind: input.kind,
2363
- sizeBytes: input.sizeBytes,
2364
- mimeType: input.mimeType
2365
- };
2366
- if (isCanvasTextKind(input.kind)) {
2367
- return { ...base, content: new TextDecoder().decode(input.bytes) };
2368
- }
2369
- return { ...base, base64: bytesToBase64(input.bytes) };
2370
- }
2371
- var CANVAS_KIND_BY_EXTENSION = {
2372
- ".md": { kind: "markdown", mimeType: "text/markdown; charset=utf-8" },
2373
- ".markdown": { kind: "markdown", mimeType: "text/markdown; charset=utf-8" },
2374
- ".html": { kind: "html", mimeType: "text/html; charset=utf-8" },
2375
- ".htm": { kind: "html", mimeType: "text/html; charset=utf-8" },
2376
- ".png": { kind: "image", mimeType: "image/png" },
2377
- ".jpg": { kind: "image", mimeType: "image/jpeg" },
2378
- ".jpeg": { kind: "image", mimeType: "image/jpeg" },
2379
- ".gif": { kind: "image", mimeType: "image/gif" },
2380
- ".webp": { kind: "image", mimeType: "image/webp" },
2381
- ".svg": { kind: "image", mimeType: "image/svg+xml" },
2382
- ".mp4": { kind: "video", mimeType: "video/mp4" },
2383
- ".webm": { kind: "video", mimeType: "video/webm" },
2384
- ".mov": { kind: "video", mimeType: "video/quicktime" },
2385
- ".mp3": { kind: "audio", mimeType: "audio/mpeg" },
2386
- ".wav": { kind: "audio", mimeType: "audio/wav" },
2387
- ".ogg": { kind: "audio", mimeType: "audio/ogg" }
2388
- };
2389
- function classifyCanvasFilename(filename) {
2390
- const idx = filename.lastIndexOf(".");
2391
- const ext = idx === -1 ? "" : filename.slice(idx).toLowerCase();
2392
- return CANVAS_KIND_BY_EXTENSION[ext] ?? { kind: "other", mimeType: "application/octet-stream" };
2393
- }
2394
-
2395
2436
  // ../shared/src/engine/v1.ts
2396
2437
  var MERGED_MESSAGE_SEPARATOR = "\n\n<!-- replicas:merged -->\n\n";
2397
2438
  function normalizeCodexAspTranscriptStatus(status, failed = false) {
@@ -6607,6 +6648,8 @@ function toClaudeCodeModel(model) {
6607
6648
  return model;
6608
6649
  }
6609
6650
  switch (normalizeClaudeModel(model)) {
6651
+ case CLAUDE_FABLE_5_MODEL:
6652
+ return CLAUDE_FABLE_5_BEDROCK_MODEL;
6610
6653
  case CLAUDE_OPUS_4_8_MODEL:
6611
6654
  return "opus";
6612
6655
  case CLAUDE_SONNET_5_MODEL:
@@ -7371,9 +7414,11 @@ var ClaudeManager = class _ClaudeManager extends CodingAgentManager {
7371
7414
  return this.systemPromptOverride ? "relay" : "claude";
7372
7415
  }
7373
7416
  buildContextUsagePayload(usage) {
7374
- const maxTokens = Number.isFinite(usage.maxTokens) ? usage.maxTokens : null;
7375
- const rawPercentage = Number.isFinite(usage.percentage) ? usage.percentage : maxTokens && maxTokens > 0 ? usage.totalTokens / maxTokens * 100 : 0;
7417
+ const reportedMaxTokens = Number.isFinite(usage.maxTokens) ? usage.maxTokens : null;
7418
+ const knownMaxTokens = getClaudeModelContextWindow(usage.model);
7419
+ const maxTokens = knownMaxTokens ?? reportedMaxTokens;
7376
7420
  const clamped = clampTokensToWindow(usage.totalTokens, maxTokens);
7421
+ const autoCompactThreshold = normalizeAutoCompactThreshold(usage.autoCompactThreshold, maxTokens);
7377
7422
  return {
7378
7423
  provider: this.getContextUsageProvider(),
7379
7424
  source: "claude_context",
@@ -7381,10 +7426,10 @@ var ClaudeManager = class _ClaudeManager extends CodingAgentManager {
7381
7426
  totalTokens: clamped.totalTokens,
7382
7427
  ...clamped.totalProcessedTokens !== void 0 ? { totalProcessedTokens: clamped.totalProcessedTokens } : {},
7383
7428
  maxTokens,
7384
- rawMaxTokens: Number.isFinite(usage.rawMaxTokens) ? usage.rawMaxTokens : maxTokens,
7385
- percentage: clampPercentage(rawPercentage),
7429
+ rawMaxTokens: knownMaxTokens ?? (Number.isFinite(usage.rawMaxTokens) ? usage.rawMaxTokens : maxTokens),
7430
+ percentage: percentage(clamped.totalTokens, maxTokens),
7386
7431
  compactsAutomatically: usage.isAutoCompactEnabled === true,
7387
- ...autoCompactThresholdField(usage.autoCompactThreshold),
7432
+ ...autoCompactThresholdField(autoCompactThreshold),
7388
7433
  categories: usage.categories.map((category) => ({
7389
7434
  name: category.name,
7390
7435
  tokens: category.tokens,
@@ -7783,7 +7828,7 @@ var AspClient = class {
7783
7828
  // src/managers/codex-asp/app-server-process.ts
7784
7829
  var DEFAULT_CODEX_BINARY = "codex";
7785
7830
  var DEFAULT_CODEX_ARGS = ["app-server", "--listen", "stdio://"];
7786
- var ENGINE_PACKAGE_VERSION = "0.1.375";
7831
+ var ENGINE_PACKAGE_VERSION = "0.1.377";
7787
7832
  var INITIALIZE_METHOD = "initialize";
7788
7833
  var INITIALIZED_NOTIFICATION = "initialized";
7789
7834
  var ACCOUNT_LOGIN_START_METHOD = "account/login/start";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "replicas-engine",
3
- "version": "0.1.375",
3
+ "version": "0.1.377",
4
4
  "description": "Lightweight API server for Replicas workspaces",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",
@@ -31,7 +31,7 @@
31
31
  "author": "Replicas",
32
32
  "license": "MIT",
33
33
  "dependencies": {
34
- "@anthropic-ai/claude-agent-sdk": "0.3.168",
34
+ "@anthropic-ai/claude-agent-sdk": "0.3.197",
35
35
  "@connectrpc/connect-node": "1.7.0",
36
36
  "@cursor/sdk": "1.0.19",
37
37
  "@hono/node-server": "^1.19.5",