@inerrata-corporation/errata 2.0.0-dev.90 → 2.0.0-dev.91

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 +67 -30
  2. package/package.json +1 -1
package/errata.mjs CHANGED
@@ -45370,12 +45370,13 @@ function extractExecutables(command) {
45370
45370
  return out2;
45371
45371
  }
45372
45372
  function observeCommandTools(store, command, ts) {
45373
- const result = { minted: [], reinforced: [] };
45373
+ const result = { minted: [], reinforced: [], nodeIds: [] };
45374
45374
  const osName = currentOsName();
45375
45375
  for (const name2 of extractExecutables(command)) {
45376
45376
  if (!PUBLIC_TOOLS.has(name2)) continue;
45377
45377
  if (PLUMBING.has(name2)) continue;
45378
45378
  const id = toolNodeId(name2);
45379
+ result.nodeIds.push(id);
45379
45380
  const existing = store.getNode(id);
45380
45381
  if (existing) {
45381
45382
  store.updateNode(id, {
@@ -45407,23 +45408,23 @@ function observeCommandTools(store, command, ts) {
45407
45408
  attrs: { name: name2, canonicalId: toolCanonicalId(name2), public: true }
45408
45409
  });
45409
45410
  result.minted.push(name2);
45410
- if (osName) {
45411
- const os2 = resolveOsNode(store, osName, ts);
45412
- store.mergeEdge({
45413
- id: `edge_${digest({ from: id, type: "RUNS_ON", to: os2.id })}`.slice(0, 24),
45414
- from: id,
45415
- to: os2.id,
45416
- type: "RUNS_ON",
45417
- confidence: 1,
45418
- // observed
45419
- extractionSource: "daemon-extracted",
45420
- createdAt: ts,
45421
- lastSeenAt: ts,
45422
- navSuccesses: 0,
45423
- navFailures: 0,
45424
- attrs: { observed: true }
45425
- });
45426
- }
45411
+ }
45412
+ if (osName) {
45413
+ const os2 = resolveOsNode(store, osName, ts);
45414
+ store.mergeEdge({
45415
+ id: `edge_${digest({ from: id, type: "RUNS_ON", to: os2.id })}`.slice(0, 24),
45416
+ from: id,
45417
+ to: os2.id,
45418
+ type: "RUNS_ON",
45419
+ confidence: 1,
45420
+ // observed
45421
+ extractionSource: "daemon-extracted",
45422
+ createdAt: ts,
45423
+ lastSeenAt: ts,
45424
+ navSuccesses: 0,
45425
+ navFailures: 0,
45426
+ attrs: { observed: true }
45427
+ });
45427
45428
  }
45428
45429
  }
45429
45430
  return result;
@@ -45862,7 +45863,8 @@ function buildWebUi(deps) {
45862
45863
  ts: Date.now()
45863
45864
  });
45864
45865
  try {
45865
- observeCommandTools(deps.store, input["command"], Date.now());
45866
+ const observed = observeCommandTools(deps.store, input["command"], Date.now());
45867
+ deps.onToolsObserved?.(String(body2["session_id"] ?? ""), observed.nodeIds);
45866
45868
  } catch {
45867
45869
  }
45868
45870
  if (failed) recallCtx = recallForError(deps.store, stderr || combined);
@@ -49244,11 +49246,8 @@ var SUPERSEDES_PREFIX = /^\s*supersedes:(?:#([a-z][\w-]{0,63}))?\s*/i;
49244
49246
  var ALTERNATIVE_PREFIX = /^\s*alternative:(?:#([a-z][\w-]{0,63}))?\s*/i;
49245
49247
  var INSTANCE_PREFIX = /^\s*instance:\s*/i;
49246
49248
  var PATTERN_RE = /\(\s*pattern:\s*([^()\n]{3,}?)\s*\)/gi;
49247
- var PATTERN_TEXT_MAX = 120;
49248
49249
  var CAUSE_TEXT_MIN = 8;
49249
- var CAUSE_TEXT_MAX = 200;
49250
49250
  var FLAG_RE = /\[([!?])(?:#([a-z][\w-]{0,63})\s+)?\s*([^\]\n]{8,}?)\s*(?:@\s*([^\s\]]+?)(?::(\d+))?\s*)?\]/g;
49251
- var FLAG_MAX = 200;
49252
49251
  var CONSTRAINT_MIN = 8;
49253
49252
  function clauseBefore(sentence, idx) {
49254
49253
  const win = sentence.slice(Math.max(0, idx - 80), idx);
@@ -49323,7 +49322,7 @@ function parseInlineTags(text) {
49323
49322
  } else {
49324
49323
  const raw3 = content.replace(/\s+/g, " ").trim();
49325
49324
  if (raw3.length >= CAUSE_TEXT_MIN) {
49326
- const causeText = raw3.length > CAUSE_TEXT_MAX ? `${raw3.slice(0, CAUSE_TEXT_MAX - 1).trimEnd()}\u2026` : raw3;
49325
+ const causeText = raw3;
49327
49326
  out2.push({ kind: "triage", causeText, sentence: sfield, ...verbThread ? { threadId: verbThread } : {} });
49328
49327
  }
49329
49328
  }
@@ -49365,7 +49364,7 @@ function parseInlineTags(text) {
49365
49364
  if (raw3.length >= 8) {
49366
49365
  const segs = raw3.split(CAUSE_ARROW).map((s) => s.trim()).filter((s) => s.length > 0);
49367
49366
  const symptomRaw = segs.length > 1 ? segs[0] : raw3;
49368
- const statement = symptomRaw.length > FLAG_MAX ? `${symptomRaw.slice(0, FLAG_MAX - 1).trimEnd()}\u2026` : symptomRaw;
49367
+ const statement = symptomRaw;
49369
49368
  const asFix = f[1] === "!" && /^(?:fixed|resolved)\s*[:,-]\s*/i.exec(statement);
49370
49369
  if (asFix) {
49371
49370
  const note = statement.slice(asFix[0].length).trim();
@@ -49397,7 +49396,7 @@ function parseInlineTags(text) {
49397
49396
  while ((a = ATTEMPT_RE.exec(sentence)) !== null) {
49398
49397
  const raw3 = a[3].replace(/\s+/g, " ").trim();
49399
49398
  if (raw3.length >= CONSTRAINT_MIN) {
49400
- const statement = raw3.length > FLAG_MAX ? `${raw3.slice(0, FLAG_MAX - 1).trimEnd()}\u2026` : raw3;
49399
+ const statement = raw3;
49401
49400
  const isFailure = a[1].toLowerCase() === "failed";
49402
49401
  let refuteHandles;
49403
49402
  if (isFailure) {
@@ -49431,7 +49430,7 @@ function parseInlineTags(text) {
49431
49430
  } else {
49432
49431
  const raw3 = body2.replace(/\s+/g, " ").trim();
49433
49432
  if (raw3.length >= 3) {
49434
- const patternText = raw3.length > PATTERN_TEXT_MAX ? `${raw3.slice(0, PATTERN_TEXT_MAX - 1).trimEnd()}\u2026` : raw3;
49433
+ const patternText = raw3;
49435
49434
  out2.push({ kind: "pattern", patternText, sentence: sfield });
49436
49435
  }
49437
49436
  }
@@ -49441,7 +49440,7 @@ function parseInlineTags(text) {
49441
49440
  while ((c = CONSTRAINT_RE.exec(sentence)) !== null) {
49442
49441
  const raw3 = c[1].replace(/\s+/g, " ").trim();
49443
49442
  if (raw3.length >= CONSTRAINT_MIN) {
49444
- const statement = raw3.length > FLAG_MAX ? `${raw3.slice(0, FLAG_MAX - 1).trimEnd()}\u2026` : raw3;
49443
+ const statement = raw3;
49445
49444
  out2.push({ kind: "constraint", statement, sentence: sfield });
49446
49445
  }
49447
49446
  }
@@ -49540,6 +49539,7 @@ function mintPriorEdge(store, source, target, sentence, touched, ts) {
49540
49539
  if (anchorIds.size === 0 && (target.label === "Language" || target.label === "Package")) {
49541
49540
  for (const e of store.inEdges(target.id, STACK_GROUNDING_EDGES)) anchorIds.add(e.from);
49542
49541
  }
49542
+ if (anchorIds.size === 0 && target.label === "Tool") anchorIds.add(target.id);
49543
49543
  const corroborated = tagEdgeCorroborated(anchorIds, touched, false);
49544
49544
  store.mergeEdge({
49545
49545
  id: `edge_${digest({ from: source.id, type, to: target.id, k: "priorTag" })}`.slice(0, 24),
@@ -49556,7 +49556,12 @@ function mintPriorEdge(store, source, target, sentence, touched, ts) {
49556
49556
  navFailures: 0,
49557
49557
  attrs: { provisional: true, priorTag: true, primingProvenance: true, corroborated }
49558
49558
  });
49559
- if (type === "CONCERNS") stampObservedOs(store, source.id, currentOsName(), ts);
49559
+ if (type === "CONCERNS") {
49560
+ try {
49561
+ stampObservedOs(store, source.id, currentOsName(), ts);
49562
+ } catch {
49563
+ }
49564
+ }
49560
49565
  return true;
49561
49566
  }
49562
49567
  function harvestInlineTags(store, text, opts) {
@@ -50871,6 +50876,34 @@ function createWorkingFileState() {
50871
50876
  };
50872
50877
  }
50873
50878
 
50879
+ // src/tool-run-state.ts
50880
+ var MAX_SESSIONS = 64;
50881
+ var MAX_TOOLS_PER_SESSION = 64;
50882
+ function createToolRunState() {
50883
+ const bySession = /* @__PURE__ */ new Map();
50884
+ return {
50885
+ record(sessionId, toolNodeIds) {
50886
+ if (!sessionId || toolNodeIds.length === 0) return;
50887
+ let set2 = bySession.get(sessionId);
50888
+ if (!set2) {
50889
+ if (bySession.size >= MAX_SESSIONS) {
50890
+ const oldest = bySession.keys().next().value;
50891
+ if (oldest !== void 0) bySession.delete(oldest);
50892
+ }
50893
+ set2 = /* @__PURE__ */ new Set();
50894
+ bySession.set(sessionId, set2);
50895
+ }
50896
+ for (const id of toolNodeIds) {
50897
+ if (set2.size >= MAX_TOOLS_PER_SESSION) break;
50898
+ set2.add(id);
50899
+ }
50900
+ },
50901
+ get(sessionId) {
50902
+ return bySession.get(sessionId) ?? /* @__PURE__ */ new Set();
50903
+ }
50904
+ };
50905
+ }
50906
+
50874
50907
  // src/engine.ts
50875
50908
  init_paths();
50876
50909
 
@@ -51268,7 +51301,7 @@ function startLoopLagMonitor(thresholdMs = 1e3) {
51268
51301
  }
51269
51302
 
51270
51303
  // src/engine.ts
51271
- var DAEMON_VERSION = true ? "2.0.0-dev.90" : "2.0.0-alpha.0";
51304
+ var DAEMON_VERSION = true ? "2.0.0-dev.91" : "2.0.0-alpha.0";
51272
51305
  var IGNORED_PATH = /[\\/](?:\.git|node_modules|\.errata|\.claude|\.codex|\.cursor|\.turbo|\.next|dist|coverage|test-results|playwright-report|__pycache__)(?:[\\/]|$)/;
51273
51306
  var IGNORED_NOISE = /castalia\.db|eventlog\.sqlite|turn-cursors/;
51274
51307
  var GIT_OP_MUTE_MS = 4e3;
@@ -51549,6 +51582,7 @@ function createWorkspaceEngine(opts) {
51549
51582
  });
51550
51583
  }
51551
51584
  const workingFiles = createWorkingFileState();
51585
+ const toolRuns = createToolRunState();
51552
51586
  let ctxRefreshTimer = null;
51553
51587
  let contextDirty = false;
51554
51588
  let remotePriors = [];
@@ -51918,12 +51952,14 @@ function createWorkspaceEngine(opts) {
51918
51952
  }
51919
51953
  try {
51920
51954
  const touchedFileId = turnFile ? resolveFileId(turnFile) : void 0;
51955
+ const touched = new Set(toolRuns.get(sessionId));
51956
+ if (touchedFileId) touched.add(touchedFileId);
51921
51957
  const plan = harvestInlineTags(store, turn.text, {
51922
51958
  sourceId: sessionLastProblem.get(sessionId),
51923
51959
  handleMap,
51924
51960
  ts: t,
51925
51961
  mintPriors: elicit,
51926
- ...touchedFileId ? { sessionTouchedIds: /* @__PURE__ */ new Set([touchedFileId]) } : {}
51962
+ ...touched.size > 0 ? { sessionTouchedIds: touched } : {}
51927
51963
  });
51928
51964
  priorEdges += plan.priorEdges;
51929
51965
  const wf = workingFiles.get(sessionId);
@@ -52325,6 +52361,7 @@ function createWorkspaceEngine(opts) {
52325
52361
  webHooks: {
52326
52362
  onWorkingFileChanged,
52327
52363
  onHook: () => telemetry.count("hooks_fired"),
52364
+ onToolsObserved: (sessionId, toolNodeIds) => toolRuns.record(sessionId, toolNodeIds),
52328
52365
  onHookEvent,
52329
52366
  onShellEvent,
52330
52367
  onToolError,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inerrata-corporation/errata",
3
- "version": "2.0.0-dev.90",
3
+ "version": "2.0.0-dev.91",
4
4
  "description": "errata - local-first observation engine for AI coding agents",
5
5
  "type": "module",
6
6
  "bin": {