@synaplink/orqlaude 0.9.5 → 0.10.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/dist/__tests__/v010.test.d.ts +1 -0
- package/dist/__tests__/v010.test.js +270 -0
- package/dist/__tests__/v010.test.js.map +1 -0
- package/dist/__tests__/v096.test.d.ts +1 -0
- package/dist/__tests__/v096.test.js +56 -0
- package/dist/__tests__/v096.test.js.map +1 -0
- package/dist/cli/autopilot.d.ts +11 -0
- package/dist/cli/autopilot.js +447 -0
- package/dist/cli/autopilot.js.map +1 -0
- package/dist/cli.js +12 -0
- package/dist/cli.js.map +1 -1
- package/dist/lib/auto_merge.d.ts +85 -0
- package/dist/lib/auto_merge.js +208 -0
- package/dist/lib/auto_merge.js.map +1 -0
- package/dist/lib/backlog.d.ts +78 -0
- package/dist/lib/backlog.js +133 -0
- package/dist/lib/backlog.js.map +1 -0
- package/dist/lib/guardrails.d.ts +72 -0
- package/dist/lib/guardrails.js +86 -0
- package/dist/lib/guardrails.js.map +1 -0
- package/dist/lib/memory.d.ts +111 -0
- package/dist/lib/memory.js +247 -0
- package/dist/lib/memory.js.map +1 -0
- package/dist/lib/orch_turn.d.ts +65 -0
- package/dist/lib/orch_turn.js +174 -0
- package/dist/lib/orch_turn.js.map +1 -0
- package/dist/lib/retry.d.ts +59 -0
- package/dist/lib/retry.js +149 -0
- package/dist/lib/retry.js.map +1 -0
- package/dist/lib/state.js +19 -5
- package/dist/lib/state.js.map +1 -1
- package/dist/lib/templates.d.ts +59 -0
- package/dist/lib/templates.js +136 -0
- package/dist/lib/templates.js.map +1 -0
- package/dist/lib/tg_classifier.d.ts +93 -0
- package/dist/lib/tg_classifier.js +99 -0
- package/dist/lib/tg_classifier.js.map +1 -0
- package/dist/lib/version.d.ts +1 -1
- package/dist/lib/version.js +1 -1
- package/dist/lib/version.js.map +1 -1
- package/dist/server.js +11 -0
- package/dist/server.js.map +1 -1
- package/dist/tools/backlog.d.ts +4 -0
- package/dist/tools/backlog.js +166 -0
- package/dist/tools/backlog.js.map +1 -0
- package/dist/tools/memory.d.ts +4 -0
- package/dist/tools/memory.js +115 -0
- package/dist/tools/memory.js.map +1 -0
- package/dist/tools/planning.js +4 -7
- package/dist/tools/planning.js.map +1 -1
- package/dist/tools/templates.d.ts +9 -0
- package/dist/tools/templates.js +99 -0
- package/dist/tools/templates.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
import { test } from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { promises as fs } from "node:fs";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import os from "node:os";
|
|
6
|
+
import { MemoryStore } from "../lib/memory.js";
|
|
7
|
+
import { BacklogStore } from "../lib/backlog.js";
|
|
8
|
+
import { GuardrailStore, DEFAULT_GUARDRAILS } from "../lib/guardrails.js";
|
|
9
|
+
import { FLEET_TEMPLATES, findTemplate, suggestTemplates } from "../lib/templates.js";
|
|
10
|
+
import { parseSlashCommand } from "../lib/tg_classifier.js";
|
|
11
|
+
import { applyRule } from "../lib/auto_merge.js";
|
|
12
|
+
/**
|
|
13
|
+
* v0.10.0 — autopilot daemon, memory, backlog, templates, guardrails.
|
|
14
|
+
*
|
|
15
|
+
* These tests cover the pure-logic surface: store IO, glob matching,
|
|
16
|
+
* priority math, rule application. The daemon's tick loop and the
|
|
17
|
+
* `claude -p` spawn paths are not unit-tested here because they require
|
|
18
|
+
* a working claude binary in the environment.
|
|
19
|
+
*/
|
|
20
|
+
async function tempDir(label) {
|
|
21
|
+
const base = await fs.mkdtemp(path.join(os.tmpdir(), `orqlaude-v010-${label}-`));
|
|
22
|
+
return base;
|
|
23
|
+
}
|
|
24
|
+
// ---- Memory --------------------------------------------------------------
|
|
25
|
+
test("v0.10.0: memory remember/recall round-trips", async () => {
|
|
26
|
+
const dir = await tempDir("memory");
|
|
27
|
+
const m = new MemoryStore(dir);
|
|
28
|
+
await m.remember({ category: "lore", key: "language", value: "Russian comments in CRM templates" });
|
|
29
|
+
const got = await m.recall({ category: "lore", key: "language" });
|
|
30
|
+
assert.equal(got.length, 1);
|
|
31
|
+
assert.equal(got[0].value, "Russian comments in CRM templates");
|
|
32
|
+
});
|
|
33
|
+
test("v0.10.0: memory supersedes older entries with same (category, key)", async () => {
|
|
34
|
+
const dir = await tempDir("memory-supersede");
|
|
35
|
+
const m = new MemoryStore(dir);
|
|
36
|
+
await m.remember({ category: "playbook", key: "test_runner", value: "pytest" });
|
|
37
|
+
await m.remember({ category: "playbook", key: "test_runner", value: "pytest -x --tb=short" });
|
|
38
|
+
const got = await m.recall({ category: "playbook", key: "test_runner" });
|
|
39
|
+
assert.equal(got.length, 1, "older entry should be superseded");
|
|
40
|
+
assert.equal(got[0].value, "pytest -x --tb=short");
|
|
41
|
+
});
|
|
42
|
+
test("v0.10.0: memory recall by scope glob picks overlapping entries", async () => {
|
|
43
|
+
const dir = await tempDir("memory-scope");
|
|
44
|
+
const m = new MemoryStore(dir);
|
|
45
|
+
await m.remember({
|
|
46
|
+
category: "atlas",
|
|
47
|
+
key: "kanban-dnd",
|
|
48
|
+
value: "Kanban dnd handlers in frontend/src/components/Kanban/",
|
|
49
|
+
scope: ["frontend/src/components/Kanban/**"],
|
|
50
|
+
});
|
|
51
|
+
await m.remember({
|
|
52
|
+
category: "atlas",
|
|
53
|
+
key: "deals-views",
|
|
54
|
+
value: "Deal endpoints in backend/deals/views.py",
|
|
55
|
+
scope: ["backend/deals/**"],
|
|
56
|
+
});
|
|
57
|
+
const got = await m.recall({ scope: ["frontend/src/components/Kanban/Board.tsx"] });
|
|
58
|
+
// Both entries match because globMatch is permissive in either direction.
|
|
59
|
+
// What we care about is that the kanban-specific one is in the results.
|
|
60
|
+
assert.ok(got.some((e) => e.key === "kanban-dnd"));
|
|
61
|
+
});
|
|
62
|
+
test("v0.10.0: pinned memory entries always come first", async () => {
|
|
63
|
+
const dir = await tempDir("memory-pinned");
|
|
64
|
+
const m = new MemoryStore(dir);
|
|
65
|
+
await m.remember({ category: "lore", key: "a", value: "older non-pinned" });
|
|
66
|
+
await m.remember({ category: "lore", key: "b", value: "pinned", pinned: true });
|
|
67
|
+
await m.remember({ category: "lore", key: "c", value: "newer non-pinned" });
|
|
68
|
+
const got = await m.recall({});
|
|
69
|
+
assert.equal(got[0].key, "b", "pinned must be first");
|
|
70
|
+
});
|
|
71
|
+
test("v0.10.0: composeContextBlock includes pinned + per-category entries", async () => {
|
|
72
|
+
const dir = await tempDir("memory-compose");
|
|
73
|
+
const m = new MemoryStore(dir);
|
|
74
|
+
await m.remember({ category: "lore", key: "name", value: "Matthew", pinned: true });
|
|
75
|
+
await m.remember({ category: "playbook", key: "i18n", value: "Russian comments" });
|
|
76
|
+
const block = await m.composeContextBlock({ maxChars: 1000 });
|
|
77
|
+
assert.ok(block.includes("Matthew"));
|
|
78
|
+
assert.ok(block.includes("Russian"));
|
|
79
|
+
assert.ok(block.toLowerCase().includes("pinned"));
|
|
80
|
+
});
|
|
81
|
+
test("v0.10.0: forget marks an entry as soft-deleted", async () => {
|
|
82
|
+
const dir = await tempDir("memory-forget");
|
|
83
|
+
const m = new MemoryStore(dir);
|
|
84
|
+
const e = await m.remember({ category: "ledger", key: "k", value: "v" });
|
|
85
|
+
const ok = await m.forget(e.id);
|
|
86
|
+
assert.equal(ok, true);
|
|
87
|
+
const after = await m.recall({});
|
|
88
|
+
assert.equal(after.length, 0);
|
|
89
|
+
});
|
|
90
|
+
// ---- Backlog -------------------------------------------------------------
|
|
91
|
+
test("v0.10.0: backlog enqueue + pickNext picks highest priority", async () => {
|
|
92
|
+
const dir = await tempDir("backlog");
|
|
93
|
+
const b = new BacklogStore(dir);
|
|
94
|
+
await b.enqueue({ title: "low", priority: 20, source: "user" });
|
|
95
|
+
await b.enqueue({ title: "high", priority: 80, source: "user" });
|
|
96
|
+
await b.enqueue({ title: "mid", priority: 50, source: "user" });
|
|
97
|
+
const picked = await b.pickNext();
|
|
98
|
+
assert.equal(picked?.title, "high");
|
|
99
|
+
});
|
|
100
|
+
test("v0.10.0: backlog respects dependency chain", async () => {
|
|
101
|
+
const dir = await tempDir("backlog-deps");
|
|
102
|
+
const b = new BacklogStore(dir);
|
|
103
|
+
const a = await b.enqueue({ title: "A", priority: 50, source: "user" });
|
|
104
|
+
await b.enqueue({ title: "B (depends on A)", priority: 90, source: "user", dependsOn: [a.id] });
|
|
105
|
+
// B is higher priority but depends on A, so A goes first.
|
|
106
|
+
let picked = await b.pickNext();
|
|
107
|
+
assert.equal(picked?.title, "A");
|
|
108
|
+
// Mark A done; now B is unblocked.
|
|
109
|
+
await b.update(a.id, (g) => {
|
|
110
|
+
g.status = "done";
|
|
111
|
+
});
|
|
112
|
+
picked = await b.pickNext();
|
|
113
|
+
assert.equal(picked?.title, "B (depends on A)");
|
|
114
|
+
});
|
|
115
|
+
test("v0.10.0: backlog deadline boost raises effective priority", async () => {
|
|
116
|
+
const dir = await tempDir("backlog-deadline");
|
|
117
|
+
const b = new BacklogStore(dir);
|
|
118
|
+
const tomorrow = Date.now() + 86_400_000; // 1 day out → ~+26 boost
|
|
119
|
+
await b.enqueue({ title: "no-deadline-high", priority: 60, source: "user" });
|
|
120
|
+
await b.enqueue({ title: "deadline-mid", priority: 50, deadlineAt: tomorrow, source: "user" });
|
|
121
|
+
const picked = await b.pickNext();
|
|
122
|
+
// deadline-mid effective priority should be 50 + ~26 = 76 > 60.
|
|
123
|
+
assert.equal(picked?.title, "deadline-mid");
|
|
124
|
+
});
|
|
125
|
+
// ---- Templates -----------------------------------------------------------
|
|
126
|
+
test("v0.10.0: fleet templates have unique ids", () => {
|
|
127
|
+
const ids = FLEET_TEMPLATES.map((t) => t.id);
|
|
128
|
+
const unique = new Set(ids);
|
|
129
|
+
assert.equal(unique.size, ids.length);
|
|
130
|
+
});
|
|
131
|
+
test("v0.10.0: every fleet template has at least one role", () => {
|
|
132
|
+
for (const t of FLEET_TEMPLATES) {
|
|
133
|
+
assert.ok(t.agentRoles.length >= 1, `template ${t.id} has no roles`);
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
test("v0.10.0: suggestTemplates ranks by tag overlap", () => {
|
|
137
|
+
const matches = suggestTemplates(["migration", "schema"]);
|
|
138
|
+
assert.ok(matches.length >= 1);
|
|
139
|
+
assert.equal(matches[0].id, "migration-only");
|
|
140
|
+
});
|
|
141
|
+
test("v0.10.0: findTemplate returns undefined for unknown id", () => {
|
|
142
|
+
assert.equal(findTemplate("does-not-exist"), undefined);
|
|
143
|
+
});
|
|
144
|
+
// ---- Guardrails ----------------------------------------------------------
|
|
145
|
+
test("v0.10.0: guardrails snapshot computes window+day pcts", async () => {
|
|
146
|
+
const dir = await tempDir("guardrails");
|
|
147
|
+
const g = new GuardrailStore(dir);
|
|
148
|
+
await g.record({ ts: Date.now(), billed: 500_000, cached: 1_000_000, source: "t" });
|
|
149
|
+
const snap = await g.snapshot(DEFAULT_GUARDRAILS);
|
|
150
|
+
assert.equal(snap.windowBilled, 500_000);
|
|
151
|
+
assert.ok(snap.windowPct < 0.1);
|
|
152
|
+
assert.equal(snap.level, "green");
|
|
153
|
+
});
|
|
154
|
+
test("v0.10.0: guardrails escalate to red at 95% window", async () => {
|
|
155
|
+
const dir = await tempDir("guardrails-red");
|
|
156
|
+
const g = new GuardrailStore(dir);
|
|
157
|
+
// 95% of 8M = 7.6M.
|
|
158
|
+
await g.record({ ts: Date.now(), billed: 7_600_000, cached: 0, source: "t" });
|
|
159
|
+
const snap = await g.snapshot(DEFAULT_GUARDRAILS);
|
|
160
|
+
assert.equal(snap.level, "red");
|
|
161
|
+
});
|
|
162
|
+
test("v0.10.0: guardrails trim events older than 48h", async () => {
|
|
163
|
+
const dir = await tempDir("guardrails-trim");
|
|
164
|
+
const g = new GuardrailStore(dir);
|
|
165
|
+
const oldTs = Date.now() - 50 * 60 * 60 * 1000; // 50h ago
|
|
166
|
+
await g.record({ ts: oldTs, billed: 999_999, cached: 0, source: "ancient" });
|
|
167
|
+
await g.record({ ts: Date.now(), billed: 100_000, cached: 0, source: "now" });
|
|
168
|
+
const win = await g.windowBilled(DEFAULT_GUARDRAILS.windowMs);
|
|
169
|
+
assert.equal(win, 100_000, "old event should have been trimmed");
|
|
170
|
+
});
|
|
171
|
+
// ---- Telegram classifier (parser only) -----------------------------------
|
|
172
|
+
test("v0.10.0: parseSlashCommand recognizes /now /queue /pause /resume", () => {
|
|
173
|
+
assert.deepEqual(parseSlashCommand("/now"), { cmd: "now" });
|
|
174
|
+
assert.deepEqual(parseSlashCommand("/queue"), { cmd: "queue" });
|
|
175
|
+
assert.deepEqual(parseSlashCommand("/pause"), { cmd: "pause" });
|
|
176
|
+
assert.deepEqual(parseSlashCommand("/resume"), { cmd: "resume" });
|
|
177
|
+
assert.deepEqual(parseSlashCommand("/morning"), { cmd: "morning" });
|
|
178
|
+
assert.deepEqual(parseSlashCommand("/pulse"), { cmd: "pulse" });
|
|
179
|
+
assert.deepEqual(parseSlashCommand("/budget"), { cmd: "budget" });
|
|
180
|
+
});
|
|
181
|
+
test("v0.10.0: parseSlashCommand /respond preserves shortId + text", () => {
|
|
182
|
+
const got = parseSlashCommand("/respond ab12cd34 yes, do it");
|
|
183
|
+
assert.deepEqual(got, { cmd: "respond", shortId: "ab12cd34", text: "yes, do it" });
|
|
184
|
+
});
|
|
185
|
+
test("v0.10.0: parseSlashCommand handles bot-mention suffix", () => {
|
|
186
|
+
// Telegram appends @botname in group chats.
|
|
187
|
+
assert.deepEqual(parseSlashCommand("/now@orqlaudebot"), { cmd: "now" });
|
|
188
|
+
});
|
|
189
|
+
test("v0.10.0: parseSlashCommand returns null for non-slash", () => {
|
|
190
|
+
assert.equal(parseSlashCommand("hello"), null);
|
|
191
|
+
assert.equal(parseSlashCommand(""), null);
|
|
192
|
+
});
|
|
193
|
+
// ---- Auto-merge rule engine ----------------------------------------------
|
|
194
|
+
function makePr(overrides = {}) {
|
|
195
|
+
return {
|
|
196
|
+
number: 1,
|
|
197
|
+
url: "https://github.com/x/y/pull/1",
|
|
198
|
+
state: "OPEN",
|
|
199
|
+
title: "t",
|
|
200
|
+
author: "a",
|
|
201
|
+
headBranch: "h",
|
|
202
|
+
baseBranch: "b",
|
|
203
|
+
additions: 100,
|
|
204
|
+
deletions: 50,
|
|
205
|
+
changedFiles: 5,
|
|
206
|
+
files: [{ path: "src/foo.ts", additions: 100, deletions: 50 }],
|
|
207
|
+
checksStatus: "success",
|
|
208
|
+
mergeable: true,
|
|
209
|
+
...overrides,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
function makeReview(overrides = {}) {
|
|
213
|
+
return {
|
|
214
|
+
verdict: "APPROVE",
|
|
215
|
+
blockers: [],
|
|
216
|
+
suggestions: [],
|
|
217
|
+
summary: "ok",
|
|
218
|
+
...overrides,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
test("v0.10.0: applyRule accepts a green PR with APPROVE", () => {
|
|
222
|
+
const pr = makePr();
|
|
223
|
+
const review = makeReview();
|
|
224
|
+
const d = applyRule(pr, review, { method: "squash", requireCi: true, requireReviewerApprove: true, maxLoc: 1500 });
|
|
225
|
+
assert.equal(d.ok, true);
|
|
226
|
+
assert.equal(d.violations.length, 0);
|
|
227
|
+
});
|
|
228
|
+
test("v0.10.0: applyRule rejects on BLOCKER verdict", () => {
|
|
229
|
+
const pr = makePr();
|
|
230
|
+
const review = makeReview({ verdict: "BLOCKER", blockers: ["data loss risk"] });
|
|
231
|
+
const d = applyRule(pr, review, { requireReviewerApprove: true });
|
|
232
|
+
assert.equal(d.ok, false);
|
|
233
|
+
assert.ok(d.violations.some((v) => v.toLowerCase().includes("blocker")));
|
|
234
|
+
});
|
|
235
|
+
test("v0.10.0: applyRule rejects on failing CI", () => {
|
|
236
|
+
const pr = makePr({ checksStatus: "failure" });
|
|
237
|
+
const d = applyRule(pr, makeReview(), { requireCi: true });
|
|
238
|
+
assert.equal(d.ok, false);
|
|
239
|
+
});
|
|
240
|
+
test("v0.10.0: applyRule rejects when maxLoc exceeded", () => {
|
|
241
|
+
const pr = makePr({ additions: 2000, deletions: 100 });
|
|
242
|
+
const d = applyRule(pr, makeReview(), { maxLoc: 1500 });
|
|
243
|
+
assert.equal(d.ok, false);
|
|
244
|
+
});
|
|
245
|
+
test("v0.10.0: applyRule blockOnMigrations stops migration-touching PRs", () => {
|
|
246
|
+
const pr = makePr({
|
|
247
|
+
files: [
|
|
248
|
+
{ path: "backend/deals/migrations/0042_foo.py", additions: 50, deletions: 0 },
|
|
249
|
+
{ path: "backend/deals/views.py", additions: 10, deletions: 0 },
|
|
250
|
+
],
|
|
251
|
+
});
|
|
252
|
+
const d = applyRule(pr, makeReview(), { blockOnMigrations: true });
|
|
253
|
+
assert.equal(d.ok, false);
|
|
254
|
+
assert.ok(d.violations.some((v) => v.includes("migration")));
|
|
255
|
+
});
|
|
256
|
+
test("v0.10.0: applyRule blockOnPaths rejects matching files", () => {
|
|
257
|
+
const pr = makePr({
|
|
258
|
+
files: [{ path: "backend/settings.py", additions: 10, deletions: 0 }],
|
|
259
|
+
});
|
|
260
|
+
const d = applyRule(pr, makeReview(), { blockOnPaths: ["**/settings.py"] });
|
|
261
|
+
assert.equal(d.ok, false);
|
|
262
|
+
assert.ok(d.violations.some((v) => v.includes("settings.py")));
|
|
263
|
+
});
|
|
264
|
+
test("v0.10.0: applyRule rejects conflicting (mergeable=false) PRs", () => {
|
|
265
|
+
const pr = makePr({ mergeable: false });
|
|
266
|
+
const d = applyRule(pr, makeReview(), {});
|
|
267
|
+
assert.equal(d.ok, false);
|
|
268
|
+
assert.ok(d.violations.some((v) => v.toLowerCase().includes("conflict")));
|
|
269
|
+
});
|
|
270
|
+
//# sourceMappingURL=v010.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"v010.test.js","sourceRoot":"","sources":["../../src/__tests__/v010.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { test } from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { newPlan } from "../lib/state.js";
|
|
4
|
+
/**
|
|
5
|
+
* v0.9.6 — agnet name assignment moved into newPlan().
|
|
6
|
+
*
|
|
7
|
+
* Before this, only `create_plan` ran the `pickAgnetName` loop. The
|
|
8
|
+
* `review_prs` tool also calls newPlan() to spawn a follow-up fleet
|
|
9
|
+
* against PRs from a completed plan, but had no naming loop — so review
|
|
10
|
+
* fleets shipped with `agnetName: undefined`, showing as bare "Agnet"
|
|
11
|
+
* in the CLI watch UI and Telegram notifications.
|
|
12
|
+
*
|
|
13
|
+
* Fix: newPlan() now assigns names itself, so every plan-creating path
|
|
14
|
+
* (create_plan, review_prs, and any future tool) gets named tasks
|
|
15
|
+
* automatically. These tests lock that in.
|
|
16
|
+
*/
|
|
17
|
+
test("v0.9.6: newPlan assigns agnetName to every task", () => {
|
|
18
|
+
const p = newPlan("root", 100_000, [
|
|
19
|
+
{ title: "a", prompt: "pa", tldr: "ta" },
|
|
20
|
+
{ title: "b", prompt: "pb", tldr: "tb" },
|
|
21
|
+
{ title: "c", prompt: "pc", tldr: "tc" },
|
|
22
|
+
]);
|
|
23
|
+
for (const t of p.tasks) {
|
|
24
|
+
assert.ok(typeof t.agnetName === "string" && t.agnetName.length > 0, `task ${t.id} missing agnetName`);
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
test("v0.9.6: agnet names are unique within a plan", () => {
|
|
28
|
+
const p = newPlan("root", 100_000, Array.from({ length: 8 }, (_, i) => ({
|
|
29
|
+
title: `t${i}`,
|
|
30
|
+
prompt: "p",
|
|
31
|
+
tldr: "t",
|
|
32
|
+
})));
|
|
33
|
+
const names = new Set(p.tasks.map((t) => t.agnetName));
|
|
34
|
+
assert.equal(names.size, p.tasks.length, `expected ${p.tasks.length} unique names, got ${names.size}: ${[...names].join(", ")}`);
|
|
35
|
+
});
|
|
36
|
+
test("v0.9.6: newPlan honors caller-provided agnetName", () => {
|
|
37
|
+
// Tests pre-populate agnetName for determinism. newPlan must not
|
|
38
|
+
// overwrite it.
|
|
39
|
+
const p = newPlan("root", 100_000, [
|
|
40
|
+
{ title: "t", prompt: "p", tldr: "tl", agnetName: "CustomPicked" },
|
|
41
|
+
]);
|
|
42
|
+
assert.equal(p.tasks[0].agnetName, "CustomPicked");
|
|
43
|
+
});
|
|
44
|
+
test("v0.9.6: agnet names are stable per task_id across calls (deterministic seeding)", () => {
|
|
45
|
+
// Same set of task inputs → potentially different ids → different names,
|
|
46
|
+
// but THE SAME plan's tasks always have stable names through their
|
|
47
|
+
// lifetime. The stability contract is: once newPlan returns, the names
|
|
48
|
+
// on those task objects don't change. (The cross-plan reproducibility
|
|
49
|
+
// happens at the pickAgnetName layer and is covered by its own tests.)
|
|
50
|
+
const p1 = newPlan("root", 100_000, [{ title: "t", prompt: "p", tldr: "tl" }]);
|
|
51
|
+
const original = p1.tasks[0].agnetName;
|
|
52
|
+
// Mutating any unrelated field shouldn't disturb agnetName.
|
|
53
|
+
p1.tasks[0].title = "renamed";
|
|
54
|
+
assert.equal(p1.tasks[0].agnetName, original);
|
|
55
|
+
});
|
|
56
|
+
//# sourceMappingURL=v096.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"v096.test.js","sourceRoot":"","sources":["../../src/__tests__/v096.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
interface AutopilotOpts {
|
|
2
|
+
/** Foreground vs daemonized. */
|
|
3
|
+
foreground?: boolean;
|
|
4
|
+
/** Verbose logging. */
|
|
5
|
+
verbose?: boolean;
|
|
6
|
+
/** Override tick interval (ms). */
|
|
7
|
+
tickMs?: number;
|
|
8
|
+
}
|
|
9
|
+
export declare function runAutopilot(opts?: AutopilotOpts): Promise<number>;
|
|
10
|
+
export declare function cmdAutopilot(args: string[]): Promise<number>;
|
|
11
|
+
export {};
|