dravix-agent 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/.claude/settings.example.json +30 -0
- package/ARCHITECTURE.md +410 -0
- package/LICENSE +21 -0
- package/README.md +153 -0
- package/ROADMAP.md +117 -0
- package/data/vulnkb.json +666 -0
- package/dist/bin/aegis.d.ts +3 -0
- package/dist/bin/aegis.d.ts.map +1 -0
- package/dist/bin/aegis.js +489 -0
- package/dist/bin/aegis.js.map +1 -0
- package/dist/cache.d.ts +9 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +146 -0
- package/dist/cache.js.map +1 -0
- package/dist/engines/ai-sinks.d.ts +52 -0
- package/dist/engines/ai-sinks.d.ts.map +1 -0
- package/dist/engines/ai-sinks.js +204 -0
- package/dist/engines/ai-sinks.js.map +1 -0
- package/dist/engines/eslint.d.ts +9 -0
- package/dist/engines/eslint.d.ts.map +1 -0
- package/dist/engines/eslint.js +245 -0
- package/dist/engines/eslint.js.map +1 -0
- package/dist/engines/joern.d.ts +3 -0
- package/dist/engines/joern.d.ts.map +1 -0
- package/dist/engines/joern.js +98 -0
- package/dist/engines/joern.js.map +1 -0
- package/dist/engines/js-sinks.d.ts +70 -0
- package/dist/engines/js-sinks.d.ts.map +1 -0
- package/dist/engines/js-sinks.js +370 -0
- package/dist/engines/js-sinks.js.map +1 -0
- package/dist/engines/llm-critic.d.ts +130 -0
- package/dist/engines/llm-critic.d.ts.map +1 -0
- package/dist/engines/llm-critic.js +551 -0
- package/dist/engines/llm-critic.js.map +1 -0
- package/dist/engines/pragma.d.ts +20 -0
- package/dist/engines/pragma.d.ts.map +1 -0
- package/dist/engines/pragma.js +83 -0
- package/dist/engines/pragma.js.map +1 -0
- package/dist/engines/property-test.d.ts +3 -0
- package/dist/engines/property-test.d.ts.map +1 -0
- package/dist/engines/property-test.js +134 -0
- package/dist/engines/property-test.js.map +1 -0
- package/dist/engines/pyright.d.ts +10 -0
- package/dist/engines/pyright.d.ts.map +1 -0
- package/dist/engines/pyright.js +143 -0
- package/dist/engines/pyright.js.map +1 -0
- package/dist/engines/pysa.d.ts +3 -0
- package/dist/engines/pysa.d.ts.map +1 -0
- package/dist/engines/pysa.js +83 -0
- package/dist/engines/pysa.js.map +1 -0
- package/dist/engines/python-sinks.d.ts +82 -0
- package/dist/engines/python-sinks.d.ts.map +1 -0
- package/dist/engines/python-sinks.js +459 -0
- package/dist/engines/python-sinks.js.map +1 -0
- package/dist/engines/registry.d.ts +26 -0
- package/dist/engines/registry.d.ts.map +1 -0
- package/dist/engines/registry.js +70 -0
- package/dist/engines/registry.js.map +1 -0
- package/dist/engines/secret-scan.d.ts +22 -0
- package/dist/engines/secret-scan.d.ts.map +1 -0
- package/dist/engines/secret-scan.js +179 -0
- package/dist/engines/secret-scan.js.map +1 -0
- package/dist/engines/semgrep.d.ts +10 -0
- package/dist/engines/semgrep.d.ts.map +1 -0
- package/dist/engines/semgrep.js +200 -0
- package/dist/engines/semgrep.js.map +1 -0
- package/dist/engines/treesitter.d.ts +18 -0
- package/dist/engines/treesitter.d.ts.map +1 -0
- package/dist/engines/treesitter.js +135 -0
- package/dist/engines/treesitter.js.map +1 -0
- package/dist/engines/tsc.d.ts +10 -0
- package/dist/engines/tsc.d.ts.map +1 -0
- package/dist/engines/tsc.js +142 -0
- package/dist/engines/tsc.js.map +1 -0
- package/dist/engines/types.d.ts +47 -0
- package/dist/engines/types.d.ts.map +1 -0
- package/dist/engines/types.js +27 -0
- package/dist/engines/types.js.map +1 -0
- package/dist/findings.d.ts +121 -0
- package/dist/findings.d.ts.map +1 -0
- package/dist/findings.js +98 -0
- package/dist/findings.js.map +1 -0
- package/dist/hooks/claude-code.d.ts +3 -0
- package/dist/hooks/claude-code.d.ts.map +1 -0
- package/dist/hooks/claude-code.js +187 -0
- package/dist/hooks/claude-code.js.map +1 -0
- package/dist/index/context.d.ts +127 -0
- package/dist/index/context.d.ts.map +1 -0
- package/dist/index/context.js +267 -0
- package/dist/index/context.js.map +1 -0
- package/dist/index/embeddings.d.ts +68 -0
- package/dist/index/embeddings.d.ts.map +1 -0
- package/dist/index/embeddings.js +570 -0
- package/dist/index/embeddings.js.map +1 -0
- package/dist/index/graph_routing.d.ts +36 -0
- package/dist/index/graph_routing.d.ts.map +1 -0
- package/dist/index/graph_routing.js +170 -0
- package/dist/index/graph_routing.js.map +1 -0
- package/dist/index/joern.d.ts +76 -0
- package/dist/index/joern.d.ts.map +1 -0
- package/dist/index/joern.js +782 -0
- package/dist/index/joern.js.map +1 -0
- package/dist/index/property-test.d.ts +88 -0
- package/dist/index/property-test.d.ts.map +1 -0
- package/dist/index/property-test.js +466 -0
- package/dist/index/property-test.js.map +1 -0
- package/dist/index/proto/scip.proto +897 -0
- package/dist/index/pysa.d.ts +91 -0
- package/dist/index/pysa.d.ts.map +1 -0
- package/dist/index/pysa.js +617 -0
- package/dist/index/pysa.js.map +1 -0
- package/dist/index/scip.d.ts +76 -0
- package/dist/index/scip.d.ts.map +1 -0
- package/dist/index/scip.js +541 -0
- package/dist/index/scip.js.map +1 -0
- package/dist/index/vulrag.d.ts +86 -0
- package/dist/index/vulrag.d.ts.map +1 -0
- package/dist/index/vulrag.js +242 -0
- package/dist/index/vulrag.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/install/claude-code.d.ts +31 -0
- package/dist/install/claude-code.d.ts.map +1 -0
- package/dist/install/claude-code.js +447 -0
- package/dist/install/claude-code.js.map +1 -0
- package/dist/lang.d.ts +5 -0
- package/dist/lang.d.ts.map +1 -0
- package/dist/lang.js +52 -0
- package/dist/lang.js.map +1 -0
- package/dist/learning/suppressions.d.ts +70 -0
- package/dist/learning/suppressions.d.ts.map +1 -0
- package/dist/learning/suppressions.js +179 -0
- package/dist/learning/suppressions.js.map +1 -0
- package/dist/mcp/server.d.ts +2 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +187 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/explain.d.ts +58 -0
- package/dist/mcp/tools/explain.d.ts.map +1 -0
- package/dist/mcp/tools/explain.js +60 -0
- package/dist/mcp/tools/explain.js.map +1 -0
- package/dist/mcp/tools/precheck.d.ts +29 -0
- package/dist/mcp/tools/precheck.d.ts.map +1 -0
- package/dist/mcp/tools/precheck.js +42 -0
- package/dist/mcp/tools/precheck.js.map +1 -0
- package/dist/mcp/tools/validate.d.ts +73 -0
- package/dist/mcp/tools/validate.d.ts.map +1 -0
- package/dist/mcp/tools/validate.js +66 -0
- package/dist/mcp/tools/validate.js.map +1 -0
- package/dist/mcp/warm.d.ts +88 -0
- package/dist/mcp/warm.d.ts.map +1 -0
- package/dist/mcp/warm.js +331 -0
- package/dist/mcp/warm.js.map +1 -0
- package/dist/orchestrator.d.ts +46 -0
- package/dist/orchestrator.d.ts.map +1 -0
- package/dist/orchestrator.js +596 -0
- package/dist/orchestrator.js.map +1 -0
- package/dist/policy.d.ts +51 -0
- package/dist/policy.d.ts.map +1 -0
- package/dist/policy.js +201 -0
- package/dist/policy.js.map +1 -0
- package/dist/risk.d.ts +31 -0
- package/dist/risk.d.ts.map +1 -0
- package/dist/risk.js +92 -0
- package/dist/risk.js.map +1 -0
- package/dist/stats.d.ts +72 -0
- package/dist/stats.d.ts.map +1 -0
- package/dist/stats.js +217 -0
- package/dist/stats.js.map +1 -0
- package/dist/telemetry/collector.d.ts +10 -0
- package/dist/telemetry/collector.d.ts.map +1 -0
- package/dist/telemetry/collector.js +75 -0
- package/dist/telemetry/collector.js.map +1 -0
- package/dist/telemetry/consent.d.ts +9 -0
- package/dist/telemetry/consent.d.ts.map +1 -0
- package/dist/telemetry/consent.js +42 -0
- package/dist/telemetry/consent.js.map +1 -0
- package/dist/telemetry/installation.d.ts +2 -0
- package/dist/telemetry/installation.d.ts.map +1 -0
- package/dist/telemetry/installation.js +32 -0
- package/dist/telemetry/installation.js.map +1 -0
- package/dist/telemetry/sanitizer.d.ts +5 -0
- package/dist/telemetry/sanitizer.d.ts.map +1 -0
- package/dist/telemetry/sanitizer.js +60 -0
- package/dist/telemetry/sanitizer.js.map +1 -0
- package/dist/telemetry/types.d.ts +39 -0
- package/dist/telemetry/types.d.ts.map +1 -0
- package/dist/telemetry/types.js +4 -0
- package/dist/telemetry/types.js.map +1 -0
- package/dist/telemetry/uploader.d.ts +12 -0
- package/dist/telemetry/uploader.d.ts.map +1 -0
- package/dist/telemetry/uploader.js +92 -0
- package/dist/telemetry/uploader.js.map +1 -0
- package/dist/util/logger.d.ts +19 -0
- package/dist/util/logger.d.ts.map +1 -0
- package/dist/util/logger.js +58 -0
- package/dist/util/logger.js.map +1 -0
- package/dist/util/safe-paths.d.ts +8 -0
- package/dist/util/safe-paths.d.ts.map +1 -0
- package/dist/util/safe-paths.js +102 -0
- package/dist/util/safe-paths.js.map +1 -0
- package/dist/util/subprocess.d.ts +32 -0
- package/dist/util/subprocess.d.ts.map +1 -0
- package/dist/util/subprocess.js +137 -0
- package/dist/util/subprocess.js.map +1 -0
- package/package.json +93 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aegis.d.ts","sourceRoot":"","sources":["../../src/bin/aegis.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,489 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* `aegis` CLI — three subcommands:
|
|
4
|
+
* aegis mcp → start the MCP server (stdio)
|
|
5
|
+
* aegis hook → read JSON from stdin, run the gate, exit 0/2 (Claude Code hook)
|
|
6
|
+
* aegis scan → CLI: scan a single file, print verdict + findings, exit 0/2
|
|
7
|
+
* aegis doctor → check which engines are available on this host
|
|
8
|
+
*/
|
|
9
|
+
import { existsSync, readFileSync, statSync } from "node:fs";
|
|
10
|
+
import { dirname, parse, resolve } from "node:path";
|
|
11
|
+
import { ALL_ENGINES } from "../engines/registry.js";
|
|
12
|
+
import { getEmbeddingIndex } from "../index/embeddings.js";
|
|
13
|
+
import { buildJoernCpg } from "../index/joern.js";
|
|
14
|
+
import { buildPysaTaint } from "../index/pysa.js";
|
|
15
|
+
import { getIndexer } from "../index/scip.js";
|
|
16
|
+
import { listActive as listActiveSuppressions, suppress as suppressFinding, unsuppress as unsuppressFinding, } from "../learning/suppressions.js";
|
|
17
|
+
import { startServer } from "../mcp/server.js";
|
|
18
|
+
import { runHook } from "../hooks/claude-code.js";
|
|
19
|
+
import { formatReport as formatInstallReport, installClaudeCode, uninstallClaudeCode, } from "../install/claude-code.js";
|
|
20
|
+
import { runGate } from "../orchestrator.js";
|
|
21
|
+
import { loadPolicy, policyTemplate } from "../policy.js";
|
|
22
|
+
import { computeStats, formatHuman as formatStatsHuman, loadAuditRows, parseSince } from "../stats.js";
|
|
23
|
+
import { getLogger } from "../util/logger.js";
|
|
24
|
+
/** Walk up from `start` until we find a project-root marker
|
|
25
|
+
* (package.json | pyproject.toml | go.mod | Cargo.toml | .git | tsconfig.json).
|
|
26
|
+
* Returns the first matching directory, or `null` if none found before fs root. */
|
|
27
|
+
function detectProjectRoot(start) {
|
|
28
|
+
const markers = ["package.json", "pyproject.toml", "go.mod", "Cargo.toml", ".git", "tsconfig.json"];
|
|
29
|
+
let cur = resolve(start);
|
|
30
|
+
const root = parse(cur).root;
|
|
31
|
+
// start may be a file; if so walk up from its dir
|
|
32
|
+
if (existsSync(cur) && !cur.endsWith(root)) {
|
|
33
|
+
try {
|
|
34
|
+
const isDir = statSync(cur).isDirectory();
|
|
35
|
+
if (!isDir)
|
|
36
|
+
cur = dirname(cur);
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
cur = dirname(cur);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
while (cur !== root) {
|
|
43
|
+
for (const m of markers) {
|
|
44
|
+
if (existsSync(resolve(cur, m)))
|
|
45
|
+
return cur;
|
|
46
|
+
}
|
|
47
|
+
const parent = dirname(cur);
|
|
48
|
+
if (parent === cur)
|
|
49
|
+
break;
|
|
50
|
+
cur = parent;
|
|
51
|
+
}
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
const log = getLogger("aegis.bin");
|
|
55
|
+
const USAGE = `\
|
|
56
|
+
Aegis-v2 — real-time MCP code gate
|
|
57
|
+
|
|
58
|
+
Usage:
|
|
59
|
+
aegis install [--dry-run] [--skip-claude-md]
|
|
60
|
+
Register aegis with Claude Code:
|
|
61
|
+
- mcpServers.aegis in ~/.claude.json
|
|
62
|
+
- PreToolUse Write|Edit hook in ~/.claude/settings.json
|
|
63
|
+
- Mandatory-validate block in ~/.claude/CLAUDE.md
|
|
64
|
+
Idempotent + backed-up (<file>.bak-dravix-<ts>).
|
|
65
|
+
aegis uninstall [--dry-run] Remove every change install made; leaves
|
|
66
|
+
other user config untouched.
|
|
67
|
+
aegis mcp Start MCP server on stdio (for IDE integration).
|
|
68
|
+
aegis hook Read Claude-Code hook payload from stdin; exit 0/2.
|
|
69
|
+
aegis scan <file> Scan a file from disk; print JSON; exit 0 (ok) or 2 (block).
|
|
70
|
+
aegis index [<path>] [--force] [--embed] [--joern] [--pysa]
|
|
71
|
+
(Re)build the SCIP project index — Phase 1 cross-file context.
|
|
72
|
+
Defaults to cwd. --force ignores cache freshness.
|
|
73
|
+
--embed also builds the local semantic embedding index
|
|
74
|
+
(CodeT5+/MiniLM via @huggingface/transformers + hnswlib);
|
|
75
|
+
cold cost ~10-15s model warm-up + ~5-50ms per symbol.
|
|
76
|
+
--joern builds the Joern CPG + runs the security/logic
|
|
77
|
+
CPGQL query; cold cost 30-90s per project; cached.
|
|
78
|
+
--pysa runs Pyre/Pysa taint analysis on Python sources
|
|
79
|
+
(via WSL bridge on Windows); cold cost 30s-10min depending
|
|
80
|
+
on project size; requires pyre-check inside WSL Ubuntu.
|
|
81
|
+
aegis doctor List engines and whether they're available on this host.
|
|
82
|
+
|
|
83
|
+
aegis stats [--since 7d] [--human]
|
|
84
|
+
Read .aegis/audit.jsonl and report p50/p95
|
|
85
|
+
latency, verdict distribution, top engines/rules.
|
|
86
|
+
--since accepts Nd|Nh|Nm or an ISO 8601 date.
|
|
87
|
+
--human → pretty-printed; default JSON.
|
|
88
|
+
aegis suppress <finding_id> [--reason "..."] [--days N]
|
|
89
|
+
Hide a specific finding from the gate.
|
|
90
|
+
--days = auto-expire after N days.
|
|
91
|
+
aegis unsuppress <finding_id> Remove a previously-added suppression.
|
|
92
|
+
aegis list-suppressions [--human] Show currently-active suppressions.
|
|
93
|
+
aegis policy-init Write a starter aegis.policy.yml in cwd.
|
|
94
|
+
aegis policy-show Print the project's compiled policy (block/warn/ignore).
|
|
95
|
+
|
|
96
|
+
aegis --help Show this message.
|
|
97
|
+
aegis --version Print version.
|
|
98
|
+
|
|
99
|
+
Environment:
|
|
100
|
+
AEGIS_LOG_LEVEL debug|info|warn|error (default info, stderr)
|
|
101
|
+
AEGIS_SEMGREP_CONFIG Semgrep config (default p/default)
|
|
102
|
+
AEGIS_SEMGREP_BIN | AEGIS_PYRIGHT_BIN | AEGIS_TSC_BIN
|
|
103
|
+
Override binary discovery
|
|
104
|
+
AEGIS_SCIP_TYPESCRIPT_BIN | AEGIS_SCIP_PYTHON_BIN
|
|
105
|
+
Override SCIP indexer binaries
|
|
106
|
+
AEGIS_TOTAL_TIMEOUT_MS Overall gate budget (default 5000)
|
|
107
|
+
AEGIS_SCIP_TTL_MS How long to trust a built SCIP index (default 30 min)
|
|
108
|
+
`;
|
|
109
|
+
async function cmdIndex(argv) {
|
|
110
|
+
const force = argv.includes("--force");
|
|
111
|
+
const buildEmbed = argv.includes("--embed");
|
|
112
|
+
const buildJoern = argv.includes("--joern");
|
|
113
|
+
const buildPysa = argv.includes("--pysa");
|
|
114
|
+
const pathArg = argv.find((a) => !a.startsWith("--"));
|
|
115
|
+
const root = resolve(process.cwd(), pathArg ?? ".");
|
|
116
|
+
const indexer = getIndexer();
|
|
117
|
+
const t0 = Date.now();
|
|
118
|
+
const ok = force ? await indexer.reindex(root) : await indexer.ensureIndexed(root);
|
|
119
|
+
const elapsedMs = Date.now() - t0;
|
|
120
|
+
const meta = await indexer.meta(root);
|
|
121
|
+
// Phase 1B: build the semantic embedding index after SCIP succeeds.
|
|
122
|
+
// We pass `indexer` so build() can re-use meta + scipSha; the actual symbol
|
|
123
|
+
// ingest reads raw .scip files directly (per the EmbeddingIndex contract).
|
|
124
|
+
let embedBlock;
|
|
125
|
+
if (ok && buildEmbed) {
|
|
126
|
+
const ei = getEmbeddingIndex(root);
|
|
127
|
+
const eT0 = Date.now();
|
|
128
|
+
const embedOk = await ei.build(indexer);
|
|
129
|
+
const embedElapsedMs = Date.now() - eT0;
|
|
130
|
+
const info = ei.getInfo();
|
|
131
|
+
embedBlock = {
|
|
132
|
+
ok: embedOk,
|
|
133
|
+
elapsed_ms: embedElapsedMs,
|
|
134
|
+
...(info
|
|
135
|
+
? {
|
|
136
|
+
model: info.model,
|
|
137
|
+
dim: info.dim,
|
|
138
|
+
rows: info.rows,
|
|
139
|
+
built_at: new Date(info.built_at).toISOString(),
|
|
140
|
+
}
|
|
141
|
+
: {}),
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
// Phase 2 — Joern CPG: builds + runs the security/logic CPGQL query,
|
|
145
|
+
// writes findings.jsonl into the per-project cache dir. Joern is heavy
|
|
146
|
+
// (30-90s cold), which is why it's an explicit opt-in flag rather than
|
|
147
|
+
// running by default in `aegis index`.
|
|
148
|
+
let joernBlock;
|
|
149
|
+
if (buildJoern) {
|
|
150
|
+
const j = await buildJoernCpg(root, { force });
|
|
151
|
+
joernBlock = {
|
|
152
|
+
ok: j.ok,
|
|
153
|
+
elapsed_ms: j.durationMs,
|
|
154
|
+
findings_count: j.findingsCount,
|
|
155
|
+
cache_dir: j.cacheDir,
|
|
156
|
+
...(j.reason ? { reason: j.reason } : {}),
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
// Phase 2 — Pysa taint analysis (Python). On Windows runs via the WSL
|
|
160
|
+
// bridge in src/index/pysa.ts; on Linux/macOS runs pyre directly.
|
|
161
|
+
// Heavy (30s-10min), so opt-in via --pysa.
|
|
162
|
+
let pysaBlock;
|
|
163
|
+
if (buildPysa) {
|
|
164
|
+
const p = await buildPysaTaint(root, { force });
|
|
165
|
+
pysaBlock = {
|
|
166
|
+
ok: p.ok,
|
|
167
|
+
elapsed_ms: p.durationMs,
|
|
168
|
+
findings_count: p.findingsCount,
|
|
169
|
+
cache_dir: p.cacheDir,
|
|
170
|
+
...(p.reason ? { reason: p.reason } : {}),
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
process.stdout.write(JSON.stringify({
|
|
174
|
+
ok,
|
|
175
|
+
root,
|
|
176
|
+
elapsed_ms: elapsedMs,
|
|
177
|
+
...(meta
|
|
178
|
+
? {
|
|
179
|
+
languages: meta.languages,
|
|
180
|
+
documents: meta.documents,
|
|
181
|
+
symbols: meta.symbols,
|
|
182
|
+
built_at: new Date(meta.builtAt).toISOString(),
|
|
183
|
+
}
|
|
184
|
+
: {}),
|
|
185
|
+
...(embedBlock ? { embed: embedBlock } : {}),
|
|
186
|
+
...(joernBlock ? { joern: joernBlock } : {}),
|
|
187
|
+
...(pysaBlock ? { pysa: pysaBlock } : {}),
|
|
188
|
+
}, null, 2) + "\n");
|
|
189
|
+
return ok ? 0 : 3;
|
|
190
|
+
}
|
|
191
|
+
async function cmdDoctor() {
|
|
192
|
+
const rows = [];
|
|
193
|
+
for (const e of ALL_ENGINES) {
|
|
194
|
+
const ok = await e.available();
|
|
195
|
+
rows.push({
|
|
196
|
+
engine: e.name,
|
|
197
|
+
available: ok,
|
|
198
|
+
langs: e.languages === "all" ? "all" : [...e.languages].join(","),
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
process.stdout.write(JSON.stringify({ engines: rows }, null, 2) + "\n");
|
|
202
|
+
return 0;
|
|
203
|
+
}
|
|
204
|
+
async function cmdScan(filePath) {
|
|
205
|
+
if (!filePath) {
|
|
206
|
+
process.stderr.write("aegis scan: missing <file>\n");
|
|
207
|
+
return 64;
|
|
208
|
+
}
|
|
209
|
+
const abs = resolve(process.cwd(), filePath);
|
|
210
|
+
let content;
|
|
211
|
+
try {
|
|
212
|
+
content = readFileSync(abs, "utf8");
|
|
213
|
+
}
|
|
214
|
+
catch (err) {
|
|
215
|
+
process.stderr.write(`aegis scan: cannot read ${abs}: ${String(err)}\n`);
|
|
216
|
+
return 66;
|
|
217
|
+
}
|
|
218
|
+
// For `aegis scan` (ad-hoc CLI): detect the file's OWN project root
|
|
219
|
+
// (walk up to package.json / tsconfig / .git / etc.) so that the SCIP
|
|
220
|
+
// index lookup actually hits — process.cwd() is rarely the right answer
|
|
221
|
+
// when the user passes an absolute path to a file in a different repo.
|
|
222
|
+
// We do NOT enforce containment since the user explicitly chose the file.
|
|
223
|
+
const detectedRoot = detectProjectRoot(abs) ?? process.cwd();
|
|
224
|
+
const report = await runGate({
|
|
225
|
+
filePath: abs,
|
|
226
|
+
content,
|
|
227
|
+
projectRoot: detectedRoot,
|
|
228
|
+
enforceContainment: false,
|
|
229
|
+
});
|
|
230
|
+
// Drain telemetry buffer before exit — each `aegis scan` is a fresh
|
|
231
|
+
// process, so without an explicit flush the in-memory buffer dies with it.
|
|
232
|
+
try {
|
|
233
|
+
const { flush } = await import("../telemetry/collector.js");
|
|
234
|
+
await flush();
|
|
235
|
+
}
|
|
236
|
+
catch (err) {
|
|
237
|
+
log.debug("scan telemetry flush failed", { err: String(err) });
|
|
238
|
+
}
|
|
239
|
+
process.stdout.write(JSON.stringify({
|
|
240
|
+
verdict: report.decision.action,
|
|
241
|
+
summary: report.decision.summary,
|
|
242
|
+
duration_ms: report.durationMs,
|
|
243
|
+
truncated: report.truncated,
|
|
244
|
+
n_findings: report.findings.length,
|
|
245
|
+
findings: report.findings,
|
|
246
|
+
...(report.projectContext ? { project_context: report.projectContext } : {}),
|
|
247
|
+
}, null, 2) + "\n");
|
|
248
|
+
return report.decision.action === "block" ? 2 : 0;
|
|
249
|
+
}
|
|
250
|
+
// ── Phase 3 productionization commands ───────────────────────────────────
|
|
251
|
+
function flagValue(argv, flag) {
|
|
252
|
+
const i = argv.indexOf(flag);
|
|
253
|
+
if (i < 0 || i === argv.length - 1)
|
|
254
|
+
return null;
|
|
255
|
+
const v = argv[i + 1] ?? "";
|
|
256
|
+
return v.startsWith("--") ? null : v;
|
|
257
|
+
}
|
|
258
|
+
async function cmdStats(argv) {
|
|
259
|
+
const human = argv.includes("--human");
|
|
260
|
+
const sinceVal = flagValue(argv, "--since");
|
|
261
|
+
const sinceMs = parseSince(sinceVal);
|
|
262
|
+
if (sinceVal && sinceMs === null) {
|
|
263
|
+
process.stderr.write(`aegis stats: unparseable --since value: ${sinceVal}\n`);
|
|
264
|
+
return 64;
|
|
265
|
+
}
|
|
266
|
+
const root = detectProjectRoot(process.cwd()) ?? process.cwd();
|
|
267
|
+
const rows = loadAuditRows(root);
|
|
268
|
+
const report = computeStats(rows, { ...(sinceMs !== null ? { sinceMs } : {}) });
|
|
269
|
+
if (human) {
|
|
270
|
+
process.stdout.write(formatStatsHuman(report) + "\n");
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
process.stdout.write(JSON.stringify(report, null, 2) + "\n");
|
|
274
|
+
}
|
|
275
|
+
return 0;
|
|
276
|
+
}
|
|
277
|
+
async function cmdSuppress(argv) {
|
|
278
|
+
const id = argv.find((a) => !a.startsWith("--"));
|
|
279
|
+
if (!id) {
|
|
280
|
+
process.stderr.write("aegis suppress: missing <finding_id>\n");
|
|
281
|
+
return 64;
|
|
282
|
+
}
|
|
283
|
+
const reason = flagValue(argv, "--reason") ?? undefined;
|
|
284
|
+
const daysStr = flagValue(argv, "--days");
|
|
285
|
+
let expiresAt;
|
|
286
|
+
if (daysStr) {
|
|
287
|
+
const n = Number(daysStr);
|
|
288
|
+
if (!Number.isFinite(n) || n <= 0) {
|
|
289
|
+
process.stderr.write(`aegis suppress: --days must be a positive number, got: ${daysStr}\n`);
|
|
290
|
+
return 64;
|
|
291
|
+
}
|
|
292
|
+
expiresAt = new Date(Date.now() + n * 86_400_000).toISOString();
|
|
293
|
+
}
|
|
294
|
+
const root = detectProjectRoot(process.cwd()) ?? process.cwd();
|
|
295
|
+
const who = process.env.USER || process.env.USERNAME || undefined;
|
|
296
|
+
const opts = {};
|
|
297
|
+
if (reason)
|
|
298
|
+
opts.reason = reason;
|
|
299
|
+
if (expiresAt)
|
|
300
|
+
opts.expiresAt = expiresAt;
|
|
301
|
+
if (who)
|
|
302
|
+
opts.who = who;
|
|
303
|
+
const res = suppressFinding(root, id, opts);
|
|
304
|
+
if (!res.ok) {
|
|
305
|
+
process.stderr.write(`aegis suppress: ${res.reason}\n`);
|
|
306
|
+
return 65;
|
|
307
|
+
}
|
|
308
|
+
process.stdout.write(JSON.stringify({ ok: true, project_root: root, suppressed: res.entry }, null, 2) + "\n");
|
|
309
|
+
return 0;
|
|
310
|
+
}
|
|
311
|
+
async function cmdUnsuppress(argv) {
|
|
312
|
+
const id = argv.find((a) => !a.startsWith("--"));
|
|
313
|
+
if (!id) {
|
|
314
|
+
process.stderr.write("aegis unsuppress: missing <finding_id>\n");
|
|
315
|
+
return 64;
|
|
316
|
+
}
|
|
317
|
+
const root = detectProjectRoot(process.cwd()) ?? process.cwd();
|
|
318
|
+
const who = process.env.USER || process.env.USERNAME || undefined;
|
|
319
|
+
const opts = {};
|
|
320
|
+
if (who)
|
|
321
|
+
opts.who = who;
|
|
322
|
+
const res = unsuppressFinding(root, id, opts);
|
|
323
|
+
if (!res.ok) {
|
|
324
|
+
process.stderr.write(`aegis unsuppress: ${res.reason}\n`);
|
|
325
|
+
return 65;
|
|
326
|
+
}
|
|
327
|
+
process.stdout.write(JSON.stringify({ ok: true, project_root: root, removed: res.entry }, null, 2) + "\n");
|
|
328
|
+
return 0;
|
|
329
|
+
}
|
|
330
|
+
async function cmdListSuppressions(argv) {
|
|
331
|
+
const root = detectProjectRoot(process.cwd()) ?? process.cwd();
|
|
332
|
+
const active = listActiveSuppressions(root);
|
|
333
|
+
const human = argv.includes("--human");
|
|
334
|
+
if (human) {
|
|
335
|
+
if (active.length === 0) {
|
|
336
|
+
process.stdout.write("(no active suppressions)\n");
|
|
337
|
+
return 0;
|
|
338
|
+
}
|
|
339
|
+
process.stdout.write(`Active suppressions in ${root}:\n`);
|
|
340
|
+
for (const s of active) {
|
|
341
|
+
process.stdout.write(` ${s.id} added=${s.added_at}` +
|
|
342
|
+
(s.expires_at ? ` expires=${s.expires_at}` : "") +
|
|
343
|
+
(s.reason ? ` reason="${s.reason}"` : "") +
|
|
344
|
+
(s.who ? ` by=${s.who}` : "") +
|
|
345
|
+
"\n");
|
|
346
|
+
}
|
|
347
|
+
return 0;
|
|
348
|
+
}
|
|
349
|
+
process.stdout.write(JSON.stringify({ project_root: root, count: active.length, active }, null, 2) + "\n");
|
|
350
|
+
return 0;
|
|
351
|
+
}
|
|
352
|
+
async function cmdPolicyInit() {
|
|
353
|
+
const { writeFileSync, existsSync: exists } = await import("node:fs");
|
|
354
|
+
const root = detectProjectRoot(process.cwd()) ?? process.cwd();
|
|
355
|
+
const dest = resolve(root, "aegis.policy.yml");
|
|
356
|
+
if (exists(dest)) {
|
|
357
|
+
process.stderr.write(`aegis policy-init: refused — ${dest} already exists\n`);
|
|
358
|
+
return 65;
|
|
359
|
+
}
|
|
360
|
+
writeFileSync(dest, policyTemplate(), "utf8");
|
|
361
|
+
process.stdout.write(JSON.stringify({ ok: true, wrote: dest }, null, 2) + "\n");
|
|
362
|
+
return 0;
|
|
363
|
+
}
|
|
364
|
+
async function cmdTelemetry(argv) {
|
|
365
|
+
const sub = argv[0] ?? "status";
|
|
366
|
+
const { readConsent, writeConsent } = await import("../telemetry/consent.js");
|
|
367
|
+
const { getInstallationId } = await import("../telemetry/installation.js");
|
|
368
|
+
const { flush, stats } = await import("../telemetry/collector.js");
|
|
369
|
+
const { postOptOut, deleteAllData } = await import("../telemetry/uploader.js");
|
|
370
|
+
switch (sub) {
|
|
371
|
+
case "status": {
|
|
372
|
+
const s = readConsent();
|
|
373
|
+
const id = getInstallationId();
|
|
374
|
+
const buf = stats();
|
|
375
|
+
process.stdout.write(JSON.stringify({
|
|
376
|
+
enabled: s.enabled,
|
|
377
|
+
consented_at: s.consented_at ?? null,
|
|
378
|
+
source: s.source ?? null,
|
|
379
|
+
installation_id: id,
|
|
380
|
+
buffered: buf,
|
|
381
|
+
endpoint: process.env.AEGIS_TELEMETRY_ENDPOINT ?? "https://aegis-api.fixme-now.com",
|
|
382
|
+
}, null, 2) + "\n");
|
|
383
|
+
return 0;
|
|
384
|
+
}
|
|
385
|
+
case "on": {
|
|
386
|
+
writeConsent(true, "cli");
|
|
387
|
+
process.stdout.write(JSON.stringify({ ok: true, enabled: true }) + "\n");
|
|
388
|
+
return 0;
|
|
389
|
+
}
|
|
390
|
+
case "off": {
|
|
391
|
+
writeConsent(false, "cli");
|
|
392
|
+
const res = await postOptOut("user_cli_disable");
|
|
393
|
+
process.stdout.write(JSON.stringify({ ok: true, enabled: false, server_notified: res.ok }) + "\n");
|
|
394
|
+
return 0;
|
|
395
|
+
}
|
|
396
|
+
case "flush": {
|
|
397
|
+
await flush();
|
|
398
|
+
process.stdout.write(JSON.stringify({ ok: true }) + "\n");
|
|
399
|
+
return 0;
|
|
400
|
+
}
|
|
401
|
+
case "delete": {
|
|
402
|
+
writeConsent(false, "cli");
|
|
403
|
+
const res = await deleteAllData();
|
|
404
|
+
process.stdout.write(JSON.stringify({ ok: res.ok, deleted: res.ok }) + "\n");
|
|
405
|
+
return res.ok ? 0 : 70;
|
|
406
|
+
}
|
|
407
|
+
default:
|
|
408
|
+
process.stderr.write(`aegis telemetry: unknown subcommand "${sub}". use: status | on | off | flush | delete\n`);
|
|
409
|
+
return 64;
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
async function cmdPolicyShow() {
|
|
413
|
+
const root = detectProjectRoot(process.cwd()) ?? process.cwd();
|
|
414
|
+
const policy = loadPolicy(root);
|
|
415
|
+
process.stdout.write(JSON.stringify({
|
|
416
|
+
project_root: root,
|
|
417
|
+
source_path: policy.sourcePath,
|
|
418
|
+
block: [...policy.block],
|
|
419
|
+
warn: [...policy.warn],
|
|
420
|
+
ignore: [...policy.ignore],
|
|
421
|
+
}, null, 2) + "\n");
|
|
422
|
+
return 0;
|
|
423
|
+
}
|
|
424
|
+
async function cmdInstall(argv) {
|
|
425
|
+
const dryRun = argv.includes("--dry-run");
|
|
426
|
+
const skipClaudeMd = argv.includes("--skip-claude-md");
|
|
427
|
+
const report = installClaudeCode({ dryRun, skipClaudeMd });
|
|
428
|
+
process.stdout.write(formatInstallReport(report) + "\n");
|
|
429
|
+
return 0;
|
|
430
|
+
}
|
|
431
|
+
async function cmdUninstall(argv) {
|
|
432
|
+
const dryRun = argv.includes("--dry-run");
|
|
433
|
+
const report = uninstallClaudeCode({ dryRun });
|
|
434
|
+
process.stdout.write(formatInstallReport(report) + "\n");
|
|
435
|
+
return 0;
|
|
436
|
+
}
|
|
437
|
+
async function main() {
|
|
438
|
+
const argv = process.argv.slice(2);
|
|
439
|
+
if (argv.length === 0 || argv[0] === "--help" || argv[0] === "-h") {
|
|
440
|
+
process.stdout.write(USAGE);
|
|
441
|
+
return 0;
|
|
442
|
+
}
|
|
443
|
+
if (argv[0] === "--version") {
|
|
444
|
+
process.stdout.write("0.1.0\n");
|
|
445
|
+
return 0;
|
|
446
|
+
}
|
|
447
|
+
switch (argv[0]) {
|
|
448
|
+
case "mcp":
|
|
449
|
+
await startServer();
|
|
450
|
+
return 0;
|
|
451
|
+
case "hook":
|
|
452
|
+
await runHook(); // calls process.exit() itself
|
|
453
|
+
return 0; // unreachable
|
|
454
|
+
case "scan":
|
|
455
|
+
return cmdScan(argv[1]);
|
|
456
|
+
case "index":
|
|
457
|
+
return cmdIndex(argv.slice(1));
|
|
458
|
+
case "doctor":
|
|
459
|
+
return cmdDoctor();
|
|
460
|
+
case "stats":
|
|
461
|
+
return cmdStats(argv.slice(1));
|
|
462
|
+
case "suppress":
|
|
463
|
+
return cmdSuppress(argv.slice(1));
|
|
464
|
+
case "unsuppress":
|
|
465
|
+
return cmdUnsuppress(argv.slice(1));
|
|
466
|
+
case "list-suppressions":
|
|
467
|
+
return cmdListSuppressions(argv.slice(1));
|
|
468
|
+
case "policy-init":
|
|
469
|
+
return cmdPolicyInit();
|
|
470
|
+
case "policy-show":
|
|
471
|
+
return cmdPolicyShow();
|
|
472
|
+
case "telemetry":
|
|
473
|
+
return cmdTelemetry(argv.slice(1));
|
|
474
|
+
case "install":
|
|
475
|
+
return cmdInstall(argv.slice(1));
|
|
476
|
+
case "uninstall":
|
|
477
|
+
return cmdUninstall(argv.slice(1));
|
|
478
|
+
default:
|
|
479
|
+
process.stderr.write(`unknown subcommand: ${argv[0]}\n${USAGE}`);
|
|
480
|
+
return 64;
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
main()
|
|
484
|
+
.then((code) => process.exit(code))
|
|
485
|
+
.catch((err) => {
|
|
486
|
+
log.error("CLI crash", { err: String(err) });
|
|
487
|
+
process.exit(70);
|
|
488
|
+
});
|
|
489
|
+
//# sourceMappingURL=aegis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aegis.js","sourceRoot":"","sources":["../../src/bin/aegis.ts"],"names":[],"mappings":";AACA;;;;;;GAMG;AACH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EACL,UAAU,IAAI,sBAAsB,EACpC,QAAQ,IAAI,eAAe,EAC3B,UAAU,IAAI,iBAAiB,GAChC,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EACL,YAAY,IAAI,mBAAmB,EACnC,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,WAAW,IAAI,gBAAgB,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACvG,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C;;mFAEmF;AACnF,SAAS,iBAAiB,CAAC,KAAa;IACtC,MAAM,OAAO,GAAG,CAAC,cAAc,EAAE,gBAAgB,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC;IACpG,IAAI,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IACzB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;IAC7B,kDAAkD;IAClD,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3C,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;YAC1C,IAAI,CAAC,KAAK;gBAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IACD,OAAO,GAAG,KAAK,IAAI,EAAE,CAAC;QACpB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBAAE,OAAO,GAAG,CAAC;QAC9C,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,GAAG;YAAE,MAAM;QAC1B,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,GAAG,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC;AAEnC,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqDb,CAAC;AAEF,KAAK,UAAU,QAAQ,CAAC,IAAc;IACpC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,IAAI,GAAG,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACtB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IACnF,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;IAClC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEtC,oEAAoE;IACpE,4EAA4E;IAC5E,2EAA2E;IAC3E,IAAI,UAA+C,CAAC;IACpD,IAAI,EAAE,IAAI,UAAU,EAAE,CAAC;QACrB,MAAM,EAAE,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC;QACxC,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;QAC1B,UAAU,GAAG;YACX,EAAE,EAAE,OAAO;YACX,UAAU,EAAE,cAAc;YAC1B,GAAG,CAAC,IAAI;gBACN,CAAC,CAAC;oBACE,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,GAAG,EAAE,IAAI,CAAC,GAAG;oBACb,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,QAAQ,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE;iBAChD;gBACH,CAAC,CAAC,EAAE,CAAC;SACR,CAAC;IACJ,CAAC;IAED,qEAAqE;IACrE,uEAAuE;IACvE,uEAAuE;IACvE,uCAAuC;IACvC,IAAI,UAA+C,CAAC;IACpD,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,CAAC,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/C,UAAU,GAAG;YACX,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,cAAc,EAAE,CAAC,CAAC,aAAa;YAC/B,SAAS,EAAE,CAAC,CAAC,QAAQ;YACrB,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1C,CAAC;IACJ,CAAC;IAED,sEAAsE;IACtE,kEAAkE;IAClE,2CAA2C;IAC3C,IAAI,SAA8C,CAAC;IACnD,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,CAAC,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAChD,SAAS,GAAG;YACV,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,cAAc,EAAE,CAAC,CAAC,aAAa;YAC/B,SAAS,EAAE,CAAC,CAAC,QAAQ;YACrB,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1C,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,IAAI,CAAC,SAAS,CACZ;QACE,EAAE;QACF,IAAI;QACJ,UAAU,EAAE,SAAS;QACrB,GAAG,CAAC,IAAI;YACN,CAAC,CAAC;gBACE,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,QAAQ,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE;aAC/C;YACH,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5C,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5C,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1C,EACD,IAAI,EACJ,CAAC,CACF,GAAG,IAAI,CACT,CAAC;IACF,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC;AAED,KAAK,UAAU,SAAS;IACtB,MAAM,IAAI,GAAiE,EAAE,CAAC;IAC9E,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QAC5B,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI,CAAC;YACR,MAAM,EAAE,CAAC,CAAC,IAAI;YACd,SAAS,EAAE,EAAE;YACb,KAAK,EAAE,CAAC,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;SAClE,CAAC,CAAC;IACL,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACxE,OAAO,CAAC,CAAC;AACX,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,QAA4B;IACjD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;QACrD,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC7C,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,GAAG,KAAK,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzE,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,oEAAoE;IACpE,sEAAsE;IACtE,wEAAwE;IACxE,uEAAuE;IACvE,0EAA0E;IAC1E,MAAM,YAAY,GAAG,iBAAiB,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC7D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC;QAC3B,QAAQ,EAAE,GAAG;QACb,OAAO;QACP,WAAW,EAAE,YAAY;QACzB,kBAAkB,EAAE,KAAK;KAC1B,CAAC,CAAC;IACH,oEAAoE;IACpE,2EAA2E;IAC3E,IAAI,CAAC;QACH,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;QAC5D,MAAM,KAAK,EAAE,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,KAAK,CAAC,6BAA6B,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,IAAI,CAAC,SAAS,CACZ;QACE,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM;QAC/B,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO;QAChC,WAAW,EAAE,MAAM,CAAC,UAAU;QAC9B,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM;QAClC,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC7E,EACD,IAAI,EACJ,CAAC,CACF,GAAG,IAAI,CACT,CAAC;IACF,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,4EAA4E;AAE5E,SAAS,SAAS,CAAC,IAAc,EAAE,IAAY;IAC7C,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAChD,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5B,OAAO,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACvC,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,IAAc;IACpC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IACrC,IAAI,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACjC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2CAA2C,QAAQ,IAAI,CAAC,CAAC;QAC9E,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/D,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAChF,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;IACxD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,IAAc;IACvC,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IACjD,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC/D,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,SAAS,CAAC;IACxD,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC1C,IAAI,SAA6B,CAAC;IAClC,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAC1B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0DAA0D,OAAO,IAAI,CAAC,CAAC;YAC5F,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;IAClE,CAAC;IACD,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,SAAS,CAAC;IAClE,MAAM,IAAI,GAA2B,EAAE,CAAC;IACxC,IAAI,MAAM;QAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACjC,IAAI,SAAS;QAAE,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC1C,IAAI,GAAG;QAAE,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACxB,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IAC5C,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;QACxD,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CACxF,CAAC;IACF,OAAO,CAAC,CAAC;AACX,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,IAAc;IACzC,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IACjD,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;QACjE,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,SAAS,CAAC;IAClE,MAAM,IAAI,GAA2B,EAAE,CAAC;IACxC,IAAI,GAAG;QAAE,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACxB,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IAC9C,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;QAC1D,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CACrF,CAAC;IACF,OAAO,CAAC,CAAC;AACX,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,IAAc;IAC/C,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/D,MAAM,MAAM,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACvC,IAAI,KAAK,EAAE,CAAC;QACV,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;YACnD,OAAO,CAAC,CAAC;QACX,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,IAAI,KAAK,CAAC,CAAC;QAC1D,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,QAAQ,EAAE;gBAC9B,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjD,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1C,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9B,IAAI,CACP,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,IAAI,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CACrF,CAAC;IACF,OAAO,CAAC,CAAC;AACX,CAAC;AAED,KAAK,UAAU,aAAa;IAC1B,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;IACtE,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/D,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;IAC/C,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,IAAI,mBAAmB,CAAC,CAAC;QAC9E,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,aAAa,CAAC,IAAI,EAAE,cAAc,EAAE,EAAE,MAAM,CAAC,CAAC;IAC9C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAChF,OAAO,CAAC,CAAC;AACX,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,IAAc;IACxC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC;IAChC,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;IAC9E,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,8BAA8B,CAAC,CAAC;IAC3E,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;IACnE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAC;IAC/E,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,CAAC,GAAG,WAAW,EAAE,CAAC;YACxB,MAAM,EAAE,GAAG,iBAAiB,EAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,KAAK,EAAE,CAAC;YACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,IAAI,CAAC,SAAS,CACZ;gBACE,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,YAAY,EAAE,CAAC,CAAC,YAAY,IAAI,IAAI;gBACpC,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,IAAI;gBACxB,eAAe,EAAE,EAAE;gBACnB,QAAQ,EAAE,GAAG;gBACb,QAAQ,EACN,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,iCAAiC;aAC5E,EACD,IAAI,EACJ,CAAC,CACF,GAAG,IAAI,CACT,CAAC;YACF,OAAO,CAAC,CAAC;QACX,CAAC;QACD,KAAK,IAAI,CAAC,CAAC,CAAC;YACV,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;YACzE,OAAO,CAAC,CAAC;QACX,CAAC;QACD,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC3B,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,kBAAkB,CAAC,CAAC;YACjD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAC7E,CAAC;YACF,OAAO,CAAC,CAAC;QACX,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,KAAK,EAAE,CAAC;YACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;YAC1D,OAAO,CAAC,CAAC;QACX,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC3B,MAAM,GAAG,GAAG,MAAM,aAAa,EAAE,CAAC;YAClC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;YAC7E,OAAO,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACzB,CAAC;QACD;YACE,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,wCAAwC,GAAG,8CAA8C,CAC1F,CAAC;YACF,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,aAAa;IAC1B,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/D,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAChC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,IAAI,CAAC,SAAS,CACZ;QACE,YAAY,EAAE,IAAI;QAClB,WAAW,EAAE,MAAM,CAAC,UAAU;QAC9B,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;QACxB,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC;QACtB,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;KAC3B,EACD,IAAI,EACJ,CAAC,CACF,GAAG,IAAI,CACT,CAAC;IACF,OAAO,CAAC,CAAC;AACX,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,IAAc;IACtC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC1C,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,iBAAiB,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;IAC3D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;IACzD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,IAAc;IACxC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;IACzD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAClE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5B,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,WAAW,EAAE,CAAC;QAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAChC,OAAO,CAAC,CAAC;IACX,CAAC;IACD,QAAQ,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAChB,KAAK,KAAK;YACR,MAAM,WAAW,EAAE,CAAC;YACpB,OAAO,CAAC,CAAC;QACX,KAAK,MAAM;YACT,MAAM,OAAO,EAAE,CAAC,CAAC,8BAA8B;YAC/C,OAAO,CAAC,CAAC,CAAC,cAAc;QAC1B,KAAK,MAAM;YACT,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1B,KAAK,OAAO;YACV,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACjC,KAAK,QAAQ;YACX,OAAO,SAAS,EAAE,CAAC;QACrB,KAAK,OAAO;YACV,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACjC,KAAK,UAAU;YACb,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACpC,KAAK,YAAY;YACf,OAAO,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACtC,KAAK,mBAAmB;YACtB,OAAO,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5C,KAAK,aAAa;YAChB,OAAO,aAAa,EAAE,CAAC;QACzB,KAAK,aAAa;YAChB,OAAO,aAAa,EAAE,CAAC;QACzB,KAAK,WAAW;YACd,OAAO,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,KAAK,SAAS;YACZ,OAAO,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,KAAK,WAAW;YACd,OAAO,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC;YACE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;YACjE,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED,IAAI,EAAE;KACH,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KAClC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACb,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7C,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACnB,CAAC,CAAC,CAAC"}
|
package/dist/cache.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare class Cache {
|
|
2
|
+
private readonly projectRoot?;
|
|
3
|
+
constructor(projectRoot?: string | undefined);
|
|
4
|
+
get<T>(key: string): Promise<T | undefined>;
|
|
5
|
+
put<T>(key: string, value: T, ttlMs?: number): Promise<void>;
|
|
6
|
+
delete(key: string): Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
export declare function cacheKeyForEngine(engine: string, lang: string, content: string): string;
|
|
9
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAoIA,qBAAa,KAAK;IACJ,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;gBAAZ,WAAW,CAAC,EAAE,MAAM,YAAA;IAE3C,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAK3C,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK5D,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAIzC;AAID,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAUvF"}
|