@schoolai/shipyard 3.12.0 → 3.13.0-rc.20260615.0

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 (34) hide show
  1. package/dist/capability-detector-worker.js +4 -4
  2. package/dist/{chunk-3NML6IJM.js → chunk-7MVFHLYV.js} +2 -2
  3. package/dist/{chunk-GMMRLPGI.js → chunk-BUAEJNUG.js} +78 -13
  4. package/dist/{chunk-GMMRLPGI.js.map → chunk-BUAEJNUG.js.map} +1 -1
  5. package/dist/{chunk-HUTIDJIT.js → chunk-IWBDVGD2.js} +634 -29
  6. package/dist/chunk-IWBDVGD2.js.map +1 -0
  7. package/dist/{chunk-OCCM6UXW.js → chunk-KUPHN3ZN.js} +2 -2
  8. package/dist/{chunk-LUKN75OT.js → chunk-M3WBYTB3.js} +4 -2
  9. package/dist/chunk-M3WBYTB3.js.map +1 -0
  10. package/dist/{chunk-KJAEED3H.js → chunk-MR6HRO7R.js} +3 -3
  11. package/dist/{chunk-Q6JQK2DR.js → chunk-OX3UY44R.js} +4 -4
  12. package/dist/{chunk-LXFMCDAZ.js → chunk-RCEAMZVG.js} +2 -2
  13. package/dist/cursor-runner.js +3 -3
  14. package/dist/electron-utility.js +2 -2
  15. package/dist/index.js +5 -5
  16. package/dist/{login-2DJVKACB.js → login-HRR3T4SZ.js} +3 -3
  17. package/dist/{plan-backfill-S7FKJVOP.js → plan-backfill-QNJUWOYP.js} +4 -4
  18. package/dist/{roi-PTTYX6XY.js → roi-HNJRISLW.js} +11 -12
  19. package/dist/roi-HNJRISLW.js.map +1 -0
  20. package/dist/{serve-2N7BIGRO.js → serve-3N7IHREI.js} +718 -268
  21. package/dist/{serve-2N7BIGRO.js.map → serve-3N7IHREI.js.map} +1 -1
  22. package/dist/{start-GKHRXDGA.js → start-UPNI6OOF.js} +6 -6
  23. package/package.json +1 -1
  24. package/dist/chunk-HUTIDJIT.js.map +0 -1
  25. package/dist/chunk-LUKN75OT.js.map +0 -1
  26. package/dist/roi-PTTYX6XY.js.map +0 -1
  27. /package/dist/{chunk-3NML6IJM.js.map → chunk-7MVFHLYV.js.map} +0 -0
  28. /package/dist/{chunk-OCCM6UXW.js.map → chunk-KUPHN3ZN.js.map} +0 -0
  29. /package/dist/{chunk-KJAEED3H.js.map → chunk-MR6HRO7R.js.map} +0 -0
  30. /package/dist/{chunk-Q6JQK2DR.js.map → chunk-OX3UY44R.js.map} +0 -0
  31. /package/dist/{chunk-LXFMCDAZ.js.map → chunk-RCEAMZVG.js.map} +0 -0
  32. /package/dist/{login-2DJVKACB.js.map → login-HRR3T4SZ.js.map} +0 -0
  33. /package/dist/{plan-backfill-S7FKJVOP.js.map → plan-backfill-QNJUWOYP.js.map} +0 -0
  34. /package/dist/{start-GKHRXDGA.js.map → start-UPNI6OOF.js.map} +0 -0
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  PUBLISHED_PREVIEW_KINDS,
4
4
  PUBLISH_TTL_CHOICES
5
- } from "./chunk-LUKN75OT.js";
5
+ } from "./chunk-M3WBYTB3.js";
6
6
  import {
7
7
  external_exports
8
8
  } from "./chunk-JCEWPG3R.js";
@@ -11538,11 +11538,11 @@ var fromCodePoint = (
11538
11538
  }
11539
11539
  );
11540
11540
  function replaceCodePoint(codePoint) {
11541
- var _a2;
11541
+ var _a3;
11542
11542
  if (codePoint >= 55296 && codePoint <= 57343 || codePoint > 1114111) {
11543
11543
  return 65533;
11544
11544
  }
11545
- return (_a2 = decodeMap.get(codePoint)) !== null && _a2 !== void 0 ? _a2 : codePoint;
11545
+ return (_a3 = decodeMap.get(codePoint)) !== null && _a3 !== void 0 ? _a3 : codePoint;
11546
11546
  }
11547
11547
 
11548
11548
  // ../../node_modules/.pnpm/entities@4.5.0/node_modules/entities/lib/esm/decode.js
@@ -11739,9 +11739,9 @@ var EntityDecoder = class {
11739
11739
  * @returns The number of characters that were consumed.
11740
11740
  */
11741
11741
  emitNumericEntity(lastCp, expectedLength) {
11742
- var _a2;
11742
+ var _a3;
11743
11743
  if (this.consumed <= expectedLength) {
11744
- (_a2 = this.errors) === null || _a2 === void 0 ? void 0 : _a2.absenceOfDigitsInNumericCharacterReference(this.consumed);
11744
+ (_a3 = this.errors) === null || _a3 === void 0 ? void 0 : _a3.absenceOfDigitsInNumericCharacterReference(this.consumed);
11745
11745
  return 0;
11746
11746
  }
11747
11747
  if (lastCp === CharCodes.SEMI) {
@@ -11801,11 +11801,11 @@ var EntityDecoder = class {
11801
11801
  * @returns The number of characters consumed.
11802
11802
  */
11803
11803
  emitNotTerminatedNamedEntity() {
11804
- var _a2;
11804
+ var _a3;
11805
11805
  const { result, decodeTree } = this;
11806
11806
  const valueLength = (decodeTree[result] & BinTrieFlags.VALUE_LENGTH) >> 14;
11807
11807
  this.emitNamedEntityData(result, valueLength, this.consumed);
11808
- (_a2 = this.errors) === null || _a2 === void 0 ? void 0 : _a2.missingSemicolonAfterCharacterReference();
11808
+ (_a3 = this.errors) === null || _a3 === void 0 ? void 0 : _a3.missingSemicolonAfterCharacterReference();
11809
11809
  return this.consumed;
11810
11810
  }
11811
11811
  /**
@@ -11833,7 +11833,7 @@ var EntityDecoder = class {
11833
11833
  * @returns The number of characters consumed.
11834
11834
  */
11835
11835
  end() {
11836
- var _a2;
11836
+ var _a3;
11837
11837
  switch (this.state) {
11838
11838
  case EntityDecoderState.NamedEntity: {
11839
11839
  return this.result !== 0 && (this.decodeMode !== DecodingMode.Attribute || this.result === this.treeIndex) ? this.emitNotTerminatedNamedEntity() : 0;
@@ -11846,7 +11846,7 @@ var EntityDecoder = class {
11846
11846
  return this.emitNumericEntity(0, 3);
11847
11847
  }
11848
11848
  case EntityDecoderState.NumericStart: {
11849
- (_a2 = this.errors) === null || _a2 === void 0 ? void 0 : _a2.absenceOfDigitsInNumericCharacterReference(this.consumed);
11849
+ (_a3 = this.errors) === null || _a3 === void 0 ? void 0 : _a3.absenceOfDigitsInNumericCharacterReference(this.consumed);
11850
11850
  return 0;
11851
11851
  }
11852
11852
  case EntityDecoderState.EntityStart: {
@@ -12842,21 +12842,21 @@ function linkify(state) {
12842
12842
  if (links.length > 0 && links[0].index === 0 && i > 0 && tokens[i - 1].type === "text_special") {
12843
12843
  links = links.slice(1);
12844
12844
  }
12845
- for (let ln = 0; ln < links.length; ln++) {
12846
- const url = links[ln].url;
12845
+ for (let ln2 = 0; ln2 < links.length; ln2++) {
12846
+ const url = links[ln2].url;
12847
12847
  const fullUrl = state.md.normalizeLink(url);
12848
12848
  if (!state.md.validateLink(fullUrl)) {
12849
12849
  continue;
12850
12850
  }
12851
- let urlText = links[ln].text;
12852
- if (!links[ln].schema) {
12851
+ let urlText = links[ln2].text;
12852
+ if (!links[ln2].schema) {
12853
12853
  urlText = state.md.normalizeLinkText("http://" + urlText).replace(/^http:\/\//, "");
12854
- } else if (links[ln].schema === "mailto:" && !/^mailto:/i.test(urlText)) {
12854
+ } else if (links[ln2].schema === "mailto:" && !/^mailto:/i.test(urlText)) {
12855
12855
  urlText = state.md.normalizeLinkText("mailto:" + urlText).replace(/^mailto:/, "");
12856
12856
  } else {
12857
12857
  urlText = state.md.normalizeLinkText(urlText);
12858
12858
  }
12859
- const pos = links[ln].index;
12859
+ const pos = links[ln2].index;
12860
12860
  if (pos > lastPos) {
12861
12861
  const token = new state.Token("text", "", 0);
12862
12862
  token.content = text2.slice(lastPos, pos);
@@ -12878,7 +12878,7 @@ function linkify(state) {
12878
12878
  token_c.markup = "linkify";
12879
12879
  token_c.info = "auto";
12880
12880
  nodes.push(token_c);
12881
- lastPos = links[ln].lastIndex;
12881
+ lastPos = links[ln2].lastIndex;
12882
12882
  }
12883
12883
  if (lastPos < text2.length) {
12884
12884
  const token = new state.Token("text", "", 0);
@@ -15308,8 +15308,8 @@ function isLinkClose2(str) {
15308
15308
  return /^<\/a\s*>/i.test(str);
15309
15309
  }
15310
15310
  function isLetter(ch) {
15311
- const lc = ch | 32;
15312
- return lc >= 97 && lc <= 122;
15311
+ const lc2 = ch | 32;
15312
+ return lc2 >= 97 && lc2 <= 122;
15313
15313
  }
15314
15314
  function html_inline(state, silent) {
15315
15315
  if (!state.md.options.html) {
@@ -17904,6 +17904,18 @@ var PlanRepository = class {
17904
17904
  docIdFor(taskId) {
17905
17905
  return buildPlanDocId(taskId, this.#epoch);
17906
17906
  }
17907
+ /**
17908
+ * FM-2: whether this task's plan doc has on-disk chunks. Returns `null` when no
17909
+ * storage boundary is injected (browser repos, in-memory tests) — the caller
17910
+ * then can't distinguish transient-error from absent and falls back to its
17911
+ * prior behavior. A non-null boolean lets the lazy rebuild treat
17912
+ * "empty-read-but-dir-present" as a transient storage error rather than a
17913
+ * confirmed-absent doc, so it never clobbers a real on-disk plan.
17914
+ */
17915
+ async hasOnDiskDoc(taskId) {
17916
+ if (!this.#storageBoundary) return null;
17917
+ return this.#storageBoundary.hasDoc(buildPlanDocId(taskId, this.#epoch));
17918
+ }
17907
17919
  dispose() {
17908
17920
  this.#planDocs.clear();
17909
17921
  this.#subscriberCounts.clear();
@@ -19151,6 +19163,7 @@ var TokenCategoryItemSchema = external_exports.object({
19151
19163
  var PersistedTurnStatsSchema = external_exports.object({
19152
19164
  type: external_exports.literal("turn_stats"),
19153
19165
  taskId: external_exports.string(),
19166
+ threadId: external_exports.string().optional(),
19154
19167
  totalCostUsd: external_exports.number(),
19155
19168
  durationMs: external_exports.number(),
19156
19169
  durationApiMs: external_exports.number(),
@@ -19594,6 +19607,7 @@ var TaskRecordSchema = external_exports.object({
19594
19607
  * `claude --resume <sessionId>`.
19595
19608
  */
19596
19609
  currentSessionId: external_exports.string().nullable().default(null),
19610
+ clearedAtSeqNo: external_exports.number().int().nullable().default(null),
19597
19611
  /**
19598
19612
  * Drives the browser overlay shown during task bring-up. `starting_from_linear`
19599
19613
  * means the daemon is provisioning a worktree + first message before unmasking
@@ -21721,7 +21735,19 @@ var BrowserToDaemonControlMessageSchema = external_exports.discriminatedUnion("t
21721
21735
  * Optional/nullable: pre-PROTOCOL_VERSION 60 browsers omit this and the
21722
21736
  * daemon falls back to the cached snapshot (existing behavior).
21723
21737
  */
21724
- force: external_exports.boolean().optional()
21738
+ force: external_exports.boolean().optional(),
21739
+ /**
21740
+ * The browser's PROTOCOL_VERSION, advertised on the first
21741
+ * `request_capabilities` frame sent after the data channel opens
21742
+ * (PROTOCOL_VERSION 139). The daemon uses this to gate per-peer
21743
+ * deflate compression on the outbound daemon-control channel:
21744
+ * frames ≥ 1 KB are compressed only when this value is ≥
21745
+ * CONTROL_COMPRESSION_MIN_VERSION (= 139).
21746
+ *
21747
+ * Additive / optional: pre-v139 browsers omit this field; the daemon
21748
+ * treats its absence as "compression not supported" and sends plain JSON.
21749
+ */
21750
+ protocolVersion: external_exports.number().int().optional()
21725
21751
  }),
21726
21752
  /**
21727
21753
  * Browser asks the daemon to send the current skills list (PROTOCOL_VERSION
@@ -21997,6 +22023,16 @@ var BrowserToDaemonControlMessageSchema = external_exports.discriminatedUnion("t
21997
22023
  ids: external_exports.array(external_exports.string())
21998
22024
  }),
21999
22025
  external_exports.object({ type: external_exports.literal("request_annotation_snapshot"), taskId: external_exports.string() }),
22026
+ /**
22027
+ * Browser asks the daemon to re-push the visualization HTML for a task's
22028
+ * canvas `html` elements (PROTOCOL_VERSION 137). Mirrors
22029
+ * `request_annotation_snapshot`: fired on control-channel open + task-switch
22030
+ * so a reloaded browser (whose sessionStorage viz cache was cleared) re-pulls
22031
+ * content the CRDT element references by slug. The daemon responds with the
22032
+ * existing `viz_content_batch`. Pre-137 daemons `safeParse`-drop this and the
22033
+ * browser falls back to the inline CRDT `data.content` (no regression).
22034
+ */
22035
+ external_exports.object({ type: external_exports.literal("request_viz_content_batch"), taskId: external_exports.string() }),
22000
22036
  /**
22001
22037
  * Browser asks for the heavy DOM-detail fields stripped from
22002
22038
  * `annotation_snapshot` / `annotation_added` (elementHtml, cssClasses,
@@ -23409,7 +23445,11 @@ var DaemonToBrowserControlMessageSchema = external_exports.discriminatedUnion("t
23409
23445
  /** Codex BASELINE_TOKENS (~12k) for display calculation. Absent for non-Codex runtimes. */
23410
23446
  nativeBaseline: external_exports.number().optional()
23411
23447
  }),
23412
- external_exports.object({ type: external_exports.literal("session_cleared"), taskId: external_exports.string() }),
23448
+ external_exports.object({
23449
+ type: external_exports.literal("session_cleared"),
23450
+ taskId: external_exports.string(),
23451
+ clearedAtSeqNo: external_exports.number().int().default(-1)
23452
+ }),
23413
23453
  /**
23414
23454
  * Cross-runtime handoff result (PROTOCOL_VERSION 114). Emitted by the
23415
23455
  * daemon on each per-runtime import path (Claude sessionStore prep,
@@ -24234,9 +24274,22 @@ function parseFileUri(uri) {
24234
24274
  function classifyCriticality(msg) {
24235
24275
  switch (msg.type) {
24236
24276
  /**
24237
- * Best-effort: idempotent presence fanout. A dropped delta is corrected
24238
- * by the next `presence_state` snapshot. Presence staleness for <1s is
24239
- * imperceptible and these messages are high-frequency during agent runs.
24277
+ * Best-effort: idempotent fanout messages that self-correct on the next
24278
+ * emission and do not block any awaited browser action.
24279
+ *
24280
+ * - presence_state / presence_delta: A dropped delta is corrected by the
24281
+ * next snapshot. Presence staleness for <1s is imperceptible; these are
24282
+ * high-frequency during agent runs.
24283
+ *
24284
+ * - resource_batch_state: Drives the "Send now" countdown UI
24285
+ * (useResourceBatchStore ← batch-countdown.tsx). The snapshot is
24286
+ * replace-not-merge — the store self-corrects on the next live emit or
24287
+ * on a turn-end `flushAt: null`. A mid-turn reconnect is also covered:
24288
+ * the browser control-channel manager's dc close handler calls
24289
+ * `useResourceBatchStore.getState().clearAll()` so no stale countdown
24290
+ * lingers after the channel tears down. Moving out of the ALO outbox
24291
+ * eliminates 154 K persisted sends / 44 MB per 48 h while the browser
24292
+ * still receives every emission over the live channel.
24240
24293
  *
24241
24294
  * ALL other messages stay critical regardless of topic, because they are
24242
24295
  * `requestId`-correlated replies (browser awaits with a 30s timeout and
@@ -24245,6 +24298,7 @@ function classifyCriticality(msg) {
24245
24298
  */
24246
24299
  case "presence_state":
24247
24300
  case "presence_delta":
24301
+ case "resource_batch_state":
24248
24302
  return "best-effort";
24249
24303
  /**
24250
24304
  * Critical: everything else. Includes (but is not limited to):
@@ -24312,7 +24366,6 @@ function classifyCriticality(msg) {
24312
24366
  case "plugin_cc_install_status":
24313
24367
  case "plugin_cc_uninstall_status":
24314
24368
  case "plugin_data_response":
24315
- case "resource_batch_state":
24316
24369
  case "resource_changed":
24317
24370
  case "resource_read_response":
24318
24371
  case "agent_install_status":
@@ -27287,11 +27340,30 @@ var ChunkReassembler = class {
27287
27340
  );
27288
27341
  return assembled;
27289
27342
  }
27290
- /** Try to parse raw data, handling chunked messages transparently. */
27291
- parseOrReassemble(data) {
27343
+ /**
27344
+ * Try to parse raw data, handling chunked messages and optional inflation
27345
+ * transparently.
27346
+ *
27347
+ * @param data - The raw string received from the data channel.
27348
+ * @param inflate - Optional transform applied to the fully-assembled string
27349
+ * BEFORE JSON.parse. Used by the control channel to inflate compressed
27350
+ * frames (PROTOCOL_VERSION 139). The inflater is a no-op for plain frames
27351
+ * (it returns the input unchanged when no marker is present), so passing
27352
+ * `maybeInflateControlFrame` is safe even when compression is not in use.
27353
+ * Applied to both single-message and reassembled-chunk paths so that
27354
+ * compressed chunked messages are handled correctly.
27355
+ */
27356
+ parseOrReassemble(data, inflate) {
27292
27357
  let parsed;
27358
+ let inflated;
27359
+ try {
27360
+ inflated = inflate ? inflate(data) : data;
27361
+ } catch {
27362
+ this.#log(`[ControlChannelManager] control frame inflate failed`);
27363
+ return null;
27364
+ }
27293
27365
  try {
27294
- parsed = JSON.parse(data);
27366
+ parsed = JSON.parse(inflated);
27295
27367
  } catch {
27296
27368
  this.#log(`[ControlChannelManager] Invalid JSON from daemon`);
27297
27369
  return null;
@@ -27305,8 +27377,15 @@ var ChunkReassembler = class {
27305
27377
  };
27306
27378
  const reassembled = this.reassemble(chunk);
27307
27379
  if (!reassembled) return null;
27380
+ let inflatedReassembled;
27308
27381
  try {
27309
- return JSON.parse(reassembled);
27382
+ inflatedReassembled = inflate ? inflate(reassembled) : reassembled;
27383
+ } catch {
27384
+ this.#log(`[ControlChannelManager] control frame inflate failed`);
27385
+ return null;
27386
+ }
27387
+ try {
27388
+ return JSON.parse(inflatedReassembled);
27310
27389
  } catch {
27311
27390
  this.#log(`[ControlChannelManager] Invalid JSON after chunk reassembly`);
27312
27391
  return null;
@@ -27344,6 +27423,531 @@ function chunkSerializedMessage(data, opts) {
27344
27423
  return chunks;
27345
27424
  }
27346
27425
 
27426
+ // ../../node_modules/.pnpm/fflate@0.8.3/node_modules/fflate/esm/index.mjs
27427
+ import { createRequire } from "module";
27428
+ var require2 = createRequire("/");
27429
+ var _a2;
27430
+ var Worker;
27431
+ var isMarkedAsUntransferable;
27432
+ try {
27433
+ _a2 = require2("worker_threads"), Worker = _a2.Worker, isMarkedAsUntransferable = _a2.isMarkedAsUntransferable;
27434
+ } catch (e) {
27435
+ }
27436
+ var u8 = Uint8Array;
27437
+ var u16 = Uint16Array;
27438
+ var i32 = Int32Array;
27439
+ var fleb = new u8([
27440
+ 0,
27441
+ 0,
27442
+ 0,
27443
+ 0,
27444
+ 0,
27445
+ 0,
27446
+ 0,
27447
+ 0,
27448
+ 1,
27449
+ 1,
27450
+ 1,
27451
+ 1,
27452
+ 2,
27453
+ 2,
27454
+ 2,
27455
+ 2,
27456
+ 3,
27457
+ 3,
27458
+ 3,
27459
+ 3,
27460
+ 4,
27461
+ 4,
27462
+ 4,
27463
+ 4,
27464
+ 5,
27465
+ 5,
27466
+ 5,
27467
+ 5,
27468
+ 0,
27469
+ /* unused */
27470
+ 0,
27471
+ 0,
27472
+ /* impossible */
27473
+ 0
27474
+ ]);
27475
+ var fdeb = new u8([
27476
+ 0,
27477
+ 0,
27478
+ 0,
27479
+ 0,
27480
+ 1,
27481
+ 1,
27482
+ 2,
27483
+ 2,
27484
+ 3,
27485
+ 3,
27486
+ 4,
27487
+ 4,
27488
+ 5,
27489
+ 5,
27490
+ 6,
27491
+ 6,
27492
+ 7,
27493
+ 7,
27494
+ 8,
27495
+ 8,
27496
+ 9,
27497
+ 9,
27498
+ 10,
27499
+ 10,
27500
+ 11,
27501
+ 11,
27502
+ 12,
27503
+ 12,
27504
+ 13,
27505
+ 13,
27506
+ /* unused */
27507
+ 0,
27508
+ 0
27509
+ ]);
27510
+ var clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);
27511
+ var freb = function(eb, start) {
27512
+ var b = new u16(31);
27513
+ for (var i = 0; i < 31; ++i) {
27514
+ b[i] = start += 1 << eb[i - 1];
27515
+ }
27516
+ var r = new i32(b[30]);
27517
+ for (var i = 1; i < 30; ++i) {
27518
+ for (var j = b[i]; j < b[i + 1]; ++j) {
27519
+ r[j] = j - b[i] << 5 | i;
27520
+ }
27521
+ }
27522
+ return { b, r };
27523
+ };
27524
+ var _a2 = freb(fleb, 2);
27525
+ var fl = _a2.b;
27526
+ var revfl = _a2.r;
27527
+ fl[28] = 258, revfl[258] = 28;
27528
+ var _b = freb(fdeb, 0);
27529
+ var fd = _b.b;
27530
+ var revfd = _b.r;
27531
+ var rev = new u16(32768);
27532
+ for (i = 0; i < 32768; ++i) {
27533
+ x = (i & 43690) >> 1 | (i & 21845) << 1;
27534
+ x = (x & 52428) >> 2 | (x & 13107) << 2;
27535
+ x = (x & 61680) >> 4 | (x & 3855) << 4;
27536
+ rev[i] = ((x & 65280) >> 8 | (x & 255) << 8) >> 1;
27537
+ }
27538
+ var x;
27539
+ var i;
27540
+ var hMap = (function(cd, mb, r) {
27541
+ var s = cd.length;
27542
+ var i = 0;
27543
+ var l = new u16(mb);
27544
+ for (; i < s; ++i) {
27545
+ if (cd[i])
27546
+ ++l[cd[i] - 1];
27547
+ }
27548
+ var le = new u16(mb);
27549
+ for (i = 1; i < mb; ++i) {
27550
+ le[i] = le[i - 1] + l[i - 1] << 1;
27551
+ }
27552
+ var co;
27553
+ if (r) {
27554
+ co = new u16(1 << mb);
27555
+ var rvb = 15 - mb;
27556
+ for (i = 0; i < s; ++i) {
27557
+ if (cd[i]) {
27558
+ var sv = i << 4 | cd[i];
27559
+ var r_1 = mb - cd[i];
27560
+ var v = le[cd[i] - 1]++ << r_1;
27561
+ for (var m = v | (1 << r_1) - 1; v <= m; ++v) {
27562
+ co[rev[v] >> rvb] = sv;
27563
+ }
27564
+ }
27565
+ }
27566
+ } else {
27567
+ co = new u16(s);
27568
+ for (i = 0; i < s; ++i) {
27569
+ if (cd[i]) {
27570
+ co[i] = rev[le[cd[i] - 1]++] >> 15 - cd[i];
27571
+ }
27572
+ }
27573
+ }
27574
+ return co;
27575
+ });
27576
+ var flt = new u8(288);
27577
+ for (i = 0; i < 144; ++i)
27578
+ flt[i] = 8;
27579
+ var i;
27580
+ for (i = 144; i < 256; ++i)
27581
+ flt[i] = 9;
27582
+ var i;
27583
+ for (i = 256; i < 280; ++i)
27584
+ flt[i] = 7;
27585
+ var i;
27586
+ for (i = 280; i < 288; ++i)
27587
+ flt[i] = 8;
27588
+ var i;
27589
+ var fdt = new u8(32);
27590
+ for (i = 0; i < 32; ++i)
27591
+ fdt[i] = 5;
27592
+ var i;
27593
+ var flm = /* @__PURE__ */ hMap(flt, 9, 0);
27594
+ var fdm = /* @__PURE__ */ hMap(fdt, 5, 0);
27595
+ var shft = function(p) {
27596
+ return (p + 7) / 8 | 0;
27597
+ };
27598
+ var slc = function(v, s, e) {
27599
+ if (s == null || s < 0)
27600
+ s = 0;
27601
+ if (e == null || e > v.length)
27602
+ e = v.length;
27603
+ return new u8(v.subarray(s, e));
27604
+ };
27605
+ var wbits = function(d, p, v) {
27606
+ v <<= p & 7;
27607
+ var o = p / 8 | 0;
27608
+ d[o] |= v;
27609
+ d[o + 1] |= v >> 8;
27610
+ };
27611
+ var wbits16 = function(d, p, v) {
27612
+ v <<= p & 7;
27613
+ var o = p / 8 | 0;
27614
+ d[o] |= v;
27615
+ d[o + 1] |= v >> 8;
27616
+ d[o + 2] |= v >> 16;
27617
+ };
27618
+ var hTree = function(d, mb) {
27619
+ var t = [];
27620
+ for (var i = 0; i < d.length; ++i) {
27621
+ if (d[i])
27622
+ t.push({ s: i, f: d[i] });
27623
+ }
27624
+ var s = t.length;
27625
+ var t2 = t.slice();
27626
+ if (!s)
27627
+ return { t: et, l: 0 };
27628
+ if (s == 1) {
27629
+ var v = new u8(t[0].s + 1);
27630
+ v[t[0].s] = 1;
27631
+ return { t: v, l: 1 };
27632
+ }
27633
+ t.sort(function(a, b) {
27634
+ return a.f - b.f;
27635
+ });
27636
+ t.push({ s: -1, f: 25001 });
27637
+ var l = t[0], r = t[1], i0 = 0, i1 = 1, i2 = 2;
27638
+ t[0] = { s: -1, f: l.f + r.f, l, r };
27639
+ while (i1 != s - 1) {
27640
+ l = t[t[i0].f < t[i2].f ? i0++ : i2++];
27641
+ r = t[i0 != i1 && t[i0].f < t[i2].f ? i0++ : i2++];
27642
+ t[i1++] = { s: -1, f: l.f + r.f, l, r };
27643
+ }
27644
+ var maxSym = t2[0].s;
27645
+ for (var i = 1; i < s; ++i) {
27646
+ if (t2[i].s > maxSym)
27647
+ maxSym = t2[i].s;
27648
+ }
27649
+ var tr = new u16(maxSym + 1);
27650
+ var mbt = ln(t[i1 - 1], tr, 0);
27651
+ if (mbt > mb) {
27652
+ var i = 0, dt = 0;
27653
+ var lft = mbt - mb, cst = 1 << lft;
27654
+ t2.sort(function(a, b) {
27655
+ return tr[b.s] - tr[a.s] || a.f - b.f;
27656
+ });
27657
+ for (; i < s; ++i) {
27658
+ var i2_1 = t2[i].s;
27659
+ if (tr[i2_1] > mb) {
27660
+ dt += cst - (1 << mbt - tr[i2_1]);
27661
+ tr[i2_1] = mb;
27662
+ } else
27663
+ break;
27664
+ }
27665
+ dt >>= lft;
27666
+ while (dt > 0) {
27667
+ var i2_2 = t2[i].s;
27668
+ if (tr[i2_2] < mb)
27669
+ dt -= 1 << mb - tr[i2_2]++ - 1;
27670
+ else
27671
+ ++i;
27672
+ }
27673
+ for (; i >= 0 && dt; --i) {
27674
+ var i2_3 = t2[i].s;
27675
+ if (tr[i2_3] == mb) {
27676
+ --tr[i2_3];
27677
+ ++dt;
27678
+ }
27679
+ }
27680
+ mbt = mb;
27681
+ }
27682
+ return { t: new u8(tr), l: mbt };
27683
+ };
27684
+ var ln = function(n, l, d) {
27685
+ return n.s == -1 ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1)) : l[n.s] = d;
27686
+ };
27687
+ var lc = function(c) {
27688
+ var s = c.length;
27689
+ while (s && !c[--s])
27690
+ ;
27691
+ var cl = new u16(++s);
27692
+ var cli = 0, cln = c[0], cls = 1;
27693
+ var w = function(v) {
27694
+ cl[cli++] = v;
27695
+ };
27696
+ for (var i = 1; i <= s; ++i) {
27697
+ if (c[i] == cln && i != s)
27698
+ ++cls;
27699
+ else {
27700
+ if (!cln && cls > 2) {
27701
+ for (; cls > 138; cls -= 138)
27702
+ w(32754);
27703
+ if (cls > 2) {
27704
+ w(cls > 10 ? cls - 11 << 5 | 28690 : cls - 3 << 5 | 12305);
27705
+ cls = 0;
27706
+ }
27707
+ } else if (cls > 3) {
27708
+ w(cln), --cls;
27709
+ for (; cls > 6; cls -= 6)
27710
+ w(8304);
27711
+ if (cls > 2)
27712
+ w(cls - 3 << 5 | 8208), cls = 0;
27713
+ }
27714
+ while (cls--)
27715
+ w(cln);
27716
+ cls = 1;
27717
+ cln = c[i];
27718
+ }
27719
+ }
27720
+ return { c: cl.subarray(0, cli), n: s };
27721
+ };
27722
+ var clen = function(cf, cl) {
27723
+ var l = 0;
27724
+ for (var i = 0; i < cl.length; ++i)
27725
+ l += cf[i] * cl[i];
27726
+ return l;
27727
+ };
27728
+ var wfblk = function(out, pos, dat) {
27729
+ var s = dat.length;
27730
+ var o = shft(pos + 2);
27731
+ out[o] = s & 255;
27732
+ out[o + 1] = s >> 8;
27733
+ out[o + 2] = out[o] ^ 255;
27734
+ out[o + 3] = out[o + 1] ^ 255;
27735
+ for (var i = 0; i < s; ++i)
27736
+ out[o + i + 4] = dat[i];
27737
+ return (o + 4 + s) * 8;
27738
+ };
27739
+ var wblk = function(dat, out, final, syms, lf, df, eb, li, bs, bl, p) {
27740
+ wbits(out, p++, final);
27741
+ ++lf[256];
27742
+ var _a3 = hTree(lf, 15), dlt = _a3.t, mlb = _a3.l;
27743
+ var _b2 = hTree(df, 15), ddt = _b2.t, mdb = _b2.l;
27744
+ var _c = lc(dlt), lclt = _c.c, nlc = _c.n;
27745
+ var _d = lc(ddt), lcdt = _d.c, ndc = _d.n;
27746
+ var lcfreq = new u16(19);
27747
+ for (var i = 0; i < lclt.length; ++i)
27748
+ ++lcfreq[lclt[i] & 31];
27749
+ for (var i = 0; i < lcdt.length; ++i)
27750
+ ++lcfreq[lcdt[i] & 31];
27751
+ var _e = hTree(lcfreq, 7), lct = _e.t, mlcb = _e.l;
27752
+ var nlcc = 19;
27753
+ for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc)
27754
+ ;
27755
+ var flen = bl + 5 << 3;
27756
+ var ftlen = clen(lf, flt) + clen(df, fdt) + eb;
27757
+ var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + 2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18];
27758
+ if (bs >= 0 && flen <= ftlen && flen <= dtlen)
27759
+ return wfblk(out, p, dat.subarray(bs, bs + bl));
27760
+ var lm, ll, dm, dl;
27761
+ wbits(out, p, 1 + (dtlen < ftlen)), p += 2;
27762
+ if (dtlen < ftlen) {
27763
+ lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt;
27764
+ var llm = hMap(lct, mlcb, 0);
27765
+ wbits(out, p, nlc - 257);
27766
+ wbits(out, p + 5, ndc - 1);
27767
+ wbits(out, p + 10, nlcc - 4);
27768
+ p += 14;
27769
+ for (var i = 0; i < nlcc; ++i)
27770
+ wbits(out, p + 3 * i, lct[clim[i]]);
27771
+ p += 3 * nlcc;
27772
+ var lcts = [lclt, lcdt];
27773
+ for (var it = 0; it < 2; ++it) {
27774
+ var clct = lcts[it];
27775
+ for (var i = 0; i < clct.length; ++i) {
27776
+ var len = clct[i] & 31;
27777
+ wbits(out, p, llm[len]), p += lct[len];
27778
+ if (len > 15)
27779
+ wbits(out, p, clct[i] >> 5 & 127), p += clct[i] >> 12;
27780
+ }
27781
+ }
27782
+ } else {
27783
+ lm = flm, ll = flt, dm = fdm, dl = fdt;
27784
+ }
27785
+ for (var i = 0; i < li; ++i) {
27786
+ var sym = syms[i];
27787
+ if (sym > 255) {
27788
+ var len = sym >> 18 & 31;
27789
+ wbits16(out, p, lm[len + 257]), p += ll[len + 257];
27790
+ if (len > 7)
27791
+ wbits(out, p, sym >> 23 & 31), p += fleb[len];
27792
+ var dst = sym & 31;
27793
+ wbits16(out, p, dm[dst]), p += dl[dst];
27794
+ if (dst > 3)
27795
+ wbits16(out, p, sym >> 5 & 8191), p += fdeb[dst];
27796
+ } else {
27797
+ wbits16(out, p, lm[sym]), p += ll[sym];
27798
+ }
27799
+ }
27800
+ wbits16(out, p, lm[256]);
27801
+ return p + ll[256];
27802
+ };
27803
+ var deo = /* @__PURE__ */ new i32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]);
27804
+ var et = /* @__PURE__ */ new u8(0);
27805
+ var dflt = function(dat, lvl, plvl, pre, post, st) {
27806
+ var s = st.z || dat.length;
27807
+ var o = new u8(pre + s + 5 * (1 + Math.ceil(s / 7e3)) + post);
27808
+ var w = o.subarray(pre, o.length - post);
27809
+ var lst = st.l;
27810
+ var pos = (st.r || 0) & 7;
27811
+ if (lvl) {
27812
+ if (pos)
27813
+ w[0] = st.r >> 3;
27814
+ var opt = deo[lvl - 1];
27815
+ var n = opt >> 13, c = opt & 8191;
27816
+ var msk_1 = (1 << plvl) - 1;
27817
+ var prev = st.p || new u16(32768), head = st.h || new u16(msk_1 + 1);
27818
+ var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1;
27819
+ var hsh = function(i2) {
27820
+ return (dat[i2] ^ dat[i2 + 1] << bs1_1 ^ dat[i2 + 2] << bs2_1) & msk_1;
27821
+ };
27822
+ var syms = new i32(25e3);
27823
+ var lf = new u16(288), df = new u16(32);
27824
+ var lc_1 = 0, eb = 0, i = st.i || 0, li = 0, wi = st.w || 0, bs = 0;
27825
+ for (; i + 2 < s; ++i) {
27826
+ var hv = hsh(i);
27827
+ var imod = i & 32767, pimod = head[hv];
27828
+ prev[imod] = pimod;
27829
+ head[hv] = imod;
27830
+ if (wi <= i) {
27831
+ var rem = s - i;
27832
+ if ((lc_1 > 7e3 || li > 24576) && (rem > 423 || !lst)) {
27833
+ pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos);
27834
+ li = lc_1 = eb = 0, bs = i;
27835
+ for (var j = 0; j < 286; ++j)
27836
+ lf[j] = 0;
27837
+ for (var j = 0; j < 30; ++j)
27838
+ df[j] = 0;
27839
+ }
27840
+ var l = 2, d = 0, ch_1 = c, dif = imod - pimod & 32767;
27841
+ if (rem > 2 && hv == hsh(i - dif)) {
27842
+ var maxn = Math.min(n, rem) - 1;
27843
+ var maxd = Math.min(32767, i);
27844
+ var ml = Math.min(258, rem);
27845
+ while (dif <= maxd && --ch_1 && imod != pimod) {
27846
+ if (dat[i + l] == dat[i + l - dif]) {
27847
+ var nl = 0;
27848
+ for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl)
27849
+ ;
27850
+ if (nl > l) {
27851
+ l = nl, d = dif;
27852
+ if (nl > maxn)
27853
+ break;
27854
+ var mmd = Math.min(dif, nl - 2);
27855
+ var md = 0;
27856
+ for (var j = 0; j < mmd; ++j) {
27857
+ var ti = i - dif + j & 32767;
27858
+ var pti = prev[ti];
27859
+ var cd = ti - pti & 32767;
27860
+ if (cd > md)
27861
+ md = cd, pimod = ti;
27862
+ }
27863
+ }
27864
+ }
27865
+ imod = pimod, pimod = prev[imod];
27866
+ dif += imod - pimod & 32767;
27867
+ }
27868
+ }
27869
+ if (d) {
27870
+ syms[li++] = 268435456 | revfl[l] << 18 | revfd[d];
27871
+ var lin = revfl[l] & 31, din = revfd[d] & 31;
27872
+ eb += fleb[lin] + fdeb[din];
27873
+ ++lf[257 + lin];
27874
+ ++df[din];
27875
+ wi = i + l;
27876
+ ++lc_1;
27877
+ } else {
27878
+ syms[li++] = dat[i];
27879
+ ++lf[dat[i]];
27880
+ }
27881
+ }
27882
+ }
27883
+ for (i = Math.max(i, wi); i < s; ++i) {
27884
+ syms[li++] = dat[i];
27885
+ ++lf[dat[i]];
27886
+ }
27887
+ pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos);
27888
+ if (!lst) {
27889
+ st.r = pos & 7 | w[pos / 8 | 0] << 3;
27890
+ pos -= 7;
27891
+ st.h = head, st.p = prev, st.i = i, st.w = wi;
27892
+ }
27893
+ } else {
27894
+ for (var i = st.w || 0; i < s + lst; i += 65535) {
27895
+ var e = i + 65535;
27896
+ if (e >= s) {
27897
+ w[pos / 8 | 0] = lst;
27898
+ e = s;
27899
+ }
27900
+ pos = wfblk(w, pos + 1, dat.subarray(i, e));
27901
+ }
27902
+ st.i = s;
27903
+ }
27904
+ return slc(o, 0, pre + shft(pos) + post);
27905
+ };
27906
+ var dopt = function(dat, opt, pre, post, st) {
27907
+ if (!st) {
27908
+ st = { l: 1 };
27909
+ if (opt.dictionary) {
27910
+ var dict = opt.dictionary.subarray(-32768);
27911
+ var newDat = new u8(dict.length + dat.length);
27912
+ newDat.set(dict);
27913
+ newDat.set(dat, dict.length);
27914
+ dat = newDat;
27915
+ st.w = dict.length;
27916
+ }
27917
+ }
27918
+ return dflt(dat, opt.level == null ? 6 : opt.level, opt.mem == null ? st.l ? Math.ceil(Math.max(8, Math.min(13, Math.log(dat.length))) * 1.5) : 20 : 12 + opt.mem, pre, post, st);
27919
+ };
27920
+ function deflateSync(data, opts) {
27921
+ return dopt(data, opts || {}, 0, 0);
27922
+ }
27923
+ var td = typeof TextDecoder != "undefined" && /* @__PURE__ */ new TextDecoder();
27924
+ var tds = 0;
27925
+ try {
27926
+ td.decode(et, { stream: true });
27927
+ tds = 1;
27928
+ } catch (e) {
27929
+ }
27930
+
27931
+ // ../../packages/loro-schema/src/transport/control-compression.ts
27932
+ var COMPRESSION_MARKER = "";
27933
+ var DEFAULT_THRESHOLD2 = 1024;
27934
+ function compressControlFrame(json) {
27935
+ const utf8 = new TextEncoder().encode(json);
27936
+ const compressed = deflateSync(utf8);
27937
+ let binary = "";
27938
+ for (const byte of compressed) {
27939
+ binary += String.fromCharCode(byte);
27940
+ }
27941
+ const base64 = btoa(binary);
27942
+ return COMPRESSION_MARKER + base64;
27943
+ }
27944
+ function shouldCompress(json, peerSupportsCompression, threshold = DEFAULT_THRESHOLD2) {
27945
+ return peerSupportsCompression && json.length > threshold;
27946
+ }
27947
+ function maybeCompressFrame(json, peerSupportsCompression) {
27948
+ return shouldCompress(json, peerSupportsCompression) ? compressControlFrame(json) : json;
27949
+ }
27950
+
27347
27951
  // ../../packages/loro-schema/src/transport/guarded-channel.ts
27348
27952
  var DEFAULT_MAX_QUEUED_BYTES = 5e5;
27349
27953
  var DEFAULT_HIGH_WATER_BYTES = 1048576;
@@ -28209,6 +28813,7 @@ export {
28209
28813
  AtLeastOnceHighWaterMarkSchema,
28210
28814
  AtLeastOnceShell,
28211
28815
  ChunkReassembler,
28816
+ maybeCompressFrame,
28212
28817
  GuardedChannel,
28213
28818
  LOCAL_DIRECT_SUBPROTOCOL_PREFIX,
28214
28819
  FRAME_HELLO,
@@ -28230,4 +28835,4 @@ export {
28230
28835
  encodeDrain,
28231
28836
  decodeFrame
28232
28837
  };
28233
- //# sourceMappingURL=chunk-HUTIDJIT.js.map
28838
+ //# sourceMappingURL=chunk-IWBDVGD2.js.map