@inerrata-corporation/errata 2.0.22-dev.4629 → 2.0.22-dev.4635

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.
@@ -17903,6 +17903,10 @@ CREATE INDEX IF NOT EXISTS edges_live_prior_tag ON edges(created_at) WHERE valid
17903
17903
  -- incremental reindex can fetch just the changed files' symbols instead of
17904
17904
  -- scanning every versioned node. Partial: only live rows are ever queried.
17905
17905
  CREATE INDEX IF NOT EXISTS nodes_relpath ON nodes(json_extract(attrs_json, '$.relPath')) WHERE valid_to IS NULL;
17906
+ -- Closed rows by relPath, for reviveReobserved (every incremental reindex): the
17907
+ -- live-only index above cannot serve it, so it scanned the whole table (~275 MB
17908
+ -- of a 1.1 GB store per reindex, 2026-10-20).
17909
+ CREATE INDEX IF NOT EXISTS nodes_closed_relpath ON nodes(json_extract(attrs_json, '$.relPath'), last_updated_at) WHERE valid_to IS NOT NULL;
17906
17910
  -- Live rows by name, for looking up the few symbols a statement mentions
17907
17911
  -- instead of hydrating every code symbol per minted problem.
17908
17912
  CREATE INDEX IF NOT EXISTS nodes_live_description ON nodes(description, label) WHERE valid_to IS NULL;
package/errata.mjs CHANGED
@@ -20812,6 +20812,10 @@ CREATE INDEX IF NOT EXISTS edges_live_prior_tag ON edges(created_at) WHERE valid
20812
20812
  -- incremental reindex can fetch just the changed files' symbols instead of
20813
20813
  -- scanning every versioned node. Partial: only live rows are ever queried.
20814
20814
  CREATE INDEX IF NOT EXISTS nodes_relpath ON nodes(json_extract(attrs_json, '$.relPath')) WHERE valid_to IS NULL;
20815
+ -- Closed rows by relPath, for reviveReobserved (every incremental reindex): the
20816
+ -- live-only index above cannot serve it, so it scanned the whole table (~275 MB
20817
+ -- of a 1.1 GB store per reindex, 2026-10-20).
20818
+ CREATE INDEX IF NOT EXISTS nodes_closed_relpath ON nodes(json_extract(attrs_json, '$.relPath'), last_updated_at) WHERE valid_to IS NOT NULL;
20815
20819
  -- Live rows by name, for looking up the few symbols a statement mentions
20816
20820
  -- instead of hydrating every code symbol per minted problem.
20817
20821
  CREATE INDEX IF NOT EXISTS nodes_live_description ON nodes(description, label) WHERE valid_to IS NULL;
@@ -38960,6 +38964,7 @@ async function runIndexer(store, opts) {
38960
38964
  const maxBytes = opts.maxFileBytes ?? 1024 * 1024;
38961
38965
  const scope = opts.changedRelPaths;
38962
38966
  const inScope = (relPath) => scope === void 0 || scope.has(relPath) || isReExportBarrel(relPath);
38967
+ const emits = (relPath) => scope === void 0 || scope.has(relPath);
38963
38968
  let perfLast = started2;
38964
38969
  const perfFile = process.env["ERRATA_PERF"];
38965
38970
  const perf = (label) => {
@@ -39011,7 +39016,7 @@ async function runIndexer(store, opts) {
39011
39016
  upsertFolder(store, rootId, ".", opts.workspaceId, rootRel);
39012
39017
  report.nodesEmitted++;
39013
39018
  for (const f of files) {
39014
- if (!inScope(f.relPath)) continue;
39019
+ if (!emits(f.relPath)) continue;
39015
39020
  const segments = f.relPath.split(/[\\/]/).slice(0, -1);
39016
39021
  let parentId = rootId;
39017
39022
  let acc = "";
@@ -39094,7 +39099,13 @@ async function runIndexer(store, opts) {
39094
39099
  }
39095
39100
  }
39096
39101
  perf(`parse (${report.filesParsed} parsed, ${report.filesSkipped} skipped)`);
39097
- const exportsByFile = /* @__PURE__ */ new Map();
39102
+ const pendingExports = /* @__PURE__ */ new Set();
39103
+ const exportsByFile = new class extends Map {
39104
+ get(relPath) {
39105
+ if (pendingExports.delete(relPath)) super.set(relPath, graphExportMap(store, opts.workspaceId, relPath));
39106
+ return super.get(relPath);
39107
+ }
39108
+ }();
39098
39109
  const importsByFile = /* @__PURE__ */ new Map();
39099
39110
  for (const [relPath, symbols] of symbolsByFile) {
39100
39111
  const localExports = /* @__PURE__ */ new Map();
@@ -39118,7 +39129,8 @@ async function runIndexer(store, opts) {
39118
39129
  if (scope !== void 0) {
39119
39130
  for (const f of files) {
39120
39131
  if (inScope(f.relPath) || exportsByFile.has(f.relPath)) continue;
39121
- exportsByFile.set(f.relPath, graphExportMap(store, opts.workspaceId, f.relPath));
39132
+ exportsByFile.set(f.relPath, /* @__PURE__ */ new Map());
39133
+ pendingExports.add(f.relPath);
39122
39134
  }
39123
39135
  }
39124
39136
  const workspacePackages = /* @__PURE__ */ new Map();
@@ -39259,6 +39271,7 @@ async function runIndexer(store, opts) {
39259
39271
  const providerByRel = new Map(files.map((x) => [x.relPath, x.provider]));
39260
39272
  let emittedFiles = 0;
39261
39273
  for (const [relPath, symbols] of symbolsByFile) {
39274
+ if (!emits(relPath)) continue;
39262
39275
  if (emittedFiles > 0 && emittedFiles % 50 === 0) {
39263
39276
  await new Promise((r) => setImmediate(r));
39264
39277
  }
@@ -39478,6 +39491,7 @@ async function runIndexer(store, opts) {
39478
39491
  }
39479
39492
  perf("flush cross-file edges");
39480
39493
  for (const relPath of symbolsByFile.keys()) {
39494
+ if (!emits(relPath)) continue;
39481
39495
  const fid = fileNodeId(opts.workspaceId, relPath);
39482
39496
  if (store.outEdges(fid, ["DEFINES", "CONTAINS"]).length === 0) {
39483
39497
  stampIndexOutcome(store, fid, { symbolCount: 0 });
@@ -86845,7 +86859,7 @@ function createWatchBreaker(deps) {
86845
86859
  }
86846
86860
 
86847
86861
  // src/engine.ts
86848
- var DAEMON_VERSION = true ? "2.0.22-dev.4629" : "2.0.0-alpha.0";
86862
+ var DAEMON_VERSION = true ? "2.0.22-dev.4635" : "2.0.0-alpha.0";
86849
86863
  var IGNORED_PATH = /[\\/](?:\.git|node_modules|\.errata|\.claude|\.codex|\.cursor|\.turbo|\.next|dist|coverage|test-results|playwright-report|__pycache__)(?:[\\/]|$)/;
86850
86864
  var IGNORED_NOISE = /castalia\.db|eventlog\.sqlite|turn-cursors/;
86851
86865
  var GIT_OP_MUTE_MS = 4e3;
@@ -16300,6 +16300,10 @@ CREATE INDEX IF NOT EXISTS edges_live_prior_tag ON edges(created_at) WHERE valid
16300
16300
  -- incremental reindex can fetch just the changed files' symbols instead of
16301
16301
  -- scanning every versioned node. Partial: only live rows are ever queried.
16302
16302
  CREATE INDEX IF NOT EXISTS nodes_relpath ON nodes(json_extract(attrs_json, '$.relPath')) WHERE valid_to IS NULL;
16303
+ -- Closed rows by relPath, for reviveReobserved (every incremental reindex): the
16304
+ -- live-only index above cannot serve it, so it scanned the whole table (~275 MB
16305
+ -- of a 1.1 GB store per reindex, 2026-10-20).
16306
+ CREATE INDEX IF NOT EXISTS nodes_closed_relpath ON nodes(json_extract(attrs_json, '$.relPath'), last_updated_at) WHERE valid_to IS NOT NULL;
16303
16307
  -- Live rows by name, for looking up the few symbols a statement mentions
16304
16308
  -- instead of hydrating every code symbol per minted problem.
16305
16309
  CREATE INDEX IF NOT EXISTS nodes_live_description ON nodes(description, label) WHERE valid_to IS NULL;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inerrata-corporation/errata",
3
- "version": "2.0.22-dev.4629",
3
+ "version": "2.0.22-dev.4635",
4
4
  "description": "errata - local-first observation engine for AI coding agents",
5
5
  "type": "module",
6
6
  "bin": {
package/pass-worker.mjs CHANGED
@@ -17771,6 +17771,7 @@ async function runIndexer(store2, opts) {
17771
17771
  const maxBytes = opts.maxFileBytes ?? 1024 * 1024;
17772
17772
  const scope = opts.changedRelPaths;
17773
17773
  const inScope = (relPath) => scope === void 0 || scope.has(relPath) || isReExportBarrel(relPath);
17774
+ const emits = (relPath) => scope === void 0 || scope.has(relPath);
17774
17775
  let perfLast = started;
17775
17776
  const perfFile = process.env["ERRATA_PERF"];
17776
17777
  const perf = (label) => {
@@ -17822,7 +17823,7 @@ async function runIndexer(store2, opts) {
17822
17823
  upsertFolder(store2, rootId, ".", opts.workspaceId, rootRel);
17823
17824
  report.nodesEmitted++;
17824
17825
  for (const f of files) {
17825
- if (!inScope(f.relPath)) continue;
17826
+ if (!emits(f.relPath)) continue;
17826
17827
  const segments = f.relPath.split(/[\\/]/).slice(0, -1);
17827
17828
  let parentId = rootId;
17828
17829
  let acc = "";
@@ -17905,7 +17906,13 @@ async function runIndexer(store2, opts) {
17905
17906
  }
17906
17907
  }
17907
17908
  perf(`parse (${report.filesParsed} parsed, ${report.filesSkipped} skipped)`);
17908
- const exportsByFile = /* @__PURE__ */ new Map();
17909
+ const pendingExports = /* @__PURE__ */ new Set();
17910
+ const exportsByFile = new class extends Map {
17911
+ get(relPath) {
17912
+ if (pendingExports.delete(relPath)) super.set(relPath, graphExportMap(store2, opts.workspaceId, relPath));
17913
+ return super.get(relPath);
17914
+ }
17915
+ }();
17909
17916
  const importsByFile = /* @__PURE__ */ new Map();
17910
17917
  for (const [relPath, symbols] of symbolsByFile) {
17911
17918
  const localExports = /* @__PURE__ */ new Map();
@@ -17929,7 +17936,8 @@ async function runIndexer(store2, opts) {
17929
17936
  if (scope !== void 0) {
17930
17937
  for (const f of files) {
17931
17938
  if (inScope(f.relPath) || exportsByFile.has(f.relPath)) continue;
17932
- exportsByFile.set(f.relPath, graphExportMap(store2, opts.workspaceId, f.relPath));
17939
+ exportsByFile.set(f.relPath, /* @__PURE__ */ new Map());
17940
+ pendingExports.add(f.relPath);
17933
17941
  }
17934
17942
  }
17935
17943
  const workspacePackages = /* @__PURE__ */ new Map();
@@ -18070,6 +18078,7 @@ async function runIndexer(store2, opts) {
18070
18078
  const providerByRel = new Map(files.map((x) => [x.relPath, x.provider]));
18071
18079
  let emittedFiles = 0;
18072
18080
  for (const [relPath, symbols] of symbolsByFile) {
18081
+ if (!emits(relPath)) continue;
18073
18082
  if (emittedFiles > 0 && emittedFiles % 50 === 0) {
18074
18083
  await new Promise((r) => setImmediate(r));
18075
18084
  }
@@ -18289,6 +18298,7 @@ async function runIndexer(store2, opts) {
18289
18298
  }
18290
18299
  perf("flush cross-file edges");
18291
18300
  for (const relPath of symbolsByFile.keys()) {
18301
+ if (!emits(relPath)) continue;
18292
18302
  const fid = fileNodeId(opts.workspaceId, relPath);
18293
18303
  if (store2.outEdges(fid, ["DEFINES", "CONTAINS"]).length === 0) {
18294
18304
  stampIndexOutcome(store2, fid, { symbolCount: 0 });
@@ -27168,6 +27178,10 @@ CREATE INDEX IF NOT EXISTS edges_live_prior_tag ON edges(created_at) WHERE valid
27168
27178
  -- incremental reindex can fetch just the changed files' symbols instead of
27169
27179
  -- scanning every versioned node. Partial: only live rows are ever queried.
27170
27180
  CREATE INDEX IF NOT EXISTS nodes_relpath ON nodes(json_extract(attrs_json, '$.relPath')) WHERE valid_to IS NULL;
27181
+ -- Closed rows by relPath, for reviveReobserved (every incremental reindex): the
27182
+ -- live-only index above cannot serve it, so it scanned the whole table (~275 MB
27183
+ -- of a 1.1 GB store per reindex, 2026-10-20).
27184
+ CREATE INDEX IF NOT EXISTS nodes_closed_relpath ON nodes(json_extract(attrs_json, '$.relPath'), last_updated_at) WHERE valid_to IS NOT NULL;
27171
27185
  -- Live rows by name, for looking up the few symbols a statement mentions
27172
27186
  -- instead of hydrating every code symbol per minted problem.
27173
27187
  CREATE INDEX IF NOT EXISTS nodes_live_description ON nodes(description, label) WHERE valid_to IS NULL;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "errata-context",
3
- "version": "2.0.22-dev.4629",
3
+ "version": "2.0.22-dev.4635",
4
4
  "description": "A minimal 3D view of loaded Errata priors and recent graph bursts.",
5
5
  "author": {
6
6
  "name": "inErrata"
@@ -1,4 +1,4 @@
1
- 6116713b2c7fa083cb68622899bbfe5c62167d3c1b8d6d62ec2c81e4cc391baa .codex-plugin/plugin.json
1
+ 97441718c0941fc62b087e0948ee625bb750c45d4938148ef8414d8ee4767bf4 .codex-plugin/plugin.json
2
2
  a7bebae9fb01c838d6c75fc784129e28be571233fa66ff5ee8039b574f35ccf7 assets/icon.png
3
3
  fc38b64e4df1e0b72c35764bef6c4c05430d97c9009ad0ecc8a9e75b4deab232 configure-local.mjs
4
4
  73dc6028b3b070257c7c31f252d11e55a9e096f4aed0f187f10cb21716e1e6d7 dist/client.js