@super-one/cli 0.76.0-alpha.1 → 0.76.0-alpha.3

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 (3) hide show
  1. package/MANIFEST.json +2 -2
  2. package/lib/cli.mjs +2710 -104
  3. package/package.json +1 -1
package/lib/cli.mjs CHANGED
@@ -114,6 +114,11 @@ function nodePaths(nodeHome) {
114
114
  providerSecretsKey: join2(nodeHome, "secrets", "provider-secrets.key"),
115
115
  logsDir: join2(nodeHome, "logs"),
116
116
  runtimeJson: join2(nodeHome, "runtime.json"),
117
+ /**
118
+ * Touched by `harness enable` in another process. The running node watches
119
+ * this file and pushes `harness_catalog_changed` when the advertised set changes.
120
+ */
121
+ harnessCatalogStamp: join2(nodeHome, "harness-catalog.stamp"),
117
122
  /** Session sync zone root — mirrors the desktop's `<userData>/sync` layout. */
118
123
  syncRoot: join2(nodeHome, "sync")
119
124
  };
@@ -137,8 +142,8 @@ import { fileURLToPath } from "node:url";
137
142
  function resolveCliReleaseVersion() {
138
143
  const fromEnv = process.env.SUPERONE_CLI_VERSION?.trim();
139
144
  if (fromEnv) return fromEnv;
140
- if ("0.76.0-alpha.1".trim()) {
141
- return "0.76.0-alpha.1".trim();
145
+ if ("0.76.0-alpha.3".trim()) {
146
+ return "0.76.0-alpha.3".trim();
142
147
  }
143
148
  const fromDist = readDistManifestVersion();
144
149
  if (fromDist) return fromDist;
@@ -4336,7 +4341,7 @@ var init_host_action_device_descriptors = __esm({
4336
4341
  "maximum": 9007199254740991
4337
4342
  },
4338
4343
  "hingeDegrees": {
4339
- "description": "Required for kind=hinge. The angle picks the form: 0 closed, 1-60 tent (cover lit), 90-120 laptop (inner screen, one half flat), any other angle open on the inner screen.",
4344
+ "description": "Required for kind=hinge. The angle picks the form: 0-30 closed on the cover, 31-60 tent (cover lit), 61-80 and 121-180 open on the inner screen, 81-120 laptop (inner screen, one half flat).",
4340
4345
  "type": "number",
4341
4346
  "minimum": 0,
4342
4347
  "maximum": 180
@@ -5114,9 +5119,14 @@ var init_rpc = __esm({
5114
5119
  });
5115
5120
 
5116
5121
  // ../../packages/shared/src/environment/events.ts
5122
+ function harnessAdvertisementKey(ids) {
5123
+ return [...ids ?? []].sort().join("\0");
5124
+ }
5125
+ var HARNESS_CATALOG_CHANGED;
5117
5126
  var init_events = __esm({
5118
5127
  "../../packages/shared/src/environment/events.ts"() {
5119
5128
  "use strict";
5129
+ HARNESS_CATALOG_CHANGED = "harness_catalog_changed";
5120
5130
  }
5121
5131
  });
5122
5132
 
@@ -11784,6 +11794,9 @@ var init_codex_async_question = __esm({
11784
11794
  });
11785
11795
 
11786
11796
  // ../../packages/shared/src/transcript-boundary.ts
11797
+ function contentKeyStamp(block) {
11798
+ return contentKeyStamps.get(block);
11799
+ }
11787
11800
  function contentKeys(content) {
11788
11801
  const counts = /* @__PURE__ */ new Map();
11789
11802
  return content.map((block) => {
@@ -11791,6 +11804,12 @@ function contentKeys(content) {
11791
11804
  for (const [kind2, count2] of Object.entries(block.fold.keyCounts ?? {})) counts.set(kind2, (counts.get(kind2) ?? 0) + count2);
11792
11805
  return block.fold.contentKey;
11793
11806
  }
11807
+ const stamped = contentKeyStamps.get(block);
11808
+ if (stamped) {
11809
+ const ordinal = /^(.*):(\d+)$/.exec(stamped.key);
11810
+ if (ordinal) counts.set(ordinal[1], Math.max(counts.get(ordinal[1]) ?? 0, Number(ordinal[2]) + 1));
11811
+ return stamped.key;
11812
+ }
11794
11813
  if (isToolUseBlock(block)) return `tool:${block.toolUseId}`;
11795
11814
  if (isToolResultBlock(block)) return `result:${block.toolUseId}`;
11796
11815
  const kind = contentKeyKind(block);
@@ -11845,23 +11864,54 @@ function boundaryCursor(boundary, source) {
11845
11864
  function expandBoundaryCursor(boundary, source) {
11846
11865
  if (!boundary.cursor) return boundary;
11847
11866
  const items = source.metadata?.codex?.items ?? [];
11867
+ const keys = contentKeys(source.content);
11868
+ const content = boundary.at !== void 0 && !keys.includes(boundary.at) ? coverBeforeCut(source.content, boundary.at) ?? {} : edgeMap(keys, source.content.map(blockText), boundary.at, boundary.offset ?? 0, source.content.map(contentKeyStamp));
11848
11869
  return {
11849
11870
  ...boundary,
11850
- content: edgeMap(contentKeys(source.content), source.content.map(blockText), boundary.at, boundary.offset ?? 0),
11871
+ content,
11851
11872
  items: edgeMap(items.map((item) => item.id), items.map(itemText), boundary.atItem, boundary.itemOffset ?? 0),
11852
11873
  cursor: false
11853
11874
  };
11854
11875
  }
11876
+ function boundaryInWindow(boundary, source) {
11877
+ const windowed = source.metadata?.window;
11878
+ if (!windowed || windowed.omittedBefore === 0 && windowed.omittedAfter === 0) return true;
11879
+ const keys = contentKeys(source.content);
11880
+ const folded = source.content.some((block) => block.type === "notice" && block.fold);
11881
+ if (!boundary.cursor) {
11882
+ if (windowed.omittedBefore === 0) return true;
11883
+ const named = Object.keys(boundary.content ?? {});
11884
+ if (!named.length) return false;
11885
+ return folded || named.some((key3) => keys.includes(key3));
11886
+ }
11887
+ const atMissing = boundary.at !== void 0 && !keys.includes(boundary.at);
11888
+ if (atMissing && coverBeforeCut(source.content, boundary.at) === null) return false;
11889
+ const items = source.metadata?.codex?.items ?? [];
11890
+ if (boundary.atItem !== void 0 && !items.some((item) => item.id === boundary.atItem) && (boundary.at === void 0 || atMissing)) return false;
11891
+ if (boundary.at !== void 0 && !atMissing && windowed.omittedBefore > 0) {
11892
+ const index = keys.indexOf(boundary.at);
11893
+ const start = contentKeyStamp(source.content[index])?.start ?? 0;
11894
+ if (index === 0 && (boundary.offset ?? 0) < start) return false;
11895
+ }
11896
+ return true;
11897
+ }
11855
11898
  function prefixEdge(map2, keys, texts) {
11899
+ const firstAt = /* @__PURE__ */ new Map();
11900
+ for (let index = 0; index < keys.length; index++) {
11901
+ const key3 = keys[index];
11902
+ if (!firstAt.has(key3)) firstAt.set(key3, index);
11903
+ }
11856
11904
  let partial2 = null;
11857
11905
  for (let index = 0; index < keys.length; index++) {
11906
+ if (firstAt.get(keys[index]) !== index) continue;
11858
11907
  const key3 = keys[index];
11859
11908
  const saved = map2[key3];
11860
11909
  const text3 = texts[index];
11861
11910
  if (saved === void 0) {
11862
11911
  const edge = partial2 ?? { key: key3, offset: 0 };
11863
- const edgeAt = partial2 ? keys.indexOf(partial2.key) : index;
11912
+ const edgeAt = partial2 ? firstAt.get(partial2.key) : index;
11864
11913
  for (let later = edgeAt + 1; later < keys.length; later++) {
11914
+ if (firstAt.get(keys[later]) !== later) continue;
11865
11915
  if (map2[keys[later]] !== void 0) return null;
11866
11916
  }
11867
11917
  return edge;
@@ -11875,7 +11925,63 @@ function prefixEdge(map2, keys, texts) {
11875
11925
  }
11876
11926
  return partial2 ?? "end";
11877
11927
  }
11878
- function edgeMap(keys, texts, at2, offset) {
11928
+ function coverBeforeCut(content, at2) {
11929
+ const parsed = /^(.*):(\d+)$/.exec(at2);
11930
+ if (!parsed) return null;
11931
+ const kind = parsed[1];
11932
+ const target2 = Number(parsed[2]);
11933
+ const keys = contentKeys(content);
11934
+ const counts = /* @__PURE__ */ new Map();
11935
+ const map2 = {};
11936
+ let pending3 = [];
11937
+ const flush = () => {
11938
+ for (const item of pending3) map2[item.key] = item.length;
11939
+ pending3 = [];
11940
+ };
11941
+ const placed = () => (counts.get(kind) ?? 0) === target2 && Object.keys(map2).length ? map2 : null;
11942
+ for (let index = 0; index < content.length; index++) {
11943
+ const block = content[index];
11944
+ const key3 = keys[index];
11945
+ if (block.type === "notice" && block.fold) {
11946
+ const running = counts.get(kind) ?? 0;
11947
+ const declared2 = /^(.*):(\d+)$/.exec(block.fold.contentKey);
11948
+ const start = declared2?.[1] === kind ? Number(declared2[2]) : running;
11949
+ const count = block.fold.keyCounts?.[kind] ?? 0;
11950
+ for (const [name, value] of Object.entries(block.fold.keyCounts ?? {})) {
11951
+ if (name === kind) continue;
11952
+ counts.set(name, (counts.get(name) ?? 0) + value);
11953
+ }
11954
+ if (count === 0) {
11955
+ if (key3) pending3.push({ key: key3, length: -1 });
11956
+ continue;
11957
+ }
11958
+ if (target2 < start || target2 < start + count) return target2 < start ? placed() : null;
11959
+ flush();
11960
+ if (key3) map2[key3] = -1;
11961
+ counts.set(kind, Math.max(running, start + count));
11962
+ if ((counts.get(kind) ?? 0) >= target2) return placed();
11963
+ continue;
11964
+ }
11965
+ const stamped = contentKeyStamp(block);
11966
+ const ordinal = stamped ? /^(.*):(\d+)$/.exec(stamped.key) : null;
11967
+ const blockKind = ordinal ? ordinal[1] : !stamped && !isToolUseBlock(block) && !isToolResultBlock(block) ? contentKeyKind(block) : null;
11968
+ const blockN = ordinal ? Number(ordinal[2]) : blockKind ? counts.get(blockKind) ?? 0 : null;
11969
+ if (blockKind !== null && blockN !== null) {
11970
+ if (blockKind === kind && blockN >= target2) return placed();
11971
+ counts.set(blockKind, Math.max(counts.get(blockKind) ?? 0, blockN + 1));
11972
+ if (blockKind === kind) {
11973
+ flush();
11974
+ const text4 = blockText(block);
11975
+ if (key3) map2[key3] = text4 === void 0 ? -1 : text4.length;
11976
+ continue;
11977
+ }
11978
+ }
11979
+ const text3 = blockText(block);
11980
+ if (key3) pending3.push({ key: key3, length: text3 === void 0 ? -1 : text3.length });
11981
+ }
11982
+ return placed();
11983
+ }
11984
+ function edgeMap(keys, texts, at2, offset, origins) {
11879
11985
  const map2 = {};
11880
11986
  const end = at2 === void 0 ? keys.length : keys.indexOf(at2);
11881
11987
  if (end < 0) return map2;
@@ -11888,7 +11994,9 @@ function edgeMap(keys, texts, at2, offset) {
11888
11994
  if (at2 === void 0) return map2;
11889
11995
  const key3 = keys[end];
11890
11996
  const text3 = texts[end];
11891
- if (key3 !== void 0 && text3 !== void 0 && offset > 0) map2[key3] = offset;
11997
+ const origin = origins?.[end];
11998
+ const relative5 = origin ? origin.prefix + offset - origin.start : offset;
11999
+ if (key3 !== void 0 && text3 !== void 0 && relative5 > 0) map2[key3] = relative5;
11892
12000
  return map2;
11893
12001
  }
11894
12002
  function resolveTranscriptBoundaries(cuts, lengths) {
@@ -11929,13 +12037,14 @@ function anchorAsyncAnswer(message, messages) {
11929
12037
  const source = messages.findLast((row2) => row2.status === "streaming" && row2.role === "assistant" && codexAsyncQuestionItems(row2).some((item) => item.id === itemId)) ?? messages.findLast((row2) => row2.status === "streaming" && row2.role === "assistant" && row2.providerId === "codex");
11930
12038
  return source ? { ...message, metadata: { ...message.metadata, transcriptBoundary: captureTranscriptBoundary(source, messages) } } : message;
11931
12039
  }
11932
- var capturedOrders;
12040
+ var capturedOrders, contentKeyStamps;
11933
12041
  var init_transcript_boundary = __esm({
11934
12042
  "../../packages/shared/src/transcript-boundary.ts"() {
11935
12043
  "use strict";
11936
12044
  init_codex_async_question();
11937
12045
  init_content_delta();
11938
12046
  capturedOrders = /* @__PURE__ */ new Map();
12047
+ contentKeyStamps = /* @__PURE__ */ new WeakMap();
11939
12048
  }
11940
12049
  });
11941
12050
 
@@ -13109,6 +13218,8 @@ var init_agent_types = __esm({
13109
13218
  /** Sign a View's MCP server in through its harness (browser + optional loopback relay). */
13110
13219
  ENVIRONMENT_MCP_APPS_AUTHENTICATE: "environment:mcpApps.authenticate",
13111
13220
  ENVIRONMENT_HARNESS_RESOURCES: "environment:harnessResources",
13221
+ /** Node `environment.usage`: the logins on that machine, not this desktop. */
13222
+ ENVIRONMENT_USAGE: "environment:usage",
13112
13223
  /** Node session_providers CRUD. */
13113
13224
  /** Node-side collaboration agent profiles — authoritative agentIds for @-mentions on a remote session. */
13114
13225
  ENVIRONMENT_COLLAB_LIST_PROFILES: "environment:collabListProfiles",
@@ -17939,10 +18050,40 @@ var init_session_runtime = __esm({
17939
18050
  return s5 ? this.clone(s5) : null;
17940
18051
  }
17941
18052
  list(projectId, options) {
17942
- const rows = [...this.live.values()].filter((s5) => !projectId || s5.projectId === projectId).sort((a2, b5) => (b5.updatedAt ?? 0) - (a2.updatedAt ?? 0) || (b5.createdAt ?? 0) - (a2.createdAt ?? 0));
18053
+ const inProject = [...this.live.values()].filter((s5) => !projectId || s5.projectId === projectId);
18054
+ const byRecency = (a2, b5) => (b5.updatedAt ?? 0) - (a2.updatedAt ?? 0) || (b5.createdAt ?? 0) - (a2.createdAt ?? 0);
18055
+ const parentSessionId = options?.parentSessionId?.trim() || "";
18056
+ const childCounts = /* @__PURE__ */ new Map();
18057
+ let rows;
18058
+ if (parentSessionId) {
18059
+ rows = inProject.filter((s5) => s5.parentSessionId === parentSessionId && s5.isHidden !== true && s5.isSettled !== true);
18060
+ rows.sort(byRecency);
18061
+ } else if (options?.rootsOnly) {
18062
+ const familyUpdated = /* @__PURE__ */ new Map();
18063
+ for (const session of inProject) {
18064
+ if (session.parentSessionId && session.isHidden !== true && session.isSettled !== true) {
18065
+ childCounts.set(session.parentSessionId, (childCounts.get(session.parentSessionId) ?? 0) + 1);
18066
+ const ts2 = session.updatedAt ?? session.createdAt ?? 0;
18067
+ familyUpdated.set(session.parentSessionId, Math.max(familyUpdated.get(session.parentSessionId) ?? 0, ts2));
18068
+ }
18069
+ if (!session.parentSessionId) {
18070
+ const ts2 = session.updatedAt ?? session.createdAt ?? 0;
18071
+ familyUpdated.set(session.sessionId, Math.max(familyUpdated.get(session.sessionId) ?? 0, ts2));
18072
+ }
18073
+ }
18074
+ rows = inProject.filter((s5) => !s5.parentSessionId);
18075
+ rows.sort((a2, b5) => (familyUpdated.get(b5.sessionId) ?? 0) - (familyUpdated.get(a2.sessionId) ?? 0) || byRecency(a2, b5));
18076
+ } else {
18077
+ rows = inProject.sort(byRecency);
18078
+ }
17943
18079
  const offset = Math.max(0, options?.offset ?? 0);
17944
18080
  const limited = options?.limit != null && options.limit >= 0 ? rows.slice(offset, offset + options.limit) : offset > 0 ? rows.slice(offset) : rows;
17945
- return limited.map((s5) => this.clone(s5));
18081
+ return limited.map((s5) => {
18082
+ const cloned = this.clone(s5);
18083
+ const childCount = childCounts.get(s5.sessionId) ?? 0;
18084
+ if (childCount > 0) cloned.childCount = childCount;
18085
+ return cloned;
18086
+ });
17946
18087
  }
17947
18088
  snapshotSequence() {
17948
18089
  return this.events.headSequence();
@@ -43846,6 +43987,2157 @@ var init_dist7 = __esm({
43846
43987
  }
43847
43988
  });
43848
43989
 
43990
+ // ../../node_modules/jpeg-js/lib/encoder.js
43991
+ var require_encoder = __commonJS({
43992
+ "../../node_modules/jpeg-js/lib/encoder.js"(exports, module) {
43993
+ var btoa2 = btoa2 || function(buf) {
43994
+ return Buffer.from(buf).toString("base64");
43995
+ };
43996
+ function JPEGEncoder(quality) {
43997
+ var self = this;
43998
+ var fround = Math.round;
43999
+ var ffloor = Math.floor;
44000
+ var YTable = new Array(64);
44001
+ var UVTable = new Array(64);
44002
+ var fdtbl_Y = new Array(64);
44003
+ var fdtbl_UV = new Array(64);
44004
+ var YDC_HT;
44005
+ var UVDC_HT;
44006
+ var YAC_HT;
44007
+ var UVAC_HT;
44008
+ var bitcode = new Array(65535);
44009
+ var category = new Array(65535);
44010
+ var outputfDCTQuant = new Array(64);
44011
+ var DU = new Array(64);
44012
+ var byteout = [];
44013
+ var bytenew = 0;
44014
+ var bytepos = 7;
44015
+ var YDU = new Array(64);
44016
+ var UDU = new Array(64);
44017
+ var VDU = new Array(64);
44018
+ var clt = new Array(256);
44019
+ var RGB_YUV_TABLE = new Array(2048);
44020
+ var currentQuality;
44021
+ var ZigZag = [
44022
+ 0,
44023
+ 1,
44024
+ 5,
44025
+ 6,
44026
+ 14,
44027
+ 15,
44028
+ 27,
44029
+ 28,
44030
+ 2,
44031
+ 4,
44032
+ 7,
44033
+ 13,
44034
+ 16,
44035
+ 26,
44036
+ 29,
44037
+ 42,
44038
+ 3,
44039
+ 8,
44040
+ 12,
44041
+ 17,
44042
+ 25,
44043
+ 30,
44044
+ 41,
44045
+ 43,
44046
+ 9,
44047
+ 11,
44048
+ 18,
44049
+ 24,
44050
+ 31,
44051
+ 40,
44052
+ 44,
44053
+ 53,
44054
+ 10,
44055
+ 19,
44056
+ 23,
44057
+ 32,
44058
+ 39,
44059
+ 45,
44060
+ 52,
44061
+ 54,
44062
+ 20,
44063
+ 22,
44064
+ 33,
44065
+ 38,
44066
+ 46,
44067
+ 51,
44068
+ 55,
44069
+ 60,
44070
+ 21,
44071
+ 34,
44072
+ 37,
44073
+ 47,
44074
+ 50,
44075
+ 56,
44076
+ 59,
44077
+ 61,
44078
+ 35,
44079
+ 36,
44080
+ 48,
44081
+ 49,
44082
+ 57,
44083
+ 58,
44084
+ 62,
44085
+ 63
44086
+ ];
44087
+ var std_dc_luminance_nrcodes = [0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0];
44088
+ var std_dc_luminance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
44089
+ var std_ac_luminance_nrcodes = [0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 125];
44090
+ var std_ac_luminance_values = [
44091
+ 1,
44092
+ 2,
44093
+ 3,
44094
+ 0,
44095
+ 4,
44096
+ 17,
44097
+ 5,
44098
+ 18,
44099
+ 33,
44100
+ 49,
44101
+ 65,
44102
+ 6,
44103
+ 19,
44104
+ 81,
44105
+ 97,
44106
+ 7,
44107
+ 34,
44108
+ 113,
44109
+ 20,
44110
+ 50,
44111
+ 129,
44112
+ 145,
44113
+ 161,
44114
+ 8,
44115
+ 35,
44116
+ 66,
44117
+ 177,
44118
+ 193,
44119
+ 21,
44120
+ 82,
44121
+ 209,
44122
+ 240,
44123
+ 36,
44124
+ 51,
44125
+ 98,
44126
+ 114,
44127
+ 130,
44128
+ 9,
44129
+ 10,
44130
+ 22,
44131
+ 23,
44132
+ 24,
44133
+ 25,
44134
+ 26,
44135
+ 37,
44136
+ 38,
44137
+ 39,
44138
+ 40,
44139
+ 41,
44140
+ 42,
44141
+ 52,
44142
+ 53,
44143
+ 54,
44144
+ 55,
44145
+ 56,
44146
+ 57,
44147
+ 58,
44148
+ 67,
44149
+ 68,
44150
+ 69,
44151
+ 70,
44152
+ 71,
44153
+ 72,
44154
+ 73,
44155
+ 74,
44156
+ 83,
44157
+ 84,
44158
+ 85,
44159
+ 86,
44160
+ 87,
44161
+ 88,
44162
+ 89,
44163
+ 90,
44164
+ 99,
44165
+ 100,
44166
+ 101,
44167
+ 102,
44168
+ 103,
44169
+ 104,
44170
+ 105,
44171
+ 106,
44172
+ 115,
44173
+ 116,
44174
+ 117,
44175
+ 118,
44176
+ 119,
44177
+ 120,
44178
+ 121,
44179
+ 122,
44180
+ 131,
44181
+ 132,
44182
+ 133,
44183
+ 134,
44184
+ 135,
44185
+ 136,
44186
+ 137,
44187
+ 138,
44188
+ 146,
44189
+ 147,
44190
+ 148,
44191
+ 149,
44192
+ 150,
44193
+ 151,
44194
+ 152,
44195
+ 153,
44196
+ 154,
44197
+ 162,
44198
+ 163,
44199
+ 164,
44200
+ 165,
44201
+ 166,
44202
+ 167,
44203
+ 168,
44204
+ 169,
44205
+ 170,
44206
+ 178,
44207
+ 179,
44208
+ 180,
44209
+ 181,
44210
+ 182,
44211
+ 183,
44212
+ 184,
44213
+ 185,
44214
+ 186,
44215
+ 194,
44216
+ 195,
44217
+ 196,
44218
+ 197,
44219
+ 198,
44220
+ 199,
44221
+ 200,
44222
+ 201,
44223
+ 202,
44224
+ 210,
44225
+ 211,
44226
+ 212,
44227
+ 213,
44228
+ 214,
44229
+ 215,
44230
+ 216,
44231
+ 217,
44232
+ 218,
44233
+ 225,
44234
+ 226,
44235
+ 227,
44236
+ 228,
44237
+ 229,
44238
+ 230,
44239
+ 231,
44240
+ 232,
44241
+ 233,
44242
+ 234,
44243
+ 241,
44244
+ 242,
44245
+ 243,
44246
+ 244,
44247
+ 245,
44248
+ 246,
44249
+ 247,
44250
+ 248,
44251
+ 249,
44252
+ 250
44253
+ ];
44254
+ var std_dc_chrominance_nrcodes = [0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0];
44255
+ var std_dc_chrominance_values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
44256
+ var std_ac_chrominance_nrcodes = [0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 119];
44257
+ var std_ac_chrominance_values = [
44258
+ 0,
44259
+ 1,
44260
+ 2,
44261
+ 3,
44262
+ 17,
44263
+ 4,
44264
+ 5,
44265
+ 33,
44266
+ 49,
44267
+ 6,
44268
+ 18,
44269
+ 65,
44270
+ 81,
44271
+ 7,
44272
+ 97,
44273
+ 113,
44274
+ 19,
44275
+ 34,
44276
+ 50,
44277
+ 129,
44278
+ 8,
44279
+ 20,
44280
+ 66,
44281
+ 145,
44282
+ 161,
44283
+ 177,
44284
+ 193,
44285
+ 9,
44286
+ 35,
44287
+ 51,
44288
+ 82,
44289
+ 240,
44290
+ 21,
44291
+ 98,
44292
+ 114,
44293
+ 209,
44294
+ 10,
44295
+ 22,
44296
+ 36,
44297
+ 52,
44298
+ 225,
44299
+ 37,
44300
+ 241,
44301
+ 23,
44302
+ 24,
44303
+ 25,
44304
+ 26,
44305
+ 38,
44306
+ 39,
44307
+ 40,
44308
+ 41,
44309
+ 42,
44310
+ 53,
44311
+ 54,
44312
+ 55,
44313
+ 56,
44314
+ 57,
44315
+ 58,
44316
+ 67,
44317
+ 68,
44318
+ 69,
44319
+ 70,
44320
+ 71,
44321
+ 72,
44322
+ 73,
44323
+ 74,
44324
+ 83,
44325
+ 84,
44326
+ 85,
44327
+ 86,
44328
+ 87,
44329
+ 88,
44330
+ 89,
44331
+ 90,
44332
+ 99,
44333
+ 100,
44334
+ 101,
44335
+ 102,
44336
+ 103,
44337
+ 104,
44338
+ 105,
44339
+ 106,
44340
+ 115,
44341
+ 116,
44342
+ 117,
44343
+ 118,
44344
+ 119,
44345
+ 120,
44346
+ 121,
44347
+ 122,
44348
+ 130,
44349
+ 131,
44350
+ 132,
44351
+ 133,
44352
+ 134,
44353
+ 135,
44354
+ 136,
44355
+ 137,
44356
+ 138,
44357
+ 146,
44358
+ 147,
44359
+ 148,
44360
+ 149,
44361
+ 150,
44362
+ 151,
44363
+ 152,
44364
+ 153,
44365
+ 154,
44366
+ 162,
44367
+ 163,
44368
+ 164,
44369
+ 165,
44370
+ 166,
44371
+ 167,
44372
+ 168,
44373
+ 169,
44374
+ 170,
44375
+ 178,
44376
+ 179,
44377
+ 180,
44378
+ 181,
44379
+ 182,
44380
+ 183,
44381
+ 184,
44382
+ 185,
44383
+ 186,
44384
+ 194,
44385
+ 195,
44386
+ 196,
44387
+ 197,
44388
+ 198,
44389
+ 199,
44390
+ 200,
44391
+ 201,
44392
+ 202,
44393
+ 210,
44394
+ 211,
44395
+ 212,
44396
+ 213,
44397
+ 214,
44398
+ 215,
44399
+ 216,
44400
+ 217,
44401
+ 218,
44402
+ 226,
44403
+ 227,
44404
+ 228,
44405
+ 229,
44406
+ 230,
44407
+ 231,
44408
+ 232,
44409
+ 233,
44410
+ 234,
44411
+ 242,
44412
+ 243,
44413
+ 244,
44414
+ 245,
44415
+ 246,
44416
+ 247,
44417
+ 248,
44418
+ 249,
44419
+ 250
44420
+ ];
44421
+ function initQuantTables(sf) {
44422
+ var YQT = [
44423
+ 16,
44424
+ 11,
44425
+ 10,
44426
+ 16,
44427
+ 24,
44428
+ 40,
44429
+ 51,
44430
+ 61,
44431
+ 12,
44432
+ 12,
44433
+ 14,
44434
+ 19,
44435
+ 26,
44436
+ 58,
44437
+ 60,
44438
+ 55,
44439
+ 14,
44440
+ 13,
44441
+ 16,
44442
+ 24,
44443
+ 40,
44444
+ 57,
44445
+ 69,
44446
+ 56,
44447
+ 14,
44448
+ 17,
44449
+ 22,
44450
+ 29,
44451
+ 51,
44452
+ 87,
44453
+ 80,
44454
+ 62,
44455
+ 18,
44456
+ 22,
44457
+ 37,
44458
+ 56,
44459
+ 68,
44460
+ 109,
44461
+ 103,
44462
+ 77,
44463
+ 24,
44464
+ 35,
44465
+ 55,
44466
+ 64,
44467
+ 81,
44468
+ 104,
44469
+ 113,
44470
+ 92,
44471
+ 49,
44472
+ 64,
44473
+ 78,
44474
+ 87,
44475
+ 103,
44476
+ 121,
44477
+ 120,
44478
+ 101,
44479
+ 72,
44480
+ 92,
44481
+ 95,
44482
+ 98,
44483
+ 112,
44484
+ 100,
44485
+ 103,
44486
+ 99
44487
+ ];
44488
+ for (var i2 = 0; i2 < 64; i2++) {
44489
+ var t = ffloor((YQT[i2] * sf + 50) / 100);
44490
+ if (t < 1) {
44491
+ t = 1;
44492
+ } else if (t > 255) {
44493
+ t = 255;
44494
+ }
44495
+ YTable[ZigZag[i2]] = t;
44496
+ }
44497
+ var UVQT = [
44498
+ 17,
44499
+ 18,
44500
+ 24,
44501
+ 47,
44502
+ 99,
44503
+ 99,
44504
+ 99,
44505
+ 99,
44506
+ 18,
44507
+ 21,
44508
+ 26,
44509
+ 66,
44510
+ 99,
44511
+ 99,
44512
+ 99,
44513
+ 99,
44514
+ 24,
44515
+ 26,
44516
+ 56,
44517
+ 99,
44518
+ 99,
44519
+ 99,
44520
+ 99,
44521
+ 99,
44522
+ 47,
44523
+ 66,
44524
+ 99,
44525
+ 99,
44526
+ 99,
44527
+ 99,
44528
+ 99,
44529
+ 99,
44530
+ 99,
44531
+ 99,
44532
+ 99,
44533
+ 99,
44534
+ 99,
44535
+ 99,
44536
+ 99,
44537
+ 99,
44538
+ 99,
44539
+ 99,
44540
+ 99,
44541
+ 99,
44542
+ 99,
44543
+ 99,
44544
+ 99,
44545
+ 99,
44546
+ 99,
44547
+ 99,
44548
+ 99,
44549
+ 99,
44550
+ 99,
44551
+ 99,
44552
+ 99,
44553
+ 99,
44554
+ 99,
44555
+ 99,
44556
+ 99,
44557
+ 99,
44558
+ 99,
44559
+ 99,
44560
+ 99,
44561
+ 99
44562
+ ];
44563
+ for (var j3 = 0; j3 < 64; j3++) {
44564
+ var u3 = ffloor((UVQT[j3] * sf + 50) / 100);
44565
+ if (u3 < 1) {
44566
+ u3 = 1;
44567
+ } else if (u3 > 255) {
44568
+ u3 = 255;
44569
+ }
44570
+ UVTable[ZigZag[j3]] = u3;
44571
+ }
44572
+ var aasf = [
44573
+ 1,
44574
+ 1.387039845,
44575
+ 1.306562965,
44576
+ 1.175875602,
44577
+ 1,
44578
+ 0.785694958,
44579
+ 0.5411961,
44580
+ 0.275899379
44581
+ ];
44582
+ var k5 = 0;
44583
+ for (var row2 = 0; row2 < 8; row2++) {
44584
+ for (var col = 0; col < 8; col++) {
44585
+ fdtbl_Y[k5] = 1 / (YTable[ZigZag[k5]] * aasf[row2] * aasf[col] * 8);
44586
+ fdtbl_UV[k5] = 1 / (UVTable[ZigZag[k5]] * aasf[row2] * aasf[col] * 8);
44587
+ k5++;
44588
+ }
44589
+ }
44590
+ }
44591
+ function computeHuffmanTbl(nrcodes, std_table) {
44592
+ var codevalue = 0;
44593
+ var pos_in_table = 0;
44594
+ var HT = new Array();
44595
+ for (var k5 = 1; k5 <= 16; k5++) {
44596
+ for (var j3 = 1; j3 <= nrcodes[k5]; j3++) {
44597
+ HT[std_table[pos_in_table]] = [];
44598
+ HT[std_table[pos_in_table]][0] = codevalue;
44599
+ HT[std_table[pos_in_table]][1] = k5;
44600
+ pos_in_table++;
44601
+ codevalue++;
44602
+ }
44603
+ codevalue *= 2;
44604
+ }
44605
+ return HT;
44606
+ }
44607
+ function initHuffmanTbl() {
44608
+ YDC_HT = computeHuffmanTbl(std_dc_luminance_nrcodes, std_dc_luminance_values);
44609
+ UVDC_HT = computeHuffmanTbl(std_dc_chrominance_nrcodes, std_dc_chrominance_values);
44610
+ YAC_HT = computeHuffmanTbl(std_ac_luminance_nrcodes, std_ac_luminance_values);
44611
+ UVAC_HT = computeHuffmanTbl(std_ac_chrominance_nrcodes, std_ac_chrominance_values);
44612
+ }
44613
+ function initCategoryNumber() {
44614
+ var nrlower = 1;
44615
+ var nrupper = 2;
44616
+ for (var cat = 1; cat <= 15; cat++) {
44617
+ for (var nr2 = nrlower; nr2 < nrupper; nr2++) {
44618
+ category[32767 + nr2] = cat;
44619
+ bitcode[32767 + nr2] = [];
44620
+ bitcode[32767 + nr2][1] = cat;
44621
+ bitcode[32767 + nr2][0] = nr2;
44622
+ }
44623
+ for (var nrneg = -(nrupper - 1); nrneg <= -nrlower; nrneg++) {
44624
+ category[32767 + nrneg] = cat;
44625
+ bitcode[32767 + nrneg] = [];
44626
+ bitcode[32767 + nrneg][1] = cat;
44627
+ bitcode[32767 + nrneg][0] = nrupper - 1 + nrneg;
44628
+ }
44629
+ nrlower <<= 1;
44630
+ nrupper <<= 1;
44631
+ }
44632
+ }
44633
+ function initRGBYUVTable() {
44634
+ for (var i2 = 0; i2 < 256; i2++) {
44635
+ RGB_YUV_TABLE[i2] = 19595 * i2;
44636
+ RGB_YUV_TABLE[i2 + 256 >> 0] = 38470 * i2;
44637
+ RGB_YUV_TABLE[i2 + 512 >> 0] = 7471 * i2 + 32768;
44638
+ RGB_YUV_TABLE[i2 + 768 >> 0] = -11059 * i2;
44639
+ RGB_YUV_TABLE[i2 + 1024 >> 0] = -21709 * i2;
44640
+ RGB_YUV_TABLE[i2 + 1280 >> 0] = 32768 * i2 + 8421375;
44641
+ RGB_YUV_TABLE[i2 + 1536 >> 0] = -27439 * i2;
44642
+ RGB_YUV_TABLE[i2 + 1792 >> 0] = -5329 * i2;
44643
+ }
44644
+ }
44645
+ function writeBits(bs2) {
44646
+ var value = bs2[0];
44647
+ var posval = bs2[1] - 1;
44648
+ while (posval >= 0) {
44649
+ if (value & 1 << posval) {
44650
+ bytenew |= 1 << bytepos;
44651
+ }
44652
+ posval--;
44653
+ bytepos--;
44654
+ if (bytepos < 0) {
44655
+ if (bytenew == 255) {
44656
+ writeByte(255);
44657
+ writeByte(0);
44658
+ } else {
44659
+ writeByte(bytenew);
44660
+ }
44661
+ bytepos = 7;
44662
+ bytenew = 0;
44663
+ }
44664
+ }
44665
+ }
44666
+ function writeByte(value) {
44667
+ byteout.push(value);
44668
+ }
44669
+ function writeWord(value) {
44670
+ writeByte(value >> 8 & 255);
44671
+ writeByte(value & 255);
44672
+ }
44673
+ function fDCTQuant(data, fdtbl) {
44674
+ var d0, d1, d2, d3, d4, d5, d6, d7;
44675
+ var dataOff = 0;
44676
+ var i2;
44677
+ var I8 = 8;
44678
+ var I64 = 64;
44679
+ for (i2 = 0; i2 < I8; ++i2) {
44680
+ d0 = data[dataOff];
44681
+ d1 = data[dataOff + 1];
44682
+ d2 = data[dataOff + 2];
44683
+ d3 = data[dataOff + 3];
44684
+ d4 = data[dataOff + 4];
44685
+ d5 = data[dataOff + 5];
44686
+ d6 = data[dataOff + 6];
44687
+ d7 = data[dataOff + 7];
44688
+ var tmp0 = d0 + d7;
44689
+ var tmp7 = d0 - d7;
44690
+ var tmp1 = d1 + d6;
44691
+ var tmp6 = d1 - d6;
44692
+ var tmp2 = d2 + d5;
44693
+ var tmp5 = d2 - d5;
44694
+ var tmp3 = d3 + d4;
44695
+ var tmp4 = d3 - d4;
44696
+ var tmp10 = tmp0 + tmp3;
44697
+ var tmp13 = tmp0 - tmp3;
44698
+ var tmp11 = tmp1 + tmp2;
44699
+ var tmp12 = tmp1 - tmp2;
44700
+ data[dataOff] = tmp10 + tmp11;
44701
+ data[dataOff + 4] = tmp10 - tmp11;
44702
+ var z1 = (tmp12 + tmp13) * 0.707106781;
44703
+ data[dataOff + 2] = tmp13 + z1;
44704
+ data[dataOff + 6] = tmp13 - z1;
44705
+ tmp10 = tmp4 + tmp5;
44706
+ tmp11 = tmp5 + tmp6;
44707
+ tmp12 = tmp6 + tmp7;
44708
+ var z5 = (tmp10 - tmp12) * 0.382683433;
44709
+ var z22 = 0.5411961 * tmp10 + z5;
44710
+ var z42 = 1.306562965 * tmp12 + z5;
44711
+ var z32 = tmp11 * 0.707106781;
44712
+ var z11 = tmp7 + z32;
44713
+ var z13 = tmp7 - z32;
44714
+ data[dataOff + 5] = z13 + z22;
44715
+ data[dataOff + 3] = z13 - z22;
44716
+ data[dataOff + 1] = z11 + z42;
44717
+ data[dataOff + 7] = z11 - z42;
44718
+ dataOff += 8;
44719
+ }
44720
+ dataOff = 0;
44721
+ for (i2 = 0; i2 < I8; ++i2) {
44722
+ d0 = data[dataOff];
44723
+ d1 = data[dataOff + 8];
44724
+ d2 = data[dataOff + 16];
44725
+ d3 = data[dataOff + 24];
44726
+ d4 = data[dataOff + 32];
44727
+ d5 = data[dataOff + 40];
44728
+ d6 = data[dataOff + 48];
44729
+ d7 = data[dataOff + 56];
44730
+ var tmp0p2 = d0 + d7;
44731
+ var tmp7p2 = d0 - d7;
44732
+ var tmp1p2 = d1 + d6;
44733
+ var tmp6p2 = d1 - d6;
44734
+ var tmp2p2 = d2 + d5;
44735
+ var tmp5p2 = d2 - d5;
44736
+ var tmp3p2 = d3 + d4;
44737
+ var tmp4p2 = d3 - d4;
44738
+ var tmp10p2 = tmp0p2 + tmp3p2;
44739
+ var tmp13p2 = tmp0p2 - tmp3p2;
44740
+ var tmp11p2 = tmp1p2 + tmp2p2;
44741
+ var tmp12p2 = tmp1p2 - tmp2p2;
44742
+ data[dataOff] = tmp10p2 + tmp11p2;
44743
+ data[dataOff + 32] = tmp10p2 - tmp11p2;
44744
+ var z1p2 = (tmp12p2 + tmp13p2) * 0.707106781;
44745
+ data[dataOff + 16] = tmp13p2 + z1p2;
44746
+ data[dataOff + 48] = tmp13p2 - z1p2;
44747
+ tmp10p2 = tmp4p2 + tmp5p2;
44748
+ tmp11p2 = tmp5p2 + tmp6p2;
44749
+ tmp12p2 = tmp6p2 + tmp7p2;
44750
+ var z5p2 = (tmp10p2 - tmp12p2) * 0.382683433;
44751
+ var z2p2 = 0.5411961 * tmp10p2 + z5p2;
44752
+ var z4p2 = 1.306562965 * tmp12p2 + z5p2;
44753
+ var z3p2 = tmp11p2 * 0.707106781;
44754
+ var z11p2 = tmp7p2 + z3p2;
44755
+ var z13p2 = tmp7p2 - z3p2;
44756
+ data[dataOff + 40] = z13p2 + z2p2;
44757
+ data[dataOff + 24] = z13p2 - z2p2;
44758
+ data[dataOff + 8] = z11p2 + z4p2;
44759
+ data[dataOff + 56] = z11p2 - z4p2;
44760
+ dataOff++;
44761
+ }
44762
+ var fDCTQuant2;
44763
+ for (i2 = 0; i2 < I64; ++i2) {
44764
+ fDCTQuant2 = data[i2] * fdtbl[i2];
44765
+ outputfDCTQuant[i2] = fDCTQuant2 > 0 ? fDCTQuant2 + 0.5 | 0 : fDCTQuant2 - 0.5 | 0;
44766
+ }
44767
+ return outputfDCTQuant;
44768
+ }
44769
+ function writeAPP0() {
44770
+ writeWord(65504);
44771
+ writeWord(16);
44772
+ writeByte(74);
44773
+ writeByte(70);
44774
+ writeByte(73);
44775
+ writeByte(70);
44776
+ writeByte(0);
44777
+ writeByte(1);
44778
+ writeByte(1);
44779
+ writeByte(0);
44780
+ writeWord(1);
44781
+ writeWord(1);
44782
+ writeByte(0);
44783
+ writeByte(0);
44784
+ }
44785
+ function writeAPP1(exifBuffer) {
44786
+ if (!exifBuffer) return;
44787
+ writeWord(65505);
44788
+ if (exifBuffer[0] === 69 && exifBuffer[1] === 120 && exifBuffer[2] === 105 && exifBuffer[3] === 102) {
44789
+ writeWord(exifBuffer.length + 2);
44790
+ } else {
44791
+ writeWord(exifBuffer.length + 5 + 2);
44792
+ writeByte(69);
44793
+ writeByte(120);
44794
+ writeByte(105);
44795
+ writeByte(102);
44796
+ writeByte(0);
44797
+ }
44798
+ for (var i2 = 0; i2 < exifBuffer.length; i2++) {
44799
+ writeByte(exifBuffer[i2]);
44800
+ }
44801
+ }
44802
+ function writeSOF0(width, height) {
44803
+ writeWord(65472);
44804
+ writeWord(17);
44805
+ writeByte(8);
44806
+ writeWord(height);
44807
+ writeWord(width);
44808
+ writeByte(3);
44809
+ writeByte(1);
44810
+ writeByte(17);
44811
+ writeByte(0);
44812
+ writeByte(2);
44813
+ writeByte(17);
44814
+ writeByte(1);
44815
+ writeByte(3);
44816
+ writeByte(17);
44817
+ writeByte(1);
44818
+ }
44819
+ function writeDQT() {
44820
+ writeWord(65499);
44821
+ writeWord(132);
44822
+ writeByte(0);
44823
+ for (var i2 = 0; i2 < 64; i2++) {
44824
+ writeByte(YTable[i2]);
44825
+ }
44826
+ writeByte(1);
44827
+ for (var j3 = 0; j3 < 64; j3++) {
44828
+ writeByte(UVTable[j3]);
44829
+ }
44830
+ }
44831
+ function writeDHT() {
44832
+ writeWord(65476);
44833
+ writeWord(418);
44834
+ writeByte(0);
44835
+ for (var i2 = 0; i2 < 16; i2++) {
44836
+ writeByte(std_dc_luminance_nrcodes[i2 + 1]);
44837
+ }
44838
+ for (var j3 = 0; j3 <= 11; j3++) {
44839
+ writeByte(std_dc_luminance_values[j3]);
44840
+ }
44841
+ writeByte(16);
44842
+ for (var k5 = 0; k5 < 16; k5++) {
44843
+ writeByte(std_ac_luminance_nrcodes[k5 + 1]);
44844
+ }
44845
+ for (var l3 = 0; l3 <= 161; l3++) {
44846
+ writeByte(std_ac_luminance_values[l3]);
44847
+ }
44848
+ writeByte(1);
44849
+ for (var m5 = 0; m5 < 16; m5++) {
44850
+ writeByte(std_dc_chrominance_nrcodes[m5 + 1]);
44851
+ }
44852
+ for (var n = 0; n <= 11; n++) {
44853
+ writeByte(std_dc_chrominance_values[n]);
44854
+ }
44855
+ writeByte(17);
44856
+ for (var o3 = 0; o3 < 16; o3++) {
44857
+ writeByte(std_ac_chrominance_nrcodes[o3 + 1]);
44858
+ }
44859
+ for (var p4 = 0; p4 <= 161; p4++) {
44860
+ writeByte(std_ac_chrominance_values[p4]);
44861
+ }
44862
+ }
44863
+ function writeCOM(comments) {
44864
+ if (typeof comments === "undefined" || comments.constructor !== Array) return;
44865
+ comments.forEach((e) => {
44866
+ if (typeof e !== "string") return;
44867
+ writeWord(65534);
44868
+ var l3 = e.length;
44869
+ writeWord(l3 + 2);
44870
+ var i2;
44871
+ for (i2 = 0; i2 < l3; i2++)
44872
+ writeByte(e.charCodeAt(i2));
44873
+ });
44874
+ }
44875
+ function writeSOS() {
44876
+ writeWord(65498);
44877
+ writeWord(12);
44878
+ writeByte(3);
44879
+ writeByte(1);
44880
+ writeByte(0);
44881
+ writeByte(2);
44882
+ writeByte(17);
44883
+ writeByte(3);
44884
+ writeByte(17);
44885
+ writeByte(0);
44886
+ writeByte(63);
44887
+ writeByte(0);
44888
+ }
44889
+ function processDU(CDU, fdtbl, DC, HTDC, HTAC) {
44890
+ var EOB = HTAC[0];
44891
+ var M16zeroes = HTAC[240];
44892
+ var pos;
44893
+ var I16 = 16;
44894
+ var I63 = 63;
44895
+ var I64 = 64;
44896
+ var DU_DCT = fDCTQuant(CDU, fdtbl);
44897
+ for (var j3 = 0; j3 < I64; ++j3) {
44898
+ DU[ZigZag[j3]] = DU_DCT[j3];
44899
+ }
44900
+ var Diff4 = DU[0] - DC;
44901
+ DC = DU[0];
44902
+ if (Diff4 == 0) {
44903
+ writeBits(HTDC[0]);
44904
+ } else {
44905
+ pos = 32767 + Diff4;
44906
+ writeBits(HTDC[category[pos]]);
44907
+ writeBits(bitcode[pos]);
44908
+ }
44909
+ var end0pos = 63;
44910
+ for (; end0pos > 0 && DU[end0pos] == 0; end0pos--) {
44911
+ }
44912
+ ;
44913
+ if (end0pos == 0) {
44914
+ writeBits(EOB);
44915
+ return DC;
44916
+ }
44917
+ var i2 = 1;
44918
+ var lng;
44919
+ while (i2 <= end0pos) {
44920
+ var startpos = i2;
44921
+ for (; DU[i2] == 0 && i2 <= end0pos; ++i2) {
44922
+ }
44923
+ var nrzeroes = i2 - startpos;
44924
+ if (nrzeroes >= I16) {
44925
+ lng = nrzeroes >> 4;
44926
+ for (var nrmarker = 1; nrmarker <= lng; ++nrmarker)
44927
+ writeBits(M16zeroes);
44928
+ nrzeroes = nrzeroes & 15;
44929
+ }
44930
+ pos = 32767 + DU[i2];
44931
+ writeBits(HTAC[(nrzeroes << 4) + category[pos]]);
44932
+ writeBits(bitcode[pos]);
44933
+ i2++;
44934
+ }
44935
+ if (end0pos != I63) {
44936
+ writeBits(EOB);
44937
+ }
44938
+ return DC;
44939
+ }
44940
+ function initCharLookupTable() {
44941
+ var sfcc = String.fromCharCode;
44942
+ for (var i2 = 0; i2 < 256; i2++) {
44943
+ clt[i2] = sfcc(i2);
44944
+ }
44945
+ }
44946
+ this.encode = function(image, quality2) {
44947
+ var time_start = (/* @__PURE__ */ new Date()).getTime();
44948
+ if (quality2) setQuality(quality2);
44949
+ byteout = new Array();
44950
+ bytenew = 0;
44951
+ bytepos = 7;
44952
+ writeWord(65496);
44953
+ writeAPP0();
44954
+ writeCOM(image.comments);
44955
+ writeAPP1(image.exifBuffer);
44956
+ writeDQT();
44957
+ writeSOF0(image.width, image.height);
44958
+ writeDHT();
44959
+ writeSOS();
44960
+ var DCY = 0;
44961
+ var DCU = 0;
44962
+ var DCV = 0;
44963
+ bytenew = 0;
44964
+ bytepos = 7;
44965
+ this.encode.displayName = "_encode_";
44966
+ var imageData = image.data;
44967
+ var width = image.width;
44968
+ var height = image.height;
44969
+ var quadWidth = width * 4;
44970
+ var tripleWidth = width * 3;
44971
+ var x4, y3 = 0;
44972
+ var r4, g3, b5;
44973
+ var start, p4, col, row2, pos;
44974
+ while (y3 < height) {
44975
+ x4 = 0;
44976
+ while (x4 < quadWidth) {
44977
+ start = quadWidth * y3 + x4;
44978
+ p4 = start;
44979
+ col = -1;
44980
+ row2 = 0;
44981
+ for (pos = 0; pos < 64; pos++) {
44982
+ row2 = pos >> 3;
44983
+ col = (pos & 7) * 4;
44984
+ p4 = start + row2 * quadWidth + col;
44985
+ if (y3 + row2 >= height) {
44986
+ p4 -= quadWidth * (y3 + 1 + row2 - height);
44987
+ }
44988
+ if (x4 + col >= quadWidth) {
44989
+ p4 -= x4 + col - quadWidth + 4;
44990
+ }
44991
+ r4 = imageData[p4++];
44992
+ g3 = imageData[p4++];
44993
+ b5 = imageData[p4++];
44994
+ YDU[pos] = (RGB_YUV_TABLE[r4] + RGB_YUV_TABLE[g3 + 256 >> 0] + RGB_YUV_TABLE[b5 + 512 >> 0] >> 16) - 128;
44995
+ UDU[pos] = (RGB_YUV_TABLE[r4 + 768 >> 0] + RGB_YUV_TABLE[g3 + 1024 >> 0] + RGB_YUV_TABLE[b5 + 1280 >> 0] >> 16) - 128;
44996
+ VDU[pos] = (RGB_YUV_TABLE[r4 + 1280 >> 0] + RGB_YUV_TABLE[g3 + 1536 >> 0] + RGB_YUV_TABLE[b5 + 1792 >> 0] >> 16) - 128;
44997
+ }
44998
+ DCY = processDU(YDU, fdtbl_Y, DCY, YDC_HT, YAC_HT);
44999
+ DCU = processDU(UDU, fdtbl_UV, DCU, UVDC_HT, UVAC_HT);
45000
+ DCV = processDU(VDU, fdtbl_UV, DCV, UVDC_HT, UVAC_HT);
45001
+ x4 += 32;
45002
+ }
45003
+ y3 += 8;
45004
+ }
45005
+ if (bytepos >= 0) {
45006
+ var fillbits = [];
45007
+ fillbits[1] = bytepos + 1;
45008
+ fillbits[0] = (1 << bytepos + 1) - 1;
45009
+ writeBits(fillbits);
45010
+ }
45011
+ writeWord(65497);
45012
+ if (typeof module === "undefined") return new Uint8Array(byteout);
45013
+ return Buffer.from(byteout);
45014
+ var jpegDataUri = "data:image/jpeg;base64," + btoa2(byteout.join(""));
45015
+ byteout = [];
45016
+ var duration3 = (/* @__PURE__ */ new Date()).getTime() - time_start;
45017
+ return jpegDataUri;
45018
+ };
45019
+ function setQuality(quality2) {
45020
+ if (quality2 <= 0) {
45021
+ quality2 = 1;
45022
+ }
45023
+ if (quality2 > 100) {
45024
+ quality2 = 100;
45025
+ }
45026
+ if (currentQuality == quality2) return;
45027
+ var sf = 0;
45028
+ if (quality2 < 50) {
45029
+ sf = Math.floor(5e3 / quality2);
45030
+ } else {
45031
+ sf = Math.floor(200 - quality2 * 2);
45032
+ }
45033
+ initQuantTables(sf);
45034
+ currentQuality = quality2;
45035
+ }
45036
+ function init() {
45037
+ var time_start = (/* @__PURE__ */ new Date()).getTime();
45038
+ if (!quality) quality = 50;
45039
+ initCharLookupTable();
45040
+ initHuffmanTbl();
45041
+ initCategoryNumber();
45042
+ initRGBYUVTable();
45043
+ setQuality(quality);
45044
+ var duration3 = (/* @__PURE__ */ new Date()).getTime() - time_start;
45045
+ }
45046
+ init();
45047
+ }
45048
+ if (typeof module !== "undefined") {
45049
+ module.exports = encode4;
45050
+ } else if (typeof window !== "undefined") {
45051
+ window["jpeg-js"] = window["jpeg-js"] || {};
45052
+ window["jpeg-js"].encode = encode4;
45053
+ }
45054
+ function encode4(imgData, qu) {
45055
+ if (typeof qu === "undefined") qu = 50;
45056
+ var encoder4 = new JPEGEncoder(qu);
45057
+ var data = encoder4.encode(imgData, qu);
45058
+ return {
45059
+ data,
45060
+ width: imgData.width,
45061
+ height: imgData.height
45062
+ };
45063
+ }
45064
+ }
45065
+ });
45066
+
45067
+ // ../../node_modules/jpeg-js/lib/decoder.js
45068
+ var require_decoder = __commonJS({
45069
+ "../../node_modules/jpeg-js/lib/decoder.js"(exports, module) {
45070
+ var JpegImage = (function jpegImage() {
45071
+ "use strict";
45072
+ var dctZigZag = new Int32Array([
45073
+ 0,
45074
+ 1,
45075
+ 8,
45076
+ 16,
45077
+ 9,
45078
+ 2,
45079
+ 3,
45080
+ 10,
45081
+ 17,
45082
+ 24,
45083
+ 32,
45084
+ 25,
45085
+ 18,
45086
+ 11,
45087
+ 4,
45088
+ 5,
45089
+ 12,
45090
+ 19,
45091
+ 26,
45092
+ 33,
45093
+ 40,
45094
+ 48,
45095
+ 41,
45096
+ 34,
45097
+ 27,
45098
+ 20,
45099
+ 13,
45100
+ 6,
45101
+ 7,
45102
+ 14,
45103
+ 21,
45104
+ 28,
45105
+ 35,
45106
+ 42,
45107
+ 49,
45108
+ 56,
45109
+ 57,
45110
+ 50,
45111
+ 43,
45112
+ 36,
45113
+ 29,
45114
+ 22,
45115
+ 15,
45116
+ 23,
45117
+ 30,
45118
+ 37,
45119
+ 44,
45120
+ 51,
45121
+ 58,
45122
+ 59,
45123
+ 52,
45124
+ 45,
45125
+ 38,
45126
+ 31,
45127
+ 39,
45128
+ 46,
45129
+ 53,
45130
+ 60,
45131
+ 61,
45132
+ 54,
45133
+ 47,
45134
+ 55,
45135
+ 62,
45136
+ 63
45137
+ ]);
45138
+ var dctCos1 = 4017;
45139
+ var dctSin1 = 799;
45140
+ var dctCos3 = 3406;
45141
+ var dctSin3 = 2276;
45142
+ var dctCos6 = 1567;
45143
+ var dctSin6 = 3784;
45144
+ var dctSqrt2 = 5793;
45145
+ var dctSqrt1d2 = 2896;
45146
+ function constructor() {
45147
+ }
45148
+ function buildHuffmanTable(codeLengths, values) {
45149
+ var k5 = 0, code = [], i2, j3, length = 16;
45150
+ while (length > 0 && !codeLengths[length - 1])
45151
+ length--;
45152
+ code.push({ children: [], index: 0 });
45153
+ var p4 = code[0], q3;
45154
+ for (i2 = 0; i2 < length; i2++) {
45155
+ for (j3 = 0; j3 < codeLengths[i2]; j3++) {
45156
+ p4 = code.pop();
45157
+ p4.children[p4.index] = values[k5];
45158
+ while (p4.index > 0) {
45159
+ if (code.length === 0)
45160
+ throw new Error("Could not recreate Huffman Table");
45161
+ p4 = code.pop();
45162
+ }
45163
+ p4.index++;
45164
+ code.push(p4);
45165
+ while (code.length <= i2) {
45166
+ code.push(q3 = { children: [], index: 0 });
45167
+ p4.children[p4.index] = q3.children;
45168
+ p4 = q3;
45169
+ }
45170
+ k5++;
45171
+ }
45172
+ if (i2 + 1 < length) {
45173
+ code.push(q3 = { children: [], index: 0 });
45174
+ p4.children[p4.index] = q3.children;
45175
+ p4 = q3;
45176
+ }
45177
+ }
45178
+ return code[0].children;
45179
+ }
45180
+ function decodeScan(data, offset, frame, components, resetInterval, spectralStart, spectralEnd, successivePrev, successive, opts) {
45181
+ var precision = frame.precision;
45182
+ var samplesPerLine = frame.samplesPerLine;
45183
+ var scanLines = frame.scanLines;
45184
+ var mcusPerLine = frame.mcusPerLine;
45185
+ var progressive = frame.progressive;
45186
+ var maxH = frame.maxH, maxV = frame.maxV;
45187
+ var startOffset = offset, bitsData = 0, bitsCount = 0;
45188
+ function readBit() {
45189
+ if (bitsCount > 0) {
45190
+ bitsCount--;
45191
+ return bitsData >> bitsCount & 1;
45192
+ }
45193
+ bitsData = data[offset++];
45194
+ if (bitsData == 255) {
45195
+ var nextByte = data[offset++];
45196
+ if (nextByte) {
45197
+ throw new Error("unexpected marker: " + (bitsData << 8 | nextByte).toString(16));
45198
+ }
45199
+ }
45200
+ bitsCount = 7;
45201
+ return bitsData >>> 7;
45202
+ }
45203
+ function decodeHuffman(tree) {
45204
+ var node = tree, bit;
45205
+ while ((bit = readBit()) !== null) {
45206
+ node = node[bit];
45207
+ if (typeof node === "number")
45208
+ return node;
45209
+ if (typeof node !== "object")
45210
+ throw new Error("invalid huffman sequence");
45211
+ }
45212
+ return null;
45213
+ }
45214
+ function receive(length) {
45215
+ var n2 = 0;
45216
+ while (length > 0) {
45217
+ var bit = readBit();
45218
+ if (bit === null) return;
45219
+ n2 = n2 << 1 | bit;
45220
+ length--;
45221
+ }
45222
+ return n2;
45223
+ }
45224
+ function receiveAndExtend(length) {
45225
+ var n2 = receive(length);
45226
+ if (n2 >= 1 << length - 1)
45227
+ return n2;
45228
+ return n2 + (-1 << length) + 1;
45229
+ }
45230
+ function decodeBaseline(component2, zz) {
45231
+ var t = decodeHuffman(component2.huffmanTableDC);
45232
+ var diff = t === 0 ? 0 : receiveAndExtend(t);
45233
+ zz[0] = component2.pred += diff;
45234
+ var k6 = 1;
45235
+ while (k6 < 64) {
45236
+ var rs2 = decodeHuffman(component2.huffmanTableAC);
45237
+ var s5 = rs2 & 15, r4 = rs2 >> 4;
45238
+ if (s5 === 0) {
45239
+ if (r4 < 15)
45240
+ break;
45241
+ k6 += 16;
45242
+ continue;
45243
+ }
45244
+ k6 += r4;
45245
+ var z5 = dctZigZag[k6];
45246
+ zz[z5] = receiveAndExtend(s5);
45247
+ k6++;
45248
+ }
45249
+ }
45250
+ function decodeDCFirst(component2, zz) {
45251
+ var t = decodeHuffman(component2.huffmanTableDC);
45252
+ var diff = t === 0 ? 0 : receiveAndExtend(t) << successive;
45253
+ zz[0] = component2.pred += diff;
45254
+ }
45255
+ function decodeDCSuccessive(component2, zz) {
45256
+ zz[0] |= readBit() << successive;
45257
+ }
45258
+ var eobrun = 0;
45259
+ function decodeACFirst(component2, zz) {
45260
+ if (eobrun > 0) {
45261
+ eobrun--;
45262
+ return;
45263
+ }
45264
+ var k6 = spectralStart, e = spectralEnd;
45265
+ while (k6 <= e) {
45266
+ var rs2 = decodeHuffman(component2.huffmanTableAC);
45267
+ var s5 = rs2 & 15, r4 = rs2 >> 4;
45268
+ if (s5 === 0) {
45269
+ if (r4 < 15) {
45270
+ eobrun = receive(r4) + (1 << r4) - 1;
45271
+ break;
45272
+ }
45273
+ k6 += 16;
45274
+ continue;
45275
+ }
45276
+ k6 += r4;
45277
+ var z5 = dctZigZag[k6];
45278
+ zz[z5] = receiveAndExtend(s5) * (1 << successive);
45279
+ k6++;
45280
+ }
45281
+ }
45282
+ var successiveACState = 0, successiveACNextValue;
45283
+ function decodeACSuccessive(component2, zz) {
45284
+ var k6 = spectralStart, e = spectralEnd, r4 = 0;
45285
+ while (k6 <= e) {
45286
+ var z5 = dctZigZag[k6];
45287
+ var direction = zz[z5] < 0 ? -1 : 1;
45288
+ switch (successiveACState) {
45289
+ case 0:
45290
+ var rs2 = decodeHuffman(component2.huffmanTableAC);
45291
+ var s5 = rs2 & 15, r4 = rs2 >> 4;
45292
+ if (s5 === 0) {
45293
+ if (r4 < 15) {
45294
+ eobrun = receive(r4) + (1 << r4);
45295
+ successiveACState = 4;
45296
+ } else {
45297
+ r4 = 16;
45298
+ successiveACState = 1;
45299
+ }
45300
+ } else {
45301
+ if (s5 !== 1)
45302
+ throw new Error("invalid ACn encoding");
45303
+ successiveACNextValue = receiveAndExtend(s5);
45304
+ successiveACState = r4 ? 2 : 3;
45305
+ }
45306
+ continue;
45307
+ case 1:
45308
+ // skipping r zero items
45309
+ case 2:
45310
+ if (zz[z5])
45311
+ zz[z5] += (readBit() << successive) * direction;
45312
+ else {
45313
+ r4--;
45314
+ if (r4 === 0)
45315
+ successiveACState = successiveACState == 2 ? 3 : 0;
45316
+ }
45317
+ break;
45318
+ case 3:
45319
+ if (zz[z5])
45320
+ zz[z5] += (readBit() << successive) * direction;
45321
+ else {
45322
+ zz[z5] = successiveACNextValue << successive;
45323
+ successiveACState = 0;
45324
+ }
45325
+ break;
45326
+ case 4:
45327
+ if (zz[z5])
45328
+ zz[z5] += (readBit() << successive) * direction;
45329
+ break;
45330
+ }
45331
+ k6++;
45332
+ }
45333
+ if (successiveACState === 4) {
45334
+ eobrun--;
45335
+ if (eobrun === 0)
45336
+ successiveACState = 0;
45337
+ }
45338
+ }
45339
+ function decodeMcu(component2, decode4, mcu2, row2, col) {
45340
+ var mcuRow = mcu2 / mcusPerLine | 0;
45341
+ var mcuCol = mcu2 % mcusPerLine;
45342
+ var blockRow = mcuRow * component2.v + row2;
45343
+ var blockCol = mcuCol * component2.h + col;
45344
+ if (component2.blocks[blockRow] === void 0 && opts.tolerantDecoding)
45345
+ return;
45346
+ decode4(component2, component2.blocks[blockRow][blockCol]);
45347
+ }
45348
+ function decodeBlock(component2, decode4, mcu2) {
45349
+ var blockRow = mcu2 / component2.blocksPerLine | 0;
45350
+ var blockCol = mcu2 % component2.blocksPerLine;
45351
+ if (component2.blocks[blockRow] === void 0 && opts.tolerantDecoding)
45352
+ return;
45353
+ decode4(component2, component2.blocks[blockRow][blockCol]);
45354
+ }
45355
+ var componentsLength = components.length;
45356
+ var component, i2, j3, k5, n;
45357
+ var decodeFn;
45358
+ if (progressive) {
45359
+ if (spectralStart === 0)
45360
+ decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive;
45361
+ else
45362
+ decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive;
45363
+ } else {
45364
+ decodeFn = decodeBaseline;
45365
+ }
45366
+ var mcu = 0, marker;
45367
+ var mcuExpected;
45368
+ if (componentsLength == 1) {
45369
+ mcuExpected = components[0].blocksPerLine * components[0].blocksPerColumn;
45370
+ } else {
45371
+ mcuExpected = mcusPerLine * frame.mcusPerColumn;
45372
+ }
45373
+ if (!resetInterval) resetInterval = mcuExpected;
45374
+ var h2, v4;
45375
+ while (mcu < mcuExpected) {
45376
+ for (i2 = 0; i2 < componentsLength; i2++)
45377
+ components[i2].pred = 0;
45378
+ eobrun = 0;
45379
+ if (componentsLength == 1) {
45380
+ component = components[0];
45381
+ for (n = 0; n < resetInterval; n++) {
45382
+ decodeBlock(component, decodeFn, mcu);
45383
+ mcu++;
45384
+ }
45385
+ } else {
45386
+ for (n = 0; n < resetInterval; n++) {
45387
+ for (i2 = 0; i2 < componentsLength; i2++) {
45388
+ component = components[i2];
45389
+ h2 = component.h;
45390
+ v4 = component.v;
45391
+ for (j3 = 0; j3 < v4; j3++) {
45392
+ for (k5 = 0; k5 < h2; k5++) {
45393
+ decodeMcu(component, decodeFn, mcu, j3, k5);
45394
+ }
45395
+ }
45396
+ }
45397
+ mcu++;
45398
+ if (mcu === mcuExpected) break;
45399
+ }
45400
+ }
45401
+ if (mcu === mcuExpected) {
45402
+ do {
45403
+ if (data[offset] === 255) {
45404
+ if (data[offset + 1] !== 0) {
45405
+ break;
45406
+ }
45407
+ }
45408
+ offset += 1;
45409
+ } while (offset < data.length - 2);
45410
+ }
45411
+ bitsCount = 0;
45412
+ marker = data[offset] << 8 | data[offset + 1];
45413
+ if (marker < 65280) {
45414
+ throw new Error("marker was not found");
45415
+ }
45416
+ if (marker >= 65488 && marker <= 65495) {
45417
+ offset += 2;
45418
+ } else
45419
+ break;
45420
+ }
45421
+ return offset - startOffset;
45422
+ }
45423
+ function buildComponentData(frame, component) {
45424
+ var lines2 = [];
45425
+ var blocksPerLine = component.blocksPerLine;
45426
+ var blocksPerColumn = component.blocksPerColumn;
45427
+ var samplesPerLine = blocksPerLine << 3;
45428
+ var R5 = new Int32Array(64), r4 = new Uint8Array(64);
45429
+ function quantizeAndInverse(zz, dataOut, dataIn) {
45430
+ var qt2 = component.quantizationTable;
45431
+ var v0, v1, v22, v32, v4, v5, v6, v7, t;
45432
+ var p4 = dataIn;
45433
+ var i3;
45434
+ for (i3 = 0; i3 < 64; i3++)
45435
+ p4[i3] = zz[i3] * qt2[i3];
45436
+ for (i3 = 0; i3 < 8; ++i3) {
45437
+ var row2 = 8 * i3;
45438
+ if (p4[1 + row2] == 0 && p4[2 + row2] == 0 && p4[3 + row2] == 0 && p4[4 + row2] == 0 && p4[5 + row2] == 0 && p4[6 + row2] == 0 && p4[7 + row2] == 0) {
45439
+ t = dctSqrt2 * p4[0 + row2] + 512 >> 10;
45440
+ p4[0 + row2] = t;
45441
+ p4[1 + row2] = t;
45442
+ p4[2 + row2] = t;
45443
+ p4[3 + row2] = t;
45444
+ p4[4 + row2] = t;
45445
+ p4[5 + row2] = t;
45446
+ p4[6 + row2] = t;
45447
+ p4[7 + row2] = t;
45448
+ continue;
45449
+ }
45450
+ v0 = dctSqrt2 * p4[0 + row2] + 128 >> 8;
45451
+ v1 = dctSqrt2 * p4[4 + row2] + 128 >> 8;
45452
+ v22 = p4[2 + row2];
45453
+ v32 = p4[6 + row2];
45454
+ v4 = dctSqrt1d2 * (p4[1 + row2] - p4[7 + row2]) + 128 >> 8;
45455
+ v7 = dctSqrt1d2 * (p4[1 + row2] + p4[7 + row2]) + 128 >> 8;
45456
+ v5 = p4[3 + row2] << 4;
45457
+ v6 = p4[5 + row2] << 4;
45458
+ t = v0 - v1 + 1 >> 1;
45459
+ v0 = v0 + v1 + 1 >> 1;
45460
+ v1 = t;
45461
+ t = v22 * dctSin6 + v32 * dctCos6 + 128 >> 8;
45462
+ v22 = v22 * dctCos6 - v32 * dctSin6 + 128 >> 8;
45463
+ v32 = t;
45464
+ t = v4 - v6 + 1 >> 1;
45465
+ v4 = v4 + v6 + 1 >> 1;
45466
+ v6 = t;
45467
+ t = v7 + v5 + 1 >> 1;
45468
+ v5 = v7 - v5 + 1 >> 1;
45469
+ v7 = t;
45470
+ t = v0 - v32 + 1 >> 1;
45471
+ v0 = v0 + v32 + 1 >> 1;
45472
+ v32 = t;
45473
+ t = v1 - v22 + 1 >> 1;
45474
+ v1 = v1 + v22 + 1 >> 1;
45475
+ v22 = t;
45476
+ t = v4 * dctSin3 + v7 * dctCos3 + 2048 >> 12;
45477
+ v4 = v4 * dctCos3 - v7 * dctSin3 + 2048 >> 12;
45478
+ v7 = t;
45479
+ t = v5 * dctSin1 + v6 * dctCos1 + 2048 >> 12;
45480
+ v5 = v5 * dctCos1 - v6 * dctSin1 + 2048 >> 12;
45481
+ v6 = t;
45482
+ p4[0 + row2] = v0 + v7;
45483
+ p4[7 + row2] = v0 - v7;
45484
+ p4[1 + row2] = v1 + v6;
45485
+ p4[6 + row2] = v1 - v6;
45486
+ p4[2 + row2] = v22 + v5;
45487
+ p4[5 + row2] = v22 - v5;
45488
+ p4[3 + row2] = v32 + v4;
45489
+ p4[4 + row2] = v32 - v4;
45490
+ }
45491
+ for (i3 = 0; i3 < 8; ++i3) {
45492
+ var col = i3;
45493
+ if (p4[1 * 8 + col] == 0 && p4[2 * 8 + col] == 0 && p4[3 * 8 + col] == 0 && p4[4 * 8 + col] == 0 && p4[5 * 8 + col] == 0 && p4[6 * 8 + col] == 0 && p4[7 * 8 + col] == 0) {
45494
+ t = dctSqrt2 * dataIn[i3 + 0] + 8192 >> 14;
45495
+ p4[0 * 8 + col] = t;
45496
+ p4[1 * 8 + col] = t;
45497
+ p4[2 * 8 + col] = t;
45498
+ p4[3 * 8 + col] = t;
45499
+ p4[4 * 8 + col] = t;
45500
+ p4[5 * 8 + col] = t;
45501
+ p4[6 * 8 + col] = t;
45502
+ p4[7 * 8 + col] = t;
45503
+ continue;
45504
+ }
45505
+ v0 = dctSqrt2 * p4[0 * 8 + col] + 2048 >> 12;
45506
+ v1 = dctSqrt2 * p4[4 * 8 + col] + 2048 >> 12;
45507
+ v22 = p4[2 * 8 + col];
45508
+ v32 = p4[6 * 8 + col];
45509
+ v4 = dctSqrt1d2 * (p4[1 * 8 + col] - p4[7 * 8 + col]) + 2048 >> 12;
45510
+ v7 = dctSqrt1d2 * (p4[1 * 8 + col] + p4[7 * 8 + col]) + 2048 >> 12;
45511
+ v5 = p4[3 * 8 + col];
45512
+ v6 = p4[5 * 8 + col];
45513
+ t = v0 - v1 + 1 >> 1;
45514
+ v0 = v0 + v1 + 1 >> 1;
45515
+ v1 = t;
45516
+ t = v22 * dctSin6 + v32 * dctCos6 + 2048 >> 12;
45517
+ v22 = v22 * dctCos6 - v32 * dctSin6 + 2048 >> 12;
45518
+ v32 = t;
45519
+ t = v4 - v6 + 1 >> 1;
45520
+ v4 = v4 + v6 + 1 >> 1;
45521
+ v6 = t;
45522
+ t = v7 + v5 + 1 >> 1;
45523
+ v5 = v7 - v5 + 1 >> 1;
45524
+ v7 = t;
45525
+ t = v0 - v32 + 1 >> 1;
45526
+ v0 = v0 + v32 + 1 >> 1;
45527
+ v32 = t;
45528
+ t = v1 - v22 + 1 >> 1;
45529
+ v1 = v1 + v22 + 1 >> 1;
45530
+ v22 = t;
45531
+ t = v4 * dctSin3 + v7 * dctCos3 + 2048 >> 12;
45532
+ v4 = v4 * dctCos3 - v7 * dctSin3 + 2048 >> 12;
45533
+ v7 = t;
45534
+ t = v5 * dctSin1 + v6 * dctCos1 + 2048 >> 12;
45535
+ v5 = v5 * dctCos1 - v6 * dctSin1 + 2048 >> 12;
45536
+ v6 = t;
45537
+ p4[0 * 8 + col] = v0 + v7;
45538
+ p4[7 * 8 + col] = v0 - v7;
45539
+ p4[1 * 8 + col] = v1 + v6;
45540
+ p4[6 * 8 + col] = v1 - v6;
45541
+ p4[2 * 8 + col] = v22 + v5;
45542
+ p4[5 * 8 + col] = v22 - v5;
45543
+ p4[3 * 8 + col] = v32 + v4;
45544
+ p4[4 * 8 + col] = v32 - v4;
45545
+ }
45546
+ for (i3 = 0; i3 < 64; ++i3) {
45547
+ var sample2 = 128 + (p4[i3] + 8 >> 4);
45548
+ dataOut[i3] = sample2 < 0 ? 0 : sample2 > 255 ? 255 : sample2;
45549
+ }
45550
+ }
45551
+ requestMemoryAllocation(samplesPerLine * blocksPerColumn * 8);
45552
+ var i2, j3;
45553
+ for (var blockRow = 0; blockRow < blocksPerColumn; blockRow++) {
45554
+ var scanLine2 = blockRow << 3;
45555
+ for (i2 = 0; i2 < 8; i2++)
45556
+ lines2.push(new Uint8Array(samplesPerLine));
45557
+ for (var blockCol = 0; blockCol < blocksPerLine; blockCol++) {
45558
+ quantizeAndInverse(component.blocks[blockRow][blockCol], r4, R5);
45559
+ var offset = 0, sample = blockCol << 3;
45560
+ for (j3 = 0; j3 < 8; j3++) {
45561
+ var line = lines2[scanLine2 + j3];
45562
+ for (i2 = 0; i2 < 8; i2++)
45563
+ line[sample + i2] = r4[offset++];
45564
+ }
45565
+ }
45566
+ }
45567
+ return lines2;
45568
+ }
45569
+ function clampTo8bit(a2) {
45570
+ return a2 < 0 ? 0 : a2 > 255 ? 255 : a2;
45571
+ }
45572
+ constructor.prototype = {
45573
+ load: function load(path) {
45574
+ var xhr = new XMLHttpRequest();
45575
+ xhr.open("GET", path, true);
45576
+ xhr.responseType = "arraybuffer";
45577
+ xhr.onload = (function() {
45578
+ var data = new Uint8Array(xhr.response || xhr.mozResponseArrayBuffer);
45579
+ this.parse(data);
45580
+ if (this.onload)
45581
+ this.onload();
45582
+ }).bind(this);
45583
+ xhr.send(null);
45584
+ },
45585
+ parse: function parse6(data) {
45586
+ var maxResolutionInPixels = this.opts.maxResolutionInMP * 1e3 * 1e3;
45587
+ var offset = 0, length = data.length;
45588
+ function readUint16() {
45589
+ var value = data[offset] << 8 | data[offset + 1];
45590
+ offset += 2;
45591
+ return value;
45592
+ }
45593
+ function readDataBlock() {
45594
+ var length2 = readUint16();
45595
+ var array2 = data.subarray(offset, offset + length2 - 2);
45596
+ offset += array2.length;
45597
+ return array2;
45598
+ }
45599
+ function prepareComponents(frame2) {
45600
+ var maxH2 = 1, maxV2 = 1;
45601
+ var component2, componentId2;
45602
+ for (componentId2 in frame2.components) {
45603
+ if (frame2.components.hasOwnProperty(componentId2)) {
45604
+ component2 = frame2.components[componentId2];
45605
+ if (maxH2 < component2.h) maxH2 = component2.h;
45606
+ if (maxV2 < component2.v) maxV2 = component2.v;
45607
+ }
45608
+ }
45609
+ var mcusPerLine = Math.ceil(frame2.samplesPerLine / 8 / maxH2);
45610
+ var mcusPerColumn = Math.ceil(frame2.scanLines / 8 / maxV2);
45611
+ for (componentId2 in frame2.components) {
45612
+ if (frame2.components.hasOwnProperty(componentId2)) {
45613
+ component2 = frame2.components[componentId2];
45614
+ var blocksPerLine = Math.ceil(Math.ceil(frame2.samplesPerLine / 8) * component2.h / maxH2);
45615
+ var blocksPerColumn = Math.ceil(Math.ceil(frame2.scanLines / 8) * component2.v / maxV2);
45616
+ var blocksPerLineForMcu = mcusPerLine * component2.h;
45617
+ var blocksPerColumnForMcu = mcusPerColumn * component2.v;
45618
+ var blocksToAllocate = blocksPerColumnForMcu * blocksPerLineForMcu;
45619
+ var blocks = [];
45620
+ requestMemoryAllocation(blocksToAllocate * 256);
45621
+ for (var i3 = 0; i3 < blocksPerColumnForMcu; i3++) {
45622
+ var row2 = [];
45623
+ for (var j4 = 0; j4 < blocksPerLineForMcu; j4++)
45624
+ row2.push(new Int32Array(64));
45625
+ blocks.push(row2);
45626
+ }
45627
+ component2.blocksPerLine = blocksPerLine;
45628
+ component2.blocksPerColumn = blocksPerColumn;
45629
+ component2.blocks = blocks;
45630
+ }
45631
+ }
45632
+ frame2.maxH = maxH2;
45633
+ frame2.maxV = maxV2;
45634
+ frame2.mcusPerLine = mcusPerLine;
45635
+ frame2.mcusPerColumn = mcusPerColumn;
45636
+ }
45637
+ var jfif = null;
45638
+ var adobe = null;
45639
+ var pixels = null;
45640
+ var frame, resetInterval;
45641
+ var quantizationTables = [], frames = [];
45642
+ var huffmanTablesAC = [], huffmanTablesDC = [];
45643
+ var fileMarker = readUint16();
45644
+ var malformedDataOffset = -1;
45645
+ this.comments = [];
45646
+ if (fileMarker != 65496) {
45647
+ throw new Error("SOI not found");
45648
+ }
45649
+ fileMarker = readUint16();
45650
+ while (fileMarker != 65497) {
45651
+ var i2, j3, l3;
45652
+ switch (fileMarker) {
45653
+ case 65280:
45654
+ break;
45655
+ case 65504:
45656
+ // APP0 (Application Specific)
45657
+ case 65505:
45658
+ // APP1
45659
+ case 65506:
45660
+ // APP2
45661
+ case 65507:
45662
+ // APP3
45663
+ case 65508:
45664
+ // APP4
45665
+ case 65509:
45666
+ // APP5
45667
+ case 65510:
45668
+ // APP6
45669
+ case 65511:
45670
+ // APP7
45671
+ case 65512:
45672
+ // APP8
45673
+ case 65513:
45674
+ // APP9
45675
+ case 65514:
45676
+ // APP10
45677
+ case 65515:
45678
+ // APP11
45679
+ case 65516:
45680
+ // APP12
45681
+ case 65517:
45682
+ // APP13
45683
+ case 65518:
45684
+ // APP14
45685
+ case 65519:
45686
+ // APP15
45687
+ case 65534:
45688
+ var appData = readDataBlock();
45689
+ if (fileMarker === 65534) {
45690
+ var comment2 = String.fromCharCode.apply(null, appData);
45691
+ this.comments.push(comment2);
45692
+ }
45693
+ if (fileMarker === 65504) {
45694
+ if (appData[0] === 74 && appData[1] === 70 && appData[2] === 73 && appData[3] === 70 && appData[4] === 0) {
45695
+ jfif = {
45696
+ version: { major: appData[5], minor: appData[6] },
45697
+ densityUnits: appData[7],
45698
+ xDensity: appData[8] << 8 | appData[9],
45699
+ yDensity: appData[10] << 8 | appData[11],
45700
+ thumbWidth: appData[12],
45701
+ thumbHeight: appData[13],
45702
+ thumbData: appData.subarray(14, 14 + 3 * appData[12] * appData[13])
45703
+ };
45704
+ }
45705
+ }
45706
+ if (fileMarker === 65505) {
45707
+ if (appData[0] === 69 && appData[1] === 120 && appData[2] === 105 && appData[3] === 102 && appData[4] === 0) {
45708
+ this.exifBuffer = appData.subarray(5, appData.length);
45709
+ }
45710
+ }
45711
+ if (fileMarker === 65518) {
45712
+ if (appData[0] === 65 && appData[1] === 100 && appData[2] === 111 && appData[3] === 98 && appData[4] === 101 && appData[5] === 0) {
45713
+ adobe = {
45714
+ version: appData[6],
45715
+ flags0: appData[7] << 8 | appData[8],
45716
+ flags1: appData[9] << 8 | appData[10],
45717
+ transformCode: appData[11]
45718
+ };
45719
+ }
45720
+ }
45721
+ break;
45722
+ case 65499:
45723
+ var quantizationTablesLength = readUint16();
45724
+ var quantizationTablesEnd = quantizationTablesLength + offset - 2;
45725
+ while (offset < quantizationTablesEnd) {
45726
+ var quantizationTableSpec = data[offset++];
45727
+ requestMemoryAllocation(64 * 4);
45728
+ var tableData = new Int32Array(64);
45729
+ if (quantizationTableSpec >> 4 === 0) {
45730
+ for (j3 = 0; j3 < 64; j3++) {
45731
+ var z5 = dctZigZag[j3];
45732
+ tableData[z5] = data[offset++];
45733
+ }
45734
+ } else if (quantizationTableSpec >> 4 === 1) {
45735
+ for (j3 = 0; j3 < 64; j3++) {
45736
+ var z5 = dctZigZag[j3];
45737
+ tableData[z5] = readUint16();
45738
+ }
45739
+ } else
45740
+ throw new Error("DQT: invalid table spec");
45741
+ quantizationTables[quantizationTableSpec & 15] = tableData;
45742
+ }
45743
+ break;
45744
+ case 65472:
45745
+ // SOF0 (Start of Frame, Baseline DCT)
45746
+ case 65473:
45747
+ // SOF1 (Start of Frame, Extended DCT)
45748
+ case 65474:
45749
+ readUint16();
45750
+ frame = {};
45751
+ frame.extended = fileMarker === 65473;
45752
+ frame.progressive = fileMarker === 65474;
45753
+ frame.precision = data[offset++];
45754
+ frame.scanLines = readUint16();
45755
+ frame.samplesPerLine = readUint16();
45756
+ frame.components = {};
45757
+ frame.componentsOrder = [];
45758
+ var pixelsInFrame = frame.scanLines * frame.samplesPerLine;
45759
+ if (pixelsInFrame > maxResolutionInPixels) {
45760
+ var exceededAmount = Math.ceil((pixelsInFrame - maxResolutionInPixels) / 1e6);
45761
+ throw new Error(`maxResolutionInMP limit exceeded by ${exceededAmount}MP`);
45762
+ }
45763
+ var componentsCount = data[offset++], componentId;
45764
+ var maxH = 0, maxV = 0;
45765
+ for (i2 = 0; i2 < componentsCount; i2++) {
45766
+ componentId = data[offset];
45767
+ var h2 = data[offset + 1] >> 4;
45768
+ var v4 = data[offset + 1] & 15;
45769
+ var qId = data[offset + 2];
45770
+ if (h2 <= 0 || v4 <= 0) {
45771
+ throw new Error("Invalid sampling factor, expected values above 0");
45772
+ }
45773
+ frame.componentsOrder.push(componentId);
45774
+ frame.components[componentId] = {
45775
+ h: h2,
45776
+ v: v4,
45777
+ quantizationIdx: qId
45778
+ };
45779
+ offset += 3;
45780
+ }
45781
+ prepareComponents(frame);
45782
+ frames.push(frame);
45783
+ break;
45784
+ case 65476:
45785
+ var huffmanLength = readUint16();
45786
+ for (i2 = 2; i2 < huffmanLength; ) {
45787
+ var huffmanTableSpec = data[offset++];
45788
+ var codeLengths = new Uint8Array(16);
45789
+ var codeLengthSum = 0;
45790
+ for (j3 = 0; j3 < 16; j3++, offset++) {
45791
+ codeLengthSum += codeLengths[j3] = data[offset];
45792
+ }
45793
+ requestMemoryAllocation(16 + codeLengthSum);
45794
+ var huffmanValues = new Uint8Array(codeLengthSum);
45795
+ for (j3 = 0; j3 < codeLengthSum; j3++, offset++)
45796
+ huffmanValues[j3] = data[offset];
45797
+ i2 += 17 + codeLengthSum;
45798
+ (huffmanTableSpec >> 4 === 0 ? huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] = buildHuffmanTable(codeLengths, huffmanValues);
45799
+ }
45800
+ break;
45801
+ case 65501:
45802
+ readUint16();
45803
+ resetInterval = readUint16();
45804
+ break;
45805
+ case 65500:
45806
+ readUint16();
45807
+ readUint16();
45808
+ break;
45809
+ case 65498:
45810
+ var scanLength = readUint16();
45811
+ var selectorsCount = data[offset++];
45812
+ var components = [], component;
45813
+ for (i2 = 0; i2 < selectorsCount; i2++) {
45814
+ component = frame.components[data[offset++]];
45815
+ var tableSpec = data[offset++];
45816
+ component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4];
45817
+ component.huffmanTableAC = huffmanTablesAC[tableSpec & 15];
45818
+ components.push(component);
45819
+ }
45820
+ var spectralStart = data[offset++];
45821
+ var spectralEnd = data[offset++];
45822
+ var successiveApproximation = data[offset++];
45823
+ var processed = decodeScan(
45824
+ data,
45825
+ offset,
45826
+ frame,
45827
+ components,
45828
+ resetInterval,
45829
+ spectralStart,
45830
+ spectralEnd,
45831
+ successiveApproximation >> 4,
45832
+ successiveApproximation & 15,
45833
+ this.opts
45834
+ );
45835
+ offset += processed;
45836
+ break;
45837
+ case 65535:
45838
+ if (data[offset] !== 255) {
45839
+ offset--;
45840
+ }
45841
+ break;
45842
+ default:
45843
+ if (data[offset - 3] == 255 && data[offset - 2] >= 192 && data[offset - 2] <= 254) {
45844
+ offset -= 3;
45845
+ break;
45846
+ } else if (fileMarker === 224 || fileMarker == 225) {
45847
+ if (malformedDataOffset !== -1) {
45848
+ throw new Error(`first unknown JPEG marker at offset ${malformedDataOffset.toString(16)}, second unknown JPEG marker ${fileMarker.toString(16)} at offset ${(offset - 1).toString(16)}`);
45849
+ }
45850
+ malformedDataOffset = offset - 1;
45851
+ const nextOffset = readUint16();
45852
+ if (data[offset + nextOffset - 2] === 255) {
45853
+ offset += nextOffset - 2;
45854
+ break;
45855
+ }
45856
+ }
45857
+ throw new Error("unknown JPEG marker " + fileMarker.toString(16));
45858
+ }
45859
+ fileMarker = readUint16();
45860
+ }
45861
+ if (frames.length != 1)
45862
+ throw new Error("only single frame JPEGs supported");
45863
+ for (var i2 = 0; i2 < frames.length; i2++) {
45864
+ var cp3 = frames[i2].components;
45865
+ for (var j3 in cp3) {
45866
+ cp3[j3].quantizationTable = quantizationTables[cp3[j3].quantizationIdx];
45867
+ delete cp3[j3].quantizationIdx;
45868
+ }
45869
+ }
45870
+ this.width = frame.samplesPerLine;
45871
+ this.height = frame.scanLines;
45872
+ this.jfif = jfif;
45873
+ this.adobe = adobe;
45874
+ this.components = [];
45875
+ for (var i2 = 0; i2 < frame.componentsOrder.length; i2++) {
45876
+ var component = frame.components[frame.componentsOrder[i2]];
45877
+ this.components.push({
45878
+ lines: buildComponentData(frame, component),
45879
+ scaleX: component.h / frame.maxH,
45880
+ scaleY: component.v / frame.maxV
45881
+ });
45882
+ }
45883
+ },
45884
+ getData: function getData(width, height) {
45885
+ var scaleX = this.width / width, scaleY = this.height / height;
45886
+ var component1, component2, component3, component4;
45887
+ var component1Line, component2Line, component3Line, component4Line;
45888
+ var x4, y3;
45889
+ var offset = 0;
45890
+ var Y3, Cb, Cr2, K4, C5, M4, Ye2, R5, G3, B4;
45891
+ var colorTransform;
45892
+ var dataLength = width * height * this.components.length;
45893
+ requestMemoryAllocation(dataLength);
45894
+ var data = new Uint8Array(dataLength);
45895
+ switch (this.components.length) {
45896
+ case 1:
45897
+ component1 = this.components[0];
45898
+ for (y3 = 0; y3 < height; y3++) {
45899
+ component1Line = component1.lines[0 | y3 * component1.scaleY * scaleY];
45900
+ for (x4 = 0; x4 < width; x4++) {
45901
+ Y3 = component1Line[0 | x4 * component1.scaleX * scaleX];
45902
+ data[offset++] = Y3;
45903
+ }
45904
+ }
45905
+ break;
45906
+ case 2:
45907
+ component1 = this.components[0];
45908
+ component2 = this.components[1];
45909
+ for (y3 = 0; y3 < height; y3++) {
45910
+ component1Line = component1.lines[0 | y3 * component1.scaleY * scaleY];
45911
+ component2Line = component2.lines[0 | y3 * component2.scaleY * scaleY];
45912
+ for (x4 = 0; x4 < width; x4++) {
45913
+ Y3 = component1Line[0 | x4 * component1.scaleX * scaleX];
45914
+ data[offset++] = Y3;
45915
+ Y3 = component2Line[0 | x4 * component2.scaleX * scaleX];
45916
+ data[offset++] = Y3;
45917
+ }
45918
+ }
45919
+ break;
45920
+ case 3:
45921
+ colorTransform = true;
45922
+ if (this.adobe && this.adobe.transformCode)
45923
+ colorTransform = true;
45924
+ else if (typeof this.opts.colorTransform !== "undefined")
45925
+ colorTransform = !!this.opts.colorTransform;
45926
+ component1 = this.components[0];
45927
+ component2 = this.components[1];
45928
+ component3 = this.components[2];
45929
+ for (y3 = 0; y3 < height; y3++) {
45930
+ component1Line = component1.lines[0 | y3 * component1.scaleY * scaleY];
45931
+ component2Line = component2.lines[0 | y3 * component2.scaleY * scaleY];
45932
+ component3Line = component3.lines[0 | y3 * component3.scaleY * scaleY];
45933
+ for (x4 = 0; x4 < width; x4++) {
45934
+ if (!colorTransform) {
45935
+ R5 = component1Line[0 | x4 * component1.scaleX * scaleX];
45936
+ G3 = component2Line[0 | x4 * component2.scaleX * scaleX];
45937
+ B4 = component3Line[0 | x4 * component3.scaleX * scaleX];
45938
+ } else {
45939
+ Y3 = component1Line[0 | x4 * component1.scaleX * scaleX];
45940
+ Cb = component2Line[0 | x4 * component2.scaleX * scaleX];
45941
+ Cr2 = component3Line[0 | x4 * component3.scaleX * scaleX];
45942
+ R5 = clampTo8bit(Y3 + 1.402 * (Cr2 - 128));
45943
+ G3 = clampTo8bit(Y3 - 0.3441363 * (Cb - 128) - 0.71413636 * (Cr2 - 128));
45944
+ B4 = clampTo8bit(Y3 + 1.772 * (Cb - 128));
45945
+ }
45946
+ data[offset++] = R5;
45947
+ data[offset++] = G3;
45948
+ data[offset++] = B4;
45949
+ }
45950
+ }
45951
+ break;
45952
+ case 4:
45953
+ if (!this.adobe)
45954
+ throw new Error("Unsupported color mode (4 components)");
45955
+ colorTransform = false;
45956
+ if (this.adobe && this.adobe.transformCode)
45957
+ colorTransform = true;
45958
+ else if (typeof this.opts.colorTransform !== "undefined")
45959
+ colorTransform = !!this.opts.colorTransform;
45960
+ component1 = this.components[0];
45961
+ component2 = this.components[1];
45962
+ component3 = this.components[2];
45963
+ component4 = this.components[3];
45964
+ for (y3 = 0; y3 < height; y3++) {
45965
+ component1Line = component1.lines[0 | y3 * component1.scaleY * scaleY];
45966
+ component2Line = component2.lines[0 | y3 * component2.scaleY * scaleY];
45967
+ component3Line = component3.lines[0 | y3 * component3.scaleY * scaleY];
45968
+ component4Line = component4.lines[0 | y3 * component4.scaleY * scaleY];
45969
+ for (x4 = 0; x4 < width; x4++) {
45970
+ if (!colorTransform) {
45971
+ C5 = component1Line[0 | x4 * component1.scaleX * scaleX];
45972
+ M4 = component2Line[0 | x4 * component2.scaleX * scaleX];
45973
+ Ye2 = component3Line[0 | x4 * component3.scaleX * scaleX];
45974
+ K4 = component4Line[0 | x4 * component4.scaleX * scaleX];
45975
+ } else {
45976
+ Y3 = component1Line[0 | x4 * component1.scaleX * scaleX];
45977
+ Cb = component2Line[0 | x4 * component2.scaleX * scaleX];
45978
+ Cr2 = component3Line[0 | x4 * component3.scaleX * scaleX];
45979
+ K4 = component4Line[0 | x4 * component4.scaleX * scaleX];
45980
+ C5 = 255 - clampTo8bit(Y3 + 1.402 * (Cr2 - 128));
45981
+ M4 = 255 - clampTo8bit(Y3 - 0.3441363 * (Cb - 128) - 0.71413636 * (Cr2 - 128));
45982
+ Ye2 = 255 - clampTo8bit(Y3 + 1.772 * (Cb - 128));
45983
+ }
45984
+ data[offset++] = 255 - C5;
45985
+ data[offset++] = 255 - M4;
45986
+ data[offset++] = 255 - Ye2;
45987
+ data[offset++] = 255 - K4;
45988
+ }
45989
+ }
45990
+ break;
45991
+ default:
45992
+ throw new Error("Unsupported color mode");
45993
+ }
45994
+ return data;
45995
+ },
45996
+ copyToImageData: function copyToImageData(imageData, formatAsRGBA) {
45997
+ var width = imageData.width, height = imageData.height;
45998
+ var imageDataArray = imageData.data;
45999
+ var data = this.getData(width, height);
46000
+ var i2 = 0, j3 = 0, x4, y3;
46001
+ var Y3, K4, C5, M4, R5, G3, B4;
46002
+ switch (this.components.length) {
46003
+ case 1:
46004
+ for (y3 = 0; y3 < height; y3++) {
46005
+ for (x4 = 0; x4 < width; x4++) {
46006
+ Y3 = data[i2++];
46007
+ imageDataArray[j3++] = Y3;
46008
+ imageDataArray[j3++] = Y3;
46009
+ imageDataArray[j3++] = Y3;
46010
+ if (formatAsRGBA) {
46011
+ imageDataArray[j3++] = 255;
46012
+ }
46013
+ }
46014
+ }
46015
+ break;
46016
+ case 3:
46017
+ for (y3 = 0; y3 < height; y3++) {
46018
+ for (x4 = 0; x4 < width; x4++) {
46019
+ R5 = data[i2++];
46020
+ G3 = data[i2++];
46021
+ B4 = data[i2++];
46022
+ imageDataArray[j3++] = R5;
46023
+ imageDataArray[j3++] = G3;
46024
+ imageDataArray[j3++] = B4;
46025
+ if (formatAsRGBA) {
46026
+ imageDataArray[j3++] = 255;
46027
+ }
46028
+ }
46029
+ }
46030
+ break;
46031
+ case 4:
46032
+ for (y3 = 0; y3 < height; y3++) {
46033
+ for (x4 = 0; x4 < width; x4++) {
46034
+ C5 = data[i2++];
46035
+ M4 = data[i2++];
46036
+ Y3 = data[i2++];
46037
+ K4 = data[i2++];
46038
+ R5 = 255 - clampTo8bit(C5 * (1 - K4 / 255) + K4);
46039
+ G3 = 255 - clampTo8bit(M4 * (1 - K4 / 255) + K4);
46040
+ B4 = 255 - clampTo8bit(Y3 * (1 - K4 / 255) + K4);
46041
+ imageDataArray[j3++] = R5;
46042
+ imageDataArray[j3++] = G3;
46043
+ imageDataArray[j3++] = B4;
46044
+ if (formatAsRGBA) {
46045
+ imageDataArray[j3++] = 255;
46046
+ }
46047
+ }
46048
+ }
46049
+ break;
46050
+ default:
46051
+ throw new Error("Unsupported color mode");
46052
+ }
46053
+ }
46054
+ };
46055
+ var totalBytesAllocated = 0;
46056
+ var maxMemoryUsageBytes = 0;
46057
+ function requestMemoryAllocation(increaseAmount = 0) {
46058
+ var totalMemoryImpactBytes = totalBytesAllocated + increaseAmount;
46059
+ if (totalMemoryImpactBytes > maxMemoryUsageBytes) {
46060
+ var exceededAmount = Math.ceil((totalMemoryImpactBytes - maxMemoryUsageBytes) / 1024 / 1024);
46061
+ throw new Error(`maxMemoryUsageInMB limit exceeded by at least ${exceededAmount}MB`);
46062
+ }
46063
+ totalBytesAllocated = totalMemoryImpactBytes;
46064
+ }
46065
+ constructor.resetMaxMemoryUsage = function(maxMemoryUsageBytes_) {
46066
+ totalBytesAllocated = 0;
46067
+ maxMemoryUsageBytes = maxMemoryUsageBytes_;
46068
+ };
46069
+ constructor.getBytesAllocated = function() {
46070
+ return totalBytesAllocated;
46071
+ };
46072
+ constructor.requestMemoryAllocation = requestMemoryAllocation;
46073
+ return constructor;
46074
+ })();
46075
+ if (typeof module !== "undefined") {
46076
+ module.exports = decode3;
46077
+ } else if (typeof window !== "undefined") {
46078
+ window["jpeg-js"] = window["jpeg-js"] || {};
46079
+ window["jpeg-js"].decode = decode3;
46080
+ }
46081
+ function decode3(jpegData, userOpts = {}) {
46082
+ var defaultOpts = {
46083
+ // "undefined" means "Choose whether to transform colors based on the image’s color model."
46084
+ colorTransform: void 0,
46085
+ useTArray: false,
46086
+ formatAsRGBA: true,
46087
+ tolerantDecoding: true,
46088
+ maxResolutionInMP: 100,
46089
+ // Don't decode more than 100 megapixels
46090
+ maxMemoryUsageInMB: 512
46091
+ // Don't decode if memory footprint is more than 512MB
46092
+ };
46093
+ var opts = { ...defaultOpts, ...userOpts };
46094
+ var arr = new Uint8Array(jpegData);
46095
+ var decoder4 = new JpegImage();
46096
+ decoder4.opts = opts;
46097
+ JpegImage.resetMaxMemoryUsage(opts.maxMemoryUsageInMB * 1024 * 1024);
46098
+ decoder4.parse(arr);
46099
+ var channels = opts.formatAsRGBA ? 4 : 3;
46100
+ var bytesNeeded = decoder4.width * decoder4.height * channels;
46101
+ try {
46102
+ JpegImage.requestMemoryAllocation(bytesNeeded);
46103
+ var image = {
46104
+ width: decoder4.width,
46105
+ height: decoder4.height,
46106
+ exifBuffer: decoder4.exifBuffer,
46107
+ data: opts.useTArray ? new Uint8Array(bytesNeeded) : Buffer.alloc(bytesNeeded)
46108
+ };
46109
+ if (decoder4.comments.length > 0) {
46110
+ image["comments"] = decoder4.comments;
46111
+ }
46112
+ } catch (err) {
46113
+ if (err instanceof RangeError) {
46114
+ throw new Error("Could not allocate enough memory for the image. Required: " + bytesNeeded);
46115
+ }
46116
+ if (err instanceof ReferenceError) {
46117
+ if (err.message === "Buffer is not defined") {
46118
+ throw new Error("Buffer is not globally defined in this environment. Consider setting useTArray to true");
46119
+ }
46120
+ }
46121
+ throw err;
46122
+ }
46123
+ decoder4.copyToImageData(image, opts.formatAsRGBA);
46124
+ return image;
46125
+ }
46126
+ }
46127
+ });
46128
+
46129
+ // ../../node_modules/jpeg-js/index.js
46130
+ var require_jpeg_js = __commonJS({
46131
+ "../../node_modules/jpeg-js/index.js"(exports, module) {
46132
+ var encode4 = require_encoder();
46133
+ var decode3 = require_decoder();
46134
+ module.exports = {
46135
+ encode: encode4,
46136
+ decode: decode3
46137
+ };
46138
+ }
46139
+ });
46140
+
43849
46141
  // ../../packages/codex/src/account-store.ts
43850
46142
  import { randomUUID as randomUUID8 } from "node:crypto";
43851
46143
  import { copyFileSync, existsSync as existsSync16, lstatSync, mkdirSync as mkdirSync6, readFileSync as readFileSync15, readdirSync as readdirSync7, renameSync, symlinkSync, writeFileSync as writeFileSync6 } from "node:fs";
@@ -44583,12 +46875,12 @@ function createCodexMcpAppsProvider(binding, threadId, request, connectionKey =
44583
46875
  },
44584
46876
  tools,
44585
46877
  async readResource(req, signal2) {
44586
- const document = req.uri.startsWith("ui://");
44587
- if (!document && !req.transient) throw new McpAppsError("invalid", "MCP App resources must use ui://");
46878
+ const document2 = req.uri.startsWith("ui://");
46879
+ if (!document2 && !req.transient) throw new McpAppsError("invalid", "MCP App resources must use ui://");
44588
46880
  guard(signal2, req.origin);
44589
46881
  const result3 = await invoke("mcpServer/resource/read", { uri: req.uri }, signal2, req.origin, false, req.transient ? MCP_APP_OUTPUT_MAX_BYTES : MCP_APP_HTML_MAX_BYTES + MCP_APP_DATA_MAX_BYTES);
44590
46882
  const rawContents = Array.isArray(result3.contents) ? result3.contents : [];
44591
- if (!document) return { contents: rawContents, ...record9(result3._meta) ? { _meta: record9(result3._meta) } : {} };
46883
+ if (!document2) return { contents: rawContents, ...record9(result3._meta) ? { _meta: record9(result3._meta) } : {} };
44592
46884
  let listMeta;
44593
46885
  if (rawContents.some((value) => record9(value)?.uri === req.uri && !record9(record9(record9(value)?._meta)?.ui))) {
44594
46886
  const server = (await catalog("full")).find((entry3) => entry3.name === binding.server);
@@ -48431,12 +50723,12 @@ var init_provider_settings_env = __esm({
48431
50723
  });
48432
50724
 
48433
50725
  // ../../packages/claude/src/resolve-sdk-binary.ts
48434
- import { createRequire as createRequire2 } from "node:module";
50726
+ import { createRequire } from "node:module";
48435
50727
  import { existsSync as existsSync18 } from "node:fs";
48436
50728
  function resolveSdkClaudeBinary() {
48437
50729
  if (cached2 !== void 0) return cached2;
48438
50730
  try {
48439
- const req = createRequire2(import.meta.url);
50731
+ const req = createRequire(import.meta.url);
48440
50732
  const ext = process.platform === "win32" ? ".exe" : "";
48441
50733
  const candidates = process.platform === "linux" ? [
48442
50734
  `@anthropic-ai/claude-agent-sdk-linux-${process.arch}-musl/claude${ext}`,
@@ -69883,10 +72175,10 @@ var init_managed_tarball_installer = __esm({
69883
72175
  });
69884
72176
 
69885
72177
  // ../../packages/runtime/src/harness/cursor-availability.ts
69886
- import { createRequire as createRequire3 } from "node:module";
72178
+ import { createRequire as createRequire2 } from "node:module";
69887
72179
  function isCursorSdkAvailable() {
69888
72180
  try {
69889
- require3.resolve("@cursor/sdk");
72181
+ require2.resolve("@cursor/sdk");
69890
72182
  return true;
69891
72183
  } catch {
69892
72184
  return false;
@@ -69896,11 +72188,11 @@ function resolveCursorApiKeyPlain() {
69896
72188
  const v4 = process.env.CURSOR_API_KEY?.trim();
69897
72189
  return v4 || void 0;
69898
72190
  }
69899
- var require3;
72191
+ var require2;
69900
72192
  var init_cursor_availability = __esm({
69901
72193
  "../../packages/runtime/src/harness/cursor-availability.ts"() {
69902
72194
  "use strict";
69903
- require3 = createRequire3(import.meta.url);
72195
+ require2 = createRequire2(import.meta.url);
69904
72196
  }
69905
72197
  });
69906
72198
 
@@ -105847,26 +108139,26 @@ var init_cursor_config = __esm({
105847
108139
  });
105848
108140
 
105849
108141
  // ../../packages/cursor/src/cursor-sdk-available.ts
105850
- import { createRequire as createRequire4 } from "node:module";
108142
+ import { createRequire as createRequire3 } from "node:module";
105851
108143
  function isCursorSdkAvailable2() {
105852
108144
  try {
105853
- require4.resolve("@cursor/sdk");
108145
+ require3.resolve("@cursor/sdk");
105854
108146
  return true;
105855
108147
  } catch {
105856
108148
  return false;
105857
108149
  }
105858
108150
  }
105859
- var require4;
108151
+ var require3;
105860
108152
  var init_cursor_sdk_available = __esm({
105861
108153
  "../../packages/cursor/src/cursor-sdk-available.ts"() {
105862
108154
  "use strict";
105863
- require4 = createRequire4(import.meta.url);
108155
+ require3 = createRequire3(import.meta.url);
105864
108156
  }
105865
108157
  });
105866
108158
 
105867
108159
  // ../../packages/cursor/src/cursor-platform-binaries.ts
105868
108160
  import { existsSync as existsSync42, statSync as statSync12 } from "node:fs";
105869
- import { createRequire as createRequire5 } from "node:module";
108161
+ import { createRequire as createRequire4 } from "node:module";
105870
108162
  import { dirname as dirname18, join as join43 } from "node:path";
105871
108163
  function cursorPlatformPackageName(platform3 = process.platform, arch2 = process.arch) {
105872
108164
  return `@cursor/sdk-${platform3}-${arch2}`;
@@ -105886,7 +108178,7 @@ function isExecutableFile2(candidate) {
105886
108178
  }
105887
108179
  function cursorSdkRequire() {
105888
108180
  try {
105889
- return createRequire5(requireFromHere.resolve("@cursor/sdk/package.json"));
108181
+ return createRequire4(requireFromHere.resolve("@cursor/sdk/package.json"));
105890
108182
  } catch {
105891
108183
  return requireFromHere;
105892
108184
  }
@@ -105992,7 +108284,7 @@ var requireFromHere, lookupDepth, savedArgv1;
105992
108284
  var init_cursor_platform_binaries = __esm({
105993
108285
  "../../packages/cursor/src/cursor-platform-binaries.ts"() {
105994
108286
  "use strict";
105995
- requireFromHere = createRequire5(import.meta.url);
108287
+ requireFromHere = createRequire4(import.meta.url);
105996
108288
  lookupDepth = 0;
105997
108289
  }
105998
108290
  });
@@ -121280,6 +123572,7 @@ function utf8Length(input) {
121280
123572
 
121281
123573
  // ../../packages/shared/src/transcript-window/fragment-message.ts
121282
123574
  init_codex_content();
123575
+ init_transcript_boundary();
121283
123576
 
121284
123577
  // ../../packages/shared/src/transcript-window/text-cuts.ts
121285
123578
  var FRAGMENT_TEXT_CHARS = 4096;
@@ -121383,9 +123676,12 @@ var MessageFragmenter = class {
121383
123676
  const fragments = (message.attachments ?? []).map((attachment, index) => attachmentEntry(index, attachment));
121384
123677
  const blocks = fragments.map(() => -1);
121385
123678
  const keys = blockKeys(content);
123679
+ const contentKeyList = contentKeys(content);
121386
123680
  content.forEach((block, index) => {
121387
123681
  const key3 = keys[index];
121388
123682
  const memo = blockFragments(block, key3, previous?.get(key3));
123683
+ const contentKey = contentKeyList[index];
123684
+ for (const entry3 of memo.entries) if (entry3.contentKey !== contentKey) entry3.contentKey = contentKey;
121389
123685
  next.set(key3, memo);
121390
123686
  fragments.push(...memo.entries);
121391
123687
  for (let i2 = 0; i2 < memo.entries.length; i2++) blocks.push(index);
@@ -121634,7 +123930,12 @@ function selectTranscriptWindow(source, request, budget) {
121634
123930
  const message = source.at(index);
121635
123931
  const range2 = selected.get(index);
121636
123932
  const held = have.get(message.id);
121637
- const fragments = message.fragments.slice(range2.first, range2.last + 1).map((fragment) => held?.f.get(fragment.key) === fragment.digest ? { key: fragment.key, digest: fragment.digest } : { key: fragment.key, digest: fragment.digest, body: fragment.body });
123933
+ const fragments = message.fragments.slice(range2.first, range2.last + 1).map((fragment) => ({
123934
+ key: fragment.key,
123935
+ digest: fragment.digest,
123936
+ ...fragment.contentKey ? { contentKey: fragment.contentKey } : {},
123937
+ ...held?.f.get(fragment.key) === fragment.digest ? {} : { body: fragment.body }
123938
+ }));
121638
123939
  const total = message.fragments.length;
121639
123940
  return {
121640
123941
  id: message.id,
@@ -121802,7 +124103,7 @@ function transcriptView(messages) {
121802
124103
  rows.push({ id: source.id, message: source, source, final: true });
121803
124104
  continue;
121804
124105
  }
121805
- const cuts = (boundaries.get(source.id) ?? []).sort((a2, b5) => a2.metadata.transcriptBoundary.order - b5.metadata.transcriptBoundary.order);
124106
+ const cuts = (boundaries.get(source.id) ?? []).filter((cut) => boundaryInWindow(cut.metadata.transcriptBoundary, source)).sort((a2, b5) => a2.metadata.transcriptBoundary.order - b5.metadata.transcriptBoundary.order);
121806
124107
  const cached5 = cachedSegments.get(source);
121807
124108
  if (cached5 && cached5.cuts.length === cuts.length && cached5.cuts.every((cut, index) => cut === cuts[index])) {
121808
124109
  result3.push(...cached5.segments);
@@ -122852,11 +125153,57 @@ function summarizeClaudeProcessFiles(segs, opts) {
122852
125153
  var MIN_FOLD_BLOCKS = 4;
122853
125154
  var NO_FOLDS = { ranges: [], summarize: () => ({ segments: 0, toolCalls: 0, files: [], added: 0, removed: 0, contentKey: "" }) };
122854
125155
  function planProcessFolds(message, context) {
122855
- if (message.role !== "assistant" || message.status === "streaming") return NO_FOLDS;
125156
+ if (message.role !== "assistant") return NO_FOLDS;
122856
125157
  const cuts = (context?.cuts ?? []).filter((cut) => cut.metadata?.transcriptBoundary?.messageId === message.id);
125158
+ if (message.status === "streaming") {
125159
+ if (!cuts.length || !message.id || isLegacyCodexMessage(message)) return NO_FOLDS;
125160
+ return planStreamingCuts(message, cuts);
125161
+ }
122857
125162
  if (cuts.length > 0 && message.id && !isLegacyCodexMessage(message)) return planSliced(message, cuts);
122858
125163
  return planContent(message, message.content);
122859
125164
  }
125165
+ var streamingPlans = /* @__PURE__ */ new Map();
125166
+ function planStreamingCuts(message, cuts) {
125167
+ const liveFrom = openSuffixStart(message, cuts);
125168
+ if (liveFrom <= 0) return NO_FOLDS;
125169
+ const closedKeys = contentKeys(message.content.slice(0, liveFrom)).join("\n");
125170
+ const cacheKey3 = `${message.id}:${liveFrom}:${closedKeys}:${cuts.map((cut) => `${cut.id}:${cut.metadata?.transcriptBoundary?.order ?? ""}`).join("|")}`;
125171
+ const cached5 = streamingPlans.get(cacheKey3);
125172
+ if (cached5) return cached5;
125173
+ const planned = planSliced({ ...message, status: "complete" }, cuts);
125174
+ const ranges = [];
125175
+ for (const range2 of planned.ranges) {
125176
+ if (range2.start >= liveFrom) continue;
125177
+ const end = Math.min(range2.end, liveFrom - 1);
125178
+ if (end - range2.start + 1 < MIN_FOLD_BLOCKS) continue;
125179
+ ranges.push(end === range2.end ? range2 : { ...range2, end, summary: planned.summarize(range2.start, end) });
125180
+ }
125181
+ const plan = { ranges, summarize: planned.summarize, liveFrom };
125182
+ streamingPlans.set(cacheKey3, plan);
125183
+ if (streamingPlans.size > 32) streamingPlans.delete(streamingPlans.keys().next().value);
125184
+ return plan;
125185
+ }
125186
+ function openSuffixStart(message, cuts) {
125187
+ const latest = cuts.reduce((best, cut) => cut.metadata.transcriptBoundary.order > best.metadata.transcriptBoundary.order ? cut : best);
125188
+ const boundary = latest.metadata?.transcriptBoundary;
125189
+ if (!boundary) return message.content.length;
125190
+ const source = message;
125191
+ const cursor = boundary.cursor ? boundary : boundaryCursor(boundary, source);
125192
+ const keys = contentKeys(message.content);
125193
+ if (cursor.at) {
125194
+ const index = keys.indexOf(cursor.at);
125195
+ return index < 0 ? message.content.length : index;
125196
+ }
125197
+ if (cursor.cursor) return message.content.length;
125198
+ const map2 = boundary.content ?? {};
125199
+ for (let index = 0; index < keys.length; index++) {
125200
+ const saved = map2[keys[index]];
125201
+ const text3 = blockText(message.content[index]);
125202
+ if (saved === void 0) return index;
125203
+ if (text3 !== void 0 && saved < text3.length) return index;
125204
+ }
125205
+ return message.content.length;
125206
+ }
122860
125207
  function planSliced(message, cuts) {
122861
125208
  const source = {
122862
125209
  id: message.id,
@@ -122875,19 +125222,29 @@ function planSliced(message, cuts) {
122875
125222
  const anchored = /* @__PURE__ */ new Map();
122876
125223
  const calls2 = /* @__PURE__ */ new Set();
122877
125224
  const sliceEnds = /* @__PURE__ */ new Set();
125225
+ const spans = [];
122878
125226
  for (const row2 of transcriptView([source, ...cuts]).rows) {
122879
125227
  if (row2.source.id !== source.id) continue;
122880
- let last = -1;
125228
+ const indexes = [];
122881
125229
  for (const block of row2.message.content) {
122882
125230
  const index = indexOf.get(block);
122883
- if (index !== void 0) last = Math.max(last, index);
125231
+ if (index !== void 0) indexes.push(index);
122884
125232
  }
122885
- if (last >= 0) sliceEnds.add(last);
125233
+ spans.push(indexes);
122886
125234
  const slice = groupTurn(turnDisplayContent(row2.message));
122887
125235
  const following = row2.following ? groupTurn(turnDisplayContent(row2.following)) : void 0;
122888
125236
  const runs = compactTurnRuns(slice.segments, isPortablePinnedSegment, { source: grouped.segments, following: following?.segments });
122889
125237
  markFoldable(runs, (block) => indexOf.get(block), foldable, anchored, calls2);
122890
125238
  }
125239
+ spans.forEach((indexes, span) => {
125240
+ let nextStart = Number.POSITIVE_INFINITY;
125241
+ for (let later = span + 1; later < spans.length; later++) {
125242
+ for (const index of spans[later]) if (index < nextStart) nextStart = index;
125243
+ }
125244
+ let end = -1;
125245
+ for (const index of indexes) if (index < nextStart && index > end) end = index;
125246
+ if (end >= 0) sliceEnds.add(end);
125247
+ });
122891
125248
  for (const block of message.content) {
122892
125249
  const index = indexOf.get(block);
122893
125250
  if (index !== void 0 && isToolResultBlock(block) && calls2.has(block.toolUseId)) foldable[index] = block;
@@ -123094,7 +125451,7 @@ var SessionFragments = class {
123094
125451
  folded(message, cuts) {
123095
125452
  const cutKey = foldCutKey(cuts);
123096
125453
  const cached5 = this.foldedCache.get(message);
123097
- if (cached5 && (cuts === void 0 || cached5.cutKey === cutKey)) return cached5.view;
125454
+ if (cached5 && message.status !== "streaming" && (cuts === void 0 || cached5.cutKey === cutKey)) return cached5.view;
123098
125455
  const contentKey = foldContentKey(message);
123099
125456
  const stored = this.bySignature.get(message.id);
123100
125457
  if (stored && stored.contentKey === contentKey && (cuts === void 0 || stored.cutKey === cutKey)) {
@@ -123106,7 +125463,12 @@ var SessionFragments = class {
123106
125463
  const content = readableContent(projected);
123107
125464
  const planning = content === projected.content ? projected : { ...projected, content: [...content] };
123108
125465
  const plan = planProcessFolds(planning, cuts?.length ? { cuts } : void 0);
123109
- const view = { fragments: foldMessageFragments(fragments, plan.ranges), plan };
125466
+ const folded = foldMessageFragments(fragments, plan.ranges);
125467
+ if (plan.liveFrom !== void 0 && plan.liveFrom > 0) {
125468
+ const at2 = folded.blocks.findIndex((block) => block >= plan.liveFrom);
125469
+ folded.livePin = at2 < 0 ? folded.fragments.length : at2;
125470
+ }
125471
+ const view = { fragments: folded, plan };
123110
125472
  this.bySignature.set(message.id, { contentKey, cutKey, view });
123111
125473
  this.foldedCache.set(message, { cutKey, view });
123112
125474
  return view;
@@ -123168,6 +125530,20 @@ var WindowViews = class {
123168
125530
  const extend2 = input.request.anchor && input.request.direction !== "around" ? input.request.direction ?? "before" : null;
123169
125531
  const previous = session.holders.get(input.holder);
123170
125532
  const held = extend2 && previous?.folds === folds ? previous : { messages: /* @__PURE__ */ new Map(), order: [], atTail: false, total: 0, seen: /* @__PURE__ */ new Map(), folds };
125533
+ const liveBudget = Math.min(input.budget.maxBytes, LIVE_MESSAGE_BUDGET.maxBytes);
125534
+ if (!extend2) {
125535
+ selected.messages = selected.messages.map((message) => {
125536
+ const source = transcript.messageAt(message.index);
125537
+ return clipWindowMessage(message, session.fragments.of(source, folds, cuts.get(source.id)), liveBudget);
125538
+ });
125539
+ selected.messages = withCuttingRows(selected.messages, transcript, session.fragments, folds, cuts);
125540
+ const first = selected.messages[0];
125541
+ const last = selected.messages[selected.messages.length - 1];
125542
+ if (first && last) {
125543
+ selected.older = first.index === 0 && first.omittedBefore === 0 ? null : windowAnchor(first, "first");
125544
+ selected.newer = last.index === transcript.count - 1 && last.omittedAfter === 0 ? null : windowAnchor(last, "last");
125545
+ }
125546
+ }
123171
125547
  for (const message of selected.messages) {
123172
125548
  const source = transcript.messageAt(message.index);
123173
125549
  const fragments = session.fragments.of(source, folds, cuts.get(source.id));
@@ -123396,6 +125772,8 @@ function diffHeld(held, messages, fragments, cuts) {
123396
125772
  };
123397
125773
  }
123398
125774
  function diffMessage(previous, current, index, maxBytes) {
125775
+ const pin = livePin(current);
125776
+ if (pin > 0 && !(previous && previous.omittedAfter > 0)) return diffClipped(previous, current, index, maxBytes, pin);
123399
125777
  const all2 = current.fragments;
123400
125778
  let start;
123401
125779
  let end = all2.length;
@@ -123440,15 +125818,121 @@ function diffMessage(previous, current, index, maxBytes) {
123440
125818
  }
123441
125819
  };
123442
125820
  }
125821
+ function livePin(fragments) {
125822
+ const pin = fragments.livePin ?? 0;
125823
+ if (pin <= 0) return 0;
125824
+ return Math.min(pin, fragments.fragments.length);
125825
+ }
125826
+ function clipLive(current, pin, maxBytes) {
125827
+ const all2 = current.fragments;
125828
+ const closedEnd = Math.min(pin, all2.length);
125829
+ const room = Math.max(0, maxBytes - current.metaBytes);
125830
+ const suffix = all2.slice(closedEnd);
125831
+ const reserve = suffix.length ? Math.min(suffix[suffix.length - 1].bytes, room) : 0;
125832
+ const closedBudget = Math.max(0, room - reserve);
125833
+ let closedStart = closedEnd;
125834
+ let closedBytes = 0;
125835
+ while (closedStart > 0) {
125836
+ const next = all2[closedStart - 1];
125837
+ if (closedBytes + next.bytes > closedBudget && closedEnd - closedStart > 0) break;
125838
+ closedBytes += next.bytes;
125839
+ closedStart--;
125840
+ }
125841
+ const suffixBudget = Math.max(0, room - closedBytes);
125842
+ let suffixStart = suffix.length;
125843
+ let suffixBytes = 0;
125844
+ let suffixCount = 0;
125845
+ while (suffixStart > 0) {
125846
+ const next = suffix[suffixStart - 1];
125847
+ if (suffixCount > 0 && (suffixCount >= LIVE_MESSAGE_BUDGET.maxFragments || suffixBytes + next.bytes > suffixBudget)) break;
125848
+ suffixBytes += next.bytes;
125849
+ suffixCount++;
125850
+ suffixStart--;
125851
+ }
125852
+ const gapped = suffixStart > 0;
125853
+ return {
125854
+ entries: [...all2.slice(closedStart, closedEnd), ...suffix.slice(suffixStart)],
125855
+ omittedBefore: gapped ? Math.max(closedStart, 1) : closedStart
125856
+ };
125857
+ }
125858
+ function wireFragment(fragment) {
125859
+ return {
125860
+ key: fragment.key,
125861
+ digest: fragment.digest,
125862
+ ...fragment.contentKey ? { contentKey: fragment.contentKey } : {},
125863
+ body: fragment.body
125864
+ };
125865
+ }
125866
+ function withCuttingRows(messages, transcript, fragments, folds, cuts) {
125867
+ const held = new Set(messages.map((message) => message.id));
125868
+ const added = [];
125869
+ for (const message of messages) {
125870
+ const source = transcript.messageAt(message.index);
125871
+ if (!livePin(fragments.of(source, folds, cuts.get(source.id)))) continue;
125872
+ for (const cut of cuts.get(source.id) ?? []) {
125873
+ if (held.has(cut.id)) continue;
125874
+ const index = transcript.indexOf(cut.id);
125875
+ if (index < 0) continue;
125876
+ const row2 = transcript.messageAt(index);
125877
+ const view = fragments.of(row2, folds, cuts.get(row2.id));
125878
+ added.push({
125879
+ id: view.id,
125880
+ index,
125881
+ metaDigest: view.metaDigest,
125882
+ meta: view.meta,
125883
+ fragments: view.fragments.map(wireFragment),
125884
+ omittedBefore: 0,
125885
+ omittedAfter: 0
125886
+ });
125887
+ held.add(cut.id);
125888
+ }
125889
+ }
125890
+ if (!added.length) return messages;
125891
+ return [...messages, ...added].sort((a2, b5) => a2.index - b5.index);
125892
+ }
125893
+ function clipWindowMessage(message, fragments, maxBytes) {
125894
+ const pin = livePin(fragments);
125895
+ if (!pin) return message;
125896
+ const clip = clipLive(fragments, pin, maxBytes);
125897
+ return { ...message, fragments: clip.entries.map(wireFragment), omittedBefore: clip.omittedBefore, omittedAfter: 0 };
125898
+ }
125899
+ function diffClipped(previous, current, index, maxBytes, pin) {
125900
+ const clip = clipLive(current, pin, maxBytes);
125901
+ const sent = diffFragments(previous, clip.entries);
125902
+ const metaHeld = previous?.metaDigest === current.metaDigest;
125903
+ const omittedBefore = clip.omittedBefore;
125904
+ const unchanged = previous && metaHeld && previous.omittedBefore === omittedBefore && previous.omittedAfter === 0 && previous.keys.length === sent.length && sent.every((fragment, i2) => !fragment.body && fragment.append === void 0 && previous.keys[i2] === fragment.key);
125905
+ const record13 = {
125906
+ metaDigest: current.metaDigest,
125907
+ keys: sent.map((fragment) => fragment.key),
125908
+ fragments: new Map(clip.entries.map((fragment) => [fragment.key, heldFragment(fragment.digest, fragment.body)])),
125909
+ omittedBefore,
125910
+ omittedAfter: 0
125911
+ };
125912
+ if (unchanged) return { message: null, record: record13 };
125913
+ return {
125914
+ record: record13,
125915
+ message: {
125916
+ id: current.id,
125917
+ index,
125918
+ metaDigest: current.metaDigest,
125919
+ ...metaHeld ? {} : { meta: current.meta },
125920
+ fragments: sent,
125921
+ omittedBefore,
125922
+ omittedAfter: 0
125923
+ }
125924
+ };
125925
+ }
123443
125926
  function diffFragments(previous, fragments) {
123444
125927
  return fragments.map((fragment) => {
123445
125928
  const heldFragment2 = previous?.fragments.get(fragment.key);
123446
- if (heldFragment2?.digest === fragment.digest) return { key: fragment.key, digest: fragment.digest };
125929
+ const contentKey = fragment.contentKey ? { contentKey: fragment.contentKey } : {};
125930
+ if (heldFragment2?.digest === fragment.digest) return { key: fragment.key, digest: fragment.digest, ...contentKey };
123447
125931
  const body3 = fragment.body;
123448
125932
  if (heldFragment2?.textLength !== void 0 && body3.kind === "text" && body3.text.length > heldFragment2.textLength && fragmentDigest(textBody(body3.head, body3.offset, body3.text.slice(0, heldFragment2.textLength), body3.context)) === heldFragment2.digest) {
123449
- return { key: fragment.key, digest: fragment.digest, append: body3.text.slice(heldFragment2.textLength) };
125933
+ return { key: fragment.key, digest: fragment.digest, append: body3.text.slice(heldFragment2.textLength), ...contentKey };
123450
125934
  }
123451
- return { key: fragment.key, digest: fragment.digest, body: body3 };
125935
+ return { key: fragment.key, digest: fragment.digest, body: body3, ...contentKey };
123452
125936
  });
123453
125937
  }
123454
125938
  function fragmentPatchBytes(fragment) {
@@ -124182,7 +126666,9 @@ async function callOperation(payload, ctx, method) {
124182
126666
  if (method === "session.rewind" && !["files", "conversation", "code+chat"].includes(String(p4.mode))) {
124183
126667
  throw Object.assign(new Error("invalid rewind mode"), { code: "invalid_argument" });
124184
126668
  }
124185
- if (!ctx.sessions?.get(sessionId)) throw Object.assign(new Error("session not found"), { code: "not_found" });
126669
+ if (method !== "session.scheduledSend.get" && !ctx.sessions?.get(sessionId)) {
126670
+ throw Object.assign(new Error("session not found"), { code: "not_found" });
126671
+ }
124186
126672
  const leaseId = SESSION_OPERATION_READS.has(method) ? void 0 : requiredText(p4, "leaseId");
124187
126673
  const generation = SESSION_OPERATION_READS.has(method) ? void 0 : requiredText(p4, "generation");
124188
126674
  const assertControl2 = () => {
@@ -124508,9 +126994,7 @@ async function handleSessionCreate(payload, ctx) {
124508
126994
  };
124509
126995
  }
124510
126996
  const catalogReady = ctx.harnesses.isSessionHarnessRunnable(harnessId);
124511
- const codexOverride = harnessId === "codex" && ctx.hooks.isCodexBinaryOverrideRunnable();
124512
- const claudeOverride = harnessId === "claude" && ctx.hooks.isClaudeBinaryOverrideRunnable();
124513
- if (!catalogReady && !codexOverride && !claudeOverride) {
126997
+ if (!catalogReady) {
124514
126998
  return {
124515
126999
  error: {
124516
127000
  code: "failed_precondition",
@@ -128090,12 +130574,6 @@ async function handleDescriptor(ctx) {
128090
130574
  const denied = requireScopes(ctx.client, OPERATION_SCOPES.readEnvironment);
128091
130575
  if (denied) return denied;
128092
130576
  const harnessIds = ctx.harnesses ? [...ctx.harnesses.readySessionHarnessIds()] : [];
128093
- if (ctx.harnesses && ctx.hooks.isCodexBinaryOverrideRunnable() && !harnessIds.includes("codex")) {
128094
- harnessIds.push("codex");
128095
- }
128096
- if (ctx.harnesses && ctx.hooks.isClaudeBinaryOverrideRunnable() && !harnessIds.includes("claude")) {
128097
- harnessIds.push("claude");
128098
- }
128099
130577
  let cliVersion;
128100
130578
  try {
128101
130579
  cliVersion = ctx.hooks.resolveReleaseVersion();
@@ -128149,8 +130627,10 @@ function handleHarnessProbe(payload, ctx) {
128149
130627
  if (!isNodeHarnessId(id)) {
128150
130628
  return { error: { code: "invalid_argument", message: `unknown harnessId: ${id}` } };
128151
130629
  }
130630
+ const before = advertisedHarnessKey(ctx);
128152
130631
  try {
128153
130632
  const result3 = ctx.hooks.probeHarnessReadiness(ctx.harnesses, id, ctx.providers ?? null);
130633
+ publishHarnessCatalogIfChanged(ctx, before);
128154
130634
  return { result: { ...result3, status: ctx.harnesses.get(id) } };
128155
130635
  } catch (err) {
128156
130636
  return mapThrown(err);
@@ -128164,6 +130644,7 @@ async function handleHarnessEnable(payload, ctx) {
128164
130644
  if (!isNodeHarnessId(id)) {
128165
130645
  return { error: { code: "invalid_argument", message: `unknown harnessId: ${id}` } };
128166
130646
  }
130647
+ const before = advertisedHarnessKey(ctx);
128167
130648
  try {
128168
130649
  const args = Array.isArray(p4.args) ? p4.args.filter((a2) => typeof a2 === "string") : void 0;
128169
130650
  const status2 = await ctx.hooks.enableHarness(
@@ -128177,6 +130658,7 @@ async function handleHarnessEnable(payload, ctx) {
128177
130658
  },
128178
130659
  ctx.providers ?? null
128179
130660
  );
130661
+ publishHarnessCatalogIfChanged(ctx, before);
128180
130662
  return { result: status2 };
128181
130663
  } catch (err) {
128182
130664
  return mapThrown(err);
@@ -128190,12 +130672,34 @@ function handleHarnessDisable(payload, ctx) {
128190
130672
  if (!isNodeHarnessId(id)) {
128191
130673
  return { error: { code: "invalid_argument", message: `unknown harnessId: ${id}` } };
128192
130674
  }
130675
+ const before = advertisedHarnessKey(ctx);
128193
130676
  try {
128194
- return { result: ctx.hooks.disableHarness(ctx.harnesses, id) };
130677
+ const status2 = ctx.hooks.disableHarness(ctx.harnesses, id);
130678
+ publishHarnessCatalogIfChanged(ctx, before);
130679
+ return { result: status2 };
128195
130680
  } catch (err) {
128196
130681
  return mapThrown(err);
128197
130682
  }
128198
130683
  }
130684
+ function advertisedHarnessKey(ctx) {
130685
+ if (!ctx.events || !ctx.harnesses) return null;
130686
+ return harnessAdvertisementKey(ctx.harnesses.readySessionHarnessIds());
130687
+ }
130688
+ function publishHarnessCatalogIfChanged(ctx, before) {
130689
+ if (!ctx.events || !ctx.harnesses || before == null) return;
130690
+ const harnessIds = [...ctx.harnesses.readySessionHarnessIds()];
130691
+ if (harnessAdvertisementKey(harnessIds) === before) return;
130692
+ try {
130693
+ ctx.events.append({
130694
+ aggregateType: "environment",
130695
+ aggregateId: ctx.identity.environmentId,
130696
+ eventType: HARNESS_CATALOG_CHANGED,
130697
+ payload: { harnessIds },
130698
+ causationRequestId: ctx.requestId
130699
+ });
130700
+ } catch {
130701
+ }
130702
+ }
128199
130703
  function handleHealth(ctx) {
128200
130704
  const denied = requireScopes(ctx.client, OPERATION_SCOPES.readEnvironment);
128201
130705
  if (denied) return denied;
@@ -129086,6 +131590,7 @@ function mapSessionRow(s5) {
129086
131590
  providerResume,
129087
131591
  ...providerSessionId ? { providerSessionId } : {},
129088
131592
  ...s5.parentSessionId ? { parentSessionId: s5.parentSessionId } : {},
131593
+ ...typeof s5.childCount === "number" && s5.childCount > 0 ? { childCount: s5.childCount } : {},
129089
131594
  ...typeof s5.acpAgentId === "string" && s5.acpAgentId ? { acpAgentId: s5.acpAgentId } : {},
129090
131595
  tags: Array.isArray(s5.tags) ? s5.tags : []
129091
131596
  };
@@ -129103,7 +131608,13 @@ function handleSessionList(payload, ctx) {
129103
131608
  }
129104
131609
  const limit2 = Math.min(Math.max(Math.floor(p4.limit), 0), 500);
129105
131610
  const offset = Math.max(Math.floor(p4.offset), 0);
129106
- const rows = ctx.sessions.list(projectId, { limit: limit2, offset });
131611
+ const parentSessionId = typeof p4.parentSessionId === "string" ? p4.parentSessionId.trim() : "";
131612
+ const rows = ctx.sessions.list(projectId, {
131613
+ limit: limit2,
131614
+ offset,
131615
+ ...p4.rootsOnly === true ? { rootsOnly: true } : {},
131616
+ ...parentSessionId ? { parentSessionId } : {}
131617
+ });
129107
131618
  return { result: rows.map(mapSessionRow) };
129108
131619
  }
129109
131620
  function handleSessionListPinned(payload, ctx) {
@@ -130434,21 +132945,19 @@ function listWorkflowAgentsSync2(transcriptDir) {
130434
132945
  }
130435
132946
 
130436
132947
  // src/session/thumbnail-encoder.ts
130437
- import { createRequire } from "node:module";
130438
132948
  import { inflateSync } from "node:zlib";
130439
- var require2 = createRequire(import.meta.url);
130440
- var jpeg = require2("jpeg-js");
132949
+ var import_jpeg_js = __toESM(require_jpeg_js(), 1);
130441
132950
  var MAX_PIXELS = 8e3 * 8e3;
130442
132951
  function encodeNodeThumbnail(bytes, mimeType) {
130443
132952
  const decoded = mimeType === "image/png" || bytes[0] === 137 ? decodePng(bytes) : mimeType === "image/jpeg" || bytes[0] === 255 && bytes[1] === 216 ? decodeJpeg(bytes) : null;
130444
132953
  if (!decoded) return null;
130445
132954
  const fitted = fit(decoded, ATTACHMENT_THUMBNAIL_MAX_SIDE);
130446
- const encoded = jpeg.encode({ data: fitted.data, width: fitted.width, height: fitted.height }, THUMBNAIL_JPEG_QUALITY);
132955
+ const encoded = import_jpeg_js.default.encode({ data: fitted.data, width: fitted.width, height: fitted.height }, THUMBNAIL_JPEG_QUALITY);
130447
132956
  return { base64: Buffer.from(encoded.data).toString("base64"), mimeType: "image/jpeg" };
130448
132957
  }
130449
132958
  function decodeJpeg(bytes) {
130450
132959
  try {
130451
- const raw2 = jpeg.decode(bytes, { useTArray: true, formatAsRGBA: true });
132960
+ const raw2 = import_jpeg_js.default.decode(bytes, { useTArray: true, formatAsRGBA: true });
130452
132961
  if (!raw2.width || !raw2.height || raw2.width * raw2.height > MAX_PIXELS) return null;
130453
132962
  return { width: raw2.width, height: raw2.height, data: raw2.data };
130454
132963
  } catch {
@@ -130569,7 +133078,84 @@ function installNodeRemoteContent() {
130569
133078
 
130570
133079
  // src/runtime.ts
130571
133080
  init_codex_accounts2();
130572
- import { existsSync as existsSync55, readFileSync as readFileSync31, writeFileSync as writeFileSync23 } from "node:fs";
133081
+ import { existsSync as existsSync55, readFileSync as readFileSync31, writeFileSync as writeFileSync25 } from "node:fs";
133082
+
133083
+ // src/session/harness-catalog-watch.ts
133084
+ init_environment();
133085
+ init_config();
133086
+ import { watch, writeFileSync as writeFileSync20 } from "node:fs";
133087
+ import { basename as basename6 } from "node:path";
133088
+
133089
+ // src/session/harness-catalog-stamp.ts
133090
+ init_config();
133091
+ init_environment();
133092
+ import { writeFileSync as writeFileSync19 } from "node:fs";
133093
+ function signalHarnessCatalogChanged(nodeHome) {
133094
+ try {
133095
+ writeFileSync19(nodePaths(nodeHome).harnessCatalogStamp, `${Date.now()}
133096
+ `);
133097
+ } catch {
133098
+ }
133099
+ }
133100
+ function createHarnessCatalogNotifier(readIds, publish2) {
133101
+ let lastKey = harnessAdvertisementKey(readIds());
133102
+ return {
133103
+ note() {
133104
+ const ids = [...readIds()];
133105
+ const next = harnessAdvertisementKey(ids);
133106
+ if (next === lastKey) return false;
133107
+ lastKey = next;
133108
+ publish2(ids);
133109
+ return true;
133110
+ }
133111
+ };
133112
+ }
133113
+
133114
+ // src/session/harness-catalog-watch.ts
133115
+ function isHarnessCatalogStamp(filename) {
133116
+ if (!filename) return false;
133117
+ const stamp2 = basename6(nodePaths("").harnessCatalogStamp);
133118
+ return filename === stamp2 || filename.endsWith(`/${stamp2}`) || filename.endsWith(`\\${stamp2}`);
133119
+ }
133120
+ function watchHarnessCatalogStamp(opts) {
133121
+ const path = nodePaths(opts.nodeHome).harnessCatalogStamp;
133122
+ const notifier = createHarnessCatalogNotifier(opts.readIds, (ids) => {
133123
+ opts.append({
133124
+ aggregateType: "environment",
133125
+ aggregateId: opts.environmentId,
133126
+ eventType: HARNESS_CATALOG_CHANGED,
133127
+ payload: { harnessIds: [...ids] }
133128
+ });
133129
+ });
133130
+ let watcher = null;
133131
+ let closed = false;
133132
+ try {
133133
+ writeFileSync20(path, "", { flag: "a" });
133134
+ watcher = watch(opts.nodeHome, { persistent: false }, (_event, filename) => {
133135
+ if (closed || !isHarnessCatalogStamp(filename ?? null)) return;
133136
+ try {
133137
+ notifier.note();
133138
+ } catch {
133139
+ }
133140
+ });
133141
+ watcher.on("error", () => {
133142
+ closed = true;
133143
+ watcher?.close();
133144
+ watcher = null;
133145
+ });
133146
+ } catch {
133147
+ watcher = null;
133148
+ }
133149
+ return {
133150
+ close() {
133151
+ closed = true;
133152
+ watcher?.close();
133153
+ watcher = null;
133154
+ }
133155
+ };
133156
+ }
133157
+
133158
+ // src/runtime.ts
130573
133159
  init_config();
130574
133160
 
130575
133161
  // ../../packages/runtime/src/db/database.ts
@@ -134219,7 +136805,7 @@ function fetchProfile(token2, fetchImpl) {
134219
136805
  // ../../packages/runtime/src/session/claude-account-store.ts
134220
136806
  init_agent_types();
134221
136807
  import { homedir as homedir18 } from "node:os";
134222
- import { existsSync as existsSync44, copyFileSync as copyFileSync3, symlinkSync as symlinkSync2, mkdirSync as mkdirSync23, readFileSync as readFileSync27, renameSync as renameSync7, writeFileSync as writeFileSync19, lstatSync as lstatSync3, readdirSync as readdirSync15 } from "node:fs";
136808
+ import { existsSync as existsSync44, copyFileSync as copyFileSync3, symlinkSync as symlinkSync2, mkdirSync as mkdirSync23, readFileSync as readFileSync27, renameSync as renameSync7, writeFileSync as writeFileSync21, lstatSync as lstatSync3, readdirSync as readdirSync15 } from "node:fs";
134223
136809
  import { randomUUID as randomUUID20 } from "node:crypto";
134224
136810
  import { dirname as dirname20, join as join47, resolve as resolve15 } from "node:path";
134225
136811
  var key2 = (dir) => dir ?? "__cli__";
@@ -134242,7 +136828,7 @@ var ClaudeAccountStore = class {
134242
136828
  write(index) {
134243
136829
  mkdirSync23(this.root, { recursive: true, mode: 448 });
134244
136830
  const temporary = join47(this.root, `accounts-${randomUUID20()}.tmp`);
134245
- writeFileSync19(temporary, JSON.stringify(index), { mode: 384 });
136831
+ writeFileSync21(temporary, JSON.stringify(index), { mode: 384 });
134246
136832
  renameSync7(temporary, join47(this.root, "accounts.json"));
134247
136833
  }
134248
136834
  assertManaged(dir) {
@@ -134303,7 +136889,7 @@ var ClaudeAccountStore = class {
134303
136889
  if (source[name] !== void 0) target2[name] = source[name];
134304
136890
  }
134305
136891
  const temporary = join47(dir, `config-${randomUUID20()}.tmp`);
134306
- writeFileSync19(temporary, JSON.stringify(target2), { mode: 384 });
136892
+ writeFileSync21(temporary, JSON.stringify(target2), { mode: 384 });
134307
136893
  renameSync7(temporary, join47(dir, ".claude.json"));
134308
136894
  }
134309
136895
  get(dir) {
@@ -134698,9 +137284,9 @@ async function startNodeServer2(opts) {
134698
137284
  }
134699
137285
 
134700
137286
  // src/terminal/manager.ts
134701
- import { createRequire as createRequire6 } from "node:module";
137287
+ import { createRequire as createRequire5 } from "node:module";
134702
137288
  import { existsSync as existsSync46 } from "node:fs";
134703
- var nodeRequire = createRequire6(import.meta.url);
137289
+ var nodeRequire = createRequire5(import.meta.url);
134704
137290
  var { spawn: spawn6 } = nodeRequire("node-pty");
134705
137291
  var SNAPSHOT_SOFT_LIMIT = 64 * 1024;
134706
137292
  var OUTPUT_BUFFER_SOFT_LIMIT = 256 * 1024;
@@ -134917,7 +137503,7 @@ var NodeTerminalManager = class {
134917
137503
  };
134918
137504
 
134919
137505
  // ../../packages/runtime/src/workspace/project-registry.ts
134920
- import { basename as basename6, resolve as resolve17 } from "node:path";
137506
+ import { basename as basename7, resolve as resolve17 } from "node:path";
134921
137507
  import { existsSync as existsSync47, realpathSync as realpathSync10, statSync as statSync13 } from "node:fs";
134922
137508
  import { createHash as createHash19 } from "node:crypto";
134923
137509
  import { execFileSync as execFileSync6 } from "node:child_process";
@@ -135014,7 +137600,7 @@ var ProjectRegistry = class {
135014
137600
  this.db.prepare(
135015
137601
  `INSERT INTO projects (project_id, path, name, repo_identity, opened_at, last_active_at)
135016
137602
  VALUES (?, ?, ?, ?, ?, ?)`
135017
- ).run(projectId, abs, name || basename6(abs), repoIdentity, now, now);
137603
+ ).run(projectId, abs, name || basename7(abs), repoIdentity, now, now);
135018
137604
  return this.get(projectId);
135019
137605
  }
135020
137606
  /**
@@ -135120,7 +137706,7 @@ import {
135120
137706
  rmSync as rmSync10,
135121
137707
  statSync as statSync14,
135122
137708
  unlinkSync,
135123
- writeFileSync as writeFileSync20
137709
+ writeFileSync as writeFileSync22
135124
137710
  } from "node:fs";
135125
137711
  import { dirname as dirname21, join as join50, relative as relative3 } from "node:path";
135126
137712
  import { createHash as createHash20 } from "node:crypto";
@@ -135271,7 +137857,7 @@ var WorkspaceFsService = class {
135271
137857
  const tmp = `${resolved.absolutePath}.tmp-${crypto.randomUUID()}`;
135272
137858
  let renamed = false;
135273
137859
  try {
135274
- writeFileSync20(tmp, data, { mode });
137860
+ writeFileSync22(tmp, data, { mode });
135275
137861
  const again = resolveProjectPath(root2, relativePath);
135276
137862
  if (!again.ok || again.absolutePath !== resolved.absolutePath) {
135277
137863
  throw Object.assign(new Error("path changed during write"), { code: "failed_precondition" });
@@ -135811,7 +138397,7 @@ function parseBranchPorcelain(raw2) {
135811
138397
 
135812
138398
  // ../../packages/runtime/src/workspace/watch-service.ts
135813
138399
  init_fs();
135814
- import { watch } from "node:fs";
138400
+ import { watch as watch2 } from "node:fs";
135815
138401
  var WorkspaceWatchService = class {
135816
138402
  constructor(projects) {
135817
138403
  this.projects = projects;
@@ -135839,7 +138425,7 @@ var WorkspaceWatchService = class {
135839
138425
  let wake = null;
135840
138426
  let closed = false;
135841
138427
  const watchId = crypto.randomUUID();
135842
- const watcher = watch(resolved.absolutePath, { recursive: true }, (eventType2, filename) => {
138428
+ const watcher = watch2(resolved.absolutePath, { recursive: true }, (eventType2, filename) => {
135843
138429
  if (!filename) return;
135844
138430
  const rel = String(filename).split("\\").join("/");
135845
138431
  const check2 = resolveProjectPath(project.path, relativePath === "." ? rel : `${relativePath}/${rel}`);
@@ -135876,7 +138462,7 @@ var WorkspaceWatchService = class {
135876
138462
  if (!resolved.ok) {
135877
138463
  throw Object.assign(new Error(resolved.reason), { code: "invalid_argument" });
135878
138464
  }
135879
- const watcher = watch(resolved.absolutePath, { recursive: true }, (eventType2, filename) => {
138465
+ const watcher = watch2(resolved.absolutePath, { recursive: true }, (eventType2, filename) => {
135880
138466
  if (!filename) return;
135881
138467
  const rel = String(filename).split("\\").join("/");
135882
138468
  const check2 = resolveProjectPath(project.path, relativePath === "." ? rel : `${relativePath}/${rel}`);
@@ -136735,7 +139321,7 @@ import { dirname as dirname23, join as join54 } from "node:path";
136735
139321
  init_mcp_apps();
136736
139322
  init_mcp_app_resource();
136737
139323
  import { createHash as createHash22, randomUUID as randomUUID22 } from "node:crypto";
136738
- import { existsSync as existsSync51, mkdirSync as mkdirSync26, readFileSync as readFileSync29, readdirSync as readdirSync18, renameSync as renameSync10, rmSync as rmSync11, statSync as statSync17, utimesSync, writeFileSync as writeFileSync21 } from "node:fs";
139324
+ import { existsSync as existsSync51, mkdirSync as mkdirSync26, readFileSync as readFileSync29, readdirSync as readdirSync18, renameSync as renameSync10, rmSync as rmSync11, statSync as statSync17, utimesSync, writeFileSync as writeFileSync23 } from "node:fs";
136739
139325
  import { join as join53 } from "node:path";
136740
139326
  function createMcpAppResourceStore(directory) {
136741
139327
  const cache4 = new McpAppResourceCache();
@@ -136752,7 +139338,7 @@ function createMcpAppResourceStore(directory) {
136752
139338
  mkdirSync26(directory, { recursive: true });
136753
139339
  const temporary = join53(directory, `${hash2}.${randomUUID22()}.tmp`);
136754
139340
  try {
136755
- writeFileSync21(temporary, snapshot.html, { encoding: "utf8", mode: 384, flag: "wx" });
139341
+ writeFileSync23(temporary, snapshot.html, { encoding: "utf8", mode: 384, flag: "wx" });
136756
139342
  renameSync10(temporary, file2);
136757
139343
  } finally {
136758
139344
  rmSync11(temporary, { force: true });
@@ -138030,7 +140616,7 @@ init_platform_registry();
138030
140616
  import { randomUUID as randomUUID25 } from "node:crypto";
138031
140617
 
138032
140618
  // src/provider/secret-crypto.ts
138033
- import { existsSync as existsSync54, mkdirSync as mkdirSync27, readFileSync as readFileSync30, writeFileSync as writeFileSync22, chmodSync as chmodSync3 } from "node:fs";
140619
+ import { existsSync as existsSync54, mkdirSync as mkdirSync27, readFileSync as readFileSync30, writeFileSync as writeFileSync24, chmodSync as chmodSync3 } from "node:fs";
138034
140620
  import { dirname as dirname24 } from "node:path";
138035
140621
  import { createCipheriv, createDecipheriv, randomBytes as randomBytes8 } from "node:crypto";
138036
140622
  var ENC_PREFIX2 = "enc:v1:";
@@ -138045,7 +140631,7 @@ function ensureKeyFile(keyPath) {
138045
140631
  }
138046
140632
  mkdirSync27(dirname24(keyPath), { recursive: true, mode: 448 });
138047
140633
  const key3 = randomBytes8(KEY_BYTES);
138048
- writeFileSync22(keyPath, key3, { mode: 384 });
140634
+ writeFileSync24(keyPath, key3, { mode: 384 });
138049
140635
  try {
138050
140636
  chmodSync3(keyPath, 384);
138051
140637
  } catch {
@@ -152407,7 +154993,15 @@ async function startNodeRuntime(partial2 = {}) {
152407
154993
  startedAt,
152408
154994
  simulatedHarness
152409
154995
  });
152410
- writeFileSync23(
154996
+ const catalogWatch = watchHarnessCatalogStamp({
154997
+ nodeHome: config2.nodeHome,
154998
+ environmentId: identity.environmentId,
154999
+ readIds: () => harnesses.readySessionHarnessIds(),
155000
+ append: (input) => {
155001
+ events.append(input);
155002
+ }
155003
+ });
155004
+ writeFileSync25(
152411
155005
  paths.runtimeJson,
152412
155006
  JSON.stringify(
152413
155007
  {
@@ -152450,6 +155044,7 @@ async function startNodeRuntime(partial2 = {}) {
152450
155044
  server,
152451
155045
  startedAt,
152452
155046
  async stop() {
155047
+ catalogWatch.close();
152453
155048
  automationService.stop();
152454
155049
  collaboration.dispose();
152455
155050
  const disposePromise = sessions.dispose();
@@ -152493,7 +155088,7 @@ function readRuntimeStatus(nodeHome) {
152493
155088
 
152494
155089
  // src/systemd/install.ts
152495
155090
  import { spawnSync as spawnSync2 } from "node:child_process";
152496
- import { chmodSync as chmodSync4, existsSync as existsSync56, mkdirSync as mkdirSync29, unlinkSync as unlinkSync3, writeFileSync as writeFileSync24 } from "node:fs";
155091
+ import { chmodSync as chmodSync4, existsSync as existsSync56, mkdirSync as mkdirSync29, unlinkSync as unlinkSync3, writeFileSync as writeFileSync26 } from "node:fs";
152497
155092
  import { dirname as dirname25 } from "node:path";
152498
155093
 
152499
155094
  // src/systemd/unit.ts
@@ -152555,7 +155150,7 @@ function checkLinger(user) {
152555
155150
  }
152556
155151
  function writeSystemdUserUnit(opts, unitPath = systemdUserUnitPath()) {
152557
155152
  mkdirSync29(dirname25(unitPath), { recursive: true });
152558
- writeFileSync24(unitPath, renderSystemdUserUnit(opts), { encoding: "utf8", mode: 420 });
155153
+ writeFileSync26(unitPath, renderSystemdUserUnit(opts), { encoding: "utf8", mode: 420 });
152559
155154
  try {
152560
155155
  chmodSync4(unitPath, 420);
152561
155156
  } catch {
@@ -152731,40 +155326,51 @@ ${harnessUsage()}`, rest.includes("--json"));
152731
155326
  const db = openNodeDatabase(nodePaths(nodeHome).stateDb);
152732
155327
  try {
152733
155328
  const manager = new HarnessManager(db);
152734
- switch (sub) {
152735
- case "list":
152736
- return cmdList(manager, rest);
152737
- case "show":
152738
- return cmdShow(manager, rest);
152739
- case "enable":
152740
- return await cmdEnable(
152741
- manager,
152742
- rest,
152743
- /*configure*/
152744
- false
152745
- );
152746
- case "configure":
152747
- return await cmdEnable(
152748
- manager,
152749
- rest,
152750
- /*configure*/
152751
- true
152752
- );
152753
- case "disable":
152754
- return cmdDisable(manager, rest);
152755
- case "doctor":
152756
- return cmdDoctor(manager, rest);
152757
- case "probe":
152758
- return cmdProbe(manager, rest, db);
152759
- case "repair":
152760
- return await cmdRepair(manager, rest);
152761
- default:
152762
- return fail2(`unknown harness command: ${sub}`, false);
152763
- }
155329
+ const result3 = await dispatchHarnessCommand(sub, manager, rest, db);
155330
+ if (signalsHarnessCatalog(sub, result3)) signalHarnessCatalogChanged(nodeHome);
155331
+ return result3;
152764
155332
  } finally {
152765
155333
  db.close();
152766
155334
  }
152767
155335
  }
155336
+ async function dispatchHarnessCommand(sub, manager, rest, db) {
155337
+ switch (sub) {
155338
+ case "list":
155339
+ return cmdList(manager, rest);
155340
+ case "show":
155341
+ return cmdShow(manager, rest);
155342
+ case "enable":
155343
+ return await cmdEnable(
155344
+ manager,
155345
+ rest,
155346
+ /*configure*/
155347
+ false
155348
+ );
155349
+ case "configure":
155350
+ return await cmdEnable(
155351
+ manager,
155352
+ rest,
155353
+ /*configure*/
155354
+ true
155355
+ );
155356
+ case "disable":
155357
+ return cmdDisable(manager, rest);
155358
+ case "doctor":
155359
+ return cmdDoctor(manager, rest);
155360
+ case "probe":
155361
+ return cmdProbe(manager, rest, db);
155362
+ case "repair":
155363
+ return await cmdRepair(manager, rest);
155364
+ default:
155365
+ return fail2(`unknown harness command: ${sub}`, false);
155366
+ }
155367
+ }
155368
+ function signalsHarnessCatalog(sub, result3) {
155369
+ if (sub === "enable" || sub === "configure" || sub === "disable" || sub === "repair") return result3.ok;
155370
+ if (sub !== "probe") return false;
155371
+ if (result3.json && typeof result3.json === "object" && "status" in result3.json) return true;
155372
+ return result3.text.includes("\u2192");
155373
+ }
152768
155374
  function cmdList(manager, args) {
152769
155375
  const parsed = parseFlags(args, {
152770
155376
  positionals: 0,