@inerrata-corporation/errata 2.0.2-dev.688 → 2.0.2-dev.692

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/errata.mjs +78 -23
  2. package/package.json +1 -1
package/errata.mjs CHANGED
@@ -32946,7 +32946,7 @@ async function Module2(moduleArg = {}) {
32946
32946
  }
32947
32947
  };
32948
32948
  if (flags.loadAsync) {
32949
- return metadata.neededDynlibs.reduce((chain, dynNeeded) => chain.then(() => loadDynamicLibrary(dynNeeded, flags, localScope)), Promise.resolve()).then(loadModule);
32949
+ return metadata.neededDynlibs.reduce((chain2, dynNeeded) => chain2.then(() => loadDynamicLibrary(dynNeeded, flags, localScope)), Promise.resolve()).then(loadModule);
32950
32950
  }
32951
32951
  metadata.neededDynlibs.forEach((needed) => loadDynamicLibrary(needed, flags, localScope));
32952
32952
  return loadModule();
@@ -49533,13 +49533,13 @@ function learnedCard(c, opts) {
49533
49533
  }
49534
49534
  if (c.chain.instanceOf)
49535
49535
  segs.push(`<span class="e">INSTANCE_OF</span> <span class="rc">${esc3(c.chain.instanceOf)}</span>`);
49536
- const chain = segs.length > 0 ? `\u2514\u2500 ${segs.join(" \u2500 ")}` : '\u2514\u2500 <span class="rc">(no causal chain yet)</span>';
49536
+ const chain2 = segs.length > 0 ? `\u2514\u2500 ${segs.join(" \u2500 ")}` : '\u2514\u2500 <span class="rc">(no causal chain yet)</span>';
49537
49537
  return `<div class="lcard">
49538
49538
  <div class="row1">
49539
49539
  <span class="prob">${esc3(c.problem)}</span>
49540
49540
  <span class="badge ${PROV_CLASS[c.provenance]}">${BADGE2[c.provenance]} ${PROV_LABEL[c.provenance]}</span>
49541
49541
  </div>
49542
- <div class="chain">${chain}</div>
49542
+ <div class="chain">${chain2}</div>
49543
49543
  <div class="lfoot">${trustHtml(c.trust, c.trustNote)}${nextHtml(c.next, opts)}</div>
49544
49544
  </div>`;
49545
49545
  }
@@ -53829,6 +53829,27 @@ function retireEpisodeProvenance(store, now, opts = {}) {
53829
53829
 
53830
53830
  // src/pass-worker-client.ts
53831
53831
  import { Worker } from "node:worker_threads";
53832
+
53833
+ // src/pass-gate.ts
53834
+ var QUEUE_WARN_MS = 12e4;
53835
+ var chain = Promise.resolve();
53836
+ function withHeavyPassSlot(label, fn) {
53837
+ const queuedAt = Date.now();
53838
+ const run3 = chain.then(() => {
53839
+ const waited = Date.now() - queuedAt;
53840
+ if (waited > QUEUE_WARN_MS) {
53841
+ console.warn(`[errata] heavy-pass slot: ${label} waited ${Math.round(waited / 1e3)}s`);
53842
+ }
53843
+ return fn();
53844
+ });
53845
+ chain = run3.then(
53846
+ () => void 0,
53847
+ () => void 0
53848
+ );
53849
+ return run3;
53850
+ }
53851
+
53852
+ // src/pass-worker-client.ts
53832
53853
  var PassWorker = class {
53833
53854
  constructor(init2) {
53834
53855
  this.init = init2;
@@ -53859,14 +53880,32 @@ var PassWorker = class {
53859
53880
  }
53860
53881
  call(kind, payload) {
53861
53882
  if (this.stopped) return Promise.reject(new Error("pass worker stopped"));
53862
- this.ensureWorker();
53863
- const id = this.nextId++;
53864
- return this.ready.then(
53865
- () => new Promise((resolve6, reject) => {
53866
- this.pending.set(id, { resolve: resolve6, reject });
53867
- this.worker.postMessage({ id, kind, ...payload !== void 0 ? { payload } : {} });
53868
- })
53869
- );
53883
+ return withHeavyPassSlot(`${kind}:${this.init.workspaceId}`, async () => {
53884
+ if (this.stopped) throw new Error("pass worker stopped");
53885
+ this.ensureWorker();
53886
+ const id = this.nextId++;
53887
+ try {
53888
+ await this.ready;
53889
+ return await new Promise((resolve6, reject) => {
53890
+ this.pending.set(id, { resolve: resolve6, reject });
53891
+ this.worker.postMessage({ id, kind, ...payload !== void 0 ? { payload } : {} });
53892
+ });
53893
+ } finally {
53894
+ void this.recycleIdle();
53895
+ }
53896
+ });
53897
+ }
53898
+ /** Terminate the (idle) worker so its retained heap returns to the OS; the
53899
+ * next call respawns it. No-op when requests are pending or already down. */
53900
+ async recycleIdle() {
53901
+ if (this.stopped || !this.worker || this.pending.size > 0) return;
53902
+ const w = this.worker;
53903
+ this.worker = null;
53904
+ this.ready = null;
53905
+ try {
53906
+ await w.terminate();
53907
+ } catch {
53908
+ }
53870
53909
  }
53871
53910
  ensureWorker() {
53872
53911
  if (this.worker) return;
@@ -55455,7 +55494,7 @@ function startLoopLagMonitor(thresholdMs = 1e3) {
55455
55494
  }
55456
55495
 
55457
55496
  // src/engine.ts
55458
- var DAEMON_VERSION = true ? "2.0.2-dev.688" : "2.0.0-alpha.0";
55497
+ var DAEMON_VERSION = true ? "2.0.2-dev.692" : "2.0.0-alpha.0";
55459
55498
  var IGNORED_PATH = /[\\/](?:\.git|node_modules|\.errata|\.claude|\.codex|\.cursor|\.turbo|\.next|dist|coverage|test-results|playwright-report|__pycache__)(?:[\\/]|$)/;
55460
55499
  var IGNORED_NOISE = /castalia\.db|eventlog\.sqlite|turn-cursors/;
55461
55500
  var GIT_OP_MUTE_MS = 4e3;
@@ -58203,14 +58242,30 @@ var ConsolidateWorker = class {
58203
58242
  * unavailable — the caller's inline fallback handles it. */
58204
58243
  run(req) {
58205
58244
  if (this.stopped) return Promise.reject(new Error("consolidate worker stopped"));
58206
- this.ensureWorker();
58207
- const id = this.nextId++;
58208
- return this.ready.then(
58209
- () => new Promise((resolve6, reject) => {
58210
- this.pending.set(id, { resolve: resolve6, reject });
58211
- this.worker.postMessage({ ...req, id });
58212
- })
58213
- );
58245
+ return withHeavyPassSlot(`consolidate:${req.kind ?? "pass"}`, async () => {
58246
+ if (this.stopped) throw new Error("consolidate worker stopped");
58247
+ this.ensureWorker();
58248
+ const id = this.nextId++;
58249
+ try {
58250
+ await this.ready;
58251
+ return await new Promise((resolve6, reject) => {
58252
+ this.pending.set(id, { resolve: resolve6, reject });
58253
+ this.worker.postMessage({ ...req, id });
58254
+ });
58255
+ } finally {
58256
+ void this.recycleIdle();
58257
+ }
58258
+ });
58259
+ }
58260
+ async recycleIdle() {
58261
+ if (this.stopped || !this.worker || this.pending.size > 0) return;
58262
+ const w = this.worker;
58263
+ this.worker = null;
58264
+ this.ready = null;
58265
+ try {
58266
+ await w.terminate();
58267
+ } catch {
58268
+ }
58214
58269
  }
58215
58270
  ensureWorker() {
58216
58271
  if (this.worker) return;
@@ -58581,7 +58636,7 @@ function findGitRoot(absPath) {
58581
58636
  var RETRY_COOLDOWN_MS = 15 * 6e4;
58582
58637
  function createRootAdopter(deps) {
58583
58638
  const attempted = /* @__PURE__ */ new Map();
58584
- let chain = Promise.resolve();
58639
+ let chain2 = Promise.resolve();
58585
58640
  const tryAdopt = async (path2) => {
58586
58641
  if (!deps.linkingAllowed()) return;
58587
58642
  const root = findGitRoot(path2);
@@ -58601,9 +58656,9 @@ function createRootAdopter(deps) {
58601
58656
  return {
58602
58657
  noteMiss(path2) {
58603
58658
  if (!path2) return;
58604
- chain = chain.then(() => tryAdopt(path2)).catch(() => void 0);
58659
+ chain2 = chain2.then(() => tryAdopt(path2)).catch(() => void 0);
58605
58660
  },
58606
- idle: () => chain
58661
+ idle: () => chain2
58607
58662
  };
58608
58663
  }
58609
58664
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inerrata-corporation/errata",
3
- "version": "2.0.2-dev.688",
3
+ "version": "2.0.2-dev.692",
4
4
  "description": "errata - local-first observation engine for AI coding agents",
5
5
  "type": "module",
6
6
  "bin": {