@inerrata-corporation/errata 2.0.22-dev.4430 → 2.0.22-dev.4530
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/consolidate-worker.mjs +155 -4
- package/errata.mjs +1244 -535
- package/generalize-worker.mjs +149 -2
- package/package.json +1 -1
- package/pass-worker.mjs +176 -9
- package/resources/context-plugin/.codex-plugin/plugin.json +1 -1
- package/resources/context-plugin/SHA256SUMS +1 -1
package/consolidate-worker.mjs
CHANGED
|
@@ -15790,7 +15790,7 @@ var init_history_temporal = __esm({
|
|
|
15790
15790
|
});
|
|
15791
15791
|
|
|
15792
15792
|
// ../../packages/shared/src/history-revision.ts
|
|
15793
|
-
var Sha, HistoryRevisionRequestSchema;
|
|
15793
|
+
var Sha, HistoryRevisionRequestSchema, HistoryCarryRequestSchema, HISTORY_REVIEW_BUDGET, HISTORY_REVIEW_POLICY;
|
|
15794
15794
|
var init_history_revision = __esm({
|
|
15795
15795
|
"../../packages/shared/src/history-revision.ts"() {
|
|
15796
15796
|
"use strict";
|
|
@@ -15810,6 +15810,17 @@ var init_history_revision = __esm({
|
|
|
15810
15810
|
dependencyContext: HistoryDependencyContextSchema.optional()
|
|
15811
15811
|
})).max(50)
|
|
15812
15812
|
});
|
|
15813
|
+
HistoryCarryRequestSchema = external_exports.strictObject({
|
|
15814
|
+
fromCommit: Sha,
|
|
15815
|
+
atCommit: Sha,
|
|
15816
|
+
parents: external_exports.array(external_exports.strictObject({ commit: Sha, parents: external_exports.array(Sha).max(32) })).max(8192),
|
|
15817
|
+
/** Every symbol in a file the range changed, both sides; `null` = too many to name, treat all as changed. */
|
|
15818
|
+
changedSymbols: external_exports.array(external_exports.string().regex(/^sym_[a-f0-9]{8,64}$/)).max(5e3).nullable(),
|
|
15819
|
+
/** Manifests the range changed; `null` = a lockfile (or too many manifests) changed, treat all as changed. */
|
|
15820
|
+
changedManifests: external_exports.array(external_exports.string().regex(/^hmanifest_[a-f0-9]{32}$/)).max(512).nullable()
|
|
15821
|
+
});
|
|
15822
|
+
HISTORY_REVIEW_BUDGET = 48e3;
|
|
15823
|
+
HISTORY_REVIEW_POLICY = `reviewer-view-${HISTORY_REVIEW_BUDGET}`;
|
|
15813
15824
|
}
|
|
15814
15825
|
});
|
|
15815
15826
|
|
|
@@ -17093,6 +17104,114 @@ function textIndexReady(db) {
|
|
|
17093
17104
|
return db.prepare("SELECT value FROM store_meta WHERE key = ?").get(TEXT_INDEX_KEY)?.["value"] === "installed";
|
|
17094
17105
|
}
|
|
17095
17106
|
|
|
17107
|
+
// ../../packages/local-graph/src/exposure-attrs.ts
|
|
17108
|
+
var EXPOSURE_ATTRS = [
|
|
17109
|
+
"shownCount",
|
|
17110
|
+
"evictedCount",
|
|
17111
|
+
"firstShownAt",
|
|
17112
|
+
"firstEvictedAt",
|
|
17113
|
+
"firstShownAtSeq",
|
|
17114
|
+
"lastShownAtSeq",
|
|
17115
|
+
"lastEvictedAtSeq",
|
|
17116
|
+
"shownSinceTouch",
|
|
17117
|
+
"shownSinceTouchAt",
|
|
17118
|
+
"exposureLog",
|
|
17119
|
+
"exposureLogStart",
|
|
17120
|
+
"exposureLogSince",
|
|
17121
|
+
"exposureFirst",
|
|
17122
|
+
"exposureTrimmed"
|
|
17123
|
+
];
|
|
17124
|
+
var EXPOSURE_SCOPE = "exposure";
|
|
17125
|
+
|
|
17126
|
+
// ../../packages/local-graph/src/change-feed.ts
|
|
17127
|
+
var CHANGE_FEED_KEY = "change-feed";
|
|
17128
|
+
var ANY_CHANGE = "*";
|
|
17129
|
+
var CHANGE_LOG_KEEP = 25e4;
|
|
17130
|
+
var PRUNED_TO_KEY = "change-log-pruned-to";
|
|
17131
|
+
function installChangeFeed(db) {
|
|
17132
|
+
if (changeFeedInstalled(db)) return;
|
|
17133
|
+
db.transaction(() => {
|
|
17134
|
+
db.exec("CREATE TABLE IF NOT EXISTS change_seq (scope TEXT PRIMARY KEY, seq INTEGER NOT NULL) WITHOUT ROWID");
|
|
17135
|
+
db.exec(`CREATE TABLE IF NOT EXISTS change_log (change_seq INTEGER PRIMARY KEY, kind TEXT NOT NULL, id TEXT NOT NULL,
|
|
17136
|
+
label TEXT, from_id TEXT, to_id TEXT)`);
|
|
17137
|
+
for (const name of ["nodes", "edges"].flatMap((t) => ["insert", "update", "delete"].map((op) => `change_feed_${t}_${op}`))) {
|
|
17138
|
+
db.exec(`DROP TRIGGER IF EXISTS ${name}`);
|
|
17139
|
+
}
|
|
17140
|
+
const changed = (table) => columns(db, table).map((c) => `OLD."${c}" IS NOT NEW."${c}"`).join(" OR ");
|
|
17141
|
+
const strip = (row) => `json_remove(${row}.attrs_json, ${EXPOSURE_ATTRS.map((a) => `'$.${a}'`).join(", ")})`;
|
|
17142
|
+
const exposureOnly = `(${columns(db, "nodes").filter((c) => c !== "attrs_json").map((c) => `OLD."${c}" IS NEW."${c}"`).join(" AND ")}
|
|
17143
|
+
AND CASE WHEN json_valid(OLD.attrs_json) AND json_valid(NEW.attrs_json) THEN ${strip("OLD")} IS ${strip("NEW")} ELSE 0 END)`;
|
|
17144
|
+
const bump = (...scopes) => `INSERT INTO change_seq(scope, seq) VALUES ${scopes.map((s) => `(${s}, 1)`).join(", ")}
|
|
17145
|
+
ON CONFLICT(scope) DO UPDATE SET seq = seq + 1;`;
|
|
17146
|
+
const seq = `(SELECT seq FROM change_seq WHERE scope = '*')`;
|
|
17147
|
+
const logNode = (row) => `INSERT INTO change_log(change_seq, kind, id, label) VALUES (${seq}, 'node', ${row}.id, ${row}.label);`;
|
|
17148
|
+
const logEdge = (row) => `INSERT INTO change_log(change_seq, kind, id, label, from_id, to_id) VALUES (${seq}, 'edge', ${row}.id, ${row}.type, ${row}.from_id, ${row}.to_id);`;
|
|
17149
|
+
const node = (row) => `'node:' || ${row}.label`;
|
|
17150
|
+
const edge = (row) => `'edge:' || ${row}.type`;
|
|
17151
|
+
db.exec(`CREATE TRIGGER change_feed_nodes_insert AFTER INSERT ON nodes BEGIN ${bump(`'*'`, node("NEW"))} ${logNode("NEW")} END;`);
|
|
17152
|
+
db.exec(`CREATE TRIGGER change_feed_nodes_update AFTER UPDATE ON nodes WHEN ${changed("nodes")} BEGIN
|
|
17153
|
+
${bump(`'*'`)}
|
|
17154
|
+
INSERT INTO change_seq(scope, seq) SELECT CASE WHEN ${exposureOnly} THEN '${EXPOSURE_SCOPE}' ELSE ${node("NEW")} END, 1 WHERE 1
|
|
17155
|
+
ON CONFLICT(scope) DO UPDATE SET seq = seq + 1;
|
|
17156
|
+
INSERT INTO change_seq(scope, seq) SELECT ${node("OLD")}, 1 WHERE OLD.label IS NOT NEW.label
|
|
17157
|
+
ON CONFLICT(scope) DO UPDATE SET seq = seq + 1;
|
|
17158
|
+
${logNode("NEW")}
|
|
17159
|
+
END;`);
|
|
17160
|
+
db.exec(`CREATE TRIGGER change_feed_nodes_delete AFTER DELETE ON nodes BEGIN ${bump(`'*'`, node("OLD"))} ${logNode("OLD")} END;`);
|
|
17161
|
+
db.exec(`CREATE TRIGGER change_feed_edges_insert AFTER INSERT ON edges BEGIN ${bump(`'*'`, edge("NEW"))} ${logEdge("NEW")} END;`);
|
|
17162
|
+
db.exec(`CREATE TRIGGER change_feed_edges_update AFTER UPDATE ON edges WHEN ${changed("edges")} BEGIN
|
|
17163
|
+
${bump(`'*'`, edge("NEW"))}
|
|
17164
|
+
INSERT INTO change_seq(scope, seq) SELECT ${edge("OLD")}, 1 WHERE OLD.type IS NOT NEW.type
|
|
17165
|
+
ON CONFLICT(scope) DO UPDATE SET seq = seq + 1;
|
|
17166
|
+
${logEdge("NEW")}
|
|
17167
|
+
END;`);
|
|
17168
|
+
db.exec(`CREATE TRIGGER change_feed_edges_delete AFTER DELETE ON edges BEGIN ${bump(`'*'`, edge("OLD"))} ${logEdge("OLD")} END;`);
|
|
17169
|
+
db.prepare("INSERT OR REPLACE INTO store_meta(key, value) VALUES (?, ?)").run(PRUNED_TO_KEY, String(readChangeSeq(db)));
|
|
17170
|
+
db.prepare("INSERT OR REPLACE INTO store_meta(key, value) VALUES (?, ?)").run(CHANGE_FEED_KEY, columnSignature(db));
|
|
17171
|
+
});
|
|
17172
|
+
}
|
|
17173
|
+
function readChangeSeq(db, scopes = [ANY_CHANGE]) {
|
|
17174
|
+
if (!scopes.length) return 0;
|
|
17175
|
+
const row = db.prepare(`SELECT coalesce(sum(seq), 0) AS n FROM change_seq WHERE scope IN (${scopes.map(() => "?").join(",")})`).get(...scopes);
|
|
17176
|
+
return Number(row?.n ?? 0);
|
|
17177
|
+
}
|
|
17178
|
+
function changeLogCovers(db, sinceSeq) {
|
|
17179
|
+
const prunedTo = Number(db.prepare("SELECT value FROM store_meta WHERE key = ?").get(PRUNED_TO_KEY)?.["value"] ?? NaN);
|
|
17180
|
+
return Number.isFinite(prunedTo) && sinceSeq >= prunedTo;
|
|
17181
|
+
}
|
|
17182
|
+
function readLineageChangedFiles(db, sinceSeq) {
|
|
17183
|
+
if (!changeLogCovers(db, sinceSeq)) return null;
|
|
17184
|
+
const rows = db.prepare(LINEAGE_CHANGED_FILES_SQL).all({ s: sinceSeq });
|
|
17185
|
+
return rows.map((r) => r.id);
|
|
17186
|
+
}
|
|
17187
|
+
var LINEAGE_CHANGED_FILES_SQL = `
|
|
17188
|
+
SELECT id FROM change_log WHERE change_seq > :s AND kind = 'node' AND label = 'File'
|
|
17189
|
+
UNION SELECT from_id FROM change_log WHERE change_seq > :s AND kind = 'edge' AND label IN ('DEFINES','CONTAINS')
|
|
17190
|
+
UNION SELECT e.from_id FROM (SELECT DISTINCT id FROM change_log WHERE change_seq > :s AND kind = 'node') c
|
|
17191
|
+
CROSS JOIN edges e ON e.to_id = c.id AND e.type IN ('DEFINES','CONTAINS')
|
|
17192
|
+
`;
|
|
17193
|
+
function pruneChangeLog(db) {
|
|
17194
|
+
const max = Number(db.prepare("SELECT coalesce(max(change_seq), 0) AS n FROM change_log").get()?.["n"] ?? 0);
|
|
17195
|
+
const cut = max - CHANGE_LOG_KEEP;
|
|
17196
|
+
if (cut <= 0) return 0;
|
|
17197
|
+
let removed = 0;
|
|
17198
|
+
db.transaction(() => {
|
|
17199
|
+
removed = Number(db.prepare("DELETE FROM change_log WHERE change_seq <= ?").run(cut).changes);
|
|
17200
|
+
const prev = Number(db.prepare("SELECT value FROM store_meta WHERE key = ?").get(PRUNED_TO_KEY)?.["value"] ?? 0);
|
|
17201
|
+
db.prepare("INSERT OR REPLACE INTO store_meta(key, value) VALUES (?, ?)").run(PRUNED_TO_KEY, String(Math.max(prev, cut)));
|
|
17202
|
+
});
|
|
17203
|
+
return removed;
|
|
17204
|
+
}
|
|
17205
|
+
function changeFeedInstalled(db) {
|
|
17206
|
+
return db.prepare("SELECT value FROM store_meta WHERE key = ?").get(CHANGE_FEED_KEY)?.["value"] === columnSignature(db);
|
|
17207
|
+
}
|
|
17208
|
+
function columns(db, table) {
|
|
17209
|
+
return db.prepare(`SELECT name FROM pragma_table_info('${table}') ORDER BY cid`).all().map((r) => r.name);
|
|
17210
|
+
}
|
|
17211
|
+
function columnSignature(db) {
|
|
17212
|
+
return `5|${columns(db, "nodes").join(",")}|${columns(db, "edges").join(",")}|${EXPOSURE_ATTRS.join(",")}`;
|
|
17213
|
+
}
|
|
17214
|
+
|
|
17096
17215
|
// ../../packages/local-graph/src/lineage-integrity.ts
|
|
17097
17216
|
var statements = /* @__PURE__ */ new WeakMap();
|
|
17098
17217
|
function stmt(db, sql) {
|
|
@@ -17880,6 +17999,7 @@ var SqliteGraphStore = class {
|
|
|
17880
17999
|
});
|
|
17881
18000
|
}
|
|
17882
18001
|
installLineageIntegrityRepair(this.db);
|
|
18002
|
+
installChangeFeed(this.db);
|
|
17883
18003
|
this.stmts = {
|
|
17884
18004
|
insertNode: this.db.prepare(`
|
|
17885
18005
|
INSERT INTO nodes (
|
|
@@ -18667,12 +18787,39 @@ var SqliteGraphStore = class {
|
|
|
18667
18787
|
mutationCount() {
|
|
18668
18788
|
return this.mutations;
|
|
18669
18789
|
}
|
|
18790
|
+
changeStamp() {
|
|
18791
|
+
const { data_version } = this.db.pragma("data_version");
|
|
18792
|
+
const { n } = this.db.prepare("SELECT total_changes() AS n").get();
|
|
18793
|
+
return `${data_version}:${n}`;
|
|
18794
|
+
}
|
|
18795
|
+
changeSeq(scopes) {
|
|
18796
|
+
return readChangeSeq(this.db, scopes);
|
|
18797
|
+
}
|
|
18798
|
+
lineageChangedFiles(sinceSeq) {
|
|
18799
|
+
return readLineageChangedFiles(this.db, sinceSeq);
|
|
18800
|
+
}
|
|
18801
|
+
pruneChangeLog() {
|
|
18802
|
+
return pruneChangeLog(this.db);
|
|
18803
|
+
}
|
|
18804
|
+
fileRowStates(ids) {
|
|
18805
|
+
if (ids.length === 0) return [];
|
|
18806
|
+
if (ids.length > 500) throw new RangeError("fileRowStates accepts at most 500 ids per read");
|
|
18807
|
+
return this.db.prepare(`SELECT id, last_updated_at AS lastUpdatedAt, valid_to AS validTo FROM nodes WHERE id IN (${ids.map(() => "?").join(",")})`).all(...ids);
|
|
18808
|
+
}
|
|
18809
|
+
// Read and advanced in SQL, never from a per-connection copy: pass workers and
|
|
18810
|
+
// MCP processes open their own connections and advance the same row, so a
|
|
18811
|
+
// copy loaded at open went stale, and `copy + 1` wrote a duplicate or a
|
|
18812
|
+
// backwards seq from whichever connection had fallen behind.
|
|
18670
18813
|
currentIngestSeq() {
|
|
18814
|
+
const row = this.db.prepare("SELECT value FROM store_meta WHERE key = 'ingest_seq'").get();
|
|
18815
|
+
this.ingestSeq = row ? Number(row.value) : 0;
|
|
18671
18816
|
return this.ingestSeq;
|
|
18672
18817
|
}
|
|
18673
18818
|
nextIngestSeq() {
|
|
18674
|
-
this.
|
|
18675
|
-
|
|
18819
|
+
const row = this.db.prepare(
|
|
18820
|
+
"INSERT INTO store_meta (key, value) VALUES ('ingest_seq', '1') ON CONFLICT(key) DO UPDATE SET value = CAST(value AS INTEGER) + 1 RETURNING value"
|
|
18821
|
+
).get();
|
|
18822
|
+
this.ingestSeq = Number(row.value);
|
|
18676
18823
|
return this.ingestSeq;
|
|
18677
18824
|
}
|
|
18678
18825
|
edgeCount() {
|
|
@@ -19712,10 +19859,14 @@ function buildContextIngest(store, profile, daemonVersion, ignorePatterns = [],
|
|
|
19712
19859
|
}
|
|
19713
19860
|
}
|
|
19714
19861
|
if (nodes.length === 0) return null;
|
|
19862
|
+
const contributed = (id) => {
|
|
19863
|
+
const n = store.getNode(id);
|
|
19864
|
+
return !!n && (n.label === "Package" || n.label === "Language") && n.attrs["source"] !== "cloud" && typeof n.attrs["contributedAtSeq"] === "number" && !ignored(n.description) && !ignored(String(n.attrs["name"] ?? ""));
|
|
19865
|
+
};
|
|
19715
19866
|
const edges = [];
|
|
19716
19867
|
for (const id of seen) {
|
|
19717
19868
|
for (const e of store.outEdges(id, ["DEPENDS_ON"])) {
|
|
19718
|
-
if (seen.has(e.to)) edges.push({ ...e, attrs: {} });
|
|
19869
|
+
if (seen.has(e.to) || contributed(e.to)) edges.push({ ...e, attrs: {} });
|
|
19719
19870
|
}
|
|
19720
19871
|
}
|
|
19721
19872
|
const base = {
|