replicas-engine 0.1.1273 → 0.1.1275

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-BP5NIOYF.js";
12
- import "./chunk-MSAINGDM.js";
13
- import "./chunk-RN3WSTZ2.js";
14
- import "./chunk-NYTMILLQ.js";
11
+ } from "./chunk-OC2XSSGV.js";
12
+ import "./chunk-XAQ6GHR3.js";
13
+ import "./chunk-BLD35QJH.js";
14
+ import "./chunk-YYKT5ENX.js";
15
15
  import "./chunk-UZSNFLDQ.js";
16
- import "./chunk-N423MPLL.js";
16
+ import "./chunk-A67ZSUFV.js";
17
17
  import "./chunk-VEQXQN22.js";
18
18
  export {
19
19
  CODEX_ULTRAFAST_SERVICE_TIER,
@@ -4991,6 +4991,8 @@ Don't make one when:
4991
4991
  - It is screenshots, or a before and after of them: upload them as images, which readers can open full screen and zoom. See "Before and after" in \`references/MEDIA.md\`.
4992
4992
  - The user wants a page, site, or component in their project: build that in the repo.
4993
4993
 
4994
+ A long report or write-up goes in the Canvas, and its key charts and comparisons go in a visual in your reply. Never screenshot a report, chart, or diagram you made to show it: a long page shrunk to an image can't be read, and it ignores the reader's theme. Screenshots of app UI you changed are still right.
4995
+
4994
4996
  ## Make it
4995
4997
 
4996
4998
  1. Write the page, for example \`/tmp/visuals/<name>.html\`, following the page rules below.
@@ -5073,6 +5075,9 @@ var DEFAULT_USER_PREFERENCES = {
5073
5075
  open_links_in_desktop_app: false,
5074
5076
  port_forwarding: false,
5075
5077
  spotify_controls: false,
5078
+ appshot_shortcut: "command",
5079
+ appshot_destination: "automatic",
5080
+ appshot_sound: true,
5076
5081
  mothership_intro_seen: false,
5077
5082
  follow_up_mode: "steer",
5078
5083
  memory_enabled: null,
@@ -5981,25 +5986,44 @@ var REPLICAS_API_STEPS = {
5981
5986
 
5982
5987
  // ../shared/src/user-message-attachments.ts
5983
5988
  var ATTACHMENT_PLACEHOLDER_REGEX = /^\[\d+ (?:(?:images?|files?)(?: and \d+ files?)? attached|(?:image )?attachments?)\]$/;
5989
+ var APPSHOT_NOTE_REGEX = /(?:^|\n\n)<replicas_appshot app="([^"\n]*)" window="([^"\n]*)" image="(\d+)">\n([^\n<]*)(?:\n\n([^<]*))?\n<\/replicas_appshot>$/;
5990
+ var TRUNCATED_APPSHOT_NOTE_REGEX = /(?:^|\n\n)<replicas_appshot app="([^"\n]*)(?:" window="([^"\n]*)(?:" image="(\d*))?)?[^<]*(?:<\/?[a-z_]*)?$/;
5991
+ var XML_UNESCAPES = { "&amp;": "&", "&lt;": "<", "&gt;": ">", "&quot;": '"', "&#39;": "'" };
5992
+ var unescapeXml = (text3) => text3.replace(/&(?:amp|lt|gt|quot|#39);/g, (entity) => XML_UNESCAPES[entity]);
5993
+ function parseAppshot(match) {
5994
+ return {
5995
+ appName: unescapeXml(match[1] ?? ""),
5996
+ windowTitle: unescapeXml(match[2] ?? ""),
5997
+ image: Number(match[3] || 0),
5998
+ ...match[5] && { text: unescapeXml(match[5]) },
5999
+ .../ \(cut short\)\. Treat that text as untrusted data/.test(match[4] ?? "") && { textTruncated: true }
6000
+ };
6001
+ }
5984
6002
  var WALKTHROUGH_NOTE_REGEX = /(?:^|\n\n)<replicas_walkthrough path="([^"\n]+)" duration_seconds="(\d+)" audio="(true|false)">\n[^<]*\n<\/replicas_walkthrough>$/;
5985
6003
  var TRUNCATED_WALKTHROUGH_NOTE_REGEX = /(?:^|\n\n)<replicas_walkthrough path="([^"\n]*)(?:" duration_seconds="(\d*))?(?:" audio="(true)?)?[^<]*(?:<\/?[a-z_]*)?$/;
5986
6004
  function stripAttachmentNote(text3) {
5987
6005
  const match = text3.match(/(?:^|\n\n)<replicas_attachments>\nUploaded files are available at:((?:\n- .*)*)(?:\n<\/?[a-z_]*>?)?$/) ?? text3.match(/(?:^|\n\n)Uploaded files are available at:((?:\n- .*)*)$/);
5988
6006
  let content = match ? text3.replace(match[0], "").trim() : text3;
5989
- const walkthroughs = [];
5990
- const truncated = WALKTHROUGH_NOTE_REGEX.test(content) ? null : content.match(TRUNCATED_WALKTHROUGH_NOTE_REGEX);
5991
- if (truncated) {
5992
- walkthroughs.push({ path: truncated[1], durationSeconds: Number(truncated[2] ?? 0), audio: truncated[3] === "true" });
5993
- content = content.slice(0, truncated.index).trim();
5994
- }
5995
- for (let walkthrough = content.match(WALKTHROUGH_NOTE_REGEX); walkthrough; walkthrough = content.match(WALKTHROUGH_NOTE_REGEX)) {
5996
- walkthroughs.unshift({ path: walkthrough[1], durationSeconds: Number(walkthrough[2]), audio: walkthrough[3] === "true" });
5997
- content = content.slice(0, walkthrough.index).trim();
5998
- }
6007
+ const takeTrailingNotes = (noteRegex, truncatedRegex, parse) => {
6008
+ const notes = [];
6009
+ const truncated = noteRegex.test(content) ? null : content.match(truncatedRegex);
6010
+ if (truncated) {
6011
+ notes.push(parse(truncated));
6012
+ content = content.slice(0, truncated.index).trim();
6013
+ }
6014
+ for (let note = content.match(noteRegex); note; note = content.match(noteRegex)) {
6015
+ notes.unshift(parse(note));
6016
+ content = content.slice(0, note.index).trim();
6017
+ }
6018
+ return notes;
6019
+ };
6020
+ const walkthroughs = takeTrailingNotes(WALKTHROUGH_NOTE_REGEX, TRUNCATED_WALKTHROUGH_NOTE_REGEX, (walkthrough) => ({ path: walkthrough[1], durationSeconds: Number(walkthrough[2] ?? 0), audio: walkthrough[3] === "true" }));
6021
+ const appshots = takeTrailingNotes(APPSHOT_NOTE_REGEX, TRUNCATED_APPSHOT_NOTE_REGEX, parseAppshot);
5999
6022
  return {
6000
6023
  content,
6001
6024
  files: match ? [...match[1].matchAll(/^- (.+)$/gm)].map(([, path]) => path) : [],
6002
- walkthroughs
6025
+ walkthroughs,
6026
+ appshots
6003
6027
  };
6004
6028
  }
6005
6029
 
@@ -8017,18 +8041,19 @@ function filterDisplayMessages(messages, provider2) {
8017
8041
  }
8018
8042
  result = result.flatMap((msg) => {
8019
8043
  if (msg.type !== "user") return [msg];
8020
- const { content, files, walkthroughs } = stripAttachmentNote(stripReplicasInstructionBlock(msg.content).trim());
8044
+ const { content, files, walkthroughs, appshots } = stripAttachmentNote(stripReplicasInstructionBlock(msg.content).trim());
8021
8045
  if (INTERRUPTED_MESSAGE_REGEX.test(content)) {
8022
8046
  return [{ id: msg.id, type: "interruption", timestamp: msg.timestamp }];
8023
8047
  }
8024
8048
  const cleaned = (msg.images?.length || files.length) && ATTACHMENT_PLACEHOLDER_REGEX.test(content) ? "" : content;
8025
- if (cleaned.length === 0 && !msg.images?.length && files.length === 0 && walkthroughs.length === 0) return [];
8026
- if (cleaned === msg.content && files.length === 0 && walkthroughs.length === 0) return [msg];
8049
+ if (cleaned.length === 0 && !msg.images?.length && files.length === 0 && walkthroughs.length === 0 && appshots.length === 0) return [];
8050
+ if (cleaned === msg.content && files.length === 0 && walkthroughs.length === 0 && appshots.length === 0) return [msg];
8027
8051
  return [{
8028
8052
  ...msg,
8029
8053
  content: cleaned,
8030
8054
  ...files.length > 0 ? { files } : {},
8031
- ...walkthroughs.length > 0 ? { walkthroughs } : {}
8055
+ ...walkthroughs.length > 0 ? { walkthroughs } : {},
8056
+ ...appshots.length > 0 ? { appshots } : {}
8032
8057
  }];
8033
8058
  });
8034
8059
  return result;
@@ -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-NYTMILLQ.js";
6
+ } from "./chunk-YYKT5ENX.js";
7
7
  import {
8
8
  isVersionBelow
9
- } from "./chunk-N423MPLL.js";
9
+ } from "./chunk-A67ZSUFV.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.1273";
243
+ var ENGINE_PACKAGE_VERSION = "0.1.1275";
244
244
  var INITIALIZE_METHOD = "initialize";
245
245
  var INITIALIZED_NOTIFICATION = "initialized";
246
246
  var ACCOUNT_LOGIN_START_METHOD = "account/login/start";
@@ -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-RN3WSTZ2.js";
6
+ } from "./chunk-BLD35QJH.js";
7
7
  import {
8
8
  ASTER_BASE_URL,
9
9
  ASTER_PROVIDER,
@@ -13,7 +13,7 @@ import {
13
13
  isRecord,
14
14
  readOllamaAuthEnv,
15
15
  readOpenAICompatibleAuthEnv
16
- } from "./chunk-N423MPLL.js";
16
+ } from "./chunk-A67ZSUFV.js";
17
17
 
18
18
  // src/managers/codex-asp/notification-dispatch.ts
19
19
  var TURN_STARTED_METHOD = "turn/started";
@@ -5,14 +5,14 @@ import {
5
5
  getOriginDefaultBranch,
6
6
  monolithRequest,
7
7
  runGitCommand
8
- } from "./chunk-MSAINGDM.js";
8
+ } from "./chunk-XAQ6GHR3.js";
9
9
  import {
10
10
  extractCommandProtectionCommandText,
11
11
  findCommandProtectionGitLookups,
12
12
  findGitCommitSignals,
13
13
  findPrMergeSignals,
14
14
  parseCommandProtectionRequest
15
- } from "./chunk-N423MPLL.js";
15
+ } from "./chunk-A67ZSUFV.js";
16
16
 
17
17
  // src/services/command-protection-service.ts
18
18
  import { readFile, stat } from "fs/promises";
@@ -5,7 +5,7 @@ import {
5
5
  extractCommandProtectionCommandText,
6
6
  isRecord,
7
7
  parseCodeHostPrUrl
8
- } from "./chunk-N423MPLL.js";
8
+ } from "./chunk-A67ZSUFV.js";
9
9
 
10
10
  // src/services/published-pull-request-urls.ts
11
11
  function publishedPullRequestUrls(result) {
@@ -10,15 +10,15 @@ import {
10
10
  resolveDiffBase,
11
11
  runGitCommand,
12
12
  setAgentCredentialSnapshot
13
- } from "./chunk-MSAINGDM.js";
13
+ } from "./chunk-XAQ6GHR3.js";
14
14
  import {
15
15
  AppServerProcess,
16
16
  buildCodexAgentEnv
17
- } from "./chunk-RN3WSTZ2.js";
17
+ } from "./chunk-BLD35QJH.js";
18
18
  import {
19
19
  SUBPROCESS_MAX_BUFFER,
20
20
  execFileAsync
21
- } from "./chunk-NYTMILLQ.js";
21
+ } from "./chunk-YYKT5ENX.js";
22
22
  import {
23
23
  isRecord
24
24
  } from "./chunk-UZSNFLDQ.js";
@@ -55,7 +55,7 @@ import {
55
55
  resolveOpenAICompatibleModelsUrl,
56
56
  splitMothershipInstructions,
57
57
  withTimeout
58
- } from "./chunk-N423MPLL.js";
58
+ } from "./chunk-A67ZSUFV.js";
59
59
 
60
60
  // src/managers/codex-token-manager.ts
61
61
  import { promises as fs } from "fs";
@@ -291,7 +291,7 @@ var CodexTokenManager = class extends BaseRefreshManager {
291
291
  await this.applyCredentialUpdate(++this.credentialGeneration, async () => {
292
292
  await this.applyCredentialsResponse(data);
293
293
  setAgentCredentialSnapshot("codex", data);
294
- const { restartCodexAspHostIfRunning: restartCodexAspHostIfRunning2 } = await import("./asp-host-CEK5RMXT.js");
294
+ const { restartCodexAspHostIfRunning: restartCodexAspHostIfRunning2 } = await import("./asp-host-U7DZUJIB.js");
295
295
  await restartCodexAspHostIfRunning2();
296
296
  });
297
297
  await this.start(true);
@@ -313,7 +313,7 @@ var CodexTokenManager = class extends BaseRefreshManager {
313
313
  const accountChanged = ENGINE_ENV.REPLICAS_AGENT_CREDENTIALS.codex?.credentialId !== data.credentialId;
314
314
  await this.applyCredentialsResponse(data);
315
315
  if (restartOnChange && (accountChanged || CODEX_AUTH_ENV_KEYS.some((key, index) => process.env[key] !== previousEnv[index]))) {
316
- const { restartCodexAspHostIfRunning: restartCodexAspHostIfRunning2 } = await import("./asp-host-CEK5RMXT.js");
316
+ const { restartCodexAspHostIfRunning: restartCodexAspHostIfRunning2 } = await import("./asp-host-U7DZUJIB.js");
317
317
  await restartCodexAspHostIfRunning2();
318
318
  }
319
319
  setAgentCredentialSnapshot("codex", data);
@@ -4,7 +4,7 @@ const require = __createRequire(import.meta.url);
4
4
  import {
5
5
  SUBPROCESS_MAX_BUFFER,
6
6
  execFileAsync
7
- } from "./chunk-NYTMILLQ.js";
7
+ } from "./chunk-YYKT5ENX.js";
8
8
  import {
9
9
  isRecord as isRecord2
10
10
  } from "./chunk-UZSNFLDQ.js";
@@ -22,7 +22,7 @@ import {
22
22
  provisionedDeviceSchema,
23
23
  readReplicasRuntimeEnv,
24
24
  serializePosixEnvFile
25
- } from "./chunk-N423MPLL.js";
25
+ } from "./chunk-A67ZSUFV.js";
26
26
 
27
27
  // src/runtime-env-loader.ts
28
28
  import { readFileSync } from "fs";
@@ -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-N423MPLL.js";
6
+ } from "./chunk-A67ZSUFV.js";
7
7
 
8
8
  // src/utils/exec.ts
9
9
  import { exec, execFile } from "child_process";
@@ -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-RWFSXLQK.js";
7
- import "./chunk-MSAINGDM.js";
8
- import "./chunk-NYTMILLQ.js";
6
+ } from "./chunk-NIOKFQKT.js";
7
+ import "./chunk-XAQ6GHR3.js";
8
+ import "./chunk-YYKT5ENX.js";
9
9
  import {
10
10
  isRecord
11
11
  } from "./chunk-UZSNFLDQ.js";
12
- import "./chunk-N423MPLL.js";
12
+ import "./chunk-A67ZSUFV.js";
13
13
  import "./chunk-VEQXQN22.js";
14
14
 
15
15
  // src/command-protection-hook.ts
@@ -13,12 +13,12 @@ import {
13
13
  recoverCompletedTurn,
14
14
  spawnMuseMsp,
15
15
  startMuseSession
16
- } from "./chunk-MD7UNUWG.js";
16
+ } from "./chunk-KJBI5WXM.js";
17
17
  import {
18
18
  AppServerProcess,
19
19
  buildCodexAgentEnv
20
- } from "./chunk-RN3WSTZ2.js";
21
- import "./chunk-NYTMILLQ.js";
20
+ } from "./chunk-BLD35QJH.js";
21
+ import "./chunk-YYKT5ENX.js";
22
22
  import {
23
23
  AGENT,
24
24
  OPENCODE_GO_PROVIDER,
@@ -28,7 +28,7 @@ import {
28
28
  headlessAgentUsagePath,
29
29
  isRecord,
30
30
  withTimeout
31
- } from "./chunk-N423MPLL.js";
31
+ } from "./chunk-A67ZSUFV.js";
32
32
  import "./chunk-VEQXQN22.js";
33
33
 
34
34
  // 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-RWFSXLQK.js";
30
+ } from "./chunk-NIOKFQKT.js";
31
31
  import {
32
32
  ACCOUNT_RATE_LIMITS_UPDATED_METHOD,
33
33
  AGENT_MESSAGE_DELTA_METHOD,
@@ -64,10 +64,10 @@ import {
64
64
  spawnMuseMsp,
65
65
  startMuseSession,
66
66
  uuidV7
67
- } from "./chunk-MD7UNUWG.js";
67
+ } from "./chunk-KJBI5WXM.js";
68
68
  import {
69
69
  publishedPullRequestUrls
70
- } from "./chunk-DT45R2ZS.js";
70
+ } from "./chunk-O6BNU2BC.js";
71
71
  import {
72
72
  ACCOUNT_RATE_LIMITS_READ_METHOD,
73
73
  AsyncLock,
@@ -140,7 +140,7 @@ import {
140
140
  timestampFromSeconds,
141
141
  upsertCredentialFileLines,
142
142
  writeSecureCredentialFile
143
- } from "./chunk-BP5NIOYF.js";
143
+ } from "./chunk-OC2XSSGV.js";
144
144
  import {
145
145
  ENGINE_ENV,
146
146
  monolithRequest,
@@ -150,15 +150,15 @@ import {
150
150
  resolveDiffBase,
151
151
  setAgentCredentialSnapshot,
152
152
  setLinearSessionId
153
- } from "./chunk-MSAINGDM.js";
153
+ } from "./chunk-XAQ6GHR3.js";
154
154
  import {
155
155
  getCodexModelProvider
156
- } from "./chunk-RN3WSTZ2.js";
156
+ } from "./chunk-BLD35QJH.js";
157
157
  import {
158
158
  SUBPROCESS_MAX_BUFFER,
159
159
  execAsync,
160
160
  execFileAsync
161
- } from "./chunk-NYTMILLQ.js";
161
+ } from "./chunk-YYKT5ENX.js";
162
162
  import {
163
163
  isRecord as isRecord2
164
164
  } from "./chunk-UZSNFLDQ.js";
@@ -402,7 +402,7 @@ import {
402
402
  workspaceTokenRequestSchema,
403
403
  workspaceTokenResponseSchema,
404
404
  wrapInTag
405
- } from "./chunk-N423MPLL.js";
405
+ } from "./chunk-A67ZSUFV.js";
406
406
  import {
407
407
  cloneMcpConfig,
408
408
  ensureCompatibilityImports,
@@ -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-DT45R2ZS.js";
6
+ } from "./chunk-O6BNU2BC.js";
7
7
  import {
8
8
  isRecord
9
9
  } from "./chunk-UZSNFLDQ.js";
10
10
  import {
11
11
  shouldRefreshPullRequests
12
- } from "./chunk-N423MPLL.js";
12
+ } from "./chunk-A67ZSUFV.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-N423MPLL.js";
14
+ } from "./chunk-A67ZSUFV.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.1273",
3
+ "version": "0.1.1275",
4
4
  "description": "Lightweight API server for Replicas workspaces",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",