replicas-engine 0.1.775 → 0.1.777

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.
@@ -5,11 +5,11 @@ import {
5
5
  getCodexAspHost,
6
6
  restartCodexAspHost,
7
7
  restartCodexAspHostIfRunning
8
- } from "./chunk-GGT6UJ6C.js";
9
- import "./chunk-Z57YNVDC.js";
10
- import "./chunk-OKJ44POW.js";
8
+ } from "./chunk-TAVWSPML.js";
9
+ import "./chunk-Z3ZWANDZ.js";
10
+ import "./chunk-FBTT74O7.js";
11
11
  import "./chunk-UZSNFLDQ.js";
12
- import "./chunk-TFTQG4KD.js";
12
+ import "./chunk-7WLA6QVZ.js";
13
13
  import "./chunk-VEQXQN22.js";
14
14
  export {
15
15
  getCodexAspHost,
@@ -492,7 +492,8 @@ var CREDENTIAL_TYPE = {
492
492
  ASTER_API_KEY: "aster_api_key",
493
493
  OPENROUTER_API_KEY: "openrouter_api_key",
494
494
  AI_GATEWAY_API_KEY: "ai_gateway_api_key",
495
- MUSE_OAUTH: "muse_oauth"
495
+ MUSE_OAUTH: "muse_oauth",
496
+ MUSE_API_KEY: "muse_api_key"
496
497
  };
497
498
  var INFERENCE_PROVIDER_LABELS = {
498
499
  [CREDENTIAL_METHOD.OPENCODE_GO]: "OpenCode Go",
@@ -525,7 +526,8 @@ var AGENT_CREDENTIAL_METHODS_IN_ORDER = {
525
526
  { method: CREDENTIAL_METHOD.AI_GATEWAY, credentialType: CREDENTIAL_TYPE.AI_GATEWAY_API_KEY }
526
527
  ],
527
528
  [AGENT.MUSE]: [
528
- { method: CREDENTIAL_METHOD.MUSE_OAUTH, credentialType: CREDENTIAL_TYPE.MUSE_OAUTH }
529
+ { method: CREDENTIAL_METHOD.MUSE_OAUTH, credentialType: CREDENTIAL_TYPE.MUSE_OAUTH },
530
+ { method: CREDENTIAL_METHOD.API_KEY, credentialType: CREDENTIAL_TYPE.MUSE_API_KEY }
529
531
  ],
530
532
  [AGENT.OPENCODE]: [
531
533
  { method: CREDENTIAL_METHOD.OPENCODE_GO, credentialType: CREDENTIAL_TYPE.OPENCODE_GO_API_KEY },
@@ -545,6 +547,7 @@ function getCredentialMethodLabel(agent, method) {
545
547
  case CREDENTIAL_METHOD.API_KEY:
546
548
  if (agent === AGENT.CODEX) return "OpenAI API key";
547
549
  if (agent === AGENT.CURSOR) return "Cursor API key";
550
+ if (agent === AGENT.MUSE) return "Muse API key";
548
551
  return "Anthropic API key";
549
552
  case CREDENTIAL_METHOD.OPENAI_COMPATIBLE:
550
553
  return "OpenAI-compatible endpoint";
@@ -5990,6 +5993,9 @@ var CODEX_CATEGORY_COLORS = {
5990
5993
  input: "#3eeba3",
5991
5994
  output: "#56b6c2"
5992
5995
  };
5996
+ function isRecord2(value) {
5997
+ return typeof value === "object" && value !== null;
5998
+ }
5993
5999
  function numberOrNull(value) {
5994
6000
  return typeof value === "number" && Number.isFinite(value) ? value : null;
5995
6001
  }
@@ -6069,6 +6075,123 @@ function buildCodexTokenUsageContextUsagePayload(usage) {
6069
6075
  updatedAt: usage.updatedAt
6070
6076
  };
6071
6077
  }
6078
+ function normalizeProvider(provider) {
6079
+ return provider === "relay" ? "relay" : provider;
6080
+ }
6081
+ function resolveClaudeContextWindow(provider, model, reportedMaxTokens) {
6082
+ if (provider !== "claude" && provider !== "relay") {
6083
+ return { maxTokens: reportedMaxTokens, usedKnownWindow: false };
6084
+ }
6085
+ const knownWindow = getClaudeModelContextWindow(model);
6086
+ return {
6087
+ maxTokens: knownWindow ?? reportedMaxTokens,
6088
+ usedKnownWindow: knownWindow !== null
6089
+ };
6090
+ }
6091
+ function coerceContextUsagePayload(payload, timestamp) {
6092
+ const provider = payload.provider;
6093
+ if (typeof provider !== "string" || !isValidAgentProvider(provider)) return null;
6094
+ const rawTotalTokens = numberOrNull(payload.totalTokens);
6095
+ const percentageValue = numberOrNull(payload.percentage);
6096
+ if (rawTotalTokens === null || percentageValue === null) {
6097
+ return null;
6098
+ }
6099
+ const model = typeof payload.model === "string" ? payload.model : null;
6100
+ const reportedMaxTokens = numberOrNull(payload.maxTokens);
6101
+ const { maxTokens, usedKnownWindow } = resolveClaudeContextWindow(provider, model, reportedMaxTokens);
6102
+ const rawMaxTokens = usedKnownWindow ? maxTokens : numberOrNull(payload.rawMaxTokens);
6103
+ const clamped = clampTokensToWindow(rawTotalTokens, maxTokens);
6104
+ const totalTokens = clamped.totalTokens;
6105
+ const payloadTotalProcessedTokens = numberOrNull(payload.totalProcessedTokens);
6106
+ const totalProcessedTokens = payloadTotalProcessedTokens !== null ? payloadTotalProcessedTokens : clamped.totalProcessedTokens ?? null;
6107
+ const source = payload.source === "codex_token_count" || payload.source === "claude_usage" || payload.source === "provider_usage" ? payload.source : "claude_context";
6108
+ const categories = Array.isArray(payload.categories) ? compactCategories(payload.categories.map((item) => {
6109
+ if (!isRecord2(item)) return null;
6110
+ const name = typeof item.name === "string" ? item.name : null;
6111
+ const tokens = numberOrNull(item.tokens);
6112
+ const categoryPercentage = numberOrNull(item.percentage);
6113
+ if (!name || tokens === null || categoryPercentage === null) return null;
6114
+ return {
6115
+ name,
6116
+ tokens,
6117
+ percentage: usedKnownWindow ? percentage(tokens, maxTokens) : categoryPercentage,
6118
+ ...typeof item.color === "string" ? { color: item.color } : {},
6119
+ ...typeof item.isDeferred === "boolean" ? { isDeferred: item.isDeferred } : {}
6120
+ };
6121
+ })) : [];
6122
+ const apiUsage = isRecord2(payload.apiUsage) ? {
6123
+ ...numberOrNull(payload.apiUsage.inputTokens) !== null ? { inputTokens: numberOrNull(payload.apiUsage.inputTokens) } : {},
6124
+ ...numberOrNull(payload.apiUsage.outputTokens) !== null ? { outputTokens: numberOrNull(payload.apiUsage.outputTokens) } : {},
6125
+ ...numberOrNull(payload.apiUsage.cacheCreationInputTokens) !== null ? { cacheCreationInputTokens: numberOrNull(payload.apiUsage.cacheCreationInputTokens) } : {},
6126
+ ...numberOrNull(payload.apiUsage.cacheReadInputTokens) !== null ? { cacheReadInputTokens: numberOrNull(payload.apiUsage.cacheReadInputTokens) } : {},
6127
+ ...numberOrNull(payload.apiUsage.cachedInputTokens) !== null ? { cachedInputTokens: numberOrNull(payload.apiUsage.cachedInputTokens) } : {},
6128
+ ...numberOrNull(payload.apiUsage.reasoningOutputTokens) !== null ? { reasoningOutputTokens: numberOrNull(payload.apiUsage.reasoningOutputTokens) } : {},
6129
+ ...numberOrNull(payload.apiUsage.totalTokens) !== null ? { totalTokens: numberOrNull(payload.apiUsage.totalTokens) } : {}
6130
+ } : null;
6131
+ const compactsAutomatically = typeof payload.compactsAutomatically === "boolean" ? payload.compactsAutomatically : void 0;
6132
+ const autoCompactThreshold = normalizeAutoCompactThreshold(payload.autoCompactThreshold, maxTokens);
6133
+ return {
6134
+ provider,
6135
+ source,
6136
+ ...model ? { model } : {},
6137
+ totalTokens,
6138
+ ...totalProcessedTokens !== null ? { totalProcessedTokens } : {},
6139
+ maxTokens,
6140
+ rawMaxTokens,
6141
+ percentage: usedKnownWindow ? percentage(totalTokens, maxTokens) : clampPercentage(percentageValue),
6142
+ ...compactsAutomatically !== void 0 ? { compactsAutomatically } : {},
6143
+ ...autoCompactThreshold !== null ? { autoCompactThreshold } : {},
6144
+ categories,
6145
+ apiUsage,
6146
+ updatedAt: typeof payload.updatedAt === "string" ? payload.updatedAt : timestamp
6147
+ };
6148
+ }
6149
+ function codexTokenCountToContextUsage(event) {
6150
+ const payload = event.payload;
6151
+ if (payload.type !== "token_count") return null;
6152
+ const info = isRecord2(payload.info) ? payload.info : null;
6153
+ if (!info) return null;
6154
+ const lastUsage = isRecord2(info.last_token_usage) ? info.last_token_usage : null;
6155
+ if (!lastUsage) return null;
6156
+ const totalUsage = isRecord2(info.total_token_usage) ? info.total_token_usage : null;
6157
+ const maxTokens = numberOrNull(info.model_context_window);
6158
+ const inputTokens = numberOrNull(lastUsage.input_tokens) ?? 0;
6159
+ const outputTokens = numberOrNull(lastUsage.output_tokens) ?? 0;
6160
+ const cumulativeTotalTokens = numberOrNull(totalUsage?.total_tokens);
6161
+ return buildCodexTokenUsageContextUsagePayload({
6162
+ last: {
6163
+ inputTokens,
6164
+ outputTokens,
6165
+ totalTokens: numberOrNull(lastUsage.total_tokens) ?? inputTokens + outputTokens,
6166
+ cachedInputTokens: numberOrNull(lastUsage.cached_input_tokens),
6167
+ reasoningOutputTokens: numberOrNull(lastUsage.reasoning_output_tokens)
6168
+ },
6169
+ total: cumulativeTotalTokens !== null ? { totalTokens: cumulativeTotalTokens } : null,
6170
+ modelContextWindow: maxTokens,
6171
+ updatedAt: event.timestamp
6172
+ });
6173
+ }
6174
+ function extractLatestContextUsage(events, provider) {
6175
+ if (!events || events.length === 0) return null;
6176
+ let latest = null;
6177
+ for (const event of events) {
6178
+ if (event.type === CONTEXT_USAGE_EVENT_TYPE) {
6179
+ const usage = coerceContextUsagePayload(event.payload, event.timestamp);
6180
+ if (usage && usage.provider === normalizeProvider(provider)) {
6181
+ latest = usage;
6182
+ }
6183
+ continue;
6184
+ }
6185
+ if (provider === "codex") {
6186
+ const usage = codexTokenCountToContextUsage(event);
6187
+ if (usage) {
6188
+ latest = usage;
6189
+ }
6190
+ continue;
6191
+ }
6192
+ }
6193
+ return latest;
6194
+ }
6072
6195
 
6073
6196
  // ../shared/src/pricing.ts
6074
6197
  var AUTOMATED_SOURCES = ["api", "automation"];
@@ -6384,7 +6507,7 @@ var MAX_WARM_HOOK_TIMEOUT_MS = 120 * 60 * 1e3;
6384
6507
  var DEFAULT_START_HOOK_TIMEOUT_MS = 5 * 60 * 1e3;
6385
6508
  var DEFAULT_HOOK_OUTPUT_PREVIEW_CHARS = 1e5;
6386
6509
  var HOOK_EXEC_MAX_BUFFER_BYTES = 10 * 1024 * 1024;
6387
- function isRecord2(value) {
6510
+ function isRecord3(value) {
6388
6511
  return typeof value === "object" && value !== null;
6389
6512
  }
6390
6513
  function clampWarmHookTimeoutMs(timeoutMs) {
@@ -6416,7 +6539,7 @@ function parseWarmHookConfig(value, filename = "replicas.json") {
6416
6539
  if (typeof value === "string") {
6417
6540
  return value;
6418
6541
  }
6419
- if (!isRecord2(value)) {
6542
+ if (!isRecord3(value)) {
6420
6543
  throw new Error(`Invalid ${filename}: "warmHook" must be a string or object`);
6421
6544
  }
6422
6545
  if (!Array.isArray(value.commands) || !value.commands.every((entry) => typeof entry === "string")) {
@@ -6443,11 +6566,11 @@ function resolveWarmHookConfig(value) {
6443
6566
 
6444
6567
  // ../shared/src/replicas-config.ts
6445
6568
  var REPLICAS_CONFIG_FILENAMES = ["replicas.json", "replicas.yaml", "replicas.yml"];
6446
- function isRecord3(value) {
6569
+ function isRecord4(value) {
6447
6570
  return typeof value === "object" && value !== null;
6448
6571
  }
6449
6572
  function parseReplicasConfig(value, filename = "replicas.json") {
6450
- if (!isRecord3(value)) {
6573
+ if (!isRecord4(value)) {
6451
6574
  throw new Error(`Invalid ${filename}: expected an object`);
6452
6575
  }
6453
6576
  const config = {};
@@ -6464,7 +6587,7 @@ function parseReplicasConfig(value, filename = "replicas.json") {
6464
6587
  config.systemPrompt = value.systemPrompt;
6465
6588
  }
6466
6589
  if ("startHook" in value) {
6467
- if (!isRecord3(value.startHook)) {
6590
+ if (!isRecord4(value.startHook)) {
6468
6591
  throw new Error(`Invalid ${filename}: "startHook" must be an object with "commands" array`);
6469
6592
  }
6470
6593
  const { commands, timeout, separate } = value.startHook;
@@ -7626,6 +7749,7 @@ export {
7626
7749
  normalizeAutoCompactThreshold,
7627
7750
  clampTokensToWindow,
7628
7751
  buildCodexTokenUsageContextUsagePayload,
7752
+ extractLatestContextUsage,
7629
7753
  fetchModelsDevCatalog,
7630
7754
  SANDBOX_PATHS,
7631
7755
  REPLICAS_RUNTIME_ENV_ALIASES,
@@ -3,12 +3,12 @@ import { createRequire as __createRequire } from 'node:module';
3
3
  const require = __createRequire(import.meta.url);
4
4
  import {
5
5
  monolithRequest
6
- } from "./chunk-Z57YNVDC.js";
6
+ } from "./chunk-Z3ZWANDZ.js";
7
7
  import {
8
8
  extractCommandProtectionCommandText,
9
9
  findGitCommitSignals,
10
10
  findPrMergeSignals
11
- } from "./chunk-TFTQG4KD.js";
11
+ } from "./chunk-7WLA6QVZ.js";
12
12
 
13
13
  // src/services/command-protection-service.ts
14
14
  var DEFAULT_COMMAND_PROTECTION_BLOCK_MESSAGE = "Blocked by Replicas command protection.";
@@ -4,7 +4,7 @@ const require = __createRequire(import.meta.url);
4
4
  import {
5
5
  HOOK_EXEC_MAX_BUFFER_BYTES,
6
6
  isVersionBelow
7
- } from "./chunk-TFTQG4KD.js";
7
+ } from "./chunk-7WLA6QVZ.js";
8
8
 
9
9
  // src/utils/codex-agent-env.ts
10
10
  function buildCodexAgentEnv(source = process.env) {
@@ -241,7 +241,7 @@ var DEFAULT_CODEX_ARGS = [
241
241
  var MIN_CODEX_CLI_VERSION = "0.153.3";
242
242
  var CODEX_UPGRADE_TIMEOUT_MS = 12e4;
243
243
  var codexCliVersionEnsured = null;
244
- var ENGINE_PACKAGE_VERSION = "0.1.775";
244
+ var ENGINE_PACKAGE_VERSION = "0.1.777";
245
245
  var INITIALIZE_METHOD = "initialize";
246
246
  var INITIALIZED_NOTIFICATION = "initialized";
247
247
  var ACCOUNT_LOGIN_START_METHOD = "account/login/start";
@@ -5,18 +5,18 @@ import {
5
5
  ENGINE_ENV,
6
6
  monolithRequest,
7
7
  setAgentCredentialSnapshot
8
- } from "./chunk-Z57YNVDC.js";
8
+ } from "./chunk-Z3ZWANDZ.js";
9
9
  import {
10
10
  AppServerProcess,
11
11
  buildCodexAgentEnv
12
- } from "./chunk-OKJ44POW.js";
12
+ } from "./chunk-FBTT74O7.js";
13
13
  import {
14
14
  CODEX_AUTH_ENV_KEYS,
15
15
  CODEX_AUTH_ENV_KEYS_BY_METHOD,
16
16
  codexAuthEnvFromResponse,
17
17
  createErrorResult,
18
18
  createSuccessResult
19
- } from "./chunk-TFTQG4KD.js";
19
+ } from "./chunk-7WLA6QVZ.js";
20
20
 
21
21
  // src/managers/codex-token-manager.ts
22
22
  import { promises as fs } from "fs";
@@ -232,7 +232,7 @@ var CodexTokenManager = class extends BaseRefreshManager {
232
232
  const data = await response.json();
233
233
  await this.applyCredentialsResponse(data);
234
234
  if (restartOnChange && CODEX_AUTH_ENV_KEYS.some((key, index) => process.env[key] !== previousEnv[index])) {
235
- const { restartCodexAspHostIfRunning: restartCodexAspHostIfRunning2 } = await import("./asp-host-U2OGXHF3.js");
235
+ const { restartCodexAspHostIfRunning: restartCodexAspHostIfRunning2 } = await import("./asp-host-FXW7JIC6.js");
236
236
  await restartCodexAspHostIfRunning2();
237
237
  }
238
238
  if (data.scope) {
@@ -4,7 +4,7 @@ const require = __createRequire(import.meta.url);
4
4
  import {
5
5
  findCodeHostPullRequestUrls,
6
6
  mayCreatePullRequest
7
- } from "./chunk-TFTQG4KD.js";
7
+ } from "./chunk-7WLA6QVZ.js";
8
8
 
9
9
  // src/services/post-tool-pr-notifier.ts
10
10
  async function notifyPostToolUse(toolName, toolInput, toolResult) {
@@ -15,7 +15,7 @@ import {
15
15
  isValidRelayBaseProvider,
16
16
  parsePosixEnvFile,
17
17
  readReplicasRuntimeEnv
18
- } from "./chunk-TFTQG4KD.js";
18
+ } from "./chunk-7WLA6QVZ.js";
19
19
 
20
20
  // src/engine-env.ts
21
21
  import { readFileSync as readFileSync2 } from "fs";
@@ -89,6 +89,9 @@ function parseCodexAuthMethod(value) {
89
89
  }
90
90
  return void 0;
91
91
  }
92
+ function parseMuseAuthMethod(value) {
93
+ return value === "oauth" || value === "api_key" ? value : void 0;
94
+ }
92
95
  function parseAgentCredentialSnapshots(value) {
93
96
  if (!value) return {};
94
97
  try {
@@ -142,6 +145,7 @@ function loadEngineEnv() {
142
145
  ANTHROPIC_SMALL_FAST_MODEL_AWS_REGION: readEnv("ANTHROPIC_SMALL_FAST_MODEL_AWS_REGION"),
143
146
  REPLICAS_CLAUDE_AUTH_METHOD: parseClaudeAuthMethod(readEnv("REPLICAS_CLAUDE_AUTH_METHOD")),
144
147
  REPLICAS_CODEX_AUTH_METHOD: parseCodexAuthMethod(readEnv("REPLICAS_CODEX_AUTH_METHOD")),
148
+ REPLICAS_MUSE_AUTH_METHOD: parseMuseAuthMethod(readEnv("REPLICAS_MUSE_AUTH_METHOD")),
145
149
  REPLICAS_AGENT_CREDENTIALS: parseAgentCredentialSnapshots(readEnv("REPLICAS_AGENT_CREDENTIALS")),
146
150
  REPLICAS_ENV_SYSTEM_PROMPT: readEnv("REPLICAS_ENV_SYSTEM_PROMPT"),
147
151
  REPLICAS_ENV_START_HOOK: readEnv("REPLICAS_ENV_START_HOOK"),
@@ -3,12 +3,12 @@ import { createRequire as __createRequire } from 'node:module';
3
3
  const require = __createRequire(import.meta.url);
4
4
  import {
5
5
  evaluateCommandProtection
6
- } from "./chunk-LPIM74UP.js";
7
- import "./chunk-Z57YNVDC.js";
6
+ } from "./chunk-DTXZFR5B.js";
7
+ import "./chunk-Z3ZWANDZ.js";
8
8
  import {
9
9
  isRecord
10
10
  } from "./chunk-UZSNFLDQ.js";
11
- import "./chunk-TFTQG4KD.js";
11
+ import "./chunk-7WLA6QVZ.js";
12
12
  import "./chunk-VEQXQN22.js";
13
13
 
14
14
  // src/command-protection-hook.ts
@@ -3,13 +3,13 @@ import { createRequire as __createRequire } from 'node:module';
3
3
  const require = __createRequire(import.meta.url);
4
4
  import {
5
5
  evaluateCommandProtection
6
- } from "./chunk-LPIM74UP.js";
6
+ } from "./chunk-DTXZFR5B.js";
7
7
  import {
8
8
  notifyPostToolUse
9
- } from "./chunk-SNVON4L7.js";
10
- import "./chunk-Z57YNVDC.js";
9
+ } from "./chunk-XAJWJBND.js";
10
+ import "./chunk-Z3ZWANDZ.js";
11
11
  import "./chunk-UZSNFLDQ.js";
12
- import "./chunk-TFTQG4KD.js";
12
+ import "./chunk-7WLA6QVZ.js";
13
13
  import "./chunk-VEQXQN22.js";
14
14
 
15
15
  // src/deepseek-command-protection-plugin.ts
@@ -8,12 +8,12 @@ import {
8
8
  import {
9
9
  AppServerProcess,
10
10
  buildCodexAgentEnv
11
- } from "./chunk-OKJ44POW.js";
11
+ } from "./chunk-FBTT74O7.js";
12
12
  import {
13
13
  AGENT,
14
14
  getMemoryOutputSafetyViolation,
15
15
  headlessAgentRequestSchema
16
- } from "./chunk-TFTQG4KD.js";
16
+ } from "./chunk-7WLA6QVZ.js";
17
17
  import "./chunk-VEQXQN22.js";
18
18
 
19
19
  // src/headless-agent.ts
package/dist/src/index.js CHANGED
@@ -91,7 +91,7 @@ import {
91
91
  evaluateCommandProtection,
92
92
  extractToolCommand,
93
93
  reportCommandProtectionBlock
94
- } from "./chunk-LPIM74UP.js";
94
+ } from "./chunk-DTXZFR5B.js";
95
95
  import {
96
96
  ACCOUNT_RATE_LIMITS_UPDATED_METHOD,
97
97
  AGENT_MESSAGE_DELTA_METHOD,
@@ -124,20 +124,20 @@ import {
124
124
  recordCredentialFallback,
125
125
  recordExhaustedCredential,
126
126
  restartCodexAspHost
127
- } from "./chunk-GGT6UJ6C.js";
127
+ } from "./chunk-TAVWSPML.js";
128
128
  import {
129
129
  ENGINE_ENV,
130
130
  IS_WARMING_MODE,
131
131
  monolithRequest,
132
132
  monolithService,
133
133
  setAgentCredentialSnapshot
134
- } from "./chunk-Z57YNVDC.js";
134
+ } from "./chunk-Z3ZWANDZ.js";
135
135
  import {
136
136
  AspClient,
137
137
  SUBPROCESS_MAX_BUFFER,
138
138
  execAsync,
139
139
  execFileAsync
140
- } from "./chunk-OKJ44POW.js";
140
+ } from "./chunk-FBTT74O7.js";
141
141
  import {
142
142
  isRecord as isRecord2
143
143
  } from "./chunk-UZSNFLDQ.js";
@@ -252,6 +252,7 @@ import {
252
252
  detectLanguageByPath,
253
253
  excludeQueuedAcceptedEvents,
254
254
  extractErrorText,
255
+ extractLatestContextUsage,
255
256
  extractToolResultText,
256
257
  fetchAiGatewayModels,
257
258
  fetchModelsDevCatalog,
@@ -337,7 +338,7 @@ import {
337
338
  spawnRelaySubagentRequestSchema,
338
339
  stripAgentDiagnosticErrors,
339
340
  withTimeout
340
- } from "./chunk-TFTQG4KD.js";
341
+ } from "./chunk-7WLA6QVZ.js";
341
342
  import {
342
343
  __commonJS,
343
344
  __export,
@@ -9771,7 +9772,10 @@ function detectAgentAuthMethod(provider) {
9771
9772
  case AGENT.KIMI:
9772
9773
  return ENGINE_ENV.AI_GATEWAY_API_KEY ? "api_key" : "none";
9773
9774
  case AGENT.MUSE:
9774
- return existsSync2(MUSE_AUTH_PATH) ? "oauth" : "none";
9775
+ if (!existsSync2(MUSE_AUTH_PATH)) return "none";
9776
+ if (ENGINE_ENV.REPLICAS_AGENT_CREDENTIALS.muse?.method === "api_key") return "api_key";
9777
+ if (ENGINE_ENV.REPLICAS_AGENT_CREDENTIALS.muse?.method === "muse-oauth") return "oauth";
9778
+ return ENGINE_ENV.REPLICAS_MUSE_AUTH_METHOD ?? "oauth";
9775
9779
  case AGENT.OPENCODE:
9776
9780
  return existsSync2(OPENCODE_AUTH_PATH) ? "api_key" : "none";
9777
9781
  case AGENT.PI:
@@ -10652,7 +10656,7 @@ import { join as join37 } from "path";
10652
10656
  import { randomUUID as randomUUID13 } from "crypto";
10653
10657
 
10654
10658
  // ../shared/src/workspace-chat.ts
10655
- var WORKSPACE_CHATS_QUERY_SCHEMA_VERSION = 2;
10659
+ var WORKSPACE_CHATS_QUERY_SCHEMA_VERSION = 3;
10656
10660
  var WORKSPACE_CHATS_QUERY_ROOT = `workspace-chats:v${WORKSPACE_CHATS_QUERY_SCHEMA_VERSION}`;
10657
10661
  function isAcceptedUserMessage(event) {
10658
10662
  return getUserMessage(event) !== null && event.payload.source === ACCEPTED_USER_MESSAGE_SOURCE;
@@ -11318,7 +11322,7 @@ var MuseTokenManager = class extends BaseRefreshManager {
11318
11322
  allowedMethods,
11319
11323
  refresh: async (exclusions) => {
11320
11324
  const request = {
11321
- failedMethod: CREDENTIAL_METHOD.MUSE_OAUTH,
11325
+ failedMethod: failedCredential?.method === CREDENTIAL_METHOD.API_KEY ? CREDENTIAL_METHOD.API_KEY : CREDENTIAL_METHOD.MUSE_OAUTH,
11322
11326
  ...failedCredential ? { failedCredential } : {},
11323
11327
  failureReason,
11324
11328
  failureKind,
@@ -61365,6 +61369,7 @@ function normalizePersistedChat(chat) {
61365
61369
  return {
61366
61370
  id: chat.id,
61367
61371
  provider: chat.provider,
61372
+ ...typeof chat.model === "string" && chat.model ? { model: chat.model } : {},
61368
61373
  ...chat.provider === "relay" ? { relayBaseProvider: getChatExecutionProvider(chat) } : {},
61369
61374
  title: chat.title,
61370
61375
  createdAt: chat.createdAt,
@@ -61602,9 +61607,14 @@ var ChatService = class {
61602
61607
  const accepting2 = chat.acceptingSendResponses.get(idempotencyKey);
61603
61608
  if (accepting2) return accepting2;
61604
61609
  }
61610
+ const previousAcceptance = chat.lastSendAcceptance;
61605
61611
  const accepting = (async () => {
61606
61612
  chat.acceptingMessages += 1;
61607
61613
  try {
61614
+ await previousAcceptance?.catch(() => {
61615
+ });
61616
+ const savedModel = chat.persisted.model ?? (!request.model ? extractLatestContextUsage((await chat.provider.getHistory()).events, getChatExecutionProvider(chat.persisted))?.model : void 0);
61617
+ request = { ...request, model: request.model ?? savedModel ?? void 0 };
61608
61618
  return await chat.provider.enqueueMessage(
61609
61619
  request,
61610
61620
  (result, acceptedMessage) => this.handleMessageAccepted(
@@ -61619,6 +61629,7 @@ var ChatService = class {
61619
61629
  chat.acceptingMessages -= 1;
61620
61630
  }
61621
61631
  })();
61632
+ chat.lastSendAcceptance = accepting;
61622
61633
  if (!idempotencyKey) return accepting;
61623
61634
  chat.acceptingSendResponses.set(idempotencyKey, accepting);
61624
61635
  try {
@@ -61646,6 +61657,7 @@ var ChatService = class {
61646
61657
  const previousAcceptedEvent = chat.acceptedUserEvents.get(result.messageId);
61647
61658
  const previousPersistedResponses = chat.persisted.acceptedSendResponses;
61648
61659
  const previousLastMessageText = chat.persisted.lastMessageText;
61660
+ const previousModel = chat.persisted.model;
61649
61661
  const previousUpdatedAt = chat.persisted.updatedAt;
61650
61662
  const idempotencyKey = request.idempotencyKey ?? request.messageId;
61651
61663
  if (idempotencyKey) {
@@ -61663,6 +61675,7 @@ var ChatService = class {
61663
61675
  chat.acceptedUserEvents.set(result.messageId, acceptedEvent);
61664
61676
  }
61665
61677
  chat.persisted.lastMessageText = request.message.trim().slice(0, LAST_MESSAGE_PREVIEW_MAX) || null;
61678
+ chat.persisted.model = acceptedMessage.model ?? previousModel;
61666
61679
  chat.persisted.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
61667
61680
  try {
61668
61681
  await this.persistAllChats();
@@ -61676,6 +61689,7 @@ var ChatService = class {
61676
61689
  else chat.acceptedUserEvents.delete(result.messageId);
61677
61690
  chat.persisted.acceptedSendResponses = previousPersistedResponses;
61678
61691
  chat.persisted.lastMessageText = previousLastMessageText;
61692
+ chat.persisted.model = previousModel;
61679
61693
  chat.persisted.updatedAt = previousUpdatedAt;
61680
61694
  throw new ChatMessagePersistenceError(error);
61681
61695
  }
@@ -61698,6 +61712,9 @@ var ChatService = class {
61698
61712
  ...recordedSender ? { sender: recordedSender } : {}
61699
61713
  }
61700
61714
  });
61715
+ if (chat.persisted.model !== previousModel) {
61716
+ await this.publish({ type: "chat.updated", payload: { chat: this.toSummary(chat) } });
61717
+ }
61701
61718
  }
61702
61719
  async appendSender(chatId, sender) {
61703
61720
  try {
@@ -62292,6 +62309,7 @@ var ChatService = class {
62292
62309
  return {
62293
62310
  id: chat.persisted.id,
62294
62311
  provider: chat.persisted.provider,
62312
+ model: chat.persisted.model,
62295
62313
  ...chat.persisted.provider === "relay" ? { relayBaseProvider: getChatExecutionProvider(chat.persisted) } : {},
62296
62314
  title: chat.persisted.title,
62297
62315
  createdAt: chat.persisted.createdAt,
@@ -3,11 +3,11 @@ import { createRequire as __createRequire } from 'node:module';
3
3
  const require = __createRequire(import.meta.url);
4
4
  import {
5
5
  notifyPostToolUse
6
- } from "./chunk-SNVON4L7.js";
6
+ } from "./chunk-XAJWJBND.js";
7
7
  import {
8
8
  isRecord
9
9
  } from "./chunk-UZSNFLDQ.js";
10
- import "./chunk-TFTQG4KD.js";
10
+ import "./chunk-7WLA6QVZ.js";
11
11
  import "./chunk-VEQXQN22.js";
12
12
 
13
13
  // src/post-tool-pr-hook.ts
@@ -4,7 +4,7 @@ const require = __createRequire(import.meta.url);
4
4
  import {
5
5
  messageRelaySubagentRequestSchema,
6
6
  spawnRelaySubagentRequestSchema
7
- } from "./chunk-TFTQG4KD.js";
7
+ } from "./chunk-7WLA6QVZ.js";
8
8
  import "./chunk-VEQXQN22.js";
9
9
 
10
10
  // src/relay-mcp.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "replicas-engine",
3
- "version": "0.1.775",
3
+ "version": "0.1.777",
4
4
  "description": "Lightweight API server for Replicas workspaces",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",