@sap/joule-studio-dev-cli 0.1.20-alpha.3
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 +38 -0
- package/README.md +53 -0
- package/dist/bin/commands/a2a.js +12 -0
- package/dist/bin/commands/a2a.js.map +1 -0
- package/dist/bin/commands/asset.js +20 -0
- package/dist/bin/commands/asset.js.map +1 -0
- package/dist/bin/commands/auth.js +16 -0
- package/dist/bin/commands/auth.js.map +1 -0
- package/dist/bin/commands/init.js +20 -0
- package/dist/bin/commands/init.js.map +1 -0
- package/dist/bin/commands/mcp.js +42 -0
- package/dist/bin/commands/mcp.js.map +1 -0
- package/dist/bin/commands/pro-code.js +12 -0
- package/dist/bin/commands/pro-code.js.map +1 -0
- package/dist/bin/commands/skills.js +27 -0
- package/dist/bin/commands/skills.js.map +1 -0
- package/dist/bin/commands/solution.js +52 -0
- package/dist/bin/commands/solution.js.map +1 -0
- package/dist/bin/help.js +42 -0
- package/dist/bin/help.js.map +1 -0
- package/dist/bin/jl.js +59 -0
- package/dist/bin/jl.js.map +1 -0
- package/dist/bin/login.js +60 -0
- package/dist/bin/login.js.map +1 -0
- package/dist/bin/logout.js +21 -0
- package/dist/bin/logout.js.map +1 -0
- package/dist/lib/a2a/message.js +74 -0
- package/dist/lib/a2a/message.js.map +1 -0
- package/dist/lib/asset/create.js +38 -0
- package/dist/lib/asset/create.js.map +1 -0
- package/dist/lib/asset/delete.js +57 -0
- package/dist/lib/asset/delete.js.map +1 -0
- package/dist/lib/asset/discover.js +46 -0
- package/dist/lib/asset/discover.js.map +1 -0
- package/dist/lib/auth-crypto.js +146 -0
- package/dist/lib/auth-crypto.js.map +1 -0
- package/dist/lib/auth.js +488 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/context.js +35 -0
- package/dist/lib/context.js.map +1 -0
- package/dist/lib/errors.js +47 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/fs-utils.js +34 -0
- package/dist/lib/fs-utils.js.map +1 -0
- package/dist/lib/init/agents.js +55 -0
- package/dist/lib/init/agents.js.map +1 -0
- package/dist/lib/init/shared.js +172 -0
- package/dist/lib/init/shared.js.map +1 -0
- package/dist/lib/mcp/call.js +158 -0
- package/dist/lib/mcp/call.js.map +1 -0
- package/dist/lib/mcp/client.js +100 -0
- package/dist/lib/mcp/client.js.map +1 -0
- package/dist/lib/mcp/list.js +20 -0
- package/dist/lib/mcp/list.js.map +1 -0
- package/dist/lib/mcp/start.js +120 -0
- package/dist/lib/mcp/start.js.map +1 -0
- package/dist/lib/mcp/tools.js +162 -0
- package/dist/lib/mcp/tools.js.map +1 -0
- package/dist/lib/plugin.js +77 -0
- package/dist/lib/plugin.js.map +1 -0
- package/dist/lib/plugins/agent/index.js +32 -0
- package/dist/lib/plugins/agent/index.js.map +1 -0
- package/dist/lib/plugins/agent/templates/asset.yaml.hbs +31 -0
- package/dist/lib/plugins/agent-extension/index.js +32 -0
- package/dist/lib/plugins/agent-extension/index.js.map +1 -0
- package/dist/lib/plugins/agent-extension/templates/asset.yaml.hbs +15 -0
- package/dist/lib/plugins/base-ui/index.js +32 -0
- package/dist/lib/plugins/base-ui/index.js.map +1 -0
- package/dist/lib/plugins/base-ui/templates/asset.yaml.hbs +8 -0
- package/dist/lib/plugins/cap-app/index.js +32 -0
- package/dist/lib/plugins/cap-app/index.js.map +1 -0
- package/dist/lib/plugins/cap-app/templates/asset.yaml.hbs +37 -0
- package/dist/lib/plugins/data-product/index.js +32 -0
- package/dist/lib/plugins/data-product/index.js.map +1 -0
- package/dist/lib/plugins/data-product/templates/asset.yaml.hbs +9 -0
- package/dist/lib/plugins/domain-model-extension/index.js +37 -0
- package/dist/lib/plugins/domain-model-extension/index.js.map +1 -0
- package/dist/lib/plugins/domain-model-extension/templates/asset.yaml.hbs +15 -0
- package/dist/lib/plugins/mcp-server/index.js +36 -0
- package/dist/lib/plugins/mcp-server/index.js.map +1 -0
- package/dist/lib/plugins/mcp-server/templates/asset.yaml.hbs +9 -0
- package/dist/lib/plugins/n8n-workflow/index.js +52 -0
- package/dist/lib/plugins/n8n-workflow/index.js.map +1 -0
- package/dist/lib/plugins/n8n-workflow/templates/asset.yaml.hbs +18 -0
- package/dist/lib/plugins/n8n-workflow/validation/asset-validator.js +62 -0
- package/dist/lib/plugins/n8n-workflow/validation/asset-validator.js.map +1 -0
- package/dist/lib/plugins/n8n-workflow/validation/yaml-validator.js +51 -0
- package/dist/lib/plugins/n8n-workflow/validation/yaml-validator.js.map +1 -0
- package/dist/lib/plugins/vercel-app/index.js +32 -0
- package/dist/lib/plugins/vercel-app/index.js.map +1 -0
- package/dist/lib/plugins/vercel-app/templates/asset.yaml.hbs +12 -0
- package/dist/lib/rule.js +2 -0
- package/dist/lib/rule.js.map +1 -0
- package/dist/lib/schemas/solution-schema.json +178 -0
- package/dist/lib/solution/build.js +186 -0
- package/dist/lib/solution/build.js.map +1 -0
- package/dist/lib/solution/create.js +42 -0
- package/dist/lib/solution/create.js.map +1 -0
- package/dist/lib/solution/deploy.js +66 -0
- package/dist/lib/solution/deploy.js.map +1 -0
- package/dist/lib/solution/list.js +21 -0
- package/dist/lib/solution/list.js.map +1 -0
- package/dist/lib/solution/logs.js +130 -0
- package/dist/lib/solution/logs.js.map +1 -0
- package/dist/lib/solution/status.js +161 -0
- package/dist/lib/solution/status.js.map +1 -0
- package/dist/lib/solution/templates/solution.yaml.hbs +9 -0
- package/dist/lib/solution/util/build-file.js +4 -0
- package/dist/lib/solution/util/build-file.js.map +1 -0
- package/dist/lib/template.js +74 -0
- package/dist/lib/template.js.map +1 -0
- package/dist/lib/term.js +16 -0
- package/dist/lib/term.js.map +1 -0
- package/dist/lib/validate.js +287 -0
- package/dist/lib/validate.js.map +1 -0
- package/dist/lib/yaml.js +33 -0
- package/dist/lib/yaml.js.map +1 -0
- package/dist/package.json +77 -0
- package/package.json +77 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { randomUUID } from 'node:crypto';
|
|
4
|
+
import { authorizedFetch } from '../auth.js';
|
|
5
|
+
import * as context from '../context.js';
|
|
6
|
+
import { CliError } from '../errors.js';
|
|
7
|
+
import yaml from '../yaml.js';
|
|
8
|
+
import term from '../term.js';
|
|
9
|
+
const BASE = '/destinations/DYN_AGENTS_SERVICE/api/v1/a2a-proxy';
|
|
10
|
+
function defaultAgentAsset(cwd) {
|
|
11
|
+
const assetsDir = path.join(cwd ?? process.cwd(), 'assets');
|
|
12
|
+
if (!fs.existsSync(assetsDir))
|
|
13
|
+
return null;
|
|
14
|
+
const candidates = [];
|
|
15
|
+
for (const entry of fs.readdirSync(assetsDir, { withFileTypes: true })) {
|
|
16
|
+
if (!entry.isDirectory())
|
|
17
|
+
continue;
|
|
18
|
+
const assetYaml = path.join(assetsDir, entry.name, 'asset.yaml');
|
|
19
|
+
if (!fs.existsSync(assetYaml))
|
|
20
|
+
continue;
|
|
21
|
+
try {
|
|
22
|
+
const doc = yaml.readYAML(assetYaml);
|
|
23
|
+
if (doc.type === 'agent')
|
|
24
|
+
candidates.push(entry.name);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
// skip unreadable asset.yaml
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return candidates.length === 1 ? candidates[0] : null;
|
|
31
|
+
}
|
|
32
|
+
export async function a2aMessage(args, options = {}) {
|
|
33
|
+
const build = context.get();
|
|
34
|
+
const solution = options.solution ?? build.solution_id;
|
|
35
|
+
const asset = options.asset ?? defaultAgentAsset(options.cwd);
|
|
36
|
+
if (!solution) {
|
|
37
|
+
throw new CliError('A2A_MISSING_SOLUTION', 'Missing --solution: specify --solution <id>');
|
|
38
|
+
}
|
|
39
|
+
if (!asset) {
|
|
40
|
+
throw new CliError('A2A_MISSING_ASSET', 'Missing --asset: ambiguous or not found — specify --asset <name>');
|
|
41
|
+
}
|
|
42
|
+
const text = args[0];
|
|
43
|
+
if (!text) {
|
|
44
|
+
throw new CliError('INVALID_PARAM', 'Usage: jl a2a message <message> --solution <id> --asset <name>');
|
|
45
|
+
}
|
|
46
|
+
const lastContextId = build.a2a_context_id;
|
|
47
|
+
if (options.continue && !lastContextId) {
|
|
48
|
+
throw new CliError('A2A_NO_PREVIOUS_CONTEXT', 'No previous context id found in .build — omit --continue to start a new conversation');
|
|
49
|
+
}
|
|
50
|
+
const contextId = options.continue && lastContextId ? lastContextId : randomUUID();
|
|
51
|
+
const payload = { message: text, contextId };
|
|
52
|
+
const res = await authorizedFetch(`${BASE}/${solution}/${asset}`, {
|
|
53
|
+
method: 'POST',
|
|
54
|
+
headers: { 'Content-Type': 'application/json' },
|
|
55
|
+
body: JSON.stringify(payload),
|
|
56
|
+
});
|
|
57
|
+
if (!res.ok) {
|
|
58
|
+
throw new CliError('A2A_REQUEST_FAILED', `A2A request failed (${res.status}).`);
|
|
59
|
+
}
|
|
60
|
+
context.set('a2a_context_id', contextId);
|
|
61
|
+
const data = (await res.json());
|
|
62
|
+
for (const artifact of data.artifacts ?? []) {
|
|
63
|
+
for (const part of artifact.parts ?? []) {
|
|
64
|
+
if (part.kind === 'text') {
|
|
65
|
+
console.log(part.text);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
const state = data.status?.state;
|
|
70
|
+
if (state && state !== 'completed') {
|
|
71
|
+
console.log(term.dim(`\n[${state}]`));
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=message.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message.js","sourceRoot":"","sources":["../../../lib/a2a/message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,KAAK,OAAO,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AACvC,OAAO,IAAI,MAAM,YAAY,CAAA;AAC7B,OAAO,IAAI,MAAM,YAAY,CAAA;AAE7B,MAAM,IAAI,GAAG,mDAAmD,CAAA;AAShE,SAAS,iBAAiB,CAAC,GAAY;IACnC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAA;IAC3D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAA;IAC1C,MAAM,UAAU,GAAa,EAAE,CAAA;IAC/B,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACrE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;YAAE,SAAQ;QAClC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,YAAY,CAAC,CAAA;QAChE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,SAAQ;QACvC,IAAI,CAAC;YACD,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;YACpC,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO;gBAAE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACzD,CAAC;QAAC,MAAM,CAAC;YACL,6BAA6B;QACjC,CAAC;IACL,CAAC;IACD,OAAO,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AACzD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAc,EAAE,UAA6B,EAAE;IAC5E,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;IAC3B,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,KAAK,CAAC,WAAW,CAAA;IACtD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAE7D,IAAI,CAAC,QAAQ,EAAE,CAAC;QACZ,MAAM,IAAI,QAAQ,CAAC,sBAAsB,EAAE,6CAA6C,CAAC,CAAA;IAC7F,CAAC;IACD,IAAI,CAAC,KAAK,EAAE,CAAC;QACT,MAAM,IAAI,QAAQ,CAAC,mBAAmB,EAAE,kEAAkE,CAAC,CAAA;IAC/G,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;IACpB,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,MAAM,IAAI,QAAQ,CAAC,eAAe,EAAE,gEAAgE,CAAC,CAAA;IACzG,CAAC;IAED,MAAM,aAAa,GAAG,KAAK,CAAC,cAAc,CAAA;IAC1C,IAAI,OAAO,CAAC,QAAQ,IAAI,CAAC,aAAa,EAAE,CAAC;QACrC,MAAM,IAAI,QAAQ,CACd,yBAAyB,EACzB,sFAAsF,CACzF,CAAA;IACL,CAAC;IACD,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,IAAI,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,EAAE,CAAA;IAElF,MAAM,OAAO,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAA;IAE5C,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,GAAG,IAAI,IAAI,QAAQ,IAAI,KAAK,EAAE,EAAE;QAC9D,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;KAChC,CAAC,CAAA;IAEF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACV,MAAM,IAAI,QAAQ,CAAC,oBAAoB,EAAE,uBAAuB,GAAG,CAAC,MAAM,IAAI,CAAC,CAAA;IACnF,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAA;IAExC,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAG7B,CAAA;IAED,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC;QAC1C,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;YACtC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC1B,CAAC;QACL,CAAC;IACL,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,CAAA;IAChC,IAAI,KAAK,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAA;IACzC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import fsUtils from '../fs-utils.js';
|
|
3
|
+
import { getPlugin } from './discover.js';
|
|
4
|
+
import term from '../term.js';
|
|
5
|
+
const NAME_REGEX = /^[a-z0-9]([-a-z0-9]{0,61}[a-z0-9])?$/;
|
|
6
|
+
async function assetCreate(args, options = {}) {
|
|
7
|
+
const type = args[0];
|
|
8
|
+
if (!type) {
|
|
9
|
+
throw 'Asset type is required. Usage: jl asset create <type> --name <name>';
|
|
10
|
+
}
|
|
11
|
+
const name = options.name || args[1];
|
|
12
|
+
if (!name) {
|
|
13
|
+
throw 'Option --name is required.';
|
|
14
|
+
}
|
|
15
|
+
if (!NAME_REGEX.test(name)) {
|
|
16
|
+
throw `Invalid asset name '${name}'. Use lowercase letters, digits, and hyphens only (DNS-compatible).`;
|
|
17
|
+
}
|
|
18
|
+
const solutionDir = process.cwd();
|
|
19
|
+
const solutionYamlPath = path.join(solutionDir, 'solution.yaml');
|
|
20
|
+
if (!fsUtils.exists(solutionYamlPath)) {
|
|
21
|
+
throw 'No solution.yaml found in the current directory.\nRun `jl solution create` first.';
|
|
22
|
+
}
|
|
23
|
+
const assetsDir = path.join(solutionDir, 'assets');
|
|
24
|
+
const assetDir = path.join(assetsDir, name);
|
|
25
|
+
if (fsUtils.exists(assetDir) && !options.force) {
|
|
26
|
+
throw `Asset '${name}' already exists at ${assetDir}. Use --force to overwrite.`;
|
|
27
|
+
}
|
|
28
|
+
const PluginClass = await getPlugin(type);
|
|
29
|
+
const plugin = new PluginClass();
|
|
30
|
+
await plugin.canRun();
|
|
31
|
+
await plugin.run(name, options, assetsDir);
|
|
32
|
+
await plugin.combine(solutionDir, name);
|
|
33
|
+
await plugin.finalize();
|
|
34
|
+
console.log(`${term.green('✓')} Asset ${term.bold(name)} (${type}) created at assets/${name}/`);
|
|
35
|
+
console.log(`${term.green('✓')} Reference added to solution.yaml`);
|
|
36
|
+
}
|
|
37
|
+
export default assetCreate;
|
|
38
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../lib/asset/create.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,OAAO,MAAM,gBAAgB,CAAA;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AACzC,OAAO,IAAI,MAAM,YAAY,CAAA;AAE7B,MAAM,UAAU,GAAG,sCAAsC,CAAA;AAQzD,KAAK,UAAU,WAAW,CAAC,IAAc,EAAE,UAA8B,EAAE;IACvE,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;IACpB,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,MAAM,qEAAqE,CAAA;IAC/E,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,CAAA;IACpC,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,MAAM,4BAA4B,CAAA;IACtC,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,MAAM,uBAAuB,IAAI,sEAAsE,CAAA;IAC3G,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;IACjC,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAA;IAChE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACpC,MAAM,mFAAmF,CAAA;IAC7F,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAA;IAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;IAC3C,IAAI,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC7C,MAAM,UAAU,IAAI,uBAAuB,QAAQ,6BAA6B,CAAA;IACpF,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,CAAA;IACzC,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAA;IAEhC,MAAM,MAAM,CAAC,MAAM,EAAE,CAAA;IACrB,MAAM,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,CAAA;IAC1C,MAAM,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,CAAA;IACvC,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAA;IAEvB,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,uBAAuB,IAAI,GAAG,CAAC,CAAA;IAC/F,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAA;AACtE,CAAC;AAED,eAAe,WAAW,CAAA"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import fsUtils from '../fs-utils.js';
|
|
3
|
+
import yaml from '../yaml.js';
|
|
4
|
+
import term from '../term.js';
|
|
5
|
+
import { getPlugin } from './discover.js';
|
|
6
|
+
import { CliError } from '../errors.js';
|
|
7
|
+
const NAME_REGEX = /^[a-z0-9]([-a-z0-9]{0,61}[a-z0-9])?$/;
|
|
8
|
+
async function assetDelete(args) {
|
|
9
|
+
const name = args[0];
|
|
10
|
+
if (!name) {
|
|
11
|
+
throw 'Asset name is required. Usage: jl asset delete <name>';
|
|
12
|
+
}
|
|
13
|
+
if (!NAME_REGEX.test(name)) {
|
|
14
|
+
throw new CliError('ASSET_NAME_INVALID', `Invalid asset name '${name}'. Use lowercase letters, digits, and hyphens only (DNS-compatible).`);
|
|
15
|
+
}
|
|
16
|
+
const solutionDir = process.cwd();
|
|
17
|
+
const solutionYamlPath = path.join(solutionDir, 'solution.yaml');
|
|
18
|
+
if (!fsUtils.exists(solutionYamlPath)) {
|
|
19
|
+
throw 'No solution.yaml found in the current directory.';
|
|
20
|
+
}
|
|
21
|
+
const assetDir = path.join(solutionDir, 'assets', name);
|
|
22
|
+
if (!fsUtils.exists(assetDir)) {
|
|
23
|
+
throw `Asset '${name}' not found at assets/${name}/`;
|
|
24
|
+
}
|
|
25
|
+
// Read the asset type from asset.yaml and call the plugin's delete hook
|
|
26
|
+
const assetYamlPath = path.join(assetDir, 'asset.yaml');
|
|
27
|
+
if (fsUtils.exists(assetYamlPath)) {
|
|
28
|
+
const assetYaml = yaml.readYAML(assetYamlPath);
|
|
29
|
+
const type = assetYaml.type;
|
|
30
|
+
if (type) {
|
|
31
|
+
let PluginClass = null;
|
|
32
|
+
try {
|
|
33
|
+
PluginClass = await getPlugin(type);
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
// Unknown plugin type — proceed with deletion anyway
|
|
37
|
+
}
|
|
38
|
+
if (PluginClass) {
|
|
39
|
+
await new PluginClass().delete(name, solutionDir);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// Remove the asset directory
|
|
44
|
+
fsUtils.rmSync(assetDir, { recursive: true, force: true });
|
|
45
|
+
// Remove the asset reference from solution.yaml
|
|
46
|
+
yaml.updateYAML(solutionYamlPath, doc => {
|
|
47
|
+
if (!Array.isArray(doc.assets)) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const ref = `./assets/${name}/asset.yaml`;
|
|
51
|
+
doc.assets = doc.assets.filter(a => a?.ref !== ref);
|
|
52
|
+
});
|
|
53
|
+
console.log(`${term.green('✓')} Asset ${term.bold(name)} deleted`);
|
|
54
|
+
console.log(`${term.green('✓')} Reference removed from solution.yaml`);
|
|
55
|
+
}
|
|
56
|
+
export default assetDelete;
|
|
57
|
+
//# sourceMappingURL=delete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../lib/asset/delete.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
4
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
5
|
+
const PLUGINS_DIR = path.join(__dirname, '..', 'plugins');
|
|
6
|
+
/**
|
|
7
|
+
* Scans lib/plugins/ for subdirectories that contain an index.js.
|
|
8
|
+
* Looks for index.js (not index.ts) because this function runs from dist/ where
|
|
9
|
+
* TypeScript sources have already been compiled; the source index.ts files are
|
|
10
|
+
* not present at runtime. Adapted from @sap/cds-dk lib/init/add.js readPlugins().
|
|
11
|
+
* Returns a Map of type-name → PluginClass.
|
|
12
|
+
*/
|
|
13
|
+
async function discoverPlugins() {
|
|
14
|
+
const plugins = new Map();
|
|
15
|
+
if (!fs.existsSync(PLUGINS_DIR)) {
|
|
16
|
+
return plugins;
|
|
17
|
+
}
|
|
18
|
+
for (const entry of fs.readdirSync(PLUGINS_DIR, { withFileTypes: true })) {
|
|
19
|
+
if (!entry.isDirectory()) {
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
const indexPath = path.join(PLUGINS_DIR, entry.name, 'index.js');
|
|
23
|
+
if (fs.existsSync(indexPath)) {
|
|
24
|
+
const mod = await import(pathToFileURL(indexPath).href);
|
|
25
|
+
plugins.set(entry.name, mod.default);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return plugins;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Returns the plugin class for a given asset type name.
|
|
32
|
+
* Throws a descriptive string error if the type is not found.
|
|
33
|
+
*/
|
|
34
|
+
async function getPlugin(typeName) {
|
|
35
|
+
const plugins = await discoverPlugins();
|
|
36
|
+
if (!plugins.has(typeName)) {
|
|
37
|
+
const available = [...plugins.keys()];
|
|
38
|
+
const hint = available.length
|
|
39
|
+
? `\nAvailable types: ${available.join(', ')}`
|
|
40
|
+
: '\nNo asset type plugins found in lib/plugins/.';
|
|
41
|
+
throw `Unknown asset type '${typeName}'.${hint}`;
|
|
42
|
+
}
|
|
43
|
+
return plugins.get(typeName);
|
|
44
|
+
}
|
|
45
|
+
export { discoverPlugins, getPlugin };
|
|
46
|
+
//# sourceMappingURL=discover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../../../lib/asset/discover.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAGvD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AAC9D,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC,CAAA;AAEzD;;;;;;GAMG;AACH,KAAK,UAAU,eAAe;IAC1B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAyB,CAAA;IAChD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC9B,OAAO,OAAO,CAAA;IAClB,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,WAAW,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACvE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACvB,SAAQ;QACZ,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;QAChE,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAA;YACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;QACxC,CAAC;IACL,CAAC;IACD,OAAO,OAAO,CAAA;AAClB,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,SAAS,CAAC,QAAgB;IACrC,MAAM,OAAO,GAAG,MAAM,eAAe,EAAE,CAAA;IACvC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;QACrC,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM;YACzB,CAAC,CAAC,sBAAsB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YAC9C,CAAC,CAAC,gDAAgD,CAAA;QACtD,MAAM,uBAAuB,QAAQ,KAAK,IAAI,EAAE,CAAA;IACpD,CAAC;IACD,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAkB,CAAA;AACjD,CAAC;AAED,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,CAAA"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { chmodSync, existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { createCipheriv, createDecipheriv, randomBytes } from 'node:crypto';
|
|
3
|
+
import { execFileSync, execSync } from 'node:child_process';
|
|
4
|
+
import os from 'node:os';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
const JOULEWORK_DIR = path.join(os.homedir(), '.joulestudio');
|
|
7
|
+
const KEY_FILE = path.join(JOULEWORK_DIR, '.key');
|
|
8
|
+
const CREDS_FILE = path.join(JOULEWORK_DIR, 'credentials.json');
|
|
9
|
+
const KEYCHAIN_SERVICE = 'joule-studio-dev-cli';
|
|
10
|
+
const KEYCHAIN_ACCOUNT = os.userInfo().username;
|
|
11
|
+
const HEX_KEY_RE = /^[0-9a-f]{64}$/;
|
|
12
|
+
const STAMPED_KEY_RE = /^(\d+):([0-9a-f]{64})$/;
|
|
13
|
+
const KEY_MAX_AGE_MS = 365 * 24 * 60 * 60 * 1000;
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// OS key store
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
function keychainRead() {
|
|
18
|
+
try {
|
|
19
|
+
if (process.platform !== 'darwin') {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
return (execFileSync('security', ['find-generic-password', '-s', KEYCHAIN_SERVICE, '-a', KEYCHAIN_ACCOUNT, '-w'], {
|
|
23
|
+
encoding: 'utf8',
|
|
24
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
25
|
+
timeout: 5000,
|
|
26
|
+
}).trim() || null);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function keychainWrite(stored) {
|
|
33
|
+
try {
|
|
34
|
+
if (process.platform !== 'darwin') {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
execFileSync('security', ['add-generic-password', '-s', KEYCHAIN_SERVICE, '-a', KEYCHAIN_ACCOUNT, '-w', stored, '-U'], { stdio: ['pipe', 'pipe', 'pipe'], timeout: 5000 });
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function keyFileRead() {
|
|
45
|
+
if (!existsSync(KEY_FILE)) {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
try {
|
|
49
|
+
if (process.platform === 'win32') {
|
|
50
|
+
// Key file holds a DPAPI-encrypted blob (CurrentUser scope).
|
|
51
|
+
const escapedPath = KEY_FILE.replaceAll("'", "''");
|
|
52
|
+
return (execSync(`powershell -NoProfile -NonInteractive -Command "Add-Type -AssemblyName System.Security; [Text.Encoding]::UTF8.GetString([Security.Cryptography.ProtectedData]::Unprotect([System.IO.File]::ReadAllBytes('${escapedPath}'),$null,'CurrentUser'))"`, { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'], timeout: 5000 }).trim() || null);
|
|
53
|
+
}
|
|
54
|
+
return readFileSync(KEY_FILE, 'utf8').trim() || null;
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function keyFileWrite(stored) {
|
|
61
|
+
mkdirSync(JOULEWORK_DIR, { recursive: true });
|
|
62
|
+
if (process.platform === 'win32') {
|
|
63
|
+
// stored is passed via stdin to avoid exposing key material in the process argument list.
|
|
64
|
+
const encryptedB64 = execSync('powershell -NoProfile -NonInteractive -Command "Add-Type -AssemblyName System.Security; $h = $input | Out-String; $h = $h.Trim(); [Convert]::ToBase64String([Security.Cryptography.ProtectedData]::Protect([Text.Encoding]::UTF8.GetBytes($h),$null,\'CurrentUser\'))"', { encoding: 'utf8', input: stored, stdio: ['pipe', 'pipe', 'pipe'], timeout: 5000 }).trim();
|
|
65
|
+
writeFileSync(KEY_FILE, Buffer.from(encryptedB64, 'base64'));
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
writeFileSync(KEY_FILE, stored, { mode: 0o400 });
|
|
69
|
+
chmodSync(KEY_FILE, 0o400);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// ---------------------------------------------------------------------------
|
|
73
|
+
// Key lifecycle
|
|
74
|
+
// ---------------------------------------------------------------------------
|
|
75
|
+
let cachedKey = null;
|
|
76
|
+
function parseStoredKey(raw) {
|
|
77
|
+
const stamped = STAMPED_KEY_RE.exec(raw);
|
|
78
|
+
if (stamped) {
|
|
79
|
+
return { hex: stamped[2], createdAt: Number.parseInt(stamped[1], 10) };
|
|
80
|
+
}
|
|
81
|
+
// Backward compat: plain hex with no timestamp — treat as age 0 to trigger rotation.
|
|
82
|
+
if (HEX_KEY_RE.test(raw)) {
|
|
83
|
+
return { hex: raw, createdAt: 0 };
|
|
84
|
+
}
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
function loadKey() {
|
|
88
|
+
const raw = keychainRead() ?? keyFileRead();
|
|
89
|
+
return raw ? parseStoredKey(raw) : null;
|
|
90
|
+
}
|
|
91
|
+
function generateAndPersistKey() {
|
|
92
|
+
const hex = randomBytes(32).toString('hex');
|
|
93
|
+
const stored = `${Date.now()}:${hex}`;
|
|
94
|
+
if (!keychainWrite(stored)) {
|
|
95
|
+
keyFileWrite(stored); // throws on failure — better than silently saving unreadable data
|
|
96
|
+
}
|
|
97
|
+
return hex;
|
|
98
|
+
}
|
|
99
|
+
function getKey() {
|
|
100
|
+
if (cachedKey) {
|
|
101
|
+
return cachedKey;
|
|
102
|
+
}
|
|
103
|
+
const loaded = loadKey();
|
|
104
|
+
let hex;
|
|
105
|
+
if (!loaded || Date.now() - loaded.createdAt > KEY_MAX_AGE_MS) {
|
|
106
|
+
// Key missing or older than 365 days — rotate. Old credentials are unreadable
|
|
107
|
+
// after rotation; the user re-logs in (sessions are short-lived anyway).
|
|
108
|
+
if (existsSync(CREDS_FILE)) {
|
|
109
|
+
rmSync(CREDS_FILE);
|
|
110
|
+
console.warn('Stored credentials cleared after encryption key rotation. Please run: jl login');
|
|
111
|
+
}
|
|
112
|
+
hex = generateAndPersistKey();
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
hex = loaded.hex;
|
|
116
|
+
}
|
|
117
|
+
cachedKey = Buffer.from(hex, 'hex');
|
|
118
|
+
return cachedKey;
|
|
119
|
+
}
|
|
120
|
+
// ---------------------------------------------------------------------------
|
|
121
|
+
// AES-256-GCM encrypt / decrypt (exported public API)
|
|
122
|
+
// ---------------------------------------------------------------------------
|
|
123
|
+
export function encrypt(plaintext) {
|
|
124
|
+
const key = getKey();
|
|
125
|
+
const iv = randomBytes(12);
|
|
126
|
+
const cipher = createCipheriv('aes-256-gcm', key, iv);
|
|
127
|
+
const ciphertext = Buffer.concat([cipher.update(plaintext, 'utf8'), cipher.final()]);
|
|
128
|
+
const tag = cipher.getAuthTag();
|
|
129
|
+
return `${iv.toString('base64')}.${tag.toString('base64')}.${ciphertext.toString('base64')}`;
|
|
130
|
+
}
|
|
131
|
+
export function decrypt(encoded) {
|
|
132
|
+
try {
|
|
133
|
+
const [ivB64, tagB64, ctB64] = encoded.split('.');
|
|
134
|
+
if (!ivB64 || !tagB64 || !ctB64) {
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
const key = getKey();
|
|
138
|
+
const decipher = createDecipheriv('aes-256-gcm', key, Buffer.from(ivB64, 'base64'));
|
|
139
|
+
decipher.setAuthTag(Buffer.from(tagB64, 'base64'));
|
|
140
|
+
return Buffer.concat([decipher.update(Buffer.from(ctB64, 'base64')), decipher.final()]).toString('utf8');
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=auth-crypto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-crypto.js","sourceRoot":"","sources":["../../lib/auth-crypto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAC/F,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAC3E,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC3D,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,cAAc,CAAC,CAAA;AAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAA;AACjD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAA;AAC/D,MAAM,gBAAgB,GAAG,sBAAsB,CAAA;AAC/C,MAAM,gBAAgB,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAA;AAC/C,MAAM,UAAU,GAAG,gBAAgB,CAAA;AACnC,MAAM,cAAc,GAAG,wBAAwB,CAAA;AAC/C,MAAM,cAAc,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;AAEhD,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E,SAAS,YAAY;IACjB,IAAI,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAChC,OAAO,IAAI,CAAA;QACf,CAAC;QACD,OAAO,CACH,YAAY,CAAC,UAAU,EAAE,CAAC,uBAAuB,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,CAAC,EAAE;YACtG,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YAC/B,OAAO,EAAE,IAAI;SAChB,CAAC,CAAC,IAAI,EAAE,IAAI,IAAI,CACpB,CAAA;IACL,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAA;IACf,CAAC;AACL,CAAC;AAED,SAAS,aAAa,CAAC,MAAc;IACjC,IAAI,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAChC,OAAO,KAAK,CAAA;QAChB,CAAC;QACD,YAAY,CACR,UAAU,EACV,CAAC,sBAAsB,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAC5F,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CACrD,CAAA;QACD,OAAO,IAAI,CAAA;IACf,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAA;IAChB,CAAC;AACL,CAAC;AAED,SAAS,WAAW;IAChB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxB,OAAO,IAAI,CAAA;IACf,CAAC;IACD,IAAI,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YAC/B,6DAA6D;YAC7D,MAAM,WAAW,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;YAClD,OAAO,CACH,QAAQ,CACJ,4MAA4M,WAAW,2BAA2B,EAClP,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CACvE,CAAC,IAAI,EAAE,IAAI,IAAI,CACnB,CAAA;QACL,CAAC;QACD,OAAO,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,IAAI,CAAA;IACxD,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAA;IACf,CAAC;AACL,CAAC;AAED,SAAS,YAAY,CAAC,MAAc;IAChC,SAAS,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC7C,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QAC/B,0FAA0F;QAC1F,MAAM,YAAY,GAAG,QAAQ,CACzB,wQAAwQ,EACxQ,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CACtF,CAAC,IAAI,EAAE,CAAA;QACR,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAA;IAChE,CAAC;SAAM,CAAC;QACJ,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QAChD,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;IAC9B,CAAC;AACL,CAAC;AAED,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E,IAAI,SAAS,GAAkB,IAAI,CAAA;AAEnC,SAAS,cAAc,CAAC,GAAW;IAC/B,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACxC,IAAI,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAA;IAC1E,CAAC;IACD,qFAAqF;IACrF,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,CAAA;IACrC,CAAC;IACD,OAAO,IAAI,CAAA;AACf,CAAC;AAED,SAAS,OAAO;IACZ,MAAM,GAAG,GAAG,YAAY,EAAE,IAAI,WAAW,EAAE,CAAA;IAC3C,OAAO,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AAC3C,CAAC;AAED,SAAS,qBAAqB;IAC1B,MAAM,GAAG,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC3C,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,GAAG,EAAE,CAAA;IACrC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,YAAY,CAAC,MAAM,CAAC,CAAA,CAAC,kEAAkE;IAC3F,CAAC;IACD,OAAO,GAAG,CAAA;AACd,CAAC;AAED,SAAS,MAAM;IACX,IAAI,SAAS,EAAE,CAAC;QACZ,OAAO,SAAS,CAAA;IACpB,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,EAAE,CAAA;IACxB,IAAI,GAAW,CAAA;IACf,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,SAAS,GAAG,cAAc,EAAE,CAAC;QAC5D,8EAA8E;QAC9E,yEAAyE;QACzE,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,UAAU,CAAC,CAAA;YAClB,OAAO,CAAC,IAAI,CAAC,gFAAgF,CAAC,CAAA;QAClG,CAAC;QACD,GAAG,GAAG,qBAAqB,EAAE,CAAA;IACjC,CAAC;SAAM,CAAC;QACJ,GAAG,GAAG,MAAM,CAAC,GAAG,CAAA;IACpB,CAAC;IACD,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IACnC,OAAO,SAAS,CAAA;AACpB,CAAC;AAED,8EAA8E;AAC9E,uDAAuD;AACvD,8EAA8E;AAE9E,MAAM,UAAU,OAAO,CAAC,SAAiB;IACrC,MAAM,GAAG,GAAG,MAAM,EAAE,CAAA;IACpB,MAAM,EAAE,GAAG,WAAW,CAAC,EAAE,CAAC,CAAA;IAC1B,MAAM,MAAM,GAAG,cAAc,CAAC,aAAa,EAAE,GAAG,EAAE,EAAE,CAAC,CAAA;IACrD,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;IACpF,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,EAAE,CAAA;IAC/B,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAA;AAChG,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,OAAe;IACnC,IAAI,CAAC;QACD,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACjD,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAA;QACf,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,EAAE,CAAA;QACpB,MAAM,QAAQ,GAAG,gBAAgB,CAAC,aAAa,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAA;QACnF,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAA;QAClD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;IAC5G,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAA;IACf,CAAC;AACL,CAAC"}
|