replicas-engine 0.1.540 → 0.1.542

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 +108 -69
  2. package/package.json +1 -1
package/dist/src/index.js CHANGED
@@ -203,9 +203,72 @@ function detectLanguageByPath(filePath) {
203
203
  return EXT_TO_LANGUAGE[ext] ?? null;
204
204
  }
205
205
 
206
+ // ../shared/src/credentials/types.ts
207
+ var CREDENTIAL_SCOPE = {
208
+ USER: "user",
209
+ ORG: "org"
210
+ };
211
+ var CREDENTIAL_SCOPES = Object.values(CREDENTIAL_SCOPE);
212
+ var CREDENTIAL_SCOPE_PRIORITY = [CREDENTIAL_SCOPE.USER, CREDENTIAL_SCOPE.ORG];
213
+
214
+ // ../shared/src/credentials/agents.ts
215
+ var CREDENTIAL_METHOD = {
216
+ OAUTH: "oauth",
217
+ API_KEY: "api_key",
218
+ FOUNDRY: "foundry",
219
+ BEDROCK: "bedrock",
220
+ OPENCODE_GO: "opencode-go",
221
+ ASTER: "aster",
222
+ OPENROUTER: "openrouter"
223
+ };
224
+ var CREDENTIAL_TYPE = {
225
+ CLAUDE_OAUTH: "claude",
226
+ ANTHROPIC_API_KEY: "claude_anthropic_api_key",
227
+ CLAUDE_FOUNDRY: "claude_foundry",
228
+ CLAUDE_BEDROCK: "claude_bedrock",
229
+ CODEX_OAUTH: "codex",
230
+ OPENAI_API_KEY: "openai_api_key",
231
+ CODEX_FOUNDRY: "codex_foundry",
232
+ CURSOR_API_KEY: "cursor_api_key",
233
+ OPENCODE_GO_API_KEY: "opencode_go_api_key",
234
+ ASTER_API_KEY: "aster_api_key",
235
+ OPENROUTER_API_KEY: "openrouter_api_key"
236
+ };
237
+ var AGENT_CREDENTIAL_METHODS_IN_ORDER = {
238
+ [AGENT.CLAUDE]: [
239
+ { method: CREDENTIAL_METHOD.OAUTH, credentialType: CREDENTIAL_TYPE.CLAUDE_OAUTH },
240
+ { method: CREDENTIAL_METHOD.API_KEY, credentialType: CREDENTIAL_TYPE.ANTHROPIC_API_KEY },
241
+ { method: CREDENTIAL_METHOD.FOUNDRY, credentialType: CREDENTIAL_TYPE.CLAUDE_FOUNDRY },
242
+ { method: CREDENTIAL_METHOD.BEDROCK, credentialType: CREDENTIAL_TYPE.CLAUDE_BEDROCK }
243
+ ],
244
+ [AGENT.CODEX]: [
245
+ { method: CREDENTIAL_METHOD.OAUTH, credentialType: CREDENTIAL_TYPE.CODEX_OAUTH },
246
+ { method: CREDENTIAL_METHOD.API_KEY, credentialType: CREDENTIAL_TYPE.OPENAI_API_KEY },
247
+ { method: CREDENTIAL_METHOD.FOUNDRY, credentialType: CREDENTIAL_TYPE.CODEX_FOUNDRY }
248
+ ],
249
+ [AGENT.CURSOR]: [
250
+ { method: CREDENTIAL_METHOD.API_KEY, credentialType: CREDENTIAL_TYPE.CURSOR_API_KEY }
251
+ ],
252
+ [AGENT.OPENCODE]: [
253
+ { method: CREDENTIAL_METHOD.OPENCODE_GO, credentialType: CREDENTIAL_TYPE.OPENCODE_GO_API_KEY },
254
+ { method: CREDENTIAL_METHOD.ASTER, credentialType: CREDENTIAL_TYPE.ASTER_API_KEY },
255
+ { method: CREDENTIAL_METHOD.OPENROUTER, credentialType: CREDENTIAL_TYPE.OPENROUTER_API_KEY }
256
+ ],
257
+ [AGENT.PI]: [
258
+ { method: CREDENTIAL_METHOD.ASTER, credentialType: CREDENTIAL_TYPE.ASTER_API_KEY },
259
+ { method: CREDENTIAL_METHOD.OPENROUTER, credentialType: CREDENTIAL_TYPE.OPENROUTER_API_KEY }
260
+ ]
261
+ };
262
+
206
263
  // ../shared/src/chat-turn-usage.ts
264
+ function isAuthMethod(value) {
265
+ return typeof value === "string" && Object.values(CREDENTIAL_METHOD).some((method) => method === value);
266
+ }
267
+ function isCredentialScope(value) {
268
+ return typeof value === "string" && CREDENTIAL_SCOPES.some((scope) => scope === value);
269
+ }
207
270
  function isChatTurnUsageRecord(value) {
208
- return isRecord(value) && typeof value.turnId === "string" && typeof value.chatId === "string" && typeof value.provider === "string" && isValidAgentProvider(value.provider) && typeof value.model === "string" && (value.senderUserId === void 0 || typeof value.senderUserId === "string") && typeof value.occurredAt === "string" && typeof value.seconds === "number" && Number.isFinite(value.seconds) && value.seconds >= 0;
271
+ return isRecord(value) && typeof value.turnId === "string" && typeof value.chatId === "string" && typeof value.provider === "string" && isValidAgentProvider(value.provider) && typeof value.model === "string" && (value.credentialMethod === void 0 || isAuthMethod(value.credentialMethod)) && (value.credentialScope === void 0 || isCredentialScope(value.credentialScope)) && value.credentialMethod === void 0 === (value.credentialScope === void 0) && (value.senderUserId === void 0 || typeof value.senderUserId === "string") && typeof value.occurredAt === "string" && typeof value.seconds === "number" && Number.isFinite(value.seconds) && value.seconds >= 0;
209
272
  }
210
273
 
211
274
  // ../shared/src/aster.ts
@@ -639,7 +702,7 @@ var WORKSPACE_SIZES = ["small", "large"];
639
702
  var INVALID_WORKSPACE_SIZE_ERROR = `Invalid size: must be one of ${WORKSPACE_SIZES.join(", ")}`;
640
703
 
641
704
  // ../shared/src/e2b.ts
642
- var E2B_TEMPLATE_NAME = "replicas-sandbox-2026-07-31-v11";
705
+ var E2B_TEMPLATE_NAME = "replicas-sandbox-2026-08-01-v2";
643
706
 
644
707
  // ../shared/src/runtime-env.ts
645
708
  function shellQuotePosix(value) {
@@ -2944,63 +3007,6 @@ function isTransientErrorText(text, options = {}) {
2944
3007
  return false;
2945
3008
  }
2946
3009
 
2947
- // ../shared/src/credentials/types.ts
2948
- var CREDENTIAL_SCOPE = {
2949
- USER: "user",
2950
- ORG: "org"
2951
- };
2952
- var CREDENTIAL_SCOPES = Object.values(CREDENTIAL_SCOPE);
2953
- var CREDENTIAL_SCOPE_PRIORITY = [CREDENTIAL_SCOPE.USER, CREDENTIAL_SCOPE.ORG];
2954
-
2955
- // ../shared/src/credentials/agents.ts
2956
- var CREDENTIAL_METHOD = {
2957
- OAUTH: "oauth",
2958
- API_KEY: "api_key",
2959
- FOUNDRY: "foundry",
2960
- BEDROCK: "bedrock",
2961
- OPENCODE_GO: "opencode-go",
2962
- ASTER: "aster",
2963
- OPENROUTER: "openrouter"
2964
- };
2965
- var CREDENTIAL_TYPE = {
2966
- CLAUDE_OAUTH: "claude",
2967
- ANTHROPIC_API_KEY: "claude_anthropic_api_key",
2968
- CLAUDE_FOUNDRY: "claude_foundry",
2969
- CLAUDE_BEDROCK: "claude_bedrock",
2970
- CODEX_OAUTH: "codex",
2971
- OPENAI_API_KEY: "openai_api_key",
2972
- CODEX_FOUNDRY: "codex_foundry",
2973
- CURSOR_API_KEY: "cursor_api_key",
2974
- OPENCODE_GO_API_KEY: "opencode_go_api_key",
2975
- ASTER_API_KEY: "aster_api_key",
2976
- OPENROUTER_API_KEY: "openrouter_api_key"
2977
- };
2978
- var AGENT_CREDENTIAL_METHODS_IN_ORDER = {
2979
- [AGENT.CLAUDE]: [
2980
- { method: CREDENTIAL_METHOD.OAUTH, credentialType: CREDENTIAL_TYPE.CLAUDE_OAUTH },
2981
- { method: CREDENTIAL_METHOD.API_KEY, credentialType: CREDENTIAL_TYPE.ANTHROPIC_API_KEY },
2982
- { method: CREDENTIAL_METHOD.FOUNDRY, credentialType: CREDENTIAL_TYPE.CLAUDE_FOUNDRY },
2983
- { method: CREDENTIAL_METHOD.BEDROCK, credentialType: CREDENTIAL_TYPE.CLAUDE_BEDROCK }
2984
- ],
2985
- [AGENT.CODEX]: [
2986
- { method: CREDENTIAL_METHOD.OAUTH, credentialType: CREDENTIAL_TYPE.CODEX_OAUTH },
2987
- { method: CREDENTIAL_METHOD.API_KEY, credentialType: CREDENTIAL_TYPE.OPENAI_API_KEY },
2988
- { method: CREDENTIAL_METHOD.FOUNDRY, credentialType: CREDENTIAL_TYPE.CODEX_FOUNDRY }
2989
- ],
2990
- [AGENT.CURSOR]: [
2991
- { method: CREDENTIAL_METHOD.API_KEY, credentialType: CREDENTIAL_TYPE.CURSOR_API_KEY }
2992
- ],
2993
- [AGENT.OPENCODE]: [
2994
- { method: CREDENTIAL_METHOD.OPENCODE_GO, credentialType: CREDENTIAL_TYPE.OPENCODE_GO_API_KEY },
2995
- { method: CREDENTIAL_METHOD.ASTER, credentialType: CREDENTIAL_TYPE.ASTER_API_KEY },
2996
- { method: CREDENTIAL_METHOD.OPENROUTER, credentialType: CREDENTIAL_TYPE.OPENROUTER_API_KEY }
2997
- ],
2998
- [AGENT.PI]: [
2999
- { method: CREDENTIAL_METHOD.ASTER, credentialType: CREDENTIAL_TYPE.ASTER_API_KEY },
3000
- { method: CREDENTIAL_METHOD.OPENROUTER, credentialType: CREDENTIAL_TYPE.OPENROUTER_API_KEY }
3001
- ]
3002
- };
3003
-
3004
3010
  // ../shared/src/claude-auth.ts
3005
3011
  function isClaudeAuthErrorText(text) {
3006
3012
  const lower = text.toLowerCase();
@@ -4998,6 +5004,11 @@ function loadRuntimeEnvFile() {
4998
5004
  }
4999
5005
  }
5000
5006
 
5007
+ // src/utils/type-guards.ts
5008
+ function isRecord4(value) {
5009
+ return typeof value === "object" && value !== null;
5010
+ }
5011
+
5001
5012
  // src/engine-env.ts
5002
5013
  function readEnv(name) {
5003
5014
  const value = process.env[name]?.trim();
@@ -5039,6 +5050,23 @@ function parseCodexAuthMethod(value) {
5039
5050
  }
5040
5051
  return void 0;
5041
5052
  }
5053
+ function parseAgentCredentialSnapshots(value) {
5054
+ if (!value) return {};
5055
+ try {
5056
+ const parsed = JSON.parse(value);
5057
+ if (!isRecord4(parsed)) return {};
5058
+ const snapshots = {};
5059
+ for (const [provider, snapshot] of Object.entries(parsed)) {
5060
+ if (!isValidAgentProvider(provider) || !isRecord4(snapshot)) continue;
5061
+ const { method, scope } = snapshot;
5062
+ if (!isAuthMethod(method) || !isCredentialScope(scope)) continue;
5063
+ snapshots[provider] = { method, scope };
5064
+ }
5065
+ return snapshots;
5066
+ } catch {
5067
+ return {};
5068
+ }
5069
+ }
5042
5070
  var IS_WARMING_MODE = process.argv.includes("--warming");
5043
5071
  function loadEngineEnv() {
5044
5072
  loadRuntimeEnvFile();
@@ -5067,6 +5095,7 @@ function loadEngineEnv() {
5067
5095
  ANTHROPIC_SMALL_FAST_MODEL_AWS_REGION: readEnv("ANTHROPIC_SMALL_FAST_MODEL_AWS_REGION"),
5068
5096
  REPLICAS_CLAUDE_AUTH_METHOD: parseClaudeAuthMethod(readEnv("REPLICAS_CLAUDE_AUTH_METHOD")),
5069
5097
  REPLICAS_CODEX_AUTH_METHOD: parseCodexAuthMethod(readEnv("REPLICAS_CODEX_AUTH_METHOD")),
5098
+ REPLICAS_AGENT_CREDENTIALS: parseAgentCredentialSnapshots(readEnv("REPLICAS_AGENT_CREDENTIALS")),
5070
5099
  REPLICAS_ENV_SYSTEM_PROMPT: readEnv("REPLICAS_ENV_SYSTEM_PROMPT"),
5071
5100
  REPLICAS_ENV_START_HOOK: readEnv("REPLICAS_ENV_START_HOOK"),
5072
5101
  REPLICAS_DISABLE_AUTO_START_HOOKS: readEnv("REPLICAS_DISABLE_AUTO_START_HOOKS")?.toLowerCase() === "true",
@@ -5078,6 +5107,13 @@ function loadEngineEnv() {
5078
5107
  return env;
5079
5108
  }
5080
5109
  var ENGINE_ENV = loadEngineEnv();
5110
+ function setAgentCredentialSnapshot(provider, snapshot) {
5111
+ ENGINE_ENV.REPLICAS_AGENT_CREDENTIALS = {
5112
+ ...ENGINE_ENV.REPLICAS_AGENT_CREDENTIALS,
5113
+ [provider]: snapshot
5114
+ };
5115
+ process.env.REPLICAS_AGENT_CREDENTIALS = JSON.stringify(ENGINE_ENV.REPLICAS_AGENT_CREDENTIALS);
5116
+ }
5081
5117
 
5082
5118
  // src/managers/base-refresh-manager.ts
5083
5119
  var BaseRefreshManager = class {
@@ -5317,13 +5353,6 @@ import { readFile as readFile2, mkdir as mkdir2 } from "fs/promises";
5317
5353
  import { existsSync } from "fs";
5318
5354
  import { join as join4 } from "path";
5319
5355
  import { homedir as homedir3 } from "os";
5320
-
5321
- // src/utils/type-guards.ts
5322
- function isRecord4(value) {
5323
- return typeof value === "object" && value !== null;
5324
- }
5325
-
5326
- // src/utils/state.ts
5327
5356
  var STATE_DIR = join4(homedir3(), ".replicas");
5328
5357
  var STATE_FILE = join4(STATE_DIR, "engine-state.json");
5329
5358
  var DEFAULT_STATE = {
@@ -6142,6 +6171,7 @@ var ClaudeTokenManager = class extends BaseRefreshManager {
6142
6171
  }
6143
6172
  const data = await response.json();
6144
6173
  await this.applyCredentialsResponse(data);
6174
+ if (data.scope) setAgentCredentialSnapshot("claude", { method: data.type, scope: data.scope });
6145
6175
  console.log(`[ClaudeTokenManager] Credentials refreshed (method=${data.type})`);
6146
6176
  }
6147
6177
  async fetchFreshCredentials(failureReason) {
@@ -6249,6 +6279,7 @@ var CodexTokenManager = class extends BaseRefreshManager {
6249
6279
  }
6250
6280
  const data = await response.json();
6251
6281
  await this.applyCredentialsResponse(data);
6282
+ if (data.scope) setAgentCredentialSnapshot("codex", { method: data.type, scope: data.scope });
6252
6283
  console.log(`[CodexTokenManager] Credentials refreshed (method=${data.type})`);
6253
6284
  }
6254
6285
  async fetchFreshCredentials(failureReason) {
@@ -10178,7 +10209,7 @@ var DEFAULT_CODEX_ARGS = ["app-server", "--listen", "stdio://"];
10178
10209
  var MIN_CODEX_CLI_VERSION = "0.144.6";
10179
10210
  var CODEX_UPGRADE_TIMEOUT_MS = 12e4;
10180
10211
  var codexCliVersionEnsured = null;
10181
- var ENGINE_PACKAGE_VERSION = "0.1.540";
10212
+ var ENGINE_PACKAGE_VERSION = "0.1.542";
10182
10213
  var INITIALIZE_METHOD = "initialize";
10183
10214
  var INITIALIZED_NOTIFICATION = "initialized";
10184
10215
  var ACCOUNT_LOGIN_START_METHOD = "account/login/start";
@@ -14392,7 +14423,14 @@ function noteMessageAccepted(messageId, request) {
14392
14423
  }
14393
14424
  }
14394
14425
  function noteTurnStarted(chatId, messageId, provider) {
14395
- activeTurns.set(chatId, { messageId, startedAtMs: Date.now(), provider });
14426
+ const credential = ENGINE_ENV.REPLICAS_AGENT_CREDENTIALS[provider];
14427
+ activeTurns.set(chatId, {
14428
+ turnId: randomUUID5(),
14429
+ messageId,
14430
+ startedAtMs: Date.now(),
14431
+ provider,
14432
+ ...credential ? { credentialMethod: credential.method, credentialScope: credential.scope } : {}
14433
+ });
14396
14434
  }
14397
14435
  function noteTurnEnded(chatId) {
14398
14436
  const turn = activeTurns.get(chatId);
@@ -14415,9 +14453,10 @@ function recordTurn(chatId, turn) {
14415
14453
  const attrs = messageAttrs.get(turn.messageId) ?? {};
14416
14454
  messageAttrs.delete(turn.messageId);
14417
14455
  writeRecord({
14418
- turnId: randomUUID5(),
14456
+ turnId: turn.turnId,
14419
14457
  chatId,
14420
14458
  provider: turn.provider,
14459
+ ...turn.credentialMethod && turn.credentialScope ? { credentialMethod: turn.credentialMethod, credentialScope: turn.credentialScope } : {},
14421
14460
  ...attrs,
14422
14461
  // A request without a model runs the agent's default, so record that rather than nothing.
14423
14462
  model: attrs.model ?? getDefaultAgentModel(turn.provider),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "replicas-engine",
3
- "version": "0.1.540",
3
+ "version": "0.1.542",
4
4
  "description": "Lightweight API server for Replicas workspaces",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",