@lmzhen/dsh-evolution-core 0.32.2 → 0.32.4
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/README.md +5 -5
- package/lib/composition/index.js +2 -2
- package/lib/{composition-DSesmTvf.js → composition-3QFfEe56.js} +1 -1
- package/lib/{ensure-BuWsjPGD.js → ensure-C2tUoF5U.js} +1 -1
- package/lib/{errors-Br2-uUSK.js → errors-DRZ9A187.js} +1 -0
- package/lib/index.js +475 -113
- package/lib/restrictor.js +1 -1
- package/lib/subagent/index.js +1 -1
- package/lib/types/errors.d.ts +1 -0
- package/lib/types/errors.js +1 -0
- package/lib/types/index.d.ts +1 -0
- package/lib/types/index.js +1 -0
- package/lib/types/mutation-storage-adapter.d.ts +5 -2
- package/lib/types/mutation-storage-adapter.js +59 -22
- package/lib/types/mutation-unit.d.ts +2 -2
- package/lib/types/mutation-unit.js +18 -45
- package/lib/types/params.js +1 -1
- package/lib/types/platform-services.js +0 -1
- package/lib/types/session-projection.d.ts +32 -0
- package/lib/types/session-projection.js +51 -3
- package/lib/types/skill-reads.d.ts +19 -0
- package/lib/types/skill-reads.js +42 -2
- package/lib/types/skill-store.js +4 -2
- package/lib/types/tool-dispatch.d.ts +16 -0
- package/lib/types/tool-dispatch.js +42 -11
- package/lib/types/unit-journal.d.ts +5 -3
- package/lib/types/unit-journal.js +7 -6
- package/lib/types/unit-storage.d.ts +5 -4
- package/lib/types/unit-storage.js +8 -8
- package/lib/types/unit-transaction.js +5 -7
- package/lib/types/write-gates.d.ts +4 -0
- package/lib/types/write-gates.js +16 -1
- package/lib/types/write-kernel.d.ts +81 -0
- package/lib/types/write-kernel.js +155 -0
- package/package.json +2 -2
- package/persisted-write-inventory.json +1 -10
package/lib/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { _ as scopedPackageName, c as MAINTAINER_PRESET_ID, d as RESTRICTED_TOOLS_ROW_ID, f as RESTRICTOR_MODULE, g as scopeOfNearestManifest, p as REVIEWER_PRESET_ID, s as EVOLUTION_PRESET_IDS, u as RESTRICTED_PRESET_DISPLAY } from "./ensure-
|
|
1
|
+
import { _ as scopedPackageName, c as MAINTAINER_PRESET_ID, d as RESTRICTED_TOOLS_ROW_ID, f as RESTRICTOR_MODULE, g as scopeOfNearestManifest, p as REVIEWER_PRESET_ID, s as EVOLUTION_PRESET_IDS, u as RESTRICTED_PRESET_DISPLAY } from "./ensure-C2tUoF5U.js";
|
|
2
2
|
import { a as methodNotAllowed, c as asRecord, i as json, l as isRecord, n as MAX_REQUEST_BODY_BYTES, o as readJsonObject, r as hostSurface, s as registerHostRoutes, t as HOST_ROUTES } from "./http-routes-D1Ty6nnh.js";
|
|
3
|
-
import { w as allowRowCollisions } from "./composition-
|
|
4
|
-
import { n as errorText, t as EVOLUTION_ERRORS } from "./errors-
|
|
3
|
+
import { w as allowRowCollisions } from "./composition-3QFfEe56.js";
|
|
4
|
+
import { n as errorText, t as EVOLUTION_ERRORS } from "./errors-DRZ9A187.js";
|
|
5
5
|
import { createSubagentChannel, probeChannelState, subagentChannelState } from "./subagent/index.js";
|
|
6
6
|
import { createHash, randomBytes, randomUUID } from "node:crypto";
|
|
7
7
|
import { basename, dirname, isAbsolute, join, relative, resolve } from "node:path";
|
|
@@ -256,11 +256,11 @@ const UNIT_STORAGE_SCHEMA_VERSION = 1;
|
|
|
256
256
|
function unitStorageKey(unitId) {
|
|
257
257
|
return createHash("sha256").update(unitId).digest("hex");
|
|
258
258
|
}
|
|
259
|
-
function unitSnapshotsDir(home) {
|
|
260
|
-
return join(home, "merge", "unit-snapshots");
|
|
259
|
+
function unitSnapshotsDir(home, scope = "merge") {
|
|
260
|
+
return scope === "merge" ? join(home, "merge", "unit-snapshots") : join(home, "units", "skill", "snapshots");
|
|
261
261
|
}
|
|
262
|
-
function unitSnapshotPath(home, unitId) {
|
|
263
|
-
return join(unitSnapshotsDir(home), unitStorageKey(unitId) + ".json");
|
|
262
|
+
function unitSnapshotPath(home, unitId, scope = "merge") {
|
|
263
|
+
return join(unitSnapshotsDir(home, scope), unitStorageKey(unitId) + ".json");
|
|
264
264
|
}
|
|
265
265
|
function unitEvidencePath(home, unitId) {
|
|
266
266
|
return join(home, "merge", "units", unitStorageKey(unitId), "evidence.json");
|
|
@@ -268,15 +268,15 @@ function unitEvidencePath(home, unitId) {
|
|
|
268
268
|
function unitIndexPath(home) {
|
|
269
269
|
return join(home, "merge", "unit-index.json");
|
|
270
270
|
}
|
|
271
|
-
async function writeUnitSnapshot(io, home, snapshot) {
|
|
272
|
-
const path = unitSnapshotPath(home, snapshot.unitId);
|
|
271
|
+
async function writeUnitSnapshot(io, home, snapshot, scope = "merge") {
|
|
272
|
+
const path = unitSnapshotPath(home, snapshot.unitId, scope);
|
|
273
273
|
const content = JSON.stringify(snapshot, null, 2) + "\n";
|
|
274
274
|
if (io.transact !== void 0) await io.transact(path, () => content);
|
|
275
275
|
else await io.writeText(path, content);
|
|
276
276
|
return path;
|
|
277
277
|
}
|
|
278
|
-
async function readUnitSnapshot(io, home, unitId) {
|
|
279
|
-
const raw = await io.readText(unitSnapshotPath(home, unitId));
|
|
278
|
+
async function readUnitSnapshot(io, home, unitId, scope = "merge") {
|
|
279
|
+
const raw = await io.readText(unitSnapshotPath(home, unitId, scope));
|
|
280
280
|
if (raw === null) return null;
|
|
281
281
|
try {
|
|
282
282
|
return JSON.parse(raw);
|
|
@@ -371,8 +371,8 @@ const UNIT_JOURNAL_PHASES = [
|
|
|
371
371
|
"failed",
|
|
372
372
|
"rolled-back"
|
|
373
373
|
];
|
|
374
|
-
function unitJournalPath(home, unitId) {
|
|
375
|
-
return join(home, "merge", "unit-journals", createHash("sha256").update(unitId).digest("hex") + ".json");
|
|
374
|
+
function unitJournalPath(home, unitId, scope = "merge") {
|
|
375
|
+
return join(scope === "merge" ? join(home, "merge", "unit-journals") : join(home, "units", "skill", "journals"), createHash("sha256").update(unitId).digest("hex") + ".json");
|
|
376
376
|
}
|
|
377
377
|
function unitJournalPhaseRank(phase) {
|
|
378
378
|
return UNIT_JOURNAL_PHASES.indexOf(phase);
|
|
@@ -382,15 +382,15 @@ function assertUnitJournalTransition(from, to) {
|
|
|
382
382
|
if (from === "failed" || from === "rolled-back" || from === "committed") throw new Error("unit-journal-terminal:" + from);
|
|
383
383
|
if (unitJournalPhaseRank(to) <= unitJournalPhaseRank(from)) throw new Error("unit-journal-nonmonotonic:" + from + "->" + to);
|
|
384
384
|
}
|
|
385
|
-
async function writeUnitJournal(io, home, journal) {
|
|
386
|
-
const path = unitJournalPath(home, journal.unitId);
|
|
385
|
+
async function writeUnitJournal(io, home, journal, scope = "merge") {
|
|
386
|
+
const path = unitJournalPath(home, journal.unitId, scope);
|
|
387
387
|
const content = JSON.stringify(journal, null, 2) + "\n";
|
|
388
388
|
if (io.transact !== void 0) await io.transact(path, () => content);
|
|
389
389
|
else await io.writeText(path, content);
|
|
390
390
|
return path;
|
|
391
391
|
}
|
|
392
|
-
async function readUnitJournal(io, home, unitId) {
|
|
393
|
-
const raw = await io.readText(unitJournalPath(home, unitId));
|
|
392
|
+
async function readUnitJournal(io, home, unitId, scope = "merge") {
|
|
393
|
+
const raw = await io.readText(unitJournalPath(home, unitId, scope));
|
|
394
394
|
if (raw === null) return null;
|
|
395
395
|
try {
|
|
396
396
|
return JSON.parse(raw);
|
|
@@ -1202,13 +1202,6 @@ function unitEvidenceDigest(evidence) {
|
|
|
1202
1202
|
mutations: 0
|
|
1203
1203
|
})).digest("hex");
|
|
1204
1204
|
}
|
|
1205
|
-
function evidenceDigest(evidence) {
|
|
1206
|
-
return createHash("sha256").update(JSON.stringify({
|
|
1207
|
-
...evidence,
|
|
1208
|
-
at: 0,
|
|
1209
|
-
mutations: 0
|
|
1210
|
-
}, null, 2) + "\n").digest("hex");
|
|
1211
|
-
}
|
|
1212
1205
|
var UnitTransactions = class {
|
|
1213
1206
|
options;
|
|
1214
1207
|
prepared = /* @__PURE__ */ new Map();
|
|
@@ -1441,7 +1434,7 @@ var UnitTransactions = class {
|
|
|
1441
1434
|
at: this.now()
|
|
1442
1435
|
};
|
|
1443
1436
|
if (!await lock.assertHeld()) throw new Error("unit-fence-lost");
|
|
1444
|
-
const evidenceSha256 =
|
|
1437
|
+
const evidenceSha256 = unitEvidenceDigest(evidence);
|
|
1445
1438
|
await writeUnitEvidence(this.options.io, this.options.home, evidence);
|
|
1446
1439
|
await writeUnitReceipt(this.options.io, this.options.home, {
|
|
1447
1440
|
schemaVersion: 1,
|
|
@@ -1473,7 +1466,8 @@ var UnitTransactions = class {
|
|
|
1473
1466
|
}
|
|
1474
1467
|
async verify(ref) {
|
|
1475
1468
|
if ("unitId" in ref) return await readUnitEvidence(this.options.io, this.options.home, ref.unitId);
|
|
1476
|
-
const
|
|
1469
|
+
const entries = (await readUnitIndex(this.options.io, this.options.home)).filter((entry) => entry.runId === ref.runId);
|
|
1470
|
+
const found = (await Promise.all(entries.map(async (entry) => readUnitEvidence(this.options.io, this.options.home, entry.unitId)))).filter((item) => item !== null && item.runId === ref.runId);
|
|
1477
1471
|
const only = found[0];
|
|
1478
1472
|
return found.length === 0 ? null : found.length === 1 ? only ?? null : found;
|
|
1479
1473
|
}
|
|
@@ -1549,7 +1543,7 @@ var UnitTransactions = class {
|
|
|
1549
1543
|
...snapshot.validationPlan === void 0 ? {} : { validationPlan: snapshot.validationPlan },
|
|
1550
1544
|
at: this.now()
|
|
1551
1545
|
};
|
|
1552
|
-
if (receipt?.evidenceSha256 !== void 0 &&
|
|
1546
|
+
if (receipt?.evidenceSha256 !== void 0 && unitEvidenceDigest(evidence) !== receipt.evidenceSha256) return {
|
|
1553
1547
|
ok: false,
|
|
1554
1548
|
code: "unit-rollback-blocked",
|
|
1555
1549
|
message: "receipt evidence hash does not match rebuilt evidence"
|
|
@@ -1946,6 +1940,7 @@ function skillWriteGateContext(services, request) {
|
|
|
1946
1940
|
origin: request.origin,
|
|
1947
1941
|
protectedNames: protectedSkillNamesOf(services.policy),
|
|
1948
1942
|
readNames: services.readNames,
|
|
1943
|
+
...services.readSupportFiles === void 0 ? {} : { readSupportFiles: services.readSupportFiles },
|
|
1949
1944
|
confirm: services.confirm,
|
|
1950
1945
|
...services.confirmMode === void 0 ? {} : { confirmMode: services.confirmMode },
|
|
1951
1946
|
...services.confirmTimeoutSeconds === void 0 ? {} : { confirmTimeoutSeconds: services.confirmTimeoutSeconds },
|
|
@@ -1974,6 +1969,7 @@ function gateArgsOf(args) {
|
|
|
1974
1969
|
action: typeof action === "string" ? action : void 0,
|
|
1975
1970
|
name: typeof name === "string" ? name : "",
|
|
1976
1971
|
absorbedInto: typeof absorbedInto === "string" && absorbedInto.trim() !== "" ? absorbedInto : void 0,
|
|
1972
|
+
filePath: typeof scalars.file_path === "string" && scalars.file_path.trim() !== "" ? scalars.file_path.replace(/\\/g, "/").replace(/^\.\//, "") : void 0,
|
|
1977
1973
|
scalars
|
|
1978
1974
|
};
|
|
1979
1975
|
}
|
|
@@ -2018,13 +2014,19 @@ const GATES = [
|
|
|
2018
2014
|
{
|
|
2019
2015
|
id: "read-before-write",
|
|
2020
2016
|
appliesTo: ["admission"],
|
|
2021
|
-
run: ({ view, origin, readNames, warn }) => {
|
|
2017
|
+
run: ({ view, origin, readNames, readSupportFiles, warn }) => {
|
|
2022
2018
|
if (origin === "foreground") return null;
|
|
2023
2019
|
if (readNames === void 0) {
|
|
2024
2020
|
warn("skill_manage: the read-before-write check could not run for this call — the session log is not readable here, so the write is allowed.");
|
|
2025
2021
|
return null;
|
|
2026
2022
|
}
|
|
2027
2023
|
if (view.action === void 0) return null;
|
|
2024
|
+
if ((view.action === "write_file" || view.action === "remove_file") && view.filePath !== void 0) if (readSupportFiles === void 0) warn("skill_manage: the support-file read check could not run for this call — no support-file read evidence; the write is allowed.");
|
|
2025
|
+
else if (readSupportFiles.get(view.name)?.has(view.filePath) === true) return null;
|
|
2026
|
+
else return errorText("e-326-support-write-without-a-read", {
|
|
2027
|
+
a1: view.name,
|
|
2028
|
+
a2: view.filePath
|
|
2029
|
+
});
|
|
2028
2030
|
if (!isUnreadWrite({
|
|
2029
2031
|
action: view.action,
|
|
2030
2032
|
name: view.name
|
|
@@ -9165,11 +9167,6 @@ const PLATFORM_SERVICE_PROBES = Object.freeze([
|
|
|
9165
9167
|
feature: "the state facade behind activity and replay",
|
|
9166
9168
|
side: "host"
|
|
9167
9169
|
},
|
|
9168
|
-
{
|
|
9169
|
-
service: "evolutionStateStore",
|
|
9170
|
-
feature: "generic durable state store for assignment queue and future collections",
|
|
9171
|
-
side: "host"
|
|
9172
|
-
},
|
|
9173
9170
|
{
|
|
9174
9171
|
service: "llm",
|
|
9175
9172
|
feature: "the curator one-shot review model call",
|
|
@@ -9905,9 +9902,8 @@ function parsedArguments(signal) {
|
|
|
9905
9902
|
if (parsed === null || typeof parsed !== "object") return null;
|
|
9906
9903
|
return parsed;
|
|
9907
9904
|
}
|
|
9908
|
-
/** The path-shaped argument of
|
|
9909
|
-
function
|
|
9910
|
-
const record = parsedArguments(signal);
|
|
9905
|
+
/** The path-shaped argument of one already-parsed call, when it carries one. */
|
|
9906
|
+
function readPathFromRecord(record) {
|
|
9911
9907
|
if (record === null) return null;
|
|
9912
9908
|
for (const key of [
|
|
9913
9909
|
"file_path",
|
|
@@ -9920,6 +9916,20 @@ function readPathArgument(signal) {
|
|
|
9920
9916
|
}
|
|
9921
9917
|
return null;
|
|
9922
9918
|
}
|
|
9919
|
+
/** The path-shaped argument of a file tool, when it carries one. */
|
|
9920
|
+
function readPathArgument(signal) {
|
|
9921
|
+
return readPathFromRecord(parsedArguments(signal));
|
|
9922
|
+
}
|
|
9923
|
+
/** The path one dispatch names, for the read-evidence projection. */
|
|
9924
|
+
function dispatchPathOf(step) {
|
|
9925
|
+
let parsed = step.arguments;
|
|
9926
|
+
if (typeof parsed === "string") try {
|
|
9927
|
+
parsed = JSON.parse(parsed);
|
|
9928
|
+
} catch {
|
|
9929
|
+
return null;
|
|
9930
|
+
}
|
|
9931
|
+
return parsed !== null && typeof parsed === "object" ? readPathFromRecord(parsed) : null;
|
|
9932
|
+
}
|
|
9923
9933
|
/**
|
|
9924
9934
|
* Read one dispatch as a SUPPORT-FILE read attributed to a skill: a read of
|
|
9925
9935
|
* `<root>/<skill>/<support dir>/…` is demand evidence for that one file, the
|
|
@@ -9930,11 +9940,8 @@ function readPathArgument(signal) {
|
|
|
9930
9940
|
* @returns the skill name and the skill-root-relative path, or `null` when the
|
|
9931
9941
|
* dispatch is not a support-file read. Pure: no IO, no service lookup.
|
|
9932
9942
|
*/
|
|
9933
|
-
|
|
9934
|
-
|
|
9935
|
-
if (signal.ok === false) return null;
|
|
9936
|
-
const raw = readPathArgument(signal);
|
|
9937
|
-
if (raw === null) return null;
|
|
9943
|
+
/** Attribute one raw path string to a skill support file (pure; no IO). */
|
|
9944
|
+
function supportFileReadFromPath(raw, options) {
|
|
9938
9945
|
const normalized = raw.replace(/\\/g, "/").trim();
|
|
9939
9946
|
if (normalized === "" || normalized.split("/").includes("..")) return null;
|
|
9940
9947
|
const root = options.root.replace(/\\/g, "/").replace(/\/+$/, "");
|
|
@@ -9959,6 +9966,12 @@ function supportFileReadOf(signal, options) {
|
|
|
9959
9966
|
rel: parts.slice(1).join("/")
|
|
9960
9967
|
};
|
|
9961
9968
|
}
|
|
9969
|
+
function supportFileReadOf(signal, options) {
|
|
9970
|
+
if (!options.toolNames.includes(signal.name)) return null;
|
|
9971
|
+
if (signal.ok === false) return null;
|
|
9972
|
+
const raw = readPathArgument(signal);
|
|
9973
|
+
return raw === null ? null : supportFileReadFromPath(raw, options);
|
|
9974
|
+
}
|
|
9962
9975
|
function skillReadNameOf(signal) {
|
|
9963
9976
|
if (!SKILL_READ_TOOL_NAMES.has(signal.name)) return void 0;
|
|
9964
9977
|
if (signal.ok === false) return void 0;
|
|
@@ -9989,6 +10002,18 @@ function collectReadSkillNames(events) {
|
|
|
9989
10002
|
}
|
|
9990
10003
|
return names;
|
|
9991
10004
|
}
|
|
10005
|
+
/** Every skill support file this log read through a non-failed configured file tool. */
|
|
10006
|
+
function collectReadSupportFiles(events, options) {
|
|
10007
|
+
const reads = /* @__PURE__ */ new Map();
|
|
10008
|
+
for (const signal of foldToolDispatches(events)) {
|
|
10009
|
+
const hit = supportFileReadOf(signal, options);
|
|
10010
|
+
if (hit === null) continue;
|
|
10011
|
+
const set = reads.get(hit.skill) ?? /* @__PURE__ */ new Set();
|
|
10012
|
+
set.add(hit.rel);
|
|
10013
|
+
reads.set(hit.skill, set);
|
|
10014
|
+
}
|
|
10015
|
+
return reads;
|
|
10016
|
+
}
|
|
9992
10017
|
/** Tool names that touch the skill library at all — the review's skill-signal set. */
|
|
9993
10018
|
const SKILL_TOOL_NAMES = new Set([...SKILL_READ_TOOL_NAMES, "skill_manage"]);
|
|
9994
10019
|
/**
|
|
@@ -10372,10 +10397,23 @@ function isProjectableSession(session) {
|
|
|
10372
10397
|
const logs = typeof candidate.snapshotEvents === "function";
|
|
10373
10398
|
return folds && logs && typeof candidate.seq === "number";
|
|
10374
10399
|
}
|
|
10400
|
+
const projectionHistorySchema = z.object({
|
|
10401
|
+
catalogs: z.array(z.object({
|
|
10402
|
+
text: z.string(),
|
|
10403
|
+
entries: z.array(z.object({
|
|
10404
|
+
name: z.string(),
|
|
10405
|
+
description: z.string()
|
|
10406
|
+
}).strict()).max(512),
|
|
10407
|
+
update: z.boolean()
|
|
10408
|
+
}).strict()).max(8),
|
|
10409
|
+
digests: z.array(z.string()).max(64)
|
|
10410
|
+
}).strict();
|
|
10375
10411
|
const readsStateSchema = z.object({ reads: z.array(z.object({
|
|
10376
10412
|
key: z.string(),
|
|
10377
10413
|
skill: z.string().nullable(),
|
|
10378
|
-
failed: z.boolean()
|
|
10414
|
+
failed: z.boolean(),
|
|
10415
|
+
file: z.string().nullable().optional(),
|
|
10416
|
+
tool: z.string().optional()
|
|
10379
10417
|
}).strict()) }).strict();
|
|
10380
10418
|
const signalsStateSchema = z.object({
|
|
10381
10419
|
through: z.number().int().min(-1).max(Number.MAX_SAFE_INTEGER),
|
|
@@ -10391,6 +10429,46 @@ const signalsStateSchema = z.object({
|
|
|
10391
10429
|
opened: z.array(z.string())
|
|
10392
10430
|
}).strict()
|
|
10393
10431
|
}).strict();
|
|
10432
|
+
/** The `evolutionProjectionHistory` unit (host-only). */
|
|
10433
|
+
const evolutionProjectionHistoryProjection = {
|
|
10434
|
+
key: "evolutionProjectionHistory",
|
|
10435
|
+
stateVersion: 1,
|
|
10436
|
+
stateSchema: projectionHistorySchema,
|
|
10437
|
+
init: () => ({
|
|
10438
|
+
catalogs: [],
|
|
10439
|
+
digests: []
|
|
10440
|
+
}),
|
|
10441
|
+
apply: (state, event) => {
|
|
10442
|
+
const frame = event;
|
|
10443
|
+
if (frame.type !== "user/message" || typeof frame.data !== "object" || frame.data === null) return state;
|
|
10444
|
+
const message = frame.data;
|
|
10445
|
+
const source = message.source;
|
|
10446
|
+
if (source === void 0 || typeof source !== "object") return state;
|
|
10447
|
+
if (source.kind === "evolution-skill-projection" && typeof source.digest === "string") {
|
|
10448
|
+
if (state.digests.includes(source.digest)) return state;
|
|
10449
|
+
return {
|
|
10450
|
+
catalogs: state.catalogs,
|
|
10451
|
+
digests: [...state.digests, source.digest].slice(-64)
|
|
10452
|
+
};
|
|
10453
|
+
}
|
|
10454
|
+
if (source.kind !== "skill-catalog" || source.form !== "catalog" || !Array.isArray(source.entries)) return state;
|
|
10455
|
+
if (!Array.isArray(message.content)) return state;
|
|
10456
|
+
const text = message.content.map((block) => block !== null && typeof block === "object" && block.type === "text" ? String(block.text ?? "") : "").join("");
|
|
10457
|
+
if (!text.includes("<available_skills>") || !text.includes("</available_skills>")) return state;
|
|
10458
|
+
const entries = source.entries.filter((entry) => entry !== null && typeof entry === "object" && typeof entry.name === "string" && typeof entry.description === "string").map((entry) => ({
|
|
10459
|
+
name: entry.name,
|
|
10460
|
+
description: entry.description
|
|
10461
|
+
}));
|
|
10462
|
+
return {
|
|
10463
|
+
catalogs: [...state.catalogs, {
|
|
10464
|
+
text,
|
|
10465
|
+
entries,
|
|
10466
|
+
update: source.update === true
|
|
10467
|
+
}].slice(-8),
|
|
10468
|
+
digests: state.digests
|
|
10469
|
+
};
|
|
10470
|
+
}
|
|
10471
|
+
};
|
|
10394
10472
|
/** The `evolutionReads` unit (host-only: no client view is registered for it). */
|
|
10395
10473
|
const evolutionReadsProjection = {
|
|
10396
10474
|
key: "evolutionReads",
|
|
@@ -10410,12 +10488,22 @@ const evolutionReadsProjection = {
|
|
|
10410
10488
|
reads[at] = {
|
|
10411
10489
|
key: entry.key,
|
|
10412
10490
|
skill: entry.skill,
|
|
10413
|
-
failed
|
|
10491
|
+
failed,
|
|
10492
|
+
...entry.file === void 0 ? {} : { file: entry.file },
|
|
10493
|
+
...entry.tool === void 0 ? {} : { tool: entry.tool }
|
|
10414
10494
|
};
|
|
10415
10495
|
return { reads };
|
|
10416
10496
|
};
|
|
10417
10497
|
if (step.name === "") return settled();
|
|
10418
10498
|
if (at >= 0) return settled();
|
|
10499
|
+
const file = dispatchPathOf(step);
|
|
10500
|
+
if (file !== null) return { reads: [...state.reads.slice(-511), {
|
|
10501
|
+
key: step.key,
|
|
10502
|
+
skill: null,
|
|
10503
|
+
failed: step.outcome?.ok === false,
|
|
10504
|
+
file,
|
|
10505
|
+
tool: step.name
|
|
10506
|
+
}] };
|
|
10419
10507
|
if (!isSkillReadToolName(step.name)) return state;
|
|
10420
10508
|
const skill = skillReadNameOf({
|
|
10421
10509
|
kind: step.kind,
|
|
@@ -10477,6 +10565,7 @@ function installEvolutionProjections(ctx) {
|
|
|
10477
10565
|
registry.register(evolutionActivityProjection);
|
|
10478
10566
|
registry.register(evolutionEvidenceProjection);
|
|
10479
10567
|
registry.register(evolutionReadsProjection);
|
|
10568
|
+
registry.register(evolutionProjectionHistoryProjection);
|
|
10480
10569
|
registry.register(evolutionSignalsProjection);
|
|
10481
10570
|
};
|
|
10482
10571
|
const mounted = ctx.get("sessionProjections");
|
|
@@ -10590,6 +10679,45 @@ function sessionReadSkillNames(ctx, session) {
|
|
|
10590
10679
|
const events = session.readEvents?.();
|
|
10591
10680
|
return events === void 0 ? void 0 : collectReadSkillNames(events);
|
|
10592
10681
|
}
|
|
10682
|
+
/**
|
|
10683
|
+
* Skill support files ONE session read through a non-failed file tool (P2-27).
|
|
10684
|
+
*
|
|
10685
|
+
* platform-declaration anchor: `sessionProjections` is declared by
|
|
10686
|
+
* `@deepseek-ai/dsh-session-projection` (its registry; capability-probed here).
|
|
10687
|
+
* Same two readers as {@link sessionReadSkillNames}: the family projection first,
|
|
10688
|
+
* then the structural log view. `undefined` means "no evidence", not "nothing was
|
|
10689
|
+
* read" - the write gate then keeps its fail-open posture.
|
|
10690
|
+
* @param ctx - a context of the runtime.
|
|
10691
|
+
* @param session - the session whose reads are wanted.
|
|
10692
|
+
* @param options - the skills root and the configured file-tool names.
|
|
10693
|
+
* @returns skill -> set of skill-root-relative support paths.
|
|
10694
|
+
*/
|
|
10695
|
+
function sessionReadSupportFiles(ctx, session, options) {
|
|
10696
|
+
if (session === void 0) return void 0;
|
|
10697
|
+
if (isProjectableSession(session)) {
|
|
10698
|
+
installEvolutionProjections(ctx);
|
|
10699
|
+
const state = ctx.get("sessionProjections")?.stateOf(session, "evolutionReads");
|
|
10700
|
+
if (state !== void 0) {
|
|
10701
|
+
const toolNames = options.toolNames ?? DEFAULT_SUPPORT_READ_TOOL_NAMES;
|
|
10702
|
+
const reads = /* @__PURE__ */ new Map();
|
|
10703
|
+
for (const entry of state.reads) {
|
|
10704
|
+
if (entry.failed || typeof entry.file !== "string") continue;
|
|
10705
|
+
if (entry.tool !== void 0 && !toolNames.includes(entry.tool)) continue;
|
|
10706
|
+
const hit = supportFileReadFromPath(entry.file, { root: options.root });
|
|
10707
|
+
if (hit === null) continue;
|
|
10708
|
+
const set = reads.get(hit.skill) ?? /* @__PURE__ */ new Set();
|
|
10709
|
+
set.add(hit.rel);
|
|
10710
|
+
reads.set(hit.skill, set);
|
|
10711
|
+
}
|
|
10712
|
+
return reads;
|
|
10713
|
+
}
|
|
10714
|
+
}
|
|
10715
|
+
const events = session.readEvents?.();
|
|
10716
|
+
return events === void 0 ? void 0 : collectReadSupportFiles(events, {
|
|
10717
|
+
toolNames: options.toolNames ?? DEFAULT_SUPPORT_READ_TOOL_NAMES,
|
|
10718
|
+
root: options.root
|
|
10719
|
+
});
|
|
10720
|
+
}
|
|
10593
10721
|
/** Actions whose target must have been read first (create is authorship, so it is exempt). */
|
|
10594
10722
|
const READ_REQUIRED_ACTIONS = Object.freeze([
|
|
10595
10723
|
"edit",
|
|
@@ -11206,6 +11334,211 @@ function staleRouteStubs(indexes) {
|
|
|
11206
11334
|
return out.sort((a, b) => a.skill.localeCompare(b.skill) || a.v - b.v || a.owner.localeCompare(b.owner));
|
|
11207
11335
|
}
|
|
11208
11336
|
//#endregion
|
|
11337
|
+
//#region lib/types/write-kernel.js
|
|
11338
|
+
/**
|
|
11339
|
+
* The family's single write primitive: compare the baseline INSIDE the write
|
|
11340
|
+
* transaction, never overwrite a concurrent value, and compensate only this
|
|
11341
|
+
* unit's own writes. Business state machines stay in their domain owners.
|
|
11342
|
+
*/
|
|
11343
|
+
var WriteKernel = class {
|
|
11344
|
+
io;
|
|
11345
|
+
transact;
|
|
11346
|
+
now;
|
|
11347
|
+
constructor(options) {
|
|
11348
|
+
this.io = options.io;
|
|
11349
|
+
this.transact = options.transact;
|
|
11350
|
+
this.now = options.now ?? Date.now;
|
|
11351
|
+
}
|
|
11352
|
+
/** @returns the current time source; exposed for adapters that stamp evidence. */
|
|
11353
|
+
clock() {
|
|
11354
|
+
return this.now();
|
|
11355
|
+
}
|
|
11356
|
+
/**
|
|
11357
|
+
* Run a read-modify-write task inside the same transaction seam. Unlike
|
|
11358
|
+
* writeOne, task errors keep their type (state files rely on WRITE_GATE_ERROR_NAME)
|
|
11359
|
+
* and only committed-only failures become warnings. expected is optional because
|
|
11360
|
+
* the state medium passes the task the locked current value itself.
|
|
11361
|
+
*/
|
|
11362
|
+
async run(target, task) {
|
|
11363
|
+
let invoked = false;
|
|
11364
|
+
let conflict = false;
|
|
11365
|
+
const invoke = async (current) => {
|
|
11366
|
+
if (target.expected !== void 0 && current !== target.expected) {
|
|
11367
|
+
conflict = true;
|
|
11368
|
+
throw Object.assign(/* @__PURE__ */ new Error("concurrent modification detected: " + target.path), { noWrite: true });
|
|
11369
|
+
}
|
|
11370
|
+
invoked = true;
|
|
11371
|
+
return await task(current);
|
|
11372
|
+
};
|
|
11373
|
+
try {
|
|
11374
|
+
if (this.transact !== void 0) await this.transact(this.io, target.path, invoke);
|
|
11375
|
+
else if (this.io.transact !== void 0) await this.io.transact(target.path, invoke);
|
|
11376
|
+
else {
|
|
11377
|
+
const current = await this.io.readText(target.path);
|
|
11378
|
+
const next = await invoke(current);
|
|
11379
|
+
if (next === null && current !== null) await this.io.remove(target.path);
|
|
11380
|
+
else if (next !== null && next !== current) await this.io.writeText(target.path, next);
|
|
11381
|
+
}
|
|
11382
|
+
} catch (error) {
|
|
11383
|
+
if (conflict) throw Object.assign(/* @__PURE__ */ new Error("concurrent modification detected: " + target.path), { noWrite: true });
|
|
11384
|
+
if (isCommittedWarning(error)) return { warnings: [error instanceof Error ? error.message : String(error)] };
|
|
11385
|
+
throw error;
|
|
11386
|
+
}
|
|
11387
|
+
if (!invoked) throw new Error("internal error: the write transaction for " + target.path + " did not invoke the task; no write was performed");
|
|
11388
|
+
return {};
|
|
11389
|
+
}
|
|
11390
|
+
/**
|
|
11391
|
+
* Write one target only if the current bytes still equal the baseline.
|
|
11392
|
+
* A conflict performs no write. With guardBaseline:false a stale callback
|
|
11393
|
+
* defers (returns the current bytes) so a retrying transact can re-observe;
|
|
11394
|
+
* if no retry ever writes, the result is still a conflict.
|
|
11395
|
+
*/
|
|
11396
|
+
async writeOne(target, options = {}) {
|
|
11397
|
+
const guard = options.guardBaseline !== false;
|
|
11398
|
+
let wrote = false;
|
|
11399
|
+
let deferred = false;
|
|
11400
|
+
let conflict = false;
|
|
11401
|
+
const task = (current) => {
|
|
11402
|
+
if (current !== target.expected) {
|
|
11403
|
+
if (guard) {
|
|
11404
|
+
conflict = true;
|
|
11405
|
+
throw Object.assign(/* @__PURE__ */ new Error("concurrent modification detected: " + target.path), { noWrite: true });
|
|
11406
|
+
}
|
|
11407
|
+
deferred = true;
|
|
11408
|
+
return current;
|
|
11409
|
+
}
|
|
11410
|
+
wrote = true;
|
|
11411
|
+
return target.next;
|
|
11412
|
+
};
|
|
11413
|
+
try {
|
|
11414
|
+
if (this.transact !== void 0) await this.transact(this.io, target.path, task);
|
|
11415
|
+
else if (this.io.transact !== void 0) await this.io.transact(target.path, task);
|
|
11416
|
+
else {
|
|
11417
|
+
const current = await this.io.readText(target.path);
|
|
11418
|
+
const next = task(current);
|
|
11419
|
+
if (next === null && current !== null) await this.io.remove(target.path);
|
|
11420
|
+
else if (next !== null && next !== current) await this.io.writeText(target.path, next);
|
|
11421
|
+
}
|
|
11422
|
+
} catch (error) {
|
|
11423
|
+
if (conflict) return {
|
|
11424
|
+
ok: false,
|
|
11425
|
+
changed: [],
|
|
11426
|
+
errors: [{
|
|
11427
|
+
code: "cas-conflict",
|
|
11428
|
+
message: error instanceof Error ? error.message : String(error),
|
|
11429
|
+
target: target.path
|
|
11430
|
+
}]
|
|
11431
|
+
};
|
|
11432
|
+
if (isCommittedWarning(error)) return {
|
|
11433
|
+
ok: true,
|
|
11434
|
+
changed: [target.path],
|
|
11435
|
+
errors: [],
|
|
11436
|
+
warnings: [error instanceof Error ? error.message : String(error)]
|
|
11437
|
+
};
|
|
11438
|
+
return {
|
|
11439
|
+
ok: false,
|
|
11440
|
+
changed: [],
|
|
11441
|
+
errors: [{
|
|
11442
|
+
code: "write-failed",
|
|
11443
|
+
message: error instanceof Error ? error.message : String(error),
|
|
11444
|
+
target: target.path
|
|
11445
|
+
}]
|
|
11446
|
+
};
|
|
11447
|
+
}
|
|
11448
|
+
if (conflict || !wrote && deferred) return {
|
|
11449
|
+
ok: false,
|
|
11450
|
+
changed: [],
|
|
11451
|
+
errors: [{
|
|
11452
|
+
code: "cas-conflict",
|
|
11453
|
+
message: "concurrent modification detected: " + target.path,
|
|
11454
|
+
target: target.path
|
|
11455
|
+
}]
|
|
11456
|
+
};
|
|
11457
|
+
if (!wrote) return {
|
|
11458
|
+
ok: false,
|
|
11459
|
+
changed: [],
|
|
11460
|
+
errors: [{
|
|
11461
|
+
code: "write-failed",
|
|
11462
|
+
message: "transaction did not invoke the write task: " + target.path,
|
|
11463
|
+
target: target.path
|
|
11464
|
+
}]
|
|
11465
|
+
};
|
|
11466
|
+
return {
|
|
11467
|
+
ok: true,
|
|
11468
|
+
changed: [target.path],
|
|
11469
|
+
errors: []
|
|
11470
|
+
};
|
|
11471
|
+
}
|
|
11472
|
+
/**
|
|
11473
|
+
* Write a plan in order. A preflight drift writes nothing; a later failure
|
|
11474
|
+
* compensates only the targets this commit wrote, and only while they still
|
|
11475
|
+
* hold this commit's bytes.
|
|
11476
|
+
*/
|
|
11477
|
+
async commit(targets) {
|
|
11478
|
+
for (const target of targets) if (await this.io.readText(target.path) !== target.expected) return {
|
|
11479
|
+
ok: false,
|
|
11480
|
+
changed: [],
|
|
11481
|
+
errors: [{
|
|
11482
|
+
code: "cas-conflict",
|
|
11483
|
+
message: "target changed after plan: " + target.path,
|
|
11484
|
+
target: target.path
|
|
11485
|
+
}]
|
|
11486
|
+
};
|
|
11487
|
+
const written = [];
|
|
11488
|
+
for (const target of targets) {
|
|
11489
|
+
const result = await this.writeOne(target);
|
|
11490
|
+
if (!result.ok) {
|
|
11491
|
+
const compensation = await this.compensate(written);
|
|
11492
|
+
return {
|
|
11493
|
+
ok: false,
|
|
11494
|
+
changed: written.map((item) => item.path),
|
|
11495
|
+
errors: [...result.errors, ...compensation]
|
|
11496
|
+
};
|
|
11497
|
+
}
|
|
11498
|
+
written.push(target);
|
|
11499
|
+
}
|
|
11500
|
+
return {
|
|
11501
|
+
ok: true,
|
|
11502
|
+
changed: written.map((item) => item.path),
|
|
11503
|
+
errors: []
|
|
11504
|
+
};
|
|
11505
|
+
}
|
|
11506
|
+
/**
|
|
11507
|
+
* Restore a target to its before bytes only if it still holds the bytes this
|
|
11508
|
+
* unit wrote. A concurrent writer wins and the compensation is reported.
|
|
11509
|
+
*/
|
|
11510
|
+
async restore(target) {
|
|
11511
|
+
const result = await this.writeOne({
|
|
11512
|
+
path: target.path,
|
|
11513
|
+
expected: target.after,
|
|
11514
|
+
next: target.before
|
|
11515
|
+
});
|
|
11516
|
+
if (result.ok) return result;
|
|
11517
|
+
if (result.errors.some((error) => error.code === "cas-conflict")) return {
|
|
11518
|
+
ok: false,
|
|
11519
|
+
changed: [],
|
|
11520
|
+
errors: [{
|
|
11521
|
+
code: "compensation-blocked",
|
|
11522
|
+
message: "compensation refused: target changed after this unit; leave the concurrent bytes in place",
|
|
11523
|
+
target: target.path
|
|
11524
|
+
}]
|
|
11525
|
+
};
|
|
11526
|
+
return result;
|
|
11527
|
+
}
|
|
11528
|
+
async compensate(written) {
|
|
11529
|
+
const errors = [];
|
|
11530
|
+
for (const target of [...written].reverse()) {
|
|
11531
|
+
const result = await this.restore({
|
|
11532
|
+
path: target.path,
|
|
11533
|
+
before: target.expected,
|
|
11534
|
+
after: target.next
|
|
11535
|
+
});
|
|
11536
|
+
if (!result.ok) errors.push(...result.errors);
|
|
11537
|
+
}
|
|
11538
|
+
return errors;
|
|
11539
|
+
}
|
|
11540
|
+
};
|
|
11541
|
+
//#endregion
|
|
11209
11542
|
//#region lib/types/mutation-unit.js
|
|
11210
11543
|
function underRoot(rootDir, target) {
|
|
11211
11544
|
if (rootDir === void 0 || rootDir === "") return false;
|
|
@@ -11341,7 +11674,7 @@ var MutationUnit = class {
|
|
|
11341
11674
|
snapshots;
|
|
11342
11675
|
hooks;
|
|
11343
11676
|
validateWrite;
|
|
11344
|
-
|
|
11677
|
+
kernel;
|
|
11345
11678
|
transactGuard;
|
|
11346
11679
|
now;
|
|
11347
11680
|
constructor(options) {
|
|
@@ -11353,9 +11686,14 @@ var MutationUnit = class {
|
|
|
11353
11686
|
this.snapshots = options.snapshots;
|
|
11354
11687
|
this.hooks = options.hooks;
|
|
11355
11688
|
this.validateWrite = options.validateWrite;
|
|
11356
|
-
this.
|
|
11357
|
-
this.transactGuard = options.transactGuard ?? true;
|
|
11689
|
+
this.transactGuard = options.transactGuard !== false;
|
|
11358
11690
|
this.now = options.now ?? Date.now;
|
|
11691
|
+
const transact = options.transact;
|
|
11692
|
+
this.kernel = new WriteKernel({
|
|
11693
|
+
io: this.io,
|
|
11694
|
+
...transact === void 0 ? {} : { transact },
|
|
11695
|
+
now: this.now
|
|
11696
|
+
});
|
|
11359
11697
|
}
|
|
11360
11698
|
preview(request) {
|
|
11361
11699
|
const validation = validateMutationRequest(request, this.limits);
|
|
@@ -11430,6 +11768,7 @@ var MutationUnit = class {
|
|
|
11430
11768
|
snapshots.push({
|
|
11431
11769
|
target: op.target,
|
|
11432
11770
|
before: current,
|
|
11771
|
+
after: op.kind === "write" ? op.content : null,
|
|
11433
11772
|
baseline
|
|
11434
11773
|
});
|
|
11435
11774
|
}
|
|
@@ -11475,7 +11814,8 @@ var MutationUnit = class {
|
|
|
11475
11814
|
const snapshot = snapshots.find((entry) => entry.target === op.target);
|
|
11476
11815
|
if (snapshot === void 0) throw new Error("snapshot missing for " + op.target);
|
|
11477
11816
|
try {
|
|
11478
|
-
await this.applyOp(op, snapshot.baseline);
|
|
11817
|
+
const opWarnings = await this.applyOp(op, snapshot.baseline);
|
|
11818
|
+
warnings.push(...opWarnings);
|
|
11479
11819
|
changed.push(op.target);
|
|
11480
11820
|
} catch (error) {
|
|
11481
11821
|
if (error?.noWrite !== true) changed.push(op.target);
|
|
@@ -11490,13 +11830,6 @@ var MutationUnit = class {
|
|
|
11490
11830
|
target: primary,
|
|
11491
11831
|
roots: validation.roots.map((root) => root.name)
|
|
11492
11832
|
}));
|
|
11493
|
-
await bestEffort(async () => this.journal?.write({
|
|
11494
|
-
unitId,
|
|
11495
|
-
phase: "committed",
|
|
11496
|
-
changed,
|
|
11497
|
-
target: primary,
|
|
11498
|
-
roots: validation.roots.map((root) => root.name)
|
|
11499
|
-
}));
|
|
11500
11833
|
if (this.snapshots !== void 0) await bestEffort(() => this.snapshots.write({
|
|
11501
11834
|
unitId,
|
|
11502
11835
|
state: "committed",
|
|
@@ -11504,6 +11837,13 @@ var MutationUnit = class {
|
|
|
11504
11837
|
...cleanup,
|
|
11505
11838
|
createdAt: this.now()
|
|
11506
11839
|
}));
|
|
11840
|
+
await bestEffort(async () => this.journal?.write({
|
|
11841
|
+
unitId,
|
|
11842
|
+
phase: "committed",
|
|
11843
|
+
changed,
|
|
11844
|
+
target: primary,
|
|
11845
|
+
roots: validation.roots.map((root) => root.name)
|
|
11846
|
+
}));
|
|
11507
11847
|
try {
|
|
11508
11848
|
await this.hooks?.committed?.({
|
|
11509
11849
|
unitId,
|
|
@@ -11809,38 +12149,24 @@ var MutationUnit = class {
|
|
|
11809
12149
|
});
|
|
11810
12150
|
}
|
|
11811
12151
|
async applyOp(op, baseline) {
|
|
11812
|
-
|
|
11813
|
-
|
|
11814
|
-
|
|
11815
|
-
|
|
11816
|
-
|
|
11817
|
-
|
|
11818
|
-
|
|
11819
|
-
|
|
11820
|
-
}
|
|
11821
|
-
const next = op.kind === "delete" ? null : op.content;
|
|
11822
|
-
if (this.io.transact !== void 0) {
|
|
11823
|
-
let conflict = false;
|
|
11824
|
-
let wrote = false;
|
|
11825
|
-
await this.io.transact(op.target, (current) => {
|
|
11826
|
-
if (current !== baseline) {
|
|
11827
|
-
if (this.transactGuard) throw new Error("concurrent modification detected: " + op.target);
|
|
11828
|
-
conflict = true;
|
|
11829
|
-
return current;
|
|
11830
|
-
}
|
|
11831
|
-
wrote = true;
|
|
11832
|
-
return next;
|
|
11833
|
-
});
|
|
11834
|
-
if (conflict && !wrote) throw Object.assign(/* @__PURE__ */ new Error("concurrent modification detected: " + op.target), { noWrite: true });
|
|
11835
|
-
return;
|
|
11836
|
-
}
|
|
11837
|
-
if (await this.io.readText(op.target) !== baseline) throw new Error("concurrent modification detected: " + op.target);
|
|
11838
|
-
if (next === null) await this.io.remove(op.target);
|
|
11839
|
-
else await this.io.writeText(op.target, next);
|
|
12152
|
+
const result = await this.kernel.writeOne({
|
|
12153
|
+
path: op.target,
|
|
12154
|
+
expected: baseline,
|
|
12155
|
+
next: op.kind === "delete" ? null : op.content,
|
|
12156
|
+
...op.skill === void 0 ? {} : { skill: op.skill }
|
|
12157
|
+
}, { guardBaseline: this.transactGuard });
|
|
12158
|
+
if (!result.ok) throw Object.assign(new Error(result.errors[0]?.message ?? "write failed: " + op.target), { noWrite: true });
|
|
12159
|
+
return [...result.warnings ?? []];
|
|
11840
12160
|
}
|
|
11841
12161
|
async rollback(snapshots) {
|
|
11842
|
-
for (const snapshot of [...snapshots].reverse())
|
|
11843
|
-
|
|
12162
|
+
for (const snapshot of [...snapshots].reverse()) {
|
|
12163
|
+
const result = await this.kernel.restore({
|
|
12164
|
+
path: snapshot.target,
|
|
12165
|
+
before: snapshot.before,
|
|
12166
|
+
after: snapshot.after
|
|
12167
|
+
});
|
|
12168
|
+
if (!result.ok) throw new Error(result.errors[0]?.message ?? "rollback failed: " + snapshot.target);
|
|
12169
|
+
}
|
|
11844
12170
|
}
|
|
11845
12171
|
};
|
|
11846
12172
|
function parseFileLock(raw) {
|
|
@@ -12027,10 +12353,10 @@ function unitSnapshotPort(io, home) {
|
|
|
12027
12353
|
after: op.after,
|
|
12028
12354
|
...op.skill === void 0 ? {} : { skill: op.skill }
|
|
12029
12355
|
}))
|
|
12030
|
-
});
|
|
12356
|
+
}, "skill");
|
|
12031
12357
|
},
|
|
12032
12358
|
async read(unitId) {
|
|
12033
|
-
const snapshot = await readUnitSnapshot(io, home, unitId);
|
|
12359
|
+
const snapshot = await readUnitSnapshot(io, home, unitId, "skill") ?? await readUnitSnapshot(io, home, unitId);
|
|
12034
12360
|
if (snapshot === null || snapshot.kind !== "tree-change" || snapshot.ops === void 0) return null;
|
|
12035
12361
|
return {
|
|
12036
12362
|
unitId,
|
|
@@ -12041,31 +12367,63 @@ function unitSnapshotPort(io, home) {
|
|
|
12041
12367
|
};
|
|
12042
12368
|
},
|
|
12043
12369
|
async listPrepared() {
|
|
12044
|
-
const names = await io.list(unitSnapshotsDir(home));
|
|
12045
12370
|
const out = [];
|
|
12046
|
-
|
|
12047
|
-
|
|
12048
|
-
const
|
|
12049
|
-
|
|
12050
|
-
|
|
12051
|
-
|
|
12052
|
-
|
|
12053
|
-
|
|
12054
|
-
|
|
12371
|
+
const seen = /* @__PURE__ */ new Set();
|
|
12372
|
+
for (const dir of [unitSnapshotsDir(home, "skill"), unitSnapshotsDir(home)]) {
|
|
12373
|
+
const names = await io.list(dir);
|
|
12374
|
+
for (const name of names) {
|
|
12375
|
+
if (!name.endsWith(".json")) continue;
|
|
12376
|
+
const raw = await io.readText(join(dir, name));
|
|
12377
|
+
if (raw === null) continue;
|
|
12378
|
+
let snapshot;
|
|
12379
|
+
try {
|
|
12380
|
+
snapshot = JSON.parse(raw);
|
|
12381
|
+
} catch {
|
|
12382
|
+
continue;
|
|
12383
|
+
}
|
|
12384
|
+
if (snapshot.kind !== "tree-change" || snapshot.mutationState !== "prepared" || snapshot.ops === void 0) continue;
|
|
12385
|
+
if (seen.has(snapshot.unitId)) continue;
|
|
12386
|
+
seen.add(snapshot.unitId);
|
|
12387
|
+
out.push({
|
|
12388
|
+
unitId: snapshot.unitId,
|
|
12389
|
+
state: "prepared",
|
|
12390
|
+
ops: snapshot.ops,
|
|
12391
|
+
...snapshot.cleanup === void 0 ? {} : { cleanup: snapshot.cleanup },
|
|
12392
|
+
createdAt: snapshot.createdAt
|
|
12393
|
+
});
|
|
12055
12394
|
}
|
|
12056
|
-
if (snapshot.kind !== "tree-change" || snapshot.mutationState !== "prepared" || snapshot.ops === void 0) continue;
|
|
12057
|
-
out.push({
|
|
12058
|
-
unitId: snapshot.unitId,
|
|
12059
|
-
state: "prepared",
|
|
12060
|
-
ops: snapshot.ops,
|
|
12061
|
-
...snapshot.cleanup === void 0 ? {} : { cleanup: snapshot.cleanup },
|
|
12062
|
-
createdAt: snapshot.createdAt
|
|
12063
|
-
});
|
|
12064
12395
|
}
|
|
12065
12396
|
return out;
|
|
12066
12397
|
}
|
|
12067
12398
|
};
|
|
12068
12399
|
}
|
|
12400
|
+
/** Keep a bounded number of terminal tree-change snapshots; prepared units are never pruned. */
|
|
12401
|
+
async function pruneTreeChangeUnits(io, home, keep = 500) {
|
|
12402
|
+
if (!Number.isInteger(keep) || keep < 1) return 0;
|
|
12403
|
+
const dir = unitSnapshotsDir(home, "skill");
|
|
12404
|
+
const names = await io.list(dir);
|
|
12405
|
+
const terminal = [];
|
|
12406
|
+
for (const name of names) {
|
|
12407
|
+
if (!name.endsWith(".json")) continue;
|
|
12408
|
+
try {
|
|
12409
|
+
const snapshot = JSON.parse(await io.readText(join(dir, name)) ?? "");
|
|
12410
|
+
if (snapshot.kind !== "tree-change" || snapshot.mutationState === "prepared") continue;
|
|
12411
|
+
terminal.push({
|
|
12412
|
+
name,
|
|
12413
|
+
unitId: snapshot.unitId,
|
|
12414
|
+
createdAt: snapshot.createdAt
|
|
12415
|
+
});
|
|
12416
|
+
} catch {}
|
|
12417
|
+
}
|
|
12418
|
+
terminal.sort((a, b) => b.createdAt - a.createdAt);
|
|
12419
|
+
let removed = 0;
|
|
12420
|
+
for (const entry of terminal.slice(keep)) {
|
|
12421
|
+
await io.remove(join(dir, entry.name));
|
|
12422
|
+
await io.remove(unitJournalPath(home, entry.unitId, "skill")).catch(() => {});
|
|
12423
|
+
removed += 1;
|
|
12424
|
+
}
|
|
12425
|
+
return removed;
|
|
12426
|
+
}
|
|
12069
12427
|
const PHASE = {
|
|
12070
12428
|
prepared: "prepared",
|
|
12071
12429
|
"unit-written": "unit-written",
|
|
@@ -12074,8 +12432,9 @@ const PHASE = {
|
|
|
12074
12432
|
undone: "rolled-back"
|
|
12075
12433
|
};
|
|
12076
12434
|
/**
|
|
12077
|
-
* Production adapter onto the
|
|
12078
|
-
*
|
|
12435
|
+
* Production adapter onto the skill-owned journal directory. Merge recovery
|
|
12436
|
+
* reads merge/unit-journals only; legacy tree-change journals carry kind and
|
|
12437
|
+
* are skipped by the recovery coordinator.
|
|
12079
12438
|
*/
|
|
12080
12439
|
function unitJournalPort(io, home) {
|
|
12081
12440
|
return { async write(record) {
|
|
@@ -12089,8 +12448,9 @@ function unitJournalPort(io, home) {
|
|
|
12089
12448
|
phase: PHASE[record.phase],
|
|
12090
12449
|
storageKey: unitStorageKey(record.unitId),
|
|
12091
12450
|
snapshotSha256: contentHash(JSON.stringify(record)),
|
|
12451
|
+
kind: "tree-change",
|
|
12092
12452
|
updatedAt: Date.now()
|
|
12093
|
-
});
|
|
12453
|
+
}, "skill");
|
|
12094
12454
|
} };
|
|
12095
12455
|
}
|
|
12096
12456
|
//#endregion
|
|
@@ -12659,7 +13019,7 @@ var SkillLibrary = class {
|
|
|
12659
13019
|
/** Recover every prepared tree-change snapshot in the shared unit store. */
|
|
12660
13020
|
async recoverPreparedUnits() {
|
|
12661
13021
|
const home = dirname(this.root);
|
|
12662
|
-
|
|
13022
|
+
const results = await new MutationUnit({
|
|
12663
13023
|
io: this.io,
|
|
12664
13024
|
limits: {
|
|
12665
13025
|
maxSkillFileBytes: this.limits.maxSkillFileBytes,
|
|
@@ -12670,6 +13030,8 @@ var SkillLibrary = class {
|
|
|
12670
13030
|
journal: unitJournalPort(this.io, home),
|
|
12671
13031
|
snapshots: unitSnapshotPort(this.io, home)
|
|
12672
13032
|
}).recoverPrepared();
|
|
13033
|
+
await pruneTreeChangeUnits(this.io, home).catch(() => {});
|
|
13034
|
+
return results;
|
|
12673
13035
|
}
|
|
12674
13036
|
/**
|
|
12675
13037
|
* Run one single-file read-modify-write for a mutator. When `transact` was
|
|
@@ -17427,13 +17789,13 @@ const PARAM_EXPOSURE = Object.freeze([
|
|
|
17427
17789
|
owner: "evolution-approval",
|
|
17428
17790
|
applies: "live",
|
|
17429
17791
|
docAnchor: "PARAMETERS.md#write-caps",
|
|
17430
|
-
summary: "What the confirmation before an APPROVE does:
|
|
17792
|
+
summary: "What the confirmation before an APPROVE does: execute immediately, or ask first.",
|
|
17431
17793
|
label: "批准前先确认",
|
|
17432
|
-
hint: "点「批准」时要不要再确认一次:直接执行 /
|
|
17794
|
+
hint: "点「批准」时要不要再确认一次:直接执行 / 先确认。默认直接执行(不打断批量批准)。",
|
|
17433
17795
|
control: "select",
|
|
17434
17796
|
unit: "",
|
|
17435
|
-
values: "auto|ask
|
|
17436
|
-
valueLabels: "
|
|
17797
|
+
values: "auto|ask",
|
|
17798
|
+
valueLabels: "直接执行|先确认",
|
|
17437
17799
|
card: "evolution-approval"
|
|
17438
17800
|
},
|
|
17439
17801
|
{
|
|
@@ -18247,4 +18609,4 @@ function isIgnorableEvent(event) {
|
|
|
18247
18609
|
return classifySessionEvent(event) !== "model";
|
|
18248
18610
|
}
|
|
18249
18611
|
//#endregion
|
|
18250
|
-
export { AUTHORING_DESCRIPTION_BAR, AUTHORING_SPLIT_LINE_CHARS, BASELINE_ACTION, CITATION_SUPPORT_DIRS, COMBINED_REVIEW_PLAN_PROMPT, COMBINED_REVIEW_PROMPT, COMPLETION_SKILL_REVIEW_PROMPT, CONTENT_SPLIT_HINT, COST_ASCII_TOKEN_HIGH, COST_ASCII_TOKEN_LOW, COST_CJK_TOKEN_HIGH, COST_CJK_TOKEN_LOW, CURATOR_DRY_RUN_BANNER, CURATOR_PROMPT, DEDUP_MAX_PAIR_COMPARISONS, DEDUP_SIMILARITY_THRESHOLD, DEFAULT_ADMISSION, DEFAULT_ARCHIVE_AFTER_DAYS, DEFAULT_ARCHIVE_RETENTION_POLICY, DEFAULT_CITATION_POLICY, DEFAULT_CITATION_REF_BUDGET, DEFAULT_CONSOLIDATION_FAILURES, DEFAULT_CURATOR_BOOT_GRACE_SECONDS, DEFAULT_CURATOR_INTERVAL_HOURS, DEFAULT_CURATOR_MODEL, DEFAULT_CURATOR_REVIEW_MAX_TOKENS, DEFAULT_HEALTH_THRESHOLDS, DEFAULT_MEMORY_CHAR_LIMIT, DEFAULT_MIN_IDLE_HOURS, DEFAULT_MUTATION_CAP, DEFAULT_PROBE_TIMEOUT_MS, DEFAULT_REFERENCE_REWRITE_POLICY, DEFAULT_REVIEW_CONTEXT_MESSAGES, DEFAULT_REVIEW_MEMORY_INTERVAL, DEFAULT_REVIEW_MESSAGE_CHARS, DEFAULT_REVIEW_SKILL_INTERVAL, DEFAULT_REVIEW_TIMEOUT_MS, DEFAULT_RUN_RECORDS, DEFAULT_SKILL_CONTENT_CHARS, DEFAULT_SKILL_LIMITS, DEFAULT_SKILL_REVIEW_COMPLETION_MIN_TOOL_CALLS, DEFAULT_SKILL_REVIEW_TRIGGER, DEFAULT_SKILL_VERSION_KEEP, DEFAULT_STALE_AFTER_DAYS, DEFAULT_SUBSTANTIVE_MIN_AGENT_CHARS, DEFAULT_SUBSTANTIVE_MIN_TOOL_CALLS, DEFAULT_SUBSTANTIVE_MIN_USER_CHARS, DEFAULT_SUPPORT_FILE_CHAR_POLICY, DEFAULT_SUPPORT_READ_TOOL_NAMES, DEFAULT_THREAT_MAX_SCAN_CHARS, DEFAULT_USER_CHAR_LIMIT, DEFAULT_WRITE_CONFIRM_MODE, DEFAULT_WRITE_CONFIRM_TIMEOUT_SECONDS, DIAGNOSTICS_FACT_KEYS, DIAGNOSTICS_RUNTIME_KEYS, DIAGNOSTICS_VIEW_SCHEMA_VERSION, DISPATCH_EVENT_TYPES, DRIFT_MAX_LINE_CHARS, DRIFT_SIGNALS_VERSION, DRIFT_SIGNAL_NOUNS, DSH_AUTHORING_STANDARDS, ENTRY_DELIMITER, EVENT_ARCHIVE_PREFIX, EVENT_LOG_RETAIN_ARCHIVES, EVENT_LOG_ROTATE_AT, EVENT_LOG_VERSION, EVOLUTION_ERRORS, EVOLUTION_PRESET_IDS, EVOLUTION_WRITE_TOOLS, EXTRACT_PROMPT_HASH, EXTRACT_PROMPT_V1, EXTRACT_PROMPT_VERSION, EvolutionGateSet, FAMILY_SESSION_TOOL_NAMES, FORBIDDEN_CONTROL_KEYS, FUZZY_MAX_PATTERN_CHARS, FUZZY_MAX_WORK, HEALTH_STAMP_RE, HISTORY_DIR, HISTORY_INDEX_VERSION, HOOK_LINE_RE, HOST_ROUTES, INSTANCE_KEYS, KEEP_LINE_RE, LONG_RUNS, LOW_QUALITY_THRESHOLD, MAINTAINER_PRESET_ID, MAINTAIN_OUTPUT_INSTRUCTION, MAINTAIN_PROMPT, MAX_DESCRIPTION_LENGTH, MAX_REQUEST_BODY_BYTES, MAX_RESTRUCTURE_MOVES, MAX_SKILL_CONTENT_CHARS, MAX_SKILL_FILE_BYTES, MAX_SKILL_NAME_LENGTH, MAX_SUPPORT_READ_PATHS, MAX_TIMER_DELAY_MS, MEMORY_GUIDANCE_SECTION_ORDER, MEMORY_REVIEW_PROMPT, MIN_STAMP_BODY_CHARS, MODEL_SESSION_EVENT_TYPES as MODEL_SESSION_EVENTS, MODEL_SESSION_EVENT_TYPES, MUTATIONS_FILE_VERSION, MemoryStore, MutationUnit, NAMESPACE_MIGRATIONS, NATIVE_CALL_EVENT, NATIVE_RESULT_EVENT, PARAM_ALIASES, PARAM_EXPOSURE, PARAM_GROUP_LABELS, PARAM_NAMESPACES, PATTERN_OVERLAP, PLATFORM_CATALOG_DESCRIPTION_DEFAULT, PLATFORM_ESTIMATE_CHARS_PER_TOKEN, PLATFORM_LINE, PLATFORM_SERVICE_PROBES, POLICY_STAGE_DEFAULTS, PROMPT_BUNDLE, PROMPT_BUNDLE_ID, PROMPT_BUNDLE_VERSION, PROTECTED_BUILTIN_SKILLS, PTC_DISPATCH_EVENT, PTC_DISPATCH_START_EVENT, QUALITY_WEIGHTS, READ_REQUIRED_ACTIONS, RESTRICTED_PRESET_DISPLAY, RESTRICTED_TOOLS_ROW_ID, RESTRICTOR_MODULE, RESTRUCTURE_TARGET_RE, RETENTION_FEEDBACK_KEEP_RATIO, RETENTION_FEEDBACK_MIN_CHARS, REVIEWER_PRESET_ID, RULES, RUNS_SCHEMA_VERSION, SKILLS_GUIDANCE, SKILLS_GUIDANCE_SECTION_ORDER, SKILL_ACTION_REQUIRED_FIELDS, SKILL_NAME_RE, SKILL_REVIEW_PLAN_PROMPT, SKILL_REVIEW_PROMPT, SNAPSHOT_EXTRA_NAME_RE, STORE_LEDGER, SUMMARY_DUPLICATE_HINT_THRESHOLD, SUPPORT_DIRS, SUPPORT_SPRAWL_FILES, SUPPRESSED_FILE_VERSION, SkillLibrary, SkillModel, TEXT_DIFF_MAX_CHARS, TEXT_DIFF_MAX_LINES, THREAT_EXEMPTION_HINT, TOKEN_ASCII_WEIGHT, TOKEN_CJK_WEIGHT, ToolDispatchNormalizer, ToolDispatchPayloadError, UNIT_JOURNAL_PHASES, UNIT_JOURNAL_SCHEMA_VERSION, UNIT_STORAGE_SCHEMA_VERSION, UNTRUSTED_LINE_BREAK, UNTRUSTED_LINE_MARK, UPSTREAM_LIMIT_CHARS_PER_TOKEN, UnitTransactions, VERSION_SUMMARY_MAX_CHARS, absentHostServices, acquireTreeWriteLock, admissionVerdict, advanceReview, affinity, ageCopyKey, allowRowCollisions, anchorVerdict, appendEvolutionEvent, applyCuratorLifecycleFields, applyCuratorMetaFields, applyNamespaceMigration, applyReferenceRewrite, asRecord, assertDispatchPayload, assertSkillsRootAliasRetired, assertUnitJournalTransition, assessStructureHealth, atomicWriteFiles, authoringFeedback, authorityFrom, backupsReachability, blobPath, bodyCost, buildCuratorRunReport, buildExtractPlanFromLibrary, buildHealthBaseline, buildLearnPrompt, bumpPatch, bumpSupportRead, bumpUse, bumpView, callingScope, candidateSkills, canonicalWriteId, claimInstance, clampOnce, clampedNumber, classifyNamespaceMigration, classifySessionEvent, clearReviewChannel, collectReadSkillNames, computeDedupGroups, computeDriftSignals, computeLifecycleTransitions, computePrefixClusters, computeQualityScores, computeScopeView, contentHash, contentRetentionFeedback, countDispatches, countReferenceFiles, createGateSet, createSubagentChannel, daysSinceIso, declaredReportStamp, describeReferenceRewrite, diffFindings, dispatchKeyOf, dispatchStepOf, displayBodyOf, duplicateHeadings, elapsedSince, emptyRecord, ensureSkillFrontmatter, entryTarget, errorText, evaluateThreat, eventsFile, evidenceKindIndex, evolutionActivityProjection, evolutionEventPayloadIssue, evolutionEvidenceProjection, evolutionHome, evolutionIoAdapter, evolutionReadsProjection, evolutionRoot, evolutionSignalsProjection, executeUnitUndo, externalRefs, fileMutationLock, filterUnreadSkillOps, findDriftSignal, findOwnerCandidate, foldCuratorFields, foldToolDispatches, foldTurnEvent, foldTurnEvents, foldUntrustedLines, frontmatterBlock, frontmatterCatalogInvalid, fuzzyPatch, getRecord, h2Sections, historyIndexFile, historyReachability, historyRoot, hostSurface, identity, idleDays, initialTurnFold, installEvolutionProjections, instanceClaimKey, instanceClaimedWriteSites, instanceHolder, isAbsent, isBookkeepingFrame, isCommittedWarning, isDeprecatedParamId, isFileShapedPath, isIgnorableEvent, isLandmark, isMissingPath, isPresent, isProcessAlive, isProgramToolName, isRecord, isReviewChannelSession, isSkillReadToolName, isSkillToolName, isUnknown, isUnreadWrite, json, landmarkVerdict, latestActivityAt, latestVersionAt, lifecycleCandidate, lintBody, lintSkill, listEventArchives, liveBool, liveEnum, liveNumber, liveString, loadMutations, loadSuppressedNames, loadUsage, loadVersionContent, loadVersions, makeSerialQueue, mapProbe, markAgentCreated, markReviewChannel, markerEntryName, memoryRoot, methodNotAllowed, missingSupportPointers, mutateUsage, mutationsFile, narrowNameMatches, nearDuplicateSummaries, newRunRegistry, newSkillLibrary, nextHistoryIndex, nodeEvolutionIo, normalizeFrontmatter, normalizeUsageRecord, normalizeVersionSummary, observeEvent, orderVersions, overlongLines, ownerCandidatesFromSummaries, ownerDecisionText, paramNamespace, paramRowId, paramSettingsId, parseCuratorNominations, parseEvolutionEvents, parseFrontmatter, parseHistoryIndex, partitionVersions, payloadText, persistedWriteSite, persistedWriteSites, pickWithPolicy, planExtract, planNamespaceMigration, planReferenceRewrite, planRehoming, planUnitUndoAcross, policyStageLimits, probeAbsent, probeChannelState, probeList, probeMtime, probePresent, probeReason, probeText, probeUnknown, projectExtractBodies, projectionText, proposalFromPlan, proposalReportDir, proposalReportName, protectedSkillNamesOf, readDispatchSignal, readEvolutionEvents, readEvolutionTimeline, readExternalSupport, readHistoryIndex, readJsonObject, readNumberParam, readParam, readProposalReports, readTreeLock, readUnitEvidence, readUnitIndex, readUnitJournal, readUnitReceipt, readUnitSnapshot, readingStats, recordMutation, recordVersions, redactSecrets, referencedBlobs, registerHostRoutes, relatedSkillNames, releaseInstance, renameWithRetry, renderCuratorReportMarkdown, renderLongRunTable, reportTime, reportsReachability, reportsSweepLockTarget, resolveCitations, resolveExecOrigins, resolveOrigins, resolveParamId, resolveRootConfig, resolveSkillsRoot, resolveUnitMembers, resolveUnitMembersFromIndexes, restructureCandidates, retainEventArchives, retirementReport, reviewPrompt, revisionAnchor, revisionAnchorOf, revisionFingerprint, revisionSupportDigest, runWriteGates, runsFile, saveSuppressedNames, saveUsage, scanBodyHooks, scanContentThreats, scanMemoryThreats, scanThreats, scopeOfNearestManifest, scopedPackageName, scopedProbeReport, selectSections, sessionAudited, sessionEvidenceIndex, sessionLastEventTime, sessionReadNames, sessionReadSkillNames, sessionSeesFamilyTools, sessionTurnSignals, skillLibraryUnitBackend, skillReadNameOf, skillRowCells, skillStateKey, skillWriteGateContext, skillsRoot, staleRouteStubs, subagentChannelState, supportFileReadOf, supportRefs, suppressedFile, sweepReports, sweepReviewChannelSessions, textDiffFacts, tokenLineFor, transactIo, transactTaskGuard, treeLockFile, trimPatternBoundaries, unhookedSupportPointers, unitEvidenceDigest, unitEvidencePath, unitIndexPath, unitJournalPath, unitJournalPhaseRank, unitJournalPort, unitMembersAreComplete, unitReceiptPath, unitSnapshotPath, unitSnapshotPort, unitSnapshotsDir, unitStorageKey, unwrapLive, updateSuppressedNames, upsertUnitIndex, usageFile, usageObserved, userSetKeys, validateFrontmatter, validateMutationRequest, validateRestructureTarget, validateSupportPath, valueOr, verifyPromptBundle, versionActionKind, versionRowCells, versionSummaryPrompt, versionTarget, vocabulary, withTreeWrite, withTreeWriteLock, writeDurableTmp, writePathSymbols, writeProposalReport, writeUnitEvidence, writeUnitJournal, writeUnitReceipt, writeUnitSnapshot, yamlPlainScalarNeedsQuotes };
|
|
18612
|
+
export { AUTHORING_DESCRIPTION_BAR, AUTHORING_SPLIT_LINE_CHARS, BASELINE_ACTION, CITATION_SUPPORT_DIRS, COMBINED_REVIEW_PLAN_PROMPT, COMBINED_REVIEW_PROMPT, COMPLETION_SKILL_REVIEW_PROMPT, CONTENT_SPLIT_HINT, COST_ASCII_TOKEN_HIGH, COST_ASCII_TOKEN_LOW, COST_CJK_TOKEN_HIGH, COST_CJK_TOKEN_LOW, CURATOR_DRY_RUN_BANNER, CURATOR_PROMPT, DEDUP_MAX_PAIR_COMPARISONS, DEDUP_SIMILARITY_THRESHOLD, DEFAULT_ADMISSION, DEFAULT_ARCHIVE_AFTER_DAYS, DEFAULT_ARCHIVE_RETENTION_POLICY, DEFAULT_CITATION_POLICY, DEFAULT_CITATION_REF_BUDGET, DEFAULT_CONSOLIDATION_FAILURES, DEFAULT_CURATOR_BOOT_GRACE_SECONDS, DEFAULT_CURATOR_INTERVAL_HOURS, DEFAULT_CURATOR_MODEL, DEFAULT_CURATOR_REVIEW_MAX_TOKENS, DEFAULT_HEALTH_THRESHOLDS, DEFAULT_MEMORY_CHAR_LIMIT, DEFAULT_MIN_IDLE_HOURS, DEFAULT_MUTATION_CAP, DEFAULT_PROBE_TIMEOUT_MS, DEFAULT_REFERENCE_REWRITE_POLICY, DEFAULT_REVIEW_CONTEXT_MESSAGES, DEFAULT_REVIEW_MEMORY_INTERVAL, DEFAULT_REVIEW_MESSAGE_CHARS, DEFAULT_REVIEW_SKILL_INTERVAL, DEFAULT_REVIEW_TIMEOUT_MS, DEFAULT_RUN_RECORDS, DEFAULT_SKILL_CONTENT_CHARS, DEFAULT_SKILL_LIMITS, DEFAULT_SKILL_REVIEW_COMPLETION_MIN_TOOL_CALLS, DEFAULT_SKILL_REVIEW_TRIGGER, DEFAULT_SKILL_VERSION_KEEP, DEFAULT_STALE_AFTER_DAYS, DEFAULT_SUBSTANTIVE_MIN_AGENT_CHARS, DEFAULT_SUBSTANTIVE_MIN_TOOL_CALLS, DEFAULT_SUBSTANTIVE_MIN_USER_CHARS, DEFAULT_SUPPORT_FILE_CHAR_POLICY, DEFAULT_SUPPORT_READ_TOOL_NAMES, DEFAULT_THREAT_MAX_SCAN_CHARS, DEFAULT_USER_CHAR_LIMIT, DEFAULT_WRITE_CONFIRM_MODE, DEFAULT_WRITE_CONFIRM_TIMEOUT_SECONDS, DIAGNOSTICS_FACT_KEYS, DIAGNOSTICS_RUNTIME_KEYS, DIAGNOSTICS_VIEW_SCHEMA_VERSION, DISPATCH_EVENT_TYPES, DRIFT_MAX_LINE_CHARS, DRIFT_SIGNALS_VERSION, DRIFT_SIGNAL_NOUNS, DSH_AUTHORING_STANDARDS, ENTRY_DELIMITER, EVENT_ARCHIVE_PREFIX, EVENT_LOG_RETAIN_ARCHIVES, EVENT_LOG_ROTATE_AT, EVENT_LOG_VERSION, EVOLUTION_ERRORS, EVOLUTION_PRESET_IDS, EVOLUTION_WRITE_TOOLS, EXTRACT_PROMPT_HASH, EXTRACT_PROMPT_V1, EXTRACT_PROMPT_VERSION, EvolutionGateSet, FAMILY_SESSION_TOOL_NAMES, FORBIDDEN_CONTROL_KEYS, FUZZY_MAX_PATTERN_CHARS, FUZZY_MAX_WORK, HEALTH_STAMP_RE, HISTORY_DIR, HISTORY_INDEX_VERSION, HOOK_LINE_RE, HOST_ROUTES, INSTANCE_KEYS, KEEP_LINE_RE, LONG_RUNS, LOW_QUALITY_THRESHOLD, MAINTAINER_PRESET_ID, MAINTAIN_OUTPUT_INSTRUCTION, MAINTAIN_PROMPT, MAX_DESCRIPTION_LENGTH, MAX_REQUEST_BODY_BYTES, MAX_RESTRUCTURE_MOVES, MAX_SKILL_CONTENT_CHARS, MAX_SKILL_FILE_BYTES, MAX_SKILL_NAME_LENGTH, MAX_SUPPORT_READ_PATHS, MAX_TIMER_DELAY_MS, MEMORY_GUIDANCE_SECTION_ORDER, MEMORY_REVIEW_PROMPT, MIN_STAMP_BODY_CHARS, MODEL_SESSION_EVENT_TYPES as MODEL_SESSION_EVENTS, MODEL_SESSION_EVENT_TYPES, MUTATIONS_FILE_VERSION, MemoryStore, MutationUnit, NAMESPACE_MIGRATIONS, NATIVE_CALL_EVENT, NATIVE_RESULT_EVENT, PARAM_ALIASES, PARAM_EXPOSURE, PARAM_GROUP_LABELS, PARAM_NAMESPACES, PATTERN_OVERLAP, PLATFORM_CATALOG_DESCRIPTION_DEFAULT, PLATFORM_ESTIMATE_CHARS_PER_TOKEN, PLATFORM_LINE, PLATFORM_SERVICE_PROBES, POLICY_STAGE_DEFAULTS, PROMPT_BUNDLE, PROMPT_BUNDLE_ID, PROMPT_BUNDLE_VERSION, PROTECTED_BUILTIN_SKILLS, PTC_DISPATCH_EVENT, PTC_DISPATCH_START_EVENT, QUALITY_WEIGHTS, READ_REQUIRED_ACTIONS, RESTRICTED_PRESET_DISPLAY, RESTRICTED_TOOLS_ROW_ID, RESTRICTOR_MODULE, RESTRUCTURE_TARGET_RE, RETENTION_FEEDBACK_KEEP_RATIO, RETENTION_FEEDBACK_MIN_CHARS, REVIEWER_PRESET_ID, RULES, RUNS_SCHEMA_VERSION, SKILLS_GUIDANCE, SKILLS_GUIDANCE_SECTION_ORDER, SKILL_ACTION_REQUIRED_FIELDS, SKILL_NAME_RE, SKILL_REVIEW_PLAN_PROMPT, SKILL_REVIEW_PROMPT, SNAPSHOT_EXTRA_NAME_RE, STORE_LEDGER, SUMMARY_DUPLICATE_HINT_THRESHOLD, SUPPORT_DIRS, SUPPORT_SPRAWL_FILES, SUPPRESSED_FILE_VERSION, SkillLibrary, SkillModel, TEXT_DIFF_MAX_CHARS, TEXT_DIFF_MAX_LINES, THREAT_EXEMPTION_HINT, TOKEN_ASCII_WEIGHT, TOKEN_CJK_WEIGHT, ToolDispatchNormalizer, ToolDispatchPayloadError, UNIT_JOURNAL_PHASES, UNIT_JOURNAL_SCHEMA_VERSION, UNIT_STORAGE_SCHEMA_VERSION, UNTRUSTED_LINE_BREAK, UNTRUSTED_LINE_MARK, UPSTREAM_LIMIT_CHARS_PER_TOKEN, UnitTransactions, VERSION_SUMMARY_MAX_CHARS, WriteKernel, absentHostServices, acquireTreeWriteLock, admissionVerdict, advanceReview, affinity, ageCopyKey, allowRowCollisions, anchorVerdict, appendEvolutionEvent, applyCuratorLifecycleFields, applyCuratorMetaFields, applyNamespaceMigration, applyReferenceRewrite, asRecord, assertDispatchPayload, assertSkillsRootAliasRetired, assertUnitJournalTransition, assessStructureHealth, atomicWriteFiles, authoringFeedback, authorityFrom, backupsReachability, blobPath, bodyCost, buildCuratorRunReport, buildExtractPlanFromLibrary, buildHealthBaseline, buildLearnPrompt, bumpPatch, bumpSupportRead, bumpUse, bumpView, callingScope, candidateSkills, canonicalWriteId, claimInstance, clampOnce, clampedNumber, classifyNamespaceMigration, classifySessionEvent, clearReviewChannel, collectReadSkillNames, collectReadSupportFiles, computeDedupGroups, computeDriftSignals, computeLifecycleTransitions, computePrefixClusters, computeQualityScores, computeScopeView, contentHash, contentRetentionFeedback, countDispatches, countReferenceFiles, createGateSet, createSubagentChannel, daysSinceIso, declaredReportStamp, describeReferenceRewrite, diffFindings, dispatchKeyOf, dispatchPathOf, dispatchStepOf, displayBodyOf, duplicateHeadings, elapsedSince, emptyRecord, ensureSkillFrontmatter, entryTarget, errorText, evaluateThreat, eventsFile, evidenceKindIndex, evolutionActivityProjection, evolutionEventPayloadIssue, evolutionEvidenceProjection, evolutionHome, evolutionIoAdapter, evolutionProjectionHistoryProjection, evolutionReadsProjection, evolutionRoot, evolutionSignalsProjection, executeUnitUndo, externalRefs, fileMutationLock, filterUnreadSkillOps, findDriftSignal, findOwnerCandidate, foldCuratorFields, foldToolDispatches, foldTurnEvent, foldTurnEvents, foldUntrustedLines, frontmatterBlock, frontmatterCatalogInvalid, fuzzyPatch, getRecord, h2Sections, historyIndexFile, historyReachability, historyRoot, hostSurface, identity, idleDays, initialTurnFold, installEvolutionProjections, instanceClaimKey, instanceClaimedWriteSites, instanceHolder, isAbsent, isBookkeepingFrame, isCommittedWarning, isDeprecatedParamId, isFileShapedPath, isIgnorableEvent, isLandmark, isMissingPath, isPresent, isProcessAlive, isProgramToolName, isProjectableSession, isRecord, isReviewChannelSession, isSkillReadToolName, isSkillToolName, isUnknown, isUnreadWrite, json, landmarkVerdict, latestActivityAt, latestVersionAt, lifecycleCandidate, lintBody, lintSkill, listEventArchives, liveBool, liveEnum, liveNumber, liveString, loadMutations, loadSuppressedNames, loadUsage, loadVersionContent, loadVersions, makeSerialQueue, mapProbe, markAgentCreated, markReviewChannel, markerEntryName, memoryRoot, methodNotAllowed, missingSupportPointers, mutateUsage, mutationsFile, narrowNameMatches, nearDuplicateSummaries, newRunRegistry, newSkillLibrary, nextHistoryIndex, nodeEvolutionIo, normalizeFrontmatter, normalizeUsageRecord, normalizeVersionSummary, observeEvent, orderVersions, overlongLines, ownerCandidatesFromSummaries, ownerDecisionText, paramNamespace, paramRowId, paramSettingsId, parseCuratorNominations, parseEvolutionEvents, parseFrontmatter, parseHistoryIndex, partitionVersions, payloadText, persistedWriteSite, persistedWriteSites, pickWithPolicy, planExtract, planNamespaceMigration, planReferenceRewrite, planRehoming, planUnitUndoAcross, policyStageLimits, probeAbsent, probeChannelState, probeList, probeMtime, probePresent, probeReason, probeText, probeUnknown, projectExtractBodies, projectionText, proposalFromPlan, proposalReportDir, proposalReportName, protectedSkillNamesOf, pruneTreeChangeUnits, readDispatchSignal, readEvolutionEvents, readEvolutionTimeline, readExternalSupport, readHistoryIndex, readJsonObject, readNumberParam, readParam, readProposalReports, readTreeLock, readUnitEvidence, readUnitIndex, readUnitJournal, readUnitReceipt, readUnitSnapshot, readingStats, recordMutation, recordVersions, redactSecrets, referencedBlobs, registerHostRoutes, relatedSkillNames, releaseInstance, renameWithRetry, renderCuratorReportMarkdown, renderLongRunTable, reportTime, reportsReachability, reportsSweepLockTarget, resolveCitations, resolveExecOrigins, resolveOrigins, resolveParamId, resolveRootConfig, resolveSkillsRoot, resolveUnitMembers, resolveUnitMembersFromIndexes, restructureCandidates, retainEventArchives, retirementReport, reviewPrompt, revisionAnchor, revisionAnchorOf, revisionFingerprint, revisionSupportDigest, runWriteGates, runsFile, saveSuppressedNames, saveUsage, scanBodyHooks, scanContentThreats, scanMemoryThreats, scanThreats, scopeOfNearestManifest, scopedPackageName, scopedProbeReport, selectSections, sessionAudited, sessionEvidenceIndex, sessionLastEventTime, sessionReadNames, sessionReadSkillNames, sessionReadSupportFiles, sessionSeesFamilyTools, sessionTurnSignals, skillLibraryUnitBackend, skillReadNameOf, skillRowCells, skillStateKey, skillWriteGateContext, skillsRoot, staleRouteStubs, subagentChannelState, supportFileReadFromPath, supportFileReadOf, supportRefs, suppressedFile, sweepReports, sweepReviewChannelSessions, textDiffFacts, tokenLineFor, transactIo, transactTaskGuard, treeLockFile, trimPatternBoundaries, unhookedSupportPointers, unitEvidenceDigest, unitEvidencePath, unitIndexPath, unitJournalPath, unitJournalPhaseRank, unitJournalPort, unitMembersAreComplete, unitReceiptPath, unitSnapshotPath, unitSnapshotPort, unitSnapshotsDir, unitStorageKey, unwrapLive, updateSuppressedNames, upsertUnitIndex, usageFile, usageObserved, userSetKeys, validateFrontmatter, validateMutationRequest, validateRestructureTarget, validateSupportPath, valueOr, verifyPromptBundle, versionActionKind, versionRowCells, versionSummaryPrompt, versionTarget, vocabulary, withTreeWrite, withTreeWriteLock, writeDurableTmp, writePathSymbols, writeProposalReport, writeUnitEvidence, writeUnitJournal, writeUnitReceipt, writeUnitSnapshot, yamlPlainScalarNeedsQuotes };
|