@inerrata-corporation/errata 2.0.2-dev.161 → 2.0.2-dev.165

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 +58 -9
  2. package/package.json +1 -1
package/errata.mjs CHANGED
@@ -50904,13 +50904,51 @@ function generalizeRouteForSync(edge2, level) {
50904
50904
  navFailures: 0
50905
50905
  };
50906
50906
  }
50907
+ function buildBucketTokenAnchors(languages, packages = []) {
50908
+ const anchors = {};
50909
+ const langTokens = /* @__PURE__ */ new Set();
50910
+ for (const l of languages) {
50911
+ const t = canonicalizeToken(String(l));
50912
+ if (!t || t.includes(":") && !t.startsWith("lang:")) continue;
50913
+ langTokens.add(t);
50914
+ anchors[t] = t.startsWith("lang:") ? t : `lang:${t}`;
50915
+ }
50916
+ const versionless = (purl) => purl.replace(/@[^/@]+$/, "");
50917
+ const conflicted = /* @__PURE__ */ new Set();
50918
+ for (const p of packages) {
50919
+ const t = canonicalizeToken(p.name);
50920
+ if (!t || !p.purl || langTokens.has(t) || conflicted.has(t)) continue;
50921
+ const existing = anchors[t];
50922
+ if (existing === void 0) {
50923
+ anchors[t] = p.purl;
50924
+ } else if (versionless(existing) !== versionless(p.purl)) {
50925
+ delete anchors[t];
50926
+ conflicted.add(t);
50927
+ }
50928
+ }
50929
+ return anchors;
50930
+ }
50931
+ function witnessedAnchor(routes, tokenAnchors) {
50932
+ const weight = /* @__PURE__ */ new Map();
50933
+ for (const e of routes) {
50934
+ const perContext = e.attrs["perContext"] ?? {};
50935
+ for (const [bucket, c] of Object.entries(perContext)) {
50936
+ if (!bucket.startsWith("stack:") || !c || !(c.confirmed > 0)) continue;
50937
+ const anchor = tokenAnchors[bucket.slice("stack:".length)];
50938
+ if (anchor) weight.set(anchor, (weight.get(anchor) ?? 0) + c.confirmed);
50939
+ }
50940
+ }
50941
+ return [...weight.entries()].sort((a, b) => b[1] - a[1] || (a[0] < b[0] ? -1 : 1))[0]?.[0];
50942
+ }
50907
50943
  function buildTriageIngest(shared, daemonVersion, ignorePatterns = [], level = 2, opts = {}) {
50908
50944
  const lang = opts.primaryLanguage?.trim().toLowerCase();
50909
- const claim = lang ? { anchorVisibility: "public", anchor: `lang:${lang}` } : {};
50945
+ const fallbackAnchor = lang ? `lang:${lang}` : void 0;
50946
+ const tokenAnchors = opts.tokenAnchors ?? {};
50947
+ const claimOf = (anchor) => anchor ? { anchorVisibility: "public", anchor } : {};
50910
50948
  const nodes = [];
50911
50949
  const edges = [];
50912
50950
  const seenIds = /* @__PURE__ */ new Set();
50913
- const shareEndpoint = (id) => {
50951
+ const shareEndpoint = (id, anchor) => {
50914
50952
  if (seenIds.has(id)) return;
50915
50953
  const n = shared.getNode(id);
50916
50954
  if (!n) return;
@@ -50920,12 +50958,13 @@ function buildTriageIngest(shared, daemonVersion, ignorePatterns = [], level = 2
50920
50958
  description: generalize(n.description, { level }).text,
50921
50959
  embedding: [],
50922
50960
  attrs: { scope: {} },
50923
- ...claim
50961
+ ...claimOf(anchor ?? fallbackAnchor)
50924
50962
  });
50925
50963
  };
50926
50964
  for (const tri of shared.findNodesByLabel("Triage")) {
50927
50965
  const routes = shared.outEdges(tri.id, ["CONFIRMS", "INDICATES", "ROUTES_TO"]).filter((e) => isSyncableRoute(e, shared, tri, ignorePatterns));
50928
50966
  if (routes.length === 0) continue;
50967
+ const triAnchor = witnessedAnchor(routes, tokenAnchors);
50929
50968
  if (!seenIds.has(tri.id)) {
50930
50969
  seenIds.add(tri.id);
50931
50970
  const statement = String(tri.attrs["statement"] ?? "");
@@ -50937,18 +50976,18 @@ function buildTriageIngest(shared, daemonVersion, ignorePatterns = [], level = 2
50937
50976
  ...statement ? { statement: generalize(statement, { level }).text } : {},
50938
50977
  ...tri.attrs["perContextSeen"] ? { perContextSeen: tri.attrs["perContextSeen"] } : {}
50939
50978
  },
50940
- ...claim
50979
+ ...claimOf(triAnchor ?? fallbackAnchor)
50941
50980
  });
50942
50981
  }
50943
50982
  for (const tb of shared.inEdges(tri.id, ["TRIAGED_BY"])) {
50944
- shareEndpoint(tb.from);
50983
+ shareEndpoint(tb.from, triAnchor);
50945
50984
  edges.push({ ...tb, navSuccesses: 0, navFailures: 0 });
50946
50985
  }
50947
50986
  for (const e of routes) {
50948
50987
  if (!(e.type === "CONFIRMS" || e.type === "ROUTES_TO" && e.attrs["provisional"] === false)) {
50949
50988
  throw new Error(`buildTriageIngest: refusing to sync non-router route ${e.id} \u2014 C7 invariant violated`);
50950
50989
  }
50951
- shareEndpoint(e.to);
50990
+ shareEndpoint(e.to, witnessedAnchor([e], tokenAnchors));
50952
50991
  edges.push(generalizeRouteForSync(e, level));
50953
50992
  }
50954
50993
  }
@@ -51997,7 +52036,7 @@ function startLoopLagMonitor(thresholdMs = 1e3) {
51997
52036
  }
51998
52037
 
51999
52038
  // src/engine.ts
52000
- var DAEMON_VERSION = true ? "2.0.2-dev.161" : "2.0.0-alpha.0";
52039
+ var DAEMON_VERSION = true ? "2.0.2-dev.165" : "2.0.0-alpha.0";
52001
52040
  var IGNORED_PATH = /[\\/](?:\.git|node_modules|\.errata|\.claude|\.codex|\.cursor|\.turbo|\.next|dist|coverage|test-results|playwright-report|__pycache__)(?:[\\/]|$)/;
52002
52041
  var IGNORED_NOISE = /castalia\.db|eventlog\.sqlite|turn-cursors/;
52003
52042
  var GIT_OP_MUTE_MS = 4e3;
@@ -55018,11 +55057,21 @@ async function startMultiDaemon(opts = {}) {
55018
55057
  return { uploaded: res.accepted };
55019
55058
  },
55020
55059
  async syncTriagePublic() {
55021
- if (!loadConfig().consent.sync) return { uploaded: 0, skipped: "consent-off" };
55060
+ const cfg2 = loadConfig();
55061
+ if (!cfg2.consent.sync) return { uploaded: 0, skipped: "consent-off" };
55022
55062
  const ignore = loadClaimIgnorePatterns(globalDir());
55023
55063
  const primaryLanguage = machineDominantLanguage();
55064
+ const languages = records.flatMap((r) => r.engine.profile.languages ?? []);
55065
+ const packages = cfg2.consent.contributePackages ? records.flatMap(
55066
+ (r) => r.engine.store.findNodesByLabel("Package").map((p) => ({
55067
+ name: String(p.attrs["name"] ?? ""),
55068
+ purl: String(p.attrs["purl"] ?? p.id)
55069
+ }))
55070
+ ) : [];
55071
+ const tokenAnchors = buildBucketTokenAnchors(languages, packages);
55024
55072
  const payload = buildTriageIngest(sharedStore, DAEMON_VERSION, ignore, 2, {
55025
- ...primaryLanguage ? { primaryLanguage } : {}
55073
+ ...primaryLanguage ? { primaryLanguage } : {},
55074
+ tokenAnchors
55026
55075
  });
55027
55076
  if (!payload) return { uploaded: 0 };
55028
55077
  const res = await cloudNow().ingest(payload);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inerrata-corporation/errata",
3
- "version": "2.0.2-dev.161",
3
+ "version": "2.0.2-dev.165",
4
4
  "description": "errata - local-first observation engine for AI coding agents",
5
5
  "type": "module",
6
6
  "bin": {