loopforge 2.7.0 → 3.0.0
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 +136 -182
- package/dist/canonical-event-writer.d.ts +20 -0
- package/dist/canonical-event-writer.d.ts.map +1 -0
- package/dist/canonical-event-writer.js +131 -0
- package/dist/canonical-event-writer.js.map +1 -0
- package/dist/canonical-state.d.ts +20 -16
- package/dist/canonical-state.d.ts.map +1 -1
- package/dist/canonical-state.js +211 -64
- package/dist/canonical-state.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +11 -10
- package/dist/cli.js.map +1 -1
- package/dist/cognitive-governance.d.ts +48 -0
- package/dist/cognitive-governance.d.ts.map +1 -0
- package/dist/cognitive-governance.js +226 -0
- package/dist/cognitive-governance.js.map +1 -0
- package/dist/compiler-subgoals.d.ts +7 -0
- package/dist/compiler-subgoals.d.ts.map +1 -0
- package/dist/compiler-subgoals.js +93 -0
- package/dist/compiler-subgoals.js.map +1 -0
- package/dist/derive-id.d.ts +12 -0
- package/dist/derive-id.d.ts.map +1 -0
- package/dist/derive-id.js +31 -0
- package/dist/derive-id.js.map +1 -0
- package/dist/evidence-provider.d.ts +26 -26
- package/dist/evidence-provider.d.ts.map +1 -1
- package/dist/evidence-provider.js +45 -71
- package/dist/evidence-provider.js.map +1 -1
- package/dist/generate-schema.js +90 -2
- package/dist/generate-schema.js.map +1 -1
- package/dist/index.d.ts +23 -29
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -26
- package/dist/index.js.map +1 -1
- package/dist/loop-compiler.d.ts +2 -2
- package/dist/loop-compiler.d.ts.map +1 -1
- package/dist/loop-compiler.js +321 -315
- package/dist/loop-compiler.js.map +1 -1
- package/dist/loop-extras-parser.d.ts +2 -2
- package/dist/loop-extras-parser.d.ts.map +1 -1
- package/dist/loop-extras-parser.js +2 -2
- package/dist/loop-extras-parser.js.map +1 -1
- package/dist/loop-store.d.ts +20 -58
- package/dist/loop-store.d.ts.map +1 -1
- package/dist/loop-store.js +232 -311
- package/dist/loop-store.js.map +1 -1
- package/dist/mcp/server.d.ts +3 -3
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +123 -19
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/session-projection.d.ts +5 -0
- package/dist/mcp/session-projection.d.ts.map +1 -0
- package/dist/mcp/session-projection.js +18 -0
- package/dist/mcp/session-projection.js.map +1 -0
- package/dist/mcp/session-queue.d.ts +3 -0
- package/dist/mcp/session-queue.d.ts.map +1 -0
- package/dist/mcp/session-queue.js +18 -0
- package/dist/mcp/session-queue.js.map +1 -0
- package/dist/mcp/session-types.d.ts +72 -0
- package/dist/mcp/session-types.d.ts.map +1 -0
- package/dist/mcp/session-types.js +2 -0
- package/dist/mcp/session-types.js.map +1 -0
- package/dist/mcp/session.d.ts +65 -84
- package/dist/mcp/session.d.ts.map +1 -1
- package/dist/mcp/session.js +667 -224
- package/dist/mcp/session.js.map +1 -1
- package/dist/mcp/tools.d.ts +26 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +401 -254
- package/dist/mcp/tools.js.map +1 -1
- package/dist/policy-metrics.d.ts +24 -0
- package/dist/policy-metrics.d.ts.map +1 -1
- package/dist/policy-metrics.js +174 -0
- package/dist/policy-metrics.js.map +1 -1
- package/dist/policy.d.ts +74 -12
- package/dist/policy.d.ts.map +1 -1
- package/dist/policy.js +124 -19
- package/dist/policy.js.map +1 -1
- package/dist/prompt-assembler.d.ts +8 -4
- package/dist/prompt-assembler.d.ts.map +1 -1
- package/dist/prompt-assembler.js +533 -86
- package/dist/prompt-assembler.js.map +1 -1
- package/dist/prompt-policy.d.ts +8 -1
- package/dist/prompt-policy.d.ts.map +1 -1
- package/dist/prompt-policy.js +26 -8
- package/dist/prompt-policy.js.map +1 -1
- package/dist/protocol.d.ts +259 -173
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +17 -96
- package/dist/protocol.js.map +1 -1
- package/dist/replay.d.ts +11 -3
- package/dist/replay.d.ts.map +1 -1
- package/dist/replay.js +51 -14
- package/dist/replay.js.map +1 -1
- package/dist/round-commit-store.d.ts +12 -0
- package/dist/round-commit-store.d.ts.map +1 -0
- package/dist/round-commit-store.js +13 -0
- package/dist/round-commit-store.js.map +1 -0
- package/dist/round-coordinator.d.ts +53 -22
- package/dist/round-coordinator.d.ts.map +1 -1
- package/dist/round-coordinator.js +140 -44
- package/dist/round-coordinator.js.map +1 -1
- package/dist/round-driver.d.ts +18 -10
- package/dist/round-driver.d.ts.map +1 -1
- package/dist/round-driver.js +11 -13
- package/dist/round-driver.js.map +1 -1
- package/dist/round-gate.d.ts +31 -0
- package/dist/round-gate.d.ts.map +1 -0
- package/dist/round-gate.js +259 -0
- package/dist/round-gate.js.map +1 -0
- package/dist/round-recovery.d.ts +17 -0
- package/dist/round-recovery.d.ts.map +1 -0
- package/dist/round-recovery.js +117 -0
- package/dist/round-recovery.js.map +1 -0
- package/dist/round-report.d.ts +16 -0
- package/dist/round-report.d.ts.map +1 -0
- package/dist/round-report.js +401 -0
- package/dist/round-report.js.map +1 -0
- package/dist/round-transaction.d.ts +23 -12
- package/dist/round-transaction.d.ts.map +1 -1
- package/dist/round-transaction.js +104 -91
- package/dist/round-transaction.js.map +1 -1
- package/dist/runtime-services.d.ts +59 -0
- package/dist/runtime-services.d.ts.map +1 -0
- package/dist/{engine.js → runtime-services.js} +157 -275
- package/dist/runtime-services.js.map +1 -0
- package/dist/storage.d.ts +3 -9
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +6 -17
- package/dist/storage.js.map +1 -1
- package/dist/token-utils.d.ts +12 -8
- package/dist/token-utils.d.ts.map +1 -1
- package/dist/token-utils.js +56 -10
- package/dist/token-utils.js.map +1 -1
- package/dist/vault-format.d.ts +4 -0
- package/dist/vault-format.d.ts.map +1 -0
- package/dist/vault-format.js +4 -0
- package/dist/vault-format.js.map +1 -0
- package/dist/vault-types.d.ts +24 -0
- package/dist/vault-types.d.ts.map +1 -0
- package/dist/vault-types.js +2 -0
- package/dist/vault-types.js.map +1 -0
- package/loop_policy.json +10 -12
- package/loopforge-policy.json +340 -0
- package/package.json +13 -7
- package/skills/perception/SKILL.md +200 -90
- package/dist/backends/interface.d.ts +0 -39
- package/dist/backends/interface.d.ts.map +0 -1
- package/dist/backends/interface.js +0 -6
- package/dist/backends/interface.js.map +0 -1
- package/dist/enforcement-gate.d.ts +0 -50
- package/dist/enforcement-gate.d.ts.map +0 -1
- package/dist/enforcement-gate.js +0 -501
- package/dist/enforcement-gate.js.map +0 -1
- package/dist/engine.d.ts +0 -59
- package/dist/engine.d.ts.map +0 -1
- package/dist/engine.js.map +0 -1
- package/dist/interop.d.ts +0 -35
- package/dist/interop.d.ts.map +0 -1
- package/dist/interop.js +0 -34
- package/dist/interop.js.map +0 -1
- package/dist/run.d.ts +0 -51
- package/dist/run.d.ts.map +0 -1
- package/dist/run.js +0 -200
- package/dist/run.js.map +0 -1
- package/dist/self-eval.d.ts +0 -23
- package/dist/self-eval.d.ts.map +0 -1
- package/dist/self-eval.js +0 -151
- package/dist/self-eval.js.map +0 -1
- package/dist/verification-gate.d.ts +0 -52
- package/dist/verification-gate.d.ts.map +0 -1
- package/dist/verification-gate.js +0 -527
- package/dist/verification-gate.js.map +0 -1
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { deriveCriterionId, deriveGateId, deriveTextHash } from "./derive-id.js";
|
|
3
|
+
import { isRecord } from "./token-utils.js";
|
|
4
|
+
import { entryRound } from "./token-utils.js";
|
|
5
|
+
const USER_EFFECTS = new Set([
|
|
6
|
+
"production", "credentials", "data_migration", "public_api", "publish",
|
|
7
|
+
"payment", "external_communication",
|
|
8
|
+
]);
|
|
9
|
+
const USER_RISK = /production|prod\b|credential|secret|permission|publish|release|database migration|schema migration|public api break|rm\s+-rf|reset\s+--hard|send email|payment|生产|上线|凭据|密钥|权限|发布|数据迁移|破坏性/i;
|
|
10
|
+
export function canonicalizeGateAction(action) {
|
|
11
|
+
return JSON.stringify({
|
|
12
|
+
description: action.description.trim(),
|
|
13
|
+
scope: [...action.scope].map((value) => value.trim()).filter(Boolean).sort(),
|
|
14
|
+
effects: [...action.effects].sort(),
|
|
15
|
+
reversibility: action.reversibility,
|
|
16
|
+
authorization: action.authorization,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
export function gateActionHash(action) {
|
|
20
|
+
return createHash("sha256").update(canonicalizeGateAction(action)).digest("hex").slice(0, 16);
|
|
21
|
+
}
|
|
22
|
+
export function deriveStructuredGate(action) {
|
|
23
|
+
const actionHash = gateActionHash(action);
|
|
24
|
+
const highRisk = action.authorization === "user_required" ||
|
|
25
|
+
action.reversibility === "irreversible" ||
|
|
26
|
+
action.reversibility === "unknown" ||
|
|
27
|
+
action.effects.some((effect) => USER_EFFECTS.has(effect));
|
|
28
|
+
const userGate = highRisk || action.authorization === "unknown" || action.effects.length === 0;
|
|
29
|
+
return {
|
|
30
|
+
id: `gate-${actionHash}`,
|
|
31
|
+
actionHash,
|
|
32
|
+
gate: userGate
|
|
33
|
+
? {
|
|
34
|
+
kind: "user",
|
|
35
|
+
question: `Authorize this action: ${action.description}`,
|
|
36
|
+
blockedScope: action.scope.length ? action.scope : [action.description],
|
|
37
|
+
allowedWork: ["Read-only investigation", "Local dry-run", "Prepare verification and rollback evidence"],
|
|
38
|
+
}
|
|
39
|
+
: {
|
|
40
|
+
kind: "agent",
|
|
41
|
+
problem: action.description,
|
|
42
|
+
requiredEvidence: action.scope,
|
|
43
|
+
suggestedResolution: "Resolve the technical blocker and submit concrete evidence in RoundReport.",
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
export function deriveGate(action, scope = []) {
|
|
48
|
+
if (typeof action !== "string")
|
|
49
|
+
return deriveStructuredGate(action);
|
|
50
|
+
const normalized = [action, ...scope].join("\n").trim();
|
|
51
|
+
const id = deriveGateId(normalized);
|
|
52
|
+
const gate = USER_RISK.test(normalized)
|
|
53
|
+
? {
|
|
54
|
+
kind: "user",
|
|
55
|
+
question: `Authorize this high-risk action: ${action}`,
|
|
56
|
+
blockedScope: scope.length ? scope : [action],
|
|
57
|
+
allowedWork: ["Read-only investigation", "Local dry-run", "Prepare verification and rollback evidence"],
|
|
58
|
+
}
|
|
59
|
+
: {
|
|
60
|
+
kind: "agent",
|
|
61
|
+
problem: action,
|
|
62
|
+
requiredEvidence: scope,
|
|
63
|
+
suggestedResolution: "Resolve the technical blocker and submit concrete evidence in RoundReport.",
|
|
64
|
+
};
|
|
65
|
+
return { id, gate };
|
|
66
|
+
}
|
|
67
|
+
function report(entry) {
|
|
68
|
+
return isRecord(entry.round_report) ? entry.round_report : null;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Replay events in a deterministic logical order. Backends are allowed to
|
|
72
|
+
* return entries in different physical orders, so insertion order cannot be
|
|
73
|
+
* used to decide which gate decision or verification result wins.
|
|
74
|
+
* Shared with the policy-metrics replay path, which must fold events in the
|
|
75
|
+
* same order as the audit.
|
|
76
|
+
*/
|
|
77
|
+
export function auditOrder(entries) {
|
|
78
|
+
return entries
|
|
79
|
+
.map((entry, index) => ({ entry, index }))
|
|
80
|
+
.sort((left, right) => {
|
|
81
|
+
const leftSequence = left.entry.event_sequence;
|
|
82
|
+
const rightSequence = right.entry.event_sequence;
|
|
83
|
+
if (typeof leftSequence === "number" && typeof rightSequence === "number" && leftSequence !== rightSequence) {
|
|
84
|
+
return leftSequence - rightSequence;
|
|
85
|
+
}
|
|
86
|
+
const roundDiff = entryRound(left.entry) - entryRound(right.entry);
|
|
87
|
+
if (roundDiff !== 0)
|
|
88
|
+
return roundDiff;
|
|
89
|
+
const timeLeft = Date.parse(left.entry.timestamp ?? "");
|
|
90
|
+
const timeRight = Date.parse(right.entry.timestamp ?? "");
|
|
91
|
+
const validLeft = Number.isFinite(timeLeft);
|
|
92
|
+
const validRight = Number.isFinite(timeRight);
|
|
93
|
+
if (validLeft && validRight && timeLeft !== timeRight) {
|
|
94
|
+
return timeLeft - timeRight;
|
|
95
|
+
}
|
|
96
|
+
if (validLeft !== validRight)
|
|
97
|
+
return validLeft ? -1 : 1;
|
|
98
|
+
const key = (entry) => [
|
|
99
|
+
entry.task_type ?? "",
|
|
100
|
+
entry.task_id ?? entry.id ?? "",
|
|
101
|
+
entry.gate_id ?? "",
|
|
102
|
+
entry.approved === true ? "1" : entry.approved === false ? "0" : "",
|
|
103
|
+
].join("\u0000");
|
|
104
|
+
const keyDiff = key(left.entry).localeCompare(key(right.entry));
|
|
105
|
+
return keyDiff !== 0 ? keyDiff : left.index - right.index;
|
|
106
|
+
})
|
|
107
|
+
.map(({ entry }) => entry);
|
|
108
|
+
}
|
|
109
|
+
/** Read-only, replayable audit derived from accepted vault events. */
|
|
110
|
+
export function auditEntries(loopId, entries) {
|
|
111
|
+
const orderedEntries = auditOrder(entries);
|
|
112
|
+
const objectiveEntry = [...orderedEntries].reverse().find((entry) => isRecord(entry.loop_objective));
|
|
113
|
+
const objective = objectiveEntry && isRecord(objectiveEntry.loop_objective)
|
|
114
|
+
? objectiveEntry.loop_objective
|
|
115
|
+
: null;
|
|
116
|
+
const declared = objective && Array.isArray(objective.success_criteria)
|
|
117
|
+
? objective.success_criteria.filter((value) => typeof value === "string")
|
|
118
|
+
: [];
|
|
119
|
+
const evidenced = new Set();
|
|
120
|
+
const passed = new Set();
|
|
121
|
+
const failed = new Set();
|
|
122
|
+
const unavailable = new Set();
|
|
123
|
+
const evidenceRefs = new Set();
|
|
124
|
+
const gateState = new Map();
|
|
125
|
+
const obligations = new Map();
|
|
126
|
+
const criterionByTarget = new Map();
|
|
127
|
+
for (const criterion of declared) {
|
|
128
|
+
const normalized = criterion.trim().replace(/\s+/g, " ").toLowerCase();
|
|
129
|
+
criterionByTarget.set(normalized, criterion);
|
|
130
|
+
criterionByTarget.set(deriveCriterionId(normalized), criterion);
|
|
131
|
+
}
|
|
132
|
+
for (const entry of orderedEntries) {
|
|
133
|
+
if (entry.task_type === "gate_decision" && typeof entry.gate_id === "string") {
|
|
134
|
+
gateState.set(entry.gate_id, entry.approved === true);
|
|
135
|
+
}
|
|
136
|
+
if (entry.task_type === "gate_opened" && typeof entry.gate_id === "string") {
|
|
137
|
+
if (!gateState.has(entry.gate_id))
|
|
138
|
+
gateState.set(entry.gate_id, false);
|
|
139
|
+
}
|
|
140
|
+
const value = report(entry);
|
|
141
|
+
const evidence = value && isRecord(value.evidence) ? value.evidence : null;
|
|
142
|
+
if (value && isRecord(value.blocker) && typeof value.blocker.reason === "string") {
|
|
143
|
+
const refs = Array.isArray(value.blocker.references)
|
|
144
|
+
? value.blocker.references.filter((ref) => typeof ref === "string")
|
|
145
|
+
: [];
|
|
146
|
+
const derived = isRecord(value.blocker.action)
|
|
147
|
+
? deriveStructuredGate(value.blocker.action)
|
|
148
|
+
: deriveGate(value.blocker.reason, refs);
|
|
149
|
+
if (derived.gate.kind === "user" && !gateState.has(derived.id)) {
|
|
150
|
+
gateState.set(derived.id, false);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
if (!evidence)
|
|
154
|
+
continue;
|
|
155
|
+
const provenance = isRecord(evidence.provenance) ? evidence.provenance : {};
|
|
156
|
+
if (Array.isArray(evidence.claims)) {
|
|
157
|
+
for (const raw of evidence.claims) {
|
|
158
|
+
if (!isRecord(raw) || typeof raw.targetId !== "string" || !Array.isArray(raw.evidenceRefs) || raw.evidenceRefs.length === 0)
|
|
159
|
+
continue;
|
|
160
|
+
const refs = raw.evidenceRefs.filter((ref) => typeof ref === "string");
|
|
161
|
+
const verified = refs.some((ref) => isRecord(provenance[ref]) &&
|
|
162
|
+
provenance[ref].status === "verified" && provenance[ref].source !== "agent");
|
|
163
|
+
if (verified) {
|
|
164
|
+
const normalizedTarget = raw.targetId.trim().replace(/\s+/g, " ").toLowerCase();
|
|
165
|
+
evidenced.add(criterionByTarget.get(normalizedTarget) ?? raw.targetId.trim());
|
|
166
|
+
}
|
|
167
|
+
for (const ref of refs)
|
|
168
|
+
evidenceRefs.add(ref);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
if (Array.isArray(evidence.checks)) {
|
|
172
|
+
for (const raw of evidence.checks) {
|
|
173
|
+
if (!isRecord(raw) || typeof raw.name !== "string")
|
|
174
|
+
continue;
|
|
175
|
+
const checkProvenance = provenance[`check:${raw.name}`];
|
|
176
|
+
const evidenceStatus = isRecord(checkProvenance)
|
|
177
|
+
? checkProvenance.status
|
|
178
|
+
: "unavailable";
|
|
179
|
+
const id = `reg-${deriveTextHash(raw.name, 12)}`;
|
|
180
|
+
const sourceRound = entryRound(entry);
|
|
181
|
+
if (raw.status === "passed" && evidenceStatus === "verified") {
|
|
182
|
+
passed.add(raw.name);
|
|
183
|
+
failed.delete(raw.name);
|
|
184
|
+
unavailable.delete(raw.name);
|
|
185
|
+
obligations.set(raw.name, { id, check: raw.name, sourceRound, status: "satisfied" });
|
|
186
|
+
}
|
|
187
|
+
else if (raw.status === "failed" || evidenceStatus === "contradicted") {
|
|
188
|
+
failed.add(raw.name);
|
|
189
|
+
passed.delete(raw.name);
|
|
190
|
+
unavailable.delete(raw.name);
|
|
191
|
+
obligations.set(raw.name, { id, check: raw.name, sourceRound, status: "contradicted" });
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
unavailable.add(raw.name);
|
|
195
|
+
passed.delete(raw.name);
|
|
196
|
+
obligations.set(raw.name, { id, check: raw.name, sourceRound, status: "open" });
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
const missing = declared.filter((criterion) => !evidenced.has(criterion));
|
|
202
|
+
const unresolvedUserGates = [...gateState].filter(([, approved]) => !approved).map(([id]) => id);
|
|
203
|
+
const verdict = failed.size > 0 ? "contradicted"
|
|
204
|
+
: missing.length || unresolvedUserGates.length || unavailable.size ? "incomplete"
|
|
205
|
+
: "passed";
|
|
206
|
+
const sequences = entries.map((entry) => entry.event_sequence);
|
|
207
|
+
const sequenceValues = sequences.filter((value) => typeof value === "number" && Number.isInteger(value) && value > 0);
|
|
208
|
+
const sequenceSet = new Set(sequenceValues);
|
|
209
|
+
const sequenceComplete = entries.length === 0
|
|
210
|
+
|| (sequenceValues.length === entries.length
|
|
211
|
+
&& sequenceSet.size === entries.length
|
|
212
|
+
&& Math.min(...sequenceValues) === 1
|
|
213
|
+
&& Math.max(...sequenceValues) === entries.length
|
|
214
|
+
&& entries.every((entry) => entry.loop_id === undefined || entry.loop_id === loopId));
|
|
215
|
+
return {
|
|
216
|
+
loopId,
|
|
217
|
+
verdict,
|
|
218
|
+
criteria: { declared, evidenced: [...evidenced].sort(), missing },
|
|
219
|
+
checks: { passed: [...passed].sort(), failed: [...failed].sort(), unavailable: [...unavailable].sort() },
|
|
220
|
+
unresolvedUserGates,
|
|
221
|
+
sequenceComplete,
|
|
222
|
+
evidenceRefs: [...evidenceRefs].sort(),
|
|
223
|
+
regressionObligations: [...obligations.values()].sort((a, b) => a.check.localeCompare(b.check)),
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=cognitive-governance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cognitive-governance.js","sourceRoot":"","sources":["../src/cognitive-governance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { CompilerRoundProjection, SubGoal } from "./protocol.js";
|
|
2
|
+
type Entry = Record<string, unknown>;
|
|
3
|
+
type EntryProjection = (entry: Entry) => CompilerRoundProjection | null;
|
|
4
|
+
/** Derive the complete SubGoal lifecycle from prior entries and this projection. */
|
|
5
|
+
export declare function manageSubGoals(loopId: string, currentRound: number, lastRoundResult: CompilerRoundProjection | null, vaultContext: Record<string, unknown> | null, project: EntryProjection): SubGoal[];
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=compiler-subgoals.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compiler-subgoals.d.ts","sourceRoot":"","sources":["../src/compiler-subgoals.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,uBAAuB,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAItE,KAAK,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACrC,KAAK,eAAe,GAAG,CAAC,KAAK,EAAE,KAAK,KAAK,uBAAuB,GAAG,IAAI,CAAC;AAoBxE,oFAAoF;AACpF,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,uBAAuB,GAAG,IAAI,EAC/C,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EAC5C,OAAO,EAAE,eAAe,GACvB,OAAO,EAAE,CAwDX"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { deriveSubGoalId } from "./derive-id.js";
|
|
2
|
+
import { getPolicy } from "./policy.js";
|
|
3
|
+
import { makeSubGoal } from "./protocol.js";
|
|
4
|
+
import { jaccardSimilarity, entryRound } from "./token-utils.js";
|
|
5
|
+
function lineage(entry) {
|
|
6
|
+
const value = entry.loop_lineage;
|
|
7
|
+
return value !== null && typeof value === "object" && !Array.isArray(value) ? value : {};
|
|
8
|
+
}
|
|
9
|
+
function matchSubGoal(target, subGoals, threshold) {
|
|
10
|
+
const trimmed = target.trim();
|
|
11
|
+
const exact = subGoals.findIndex((goal) => goal.id === trimmed);
|
|
12
|
+
if (exact >= 0)
|
|
13
|
+
return exact;
|
|
14
|
+
let bestIdx = -1;
|
|
15
|
+
let bestScore = 0;
|
|
16
|
+
for (let i = 0; i < subGoals.length; i++) {
|
|
17
|
+
const score = jaccardSimilarity(trimmed, subGoals[i].description);
|
|
18
|
+
if (score > bestScore) {
|
|
19
|
+
bestScore = score;
|
|
20
|
+
bestIdx = i;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return bestScore >= threshold ? bestIdx : -1;
|
|
24
|
+
}
|
|
25
|
+
/** Derive the complete SubGoal lifecycle from prior entries and this projection. */
|
|
26
|
+
export function manageSubGoals(loopId, currentRound, lastRoundResult, vaultContext, project) {
|
|
27
|
+
const policy = getPolicy().evolution;
|
|
28
|
+
const entries = vaultContext && Array.isArray(vaultContext.results)
|
|
29
|
+
? vaultContext.results.filter((value) => {
|
|
30
|
+
if (value === null || typeof value !== "object" || Array.isArray(value))
|
|
31
|
+
return false;
|
|
32
|
+
const entry = value;
|
|
33
|
+
return entry.loop_id === loopId || lineage(entry).loop_id === loopId;
|
|
34
|
+
})
|
|
35
|
+
: [];
|
|
36
|
+
const subGoals = [];
|
|
37
|
+
for (const entry of entries.filter((item) => entryRound(item) >= 1 && entryRound(item) < currentRound)) {
|
|
38
|
+
const descriptions = project(entry)?.discoveries?.emergedWork ?? [];
|
|
39
|
+
for (const description of descriptions) {
|
|
40
|
+
if (matchSubGoal(description, subGoals, policy.subgoal_dedup_threshold) >= 0)
|
|
41
|
+
continue;
|
|
42
|
+
const round = entryRound(entry);
|
|
43
|
+
subGoals.push(makeSubGoal({ id: deriveSubGoalId(description), description: description.trim(), status: "pending", declared_at_round: round, status_changed_at_round: round, priority: subGoals.length }));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if (lastRoundResult) {
|
|
47
|
+
const round = lastRoundResult.round || currentRound - 1;
|
|
48
|
+
for (const description of lastRoundResult.discoveries?.emergedWork ?? []) {
|
|
49
|
+
if (matchSubGoal(description, subGoals, policy.subgoal_dedup_threshold) >= 0)
|
|
50
|
+
continue;
|
|
51
|
+
subGoals.push(makeSubGoal({ id: deriveSubGoalId(description), description: description.trim(), status: "pending", declared_at_round: round, status_changed_at_round: round, priority: subGoals.length }));
|
|
52
|
+
}
|
|
53
|
+
const update = (items, status) => {
|
|
54
|
+
for (const description of items) {
|
|
55
|
+
const index = matchSubGoal(description, subGoals, policy.subgoal_match_threshold);
|
|
56
|
+
if (index < 0)
|
|
57
|
+
continue;
|
|
58
|
+
const goal = subGoals[index];
|
|
59
|
+
if (goal.status === "done" || goal.status === "canceled")
|
|
60
|
+
continue;
|
|
61
|
+
goal.status = status;
|
|
62
|
+
goal.status_changed_at_round = round;
|
|
63
|
+
if (status === "done")
|
|
64
|
+
goal.completed_at_round = round;
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
update(lastRoundResult.subGoalEvents?.completed ?? [], "done");
|
|
68
|
+
update(lastRoundResult.subGoalEvents?.blocked ?? [], "blocked");
|
|
69
|
+
update(lastRoundResult.subGoalEvents?.canceled ?? [], "canceled");
|
|
70
|
+
for (const goal of subGoals) {
|
|
71
|
+
if (goal.status !== "pending" && goal.status !== "in_progress")
|
|
72
|
+
continue;
|
|
73
|
+
if ((lastRoundResult.evidence?.criteriaMet ?? []).some((criterion) => jaccardSimilarity(criterion, goal.description) >= policy.subgoal_auto_complete_threshold)) {
|
|
74
|
+
goal.status = "done";
|
|
75
|
+
goal.status_changed_at_round = round;
|
|
76
|
+
goal.completed_at_round = round;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
const rank = (status) => ({ in_progress: 0, pending: 1, blocked: 2, done: 3, canceled: 4 }[status]);
|
|
81
|
+
subGoals.sort((a, b) => {
|
|
82
|
+
const byStatus = rank(a.status) - rank(b.status);
|
|
83
|
+
if (byStatus !== 0)
|
|
84
|
+
return byStatus;
|
|
85
|
+
if (a.status === "pending")
|
|
86
|
+
return (currentRound - a.declared_at_round) - (currentRound - b.declared_at_round);
|
|
87
|
+
if (a.status === "done")
|
|
88
|
+
return (b.completed_at_round ?? 0) - (a.completed_at_round ?? 0);
|
|
89
|
+
return a.declared_at_round - b.declared_at_round;
|
|
90
|
+
});
|
|
91
|
+
return subGoals;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=compiler-subgoals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compiler-subgoals.js","sourceRoot":"","sources":["../src/compiler-subgoals.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** Stable text normalization shared by every persisted cognitive ID. */
|
|
2
|
+
export declare function normalizeIdText(text: string): string;
|
|
3
|
+
/** Preserve the historical hash lengths by making the length explicit. */
|
|
4
|
+
export declare function deriveTextHash(text: string, length?: number): string;
|
|
5
|
+
export declare function deriveItemId(text: string): string;
|
|
6
|
+
export declare function deriveSubGoalId(text: string): string;
|
|
7
|
+
export declare function deriveConstraintId(text: string): string;
|
|
8
|
+
export declare function deriveCriterionId(text: string): string;
|
|
9
|
+
export declare function deriveGateId(text: string): string;
|
|
10
|
+
export declare function deriveTodoId(text: string): string;
|
|
11
|
+
export declare function isStableItemId(value: string): boolean;
|
|
12
|
+
//# sourceMappingURL=derive-id.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derive-id.d.ts","sourceRoot":"","sources":["../src/derive-id.ts"],"names":[],"mappings":"AAEA,wEAAwE;AACxE,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,0EAA0E;AAC1E,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,SAAK,GAAG,MAAM,CAEhE;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAErD"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
/** Stable text normalization shared by every persisted cognitive ID. */
|
|
3
|
+
export function normalizeIdText(text) {
|
|
4
|
+
return text.trim().replace(/\s+/g, " ").toLowerCase();
|
|
5
|
+
}
|
|
6
|
+
/** Preserve the historical hash lengths by making the length explicit. */
|
|
7
|
+
export function deriveTextHash(text, length = 12) {
|
|
8
|
+
return createHash("sha256").update(normalizeIdText(text)).digest("hex").slice(0, length);
|
|
9
|
+
}
|
|
10
|
+
export function deriveItemId(text) {
|
|
11
|
+
return deriveTextHash(text, 8);
|
|
12
|
+
}
|
|
13
|
+
export function deriveSubGoalId(text) {
|
|
14
|
+
return `sg-${deriveTextHash(text, 8)}`;
|
|
15
|
+
}
|
|
16
|
+
export function deriveConstraintId(text) {
|
|
17
|
+
return `c-${deriveTextHash(text, 8)}`;
|
|
18
|
+
}
|
|
19
|
+
export function deriveCriterionId(text) {
|
|
20
|
+
return `cr-${deriveTextHash(text, 8)}`;
|
|
21
|
+
}
|
|
22
|
+
export function deriveGateId(text) {
|
|
23
|
+
return `gate-${deriveTextHash(text, 12)}`;
|
|
24
|
+
}
|
|
25
|
+
export function deriveTodoId(text) {
|
|
26
|
+
return `todo-${deriveTextHash(text, 8)}`;
|
|
27
|
+
}
|
|
28
|
+
export function isStableItemId(value) {
|
|
29
|
+
return /^(?:c|cr|sg)-[a-f0-9]{8}$/i.test(value);
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=derive-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derive-id.js","sourceRoot":"","sources":["../src/derive-id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,wEAAwE;AACxE,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;AACxD,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,MAAM,GAAG,EAAE;IACtD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AAC3F,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,KAAK,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,OAAO,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,QAAQ,cAAc,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,QAAQ,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,OAAO,4BAA4B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAClD,CAAC"}
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
/** EvidenceProvider — Pluggable evidence capture interface (v1.18).
|
|
2
2
|
*
|
|
3
|
-
* Before this module, evidence capture was hardcoded to git via
|
|
4
|
-
* captureGitModifiedFiles() in two places (runtime.ts, session.ts).
|
|
5
3
|
* This module defines an abstract EvidenceProvider interface so
|
|
6
4
|
* additional evidence sources (test runners, linters, bundle analysis)
|
|
7
5
|
* can be added without touching the verification pipeline.
|
|
8
6
|
*
|
|
9
7
|
* Built-in provider: GitEvidenceProvider — git file state capture with
|
|
10
|
-
* parallel async execution
|
|
8
|
+
* parallel async execution.
|
|
11
9
|
*/
|
|
12
10
|
import type { CommandEvidencePolicy } from "./policy.js";
|
|
13
11
|
/** A snapshot of evidence captured by a single provider. */
|
|
@@ -21,6 +19,12 @@ export interface ProviderSnapshot {
|
|
|
21
19
|
files: string[];
|
|
22
20
|
/** Provider-specific structured data. */
|
|
23
21
|
data: Record<string, unknown>;
|
|
22
|
+
/**
|
|
23
|
+
* Explicitly declares that this provider can verify claims. Providers that
|
|
24
|
+
* only report observations must leave this unset; their snapshots are
|
|
25
|
+
* never promoted to runtime-verified evidence.
|
|
26
|
+
*/
|
|
27
|
+
claimCapable?: boolean;
|
|
24
28
|
}
|
|
25
29
|
/** Interface for evidence capture providers.
|
|
26
30
|
*
|
|
@@ -41,6 +45,11 @@ export interface EvidenceProvider {
|
|
|
41
45
|
* (e.g. git not installed, no test config found). */
|
|
42
46
|
capture(context?: EvidenceCaptureContext): EvidenceCaptureResult;
|
|
43
47
|
}
|
|
48
|
+
/** Raised when the synchronous collector is asked to run an async provider. */
|
|
49
|
+
export declare class AsyncEvidenceProviderError extends Error {
|
|
50
|
+
readonly code: "async_provider_requires_collect_async";
|
|
51
|
+
constructor(provider: string);
|
|
52
|
+
}
|
|
44
53
|
export interface EvidenceCollectOptions {
|
|
45
54
|
timeoutMs?: number;
|
|
46
55
|
loopId?: string;
|
|
@@ -54,7 +63,7 @@ export declare function unregisterEvidenceProvider(name: string): boolean;
|
|
|
54
63
|
*
|
|
55
64
|
* Usage:
|
|
56
65
|
* const collector = new EvidenceCollector([new GitEvidenceProvider()]);
|
|
57
|
-
* const snapshots = collector.
|
|
66
|
+
* const snapshots = await collector.collectAsync();
|
|
58
67
|
* // snapshots = [{ provider: "git", files: [...], data: {...} }]
|
|
59
68
|
*/
|
|
60
69
|
export declare class EvidenceCollector {
|
|
@@ -65,9 +74,13 @@ export declare class EvidenceCollector {
|
|
|
65
74
|
static fromProviderNames(providerNames: string[]): EvidenceCollector;
|
|
66
75
|
/** Build built-ins and explicitly configured command providers. */
|
|
67
76
|
static fromPolicy(): EvidenceCollector;
|
|
68
|
-
/** Run
|
|
69
|
-
*
|
|
70
|
-
*
|
|
77
|
+
/** Run synchronous providers and return their non-null snapshots.
|
|
78
|
+
*
|
|
79
|
+
* The built-in Git provider is asynchronous. Callers that may include
|
|
80
|
+
* asynchronous providers must use collectAsync(); silently treating an
|
|
81
|
+
* async provider as unavailable would turn a caller limitation into a
|
|
82
|
+
* misleading evidence result.
|
|
83
|
+
*/
|
|
71
84
|
collect(options?: EvidenceCollectOptions): ProviderSnapshot[];
|
|
72
85
|
/** Capture all providers concurrently with per-provider timeout isolation. */
|
|
73
86
|
collectAsync(options?: EvidenceCollectOptions): Promise<ProviderSnapshot[]>;
|
|
@@ -101,6 +114,9 @@ export interface GitFileState {
|
|
|
101
114
|
staged: string[];
|
|
102
115
|
/** Untracked files not yet known to git (git ls-files --others --exclude-standard). */
|
|
103
116
|
untracked: string[];
|
|
117
|
+
/** v2.13: HEAD commit hash for backtrack restore point.
|
|
118
|
+
* undefined when git is unavailable or not a repository. */
|
|
119
|
+
head?: string;
|
|
104
120
|
}
|
|
105
121
|
/** v2.0.1: Capture git file state using parallel async execFile.
|
|
106
122
|
*
|
|
@@ -115,28 +131,12 @@ export interface GitFileState {
|
|
|
115
131
|
* On a normal repo (~200ms/command): ~200ms vs ~600ms sequential.
|
|
116
132
|
* On Windows with antivirus (~4s/command): ~4s vs ~12s sequential. */
|
|
117
133
|
export declare function captureGitFileStateAsync(signal?: AbortSignal, timeoutMs?: number): Promise<GitFileState | null>;
|
|
118
|
-
/**
|
|
119
|
-
*
|
|
120
|
-
* @deprecated Use captureGitFileStateAsync() for the primary path.
|
|
121
|
-
* This sync fallback exists for legacy callers that cannot be made async
|
|
122
|
-
* (e.g. reconstructSession during startup). Uses execFileSync — shell-free,
|
|
123
|
-
* unlike the old execSync-based implementation. */
|
|
124
|
-
export declare function captureGitFileState(): GitFileState | null;
|
|
125
|
-
/** v1.16: Capture modified files as a flat sorted array.
|
|
126
|
-
* @deprecated v1.17 — Use captureGitFileState() for full coverage. */
|
|
127
|
-
export declare function captureGitModifiedFiles(): string[] | null;
|
|
128
|
-
/** Captures git file state (tracked, staged, untracked) via the async
|
|
129
|
-
* captureGitFileStateAsync() when a context is provided, falling back
|
|
130
|
-
* to the synchronous captureGitFileState() for legacy callers. */
|
|
134
|
+
/** Captures git file state (tracked, staged, untracked) via the async provider. */
|
|
131
135
|
export declare class GitEvidenceProvider implements EvidenceProvider {
|
|
132
136
|
readonly name = "git";
|
|
133
|
-
capture(context?: EvidenceCaptureContext):
|
|
137
|
+
capture(context?: EvidenceCaptureContext): Promise<ProviderSnapshot | null>;
|
|
134
138
|
}
|
|
135
|
-
/** Extract merged file list from
|
|
136
|
-
* with runtimeFilesChanged (string[] | null).
|
|
137
|
-
*
|
|
138
|
-
* Looks for the "git" provider first; falls back to merging all
|
|
139
|
-
* providers' files arrays (deduplicated). */
|
|
139
|
+
/** Extract the merged file list from provider snapshots for read-only views. */
|
|
140
140
|
export declare function extractFilesFromSnapshots(snapshots: ProviderSnapshot[]): string[] | null;
|
|
141
141
|
/** Return provider snapshots narrowed to evidence produced during this round.
|
|
142
142
|
* The full provider payload remains available in data, while files contains
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evidence-provider.d.ts","sourceRoot":"","sources":["../src/evidence-provider.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"evidence-provider.d.ts","sourceRoot":"","sources":["../src/evidence-provider.ts"],"names":[],"mappings":"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"}
|