@inerrata-corporation/errata 2.0.2-dev.710 → 2.0.2-dev.720

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 +99 -12
  2. package/package.json +1 -1
package/errata.mjs CHANGED
@@ -15447,6 +15447,15 @@ function extractIdentifierTokens(text) {
15447
15447
  }
15448
15448
  return out2;
15449
15449
  }
15450
+ function sidecarDropBucket(reason) {
15451
+ if (reason === null) return null;
15452
+ if (reason === "empty summary") return "empty";
15453
+ if (reason === "summary too long") return "too_long";
15454
+ if (reason === "contains a path shape") return "path_shape";
15455
+ if (reason === "contains a quoted literal") return "quoted_literal";
15456
+ if (reason.startsWith("contains verbatim identifier")) return "verbatim_identifier";
15457
+ return "other";
15458
+ }
15450
15459
  function summaryRejectionReason(summary, isKnownToken) {
15451
15460
  if (!summary.trim()) return "empty summary";
15452
15461
  if (summary.length > MAX_SYMBOL_SUMMARY_CHARS) return "summary too long";
@@ -15470,15 +15479,18 @@ function summaryRejectionReason(summary, isKnownToken) {
15470
15479
  return null;
15471
15480
  }
15472
15481
  function substituteSymbolSummaries(text, summaryByToken) {
15473
- if (summaryByToken.size === 0) return text;
15482
+ if (summaryByToken.size === 0) return { text, substituted: 0, offered: 0 };
15474
15483
  const present = extractIdentifierTokens(text).filter((t) => summaryByToken.has(t));
15475
15484
  present.sort((a, b) => b.length - a.length);
15476
15485
  let out2 = text;
15486
+ let substituted = 0;
15477
15487
  for (const key of present) {
15478
15488
  const re = new RegExp(`(?<![A-Za-z0-9_$.])${escapeRe2(key)}(?![A-Za-z0-9_$])`, "g");
15489
+ const before = out2;
15479
15490
  out2 = out2.replace(re, summaryByToken.get(key));
15491
+ if (out2 !== before) substituted++;
15480
15492
  }
15481
- return out2;
15493
+ return { text: out2, substituted, offered: summaryByToken.size };
15482
15494
  }
15483
15495
  function vetSidecarSummaries(sidecar) {
15484
15496
  if (!sidecar) return null;
@@ -16062,6 +16074,7 @@ __export(src_exports, {
16062
16074
  retrievalTokens: () => retrievalTokens,
16063
16075
  sha256: () => sha256,
16064
16076
  sha256Short: () => sha256Short,
16077
+ sidecarDropBucket: () => sidecarDropBucket,
16065
16078
  splitPnpmKey: () => splitPnpmKey,
16066
16079
  substituteSymbolSummaries: () => substituteSymbolSummaries,
16067
16080
  summarizeIngestResult: () => summarizeIngestResult,
@@ -27834,8 +27847,15 @@ function fileRolePhrase(relPath, level = 1) {
27834
27847
  if (/\.(json|ya?ml|toml|env)$/i.test(relPath)) return "a config file";
27835
27848
  return "a source file";
27836
27849
  }
27850
+ function isSourceFileToken(token) {
27851
+ const basename5 = token.split(/[/\\]/).pop() ?? token;
27852
+ if (CONVENTION_FILENAMES.has(basename5)) return false;
27853
+ const ext = basename5.split(".").pop();
27854
+ return ext !== void 0 && SOURCE_EXTENSIONS.has(ext.toLowerCase());
27855
+ }
27837
27856
  function generalizeFileRefs(text, fileLexicon, level = 1) {
27838
27857
  let out2 = text;
27858
+ let lexiconMisses = 0;
27839
27859
  const files = [];
27840
27860
  const seenFiles = /* @__PURE__ */ new Set();
27841
27861
  for (const m of out2.matchAll(FILE_TOKEN_RE)) {
@@ -27844,6 +27864,7 @@ function generalizeFileRefs(text, fileLexicon, level = 1) {
27844
27864
  seenFiles.add(tok);
27845
27865
  const entry = resolveFileToken(tok, fileLexicon);
27846
27866
  if (entry) files.push([tok, entry]);
27867
+ else if (isSourceFileToken(tok)) lexiconMisses++;
27847
27868
  }
27848
27869
  files.sort((a, b) => b[0].length - a[0].length);
27849
27870
  for (const [tok, entry] of files) {
@@ -27864,10 +27885,10 @@ function generalizeFileRefs(text, fileLexicon, level = 1) {
27864
27885
  const re = new RegExp(`(?<![\\w$/\\\\.-])${escapeRe4(tok)}(?![\\w$/\\\\.-])`, "g");
27865
27886
  out2 = out2.replace(re, fileRolePhrase(entry.relPath, level));
27866
27887
  }
27867
- return out2;
27888
+ return { text: out2, substitutions: files.length + stems.length, lexiconMisses };
27868
27889
  }
27869
27890
  function generalizeSymbols(text, lexicon, level = 1, fileLexicon) {
27870
- let out2 = fileLexicon ? generalizeFileRefs(text, fileLexicon, level) : text;
27891
+ let out2 = fileLexicon ? generalizeFileRefs(text, fileLexicon, level).text : text;
27871
27892
  const present = [];
27872
27893
  const seen = /* @__PURE__ */ new Set();
27873
27894
  for (const m of out2.matchAll(TOKEN_RE3)) {
@@ -27886,7 +27907,7 @@ function generalizeSymbols(text, lexicon, level = 1, fileLexicon) {
27886
27907
  }
27887
27908
  return generalize(out2, { level }).text;
27888
27909
  }
27889
- var SYMBOL_LABELS2, KIND_PHRASE, RE_RESERVED2, escapeRe4, CONVENTION_FILENAMES, CONVENTION_BASENAME_MIN_FILES, CONVENTION_STEMS, FILE_TOKEN_RE, STEM_TOKEN_RE, TOKEN_RE3;
27910
+ var SYMBOL_LABELS2, KIND_PHRASE, RE_RESERVED2, escapeRe4, CONVENTION_FILENAMES, CONVENTION_BASENAME_MIN_FILES, CONVENTION_STEMS, FILE_TOKEN_RE, STEM_TOKEN_RE, SOURCE_EXTENSIONS, TOKEN_RE3;
27890
27911
  var init_generalize_graph = __esm({
27891
27912
  "src/generalize-graph.ts"() {
27892
27913
  "use strict";
@@ -27956,6 +27977,45 @@ var init_generalize_graph = __esm({
27956
27977
  ]);
27957
27978
  FILE_TOKEN_RE = /(?:[A-Za-z0-9_.-]+\/)*[A-Za-z0-9_-][A-Za-z0-9_.-]*\.[A-Za-z0-9]+/g;
27958
27979
  STEM_TOKEN_RE = /[A-Za-z0-9]+(?:[-_][A-Za-z0-9]+)+/g;
27980
+ SOURCE_EXTENSIONS = /* @__PURE__ */ new Set([
27981
+ "ts",
27982
+ "tsx",
27983
+ "js",
27984
+ "jsx",
27985
+ "mjs",
27986
+ "cjs",
27987
+ "py",
27988
+ "go",
27989
+ "rs",
27990
+ "java",
27991
+ "kt",
27992
+ "rb",
27993
+ "c",
27994
+ "h",
27995
+ "cc",
27996
+ "cpp",
27997
+ "hpp",
27998
+ "cs",
27999
+ "php",
28000
+ "swift",
28001
+ "scala",
28002
+ "sh",
28003
+ "ps1",
28004
+ "sql",
28005
+ "css",
28006
+ "scss",
28007
+ "html",
28008
+ "vue",
28009
+ "svelte",
28010
+ "md",
28011
+ "json",
28012
+ "yaml",
28013
+ "yml",
28014
+ "toml",
28015
+ "ini",
28016
+ "env",
28017
+ "cypher"
28018
+ ]);
27959
28019
  TOKEN_RE3 = /[A-Za-z_$][A-Za-z0-9_$]*(?:\.[A-Za-z_$][A-Za-z0-9_$]*)*/g;
27960
28020
  }
27961
28021
  });
@@ -55551,7 +55611,7 @@ function startLoopLagMonitor(thresholdMs = 1e3) {
55551
55611
  }
55552
55612
 
55553
55613
  // src/engine.ts
55554
- var DAEMON_VERSION = true ? "2.0.2-dev.710" : "2.0.0-alpha.0";
55614
+ var DAEMON_VERSION = true ? "2.0.2-dev.720" : "2.0.0-alpha.0";
55555
55615
  var IGNORED_PATH = /[\\/](?:\.git|node_modules|\.errata|\.claude|\.codex|\.cursor|\.turbo|\.next|dist|coverage|test-results|playwright-report|__pycache__)(?:[\\/]|$)/;
55556
55616
  var IGNORED_NOISE = /castalia\.db|eventlog\.sqlite|turn-cursors/;
55557
55617
  var GIT_OP_MUTE_MS = 4e3;
@@ -57934,6 +57994,21 @@ function stripCodebaseScope(scope) {
57934
57994
  delete s["codebase"];
57935
57995
  return s;
57936
57996
  }
57997
+ function compositionCounters(c) {
57998
+ const { sidecarDropReasons, ...scalars } = c;
57999
+ const buckets = [
58000
+ "empty",
58001
+ "too_long",
58002
+ "path_shape",
58003
+ "quoted_literal",
58004
+ "verbatim_identifier",
58005
+ "other"
58006
+ ];
58007
+ return {
58008
+ ...scalars,
58009
+ ...Object.fromEntries(buckets.map((b) => [`sidecarDrop_${b}`, sidecarDropReasons[b] ?? 0]))
58010
+ };
58011
+ }
57937
58012
  function contributedWireId(n) {
57938
58013
  const cloudId = n.attrs["cloudNodeId"];
57939
58014
  return isMembraneSaltedId(cloudId) ? cloudId : n.id;
@@ -58004,7 +58079,10 @@ function buildInstanceIngest(store, profile, daemonVersion, ignorePatterns = [],
58004
58079
  const fileLexicon = buildFileLexicon(store);
58005
58080
  const shareable = (n) => {
58006
58081
  const preserved = symbolIndex ? preservedSymbolsFor(n.description, symbolIndex) : [];
58007
- const fileScrubbed = generalizeFileRefs(n.description, fileLexicon, level);
58082
+ const fileRefs = generalizeFileRefs(n.description, fileLexicon, level);
58083
+ const fileScrubbed = fileRefs.text;
58084
+ composition.fileRefsSubstituted += fileRefs.substitutions;
58085
+ composition.fileRefLexiconMisses += fileRefs.lexiconMisses;
58008
58086
  const generalized = generalize(fileScrubbed, { level, project: projectIdentity });
58009
58087
  const shippedText = generalized.text;
58010
58088
  if (generalized.report.classes.length > 0) composition.privacyRewritten++;
@@ -58046,7 +58124,11 @@ function buildInstanceIngest(store, profile, daemonVersion, ignorePatterns = [],
58046
58124
  unshippable: 0,
58047
58125
  heldOrphans: 0,
58048
58126
  privacyRewritten: 0,
58049
- sidecarDropped: 0
58127
+ sidecarDropped: 0,
58128
+ sidecarDropReasons: {},
58129
+ sidecarTruncatedAtCap: 0,
58130
+ fileRefsSubstituted: 0,
58131
+ fileRefLexiconMisses: 0
58050
58132
  };
58051
58133
  for (const label of INSTANCE_LABELS) {
58052
58134
  const ref = [];
@@ -58239,11 +58321,16 @@ function buildInstanceIngest(store, profile, daemonVersion, ignorePatterns = [],
58239
58321
  const entry = lexicon.get(tok);
58240
58322
  if (!entry?.summary) continue;
58241
58323
  const scrubbed = generalize(entry.summary, { level, project: projectIdentity }).text.trim();
58242
- if (!scrubbed || summaryRejectionReason(scrubbed, isKnown) !== null) {
58324
+ const dropBucket = !scrubbed ? "empty" : sidecarDropBucket(summaryRejectionReason(scrubbed, isKnown));
58325
+ if (dropBucket !== null) {
58243
58326
  composition.sidecarDropped++;
58327
+ composition.sidecarDropReasons[dropBucket] = (composition.sidecarDropReasons[dropBucket] ?? 0) + 1;
58244
58328
  continue;
58245
58329
  }
58246
- if (count >= MAX_SIDECAR_SYMBOLS) break outer;
58330
+ if (count >= MAX_SIDECAR_SYMBOLS) {
58331
+ composition.sidecarTruncatedAtCap = 1;
58332
+ break outer;
58333
+ }
58247
58334
  sidecar[tok] = { kind: entry.kind, summary: scrubbed };
58248
58335
  count++;
58249
58336
  }
@@ -59659,7 +59746,7 @@ async function startMultiDaemon(opts = {}) {
59659
59746
  });
59660
59747
  if (!instances && composition) {
59661
59748
  appendPassLedger(r.engine.paths.configDir, "ship", 0, {
59662
- ...composition,
59749
+ ...compositionCounters(composition),
59663
59750
  accepted: 0,
59664
59751
  rejected: 0,
59665
59752
  blocked: 0
@@ -59734,7 +59821,7 @@ async function startMultiDaemon(opts = {}) {
59734
59821
  });
59735
59822
  }
59736
59823
  appendPassLedger(r.engine.paths.configDir, "ship", Date.now() - shipStartedAt, {
59737
- ...instances.composition,
59824
+ ...compositionCounters(instances.composition),
59738
59825
  accepted: res.accepted,
59739
59826
  rejected: rejected.size,
59740
59827
  blocked: blocked.size
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inerrata-corporation/errata",
3
- "version": "2.0.2-dev.710",
3
+ "version": "2.0.2-dev.720",
4
4
  "description": "errata - local-first observation engine for AI coding agents",
5
5
  "type": "module",
6
6
  "bin": {