@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.
- package/errata.mjs +58 -9
- 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
|
|
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
|
-
...
|
|
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
|
-
...
|
|
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.
|
|
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
|
-
|
|
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);
|