replicas-engine 0.1.739 → 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.
- package/dist/src/asp-host-KDEJGDMP.js +15 -0
- package/dist/src/chunk-25CMFABL.js +73 -0
- package/dist/src/{chunk-A7KBLTDP.js → chunk-6O6BPV7Q.js} +1 -1
- package/dist/src/{chunk-HJ5OC2CS.js → chunk-ESGIWRVV.js} +35 -110
- package/dist/src/{chunk-XKZXPVIE.js → chunk-Q6F7J5DH.js} +32 -18
- package/dist/src/{chunk-3I6SKUDC.js → chunk-TRGZSX4W.js} +4 -66
- package/dist/src/chunk-UUKFVYYJ.js +419 -0
- package/dist/src/chunk-Z6P6S5HL.js +95 -0
- package/dist/src/command-protection-hook.js +3 -2
- package/dist/src/deepseek-command-protection-plugin.js +4 -3
- package/dist/src/headless-agent.js +6 -4
- package/dist/src/index.js +84 -451
- package/dist/src/post-tool-pr-hook.js +2 -2
- package/package.json +1 -1
|
@@ -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
|
+
};
|
|
@@ -2,40 +2,7 @@
|
|
|
2
2
|
import {
|
|
3
3
|
HOOK_EXEC_MAX_BUFFER_BYTES,
|
|
4
4
|
isVersionBelow
|
|
5
|
-
} from "./chunk-
|
|
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.
|
|
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
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
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
|
};
|
|
@@ -134,6 +134,7 @@ var CLAUDE_OPUS_4_8_BEDROCK_MODEL = "us.anthropic.claude-opus-4-8";
|
|
|
134
134
|
var CLAUDE_SONNET_5_BEDROCK_MODEL = "anthropic.claude-sonnet-5";
|
|
135
135
|
var CLAUDE_HAIKU_4_5_BEDROCK_MODEL = "us.anthropic.claude-haiku-4-5-20251001-v1:0";
|
|
136
136
|
var DEFAULT_CLAUDE_MODEL = CLAUDE_OPUS_5_MODEL;
|
|
137
|
+
var GPT_6_ASTRA_MODEL = "gpt-6-astra";
|
|
137
138
|
var GPT_5_6_SOL_MODEL = "gpt-5.6-sol";
|
|
138
139
|
var GPT_5_6_TERRA_MODEL = "gpt-5.6-terra";
|
|
139
140
|
var GPT_5_6_LUNA_MODEL = "gpt-5.6-luna";
|
|
@@ -235,7 +236,7 @@ var AGENT_MODELS = {
|
|
|
235
236
|
CLAUDE_SONNET_5_MODEL,
|
|
236
237
|
CLAUDE_HAIKU_4_5_MODEL
|
|
237
238
|
],
|
|
238
|
-
codex: [DEFAULT_CODEX_MODEL, GPT_5_6_TERRA_MODEL, GPT_5_6_LUNA_MODEL, "gpt-5.5", "gpt-5.4", "gpt-5.4-mini", "gpt-5.2"],
|
|
239
|
+
codex: [DEFAULT_CODEX_MODEL, GPT_6_ASTRA_MODEL, GPT_5_6_TERRA_MODEL, GPT_5_6_LUNA_MODEL, "gpt-5.5", "gpt-5.4", "gpt-5.4-mini", "gpt-5.2"],
|
|
239
240
|
cursor: [
|
|
240
241
|
CLAUDE_FABLE_5_1_MODEL,
|
|
241
242
|
CLAUDE_FABLE_5_MODEL,
|
|
@@ -299,6 +300,7 @@ var MODEL_LABELS = {
|
|
|
299
300
|
[CLAUDE_OPUS_1M_MODEL]: "Opus (1M)",
|
|
300
301
|
[LEGACY_CLAUDE_OPUS_1M_MODEL]: "Opus (1M)",
|
|
301
302
|
haiku: "Haiku 4.5",
|
|
303
|
+
[GPT_6_ASTRA_MODEL]: "GPT-6 Astra",
|
|
302
304
|
[GPT_5_6_SOL_MODEL]: "GPT-5.6 Sol",
|
|
303
305
|
[GPT_5_6_TERRA_MODEL]: "GPT-5.6 Terra",
|
|
304
306
|
[GPT_5_6_LUNA_MODEL]: "GPT-5.6 Luna",
|
|
@@ -537,6 +539,21 @@ function getCredentialMethodLabel(agent, method) {
|
|
|
537
539
|
}
|
|
538
540
|
}
|
|
539
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
|
+
|
|
540
557
|
// ../shared/src/analytics/types.ts
|
|
541
558
|
function hasAgentChatActivityFields(value) {
|
|
542
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";
|
|
@@ -975,21 +992,6 @@ function getMemoryOutputSafetyViolation(value, secrets, maxChars) {
|
|
|
975
992
|
return null;
|
|
976
993
|
}
|
|
977
994
|
|
|
978
|
-
// ../shared/src/result.ts
|
|
979
|
-
function createSuccessResult(data) {
|
|
980
|
-
return { ok: true, data };
|
|
981
|
-
}
|
|
982
|
-
function createErrorResult(error) {
|
|
983
|
-
return {
|
|
984
|
-
ok: false,
|
|
985
|
-
error: {
|
|
986
|
-
message: error.message,
|
|
987
|
-
code: error.code,
|
|
988
|
-
details: error.details
|
|
989
|
-
}
|
|
990
|
-
};
|
|
991
|
-
}
|
|
992
|
-
|
|
993
995
|
// ../shared/src/sandbox.ts
|
|
994
996
|
var SANDBOX_LIFECYCLE = {
|
|
995
997
|
AUTO_STOP_MINUTES: 60,
|
|
@@ -6352,6 +6354,8 @@ function hasChatStarted(chat) {
|
|
|
6352
6354
|
// ../shared/src/routes/codex.ts
|
|
6353
6355
|
var CODEX_AUTH_ENV_KEYS = [
|
|
6354
6356
|
"OPENAI_API_KEY",
|
|
6357
|
+
"CODEX_OPENAI_BASE_URL",
|
|
6358
|
+
"CODEX_OPENAI_AUTHORIZATION_HEADER",
|
|
6355
6359
|
"AZURE_OPENAI_API_KEY",
|
|
6356
6360
|
"CODEX_FOUNDRY_BASE_URL",
|
|
6357
6361
|
"CODEX_FOUNDRY_MODEL",
|
|
@@ -6362,7 +6366,12 @@ function codexAuthEnvFromResponse(response) {
|
|
|
6362
6366
|
case "oauth":
|
|
6363
6367
|
return { REPLICAS_CODEX_AUTH_METHOD: "oauth" };
|
|
6364
6368
|
case "api_key":
|
|
6365
|
-
return {
|
|
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
|
+
};
|
|
6366
6375
|
case "foundry":
|
|
6367
6376
|
return {
|
|
6368
6377
|
AZURE_OPENAI_API_KEY: response.apiKey,
|
|
@@ -6375,7 +6384,12 @@ function codexAuthEnvFromResponse(response) {
|
|
|
6375
6384
|
var CODEX_AUTH_ENV_KEYS_BY_METHOD = {
|
|
6376
6385
|
none: [],
|
|
6377
6386
|
oauth: ["REPLICAS_CODEX_AUTH_METHOD"],
|
|
6378
|
-
api_key: [
|
|
6387
|
+
api_key: [
|
|
6388
|
+
"OPENAI_API_KEY",
|
|
6389
|
+
"CODEX_OPENAI_BASE_URL",
|
|
6390
|
+
"CODEX_OPENAI_AUTHORIZATION_HEADER",
|
|
6391
|
+
"REPLICAS_CODEX_AUTH_METHOD"
|
|
6392
|
+
],
|
|
6379
6393
|
bedrock: [],
|
|
6380
6394
|
foundry: ["AZURE_OPENAI_API_KEY", "CODEX_FOUNDRY_BASE_URL", "CODEX_FOUNDRY_MODEL", "REPLICAS_CODEX_AUTH_METHOD"]
|
|
6381
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-
|
|
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
|
};
|