replicas-engine 0.1.1291 → 0.1.1293

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.
@@ -8,12 +8,12 @@ import {
8
8
  listRunningCodexModels,
9
9
  restartCodexAspHost,
10
10
  restartCodexAspHostIfRunning
11
- } from "./chunk-YGYYGLWA.js";
12
- import "./chunk-THUCGBYF.js";
13
- import "./chunk-3IVAKSKY.js";
14
- import "./chunk-3DNCWVQY.js";
11
+ } from "./chunk-FI7FILEX.js";
12
+ import "./chunk-5MO5TWHJ.js";
13
+ import "./chunk-6C472IYE.js";
14
+ import "./chunk-CYBM2QOH.js";
15
15
  import "./chunk-UZSNFLDQ.js";
16
- import "./chunk-2G5ZU67U.js";
16
+ import "./chunk-BG4HQ56D.js";
17
17
  import "./chunk-VEQXQN22.js";
18
18
  export {
19
19
  CODEX_ULTRAFAST_SERVICE_TIER,
@@ -4,7 +4,7 @@ const require = __createRequire(import.meta.url);
4
4
  import {
5
5
  SUBPROCESS_MAX_BUFFER,
6
6
  execFileAsync
7
- } from "./chunk-3DNCWVQY.js";
7
+ } from "./chunk-CYBM2QOH.js";
8
8
  import {
9
9
  isRecord as isRecord2
10
10
  } from "./chunk-UZSNFLDQ.js";
@@ -22,7 +22,7 @@ import {
22
22
  provisionedDeviceSchema,
23
23
  readReplicasRuntimeEnv,
24
24
  serializePosixEnvFile
25
- } from "./chunk-2G5ZU67U.js";
25
+ } from "./chunk-BG4HQ56D.js";
26
26
 
27
27
  // src/runtime-env-loader.ts
28
28
  import { readFileSync } from "fs";
@@ -3,10 +3,10 @@ import { createRequire as __createRequire } from 'node:module';
3
3
  const require = __createRequire(import.meta.url);
4
4
  import {
5
5
  execFileAsync
6
- } from "./chunk-3DNCWVQY.js";
6
+ } from "./chunk-CYBM2QOH.js";
7
7
  import {
8
8
  isVersionBelow
9
- } from "./chunk-2G5ZU67U.js";
9
+ } from "./chunk-BG4HQ56D.js";
10
10
 
11
11
  // src/utils/codex-agent-env.ts
12
12
  function buildCodexAgentEnv(source = process.env) {
@@ -240,7 +240,7 @@ function getCodexModelProvider(method) {
240
240
  if (method === "foundry") return "azure";
241
241
  return method === "ollama" || method === "openai-compatible" ? "replicas_openai_compatible" : "openai";
242
242
  }
243
- var ENGINE_PACKAGE_VERSION = "0.1.1291";
243
+ var ENGINE_PACKAGE_VERSION = "0.1.1293";
244
244
  var INITIALIZE_METHOD = "initialize";
245
245
  var INITIALIZED_NOTIFICATION = "initialized";
246
246
  var ACCOUNT_LOGIN_START_METHOD = "account/login/start";
@@ -3,7 +3,7 @@ import { createRequire as __createRequire } from 'node:module';
3
3
  const require = __createRequire(import.meta.url);
4
4
  import {
5
5
  AspClient
6
- } from "./chunk-3IVAKSKY.js";
6
+ } from "./chunk-6C472IYE.js";
7
7
  import {
8
8
  ASTER_BASE_URL,
9
9
  ASTER_PROVIDER,
@@ -15,7 +15,7 @@ import {
15
15
  isRecord,
16
16
  readOllamaAuthEnv,
17
17
  readOpenAICompatibleAuthEnv
18
- } from "./chunk-2G5ZU67U.js";
18
+ } from "./chunk-BG4HQ56D.js";
19
19
 
20
20
  // src/managers/codex-asp/notification-dispatch.ts
21
21
  var TURN_STARTED_METHOD = "turn/started";
@@ -271,6 +271,7 @@ var WEB_APP_PATHS = {
271
271
  integrations: `${DASHBOARD_PATH}/integrations`,
272
272
  integrationsGithub: `${DASHBOARD_PATH}/integrations/github`,
273
273
  integrationsGitlab: `${DASHBOARD_PATH}/integrations/gitlab`,
274
+ integrationsSlack: `${DASHBOARD_PATH}/integrations/slack`,
274
275
  settings: `${DASHBOARD_PATH}/settings`,
275
276
  billing: `${DASHBOARD_PATH}/billing`,
276
277
  members: `${DASHBOARD_PATH}/members`,
@@ -7506,6 +7507,7 @@ function coerceClaudeResultPayload(payload) {
7506
7507
  is_error: typeof payload.is_error === "boolean" ? payload.is_error : void 0,
7507
7508
  subtype: typeof payload.subtype === "string" ? payload.subtype : void 0,
7508
7509
  errors: Array.isArray(payload.errors) ? payload.errors.filter((e) => typeof e === "string") : void 0,
7510
+ result: typeof payload.result === "string" ? payload.result : void 0,
7509
7511
  terminal_reason: typeof payload.terminal_reason === "string" ? payload.terminal_reason : void 0
7510
7512
  };
7511
7513
  }
@@ -7859,7 +7861,7 @@ function parseClaudeEvents(events, parentToolUseId) {
7859
7861
  messages.push({
7860
7862
  id: `error-${event.timestamp}`,
7861
7863
  type: "error",
7862
- message: genuineErrors.length > 0 ? genuineErrors.join("\n") : "Claude session encountered an unexpected error.",
7864
+ message: genuineErrors.length > 0 ? genuineErrors.join("\n") : payload.result || "Claude session encountered an unexpected error.",
7863
7865
  timestamp: event.timestamp
7864
7866
  });
7865
7867
  }
@@ -3,7 +3,7 @@ import { createRequire as __createRequire } from 'node:module';
3
3
  const require = __createRequire(import.meta.url);
4
4
  import {
5
5
  HOOK_EXEC_MAX_BUFFER_BYTES
6
- } from "./chunk-2G5ZU67U.js";
6
+ } from "./chunk-BG4HQ56D.js";
7
7
 
8
8
  // src/utils/exec.ts
9
9
  import { exec, execFile } from "child_process";
@@ -10,15 +10,15 @@ import {
10
10
  resolveDiffBase,
11
11
  runGitCommand,
12
12
  setAgentCredentialSnapshot
13
- } from "./chunk-THUCGBYF.js";
13
+ } from "./chunk-5MO5TWHJ.js";
14
14
  import {
15
15
  AppServerProcess,
16
16
  buildCodexAgentEnv
17
- } from "./chunk-3IVAKSKY.js";
17
+ } from "./chunk-6C472IYE.js";
18
18
  import {
19
19
  SUBPROCESS_MAX_BUFFER,
20
20
  execFileAsync
21
- } from "./chunk-3DNCWVQY.js";
21
+ } from "./chunk-CYBM2QOH.js";
22
22
  import {
23
23
  isRecord
24
24
  } from "./chunk-UZSNFLDQ.js";
@@ -55,7 +55,7 @@ import {
55
55
  resolveOpenAICompatibleModelsUrl,
56
56
  splitMothershipInstructions,
57
57
  withTimeout
58
- } from "./chunk-2G5ZU67U.js";
58
+ } from "./chunk-BG4HQ56D.js";
59
59
 
60
60
  // src/managers/codex-token-manager.ts
61
61
  import { promises as fs } from "fs";
@@ -291,7 +291,7 @@ var CodexTokenManager = class extends BaseRefreshManager {
291
291
  await this.applyCredentialUpdate(++this.credentialGeneration, async () => {
292
292
  await this.applyCredentialsResponse(data);
293
293
  setAgentCredentialSnapshot("codex", data);
294
- const { restartCodexAspHostIfRunning: restartCodexAspHostIfRunning2 } = await import("./asp-host-OVSPRNQE.js");
294
+ const { restartCodexAspHostIfRunning: restartCodexAspHostIfRunning2 } = await import("./asp-host-4YRJNFYD.js");
295
295
  await restartCodexAspHostIfRunning2();
296
296
  });
297
297
  await this.start(true);
@@ -313,7 +313,7 @@ var CodexTokenManager = class extends BaseRefreshManager {
313
313
  const accountChanged = ENGINE_ENV.REPLICAS_AGENT_CREDENTIALS.codex?.credentialId !== data.credentialId;
314
314
  await this.applyCredentialsResponse(data);
315
315
  if (restartOnChange && (accountChanged || CODEX_AUTH_ENV_KEYS.some((key, index) => process.env[key] !== previousEnv[index]))) {
316
- const { restartCodexAspHostIfRunning: restartCodexAspHostIfRunning2 } = await import("./asp-host-OVSPRNQE.js");
316
+ const { restartCodexAspHostIfRunning: restartCodexAspHostIfRunning2 } = await import("./asp-host-4YRJNFYD.js");
317
317
  await restartCodexAspHostIfRunning2();
318
318
  }
319
319
  setAgentCredentialSnapshot("codex", data);
@@ -5,7 +5,7 @@ import {
5
5
  extractCommandProtectionCommandText,
6
6
  isRecord,
7
7
  parseCodeHostPrUrl
8
- } from "./chunk-2G5ZU67U.js";
8
+ } from "./chunk-BG4HQ56D.js";
9
9
 
10
10
  // src/services/published-pull-request-urls.ts
11
11
  function publishedPullRequestUrls(result) {
@@ -5,14 +5,14 @@ import {
5
5
  getOriginDefaultBranch,
6
6
  monolithRequest,
7
7
  runGitCommand
8
- } from "./chunk-THUCGBYF.js";
8
+ } from "./chunk-5MO5TWHJ.js";
9
9
  import {
10
10
  extractCommandProtectionCommandText,
11
11
  findCommandProtectionGitLookups,
12
12
  findGitCommitSignals,
13
13
  findPrMergeSignals,
14
14
  parseCommandProtectionRequest
15
- } from "./chunk-2G5ZU67U.js";
15
+ } from "./chunk-BG4HQ56D.js";
16
16
 
17
17
  // src/services/command-protection-service.ts
18
18
  import { readFile, stat } from "fs/promises";
@@ -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-6Q2GHJ6S.js";
7
- import "./chunk-THUCGBYF.js";
8
- import "./chunk-3DNCWVQY.js";
6
+ } from "./chunk-W7IRX3ZE.js";
7
+ import "./chunk-5MO5TWHJ.js";
8
+ import "./chunk-CYBM2QOH.js";
9
9
  import {
10
10
  isRecord
11
11
  } from "./chunk-UZSNFLDQ.js";
12
- import "./chunk-2G5ZU67U.js";
12
+ import "./chunk-BG4HQ56D.js";
13
13
  import "./chunk-VEQXQN22.js";
14
14
 
15
15
  // src/command-protection-hook.ts
@@ -14,12 +14,12 @@ import {
14
14
  recoverCompletedTurn,
15
15
  spawnMuseMsp,
16
16
  startMuseSession
17
- } from "./chunk-VLLPTYEF.js";
17
+ } from "./chunk-B3D66EN3.js";
18
18
  import {
19
19
  AppServerProcess,
20
20
  buildCodexAgentEnv
21
- } from "./chunk-3IVAKSKY.js";
22
- import "./chunk-3DNCWVQY.js";
21
+ } from "./chunk-6C472IYE.js";
22
+ import "./chunk-CYBM2QOH.js";
23
23
  import {
24
24
  AGENT,
25
25
  OPENCODE_GO_PROVIDER,
@@ -29,7 +29,7 @@ import {
29
29
  headlessAgentUsagePath,
30
30
  isRecord,
31
31
  withTimeout
32
- } from "./chunk-2G5ZU67U.js";
32
+ } from "./chunk-BG4HQ56D.js";
33
33
  import "./chunk-VEQXQN22.js";
34
34
 
35
35
  // src/headless-agent.ts
package/dist/src/index.js CHANGED
@@ -27,7 +27,7 @@ import {
27
27
  evaluateCommandProtection,
28
28
  extractToolCommand,
29
29
  reportCommandProtectionBlock
30
- } from "./chunk-6Q2GHJ6S.js";
30
+ } from "./chunk-W7IRX3ZE.js";
31
31
  import {
32
32
  ACCOUNT_RATE_LIMITS_UPDATED_METHOD,
33
33
  AGENT_MESSAGE_DELTA_METHOD,
@@ -65,10 +65,10 @@ import {
65
65
  spawnMuseMsp,
66
66
  startMuseSession,
67
67
  uuidV7
68
- } from "./chunk-VLLPTYEF.js";
68
+ } from "./chunk-B3D66EN3.js";
69
69
  import {
70
70
  publishedPullRequestUrls
71
- } from "./chunk-TXAJDSKC.js";
71
+ } from "./chunk-TZ43BQUR.js";
72
72
  import {
73
73
  ACCOUNT_RATE_LIMITS_READ_METHOD,
74
74
  AsyncLock,
@@ -141,7 +141,7 @@ import {
141
141
  timestampFromSeconds,
142
142
  upsertCredentialFileLines,
143
143
  writeSecureCredentialFile
144
- } from "./chunk-YGYYGLWA.js";
144
+ } from "./chunk-FI7FILEX.js";
145
145
  import {
146
146
  ENGINE_ENV,
147
147
  monolithRequest,
@@ -151,15 +151,15 @@ import {
151
151
  resolveDiffBase,
152
152
  setAgentCredentialSnapshot,
153
153
  setLinearSessionId
154
- } from "./chunk-THUCGBYF.js";
154
+ } from "./chunk-5MO5TWHJ.js";
155
155
  import {
156
156
  getCodexModelProvider
157
- } from "./chunk-3IVAKSKY.js";
157
+ } from "./chunk-6C472IYE.js";
158
158
  import {
159
159
  SUBPROCESS_MAX_BUFFER,
160
160
  execAsync,
161
161
  execFileAsync
162
- } from "./chunk-3DNCWVQY.js";
162
+ } from "./chunk-CYBM2QOH.js";
163
163
  import {
164
164
  isRecord as isRecord2
165
165
  } from "./chunk-UZSNFLDQ.js";
@@ -409,7 +409,7 @@ import {
409
409
  workspaceTokenRequestSchema,
410
410
  workspaceTokenResponseSchema,
411
411
  wrapInTag
412
- } from "./chunk-2G5ZU67U.js";
412
+ } from "./chunk-BG4HQ56D.js";
413
413
  import {
414
414
  cloneMcpConfig,
415
415
  ensureCompatibilityImports,
@@ -11300,8 +11300,14 @@ function describeLoginFailure(provider, login, configuredMethod, revoked) {
11300
11300
  const agent = getProviderDisplayName(provider);
11301
11301
  const method = login?.method ?? configuredMethod;
11302
11302
  const name = login ? describeCredential(provider, login) : `the ${agent} credential this workspace uses`;
11303
+ const orgLogin = login?.scope === CREDENTIAL_SCOPE.ORG;
11304
+ const agentsPage = orgLogin ? `Organization \u2192 Coding Agents: ${DEFAULT_WEB_APP_URL}${WEB_APP_PATHS.agents}` : `Personal \u2192 Coding Agents: ${DEFAULT_WEB_APP_URL}${WEB_APP_PATHS.accountAgents}`;
11305
+ if (provider === "claude" && (method === "oauth" || revoked)) {
11306
+ const fixer = orgLogin ? "an organization admin" : login?.account?.ownerName ?? "you";
11307
+ return `${agent} could not sign in with ${name}. The login expired or was revoked. Replicas recently switched to one-year Claude logins, so ${fixer} should update the Replicas CLI (\`npm install -g replicas-cli@latest\`) and reconnect with \`replicas claude-auth${orgLogin ? " --org" : ""}\`. Claude logins are listed in ${agentsPage}`;
11308
+ }
11303
11309
  const why = revoked ? "It was signed out, revoked, or expired." : method === "api_key" ? "The key may be invalid, revoked, out of credits, or missing access to the selected model." : method === "bedrock" ? "Check its credentials, region, IAM permissions, and Claude model access." : method === "foundry" ? `Check its API key, resource, and ${agent} deployment names.` : "It was rejected even after a refresh.";
11304
- const reconnect = login?.scope === CREDENTIAL_SCOPE.ORG ? `An organization admin can reconnect it in Organization \u2192 Coding Agents: ${DEFAULT_WEB_APP_URL}${WEB_APP_PATHS.agents}` : `Reconnect it in Personal \u2192 Coding Agents: ${DEFAULT_WEB_APP_URL}${WEB_APP_PATHS.accountAgents}`;
11310
+ const reconnect = orgLogin ? `An organization admin can reconnect it in ${agentsPage}` : `Reconnect it in ${agentsPage}`;
11305
11311
  return `${agent} could not sign in with ${name}. ${why} ${reconnect}`;
11306
11312
  }
11307
11313
  var fallbackLocks = /* @__PURE__ */ new Map();
@@ -13030,6 +13036,8 @@ var ClaudeManager = class _ClaudeManager extends CodingAgentManager {
13030
13036
  sessionLinearForwarder = null;
13031
13037
  pendingTurn = null;
13032
13038
  attemptSawActivity = false;
13039
+ // A broken login the turn moved past; if the turn still fails, it is the error the user can act on.
13040
+ turnLoginFailure = null;
13033
13041
  sessionActivity = createClaudeSessionActivity();
13034
13042
  backgroundContinuationTimer = null;
13035
13043
  pendingInterrupt = false;
@@ -13416,6 +13424,7 @@ var ClaudeManager = class _ClaudeManager extends CodingAgentManager {
13416
13424
  let missingSessionReset = false;
13417
13425
  let currentRequest = request;
13418
13426
  let carriedSteers = /* @__PURE__ */ new Map();
13427
+ this.turnLoginFailure = null;
13419
13428
  await this.goalClear?.catch(() => {
13420
13429
  });
13421
13430
  try {
@@ -13448,6 +13457,10 @@ var ClaudeManager = class _ClaudeManager extends CodingAgentManager {
13448
13457
  attemptedCredential
13449
13458
  );
13450
13459
  if (refreshed.ok) {
13460
+ const live = ENGINE_ENV.REPLICAS_AGENT_CREDENTIALS.claude;
13461
+ if (attemptedCredential && live && !isSameCredential(attemptedCredential, live)) {
13462
+ this.turnLoginFailure ??= describeLoginFailure("claude", attemptedCredential, resolveClaudeAuthMethodForMessage(), false);
13463
+ }
13451
13464
  attempt++;
13452
13465
  continue;
13453
13466
  }
@@ -13463,6 +13476,9 @@ var ClaudeManager = class _ClaudeManager extends CodingAgentManager {
13463
13476
  if (attemptedCredential) failedCredentials.push(attemptedCredential);
13464
13477
  const fallback = repeated ? { outcome: "unavailable" } : await this.fallBackCredential(reason, detail, attemptedCredential, error instanceof ClaudeQuotaError ? error.resetsAt : void 0);
13465
13478
  if (fallback.outcome === "switched") {
13479
+ if (isAuthError) {
13480
+ this.turnLoginFailure ??= describeLoginFailure("claude", attemptedCredential ?? namedLogin, resolveClaudeAuthMethodForMessage(), loginRevoked);
13481
+ }
13466
13482
  if (fallback.model) currentRequest = { ...currentRequest, model: fallback.model };
13467
13483
  authRetries = 0;
13468
13484
  loginRevoked = false;
@@ -13525,6 +13541,7 @@ var ClaudeManager = class _ClaudeManager extends CodingAgentManager {
13525
13541
  if (failedLogin) {
13526
13542
  await this.emitAuthRetryExhaustedEvent(lastError, failedLogin.credential, failedLogin.revoked);
13527
13543
  }
13544
+ this.turnLoginFailure = null;
13528
13545
  try {
13529
13546
  await this.historyFile.flush();
13530
13547
  await this.onTurnComplete();
@@ -13544,7 +13561,7 @@ var ClaudeManager = class _ClaudeManager extends CodingAgentManager {
13544
13561
  subtype: "error_during_execution",
13545
13562
  is_error: true,
13546
13563
  result,
13547
- errors,
13564
+ errors: [.../* @__PURE__ */ new Set([...this.turnLoginFailure ? [this.turnLoginFailure] : [], ...errors])],
13548
13565
  session_id: this.sessionId ?? "",
13549
13566
  parent_tool_use_id: null
13550
13567
  }
@@ -13931,7 +13948,9 @@ var ClaudeManager = class _ClaudeManager extends CodingAgentManager {
13931
13948
  if (!this.pendingTurn && msg.type === "system" && (msg.subtype === "init" || msg.subtype === "session_state_changed" && msg.state === "running")) {
13932
13949
  this.pendingBackgroundCompletion = true;
13933
13950
  }
13934
- await this.handleMessage(msg);
13951
+ const loginFailure = msg.type === "result" && msg.user_message_uuid && this.pendingTurn?.userMessageUuids.has(msg.user_message_uuid) ? this.turnLoginFailure : null;
13952
+ await this.handleMessage(msg.type === "result" && loginFailure && isClaudeResultError(msg) ? msg.subtype === "success" ? { ...msg, result: `${loginFailure}
13953
+ ${msg.result}` } : { ...msg, errors: [loginFailure, ...msg.errors] } : msg);
13935
13954
  if (this.activeQuery !== response) break;
13936
13955
  const linearSessionId = this.linearSessionId;
13937
13956
  if (linearSessionId && this.sessionLinearForwarder) {
@@ -60049,7 +60068,7 @@ function terminalErrorsFromEvent(event, provider) {
60049
60068
  const payload = coerceClaudeResultPayload(event.payload);
60050
60069
  if (!isClaudeResultError(payload)) return null;
60051
60070
  const errors2 = stripAgentDiagnosticErrors(payload.errors ?? []);
60052
- return errors2.length > 0 ? errors2 : ["Claude run failed"];
60071
+ return errors2.length > 0 ? errors2 : [payload.result || "Claude run failed"];
60053
60072
  }
60054
60073
  if (event.type === CODEX_QUOTA_STATUS_EVENT_TYPE) {
60055
60074
  return event.payload.state === "out_of_credits" ? ["Codex is out of credits. Top up the connected OpenAI account to resume."] : null;
@@ -3,13 +3,13 @@ import { createRequire as __createRequire } from 'node:module';
3
3
  const require = __createRequire(import.meta.url);
4
4
  import {
5
5
  publishedPullRequestUrls
6
- } from "./chunk-TXAJDSKC.js";
6
+ } from "./chunk-TZ43BQUR.js";
7
7
  import {
8
8
  isRecord
9
9
  } from "./chunk-UZSNFLDQ.js";
10
10
  import {
11
11
  shouldRefreshPullRequests
12
- } from "./chunk-2G5ZU67U.js";
12
+ } from "./chunk-BG4HQ56D.js";
13
13
  import "./chunk-VEQXQN22.js";
14
14
 
15
15
  // src/services/post-tool-pr-notifier.ts
@@ -11,7 +11,7 @@ import {
11
11
  spawnSubagentRequestSchema,
12
12
  subagentResponseSchema,
13
13
  waitSubagentRequestSchema
14
- } from "./chunk-2G5ZU67U.js";
14
+ } from "./chunk-BG4HQ56D.js";
15
15
  import "./chunk-VEQXQN22.js";
16
16
 
17
17
  // src/subagent-mcp.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "replicas-engine",
3
- "version": "0.1.1291",
3
+ "version": "0.1.1293",
4
4
  "description": "Lightweight API server for Replicas workspaces",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",