@creeperhost/modlens-mcp 1.6.20 → 1.6.21

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.
Files changed (91) hide show
  1. package/ATTRIBUTION.md +8 -1
  2. package/README.md +67 -0
  3. package/RUNTIME.md +262 -0
  4. package/TESTING.md +8 -0
  5. package/dist/hosted-mod-license.d.ts +36 -0
  6. package/dist/hosted-mod-license.d.ts.map +1 -0
  7. package/dist/hosted-mod-license.js +65 -0
  8. package/dist/hosted-mod-license.js.map +1 -0
  9. package/dist/hosted-policy.d.ts +32 -0
  10. package/dist/hosted-policy.d.ts.map +1 -0
  11. package/dist/hosted-policy.js +257 -0
  12. package/dist/hosted-policy.js.map +1 -0
  13. package/dist/launcher.js +104 -89
  14. package/dist/launcher.js.map +1 -1
  15. package/dist/license-notices.d.ts +8 -0
  16. package/dist/license-notices.d.ts.map +1 -0
  17. package/dist/license-notices.js +10 -0
  18. package/dist/license-notices.js.map +1 -0
  19. package/dist/license-source-references.d.ts +12 -0
  20. package/dist/license-source-references.d.ts.map +1 -0
  21. package/dist/license-source-references.js +18 -0
  22. package/dist/license-source-references.js.map +1 -0
  23. package/dist/license-templates.d.ts +6 -0
  24. package/dist/license-templates.d.ts.map +1 -0
  25. package/dist/license-templates.js +55 -0
  26. package/dist/license-templates.js.map +1 -0
  27. package/dist/local-mod.d.ts +31 -0
  28. package/dist/local-mod.d.ts.map +1 -0
  29. package/dist/local-mod.js +71 -0
  30. package/dist/local-mod.js.map +1 -0
  31. package/dist/mod-license.d.ts +53 -0
  32. package/dist/mod-license.d.ts.map +1 -0
  33. package/dist/mod-license.js +617 -0
  34. package/dist/mod-license.js.map +1 -0
  35. package/dist/runtime/cli.d.ts +2 -0
  36. package/dist/runtime/cli.d.ts.map +1 -0
  37. package/dist/runtime/cli.js +163 -0
  38. package/dist/runtime/cli.js.map +1 -0
  39. package/dist/runtime/companion.d.ts +32 -0
  40. package/dist/runtime/companion.d.ts.map +1 -0
  41. package/dist/runtime/companion.js +135 -0
  42. package/dist/runtime/companion.js.map +1 -0
  43. package/dist/runtime/guidance.d.ts +73 -0
  44. package/dist/runtime/guidance.d.ts.map +1 -0
  45. package/dist/runtime/guidance.js +40 -0
  46. package/dist/runtime/guidance.js.map +1 -0
  47. package/dist/runtime/hub.d.ts +150 -0
  48. package/dist/runtime/hub.d.ts.map +1 -0
  49. package/dist/runtime/hub.js +561 -0
  50. package/dist/runtime/hub.js.map +1 -0
  51. package/dist/runtime/modlens-agent.jar +0 -0
  52. package/dist/runtime/protocol.d.ts +202 -0
  53. package/dist/runtime/protocol.d.ts.map +1 -0
  54. package/dist/runtime/protocol.js +91 -0
  55. package/dist/runtime/protocol.js.map +1 -0
  56. package/dist/runtime/requests.d.ts +367 -0
  57. package/dist/runtime/requests.d.ts.map +1 -0
  58. package/dist/runtime/requests.js +57 -0
  59. package/dist/runtime/requests.js.map +1 -0
  60. package/dist/server.js +125 -36
  61. package/dist/server.js.map +1 -1
  62. package/dist/tools/project.d.ts +7 -3
  63. package/dist/tools/project.d.ts.map +1 -1
  64. package/dist/tools/project.js +45 -3
  65. package/dist/tools/project.js.map +1 -1
  66. package/dist/tools/report-issue.d.ts +77 -0
  67. package/dist/tools/report-issue.d.ts.map +1 -0
  68. package/dist/tools/report-issue.js +92 -0
  69. package/dist/tools/report-issue.js.map +1 -0
  70. package/dist/tools/runtime.d.ts +6 -0
  71. package/dist/tools/runtime.d.ts.map +1 -0
  72. package/dist/tools/runtime.js +18 -0
  73. package/dist/tools/runtime.js.map +1 -0
  74. package/dist/tools/source.d.ts +1 -1
  75. package/dist/tools/source.d.ts.map +1 -1
  76. package/dist/tools/source.js +5 -1
  77. package/dist/tools/source.js.map +1 -1
  78. package/package.json +4 -1
  79. package/scripts/build-runtime-agent.mjs +64 -0
  80. package/scripts/fixtures/mod-license-corpus.json +154 -0
  81. package/scripts/gradle/modlens-runtime.init.gradle +17 -0
  82. package/scripts/runtime-test-client.mjs +36 -0
  83. package/scripts/test-hosted-policy.mjs +123 -0
  84. package/scripts/test-mod-licenses-live.mjs +86 -0
  85. package/scripts/test-package.mjs +44 -0
  86. package/scripts/test-project-http.mjs +46 -3
  87. package/scripts/test-runtime-gradle.mjs +107 -0
  88. package/scripts/test-runtime-minecraft.mjs +190 -0
  89. package/scripts/test-runtime-native.mjs +120 -0
  90. package/scripts/test-runtime-remote.mjs +209 -0
  91. package/scripts/update-license-templates.mjs +14 -0
@@ -0,0 +1,257 @@
1
+ import { createHash, timingSafeEqual } from "node:crypto";
2
+ import { getDb } from "./db.js";
3
+ import { guardHostedMod, attachLicenseNotices } from "./hosted-mod-license.js";
4
+ export function hostedLimits(env = process.env) {
5
+ const number = (key, fallback) => {
6
+ if (env[key] === undefined)
7
+ return fallback;
8
+ const value = Number(env[key]);
9
+ if (!Number.isSafeInteger(value) || value < 1 || value > 1_000_000_000) {
10
+ throw new Error(`${key} must be a positive integer no larger than 1000000000`);
11
+ }
12
+ return value;
13
+ };
14
+ return {
15
+ lines: number("MODLENS_HOSTED_SOURCE_LINES", 200),
16
+ responseBytes: number("MODLENS_HOSTED_RESPONSE_BYTES", 128 * 1024),
17
+ dailyBytes: number("MODLENS_HOSTED_DAILY_BYTES", 5 * 1024 * 1024),
18
+ periodBytes: number("MODLENS_HOSTED_PERIOD_BYTES", 50 * 1024 * 1024),
19
+ dailyRequests: number("MODLENS_HOSTED_DAILY_REQUESTS", 1000),
20
+ minuteRequests: number("MODLENS_HOSTED_MINUTE_REQUESTS", 120),
21
+ };
22
+ }
23
+ export class HostedPolicyError extends Error {
24
+ }
25
+ /** Only an authenticated gateway may choose the stable account identifier. */
26
+ export function hostedPrincipal(headers, secret) {
27
+ if (!secret)
28
+ return "shared"; // Never trust user-supplied IDs, bearer tokens, IPs or session IDs.
29
+ const provided = headers["x-modlens-proxy-secret"];
30
+ const user = headers["x-modlens-user-id"];
31
+ const digest = (value) => createHash("sha256").update(value).digest();
32
+ if (typeof provided !== "string" || !timingSafeEqual(digest(provided), digest(secret))
33
+ || typeof user !== "string" || !user.trim() || user.length > 256 || /[\r\n\x00]/.test(user)) {
34
+ throw new HostedPolicyError("Authenticated gateway identity required.");
35
+ }
36
+ return digest(user).toString("hex");
37
+ }
38
+ // Fail closed: new tools/actions must be reviewed before becoming remotely available.
39
+ // Cache population and filesystem/registry administration stay on the operator's local interface.
40
+ export const HOSTED_ACTIONS = {
41
+ report_issue: ["help", "prepare"],
42
+ runtime: ["help", "setup", "status", "sessions", "launch", "events", "command", "artifact"],
43
+ mod_license: ["check", "local_plan"],
44
+ mod: ["get", "search", "dependencies", "dep_graph", "version_conflicts", "source_urls", "decompile_class", "source", "search_source", "search_indexed", "search_semantic", "graph_query", "graph_report"],
45
+ mod_bytecode: ["search_class", "class_members", "bytecode", "find_refs", "cross_refs", "inheritance", "diff", "diff_detailed", "find_implementors", "scan_registrations", "annotated_by", "event_listeners", "optional_integrations", "network_payloads", "config_schema"],
46
+ mod_mixins: ["targets", "resolve", "conflicts", "targets_in_package", "at_conflicts", "at_entries", "aw_entries"],
47
+ platform: ["search", "check_updates", "batch_check_updates"],
48
+ modpacks_ch: ["search", "featured", "info", "manifest", "resolve_pack", "list_versions", "search_mods", "mod_info", "search_ftb_mods", "ftb_mod_info", "list_pack_versions", "list_pack_files", "find_mod_in_packs"],
49
+ mc_versions: ["list_mc", "list_neoforge", "list_forge", "list_fabric"],
50
+ mc_source: ["search_class", "get_source", "bytecode", "class_members", "find_refs", "inheritance", "diff", "diff_detailed", "search_code", "search_indexed", "search_events", "validate_aw", "analyze_mixin", "search_semantic"],
51
+ mappings: ["find", "parchment", "list_parchment", "parchment_summary"],
52
+ docs: ["get", "search", "list", "semantic_search"],
53
+ primers: ["get", "by_version", "search", "list", "semantic_search"],
54
+ mc_registry: ["blocks", "commands", "registries", "sounds", "item_components", "registry_entries", "mcmeta_versions"],
55
+ mc_data: ["tags", "find_tags_for", "recipes", "get_recipe", "find_recipes_for", "loot_tables", "get_loot_table", "lang", "blockstate", "model", "model_tree", "biomes", "get_biome", "damage_types", "enchantments", "get_enchantment", "advancements", "get_advancement", "structures", "get_structure", "particles", "get_particle", "entity_attributes"],
56
+ mc_files: ["get_data", "get_asset", "list_files", "diff", "atlas", "compare", "changelog"],
57
+ mod_jar: ["lang", "sounds", "atlas", "registry_entries", "manifest", "list_configs", "get_config"],
58
+ mod_data: ["list", "get", "diff", "trace_item"],
59
+ mod_tags: ["namespaces", "contributors", "expand", "mod_list", "find_conflicts", "search"],
60
+ mixin_scan: ["list_mods", "conflict_matrix", "class_detail", "hotspots"],
61
+ gradle: ["get_files", "search", "compare_deps"],
62
+ project: ["upload_begin", "upload_chunk", "upload_finish", "upload_abort", "list", "info", "classes", "source", "search", "members", "bytecode"],
63
+ reports: [""],
64
+ pack_tools: ["asset_conflicts", "vanilla_overrides", "sidedness", "pack_sidedness", "complexity", "pack_changelog", "data_conflicts", "health"],
65
+ analyze_crash_log: [""],
66
+ find_missing_deps: [""],
67
+ };
68
+ const rawSource = (tool, action) => (tool === "mc_source" && ["get_source", "bytecode"].includes(String(action)))
69
+ || (tool === "mod" && ["source", "decompile_class"].includes(String(action)))
70
+ || (tool === "mod_bytecode" && action === "bytecode")
71
+ || (tool === "project" && ["source", "bytecode"].includes(String(action)));
72
+ export function prepareHostedArgs(tool, input, limits) {
73
+ const args = { ...input };
74
+ if (!HOSTED_ACTIONS[tool]?.includes(String(args.action ?? ""))) {
75
+ throw new HostedPolicyError("This operation is available only to the server operator locally.");
76
+ }
77
+ if (args.savePath !== undefined || args.scriptsDir !== undefined || args.configDir !== undefined) {
78
+ throw new HostedPolicyError("Host filesystem operations are unavailable remotely.");
79
+ }
80
+ if (tool === "mod_jar" && args.action === "get_config" && !/\.(?:json|json5|toml|cfg|conf|properties|ya?ml)$/i.test(String(args.path ?? ""))) {
81
+ throw new HostedPolicyError("Specify a configuration file path.");
82
+ }
83
+ if (tool === "mc_files" && args.branch !== undefined && !["data", "assets", "registries", "summary", "diff", "atlas"].includes(String(args.branch))) {
84
+ throw new HostedPolicyError("Unsupported data branch.");
85
+ }
86
+ for (const key of ["limit", "top", "budget"]) {
87
+ if (args[key] !== undefined) {
88
+ if (!Number.isSafeInteger(args[key]) || Number(args[key]) < 1)
89
+ throw new HostedPolicyError(`${key} must be a positive integer.`);
90
+ args[key] = Math.min(Number(args[key]), key === "budget" ? 2000 : 50);
91
+ }
92
+ }
93
+ if (rawSource(tool, args.action)) {
94
+ for (const key of ["startLine", "endLine", "maxLines"]) {
95
+ if (args[key] !== undefined && (!Number.isSafeInteger(args[key]) || Number(args[key]) < 1)) {
96
+ throw new HostedPolicyError(`${key} must be a positive integer.`);
97
+ }
98
+ }
99
+ const start = Number(args.startLine ?? 1);
100
+ if (start > Number.MAX_SAFE_INTEGER - limits.lines)
101
+ throw new HostedPolicyError("Invalid source range.");
102
+ if (args.endLine !== undefined && Number(args.endLine) < start)
103
+ throw new HostedPolicyError("Invalid source range.");
104
+ args.startLine = start;
105
+ args.maxLines = Math.min(Number(args.maxLines ?? limits.lines), limits.lines);
106
+ if (args.endLine !== undefined)
107
+ args.endLine = Math.min(Number(args.endLine), start + Number(args.maxLines) - 1);
108
+ }
109
+ // Keep exploration useful without unbounded empty searches / directory listings.
110
+ if (tool === "mod" && args.action === "source" && !args.path)
111
+ throw new HostedPolicyError("Specify a source file path or use a class search.");
112
+ if ((String(args.action).startsWith("search") || args.action === "classes")
113
+ && !(typeof args.query === "string" && args.query.trim())
114
+ && !(typeof args.className === "string" && args.className.trim())) {
115
+ throw new HostedPolicyError("Provide a focused search query.");
116
+ }
117
+ return args;
118
+ }
119
+ /** Atomic shared-database accounting: session churn, parallel calls and restarts do not reset it. */
120
+ export class HostedBudget {
121
+ database;
122
+ now;
123
+ ready;
124
+ constructor(database = getDb, now = Date.now) {
125
+ this.database = database;
126
+ this.now = now;
127
+ }
128
+ async charge(subject, limits, requests, bytes) {
129
+ const db = await this.database();
130
+ if (!this.ready)
131
+ this.ready = db.$executeRawUnsafe(`CREATE TABLE IF NOT EXISTS hosted_usage (
132
+ subject TEXT PRIMARY KEY, minute BIGINT NOT NULL, minute_requests BIGINT NOT NULL,
133
+ day BIGINT NOT NULL, daily_requests BIGINT NOT NULL, daily_bytes BIGINT NOT NULL,
134
+ period BIGINT NOT NULL, period_bytes BIGINT NOT NULL
135
+ )`).then(() => { }).catch(e => { this.ready = undefined; throw e; });
136
+ await this.ready;
137
+ const time = this.now();
138
+ const minute = Math.floor(time / 60_000), day = Math.floor(time / 86_400_000), period = Math.floor(day / 30);
139
+ // A single conditional UPSERT serializes checks and updates on every supported backend.
140
+ const rows = await db.$queryRawUnsafe(`
141
+ INSERT INTO hosted_usage (subject, minute, minute_requests, day, daily_requests, daily_bytes, period, period_bytes)
142
+ SELECT CAST($1 AS TEXT), CAST($2 AS BIGINT), CAST($5 AS BIGINT), CAST($3 AS BIGINT),
143
+ CAST($5 AS BIGINT), CAST($6 AS BIGINT), CAST($4 AS BIGINT), CAST($6 AS BIGINT)
144
+ WHERE $5 <= $7 AND $5 <= $8 AND $6 <= $9 AND $6 <= $10
145
+ ON CONFLICT (subject) DO UPDATE SET
146
+ minute = $2, minute_requests = CASE WHEN hosted_usage.minute = $2 THEN hosted_usage.minute_requests ELSE 0 END + $5,
147
+ day = $3, daily_requests = CASE WHEN hosted_usage.day = $3 THEN hosted_usage.daily_requests ELSE 0 END + $5,
148
+ daily_bytes = CASE WHEN hosted_usage.day = $3 THEN hosted_usage.daily_bytes ELSE 0 END + $6,
149
+ period = $4, period_bytes = CASE WHEN hosted_usage.period = $4 THEN hosted_usage.period_bytes ELSE 0 END + $6
150
+ WHERE (CASE WHEN hosted_usage.minute = $2 THEN hosted_usage.minute_requests ELSE 0 END) + $5 <= $7
151
+ AND (CASE WHEN hosted_usage.day = $3 THEN hosted_usage.daily_requests ELSE 0 END) + $5 <= $8
152
+ AND (CASE WHEN hosted_usage.day = $3 THEN hosted_usage.daily_bytes ELSE 0 END) + $6 <= $9
153
+ AND (CASE WHEN hosted_usage.period = $4 THEN hosted_usage.period_bytes ELSE 0 END) + $6 <= $10
154
+ RETURNING subject`, subject, minute, day, period, requests, bytes, limits.minuteRequests, limits.dailyRequests, limits.dailyBytes, limits.periodBytes);
155
+ if (!rows.length)
156
+ throw new HostedPolicyError("Hosted analysis allowance reached. Try again later or contact the operator for a higher allowance.");
157
+ }
158
+ }
159
+ const privateKeys = /^(?:jarPath|decompPath|sourcePath|graphPath|cacheRoot|indexPath|cachedAt|outDir|outputDir|savedTo|decompiled|indexed|embeddedCount|embedSource|embedUpdatedAt)$/i;
160
+ const sourceKeys = /^(?:source|content|text|snippet|answer|bytecode|result|raw)$/i;
161
+ export function boundHostedResult(tool, args, result, limits) {
162
+ if (result.isError)
163
+ return failure("Request failed. Check the arguments or ask the operator to inspect the server log.");
164
+ let truncated = false;
165
+ let remainingLines = limits.lines;
166
+ const clip = (text) => {
167
+ const lines = text.split(/\r\n|\n|\r/);
168
+ let value = lines.slice(0, remainingLines).join("\n");
169
+ if (lines.length > remainingLines)
170
+ truncated = true;
171
+ remainingLines = Math.max(0, remainingLines - lines.length);
172
+ // Byte caps also handle generated/minified one-line classes and multibyte Unicode.
173
+ const bytes = Buffer.from(value);
174
+ const stringBytes = Math.min(32 * 1024, Math.floor(limits.responseBytes / 2));
175
+ if (bytes.length > stringBytes) {
176
+ let end = stringBytes;
177
+ while (end > 0 && (bytes[end] & 0xc0) === 0x80)
178
+ end--;
179
+ value = bytes.subarray(0, end).toString("utf8");
180
+ truncated = true;
181
+ }
182
+ return value;
183
+ };
184
+ const clean = (value, key = "", depth = 0) => {
185
+ if (depth > 20) {
186
+ truncated = true;
187
+ return null;
188
+ }
189
+ if (typeof value === "string") {
190
+ if (tool === "project" && args.action === "bytecode" && key === "result") {
191
+ value = value.split(/\r\n|\n|\r/).slice(Number(args.startLine ?? 1) - 1, Number(args.startLine ?? 1) - 1 + Number(args.maxLines ?? limits.lines)).join("\n");
192
+ }
193
+ return sourceKeys.test(key) ? clip(value) : value;
194
+ }
195
+ if (Array.isArray(value))
196
+ return value.map(v => clean(v, key, depth + 1));
197
+ if (value && typeof value === "object")
198
+ return Object.fromEntries(Object.entries(value)
199
+ .filter(([k]) => !privateKeys.test(k)).map(([k, v]) => [k, clean(v, k, depth + 1)]));
200
+ return value;
201
+ };
202
+ const content = [];
203
+ for (const block of result.content) {
204
+ // No file/resource links, binary payloads, hidden structuredContent or metadata bypasses.
205
+ if (block.type !== "text")
206
+ throw new HostedPolicyError("This response format is unavailable remotely.");
207
+ let value;
208
+ // Source text must not evade line limits by happening to parse as JSON.
209
+ try {
210
+ value = rawSource(tool, args.action) && tool !== "project" ? undefined : JSON.parse(block.text);
211
+ }
212
+ catch {
213
+ value = undefined;
214
+ }
215
+ let text;
216
+ // Bytecode/mod source implementations that lack pagination are sliced before clipping.
217
+ if (rawSource(tool, args.action) && value === undefined && !(tool === "mc_source" && args.action === "get_source") && !(tool === "mod" && args.action === "source")) {
218
+ text = clip(block.text.split(/\r\n|\n|\r/).slice(Number(args.startLine ?? 1) - 1, Number(args.startLine ?? 1) - 1 + Number(args.maxLines ?? limits.lines)).join("\n"));
219
+ }
220
+ else
221
+ text = value === undefined ? clip(block.text) : JSON.stringify(clean(value));
222
+ content.push({ type: "text", text });
223
+ }
224
+ if (truncated)
225
+ content.push({ type: "text", text: "Response limited. Narrow the query or request a specific source range." });
226
+ if (Buffer.byteLength(JSON.stringify(content)) > limits.responseBytes) {
227
+ throw new HostedPolicyError("Response too large. Narrow the query or request a smaller source range.");
228
+ }
229
+ return { content };
230
+ }
231
+ function failure(text) {
232
+ return { isError: true, content: [{ type: "text", text }] };
233
+ }
234
+ export async function runHostedTool(tool, input, subject, limits, budget, run) {
235
+ try {
236
+ await budget.charge(subject, limits, 1, 0);
237
+ const args = prepareHostedArgs(tool, input, limits);
238
+ const review = await guardHostedMod(tool, args);
239
+ const result = review.blocked
240
+ ? boundHostedResult("mod_license", { action: "check" }, review.blocked, limits)
241
+ : attachLicenseNotices(boundHostedResult(tool, args, await run(args), limits), review.notices ?? []);
242
+ // License notices must remain complete even when all 200 source lines are
243
+ // used. Reject the whole response if source plus notices exceeds the cap.
244
+ if (Buffer.byteLength(JSON.stringify(result.content)) > limits.responseBytes) {
245
+ throw new HostedPolicyError("Source and required license notices exceed the response limit. Request a smaller source range or use the local workflow.");
246
+ }
247
+ // Charge before release, atomically, including search snippets, bytecode and alternate routes.
248
+ await budget.charge(subject, limits, 0, Buffer.byteLength(JSON.stringify(result.content)));
249
+ return result;
250
+ }
251
+ catch (error) {
252
+ if (!(error instanceof HostedPolicyError))
253
+ console.error("[modlens] hosted policy failure", error);
254
+ return failure(error instanceof HostedPolicyError ? error.message : "Hosted request unavailable. Contact the operator.");
255
+ }
256
+ }
257
+ //# sourceMappingURL=hosted-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hosted-policy.js","sourceRoot":"","sources":["../src/hosted-policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG1D,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAW/E,MAAM,UAAU,YAAY,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC7D,MAAM,MAAM,GAAG,CAAC,GAAW,EAAE,QAAgB,EAAE,EAAE;QAC7C,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS;YAAE,OAAO,QAAQ,CAAC;QAC5C,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,aAAa,EAAE,CAAC;YACrE,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,uDAAuD,CAAC,CAAC;QACnF,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC,CAAC;IACF,OAAO;QACH,KAAK,EAAE,MAAM,CAAC,6BAA6B,EAAE,GAAG,CAAC;QACjD,aAAa,EAAE,MAAM,CAAC,+BAA+B,EAAE,GAAG,GAAG,IAAI,CAAC;QAClE,UAAU,EAAE,MAAM,CAAC,4BAA4B,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;QACjE,WAAW,EAAE,MAAM,CAAC,6BAA6B,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;QACpE,aAAa,EAAE,MAAM,CAAC,+BAA+B,EAAE,IAAI,CAAC;QAC5D,cAAc,EAAE,MAAM,CAAC,gCAAgC,EAAE,GAAG,CAAC;KAChE,CAAC;AACN,CAAC;AAED,MAAM,OAAO,iBAAkB,SAAQ,KAAK;CAAG;AAE/C,8EAA8E;AAC9E,MAAM,UAAU,eAAe,CAAC,OAA4B,EAAE,MAAe;IACzE,IAAI,CAAC,MAAM;QAAE,OAAO,QAAQ,CAAC,CAAC,oEAAoE;IAClG,MAAM,QAAQ,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;IAC9E,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;WAC/E,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9F,MAAM,IAAI,iBAAiB,CAAC,0CAA0C,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACxC,CAAC;AAED,sFAAsF;AACtF,kGAAkG;AAClG,MAAM,CAAC,MAAM,cAAc,GAAsC;IAC7D,YAAY,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC;IACjC,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC;IAC3F,WAAW,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC;IACpC,GAAG,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,WAAW,EAAE,mBAAmB,EAAE,aAAa,EAAE,iBAAiB,EAAE,QAAQ,EAAE,eAAe,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,aAAa,EAAE,cAAc,CAAC;IACzM,YAAY,EAAE,CAAC,cAAc,EAAE,eAAe,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,eAAe,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,cAAc,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,eAAe,CAAC;IAC1Q,UAAU,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,oBAAoB,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,CAAC;IACjH,QAAQ,EAAE,CAAC,QAAQ,EAAE,eAAe,EAAE,qBAAqB,CAAC;IAC5D,WAAW,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,UAAU,EAAE,iBAAiB,EAAE,cAAc,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,mBAAmB,CAAC;IACpN,WAAW,EAAE,CAAC,SAAS,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,CAAC;IACtE,SAAS,EAAE,CAAC,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,EAAE,eAAe,EAAE,aAAa,EAAE,gBAAgB,EAAE,eAAe,EAAE,aAAa,EAAE,eAAe,EAAE,iBAAiB,CAAC;IAChO,QAAQ,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,mBAAmB,CAAC;IACtE,IAAI,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,iBAAiB,CAAC;IAClD,OAAO,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,iBAAiB,CAAC;IACnE,WAAW,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,iBAAiB,CAAC;IACrH,OAAO,EAAE,CAAC,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,YAAY,EAAE,kBAAkB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAE,iBAAiB,EAAE,cAAc,EAAE,iBAAiB,EAAE,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,cAAc,EAAE,mBAAmB,CAAC;IAC3V,QAAQ,EAAE,CAAC,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,CAAC;IAC1F,OAAO,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,CAAC;IAClG,QAAQ,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC;IAC/C,QAAQ,EAAE,CAAC,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE,UAAU,EAAE,gBAAgB,EAAE,QAAQ,CAAC;IAC1F,UAAU,EAAE,CAAC,WAAW,EAAE,iBAAiB,EAAE,cAAc,EAAE,UAAU,CAAC;IACxE,MAAM,EAAE,CAAC,WAAW,EAAE,QAAQ,EAAE,cAAc,CAAC;IAC/C,OAAO,EAAE,CAAC,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC;IAChJ,OAAO,EAAE,CAAC,EAAE,CAAC;IACb,UAAU,EAAE,CAAC,iBAAiB,EAAE,mBAAmB,EAAE,WAAW,EAAE,gBAAgB,EAAE,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,QAAQ,CAAC;IAC/I,iBAAiB,EAAE,CAAC,EAAE,CAAC;IACvB,iBAAiB,EAAE,CAAC,EAAE,CAAC;CAC1B,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,MAAe,EAAE,EAAE,CAChD,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;OAC1E,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;OAC1E,CAAC,IAAI,KAAK,cAAc,IAAI,MAAM,KAAK,UAAU,CAAC;OAClD,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAE/E,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,KAA8B,EAAE,MAAoB;IAChG,MAAM,IAAI,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;IAC1B,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QAC7D,MAAM,IAAI,iBAAiB,CAAC,kEAAkE,CAAC,CAAC;IACpG,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QAC/F,MAAM,IAAI,iBAAiB,CAAC,sDAAsD,CAAC,CAAC;IACxF,CAAC;IACD,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,YAAY,IAAI,CAAC,mDAAmD,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QAC3I,MAAM,IAAI,iBAAiB,CAAC,oCAAoC,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QAClJ,MAAM,IAAI,iBAAiB,CAAC,0BAA0B,CAAC,CAAC;IAC5D,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;QAC3C,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;YAC1B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;gBAAE,MAAM,IAAI,iBAAiB,CAAC,GAAG,GAAG,8BAA8B,CAAC,CAAC;YACjI,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC1E,CAAC;IACL,CAAC;IACD,IAAI,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/B,KAAK,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,CAAC;YACrD,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBACzF,MAAM,IAAI,iBAAiB,CAAC,GAAG,GAAG,8BAA8B,CAAC,CAAC;YACtE,CAAC;QACL,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC;QAC1C,IAAI,KAAK,GAAG,MAAM,CAAC,gBAAgB,GAAG,MAAM,CAAC,KAAK;YAAE,MAAM,IAAI,iBAAiB,CAAC,uBAAuB,CAAC,CAAC;QACzG,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK;YAAE,MAAM,IAAI,iBAAiB,CAAC,uBAAuB,CAAC,CAAC;QACrH,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9E,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS;YAAE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IACrH,CAAC;IACD,iFAAiF;IACjF,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,iBAAiB,CAAC,mDAAmD,CAAC,CAAC;IAC/I,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC;WACpE,CAAC,CAAC,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;WACtD,CAAC,CAAC,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QACpE,MAAM,IAAI,iBAAiB,CAAC,iCAAiC,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAOD,qGAAqG;AACrG,MAAM,OAAO,YAAY;IAED;IAAyD;IADrE,KAAK,CAAiB;IAC9B,YAAoB,WAA0C,KAAK,EAAU,MAAM,IAAI,CAAC,GAAG;QAAvE,aAAQ,GAAR,QAAQ,CAAuC;QAAU,QAAG,GAAH,GAAG,CAAW;IAAG,CAAC;IAE/F,KAAK,CAAC,MAAM,CAAC,OAAe,EAAE,MAAoB,EAAE,QAAgB,EAAE,KAAa;QAC/E,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACjC,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,iBAAiB,CAAC;;;;UAIjD,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpE,MAAM,IAAI,CAAC,KAAK,CAAC;QACjB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;QAC7G,wFAAwF;QACxF,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,eAAe,CAA6B;;;;;;;;;;;;;;8BAc5C,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EACjE,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;QACxF,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,iBAAiB,CAAC,oGAAoG,CAAC,CAAC;IACxJ,CAAC;CACJ;AAED,MAAM,WAAW,GAAG,kKAAkK,CAAC;AACvL,MAAM,UAAU,GAAG,+DAA+D,CAAC;AAEnF,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,IAA6B,EAAE,MAAsB,EAAE,MAAoB;IACvH,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,OAAO,CAAC,oFAAoF,CAAC,CAAC;IACzH,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC;IAClC,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,EAAE;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACvC,IAAI,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtD,IAAI,KAAK,CAAC,MAAM,GAAG,cAAc;YAAE,SAAS,GAAG,IAAI,CAAC;QACpD,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QAC5D,mFAAmF;QACnF,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC;QAC9E,IAAI,KAAK,CAAC,MAAM,GAAG,WAAW,EAAE,CAAC;YAC7B,IAAI,GAAG,GAAG,WAAW,CAAC;YACtB,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,IAAI;gBAAE,GAAG,EAAE,CAAC;YACtD,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAChD,SAAS,GAAG,IAAI,CAAC;QACrB,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC,CAAC;IACF,MAAM,KAAK,GAAG,CAAC,KAAc,EAAE,GAAG,GAAG,EAAE,EAAE,KAAK,GAAG,CAAC,EAAW,EAAE;QAC3D,IAAI,KAAK,GAAG,EAAE,EAAE,CAAC;YAAC,SAAS,GAAG,IAAI,CAAC;YAAC,OAAO,IAAI,CAAC;QAAC,CAAC;QAClD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC5B,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;gBACvE,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC,EACnE,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5F,CAAC;YACD,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAe,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAChE,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;QAC1E,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;iBAClF,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzF,OAAO,KAAK,CAAC;IACjB,CAAC,CAAC;IACF,MAAM,OAAO,GAA8B,EAAE,CAAC;IAC9C,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACjC,0FAA0F;QAC1F,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;YAAE,MAAM,IAAI,iBAAiB,CAAC,+CAA+C,CAAC,CAAC;QACxG,IAAI,KAAc,CAAC;QACnB,wEAAwE;QACxE,IAAI,CAAC;YAAC,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,KAAK,GAAG,SAAS,CAAC;QAAC,CAAC;QACrI,IAAI,IAAY,CAAC;QACjB,uFAAuF;QACvF,IAAI,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,MAAM,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,EAAE,CAAC;YAClK,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC,EAC5E,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7F,CAAC;;YAAM,IAAI,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QACpF,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IACD,IAAI,SAAS;QAAE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,wEAAwE,EAAE,CAAC,CAAC;IAC9H,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,aAAa,EAAE,CAAC;QACpE,MAAM,IAAI,iBAAiB,CAAC,yEAAyE,CAAC,CAAC;IAC3G,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,CAAC;AACvB,CAAC;AAED,SAAS,OAAO,CAAC,IAAY;IACzB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AAChE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,KAA8B,EAAE,OAAe,EAC7F,MAAoB,EAAE,MAAoB,EAAE,GAA+D;IAC3G,IAAI,CAAC;QACD,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO;YACzB,CAAC,CAAC,iBAAiB,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC;YAC/E,CAAC,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QACzG,0EAA0E;QAC1E,0EAA0E;QAC1E,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,aAAa,EAAE,CAAC;YAC3E,MAAM,IAAI,iBAAiB,CAAC,0HAA0H,CAAC,CAAC;QAC5J,CAAC;QACD,+FAA+F;QAC/F,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC3F,OAAO,MAAM,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,IAAI,CAAC,CAAC,KAAK,YAAY,iBAAiB,CAAC;YAAE,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;QACnG,OAAO,OAAO,CAAC,KAAK,YAAY,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,mDAAmD,CAAC,CAAC;IAC7H,CAAC;AACL,CAAC"}
package/dist/launcher.js CHANGED
@@ -19,105 +19,120 @@ import { existsSync, readFileSync, writeFileSync, mkdirSync, copyFileSync } from
19
19
  import { join, dirname } from "path";
20
20
  import { fileURLToPath } from "url";
21
21
  import { spawnSync } from "child_process";
22
- const __dirname = dirname(fileURLToPath(import.meta.url));
23
- // ── Resolve paths (mirrors env-path.ts but without importing it so we can
24
- // load the .env before any other imports trigger DB connections) ──────────
25
- const PKG_ROOT = join(__dirname, "..");
26
- const IS_INSTALLED = !existsSync(join(PKG_ROOT, ".git"));
27
22
  import { homedir } from "os";
28
- const MODLENS_HOME = process.env.MODLENS_HOME ?? (IS_INSTALLED ? join(homedir(), ".modlens") : PKG_ROOT);
29
- const ENV_FILE = IS_INSTALLED ? join(MODLENS_HOME, ".env") : join(PKG_ROOT, ".env");
30
- const VERSION_FILE = join(MODLENS_HOME, "version");
31
- // ── Load .env early so DB connection picks up DATABASE_URL ───────────────────
32
- for (const ep of [ENV_FILE, join(PKG_ROOT, ".env")]) {
33
- if (existsSync(ep)) {
34
- for (const line of readFileSync(ep, "utf8").split("\n")) {
35
- const m = line.match(/^([^#=]+)=(.*)$/);
36
- if (m)
37
- process.env[m[1].trim()] ??= m[2].trim().replace(/^["']|["']$/g, "");
38
- }
39
- break;
40
- }
41
- }
42
- const args = process.argv.slice(2);
43
- // Project utilities do not need a database or first-run bootstrap.
44
- if (args[0] === "--gradle-init-script") {
45
- console.log(join(PKG_ROOT, "scripts", "gradle", "modlens.init.gradle"));
46
- process.exit(0);
47
- }
48
- if (args[0] === "--project-upload") {
49
- process.argv = [process.argv[0], join(PKG_ROOT, "scripts", "project-upload.mjs"), ...args.slice(1)];
50
- await import(new URL("../scripts/project-upload.mjs", import.meta.url).href);
51
- process.exit(process.exitCode ?? 0);
52
- }
53
- if (args[0] === "--project") {
54
- process.argv = [process.argv[0], join(PKG_ROOT, "dist", "cli.js"), "project", ...args.slice(1)];
55
- await import("./cli.js");
56
- process.exit(process.exitCode ?? 0);
23
+ const __dirname = dirname(fileURLToPath(import.meta.url));
24
+ // Runtime-only local helper: no DB bootstrap, server .env, or MCP configuration.
25
+ if (process.argv[2] === "--local-mod") {
26
+ delete process.env.MCP_PORT;
27
+ const { localModCli } = await import("./local-mod.js");
28
+ process.exitCode = await localModCli(process.argv.slice(3));
57
29
  }
58
- const wantSetup = args.includes("--setup");
59
- // Bootstrap embedded SQLite only when nothing else is configured. A
60
- // pre-supplied DATABASE_URL (e.g. Postgres via a container env var) opts out, so
61
- // `docker run -e DATABASE_URL=postgresql://…` works without a stray SQLite db.
62
- const isFirstRun = IS_INSTALLED && !existsSync(ENV_FILE) && !process.env.DATABASE_URL;
63
- // ── Explicit setup wizard (--setup) ─────────────────────────────────────────
64
- // Opt-in interactive configuration (Postgres, semantic search, MCP client, …).
65
- if (wantSetup) {
66
- mkdirSync(MODLENS_HOME, { recursive: true });
67
- const result = spawnSync(process.execPath, [join(PKG_ROOT, "dist", "setup.js")], {
68
- stdio: "inherit",
69
- env: { ...process.env, MODLENS_HOME },
70
- });
71
- process.exit(result.status ?? 0);
30
+ else if (process.argv[2] === "--runtime") {
31
+ delete process.env.MCP_PORT;
32
+ const { runtimeCli } = await import("./runtime/cli.js");
33
+ process.exitCode = await runtimeCli(process.argv.slice(3));
72
34
  }
73
- // ── Zero-config first run: bootstrap embedded SQLite ─────────────────────────
74
- // No interactive wizard — copy the prebuilt schema'd template database into
75
- // ~/.modlens/data so the server can start immediately with no external services.
76
- // Power users can switch to Postgres/semantic search any time with `--setup`.
77
- if (isFirstRun) {
78
- mkdirSync(MODLENS_HOME, { recursive: true });
79
- const dataDir = join(MODLENS_HOME, "data");
80
- mkdirSync(dataDir, { recursive: true });
81
- const dbPath = join(dataDir, "modlens.db");
82
- if (!existsSync(dbPath)) {
83
- const template = join(PKG_ROOT, "prisma", "backends", "template.db");
84
- if (!existsSync(template)) {
85
- console.error("[modlens] template.db is missing from the package — cannot bootstrap SQLite.\n[modlens] Run `npx @creeperhost/modlens-mcp --setup` to configure a database manually.");
86
- process.exit(1);
35
+ else
36
+ await startMcp();
37
+ async function startMcp() {
38
+ // ── Resolve paths (mirrors env-path.ts but without importing it so we can
39
+ // load the .env before any other imports trigger DB connections) ──────────
40
+ const PKG_ROOT = join(__dirname, "..");
41
+ const IS_INSTALLED = !existsSync(join(PKG_ROOT, ".git"));
42
+ const MODLENS_HOME = process.env.MODLENS_HOME ?? (IS_INSTALLED ? join(homedir(), ".modlens") : PKG_ROOT);
43
+ const ENV_FILE = IS_INSTALLED ? join(MODLENS_HOME, ".env") : join(PKG_ROOT, ".env");
44
+ const VERSION_FILE = join(MODLENS_HOME, "version");
45
+ // ── Load .env early so DB connection picks up DATABASE_URL ───────────────────
46
+ for (const ep of [ENV_FILE, join(PKG_ROOT, ".env")]) {
47
+ if (existsSync(ep)) {
48
+ for (const line of readFileSync(ep, "utf8").split("\n")) {
49
+ const m = line.match(/^([^#=]+)=(.*)$/);
50
+ if (m)
51
+ process.env[m[1].trim()] ??= m[2].trim().replace(/^["']|["']$/g, "");
52
+ }
53
+ break;
87
54
  }
88
- copyFileSync(template, dbPath);
89
55
  }
90
- const dbUrl = `file:${dbPath}`;
91
- writeFileSync(ENV_FILE, `MODLENS_PROFILE=lightweight\nDATABASE_URL=${dbUrl}\n`);
92
- process.env.DATABASE_URL ??= dbUrl;
93
- // Record the current version so the migration step below treats this fresh
94
- // install as already up to date (template.db already has the right schema).
95
- const freshVersion = JSON.parse(readFileSync(join(PKG_ROOT, "package.json"), "utf8")).version;
96
- writeFileSync(VERSION_FILE, freshVersion + "\n");
97
- console.error(`[modlens] First run — initialized embedded SQLite database at ${dbPath}`);
98
- console.error("[modlens] Run `npx @creeperhost/modlens-mcp --setup` to switch to Postgres or enable semantic search.");
99
- }
100
- // ── Version check + auto-migrate (installed mode only) ───────────────────────
101
- if (IS_INSTALLED) {
102
- const pkgVersion = JSON.parse(readFileSync(join(PKG_ROOT, "package.json"), "utf8")).version;
103
- const storedVersion = existsSync(VERSION_FILE) ? readFileSync(VERSION_FILE, "utf8").trim() : null;
104
- if (storedVersion !== pkgVersion) {
105
- console.error(`[modlens] Version changed (${storedVersion ?? "none"} → ${pkgVersion}), running migrations...`);
106
- const result = spawnSync(process.execPath, [join(PKG_ROOT, "scripts", "post-update.mjs")], {
56
+ const args = process.argv.slice(2);
57
+ // Project utilities do not need a database or first-run bootstrap.
58
+ if (args[0] === "--gradle-init-script") {
59
+ console.log(join(PKG_ROOT, "scripts", "gradle", "modlens.init.gradle"));
60
+ process.exit(0);
61
+ }
62
+ if (args[0] === "--project-upload") {
63
+ process.argv = [process.argv[0], join(PKG_ROOT, "scripts", "project-upload.mjs"), ...args.slice(1)];
64
+ await import(new URL("../scripts/project-upload.mjs", import.meta.url).href);
65
+ process.exit(process.exitCode ?? 0);
66
+ }
67
+ if (args[0] === "--project") {
68
+ process.argv = [process.argv[0], join(PKG_ROOT, "dist", "cli.js"), "project", ...args.slice(1)];
69
+ await import("./cli.js");
70
+ process.exit(process.exitCode ?? 0);
71
+ }
72
+ const wantSetup = args.includes("--setup");
73
+ // Bootstrap embedded SQLite only when nothing else is configured. A
74
+ // pre-supplied DATABASE_URL (e.g. Postgres via a container env var) opts out, so
75
+ // `docker run -e DATABASE_URL=postgresql://…` works without a stray SQLite db.
76
+ const isFirstRun = IS_INSTALLED && !existsSync(ENV_FILE) && !process.env.DATABASE_URL;
77
+ // ── Explicit setup wizard (--setup) ─────────────────────────────────────────
78
+ // Opt-in interactive configuration (Postgres, semantic search, MCP client, …).
79
+ if (wantSetup) {
80
+ mkdirSync(MODLENS_HOME, { recursive: true });
81
+ const result = spawnSync(process.execPath, [join(PKG_ROOT, "dist", "setup.js")], {
107
82
  stdio: "inherit",
108
83
  env: { ...process.env, MODLENS_HOME },
109
84
  });
110
- if (result.status === 0) {
111
- mkdirSync(MODLENS_HOME, { recursive: true });
112
- writeFileSync(VERSION_FILE, pkgVersion + "\n");
85
+ process.exit(result.status ?? 0);
86
+ }
87
+ // ── Zero-config first run: bootstrap embedded SQLite ─────────────────────────
88
+ // No interactive wizard — copy the prebuilt schema'd template database into
89
+ // ~/.modlens/data so the server can start immediately with no external services.
90
+ // Power users can switch to Postgres/semantic search any time with `--setup`.
91
+ if (isFirstRun) {
92
+ mkdirSync(MODLENS_HOME, { recursive: true });
93
+ const dataDir = join(MODLENS_HOME, "data");
94
+ mkdirSync(dataDir, { recursive: true });
95
+ const dbPath = join(dataDir, "modlens.db");
96
+ if (!existsSync(dbPath)) {
97
+ const template = join(PKG_ROOT, "prisma", "backends", "template.db");
98
+ if (!existsSync(template)) {
99
+ console.error("[modlens] template.db is missing from the package — cannot bootstrap SQLite.\n[modlens] Run `npx @creeperhost/modlens-mcp --setup` to configure a database manually.");
100
+ process.exit(1);
101
+ }
102
+ copyFileSync(template, dbPath);
113
103
  }
114
- else {
115
- console.error("[modlens] Migration had errors — server may not start correctly.");
104
+ const dbUrl = `file:${dbPath}`;
105
+ writeFileSync(ENV_FILE, `MODLENS_PROFILE=lightweight\nDATABASE_URL=${dbUrl}\n`);
106
+ process.env.DATABASE_URL ??= dbUrl;
107
+ // Record the current version so the migration step below treats this fresh
108
+ // install as already up to date (template.db already has the right schema).
109
+ const freshVersion = JSON.parse(readFileSync(join(PKG_ROOT, "package.json"), "utf8")).version;
110
+ writeFileSync(VERSION_FILE, freshVersion + "\n");
111
+ console.error(`[modlens] First run — initialized embedded SQLite database at ${dbPath}`);
112
+ console.error("[modlens] Run `npx @creeperhost/modlens-mcp --setup` to switch to Postgres or enable semantic search.");
113
+ }
114
+ // ── Version check + auto-migrate (installed mode only) ───────────────────────
115
+ if (IS_INSTALLED) {
116
+ const pkgVersion = JSON.parse(readFileSync(join(PKG_ROOT, "package.json"), "utf8")).version;
117
+ const storedVersion = existsSync(VERSION_FILE) ? readFileSync(VERSION_FILE, "utf8").trim() : null;
118
+ if (storedVersion !== pkgVersion) {
119
+ console.error(`[modlens] Version changed (${storedVersion ?? "none"} → ${pkgVersion}), running migrations...`);
120
+ const result = spawnSync(process.execPath, [join(PKG_ROOT, "scripts", "post-update.mjs")], {
121
+ stdio: "inherit",
122
+ env: { ...process.env, MODLENS_HOME },
123
+ });
124
+ if (result.status === 0) {
125
+ mkdirSync(MODLENS_HOME, { recursive: true });
126
+ writeFileSync(VERSION_FILE, pkgVersion + "\n");
127
+ }
128
+ else {
129
+ console.error("[modlens] Migration had errors — server may not start correctly.");
130
+ }
116
131
  }
117
132
  }
133
+ // ── Start server ──────────────────────────────────────────────────────────────
134
+ // Dynamic import so all the above env-loading completes before any module
135
+ // that reads process.env at import time (e.g. db.ts) is evaluated.
136
+ await import("./server.js");
118
137
  }
119
- // ── Start server ──────────────────────────────────────────────────────────────
120
- // Dynamic import so all the above env-loading completes before any module
121
- // that reads process.env at import time (e.g. db.ts) is evaluated.
122
- await import("./server.js");
123
138
  //# sourceMappingURL=launcher.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"launcher.js","sourceRoot":"","sources":["../src/launcher.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"launcher.js","sourceRoot":"","sources":["../src/launcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export declare function compactNotices(notices: Array<{
2
+ name: string;
3
+ licenseText: string;
4
+ }>): Array<{
5
+ name: string;
6
+ licenseText: string;
7
+ }>;
8
+ //# sourceMappingURL=license-notices.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"license-notices.d.ts","sourceRoot":"","sources":["../src/license-notices.ts"],"names":[],"mappings":"AAAA,wBAAgB,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CAQlI"}
@@ -0,0 +1,10 @@
1
+ export function compactNotices(notices) {
2
+ const grouped = new Map();
3
+ for (const notice of notices) {
4
+ const names = grouped.get(notice.licenseText) ?? new Set();
5
+ names.add(notice.name);
6
+ grouped.set(notice.licenseText, names);
7
+ }
8
+ return [...grouped].map(([licenseText, names]) => ({ name: [...names].join(", "), licenseText }));
9
+ }
10
+ //# sourceMappingURL=license-notices.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"license-notices.js","sourceRoot":"","sources":["../src/license-notices.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,cAAc,CAAC,OAAqD;IAChF,MAAM,OAAO,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC/C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,IAAI,GAAG,EAAU,CAAC;QACnE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;AACtG,CAAC"}
@@ -0,0 +1,12 @@
1
+ /** Reviewed release-to-source associations for upstreams without release tags.
2
+ * These supply provenance, never a licence override. The resolver still reads
3
+ * the licence and notices at the immutable commit and checks the artifact.
4
+ * Add entries only after reviewing the upstream release/version evidence.
5
+ */
6
+ export declare const reviewedSourceReferences: Record<string, {
7
+ repository: string;
8
+ commit: string;
9
+ version: string;
10
+ evidence: string;
11
+ }>;
12
+ //# sourceMappingURL=license-source-references.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"license-source-references.d.ts","sourceRoot":"","sources":["../src/license-source-references.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAW9H,CAAC"}
@@ -0,0 +1,18 @@
1
+ /** Reviewed release-to-source associations for upstreams without release tags.
2
+ * These supply provenance, never a licence override. The resolver still reads
3
+ * the licence and notices at the immutable commit and checks the artifact.
4
+ * Add entries only after reviewing the upstream release/version evidence.
5
+ */
6
+ export const reviewedSourceReferences = {
7
+ // Published artifact: https://modrinth.com/mod/embeddium/version/UTbfe5d1
8
+ // Upstream's release commit is titled "0.3.31"; gradle.properties declares
9
+ // mod_version=0.3.31 and minecraft_version=1.20.1. Its timestamp is 23s
10
+ // after publication, so a "latest commit before upload" heuristic is wrong.
11
+ "eed3d1325f2acc2fd4e69bb495e5ccb91d962126ac5330f0582ebc2a3daf47fb": {
12
+ repository: "FiniteReality/embeddium",
13
+ commit: "87d1a75aecc230a25a1c152df8fbd7d2ca8bd2fd",
14
+ version: "0.3.31+mc1.20.1",
15
+ evidence: "https://github.com/FiniteReality/embeddium/commit/87d1a75aecc230a25a1c152df8fbd7d2ca8bd2fd",
16
+ },
17
+ };
18
+ //# sourceMappingURL=license-source-references.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"license-source-references.js","sourceRoot":"","sources":["../src/license-source-references.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAA8F;IAC/H,0EAA0E;IAC1E,2EAA2E;IAC3E,wEAAwE;IACxE,4EAA4E;IAC5E,kEAAkE,EAAE;QAChE,UAAU,EAAE,yBAAyB;QACrC,MAAM,EAAE,0CAA0C;QAClD,OAAO,EAAE,iBAAiB;QAC1B,QAAQ,EAAE,4FAA4F;KACzG;CACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare const licenseTemplates: Record<string, {
2
+ name: string;
3
+ text: string;
4
+ source: string;
5
+ }>;
6
+ //# sourceMappingURL=license-templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"license-templates.d.ts","sourceRoot":"","sources":["../src/license-templates.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAmD3F,CAAC"}