replicas-engine 0.1.1295 → 0.1.1296
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-FJLQE5VO.js → asp-host-6FYWPUOM.js} +2 -2
- package/dist/src/{chunk-4YOLKZQK.js → chunk-7URL5D26.js} +1 -1
- package/dist/src/{chunk-WC72KGDL.js → chunk-JPQ2UW3B.js} +3 -3
- package/dist/src/{chunk-JBZNUWMJ.js → chunk-ZNRUYJCQ.js} +1 -1
- package/dist/src/headless-agent.js +2 -2
- package/dist/src/index.js +79 -23
- package/package.json +1 -1
|
@@ -8,9 +8,9 @@ import {
|
|
|
8
8
|
listRunningCodexModels,
|
|
9
9
|
restartCodexAspHost,
|
|
10
10
|
restartCodexAspHostIfRunning
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-JPQ2UW3B.js";
|
|
12
12
|
import "./chunk-OCOIXNER.js";
|
|
13
|
-
import "./chunk-
|
|
13
|
+
import "./chunk-ZNRUYJCQ.js";
|
|
14
14
|
import "./chunk-TBKEZB4T.js";
|
|
15
15
|
import "./chunk-UZSNFLDQ.js";
|
|
16
16
|
import "./chunk-Q5KCYMUE.js";
|
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
import {
|
|
15
15
|
AppServerProcess,
|
|
16
16
|
buildCodexAgentEnv
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-ZNRUYJCQ.js";
|
|
18
18
|
import {
|
|
19
19
|
SUBPROCESS_MAX_BUFFER,
|
|
20
20
|
execFileAsync
|
|
@@ -306,7 +306,7 @@ var CodexTokenManager = class extends BaseRefreshManager {
|
|
|
306
306
|
await this.applyCredentialUpdate(++this.credentialGeneration, async () => {
|
|
307
307
|
await this.applyCredentialsResponse(data);
|
|
308
308
|
setAgentCredentialSnapshot("codex", data);
|
|
309
|
-
const { restartCodexAspHostIfRunning: restartCodexAspHostIfRunning2 } = await import("./asp-host-
|
|
309
|
+
const { restartCodexAspHostIfRunning: restartCodexAspHostIfRunning2 } = await import("./asp-host-6FYWPUOM.js");
|
|
310
310
|
await restartCodexAspHostIfRunning2();
|
|
311
311
|
});
|
|
312
312
|
await this.start(true);
|
|
@@ -328,7 +328,7 @@ var CodexTokenManager = class extends BaseRefreshManager {
|
|
|
328
328
|
const accountChanged = ENGINE_ENV.REPLICAS_AGENT_CREDENTIALS.codex?.credentialId !== data.credentialId;
|
|
329
329
|
await this.applyCredentialsResponse(data);
|
|
330
330
|
if (restartOnChange && (accountChanged || CODEX_AUTH_ENV_KEYS.some((key, index) => process.env[key] !== previousEnv[index]))) {
|
|
331
|
-
const { restartCodexAspHostIfRunning: restartCodexAspHostIfRunning2 } = await import("./asp-host-
|
|
331
|
+
const { restartCodexAspHostIfRunning: restartCodexAspHostIfRunning2 } = await import("./asp-host-6FYWPUOM.js");
|
|
332
332
|
await restartCodexAspHostIfRunning2();
|
|
333
333
|
}
|
|
334
334
|
setAgentCredentialSnapshot("codex", data);
|
|
@@ -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.
|
|
243
|
+
var ENGINE_PACKAGE_VERSION = "0.1.1296";
|
|
244
244
|
var INITIALIZE_METHOD = "initialize";
|
|
245
245
|
var INITIALIZED_NOTIFICATION = "initialized";
|
|
246
246
|
var ACCOUNT_LOGIN_START_METHOD = "account/login/start";
|
|
@@ -14,11 +14,11 @@ import {
|
|
|
14
14
|
recoverCompletedTurn,
|
|
15
15
|
spawnMuseMsp,
|
|
16
16
|
startMuseSession
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-7URL5D26.js";
|
|
18
18
|
import {
|
|
19
19
|
AppServerProcess,
|
|
20
20
|
buildCodexAgentEnv
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-ZNRUYJCQ.js";
|
|
22
22
|
import "./chunk-TBKEZB4T.js";
|
|
23
23
|
import {
|
|
24
24
|
AGENT,
|
package/dist/src/index.js
CHANGED
|
@@ -65,7 +65,7 @@ import {
|
|
|
65
65
|
spawnMuseMsp,
|
|
66
66
|
startMuseSession,
|
|
67
67
|
uuidV7
|
|
68
|
-
} from "./chunk-
|
|
68
|
+
} from "./chunk-7URL5D26.js";
|
|
69
69
|
import {
|
|
70
70
|
publishedPullRequestUrls
|
|
71
71
|
} from "./chunk-EBKIWJLA.js";
|
|
@@ -143,7 +143,7 @@ import {
|
|
|
143
143
|
timestampFromSeconds,
|
|
144
144
|
upsertCredentialFileLines,
|
|
145
145
|
writeSecureCredentialFile
|
|
146
|
-
} from "./chunk-
|
|
146
|
+
} from "./chunk-JPQ2UW3B.js";
|
|
147
147
|
import {
|
|
148
148
|
ENGINE_ENV,
|
|
149
149
|
monolithRequest,
|
|
@@ -156,7 +156,7 @@ import {
|
|
|
156
156
|
} from "./chunk-OCOIXNER.js";
|
|
157
157
|
import {
|
|
158
158
|
getCodexModelProvider
|
|
159
|
-
} from "./chunk-
|
|
159
|
+
} from "./chunk-ZNRUYJCQ.js";
|
|
160
160
|
import {
|
|
161
161
|
SUBPROCESS_MAX_BUFFER,
|
|
162
162
|
execAsync,
|
|
@@ -11666,7 +11666,7 @@ function toQueuedMessageInfo(message) {
|
|
|
11666
11666
|
};
|
|
11667
11667
|
}
|
|
11668
11668
|
var subagentMcpConfigRequest = null;
|
|
11669
|
-
var CodingAgentManager = class {
|
|
11669
|
+
var CodingAgentManager = class _CodingAgentManager {
|
|
11670
11670
|
workingDirectory;
|
|
11671
11671
|
messageQueue;
|
|
11672
11672
|
initialized;
|
|
@@ -11691,6 +11691,10 @@ var CodingAgentManager = class {
|
|
|
11691
11691
|
unreadSteers = /* @__PURE__ */ new Map();
|
|
11692
11692
|
steersInFlight = /* @__PURE__ */ new Map();
|
|
11693
11693
|
steerSettlements = /* @__PURE__ */ new Set();
|
|
11694
|
+
earlySteers = [];
|
|
11695
|
+
withdrawnSteers = /* @__PURE__ */ new WeakSet();
|
|
11696
|
+
earlySteerDelivery = new AsyncLock();
|
|
11697
|
+
turnOpen = false;
|
|
11694
11698
|
lastSenderKey;
|
|
11695
11699
|
// Unset until this process sends a turn, so a restart can't mistake the first one for a change.
|
|
11696
11700
|
sentTurn = false;
|
|
@@ -11783,22 +11787,36 @@ var CodingAgentManager = class {
|
|
|
11783
11787
|
initializeManager(processMessage) {
|
|
11784
11788
|
this.messageQueue = new MessageQueueService(
|
|
11785
11789
|
async (request, signal) => {
|
|
11786
|
-
|
|
11787
|
-
|
|
11788
|
-
|
|
11789
|
-
|
|
11790
|
-
|
|
11791
|
-
|
|
11792
|
-
|
|
11793
|
-
|
|
11794
|
-
|
|
11795
|
-
|
|
11796
|
-
|
|
11790
|
+
this.turnOpen = true;
|
|
11791
|
+
try {
|
|
11792
|
+
await Promise.all([this.refreshSubagentMcp(), this.refreshAutoCompactTokens()]);
|
|
11793
|
+
const { request: delivered, senderKey } = this.withSenderLine(request);
|
|
11794
|
+
const stopped = signal.aborted;
|
|
11795
|
+
if (stopped && (request.engineTurn || !await this.keepStoppedRequest(delivered))) return;
|
|
11796
|
+
await this.saveLastSenderKey(senderKey);
|
|
11797
|
+
if (stopped) return;
|
|
11798
|
+
const instructionsChanged = this.sentTurn && this.lastCustomInstructions !== request.customInstructions && !request.goalMode && !request.message.trimStart().startsWith("/");
|
|
11799
|
+
this.sentTurn = true;
|
|
11800
|
+
this.lastCustomInstructions = request.customInstructions;
|
|
11801
|
+
const note = wrapInTag("Your instructions changed since your previous turn. Earlier turns followed the old version: follow the current instructions from here on, and leave earlier replies as they are.", REPLICAS_INSTRUCTIONS_TAG);
|
|
11802
|
+
await processMessage(instructionsChanged ? { ...delivered, message: `${delivered.message}
|
|
11797
11803
|
|
|
11798
11804
|
${note}` } : delivered, signal);
|
|
11805
|
+
} finally {
|
|
11806
|
+
this.closeTurn();
|
|
11807
|
+
}
|
|
11799
11808
|
},
|
|
11800
11809
|
this.onProcessingChanged,
|
|
11801
|
-
|
|
11810
|
+
// Opened before the turn-start event persists, since a follow-up can arrive while it does.
|
|
11811
|
+
async (message) => {
|
|
11812
|
+
this.turnOpen = true;
|
|
11813
|
+
try {
|
|
11814
|
+
await this.onMessageStarted(message);
|
|
11815
|
+
} catch (error) {
|
|
11816
|
+
this.closeTurn();
|
|
11817
|
+
throw error;
|
|
11818
|
+
}
|
|
11819
|
+
},
|
|
11802
11820
|
this.onQueueChanged
|
|
11803
11821
|
);
|
|
11804
11822
|
this.initialized = this.initialize();
|
|
@@ -11856,6 +11874,8 @@ ${request.message}` }, senderKey };
|
|
|
11856
11874
|
async interrupt(persistRemoval) {
|
|
11857
11875
|
const queuedMessages = this.messageQueue.drainQueue();
|
|
11858
11876
|
const unreadSteers = [...this.unreadSteers.values()];
|
|
11877
|
+
const earlySteers = this.earlySteers.splice(0);
|
|
11878
|
+
for (const steer of earlySteers) this.withdrawnSteers.add(steer);
|
|
11859
11879
|
this.unreadSteers.clear();
|
|
11860
11880
|
this.onQueueChanged();
|
|
11861
11881
|
this.messageQueue.cancelActiveTurn();
|
|
@@ -11865,6 +11885,8 @@ ${request.message}` }, senderKey };
|
|
|
11865
11885
|
await this.interruptActiveTurn();
|
|
11866
11886
|
} catch (error) {
|
|
11867
11887
|
for (const steer of unreadSteers) this.unreadSteers.set(steer.message.id, steer);
|
|
11888
|
+
for (const steer of earlySteers) this.withdrawnSteers.delete(steer);
|
|
11889
|
+
this.earlySteers.push(...earlySteers);
|
|
11868
11890
|
this.onQueueChanged();
|
|
11869
11891
|
this.restoreQueuedMessages(queuedMessages.map((message, index) => ({ message, index })));
|
|
11870
11892
|
throw error;
|
|
@@ -11967,11 +11989,17 @@ ${request.message}` }, senderKey };
|
|
|
11967
11989
|
let steered = false;
|
|
11968
11990
|
const { request: withSender, senderKey } = this.withSenderLine(taken.message);
|
|
11969
11991
|
const note = wrapInTag("You received this message while working. The chat folds everything before your last message of this turn, so that message must answer it too, even if you already did earlier.", REPLICAS_INSTRUCTIONS_TAG);
|
|
11970
|
-
const
|
|
11992
|
+
const command = withSender.goalMode || withSender.message.trimStart().startsWith("/");
|
|
11993
|
+
const delivered = command ? withSender : { ...withSender, message: `${withSender.message}
|
|
11971
11994
|
|
|
11972
11995
|
${note}` };
|
|
11973
11996
|
try {
|
|
11974
|
-
steered = await this.steerRequest(delivered);
|
|
11997
|
+
steered = this.earlySteers.length === 0 && await this.steerRequest(delivered);
|
|
11998
|
+
if (!steered && this.turnOpen && !command && this.steerRequest !== _CodingAgentManager.prototype.steerRequest) {
|
|
11999
|
+
this.earlySteers.push(delivered);
|
|
12000
|
+
steered = true;
|
|
12001
|
+
void this.deliverEarlySteers();
|
|
12002
|
+
}
|
|
11975
12003
|
if (steered) await this.saveLastSenderKey(senderKey);
|
|
11976
12004
|
} catch (error) {
|
|
11977
12005
|
console.error("[CodingAgentManager] steerRequest threw, keeping message queued:", error);
|
|
@@ -12007,9 +12035,14 @@ ${note}` };
|
|
|
12007
12035
|
}
|
|
12008
12036
|
return { success: true, queue: this.getQueue() };
|
|
12009
12037
|
}
|
|
12038
|
+
closeTurn() {
|
|
12039
|
+
this.turnOpen = false;
|
|
12040
|
+
if (this.earlySteers.length > 0) this.requeueUnreadSteers();
|
|
12041
|
+
}
|
|
12010
12042
|
requeueUnreadSteers() {
|
|
12011
12043
|
const steers = [...this.unreadSteers.values()].map(({ message }) => message);
|
|
12012
12044
|
this.unreadSteers.clear();
|
|
12045
|
+
for (const steer of this.earlySteers.splice(0)) this.withdrawnSteers.add(steer);
|
|
12013
12046
|
this.onQueueChanged();
|
|
12014
12047
|
this.restoreQueuedMessages(steers.map((message) => ({ message, index: 0 })));
|
|
12015
12048
|
if (steers.length > 0) {
|
|
@@ -12032,6 +12065,18 @@ ${note}` };
|
|
|
12032
12065
|
steerRequest(_request) {
|
|
12033
12066
|
return Promise.resolve(false);
|
|
12034
12067
|
}
|
|
12068
|
+
// A held steer withdrawn by a stop or a turn ending must not reach a later turn, even mid-request.
|
|
12069
|
+
isSteerWithdrawn(request) {
|
|
12070
|
+
return this.withdrawnSteers.has(request);
|
|
12071
|
+
}
|
|
12072
|
+
deliverEarlySteers() {
|
|
12073
|
+
return this.earlySteerDelivery.run(async () => {
|
|
12074
|
+
for (let next = this.earlySteers[0]; next && await this.steerRequest(next).catch(() => false); next = this.earlySteers[0]) {
|
|
12075
|
+
if (this.earlySteers[0] !== next) return;
|
|
12076
|
+
this.earlySteers.shift();
|
|
12077
|
+
}
|
|
12078
|
+
});
|
|
12079
|
+
}
|
|
12035
12080
|
emitContextUsage(payload) {
|
|
12036
12081
|
const event = {
|
|
12037
12082
|
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
@@ -13703,6 +13748,7 @@ var ClaudeManager = class _ClaudeManager extends CodingAgentManager {
|
|
|
13703
13748
|
};
|
|
13704
13749
|
promptStream.push({ ...userMessage, message: { role: "user", content } });
|
|
13705
13750
|
for (const { userMessage: steer } of steers.values()) promptStream.push({ ...steer, priority: "next" });
|
|
13751
|
+
void this.deliverEarlySteers();
|
|
13706
13752
|
});
|
|
13707
13753
|
} finally {
|
|
13708
13754
|
if (this.turnPromptRecorded) this.unreadPrompt = null;
|
|
@@ -14762,10 +14808,13 @@ var CodexAspManager = class extends CodingAgentManager {
|
|
|
14762
14808
|
const result = await this.requestActiveTurnWithReconciliation(
|
|
14763
14809
|
"steer",
|
|
14764
14810
|
expectedTurnId,
|
|
14765
|
-
(host, turnId) =>
|
|
14766
|
-
|
|
14767
|
-
|
|
14768
|
-
|
|
14811
|
+
(host, turnId) => {
|
|
14812
|
+
if (this.isSteerWithdrawn(request)) throw new Error("Steer was withdrawn");
|
|
14813
|
+
return host.client.request(
|
|
14814
|
+
TURN_STEER_METHOD,
|
|
14815
|
+
{ threadId, expectedTurnId: turnId, input, clientUserMessageId: request.id }
|
|
14816
|
+
);
|
|
14817
|
+
}
|
|
14769
14818
|
);
|
|
14770
14819
|
if (!result.ok) {
|
|
14771
14820
|
await removeTempImageFiles(tempImagePaths);
|
|
@@ -15344,6 +15393,7 @@ ${text.slice(-24e3)}`
|
|
|
15344
15393
|
[THREAD_COMPACTED_METHOD]: (notification) => {
|
|
15345
15394
|
if (!matchesTurn(notification.params.threadId, notification.params.turnId)) return;
|
|
15346
15395
|
this.compacting = false;
|
|
15396
|
+
void this.deliverEarlySteers();
|
|
15347
15397
|
},
|
|
15348
15398
|
[TURN_STARTED_METHOD]: (notification) => {
|
|
15349
15399
|
if (notification.params.threadId !== threadId) return;
|
|
@@ -15351,6 +15401,7 @@ ${text.slice(-24e3)}`
|
|
|
15351
15401
|
observedTurnIds.add(notification.params.turn.id);
|
|
15352
15402
|
this.activeTurnId = notification.params.turn.id;
|
|
15353
15403
|
this.onCodexTurnStarted?.(threadId, notification.params.turn.id);
|
|
15404
|
+
void this.deliverEarlySteers();
|
|
15354
15405
|
lastCompletedTurn = null;
|
|
15355
15406
|
completedItems.length = 0;
|
|
15356
15407
|
agentMessageDeltas.clear();
|
|
@@ -15378,7 +15429,10 @@ ${text.slice(-24e3)}`
|
|
|
15378
15429
|
[ITEM_COMPLETED_METHOD]: (notification) => {
|
|
15379
15430
|
if (!matchesTurn(notification.params.threadId, notification.params.turnId)) return;
|
|
15380
15431
|
completedItems.push(notification.params.item);
|
|
15381
|
-
if (notification.params.item.type === "contextCompaction")
|
|
15432
|
+
if (notification.params.item.type === "contextCompaction") {
|
|
15433
|
+
this.compacting = false;
|
|
15434
|
+
void this.deliverEarlySteers();
|
|
15435
|
+
}
|
|
15382
15436
|
const itemFailed = notification.params.item.type === "commandExecution" && typeof notification.params.item.exitCode === "number" && notification.params.item.exitCode !== 0;
|
|
15383
15437
|
this.completeItem(
|
|
15384
15438
|
notification.params.turnId,
|
|
@@ -15471,6 +15525,7 @@ ${text.slice(-24e3)}`
|
|
|
15471
15525
|
observedTurnIds.add(started.turn.id);
|
|
15472
15526
|
this.activeTurnId = started.turn.id;
|
|
15473
15527
|
this.onCodexTurnStarted?.(threadId, started.turn.id);
|
|
15528
|
+
void this.deliverEarlySteers();
|
|
15474
15529
|
this.startTurn(started.turn);
|
|
15475
15530
|
interruptIfStopped();
|
|
15476
15531
|
}
|
|
@@ -16187,6 +16242,7 @@ var CursorManager = class extends CodingAgentManager {
|
|
|
16187
16242
|
}
|
|
16188
16243
|
}, this.workingDirectory);
|
|
16189
16244
|
this.activeRun = run;
|
|
16245
|
+
void this.deliverEarlySteers();
|
|
16190
16246
|
const events = run.stream()[Symbol.asyncIterator]();
|
|
16191
16247
|
let interrupted = false;
|
|
16192
16248
|
while (true) {
|