replicas-engine 0.1.480 → 0.1.482
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/index.js +124 -84
- package/package.json +1 -1
package/dist/src/index.js
CHANGED
|
@@ -101,6 +101,7 @@ var CODEX_ASP_ITEM_ID_PAYLOAD_KEY = "codexAspItemId";
|
|
|
101
101
|
var CODEX_ASP_TRANSCRIPT_UPDATED_EVENT_TYPE = "codex-asp-transcript-updated";
|
|
102
102
|
var CODEX_QUOTA_STATUS_EVENT_TYPE = "codex-quota-status";
|
|
103
103
|
var COMPACTION_STATUS_EVENT_TYPE = "compaction-status";
|
|
104
|
+
var CHAT_INTERRUPTED_EVENT_TYPE = "replicas-interrupted";
|
|
104
105
|
var CHAT_GOAL_EVENT_TYPE = "chat-goal";
|
|
105
106
|
var AUTH_RETRY_STATUS_EVENT_TYPE = "auth-retry-status";
|
|
106
107
|
var CONTEXT_USAGE_EVENT_TYPE = "context-usage";
|
|
@@ -582,7 +583,7 @@ var WORKSPACE_SIZES = ["small", "large"];
|
|
|
582
583
|
var INVALID_WORKSPACE_SIZE_ERROR = `Invalid size: must be one of ${WORKSPACE_SIZES.join(", ")}`;
|
|
583
584
|
|
|
584
585
|
// ../shared/src/e2b.ts
|
|
585
|
-
var E2B_TEMPLATE_NAME = "replicas-sandbox-2026-07-
|
|
586
|
+
var E2B_TEMPLATE_NAME = "replicas-sandbox-2026-07-23-v2";
|
|
586
587
|
|
|
587
588
|
// ../shared/src/runtime-env.ts
|
|
588
589
|
function shellQuotePosix(value) {
|
|
@@ -1614,9 +1615,10 @@ All writes are proposals: a human reviews them in the dashboard, and nothing tak
|
|
|
1614
1615
|
|
|
1615
1616
|
Use \`replicas learnings --help\` and subcommand help such as \`replicas learnings add --help\`, \`replicas learnings update --help\`, or \`replicas learnings delete --help\` for current command syntax.
|
|
1616
1617
|
|
|
1617
|
-
|
|
1618
|
-
|
|
1619
|
-
-
|
|
1618
|
+
A human approves every proposal before it takes effect, so don't agonize over borderline calls \u2014 but keep proposals genuinely useful rather than reflexive.
|
|
1619
|
+
|
|
1620
|
+
- Propose \`add\` for anything repeatable and org-useful: user corrections and preferences, hard-won environment or process knowledge, conventions and decisions worth following, and gotchas that would waste time again. If you learned it the hard way this task, capture it.
|
|
1621
|
+
- Never store task-specific details that won't recur, facts trivially derivable by reading the repo, or secrets/credentials.
|
|
1620
1622
|
- Propose \`update\` or \`delete\` when a learning is contradicted by the current code or docs, especially if the outdated guidance would affect future repeated work.
|
|
1621
1623
|
- Write narrow triggers describing when the entry should surface (e.g. "UI/UX work on the admin panel"), not vague topics.`;
|
|
1622
1624
|
var LEARNINGS_ABILITY = {
|
|
@@ -3262,16 +3264,80 @@ function isTerminalBackgroundTaskStatus(status) {
|
|
|
3262
3264
|
// ../shared/src/display-message/constants.ts
|
|
3263
3265
|
var USER_MESSAGE_MATCH_GRACE_PERIOD_MS = 3e4;
|
|
3264
3266
|
|
|
3265
|
-
// ../shared/src/
|
|
3266
|
-
function
|
|
3267
|
-
|
|
3268
|
-
|
|
3269
|
-
|
|
3270
|
-
|
|
3267
|
+
// ../shared/src/agent-event-utils.ts
|
|
3268
|
+
function getUserMessage(event) {
|
|
3269
|
+
return event.type === "event_msg" && event.payload.type === "user_message" && typeof event.payload.message === "string" ? event.payload.message : null;
|
|
3270
|
+
}
|
|
3271
|
+
function getUserMessageId(event) {
|
|
3272
|
+
const messageId = event.payload[USER_MESSAGE_ID_PAYLOAD_KEY];
|
|
3273
|
+
return typeof messageId === "string" ? messageId : null;
|
|
3274
|
+
}
|
|
3275
|
+
function getUserMessageItemId(event) {
|
|
3276
|
+
const itemId = event.payload[CODEX_ASP_ITEM_ID_PAYLOAD_KEY];
|
|
3277
|
+
return typeof itemId === "string" ? itemId : null;
|
|
3278
|
+
}
|
|
3279
|
+
function parseTimestampMs(timestamp) {
|
|
3280
|
+
const value = Date.parse(timestamp);
|
|
3281
|
+
return Number.isFinite(value) ? value : 0;
|
|
3282
|
+
}
|
|
3283
|
+
function getEventTimestampMs(event) {
|
|
3284
|
+
return parseTimestampMs(event.timestamp);
|
|
3285
|
+
}
|
|
3286
|
+
function areSameUserMessageEvents(a, b) {
|
|
3287
|
+
const aMessage = getUserMessage(a);
|
|
3288
|
+
const bMessage = getUserMessage(b);
|
|
3289
|
+
if (!aMessage || aMessage !== bMessage) return false;
|
|
3290
|
+
const aMessageId = getUserMessageId(a);
|
|
3291
|
+
const bMessageId = getUserMessageId(b);
|
|
3292
|
+
if (aMessageId || bMessageId) return aMessageId === bMessageId;
|
|
3293
|
+
const aItemId = getUserMessageItemId(a);
|
|
3294
|
+
const bItemId = getUserMessageItemId(b);
|
|
3295
|
+
if (aItemId || bItemId) return aItemId === bItemId;
|
|
3296
|
+
return Math.abs(getEventTimestampMs(a) - getEventTimestampMs(b)) <= USER_MESSAGE_MATCH_GRACE_PERIOD_MS;
|
|
3297
|
+
}
|
|
3298
|
+
function parseAgentEventJsonl(content, options = {}) {
|
|
3299
|
+
const events = [];
|
|
3300
|
+
for (const line of content.split("\n")) {
|
|
3301
|
+
const trimmed = line.trim();
|
|
3302
|
+
if (!trimmed) continue;
|
|
3303
|
+
try {
|
|
3304
|
+
const parsed = JSON.parse(trimmed);
|
|
3305
|
+
if (isAgentBackendEvent(parsed)) {
|
|
3306
|
+
events.push(parsed);
|
|
3307
|
+
} else {
|
|
3308
|
+
options.onInvalidLine?.({ line: trimmed });
|
|
3309
|
+
}
|
|
3310
|
+
} catch (error) {
|
|
3311
|
+
options.onInvalidLine?.({ line: trimmed, error });
|
|
3312
|
+
}
|
|
3313
|
+
}
|
|
3314
|
+
return events;
|
|
3315
|
+
}
|
|
3316
|
+
function parseAgentEventJsonlWithCodexAspTranscript(content, options = {}) {
|
|
3317
|
+
const events = [];
|
|
3318
|
+
let transcript = null;
|
|
3319
|
+
const transcriptsByThreadId = /* @__PURE__ */ new Map();
|
|
3320
|
+
for (const event of parseAgentEventJsonl(content, options)) {
|
|
3321
|
+
if (event.type !== CODEX_ASP_TRANSCRIPT_UPDATED_EVENT_TYPE) {
|
|
3322
|
+
events.push(event);
|
|
3323
|
+
continue;
|
|
3324
|
+
}
|
|
3325
|
+
const delta = event.payload.transcriptDelta;
|
|
3326
|
+
if (isCodexAspTranscriptDelta(delta)) {
|
|
3327
|
+
const previous = transcriptsByThreadId.get(delta.threadId) ?? null;
|
|
3328
|
+
transcript = applyCodexAspTranscriptDelta(previous, delta);
|
|
3329
|
+
} else if (isCodexAspTranscript(event.payload.transcript)) {
|
|
3330
|
+
transcript = event.payload.transcript;
|
|
3331
|
+
}
|
|
3332
|
+
if (transcript) {
|
|
3333
|
+
transcriptsByThreadId.set(transcript.threadId, transcript);
|
|
3334
|
+
}
|
|
3271
3335
|
}
|
|
3336
|
+
return { events, transcript, transcriptsByThreadId };
|
|
3272
3337
|
}
|
|
3273
3338
|
|
|
3274
3339
|
// ../shared/src/display-message/parsers/utils.ts
|
|
3340
|
+
var INTERRUPTED_MESSAGE_REGEX = /^\[Request interrupted by user.*\]$/;
|
|
3275
3341
|
function userMessageImages(value) {
|
|
3276
3342
|
if (!Array.isArray(value)) return void 0;
|
|
3277
3343
|
const images = value.filter((item) => isRecord(item) && item.type === "image" && typeof item.mediaType === "string" && typeof item.data === "string");
|
|
@@ -3287,6 +3353,15 @@ function stringifyDisplayValue(value) {
|
|
|
3287
3353
|
}
|
|
3288
3354
|
}
|
|
3289
3355
|
|
|
3356
|
+
// ../shared/src/json.ts
|
|
3357
|
+
function safeJsonParse(str, fallback) {
|
|
3358
|
+
try {
|
|
3359
|
+
return JSON.parse(str);
|
|
3360
|
+
} catch {
|
|
3361
|
+
return fallback;
|
|
3362
|
+
}
|
|
3363
|
+
}
|
|
3364
|
+
|
|
3290
3365
|
// ../shared/src/display-message/parsers/codex-parser.ts
|
|
3291
3366
|
function getStatusFromExitCode(exitCode) {
|
|
3292
3367
|
return exitCode === 0 ? "completed" : "failed";
|
|
@@ -4083,6 +4158,7 @@ function parseClaudeEvents(events, parentToolUseId) {
|
|
|
4083
4158
|
const assistantThinking = /* @__PURE__ */ new Map();
|
|
4084
4159
|
const assistantTextCounts = /* @__PURE__ */ new Map();
|
|
4085
4160
|
const acceptedUserMessageIndexes = /* @__PURE__ */ new Set();
|
|
4161
|
+
let turnWasInterrupted = false;
|
|
4086
4162
|
const taskAccumulator = new TaskAccumulator();
|
|
4087
4163
|
const taskSnapshot = () => taskAccumulator.getTasks().map((task) => ({
|
|
4088
4164
|
text: task.subject,
|
|
@@ -4153,6 +4229,7 @@ function parseClaudeEvents(events, parentToolUseId) {
|
|
|
4153
4229
|
if (LOCAL_COMMAND_ECHO_REGEX.test(textContent.trim())) {
|
|
4154
4230
|
return;
|
|
4155
4231
|
}
|
|
4232
|
+
turnWasInterrupted = INTERRUPTED_MESSAGE_REGEX.test(textContent.trim());
|
|
4156
4233
|
const images = content.filter((c) => c.type === "image" && c.source).map((c) => {
|
|
4157
4234
|
const source = c.source;
|
|
4158
4235
|
return {
|
|
@@ -4400,8 +4477,21 @@ function parseClaudeEvents(events, parentToolUseId) {
|
|
|
4400
4477
|
}
|
|
4401
4478
|
if (event.type === "claude-result") {
|
|
4402
4479
|
const payload = coerceClaudeResultPayload(event.payload);
|
|
4480
|
+
const errorList = payload.errors || [];
|
|
4481
|
+
if (turnWasInterrupted) {
|
|
4482
|
+
turnWasInterrupted = false;
|
|
4483
|
+
const genuineErrors = errorList.filter((e) => !e.includes("[ede_diagnostic]"));
|
|
4484
|
+
if (genuineErrors.length > 0) {
|
|
4485
|
+
messages.push({
|
|
4486
|
+
id: `error-${event.timestamp}`,
|
|
4487
|
+
type: "error",
|
|
4488
|
+
message: genuineErrors.join("\n"),
|
|
4489
|
+
timestamp: event.timestamp
|
|
4490
|
+
});
|
|
4491
|
+
}
|
|
4492
|
+
return;
|
|
4493
|
+
}
|
|
4403
4494
|
if (isClaudeResultError(payload)) {
|
|
4404
|
-
const errorList = payload.errors || [];
|
|
4405
4495
|
const errorMessage = errorList.length > 0 ? errorList.join("\n") : "Claude session encountered an unexpected error.";
|
|
4406
4496
|
messages.push({
|
|
4407
4497
|
id: `error-${event.timestamp}`,
|
|
@@ -4540,78 +4630,6 @@ function parseClaudeEvents(events, parentToolUseId) {
|
|
|
4540
4630
|
return messages.filter((_, index) => !staleIndexes.has(index));
|
|
4541
4631
|
}
|
|
4542
4632
|
|
|
4543
|
-
// ../shared/src/agent-event-utils.ts
|
|
4544
|
-
function getUserMessage(event) {
|
|
4545
|
-
return event.type === "event_msg" && event.payload.type === "user_message" && typeof event.payload.message === "string" ? event.payload.message : null;
|
|
4546
|
-
}
|
|
4547
|
-
function getUserMessageId(event) {
|
|
4548
|
-
const messageId = event.payload[USER_MESSAGE_ID_PAYLOAD_KEY];
|
|
4549
|
-
return typeof messageId === "string" ? messageId : null;
|
|
4550
|
-
}
|
|
4551
|
-
function getUserMessageItemId(event) {
|
|
4552
|
-
const itemId = event.payload[CODEX_ASP_ITEM_ID_PAYLOAD_KEY];
|
|
4553
|
-
return typeof itemId === "string" ? itemId : null;
|
|
4554
|
-
}
|
|
4555
|
-
function parseTimestampMs(timestamp) {
|
|
4556
|
-
const value = Date.parse(timestamp);
|
|
4557
|
-
return Number.isFinite(value) ? value : 0;
|
|
4558
|
-
}
|
|
4559
|
-
function getEventTimestampMs(event) {
|
|
4560
|
-
return parseTimestampMs(event.timestamp);
|
|
4561
|
-
}
|
|
4562
|
-
function areSameUserMessageEvents(a, b) {
|
|
4563
|
-
const aMessage = getUserMessage(a);
|
|
4564
|
-
const bMessage = getUserMessage(b);
|
|
4565
|
-
if (!aMessage || aMessage !== bMessage) return false;
|
|
4566
|
-
const aMessageId = getUserMessageId(a);
|
|
4567
|
-
const bMessageId = getUserMessageId(b);
|
|
4568
|
-
if (aMessageId || bMessageId) return aMessageId === bMessageId;
|
|
4569
|
-
const aItemId = getUserMessageItemId(a);
|
|
4570
|
-
const bItemId = getUserMessageItemId(b);
|
|
4571
|
-
if (aItemId || bItemId) return aItemId === bItemId;
|
|
4572
|
-
return Math.abs(getEventTimestampMs(a) - getEventTimestampMs(b)) <= USER_MESSAGE_MATCH_GRACE_PERIOD_MS;
|
|
4573
|
-
}
|
|
4574
|
-
function parseAgentEventJsonl(content, options = {}) {
|
|
4575
|
-
const events = [];
|
|
4576
|
-
for (const line of content.split("\n")) {
|
|
4577
|
-
const trimmed = line.trim();
|
|
4578
|
-
if (!trimmed) continue;
|
|
4579
|
-
try {
|
|
4580
|
-
const parsed = JSON.parse(trimmed);
|
|
4581
|
-
if (isAgentBackendEvent(parsed)) {
|
|
4582
|
-
events.push(parsed);
|
|
4583
|
-
} else {
|
|
4584
|
-
options.onInvalidLine?.({ line: trimmed });
|
|
4585
|
-
}
|
|
4586
|
-
} catch (error) {
|
|
4587
|
-
options.onInvalidLine?.({ line: trimmed, error });
|
|
4588
|
-
}
|
|
4589
|
-
}
|
|
4590
|
-
return events;
|
|
4591
|
-
}
|
|
4592
|
-
function parseAgentEventJsonlWithCodexAspTranscript(content, options = {}) {
|
|
4593
|
-
const events = [];
|
|
4594
|
-
let transcript = null;
|
|
4595
|
-
const transcriptsByThreadId = /* @__PURE__ */ new Map();
|
|
4596
|
-
for (const event of parseAgentEventJsonl(content, options)) {
|
|
4597
|
-
if (event.type !== CODEX_ASP_TRANSCRIPT_UPDATED_EVENT_TYPE) {
|
|
4598
|
-
events.push(event);
|
|
4599
|
-
continue;
|
|
4600
|
-
}
|
|
4601
|
-
const delta = event.payload.transcriptDelta;
|
|
4602
|
-
if (isCodexAspTranscriptDelta(delta)) {
|
|
4603
|
-
const previous = transcriptsByThreadId.get(delta.threadId) ?? null;
|
|
4604
|
-
transcript = applyCodexAspTranscriptDelta(previous, delta);
|
|
4605
|
-
} else if (isCodexAspTranscript(event.payload.transcript)) {
|
|
4606
|
-
transcript = event.payload.transcript;
|
|
4607
|
-
}
|
|
4608
|
-
if (transcript) {
|
|
4609
|
-
transcriptsByThreadId.set(transcript.threadId, transcript);
|
|
4610
|
-
}
|
|
4611
|
-
}
|
|
4612
|
-
return { events, transcript, transcriptsByThreadId };
|
|
4613
|
-
}
|
|
4614
|
-
|
|
4615
4633
|
// ../shared/src/display-message/parsers/codex-asp-parser.ts
|
|
4616
4634
|
var DUPLICATE_WINDOW_MS = 5 * 60 * 1e3;
|
|
4617
4635
|
|
|
@@ -7821,6 +7839,13 @@ var CodingAgentManager = class {
|
|
|
7821
7839
|
const { queue, isProcessing } = this.drainQueueForInterrupt();
|
|
7822
7840
|
if (isProcessing) {
|
|
7823
7841
|
await this.interruptActiveTurn();
|
|
7842
|
+
const event = {
|
|
7843
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
7844
|
+
type: CHAT_INTERRUPTED_EVENT_TYPE,
|
|
7845
|
+
payload: {}
|
|
7846
|
+
};
|
|
7847
|
+
this.onEvent(event);
|
|
7848
|
+
this.getHistorySink()?.append(event);
|
|
7824
7849
|
}
|
|
7825
7850
|
this.emitInterruptedQueueEvent(queue);
|
|
7826
7851
|
return {
|
|
@@ -8680,6 +8705,9 @@ var ClaudeManager = class _ClaudeManager extends CodingAgentManager {
|
|
|
8680
8705
|
this.disallowedToolsOverride = options.disallowedTools;
|
|
8681
8706
|
this.initializeManager(this.processMessageInternal.bind(this));
|
|
8682
8707
|
}
|
|
8708
|
+
getHistorySink() {
|
|
8709
|
+
return this.historyFile;
|
|
8710
|
+
}
|
|
8683
8711
|
async interruptActiveTurn() {
|
|
8684
8712
|
this.pendingInterrupt = true;
|
|
8685
8713
|
if (this.activeQuery) {
|
|
@@ -9801,7 +9829,7 @@ var DEFAULT_CODEX_ARGS = ["app-server", "--listen", "stdio://"];
|
|
|
9801
9829
|
var MIN_CODEX_CLI_VERSION = "0.144.6";
|
|
9802
9830
|
var CODEX_UPGRADE_TIMEOUT_MS = 12e4;
|
|
9803
9831
|
var codexCliVersionEnsured = null;
|
|
9804
|
-
var ENGINE_PACKAGE_VERSION = "0.1.
|
|
9832
|
+
var ENGINE_PACKAGE_VERSION = "0.1.482";
|
|
9805
9833
|
var INITIALIZE_METHOD = "initialize";
|
|
9806
9834
|
var INITIALIZED_NOTIFICATION = "initialized";
|
|
9807
9835
|
var ACCOUNT_LOGIN_START_METHOD = "account/login/start";
|
|
@@ -10820,6 +10848,9 @@ var CodexAspManager = class extends CodingAgentManager {
|
|
|
10820
10848
|
}
|
|
10821
10849
|
this.currentThreadId = this.initialSessionId ?? replayed?.transcript?.threadId ?? null;
|
|
10822
10850
|
}
|
|
10851
|
+
getHistorySink() {
|
|
10852
|
+
return { append: (event) => this.trackHistoryEvent(event) };
|
|
10853
|
+
}
|
|
10823
10854
|
async interruptActiveTurn() {
|
|
10824
10855
|
if (!this.currentThreadId || !this.activeTurnId) {
|
|
10825
10856
|
return;
|
|
@@ -12046,6 +12077,9 @@ var CursorManager = class extends CodingAgentManager {
|
|
|
12046
12077
|
async initialize() {
|
|
12047
12078
|
await mkdir11(dirname5(this.historyFilePath), { recursive: true });
|
|
12048
12079
|
}
|
|
12080
|
+
getHistorySink() {
|
|
12081
|
+
return this.historyFile;
|
|
12082
|
+
}
|
|
12049
12083
|
async interruptActiveTurn() {
|
|
12050
12084
|
await this.cancelRun(this.activeRun);
|
|
12051
12085
|
this.abortActiveTurn?.();
|
|
@@ -12583,6 +12617,9 @@ var OpencodeManager = class extends CodingAgentManager {
|
|
|
12583
12617
|
async initialize() {
|
|
12584
12618
|
await mkdir12(dirname6(this.historyFilePath), { recursive: true });
|
|
12585
12619
|
}
|
|
12620
|
+
getHistorySink() {
|
|
12621
|
+
return this.historyFile;
|
|
12622
|
+
}
|
|
12586
12623
|
async interruptActiveTurn() {
|
|
12587
12624
|
this.activeAbortController?.abort();
|
|
12588
12625
|
if (this.client && this.sessionId) {
|
|
@@ -13111,6 +13148,9 @@ var PiManager = class extends CodingAgentManager {
|
|
|
13111
13148
|
async initialize() {
|
|
13112
13149
|
await mkdir13(dirname7(this.historyFilePath), { recursive: true });
|
|
13113
13150
|
}
|
|
13151
|
+
getHistorySink() {
|
|
13152
|
+
return this.historyFile;
|
|
13153
|
+
}
|
|
13114
13154
|
async interruptActiveTurn() {
|
|
13115
13155
|
await this.session?.abort();
|
|
13116
13156
|
}
|