@inerrata-corporation/errata 2.0.14-dev.3160 → 2.0.14-dev.3165

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 +20 -51
  2. package/package.json +1 -1
package/errata.mjs CHANGED
@@ -15493,8 +15493,6 @@ function looksLikeSecretValue(raw2, quoted) {
15493
15493
  if (raw2.includes("${") || raw2.includes("{{") || raw2.includes("%(")) return false;
15494
15494
  if (raw2.startsWith("[redacted:")) return false;
15495
15495
  if (quoted) return raw2.length > 0;
15496
- const lower = raw2.toLowerCase();
15497
- if (ASSIGNMENT_STOPWORDS.has(lower)) return false;
15498
15496
  if (/^(?:process\.env\.|os\.environ(?:\[|\.)|(?:request|response|config|settings|options)\.)/.test(raw2)) return false;
15499
15497
  if (/^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*\(/.test(raw2)) return false;
15500
15498
  return raw2.length > 0;
@@ -15559,75 +15557,36 @@ function scrubHistoryValue(value) {
15559
15557
  const clear = (input) => typeof input === "string" ? input.replace(literals, REDACTED_CREDENTIAL) : Array.isArray(input) ? input.map(clear) : input && typeof input === "object" ? Object.fromEntries(Object.entries(input).map(([k, v]) => [k, clear(v)])) : input;
15560
15558
  return clear(safe);
15561
15559
  }
15562
- var HISTORY_SCRUBBER_VERSION, REDACTED_CREDENTIAL, REDACTED_EMAIL, cred, ASSIGNMENT_STOPWORDS, CREDENTIAL_RULES, EMAIL_RE;
15560
+ var HISTORY_SCRUBBER_VERSION, REDACTED_CREDENTIAL, REDACTED_EMAIL, cred, PASSWORD_PROSE_DESCRIPTORS, CREDENTIAL_RULES, EMAIL_RE;
15563
15561
  var init_history_text = __esm({
15564
15562
  "../../packages/shared/src/history-text.ts"() {
15565
15563
  "use strict";
15566
- HISTORY_SCRUBBER_VERSION = "history-scrub-4";
15564
+ HISTORY_SCRUBBER_VERSION = "history-scrub-5";
15567
15565
  REDACTED_CREDENTIAL = "[redacted:credential]";
15568
15566
  REDACTED_EMAIL = "[redacted:email]";
15569
15567
  cred = () => REDACTED_CREDENTIAL;
15570
- ASSIGNMENT_STOPWORDS = /* @__PURE__ */ new Set([
15571
- "string",
15572
- "boolean",
15573
- "number",
15568
+ PASSWORD_PROSE_DESCRIPTORS = /* @__PURE__ */ new Set([
15574
15569
  "required",
15575
15570
  "optional",
15576
15571
  "undefined",
15577
15572
  "unknown",
15578
- "function",
15579
- "process",
15580
- "request",
15581
- "response",
15582
- "password",
15583
- "secret",
15584
- "token",
15585
- "tokens",
15586
- "credential",
15587
- "credentials",
15588
- "bearer",
15589
- "basic",
15590
- "example",
15591
15573
  "redacted",
15592
15574
  "nullable",
15593
- "readonly",
15594
- "override",
15595
- "abstract",
15596
- "interface",
15597
- "constant",
15598
- "variable",
15599
- "property",
15600
- "parameter",
15601
- "argument",
15602
- "callback",
15603
- "promise",
15604
- "settings",
15605
- "options",
15606
- "default",
15607
15575
  "disabled",
15608
15576
  "enabled",
15609
- "internal",
15610
- "external",
15611
- "protected",
15612
15577
  "provided",
15613
- "resolved",
15614
15578
  "rejected",
15615
- "expected",
15616
- "received",
15617
15579
  "salt",
15618
15580
  "hash",
15619
15581
  "hashed",
15620
- "hashing",
15621
- "authentication",
15622
- "field",
15623
- "format"
15582
+ "hashing"
15624
15583
  ]);
15625
15584
  CREDENTIAL_RULES = [
15626
15585
  // Human-written seed/reset notes omit assignment punctuation: password `…`
15627
15586
  // or password (…). Preserve names of fields and hash components.
15628
15587
  {
15629
15588
  re: /\b((?:password|passwd|passphrase|pwd)\s+)(["'`(])([^\s"'`,;)}\]]+)(["'`)])/gi,
15630
- replace: (m) => !ASSIGNMENT_STOPWORDS.has((m[3] ?? "").toLowerCase()) && looksLikeSecretValue(m[3] ?? "", true) ? `${m[1]}${m[2]}${REDACTED_CREDENTIAL}${m[4]}` : null
15589
+ replace: (m) => !(m[2] === "(" && PASSWORD_PROSE_DESCRIPTORS.has((m[3] ?? "").toLowerCase())) && looksLikeSecretValue(m[3] ?? "", true) ? `${m[1]}${m[2]}${REDACTED_CREDENTIAL}${m[4]}` : null
15631
15590
  },
15632
15591
  // "with SeedValue42! credentials" and "with SeedValue42!/seeded account".
15633
15592
  // Require mixed-case letters plus a digit, or a password-like special char;
@@ -15657,7 +15616,7 @@ var init_history_text = __esm({
15657
15616
  re: /\b((?:password|passwd|passphrase|pwd)\s+(?:is|was|of)\s+)(["'\x60]?)([^\s"'\x60,;)}\]]+)/gi,
15658
15617
  replace: (m) => {
15659
15618
  const value = m[3] ?? "";
15660
- if (ASSIGNMENT_STOPWORDS.has(value.toLowerCase()) || value.startsWith("[redacted:") || /\$\{|\{\{|process\./.test(value)) return null;
15619
+ if (!m[2] && PASSWORD_PROSE_DESCRIPTORS.has(value.toLowerCase()) || value.startsWith("[redacted:") || /\$\{|\{\{|process\./.test(value)) return null;
15661
15620
  return `${m[1]}${m[2]}${REDACTED_CREDENTIAL}`;
15662
15621
  }
15663
15622
  },
@@ -15693,8 +15652,9 @@ var init_history_text = __esm({
15693
15652
  },
15694
15653
  // Assignments after key-ish names: `password=...`, `API_KEY: "..."`,
15695
15654
  // `"client_secret": "..."`, `AWS_SECRET_ACCESS_KEY=...`, 32+ hex/base64 after
15696
- // any of them. The value heuristic keeps `token: string` and
15697
- // `password = process.env.X` intact.
15655
+ // any of them. Recognizable expressions such as `process.env.X` survive.
15656
+ // Bare `password: string` is ambiguous with YAML containing a literal weak
15657
+ // password, so it is redacted. A stopword is never proof of safe code.
15698
15658
  {
15699
15659
  re: /((?:[A-Za-z0-9_.-]*?)(?:password|passwd|passphrase|pwd|secret|token|api[_-]?key|apikey|access[_-]?key|private[_-]?key|auth[_-]?key|credential)(?:[A-Za-z0-9_-]*))(["']?\s*(?:=>|=|:)\s*)(["'`]?)([^\s"'`,;)}\]]+)/gi,
15700
15660
  replace: (m) => {
@@ -75865,6 +75825,7 @@ var PLACEHOLDER_HANDLES = /* @__PURE__ */ new Set([
75865
75825
  "b"
75866
75826
  ]);
75867
75827
  var isPlaceholderHandle = (h) => PLACEHOLDER_HANDLES.has(h.toLowerCase());
75828
+ var FLAG_BODY_HANDLE_RE = /^(?:[a-z0-9]+(?:-[a-z0-9]+){2,}-(?=[0-9a-f]{0,3}\d)[0-9a-f]{4}|(?:pat|sol|drc|dcause|dfix|dprob|prob|claim|err)_[0-9a-f]{6,})$/i;
75868
75829
  var FIX_PREFIX = /^\s*fix:(?:#([a-z][\w-]{0,63}))?\s*/i;
75869
75830
  var CONSTRAINT_RE = /\(\s*constraint:\s*([^()\n]{8,}?)\s*\)/gi;
75870
75831
  var CAUSE_PREFIX = /^\s*cause:(?:#([a-z][\w-]{0,63}))?\s*/i;
@@ -76040,7 +76001,8 @@ function emptyTagDispositions() {
76040
76001
  negated: 0,
76041
76002
  unparseable: 0,
76042
76003
  placeholderEcho: 0,
76043
- verdictNoHandle: 0
76004
+ verdictNoHandle: 0,
76005
+ flagAsHandle: 0
76044
76006
  };
76045
76007
  }
76046
76008
  function addTagDispositions(a, b) {
@@ -76052,6 +76014,7 @@ function addTagDispositions(a, b) {
76052
76014
  a.unparseable += b.unparseable;
76053
76015
  a.placeholderEcho += b.placeholderEcho;
76054
76016
  a.verdictNoHandle += b.verdictNoHandle;
76017
+ a.flagAsHandle += b.flagAsHandle;
76055
76018
  }
76056
76019
  function parseInlineTags(text) {
76057
76020
  return parseInlineTagsWithDispositions(text).tags;
@@ -76287,6 +76250,11 @@ function parseInlineTagsWithDispositions(text) {
76287
76250
  while ((f = FLAG_RE.exec(sentence)) !== null) {
76288
76251
  const flagThread = f[2];
76289
76252
  const raw3 = f[3].trim();
76253
+ if (FLAG_BODY_HANDLE_RE.test(raw3) && !f[4]) {
76254
+ dispositions.flagAsHandle++;
76255
+ out2.push({ kind: "prior", handle: raw3, sentence: sfield });
76256
+ continue;
76257
+ }
76290
76258
  if (raw3.length >= 8) {
76291
76259
  const segs = raw3.split(CAUSE_ARROW).map((s) => s.trim()).filter((s) => s.length > 0);
76292
76260
  const symptomRaw = segs.length > 1 ? segs[0] : raw3;
@@ -81258,7 +81226,7 @@ function createWatchBreaker(deps) {
81258
81226
  }
81259
81227
 
81260
81228
  // src/engine.ts
81261
- var DAEMON_VERSION = true ? "2.0.14-dev.3160" : "2.0.0-alpha.0";
81229
+ var DAEMON_VERSION = true ? "2.0.14-dev.3165" : "2.0.0-alpha.0";
81262
81230
  var IGNORED_PATH = /[\\/](?:\.git|node_modules|\.errata|\.claude|\.codex|\.cursor|\.turbo|\.next|dist|coverage|test-results|playwright-report|__pycache__)(?:[\\/]|$)/;
81263
81231
  var IGNORED_NOISE = /castalia\.db|eventlog\.sqlite|turn-cursors/;
81264
81232
  var GIT_OP_MUTE_MS = 4e3;
@@ -82975,6 +82943,7 @@ function createWorkspaceEngine(opts) {
82975
82943
  // HZ-corrob-wire: a verdict group naming no resolvable handle — judged,
82976
82944
  // but nothing judgeable was cited.
82977
82945
  tagsVerdictNoHandle: dispositions.verdictNoHandle,
82946
+ tagsFlagAsHandle: dispositions.flagAsHandle,
82978
82947
  unresolvedHandles,
82979
82948
  priorEdgesFlagOff,
82980
82949
  priorEdgesNoSource,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inerrata-corporation/errata",
3
- "version": "2.0.14-dev.3160",
3
+ "version": "2.0.14-dev.3165",
4
4
  "description": "errata - local-first observation engine for AI coding agents",
5
5
  "type": "module",
6
6
  "bin": {