@githolon/runtime 0.114.0 → 0.115.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/RUNTIME-SOURCES.sha256 +71 -54
- package/dist/application-reception.js +2 -2
- package/dist/nomos-native-runtime.js +4980 -2735
- package/dist/nomos-runner-web.js +347 -9
- package/dist/nomos-runner-worker.js +7470 -2345
- package/dist/nomos-runner.js +7205 -2412
- package/dist/remote-reception.cjs +19 -19
- package/dist/remote-reception.js +19 -19
- package/dist/typescript-application-desk.js +22 -22
- package/package.json +1 -1
- package/runner/node-entry.mjs +7129 -4424
- package/src/application_reception.ts +15 -0
- package/src/protocol/nomos/kernel/v1/kernel_pb.d.ts +263 -0
- package/src/protocol/nomos/kernel/v1/kernel_pb.js +323 -281
- package/src/protocol/nomos/runtime/v2/correspondence_desk_pb.d.ts +704 -0
- package/src/protocol/nomos/runtime/v2/correspondence_desk_pb.js +115 -24
- package/src/protocol/nomos/runtime/v2/model_adoption_desk_pb.d.ts +43 -0
- package/src/protocol/nomos/runtime/v2/model_adoption_desk_pb.js +10 -3
- package/src/protocol/nomos/runtime/v2/records_desk_pb.d.ts +10 -0
- package/src/protocol/nomos/runtime/v2/records_desk_pb.js +1 -1
- package/src/protocol/nomos/runtime/v2/runtime_pb.d.ts +15 -1
- package/src/protocol/nomos/runtime/v2/runtime_pb.js +1 -1
package/dist/nomos-runner-web.js
CHANGED
|
@@ -1,7 +1,290 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
(() => {
|
|
3
|
+
var __typeError = (msg) => {
|
|
4
|
+
throw TypeError(msg);
|
|
5
|
+
};
|
|
6
|
+
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
|
|
7
|
+
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
8
|
+
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
9
|
+
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
|
|
10
|
+
|
|
11
|
+
// ../../platform-shells/browser/memory_watch.ts
|
|
12
|
+
function memoryFields(sample) {
|
|
13
|
+
if (!sample) return {};
|
|
14
|
+
return {
|
|
15
|
+
"kernel.memory_bytes": sample.kernelBytes,
|
|
16
|
+
"kernel.memory_high_water_bytes": sample.kernelHighWaterBytes,
|
|
17
|
+
...sample.jsHeapBytes === void 0 ? {} : { "js.heap_bytes": sample.jsHeapBytes },
|
|
18
|
+
...sample.custodyBytes === void 0 ? {} : { "custody.memory_bytes": sample.custodyBytes },
|
|
19
|
+
...sample.workspace ? { "memory.workspace": sample.workspace } : {},
|
|
20
|
+
...sample.operation ? { "memory.operation": sample.operation } : {}
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
var MEMORY_FORENSICS_KEY = "nomos.peer-memory-session/v1";
|
|
24
|
+
var MiB = (bytes) => Math.round(bytes / 1048576);
|
|
25
|
+
var _storage, _sessionId, _now, _minIntervalMillis, _lastWrittenAt, _lastWrittenHighWater, _ended;
|
|
26
|
+
var MemoryForensics = class {
|
|
27
|
+
constructor(storage, sessionId, options = {}) {
|
|
28
|
+
__privateAdd(this, _storage);
|
|
29
|
+
__privateAdd(this, _sessionId);
|
|
30
|
+
__privateAdd(this, _now);
|
|
31
|
+
__privateAdd(this, _minIntervalMillis);
|
|
32
|
+
__privateAdd(this, _lastWrittenAt, Number.NEGATIVE_INFINITY);
|
|
33
|
+
__privateAdd(this, _lastWrittenHighWater, -1);
|
|
34
|
+
__privateAdd(this, _ended, false);
|
|
35
|
+
__privateSet(this, _storage, storage);
|
|
36
|
+
__privateSet(this, _sessionId, sessionId);
|
|
37
|
+
__privateSet(this, _now, options.now ?? Date.now);
|
|
38
|
+
__privateSet(this, _minIntervalMillis, options.minIntervalMillis ?? 2e3);
|
|
39
|
+
}
|
|
40
|
+
/** A previous session's record, as one observation, removed so it is reported once. */
|
|
41
|
+
takePreviousUnclean() {
|
|
42
|
+
let record;
|
|
43
|
+
try {
|
|
44
|
+
const raw = __privateGet(this, _storage)?.getItem(MEMORY_FORENSICS_KEY);
|
|
45
|
+
if (!raw) return void 0;
|
|
46
|
+
const parsed = JSON.parse(raw);
|
|
47
|
+
if (parsed.version !== 1 || typeof parsed.sessionId !== "string" || !parsed.sample || typeof parsed.sample.kernelHighWaterBytes !== "number") {
|
|
48
|
+
__privateGet(this, _storage)?.removeItem(MEMORY_FORENSICS_KEY);
|
|
49
|
+
return void 0;
|
|
50
|
+
}
|
|
51
|
+
if (parsed.sessionId === __privateGet(this, _sessionId)) return void 0;
|
|
52
|
+
record = parsed;
|
|
53
|
+
__privateGet(this, _storage)?.removeItem(MEMORY_FORENSICS_KEY);
|
|
54
|
+
} catch {
|
|
55
|
+
return void 0;
|
|
56
|
+
}
|
|
57
|
+
const sample = record.sample;
|
|
58
|
+
const where = `${sample.operation ? ` during ${sample.operation}` : ""}${sample.workspace ? ` on ${sample.workspace}` : ""}`;
|
|
59
|
+
return {
|
|
60
|
+
op: "peer_previous_session_unclean",
|
|
61
|
+
failed: true,
|
|
62
|
+
totalUs: 0,
|
|
63
|
+
error: `previous session ended uncleanly at ${MiB(sample.kernelHighWaterBytes)} MB kernel high-water${sample.jsHeapBytes === void 0 ? "" : `, ${MiB(sample.jsHeapBytes)} MB JS heap`}${where}`,
|
|
64
|
+
previousSessionId: record.sessionId,
|
|
65
|
+
lastSampleAt: new Date(sample.at).toISOString(),
|
|
66
|
+
...memoryFields(sample)
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/** Keep the latest sample: at most once per interval, but at once when the high-water mark grew. */
|
|
70
|
+
record(sample) {
|
|
71
|
+
if (__privateGet(this, _ended) || !__privateGet(this, _storage)) return;
|
|
72
|
+
const now = __privateGet(this, _now).call(this);
|
|
73
|
+
if (sample.kernelHighWaterBytes <= __privateGet(this, _lastWrittenHighWater) && now - __privateGet(this, _lastWrittenAt) < __privateGet(this, _minIntervalMillis)) return;
|
|
74
|
+
try {
|
|
75
|
+
__privateGet(this, _storage).setItem(MEMORY_FORENSICS_KEY, JSON.stringify({ version: 1, sessionId: __privateGet(this, _sessionId), sample }));
|
|
76
|
+
__privateSet(this, _lastWrittenAt, now);
|
|
77
|
+
__privateSet(this, _lastWrittenHighWater, sample.kernelHighWaterBytes);
|
|
78
|
+
} catch {
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/** A clean shutdown (or a page entering the back/forward cache): nothing to report next time. */
|
|
82
|
+
endCleanly() {
|
|
83
|
+
__privateSet(this, _ended, true);
|
|
84
|
+
try {
|
|
85
|
+
__privateGet(this, _storage)?.removeItem(MEMORY_FORENSICS_KEY);
|
|
86
|
+
} catch {
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/** The page came back (back/forward cache): record again. */
|
|
90
|
+
resume() {
|
|
91
|
+
__privateSet(this, _ended, false);
|
|
92
|
+
__privateSet(this, _lastWrittenAt, Number.NEGATIVE_INFINITY);
|
|
93
|
+
__privateSet(this, _lastWrittenHighWater, -1);
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
_storage = new WeakMap();
|
|
97
|
+
_sessionId = new WeakMap();
|
|
98
|
+
_now = new WeakMap();
|
|
99
|
+
_minIntervalMillis = new WeakMap();
|
|
100
|
+
_lastWrittenAt = new WeakMap();
|
|
101
|
+
_lastWrittenHighWater = new WeakMap();
|
|
102
|
+
_ended = new WeakMap();
|
|
103
|
+
|
|
104
|
+
// ../../node_modules/@bjorn3/browser_wasi_shim/dist/wasi_defs.js
|
|
105
|
+
var RIGHTS_FD_DATASYNC = 1 << 0;
|
|
106
|
+
var RIGHTS_FD_READ = 1 << 1;
|
|
107
|
+
var RIGHTS_FD_SEEK = 1 << 2;
|
|
108
|
+
var RIGHTS_FD_FDSTAT_SET_FLAGS = 1 << 3;
|
|
109
|
+
var RIGHTS_FD_SYNC = 1 << 4;
|
|
110
|
+
var RIGHTS_FD_TELL = 1 << 5;
|
|
111
|
+
var RIGHTS_FD_WRITE = 1 << 6;
|
|
112
|
+
var RIGHTS_FD_ADVISE = 1 << 7;
|
|
113
|
+
var RIGHTS_FD_ALLOCATE = 1 << 8;
|
|
114
|
+
var RIGHTS_PATH_CREATE_DIRECTORY = 1 << 9;
|
|
115
|
+
var RIGHTS_PATH_CREATE_FILE = 1 << 10;
|
|
116
|
+
var RIGHTS_PATH_LINK_SOURCE = 1 << 11;
|
|
117
|
+
var RIGHTS_PATH_LINK_TARGET = 1 << 12;
|
|
118
|
+
var RIGHTS_PATH_OPEN = 1 << 13;
|
|
119
|
+
var RIGHTS_FD_READDIR = 1 << 14;
|
|
120
|
+
var RIGHTS_PATH_READLINK = 1 << 15;
|
|
121
|
+
var RIGHTS_PATH_RENAME_SOURCE = 1 << 16;
|
|
122
|
+
var RIGHTS_PATH_RENAME_TARGET = 1 << 17;
|
|
123
|
+
var RIGHTS_PATH_FILESTAT_GET = 1 << 18;
|
|
124
|
+
var RIGHTS_PATH_FILESTAT_SET_SIZE = 1 << 19;
|
|
125
|
+
var RIGHTS_PATH_FILESTAT_SET_TIMES = 1 << 20;
|
|
126
|
+
var RIGHTS_FD_FILESTAT_GET = 1 << 21;
|
|
127
|
+
var RIGHTS_FD_FILESTAT_SET_SIZE = 1 << 22;
|
|
128
|
+
var RIGHTS_FD_FILESTAT_SET_TIMES = 1 << 23;
|
|
129
|
+
var RIGHTS_PATH_SYMLINK = 1 << 24;
|
|
130
|
+
var RIGHTS_PATH_REMOVE_DIRECTORY = 1 << 25;
|
|
131
|
+
var RIGHTS_PATH_UNLINK_FILE = 1 << 26;
|
|
132
|
+
var RIGHTS_POLL_FD_READWRITE = 1 << 27;
|
|
133
|
+
var RIGHTS_SOCK_SHUTDOWN = 1 << 28;
|
|
134
|
+
var FDFLAGS_APPEND = 1 << 0;
|
|
135
|
+
var FDFLAGS_DSYNC = 1 << 1;
|
|
136
|
+
var FDFLAGS_NONBLOCK = 1 << 2;
|
|
137
|
+
var FDFLAGS_RSYNC = 1 << 3;
|
|
138
|
+
var FDFLAGS_SYNC = 1 << 4;
|
|
139
|
+
var FSTFLAGS_ATIM = 1 << 0;
|
|
140
|
+
var FSTFLAGS_ATIM_NOW = 1 << 1;
|
|
141
|
+
var FSTFLAGS_MTIM = 1 << 2;
|
|
142
|
+
var FSTFLAGS_MTIM_NOW = 1 << 3;
|
|
143
|
+
var OFLAGS_CREAT = 1 << 0;
|
|
144
|
+
var OFLAGS_DIRECTORY = 1 << 1;
|
|
145
|
+
var OFLAGS_EXCL = 1 << 2;
|
|
146
|
+
var OFLAGS_TRUNC = 1 << 3;
|
|
147
|
+
var EVENTRWFLAGS_FD_READWRITE_HANGUP = 1 << 0;
|
|
148
|
+
var SUBCLOCKFLAGS_SUBSCRIPTION_CLOCK_ABSTIME = 1 << 0;
|
|
149
|
+
var RIFLAGS_RECV_PEEK = 1 << 0;
|
|
150
|
+
var RIFLAGS_RECV_WAITALL = 1 << 1;
|
|
151
|
+
var ROFLAGS_RECV_DATA_TRUNCATED = 1 << 0;
|
|
152
|
+
var SDFLAGS_RD = 1 << 0;
|
|
153
|
+
var SDFLAGS_WR = 1 << 1;
|
|
154
|
+
|
|
155
|
+
// ../../node_modules/@bjorn3/browser_wasi_shim/dist/debug.js
|
|
156
|
+
var Debug = class Debug2 {
|
|
157
|
+
enable(enabled) {
|
|
158
|
+
this.log = createLogger(enabled === void 0 ? true : enabled, this.prefix);
|
|
159
|
+
}
|
|
160
|
+
get enabled() {
|
|
161
|
+
return this.isEnabled;
|
|
162
|
+
}
|
|
163
|
+
constructor(isEnabled) {
|
|
164
|
+
this.isEnabled = isEnabled;
|
|
165
|
+
this.prefix = "wasi:";
|
|
166
|
+
this.enable(isEnabled);
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
function createLogger(enabled, prefix) {
|
|
170
|
+
if (enabled) {
|
|
171
|
+
const a = console.log.bind(console, "%c%s", "color: #265BA0", prefix);
|
|
172
|
+
return a;
|
|
173
|
+
} else {
|
|
174
|
+
return () => {
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
var debug = new Debug(false);
|
|
179
|
+
|
|
180
|
+
// ../../node_modules/@bjorn3/browser_wasi_shim/dist/fd.js
|
|
181
|
+
var Inode = class _Inode {
|
|
182
|
+
static issue_ino() {
|
|
183
|
+
return _Inode.next_ino++;
|
|
184
|
+
}
|
|
185
|
+
static root_ino() {
|
|
186
|
+
return 0n;
|
|
187
|
+
}
|
|
188
|
+
constructor() {
|
|
189
|
+
this.ino = _Inode.issue_ino();
|
|
190
|
+
}
|
|
191
|
+
};
|
|
192
|
+
Inode.next_ino = 1n;
|
|
193
|
+
|
|
194
|
+
// ../../adapter/amortized_memory_file.ts
|
|
195
|
+
var ADOPT_WRITE_BYTES = 64 * 1024;
|
|
196
|
+
|
|
197
|
+
// ../../platform-shells/browser/custody_volume_filesystem.ts
|
|
198
|
+
var SEGMENT_TARGET_BYTES = 128 * 1024 * 1024;
|
|
199
|
+
var TAIL_BYTES = 256 * 1024;
|
|
200
|
+
var SMALL_TAIL_BYTES = 16 * 1024;
|
|
201
|
+
var COPY_CHUNK_BYTES = 1024 * 1024;
|
|
202
|
+
var BLOCK_CACHE_BYTES = 8 * 1024 * 1024;
|
|
203
|
+
var BLOCK_BYTES = 32 * 1024;
|
|
204
|
+
var CACHE_BLOCKS = BLOCK_CACHE_BYTES / BLOCK_BYTES;
|
|
205
|
+
var DIRTY_BLOCK_BYTES = 4 * 1024 * 1024;
|
|
206
|
+
var DIRECT_IO_BYTES = 256 * 1024;
|
|
207
|
+
|
|
208
|
+
// ../../platform-shells/browser/custody_volume_store.ts
|
|
209
|
+
var BASE_EVERY_BYTES = 8 * 1024 * 1024;
|
|
210
|
+
var COMPACT_MIN_SEGMENT_BYTES = 16 * 1024 * 1024;
|
|
211
|
+
var COMPACT_BUDGET_BYTES = 64 * 1024 * 1024;
|
|
212
|
+
var COMPACT_STEP_BYTES = 4 * 1024 * 1024;
|
|
213
|
+
var COMPACT_URGENT_DEAD_BYTES = 256 * 1024 * 1024;
|
|
214
|
+
var CRC_TABLE = (() => {
|
|
215
|
+
const table = new Uint32Array(256);
|
|
216
|
+
for (let n = 0; n < 256; n++) {
|
|
217
|
+
let c = n;
|
|
218
|
+
for (let k = 0; k < 8; k++) c = c & 1 ? 3988292384 ^ c >>> 1 : c >>> 1;
|
|
219
|
+
table[n] = c >>> 0;
|
|
220
|
+
}
|
|
221
|
+
return table;
|
|
222
|
+
})();
|
|
223
|
+
|
|
224
|
+
// ../../platform-shells/browser/custody_store.ts
|
|
225
|
+
var BROWSER_CUSTODY_CHUNK_BYTES = 4 * 1024 * 1024;
|
|
226
|
+
var FALLBACK_MEMORY_CAP_BYTES = 192 * 1024 * 1024;
|
|
227
|
+
var IMPORT_BATCH_BYTES = 16 * 1024 * 1024;
|
|
228
|
+
|
|
229
|
+
// ../../platform-shells/browser/custody_tenure.ts
|
|
230
|
+
var inFront = (presence2) => presence2.visible && presence2.focused && !presence2.leaving;
|
|
231
|
+
|
|
232
|
+
// ../../platform-shells/browser/custody_presence.ts
|
|
233
|
+
function watchTabPresence(page, report, restart) {
|
|
234
|
+
let leaving = false;
|
|
235
|
+
let yielded = false;
|
|
236
|
+
let restarting = false;
|
|
237
|
+
const current = () => {
|
|
238
|
+
let focused = false;
|
|
239
|
+
try {
|
|
240
|
+
focused = page.document.hasFocus();
|
|
241
|
+
} catch {
|
|
242
|
+
}
|
|
243
|
+
return { visible: page.document.visibilityState === "visible", focused, ...leaving ? { leaving } : {} };
|
|
244
|
+
};
|
|
245
|
+
let last = "";
|
|
246
|
+
const changed = () => {
|
|
247
|
+
const presence2 = current();
|
|
248
|
+
if (yielded && inFront(presence2) && !restarting) {
|
|
249
|
+
restarting = true;
|
|
250
|
+
restart();
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
const key = JSON.stringify(presence2);
|
|
254
|
+
if (key === last) return;
|
|
255
|
+
last = key;
|
|
256
|
+
report(presence2);
|
|
257
|
+
};
|
|
258
|
+
page.document.addEventListener("visibilitychange", changed);
|
|
259
|
+
page.addEventListener("focus", changed);
|
|
260
|
+
page.addEventListener("blur", changed);
|
|
261
|
+
page.addEventListener("pagehide", () => {
|
|
262
|
+
leaving = true;
|
|
263
|
+
changed();
|
|
264
|
+
});
|
|
265
|
+
page.addEventListener("pageshow", () => {
|
|
266
|
+
leaving = false;
|
|
267
|
+
changed();
|
|
268
|
+
});
|
|
269
|
+
page.document.addEventListener("freeze", () => {
|
|
270
|
+
leaving = true;
|
|
271
|
+
changed();
|
|
272
|
+
});
|
|
273
|
+
page.document.addEventListener("resume", () => {
|
|
274
|
+
leaving = false;
|
|
275
|
+
changed();
|
|
276
|
+
});
|
|
277
|
+
return {
|
|
278
|
+
current,
|
|
279
|
+
yielded() {
|
|
280
|
+
yielded = true;
|
|
281
|
+
changed();
|
|
282
|
+
}
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
|
|
3
286
|
// ../../platform-shells/browser/worker_page_entry.ts
|
|
4
|
-
var workerDigest = true ? "
|
|
287
|
+
var workerDigest = true ? "9bce728d9971046fa9b2414d44e98b97f3433140ebe302e638c8579a98bcbe90" : "";
|
|
5
288
|
var SLOW_OPERATION_MICROS = 1e6;
|
|
6
289
|
var slowOperationsReported = 0;
|
|
7
290
|
var bootStages = [];
|
|
@@ -13,10 +296,50 @@
|
|
|
13
296
|
const perf = JSON.parse(json);
|
|
14
297
|
if (perf.failed !== true && (typeof perf.totalUs !== "number" || perf.totalUs < SLOW_OPERATION_MICROS)) return;
|
|
15
298
|
slowOperationsReported++;
|
|
16
|
-
report(
|
|
299
|
+
report(JSON.stringify({ ...memoryFields(latestMemory), ...perf }));
|
|
300
|
+
} catch {
|
|
301
|
+
}
|
|
302
|
+
};
|
|
303
|
+
var latestMemory;
|
|
304
|
+
var pageStorage = () => {
|
|
305
|
+
try {
|
|
306
|
+
return window.localStorage;
|
|
17
307
|
} catch {
|
|
308
|
+
return void 0;
|
|
18
309
|
}
|
|
19
310
|
};
|
|
311
|
+
var forensics = new MemoryForensics(pageStorage(), (() => {
|
|
312
|
+
try {
|
|
313
|
+
return globalThis.crypto.randomUUID();
|
|
314
|
+
} catch {
|
|
315
|
+
return `${Date.now()}-${Math.random()}`;
|
|
316
|
+
}
|
|
317
|
+
})());
|
|
318
|
+
var previousSessionChecked = false;
|
|
319
|
+
var reportPreviousSession = () => {
|
|
320
|
+
if (previousSessionChecked) return;
|
|
321
|
+
previousSessionChecked = true;
|
|
322
|
+
const previous = forensics.takePreviousUnclean();
|
|
323
|
+
if (previous) reportSlowOperation(JSON.stringify(previous));
|
|
324
|
+
};
|
|
325
|
+
var MEMORY_BREADCRUMB_BYTES = 8 * 1048576;
|
|
326
|
+
var breadcrumbHighWater = 0;
|
|
327
|
+
var observeMemory = (sample) => {
|
|
328
|
+
latestMemory = sample;
|
|
329
|
+
forensics.record(sample);
|
|
330
|
+
if (sample.kernelHighWaterBytes < breadcrumbHighWater + MEMORY_BREADCRUMB_BYTES) return;
|
|
331
|
+
breadcrumbHighWater = sample.kernelHighWaterBytes;
|
|
332
|
+
const json = JSON.stringify({ op: "peer_memory", ...memoryFields(sample) });
|
|
333
|
+
console.info("[nomos-memory]", json);
|
|
334
|
+
try {
|
|
335
|
+
window.__nomosBreadcrumb?.(json);
|
|
336
|
+
} catch {
|
|
337
|
+
}
|
|
338
|
+
};
|
|
339
|
+
window.addEventListener?.("pagehide", () => forensics.endCleanly());
|
|
340
|
+
window.addEventListener?.("pageshow", (event) => {
|
|
341
|
+
if (event.persisted) forensics.resume();
|
|
342
|
+
});
|
|
20
343
|
var worker;
|
|
21
344
|
var booting;
|
|
22
345
|
var bootResolve;
|
|
@@ -28,6 +351,17 @@
|
|
|
28
351
|
var closeReject;
|
|
29
352
|
var pending = /* @__PURE__ */ new Map();
|
|
30
353
|
var send = (message) => worker.postMessage(message);
|
|
354
|
+
var presence;
|
|
355
|
+
var watchPresence = () => presence ?? (presence = watchTabPresence(
|
|
356
|
+
window,
|
|
357
|
+
(current) => {
|
|
358
|
+
if (worker) send({ kind: "presence", presence: current });
|
|
359
|
+
},
|
|
360
|
+
() => {
|
|
361
|
+
console.info("[nomos-peer-boot] this workspace is open in another tab; reloading to take it back");
|
|
362
|
+
window.location.reload();
|
|
363
|
+
}
|
|
364
|
+
));
|
|
31
365
|
var fail = (error) => {
|
|
32
366
|
bootReject?.(error);
|
|
33
367
|
bootResolve = void 0;
|
|
@@ -64,6 +398,9 @@
|
|
|
64
398
|
if (totalMs >= 500) reportSlowOperation(JSON.stringify({ op: "custody_checkpoint", totalUs: Math.round(totalMs * 1e3), ...message.timing }));
|
|
65
399
|
}
|
|
66
400
|
break;
|
|
401
|
+
case "memory":
|
|
402
|
+
observeMemory(message.sample);
|
|
403
|
+
break;
|
|
67
404
|
case "kernel-perf":
|
|
68
405
|
console.debug("[nomos-worker]", message.line);
|
|
69
406
|
reportSlowOperation(message.line);
|
|
@@ -81,6 +418,7 @@
|
|
|
81
418
|
worker = void 0;
|
|
82
419
|
break;
|
|
83
420
|
case "disposed":
|
|
421
|
+
forensics.endCleanly();
|
|
84
422
|
if (message.error) closeReject?.(new Error(message.error));
|
|
85
423
|
else closeResolve?.();
|
|
86
424
|
closeResolve = void 0;
|
|
@@ -91,6 +429,11 @@
|
|
|
91
429
|
booting = void 0;
|
|
92
430
|
lastSnapshot = void 0;
|
|
93
431
|
break;
|
|
432
|
+
case "custody-yielded":
|
|
433
|
+
console.info("[nomos-peer-boot] handed this workspace to another tab:", message.reason, message.error ?? "");
|
|
434
|
+
if (message.error) reportSlowOperation(JSON.stringify({ op: "custody_handover", failed: true, reason: message.reason, error: message.error }));
|
|
435
|
+
watchPresence().yielded();
|
|
436
|
+
break;
|
|
94
437
|
case "invoked": {
|
|
95
438
|
const waiting = pending.get(message.id);
|
|
96
439
|
if (!waiting) break;
|
|
@@ -127,6 +470,7 @@
|
|
|
127
470
|
if (closing) return closing.then(() => window.__nomosBootRuntime(base));
|
|
128
471
|
if (worker && !bootResolve) return booting ?? Promise.resolve();
|
|
129
472
|
if (booting) return booting;
|
|
473
|
+
reportPreviousSession();
|
|
130
474
|
const configured = window.__nomosWorkerUrl;
|
|
131
475
|
if (!configured) return Promise.reject(new Error("Nomos Web Worker URL is not configured"));
|
|
132
476
|
const url = workerDigest ? `${configured}${configured.includes("?") ? "&" : "?"}v=${workerDigest}` : configured;
|
|
@@ -150,13 +494,7 @@
|
|
|
150
494
|
bootResolve = resolve;
|
|
151
495
|
bootReject = reject;
|
|
152
496
|
});
|
|
153
|
-
|
|
154
|
-
try {
|
|
155
|
-
const navigation = performance.getEntriesByType("navigation")[0];
|
|
156
|
-
reloaded = navigation?.type === "reload" || navigation?.type === "back_forward";
|
|
157
|
-
} catch {
|
|
158
|
-
}
|
|
159
|
-
send({ kind: "boot", base, reloaded });
|
|
497
|
+
send({ kind: "boot", base, presence: watchPresence().current() });
|
|
160
498
|
} catch (error) {
|
|
161
499
|
fail(error instanceof Error ? error : new Error(String(error)));
|
|
162
500
|
return Promise.reject(error);
|