replicas-engine 0.1.740 → 0.1.741

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.
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ getCodexAspHost,
4
+ restartCodexAspHost,
5
+ restartCodexAspHostIfRunning
6
+ } from "./chunk-UUKFVYYJ.js";
7
+ import "./chunk-TRGZSX4W.js";
8
+ import "./chunk-ESGIWRVV.js";
9
+ import "./chunk-2RB7SIP3.js";
10
+ import "./chunk-Q6F7J5DH.js";
11
+ export {
12
+ getCodexAspHost,
13
+ restartCodexAspHost,
14
+ restartCodexAspHostIfRunning
15
+ };
@@ -0,0 +1,73 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ monolithRequest
4
+ } from "./chunk-TRGZSX4W.js";
5
+ import {
6
+ extractCommandProtectionCommandText,
7
+ findGitCommitSignals,
8
+ findPrMergeSignals
9
+ } from "./chunk-Q6F7J5DH.js";
10
+
11
+ // src/services/command-protection-service.ts
12
+ var DEFAULT_COMMAND_PROTECTION_BLOCK_MESSAGE = "Blocked by Replicas command protection.";
13
+ function asCommandProtectionResponse(value) {
14
+ if (typeof value !== "object" || value === null) return null;
15
+ const candidate = value;
16
+ return typeof candidate.allowed === "boolean" && typeof candidate.enabled === "boolean" ? candidate : null;
17
+ }
18
+ function failClosed(reason, matchedSignals) {
19
+ return {
20
+ allowed: false,
21
+ enabled: true,
22
+ reason,
23
+ matchedSignals
24
+ };
25
+ }
26
+ async function evaluateCommandProtection(request, signal) {
27
+ const matchedSignals = [...findGitCommitSignals(request), ...findPrMergeSignals(request)];
28
+ if (matchedSignals.length === 0) {
29
+ return { allowed: true, enabled: true };
30
+ }
31
+ let response;
32
+ try {
33
+ response = await monolithRequest("/v1/engine/command-protection/evaluate", {
34
+ body: request,
35
+ signal
36
+ });
37
+ } catch (error) {
38
+ const detail = error instanceof Error ? error.message : String(error);
39
+ return failClosed(`Command protection failed closed: ${detail}`, matchedSignals);
40
+ }
41
+ if (!response.ok) {
42
+ const detail = await response.text().catch(() => "");
43
+ return failClosed(`Command protection failed closed: ${response.status} ${detail}`, matchedSignals);
44
+ }
45
+ let payload;
46
+ try {
47
+ payload = await response.json();
48
+ } catch (error) {
49
+ const detail = error instanceof Error ? error.message : String(error);
50
+ return failClosed(`Command protection failed closed: ${detail}`, matchedSignals);
51
+ }
52
+ return asCommandProtectionResponse(payload) ?? failClosed("Command protection failed closed: invalid response from policy service", matchedSignals);
53
+ }
54
+ function extractToolCommand(input) {
55
+ return extractCommandProtectionCommandText({ toolInput: input }, { stringifyFallback: false });
56
+ }
57
+ function reportCommandProtectionBlock(options) {
58
+ const message = options.result.reason || DEFAULT_COMMAND_PROTECTION_BLOCK_MESSAGE;
59
+ console.warn(`[${options.managerName}] blocked ${options.action} by command protection: ${message}`);
60
+ options.recordHistoryEvent(options.eventType, {
61
+ type: "error",
62
+ message,
63
+ ...options.context,
64
+ command: options.command
65
+ }, options.historyFile);
66
+ return message;
67
+ }
68
+
69
+ export {
70
+ evaluateCommandProtection,
71
+ extractToolCommand,
72
+ reportCommandProtectionBlock
73
+ };
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  mayCreatePullRequest
4
- } from "./chunk-YPAI4W4G.js";
4
+ } from "./chunk-Q6F7J5DH.js";
5
5
 
6
6
  // src/services/post-tool-pr-notifier.ts
7
7
  async function notifyPostToolUse(toolName, toolInput) {
@@ -2,40 +2,7 @@
2
2
  import {
3
3
  HOOK_EXEC_MAX_BUFFER_BYTES,
4
4
  isVersionBelow
5
- } from "./chunk-YPAI4W4G.js";
6
-
7
- // src/utils/presigned-upload.ts
8
- import { createReadStream } from "fs";
9
- import { request as httpRequest } from "http";
10
- import { request as httpsRequest } from "https";
11
- async function putPresignedFile(urlValue, filePath, size, contentType) {
12
- await new Promise((resolve, reject) => {
13
- const url = new URL(urlValue);
14
- const request = (url.protocol === "https:" ? httpsRequest : httpRequest)(url, {
15
- method: "PUT",
16
- headers: {
17
- "content-length": String(size),
18
- "content-type": contentType
19
- }
20
- }, (response) => {
21
- response.setEncoding("utf8");
22
- let body = "";
23
- response.on("data", (chunk) => {
24
- body += chunk;
25
- });
26
- response.on("end", () => {
27
- const status = response.statusCode ?? 0;
28
- if (status >= 200 && status < 300) resolve();
29
- else reject(new Error(`upload failed: ${status} ${body}`));
30
- });
31
- response.on("error", reject);
32
- });
33
- request.on("error", reject);
34
- const file = size > 0 ? createReadStream(filePath, { start: 0, end: size - 1 }) : createReadStream(filePath);
35
- file.on("error", (error) => request.destroy(error));
36
- file.pipe(request);
37
- });
38
- }
5
+ } from "./chunk-Q6F7J5DH.js";
39
6
 
40
7
  // src/utils/codex-agent-env.ts
41
8
  function buildCodexAgentEnv(source = process.env) {
@@ -272,7 +239,7 @@ var DEFAULT_CODEX_ARGS = [
272
239
  var MIN_CODEX_CLI_VERSION = "0.144.6";
273
240
  var CODEX_UPGRADE_TIMEOUT_MS = 12e4;
274
241
  var codexCliVersionEnsured = null;
275
- var ENGINE_PACKAGE_VERSION = "0.1.740";
242
+ var ENGINE_PACKAGE_VERSION = "0.1.741";
276
243
  var INITIALIZE_METHOD = "initialize";
277
244
  var INITIALIZED_NOTIFICATION = "initialized";
278
245
  var ACCOUNT_LOGIN_START_METHOD = "account/login/start";
@@ -290,21 +257,37 @@ var AppServerProcess = class {
290
257
  invalidating = false;
291
258
  constructor(options) {
292
259
  this.binary = options.binary ?? DEFAULT_CODEX_BINARY;
293
- const baseArgs = options.args ?? (options.env.REPLICAS_CODEX_AUTH_METHOD === "foundry" ? [
294
- ...DEFAULT_CODEX_ARGS,
295
- "-c",
296
- `model=${JSON.stringify(options.env.CODEX_FOUNDRY_MODEL)}`,
297
- "-c",
298
- 'model_provider="azure"',
299
- "-c",
300
- 'model_providers.azure.name="Azure OpenAI"',
301
- "-c",
302
- `model_providers.azure.base_url=${JSON.stringify(options.env.CODEX_FOUNDRY_BASE_URL)}`,
303
- "-c",
304
- 'model_providers.azure.env_key="AZURE_OPENAI_API_KEY"',
305
- "-c",
306
- 'model_providers.azure.wire_api="responses"'
307
- ] : DEFAULT_CODEX_ARGS);
260
+ let baseArgs = options.args ?? DEFAULT_CODEX_ARGS;
261
+ if (!options.args && options.env.REPLICAS_CODEX_AUTH_METHOD === "foundry") {
262
+ baseArgs = [
263
+ ...DEFAULT_CODEX_ARGS,
264
+ "-c",
265
+ `model=${JSON.stringify(options.env.CODEX_FOUNDRY_MODEL)}`,
266
+ "-c",
267
+ 'model_provider="azure"',
268
+ "-c",
269
+ 'model_providers.azure.name="Azure OpenAI"',
270
+ "-c",
271
+ `model_providers.azure.base_url=${JSON.stringify(options.env.CODEX_FOUNDRY_BASE_URL)}`,
272
+ "-c",
273
+ 'model_providers.azure.env_key="AZURE_OPENAI_API_KEY"',
274
+ "-c",
275
+ 'model_providers.azure.wire_api="responses"'
276
+ ];
277
+ } else if (!options.args && options.env.REPLICAS_CODEX_AUTH_METHOD === "api_key" && options.env.CODEX_OPENAI_BASE_URL) {
278
+ baseArgs = [
279
+ ...DEFAULT_CODEX_ARGS,
280
+ "-c",
281
+ 'model_provider="replicas_openai_compatible"',
282
+ "-c",
283
+ 'model_providers.replicas_openai_compatible.name="OpenAI Compatible"',
284
+ "-c",
285
+ `model_providers.replicas_openai_compatible.base_url=${JSON.stringify(options.env.CODEX_OPENAI_BASE_URL)}`,
286
+ "-c",
287
+ 'model_providers.replicas_openai_compatible.wire_api="responses"',
288
+ ...options.env.CODEX_OPENAI_AUTHORIZATION_HEADER ? ["-c", 'model_providers.replicas_openai_compatible.env_http_headers={ Authorization = "CODEX_OPENAI_AUTHORIZATION_HEADER" }'] : ["-c", 'model_providers.replicas_openai_compatible.env_key="OPENAI_API_KEY"']
289
+ ];
290
+ }
308
291
  this.args = [...baseArgs, ...(options.configOverrides ?? []).flatMap((override) => ["-c", override])];
309
292
  this.env = options.env;
310
293
  this.cwd = options.cwd;
@@ -467,7 +450,7 @@ var AppServerProcess = class {
467
450
  await client.request(ACCOUNT_LOGIN_START_METHOD, params2);
468
451
  return;
469
452
  }
470
- if (this.env.REPLICAS_CODEX_AUTH_METHOD !== "api_key" || !this.env.OPENAI_API_KEY) return;
453
+ if (this.env.REPLICAS_CODEX_AUTH_METHOD !== "api_key" || this.env.CODEX_OPENAI_BASE_URL || !this.env.OPENAI_API_KEY) return;
471
454
  const params = {
472
455
  type: "apiKey",
473
456
  apiKey: this.env.OPENAI_API_KEY
@@ -489,69 +472,11 @@ var AppServerProcess = class {
489
472
  }
490
473
  };
491
474
 
492
- // src/managers/codex-asp/notification-dispatch.ts
493
- var TURN_STARTED_METHOD = "turn/started";
494
- var TURN_COMPLETED_METHOD = "turn/completed";
495
- var TURN_PLAN_UPDATED_METHOD = "turn/plan/updated";
496
- var THREAD_GOAL_UPDATED_METHOD = "thread/goal/updated";
497
- var THREAD_GOAL_CLEARED_METHOD = "thread/goal/cleared";
498
- var ITEM_STARTED_METHOD = "item/started";
499
- var ITEM_COMPLETED_METHOD = "item/completed";
500
- var AGENT_MESSAGE_DELTA_METHOD = "item/agentMessage/delta";
501
- var REASONING_SUMMARY_TEXT_DELTA_METHOD = "item/reasoning/summaryTextDelta";
502
- var REASONING_TEXT_DELTA_METHOD = "item/reasoning/textDelta";
503
- var REASONING_SUMMARY_PART_ADDED_METHOD = "item/reasoning/summaryPartAdded";
504
- var COMMAND_EXECUTION_OUTPUT_DELTA_METHOD = "item/commandExecution/outputDelta";
505
- var FILE_CHANGE_OUTPUT_DELTA_METHOD = "item/fileChange/outputDelta";
506
- var ACCOUNT_RATE_LIMITS_UPDATED_METHOD = "account/rateLimits/updated";
507
- var THREAD_TOKEN_USAGE_UPDATED_METHOD = "thread/tokenUsage/updated";
508
- var THREAD_COMPACTED_METHOD = "thread/compacted";
509
- var MODEL_REROUTED_METHOD = "model/rerouted";
510
- function dispatchAspNotification(notification, handlers) {
511
- const handler = handlers[notification.method];
512
- if (!handler) return;
513
- handler(notification);
514
- }
515
- function recoverCompletedTurn(turn, completedItems, agentMessageDeltas) {
516
- const items = turn.items.length > 0 ? [...turn.items] : [];
517
- const itemIds = new Set(items.map((item) => item.id));
518
- for (const item of completedItems) {
519
- if (itemIds.has(item.id)) continue;
520
- items.push(item);
521
- itemIds.add(item.id);
522
- }
523
- for (const [itemId, text] of agentMessageDeltas) {
524
- if (itemIds.has(itemId)) continue;
525
- items.push({ type: "agentMessage", id: itemId, text, phase: null, memoryCitation: null });
526
- }
527
- return items.length > 0 ? { ...turn, items, itemsView: "full" } : turn;
528
- }
529
-
530
475
  export {
531
- putPresignedFile,
532
476
  buildCodexAgentEnv,
533
477
  AspClient,
534
478
  execAsync,
535
479
  execFileAsync,
536
480
  SUBPROCESS_MAX_BUFFER,
537
- AppServerProcess,
538
- TURN_STARTED_METHOD,
539
- TURN_COMPLETED_METHOD,
540
- TURN_PLAN_UPDATED_METHOD,
541
- THREAD_GOAL_UPDATED_METHOD,
542
- THREAD_GOAL_CLEARED_METHOD,
543
- ITEM_STARTED_METHOD,
544
- ITEM_COMPLETED_METHOD,
545
- AGENT_MESSAGE_DELTA_METHOD,
546
- REASONING_SUMMARY_TEXT_DELTA_METHOD,
547
- REASONING_TEXT_DELTA_METHOD,
548
- REASONING_SUMMARY_PART_ADDED_METHOD,
549
- COMMAND_EXECUTION_OUTPUT_DELTA_METHOD,
550
- FILE_CHANGE_OUTPUT_DELTA_METHOD,
551
- ACCOUNT_RATE_LIMITS_UPDATED_METHOD,
552
- THREAD_TOKEN_USAGE_UPDATED_METHOD,
553
- THREAD_COMPACTED_METHOD,
554
- MODEL_REROUTED_METHOD,
555
- dispatchAspNotification,
556
- recoverCompletedTurn
481
+ AppServerProcess
557
482
  };
@@ -539,6 +539,21 @@ function getCredentialMethodLabel(agent, method) {
539
539
  }
540
540
  }
541
541
 
542
+ // ../shared/src/result.ts
543
+ function createSuccessResult(data) {
544
+ return { ok: true, data };
545
+ }
546
+ function createErrorResult(error) {
547
+ return {
548
+ ok: false,
549
+ error: {
550
+ message: error.message,
551
+ code: error.code,
552
+ details: error.details
553
+ }
554
+ };
555
+ }
556
+
542
557
  // ../shared/src/analytics/types.ts
543
558
  function hasAgentChatActivityFields(value) {
544
559
  return isRecord(value) && typeof value.chatId === "string" && 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";
@@ -977,21 +992,6 @@ function getMemoryOutputSafetyViolation(value, secrets, maxChars) {
977
992
  return null;
978
993
  }
979
994
 
980
- // ../shared/src/result.ts
981
- function createSuccessResult(data) {
982
- return { ok: true, data };
983
- }
984
- function createErrorResult(error) {
985
- return {
986
- ok: false,
987
- error: {
988
- message: error.message,
989
- code: error.code,
990
- details: error.details
991
- }
992
- };
993
- }
994
-
995
995
  // ../shared/src/sandbox.ts
996
996
  var SANDBOX_LIFECYCLE = {
997
997
  AUTO_STOP_MINUTES: 60,
@@ -6354,6 +6354,8 @@ function hasChatStarted(chat) {
6354
6354
  // ../shared/src/routes/codex.ts
6355
6355
  var CODEX_AUTH_ENV_KEYS = [
6356
6356
  "OPENAI_API_KEY",
6357
+ "CODEX_OPENAI_BASE_URL",
6358
+ "CODEX_OPENAI_AUTHORIZATION_HEADER",
6357
6359
  "AZURE_OPENAI_API_KEY",
6358
6360
  "CODEX_FOUNDRY_BASE_URL",
6359
6361
  "CODEX_FOUNDRY_MODEL",
@@ -6364,7 +6366,12 @@ function codexAuthEnvFromResponse(response) {
6364
6366
  case "oauth":
6365
6367
  return { REPLICAS_CODEX_AUTH_METHOD: "oauth" };
6366
6368
  case "api_key":
6367
- return { OPENAI_API_KEY: response.apiKey, REPLICAS_CODEX_AUTH_METHOD: "api_key" };
6369
+ return {
6370
+ ...response.apiKey && !response.authorizationHeader ? { OPENAI_API_KEY: response.apiKey } : {},
6371
+ ...response.baseUrl ? { CODEX_OPENAI_BASE_URL: response.baseUrl } : {},
6372
+ ...response.authorizationHeader ? { CODEX_OPENAI_AUTHORIZATION_HEADER: response.authorizationHeader } : {},
6373
+ REPLICAS_CODEX_AUTH_METHOD: "api_key"
6374
+ };
6368
6375
  case "foundry":
6369
6376
  return {
6370
6377
  AZURE_OPENAI_API_KEY: response.apiKey,
@@ -6377,7 +6384,12 @@ function codexAuthEnvFromResponse(response) {
6377
6384
  var CODEX_AUTH_ENV_KEYS_BY_METHOD = {
6378
6385
  none: [],
6379
6386
  oauth: ["REPLICAS_CODEX_AUTH_METHOD"],
6380
- api_key: ["OPENAI_API_KEY", "REPLICAS_CODEX_AUTH_METHOD"],
6387
+ api_key: [
6388
+ "OPENAI_API_KEY",
6389
+ "CODEX_OPENAI_BASE_URL",
6390
+ "CODEX_OPENAI_AUTHORIZATION_HEADER",
6391
+ "REPLICAS_CODEX_AUTH_METHOD"
6392
+ ],
6381
6393
  bedrock: [],
6382
6394
  foundry: ["AZURE_OPENAI_API_KEY", "CODEX_FOUNDRY_BASE_URL", "CODEX_FOUNDRY_MODEL", "REPLICAS_CODEX_AUTH_METHOD"]
6383
6395
  };
@@ -7,15 +7,12 @@ import {
7
7
  agentCredentialSnapshotSchema,
8
8
  createErrorResult,
9
9
  createSuccessResult,
10
- extractCommandProtectionCommandText,
11
10
  fallbackPlanResponseSchema,
12
- findGitCommitSignals,
13
- findPrMergeSignals,
14
11
  isRecord,
15
12
  isValidAgentProvider,
16
13
  parsePosixEnvFile,
17
14
  readReplicasRuntimeEnv
18
- } from "./chunk-YPAI4W4G.js";
15
+ } from "./chunk-Q6F7J5DH.js";
19
16
 
20
17
  // src/engine-env.ts
21
18
  import { readFileSync as readFileSync2 } from "fs";
@@ -129,6 +126,8 @@ function loadEngineEnv() {
129
126
  REPLICAS_SLACK_THREAD_TS: readReplicasRuntimeEnv(readEnv, REPLICAS_RUNTIME_ENV_ALIASES.slackThreadTs),
130
127
  ANTHROPIC_API_KEY: readEnv("ANTHROPIC_API_KEY"),
131
128
  OPENAI_API_KEY: readEnv("OPENAI_API_KEY"),
129
+ CODEX_OPENAI_BASE_URL: readEnv("CODEX_OPENAI_BASE_URL"),
130
+ CODEX_OPENAI_AUTHORIZATION_HEADER: readEnv("CODEX_OPENAI_AUTHORIZATION_HEADER"),
132
131
  CURSOR_API_KEY: readEnv("CURSOR_API_KEY"),
133
132
  AI_GATEWAY_API_KEY: readEnv("AI_GATEWAY_API_KEY"),
134
133
  CLAUDE_CODE_USE_BEDROCK: readEnv("CLAUDE_CODE_USE_BEDROCK"),
@@ -232,71 +231,10 @@ var MonolithService = class {
232
231
  };
233
232
  var monolithService = new MonolithService();
234
233
 
235
- // src/services/command-protection-service.ts
236
- var DEFAULT_COMMAND_PROTECTION_BLOCK_MESSAGE = "Blocked by Replicas command protection.";
237
- function asCommandProtectionResponse(value) {
238
- if (typeof value !== "object" || value === null) return null;
239
- const candidate = value;
240
- return typeof candidate.allowed === "boolean" && typeof candidate.enabled === "boolean" ? candidate : null;
241
- }
242
- function failClosed(reason, matchedSignals) {
243
- return {
244
- allowed: false,
245
- enabled: true,
246
- reason,
247
- matchedSignals
248
- };
249
- }
250
- async function evaluateCommandProtection(request, signal) {
251
- const matchedSignals = [...findGitCommitSignals(request), ...findPrMergeSignals(request)];
252
- if (matchedSignals.length === 0) {
253
- return { allowed: true, enabled: true };
254
- }
255
- let response;
256
- try {
257
- response = await monolithRequest("/v1/engine/command-protection/evaluate", {
258
- body: request,
259
- signal
260
- });
261
- } catch (error) {
262
- const detail = error instanceof Error ? error.message : String(error);
263
- return failClosed(`Command protection failed closed: ${detail}`, matchedSignals);
264
- }
265
- if (!response.ok) {
266
- const detail = await response.text().catch(() => "");
267
- return failClosed(`Command protection failed closed: ${response.status} ${detail}`, matchedSignals);
268
- }
269
- let payload;
270
- try {
271
- payload = await response.json();
272
- } catch (error) {
273
- const detail = error instanceof Error ? error.message : String(error);
274
- return failClosed(`Command protection failed closed: ${detail}`, matchedSignals);
275
- }
276
- return asCommandProtectionResponse(payload) ?? failClosed("Command protection failed closed: invalid response from policy service", matchedSignals);
277
- }
278
- function extractToolCommand(input) {
279
- return extractCommandProtectionCommandText({ toolInput: input }, { stringifyFallback: false });
280
- }
281
- function reportCommandProtectionBlock(options) {
282
- const message = options.result.reason || DEFAULT_COMMAND_PROTECTION_BLOCK_MESSAGE;
283
- console.warn(`[${options.managerName}] blocked ${options.action} by command protection: ${message}`);
284
- options.recordHistoryEvent(options.eventType, {
285
- type: "error",
286
- message,
287
- ...options.context,
288
- command: options.command
289
- }, options.historyFile);
290
- return message;
291
- }
292
-
293
234
  export {
294
235
  IS_WARMING_MODE,
295
236
  ENGINE_ENV,
296
237
  setAgentCredentialSnapshot,
297
238
  monolithRequest,
298
- monolithService,
299
- evaluateCommandProtection,
300
- extractToolCommand,
301
- reportCommandProtectionBlock
239
+ monolithService
302
240
  };