@younndai/lyt-mesh 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +200 -0
- package/NOTICE +23 -0
- package/README.md +135 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +34 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/clone-all.d.ts +3 -0
- package/dist/commands/clone-all.d.ts.map +1 -0
- package/dist/commands/clone-all.js +66 -0
- package/dist/commands/clone-all.js.map +1 -0
- package/dist/commands/mesh-init.d.ts +3 -0
- package/dist/commands/mesh-init.d.ts.map +1 -0
- package/dist/commands/mesh-init.js +70 -0
- package/dist/commands/mesh-init.js.map +1 -0
- package/dist/commands/pod-status.d.ts +3 -0
- package/dist/commands/pod-status.d.ts.map +1 -0
- package/dist/commands/pod-status.js +67 -0
- package/dist/commands/pod-status.js.map +1 -0
- package/dist/commands/source.d.ts +3 -0
- package/dist/commands/source.d.ts.map +1 -0
- package/dist/commands/source.js +83 -0
- package/dist/commands/source.js.map +1 -0
- package/dist/commands/status.d.ts +4 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +121 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/sync.d.ts +3 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +234 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/validate.d.ts +3 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +66 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/discovery/github.d.ts +19 -0
- package/dist/discovery/github.d.ts.map +1 -0
- package/dist/discovery/github.js +90 -0
- package/dist/discovery/github.js.map +1 -0
- package/dist/discovery/walk.d.ts +28 -0
- package/dist/discovery/walk.d.ts.map +1 -0
- package/dist/discovery/walk.js +78 -0
- package/dist/discovery/walk.js.map +1 -0
- package/dist/flows/clone-all.d.ts +53 -0
- package/dist/flows/clone-all.d.ts.map +1 -0
- package/dist/flows/clone-all.js +123 -0
- package/dist/flows/clone-all.js.map +1 -0
- package/dist/flows/mesh-init-validate.d.ts +22 -0
- package/dist/flows/mesh-init-validate.d.ts.map +1 -0
- package/dist/flows/mesh-init-validate.js +195 -0
- package/dist/flows/mesh-init-validate.js.map +1 -0
- package/dist/flows/mesh-init.d.ts +46 -0
- package/dist/flows/mesh-init.d.ts.map +1 -0
- package/dist/flows/mesh-init.js +302 -0
- package/dist/flows/mesh-init.js.map +1 -0
- package/dist/flows/pod-status.d.ts +37 -0
- package/dist/flows/pod-status.d.ts.map +1 -0
- package/dist/flows/pod-status.js +269 -0
- package/dist/flows/pod-status.js.map +1 -0
- package/dist/flows/status.d.ts +16 -0
- package/dist/flows/status.d.ts.map +1 -0
- package/dist/flows/status.js +76 -0
- package/dist/flows/status.js.map +1 -0
- package/dist/flows/sync-check.d.ts +38 -0
- package/dist/flows/sync-check.d.ts.map +1 -0
- package/dist/flows/sync-check.js +180 -0
- package/dist/flows/sync-check.js.map +1 -0
- package/dist/flows/sync-watch.d.ts +24 -0
- package/dist/flows/sync-watch.d.ts.map +1 -0
- package/dist/flows/sync-watch.js +217 -0
- package/dist/flows/sync-watch.js.map +1 -0
- package/dist/flows/sync.d.ts +45 -0
- package/dist/flows/sync.d.ts.map +1 -0
- package/dist/flows/sync.js +513 -0
- package/dist/flows/sync.js.map +1 -0
- package/dist/flows/validate.d.ts +22 -0
- package/dist/flows/validate.d.ts.map +1 -0
- package/dist/flows/validate.js +62 -0
- package/dist/flows/validate.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/mesh-command.d.ts +3 -0
- package/dist/mesh-command.d.ts.map +1 -0
- package/dist/mesh-command.js +31 -0
- package/dist/mesh-command.js.map +1 -0
- package/dist/source/repo.d.ts +14 -0
- package/dist/source/repo.d.ts.map +1 -0
- package/dist/source/repo.js +71 -0
- package/dist/source/repo.js.map +1 -0
- package/dist/source/types.d.ts +22 -0
- package/dist/source/types.d.ts.map +1 -0
- package/dist/source/types.js +49 -0
- package/dist/source/types.js.map +1 -0
- package/package.json +77 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2026 MARLINK TRADING SRL (YounndAI)
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
import { Command } from "commander";
|
|
17
|
+
import { validateFlow } from "../flows/validate.js";
|
|
18
|
+
export function buildValidateCommand() {
|
|
19
|
+
const cmd = new Command("validate");
|
|
20
|
+
cmd
|
|
21
|
+
.description("Check the mesh for dangling parent_vault FKs and tombstoned parents. Pure registry read; no network.")
|
|
22
|
+
.option("--json", "Emit machine-readable JSON")
|
|
23
|
+
.option("--strict", "Exit non-zero when any findings are reported (CI-friendly)")
|
|
24
|
+
.action(async (opts) => {
|
|
25
|
+
const outcome = await validateFlow();
|
|
26
|
+
if (opts.json) {
|
|
27
|
+
// eslint-disable-next-line no-console
|
|
28
|
+
console.log(JSON.stringify(outcome.findings, null, 2));
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
// eslint-disable-next-line no-console
|
|
32
|
+
console.log(formatValidateTable(outcome));
|
|
33
|
+
}
|
|
34
|
+
if (opts.strict && outcome.findings.length > 0) {
|
|
35
|
+
process.exitCode = 1;
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
return cmd;
|
|
39
|
+
}
|
|
40
|
+
function formatValidateTable(outcome) {
|
|
41
|
+
if (outcome.findings.length === 0) {
|
|
42
|
+
return `(no issues found — ${outcome.totalVaults} vault(s), ${outcome.totalEdges} edge(s))`;
|
|
43
|
+
}
|
|
44
|
+
const headers = ["SOURCE", "EDGE", "TARGET", "ISSUE"];
|
|
45
|
+
const rows = outcome.findings.map((f) => [
|
|
46
|
+
f.sourceVaultName,
|
|
47
|
+
f.declaredEdge,
|
|
48
|
+
f.targetVaultRid,
|
|
49
|
+
formatIssue(f),
|
|
50
|
+
]);
|
|
51
|
+
const widths = headers.map((h, i) => Math.max(h.length, ...rows.map((r) => (r[i] ?? "").length)));
|
|
52
|
+
const line = (cols) => cols
|
|
53
|
+
.map((c, i) => c.padEnd(widths[i] ?? 0))
|
|
54
|
+
.join(" ")
|
|
55
|
+
.trimEnd();
|
|
56
|
+
return [line(headers), line(headers.map((h) => "-".repeat(h.length))), ...rows.map(line)].join("\n");
|
|
57
|
+
}
|
|
58
|
+
function formatIssue(f) {
|
|
59
|
+
switch (f.status) {
|
|
60
|
+
case "dangling":
|
|
61
|
+
return "dangling (target not in registry)";
|
|
62
|
+
case "tombstoned-target":
|
|
63
|
+
return "target is tombstoned";
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { VaultSource } from "../source/types.js";
|
|
2
|
+
export interface DiscoveredRepo {
|
|
3
|
+
host: string;
|
|
4
|
+
owner: string;
|
|
5
|
+
name: string;
|
|
6
|
+
cloneUrl: string;
|
|
7
|
+
sshUrl: string;
|
|
8
|
+
isPrivate: boolean;
|
|
9
|
+
topics: readonly string[];
|
|
10
|
+
}
|
|
11
|
+
export interface GhExecutor {
|
|
12
|
+
(args: readonly string[]): Promise<string>;
|
|
13
|
+
}
|
|
14
|
+
export interface WalkGithubOptions {
|
|
15
|
+
source: VaultSource;
|
|
16
|
+
gh?: GhExecutor;
|
|
17
|
+
}
|
|
18
|
+
export declare function walkGithub(opts: WalkGithubOptions): Promise<DiscoveredRepo[]>;
|
|
19
|
+
//# sourceMappingURL=github.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../src/discovery/github.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,UAAU;IACzB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC5C;AAyCD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,WAAW,CAAC;IACpB,EAAE,CAAC,EAAE,UAAU,CAAC;CACjB;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CA4BnF"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2026 MARLINK TRADING SRL (YounndAI)
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
import { spawn } from "node:child_process";
|
|
17
|
+
import { resolveSpawnInvocation } from "@younndai/lyt-vault";
|
|
18
|
+
const defaultGh = (args) => new Promise((resolve, reject) => {
|
|
19
|
+
// V-B-9: same win32 gh resolution as lyt-vault's gh-discover — without it
|
|
20
|
+
// the engine's gh-walk ENOENTs on Windows (`gh.cmd` shim won't launch).
|
|
21
|
+
const inv = resolveSpawnInvocation("gh", args);
|
|
22
|
+
const child = spawn(inv.command, inv.args, {
|
|
23
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
24
|
+
shell: inv.shell,
|
|
25
|
+
});
|
|
26
|
+
let stdout = "";
|
|
27
|
+
let stderr = "";
|
|
28
|
+
child.stdout.on("data", (b) => {
|
|
29
|
+
stdout += b.toString("utf8");
|
|
30
|
+
});
|
|
31
|
+
child.stderr.on("data", (b) => {
|
|
32
|
+
stderr += b.toString("utf8");
|
|
33
|
+
});
|
|
34
|
+
child.on("error", (err) => {
|
|
35
|
+
const e = err;
|
|
36
|
+
if (e.code === "ENOENT") {
|
|
37
|
+
reject(new Error("`gh` CLI not found on PATH. Install GitHub CLI: https://cli.github.com/. " +
|
|
38
|
+
"lyt-mesh discovery requires `gh` for `gh api` access (the Search API misses private repos)."));
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
reject(err);
|
|
42
|
+
});
|
|
43
|
+
child.on("close", (code) => {
|
|
44
|
+
if (code !== 0) {
|
|
45
|
+
reject(new Error(`gh ${args.join(" ")} exited ${code}: ${stderr.trim()}`));
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
resolve(stdout);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
export async function walkGithub(opts) {
|
|
52
|
+
const gh = opts.gh ?? defaultGh;
|
|
53
|
+
const source = opts.source;
|
|
54
|
+
const ownerLower = source.owner.toLowerCase();
|
|
55
|
+
const raw = await gh([
|
|
56
|
+
"api",
|
|
57
|
+
"/user/repos",
|
|
58
|
+
"--paginate",
|
|
59
|
+
"-q",
|
|
60
|
+
'.[] | {host: "github.com", owner: .owner.login, name: .name, cloneUrl: .clone_url, sshUrl: .ssh_url, isPrivate: .private, topics: (.topics // [])}',
|
|
61
|
+
]);
|
|
62
|
+
const repos = [];
|
|
63
|
+
for (const line of raw.split(/\r?\n/)) {
|
|
64
|
+
const trimmed = line.trim();
|
|
65
|
+
if (trimmed.length === 0)
|
|
66
|
+
continue;
|
|
67
|
+
let parsed;
|
|
68
|
+
try {
|
|
69
|
+
parsed = JSON.parse(trimmed);
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
throw new Error(`Failed to parse gh output line as JSON: ${err.message}\nLine: ${trimmed}`);
|
|
73
|
+
}
|
|
74
|
+
if (parsed.owner.toLowerCase() !== ownerLower)
|
|
75
|
+
continue;
|
|
76
|
+
if (!matchesScope(parsed, source.scope))
|
|
77
|
+
continue;
|
|
78
|
+
repos.push(parsed);
|
|
79
|
+
}
|
|
80
|
+
return repos;
|
|
81
|
+
}
|
|
82
|
+
function matchesScope(repo, scope) {
|
|
83
|
+
if (scope === "all")
|
|
84
|
+
return true;
|
|
85
|
+
if ("topic" in scope) {
|
|
86
|
+
return repo.topics.includes(scope.topic);
|
|
87
|
+
}
|
|
88
|
+
return scope.repos.includes(repo.name);
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=github.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/discovery/github.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type DiscoveredRepo, type GhExecutor } from "./github.js";
|
|
2
|
+
import type { VaultSource, VaultSourceRow } from "../source/types.js";
|
|
3
|
+
export interface SourceAdapter {
|
|
4
|
+
readonly host: string;
|
|
5
|
+
discover(source: VaultSource): Promise<DiscoveredRepo[]>;
|
|
6
|
+
}
|
|
7
|
+
export interface MeshDiscoveryResult {
|
|
8
|
+
source: VaultSourceRow;
|
|
9
|
+
repo: DiscoveredRepo;
|
|
10
|
+
}
|
|
11
|
+
export interface WalkOptions {
|
|
12
|
+
sources: readonly VaultSourceRow[];
|
|
13
|
+
sourceFilter?: string;
|
|
14
|
+
adapters?: readonly SourceAdapter[];
|
|
15
|
+
gh?: GhExecutor;
|
|
16
|
+
}
|
|
17
|
+
export interface WalkResult {
|
|
18
|
+
discovered: MeshDiscoveryResult[];
|
|
19
|
+
duplicates: number;
|
|
20
|
+
perSource: Record<string, number>;
|
|
21
|
+
skippedSources: {
|
|
22
|
+
name: string;
|
|
23
|
+
reason: string;
|
|
24
|
+
}[];
|
|
25
|
+
}
|
|
26
|
+
export declare function buildDefaultAdapters(gh?: GhExecutor): SourceAdapter[];
|
|
27
|
+
export declare function walk(opts: WalkOptions): Promise<WalkResult>;
|
|
28
|
+
//# sourceMappingURL=walk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"walk.d.ts","sourceRoot":"","sources":["../../src/discovery/walk.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAc,KAAK,cAAc,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEtE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;CAC1D;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,cAAc,CAAC;IACvB,IAAI,EAAE,cAAc,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,SAAS,cAAc,EAAE,CAAC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IACpC,EAAE,CAAC,EAAE,UAAU,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,mBAAmB,EAAE,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,cAAc,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACpD;AAED,wBAAgB,oBAAoB,CAAC,EAAE,CAAC,EAAE,UAAU,GAAG,aAAa,EAAE,CAOrE;AAED,wBAAsB,IAAI,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAgDjE"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2026 MARLINK TRADING SRL (YounndAI)
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
import { walkGithub } from "./github.js";
|
|
17
|
+
export function buildDefaultAdapters(gh) {
|
|
18
|
+
return [
|
|
19
|
+
{
|
|
20
|
+
host: "github.com",
|
|
21
|
+
discover: (source) => walkGithub({ source, gh }),
|
|
22
|
+
},
|
|
23
|
+
];
|
|
24
|
+
}
|
|
25
|
+
export async function walk(opts) {
|
|
26
|
+
const adapters = opts.adapters ?? buildDefaultAdapters(opts.gh);
|
|
27
|
+
const adapterByHost = new Map(adapters.map((a) => [a.host, a]));
|
|
28
|
+
const sources = opts.sourceFilter
|
|
29
|
+
? opts.sources.filter((s) => s.name === opts.sourceFilter)
|
|
30
|
+
: opts.sources;
|
|
31
|
+
const seen = new Set();
|
|
32
|
+
const discovered = [];
|
|
33
|
+
const perSource = {};
|
|
34
|
+
const skippedSources = [];
|
|
35
|
+
let duplicates = 0;
|
|
36
|
+
for (const source of sources) {
|
|
37
|
+
perSource[source.name] = 0;
|
|
38
|
+
const adapter = adapterByHost.get(source.host);
|
|
39
|
+
if (!adapter) {
|
|
40
|
+
skippedSources.push({
|
|
41
|
+
name: source.name,
|
|
42
|
+
reason: `host '${source.host}' not yet supported (Phase 4 ships GitHub only)`,
|
|
43
|
+
});
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
let repos;
|
|
47
|
+
try {
|
|
48
|
+
repos = await adapter.discover({
|
|
49
|
+
name: source.name,
|
|
50
|
+
host: source.host,
|
|
51
|
+
owner: source.owner,
|
|
52
|
+
scope: source.scope,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
skippedSources.push({
|
|
57
|
+
name: source.name,
|
|
58
|
+
reason: err.message,
|
|
59
|
+
});
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
for (const repo of repos) {
|
|
63
|
+
const canonical = canonicalCloneUrl(repo.cloneUrl);
|
|
64
|
+
if (seen.has(canonical)) {
|
|
65
|
+
duplicates += 1;
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
seen.add(canonical);
|
|
69
|
+
discovered.push({ source, repo });
|
|
70
|
+
perSource[source.name] = (perSource[source.name] ?? 0) + 1;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return { discovered, duplicates, perSource, skippedSources };
|
|
74
|
+
}
|
|
75
|
+
function canonicalCloneUrl(url) {
|
|
76
|
+
return url.replace(/\.git$/i, "").toLowerCase();
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=walk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"walk.js","sourceRoot":"","sources":["../../src/discovery/walk.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { type SourceAdapter } from "../discovery/walk.js";
|
|
2
|
+
import type { GhExecutor } from "../discovery/github.js";
|
|
3
|
+
export interface GitCloneFn {
|
|
4
|
+
(cloneUrl: string, dest: string): Promise<void>;
|
|
5
|
+
}
|
|
6
|
+
export interface CloneAllOptions {
|
|
7
|
+
sourceFilter?: string;
|
|
8
|
+
dryRun?: boolean;
|
|
9
|
+
gh?: GhExecutor;
|
|
10
|
+
adapters?: readonly SourceAdapter[];
|
|
11
|
+
gitClone?: GitCloneFn;
|
|
12
|
+
destRoot?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface CloneAllOutcome {
|
|
15
|
+
cloned: {
|
|
16
|
+
name: string;
|
|
17
|
+
cloneUrl: string;
|
|
18
|
+
path: string;
|
|
19
|
+
}[];
|
|
20
|
+
skipped_already_registered: {
|
|
21
|
+
name: string;
|
|
22
|
+
path: string;
|
|
23
|
+
}[];
|
|
24
|
+
skipped_sources: {
|
|
25
|
+
name: string;
|
|
26
|
+
reason: string;
|
|
27
|
+
}[];
|
|
28
|
+
errored: {
|
|
29
|
+
name: string;
|
|
30
|
+
cloneUrl: string;
|
|
31
|
+
reason: string;
|
|
32
|
+
}[];
|
|
33
|
+
dry_run: boolean;
|
|
34
|
+
dry_run_plan: {
|
|
35
|
+
name: string;
|
|
36
|
+
cloneUrl: string;
|
|
37
|
+
destPath: string;
|
|
38
|
+
sourceName: string;
|
|
39
|
+
}[];
|
|
40
|
+
source_count: number;
|
|
41
|
+
walk_duplicates: number;
|
|
42
|
+
}
|
|
43
|
+
export interface CloneAllResult {
|
|
44
|
+
ok: true;
|
|
45
|
+
outcome: CloneAllOutcome;
|
|
46
|
+
}
|
|
47
|
+
export interface CloneAllNoSources {
|
|
48
|
+
ok: false;
|
|
49
|
+
reason: "no-sources";
|
|
50
|
+
message: string;
|
|
51
|
+
}
|
|
52
|
+
export declare function cloneAllFlow(opts?: CloneAllOptions): Promise<CloneAllResult | CloneAllNoSources>;
|
|
53
|
+
//# sourceMappingURL=clone-all.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clone-all.d.ts","sourceRoot":"","sources":["../../src/flows/clone-all.ts"],"names":[],"mappings":"AA4BA,OAAO,EAAQ,KAAK,aAAa,EAAmB,MAAM,sBAAsB,CAAC;AAEjF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEzD,MAAM,WAAW,UAAU;IACzB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD;AA4BD,MAAM,WAAW,eAAe;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,EAAE,CAAC,EAAE,UAAU,CAAC;IAChB,QAAQ,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IACpC,QAAQ,CAAC,EAAE,UAAU,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC3D,0BAA0B,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC7D,eAAe,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACpD,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC9D,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACzF,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,IAAI,CAAC;IACT,OAAO,EAAE,eAAe,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,KAAK,CAAC;IACV,MAAM,EAAE,YAAY,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,YAAY,CAChC,IAAI,GAAE,eAAoB,GACzB,OAAO,CAAC,cAAc,GAAG,iBAAiB,CAAC,CA2E7C"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2026 MARLINK TRADING SRL (YounndAI)
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
import { existsSync, mkdirSync } from "node:fs";
|
|
17
|
+
import { join } from "node:path";
|
|
18
|
+
import { spawn } from "node:child_process";
|
|
19
|
+
import { closeRegistry, getDefaultVaultsRoot, getVaultByPath, joinVaultFlow, openRegistry, } from "@younndai/lyt-vault";
|
|
20
|
+
import { walk } from "../discovery/walk.js";
|
|
21
|
+
import { listSources } from "../source/repo.js";
|
|
22
|
+
const defaultGitClone = (cloneUrl, dest) => new Promise((resolve, reject) => {
|
|
23
|
+
const child = spawn("git", ["clone", "--quiet", cloneUrl, dest], {
|
|
24
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
25
|
+
});
|
|
26
|
+
let stderr = "";
|
|
27
|
+
child.stderr.on("data", (b) => {
|
|
28
|
+
stderr += b.toString("utf8");
|
|
29
|
+
});
|
|
30
|
+
child.on("error", (err) => {
|
|
31
|
+
const e = err;
|
|
32
|
+
if (e.code === "ENOENT") {
|
|
33
|
+
reject(new Error("`git` not found on PATH. Install Git: https://git-scm.com/."));
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
reject(err);
|
|
37
|
+
});
|
|
38
|
+
child.on("close", (code) => {
|
|
39
|
+
if (code !== 0) {
|
|
40
|
+
reject(new Error(`git clone exited ${code}: ${stderr.trim()}`));
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
resolve();
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
export async function cloneAllFlow(opts = {}) {
|
|
47
|
+
const dryRun = opts.dryRun === true;
|
|
48
|
+
const gitClone = opts.gitClone ?? defaultGitClone;
|
|
49
|
+
const destRoot = opts.destRoot ?? getDefaultVaultsRoot();
|
|
50
|
+
const db = await openRegistry();
|
|
51
|
+
let walkResult;
|
|
52
|
+
try {
|
|
53
|
+
const sources = await listSources(db);
|
|
54
|
+
if (sources.length === 0) {
|
|
55
|
+
return {
|
|
56
|
+
ok: false,
|
|
57
|
+
reason: "no-sources",
|
|
58
|
+
message: "No vault sources configured. Run 'lyt mesh source add <name> --host <host> --owner <owner>' first.",
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
walkResult = await walk({
|
|
62
|
+
sources,
|
|
63
|
+
sourceFilter: opts.sourceFilter,
|
|
64
|
+
adapters: opts.adapters,
|
|
65
|
+
gh: opts.gh,
|
|
66
|
+
});
|
|
67
|
+
const outcome = {
|
|
68
|
+
cloned: [],
|
|
69
|
+
skipped_already_registered: [],
|
|
70
|
+
skipped_sources: walkResult.skippedSources,
|
|
71
|
+
errored: [],
|
|
72
|
+
dry_run: dryRun,
|
|
73
|
+
dry_run_plan: [],
|
|
74
|
+
source_count: opts.sourceFilter
|
|
75
|
+
? sources.filter((s) => s.name === opts.sourceFilter).length
|
|
76
|
+
: sources.length,
|
|
77
|
+
walk_duplicates: walkResult.duplicates,
|
|
78
|
+
};
|
|
79
|
+
for (const { repo, source } of walkResult.discovered) {
|
|
80
|
+
const destPath = join(destRoot, repo.name);
|
|
81
|
+
if (dryRun) {
|
|
82
|
+
outcome.dry_run_plan.push({
|
|
83
|
+
name: repo.name,
|
|
84
|
+
cloneUrl: repo.cloneUrl,
|
|
85
|
+
destPath,
|
|
86
|
+
sourceName: source.name,
|
|
87
|
+
});
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
const existing = await getVaultByPath(db, destPath);
|
|
91
|
+
if (existing) {
|
|
92
|
+
outcome.skipped_already_registered.push({ name: repo.name, path: destPath });
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
if (existsSync(destPath)) {
|
|
96
|
+
outcome.errored.push({
|
|
97
|
+
name: repo.name,
|
|
98
|
+
cloneUrl: repo.cloneUrl,
|
|
99
|
+
reason: `destination already exists on disk but is not registered: ${destPath}`,
|
|
100
|
+
});
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
try {
|
|
104
|
+
mkdirSync(destRoot, { recursive: true });
|
|
105
|
+
await gitClone(repo.cloneUrl, destPath);
|
|
106
|
+
await joinVaultFlow(destPath);
|
|
107
|
+
outcome.cloned.push({ name: repo.name, cloneUrl: repo.cloneUrl, path: destPath });
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
outcome.errored.push({
|
|
111
|
+
name: repo.name,
|
|
112
|
+
cloneUrl: repo.cloneUrl,
|
|
113
|
+
reason: err.message,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return { ok: true, outcome };
|
|
118
|
+
}
|
|
119
|
+
finally {
|
|
120
|
+
await closeRegistry(db);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=clone-all.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clone-all.js","sourceRoot":"","sources":["../../src/flows/clone-all.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,cAAc,EACd,aAAa,EACb,YAAY,GACb,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,IAAI,EAAuC,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAOhD,MAAM,eAAe,GAAe,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,CACrD,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;IAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE;QAC/D,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;KAClC,CAAC,CAAC;IACH,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE;QACpC,MAAM,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;QACxB,MAAM,CAAC,GAAG,GAA4B,CAAC;QACvC,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACxB,MAAM,CAAC,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC,CAAC;YACjF,OAAO;QACT,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,CAAC;IACd,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;QACzB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,KAAK,CAAC,oBAAoB,IAAI,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;YAChE,OAAO;QACT,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAiCL,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAwB,EAAE;IAE1B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC;IACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,eAAe,CAAC;IAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,oBAAoB,EAAE,CAAC;IACzD,MAAM,EAAE,GAAG,MAAM,YAAY,EAAE,CAAC;IAChC,IAAI,UAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,YAAY;gBACpB,OAAO,EACL,oGAAoG;aACvG,CAAC;QACJ,CAAC;QACD,UAAU,GAAG,MAAM,IAAI,CAAC;YACtB,OAAO;YACP,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,EAAE,EAAE,IAAI,CAAC,EAAE;SACZ,CAAC,CAAC;QACH,MAAM,OAAO,GAAoB;YAC/B,MAAM,EAAE,EAAE;YACV,0BAA0B,EAAE,EAAE;YAC9B,eAAe,EAAE,UAAU,CAAC,cAAc;YAC1C,OAAO,EAAE,EAAE;YACX,OAAO,EAAE,MAAM;YACf,YAAY,EAAE,EAAE;YAChB,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC7B,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM;gBAC5D,CAAC,CAAC,OAAO,CAAC,MAAM;YAClB,eAAe,EAAE,UAAU,CAAC,UAAU;SACvC,CAAC;QACF,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;YACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3C,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC;oBACxB,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,QAAQ;oBACR,UAAU,EAAE,MAAM,CAAC,IAAI;iBACxB,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YACpD,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,CAAC,0BAA0B,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAC7E,SAAS;YACX,CAAC;YACD,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzB,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;oBACnB,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,MAAM,EAAE,6DAA6D,QAAQ,EAAE;iBAChF,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YACD,IAAI,CAAC;gBACH,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACzC,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBACxC,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;gBAC9B,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YACpF,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;oBACnB,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,MAAM,EAAG,GAAa,CAAC,OAAO;iBAC/B,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC/B,CAAC;YAAS,CAAC;QACT,MAAM,aAAa,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { applyGhPrefix, type ManifestShareWith, type ParsedManifest } from "@younndai/lyt-vault";
|
|
2
|
+
export type ValidateSeverity = "error" | "warn";
|
|
3
|
+
export interface ValidateIssue {
|
|
4
|
+
code: string;
|
|
5
|
+
severity: ValidateSeverity;
|
|
6
|
+
message: string;
|
|
7
|
+
}
|
|
8
|
+
export interface ValidateOutcome {
|
|
9
|
+
ok: boolean;
|
|
10
|
+
issues: ValidateIssue[];
|
|
11
|
+
topoOrder: string[];
|
|
12
|
+
}
|
|
13
|
+
export interface ValidateOptions {
|
|
14
|
+
manifest: ParsedManifest;
|
|
15
|
+
registryVaultNames?: readonly string[] | undefined;
|
|
16
|
+
onlyNames?: readonly string[] | undefined;
|
|
17
|
+
ghOrgSmoke?: ((org: string) => Promise<boolean>) | undefined;
|
|
18
|
+
}
|
|
19
|
+
export declare function validateMeshInit(opts: ValidateOptions): Promise<ValidateOutcome>;
|
|
20
|
+
export { applyGhPrefix };
|
|
21
|
+
export type { ManifestShareWith };
|
|
22
|
+
//# sourceMappingURL=mesh-init-validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mesh-init-validate.d.ts","sourceRoot":"","sources":["../../src/flows/mesh-init-validate.ts"],"names":[],"mappings":"AAgBA,OAAO,EACL,aAAa,EAIb,KAAK,iBAAiB,EAEtB,KAAK,cAAc,EACpB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,MAAM,CAAC;AAEhD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,aAAa,EAAE,CAAC;IAGxB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,cAAc,CAAC;IAEzB,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IAEnD,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IAG1C,UAAU,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;CAC9D;AAID,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAkGtF;AAsFD,OAAO,EAAE,aAAa,EAAE,CAAC;AACzB,YAAY,EAAE,iBAAiB,EAAE,CAAC"}
|