@inerrata-corporation/errata 2.0.2-dev.417 → 2.0.2-dev.455

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 CHANGED
@@ -18036,6 +18036,207 @@ var init_aggregate = __esm({
18036
18036
  }
18037
18037
  });
18038
18038
 
18039
+ // ../../packages/embedding/src/model.ts
18040
+ import { mkdirSync as mkdirSync3, existsSync as existsSync4 } from "node:fs";
18041
+ import { homedir } from "node:os";
18042
+ import { dirname as dirname3, join as join3 } from "node:path";
18043
+ import { createRequire } from "node:module";
18044
+ function semanticFloorFor(version2) {
18045
+ if (version2 === EMBEDDING_VERSION || version2 === MODEL_EMBEDDING_VERSION) return 0.25;
18046
+ return 0.5;
18047
+ }
18048
+ function noteHashFallback() {
18049
+ if (warnedHashFallback) return;
18050
+ if (process.env["ERRATA_EMBED_HASH_ONLY"] === "1") return;
18051
+ warnedHashFallback = true;
18052
+ console.warn(
18053
+ `[errata] embedding model unavailable (${lastError?.message ?? "unknown"}) \u2014 falling back to ${EMBEDDING_VERSION} hash vectors; semantic ranking runs at reduced fidelity`
18054
+ );
18055
+ }
18056
+ function getCacheDir() {
18057
+ return process.env["ERRATA_MODEL_CACHE"] ?? join3(homedir(), ".errata", "models");
18058
+ }
18059
+ async function loadTransformers() {
18060
+ try {
18061
+ return await import("@huggingface/transformers");
18062
+ } catch (err2) {
18063
+ void err2;
18064
+ }
18065
+ try {
18066
+ const seaResourceBase = join3(
18067
+ // execPath dir is where errata.exe lives; resources/ rides alongside.
18068
+ dirname3(process.execPath),
18069
+ "resources",
18070
+ "_resolve.js"
18071
+ );
18072
+ const resourceRequire = createRequire(seaResourceBase);
18073
+ return resourceRequire("@huggingface/transformers");
18074
+ } catch (err2) {
18075
+ lastError = err2 instanceof Error ? err2 : new Error(String(err2));
18076
+ return null;
18077
+ }
18078
+ }
18079
+ async function loadPipeline() {
18080
+ const cacheDir = getCacheDir();
18081
+ if (!existsSync4(cacheDir)) mkdirSync3(cacheDir, { recursive: true });
18082
+ try {
18083
+ const tx = await loadTransformers();
18084
+ if (!tx) {
18085
+ throw lastError ?? new Error("transformers package unavailable");
18086
+ }
18087
+ tx.env.cacheDir = cacheDir;
18088
+ tx.env.useFSCache = true;
18089
+ tx.env.allowLocalModels = true;
18090
+ tx.env.allowRemoteModels = process.env["ERRATA_OFFLINE"] !== "1";
18091
+ const pipe2 = await tx.pipeline("feature-extraction", MODEL_NAME, {
18092
+ // Quantized weights cut size 4x; quality drop is negligible for
18093
+ // short-text similarity. Override via env if you want full
18094
+ // precision.
18095
+ dtype: process.env["ERRATA_MODEL_DTYPE"] ?? "q8"
18096
+ });
18097
+ return pipe2;
18098
+ } catch (err2) {
18099
+ lastError = err2 instanceof Error ? err2 : new Error(String(err2));
18100
+ return null;
18101
+ }
18102
+ }
18103
+ async function ensureModelLoaded() {
18104
+ if (!pipelinePromise) {
18105
+ pipelinePromise = loadPipeline();
18106
+ }
18107
+ return pipelinePromise;
18108
+ }
18109
+ async function embedTextWithModel(text) {
18110
+ const pipe2 = await ensureModelLoaded();
18111
+ if (!pipe2) {
18112
+ throw new Error(
18113
+ `embedding model could not be loaded: ${lastError?.message ?? "unknown"}`
18114
+ );
18115
+ }
18116
+ if (!text) return new Array(MODEL_EMBEDDING_DIM).fill(0);
18117
+ const out2 = await pipe2(text, { pooling: "mean", normalize: true });
18118
+ return Array.from(out2.data);
18119
+ }
18120
+ async function embedBatchWithModelOrHash(texts) {
18121
+ if (texts.length === 0) return [];
18122
+ if (process.env["ERRATA_EMBED_HASH_ONLY"] === "1") {
18123
+ return texts.map((t) => {
18124
+ const v = embed(t);
18125
+ return { vector: v, version: EMBEDDING_VERSION, dim: v.length };
18126
+ });
18127
+ }
18128
+ try {
18129
+ const pipe2 = await ensureModelLoaded();
18130
+ if (pipe2) {
18131
+ const out2 = await pipe2(texts, {
18132
+ pooling: "mean",
18133
+ normalize: true
18134
+ });
18135
+ const dim = out2.dims[out2.dims.length - 1] ?? MODEL_EMBEDDING_DIM;
18136
+ const total = texts.length;
18137
+ const results = [];
18138
+ for (let i2 = 0; i2 < total; i2++) {
18139
+ const v = Array.from(out2.data.subarray(i2 * dim, (i2 + 1) * dim));
18140
+ results.push({ vector: v, version: MODEL_EMBEDDING_VERSION, dim });
18141
+ }
18142
+ return results;
18143
+ }
18144
+ } catch {
18145
+ }
18146
+ noteHashFallback();
18147
+ return texts.map((t) => {
18148
+ const v = embed(t);
18149
+ return { vector: v, version: EMBEDDING_VERSION, dim: v.length };
18150
+ });
18151
+ }
18152
+ async function embedTextWithModelOrHash(text) {
18153
+ if (process.env["ERRATA_EMBED_HASH_ONLY"] === "1") {
18154
+ const v = embed(text);
18155
+ return { vector: v, version: EMBEDDING_VERSION, dim: v.length };
18156
+ }
18157
+ try {
18158
+ const v = await embedTextWithModel(text);
18159
+ return { vector: v, version: MODEL_EMBEDDING_VERSION, dim: v.length };
18160
+ } catch {
18161
+ noteHashFallback();
18162
+ const v = embed(text);
18163
+ return { vector: v, version: EMBEDDING_VERSION, dim: v.length };
18164
+ }
18165
+ }
18166
+ var MODEL_NAME, MODEL_EMBEDDING_DIM, MODEL_EMBEDDING_VERSION, pipelinePromise, lastError, warnedHashFallback;
18167
+ var init_model = __esm({
18168
+ "../../packages/embedding/src/model.ts"() {
18169
+ "use strict";
18170
+ init_src3();
18171
+ MODEL_NAME = "Xenova/all-MiniLM-L6-v2";
18172
+ MODEL_EMBEDDING_DIM = 384;
18173
+ MODEL_EMBEDDING_VERSION = "minilm-l6-v2";
18174
+ pipelinePromise = null;
18175
+ lastError = null;
18176
+ warnedHashFallback = false;
18177
+ }
18178
+ });
18179
+
18180
+ // ../../packages/embedding/src/index.ts
18181
+ function djb2(s) {
18182
+ let h = 5381;
18183
+ for (let i2 = 0; i2 < s.length; i2++) {
18184
+ h = (h << 5) + h + s.charCodeAt(i2) >>> 0;
18185
+ }
18186
+ return h;
18187
+ }
18188
+ function djb2Signed(s) {
18189
+ let h = 0;
18190
+ for (let i2 = 0; i2 < s.length; i2++) {
18191
+ h = h * 31 + s.charCodeAt(i2) | 0;
18192
+ }
18193
+ return h;
18194
+ }
18195
+ function tokenize(text) {
18196
+ return text.toLowerCase().split(/[^a-z0-9]+/).filter((t) => t.length > 0 && t.length <= 40);
18197
+ }
18198
+ function* charTrigrams(text) {
18199
+ const s = text.toLowerCase();
18200
+ for (let i2 = 0; i2 <= s.length - 3; i2++) {
18201
+ yield s.slice(i2, i2 + 3);
18202
+ }
18203
+ }
18204
+ function embed(text) {
18205
+ const vec = new Array(EMBEDDING_DIM).fill(0);
18206
+ if (!text) return vec;
18207
+ for (const tok of tokenize(text)) {
18208
+ const idx = djb2(tok) % EMBEDDING_DIM;
18209
+ const sign = djb2Signed(tok) & 1 ? 1 : -1;
18210
+ vec[idx] = vec[idx] + sign;
18211
+ }
18212
+ for (const tri of charTrigrams(text)) {
18213
+ const idx = djb2("3:" + tri) % EMBEDDING_DIM;
18214
+ const sign = djb2Signed("3:" + tri) & 1 ? 1 : -1;
18215
+ vec[idx] = vec[idx] + 0.5 * sign;
18216
+ }
18217
+ let normSq = 0;
18218
+ for (const x of vec) normSq += x * x;
18219
+ if (normSq <= 0) return vec;
18220
+ const inv = 1 / Math.sqrt(normSq);
18221
+ for (let i2 = 0; i2 < vec.length; i2++) vec[i2] = vec[i2] * inv;
18222
+ return vec;
18223
+ }
18224
+ function cosine(a, b) {
18225
+ if (a.length !== b.length || a.length === 0) return 0;
18226
+ let dot = 0;
18227
+ for (let i2 = 0; i2 < a.length; i2++) dot += a[i2] * b[i2];
18228
+ return dot;
18229
+ }
18230
+ var EMBEDDING_DIM, EMBEDDING_VERSION;
18231
+ var init_src3 = __esm({
18232
+ "../../packages/embedding/src/index.ts"() {
18233
+ "use strict";
18234
+ init_model();
18235
+ EMBEDDING_DIM = 256;
18236
+ EMBEDDING_VERSION = "hash-v1";
18237
+ }
18238
+ });
18239
+
18039
18240
  // ../../packages/local-graph/src/problem-package-link.ts
18040
18241
  function buildPackageIndex(store) {
18041
18242
  const idx = /* @__PURE__ */ new Map();
@@ -18361,6 +18562,132 @@ var init_problem_package_link = __esm({
18361
18562
  }
18362
18563
  });
18363
18564
 
18565
+ // ../../packages/local-graph/src/problem-dedup.ts
18566
+ function corroborations(n) {
18567
+ return Number(n.attrs["corroborations"] ?? 0);
18568
+ }
18569
+ function overlap(a, b) {
18570
+ if (a.size === 0 || b.size === 0) return 0;
18571
+ let inter = 0;
18572
+ for (const x of a) if (b.has(x)) inter++;
18573
+ return inter / Math.min(a.size, b.size);
18574
+ }
18575
+ function mergeDuplicateProblems(store, opts) {
18576
+ const minOverlap = opts.minOverlap ?? 0.85;
18577
+ const minTokens = opts.minTokens ?? 4;
18578
+ const report = { clusters: 0, merged: 0 };
18579
+ const open2 = store.findNodesByLabel("Problem").filter((p) => p.attrs["resolvedAt"] == null && p.attrs["mergedInto"] === void 0);
18580
+ const tokens = /* @__PURE__ */ new Map();
18581
+ for (const p of open2) tokens.set(p.id, new Set(conceptTokens(p.description)));
18582
+ const consumed = /* @__PURE__ */ new Set();
18583
+ store.transaction(() => {
18584
+ for (let i2 = 0; i2 < open2.length; i2++) {
18585
+ const a = open2[i2];
18586
+ if (consumed.has(a.id)) continue;
18587
+ const cluster = [a];
18588
+ const ta = tokens.get(a.id);
18589
+ for (let j = i2 + 1; j < open2.length; j++) {
18590
+ const b = open2[j];
18591
+ if (consumed.has(b.id)) continue;
18592
+ const tb = tokens.get(b.id);
18593
+ if (Math.min(ta.size, tb.size) < minTokens) continue;
18594
+ if (isConstraintProblem(a) !== isConstraintProblem(b)) continue;
18595
+ if (overlap(ta, tb) >= minOverlap) {
18596
+ cluster.push(b);
18597
+ consumed.add(b.id);
18598
+ }
18599
+ }
18600
+ if (cluster.length < 2) continue;
18601
+ report.clusters++;
18602
+ cluster.sort((x, y) => corroborations(y) - corroborations(x) || x.createdAt - y.createdAt);
18603
+ const survivor = cluster[0];
18604
+ for (const dup of cluster.slice(1)) {
18605
+ foldDuplicateProblem(store, dup, survivor, opts.ts);
18606
+ report.merged++;
18607
+ }
18608
+ }
18609
+ });
18610
+ return report;
18611
+ }
18612
+ function foldDuplicateProblem(store, dup, survivor, ts) {
18613
+ const surv = store.getNode(survivor.id);
18614
+ if (!surv) return;
18615
+ const sources = new Set(surv.attrs["sources"] ?? []);
18616
+ for (const s of dup.attrs["sources"] ?? []) sources.add(s);
18617
+ store.updateNode(survivor.id, {
18618
+ attrs: {
18619
+ ...surv.attrs,
18620
+ sources: [...sources],
18621
+ corroborations: corroborations(surv) + corroborations(dup) + 1
18622
+ },
18623
+ cumulativeHits: (surv.cumulativeHits ?? 0) + (dup.cumulativeHits ?? 0),
18624
+ lastUpdatedAt: ts
18625
+ });
18626
+ for (const e of store.outEdges(dup.id, REDIRECT_EDGES)) {
18627
+ if (e.to === survivor.id) continue;
18628
+ const id = `edge_${digest({ from: survivor.id, type: e.type, to: e.to })}`.slice(0, 24);
18629
+ if (store.getEdge(id)) continue;
18630
+ const redirected = {
18631
+ ...e,
18632
+ id,
18633
+ from: survivor.id,
18634
+ createdAt: ts,
18635
+ lastSeenAt: ts
18636
+ };
18637
+ store.mergeEdge(redirected);
18638
+ }
18639
+ store.updateNode(dup.id, {
18640
+ attrs: { ...dup.attrs, mergedInto: survivor.id, resolvedAs: "duplicate", resolvedAt: ts },
18641
+ lastUpdatedAt: ts
18642
+ });
18643
+ store.closeNode(dup.id, ts);
18644
+ }
18645
+ function statementIdentityKey(statement) {
18646
+ return statement.toLowerCase().replace(/[`"'“”‘’*_]/g, "").replace(/[—–]/g, "-").replace(/\s+/g, " ").trim().replace(/[.,;:!?]+$/, "");
18647
+ }
18648
+ function findMintTimeDuplicate(store, statement, kind, opts) {
18649
+ const minOverlap = opts?.minOverlap ?? 0.85;
18650
+ const minTokens = opts?.minTokens ?? 4;
18651
+ const incomingIsConstraint = kind === "constraint";
18652
+ const open2 = store.findNodesByLabel("Problem").filter((p) => p.attrs["resolvedAt"] == null && p.attrs["mergedInto"] === void 0);
18653
+ if (open2.length === 0) return null;
18654
+ const key = statementIdentityKey(statement);
18655
+ for (const p of open2) {
18656
+ if (isConstraintProblem(p) !== incomingIsConstraint) continue;
18657
+ if (statementIdentityKey(p.description) === key) return p.id;
18658
+ }
18659
+ const ta = new Set(conceptTokens(statement));
18660
+ if (ta.size < minTokens) return null;
18661
+ let best = null;
18662
+ for (const p of open2) {
18663
+ if (isConstraintProblem(p) !== incomingIsConstraint) continue;
18664
+ const tb = new Set(conceptTokens(p.description));
18665
+ if (Math.min(ta.size, tb.size) < minTokens) continue;
18666
+ const score2 = overlap(ta, tb);
18667
+ if (score2 >= minOverlap && (best === null || score2 > best.score)) {
18668
+ best = { id: p.id, score: score2 };
18669
+ }
18670
+ }
18671
+ return best?.id ?? null;
18672
+ }
18673
+ var REDIRECT_EDGES;
18674
+ var init_problem_dedup = __esm({
18675
+ "../../packages/local-graph/src/problem-dedup.ts"() {
18676
+ "use strict";
18677
+ init_src();
18678
+ init_src();
18679
+ init_design_problem();
18680
+ REDIRECT_EDGES = [
18681
+ "CAUSED_BY",
18682
+ "SOLVED_BY",
18683
+ "FIXED_BY",
18684
+ "ANCHORED_AT",
18685
+ "MANIFESTED_IN",
18686
+ "EVIDENCED_BY"
18687
+ ];
18688
+ }
18689
+ });
18690
+
18364
18691
  // ../../packages/local-graph/src/design-problem.ts
18365
18692
  function isConstraintProblem(node2) {
18366
18693
  return node2.attrs["kind"] === "constraint";
@@ -18443,7 +18770,9 @@ function ingestDesignProblem(store, flag, opts) {
18443
18770
  rejected: true
18444
18771
  };
18445
18772
  }
18446
- const problemId = identityId({ kind: "DesignProblem", statement });
18773
+ const rawId = identityId({ kind: "DesignProblem", statement });
18774
+ const dupId = store.getNode(rawId) ? null : findMintTimeDuplicate(store, statement, flag.kind);
18775
+ const problemId = dupId ?? rawId;
18447
18776
  const existing = store.getNode(problemId);
18448
18777
  let created = false;
18449
18778
  let corroborated = false;
@@ -18458,7 +18787,18 @@ function ingestDesignProblem(store, flag, opts) {
18458
18787
  ...existing.attrs,
18459
18788
  sources: [...sources, opts.source],
18460
18789
  corroborations: corroborations2,
18461
- ...promoted ? { provisional: false } : {}
18790
+ ...promoted ? { provisional: false } : {},
18791
+ // Keep the variant wording when a restatement resolved here rather
18792
+ // than minting — audit trail, and input for a future judge tier.
18793
+ ...dupId && statement !== existing.description ? {
18794
+ statementAliases: [
18795
+ ...(existing.attrs["statementAliases"] ?? []).slice(
18796
+ 0,
18797
+ STATEMENT_ALIAS_CAP - 1
18798
+ ),
18799
+ statement
18800
+ ]
18801
+ } : {}
18462
18802
  },
18463
18803
  cumulativeHits: (existing.cumulativeHits ?? 0) + 1,
18464
18804
  ...promoted ? { extractionConfidence: 0.65 } : {},
@@ -18515,14 +18855,51 @@ function ingestDesignProblem(store, flag, opts) {
18515
18855
  const linkedPackages = linkProblemToPackages(store, problemId, linkText, opts.ts).linked;
18516
18856
  return { problemId, created, corroborated, rootCauseId, solutionId, anchored, linkedPackages };
18517
18857
  }
18858
+ function canonicalizePatternText(name2) {
18859
+ const stripped = name2.replace(/^\s*pattern(?:\s*[×x]\s*\d+)?\s*(?:\(exemplar\))?\s*[:—–-]\s*/i, "").replace(/\s+/g, " ").trim();
18860
+ return stripped.length > 0 ? stripped : name2.replace(/\s+/g, " ").trim();
18861
+ }
18518
18862
  function mintPatternNode(store, name2, ts) {
18519
- const display = name2.replace(/\s+/g, " ").trim();
18863
+ const display = canonicalizePatternText(name2);
18520
18864
  const id = `pat_${digest({ pattern: display.toLowerCase() })}`.slice(0, 56);
18521
- if (!store.getNode(id)) {
18522
- store.mergeNode(
18523
- buildNode(id, "Pattern", display, ts, { source: "convo", provisional: true })
18524
- );
18525
- }
18865
+ const exact = store.getNode(id);
18866
+ const reinforce = (node2, variant) => {
18867
+ const aliases = Array.isArray(node2.attrs["aliasTexts"]) ? [...node2.attrs["aliasTexts"]] : [];
18868
+ if (variant && variant !== node2.description && !aliases.includes(variant) && aliases.length < PATTERN_ALIAS_CAP) {
18869
+ aliases.push(variant);
18870
+ }
18871
+ store.updateNode(node2.id, {
18872
+ attrs: {
18873
+ ...node2.attrs,
18874
+ observedCount: (Number(node2.attrs["observedCount"]) || 1) + 1,
18875
+ ...aliases.length > 0 ? { aliasTexts: aliases } : {}
18876
+ },
18877
+ lastUpdatedAt: ts
18878
+ });
18879
+ return node2.id;
18880
+ };
18881
+ if (exact) return reinforce(exact);
18882
+ const emb = embed(display);
18883
+ let best = null;
18884
+ let bestCos = 0;
18885
+ for (const p of store.findNodesByLabel("Pattern")) {
18886
+ const e = p.embedding;
18887
+ if (!e || e.length !== EMBEDDING_DIM) continue;
18888
+ let d = 0;
18889
+ for (let i2 = 0; i2 < EMBEDDING_DIM; i2++) d += e[i2] * emb[i2];
18890
+ if (d > bestCos) {
18891
+ bestCos = d;
18892
+ best = p;
18893
+ }
18894
+ }
18895
+ if (best && bestCos >= PATTERN_DEDUP_COSINE) return reinforce(best, display);
18896
+ store.mergeNode({
18897
+ ...buildNode(id, "Pattern", display, ts, { source: "convo", provisional: true, observedCount: 1 }),
18898
+ // Embedded inline (sync hash) so the node participates in the gate
18899
+ // immediately — buildNode's empty embedding would leave every new pattern
18900
+ // invisible to dedup until the nightly embed pass.
18901
+ embedding: emb
18902
+ });
18526
18903
  return id;
18527
18904
  }
18528
18905
  function titleCaseDomain(name2) {
@@ -18895,15 +19272,20 @@ function markFixCandidates(store, t) {
18895
19272
  }
18896
19273
  return resolved;
18897
19274
  }
18898
- var DESIGN_PROMOTE_AT, DEDUP_STOPWORDS, SAME_ANCHOR_DEDUP_JACCARD, CITABLE_PRIOR_LABELS, MAX_ANCHOR_FILES, AUTO_MINT_PREFIX;
19275
+ var DESIGN_PROMOTE_AT, STATEMENT_ALIAS_CAP, PATTERN_DEDUP_COSINE, PATTERN_ALIAS_CAP, DEDUP_STOPWORDS, SAME_ANCHOR_DEDUP_JACCARD, CITABLE_PRIOR_LABELS, MAX_ANCHOR_FILES, AUTO_MINT_PREFIX;
18899
19276
  var init_design_problem = __esm({
18900
19277
  "../../packages/local-graph/src/design-problem.ts"() {
18901
19278
  "use strict";
18902
19279
  init_src();
18903
19280
  init_src();
19281
+ init_src3();
18904
19282
  init_src2();
18905
19283
  init_problem_package_link();
19284
+ init_problem_dedup();
18906
19285
  DESIGN_PROMOTE_AT = 1;
19286
+ STATEMENT_ALIAS_CAP = 5;
19287
+ PATTERN_DEDUP_COSINE = 0.85;
19288
+ PATTERN_ALIAS_CAP = 5;
18907
19289
  DEDUP_STOPWORDS = /* @__PURE__ */ new Set([
18908
19290
  "the",
18909
19291
  "and",
@@ -19961,7 +20343,7 @@ var init_bko = __esm({
19961
20343
  });
19962
20344
 
19963
20345
  // ../../packages/math/src/index.ts
19964
- var init_src3 = __esm({
20346
+ var init_src4 = __esm({
19965
20347
  "../../packages/math/src/index.ts"() {
19966
20348
  "use strict";
19967
20349
  init_constants();
@@ -20508,7 +20890,7 @@ var init_triage2 = __esm({
20508
20890
  init_src();
20509
20891
  init_src();
20510
20892
  init_src();
20511
- init_src3();
20893
+ init_src4();
20512
20894
  init_src2();
20513
20895
  COOCCUR_BONUS = 0.25;
20514
20896
  routeEdgeId = (triageId, causeId) => `edge_rt_${triageId}_${causeId}`;
@@ -20807,7 +21189,7 @@ var init_abstraction = __esm({
20807
21189
  "use strict";
20808
21190
  init_src();
20809
21191
  init_src2();
20810
- init_src3();
21192
+ init_src4();
20811
21193
  init_percolate();
20812
21194
  init_triage2();
20813
21195
  DEFAULT_MIN_CLUSTER_SIZE = 3;
@@ -20956,7 +21338,7 @@ var init_community2 = __esm({
20956
21338
  "../../packages/local-graph/src/community.ts"() {
20957
21339
  "use strict";
20958
21340
  init_src2();
20959
- init_src3();
21341
+ init_src4();
20960
21342
  JOINT_COMMUNITY_LABELS = [
20961
21343
  "Problem",
20962
21344
  "Solution",
@@ -20981,104 +21363,6 @@ var init_community2 = __esm({
20981
21363
  }
20982
21364
  });
20983
21365
 
20984
- // ../../packages/local-graph/src/problem-dedup.ts
20985
- function corroborations(n) {
20986
- return Number(n.attrs["corroborations"] ?? 0);
20987
- }
20988
- function overlap(a, b) {
20989
- if (a.size === 0 || b.size === 0) return 0;
20990
- let inter = 0;
20991
- for (const x of a) if (b.has(x)) inter++;
20992
- return inter / Math.min(a.size, b.size);
20993
- }
20994
- function mergeDuplicateProblems(store, opts) {
20995
- const minOverlap = opts.minOverlap ?? 0.85;
20996
- const minTokens = opts.minTokens ?? 4;
20997
- const report = { clusters: 0, merged: 0 };
20998
- const open2 = store.findNodesByLabel("Problem").filter((p) => p.attrs["resolvedAt"] == null && p.attrs["mergedInto"] === void 0);
20999
- const tokens = /* @__PURE__ */ new Map();
21000
- for (const p of open2) tokens.set(p.id, new Set(conceptTokens(p.description)));
21001
- const consumed = /* @__PURE__ */ new Set();
21002
- store.transaction(() => {
21003
- for (let i2 = 0; i2 < open2.length; i2++) {
21004
- const a = open2[i2];
21005
- if (consumed.has(a.id)) continue;
21006
- const cluster = [a];
21007
- const ta = tokens.get(a.id);
21008
- for (let j = i2 + 1; j < open2.length; j++) {
21009
- const b = open2[j];
21010
- if (consumed.has(b.id)) continue;
21011
- const tb = tokens.get(b.id);
21012
- if (Math.min(ta.size, tb.size) < minTokens) continue;
21013
- if (isConstraintProblem(a) !== isConstraintProblem(b)) continue;
21014
- if (overlap(ta, tb) >= minOverlap) {
21015
- cluster.push(b);
21016
- consumed.add(b.id);
21017
- }
21018
- }
21019
- if (cluster.length < 2) continue;
21020
- report.clusters++;
21021
- cluster.sort((x, y) => corroborations(y) - corroborations(x) || x.createdAt - y.createdAt);
21022
- const survivor = cluster[0];
21023
- for (const dup of cluster.slice(1)) {
21024
- foldDuplicateProblem(store, dup, survivor, opts.ts);
21025
- report.merged++;
21026
- }
21027
- }
21028
- });
21029
- return report;
21030
- }
21031
- function foldDuplicateProblem(store, dup, survivor, ts) {
21032
- const surv = store.getNode(survivor.id);
21033
- if (!surv) return;
21034
- const sources = new Set(surv.attrs["sources"] ?? []);
21035
- for (const s of dup.attrs["sources"] ?? []) sources.add(s);
21036
- store.updateNode(survivor.id, {
21037
- attrs: {
21038
- ...surv.attrs,
21039
- sources: [...sources],
21040
- corroborations: corroborations(surv) + corroborations(dup) + 1
21041
- },
21042
- cumulativeHits: (surv.cumulativeHits ?? 0) + (dup.cumulativeHits ?? 0),
21043
- lastUpdatedAt: ts
21044
- });
21045
- for (const e of store.outEdges(dup.id, REDIRECT_EDGES)) {
21046
- if (e.to === survivor.id) continue;
21047
- const id = `edge_${digest({ from: survivor.id, type: e.type, to: e.to })}`.slice(0, 24);
21048
- if (store.getEdge(id)) continue;
21049
- const redirected = {
21050
- ...e,
21051
- id,
21052
- from: survivor.id,
21053
- createdAt: ts,
21054
- lastSeenAt: ts
21055
- };
21056
- store.mergeEdge(redirected);
21057
- }
21058
- store.updateNode(dup.id, {
21059
- attrs: { ...dup.attrs, mergedInto: survivor.id, resolvedAs: "duplicate", resolvedAt: ts },
21060
- lastUpdatedAt: ts
21061
- });
21062
- store.closeNode(dup.id, ts);
21063
- }
21064
- var REDIRECT_EDGES;
21065
- var init_problem_dedup = __esm({
21066
- "../../packages/local-graph/src/problem-dedup.ts"() {
21067
- "use strict";
21068
- init_src();
21069
- init_src();
21070
- init_design_problem();
21071
- REDIRECT_EDGES = [
21072
- "CAUSED_BY",
21073
- "SOLVED_BY",
21074
- "FIXED_BY",
21075
- "ANCHORED_AT",
21076
- "MANIFESTED_IN",
21077
- "EVIDENCED_BY"
21078
- ];
21079
- }
21080
- });
21081
-
21082
21366
  // ../../packages/local-graph/src/tools.ts
21083
21367
  function toolNodeId(name2) {
21084
21368
  return `tool:${name2}`;
@@ -21282,6 +21566,7 @@ __export(src_exports2, {
21282
21566
  JOINT_COMMUNITY_EDGES: () => JOINT_COMMUNITY_EDGES,
21283
21567
  JOINT_COMMUNITY_LABELS: () => JOINT_COMMUNITY_LABELS,
21284
21568
  MAX_ANCHOR_FILES: () => MAX_ANCHOR_FILES,
21569
+ PATTERN_DEDUP_COSINE: () => PATTERN_DEDUP_COSINE,
21285
21570
  PERCOLATING_DRIFT_EDGES: () => PERCOLATING_DRIFT_EDGES,
21286
21571
  PERCOLATING_EDGES: () => PERCOLATING_EDGES,
21287
21572
  PERCOLATING_LABELS: () => PERCOLATING_LABELS,
@@ -21301,6 +21586,7 @@ __export(src_exports2, {
21301
21586
  buildPackageIndex: () => buildPackageIndex,
21302
21587
  buildPrincipleSync: () => buildPrincipleSync,
21303
21588
  buildSymbolIndex: () => buildSymbolIndex,
21589
+ canonicalizePatternText: () => canonicalizePatternText,
21304
21590
  causalChain: () => causalChain,
21305
21591
  claimId: () => claimId,
21306
21592
  clearRevisit: () => clearRevisit,
@@ -21316,6 +21602,7 @@ __export(src_exports2, {
21316
21602
  detectLocalCommunities: () => detectLocalCommunities,
21317
21603
  edgeConductance: () => edgeConductance,
21318
21604
  evaluateDependency: () => evaluateDependency,
21605
+ findMintTimeDuplicate: () => findMintTimeDuplicate,
21319
21606
  findOrCreatePackage: () => findOrCreatePackage,
21320
21607
  findPath: () => findPath,
21321
21608
  flattenCloudCounts: () => flattenCloudCounts,
@@ -21380,13 +21667,14 @@ __export(src_exports2, {
21380
21667
  solutionForProblem: () => solutionForProblem,
21381
21668
  splittingAxis: () => splittingAxis,
21382
21669
  stampObservedOs: () => stampObservedOs,
21670
+ statementIdentityKey: () => statementIdentityKey,
21383
21671
  staticConductance: () => staticConductance,
21384
21672
  toolNodeId: () => toolNodeId,
21385
21673
  toolPriorsFor: () => toolPriorsFor,
21386
21674
  triageOf: () => triageOf,
21387
21675
  walk: () => walk
21388
21676
  });
21389
- var init_src4 = __esm({
21677
+ var init_src5 = __esm({
21390
21678
  "../../packages/local-graph/src/index.ts"() {
21391
21679
  "use strict";
21392
21680
  init_store();
@@ -21908,7 +22196,7 @@ var RECALL_FIRST_HEADER, RECALL_FIRST_BODY, RECALL_FIRST_BLOCK, SEARCH_IMPERATIV
21908
22196
  var init_render = __esm({
21909
22197
  "../../packages/context-writer/src/render.ts"() {
21910
22198
  "use strict";
21911
- init_src4();
22199
+ init_src5();
21912
22200
  init_src2();
21913
22201
  RECALL_FIRST_HEADER = "## errata \u2014 recall before you work";
21914
22202
  RECALL_FIRST_BODY = "Before investigating any bug or error, your FIRST tool call must be `mcp__errata__errata_search` with a few words describing the problem. This machine's knowledge graph records previously solved problems \u2014 the answer may already be recorded. Read what it returns before touching any files.";
@@ -21986,8 +22274,8 @@ var init_bleed_memory = __esm({
21986
22274
  });
21987
22275
 
21988
22276
  // ../../packages/context-writer/src/bleed-rules.ts
21989
- import { existsSync as existsSync4, mkdirSync as mkdirSync3, readdirSync, readFileSync as readFileSync3, rmSync, writeFileSync as writeFileSync4 } from "node:fs";
21990
- import { join as join3 } from "node:path";
22277
+ import { existsSync as existsSync5, mkdirSync as mkdirSync4, readdirSync, readFileSync as readFileSync3, rmSync, writeFileSync as writeFileSync4 } from "node:fs";
22278
+ import { join as join4 } from "node:path";
21991
22279
  function formatRuleFile(item) {
21992
22280
  const frontmatter = item.paths && item.paths.length > 0 ? `---
21993
22281
  paths:
@@ -22000,21 +22288,21 @@ ${item.body.trim()}
22000
22288
  `;
22001
22289
  }
22002
22290
  function bleedRules(rulesDir, items) {
22003
- if (!existsSync4(rulesDir)) mkdirSync3(rulesDir, { recursive: true });
22291
+ if (!existsSync5(rulesDir)) mkdirSync4(rulesDir, { recursive: true });
22004
22292
  const wanted = new Map(items.map((i2) => [fileFor(i2.slug), i2]));
22005
22293
  let written = 0;
22006
22294
  let created = 0;
22007
22295
  for (const [file2, item] of wanted) {
22008
- const path2 = join3(rulesDir, file2);
22009
- if (!existsSync4(path2)) created++;
22296
+ const path2 = join4(rulesDir, file2);
22297
+ if (!existsSync5(path2)) created++;
22010
22298
  writeFileSync4(path2, formatRuleFile(item), "utf8");
22011
22299
  written++;
22012
22300
  }
22013
22301
  let pruned = 0;
22014
22302
  for (const f of readdirSync(rulesDir)) {
22015
22303
  if (!f.startsWith(PREFIX) || !f.endsWith(".md") || wanted.has(f)) continue;
22016
- if (readFileSync3(join3(rulesDir, f), "utf8").includes(MARKER)) {
22017
- rmSync(join3(rulesDir, f));
22304
+ if (readFileSync3(join4(rulesDir, f), "utf8").includes(MARKER)) {
22305
+ rmSync(join4(rulesDir, f));
22018
22306
  pruned++;
22019
22307
  }
22020
22308
  }
@@ -22097,7 +22385,7 @@ var init_select_durable_memory = __esm({
22097
22385
  });
22098
22386
 
22099
22387
  // ../../packages/context-writer/src/index.ts
22100
- var init_src5 = __esm({
22388
+ var init_src6 = __esm({
22101
22389
  "../../packages/context-writer/src/index.ts"() {
22102
22390
  "use strict";
22103
22391
  init_agents_md();
@@ -23052,7 +23340,7 @@ var init_pkce = __esm({
23052
23340
  });
23053
23341
 
23054
23342
  // ../../packages/cloud-client/src/index.ts
23055
- var init_src6 = __esm({
23343
+ var init_src7 = __esm({
23056
23344
  "../../packages/cloud-client/src/index.ts"() {
23057
23345
  "use strict";
23058
23346
  init_client();
@@ -23080,14 +23368,14 @@ function envPaths(name2, { suffix = "nodejs" } = {}) {
23080
23368
  }
23081
23369
  return linux(name2);
23082
23370
  }
23083
- var homedir, tmpdir, env, macos, windows, linux;
23371
+ var homedir2, tmpdir, env, macos, windows, linux;
23084
23372
  var init_env_paths = __esm({
23085
23373
  "../../node_modules/.pnpm/env-paths@3.0.0/node_modules/env-paths/index.js"() {
23086
- homedir = os.homedir();
23374
+ homedir2 = os.homedir();
23087
23375
  tmpdir = os.tmpdir();
23088
23376
  ({ env } = process3);
23089
23377
  macos = (name2) => {
23090
- const library = path.join(homedir, "Library");
23378
+ const library = path.join(homedir2, "Library");
23091
23379
  return {
23092
23380
  data: path.join(library, "Application Support", name2),
23093
23381
  config: path.join(library, "Preferences", name2),
@@ -23097,8 +23385,8 @@ var init_env_paths = __esm({
23097
23385
  };
23098
23386
  };
23099
23387
  windows = (name2) => {
23100
- const appData = env.APPDATA || path.join(homedir, "AppData", "Roaming");
23101
- const localAppData = env.LOCALAPPDATA || path.join(homedir, "AppData", "Local");
23388
+ const appData = env.APPDATA || path.join(homedir2, "AppData", "Roaming");
23389
+ const localAppData = env.LOCALAPPDATA || path.join(homedir2, "AppData", "Local");
23102
23390
  return {
23103
23391
  // Data/config/cache/log are invented by me as Windows isn't opinionated about this
23104
23392
  data: path.join(localAppData, name2, "Data"),
@@ -23109,13 +23397,13 @@ var init_env_paths = __esm({
23109
23397
  };
23110
23398
  };
23111
23399
  linux = (name2) => {
23112
- const username = path.basename(homedir);
23400
+ const username = path.basename(homedir2);
23113
23401
  return {
23114
- data: path.join(env.XDG_DATA_HOME || path.join(homedir, ".local", "share"), name2),
23115
- config: path.join(env.XDG_CONFIG_HOME || path.join(homedir, ".config"), name2),
23116
- cache: path.join(env.XDG_CACHE_HOME || path.join(homedir, ".cache"), name2),
23402
+ data: path.join(env.XDG_DATA_HOME || path.join(homedir2, ".local", "share"), name2),
23403
+ config: path.join(env.XDG_CONFIG_HOME || path.join(homedir2, ".config"), name2),
23404
+ cache: path.join(env.XDG_CACHE_HOME || path.join(homedir2, ".cache"), name2),
23117
23405
  // https://wiki.debian.org/XDGBaseDirectorySpecification#state
23118
- log: path.join(env.XDG_STATE_HOME || path.join(homedir, ".local", "state"), name2),
23406
+ log: path.join(env.XDG_STATE_HOME || path.join(homedir2, ".local", "state"), name2),
23119
23407
  temp: path.join(tmpdir, username, name2)
23120
23408
  };
23121
23409
  };
@@ -23135,34 +23423,34 @@ __export(paths_exports, {
23135
23423
  workspaceDir: () => workspaceDir,
23136
23424
  workspacePaths: () => workspacePaths
23137
23425
  });
23138
- import { mkdirSync as mkdirSync4 } from "node:fs";
23139
- import { dirname as dirname3, join as join4 } from "node:path";
23426
+ import { mkdirSync as mkdirSync5 } from "node:fs";
23427
+ import { dirname as dirname4, join as join5 } from "node:path";
23140
23428
  function globalDir() {
23141
23429
  const p = envPaths("errata", { suffix: "" });
23142
23430
  return p.config;
23143
23431
  }
23144
23432
  function globalConfigPath() {
23145
- return process.env["ERRATA_CONFIG_PATH"] ?? join4(globalDir(), "config.json");
23433
+ return process.env["ERRATA_CONFIG_PATH"] ?? join5(globalDir(), "config.json");
23146
23434
  }
23147
23435
  function daemonLogPath() {
23148
- mkdirSync4(globalDir(), { recursive: true });
23149
- return join4(globalDir(), "daemon.log");
23436
+ mkdirSync5(globalDir(), { recursive: true });
23437
+ return join5(globalDir(), "daemon.log");
23150
23438
  }
23151
23439
  function globalDaemonLock() {
23152
- return process.env["ERRATA_DAEMON_LOCK"] ?? join4(globalDir(), "daemon.lock");
23440
+ return process.env["ERRATA_DAEMON_LOCK"] ?? join5(globalDir(), "daemon.lock");
23153
23441
  }
23154
23442
  function sharedStorePath() {
23155
- return process.env["ERRATA_SHARED_DB"] ?? join4(globalDir(), "shared", "graph.db");
23443
+ return process.env["ERRATA_SHARED_DB"] ?? join5(globalDir(), "shared", "graph.db");
23156
23444
  }
23157
23445
  function workspaceDir(workspaceRoot) {
23158
- return join4(workspaceRoot, ".errata");
23446
+ return join5(workspaceRoot, ".errata");
23159
23447
  }
23160
23448
  function ensureDir(p) {
23161
- mkdirSync4(p, { recursive: true });
23449
+ mkdirSync5(p, { recursive: true });
23162
23450
  return p;
23163
23451
  }
23164
23452
  function ensureParent(p) {
23165
- mkdirSync4(dirname3(p), { recursive: true });
23453
+ mkdirSync5(dirname4(p), { recursive: true });
23166
23454
  return p;
23167
23455
  }
23168
23456
  function workspacePaths(root) {
@@ -23170,15 +23458,15 @@ function workspacePaths(root) {
23170
23458
  return {
23171
23459
  root,
23172
23460
  configDir: dir,
23173
- workspaceJson: join4(dir, "workspace.json"),
23174
- eventLog: join4(dir, "eventlog.sqlite"),
23175
- castalia: join4(dir, "castalia.db"),
23176
- reviewQueue: join4(dir, "review-queue.json"),
23177
- outbox: join4(dir, "outbox"),
23178
- daemonLock: join4(dir, "daemon.lock"),
23179
- identityAudit: join4(dir, "identity-audit.log"),
23180
- skillsDir: join4(dir, "skills"),
23181
- skillsManifest: join4(dir, "skills.json")
23461
+ workspaceJson: join5(dir, "workspace.json"),
23462
+ eventLog: join5(dir, "eventlog.sqlite"),
23463
+ castalia: join5(dir, "castalia.db"),
23464
+ reviewQueue: join5(dir, "review-queue.json"),
23465
+ outbox: join5(dir, "outbox"),
23466
+ daemonLock: join5(dir, "daemon.lock"),
23467
+ identityAudit: join5(dir, "identity-audit.log"),
23468
+ skillsDir: join5(dir, "skills"),
23469
+ skillsManifest: join5(dir, "skills.json")
23182
23470
  };
23183
23471
  }
23184
23472
  var init_paths = __esm({
@@ -23189,7 +23477,7 @@ var init_paths = __esm({
23189
23477
  });
23190
23478
 
23191
23479
  // src/config.ts
23192
- import { existsSync as existsSync5, readFileSync as readFileSync4, writeFileSync as writeFileSync5 } from "node:fs";
23480
+ import { existsSync as existsSync6, readFileSync as readFileSync4, writeFileSync as writeFileSync5 } from "node:fs";
23193
23481
  import { randomUUID as randomUUID2 } from "node:crypto";
23194
23482
  function defaultConfig() {
23195
23483
  return {
@@ -23217,7 +23505,7 @@ function defaultConfig() {
23217
23505
  }
23218
23506
  function loadConfig() {
23219
23507
  const p = globalConfigPath();
23220
- if (!existsSync5(p)) {
23508
+ if (!existsSync6(p)) {
23221
23509
  ensureDir(globalDir());
23222
23510
  const cfg = defaultConfig();
23223
23511
  saveConfig({ ...cfg, cloudUrl: DEFAULT_CLOUD_URL });
@@ -23678,7 +23966,7 @@ function hasCloudCredential(cfg) {
23678
23966
  var init_cloud_auth = __esm({
23679
23967
  "src/cloud-auth.ts"() {
23680
23968
  "use strict";
23681
- init_src6();
23969
+ init_src7();
23682
23970
  init_config();
23683
23971
  init_cloud_endpoint_policy();
23684
23972
  }
@@ -25934,7 +26222,7 @@ function buildAgentInstruction(opts = {}) {
25934
26222
  const ref = opts.referent ?? "its-handle";
25935
26223
  const token = (s) => s === "problem" ? TAG_EXAMPLE.problem() : s === "constraint" ? TAG_EXAMPLE.constraint() : s === "attempt" ? TAG_EXAMPLE.tried() : s === "domain" ? TAG_EXAMPLE.domain() : s === "link" ? TAG_EXAMPLE.pattern() : TAG_EXAMPLE[s](ref);
25936
26224
  const head2 = `We tag the priors we show you with a short handle like [${opts.handleExample ?? "chokidar-glob"}]. Tags are the ONLY signal recorded \u2014 anything you state but don't tag is silently lost. Weave each tag inline in your prose as you state it (no fences or backticks, no extra calls); tag everything, we filter downstream:`;
25937
- const tail = "Mid-turn text (between tool calls) can be dropped by the harness \u2014 RESTATE every tag in your turn-final message; the final message is what reliably survives.";
26225
+ const tail = "Mid-turn text (between tool calls) can be dropped by the harness \u2014 RESTATE every tag in your turn-final message; the final message is what reliably survives \u2014 EXCEPT one already shown above with an id: that is captured, so cite `[its-handle]` rather than retyping it (drift mints a duplicate).";
25938
26226
  return [
25939
26227
  head2,
25940
26228
  ...signals.map(
@@ -26023,9 +26311,9 @@ var init_agent_signals = __esm({
26023
26311
  });
26024
26312
 
26025
26313
  // src/review.ts
26026
- import { existsSync as existsSync6, readFileSync as readFileSync5, writeFileSync as writeFileSync6 } from "node:fs";
26314
+ import { existsSync as existsSync7, readFileSync as readFileSync5, writeFileSync as writeFileSync6 } from "node:fs";
26027
26315
  function loadReviewQueue(paths) {
26028
- if (!existsSync6(paths.reviewQueue)) return [];
26316
+ if (!existsSync7(paths.reviewQueue)) return [];
26029
26317
  try {
26030
26318
  return JSON.parse(readFileSync5(paths.reviewQueue, "utf8"));
26031
26319
  } catch {
@@ -26320,7 +26608,7 @@ __export(src_exports3, {
26320
26608
  recheck: () => recheck,
26321
26609
  scrub: () => scrub
26322
26610
  });
26323
- var init_src7 = __esm({
26611
+ var init_src8 = __esm({
26324
26612
  "../../packages/canonical/src/index.ts"() {
26325
26613
  "use strict";
26326
26614
  init_scrub();
@@ -26346,7 +26634,7 @@ var TOKEN_RULES;
26346
26634
  var init_generalize = __esm({
26347
26635
  "../../packages/privacy-edge/src/generalize.ts"() {
26348
26636
  "use strict";
26349
- init_src7();
26637
+ init_src8();
26350
26638
  init_date_shapes();
26351
26639
  init_ontology();
26352
26640
  TOKEN_RULES = [
@@ -26364,7 +26652,7 @@ var init_generalize = __esm({
26364
26652
  });
26365
26653
 
26366
26654
  // ../../packages/privacy-edge/src/index.ts
26367
- var init_src8 = __esm({
26655
+ var init_src9 = __esm({
26368
26656
  "../../packages/privacy-edge/src/index.ts"() {
26369
26657
  "use strict";
26370
26658
  init_ontology();
@@ -26427,7 +26715,7 @@ var SYMBOL_LABELS2, KIND_PHRASE, RE_RESERVED2, escapeRe4, TOKEN_RE3;
26427
26715
  var init_generalize_graph = __esm({
26428
26716
  "src/generalize-graph.ts"() {
26429
26717
  "use strict";
26430
- init_src8();
26718
+ init_src9();
26431
26719
  init_src();
26432
26720
  SYMBOL_LABELS2 = [
26433
26721
  ["Function", "function"],
@@ -26680,207 +26968,6 @@ var init_dual_augment = __esm({
26680
26968
  }
26681
26969
  });
26682
26970
 
26683
- // ../../packages/embedding/src/model.ts
26684
- import { mkdirSync as mkdirSync5, existsSync as existsSync7 } from "node:fs";
26685
- import { homedir as homedir2 } from "node:os";
26686
- import { dirname as dirname4, join as join5 } from "node:path";
26687
- import { createRequire } from "node:module";
26688
- function semanticFloorFor(version2) {
26689
- if (version2 === EMBEDDING_VERSION || version2 === MODEL_EMBEDDING_VERSION) return 0.25;
26690
- return 0.5;
26691
- }
26692
- function noteHashFallback() {
26693
- if (warnedHashFallback) return;
26694
- if (process.env["ERRATA_EMBED_HASH_ONLY"] === "1") return;
26695
- warnedHashFallback = true;
26696
- console.warn(
26697
- `[errata] embedding model unavailable (${lastError?.message ?? "unknown"}) \u2014 falling back to ${EMBEDDING_VERSION} hash vectors; semantic ranking runs at reduced fidelity`
26698
- );
26699
- }
26700
- function getCacheDir() {
26701
- return process.env["ERRATA_MODEL_CACHE"] ?? join5(homedir2(), ".errata", "models");
26702
- }
26703
- async function loadTransformers() {
26704
- try {
26705
- return await import("@huggingface/transformers");
26706
- } catch (err2) {
26707
- void err2;
26708
- }
26709
- try {
26710
- const seaResourceBase = join5(
26711
- // execPath dir is where errata.exe lives; resources/ rides alongside.
26712
- dirname4(process.execPath),
26713
- "resources",
26714
- "_resolve.js"
26715
- );
26716
- const resourceRequire = createRequire(seaResourceBase);
26717
- return resourceRequire("@huggingface/transformers");
26718
- } catch (err2) {
26719
- lastError = err2 instanceof Error ? err2 : new Error(String(err2));
26720
- return null;
26721
- }
26722
- }
26723
- async function loadPipeline() {
26724
- const cacheDir = getCacheDir();
26725
- if (!existsSync7(cacheDir)) mkdirSync5(cacheDir, { recursive: true });
26726
- try {
26727
- const tx = await loadTransformers();
26728
- if (!tx) {
26729
- throw lastError ?? new Error("transformers package unavailable");
26730
- }
26731
- tx.env.cacheDir = cacheDir;
26732
- tx.env.useFSCache = true;
26733
- tx.env.allowLocalModels = true;
26734
- tx.env.allowRemoteModels = process.env["ERRATA_OFFLINE"] !== "1";
26735
- const pipe2 = await tx.pipeline("feature-extraction", MODEL_NAME, {
26736
- // Quantized weights cut size 4x; quality drop is negligible for
26737
- // short-text similarity. Override via env if you want full
26738
- // precision.
26739
- dtype: process.env["ERRATA_MODEL_DTYPE"] ?? "q8"
26740
- });
26741
- return pipe2;
26742
- } catch (err2) {
26743
- lastError = err2 instanceof Error ? err2 : new Error(String(err2));
26744
- return null;
26745
- }
26746
- }
26747
- async function ensureModelLoaded() {
26748
- if (!pipelinePromise) {
26749
- pipelinePromise = loadPipeline();
26750
- }
26751
- return pipelinePromise;
26752
- }
26753
- async function embedTextWithModel(text) {
26754
- const pipe2 = await ensureModelLoaded();
26755
- if (!pipe2) {
26756
- throw new Error(
26757
- `embedding model could not be loaded: ${lastError?.message ?? "unknown"}`
26758
- );
26759
- }
26760
- if (!text) return new Array(MODEL_EMBEDDING_DIM).fill(0);
26761
- const out2 = await pipe2(text, { pooling: "mean", normalize: true });
26762
- return Array.from(out2.data);
26763
- }
26764
- async function embedBatchWithModelOrHash(texts) {
26765
- if (texts.length === 0) return [];
26766
- if (process.env["ERRATA_EMBED_HASH_ONLY"] === "1") {
26767
- return texts.map((t) => {
26768
- const v = embed(t);
26769
- return { vector: v, version: EMBEDDING_VERSION, dim: v.length };
26770
- });
26771
- }
26772
- try {
26773
- const pipe2 = await ensureModelLoaded();
26774
- if (pipe2) {
26775
- const out2 = await pipe2(texts, {
26776
- pooling: "mean",
26777
- normalize: true
26778
- });
26779
- const dim = out2.dims[out2.dims.length - 1] ?? MODEL_EMBEDDING_DIM;
26780
- const total = texts.length;
26781
- const results = [];
26782
- for (let i2 = 0; i2 < total; i2++) {
26783
- const v = Array.from(out2.data.subarray(i2 * dim, (i2 + 1) * dim));
26784
- results.push({ vector: v, version: MODEL_EMBEDDING_VERSION, dim });
26785
- }
26786
- return results;
26787
- }
26788
- } catch {
26789
- }
26790
- noteHashFallback();
26791
- return texts.map((t) => {
26792
- const v = embed(t);
26793
- return { vector: v, version: EMBEDDING_VERSION, dim: v.length };
26794
- });
26795
- }
26796
- async function embedTextWithModelOrHash(text) {
26797
- if (process.env["ERRATA_EMBED_HASH_ONLY"] === "1") {
26798
- const v = embed(text);
26799
- return { vector: v, version: EMBEDDING_VERSION, dim: v.length };
26800
- }
26801
- try {
26802
- const v = await embedTextWithModel(text);
26803
- return { vector: v, version: MODEL_EMBEDDING_VERSION, dim: v.length };
26804
- } catch {
26805
- noteHashFallback();
26806
- const v = embed(text);
26807
- return { vector: v, version: EMBEDDING_VERSION, dim: v.length };
26808
- }
26809
- }
26810
- var MODEL_NAME, MODEL_EMBEDDING_DIM, MODEL_EMBEDDING_VERSION, pipelinePromise, lastError, warnedHashFallback;
26811
- var init_model = __esm({
26812
- "../../packages/embedding/src/model.ts"() {
26813
- "use strict";
26814
- init_src9();
26815
- MODEL_NAME = "Xenova/all-MiniLM-L6-v2";
26816
- MODEL_EMBEDDING_DIM = 384;
26817
- MODEL_EMBEDDING_VERSION = "minilm-l6-v2";
26818
- pipelinePromise = null;
26819
- lastError = null;
26820
- warnedHashFallback = false;
26821
- }
26822
- });
26823
-
26824
- // ../../packages/embedding/src/index.ts
26825
- function djb2(s) {
26826
- let h = 5381;
26827
- for (let i2 = 0; i2 < s.length; i2++) {
26828
- h = (h << 5) + h + s.charCodeAt(i2) >>> 0;
26829
- }
26830
- return h;
26831
- }
26832
- function djb2Signed(s) {
26833
- let h = 0;
26834
- for (let i2 = 0; i2 < s.length; i2++) {
26835
- h = h * 31 + s.charCodeAt(i2) | 0;
26836
- }
26837
- return h;
26838
- }
26839
- function tokenize(text) {
26840
- return text.toLowerCase().split(/[^a-z0-9]+/).filter((t) => t.length > 0 && t.length <= 40);
26841
- }
26842
- function* charTrigrams(text) {
26843
- const s = text.toLowerCase();
26844
- for (let i2 = 0; i2 <= s.length - 3; i2++) {
26845
- yield s.slice(i2, i2 + 3);
26846
- }
26847
- }
26848
- function embed(text) {
26849
- const vec = new Array(EMBEDDING_DIM).fill(0);
26850
- if (!text) return vec;
26851
- for (const tok of tokenize(text)) {
26852
- const idx = djb2(tok) % EMBEDDING_DIM;
26853
- const sign = djb2Signed(tok) & 1 ? 1 : -1;
26854
- vec[idx] = vec[idx] + sign;
26855
- }
26856
- for (const tri of charTrigrams(text)) {
26857
- const idx = djb2("3:" + tri) % EMBEDDING_DIM;
26858
- const sign = djb2Signed("3:" + tri) & 1 ? 1 : -1;
26859
- vec[idx] = vec[idx] + 0.5 * sign;
26860
- }
26861
- let normSq = 0;
26862
- for (const x of vec) normSq += x * x;
26863
- if (normSq <= 0) return vec;
26864
- const inv = 1 / Math.sqrt(normSq);
26865
- for (let i2 = 0; i2 < vec.length; i2++) vec[i2] = vec[i2] * inv;
26866
- return vec;
26867
- }
26868
- function cosine(a, b) {
26869
- if (a.length !== b.length || a.length === 0) return 0;
26870
- let dot = 0;
26871
- for (let i2 = 0; i2 < a.length; i2++) dot += a[i2] * b[i2];
26872
- return dot;
26873
- }
26874
- var EMBEDDING_DIM, EMBEDDING_VERSION;
26875
- var init_src9 = __esm({
26876
- "../../packages/embedding/src/index.ts"() {
26877
- "use strict";
26878
- init_model();
26879
- EMBEDDING_DIM = 256;
26880
- EMBEDDING_VERSION = "hash-v1";
26881
- }
26882
- });
26883
-
26884
26971
  // ../../packages/generalizer/src/review-detector.ts
26885
26972
  function evaluateForReview(node2, prevTier) {
26886
26973
  if (node2.cumulativeSurprise >= REVIEW_SURPRISE_THRESHOLD) {
@@ -26897,7 +26984,7 @@ function evaluateForReview(node2, prevTier) {
26897
26984
  var init_review_detector = __esm({
26898
26985
  "../../packages/generalizer/src/review-detector.ts"() {
26899
26986
  "use strict";
26900
- init_src3();
26987
+ init_src4();
26901
26988
  }
26902
26989
  });
26903
26990
 
@@ -26920,7 +27007,7 @@ function nemoriDecide(input) {
26920
27007
  var init_nemori_gate = __esm({
26921
27008
  "../../packages/generalizer/src/nemori-gate.ts"() {
26922
27009
  "use strict";
26923
- init_src3();
27010
+ init_src4();
26924
27011
  }
26925
27012
  });
26926
27013
 
@@ -27953,11 +28040,11 @@ var init_generalizer = __esm({
27953
28040
  "../../packages/generalizer/src/generalizer.ts"() {
27954
28041
  "use strict";
27955
28042
  init_src2();
28043
+ init_src4();
27956
28044
  init_src3();
27957
- init_src9();
27958
28045
  init_src();
27959
28046
  init_src();
27960
- init_src4();
28047
+ init_src5();
27961
28048
  init_review_detector();
27962
28049
  init_nemori_gate();
27963
28050
  init_diagnostic_matcher();
@@ -28082,7 +28169,7 @@ var init_motifs = __esm({
28082
28169
  "../../packages/generalizer/src/motifs.ts"() {
28083
28170
  "use strict";
28084
28171
  init_src2();
28085
- init_src3();
28172
+ init_src4();
28086
28173
  init_src();
28087
28174
  MEMBER_LABELS = ["Problem", "RootCause", "Solution"];
28088
28175
  }
@@ -28219,8 +28306,8 @@ var init_nightly = __esm({
28219
28306
  "../../packages/generalizer/src/nightly.ts"() {
28220
28307
  "use strict";
28221
28308
  init_src2();
28222
- init_src3();
28223
28309
  init_src4();
28310
+ init_src5();
28224
28311
  init_motifs();
28225
28312
  }
28226
28313
  });
@@ -28342,7 +28429,7 @@ var CODE_LABELS, SEMANTIC_LABELS, BATCH_SIZE;
28342
28429
  var init_embed_code = __esm({
28343
28430
  "../../packages/generalizer/src/embed-code.ts"() {
28344
28431
  "use strict";
28345
- init_src9();
28432
+ init_src3();
28346
28433
  CODE_LABELS = ["Function", "Method", "Class", "Const"];
28347
28434
  SEMANTIC_LABELS = ["Problem", "RootCause", "Solution", "Pattern", "Claim"];
28348
28435
  BATCH_SIZE = 32;
@@ -28449,8 +28536,8 @@ function localBurst(store, seedId, opts = {}) {
28449
28536
  var init_relevance_rank = __esm({
28450
28537
  "../../packages/generalizer/src/relevance-rank.ts"() {
28451
28538
  "use strict";
28452
- init_src9();
28453
28539
  init_src3();
28540
+ init_src4();
28454
28541
  }
28455
28542
  });
28456
28543
 
@@ -37923,7 +38010,7 @@ var init_mcp = __esm({
37923
38010
  init_cloud_auth();
37924
38011
  init_config();
37925
38012
  init_dual_augment();
37926
- init_src4();
38013
+ init_src5();
37927
38014
  init_src2();
37928
38015
  init_src10();
37929
38016
  init_dual_burst();
@@ -46879,7 +46966,7 @@ var init_tool_index = __esm({
46879
46966
  "use strict";
46880
46967
  init_src();
46881
46968
  init_src();
46882
- init_src4();
46969
+ init_src5();
46883
46970
  init_tldr_tools_generated();
46884
46971
  PUBLIC_TOOLS = new Set(TLDR_TOOL_NAMES);
46885
46972
  PLUMBING = /* @__PURE__ */ new Set([
@@ -47620,8 +47707,8 @@ var init_webui = __esm({
47620
47707
  "src/webui.ts"() {
47621
47708
  "use strict";
47622
47709
  init_dist();
47710
+ init_src6();
47623
47711
  init_src5();
47624
- init_src4();
47625
47712
  init_agent_signals();
47626
47713
  init_review2();
47627
47714
  init_vfile();
@@ -48092,7 +48179,7 @@ var init_report_render = __esm({
48092
48179
  });
48093
48180
 
48094
48181
  // src/cli.ts
48095
- init_src5();
48182
+ init_src6();
48096
48183
  import { closeSync as closeSync2, existsSync as existsSync27, openSync as openSync2, readFileSync as readFileSync26, renameSync as renameSync4, statSync as statSync6 } from "node:fs";
48097
48184
  import { join as join30 } from "node:path";
48098
48185
  import { spawn as spawn3 } from "node:child_process";
@@ -50375,7 +50462,7 @@ var esm_default = { watch, FSWatcher };
50375
50462
  // src/engine.ts
50376
50463
  init_src();
50377
50464
  init_src2();
50378
- init_src4();
50465
+ init_src5();
50379
50466
 
50380
50467
  // ../../packages/eventlog/src/store.ts
50381
50468
  init_src2();
@@ -50536,7 +50623,7 @@ function openEventLog(opts) {
50536
50623
 
50537
50624
  // src/engine.ts
50538
50625
  init_src11();
50539
- init_src5();
50626
+ init_src6();
50540
50627
  init_src10();
50541
50628
  init_review2();
50542
50629
 
@@ -50779,7 +50866,7 @@ init_src();
50779
50866
  init_src2();
50780
50867
  init_agent_signals();
50781
50868
  init_tool_index();
50782
- init_src4();
50869
+ init_src5();
50783
50870
  import { readFileSync as readFileSync10, writeFileSync as writeFileSync10 } from "node:fs";
50784
50871
  var NEG = /n['']t|\b(?:not|never|no|none|neither|nor|unrelated|irrelevant|would|might|could|if)\b/i;
50785
50872
  var CITE_GROUP_RE = /\(((?:[^()\n]|\([^()\n]*\)){1,200})\)/g;
@@ -51523,7 +51610,7 @@ ${conversation}` }]
51523
51610
  }
51524
51611
 
51525
51612
  // src/constraint-backfill.ts
51526
- init_src4();
51613
+ init_src5();
51527
51614
  init_src2();
51528
51615
  import { existsSync as existsSync13, readFileSync as readFileSync11, readdirSync as readdirSync6, writeFileSync as writeFileSync11 } from "node:fs";
51529
51616
  import { join as join16 } from "node:path";
@@ -51692,7 +51779,7 @@ function backfillConstraintKind(store, opts) {
51692
51779
 
51693
51780
  // src/edge-repair.ts
51694
51781
  init_src();
51695
- init_src4();
51782
+ init_src5();
51696
51783
  import { existsSync as existsSync14, readFileSync as readFileSync12, writeFileSync as writeFileSync12 } from "node:fs";
51697
51784
  import { join as join17 } from "node:path";
51698
51785
  function citeEdgeId(from, type, to) {
@@ -51969,7 +52056,7 @@ var PassWorker = class {
51969
52056
  init_outbox();
51970
52057
 
51971
52058
  // src/claim-sync.ts
51972
- init_src8();
52059
+ init_src9();
51973
52060
  init_src();
51974
52061
  init_src2();
51975
52062
  import { readFileSync as readFileSync13 } from "node:fs";
@@ -53411,7 +53498,7 @@ function startLoopLagMonitor(thresholdMs = 1e3) {
53411
53498
  }
53412
53499
 
53413
53500
  // src/engine.ts
53414
- var DAEMON_VERSION = true ? "2.0.2-dev.417" : "2.0.0-alpha.0";
53501
+ var DAEMON_VERSION = true ? "2.0.2-dev.455" : "2.0.0-alpha.0";
53415
53502
  var IGNORED_PATH = /[\\/](?:\.git|node_modules|\.errata|\.claude|\.codex|\.cursor|\.turbo|\.next|dist|coverage|test-results|playwright-report|__pycache__)(?:[\\/]|$)/;
53416
53503
  var IGNORED_NOISE = /castalia\.db|eventlog\.sqlite|turn-cursors/;
53417
53504
  var GIT_OP_MUTE_MS = 4e3;
@@ -55122,11 +55209,11 @@ function pidAlive(pid) {
55122
55209
 
55123
55210
  // src/multi.ts
55124
55211
  init_dist();
55125
- init_src4();
55212
+ init_src5();
55126
55213
  import { readFileSync as readFileSync25, unlinkSync as unlinkSync3, writeFileSync as writeFileSync21 } from "node:fs";
55127
55214
 
55128
55215
  // src/principle-sync.ts
55129
- init_src4();
55216
+ init_src5();
55130
55217
  async function syncPrinciples(store, cloud, opts) {
55131
55218
  const mine = buildPrincipleSync(store, opts.machine);
55132
55219
  let pushed = 0;
@@ -55320,12 +55407,12 @@ function runLockfilePass(opts) {
55320
55407
  // src/instance-ingest.ts
55321
55408
  init_src();
55322
55409
  init_src2();
55323
- init_src4();
55324
- init_src8();
55410
+ init_src5();
55411
+ init_src9();
55325
55412
  init_src();
55326
55413
 
55327
55414
  // src/contribution-ready.ts
55328
- init_src3();
55415
+ init_src4();
55329
55416
  function cosine4(a, b) {
55330
55417
  if (a.length === 0 || a.length !== b.length) return 0;
55331
55418
  let dot = 0;
@@ -57080,9 +57167,9 @@ async function startMultiDaemon(opts = {}) {
57080
57167
  }
57081
57168
 
57082
57169
  // src/cli.ts
57083
- init_src4();
57170
+ init_src5();
57084
57171
  init_config();
57085
- init_src6();
57172
+ init_src7();
57086
57173
  init_cloud_auth();
57087
57174
 
57088
57175
  // src/agent-switch.ts
@@ -57195,7 +57282,7 @@ function errText(err2) {
57195
57282
  init_cloud_endpoint_policy();
57196
57283
 
57197
57284
  // src/oauth-login.ts
57198
- init_src6();
57285
+ init_src7();
57199
57286
  init_cloud_auth();
57200
57287
  import { createServer } from "node:http";
57201
57288
  var DEFAULT_OAUTH_SCOPE = "openid profile graph:read graph:write mcp:tools";
@@ -57420,7 +57507,7 @@ async function loginOAuthLoopback(opts) {
57420
57507
  }
57421
57508
 
57422
57509
  // src/device-login.ts
57423
- init_src6();
57510
+ init_src7();
57424
57511
  var DEFAULT_SCOPE = "openid profile graph:read graph:write mcp:tools";
57425
57512
  var BRIDGE_REDIRECT_URI = "http://127.0.0.1:1/device-bridge-callback";
57426
57513
  var strip2 = (u) => u.replace(/\/+$/, "");
@@ -58226,7 +58313,7 @@ async function cmdStatus() {
58226
58313
  console.log(` event log: ${existsSync27(paths.eventLog) ? "yes" : "no"} (${paths.eventLog})`);
58227
58314
  if (existsSync27(paths.castalia)) {
58228
58315
  try {
58229
- const { openGraphStore: openGraphStore2 } = await Promise.resolve().then(() => (init_src4(), src_exports2));
58316
+ const { openGraphStore: openGraphStore2 } = await Promise.resolve().then(() => (init_src5(), src_exports2));
58230
58317
  const store = openGraphStore2({ path: paths.castalia });
58231
58318
  try {
58232
58319
  let pending = 0;
@@ -58974,7 +59061,7 @@ async function cmdLocate(relPath) {
58974
59061
  process.exit(2);
58975
59062
  }
58976
59063
  await ensureProfile();
58977
- const { openGraphStore: openGraphStore2 } = await Promise.resolve().then(() => (init_src4(), src_exports2));
59064
+ const { openGraphStore: openGraphStore2 } = await Promise.resolve().then(() => (init_src5(), src_exports2));
58978
59065
  const { workspacePaths: workspacePaths2 } = await Promise.resolve().then(() => (init_paths(), paths_exports));
58979
59066
  const paths = workspacePaths2(ROOT);
58980
59067
  const store = openGraphStore2({ path: paths.castalia });
@@ -59024,7 +59111,7 @@ async function cmdNeighbors(args2) {
59024
59111
  const depthIdx = args2.indexOf("--depth");
59025
59112
  const depth = depthIdx >= 0 && args2[depthIdx + 1] ? Math.max(1, Math.min(5, Number(args2[depthIdx + 1]))) : 2;
59026
59113
  await ensureProfile();
59027
- const { openGraphStore: openGraphStore2 } = await Promise.resolve().then(() => (init_src4(), src_exports2));
59114
+ const { openGraphStore: openGraphStore2 } = await Promise.resolve().then(() => (init_src5(), src_exports2));
59028
59115
  const { workspacePaths: workspacePaths2 } = await Promise.resolve().then(() => (init_paths(), paths_exports));
59029
59116
  const paths = workspacePaths2(ROOT);
59030
59117
  const store = openGraphStore2({ path: paths.castalia });
@@ -59072,7 +59159,7 @@ async function cmdNeighbors(args2) {
59072
59159
  }
59073
59160
  async function cmdTodos() {
59074
59161
  await ensureProfile();
59075
- const { openGraphStore: openGraphStore2 } = await Promise.resolve().then(() => (init_src4(), src_exports2));
59162
+ const { openGraphStore: openGraphStore2 } = await Promise.resolve().then(() => (init_src5(), src_exports2));
59076
59163
  const { workspacePaths: workspacePaths2 } = await Promise.resolve().then(() => (init_paths(), paths_exports));
59077
59164
  const paths = workspacePaths2(ROOT);
59078
59165
  const store = openGraphStore2({ path: paths.castalia });
@@ -59111,7 +59198,7 @@ async function cmdTodos() {
59111
59198
  async function cmdBackfillAnchors() {
59112
59199
  const profile = loadProfile(ROOT);
59113
59200
  await ensureProfile();
59114
- const { anchorSolutionToDiff: anchorSolutionToDiff2, anchorProblemToDiff: anchorProblemToDiff2, deriveContextFromAnchors: deriveContextFromAnchors2 } = await Promise.resolve().then(() => (init_src4(), src_exports2));
59201
+ const { anchorSolutionToDiff: anchorSolutionToDiff2, anchorProblemToDiff: anchorProblemToDiff2, deriveContextFromAnchors: deriveContextFromAnchors2 } = await Promise.resolve().then(() => (init_src5(), src_exports2));
59115
59202
  const { bindCanonicalNeighbors: bindCanonicalNeighbors2 } = await Promise.resolve().then(() => (init_src10(), src_exports4));
59116
59203
  const { digest: digest2 } = await Promise.resolve().then(() => (init_src(), src_exports));
59117
59204
  await withStore(async (store) => {
@@ -59187,7 +59274,7 @@ async function cmdBackfillAnchors() {
59187
59274
  }
59188
59275
  async function withStore(fn) {
59189
59276
  await ensureProfile();
59190
- const { openGraphStore: openGraphStore2 } = await Promise.resolve().then(() => (init_src4(), src_exports2));
59277
+ const { openGraphStore: openGraphStore2 } = await Promise.resolve().then(() => (init_src5(), src_exports2));
59191
59278
  const { workspacePaths: workspacePaths2 } = await Promise.resolve().then(() => (init_paths(), paths_exports));
59192
59279
  const paths = workspacePaths2(ROOT);
59193
59280
  const store = openGraphStore2({ path: paths.castalia });
@@ -59581,7 +59668,7 @@ async function gatherRepo(store, ws) {
59581
59668
  }
59582
59669
  async function gatherReportData(generatedAt) {
59583
59670
  const { existsSync: existsSync28 } = await import("node:fs");
59584
- const { openGraphStore: openGraphStore2 } = await Promise.resolve().then(() => (init_src4(), src_exports2));
59671
+ const { openGraphStore: openGraphStore2 } = await Promise.resolve().then(() => (init_src5(), src_exports2));
59585
59672
  const cfg = loadConfig();
59586
59673
  const outbound = cfg.consent.sync ? "auto" : "off";
59587
59674
  const repos = [];
@@ -60381,7 +60468,7 @@ async function cmdFeedback(args2) {
60381
60468
  console.error('usage: errata feedback [up|down] "<message>"');
60382
60469
  process.exit(2);
60383
60470
  }
60384
- const { scrub: scrub2 } = await Promise.resolve().then(() => (init_src7(), src_exports3));
60471
+ const { scrub: scrub2 } = await Promise.resolve().then(() => (init_src8(), src_exports3));
60385
60472
  const scrubbed = scrub2(message).text;
60386
60473
  const c = authedCloudClient(cfg);
60387
60474
  try {