@inerrata-corporation/errata 2.0.21-dev.3863 → 2.0.21-dev.3904

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.
package/errata.mjs CHANGED
@@ -27398,6 +27398,9 @@ var init_client = __esm({
27398
27398
  if (q.q) qs.set("q", q.q);
27399
27399
  if (q.channel) qs.set("channel", q.channel);
27400
27400
  if (q.includeTriage) qs.set("includeTriage", "true");
27401
+ if (q.scope) qs.set("scope", q.scope);
27402
+ if (q.community) qs.set("community", "true");
27403
+ if (q.bridges) qs.set("bridges", "true");
27401
27404
  const publicCtx = process.env["ERRATA_PRIMING_PUBLIC_CONTEXT"];
27402
27405
  const usePublicCtx = Boolean(publicCtx && publicCtx !== "0" && q.channel === "priming");
27403
27406
  const UUID_RE2 = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
@@ -27416,7 +27419,8 @@ var init_client = __esm({
27416
27419
  nodes,
27417
27420
  edges,
27418
27421
  generatedAt: res.generatedAt,
27419
- ...res.voidSignal ? { voidSignal: res.voidSignal } : {}
27422
+ ...res.voidSignal ? { voidSignal: res.voidSignal } : {},
27423
+ ...res.seeds ? { seeds: res.seeds } : {}
27420
27424
  };
27421
27425
  }
27422
27426
  /**
@@ -27561,6 +27565,15 @@ var init_client = __esm({
27561
27565
  throw err2;
27562
27566
  }
27563
27567
  }
27568
+ /** One graph node's detail — label, full description, evidence counters,
27569
+ * §5.4 posterior and causal neighbours in both directions — via the
27570
+ * inspector read of `GET /v2/nodes` (keys on the graph node id, not the
27571
+ * canonicalId). Null when the node is absent or outside the caller's scope. */
27572
+ async getNode(nodeId) {
27573
+ const qs = new URLSearchParams({ ids: nodeId, withRelated: "true", limit: "1" });
27574
+ const res = await this.json("GET", `/v2/nodes?${qs.toString()}`);
27575
+ return res.rows.find((r) => r.id === nodeId) ?? null;
27576
+ }
27564
27577
  async sendTelemetry(batch) {
27565
27578
  return this.json("POST", "/v2/telemetry", batch);
27566
27579
  }
@@ -34959,6 +34972,7 @@ function mergeDualBurst(local, cloud, opts = {}) {
34959
34972
  provenance: corroborated ? "corroborated" : "local",
34960
34973
  ...twin?.usageCount != null ? { usageCount: twin.usageCount } : {},
34961
34974
  ...twin?.rel ? { rel: twin.rel } : {},
34975
+ ...twin?.community ? { community: twin.community } : {},
34962
34976
  why: l.components,
34963
34977
  ...l.via ? { via: l.via } : {}
34964
34978
  });
@@ -34976,7 +34990,8 @@ function mergeDualBurst(local, cloud, opts = {}) {
34976
34990
  // adapters surface 1-hop neighbors of the seed
34977
34991
  provenance: "collective",
34978
34992
  ...c.usageCount != null ? { usageCount: c.usageCount } : {},
34979
- ...c.rel ? { rel: c.rel } : {}
34993
+ ...c.rel ? { rel: c.rel } : {},
34994
+ ...c.community ? { community: c.community } : {}
34980
34995
  });
34981
34996
  }
34982
34997
  nodes.sort((a, b) => b.score - a.score);
@@ -35013,12 +35028,15 @@ function searchResultToCloudHits(result) {
35013
35028
  const usage = node2.attrs?.["usageCount"];
35014
35029
  const s = scores[i2];
35015
35030
  const cloudScore = !Number.isNaN(s) && maxScore > 0 ? s / maxScore : n > 0 ? (n - i2) / n : 0;
35031
+ const communityId = node2.attrs?.["community"];
35032
+ const communityLabel = node2.attrs?.["communityLabel"];
35016
35033
  return {
35017
35034
  id: node2.id,
35018
35035
  label: node2.label,
35019
35036
  description: node2.description,
35020
35037
  cloudScore,
35021
- ...typeof usage === "number" ? { usageCount: usage } : {}
35038
+ ...typeof usage === "number" ? { usageCount: usage } : {},
35039
+ ...typeof communityId === "number" ? { community: { id: communityId, label: typeof communityLabel === "string" ? communityLabel : null } } : {}
35022
35040
  };
35023
35041
  });
35024
35042
  }
@@ -35065,7 +35083,7 @@ async function dualAugment(opts) {
35065
35083
  }
35066
35084
  if (hardIds.length > 0 || softQ) {
35067
35085
  calls.push(
35068
- cloud.search({ stack: [], domains: [], kinds: [], seed: hardIds, ...softQ ? { q: softQ } : {}, limit }).then((res) => {
35086
+ cloud.search({ stack: [], domains: [], kinds: [], seed: hardIds, ...softQ ? { q: softQ } : {}, limit, community: true }).then((res) => {
35069
35087
  cloudHits.push(...searchResultToCloudHits(res));
35070
35088
  })
35071
35089
  );
@@ -35106,29 +35124,121 @@ function federationHint(status) {
35106
35124
  function hasCloudNodeShape(id) {
35107
35125
  return CANONICAL_KNOWLEDGE_ID.test(id) || UUID_ID.test(id) || id.startsWith("pkg:");
35108
35126
  }
35109
- async function collectiveDrilldown(cloud, seedId, limit) {
35127
+ function attrsCommunity(attrs) {
35128
+ const id = attrs?.["community"];
35129
+ if (typeof id !== "number") return void 0;
35130
+ const label = attrs?.["communityLabel"];
35131
+ return { id, label: typeof label === "string" ? label : null };
35132
+ }
35133
+ function walkerCommunity(c) {
35134
+ return c ? { id: c.communityId, label: c.label } : null;
35135
+ }
35136
+ async function collectiveDrilldown(cloud, seedId, limit, opts = {}) {
35137
+ let res;
35110
35138
  try {
35111
- const res = await cloud.search({ stack: [], domains: [], kinds: [], seed: [seedId], limit });
35112
- if (res.nodes.length === 0) return null;
35113
- return {
35114
- seed: seedId,
35115
- nodes: res.nodes.map((n) => ({
35116
- id: n.id,
35117
- label: n.label,
35118
- name: n.description,
35119
- score: Number((n.extractionConfidence ?? 0.5).toFixed(4)),
35120
- hops: 1,
35121
- provenance: "collective"
35122
- })),
35123
- edges: res.edges.map((e) => ({ from: e.from, to: e.to, type: e.type }))
35124
- };
35139
+ res = await cloud.search({
35140
+ stack: [],
35141
+ domains: [],
35142
+ kinds: [],
35143
+ seed: [seedId],
35144
+ limit,
35145
+ community: true,
35146
+ ...opts.bridges ? { bridges: true } : {},
35147
+ ...opts.scope ? { scope: opts.scope } : {}
35148
+ });
35125
35149
  } catch (err2) {
35150
+ if (isQuotaError(err2)) {
35151
+ console.warn("[errata] collectiveDrilldown: collective read QUOTA EXCEEDED \u2014 the id's existence is unknown, not refuted.");
35152
+ return { status: "quota" };
35153
+ }
35126
35154
  console.error(
35127
35155
  "[errata] collectiveDrilldown: cloud fallback failed \u2014",
35128
35156
  err2 instanceof Error ? err2.message : err2
35129
35157
  );
35130
- return null;
35158
+ return { status: "offline" };
35159
+ }
35160
+ const seedEntry = res.seeds?.find((s) => s.seed === seedId);
35161
+ const resolution = seedEntry?.status;
35162
+ if (resolution === "unresolved") return { status: "no-twin" };
35163
+ if (resolution === "error") return { status: "seed-error" };
35164
+ if (res.nodes.length === 0 && resolution !== "resolved") return { status: "no-twin" };
35165
+ return {
35166
+ status: "resolved",
35167
+ neighborhood: {
35168
+ seed: seedId,
35169
+ ...seedEntry?.nodeId ? { nodeId: seedEntry.nodeId } : {},
35170
+ nodes: res.nodes.map((n) => {
35171
+ const score2 = n.attrs["score"];
35172
+ const uncertainty = n.attrs["uncertainty"];
35173
+ const community = attrsCommunity(n.attrs);
35174
+ return {
35175
+ id: n.id,
35176
+ label: n.label,
35177
+ name: n.description,
35178
+ ...typeof score2 === "number" ? { score: Number(score2.toFixed(4)) } : {},
35179
+ ...typeof uncertainty === "number" ? { uncertainty: Number(uncertainty.toFixed(4)) } : {},
35180
+ ...community ? { community } : {},
35181
+ hops: 1,
35182
+ provenance: "collective"
35183
+ };
35184
+ }),
35185
+ edges: res.edges.map((e) => ({ from: e.from, to: e.to, type: e.type })),
35186
+ ...seedEntry && "community" in seedEntry ? { seedCommunity: walkerCommunity(seedEntry.community) } : {},
35187
+ ...seedEntry?.bridges ? { bridges: seedEntry.bridges } : {}
35188
+ }
35189
+ };
35190
+ }
35191
+ async function collectiveNodeDetail(cloud, id) {
35192
+ const read2 = async (nodeId) => {
35193
+ try {
35194
+ return await cloud.getNode(nodeId);
35195
+ } catch (err2) {
35196
+ if (isQuotaError(err2)) return "quota";
35197
+ console.error("[errata] collectiveNodeDetail: node read failed \u2014", err2 instanceof Error ? err2.message : err2);
35198
+ return "offline";
35199
+ }
35200
+ };
35201
+ let row = await read2(id);
35202
+ if (row === "quota" || row === "offline") return { status: row };
35203
+ if (!row) {
35204
+ const drill = await collectiveDrilldown(cloud, id, 1);
35205
+ if (drill.status !== "resolved") return drill;
35206
+ const nodeId = drill.neighborhood.nodeId;
35207
+ if (nodeId && nodeId !== id) {
35208
+ row = await read2(nodeId);
35209
+ if (row === "quota" || row === "offline") return { status: row };
35210
+ }
35211
+ if (!row) return { status: "found", node: null };
35131
35212
  }
35213
+ return {
35214
+ status: "found",
35215
+ node: {
35216
+ id,
35217
+ nodeId: row.id,
35218
+ label: row.label,
35219
+ description: row.description,
35220
+ evidence: {
35221
+ validated: row.validated,
35222
+ acceptedCount: row.accepted,
35223
+ corroborationCount: row.corroborations,
35224
+ failureReportCount: row.refutes,
35225
+ effectivenessScore: row.effectivenessScore ?? null,
35226
+ uncertainty: row.uncertainty?.value ?? null,
35227
+ priorStrength: row.uncertainty?.priorStrength ?? null,
35228
+ trustTier: row.trustTier ?? null
35229
+ },
35230
+ memoryTier: row.memoryTier,
35231
+ reinforcementCount: row.reinforced,
35232
+ hits: row.hits,
35233
+ createdAtMs: row.createdAtMs,
35234
+ lastValidatedAtMs: row.lastValidatedAtMs,
35235
+ visibility: row.visibility,
35236
+ ...row.community !== void 0 ? { community: walkerCommunity(row.community) } : {},
35237
+ resolvedBy: row.resolvedBy,
35238
+ causalChain: row.causalChain ?? [],
35239
+ related: row.related
35240
+ }
35241
+ };
35132
35242
  }
35133
35243
  function formatDualNodes(merged) {
35134
35244
  return merged.nodes.map((n) => ({
@@ -35140,6 +35250,7 @@ function formatDualNodes(merged) {
35140
35250
  provenance: n.provenance,
35141
35251
  ...n.usageCount != null ? { usageCount: n.usageCount } : {},
35142
35252
  ...n.rel ? { rel: n.rel } : {},
35253
+ ...n.community ? { community: n.community } : {},
35143
35254
  ...n.why ? {
35144
35255
  why: {
35145
35256
  semantic: Number(n.why.semantic.toFixed(3)),
@@ -44414,11 +44525,37 @@ function cosine3(a, b) {
44414
44525
  for (let i2 = 0; i2 < a.length; i2++) dot += a[i2] * b[i2];
44415
44526
  return dot;
44416
44527
  }
44417
- async function collectiveSeedFallback(args2, ctx, defaultLimit) {
44528
+ async function collectiveSeedFallback(args2, ctx, defaultLimit, opts = {}) {
44418
44529
  const seedId = typeof args2["nodeId"] === "string" ? args2["nodeId"] : null;
44419
44530
  if (!seedId || !ctx.cloud || !hasCloudNodeShape(seedId)) return null;
44420
44531
  const limit = Math.max(1, Math.min(100, Number(args2["limit"] ?? defaultLimit)));
44421
- return collectiveDrilldown(ctx.cloud, seedId, limit);
44532
+ const scope = args2["scope"];
44533
+ return collectiveDrilldown(ctx.cloud, seedId, limit, {
44534
+ ...opts.allowScope && (scope === "community" || scope === "neighborhood" || scope === "global") ? { scope } : {},
44535
+ ...opts.allowBridges && args2["bridges"] === true ? { bridges: true } : {}
44536
+ });
44537
+ }
44538
+ function collectiveCommunityFields(cn) {
44539
+ return {
44540
+ ...cn.seedCommunity !== void 0 ? { seedCommunity: cn.seedCommunity } : {},
44541
+ ...cn.bridges ? { bridges: cn.bridges } : {}
44542
+ };
44543
+ }
44544
+ function collectiveSeedStatus(cn) {
44545
+ return cn.nodes.length > 0 ? "cloud-seed" : "cloud-seed-empty";
44546
+ }
44547
+ function collectiveSeedMiss(args2, outcome) {
44548
+ if (!outcome || outcome.status === "no-twin" || outcome.status === "resolved") return unresolved(args2);
44549
+ const { query } = unresolved(args2);
44550
+ const hint = outcome.status === "seed-error" ? "collective reached, but this id's lookup failed server-side \u2014 its existence is unknown; retry" : federationHint(outcome.status);
44551
+ return {
44552
+ found: false,
44553
+ reason: "collective-unreachable",
44554
+ query,
44555
+ collectiveReachable: outcome.status === "seed-error",
44556
+ collectiveStatus: outcome.status === "seed-error" ? "cloud-seed-error" : outcome.status,
44557
+ ...hint ? { collectiveHint: hint } : {}
44558
+ };
44422
44559
  }
44423
44560
  function resolveSymbol2(store, args2) {
44424
44561
  const id = args2["nodeId"];
@@ -44770,23 +44907,25 @@ var init_mcp = __esm({
44770
44907
  handler: async (args2, store, ctx) => {
44771
44908
  const id = resolveSymbol2(store, args2);
44772
44909
  if (!id) {
44773
- const cn = await collectiveSeedFallback(args2, ctx, 30);
44774
- if (cn) {
44910
+ const cs = await collectiveSeedFallback(args2, ctx, 30);
44911
+ if (cs?.status === "resolved") {
44912
+ const cn = cs.neighborhood;
44775
44913
  return {
44776
44914
  found: true,
44777
44915
  node: { id: cn.seed, provenance: "collective" },
44778
44916
  collectiveReachable: true,
44779
- collectiveStatus: "cloud-seed",
44917
+ collectiveStatus: collectiveSeedStatus(cn),
44780
44918
  // Seed-touching edge types aren't on the wire (the server's seed
44781
44919
  // burst excludes the seed itself, and edges to nodes outside the
44782
44920
  // result set are dropped), so the collective fallback reports the
44783
44921
  // 1-hop neighborhood + its internal topology instead of the local
44784
44922
  // contract's typed out/in lists.
44785
44923
  nearby: cn.nodes,
44786
- edges: cn.edges
44924
+ edges: cn.edges,
44925
+ ...collectiveCommunityFields(cn)
44787
44926
  };
44788
44927
  }
44789
- return unresolved(args2);
44928
+ return collectiveSeedMiss(args2, cs);
44790
44929
  }
44791
44930
  const limit = Math.max(1, Math.min(200, Number(args2["limit"] ?? 30)));
44792
44931
  const node2 = store.getNode(id);
@@ -44821,32 +44960,44 @@ var init_mcp = __esm({
44821
44960
  },
44822
44961
  {
44823
44962
  name: "errata.burst",
44824
- description: "Burst-grade local retrieval \u2014 the INTELLIGENT, seed-relative neighborhood (not a flat list). Given a SEED (`nodeId` or `qname`), expand its neighborhood and return the RELEVANT scored subset, ranked by burst-style relevance: semantic similarity to the seed \xD7 centrality \xD7 trust, hop-decayed; semantically-unrelated nodes are gated out. Prefer this over errata.neighbors when you want signal-ranked CONTEXT rather than raw edges. When the SEED is a package and the collective is reachable, results BLEND cross-project knowledge \u2014 each carries `provenance` (local | collective | corroborated) and `usageCount` (projects using it); `corroborated` means your graph and the collective agree (trust it most), `collective` is a cross-project prior to verify. Returns {seed, count, results:[{id,label,name,score,hops,provenance,usageCount?,why?,via?}]} \u2014 `via` is the TOPOLOGY: the edge that reached this result in the walk ({edgeType, parentId, forward}; forward: true \u21D2 parent \u2014edgeType\u2192 node), so you can tell 'FIXED_BY your seed' from 'two hops away via a shared package' and choose whether to dig down a causal chain or turn elsewhere.",
44963
+ description: "Burst-grade local retrieval \u2014 the INTELLIGENT, seed-relative neighborhood (not a flat list). Given a SEED (`nodeId` or `qname`), expand its neighborhood and return the RELEVANT scored subset, ranked by burst-style relevance: semantic similarity to the seed \xD7 centrality \xD7 trust, hop-decayed; semantically-unrelated nodes are gated out. Prefer this over errata.neighbors when you want signal-ranked CONTEXT rather than raw edges. When the SEED is a package and the collective is reachable, results BLEND cross-project knowledge \u2014 each carries `provenance` (local | collective | corroborated) and `usageCount` (projects using it); `corroborated` means your graph and the collective agree (trust it most), `collective` is a cross-project prior to verify. Returns {seed, count, results:[{id,label,name,score,hops,provenance,usageCount?,why?,via?}]} \u2014 `via` is the TOPOLOGY: the edge that reached this result in the walk ({edgeType, parentId, forward}; forward: true \u21D2 parent \u2014edgeType\u2192 node), so you can tell 'FIXED_BY your seed' from 'two hops away via a shared package' and choose whether to dig down a causal chain or turn elsewhere. A COLLECTIVE seed (a cloud id not in your graph) also reports `seedCommunity` {id,label} and each result's `community`; ids are tonight's partition (renumbered nightly \u2014 compare within one walk, never store). Pass `scope` to stay in / leave the seed's community and `bridges:true` for the bordering communities and their crossing edges.",
44825
44964
  inputSchema: {
44826
44965
  type: "object",
44827
44966
  properties: {
44828
44967
  nodeId: { type: "string" },
44829
44968
  qname: { type: "string", description: "Symbol qname (resolved to a node)." },
44830
44969
  maxHops: { type: "number", description: "Neighborhood radius (default 2)." },
44831
- limit: { type: "number", description: "Max results (default 20)." }
44970
+ limit: { type: "number", description: "Max results (default 20)." },
44971
+ scope: {
44972
+ type: "string",
44973
+ enum: ["community", "neighborhood", "global"],
44974
+ description: "Collective seeds only: `community` keeps only the seed's community, `global` ranks cross-community neighbours on par; default `neighborhood`."
44975
+ },
44976
+ bridges: {
44977
+ type: "boolean",
44978
+ description: "Collective seeds only: also return `bridges` \u2014 the communities bordering the seed's, each with its strongest crossing edges (where to go next)."
44979
+ }
44832
44980
  }
44833
44981
  },
44834
44982
  handler: async (args2, store, ctx) => {
44835
44983
  const id = resolveSymbol2(store, args2);
44836
44984
  if (!id) {
44837
- const cn = await collectiveSeedFallback(args2, ctx, 20);
44838
- if (cn) {
44985
+ const cs = await collectiveSeedFallback(args2, ctx, 20, { allowScope: true, allowBridges: true });
44986
+ if (cs?.status === "resolved") {
44987
+ const cn = cs.neighborhood;
44839
44988
  return {
44989
+ found: true,
44840
44990
  seed: cn.seed,
44841
44991
  seedProvenance: "collective",
44842
44992
  collectiveReachable: true,
44843
- collectiveStatus: "cloud-seed",
44993
+ collectiveStatus: collectiveSeedStatus(cn),
44844
44994
  count: cn.nodes.length,
44845
44995
  results: cn.nodes,
44846
- edges: cn.edges
44996
+ edges: cn.edges,
44997
+ ...collectiveCommunityFields(cn)
44847
44998
  };
44848
44999
  }
44849
- return unresolved(args2);
45000
+ return collectiveSeedMiss(args2, cs);
44850
45001
  }
44851
45002
  const seedForBurst = store.getNode(id);
44852
45003
  if (seedForBurst && seedForBurst.embedding.length === 0) {
@@ -45016,26 +45167,29 @@ var init_mcp = __esm({
45016
45167
  handler: async (args2, store, ctx) => {
45017
45168
  const id = resolveSymbol2(store, args2);
45018
45169
  if (!id) {
45019
- const cn = await collectiveSeedFallback(args2, ctx, 30);
45020
- if (cn) {
45170
+ const cs = await collectiveSeedFallback(args2, ctx, 30);
45171
+ if (cs?.status === "resolved") {
45172
+ const cn = cs.neighborhood;
45021
45173
  return {
45022
45174
  found: true,
45023
45175
  seedId: cn.seed,
45024
45176
  seedProvenance: "collective",
45025
45177
  collectiveReachable: true,
45026
- collectiveStatus: "cloud-seed",
45178
+ collectiveStatus: collectiveSeedStatus(cn),
45027
45179
  nodes: cn.nodes.map((n) => ({
45028
45180
  id: n.id,
45029
45181
  label: n.label,
45030
45182
  description: n.name,
45031
45183
  hops: n.hops,
45032
45184
  relevance: n.score,
45033
- provenance: n.provenance
45185
+ provenance: n.provenance,
45186
+ ...n.community ? { community: n.community } : {}
45034
45187
  })),
45035
- edges: cn.edges
45188
+ edges: cn.edges,
45189
+ ...collectiveCommunityFields(cn)
45036
45190
  };
45037
45191
  }
45038
- return unresolved(args2);
45192
+ return collectiveSeedMiss(args2, cs);
45039
45193
  }
45040
45194
  const maxHops = Math.max(1, Math.min(8, Number(args2["maxHops"] ?? 4)));
45041
45195
  const limit = Math.max(1, Math.min(100, Number(args2["limit"] ?? 30)));
@@ -45399,7 +45553,7 @@ var init_mcp = __esm({
45399
45553
  },
45400
45554
  {
45401
45555
  name: "errata.show",
45402
- description: "Print the source code for a node. Uses bodyStartByte/endByte if the node has them (Function/Method/Class), else falls back to startByte/endByte (Const/Comment). File nodes return the whole file content. Returns {found, path, signature, calls (in source order), startLine, endLine, source}.",
45556
+ description: "Print the source code for a node. Uses bodyStartByte/endByte if the node has them (Function/Method/Class), else falls back to startByte/endByte (Const/Comment). File nodes return the whole file content. Returns {found, path, signature, calls (in source order), startLine, endLine, source}. A cloud id from search's collective blend (e.g. projn_\u2026, dprob_\u2026) that isn't in the local graph returns the collective node's own record instead: {found, provenance:'collective', node:{label, description, evidence:{validated, acceptedCount, corroborationCount, failureReportCount, effectivenessScore, uncertainty, priorStrength, trustTier}, causalChain, related (causal neighbours, both directions)}}.",
45403
45557
  inputSchema: {
45404
45558
  type: "object",
45405
45559
  properties: {
@@ -45409,9 +45563,21 @@ var init_mcp = __esm({
45409
45563
  maxLines: { type: "number" }
45410
45564
  }
45411
45565
  },
45412
- handler: (args2, store) => {
45566
+ handler: async (args2, store, ctx) => {
45413
45567
  const id = resolveSymbol2(store, args2);
45414
- if (!id) return unresolved(args2);
45568
+ if (!id) {
45569
+ const seedId = typeof args2["nodeId"] === "string" ? args2["nodeId"] : null;
45570
+ if (!seedId || !ctx.cloud || !hasCloudNodeShape(seedId)) return unresolved(args2);
45571
+ const shown = await collectiveNodeDetail(ctx.cloud, seedId);
45572
+ if (shown.status !== "found") return collectiveSeedMiss(args2, shown);
45573
+ return {
45574
+ found: true,
45575
+ provenance: "collective",
45576
+ collectiveReachable: true,
45577
+ collectiveStatus: shown.node ? "cloud-node" : "cloud-node-no-detail",
45578
+ ...shown.node ? { node: shown.node } : { node: { id: seedId } }
45579
+ };
45580
+ }
45415
45581
  const node2 = store.getNode(id);
45416
45582
  if (!node2) return { found: false, reason: "not-found" };
45417
45583
  const maxLines = Math.max(10, Math.min(2e3, Number(args2["maxLines"] ?? 200)));
@@ -83013,7 +83179,7 @@ function createWatchBreaker(deps) {
83013
83179
  }
83014
83180
 
83015
83181
  // src/engine.ts
83016
- var DAEMON_VERSION = true ? "2.0.21-dev.3863" : "2.0.0-alpha.0";
83182
+ var DAEMON_VERSION = true ? "2.0.21-dev.3904" : "2.0.0-alpha.0";
83017
83183
  var IGNORED_PATH = /[\\/](?:\.git|node_modules|\.errata|\.claude|\.codex|\.cursor|\.turbo|\.next|dist|coverage|test-results|playwright-report|__pycache__)(?:[\\/]|$)/;
83018
83184
  var IGNORED_NOISE = /castalia\.db|eventlog\.sqlite|turn-cursors/;
83019
83185
  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.21-dev.3863",
3
+ "version": "2.0.21-dev.3904",
4
4
  "description": "errata - local-first observation engine for AI coding agents",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "errata-context",
3
- "version": "2.0.21-dev.3863",
3
+ "version": "2.0.21-dev.3904",
4
4
  "description": "A minimal 3D view of loaded Errata priors and recent graph bursts.",
5
5
  "author": {
6
6
  "name": "inErrata"
@@ -1,4 +1,4 @@
1
- d2b8238acf66ab6c4bb1cfb326376ef90018fc2e3ebe8c4a3dabdfff67135669 .codex-plugin/plugin.json
1
+ 80437cb509261f3ab983d93240320f8ef99241c2b0709ccca75d3052035b27a7 .codex-plugin/plugin.json
2
2
  a7bebae9fb01c838d6c75fc784129e28be571233fa66ff5ee8039b574f35ccf7 assets/icon.png
3
3
  fc38b64e4df1e0b72c35764bef6c4c05430d97c9009ad0ecc8a9e75b4deab232 configure-local.mjs
4
4
  73dc6028b3b070257c7c31f252d11e55a9e096f4aed0f187f10cb21716e1e6d7 dist/client.js