@inerrata-corporation/errata 2.0.8-dev.2890 → 2.0.8-dev.2895

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 +55 -2
  2. package/package.json +1 -1
package/errata.mjs CHANGED
@@ -80124,7 +80124,7 @@ function createWatchBreaker(deps) {
80124
80124
  }
80125
80125
 
80126
80126
  // src/engine.ts
80127
- var DAEMON_VERSION = true ? "2.0.8-dev.2890" : "2.0.0-alpha.0";
80127
+ var DAEMON_VERSION = true ? "2.0.8-dev.2895" : "2.0.0-alpha.0";
80128
80128
  var IGNORED_PATH = /[\\/](?:\.git|node_modules|\.errata|\.claude|\.codex|\.cursor|\.turbo|\.next|dist|coverage|test-results|playwright-report|__pycache__)(?:[\\/]|$)/;
80129
80129
  var IGNORED_NOISE = /castalia\.db|eventlog\.sqlite|turn-cursors/;
80130
80130
  var GIT_OP_MUTE_MS = 4e3;
@@ -84493,6 +84493,57 @@ async function mergeSide(root, p1, p2) {
84493
84493
  return { sha: sha2, parents };
84494
84494
  });
84495
84495
  }
84496
+ async function commitGraph(root, branch) {
84497
+ const out2 = await git(root, [...GIT_OPTS, "rev-list", "--parents", branch]);
84498
+ const graph = /* @__PURE__ */ new Map();
84499
+ for (const l of out2.split(/\r?\n/)) {
84500
+ const [sha2, ...parents] = l.trim().split(" ");
84501
+ if (sha2) graph.set(sha2, parents);
84502
+ }
84503
+ return graph;
84504
+ }
84505
+ function mergeSidesFromGraph(line, start2, graph) {
84506
+ const seen = /* @__PURE__ */ new Set();
84507
+ const reach = (from, into) => {
84508
+ const stack = [from];
84509
+ while (stack.length > 0) {
84510
+ const sha2 = stack.pop();
84511
+ if (seen.has(sha2) || into.has(sha2)) continue;
84512
+ into.add(sha2);
84513
+ for (const p of graph.get(sha2) ?? []) stack.push(p);
84514
+ }
84515
+ };
84516
+ if (start2 > 0) {
84517
+ const base = /* @__PURE__ */ new Set();
84518
+ reach(line[start2 - 1].sha, base);
84519
+ for (const sha2 of base) seen.add(sha2);
84520
+ }
84521
+ const sides = /* @__PURE__ */ new Map();
84522
+ for (let i2 = start2; i2 < line.length; i2++) {
84523
+ const { sha: sha2, parents } = line[i2];
84524
+ if (parents.length >= 2) {
84525
+ const side = /* @__PURE__ */ new Set();
84526
+ reach(parents[1], side);
84527
+ const chain2 = [];
84528
+ let at = side.has(parents[1]) ? parents[1] : void 0;
84529
+ let linear = true;
84530
+ while (at) {
84531
+ const ps = graph.get(at) ?? [];
84532
+ chain2.push({ sha: at, parents: [...ps] });
84533
+ const inSide = ps.filter((p) => side.has(p));
84534
+ if (inSide.length > 1) {
84535
+ linear = false;
84536
+ break;
84537
+ }
84538
+ at = inSide[0];
84539
+ }
84540
+ sides.set(sha2, linear && chain2.length === side.size ? chain2.reverse() : null);
84541
+ for (const s of side) seen.add(s);
84542
+ }
84543
+ seen.add(sha2);
84544
+ }
84545
+ return sides;
84546
+ }
84496
84547
  async function tagsByCommit(root) {
84497
84548
  const out2 = await git(root, [...GIT_OPTS, "for-each-ref", "--format=%(refname:short)%00%(objectname)%00%(*objectname)", "refs/tags"]);
84498
84549
  const map2 = /* @__PURE__ */ new Map();
@@ -84521,8 +84572,10 @@ async function enumerateUnits(root, opts = {}) {
84521
84572
  if (start2 >= line.length) return [];
84522
84573
  const commits = await readCommitsBulk(root, branch, start2 > 0 ? line[start2 - 1].sha : null);
84523
84574
  const commit = async (sha2) => commits.get(sha2) ?? await readCommit(root, sha2);
84524
- const merges = line.slice(start2).filter((c) => c.parents.length >= 2);
84575
+ const fromGraph = mergeSidesFromGraph(line, start2, await commitGraph(root, branch));
84525
84576
  const sides = /* @__PURE__ */ new Map();
84577
+ for (const [sha2, side] of fromGraph) if (side) sides.set(sha2, side);
84578
+ const merges = line.slice(start2).filter((c) => c.parents.length >= 2 && !sides.has(c.sha));
84526
84579
  const sideLists = await mapBounded(merges, MERGE_SIDE_CONCURRENCY, (m) => mergeSide(root, m.parents[0], m.parents[1]));
84527
84580
  merges.forEach((m, i2) => sides.set(m.sha, sideLists[i2]));
84528
84581
  const units = [];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inerrata-corporation/errata",
3
- "version": "2.0.8-dev.2890",
3
+ "version": "2.0.8-dev.2895",
4
4
  "description": "errata - local-first observation engine for AI coding agents",
5
5
  "type": "module",
6
6
  "bin": {