@inerrata-corporation/errata 2.0.6-dev.2533 → 2.0.6-dev.2550

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 +122 -6
  2. package/package.json +1 -1
package/errata.mjs CHANGED
@@ -28832,7 +28832,7 @@ function buildAgentInstruction(opts = {}) {
28832
28832
  tail
28833
28833
  ].join("\n");
28834
28834
  }
28835
- var TAG_EXAMPLE, GLOSS;
28835
+ var TAG_EXAMPLE, TAG_OPENERS, GLOSS;
28836
28836
  var init_agent_signals = __esm({
28837
28837
  "src/agent-signals.ts"() {
28838
28838
  "use strict";
@@ -28888,6 +28888,11 @@ var init_agent_signals = __esm({
28888
28888
  confirm: (ref) => `(confirm:[${ref}])`,
28889
28889
  refute: (ref) => `(refute:[${ref}] one line why)`
28890
28890
  };
28891
+ TAG_OPENERS = [
28892
+ ...new Set(
28893
+ Object.values(TAG_EXAMPLE).map((example) => /^(\([a-z][\w-]*:|\[[!?])/i.exec(example("x"))?.[1]?.toLowerCase()).filter((opener) => opener !== void 0)
28894
+ )
28895
+ ];
28891
28896
  GLOSS = {
28892
28897
  prior: "a shown prior helped, or you work in a primed language/package",
28893
28898
  problem: "a problem you notice or report \u2014 any bug, finding, or thing wrong; about specific code? name the file: [!what's wrong @ src/file.ts:42]",
@@ -74145,15 +74150,54 @@ function clauseBefore(sentence, idx) {
74145
74150
  }
74146
74151
  var FIX_RATIONALE_MIN = 12;
74147
74152
  var FIX_RATIONALE_WINDOW = 160;
74153
+ var SIBLING_MARKUP_SOURCES = [
74154
+ CITE_GROUP_RE,
74155
+ FLAG_RE,
74156
+ FIX_LONG_RE,
74157
+ CAUSE_LONG_RE,
74158
+ CONFIRM_LONG_RE,
74159
+ REFUTE_LONG_RE,
74160
+ ATTEMPT_RE,
74161
+ CONSTRAINT_RE
74162
+ ].map((re) => ({ source: re.source, flags: re.flags.includes("g") ? re.flags : `${re.flags}g` }));
74163
+ function maskSiblingMarkup(sentence, tagStart, tagEnd) {
74164
+ let masked = sentence;
74165
+ for (const { source, flags: flags2 } of SIBLING_MARKUP_SOURCES) {
74166
+ masked = masked.replace(new RegExp(source, flags2), (m, ...rest2) => {
74167
+ const at = rest2.find((v) => typeof v === "number");
74168
+ if (at <= tagStart && at + m.length >= tagEnd) return m;
74169
+ return " ".repeat(m.length);
74170
+ });
74171
+ }
74172
+ return masked;
74173
+ }
74174
+ var RESIDUAL_OPENER_RE = new RegExp(
74175
+ TAG_OPENERS.map((o) => o.startsWith("(") ? String.raw`\(\s*${o.slice(1, -1)}\s*:` : o.replace(/[[\]!?]/g, "\\$&")).join("|"),
74176
+ "i"
74177
+ );
74148
74178
  function fixRationaleBefore(sentence, idx) {
74149
- const win = sentence.slice(Math.max(0, idx - FIX_RATIONALE_WINDOW), idx).replace(new RegExp(CITE_GROUP_RE.source, "g"), " ").replace(new RegExp(FLAG_RE.source, "g"), " ");
74179
+ const masked = maskSiblingMarkup(sentence, idx, idx + 1);
74180
+ let start2 = Math.max(0, idx - FIX_RATIONALE_WINDOW);
74181
+ if (start2 > 0 && /\S/.test(masked[start2 - 1]) && /\S/.test(masked[start2])) {
74182
+ const ws = masked.slice(start2, idx).search(/\s/);
74183
+ start2 = ws < 0 ? idx : start2 + ws;
74184
+ }
74185
+ const win = masked.slice(start2, idx);
74150
74186
  const m = /[.;!?—][^.;!?—]*$/.exec(win);
74151
74187
  const clause = m ? win.slice(m.index + 1) : win;
74152
74188
  return clause.replace(/\s+/g, " ").trim();
74153
74189
  }
74154
74190
  function fixRationaleAfter(sentence, endIdx) {
74155
- const win = sentence.slice(endIdx, endIdx + FIX_RATIONALE_WINDOW).replace(new RegExp(CITE_GROUP_RE.source, "g"), " ").replace(new RegExp(FLAG_RE.source, "g"), " ");
74156
- if (/^\s*[)\]}]/.test(win)) return "";
74191
+ if (/^\s*[)\]}]/.test(sentence.slice(endIdx))) return "";
74192
+ const masked = maskSiblingMarkup(sentence, endIdx - 1, endIdx);
74193
+ let end = Math.min(masked.length, endIdx + FIX_RATIONALE_WINDOW);
74194
+ if (end < masked.length && /\S/.test(masked[end - 1]) && /\S/.test(masked[end])) {
74195
+ const lastWs = masked.slice(endIdx, end).search(/\s\S*$/);
74196
+ end = lastWs < 0 ? endIdx : endIdx + lastWs;
74197
+ }
74198
+ let win = masked.slice(endIdx, end);
74199
+ const residual = RESIDUAL_OPENER_RE.exec(win);
74200
+ if (residual) win = win.slice(0, residual.index);
74157
74201
  const stripped = win.replace(/^[\s—:–,-]+/, "");
74158
74202
  const m = /^[^.;!?—]*/.exec(stripped);
74159
74203
  const clause = (m ? m[0] : stripped).replace(/\s+/g, " ").trim();
@@ -74165,6 +74209,78 @@ function deriveFixRationale(sentence, startIdx, endIdx) {
74165
74209
  if (before.length >= FIX_RATIONALE_MIN) return before;
74166
74210
  return fixRationaleAfter(sentence, endIdx);
74167
74211
  }
74212
+ var LEADING_OPENER_RE = new RegExp(String.raw`^(?:${RESIDUAL_OPENER_RE.source})(?:#[a-z][\w-]{0,63})?\s*`, "i");
74213
+ var WRAPPER_PAIRS = [["(", ")"], ["[", "]"]];
74214
+ var LEADING_HANDLES_RE = /^(?:\[[a-z0-9][\w-]{0,80}\]\s*,?\s*)+/i;
74215
+ function leadingBracketClose(t) {
74216
+ const pair = WRAPPER_PAIRS.find(([open2]) => t.startsWith(open2));
74217
+ if (!pair) return null;
74218
+ let depth = 0;
74219
+ for (let i2 = 0; i2 < t.length; i2++) {
74220
+ if (t[i2] === pair[0]) depth++;
74221
+ else if (t[i2] === pair[1] && --depth === 0) return i2;
74222
+ }
74223
+ return -1;
74224
+ }
74225
+ function trailingBracketStray(t) {
74226
+ const pair = WRAPPER_PAIRS.find(([, close]) => t.endsWith(close));
74227
+ if (!pair) return false;
74228
+ let depth = 0;
74229
+ for (const ch of t.slice(0, -1)) {
74230
+ if (ch === pair[0]) depth++;
74231
+ else if (ch === pair[1] && depth > 0) depth--;
74232
+ }
74233
+ return depth === 0;
74234
+ }
74235
+ function cleanTagText(text) {
74236
+ let t = text.replace(/\s+/g, " ").trim();
74237
+ for (let pass = 0; pass < 8; pass++) {
74238
+ const before = t;
74239
+ const close = leadingBracketClose(t);
74240
+ const opener = close === null ? null : LEADING_OPENER_RE.exec(t);
74241
+ if (close === -1) {
74242
+ t = t.slice(opener ? opener[0].length : 1).trim();
74243
+ } else if (opener && close === t.length - 1) {
74244
+ t = t.slice(opener[0].length, -1).trim();
74245
+ }
74246
+ if (opener && t !== before) t = t.replace(LEADING_HANDLES_RE, "").trim();
74247
+ if (trailingBracketStray(t)) t = t.slice(0, -1).trim();
74248
+ if (t === before) break;
74249
+ }
74250
+ return t;
74251
+ }
74252
+ var TAG_TEXT_FIELDS = [
74253
+ "fixRationale",
74254
+ "statement",
74255
+ "causeText",
74256
+ "causeOf",
74257
+ "patternText",
74258
+ "domainText",
74259
+ "packageText",
74260
+ "componentText"
74261
+ ];
74262
+ function cleanEmittedTags(tags) {
74263
+ const kept = [];
74264
+ for (const tag of tags) {
74265
+ let emptied = false;
74266
+ for (const field of TAG_TEXT_FIELDS) {
74267
+ const value = tag[field];
74268
+ if (value === void 0) continue;
74269
+ const cleaned = cleanTagText(value);
74270
+ if (field === "fixRationale" && cleaned.length < FIX_RATIONALE_MIN) {
74271
+ delete tag.fixRationale;
74272
+ continue;
74273
+ }
74274
+ if (cleaned.length === 0) emptied = true;
74275
+ tag[field] = cleaned;
74276
+ }
74277
+ const hasReference = tag.handle !== void 0 || (tag.handles?.length ?? 0) > 0 || (tag.refuteHandles?.length ?? 0) > 0;
74278
+ if (emptied && !hasReference) continue;
74279
+ if (tag.kind === "fix" && !hasReference && tag.fixRationale === void 0) continue;
74280
+ kept.push(tag);
74281
+ }
74282
+ return kept;
74283
+ }
74168
74284
  function emptyTagDispositions() {
74169
74285
  return {
74170
74286
  oversizeSegments: 0,
@@ -74532,7 +74648,7 @@ function parseInlineTagsWithDispositions(text) {
74532
74648
  }
74533
74649
  for (let i2 = seqStart; i2 < out2.length; i2++) out2[i2].seq = seqNo;
74534
74650
  }
74535
- return { tags: out2, dispositions };
74651
+ return { tags: cleanEmittedTags(out2), dispositions };
74536
74652
  }
74537
74653
  var LABEL_PAIR = {
74538
74654
  "Problem>RootCause": "CAUSED_BY",
@@ -78206,7 +78322,7 @@ function createWatchBreaker(deps) {
78206
78322
  }
78207
78323
 
78208
78324
  // src/engine.ts
78209
- var DAEMON_VERSION = true ? "2.0.6-dev.2533" : "2.0.0-alpha.0";
78325
+ var DAEMON_VERSION = true ? "2.0.6-dev.2550" : "2.0.0-alpha.0";
78210
78326
  var IGNORED_PATH = /[\\/](?:\.git|node_modules|\.errata|\.claude|\.codex|\.cursor|\.turbo|\.next|dist|coverage|test-results|playwright-report|__pycache__)(?:[\\/]|$)/;
78211
78327
  var IGNORED_NOISE = /castalia\.db|eventlog\.sqlite|turn-cursors/;
78212
78328
  var GIT_OP_MUTE_MS = 4e3;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inerrata-corporation/errata",
3
- "version": "2.0.6-dev.2533",
3
+ "version": "2.0.6-dev.2550",
4
4
  "description": "errata - local-first observation engine for AI coding agents",
5
5
  "type": "module",
6
6
  "bin": {