@inerrata-corporation/errata 2.0.2-dev.169 → 2.0.2-dev.174

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.
@@ -15415,7 +15415,7 @@ var init_canonicalize = __esm({
15415
15415
 
15416
15416
  // ../../packages/shared/src/nlp/triage-canon.ts
15417
15417
  function canonicalizeToken(t) {
15418
- const base = t.trim().toLowerCase().replace(/[@\s].*$/, "");
15418
+ const base = t.trim().toLowerCase().replace(/(?!^)@.*$|\s.*$/, "");
15419
15419
  if (!base) return "";
15420
15420
  return resolveCanonicalId(base) ?? base;
15421
15421
  }
package/errata.mjs CHANGED
@@ -15887,7 +15887,7 @@ var init_canonicalize = __esm({
15887
15887
 
15888
15888
  // ../../packages/shared/src/nlp/triage-canon.ts
15889
15889
  function canonicalizeToken(t) {
15890
- const base = t.trim().toLowerCase().replace(/[@\s].*$/, "");
15890
+ const base = t.trim().toLowerCase().replace(/(?!^)@.*$|\s.*$/, "");
15891
15891
  if (!base) return "";
15892
15892
  return resolveCanonicalId(base) ?? base;
15893
15893
  }
@@ -50882,11 +50882,17 @@ function isSyncableRoute(edge2, shared, triage, ignorePatterns = []) {
50882
50882
  ].join(" ").toLowerCase();
50883
50883
  return !ignorePatterns.some((p) => blob.includes(p));
50884
50884
  }
50885
- function generalizeRouteForSync(edge2, level) {
50885
+ var isScopedBucket = (bucket) => bucket.startsWith("stack:@");
50886
+ function filterScopedBucketKeys(rec, includeScopedBuckets) {
50887
+ if (includeScopedBuckets) return rec;
50888
+ return Object.fromEntries(Object.entries(rec).filter(([k]) => !isScopedBucket(k)));
50889
+ }
50890
+ function generalizeRouteForSync(edge2, level, includeScopedBuckets = false) {
50886
50891
  const disc = edge2.attrs["discriminator"];
50887
50892
  const local = edge2.attrs["perContext"] ?? {};
50888
50893
  const perContext = {};
50889
50894
  for (const [b, c] of Object.entries(local)) {
50895
+ if (!includeScopedBuckets && isScopedBucket(b)) continue;
50890
50896
  const independent = c.independent ?? c.contributors?.length;
50891
50897
  const inferredIndependent = c.inferredIndependent ?? c.inferredContributors?.length;
50892
50898
  perContext[b] = {
@@ -50947,6 +50953,7 @@ function buildTriageIngest(shared, daemonVersion, ignorePatterns = [], level = 2
50947
50953
  const lang = opts.primaryLanguage?.trim().toLowerCase();
50948
50954
  const fallbackAnchor = lang ? `lang:${lang}` : void 0;
50949
50955
  const tokenAnchors = opts.tokenAnchors ?? {};
50956
+ const includeScopedBuckets = opts.includeScopedBuckets === true;
50950
50957
  const claimOf = (anchor) => anchor ? { anchorVisibility: "public", anchor } : {};
50951
50958
  const nodes = [];
50952
50959
  const edges = [];
@@ -50977,7 +50984,12 @@ function buildTriageIngest(shared, daemonVersion, ignorePatterns = [], level = 2
50977
50984
  embedding: [],
50978
50985
  attrs: {
50979
50986
  ...statement ? { statement: generalize(statement, { level }).text } : {},
50980
- ...tri.attrs["perContextSeen"] ? { perContextSeen: tri.attrs["perContextSeen"] } : {}
50987
+ ...tri.attrs["perContextSeen"] ? {
50988
+ perContextSeen: filterScopedBucketKeys(
50989
+ tri.attrs["perContextSeen"],
50990
+ includeScopedBuckets
50991
+ )
50992
+ } : {}
50981
50993
  },
50982
50994
  ...claimOf(triAnchor ?? fallbackAnchor)
50983
50995
  });
@@ -50991,7 +51003,7 @@ function buildTriageIngest(shared, daemonVersion, ignorePatterns = [], level = 2
50991
51003
  throw new Error(`buildTriageIngest: refusing to sync non-router route ${e.id} \u2014 C7 invariant violated`);
50992
51004
  }
50993
51005
  shareEndpoint(e.to, witnessedAnchor([e], tokenAnchors));
50994
- edges.push(generalizeRouteForSync(e, level));
51006
+ edges.push(generalizeRouteForSync(e, level, includeScopedBuckets));
50995
51007
  }
50996
51008
  }
50997
51009
  if (edges.length === 0) return null;
@@ -52039,7 +52051,7 @@ function startLoopLagMonitor(thresholdMs = 1e3) {
52039
52051
  }
52040
52052
 
52041
52053
  // src/engine.ts
52042
- var DAEMON_VERSION = true ? "2.0.2-dev.169" : "2.0.0-alpha.0";
52054
+ var DAEMON_VERSION = true ? "2.0.2-dev.174" : "2.0.0-alpha.0";
52043
52055
  var IGNORED_PATH = /[\\/](?:\.git|node_modules|\.errata|\.claude|\.codex|\.cursor|\.turbo|\.next|dist|coverage|test-results|playwright-report|__pycache__)(?:[\\/]|$)/;
52044
52056
  var IGNORED_NOISE = /castalia\.db|eventlog\.sqlite|turn-cursors/;
52045
52057
  var GIT_OP_MUTE_MS = 4e3;
@@ -55087,7 +55099,9 @@ async function startMultiDaemon(opts = {}) {
55087
55099
  const tokenAnchors = buildBucketTokenAnchors(languages, packages);
55088
55100
  const payload = buildTriageIngest(sharedStore, DAEMON_VERSION, ignore, 2, {
55089
55101
  ...primaryLanguage ? { primaryLanguage } : {},
55090
- tokenAnchors
55102
+ tokenAnchors,
55103
+ // Scoped bucket keys carry package names — same consent as the purls.
55104
+ includeScopedBuckets: cfg2.consent.contributePackages
55091
55105
  });
55092
55106
  if (!payload) return { uploaded: 0 };
55093
55107
  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.169",
3
+ "version": "2.0.2-dev.174",
4
4
  "description": "errata - local-first observation engine for AI coding agents",
5
5
  "type": "module",
6
6
  "bin": {