replicas-engine 0.1.1320 → 0.1.1321

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.
@@ -8,12 +8,12 @@ import {
8
8
  listRunningCodexModels,
9
9
  restartCodexAspHost,
10
10
  restartCodexAspHostIfRunning
11
- } from "./chunk-VVU62H6B.js";
12
- import "./chunk-56WDCAN2.js";
13
- import "./chunk-4S7JVNWL.js";
14
- import "./chunk-2MCGQBB5.js";
11
+ } from "./chunk-6SXWSLFN.js";
12
+ import "./chunk-NO7WE4LT.js";
13
+ import "./chunk-QHVDMQNA.js";
14
+ import "./chunk-CF7OT4KT.js";
15
15
  import "./chunk-UZSNFLDQ.js";
16
- import "./chunk-LLSE2EKJ.js";
16
+ import "./chunk-EIAP5VIF.js";
17
17
  import "./chunk-VEQXQN22.js";
18
18
  export {
19
19
  CODEX_ULTRAFAST_SERVICE_TIER,
@@ -10,15 +10,15 @@ import {
10
10
  resolveDiffBase,
11
11
  runGitCommand,
12
12
  setAgentCredentialSnapshot
13
- } from "./chunk-56WDCAN2.js";
13
+ } from "./chunk-NO7WE4LT.js";
14
14
  import {
15
15
  AppServerProcess,
16
16
  buildCodexAgentEnv
17
- } from "./chunk-4S7JVNWL.js";
17
+ } from "./chunk-QHVDMQNA.js";
18
18
  import {
19
19
  SUBPROCESS_MAX_BUFFER,
20
20
  execFileAsync
21
- } from "./chunk-2MCGQBB5.js";
21
+ } from "./chunk-CF7OT4KT.js";
22
22
  import {
23
23
  isRecord
24
24
  } from "./chunk-UZSNFLDQ.js";
@@ -56,7 +56,7 @@ import {
56
56
  resolveOpenAICompatibleModelsUrl,
57
57
  splitMothershipInstructions,
58
58
  withTimeout
59
- } from "./chunk-LLSE2EKJ.js";
59
+ } from "./chunk-EIAP5VIF.js";
60
60
 
61
61
  // src/managers/codex-token-manager.ts
62
62
  import { promises as fs } from "fs";
@@ -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-TT2OBODF.js");
309
+ const { restartCodexAspHostIfRunning: restartCodexAspHostIfRunning2 } = await import("./asp-host-SLVH4EZD.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-TT2OBODF.js");
331
+ const { restartCodexAspHostIfRunning: restartCodexAspHostIfRunning2 } = await import("./asp-host-SLVH4EZD.js");
332
332
  await restartCodexAspHostIfRunning2();
333
333
  }
334
334
  setAgentCredentialSnapshot("codex", data);
@@ -5,7 +5,7 @@ import {
5
5
  extractCommandProtectionCommandText,
6
6
  isRecord,
7
7
  parseCodeHostPrUrl
8
- } from "./chunk-LLSE2EKJ.js";
8
+ } from "./chunk-EIAP5VIF.js";
9
9
 
10
10
  // src/services/published-pull-request-urls.ts
11
11
  function publishedPullRequestUrls(result) {
@@ -3,7 +3,7 @@ import { createRequire as __createRequire } from 'node:module';
3
3
  const require = __createRequire(import.meta.url);
4
4
  import {
5
5
  AspClient
6
- } from "./chunk-4S7JVNWL.js";
6
+ } from "./chunk-QHVDMQNA.js";
7
7
  import {
8
8
  ASTER_BASE_URL,
9
9
  ASTER_PROVIDER,
@@ -15,7 +15,7 @@ import {
15
15
  isRecord,
16
16
  readOllamaAuthEnv,
17
17
  readOpenAICompatibleAuthEnv
18
- } from "./chunk-LLSE2EKJ.js";
18
+ } from "./chunk-EIAP5VIF.js";
19
19
 
20
20
  // src/managers/codex-asp/notification-dispatch.ts
21
21
  var TURN_STARTED_METHOD = "turn/started";
@@ -3,7 +3,7 @@ import { createRequire as __createRequire } from 'node:module';
3
3
  const require = __createRequire(import.meta.url);
4
4
  import {
5
5
  HOOK_EXEC_MAX_BUFFER_BYTES
6
- } from "./chunk-LLSE2EKJ.js";
6
+ } from "./chunk-EIAP5VIF.js";
7
7
 
8
8
  // src/utils/exec.ts
9
9
  import { exec, execFile } from "child_process";
@@ -2811,6 +2811,11 @@ Only one recording at a time. Re-running \`start\` while one is active fails - c
2811
2811
  ### \`replicas computer record stop\`
2812
2812
  SIGINTs ffmpeg, verifies that the process has finalized the MP4, then prints the output path. A finalization timeout preserves the recording state so \`stop\` can be retried safely. To show the interaction in a PR or message, turn it into a short looping GIF with \`replicas media gif <path>\`, then upload with \`replicas media upload <path> --name "<name>"\`.
2813
2813
 
2814
+ ### \`replicas computer mac <tool> ['<json>'] [--screenshot PATH] [--session NAME]\`
2815
+ Drives one app on the user's own Mac in the background, while they keep working: their cursor, focus and front window stay theirs. It works while they have this workspace open in the Replicas desktop app with computer use turned on; otherwise it says no Mac is connected. Each call runs one [Cua Driver tool](https://cua.ai/docs/cua-driver) and opens a live view of the window you're working in on this desktop, so the user can watch it in the \`Desktop\` tab.
2816
+
2817
+ Start with \`list_apps\` or \`launch_app '{"bundle_id":"com.apple.TextEdit"}'\` (never \`open\`, which brings the app forward), then \`get_window_state '{"pid":\u2026,"window_id":\u2026}'\` for the accessibility tree and a screenshot (\`--screenshot\` saves it), then act with \`click\`, \`type_text\`, \`press_key\`, \`set_value\` or \`scroll\` by \`element_token\`, and read the window again to verify. Type line breaks as a separate \`press_key\` Return: a newline inside \`type_text\` is dropped. Pass the same \`--session\` to keep element tokens valid across calls. Apps that open no window when launched in the background show one once you open a file with \`launch_app\`'s \`urls\`. \`get_guide\` explains everything else. Some actions, like a disabled menu item, need the app in front: ask the user before \`bring_to_front\`.
2818
+
2814
2819
  ## Patterns
2815
2820
 
2816
2821
  ### Browser action / state loop
@@ -4,7 +4,7 @@ const require = __createRequire(import.meta.url);
4
4
  import {
5
5
  SUBPROCESS_MAX_BUFFER,
6
6
  execFileAsync
7
- } from "./chunk-2MCGQBB5.js";
7
+ } from "./chunk-CF7OT4KT.js";
8
8
  import {
9
9
  isRecord as isRecord2
10
10
  } from "./chunk-UZSNFLDQ.js";
@@ -21,7 +21,7 @@ import {
21
21
  provisionedDeviceSchema,
22
22
  readReplicasRuntimeEnv,
23
23
  serializePosixEnvFile
24
- } from "./chunk-LLSE2EKJ.js";
24
+ } from "./chunk-EIAP5VIF.js";
25
25
 
26
26
  // src/runtime-env-loader.ts
27
27
  import { readFileSync } from "fs";
@@ -3,10 +3,10 @@ import { createRequire as __createRequire } from 'node:module';
3
3
  const require = __createRequire(import.meta.url);
4
4
  import {
5
5
  execFileAsync
6
- } from "./chunk-2MCGQBB5.js";
6
+ } from "./chunk-CF7OT4KT.js";
7
7
  import {
8
8
  isVersionBelow
9
- } from "./chunk-LLSE2EKJ.js";
9
+ } from "./chunk-EIAP5VIF.js";
10
10
 
11
11
  // src/utils/codex-agent-env.ts
12
12
  function buildCodexAgentEnv(source = process.env) {
@@ -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.1320";
243
+ var ENGINE_PACKAGE_VERSION = "0.1.1321";
244
244
  var INITIALIZE_METHOD = "initialize";
245
245
  var INITIALIZED_NOTIFICATION = "initialized";
246
246
  var ACCOUNT_LOGIN_START_METHOD = "account/login/start";
@@ -6,7 +6,7 @@ import {
6
6
  getOriginDefaultBranch,
7
7
  monolithRequest,
8
8
  runGitCommand
9
- } from "./chunk-56WDCAN2.js";
9
+ } from "./chunk-NO7WE4LT.js";
10
10
  import {
11
11
  extractCommandProtectionCommandText,
12
12
  findCommandProtectionGitLookups,
@@ -14,7 +14,7 @@ import {
14
14
  findPrMergeSignals,
15
15
  findScoutRepoWriteSignals,
16
16
  parseCommandProtectionRequest
17
- } from "./chunk-LLSE2EKJ.js";
17
+ } from "./chunk-EIAP5VIF.js";
18
18
 
19
19
  // src/services/command-protection-service.ts
20
20
  import { readFile, stat } from "fs/promises";
@@ -3,13 +3,13 @@ import { createRequire as __createRequire } from 'node:module';
3
3
  const require = __createRequire(import.meta.url);
4
4
  import {
5
5
  evaluateCommandProtection
6
- } from "./chunk-VY3L43BO.js";
7
- import "./chunk-56WDCAN2.js";
8
- import "./chunk-2MCGQBB5.js";
6
+ } from "./chunk-QWRRA76L.js";
7
+ import "./chunk-NO7WE4LT.js";
8
+ import "./chunk-CF7OT4KT.js";
9
9
  import {
10
10
  isRecord
11
11
  } from "./chunk-UZSNFLDQ.js";
12
- import "./chunk-LLSE2EKJ.js";
12
+ import "./chunk-EIAP5VIF.js";
13
13
  import "./chunk-VEQXQN22.js";
14
14
 
15
15
  // src/command-protection-hook.ts
@@ -14,12 +14,12 @@ import {
14
14
  recoverCompletedTurn,
15
15
  spawnMuseMsp,
16
16
  startMuseSession
17
- } from "./chunk-Y5ZVU5DX.js";
17
+ } from "./chunk-CBGAKVHI.js";
18
18
  import {
19
19
  AppServerProcess,
20
20
  buildCodexAgentEnv
21
- } from "./chunk-4S7JVNWL.js";
22
- import "./chunk-2MCGQBB5.js";
21
+ } from "./chunk-QHVDMQNA.js";
22
+ import "./chunk-CF7OT4KT.js";
23
23
  import {
24
24
  AGENT,
25
25
  OPENCODE_GO_PROVIDER,
@@ -29,7 +29,7 @@ import {
29
29
  headlessAgentUsagePath,
30
30
  isRecord,
31
31
  withTimeout
32
- } from "./chunk-LLSE2EKJ.js";
32
+ } from "./chunk-EIAP5VIF.js";
33
33
  import "./chunk-VEQXQN22.js";
34
34
 
35
35
  // src/headless-agent.ts
package/dist/src/index.js CHANGED
@@ -27,7 +27,7 @@ import {
27
27
  evaluateCommandProtection,
28
28
  extractToolCommand,
29
29
  reportCommandProtectionBlock
30
- } from "./chunk-VY3L43BO.js";
30
+ } from "./chunk-QWRRA76L.js";
31
31
  import {
32
32
  ACCOUNT_RATE_LIMITS_UPDATED_METHOD,
33
33
  AGENT_MESSAGE_DELTA_METHOD,
@@ -65,10 +65,10 @@ import {
65
65
  spawnMuseMsp,
66
66
  startMuseSession,
67
67
  uuidV7
68
- } from "./chunk-Y5ZVU5DX.js";
68
+ } from "./chunk-CBGAKVHI.js";
69
69
  import {
70
70
  publishedPullRequestUrls
71
- } from "./chunk-RG6ZUUTP.js";
71
+ } from "./chunk-BMKTQMPM.js";
72
72
  import {
73
73
  ACCOUNT_RATE_LIMITS_READ_METHOD,
74
74
  AsyncLock,
@@ -143,7 +143,7 @@ import {
143
143
  timestampFromSeconds,
144
144
  upsertCredentialFileLines,
145
145
  writeSecureCredentialFile
146
- } from "./chunk-VVU62H6B.js";
146
+ } from "./chunk-6SXWSLFN.js";
147
147
  import {
148
148
  ENGINE_ENV,
149
149
  monolithRequest,
@@ -153,15 +153,15 @@ import {
153
153
  resolveDiffBase,
154
154
  setAgentCredentialSnapshot,
155
155
  setLinearSessionId
156
- } from "./chunk-56WDCAN2.js";
156
+ } from "./chunk-NO7WE4LT.js";
157
157
  import {
158
158
  getCodexModelProvider
159
- } from "./chunk-4S7JVNWL.js";
159
+ } from "./chunk-QHVDMQNA.js";
160
160
  import {
161
161
  SUBPROCESS_MAX_BUFFER,
162
162
  execAsync,
163
163
  execFileAsync
164
- } from "./chunk-2MCGQBB5.js";
164
+ } from "./chunk-CF7OT4KT.js";
165
165
  import {
166
166
  isRecord as isRecord2
167
167
  } from "./chunk-UZSNFLDQ.js";
@@ -417,7 +417,7 @@ import {
417
417
  workspaceTokenRequestSchema,
418
418
  workspaceTokenResponseSchema,
419
419
  wrapInTag
420
- } from "./chunk-LLSE2EKJ.js";
420
+ } from "./chunk-EIAP5VIF.js";
421
421
  import {
422
422
  cloneMcpConfig,
423
423
  ensureCompatibilityImports,
@@ -13115,6 +13115,8 @@ var ClaudeManager = class _ClaudeManager extends CodingAgentManager {
13115
13115
  pendingInterrupt = false;
13116
13116
  // A turn started before a stop's teardown would run on the process being stopped and end with it.
13117
13117
  stopping = null;
13118
+ // Claude Code emits a stopped turn's partial reply only after acknowledging the interrupt, so teardown waits for the turn to end.
13119
+ stoppedTurnEnded = null;
13118
13120
  // Claude Code writes a started prompt to the session transcript even when the turn then fails, so a retry must not resend it.
13119
13121
  turnPromptRecorded = false;
13120
13122
  // Claude Code never sees a prompt stopped before it started, so it is sent again with the next message.
@@ -13167,8 +13169,11 @@ var ClaudeManager = class _ClaudeManager extends CodingAgentManager {
13167
13169
  const query2 = this.activeQuery;
13168
13170
  if (query2) {
13169
13171
  const interrupt = query2.interrupt.bind(query2);
13170
- await raceWithTimeout(interrupt({ cancelQueued: true }).catch(() => {
13171
- }), CLAUDE_INTERRUPT_TIMEOUT_MS);
13172
+ const ended = isClaudeSessionActive(this.sessionActivity) ? Promise.withResolvers() : null;
13173
+ this.stoppedTurnEnded = ended;
13174
+ await raceWithTimeout(Promise.all([interrupt({ cancelQueued: true }).catch(() => {
13175
+ }), ended?.promise]), CLAUDE_INTERRUPT_TIMEOUT_MS);
13176
+ this.stoppedTurnEnded = null;
13172
13177
  }
13173
13178
  await this.tearDownSession(true);
13174
13179
  })();
@@ -14007,7 +14012,11 @@ var ClaudeManager = class _ClaudeManager extends CodingAgentManager {
14007
14012
  if (next.done || this.activeQuery !== response) break;
14008
14013
  const msg = next.value;
14009
14014
  if (!msg) break;
14010
- if (this.pendingInterrupt) continue;
14015
+ if (this.pendingInterrupt) {
14016
+ if (msg.type === "assistant" || msg.type === "user") await this.recordEvent(msg);
14017
+ else if (msg.type === "result") this.stoppedTurnEnded?.resolve();
14018
+ continue;
14019
+ }
14011
14020
  if (msg.type === "rate_limit_event") {
14012
14021
  creditsRequired = msg.rate_limit_info.errorCode === "credits_required";
14013
14022
  if (msg.rate_limit_info.status === "rejected" && msg.rate_limit_info.resetsAt) {
@@ -14088,6 +14097,7 @@ ${msg.result}` } : { ...msg, errors: [loginFailure, ...msg.errors] } : msg);
14088
14097
  console.error("[ClaudeManager] Session loop crashed:", error);
14089
14098
  }
14090
14099
  } finally {
14100
+ this.stoppedTurnEnded?.resolve();
14091
14101
  if (this.activeQuery !== response) return;
14092
14102
  const pending = this.pendingTurn;
14093
14103
  const pendingError = loopError ? pending?.sawActivity && _ClaudeManager.isTransientTurnError(loopError) ? new ClaudeTransientTurnError("Claude session ended unexpectedly mid-response", true) : loopError : pending && !pending.sawActivity ? new ClaudeTransientTurnError("Claude session ended unexpectedly before producing a response") : new Error("Claude session ended unexpectedly");
@@ -3,13 +3,13 @@ import { createRequire as __createRequire } from 'node:module';
3
3
  const require = __createRequire(import.meta.url);
4
4
  import {
5
5
  publishedPullRequestUrls
6
- } from "./chunk-RG6ZUUTP.js";
6
+ } from "./chunk-BMKTQMPM.js";
7
7
  import {
8
8
  isRecord
9
9
  } from "./chunk-UZSNFLDQ.js";
10
10
  import {
11
11
  shouldRefreshPullRequests
12
- } from "./chunk-LLSE2EKJ.js";
12
+ } from "./chunk-EIAP5VIF.js";
13
13
  import "./chunk-VEQXQN22.js";
14
14
 
15
15
  // src/services/post-tool-pr-notifier.ts
@@ -11,7 +11,7 @@ import {
11
11
  spawnSubagentRequestSchema,
12
12
  subagentResponseSchema,
13
13
  waitSubagentRequestSchema
14
- } from "./chunk-LLSE2EKJ.js";
14
+ } from "./chunk-EIAP5VIF.js";
15
15
  import "./chunk-VEQXQN22.js";
16
16
 
17
17
  // src/subagent-mcp.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "replicas-engine",
3
- "version": "0.1.1320",
3
+ "version": "0.1.1321",
4
4
  "description": "Lightweight API server for Replicas workspaces",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",