human-to-code 0.0.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Readme.md +368 -38
- package/SECURITY.md +175 -11
- package/dist/adapters/general.d.ts +30 -0
- package/dist/adapters/general.d.ts.map +1 -0
- package/dist/adapters/general.js +77 -0
- package/dist/adapters/general.js.map +1 -0
- package/dist/adapters/node.d.ts +8 -0
- package/dist/adapters/node.d.ts.map +1 -0
- package/dist/adapters/node.js +1071 -0
- package/dist/adapters/node.js.map +1 -0
- package/dist/adapters/python.d.ts +7 -0
- package/dist/adapters/python.d.ts.map +1 -0
- package/dist/adapters/python.js +540 -0
- package/dist/adapters/python.js.map +1 -0
- package/dist/adapters/rust.d.ts +7 -0
- package/dist/adapters/rust.d.ts.map +1 -0
- package/dist/adapters/rust.js +517 -0
- package/dist/adapters/rust.js.map +1 -0
- package/dist/analyzer-types.d.ts +161 -0
- package/dist/analyzer-types.d.ts.map +1 -0
- package/dist/analyzer-types.js +8 -0
- package/dist/analyzer-types.js.map +1 -0
- package/dist/analyzer-utils.d.ts +40 -0
- package/dist/analyzer-utils.d.ts.map +1 -0
- package/dist/analyzer-utils.js +591 -0
- package/dist/analyzer-utils.js.map +1 -0
- package/dist/analyzer.d.ts +21 -0
- package/dist/analyzer.d.ts.map +1 -0
- package/dist/analyzer.js +111 -0
- package/dist/analyzer.js.map +1 -0
- package/dist/certification.d.ts +102 -0
- package/dist/certification.d.ts.map +1 -0
- package/dist/certification.js +193 -0
- package/dist/certification.js.map +1 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +566 -0
- package/dist/cli.js.map +1 -0
- package/dist/compiler-skills.d.ts +25 -0
- package/dist/compiler-skills.d.ts.map +1 -0
- package/dist/compiler-skills.js +158 -0
- package/dist/compiler-skills.js.map +1 -0
- package/dist/compiler-tools.d.ts +29 -0
- package/dist/compiler-tools.d.ts.map +1 -0
- package/dist/compiler-tools.js +337 -0
- package/dist/compiler-tools.js.map +1 -0
- package/dist/config.d.ts +122 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +704 -0
- package/dist/config.js.map +1 -0
- package/dist/context.d.ts +153 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +772 -0
- package/dist/context.js.map +1 -0
- package/dist/contracts.d.ts +196 -0
- package/dist/contracts.d.ts.map +1 -0
- package/dist/contracts.js +721 -0
- package/dist/contracts.js.map +1 -0
- package/dist/discovery.d.ts +34 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +312 -0
- package/dist/discovery.js.map +1 -0
- package/dist/documentation.d.ts +44 -0
- package/dist/documentation.d.ts.map +1 -0
- package/dist/documentation.js +418 -0
- package/dist/documentation.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/patch.d.ts +71 -0
- package/dist/patch.d.ts.map +1 -0
- package/dist/patch.js +394 -0
- package/dist/patch.js.map +1 -0
- package/dist/pinned-http.d.ts +15 -0
- package/dist/pinned-http.d.ts.map +1 -0
- package/dist/pinned-http.js +170 -0
- package/dist/pinned-http.js.map +1 -0
- package/dist/planner.d.ts +30 -0
- package/dist/planner.d.ts.map +1 -0
- package/dist/planner.js +228 -0
- package/dist/planner.js.map +1 -0
- package/dist/provider.d.ts +168 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +512 -0
- package/dist/provider.js.map +1 -0
- package/dist/providers.d.ts +41 -0
- package/dist/providers.d.ts.map +1 -0
- package/dist/providers.js +954 -0
- package/dist/providers.js.map +1 -0
- package/dist/run-store.d.ts +24 -0
- package/dist/run-store.d.ts.map +1 -0
- package/dist/run-store.js +285 -0
- package/dist/run-store.js.map +1 -0
- package/dist/schemas.d.ts +18 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +228 -0
- package/dist/schemas.js.map +1 -0
- package/dist/secret-scan.d.ts +30 -0
- package/dist/secret-scan.d.ts.map +1 -0
- package/dist/secret-scan.js +122 -0
- package/dist/secret-scan.js.map +1 -0
- package/dist/snapshot.d.ts +33 -0
- package/dist/snapshot.d.ts.map +1 -0
- package/dist/snapshot.js +136 -0
- package/dist/snapshot.js.map +1 -0
- package/dist/support-matrix.d.ts +23 -0
- package/dist/support-matrix.d.ts.map +1 -0
- package/dist/support-matrix.js +199 -0
- package/dist/support-matrix.js.map +1 -0
- package/dist/types.d.ts +63 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/validation.d.ts +25 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +388 -0
- package/dist/validation.js.map +1 -0
- package/dist/workflow.d.ts +65 -0
- package/dist/workflow.d.ts.map +1 -0
- package/dist/workflow.js +1636 -0
- package/dist/workflow.js.map +1 -0
- package/package.json +36 -9
- package/.claude/settings.local.json +0 -12
- package/.github/workflows/ci.yml +0 -18
- package/CONTRIBUTING.md +0 -40
- package/src/cli.ts +0 -218
- package/src/config.ts +0 -186
- package/src/discovery.ts +0 -186
- package/src/index.ts +0 -22
- package/src/types.ts +0 -74
- package/test/config.test.ts +0 -97
- package/test/discovery.test.ts +0 -91
- package/tsconfig.json +0 -17
|
@@ -0,0 +1,418 @@
|
|
|
1
|
+
/** Version-bound, allowlisted official documentation retrieval and cache. */
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
import { lookup } from "node:dns/promises";
|
|
4
|
+
import { chmod, lstat, mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
|
|
5
|
+
import { isIP } from "node:net";
|
|
6
|
+
import { homedir } from "node:os";
|
|
7
|
+
import { dirname, resolve } from "node:path";
|
|
8
|
+
import { pinnedHttpFetch } from "./pinned-http.js";
|
|
9
|
+
import { DEFAULT_OFFICIAL_DOCUMENTATION_HOSTS, ContextSecurityError, scanSecrets, } from "./context.js";
|
|
10
|
+
import { sha256Bytes, sha256Text } from "./contracts.js";
|
|
11
|
+
const DEFAULT_MAX_BYTES = 2 * 1024 * 1024;
|
|
12
|
+
const ABSOLUTE_MAX_BYTES = 8 * 1024 * 1024;
|
|
13
|
+
const MAX_REDIRECTS = 3;
|
|
14
|
+
const CACHE_SCHEMA_VERSION = 1;
|
|
15
|
+
export class DocumentationError extends Error {
|
|
16
|
+
code;
|
|
17
|
+
constructor(code, message, options) {
|
|
18
|
+
super(message, options);
|
|
19
|
+
this.name = "DocumentationError";
|
|
20
|
+
this.code = code;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function defaultCacheRoot(env) {
|
|
24
|
+
if (env.HUMAN_TO_CODE_CACHE)
|
|
25
|
+
return resolve(env.HUMAN_TO_CODE_CACHE, "documentation");
|
|
26
|
+
if (env.XDG_CACHE_HOME)
|
|
27
|
+
return resolve(env.XDG_CACHE_HOME, "human-to-code", "documentation");
|
|
28
|
+
if (process.platform === "win32" && env.LOCALAPPDATA)
|
|
29
|
+
return resolve(env.LOCALAPPDATA, "human-to-code", "documentation");
|
|
30
|
+
if (process.platform === "darwin")
|
|
31
|
+
return resolve(homedir(), "Library", "Caches", "human-to-code", "documentation");
|
|
32
|
+
return resolve(homedir(), ".cache", "human-to-code", "documentation");
|
|
33
|
+
}
|
|
34
|
+
async function defaultResolver(hostname) {
|
|
35
|
+
if (isIP(hostname) !== 0)
|
|
36
|
+
return [hostname];
|
|
37
|
+
return (await lookup(hostname, { all: true, verbatim: true })).map((answer) => answer.address);
|
|
38
|
+
}
|
|
39
|
+
function hostAllowed(hostname, allowed) {
|
|
40
|
+
const host = hostname.toLowerCase().replace(/\.$/u, "");
|
|
41
|
+
return allowed.some((candidate) => {
|
|
42
|
+
const value = candidate.toLowerCase().replace(/\.$/u, "");
|
|
43
|
+
return host === value || host.endsWith(`.${value}`);
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
function normalizedAddress(raw) {
|
|
47
|
+
if (raw.length === 0 || raw !== raw.trim() || raw.includes("%"))
|
|
48
|
+
return undefined;
|
|
49
|
+
const family = isIP(raw);
|
|
50
|
+
if (family === 4) {
|
|
51
|
+
const octets = raw.split(".").map(Number);
|
|
52
|
+
return octets.length === 4 ? { address: octets.join("."), family: 4 } : undefined;
|
|
53
|
+
}
|
|
54
|
+
if (family !== 6)
|
|
55
|
+
return undefined;
|
|
56
|
+
try {
|
|
57
|
+
const bracketed = new URL(`http://[${raw}]/`).hostname;
|
|
58
|
+
return { address: bracketed.slice(1, -1).toLowerCase(), family: 6 };
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function mappedIpv4(address) {
|
|
65
|
+
if (!address.startsWith("::ffff:"))
|
|
66
|
+
return undefined;
|
|
67
|
+
const tail = address.slice("::ffff:".length);
|
|
68
|
+
if (isIP(tail) === 4)
|
|
69
|
+
return tail;
|
|
70
|
+
const match = /^([0-9a-f]{1,4}):([0-9a-f]{1,4})$/u.exec(tail);
|
|
71
|
+
if (!match)
|
|
72
|
+
return undefined;
|
|
73
|
+
const high = Number.parseInt(match[1], 16);
|
|
74
|
+
const low = Number.parseInt(match[2], 16);
|
|
75
|
+
return [high >>> 8, high & 0xff, low >>> 8, low & 0xff].join(".");
|
|
76
|
+
}
|
|
77
|
+
function unsafeAddress(address) {
|
|
78
|
+
const normalized = normalizedAddress(address)?.address;
|
|
79
|
+
if (!normalized)
|
|
80
|
+
return true;
|
|
81
|
+
if (isIP(normalized) === 4) {
|
|
82
|
+
const [a = -1, b = -1, c = -1] = normalized.split(".").map(Number);
|
|
83
|
+
return a === 0 || a === 10 || a === 127
|
|
84
|
+
|| a === 100 && b >= 64 && b <= 127
|
|
85
|
+
|| a === 169 && b === 254
|
|
86
|
+
|| a === 172 && b >= 16 && b <= 31
|
|
87
|
+
|| a === 192 && b === 168
|
|
88
|
+
|| a === 192 && b === 0 && (c === 0 || c === 2)
|
|
89
|
+
|| a === 198 && (b === 18 || b === 19 || b === 51 && c === 100)
|
|
90
|
+
|| a === 203 && b === 0 && c === 113
|
|
91
|
+
|| a >= 224;
|
|
92
|
+
}
|
|
93
|
+
const mapped = mappedIpv4(normalized);
|
|
94
|
+
if (mapped)
|
|
95
|
+
return unsafeAddress(mapped);
|
|
96
|
+
return normalized === "::" || normalized === "::1" || normalized.startsWith("fc") || normalized.startsWith("fd")
|
|
97
|
+
|| /^fe[89ab]/u.test(normalized) || normalized.startsWith("ff")
|
|
98
|
+
|| normalized.startsWith("64:ff9b:") || normalized.startsWith("100:")
|
|
99
|
+
|| normalized.startsWith("2001::") || normalized.startsWith("2001:2:")
|
|
100
|
+
|| /^2001:(?:1[0-9a-f]|2[0-9a-f]):/u.test(normalized)
|
|
101
|
+
|| normalized.startsWith("2001:db8:") || normalized.startsWith("2002:")
|
|
102
|
+
|| normalized.startsWith("3fff:");
|
|
103
|
+
}
|
|
104
|
+
async function resolveWithSignal(resolver, hostname, signal) {
|
|
105
|
+
if (signal.aborted)
|
|
106
|
+
throw signal.reason ?? new DOMException("Aborted", "AbortError");
|
|
107
|
+
return new Promise((complete, reject) => {
|
|
108
|
+
let settled = false;
|
|
109
|
+
const finish = (callback) => {
|
|
110
|
+
if (settled)
|
|
111
|
+
return;
|
|
112
|
+
settled = true;
|
|
113
|
+
signal.removeEventListener("abort", onAbort);
|
|
114
|
+
callback();
|
|
115
|
+
};
|
|
116
|
+
const onAbort = () => finish(() => reject(signal.reason ?? new DOMException("Aborted", "AbortError")));
|
|
117
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
118
|
+
Promise.resolve().then(() => resolver(hostname)).then((answers) => finish(() => complete(answers)), (error) => finish(() => reject(error)));
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
function validateUrl(raw, allowedHosts) {
|
|
122
|
+
let url;
|
|
123
|
+
try {
|
|
124
|
+
url = new URL(raw);
|
|
125
|
+
}
|
|
126
|
+
catch (cause) {
|
|
127
|
+
throw new DocumentationError("INVALID_URL", "Official documentation URL is invalid.", { cause });
|
|
128
|
+
}
|
|
129
|
+
if (url.protocol !== "https:" || url.username || url.password || url.port || url.hostname.length === 0) {
|
|
130
|
+
throw new DocumentationError("URL_BLOCKED", "Official documentation must use credential-free HTTPS on the default port.");
|
|
131
|
+
}
|
|
132
|
+
const hostname = url.hostname.toLowerCase().replace(/\.$/u, "");
|
|
133
|
+
if (isIP(hostname) !== 0 || hostname === "localhost" || hostname.endsWith(".local") || hostname.endsWith(".internal") || !hostAllowed(hostname, allowedHosts)) {
|
|
134
|
+
throw new DocumentationError("URL_BLOCKED", "Official documentation host is not on the public allowlist.");
|
|
135
|
+
}
|
|
136
|
+
url.hash = "";
|
|
137
|
+
return url;
|
|
138
|
+
}
|
|
139
|
+
function validateRequest(request) {
|
|
140
|
+
if (!/^[A-Za-z0-9][A-Za-z0-9._+:-]{0,127}$/u.test(request.version)
|
|
141
|
+
|| /^(?:latest|next|stable|nightly|main|master|head|dev)$/iu.test(request.version)
|
|
142
|
+
|| /[<>=^~*]/u.test(request.version)) {
|
|
143
|
+
throw new DocumentationError("INVALID_VERSION", "Documentation evidence requires an exact bounded version identifier.");
|
|
144
|
+
}
|
|
145
|
+
if (typeof request.reason !== "string" || request.reason.trim().length === 0 || request.reason.length > 4096) {
|
|
146
|
+
throw new DocumentationError("INVALID_REASON", "Documentation retrieval requires a bounded evidence reason.");
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
async function atomicJson(path, value) {
|
|
150
|
+
await mkdir(dirname(path), { recursive: true, mode: 0o700 });
|
|
151
|
+
const temporary = `${path}.${randomUUID()}.tmp`;
|
|
152
|
+
try {
|
|
153
|
+
await writeFile(temporary, `${JSON.stringify(value)}\n`, { encoding: "utf8", mode: 0o600, flag: "wx" });
|
|
154
|
+
await chmod(temporary, 0o600);
|
|
155
|
+
await rename(temporary, path);
|
|
156
|
+
await chmod(path, 0o600);
|
|
157
|
+
}
|
|
158
|
+
finally {
|
|
159
|
+
await rm(temporary, { force: true }).catch(() => undefined);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
function metadataValid(value, key, requestedUrl, version) {
|
|
163
|
+
if (typeof value !== "object" || value === null || Array.isArray(value))
|
|
164
|
+
return false;
|
|
165
|
+
const entry = value;
|
|
166
|
+
const optionalOkay = (entry.etag === undefined || typeof entry.etag === "string")
|
|
167
|
+
&& (entry.lastModified === undefined || typeof entry.lastModified === "string");
|
|
168
|
+
return entry.schemaVersion === 1 && entry.cacheKey === key && entry.requestedUrl === requestedUrl
|
|
169
|
+
&& entry.version === version && typeof entry.finalUrl === "string" && typeof entry.fetchedAt === "string"
|
|
170
|
+
&& typeof entry.sourceSha256 === "string" && typeof entry.contentSha256 === "string" && typeof entry.content === "string"
|
|
171
|
+
&& /^[a-f0-9]{64}$/u.test(entry.sourceSha256) && sha256Text(entry.content) === entry.contentSha256 && optionalOkay;
|
|
172
|
+
}
|
|
173
|
+
function decodeEntities(value) {
|
|
174
|
+
return value
|
|
175
|
+
.replaceAll("<", "<").replaceAll(">", ">").replaceAll("&", "&")
|
|
176
|
+
.replaceAll(""", "\"").replaceAll("'", "'").replaceAll(" ", " ")
|
|
177
|
+
.replace(/&#(\d+);/gu, (_match, decimal) => {
|
|
178
|
+
const code = Number(decimal);
|
|
179
|
+
return Number.isSafeInteger(code) && code >= 0 && code <= 0x10ffff ? String.fromCodePoint(code) : "";
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
function normalizedContent(source, contentType) {
|
|
183
|
+
const clean = source.replace(/\r\n?/gu, "\n");
|
|
184
|
+
if (!/html|xhtml/iu.test(contentType))
|
|
185
|
+
return clean.trim();
|
|
186
|
+
return decodeEntities(clean
|
|
187
|
+
.replace(/<(?:script|style|noscript|svg)\b[^>]*>[\s\S]*?<\/(?:script|style|noscript|svg)>/giu, "\n")
|
|
188
|
+
.replace(/<(?:br|\/p|\/div|\/li|\/tr|\/h[1-6]|\/pre|\/code)>/giu, "\n")
|
|
189
|
+
.replace(/<[^>]+>/gu, " "))
|
|
190
|
+
.split("\n")
|
|
191
|
+
.map((line) => line.replace(/[\t ]+/gu, " ").trim())
|
|
192
|
+
.filter((line, index, lines) => line.length > 0 && (index === 0 || line !== lines[index - 1]))
|
|
193
|
+
.join("\n");
|
|
194
|
+
}
|
|
195
|
+
async function boundedUtf8(response, maximum) {
|
|
196
|
+
const declared = response.headers.get("content-length");
|
|
197
|
+
if (declared && /^\d+$/u.test(declared) && Number(declared) > maximum)
|
|
198
|
+
throw new DocumentationError("RESPONSE_TOO_LARGE", "Official documentation exceeds the response budget.");
|
|
199
|
+
if (!response.body)
|
|
200
|
+
throw new DocumentationError("EMPTY_RESPONSE", "Official documentation response was empty.");
|
|
201
|
+
const reader = response.body.getReader();
|
|
202
|
+
const chunks = [];
|
|
203
|
+
let length = 0;
|
|
204
|
+
try {
|
|
205
|
+
for (;;) {
|
|
206
|
+
const item = await reader.read();
|
|
207
|
+
if (item.done)
|
|
208
|
+
break;
|
|
209
|
+
length += item.value.byteLength;
|
|
210
|
+
if (length > maximum) {
|
|
211
|
+
await reader.cancel().catch(() => undefined);
|
|
212
|
+
throw new DocumentationError("RESPONSE_TOO_LARGE", "Official documentation exceeds the response budget.");
|
|
213
|
+
}
|
|
214
|
+
chunks.push(item.value);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
finally {
|
|
218
|
+
reader.releaseLock();
|
|
219
|
+
}
|
|
220
|
+
const bytes = new Uint8Array(length);
|
|
221
|
+
let offset = 0;
|
|
222
|
+
for (const chunk of chunks) {
|
|
223
|
+
bytes.set(chunk, offset);
|
|
224
|
+
offset += chunk.byteLength;
|
|
225
|
+
}
|
|
226
|
+
try {
|
|
227
|
+
return { source: new TextDecoder("utf-8", { fatal: true }).decode(bytes), sourceHash: sha256Bytes(bytes) };
|
|
228
|
+
}
|
|
229
|
+
catch (cause) {
|
|
230
|
+
throw new DocumentationError("INVALID_UTF8", "Official documentation is not valid UTF-8.", { cause });
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
export class OfficialDocumentationClient {
|
|
234
|
+
cacheRoot;
|
|
235
|
+
#allowedHosts;
|
|
236
|
+
/** An explicitly trusted test seam; production uses the pinned transport. */
|
|
237
|
+
#fetch;
|
|
238
|
+
#resolver;
|
|
239
|
+
#maxBytes;
|
|
240
|
+
#timeoutMs;
|
|
241
|
+
constructor(options = {}) {
|
|
242
|
+
const env = options.env ?? process.env;
|
|
243
|
+
this.cacheRoot = resolve(options.cacheRoot ?? defaultCacheRoot(env));
|
|
244
|
+
this.#allowedHosts = [...new Set(options.allowedHosts ?? DEFAULT_OFFICIAL_DOCUMENTATION_HOSTS)];
|
|
245
|
+
if (this.#allowedHosts.length === 0 || this.#allowedHosts.some((host) => !/^[a-z0-9.-]+$/iu.test(host)))
|
|
246
|
+
throw new DocumentationError("INVALID_ALLOWLIST", "Documentation allowlist is invalid.");
|
|
247
|
+
this.#fetch = options.fetch;
|
|
248
|
+
this.#resolver = options.resolveHostname ?? defaultResolver;
|
|
249
|
+
this.#maxBytes = options.maxBytes ?? DEFAULT_MAX_BYTES;
|
|
250
|
+
this.#timeoutMs = options.timeoutMs ?? 30_000;
|
|
251
|
+
if (!Number.isSafeInteger(this.#maxBytes) || this.#maxBytes < 1024 || this.#maxBytes > ABSOLUTE_MAX_BYTES)
|
|
252
|
+
throw new DocumentationError("INVALID_BUDGET", "Documentation byte budget is invalid.");
|
|
253
|
+
if (!Number.isSafeInteger(this.#timeoutMs) || this.#timeoutMs < 1000 || this.#timeoutMs > 300_000)
|
|
254
|
+
throw new DocumentationError("INVALID_TIMEOUT", "Documentation timeout is invalid.");
|
|
255
|
+
}
|
|
256
|
+
#cachePath(key) {
|
|
257
|
+
return resolve(this.cacheRoot, `${key}.json`);
|
|
258
|
+
}
|
|
259
|
+
async #readCache(key, requestedUrl, version) {
|
|
260
|
+
const path = this.#cachePath(key);
|
|
261
|
+
const metadata = await lstat(path).catch(() => undefined);
|
|
262
|
+
if (!metadata)
|
|
263
|
+
return undefined;
|
|
264
|
+
if (!metadata.isFile() || metadata.isSymbolicLink() || metadata.nlink > 1 || metadata.size > this.#maxBytes * 2)
|
|
265
|
+
throw new DocumentationError("CACHE_TAMPERED", "Documentation cache entry is not a bounded single-link file.");
|
|
266
|
+
let value;
|
|
267
|
+
try {
|
|
268
|
+
value = JSON.parse(await readFile(path, "utf8"));
|
|
269
|
+
}
|
|
270
|
+
catch (cause) {
|
|
271
|
+
throw new DocumentationError("CACHE_TAMPERED", "Documentation cache entry is invalid JSON.", { cause });
|
|
272
|
+
}
|
|
273
|
+
if (!metadataValid(value, key, requestedUrl, version))
|
|
274
|
+
throw new DocumentationError("CACHE_TAMPERED", "Documentation cache provenance or content hash is invalid.");
|
|
275
|
+
return value;
|
|
276
|
+
}
|
|
277
|
+
async #publicAnswers(url, signal) {
|
|
278
|
+
let answers;
|
|
279
|
+
try {
|
|
280
|
+
answers = await resolveWithSignal(this.#resolver, url.hostname, signal);
|
|
281
|
+
}
|
|
282
|
+
catch (cause) {
|
|
283
|
+
if (signal.aborted)
|
|
284
|
+
throw cause;
|
|
285
|
+
throw new DocumentationError("DNS_FAILURE", "Official documentation hostname could not be resolved.", { cause });
|
|
286
|
+
}
|
|
287
|
+
const normalized = answers.map(normalizedAddress);
|
|
288
|
+
if (answers.length === 0 || normalized.some((answer) => !answer)
|
|
289
|
+
|| answers.some(unsafeAddress)) {
|
|
290
|
+
throw new DocumentationError("NETWORK_BLOCKED", "Official documentation hostname resolved outside the public network.");
|
|
291
|
+
}
|
|
292
|
+
const destinations = [...new Map(normalized
|
|
293
|
+
.map((answer) => [`${answer.family}:${answer.address}`, answer])).values()].sort((left, right) => left.family - right.family || left.address.localeCompare(right.address));
|
|
294
|
+
const selected = destinations[0];
|
|
295
|
+
if (!selected)
|
|
296
|
+
throw new DocumentationError("DNS_FAILURE", "Official documentation hostname returned no usable address.");
|
|
297
|
+
const hostname = url.hostname.replace(/^\[|\]$/gu, "").replace(/\.$/u, "").toLowerCase();
|
|
298
|
+
return {
|
|
299
|
+
key: destinations.map((answer) => `${answer.family}:${answer.address}`).join(","),
|
|
300
|
+
selected: { hostname, ...selected },
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
async #request(start, cached) {
|
|
304
|
+
const controller = new AbortController();
|
|
305
|
+
const timer = setTimeout(() => controller.abort(), this.#timeoutMs);
|
|
306
|
+
timer.unref();
|
|
307
|
+
let current = start;
|
|
308
|
+
try {
|
|
309
|
+
for (let redirects = 0; redirects <= MAX_REDIRECTS; redirects += 1) {
|
|
310
|
+
current = validateUrl(current.href, this.#allowedHosts);
|
|
311
|
+
const before = await this.#publicAnswers(current, controller.signal);
|
|
312
|
+
const headers = { accept: "text/html, text/markdown, text/plain, application/json;q=0.8", "user-agent": "human-to-code-documentation/0.1" };
|
|
313
|
+
if (redirects === 0 && cached?.etag)
|
|
314
|
+
headers["if-none-match"] = cached.etag;
|
|
315
|
+
if (redirects === 0 && cached?.lastModified)
|
|
316
|
+
headers["if-modified-since"] = cached.lastModified;
|
|
317
|
+
let response;
|
|
318
|
+
try {
|
|
319
|
+
const init = { method: "GET", redirect: "manual", headers, signal: controller.signal };
|
|
320
|
+
response = this.#fetch
|
|
321
|
+
? await this.#fetch(current.href, init)
|
|
322
|
+
: await pinnedHttpFetch(current.href, init, before.selected);
|
|
323
|
+
}
|
|
324
|
+
catch (cause) {
|
|
325
|
+
if (controller.signal.aborted)
|
|
326
|
+
throw new DocumentationError("TIMEOUT", "Official documentation request timed out.", { cause });
|
|
327
|
+
throw new DocumentationError("NETWORK_FAILURE", "Official documentation request failed.", { cause });
|
|
328
|
+
}
|
|
329
|
+
const after = await this.#publicAnswers(current, controller.signal);
|
|
330
|
+
if (before.key !== after.key) {
|
|
331
|
+
await response.body?.cancel().catch(() => undefined);
|
|
332
|
+
throw new DocumentationError("DNS_REBINDING", "Official documentation hostname changed addresses during retrieval.");
|
|
333
|
+
}
|
|
334
|
+
if (response.redirected) {
|
|
335
|
+
await response.body?.cancel().catch(() => undefined);
|
|
336
|
+
throw new DocumentationError("REDIRECT_BLOCKED", "HTTP client followed a redirect outside the policy gate.");
|
|
337
|
+
}
|
|
338
|
+
if ([301, 302, 303, 307, 308].includes(response.status)) {
|
|
339
|
+
if (redirects === MAX_REDIRECTS)
|
|
340
|
+
throw new DocumentationError("REDIRECT_LIMIT", "Official documentation redirect limit was exceeded.");
|
|
341
|
+
const location = response.headers.get("location");
|
|
342
|
+
await response.body?.cancel().catch(() => undefined);
|
|
343
|
+
if (!location)
|
|
344
|
+
throw new DocumentationError("REDIRECT_BLOCKED", "Official documentation redirect omitted Location.");
|
|
345
|
+
current = validateUrl(new URL(location, current).href, this.#allowedHosts);
|
|
346
|
+
continue;
|
|
347
|
+
}
|
|
348
|
+
if (response.status === 304 && cached)
|
|
349
|
+
return { status: "not-modified", finalUrl: current, response };
|
|
350
|
+
if (!response.ok) {
|
|
351
|
+
await response.body?.cancel().catch(() => undefined);
|
|
352
|
+
throw new DocumentationError("HTTP_FAILURE", `Official documentation returned HTTP ${response.status}.`);
|
|
353
|
+
}
|
|
354
|
+
const contentType = response.headers.get("content-type")?.split(";")[0]?.trim().toLowerCase() ?? "";
|
|
355
|
+
if (!new Set(["text/html", "application/xhtml+xml", "text/plain", "text/markdown", "text/x-markdown", "application/json"]).has(contentType)) {
|
|
356
|
+
await response.body?.cancel().catch(() => undefined);
|
|
357
|
+
throw new DocumentationError("CONTENT_TYPE_BLOCKED", `Official documentation content type is not allowed: ${contentType || "missing"}.`);
|
|
358
|
+
}
|
|
359
|
+
const body = await boundedUtf8(response, this.#maxBytes);
|
|
360
|
+
return { status: "content", finalUrl: current, response, ...body };
|
|
361
|
+
}
|
|
362
|
+
throw new DocumentationError("REDIRECT_LIMIT", "Official documentation redirect limit was exceeded.");
|
|
363
|
+
}
|
|
364
|
+
finally {
|
|
365
|
+
clearTimeout(timer);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
async retrieve(request) {
|
|
369
|
+
validateRequest(request);
|
|
370
|
+
const requested = validateUrl(request.url, this.#allowedHosts);
|
|
371
|
+
const key = sha256Text(`${requested.href}\0${request.version}`);
|
|
372
|
+
const cached = await this.#readCache(key, requested.href, request.version);
|
|
373
|
+
if (request.offline) {
|
|
374
|
+
if (!cached)
|
|
375
|
+
throw new DocumentationError("OFFLINE_MISS", "Version-matched official documentation is not present in the offline cache.");
|
|
376
|
+
return {
|
|
377
|
+
origin: "official_documentation", url: cached.finalUrl, version: cached.version, content: cached.content,
|
|
378
|
+
contentSha256: cached.contentSha256, reason: request.reason, cached: true,
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
const fetched = await this.#request(requested, cached);
|
|
382
|
+
if (fetched.status === "not-modified") {
|
|
383
|
+
const entry = cached;
|
|
384
|
+
return {
|
|
385
|
+
origin: "official_documentation", url: entry.finalUrl, version: entry.version, content: entry.content,
|
|
386
|
+
contentSha256: entry.contentSha256, reason: request.reason, cached: true,
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
const source = fetched.source;
|
|
390
|
+
const contentType = fetched.response.headers.get("content-type") ?? "text/plain";
|
|
391
|
+
const content = normalizedContent(source, contentType);
|
|
392
|
+
if (content.length === 0)
|
|
393
|
+
throw new DocumentationError("EMPTY_CONTENT", "Official documentation contained no usable text.");
|
|
394
|
+
if (scanSecrets(content).length > 0)
|
|
395
|
+
throw new ContextSecurityError("SECRET_DETECTED", "Credential-like content in remote documentation was blocked before cache/provider writes.", fetched.finalUrl.href);
|
|
396
|
+
const entry = {
|
|
397
|
+
schemaVersion: CACHE_SCHEMA_VERSION,
|
|
398
|
+
cacheKey: key,
|
|
399
|
+
requestedUrl: requested.href,
|
|
400
|
+
finalUrl: fetched.finalUrl.href,
|
|
401
|
+
version: request.version,
|
|
402
|
+
fetchedAt: new Date().toISOString(),
|
|
403
|
+
sourceSha256: fetched.sourceHash,
|
|
404
|
+
contentSha256: sha256Text(content),
|
|
405
|
+
content,
|
|
406
|
+
...(fetched.response.headers.get("etag") ? { etag: fetched.response.headers.get("etag") } : {}),
|
|
407
|
+
...(fetched.response.headers.get("last-modified") ? { lastModified: fetched.response.headers.get("last-modified") } : {}),
|
|
408
|
+
};
|
|
409
|
+
await mkdir(this.cacheRoot, { recursive: true, mode: 0o700 });
|
|
410
|
+
await chmod(this.cacheRoot, 0o700);
|
|
411
|
+
await atomicJson(this.#cachePath(key), entry);
|
|
412
|
+
return {
|
|
413
|
+
origin: "official_documentation", url: entry.finalUrl, version: entry.version, content: entry.content,
|
|
414
|
+
contentSha256: entry.contentSha256, reason: request.reason, cached: false,
|
|
415
|
+
};
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
//# sourceMappingURL=documentation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"documentation.js","sourceRoot":"","sources":["../src/documentation.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** Stable public API for embedding the Human-to-Code pipeline. */
|
|
2
|
+
export type { Config, ProviderConfig, ProviderName, TargetLanguage, SourceFile, SourceKind, DiscoveryResult, } from "./types.ts";
|
|
3
|
+
export * from "./certification.ts";
|
|
4
|
+
export * from "./config.ts";
|
|
5
|
+
export * from "./discovery.ts";
|
|
6
|
+
export * from "./contracts.ts";
|
|
7
|
+
export * from "./context.ts";
|
|
8
|
+
export * from "./documentation.ts";
|
|
9
|
+
export * from "./provider.ts";
|
|
10
|
+
export * from "./providers.ts";
|
|
11
|
+
export * from "./schemas.ts";
|
|
12
|
+
export * from "./secret-scan.ts";
|
|
13
|
+
export * from "./compiler-skills.ts";
|
|
14
|
+
export * from "./compiler-tools.ts";
|
|
15
|
+
export * from "./planner.ts";
|
|
16
|
+
export * from "./patch.ts";
|
|
17
|
+
export * from "./snapshot.ts";
|
|
18
|
+
export * from "./run-store.ts";
|
|
19
|
+
export * from "./validation.ts";
|
|
20
|
+
export * from "./workflow.ts";
|
|
21
|
+
export { analyzeProject, DEFAULT_ECOSYSTEM_ADAPTERS, SUPPORT_MATRIX, SUPPORT_MATRIX_VERSION, supportFor, NodeEcosystemAdapter, nodeEcosystemAdapter, FastApiEcosystemAdapter, fastApiEcosystemAdapter, RustEcosystemAdapter, rustEcosystemAdapter, } from "./analyzer.ts";
|
|
22
|
+
export type { AnalysisEvidenceV1, AnalyzerContext, AnalyzerDiagnostic, AnalyzerDiagnosticSeverity, AnalyzerInventory, AnalyzerOptions, DependencyVersionEvidence, Ecosystem, EcosystemAdapter, FrameworkIdentity, ProfileSignalValue, ProjectAnalysisStatus, ProjectProfileV1, ScanSummaryV1, SupportDecision, SupportTier, WorkspaceOwnershipV1, WorkspaceProfileV1, ValidationCategory as AnalyzerValidationCategory, ValidationCommandV1 as AnalyzerValidationCommandV1, } from "./analyzer.ts";
|
|
23
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAElE,YAAY,EACV,MAAM,EACN,cAAc,EACd,YAAY,EACZ,cAAc,EACd,UAAU,EACV,UAAU,EACV,eAAe,GAChB,MAAM,YAAY,CAAC;AAEpB,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAE9B,OAAO,EACL,cAAc,EACd,0BAA0B,EAC1B,cAAc,EACd,sBAAsB,EACtB,UAAU,EACV,oBAAoB,EACpB,oBAAoB,EACpB,uBAAuB,EACvB,uBAAuB,EACvB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,eAAe,CAAC;AAEvB,YAAY,EACV,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,0BAA0B,EAC1B,iBAAiB,EACjB,eAAe,EACf,yBAAyB,EACzB,SAAS,EACT,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,WAAW,EACX,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,IAAI,0BAA0B,EAChD,mBAAmB,IAAI,2BAA2B,GACnD,MAAM,eAAe,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** Stable public API for embedding the Human-to-Code pipeline. */
|
|
2
|
+
export * from "./certification.js";
|
|
3
|
+
export * from "./config.js";
|
|
4
|
+
export * from "./discovery.js";
|
|
5
|
+
export * from "./contracts.js";
|
|
6
|
+
export * from "./context.js";
|
|
7
|
+
export * from "./documentation.js";
|
|
8
|
+
export * from "./provider.js";
|
|
9
|
+
export * from "./providers.js";
|
|
10
|
+
export * from "./schemas.js";
|
|
11
|
+
export * from "./secret-scan.js";
|
|
12
|
+
export * from "./compiler-skills.js";
|
|
13
|
+
export * from "./compiler-tools.js";
|
|
14
|
+
export * from "./planner.js";
|
|
15
|
+
export * from "./patch.js";
|
|
16
|
+
export * from "./snapshot.js";
|
|
17
|
+
export * from "./run-store.js";
|
|
18
|
+
export * from "./validation.js";
|
|
19
|
+
export * from "./workflow.js";
|
|
20
|
+
export { analyzeProject, DEFAULT_ECOSYSTEM_ADAPTERS, SUPPORT_MATRIX, SUPPORT_MATRIX_VERSION, supportFor, NodeEcosystemAdapter, nodeEcosystemAdapter, FastApiEcosystemAdapter, fastApiEcosystemAdapter, RustEcosystemAdapter, rustEcosystemAdapter, } from "./analyzer.js";
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAYlE,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAE9B,OAAO,EACL,cAAc,EACd,0BAA0B,EAC1B,cAAc,EACd,sBAAsB,EACtB,UAAU,EACV,oBAAoB,EACpB,oBAAoB,EACpB,uBAAuB,EACvB,uBAAuB,EACvB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,eAAe,CAAC"}
|
package/dist/patch.d.ts
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Constrained patch validation and atomic application.
|
|
3
|
+
*
|
|
4
|
+
* Model output is never applied as a shell patch. Every operation is checked
|
|
5
|
+
* against the repository root, its exact base hash, and an explicit scope.
|
|
6
|
+
*/
|
|
7
|
+
import type { PatchOperation, PatchSetV1 } from "./contracts.ts";
|
|
8
|
+
export interface PatchPolicy {
|
|
9
|
+
/** POSIX relative paths or directory prefixes ending in `/`. */
|
|
10
|
+
allowedPaths?: string[];
|
|
11
|
+
/** Additional protected paths or directory prefixes ending in `/`. */
|
|
12
|
+
protectedPaths?: string[];
|
|
13
|
+
maxOperations?: number;
|
|
14
|
+
maxChangedBytes?: number;
|
|
15
|
+
allowDeletes?: boolean;
|
|
16
|
+
allowRenames?: boolean;
|
|
17
|
+
/** Full content-addressed snapshot bound into the generation request. */
|
|
18
|
+
expectedSnapshotHash?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface PreparedPatch {
|
|
21
|
+
root: string;
|
|
22
|
+
patch: PatchSetV1;
|
|
23
|
+
operations: PreparedOperation[];
|
|
24
|
+
changedBytes: number;
|
|
25
|
+
}
|
|
26
|
+
export type PreparedOperation = {
|
|
27
|
+
kind: "create";
|
|
28
|
+
path: string;
|
|
29
|
+
absPath: string;
|
|
30
|
+
content: string;
|
|
31
|
+
mode: number;
|
|
32
|
+
} | {
|
|
33
|
+
kind: "edit";
|
|
34
|
+
path: string;
|
|
35
|
+
absPath: string;
|
|
36
|
+
before: string;
|
|
37
|
+
after: string;
|
|
38
|
+
mode: number;
|
|
39
|
+
} | {
|
|
40
|
+
kind: "delete";
|
|
41
|
+
path: string;
|
|
42
|
+
absPath: string;
|
|
43
|
+
before: string;
|
|
44
|
+
mode: number;
|
|
45
|
+
} | {
|
|
46
|
+
kind: "rename";
|
|
47
|
+
from: string;
|
|
48
|
+
absFrom: string;
|
|
49
|
+
path: string;
|
|
50
|
+
absPath: string;
|
|
51
|
+
before: string;
|
|
52
|
+
mode: number;
|
|
53
|
+
};
|
|
54
|
+
export declare class PatchSafetyError extends Error {
|
|
55
|
+
readonly code: string;
|
|
56
|
+
readonly details: string[];
|
|
57
|
+
constructor(code: string, message: string, details?: string[]);
|
|
58
|
+
}
|
|
59
|
+
export interface ApplyResult {
|
|
60
|
+
applied: string[];
|
|
61
|
+
patchHash: string;
|
|
62
|
+
}
|
|
63
|
+
export declare function normalizePatchPath(value: string): string;
|
|
64
|
+
export declare function computePatchSnapshotHash(operations: readonly PatchOperation[]): string;
|
|
65
|
+
export declare function preparePatch(rootInput: string, patch: PatchSetV1, policy?: PatchPolicy): Promise<PreparedPatch>;
|
|
66
|
+
/**
|
|
67
|
+
* Apply an already constrained PatchSet. On any failure, touched paths are
|
|
68
|
+
* restored to their original content and modes before the error is rethrown.
|
|
69
|
+
*/
|
|
70
|
+
export declare function applyPatchAtomic(root: string, patch: PatchSetV1, policy?: PatchPolicy): Promise<ApplyResult>;
|
|
71
|
+
//# sourceMappingURL=patch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patch.d.ts","sourceRoot":"","sources":["../src/patch.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA4BH,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AA2BjE,MAAM,WAAW,WAAW;IAC1B,gEAAgE;IAChE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,sEAAsE;IACtE,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,yEAAyE;IACzE,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,UAAU,CAAC;IAClB,UAAU,EAAE,iBAAiB,EAAE,CAAC;IAChC,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,iBAAiB,GACzB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAChF;IACE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd,GACD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/E;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEN,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;gBAEf,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,EAAO;CAMlE;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAMD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAsBxD;AAqHD,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,SAAS,cAAc,EAAE,GAAG,MAAM,CAetF;AAED,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,UAAU,EACjB,MAAM,GAAE,WAAgB,GACvB,OAAO,CAAC,aAAa,CAAC,CA4HxB;AAcD;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,UAAU,EACjB,MAAM,GAAE,WAAgB,GACvB,OAAO,CAAC,WAAW,CAAC,CA0DtB"}
|