@mneme-ai/core 2.21.8-lite → 2.22.0-lite
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/dist/agent_manifest.d.ts +1 -1
- package/dist/agent_manifest.d.ts.map +1 -1
- package/dist/agent_manifest.js +12 -1
- package/dist/agent_manifest.js.map +1 -1
- package/dist/companion/autospec.d.ts +58 -0
- package/dist/companion/autospec.d.ts.map +1 -0
- package/dist/companion/autospec.js +150 -0
- package/dist/companion/autospec.js.map +1 -0
- package/dist/companion/companion.test.d.ts +2 -0
- package/dist/companion/companion.test.d.ts.map +1 -0
- package/dist/companion/companion.test.js +215 -0
- package/dist/companion/companion.test.js.map +1 -0
- package/dist/companion/contract.d.ts +56 -0
- package/dist/companion/contract.d.ts.map +1 -0
- package/dist/companion/contract.js +209 -0
- package/dist/companion/contract.js.map +1 -0
- package/dist/companion/doppelganger.d.ts +84 -0
- package/dist/companion/doppelganger.d.ts.map +1 -0
- package/dist/companion/doppelganger.js +227 -0
- package/dist/companion/doppelganger.js.map +1 -0
- package/dist/companion/index.d.ts +67 -0
- package/dist/companion/index.d.ts.map +1 -0
- package/dist/companion/index.js +100 -0
- package/dist/companion/index.js.map +1 -0
- package/dist/companion/learn_loop.d.ts +55 -0
- package/dist/companion/learn_loop.d.ts.map +1 -0
- package/dist/companion/learn_loop.js +105 -0
- package/dist/companion/learn_loop.js.map +1 -0
- package/dist/companion/storyline.d.ts +40 -0
- package/dist/companion/storyline.d.ts.map +1 -0
- package/dist/companion/storyline.js +95 -0
- package/dist/companion/storyline.js.map +1 -0
- package/dist/conductor/conductor.test.d.ts +2 -0
- package/dist/conductor/conductor.test.d.ts.map +1 -0
- package/dist/conductor/conductor.test.js +182 -0
- package/dist/conductor/conductor.test.js.map +1 -0
- package/dist/conductor/index.d.ts +130 -0
- package/dist/conductor/index.d.ts.map +1 -0
- package/dist/conductor/index.js +273 -0
- package/dist/conductor/index.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.22.0 — COMPANION · STORYLINE.
|
|
3
|
+
*
|
|
4
|
+
* Markov chain over the pheromone log: given a recently-invoked
|
|
5
|
+
* verb, predict the top-K verbs that COMMONLY come next. AI agent
|
|
6
|
+
* uses this to plan multi-step flows.
|
|
7
|
+
*
|
|
8
|
+
* State definition: each verb invocation is one symbol. Transitions
|
|
9
|
+
* are derived from successive invocations within a session-equivalent
|
|
10
|
+
* window (default 5 minutes). Order-1 chain (one-step lookback) is
|
|
11
|
+
* the default; higher orders supported but require more data.
|
|
12
|
+
*
|
|
13
|
+
* Composes with Atlas `hot` (which counts standalone usage) — Atlas
|
|
14
|
+
* tells you what's used overall; Storyline tells you what's used
|
|
15
|
+
* AFTER what.
|
|
16
|
+
*/
|
|
17
|
+
import { listPheromones } from "../atlas/pheromone.js";
|
|
18
|
+
function pairwiseTransitions(hits, windowMs) {
|
|
19
|
+
const sorted = [...hits].sort((a, b) => a.ts.localeCompare(b.ts));
|
|
20
|
+
const out = new Map();
|
|
21
|
+
for (let i = 0; i < sorted.length - 1; i++) {
|
|
22
|
+
const t1 = Date.parse(sorted[i].ts);
|
|
23
|
+
const t2 = Date.parse(sorted[i + 1].ts);
|
|
24
|
+
if (Number.isNaN(t1) || Number.isNaN(t2))
|
|
25
|
+
continue;
|
|
26
|
+
if (t2 - t1 > windowMs)
|
|
27
|
+
continue;
|
|
28
|
+
const from = sorted[i].verb;
|
|
29
|
+
const to = sorted[i + 1].verb;
|
|
30
|
+
if (from === to)
|
|
31
|
+
continue; // no self-loops; they're noise
|
|
32
|
+
if (!out.has(from))
|
|
33
|
+
out.set(from, new Map());
|
|
34
|
+
const inner = out.get(from);
|
|
35
|
+
inner.set(to, (inner.get(to) ?? 0) + 1);
|
|
36
|
+
}
|
|
37
|
+
return out;
|
|
38
|
+
}
|
|
39
|
+
/** Predict the top-K verbs that commonly follow `verb` in pheromone
|
|
40
|
+
* history. Returns an empty list when the verb hasn't been seen
|
|
41
|
+
* often enough to build statistics. */
|
|
42
|
+
export function predictNext(repoRoot, verb, q = {}) {
|
|
43
|
+
const topK = q.topK ?? 5;
|
|
44
|
+
const windowMs = q.windowMs ?? 5 * 60 * 1000;
|
|
45
|
+
const trans = pairwiseTransitions(listPheromones(repoRoot), windowMs);
|
|
46
|
+
const outgoing = trans.get(verb);
|
|
47
|
+
if (!outgoing)
|
|
48
|
+
return [];
|
|
49
|
+
const total = Array.from(outgoing.values()).reduce((s, c) => s + c, 0);
|
|
50
|
+
return Array.from(outgoing.entries())
|
|
51
|
+
.map(([to, count]) => ({ from: verb, to, count, probability: count / total }))
|
|
52
|
+
.sort((a, b) => b.count - a.count)
|
|
53
|
+
.slice(0, topK);
|
|
54
|
+
}
|
|
55
|
+
/** Reverse: which verbs commonly LEAD to `verb`? */
|
|
56
|
+
export function predictPrior(repoRoot, verb, q = {}) {
|
|
57
|
+
const topK = q.topK ?? 5;
|
|
58
|
+
const windowMs = q.windowMs ?? 5 * 60 * 1000;
|
|
59
|
+
const trans = pairwiseTransitions(listPheromones(repoRoot), windowMs);
|
|
60
|
+
const incoming = new Map();
|
|
61
|
+
for (const [from, inner] of trans) {
|
|
62
|
+
const n = inner.get(verb) ?? 0;
|
|
63
|
+
if (n > 0)
|
|
64
|
+
incoming.set(from, n);
|
|
65
|
+
}
|
|
66
|
+
const total = Array.from(incoming.values()).reduce((s, c) => s + c, 0);
|
|
67
|
+
if (total === 0)
|
|
68
|
+
return [];
|
|
69
|
+
return Array.from(incoming.entries())
|
|
70
|
+
.map(([from, count]) => ({ from, to: verb, count, probability: count / total }))
|
|
71
|
+
.sort((a, b) => b.count - a.count)
|
|
72
|
+
.slice(0, topK);
|
|
73
|
+
}
|
|
74
|
+
export function formatStoryline(verb, next, prior) {
|
|
75
|
+
const lines = [`🧭 STORYLINE — ${verb}`, ""];
|
|
76
|
+
if (next.length > 0) {
|
|
77
|
+
lines.push(` Commonly followed by:`);
|
|
78
|
+
for (const t of next)
|
|
79
|
+
lines.push(` ${(t.probability * 100).toFixed(1).padStart(5)}% → ${t.to} (n=${t.count})`);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
lines.push(` Commonly followed by: (no data yet — opt-IN to telemetry.pheromone via Consent Fabric)`);
|
|
83
|
+
}
|
|
84
|
+
lines.push("");
|
|
85
|
+
if (prior.length > 0) {
|
|
86
|
+
lines.push(` Commonly preceded by:`);
|
|
87
|
+
for (const t of prior)
|
|
88
|
+
lines.push(` ${(t.probability * 100).toFixed(1).padStart(5)}% ← ${t.from} (n=${t.count})`);
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
lines.push(` Commonly preceded by: (no data yet)`);
|
|
92
|
+
}
|
|
93
|
+
return lines.join("\n");
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=storyline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storyline.js","sourceRoot":"","sources":["../../src/companion/storyline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conductor.test.d.ts","sourceRoot":"","sources":["../../src/conductor/conductor.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { describe, expect, it, beforeEach, afterEach } from "vitest";
|
|
2
|
+
import { mkdtempSync, rmSync, writeFileSync, readFileSync, mkdirSync, existsSync } from "node:fs";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { plan, preview, defaultGate, execute, listReceipts, verifyReceiptChain, formatPlan, formatPreview, formatReceipt, } from "./index.js";
|
|
6
|
+
describe("conductor (v2.22.0 TRANSACTIONAL VERB ENGINE)", () => {
|
|
7
|
+
let repo;
|
|
8
|
+
beforeEach(() => { repo = mkdtempSync(join(tmpdir(), "mneme-conductor-")); });
|
|
9
|
+
afterEach(() => { try {
|
|
10
|
+
rmSync(repo, { recursive: true, force: true });
|
|
11
|
+
}
|
|
12
|
+
catch { /* */ } });
|
|
13
|
+
// ─── PLAN ──────────────────────────────────────────────────────────
|
|
14
|
+
describe("plan (greedy router)", () => {
|
|
15
|
+
it("returns Plan with steps for a non-empty intent", () => {
|
|
16
|
+
const p = plan("verify trust");
|
|
17
|
+
expect(p.steps.length).toBeGreaterThan(0);
|
|
18
|
+
expect(p.intent).toBe("verify trust");
|
|
19
|
+
});
|
|
20
|
+
it("attaches a contract + argSchema to every step", () => {
|
|
21
|
+
const p = plan("detect vendor drift");
|
|
22
|
+
for (const step of p.steps) {
|
|
23
|
+
expect(step.contract).toBeDefined();
|
|
24
|
+
expect(step.argSchema).toBeDefined();
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
it("worstDefcon reflects the most-impactful step", () => {
|
|
28
|
+
const p = plan("verify trust");
|
|
29
|
+
expect([1, 2, 3, 4, 5]).toContain(p.worstDefcon);
|
|
30
|
+
});
|
|
31
|
+
it("allArgsValid reflects validation of provided args", () => {
|
|
32
|
+
const p = plan("verify-self trust");
|
|
33
|
+
// No args provided; verify-self --score's positional schema is empty,
|
|
34
|
+
// so validation often passes. Schema parsing yields options optional.
|
|
35
|
+
expect(typeof p.allArgsValid).toBe("boolean");
|
|
36
|
+
});
|
|
37
|
+
it("formatPlan renders plan id + steps", () => {
|
|
38
|
+
const out = formatPlan(plan("verify trust"));
|
|
39
|
+
expect(out).toContain("PLAN");
|
|
40
|
+
expect(out).toContain("DEFCON");
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
// ─── PREVIEW ───────────────────────────────────────────────────────
|
|
44
|
+
describe("preview (doppelganger aggregate)", () => {
|
|
45
|
+
it("runs each step through dryRun + aggregates effects", async () => {
|
|
46
|
+
mkdirSync(join(repo, ".mneme"), { recursive: true });
|
|
47
|
+
const p = plan("verify trust");
|
|
48
|
+
const sim = async (verb, args, shadow) => {
|
|
49
|
+
// Simulate a no-op verb
|
|
50
|
+
return { exit: 0, effects: [] };
|
|
51
|
+
};
|
|
52
|
+
const pv = await preview(repo, p, sim);
|
|
53
|
+
expect(pv.steps.length).toBe(p.steps.length);
|
|
54
|
+
expect(pv.combinedExit).toBe(0);
|
|
55
|
+
});
|
|
56
|
+
it("aggregates added/changed/removed across steps", async () => {
|
|
57
|
+
mkdirSync(join(repo, ".mneme"), { recursive: true });
|
|
58
|
+
const p = plan("verify trust");
|
|
59
|
+
let touched = 0;
|
|
60
|
+
const sim = async (verb, args, shadow) => {
|
|
61
|
+
touched++;
|
|
62
|
+
writeFileSync(join(shadow, `.mneme/sim_${touched}.json`), JSON.stringify({ verb }));
|
|
63
|
+
return { exit: 0 };
|
|
64
|
+
};
|
|
65
|
+
const pv = await preview(repo, p, sim);
|
|
66
|
+
expect(pv.combinedFileEffects.some((e) => e.kind === "added")).toBe(true);
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
// ─── GATE ──────────────────────────────────────────────────────────
|
|
70
|
+
describe("defaultGate", () => {
|
|
71
|
+
it("denies when args invalid", () => {
|
|
72
|
+
const p = plan("xx-not-real-intent");
|
|
73
|
+
if (p.steps.length === 0)
|
|
74
|
+
return; // skip if no candidates
|
|
75
|
+
// Force-invalid by mutating the validation result.
|
|
76
|
+
p.allArgsValid = false;
|
|
77
|
+
const d = defaultGate(p, { planId: p.id, steps: [], combinedFileEffects: [], combinedExit: 0, anyLeakage: false });
|
|
78
|
+
expect(d.approved).toBe(false);
|
|
79
|
+
expect(d.reason).toContain("argument");
|
|
80
|
+
});
|
|
81
|
+
it("denies on requireConfirm", () => {
|
|
82
|
+
const p = plan("verify trust");
|
|
83
|
+
const d = defaultGate(p, { planId: p.id, steps: [], combinedFileEffects: [], combinedExit: 0, anyLeakage: false }, { requireConfirm: true });
|
|
84
|
+
expect(d.approved).toBe(false);
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
// ─── EXECUTE ───────────────────────────────────────────────────────
|
|
88
|
+
describe("execute (atomic commit / rollback)", () => {
|
|
89
|
+
it("rejected gate → outcome=rejected; no fs changes", async () => {
|
|
90
|
+
mkdirSync(join(repo, ".mneme"), { recursive: true });
|
|
91
|
+
const p = plan("verify trust");
|
|
92
|
+
const pv = { planId: p.id, steps: [], combinedFileEffects: [], combinedExit: 0, anyLeakage: false };
|
|
93
|
+
const sim = async () => ({ exit: 0 });
|
|
94
|
+
const r = await execute(repo, p, pv, sim, { decision: { approved: false, by: "policy", ts: new Date().toISOString() } });
|
|
95
|
+
expect(r.outcome).toBe("rejected");
|
|
96
|
+
});
|
|
97
|
+
it("approved + all-success → outcome=committed; staged files applied", async () => {
|
|
98
|
+
mkdirSync(join(repo, ".mneme"), { recursive: true });
|
|
99
|
+
const p = plan("verify trust");
|
|
100
|
+
const pv = { planId: p.id, steps: [], combinedFileEffects: [], combinedExit: 0, anyLeakage: false };
|
|
101
|
+
const sim = async (verb, args, stage) => {
|
|
102
|
+
mkdirSync(join(stage, ".mneme"), { recursive: true });
|
|
103
|
+
writeFileSync(join(stage, ".mneme/committed.json"), JSON.stringify({ verb }));
|
|
104
|
+
return { exit: 0 };
|
|
105
|
+
};
|
|
106
|
+
const r = await execute(repo, p, pv, sim, { decision: { approved: true, by: "policy", ts: new Date().toISOString() } });
|
|
107
|
+
expect(r.outcome).toBe("committed");
|
|
108
|
+
// At least one step committed → file exists in repo.
|
|
109
|
+
expect(existsSync(join(repo, ".mneme/committed.json"))).toBe(true);
|
|
110
|
+
});
|
|
111
|
+
it("approved + failure mid-plan → outcome=rolled-back; staged files removed", async () => {
|
|
112
|
+
mkdirSync(join(repo, ".mneme"), { recursive: true });
|
|
113
|
+
const p = plan("verify trust");
|
|
114
|
+
if (p.steps.length < 2)
|
|
115
|
+
return; // need ≥2 steps for the mid-fail test
|
|
116
|
+
const pv = { planId: p.id, steps: [], combinedFileEffects: [], combinedExit: 0, anyLeakage: false };
|
|
117
|
+
let calls = 0;
|
|
118
|
+
const sim = async (verb, args, stage) => {
|
|
119
|
+
calls++;
|
|
120
|
+
if (calls === 1) {
|
|
121
|
+
mkdirSync(join(stage, ".mneme"), { recursive: true });
|
|
122
|
+
writeFileSync(join(stage, ".mneme/maybe.json"), "{}");
|
|
123
|
+
return { exit: 0 };
|
|
124
|
+
}
|
|
125
|
+
return { exit: 7 };
|
|
126
|
+
};
|
|
127
|
+
const r = await execute(repo, p, pv, sim, { decision: { approved: true, by: "policy", ts: new Date().toISOString() } });
|
|
128
|
+
expect(r.outcome).toBe("rolled-back");
|
|
129
|
+
expect(existsSync(join(repo, ".mneme/maybe.json"))).toBe(false);
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
// ─── RECEIPT LEDGER ────────────────────────────────────────────────
|
|
133
|
+
describe("receipts + chain verification", () => {
|
|
134
|
+
it("listReceipts returns committed + rolled-back + rejected entries", async () => {
|
|
135
|
+
mkdirSync(join(repo, ".mneme"), { recursive: true });
|
|
136
|
+
const p = plan("verify trust");
|
|
137
|
+
const pv = { planId: p.id, steps: [], combinedFileEffects: [], combinedExit: 0, anyLeakage: false };
|
|
138
|
+
await execute(repo, p, pv, async () => ({ exit: 0 }), { decision: { approved: false, by: "policy", ts: new Date().toISOString() } });
|
|
139
|
+
expect(listReceipts(repo).length).toBeGreaterThan(0);
|
|
140
|
+
});
|
|
141
|
+
it("verifyReceiptChain returns ok on clean ledger", async () => {
|
|
142
|
+
mkdirSync(join(repo, ".mneme"), { recursive: true });
|
|
143
|
+
const p = plan("verify trust");
|
|
144
|
+
const pv = { planId: p.id, steps: [], combinedFileEffects: [], combinedExit: 0, anyLeakage: false };
|
|
145
|
+
await execute(repo, p, pv, async () => ({ exit: 0 }), { decision: { approved: false, by: "policy", ts: new Date().toISOString() } });
|
|
146
|
+
expect(verifyReceiptChain(repo).ok).toBe(true);
|
|
147
|
+
});
|
|
148
|
+
it("verifyReceiptChain detects tampered signature", async () => {
|
|
149
|
+
mkdirSync(join(repo, ".mneme"), { recursive: true });
|
|
150
|
+
const p = plan("verify trust");
|
|
151
|
+
const pv = { planId: p.id, steps: [], combinedFileEffects: [], combinedExit: 0, anyLeakage: false };
|
|
152
|
+
await execute(repo, p, pv, async () => ({ exit: 0 }), { decision: { approved: false, by: "policy", ts: new Date().toISOString() } });
|
|
153
|
+
// Tamper the file.
|
|
154
|
+
const f = join(repo, ".mneme/conductor/receipts.jsonl");
|
|
155
|
+
const lines = readFileSync(f, "utf8").split("\n");
|
|
156
|
+
const j = JSON.parse(lines[0]);
|
|
157
|
+
j.outcome = "committed"; // lie
|
|
158
|
+
lines[0] = JSON.stringify(j);
|
|
159
|
+
writeFileSync(f, lines.join("\n"), "utf8");
|
|
160
|
+
const v = verifyReceiptChain(repo);
|
|
161
|
+
expect(v.ok).toBe(false);
|
|
162
|
+
});
|
|
163
|
+
it("formatReceipt renders the badge + outcome", async () => {
|
|
164
|
+
mkdirSync(join(repo, ".mneme"), { recursive: true });
|
|
165
|
+
const p = plan("verify trust");
|
|
166
|
+
const pv = { planId: p.id, steps: [], combinedFileEffects: [], combinedExit: 0, anyLeakage: false };
|
|
167
|
+
const r = await execute(repo, p, pv, async () => ({ exit: 0 }), { decision: { approved: false, by: "policy", ts: new Date().toISOString() } });
|
|
168
|
+
expect(formatReceipt(r)).toContain("EXECUTION RECEIPT");
|
|
169
|
+
expect(formatReceipt(r)).toContain("rejected");
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
// ─── END-TO-END FORMATTERS ─────────────────────────────────────────
|
|
173
|
+
it("formatPlan + formatPreview render coherent output", async () => {
|
|
174
|
+
mkdirSync(join(repo, ".mneme"), { recursive: true });
|
|
175
|
+
const p = plan("verify trust");
|
|
176
|
+
const sim = async () => ({ exit: 0 });
|
|
177
|
+
const pv = await preview(repo, p, sim);
|
|
178
|
+
expect(formatPlan(p)).toContain("Steps");
|
|
179
|
+
expect(formatPreview(pv)).toContain("PREVIEW");
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
//# sourceMappingURL=conductor.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conductor.test.js","sourceRoot":"","sources":["../../src/conductor/conductor.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.22.0 — CONDUCTOR · TRANSACTIONAL VERB ENGINE.
|
|
3
|
+
*
|
|
4
|
+
* CLI primitives are normally request/response: AI agent calls one
|
|
5
|
+
* verb, gets one result. Conductor wraps that into a TRANSACTION:
|
|
6
|
+
*
|
|
7
|
+
* PLAN — natural-language intent → ordered verb sequence
|
|
8
|
+
* (greedy planner over contracts + atlas intent router;
|
|
9
|
+
* SAT-based planner reserved for v2.23)
|
|
10
|
+
* PREVIEW — every step runs through the doppelganger; diff
|
|
11
|
+
* aggregated across the whole plan
|
|
12
|
+
* GATE — AI agent + user see the aggregated diff + DEFCON, can
|
|
13
|
+
* approve / decline ONCE for the whole plan
|
|
14
|
+
* EXECUTE — verbs run for real against a staged shadow; on first
|
|
15
|
+
* failure the staged changes are rolled back; on success
|
|
16
|
+
* they are committed atomically
|
|
17
|
+
* ATTEST — outcome compared to predicted diff; receipt + ZK-style
|
|
18
|
+
* proof placeholder logged to Consent Fabric ledger
|
|
19
|
+
*
|
|
20
|
+
* Limitations:
|
|
21
|
+
* - Greedy planner (no SAT) → can pick suboptimal verb sequence
|
|
22
|
+
* - Doppelganger leakage flag → user MUST verify when leakage ≠ none
|
|
23
|
+
* - ZK proofs are placeholders this version (sig-only HMAC receipt);
|
|
24
|
+
* full ZK shipped v2.24
|
|
25
|
+
*
|
|
26
|
+
* This is the chassis; v2.23-v2.24 ride on it.
|
|
27
|
+
*/
|
|
28
|
+
import { type VerbContract } from "../companion/contract.js";
|
|
29
|
+
import { type ArgSchema, type ProvidedArgs, type ValidateResult } from "../companion/autospec.js";
|
|
30
|
+
import { type DoppelgangerResult, type FileEffect } from "../companion/doppelganger.js";
|
|
31
|
+
export interface PlanStep {
|
|
32
|
+
verb: string;
|
|
33
|
+
contract: VerbContract;
|
|
34
|
+
argSchema: ArgSchema;
|
|
35
|
+
/** Caller-supplied args (or empty for plans that just route). */
|
|
36
|
+
args: ProvidedArgs;
|
|
37
|
+
/** Schema validation result. */
|
|
38
|
+
validation: ValidateResult;
|
|
39
|
+
/** Why this verb was picked — debug + audit. */
|
|
40
|
+
rationale: string;
|
|
41
|
+
}
|
|
42
|
+
export interface Plan {
|
|
43
|
+
v: 1;
|
|
44
|
+
id: string;
|
|
45
|
+
ts: string;
|
|
46
|
+
intent: string;
|
|
47
|
+
steps: PlanStep[];
|
|
48
|
+
/** Highest DEFCON tier across all steps (lower = scarier). */
|
|
49
|
+
worstDefcon: 1 | 2 | 3 | 4 | 5;
|
|
50
|
+
/** Validation summary — set to true only when every step's args validate. */
|
|
51
|
+
allArgsValid: boolean;
|
|
52
|
+
}
|
|
53
|
+
export interface PlanOptions {
|
|
54
|
+
/** Per-step args, keyed by verb. Optional. */
|
|
55
|
+
argsByVerb?: Record<string, ProvidedArgs>;
|
|
56
|
+
/** Max steps in the plan (greedy planner caps to avoid infinite loops). */
|
|
57
|
+
maxSteps?: number;
|
|
58
|
+
}
|
|
59
|
+
/** Greedy planner: route intent to verb candidates, attach contracts +
|
|
60
|
+
* schemas, validate args. v2.23 will swap this for a SAT-based
|
|
61
|
+
* planner that searches over verb compositions. */
|
|
62
|
+
export declare function plan(intent: string, opts?: PlanOptions): Plan;
|
|
63
|
+
export interface PreviewStep {
|
|
64
|
+
verb: string;
|
|
65
|
+
doppelganger: DoppelgangerResult;
|
|
66
|
+
}
|
|
67
|
+
export interface Preview {
|
|
68
|
+
planId: string;
|
|
69
|
+
steps: PreviewStep[];
|
|
70
|
+
/** Aggregate diff across all steps. */
|
|
71
|
+
combinedFileEffects: FileEffect[];
|
|
72
|
+
/** Exit code of the last step OR first non-zero. */
|
|
73
|
+
combinedExit: number;
|
|
74
|
+
/** Any step's leakage → preview is "approximate". */
|
|
75
|
+
anyLeakage: boolean;
|
|
76
|
+
}
|
|
77
|
+
export type VerbSimulator = (verb: string, args: ProvidedArgs, shadowRoot: string) => Promise<{
|
|
78
|
+
stdout?: string;
|
|
79
|
+
stderr?: string;
|
|
80
|
+
exit?: number;
|
|
81
|
+
effects?: FileEffect[];
|
|
82
|
+
}>;
|
|
83
|
+
/** Run each step through the doppelganger, aggregate file diffs. The
|
|
84
|
+
* caller supplies a simulator that knows how to enact a verb in a
|
|
85
|
+
* shadow path (the conductor itself is verb-agnostic). */
|
|
86
|
+
export declare function preview(repoRoot: string, plan: Plan, sim: VerbSimulator): Promise<Preview>;
|
|
87
|
+
export interface GateDecision {
|
|
88
|
+
approved: boolean;
|
|
89
|
+
reason?: string;
|
|
90
|
+
by: "ai-agent" | "user" | "policy";
|
|
91
|
+
ts: string;
|
|
92
|
+
}
|
|
93
|
+
/** Policy gate: default-deny on DEFCON ≤ 2 unless explicit approval;
|
|
94
|
+
* default-allow on DEFCON ≥ 4 if all args validate. Callers can
|
|
95
|
+
* override with explicit `requireConfirm`. */
|
|
96
|
+
export declare function defaultGate(plan: Plan, preview: Preview, opts?: {
|
|
97
|
+
requireConfirm?: boolean;
|
|
98
|
+
}): GateDecision;
|
|
99
|
+
export interface ExecutionReceipt {
|
|
100
|
+
v: 1;
|
|
101
|
+
id: string;
|
|
102
|
+
ts: string;
|
|
103
|
+
planId: string;
|
|
104
|
+
intent: string;
|
|
105
|
+
outcome: "committed" | "rolled-back" | "rejected";
|
|
106
|
+
worstDefcon: number;
|
|
107
|
+
steps: Array<{
|
|
108
|
+
verb: string;
|
|
109
|
+
exitCode: number;
|
|
110
|
+
effectsCount: number;
|
|
111
|
+
}>;
|
|
112
|
+
/** Placeholder for v2.24 ZK proof. */
|
|
113
|
+
contractProof: string;
|
|
114
|
+
sig: string;
|
|
115
|
+
}
|
|
116
|
+
export interface ExecuteOptions {
|
|
117
|
+
/** Decision from the gate; if not approved, conductor refuses + logs. */
|
|
118
|
+
decision: GateDecision;
|
|
119
|
+
}
|
|
120
|
+
export declare function execute(repoRoot: string, plan: Plan, preview: Preview, sim: VerbSimulator, opts: ExecuteOptions): Promise<ExecutionReceipt>;
|
|
121
|
+
export declare function listReceipts(repoRoot: string): ExecutionReceipt[];
|
|
122
|
+
export declare function verifyReceiptChain(repoRoot: string): {
|
|
123
|
+
ok: boolean;
|
|
124
|
+
brokenAt?: number;
|
|
125
|
+
reason?: string;
|
|
126
|
+
};
|
|
127
|
+
export declare function formatPlan(p: Plan): string;
|
|
128
|
+
export declare function formatPreview(pv: Preview): string;
|
|
129
|
+
export declare function formatReceipt(r: ExecutionReceipt): string;
|
|
130
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/conductor/index.ts"],"names":[],"mappings":"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"}
|