@synaplink/orqlaude 0.9.6 → 0.10.1
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__/v0101.test.d.ts +1 -0
- package/dist/__tests__/v0101.test.js +133 -0
- package/dist/__tests__/v0101.test.js.map +1 -0
- package/dist/__tests__/v031.test.js +10 -6
- package/dist/__tests__/v031.test.js.map +1 -1
- 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/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/telegram/api.d.ts +14 -0
- package/dist/telegram/api.js +6 -0
- package/dist/telegram/api.js.map +1 -1
- package/dist/telegram/commands.d.ts +12 -14
- package/dist/telegram/commands.js +141 -82
- package/dist/telegram/commands.js.map +1 -1
- package/dist/telegram/notifier.d.ts +3 -3
- package/dist/telegram/notifier.js +79 -97
- package/dist/telegram/notifier.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/templates.d.ts +9 -0
- package/dist/tools/templates.js +99 -0
- package/dist/tools/templates.js.map +1 -0
- package/dist/tools/userio.js +122 -1
- package/dist/tools/userio.js.map +1 -1
- 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":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACtF,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAmC,MAAM,sBAAsB,CAAC;AAElF;;;;;;;GAOG;AAEH,KAAK,UAAU,OAAO,CAAC,KAAa;IAClC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,iBAAiB,KAAK,GAAG,CAAC,CAAC,CAAC;IACjF,OAAO,IAAI,CAAC;AACd,CAAC;AAED,6EAA6E;AAE7E,IAAI,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;IAC7D,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpC,MAAM,CAAC,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,CAAC,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,mCAAmC,EAAE,CAAC,CAAC;IACpG,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC;IAClE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC5B,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,mCAAmC,CAAC,CAAC;AAClE,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;IACpF,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC9C,MAAM,CAAC,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,CAAC,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IAChF,MAAM,CAAC,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAC,CAAC;IAC9F,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC,CAAC;IACzE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,kCAAkC,CAAC,CAAC;IAChE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,sBAAsB,CAAC,CAAC;AACrD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;IAChF,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC;IAC1C,MAAM,CAAC,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,CAAC,CAAC,QAAQ,CAAC;QACf,QAAQ,EAAE,OAAO;QACjB,GAAG,EAAE,YAAY;QACjB,KAAK,EAAE,wDAAwD;QAC/D,KAAK,EAAE,CAAC,mCAAmC,CAAC;KAC7C,CAAC,CAAC;IACH,MAAM,CAAC,CAAC,QAAQ,CAAC;QACf,QAAQ,EAAE,OAAO;QACjB,GAAG,EAAE,aAAa;QAClB,KAAK,EAAE,0CAA0C;QACjD,KAAK,EAAE,CAAC,kBAAkB,CAAC;KAC5B,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,0CAA0C,CAAC,EAAE,CAAC,CAAC;IACpF,0EAA0E;IAC1E,wEAAwE;IACxE,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,YAAY,CAAC,CAAC,CAAC;AACrD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;IAClE,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,CAAC;IAC3C,MAAM,CAAC,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,CAAC,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAC5E,MAAM,CAAC,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAChF,MAAM,CAAC,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAC5E,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC/B,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,sBAAsB,CAAC,CAAC;AACxD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;IACrF,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC5C,MAAM,CAAC,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,CAAC,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACpF,MAAM,CAAC,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;IACnF,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,mBAAmB,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9D,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IACrC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IACrC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;AACpD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;IAChE,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,CAAC;IAC3C,MAAM,CAAC,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IACzE,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAChC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACvB,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACjC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAChC,CAAC,CAAC,CAAC;AAEH,6EAA6E;AAE7E,IAAI,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;IAC5E,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC;IACrC,MAAM,CAAC,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAChE,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACjE,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;IAClC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AACtC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;IAC5D,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC;IAC1C,MAAM,CAAC,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACxE,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAChG,0DAA0D;IAC1D,IAAI,MAAM,GAAG,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;IAChC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IACjC,mCAAmC;IACnC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE;QACzB,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC;IACpB,CAAC,CAAC,CAAC;IACH,MAAM,GAAG,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC5B,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,kBAAkB,CAAC,CAAC;AAClD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;IAC3E,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC9C,MAAM,CAAC,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,CAAC,yBAAyB;IACnE,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7E,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC/F,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;IAClC,gEAAgE;IAChE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;AAC9C,CAAC,CAAC,CAAC;AAEH,6EAA6E;AAE7E,IAAI,CAAC,0CAA0C,EAAE,GAAG,EAAE;IACpD,MAAM,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;AACxC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,qDAAqD,EAAE,GAAG,EAAE;IAC/D,KAAK,MAAM,CAAC,IAAI,eAAe,EAAE,CAAC;QAChC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,IAAI,CAAC,EAAE,YAAY,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;IACvE,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gDAAgD,EAAE,GAAG,EAAE;IAC1D,MAAM,OAAO,GAAG,gBAAgB,CAAC,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC1D,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;IAC/B,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;AAChD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,wDAAwD,EAAE,GAAG,EAAE;IAClE,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,gBAAgB,CAAC,EAAE,SAAS,CAAC,CAAC;AAC1D,CAAC,CAAC,CAAC;AAEH,6EAA6E;AAE7E,IAAI,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;IACvE,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,CAAC;IACxC,MAAM,CAAC,GAAG,IAAI,cAAc,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACpF,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;IAClD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACzC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC;IAChC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AACpC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;IACnE,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAC5C,MAAM,CAAC,GAAG,IAAI,cAAc,CAAC,GAAG,CAAC,CAAC;IAClC,oBAAoB;IACpB,MAAM,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IAC9E,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;IAClD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAClC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;IAChE,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC7C,MAAM,CAAC,GAAG,IAAI,cAAc,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,UAAU;IAC1D,MAAM,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAC7E,MAAM,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9E,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,YAAY,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC9D,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,oCAAoC,CAAC,CAAC;AACnE,CAAC,CAAC,CAAC;AAEH,6EAA6E;AAE7E,IAAI,CAAC,kEAAkE,EAAE,GAAG,EAAE;IAC5E,MAAM,CAAC,SAAS,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5D,MAAM,CAAC,SAAS,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;IAChE,MAAM,CAAC,SAAS,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;IAChE,MAAM,CAAC,SAAS,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;IAClE,MAAM,CAAC,SAAS,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;IACpE,MAAM,CAAC,SAAS,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;IAChE,MAAM,CAAC,SAAS,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;AACpE,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,8DAA8D,EAAE,GAAG,EAAE;IACxE,MAAM,GAAG,GAAG,iBAAiB,CAAC,8BAA8B,CAAC,CAAC;IAC9D,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;AACrF,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uDAAuD,EAAE,GAAG,EAAE;IACjE,4CAA4C;IAC5C,MAAM,CAAC,SAAS,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;AAC1E,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uDAAuD,EAAE,GAAG,EAAE;IACjE,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC;IAC/C,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;AAC5C,CAAC,CAAC,CAAC;AAEH,6EAA6E;AAE7E,SAAS,MAAM,CAAC,YAA6B,EAAE;IAC7C,OAAO;QACL,MAAM,EAAE,CAAC;QACT,GAAG,EAAE,+BAA+B;QACpC,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,GAAG;QACX,UAAU,EAAE,GAAG;QACf,UAAU,EAAE,GAAG;QACf,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,EAAE;QACb,YAAY,EAAE,CAAC;QACf,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;QAC9D,YAAY,EAAE,SAAS;QACvB,SAAS,EAAE,IAAI;QACf,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,YAAoC,EAAE;IACxD,OAAO;QACL,OAAO,EAAE,SAAS;QAClB,QAAQ,EAAE,EAAE;QACZ,WAAW,EAAE,EAAE;QACf,OAAO,EAAE,IAAI;QACb,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,IAAI,CAAC,oDAAoD,EAAE,GAAG,EAAE;IAC9D,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;IACpB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,CAAC,GAAG,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,sBAAsB,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACnH,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACzB,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AACvC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,+CAA+C,EAAE,GAAG,EAAE;IACzD,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;IACpB,MAAM,MAAM,GAAG,UAAU,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;IAChF,MAAM,CAAC,GAAG,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,sBAAsB,EAAE,IAAI,EAAE,CAAC,CAAC;IAClE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAC1B,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAC3E,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,0CAA0C,EAAE,GAAG,EAAE;IACpD,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC;IAC/C,MAAM,CAAC,GAAG,SAAS,CAAC,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;AAC5B,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iDAAiD,EAAE,GAAG,EAAE;IAC3D,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;IACvD,MAAM,CAAC,GAAG,SAAS,CAAC,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;AAC5B,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mEAAmE,EAAE,GAAG,EAAE;IAC7E,MAAM,EAAE,GAAG,MAAM,CAAC;QAChB,KAAK,EAAE;YACL,EAAE,IAAI,EAAE,sCAAsC,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE;YAC7E,EAAE,IAAI,EAAE,wBAAwB,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE;SAChE;KACF,CAAC,CAAC;IACH,MAAM,CAAC,GAAG,SAAS,CAAC,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC;IACnE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAC1B,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;AAC/D,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,wDAAwD,EAAE,GAAG,EAAE;IAClE,MAAM,EAAE,GAAG,MAAM,CAAC;QAChB,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;KACtE,CAAC,CAAC;IACH,MAAM,CAAC,GAAG,SAAS,CAAC,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;IAC5E,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAC1B,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;AACjE,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,8DAA8D,EAAE,GAAG,EAAE;IACxE,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IACxC,MAAM,CAAC,GAAG,SAAS,CAAC,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;IAC1C,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAC1B,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAC5E,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,133 @@
|
|
|
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 { StateStore } from "../lib/state.js";
|
|
7
|
+
import { escapeMd } from "../telegram/notifier.js";
|
|
8
|
+
/**
|
|
9
|
+
* v0.10.1 — Telegram plain-text + reply-to-message + blocking ask_user.
|
|
10
|
+
*
|
|
11
|
+
* The full blocking-poll lifecycle is tested in a separate integration test
|
|
12
|
+
* (requires running notifier + bot). These unit tests cover:
|
|
13
|
+
* • escapeMd is a no-op (we ship plain text now)
|
|
14
|
+
* • orphanResponseRequests is the right home for plan-less ask_user calls
|
|
15
|
+
* • reply-to-message routing logic: finding a request by telegramMessageId
|
|
16
|
+
*/
|
|
17
|
+
async function tempDir(label) {
|
|
18
|
+
return fs.mkdtemp(path.join(os.tmpdir(), `orqlaude-v0101-${label}-`));
|
|
19
|
+
}
|
|
20
|
+
test("v0.10.1: escapeMd is a no-op (plain text shipping)", () => {
|
|
21
|
+
assert.equal(escapeMd("*bold* _ital_ `code` [link]"), "*bold* _ital_ `code` [link]");
|
|
22
|
+
assert.equal(escapeMd("plain"), "plain");
|
|
23
|
+
assert.equal(escapeMd(""), "");
|
|
24
|
+
});
|
|
25
|
+
test("v0.10.1: ask_user creates an orphanResponseRequest when plan_id omitted", async () => {
|
|
26
|
+
const dir = await tempDir("orphan");
|
|
27
|
+
const store = new StateStore(dir);
|
|
28
|
+
const id = "ask-user-test-id-12345678";
|
|
29
|
+
await store.update((state) => {
|
|
30
|
+
state.orphanResponseRequests = state.orphanResponseRequests ?? [];
|
|
31
|
+
state.orphanResponseRequests.push({
|
|
32
|
+
id,
|
|
33
|
+
shortId: id.slice(0, 8),
|
|
34
|
+
prompt: "test",
|
|
35
|
+
createdAt: Date.now(),
|
|
36
|
+
timeoutAt: Date.now() + 60_000,
|
|
37
|
+
delivered: false,
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
const found = await store.read((s) => (s.orphanResponseRequests ?? []).find((r) => r.id === id));
|
|
41
|
+
assert.ok(found);
|
|
42
|
+
assert.equal(found.prompt, "test");
|
|
43
|
+
});
|
|
44
|
+
test("v0.10.1: reply-to-message routes by telegramMessageId + chatId tuple", async () => {
|
|
45
|
+
const dir = await tempDir("reply-to");
|
|
46
|
+
const store = new StateStore(dir);
|
|
47
|
+
// Two requests sent to two different chats, same message_id by coincidence
|
|
48
|
+
// (Telegram message_ids are per-chat, not global).
|
|
49
|
+
await store.update((state) => {
|
|
50
|
+
state.orphanResponseRequests = state.orphanResponseRequests ?? [];
|
|
51
|
+
state.orphanResponseRequests.push({
|
|
52
|
+
id: "req-a",
|
|
53
|
+
shortId: "req-a",
|
|
54
|
+
prompt: "A",
|
|
55
|
+
createdAt: Date.now(),
|
|
56
|
+
timeoutAt: Date.now() + 60_000,
|
|
57
|
+
delivered: true,
|
|
58
|
+
telegramMessageId: 42,
|
|
59
|
+
telegramChatId: 111,
|
|
60
|
+
});
|
|
61
|
+
state.orphanResponseRequests.push({
|
|
62
|
+
id: "req-b",
|
|
63
|
+
shortId: "req-b",
|
|
64
|
+
prompt: "B",
|
|
65
|
+
createdAt: Date.now(),
|
|
66
|
+
timeoutAt: Date.now() + 60_000,
|
|
67
|
+
delivered: true,
|
|
68
|
+
telegramMessageId: 42, // same message_id ...
|
|
69
|
+
telegramChatId: 222, // ... but different chat
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
// Mimic the routing logic in tryHandleReplyToQuestion: match BOTH msgId AND chatId.
|
|
73
|
+
const matchA = await store.read((s) => (s.orphanResponseRequests ?? []).find((r) => r.telegramMessageId === 42 && r.telegramChatId === 111));
|
|
74
|
+
const matchB = await store.read((s) => (s.orphanResponseRequests ?? []).find((r) => r.telegramMessageId === 42 && r.telegramChatId === 222));
|
|
75
|
+
assert.equal(matchA?.id, "req-a");
|
|
76
|
+
assert.equal(matchB?.id, "req-b");
|
|
77
|
+
});
|
|
78
|
+
test("v0.10.1: writing a response sets responded_at and persists", async () => {
|
|
79
|
+
const dir = await tempDir("response");
|
|
80
|
+
const store = new StateStore(dir);
|
|
81
|
+
const id = "ask-write-test";
|
|
82
|
+
await store.update((state) => {
|
|
83
|
+
state.orphanResponseRequests = state.orphanResponseRequests ?? [];
|
|
84
|
+
state.orphanResponseRequests.push({
|
|
85
|
+
id,
|
|
86
|
+
shortId: id.slice(0, 8),
|
|
87
|
+
prompt: "x",
|
|
88
|
+
createdAt: Date.now(),
|
|
89
|
+
timeoutAt: Date.now() + 60_000,
|
|
90
|
+
delivered: false,
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
await store.update((state) => {
|
|
94
|
+
const req = (state.orphanResponseRequests ?? []).find((r) => r.id === id);
|
|
95
|
+
if (req) {
|
|
96
|
+
req.response = "the answer";
|
|
97
|
+
req.respondedAt = Date.now();
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
const after = await store.read((s) => (s.orphanResponseRequests ?? []).find((r) => r.id === id));
|
|
101
|
+
assert.equal(after?.response, "the answer");
|
|
102
|
+
assert.ok(after?.respondedAt && after.respondedAt > 0);
|
|
103
|
+
});
|
|
104
|
+
test("v0.10.1: cancelled requests short-circuit before answering", async () => {
|
|
105
|
+
const dir = await tempDir("cancelled");
|
|
106
|
+
const store = new StateStore(dir);
|
|
107
|
+
const id = "ask-cancel-test";
|
|
108
|
+
await store.update((state) => {
|
|
109
|
+
state.orphanResponseRequests = state.orphanResponseRequests ?? [];
|
|
110
|
+
state.orphanResponseRequests.push({
|
|
111
|
+
id,
|
|
112
|
+
shortId: id.slice(0, 8),
|
|
113
|
+
prompt: "x",
|
|
114
|
+
createdAt: Date.now(),
|
|
115
|
+
timeoutAt: Date.now() + 60_000,
|
|
116
|
+
delivered: false,
|
|
117
|
+
cancelled: true,
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
// Mimic the ask_user poll loop's check.
|
|
121
|
+
const result = await store.read((state) => {
|
|
122
|
+
const req = (state.orphanResponseRequests ?? []).find((r) => r.id === id);
|
|
123
|
+
if (!req)
|
|
124
|
+
return null;
|
|
125
|
+
if (req.cancelled)
|
|
126
|
+
return { kind: "cancelled" };
|
|
127
|
+
if (req.response !== undefined)
|
|
128
|
+
return { kind: "answered", response: req.response };
|
|
129
|
+
return null;
|
|
130
|
+
});
|
|
131
|
+
assert.deepEqual(result, { kind: "cancelled" });
|
|
132
|
+
});
|
|
133
|
+
//# sourceMappingURL=v0101.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"v0101.test.js","sourceRoot":"","sources":["../../src/__tests__/v0101.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -103,13 +103,17 @@ test("v1→v2 migration synthesizes tasks/notes/messages/claims when missing (CO
|
|
|
103
103
|
assert.deepEqual(out.claims, []);
|
|
104
104
|
assert.equal(out.budgetCapTokens, 4 * 25_000);
|
|
105
105
|
});
|
|
106
|
-
test("escapeMd
|
|
107
|
-
|
|
108
|
-
|
|
106
|
+
test("escapeMd is a no-op in v0.10.1+ (we ship plain text now)", () => {
|
|
107
|
+
// v0.10.1 dropped Markdown from all Telegram sends — the parser was eating
|
|
108
|
+
// special chars (especially inside backticks, parens, and around hyphens)
|
|
109
|
+
// and silently failing the send. escapeMd remains exported as a no-op for
|
|
110
|
+
// back-compat with any third-party plugin that imports it.
|
|
111
|
+
assert.equal(escapeMd("feature/foo_bar"), "feature/foo_bar");
|
|
112
|
+
assert.equal(escapeMd("**bold**"), "**bold**");
|
|
109
113
|
assert.equal(escapeMd("plain text"), "plain text");
|
|
110
|
-
assert.equal(escapeMd("`code`"), "
|
|
111
|
-
assert.equal(escapeMd("[link]"), "
|
|
112
|
-
assert.equal(escapeMd("a_b*c`d[e"), "
|
|
114
|
+
assert.equal(escapeMd("`code`"), "`code`");
|
|
115
|
+
assert.equal(escapeMd("[link]"), "[link]");
|
|
116
|
+
assert.equal(escapeMd("a_b*c`d[e"), "a_b*c`d[e");
|
|
113
117
|
});
|
|
114
118
|
test("Telegram saveConfig writes with mode 0o600 atomically (BLOCKER from Phase 3)", async () => {
|
|
115
119
|
// We can't easily mock the HOME-rooted CONFIG_PATH inside the module, so
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"v031.test.js","sourceRoot":"","sources":["../../src/__tests__/v031.test.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"v031.test.js","sourceRoot":"","sources":["../../src/__tests__/v031.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 {};
|