@garygentry/system1-core 0.1.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/LICENSE +21 -0
- package/README.md +13 -0
- package/dist/config/consent.d.ts +11 -0
- package/dist/config/consent.d.ts.map +1 -0
- package/dist/config/consent.js +33 -0
- package/dist/config/consent.js.map +1 -0
- package/dist/config/load.d.ts +64 -0
- package/dist/config/load.d.ts.map +1 -0
- package/dist/config/load.js +216 -0
- package/dist/config/load.js.map +1 -0
- package/dist/config/session.d.ts +31 -0
- package/dist/config/session.d.ts.map +1 -0
- package/dist/config/session.js +36 -0
- package/dist/config/session.js.map +1 -0
- package/dist/config.d.ts +28 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +64 -0
- package/dist/config.js.map +1 -0
- package/dist/decide.d.ts +57 -0
- package/dist/decide.d.ts.map +1 -0
- package/dist/decide.js +87 -0
- package/dist/decide.js.map +1 -0
- package/dist/egress/exclude.d.ts +24 -0
- package/dist/egress/exclude.d.ts.map +1 -0
- package/dist/egress/exclude.js +60 -0
- package/dist/egress/exclude.js.map +1 -0
- package/dist/egress/scrub.d.ts +12 -0
- package/dist/egress/scrub.d.ts.map +1 -0
- package/dist/egress/scrub.js +84 -0
- package/dist/egress/scrub.js.map +1 -0
- package/dist/egress/size.d.ts +16 -0
- package/dist/egress/size.d.ts.map +1 -0
- package/dist/egress/size.js +25 -0
- package/dist/egress/size.js.map +1 -0
- package/dist/errors.d.ts +44 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +23 -0
- package/dist/errors.js.map +1 -0
- package/dist/fixtures/store.d.ts +34 -0
- package/dist/fixtures/store.d.ts.map +1 -0
- package/dist/fixtures/store.js +74 -0
- package/dist/fixtures/store.js.map +1 -0
- package/dist/index.d.ts +59 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/model/answers.d.ts +38 -0
- package/dist/model/answers.d.ts.map +1 -0
- package/dist/model/answers.js +48 -0
- package/dist/model/answers.js.map +1 -0
- package/dist/model/profiles.d.ts +39 -0
- package/dist/model/profiles.d.ts.map +1 -0
- package/dist/model/profiles.js +42 -0
- package/dist/model/profiles.js.map +1 -0
- package/dist/model/types.d.ts +107 -0
- package/dist/model/types.d.ts.map +1 -0
- package/dist/model/types.js +17 -0
- package/dist/model/types.js.map +1 -0
- package/dist/model/validate.d.ts +17 -0
- package/dist/model/validate.d.ts.map +1 -0
- package/dist/model/validate.js +151 -0
- package/dist/model/validate.js.map +1 -0
- package/dist/ping.d.ts +30 -0
- package/dist/ping.d.ts.map +1 -0
- package/dist/ping.js +50 -0
- package/dist/ping.js.map +1 -0
- package/dist/prepare.d.ts +39 -0
- package/dist/prepare.d.ts.map +1 -0
- package/dist/prepare.js +84 -0
- package/dist/prepare.js.map +1 -0
- package/dist/project/project.d.ts +64 -0
- package/dist/project/project.d.ts.map +1 -0
- package/dist/project/project.js +144 -0
- package/dist/project/project.js.map +1 -0
- package/dist/run/budget.d.ts +20 -0
- package/dist/run/budget.d.ts.map +1 -0
- package/dist/run/budget.js +31 -0
- package/dist/run/budget.js.map +1 -0
- package/dist/run/pool.d.ts +16 -0
- package/dist/run/pool.d.ts.map +1 -0
- package/dist/run/pool.js +35 -0
- package/dist/run/pool.js.map +1 -0
- package/dist/run/spend.d.ts +34 -0
- package/dist/run/spend.d.ts.map +1 -0
- package/dist/run/spend.js +55 -0
- package/dist/run/spend.js.map +1 -0
- package/dist/sources/read.d.ts +40 -0
- package/dist/sources/read.d.ts.map +1 -0
- package/dist/sources/read.js +294 -0
- package/dist/sources/read.js.map +1 -0
- package/dist/sources/types.d.ts +79 -0
- package/dist/sources/types.d.ts.map +1 -0
- package/dist/sources/types.js +2 -0
- package/dist/sources/types.js.map +1 -0
- package/dist/spec/expect.d.ts +39 -0
- package/dist/spec/expect.d.ts.map +1 -0
- package/dist/spec/expect.js +95 -0
- package/dist/spec/expect.js.map +1 -0
- package/dist/spec/spec.d.ts +90 -0
- package/dist/spec/spec.d.ts.map +1 -0
- package/dist/spec/spec.js +252 -0
- package/dist/spec/spec.js.map +1 -0
- package/dist/split/split.d.ts +33 -0
- package/dist/split/split.d.ts.map +1 -0
- package/dist/split/split.js +116 -0
- package/dist/split/split.js.map +1 -0
- package/dist/testdata/index.d.ts +5 -0
- package/dist/testdata/index.d.ts.map +1 -0
- package/dist/testdata/index.js +6 -0
- package/dist/testdata/index.js.map +1 -0
- package/dist/testkit/fake-model.d.ts +14 -0
- package/dist/testkit/fake-model.d.ts.map +1 -0
- package/dist/testkit/fake-model.js +57 -0
- package/dist/testkit/fake-model.js.map +1 -0
- package/dist/testkit/tmp.d.ts +6 -0
- package/dist/testkit/tmp.d.ts.map +1 -0
- package/dist/testkit/tmp.js +46 -0
- package/dist/testkit/tmp.js.map +1 -0
- package/dist/tools/ask.d.ts +32 -0
- package/dist/tools/ask.d.ts.map +1 -0
- package/dist/tools/ask.js +59 -0
- package/dist/tools/ask.js.map +1 -0
- package/dist/tools/context.d.ts +52 -0
- package/dist/tools/context.d.ts.map +1 -0
- package/dist/tools/context.js +130 -0
- package/dist/tools/context.js.map +1 -0
- package/dist/tools/doctor.d.ts +37 -0
- package/dist/tools/doctor.d.ts.map +1 -0
- package/dist/tools/doctor.js +203 -0
- package/dist/tools/doctor.js.map +1 -0
- package/dist/tools/many.d.ts +74 -0
- package/dist/tools/many.d.ts.map +1 -0
- package/dist/tools/many.js +141 -0
- package/dist/tools/many.js.map +1 -0
- package/dist/tools/schemas.d.ts +293 -0
- package/dist/tools/schemas.d.ts.map +1 -0
- package/dist/tools/schemas.js +112 -0
- package/dist/tools/schemas.js.map +1 -0
- package/dist/tools/spec-check.d.ts +48 -0
- package/dist/tools/spec-check.d.ts.map +1 -0
- package/dist/tools/spec-check.js +164 -0
- package/dist/tools/spec-check.js.map +1 -0
- package/dist/tools/usage.d.ts +11 -0
- package/dist/tools/usage.d.ts.map +1 -0
- package/dist/tools/usage.js +27 -0
- package/dist/tools/usage.js.map +1 -0
- package/dist/transport/openrouter.d.ts +38 -0
- package/dist/transport/openrouter.d.ts.map +1 -0
- package/dist/transport/openrouter.js +89 -0
- package/dist/transport/openrouter.js.map +1 -0
- package/dist/version.d.ts +4 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +5 -0
- package/dist/version.js.map +1 -0
- package/dist/wiring.d.ts +30 -0
- package/dist/wiring.d.ts.map +1 -0
- package/dist/wiring.js +31 -0
- package/dist/wiring.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
import { execFileSync } from "node:child_process";
|
|
2
|
+
import { existsSync, readFileSync, realpathSync, statSync } from "node:fs";
|
|
3
|
+
import { isAbsolute, relative, resolve } from "node:path";
|
|
4
|
+
import { glob } from "tinyglobby";
|
|
5
|
+
import { DecisionsError } from "../errors.js";
|
|
6
|
+
function resolvePath(cwd, path) {
|
|
7
|
+
const absolute = resolve(cwd, path);
|
|
8
|
+
let realAbsolute = absolute;
|
|
9
|
+
try {
|
|
10
|
+
realAbsolute = realpathSync(absolute);
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
// Missing files are reported by the caller.
|
|
14
|
+
}
|
|
15
|
+
const real = toRel(cwd, realAbsolute);
|
|
16
|
+
return {
|
|
17
|
+
absolute,
|
|
18
|
+
display: toRel(cwd, absolute),
|
|
19
|
+
real,
|
|
20
|
+
outside: isAbsolute(real) || real.startsWith(".."),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
const DEFAULT_MAX_FILE_BYTES = 2_000_000;
|
|
24
|
+
const GIT_TIMEOUT_MS = 10_000;
|
|
25
|
+
/** Never content: dependencies, git internals, and our own state (config, fixtures, ledger). */
|
|
26
|
+
const ALWAYS_IGNORED = ["**/node_modules/**", "**/.git/**", "**/.system1/**"];
|
|
27
|
+
export async function readSources(specs, options) {
|
|
28
|
+
const documents = [];
|
|
29
|
+
const skipped = [];
|
|
30
|
+
for (const spec of specs) {
|
|
31
|
+
const result = await readSource(spec, options);
|
|
32
|
+
documents.push(...result.documents);
|
|
33
|
+
skipped.push(...result.skipped);
|
|
34
|
+
}
|
|
35
|
+
return { documents, skipped };
|
|
36
|
+
}
|
|
37
|
+
async function readSource(spec, options) {
|
|
38
|
+
switch (spec.kind) {
|
|
39
|
+
case "text":
|
|
40
|
+
return { documents: [{ id: spec.id ?? "text", kind: "text", text: spec.text }], skipped: [] };
|
|
41
|
+
case "stdin":
|
|
42
|
+
return { documents: [{ id: "stdin", kind: "text", text: spec.text }], skipped: [] };
|
|
43
|
+
case "file":
|
|
44
|
+
return readFiles([spec.path], options, spec.range);
|
|
45
|
+
case "glob":
|
|
46
|
+
return readGlob(spec.patterns, options);
|
|
47
|
+
case "jsonl":
|
|
48
|
+
return readJsonl(spec.path, options);
|
|
49
|
+
case "diff":
|
|
50
|
+
return readDiff(spec, options);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Parse `path`, `path:12` or `path:12-40` (1-based, inclusive). A bare `:`
|
|
55
|
+
* suffix that isn't a line spec stays part of the path.
|
|
56
|
+
*/
|
|
57
|
+
export function parseFileRef(ref) {
|
|
58
|
+
const match = /^(.*?):(\d+)(?:-(\d+))?$/.exec(ref);
|
|
59
|
+
if (!match?.[1])
|
|
60
|
+
return { path: ref };
|
|
61
|
+
const start = Number(match[2]);
|
|
62
|
+
const end = match[3] === undefined ? start : Number(match[3]);
|
|
63
|
+
if (start < 1 || end < start) {
|
|
64
|
+
throw new DecisionsError("invalid-request", `Invalid line range in "${ref}" (use path:START-END, 1-based)`);
|
|
65
|
+
}
|
|
66
|
+
return { path: match[1], range: { start, end } };
|
|
67
|
+
}
|
|
68
|
+
function readFiles(paths, options, range) {
|
|
69
|
+
const documents = [];
|
|
70
|
+
const skipped = [];
|
|
71
|
+
const limit = options.maxFileBytes ?? DEFAULT_MAX_FILE_BYTES;
|
|
72
|
+
for (const path of paths) {
|
|
73
|
+
const { absolute, display: rel, real, outside } = resolvePath(options.cwd, path);
|
|
74
|
+
if (!existsSync(absolute) || !statSync(absolute).isFile()) {
|
|
75
|
+
throw new DecisionsError("source-error", `No such file: ${rel}`, { path: rel });
|
|
76
|
+
}
|
|
77
|
+
if (outside && !options.allowOutside) {
|
|
78
|
+
skipped.push({ path: rel, reason: "outside-repo", detail: real });
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
if (statSync(absolute).size > limit) {
|
|
82
|
+
skipped.push({ path: rel, reason: "too-large", detail: `> ${limit} bytes` });
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
const buffer = readFileSync(absolute);
|
|
86
|
+
if (buffer.subarray(0, 8000).includes(0)) {
|
|
87
|
+
skipped.push({ path: rel, reason: "binary" });
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
let text = buffer.toString("utf8");
|
|
91
|
+
let startLine = 1;
|
|
92
|
+
if (range) {
|
|
93
|
+
const lines = text.split("\n");
|
|
94
|
+
if (range.start > lines.length) {
|
|
95
|
+
throw new DecisionsError("source-error", `${rel} has ${lines.length} lines; range starts at ${range.start}`);
|
|
96
|
+
}
|
|
97
|
+
text = lines.slice(range.start - 1, range.end).join("\n");
|
|
98
|
+
startLine = range.start;
|
|
99
|
+
}
|
|
100
|
+
const id = range
|
|
101
|
+
? `${rel}:${range.start}-${Math.min(range.end, startLine + text.split("\n").length - 1)}`
|
|
102
|
+
: rel;
|
|
103
|
+
documents.push({
|
|
104
|
+
id,
|
|
105
|
+
kind: "file",
|
|
106
|
+
path: rel,
|
|
107
|
+
...(real !== rel ? { realPath: real } : {}),
|
|
108
|
+
text,
|
|
109
|
+
startLine,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
return { documents, skipped };
|
|
113
|
+
}
|
|
114
|
+
async function readGlob(patterns, options) {
|
|
115
|
+
const matches = await glob([...patterns], {
|
|
116
|
+
cwd: options.cwd,
|
|
117
|
+
ignore: ALWAYS_IGNORED,
|
|
118
|
+
dot: true,
|
|
119
|
+
onlyFiles: true,
|
|
120
|
+
});
|
|
121
|
+
matches.sort();
|
|
122
|
+
const ignored = new Set(gitIgnored(options.cwd, matches));
|
|
123
|
+
const kept = matches.filter((m) => !ignored.has(m));
|
|
124
|
+
const result = readFiles(kept, options);
|
|
125
|
+
return {
|
|
126
|
+
documents: result.documents,
|
|
127
|
+
skipped: [
|
|
128
|
+
...[...ignored].map((path) => ({ path, reason: "gitignored" })),
|
|
129
|
+
...result.skipped,
|
|
130
|
+
],
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* The subset of `paths` git would ignore, when `cwd` is inside a work tree.
|
|
135
|
+
* Outside one, nothing is filtered (and `node_modules`/`.git` are still skipped).
|
|
136
|
+
*/
|
|
137
|
+
export function gitIgnored(cwd, paths) {
|
|
138
|
+
if (paths.length === 0 || !insideGitWorkTree(cwd))
|
|
139
|
+
return [];
|
|
140
|
+
try {
|
|
141
|
+
const out = execFileSync("git", ["-C", cwd, "check-ignore", "-z", "--stdin"], {
|
|
142
|
+
input: paths.join("\0"),
|
|
143
|
+
encoding: "utf8",
|
|
144
|
+
stdio: ["pipe", "pipe", "ignore"],
|
|
145
|
+
// Bounded: a git that never answers must not hang the run. Some
|
|
146
|
+
// sandboxes make a piped child hang indefinitely.
|
|
147
|
+
timeout: GIT_TIMEOUT_MS,
|
|
148
|
+
killSignal: "SIGKILL",
|
|
149
|
+
});
|
|
150
|
+
return out.split("\0").filter(Boolean);
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
// Exit 1 means "none ignored", which is not an error.
|
|
154
|
+
if (error.status === 1)
|
|
155
|
+
return [];
|
|
156
|
+
if (error.signal === "SIGKILL") {
|
|
157
|
+
throw new DecisionsError("source-error", `git check-ignore did not answer within ${GIT_TIMEOUT_MS} ms. Name the files with --file, or run where git works.`);
|
|
158
|
+
}
|
|
159
|
+
throw new DecisionsError("source-error", `git check-ignore failed: ${String(error)}`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
function insideGitWorkTree(cwd) {
|
|
163
|
+
try {
|
|
164
|
+
return (execFileSync("git", ["-C", cwd, "rev-parse", "--is-inside-work-tree"], {
|
|
165
|
+
encoding: "utf8",
|
|
166
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
167
|
+
}).trim() === "true");
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
function readJsonl(path, options) {
|
|
174
|
+
const { absolute, display: rel, real, outside } = resolvePath(options.cwd, path);
|
|
175
|
+
if (!existsSync(absolute))
|
|
176
|
+
throw new DecisionsError("source-error", `No such file: ${rel}`, { path: rel });
|
|
177
|
+
if (outside && !options.allowOutside) {
|
|
178
|
+
return { documents: [], skipped: [{ path: rel, reason: "outside-repo", detail: real }] };
|
|
179
|
+
}
|
|
180
|
+
const documents = [];
|
|
181
|
+
readFileSync(absolute, "utf8")
|
|
182
|
+
.split("\n")
|
|
183
|
+
.forEach((line, index) => {
|
|
184
|
+
if (line.trim() === "")
|
|
185
|
+
return;
|
|
186
|
+
let data;
|
|
187
|
+
try {
|
|
188
|
+
data = JSON.parse(line);
|
|
189
|
+
}
|
|
190
|
+
catch {
|
|
191
|
+
throw new DecisionsError("source-error", `${rel}:${index + 1} is not valid JSON`, {
|
|
192
|
+
path: rel,
|
|
193
|
+
line: index + 1,
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
documents.push({
|
|
197
|
+
id: `${rel}:row${index + 1}`,
|
|
198
|
+
kind: "row",
|
|
199
|
+
path: rel,
|
|
200
|
+
...(real !== rel ? { realPath: real } : {}),
|
|
201
|
+
data,
|
|
202
|
+
startLine: index + 1,
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
return { documents, skipped: [] };
|
|
206
|
+
}
|
|
207
|
+
/** One document per file in the diff, text starting at its `diff --git` header. */
|
|
208
|
+
function readDiff(spec, options) {
|
|
209
|
+
if (spec.range?.startsWith("-")) {
|
|
210
|
+
throw new DecisionsError("invalid-request", `Invalid diff range "${spec.range}"`);
|
|
211
|
+
}
|
|
212
|
+
const args = ["-C", options.cwd, "diff", "--no-color", "--no-ext-diff", "--unified=3"];
|
|
213
|
+
if (spec.staged)
|
|
214
|
+
args.push("--cached");
|
|
215
|
+
args.push(spec.range ?? "HEAD", "--", ...(spec.paths ?? []));
|
|
216
|
+
let out;
|
|
217
|
+
try {
|
|
218
|
+
out = execFileSync("git", args, {
|
|
219
|
+
encoding: "utf8",
|
|
220
|
+
maxBuffer: 64 * 1024 * 1024,
|
|
221
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
catch (error) {
|
|
225
|
+
const stderr = String(error.stderr ?? error).trim();
|
|
226
|
+
throw new DecisionsError("source-error", `git diff failed: ${stderr}`);
|
|
227
|
+
}
|
|
228
|
+
return splitDiffByFile(out);
|
|
229
|
+
}
|
|
230
|
+
export function splitDiffByFile(diff) {
|
|
231
|
+
const sections = diff.split(/^(?=diff --git )/m).filter((s) => s.startsWith("diff --git "));
|
|
232
|
+
const documents = [];
|
|
233
|
+
const skipped = [];
|
|
234
|
+
for (const text of sections) {
|
|
235
|
+
const raw = /^\+\+\+ (?:b\/)?(.+)$/m.exec(text)?.[1] ?? /^diff --git a\/.+ b\/(.+)$/m.exec(text)?.[1];
|
|
236
|
+
// Git quotes the whole side, including its `b/` prefix: "b/secrets/é.txt".
|
|
237
|
+
const decoded = raw === undefined ? undefined : unquoteGitPath(raw.trim());
|
|
238
|
+
const path = decoded?.replace(/^b\//, "");
|
|
239
|
+
if (path === undefined || path === "/dev/null") {
|
|
240
|
+
// Without a path, excludes cannot be applied, so it is never sent.
|
|
241
|
+
skipped.push({
|
|
242
|
+
path: raw?.trim() ?? "(unnamed)",
|
|
243
|
+
reason: "excluded",
|
|
244
|
+
detail: "unreadable diff path",
|
|
245
|
+
});
|
|
246
|
+
continue;
|
|
247
|
+
}
|
|
248
|
+
documents.push({ id: `${path}#diff`, kind: "diff", path, text: text.replace(/\n$/, "") });
|
|
249
|
+
}
|
|
250
|
+
return { documents, skipped };
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Git quotes paths with unusual bytes (`"secrets/\303\251.txt"`). Left quoted,
|
|
254
|
+
* the path never matches an exclude, so it is decoded here.
|
|
255
|
+
*/
|
|
256
|
+
export function unquoteGitPath(path) {
|
|
257
|
+
if (!path.startsWith('"'))
|
|
258
|
+
return path;
|
|
259
|
+
if (!path.endsWith('"') || path.length < 2)
|
|
260
|
+
return undefined;
|
|
261
|
+
const body = path.slice(1, -1);
|
|
262
|
+
const bytes = [];
|
|
263
|
+
for (let i = 0; i < body.length; i++) {
|
|
264
|
+
if (body[i] !== "\\") {
|
|
265
|
+
bytes.push(...Buffer.from(body[i], "utf8"));
|
|
266
|
+
continue;
|
|
267
|
+
}
|
|
268
|
+
const next = body[++i];
|
|
269
|
+
if (next === undefined)
|
|
270
|
+
return undefined;
|
|
271
|
+
const simple = { n: 10, t: 9, r: 13, '"': 34, "\\": 92 };
|
|
272
|
+
if (next in simple) {
|
|
273
|
+
bytes.push(simple[next]);
|
|
274
|
+
}
|
|
275
|
+
else if (/[0-7]/.test(next)) {
|
|
276
|
+
const octal = body.slice(i, i + 3);
|
|
277
|
+
if (!/^[0-7]{3}$/.test(octal))
|
|
278
|
+
return undefined;
|
|
279
|
+
bytes.push(Number.parseInt(octal, 8));
|
|
280
|
+
i += 2;
|
|
281
|
+
}
|
|
282
|
+
else {
|
|
283
|
+
return undefined;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
return Buffer.from(bytes).toString("utf8");
|
|
287
|
+
}
|
|
288
|
+
function toRel(cwd, absolute) {
|
|
289
|
+
const rel = relative(cwd, absolute);
|
|
290
|
+
return rel === "" || isAbsolute(rel) || rel.startsWith("..")
|
|
291
|
+
? absolute
|
|
292
|
+
: rel.split("\\").join("/");
|
|
293
|
+
}
|
|
294
|
+
//# sourceMappingURL=read.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.js","sourceRoot":"","sources":["../../src/sources/read.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type { State } from "../model/types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Where the content to judge comes from. The agent names a source and the
|
|
4
|
+
* engine reads it, so the agent never pastes content into a command (charter
|
|
5
|
+
* principle 1: state by reference, not by value).
|
|
6
|
+
*
|
|
7
|
+
* There is deliberately no `command` source (decision 0014): pipe command
|
|
8
|
+
* output into `stdin` instead.
|
|
9
|
+
*/
|
|
10
|
+
export type SourceSpec = {
|
|
11
|
+
kind: "text";
|
|
12
|
+
text: string;
|
|
13
|
+
id?: string;
|
|
14
|
+
}
|
|
15
|
+
/** Content the caller already read from stdin. */
|
|
16
|
+
| {
|
|
17
|
+
kind: "stdin";
|
|
18
|
+
text: string;
|
|
19
|
+
} | {
|
|
20
|
+
kind: "file";
|
|
21
|
+
path: string;
|
|
22
|
+
range?: LineRange;
|
|
23
|
+
} | {
|
|
24
|
+
kind: "glob";
|
|
25
|
+
patterns: string[];
|
|
26
|
+
} | {
|
|
27
|
+
kind: "jsonl";
|
|
28
|
+
path: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* `git diff`. With no `range`, working tree changes against `HEAD`; `staged`
|
|
32
|
+
* means the index against `HEAD`. `paths` limits the diff.
|
|
33
|
+
*/
|
|
34
|
+
| {
|
|
35
|
+
kind: "diff";
|
|
36
|
+
range?: string;
|
|
37
|
+
staged?: boolean;
|
|
38
|
+
paths?: string[];
|
|
39
|
+
};
|
|
40
|
+
/** 1-based and inclusive, as editors show them. */
|
|
41
|
+
export interface LineRange {
|
|
42
|
+
start: number;
|
|
43
|
+
end: number;
|
|
44
|
+
}
|
|
45
|
+
/** One unit of read content, before splitting. */
|
|
46
|
+
export interface Document {
|
|
47
|
+
id: string;
|
|
48
|
+
kind: "text" | "file" | "row" | "diff";
|
|
49
|
+
/** Repo-relative path, when the content came from a file. */
|
|
50
|
+
path?: string;
|
|
51
|
+
/**
|
|
52
|
+
* The path with symlinks resolved, when it differs from `path`. Excludes are
|
|
53
|
+
* matched against this, so `innocent.txt -> .env` is still withheld.
|
|
54
|
+
*/
|
|
55
|
+
realPath?: string;
|
|
56
|
+
/** Text content (every kind except structured JSONL rows). */
|
|
57
|
+
text?: string;
|
|
58
|
+
/** Parsed value of a JSONL row. */
|
|
59
|
+
data?: unknown;
|
|
60
|
+
/** Line number of the first line of `text` in its file (1-based). */
|
|
61
|
+
startLine?: number;
|
|
62
|
+
}
|
|
63
|
+
export interface Skipped {
|
|
64
|
+
path: string;
|
|
65
|
+
reason: "binary" | "too-large" | "gitignored" | "excluded" | "outside-repo";
|
|
66
|
+
/** For `excluded`: the pattern that matched. */
|
|
67
|
+
detail?: string;
|
|
68
|
+
}
|
|
69
|
+
/** One thing to send: a state, labelled with where it came from. */
|
|
70
|
+
export interface Item {
|
|
71
|
+
id: string;
|
|
72
|
+
state: State;
|
|
73
|
+
path?: string;
|
|
74
|
+
/** See `Document.realPath`. */
|
|
75
|
+
realPath?: string;
|
|
76
|
+
/** 1-based inclusive line span in `path`, when known. */
|
|
77
|
+
lines?: LineRange;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/sources/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAE9C;;;;;;;GAOG;AACH,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE;AAC7C,kDAAkD;GAChD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,SAAS,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AACjC;;;GAGG;GACD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAAA;AAExE,mDAAmD;AACnD,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,kDAAkD;AAClD,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAA;IACtC,6DAA6D;IAC7D,IAAI,CAAC,EAAE,MAAM,CAAA;IACb;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,8DAA8D;IAC9D,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,mCAAmC;IACnC,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,QAAQ,GAAG,WAAW,GAAG,YAAY,GAAG,UAAU,GAAG,cAAc,CAAA;IAC3E,gDAAgD;IAChD,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,oEAAoE;AACpE,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,KAAK,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,yDAAyD;IACzD,KAAK,CAAC,EAAE,SAAS,CAAA;CAClB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/sources/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { Answer, QuestionSet } from "../model/types.js";
|
|
2
|
+
import { type Filter } from "../project/project.js";
|
|
3
|
+
/**
|
|
4
|
+
* What an example expects of one question. Written in a spec's
|
|
5
|
+
* `examples[].expect`:
|
|
6
|
+
*
|
|
7
|
+
* noul: true | false compared at 0.5
|
|
8
|
+
* choice: <option key> compared with the winner
|
|
9
|
+
* score: <level> | [lo, hi] the weighted mean rounds to the level, or lies in the range
|
|
10
|
+
* any: ">=0.7", "in a,b" … the `--keep` shorthand, applied to this question
|
|
11
|
+
* any: undecided the answer should be too flat to act on
|
|
12
|
+
*/
|
|
13
|
+
export type Expectation = {
|
|
14
|
+
kind: "noul";
|
|
15
|
+
value: boolean;
|
|
16
|
+
} | {
|
|
17
|
+
kind: "choice";
|
|
18
|
+
value: string;
|
|
19
|
+
} | {
|
|
20
|
+
kind: "level";
|
|
21
|
+
value: number;
|
|
22
|
+
} | {
|
|
23
|
+
kind: "range";
|
|
24
|
+
lo: number;
|
|
25
|
+
hi: number;
|
|
26
|
+
} | {
|
|
27
|
+
kind: "filter";
|
|
28
|
+
filter: Filter;
|
|
29
|
+
text: string;
|
|
30
|
+
} | {
|
|
31
|
+
kind: "undecided";
|
|
32
|
+
};
|
|
33
|
+
/** Parse one example's `expect` map against its questions, collecting every problem. */
|
|
34
|
+
export declare function parseExpect(expect: Record<string, unknown>, questions: QuestionSet, where: string): Record<string, Expectation>;
|
|
35
|
+
/** Whether an answer meets an expectation. Undecided answers are handled by the caller. */
|
|
36
|
+
export declare function meets(name: string, answer: Answer, expectation: Expectation): boolean;
|
|
37
|
+
/** The expectation as written, for reports. */
|
|
38
|
+
export declare function describeExpectation(expectation: Expectation): string;
|
|
39
|
+
//# sourceMappingURL=expect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expect.d.ts","sourceRoot":"","sources":["../../src/spec/expect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAY,WAAW,EAAE,MAAM,mBAAmB,CAAA;AACtE,OAAO,EAAE,KAAK,MAAM,EAAwB,MAAM,uBAAuB,CAAA;AAEzE;;;;;;;;;GASG;AACH,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,CAAA;AAIzB,wFAAwF;AACxF,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,SAAS,EAAE,WAAW,EACtB,KAAK,EAAE,MAAM,GACZ,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAmB7B;AA4CD,2FAA2F;AAC3F,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,GAAG,OAAO,CAiBrF;AAED,+CAA+C;AAC/C,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM,CAWpE"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { DecisionsError } from "../errors.js";
|
|
2
|
+
import { matches, parseFilter } from "../project/project.js";
|
|
3
|
+
const OPERATOR = /^\s*(>=|<=|!=|>|<|=|in\s)/;
|
|
4
|
+
/** Parse one example's `expect` map against its questions, collecting every problem. */
|
|
5
|
+
export function parseExpect(expect, questions, where) {
|
|
6
|
+
const out = {};
|
|
7
|
+
const problems = [];
|
|
8
|
+
for (const [name, raw] of Object.entries(expect)) {
|
|
9
|
+
const question = questions[name];
|
|
10
|
+
if (!question) {
|
|
11
|
+
problems.push(`${where}: expects "${name}", which is not a question in this spec`);
|
|
12
|
+
continue;
|
|
13
|
+
}
|
|
14
|
+
try {
|
|
15
|
+
out[name] = parseOne(name, question, raw);
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
problems.push(`${where}: ${error.message}`);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
if (problems.length > 0) {
|
|
22
|
+
throw new DecisionsError("invalid-request", problems.join("\n"), { problems });
|
|
23
|
+
}
|
|
24
|
+
return out;
|
|
25
|
+
}
|
|
26
|
+
function parseOne(name, question, raw) {
|
|
27
|
+
if (raw === "undecided")
|
|
28
|
+
return { kind: "undecided" };
|
|
29
|
+
if (typeof raw === "string" && OPERATOR.test(raw)) {
|
|
30
|
+
return {
|
|
31
|
+
kind: "filter",
|
|
32
|
+
filter: parseFilter(`${name}${raw.startsWith("in") ? " " : ""}${raw}`, { [name]: question }),
|
|
33
|
+
text: raw.trim(),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
switch (question.type) {
|
|
37
|
+
case "noul":
|
|
38
|
+
if (typeof raw === "boolean")
|
|
39
|
+
return { kind: "noul", value: raw };
|
|
40
|
+
break;
|
|
41
|
+
case "choice":
|
|
42
|
+
if (typeof raw === "string") {
|
|
43
|
+
if (!(raw in question.criteria)) {
|
|
44
|
+
throw new Error(`expects "${name}" to be "${raw}", which is not one of its options (${Object.keys(question.criteria).join(", ")})`);
|
|
45
|
+
}
|
|
46
|
+
return { kind: "choice", value: raw };
|
|
47
|
+
}
|
|
48
|
+
break;
|
|
49
|
+
case "score": {
|
|
50
|
+
const top = question.criteria.length - 1;
|
|
51
|
+
if (Number.isInteger(raw) && raw >= 0 && raw <= top) {
|
|
52
|
+
return { kind: "level", value: raw };
|
|
53
|
+
}
|
|
54
|
+
if (Array.isArray(raw) && raw.length === 2) {
|
|
55
|
+
const [lo, hi] = raw;
|
|
56
|
+
if (typeof lo === "number" && typeof hi === "number" && lo <= hi) {
|
|
57
|
+
return { kind: "range", lo, hi };
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
throw new Error(`expects "${name}" to be a level 0–${top} or a [lo, hi] range`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
throw new Error(`expects "${name}" to be ${JSON.stringify(raw)}; a ${question.type} takes ${question.type === "noul" ? "true or false" : "an option key"}, "undecided", or a filter such as ">=0.7"`);
|
|
64
|
+
}
|
|
65
|
+
/** Whether an answer meets an expectation. Undecided answers are handled by the caller. */
|
|
66
|
+
export function meets(name, answer, expectation) {
|
|
67
|
+
switch (expectation.kind) {
|
|
68
|
+
case "undecided":
|
|
69
|
+
return false;
|
|
70
|
+
case "filter":
|
|
71
|
+
return matches({ [name]: answer }, expectation.filter);
|
|
72
|
+
case "noul":
|
|
73
|
+
return answer.type === "noul" && answer.noul >= 0.5 === expectation.value;
|
|
74
|
+
case "choice":
|
|
75
|
+
return answer.type === "choice" && answer.choice === expectation.value;
|
|
76
|
+
case "level":
|
|
77
|
+
return answer.type === "score" && Math.round(answer.score) === expectation.value;
|
|
78
|
+
case "range":
|
|
79
|
+
return (answer.type === "score" && answer.score >= expectation.lo && answer.score <= expectation.hi);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/** The expectation as written, for reports. */
|
|
83
|
+
export function describeExpectation(expectation) {
|
|
84
|
+
switch (expectation.kind) {
|
|
85
|
+
case "undecided":
|
|
86
|
+
return "undecided";
|
|
87
|
+
case "filter":
|
|
88
|
+
return expectation.text;
|
|
89
|
+
case "range":
|
|
90
|
+
return `[${expectation.lo}, ${expectation.hi}]`;
|
|
91
|
+
default:
|
|
92
|
+
return String(expectation.value);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=expect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expect.js","sourceRoot":"","sources":["../../src/spec/expect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { type Static, Type } from "typebox";
|
|
2
|
+
import type { QuestionSet } from "../model/types.js";
|
|
3
|
+
export declare const SPEC_FORMAT = 1;
|
|
4
|
+
export declare const SpecSchema: Type.TObject<{
|
|
5
|
+
/** Spec file format. Absent means 1; a newer one is refused, not guessed. */
|
|
6
|
+
version: Type.TOptional<Type.TInteger>;
|
|
7
|
+
description: Type.TString;
|
|
8
|
+
questions: Type.TRecord<"^.*$", Type.TUnknown>;
|
|
9
|
+
keep: Type.TOptional<Type.TArray<Type.TString>>;
|
|
10
|
+
sort: Type.TOptional<Type.TString>;
|
|
11
|
+
policy: Type.TOptional<Type.TObject<{
|
|
12
|
+
thresholds: Type.TOptional<Type.TRecord<"^.*$", Type.TObject<{
|
|
13
|
+
value: Type.TNumber;
|
|
14
|
+
why: Type.TString;
|
|
15
|
+
}>>>;
|
|
16
|
+
}>>;
|
|
17
|
+
source: Type.TOptional<Type.TObject<{
|
|
18
|
+
glob: Type.TOptional<Type.TArray<Type.TString>>;
|
|
19
|
+
file: Type.TOptional<Type.TString>;
|
|
20
|
+
jsonl: Type.TOptional<Type.TString>;
|
|
21
|
+
diff: Type.TOptional<Type.TString>;
|
|
22
|
+
split: Type.TOptional<Type.TString>;
|
|
23
|
+
}>>;
|
|
24
|
+
examples: Type.TOptional<Type.TArray<Type.TObject<{
|
|
25
|
+
id: Type.TString;
|
|
26
|
+
/** The text (or a JSON value, sent as its JSON text) to judge. Give this or `file`. */
|
|
27
|
+
state: Type.TOptional<Type.TUnknown>;
|
|
28
|
+
/** A repo file to judge, `path` or `path:START-END`. Give this or `state`. */
|
|
29
|
+
file: Type.TOptional<Type.TString>;
|
|
30
|
+
expect: Type.TOptional<Type.TRecord<"^.*$", Type.TUnknown>>;
|
|
31
|
+
}>>>;
|
|
32
|
+
provenance: Type.TOptional<Type.TRecord<"^.*$", Type.TUnknown>>;
|
|
33
|
+
/** Anything else a team wants to carry, ignored by the engine. */
|
|
34
|
+
meta: Type.TOptional<Type.TRecord<"^.*$", Type.TUnknown>>;
|
|
35
|
+
}>;
|
|
36
|
+
export type SpecFile = Static<typeof SpecSchema>;
|
|
37
|
+
export interface Spec extends Omit<SpecFile, "questions"> {
|
|
38
|
+
/** File stem; also the fixture namespace. */
|
|
39
|
+
name: string;
|
|
40
|
+
questions: QuestionSet;
|
|
41
|
+
/** Where it was loaded from. */
|
|
42
|
+
file: string;
|
|
43
|
+
/** Which lookup layer it came from. */
|
|
44
|
+
origin: "repo" | "user" | "bundled" | "path";
|
|
45
|
+
}
|
|
46
|
+
export interface SpecDirs {
|
|
47
|
+
repo: string;
|
|
48
|
+
user: string;
|
|
49
|
+
bundled?: string;
|
|
50
|
+
}
|
|
51
|
+
/** Parse and validate spec text. Collects every problem before failing. */
|
|
52
|
+
export declare function parseSpec(text: string, file: string, origin: Spec["origin"]): Spec;
|
|
53
|
+
/**
|
|
54
|
+
* Problems with a spec's examples. Checked by `spec validate` and `spec check`
|
|
55
|
+
* only, so a bad example never stops `ask` or `many` from using the spec.
|
|
56
|
+
* With `repoRoot`, each example `file` must also exist inside the repo.
|
|
57
|
+
*/
|
|
58
|
+
export declare function exampleProblems(spec: Spec, repoRoot?: string): string[];
|
|
59
|
+
/**
|
|
60
|
+
* Why an example's `file` can't be used, or undefined. Only files inside the
|
|
61
|
+
* repo: a committed spec must not be able to read (and send) anything else.
|
|
62
|
+
*/
|
|
63
|
+
export declare function exampleFileProblem(ref: string, repoRoot: string): string | undefined;
|
|
64
|
+
/** @throws DecisionsError `invalid-request` listing every example problem. */
|
|
65
|
+
export declare function assertExamples(spec: Spec, repoRoot?: string): void;
|
|
66
|
+
/**
|
|
67
|
+
* Parse a question set given on its own (`--questions`): YAML or JSON, in the
|
|
68
|
+
* same shape as a spec's `questions:`.
|
|
69
|
+
*/
|
|
70
|
+
export declare function parseQuestionSet(text: string, from: string): QuestionSet;
|
|
71
|
+
/** The default spec directories for a repo. */
|
|
72
|
+
export declare function specDirs(repoRoot: string, userConfigDir: string, bundled?: string): SpecDirs;
|
|
73
|
+
/**
|
|
74
|
+
* Resolve a spec by name (repo → user → bundled) or by path.
|
|
75
|
+
*
|
|
76
|
+
* @throws DecisionsError `invalid-request` when nothing matches, listing what exists.
|
|
77
|
+
*/
|
|
78
|
+
export declare function loadSpec(ref: string, dirs: SpecDirs, cwd: string): Spec;
|
|
79
|
+
export interface SpecListing {
|
|
80
|
+
name: string;
|
|
81
|
+
origin: Spec["origin"];
|
|
82
|
+
file: string;
|
|
83
|
+
description?: string;
|
|
84
|
+
/** Set when the file does not validate. */
|
|
85
|
+
error?: string;
|
|
86
|
+
/** A higher-priority layer defines the same name. */
|
|
87
|
+
shadowed?: boolean;
|
|
88
|
+
}
|
|
89
|
+
export declare function listSpecs(dirs: SpecDirs): SpecListing[];
|
|
90
|
+
//# sourceMappingURL=spec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec.d.ts","sourceRoot":"","sources":["../../src/spec/spec.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,SAAS,CAAA;AAI3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAcpD,eAAO,MAAM,WAAW,IAAI,CAAA;AAE5B,eAAO,MAAM,UAAU;IAEnB,6EAA6E;;;;;;;;;;;;;;;;;;;;;QAsBvE,uFAAuF;;QAEvF,8EAA8E;;;;;IAOpF,kEAAkE;;EAMrE,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,UAAU,CAAC,CAAA;AAEhD,MAAM,WAAW,IAAK,SAAQ,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC;IACvD,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,WAAW,CAAA;IACtB,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,uCAAuC;IACvC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAA;CAC7C;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAID,2EAA2E;AAC3E,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CA6ClF;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAuBvE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAOpF;AAED,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CASlE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAqBxE;AAMD,+CAA+C;AAC/C,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,QAAQ,CAM5F;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAkBvE;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;IACtB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,2CAA2C;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,qDAAqD;IACrD,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,QAAQ,GAAG,WAAW,EAAE,CAgCvD"}
|