replicas-engine 0.1.584 → 0.1.586

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.
Files changed (2) hide show
  1. package/dist/src/index.js +63 -26
  2. package/package.json +1 -1
package/dist/src/index.js CHANGED
@@ -476,7 +476,8 @@ var MODEL_LABELS = {
476
476
  "kimi-k2.5": "Kimi K2.5"
477
477
  };
478
478
  var IMAGE_MEDIA_TYPES = ["image/png", "image/jpeg", "image/gif", "image/webp"];
479
- var MAX_CANVAS_FILE_BYTES = 5 * 1024 * 1024;
479
+ var MAX_CANVAS_FILE_BYTES = 25 * 1024 * 1024;
480
+ var MAX_CANVAS_PREVIEW_BYTES = 5 * 1024 * 1024;
480
481
  function isCanvasTextKind(kind) {
481
482
  return kind === "markdown" || kind === "html";
482
483
  }
@@ -3521,6 +3522,9 @@ function findGitCommitSignals(request) {
3521
3522
  return findGitCommitCommands(command).length > 0 ? ["git-commit"] : [];
3522
3523
  }
3523
3524
 
3525
+ // ../shared/src/routes/user.ts
3526
+ var PROFILE_AVATAR_MAX_SIZE_BYTES = 5 * 1024 * 1024;
3527
+
3524
3528
  // ../shared/src/routes/client-state.ts
3525
3529
  var MAX_CLIENT_STATE_REQUEST_BYTES = 5 * 1024 * 1024;
3526
3530
  var MAX_CLIENT_STATE_BYTES_PER_USER = 10 * 1024 * 1024;
@@ -11007,7 +11011,7 @@ var DEFAULT_CODEX_ARGS = ["app-server", "--listen", "stdio://"];
11007
11011
  var MIN_CODEX_CLI_VERSION = "0.144.6";
11008
11012
  var CODEX_UPGRADE_TIMEOUT_MS = 12e4;
11009
11013
  var codexCliVersionEnsured = null;
11010
- var ENGINE_PACKAGE_VERSION = "0.1.584";
11014
+ var ENGINE_PACKAGE_VERSION = "0.1.586";
11011
11015
  var INITIALIZE_METHOD = "initialize";
11012
11016
  var INITIALIZED_NOTIFICATION = "initialized";
11013
11017
  var ACCOUNT_LOGIN_START_METHOD = "account/login/start";
@@ -15631,7 +15635,7 @@ var CanvasService = class {
15631
15635
  }
15632
15636
  return Array.from(items.values()).sort((a, b) => a.filename.localeCompare(b.filename));
15633
15637
  }
15634
- async getItemFile(filename) {
15638
+ async getItemFile(filename, maxBytes = MAX_CANVAS_FILE_BYTES) {
15635
15639
  const safe = sanitizeCanvasFilename(filename);
15636
15640
  if (!safe) return null;
15637
15641
  const { kind, mimeType } = classifyCanvasFilename(safe);
@@ -15646,7 +15650,7 @@ var CanvasService = class {
15646
15650
  } catch {
15647
15651
  continue;
15648
15652
  }
15649
- if (sizeBytes > MAX_CANVAS_FILE_BYTES) {
15653
+ if (sizeBytes > maxBytes) {
15650
15654
  return {
15651
15655
  filename: safe,
15652
15656
  kind,
@@ -15666,7 +15670,7 @@ var CanvasService = class {
15666
15670
  return null;
15667
15671
  }
15668
15672
  async getItem(filename) {
15669
- const item = await this.getItemFile(filename);
15673
+ const item = await this.getItemFile(filename, MAX_CANVAS_PREVIEW_BYTES);
15670
15674
  if (!item) return null;
15671
15675
  if (item.tooLarge || !item.bytes) {
15672
15676
  return {
@@ -15689,11 +15693,36 @@ var CanvasService = class {
15689
15693
  var canvasService = new CanvasService();
15690
15694
 
15691
15695
  // src/services/upload-canvas-items.ts
15696
+ var MAX_CONCURRENT_CANVAS_UPLOADS = 2;
15697
+ var CANVAS_REQUEST_TIMEOUT_MS = 2e4;
15698
+ var MIN_CANVAS_UPLOAD_BYTES_PER_SECOND = 256 * 1024;
15692
15699
  var uploadedCanvasItems = /* @__PURE__ */ new Map();
15700
+ var pendingCanvasUploads = [];
15701
+ var activeCanvasUploads = 0;
15702
+ var canvasFlushQueue = Promise.resolve();
15693
15703
  function isReconcileCanvasItemsResponse(value) {
15694
15704
  return typeof value === "object" && value !== null && "deleted" in value && typeof value.deleted === "number" && (!("skipped" in value) || typeof value.skipped === "string");
15695
15705
  }
15696
- async function flushAllCanvasItems() {
15706
+ async function withCanvasUploadSlot(operation) {
15707
+ if (activeCanvasUploads >= MAX_CONCURRENT_CANVAS_UPLOADS) {
15708
+ await new Promise((resolve4) => pendingCanvasUploads.push(resolve4));
15709
+ } else {
15710
+ activeCanvasUploads++;
15711
+ }
15712
+ try {
15713
+ return await operation();
15714
+ } finally {
15715
+ const next = pendingCanvasUploads.shift();
15716
+ if (next) next();
15717
+ else activeCanvasUploads--;
15718
+ }
15719
+ }
15720
+ function flushAllCanvasItems() {
15721
+ const flush = canvasFlushQueue.then(flushCanvasItems);
15722
+ canvasFlushQueue = flush.then(() => void 0, () => void 0);
15723
+ return flush;
15724
+ }
15725
+ async function flushCanvasItems() {
15697
15726
  let flushed = 0;
15698
15727
  let skipped = 0;
15699
15728
  let failed = 0;
@@ -15705,26 +15734,28 @@ async function flushAllCanvasItems() {
15705
15734
  skipped++;
15706
15735
  return;
15707
15736
  }
15708
- try {
15709
- const file = await canvasService.getItemFile(item.filename);
15710
- if (!file?.bytes || file.tooLarge) {
15711
- skipped++;
15712
- return;
15713
- }
15714
- const uploaded = uploadedCanvasItems.get(file.filename);
15715
- if (uploaded?.sizeBytes === file.sizeBytes && uploaded.updatedAt === file.updatedAt) {
15737
+ await withCanvasUploadSlot(async () => {
15738
+ try {
15739
+ const file = await canvasService.getItemFile(item.filename);
15740
+ if (!file?.bytes || file.tooLarge) {
15741
+ skipped++;
15742
+ return;
15743
+ }
15744
+ const uploaded = uploadedCanvasItems.get(file.filename);
15745
+ if (uploaded?.sizeBytes === file.sizeBytes && uploaded.updatedAt === file.updatedAt) {
15746
+ filenames.push(file.filename);
15747
+ skipped++;
15748
+ return;
15749
+ }
15750
+ await uploadCanvasItem(file);
15751
+ uploadedCanvasItems.set(file.filename, { sizeBytes: file.sizeBytes, updatedAt: file.updatedAt });
15716
15752
  filenames.push(file.filename);
15717
- skipped++;
15718
- return;
15753
+ flushed++;
15754
+ } catch (err) {
15755
+ failed++;
15756
+ console.error("[CanvasUploader] upload failed:", { filename: item.filename, err });
15719
15757
  }
15720
- await uploadCanvasItem(file);
15721
- uploadedCanvasItems.set(file.filename, { sizeBytes: file.sizeBytes, updatedAt: file.updatedAt });
15722
- filenames.push(file.filename);
15723
- flushed++;
15724
- } catch (err) {
15725
- failed++;
15726
- console.error("[CanvasUploader] upload failed:", { filename: item.filename, err });
15727
- }
15758
+ });
15728
15759
  }));
15729
15760
  if (failed === 0) {
15730
15761
  try {
@@ -15750,7 +15781,12 @@ async function uploadCanvasItem(item) {
15750
15781
  new Blob([item.bytes], { type: item.mimeType }),
15751
15782
  item.filename
15752
15783
  );
15753
- const response = await monolithRequest("/v1/engine/canvas", { body: form });
15784
+ const response = await monolithRequest("/v1/engine/canvas", {
15785
+ body: form,
15786
+ signal: AbortSignal.timeout(
15787
+ CANVAS_REQUEST_TIMEOUT_MS + Math.ceil(item.sizeBytes / MIN_CANVAS_UPLOAD_BYTES_PER_SECOND) * 1e3
15788
+ )
15789
+ });
15754
15790
  if (!response.ok) {
15755
15791
  const errorText = await response.text();
15756
15792
  throw new Error(`upload failed: ${response.status} ${errorText}`);
@@ -15758,7 +15794,8 @@ async function uploadCanvasItem(item) {
15758
15794
  }
15759
15795
  async function reconcileCanvasItems(filenames) {
15760
15796
  const response = await monolithRequest("/v1/engine/canvas/reconcile", {
15761
- body: { filenames }
15797
+ body: { filenames },
15798
+ signal: AbortSignal.timeout(CANVAS_REQUEST_TIMEOUT_MS)
15762
15799
  });
15763
15800
  if (!response.ok) {
15764
15801
  const errorText = await response.text();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "replicas-engine",
3
- "version": "0.1.584",
3
+ "version": "0.1.586",
4
4
  "description": "Lightweight API server for Replicas workspaces",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",