@inerrata-corporation/errata 2.0.8 → 2.0.10

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inerrata-corporation/errata",
3
- "version": "2.0.8",
3
+ "version": "2.0.10",
4
4
  "description": "errata - local-first observation engine for AI coding agents",
5
5
  "type": "module",
6
6
  "bin": {
package/pass-worker.mjs CHANGED
@@ -15140,7 +15140,7 @@ var init_symbol_intent = __esm({
15140
15140
  });
15141
15141
 
15142
15142
  // ../../packages/shared/src/wire.ts
15143
- var CLOUD_NODE_LABELS, CLOUD_WRITABLE_NODE_LABELS, PROJECT_ONLY_NODE_LABELS, PROJECT_ONLY_NODE_LABEL_SET, PROJECT_ONLY_EDGE_TYPES, PROJECT_ONLY_EDGE_TYPE_SET, CLOUD_WRITABLE_NODE_LABEL_SET, CLOUD_EDGE_TYPES, INGEST_SOURCES, INGEST_EXTRACTION_SOURCES, CastaliaIngestNodeSchema, RouteContextCountWireSchema, ANCHOR_COMMIT_SHA_RE, ANCHOR_BODY_HASH_RE, ANCHOR_SYMBOL_KINDS, ANCHOR_LABEL_KINDS, ANCHOR_LABEL_PATH_RE, ANCHOR_LABEL_QNAME_RE, CastaliaIngestEdgeSchema, SymbolSummarySidecarSchema, CastaliaIngestPayloadSchema;
15143
+ var CLOUD_NODE_LABELS, CLOUD_WRITABLE_NODE_LABELS, PROJECT_ONLY_NODE_LABELS, PROJECT_ONLY_NODE_LABEL_SET, PROJECT_ONLY_EDGE_TYPES, PROJECT_ONLY_EDGE_TYPE_SET, CLOUD_WRITABLE_NODE_LABEL_SET, CLOUD_EDGE_TYPES, INGEST_SOURCES, INGEST_EXTRACTION_SOURCES, CastaliaIngestNodeSchema, RouteContextCountWireSchema, ANCHOR_COMMIT_SHA_RE, ANCHOR_BODY_HASH_RE, ANCHOR_SYMBOL_KINDS, ANCHOR_LABEL_KINDS, ANCHOR_LABEL_PATH_RE, ANCHOR_LABEL_QNAME_RE, TRIAGE_DISCRIMINATOR_MAX_LENGTH, CastaliaIngestEdgeSchema, SymbolSummarySidecarSchema, CastaliaIngestPayloadSchema;
15144
15144
  var init_wire = __esm({
15145
15145
  "../../packages/shared/src/wire.ts"() {
15146
15146
  "use strict";
@@ -15258,6 +15258,7 @@ var init_wire = __esm({
15258
15258
  ANCHOR_LABEL_KINDS = [...ANCHOR_SYMBOL_KINDS, "File"];
15259
15259
  ANCHOR_LABEL_PATH_RE = /^(?![/])(?![A-Za-z]:)(?!(?:.*\/)?\.\.(?:\/|$))[^\x00-\x1f\x7f\\`]{1,512}$/;
15260
15260
  ANCHOR_LABEL_QNAME_RE = /^[^\x00-\x1f\x7f`]{1,256}$/;
15261
+ TRIAGE_DISCRIMINATOR_MAX_LENGTH = 2e3;
15261
15262
  CastaliaIngestEdgeSchema = external_exports.object({
15262
15263
  fromCanonicalId: external_exports.string().min(6).max(160),
15263
15264
  toCanonicalId: external_exports.string().min(6).max(160),
@@ -15268,6 +15269,8 @@ var init_wire = __esm({
15268
15269
  /** Triage route per-context counts (T3 induction). Carried as structured data
15269
15270
  * here; stored JSON-encoded on the Neo4j rel (`perContextJson`). */
15270
15271
  perContext: external_exports.record(external_exports.string(), RouteContextCountWireSchema).optional(),
15272
+ /** Scrubbed diagnostic check for a triage route, re-scanned at the cloud door. */
15273
+ discriminator: external_exports.string().trim().min(1).max(TRIAGE_DISCRIMINATOR_MAX_LENGTH).optional(),
15271
15274
  /** PJ-anchor-version: WHICH version of a symbol an `ANCHORED_AT` was
15272
15275
  * witnessed against. Both opaque — the observing checkout's HEAD sha and
15273
15276
  * the indexer's 16-hex sha256 of the symbol body. Neither is reversible
@@ -24519,6 +24522,12 @@ CREATE UNIQUE INDEX IF NOT EXISTS edges_triple ON edges(from_id, type, to_id);
24519
24522
  `;
24520
24523
  var TEMPORAL_INDEX_SQL = `
24521
24524
  CREATE INDEX IF NOT EXISTS nodes_live ON nodes(label, valid_to);
24525
+ -- Covering + partial index for labelFingerprint over the instance labels: the
24526
+ -- live-push probe runs it per workspace on a timer, and each hit used to read
24527
+ -- its table row. Partial, so it maintains a few thousand rows instead of adding
24528
+ -- a write to every node write. Its label list is FINGERPRINT_INDEXED_LABELS.
24529
+ DROP INDEX IF EXISTS nodes_live_fingerprint;
24530
+ CREATE INDEX IF NOT EXISTS nodes_instance_fingerprint ON nodes(label, last_updated_at, last_reinforced_at_seq, created_at_seq) WHERE valid_to IS NULL AND label IN ('Problem','Solution','RootCause');
24522
24531
  CREATE INDEX IF NOT EXISTS nodes_logical ON nodes(logical_id, version);
24523
24532
  CREATE INDEX IF NOT EXISTS edges_live ON edges(valid_to);
24524
24533
  -- Expression index on the per-node relPath (stored in attrs_json) so the
@@ -24589,6 +24598,7 @@ function rowToEdge(r) {
24589
24598
  attrs: JSON.parse(r.attrs_json)
24590
24599
  };
24591
24600
  }
24601
+ var FINGERPRINT_INDEXED_LABELS = ["Problem", "Solution", "RootCause"];
24592
24602
  var SqliteGraphStore = class {
24593
24603
  db;
24594
24604
  // Typed edge lookups build their SQL from the number of types asked for, and
@@ -25065,6 +25075,32 @@ var SqliteGraphStore = class {
25065
25075
  attrs: JSON.parse(r.attrs_json)
25066
25076
  }));
25067
25077
  }
25078
+ *iterateNodeIdentitiesByLabel(label, pageSize = 2e3) {
25079
+ const page = this.db.prepare(
25080
+ "SELECT rowid AS rid, id, json_extract(attrs_json, '$.relPath') AS relPath, json_extract(attrs_json, '$.qname') AS qname FROM nodes WHERE rowid > ? AND label = ? AND valid_to IS NULL ORDER BY rowid LIMIT ?"
25081
+ );
25082
+ let after = 0;
25083
+ for (; ; ) {
25084
+ const rows = page.all(after, label, pageSize);
25085
+ for (const r of rows) {
25086
+ yield {
25087
+ id: r.id,
25088
+ relPath: typeof r.relPath === "string" ? r.relPath : null,
25089
+ qname: typeof r.qname === "string" ? r.qname : null
25090
+ };
25091
+ }
25092
+ if (rows.length < pageSize) return;
25093
+ after = rows[rows.length - 1].rid;
25094
+ }
25095
+ }
25096
+ recentNodeIds(label, limit) {
25097
+ const rows = this.db.prepare("SELECT id FROM nodes WHERE label = ? AND valid_to IS NULL ORDER BY last_updated_at DESC LIMIT ?").all(label, Math.max(0, limit));
25098
+ return rows.map((r) => r.id);
25099
+ }
25100
+ hasLiveNodes() {
25101
+ const r = this.db.prepare("SELECT EXISTS(SELECT 1 FROM nodes WHERE valid_to IS NULL) AS e").get();
25102
+ return r.e === 1;
25103
+ }
25068
25104
  findNodeIdentitiesByLabel(label) {
25069
25105
  const rows = this.stmts.identitiesByLabel.all(label);
25070
25106
  return rows.map((r) => ({
@@ -25212,6 +25248,15 @@ var SqliteGraphStore = class {
25212
25248
  }
25213
25249
  labelFingerprint(labels) {
25214
25250
  if (labels.length === 0) return "0";
25251
+ if (labels.length === FINGERPRINT_INDEXED_LABELS.length && FINGERPRINT_INDEXED_LABELS.every((l) => labels.includes(l))) {
25252
+ const r2 = this.db.prepare(
25253
+ `SELECT COUNT(*) AS n, MAX(last_updated_at) AS t,
25254
+ MAX(COALESCE(last_reinforced_at_seq, created_at_seq, 0)) AS s
25255
+ FROM nodes INDEXED BY nodes_instance_fingerprint
25256
+ WHERE valid_to IS NULL AND label IN ('Problem','Solution','RootCause')`
25257
+ ).get();
25258
+ return `${r2.n}:${r2.t ?? 0}:${r2.s ?? 0}`;
25259
+ }
25215
25260
  const r = this.db.prepare(
25216
25261
  `SELECT COUNT(*) AS n, MAX(last_updated_at) AS t,
25217
25262
  MAX(COALESCE(last_reinforced_at_seq, created_at_seq, 0)) AS s