@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,186 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import zlib from 'node:zlib';
|
|
4
|
+
import fsUtils from '../fs-utils.js';
|
|
5
|
+
import yaml from '../yaml.js';
|
|
6
|
+
import term from '../term.js';
|
|
7
|
+
import { CliError } from '../errors.js';
|
|
8
|
+
import { BUILD_FILE_RE } from './util/build-file.js';
|
|
9
|
+
function writeUInt32LE(buf, value, offset) {
|
|
10
|
+
buf[offset] = value & 0xff;
|
|
11
|
+
buf[offset + 1] = (value >> 8) & 0xff;
|
|
12
|
+
buf[offset + 2] = (value >> 16) & 0xff;
|
|
13
|
+
buf[offset + 3] = (value >> 24) & 0xff;
|
|
14
|
+
}
|
|
15
|
+
function writeUInt16LE(buf, value, offset) {
|
|
16
|
+
buf[offset] = value & 0xff;
|
|
17
|
+
buf[offset + 1] = (value >> 8) & 0xff;
|
|
18
|
+
}
|
|
19
|
+
const crc32 = data => {
|
|
20
|
+
if (!crc32.table) {
|
|
21
|
+
const t = new Uint32Array(256);
|
|
22
|
+
for (let i = 0; i < 256; i++) {
|
|
23
|
+
let c = i;
|
|
24
|
+
for (let j = 0; j < 8; j++) {
|
|
25
|
+
c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;
|
|
26
|
+
}
|
|
27
|
+
t[i] = c;
|
|
28
|
+
}
|
|
29
|
+
crc32.table = t;
|
|
30
|
+
}
|
|
31
|
+
let crc = 0xffffffff;
|
|
32
|
+
for (const byte of data) {
|
|
33
|
+
crc = crc32.table[(crc ^ byte) & 0xff] ^ (crc >>> 8);
|
|
34
|
+
}
|
|
35
|
+
return (crc ^ 0xffffffff) >>> 0;
|
|
36
|
+
};
|
|
37
|
+
function createZipArchive(sourceDir, outputPath, includePaths = []) {
|
|
38
|
+
const entries = [];
|
|
39
|
+
function collectDir(dir, base) {
|
|
40
|
+
for (const name of fs.readdirSync(dir)) {
|
|
41
|
+
if (name.startsWith('.')) {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
const rel = `${base}/${name}`;
|
|
45
|
+
const full = path.join(dir, name);
|
|
46
|
+
const stat = fs.statSync(full);
|
|
47
|
+
if (stat.isDirectory()) {
|
|
48
|
+
collectDir(full, rel);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
entries.push({ rel, full });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
for (const include of includePaths) {
|
|
56
|
+
const full = path.join(sourceDir, include);
|
|
57
|
+
if (!fs.existsSync(full)) {
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
const stat = fs.statSync(full);
|
|
61
|
+
if (stat.isDirectory()) {
|
|
62
|
+
collectDir(full, include);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
entries.push({ rel: include, full });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const localHeaders = [];
|
|
69
|
+
const chunks = [];
|
|
70
|
+
let offset = 0;
|
|
71
|
+
for (const { rel, full } of entries) {
|
|
72
|
+
const fileData = fs.readFileSync(full);
|
|
73
|
+
const compressed = zlib.deflateRawSync(fileData);
|
|
74
|
+
const nameBytes = Buffer.from(rel, 'utf8');
|
|
75
|
+
const crc = crc32(fileData);
|
|
76
|
+
const localHeader = Buffer.alloc(30 + nameBytes.length);
|
|
77
|
+
writeUInt32LE(localHeader, 0x04034b50, 0);
|
|
78
|
+
writeUInt16LE(localHeader, 20, 4);
|
|
79
|
+
writeUInt16LE(localHeader, 0, 6);
|
|
80
|
+
writeUInt16LE(localHeader, 8, 8);
|
|
81
|
+
writeUInt16LE(localHeader, 0, 10);
|
|
82
|
+
writeUInt16LE(localHeader, 0, 12);
|
|
83
|
+
writeUInt32LE(localHeader, crc, 14);
|
|
84
|
+
writeUInt32LE(localHeader, compressed.length, 18);
|
|
85
|
+
writeUInt32LE(localHeader, fileData.length, 22);
|
|
86
|
+
writeUInt16LE(localHeader, nameBytes.length, 26);
|
|
87
|
+
writeUInt16LE(localHeader, 0, 28);
|
|
88
|
+
nameBytes.copy(localHeader, 30);
|
|
89
|
+
localHeaders.push({
|
|
90
|
+
nameBytes,
|
|
91
|
+
crc,
|
|
92
|
+
compressedSize: compressed.length,
|
|
93
|
+
uncompressedSize: fileData.length,
|
|
94
|
+
offset,
|
|
95
|
+
});
|
|
96
|
+
chunks.push(localHeader, compressed);
|
|
97
|
+
offset += localHeader.length + compressed.length;
|
|
98
|
+
}
|
|
99
|
+
const centralStart = offset;
|
|
100
|
+
for (const { nameBytes, crc, compressedSize, uncompressedSize, offset: fileOffset } of localHeaders) {
|
|
101
|
+
const central = Buffer.alloc(46 + nameBytes.length);
|
|
102
|
+
writeUInt32LE(central, 0x02014b50, 0);
|
|
103
|
+
writeUInt16LE(central, 20, 4);
|
|
104
|
+
writeUInt16LE(central, 20, 6);
|
|
105
|
+
writeUInt16LE(central, 0, 8);
|
|
106
|
+
writeUInt16LE(central, 8, 10);
|
|
107
|
+
writeUInt16LE(central, 0, 12);
|
|
108
|
+
writeUInt16LE(central, 0, 14);
|
|
109
|
+
writeUInt32LE(central, crc, 16);
|
|
110
|
+
writeUInt32LE(central, compressedSize, 20);
|
|
111
|
+
writeUInt32LE(central, uncompressedSize, 24);
|
|
112
|
+
writeUInt16LE(central, nameBytes.length, 28);
|
|
113
|
+
writeUInt16LE(central, 0, 30);
|
|
114
|
+
writeUInt16LE(central, 0, 32);
|
|
115
|
+
writeUInt16LE(central, 0, 34);
|
|
116
|
+
writeUInt16LE(central, 0, 36);
|
|
117
|
+
writeUInt32LE(central, 0, 38);
|
|
118
|
+
writeUInt32LE(central, fileOffset, 42);
|
|
119
|
+
nameBytes.copy(central, 46);
|
|
120
|
+
chunks.push(central);
|
|
121
|
+
offset += central.length;
|
|
122
|
+
}
|
|
123
|
+
const centralSize = offset - centralStart;
|
|
124
|
+
const eocd = Buffer.alloc(22);
|
|
125
|
+
writeUInt32LE(eocd, 0x06054b50, 0);
|
|
126
|
+
writeUInt16LE(eocd, 0, 4);
|
|
127
|
+
writeUInt16LE(eocd, 0, 6);
|
|
128
|
+
writeUInt16LE(eocd, localHeaders.length, 8);
|
|
129
|
+
writeUInt16LE(eocd, localHeaders.length, 10);
|
|
130
|
+
writeUInt32LE(eocd, centralSize, 12);
|
|
131
|
+
writeUInt32LE(eocd, centralStart, 16);
|
|
132
|
+
writeUInt16LE(eocd, 0, 20);
|
|
133
|
+
chunks.push(eocd);
|
|
134
|
+
fs.writeFileSync(outputPath, Buffer.concat(chunks));
|
|
135
|
+
}
|
|
136
|
+
async function solutionBuild(_args, _options = {}) {
|
|
137
|
+
const solutionDir = process.cwd();
|
|
138
|
+
const solutionYamlPath = path.join(solutionDir, 'solution.yaml');
|
|
139
|
+
if (!fsUtils.exists(solutionYamlPath)) {
|
|
140
|
+
throw 'solution.yaml not found in current directory';
|
|
141
|
+
}
|
|
142
|
+
let solutionYaml;
|
|
143
|
+
try {
|
|
144
|
+
solutionYaml = yaml.readYAML(solutionYamlPath);
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
throw new CliError('SOLUTION_YAML_PARSE_ERROR', `Failed to parse solution.yaml: ${error instanceof Error ? error.message : String(error)}`);
|
|
148
|
+
}
|
|
149
|
+
const metadata = solutionYaml?.metadata;
|
|
150
|
+
const name = metadata?.name;
|
|
151
|
+
const version = metadata?.version;
|
|
152
|
+
if (!name) {
|
|
153
|
+
throw 'metadata.name not found in solution.yaml';
|
|
154
|
+
}
|
|
155
|
+
if (!version) {
|
|
156
|
+
throw 'metadata.version not found in solution.yaml';
|
|
157
|
+
}
|
|
158
|
+
const buildDir = path.join(solutionDir, 'build');
|
|
159
|
+
fsUtils.mkdirp(buildDir);
|
|
160
|
+
const archiveName = `${name}-${version}.zip`;
|
|
161
|
+
const archivePath = path.join(buildDir, archiveName);
|
|
162
|
+
console.log(`Building solution ${term.bold(name)} version ${term.bold(version)}...`);
|
|
163
|
+
if (fsUtils.exists(archivePath)) {
|
|
164
|
+
fs.unlinkSync(archivePath);
|
|
165
|
+
}
|
|
166
|
+
const buildFilePath = path.join(solutionDir, '.build');
|
|
167
|
+
if (!fs.existsSync(buildFilePath)) {
|
|
168
|
+
throw new CliError('SOLUTION_BUILD_FILE_MISSING', "'.build' file not found. Run 'jl solution create' first.");
|
|
169
|
+
}
|
|
170
|
+
const buildFileContent = fs.readFileSync(buildFilePath, 'utf-8');
|
|
171
|
+
if (!BUILD_FILE_RE.test(buildFileContent)) {
|
|
172
|
+
throw new CliError('SOLUTION_BUILD_FILE_INVALID', "'.build' file has an invalid or missing solution_id.");
|
|
173
|
+
}
|
|
174
|
+
try {
|
|
175
|
+
createZipArchive(solutionDir, archivePath, ['.build', 'solution.yaml', 'assets']);
|
|
176
|
+
}
|
|
177
|
+
catch (error) {
|
|
178
|
+
throw new CliError('SOLUTION_BUILD_FAILED', error instanceof Error ? error.message : String(error));
|
|
179
|
+
}
|
|
180
|
+
const stats = fs.statSync(archivePath);
|
|
181
|
+
const sizeKB = (stats.size / 1024).toFixed(2);
|
|
182
|
+
console.log(`${term.green('✓')} Archive created: ${term.bold(archiveName)} (${sizeKB} KB)`);
|
|
183
|
+
console.log(` Location: ${path.relative(solutionDir, archivePath)}`);
|
|
184
|
+
}
|
|
185
|
+
export default solutionBuild;
|
|
186
|
+
//# sourceMappingURL=build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../../lib/solution/build.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import { randomUUID } from 'node:crypto';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import fsUtils from '../fs-utils.js';
|
|
6
|
+
import { render } from '../template.js';
|
|
7
|
+
import term from '../term.js';
|
|
8
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
9
|
+
const NAME_REGEX = /^[a-z0-9]([-a-z0-9]{0,61}[a-z0-9])?$/;
|
|
10
|
+
const TEMPLATE_PATH = path.join(__dirname, 'templates', 'solution.yaml.hbs');
|
|
11
|
+
async function solutionCreate(args, options = {}) {
|
|
12
|
+
const name = options.name || args[0];
|
|
13
|
+
if (!name) {
|
|
14
|
+
throw 'Option --name is required.';
|
|
15
|
+
}
|
|
16
|
+
if (!NAME_REGEX.test(name)) {
|
|
17
|
+
throw `Invalid solution name '${name}'. Use lowercase letters, digits, and hyphens only (DNS-compatible).`;
|
|
18
|
+
}
|
|
19
|
+
const targetDir = process.cwd();
|
|
20
|
+
const solutionYamlPath = path.join(targetDir, 'solution.yaml');
|
|
21
|
+
const assetsDir = path.join(targetDir, 'assets');
|
|
22
|
+
if (options.reset) {
|
|
23
|
+
if (fsUtils.isDir(assetsDir)) {
|
|
24
|
+
fs.rmSync(assetsDir, { recursive: true });
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
else if (fsUtils.exists(solutionYamlPath) && !options.force) {
|
|
28
|
+
throw 'A solution already exists in this directory. Use --force to overwrite solution.yaml, or --reset to overwrite solution.yaml and wipe assets/ ';
|
|
29
|
+
}
|
|
30
|
+
const description = options.description || '';
|
|
31
|
+
fsUtils.mkdirp(assetsDir);
|
|
32
|
+
const yamlContent = render(TEMPLATE_PATH, { name, description });
|
|
33
|
+
fsUtils.writeFile(solutionYamlPath, yamlContent);
|
|
34
|
+
const buildFilePath = path.join(targetDir, '.build');
|
|
35
|
+
if (!fs.existsSync(buildFilePath)) {
|
|
36
|
+
fsUtils.writeFile(buildFilePath, `solution_id=${randomUUID()}\n`);
|
|
37
|
+
}
|
|
38
|
+
const action = options.reset ? 'reset' : 'created';
|
|
39
|
+
console.log(`${term.green('✓')} Solution ${term.bold(name)} ${action}.`);
|
|
40
|
+
}
|
|
41
|
+
export default solutionCreate;
|
|
42
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../lib/solution/create.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,OAAO,MAAM,gBAAgB,CAAA;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACvC,OAAO,IAAI,MAAM,YAAY,CAAA;AAE7B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AAE9D,MAAM,UAAU,GAAG,sCAAsC,CAAA;AACzD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,mBAAmB,CAAC,CAAA;AAS5E,KAAK,UAAU,cAAc,CAAC,IAAc,EAAE,UAAiC,EAAE;IAC7E,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,0BAA0B,IAAI,sEAAsE,CAAA;IAC9G,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;IAC/B,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAA;IAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;IAEhD,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,IAAI,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAC7C,CAAC;IACL,CAAC;SAAM,IAAI,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC5D,MAAM,8IAA8I,CAAA;IACxJ,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,EAAE,CAAA;IAE7C,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IAEzB,MAAM,WAAW,GAAG,MAAM,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAA;IAChE,OAAO,CAAC,SAAS,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAA;IAEhD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;IACpD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,SAAS,CAAC,aAAa,EAAE,eAAe,UAAU,EAAE,IAAI,CAAC,CAAA;IACrE,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAA;IAClD,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,GAAG,CAAC,CAAA;AAC5E,CAAC;AAED,eAAe,cAAc,CAAA"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { authorizedFetch } from '../auth.js';
|
|
4
|
+
import * as context from '../context.js';
|
|
5
|
+
import term from '../term.js';
|
|
6
|
+
import { UUID_RE } from './util/build-file.js';
|
|
7
|
+
// TODO: temporary. drop this once .build is generated client-side and adopted by backend. (BUILDCORE-6257)
|
|
8
|
+
function backfillBuildFile(solutionId) {
|
|
9
|
+
if (!UUID_RE.test(solutionId))
|
|
10
|
+
return;
|
|
11
|
+
if (!fs.existsSync(path.join(process.cwd(), 'solution.yaml')))
|
|
12
|
+
return;
|
|
13
|
+
const existing = context.get().solution_id;
|
|
14
|
+
if (!existing) {
|
|
15
|
+
context.set('solution_id', solutionId);
|
|
16
|
+
console.log(` ${term.green('✓')} wrote .build with solution_id`);
|
|
17
|
+
}
|
|
18
|
+
else if (existing !== solutionId) {
|
|
19
|
+
// We overwrite solution_id because backend is still the source of truth
|
|
20
|
+
// TODO: remove this behavior once backend relies on the client to generate the ID (BUILDCORE-6257)
|
|
21
|
+
context.set('solution_id', solutionId);
|
|
22
|
+
console.log(` ${term.green('✓')} updated .build with backend solution_id (was: ${existing})`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export async function solutionDeploy(args, options = {}) {
|
|
26
|
+
const zipPath = options.file ?? args[0];
|
|
27
|
+
if (!zipPath) {
|
|
28
|
+
throw 'Usage: jl solution deploy <zip-file>';
|
|
29
|
+
}
|
|
30
|
+
const resolved = path.resolve(zipPath);
|
|
31
|
+
if (!fs.existsSync(resolved)) {
|
|
32
|
+
throw `File not found: ${resolved}`;
|
|
33
|
+
}
|
|
34
|
+
const content = fs.readFileSync(resolved).toString('base64');
|
|
35
|
+
process.stdout.write(`Deploying ${term.bold(path.basename(resolved))}...`);
|
|
36
|
+
const res = await authorizedFetch('/destinations/DYN_AGENTS_SERVICE/api/v1/solutions/deploy', {
|
|
37
|
+
method: 'POST',
|
|
38
|
+
headers: { 'Content-Type': 'application/json' },
|
|
39
|
+
body: JSON.stringify({ content }),
|
|
40
|
+
});
|
|
41
|
+
if (!res.ok) {
|
|
42
|
+
const text = await res.text().catch(() => '');
|
|
43
|
+
// TODO: the backend should return a dedicated error code for name conflicts
|
|
44
|
+
// so we don't have to match on the error message string
|
|
45
|
+
if (res.status === 403 && text.toLowerCase().includes('owner')) {
|
|
46
|
+
throw `Deploy failed (403): a solution with this name already exists and is owned by someone else.\nRename your solution in ${term.bold('solution.yaml')} and rebuild before deploying.`;
|
|
47
|
+
}
|
|
48
|
+
throw `\nDeploy failed (${res.status})${text ? ': ' + text : ''}`;
|
|
49
|
+
}
|
|
50
|
+
const data = (await res.json().catch(() => null));
|
|
51
|
+
process.stdout.write(' ' + term.green('✓') + '\n');
|
|
52
|
+
const solutionId = data?.solutionId;
|
|
53
|
+
const jobId = data?.ID;
|
|
54
|
+
const name = data?.name;
|
|
55
|
+
if (name) {
|
|
56
|
+
console.log(` name: ${term.bold(String(name))}`);
|
|
57
|
+
}
|
|
58
|
+
if (solutionId) {
|
|
59
|
+
console.log(` solutionId: ${term.dim(String(solutionId))}`);
|
|
60
|
+
backfillBuildFile(String(solutionId));
|
|
61
|
+
}
|
|
62
|
+
if (jobId) {
|
|
63
|
+
console.log(` jobId: ${term.dim(String(jobId))}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=deploy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../../lib/solution/deploy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { authorizedFetch } from '../auth.js';
|
|
2
|
+
import term from '../term.js';
|
|
3
|
+
export async function solutionList() {
|
|
4
|
+
const res = await authorizedFetch('/destinations/DYN_AGENTS_SERVICE/api/v1/solutions');
|
|
5
|
+
if (!res.ok) {
|
|
6
|
+
throw `Failed to fetch solutions (${res.status}).`;
|
|
7
|
+
}
|
|
8
|
+
const data = (await res.json());
|
|
9
|
+
const solutions = Array.isArray(data) ? data : (data.value ?? data.items ?? data.data ?? []);
|
|
10
|
+
if (solutions.length === 0) {
|
|
11
|
+
console.log(term.dim('No solutions found.'));
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
for (const s of solutions) {
|
|
15
|
+
const name = s.name ?? s.id ?? JSON.stringify(s);
|
|
16
|
+
const id = s.ID && s.ID !== name ? term.dim(` (${s.ID})`) : '';
|
|
17
|
+
const desc = s.description ? term.dim(` — ${s.description}`) : '';
|
|
18
|
+
console.log(` ${term.bold(String(name))}${id}${desc}`);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../lib/solution/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,IAAI,MAAM,YAAY,CAAA;AAE7B,MAAM,CAAC,KAAK,UAAU,YAAY;IAC9B,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,mDAAmD,CAAC,CAAA;IAEtF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACV,MAAM,8BAA8B,GAAG,CAAC,MAAM,IAAI,CAAA;IACtD,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA4B,CAAA;IAC1D,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAe,CAAA;IAE3G,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAA;QAC5C,OAAM;IACV,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,SAAsC,EAAE,CAAC;QACrD,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;QAChD,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QAC9D,MAAM,IAAI,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QACjE,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC,CAAA;IAC3D,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import readline from 'node:readline';
|
|
2
|
+
import { authorizedFetch } from '../auth.js';
|
|
3
|
+
import term from '../term.js';
|
|
4
|
+
const BASE = '/destinations/DYN_AGENTS_SERVICE/api/v1/solutions';
|
|
5
|
+
function ask(question) {
|
|
6
|
+
return new Promise(resolve => {
|
|
7
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
8
|
+
rl.question(question, ans => {
|
|
9
|
+
rl.close();
|
|
10
|
+
resolve(ans.trim());
|
|
11
|
+
});
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
async function pickSolution() {
|
|
15
|
+
const res = await authorizedFetch(BASE);
|
|
16
|
+
if (!res.ok) {
|
|
17
|
+
throw `Failed to fetch solutions (${res.status}).`;
|
|
18
|
+
}
|
|
19
|
+
const data = (await res.json());
|
|
20
|
+
const solutions = (Array.isArray(data) ? data : (data.value ?? data.items ?? data.data ?? []));
|
|
21
|
+
if (solutions.length === 0) {
|
|
22
|
+
throw 'No solutions found.';
|
|
23
|
+
}
|
|
24
|
+
solutions.forEach((s, i) => {
|
|
25
|
+
const id = s.ID ?? s.id ?? '';
|
|
26
|
+
console.log(` ${term.dim(`${i + 1})`)} ${term.bold(String(s.name ?? id))}${id && id !== s.name ? term.dim(' ' + id) : ''}`);
|
|
27
|
+
});
|
|
28
|
+
const idx = parseInt(await ask('\nPick a solution: '), 10) - 1;
|
|
29
|
+
if (isNaN(idx) || idx < 0 || idx >= solutions.length) {
|
|
30
|
+
throw 'Invalid selection.';
|
|
31
|
+
}
|
|
32
|
+
const chosen = solutions[idx];
|
|
33
|
+
return String(chosen.ID ?? chosen.id ?? chosen.name);
|
|
34
|
+
}
|
|
35
|
+
async function resolveVersion(id, hint) {
|
|
36
|
+
if (hint) {
|
|
37
|
+
return hint;
|
|
38
|
+
}
|
|
39
|
+
const res = await authorizedFetch(`${BASE}/${id}/versions`);
|
|
40
|
+
if (!res.ok) {
|
|
41
|
+
return 'main';
|
|
42
|
+
}
|
|
43
|
+
const data = (await res.json());
|
|
44
|
+
const versions = (Array.isArray(data) ? data : (data.value ?? data.items ?? data.data ?? []));
|
|
45
|
+
const first = versions[0];
|
|
46
|
+
return ((typeof first === 'string'
|
|
47
|
+
? first
|
|
48
|
+
: (first?.name ??
|
|
49
|
+
first?.id ??
|
|
50
|
+
first?.version)) ?? 'main');
|
|
51
|
+
}
|
|
52
|
+
async function pickJob(jobs) {
|
|
53
|
+
const recent = jobs.slice(-10).reverse();
|
|
54
|
+
recent.forEach((job, i) => {
|
|
55
|
+
const status = job.status_code ?? job.status ?? job.state ?? '?';
|
|
56
|
+
const ts = job.createdAt ?? job.startedAt ?? job.timestamp;
|
|
57
|
+
const time = ts ? term.dim(` ${new Date(String(ts)).toLocaleString()}`) : '';
|
|
58
|
+
console.log(` ${term.dim(`${i + 1})`)} ${term.bold(String(status))}${time} ${term.dim(String(job.ID ?? job.id ?? ''))}`);
|
|
59
|
+
});
|
|
60
|
+
const idx = parseInt(await ask('\nPick a job: '), 10) - 1;
|
|
61
|
+
if (isNaN(idx) || idx < 0 || idx >= recent.length) {
|
|
62
|
+
throw 'Invalid selection.';
|
|
63
|
+
}
|
|
64
|
+
return String(recent[idx].ID ?? recent[idx].id ?? recent[idx].jobId);
|
|
65
|
+
}
|
|
66
|
+
export async function solutionLogs(args, options = {}) {
|
|
67
|
+
const isTTY = process.stdin.isTTY;
|
|
68
|
+
let id = args[0];
|
|
69
|
+
if (!id) {
|
|
70
|
+
if (!isTTY) {
|
|
71
|
+
throw 'Usage: jl solution deploy logs <id> [--version <v>] [--job <job-id>] [--tail <n>]';
|
|
72
|
+
}
|
|
73
|
+
id = await pickSolution();
|
|
74
|
+
console.log();
|
|
75
|
+
}
|
|
76
|
+
const version = await resolveVersion(id, options.version);
|
|
77
|
+
let jobId = options.job;
|
|
78
|
+
if (!jobId) {
|
|
79
|
+
const jobsRes = await authorizedFetch(`${BASE}/${id}/versions/${version}/deploymentJobs`);
|
|
80
|
+
if (!jobsRes.ok || jobsRes.status === 404) {
|
|
81
|
+
throw 'No deployment jobs found for this solution.';
|
|
82
|
+
}
|
|
83
|
+
const jobsData = (await jobsRes.json());
|
|
84
|
+
const jobs = (Array.isArray(jobsData) ? jobsData : (jobsData.value ?? jobsData.items ?? jobsData.data ?? []));
|
|
85
|
+
if (jobs.length === 0) {
|
|
86
|
+
throw 'No deployment jobs found for this solution.';
|
|
87
|
+
}
|
|
88
|
+
if (jobs.length === 1) {
|
|
89
|
+
jobId = String(jobs[0].ID ?? jobs[0].id ?? jobs[0].jobId);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
if (!isTTY) {
|
|
93
|
+
throw 'Multiple jobs found. Specify --job <job-id>';
|
|
94
|
+
}
|
|
95
|
+
jobId = await pickJob(jobs);
|
|
96
|
+
console.log();
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
const params = new URLSearchParams();
|
|
100
|
+
if (options.tail) {
|
|
101
|
+
params.set('tail', options.tail);
|
|
102
|
+
}
|
|
103
|
+
if (options.limit) {
|
|
104
|
+
params.set('limit', options.limit);
|
|
105
|
+
}
|
|
106
|
+
const query = params.size ? `?${params}` : '';
|
|
107
|
+
const logsRes = await authorizedFetch(`${BASE}/${id}/versions/${version}/deploymentJobs(${jobId})/logs()${query}`);
|
|
108
|
+
if (logsRes.status === 404) {
|
|
109
|
+
throw 'Logs unavailable — they may have expired or been cleaned up for this job.';
|
|
110
|
+
}
|
|
111
|
+
if (!logsRes.ok) {
|
|
112
|
+
throw `Failed to fetch logs (${logsRes.status}).`;
|
|
113
|
+
}
|
|
114
|
+
const data = (await logsRes.json());
|
|
115
|
+
const lines = data.logs ?? data.lines ?? data.value ?? data;
|
|
116
|
+
if (Array.isArray(lines)) {
|
|
117
|
+
for (const line of lines) {
|
|
118
|
+
const text = typeof line === 'string'
|
|
119
|
+
? line
|
|
120
|
+
: (line.message ??
|
|
121
|
+
line.log ??
|
|
122
|
+
JSON.stringify(line));
|
|
123
|
+
console.log(text);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
console.log(typeof lines === 'string' ? lines : JSON.stringify(lines, null, 2));
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=logs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../../lib/solution/logs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import readline from 'node:readline';
|
|
2
|
+
import { authorizedFetch } from '../auth.js';
|
|
3
|
+
import term from '../term.js';
|
|
4
|
+
const BASE = '/destinations/DYN_AGENTS_SERVICE/api/v1/solutions';
|
|
5
|
+
function statusColor(status = '') {
|
|
6
|
+
const s = status.toLowerCase();
|
|
7
|
+
if (s.includes('success') || s.includes('deployed') || s.includes('running')) {
|
|
8
|
+
return term.green(status);
|
|
9
|
+
}
|
|
10
|
+
if (s.includes('fail') || s.includes('error')) {
|
|
11
|
+
return term.red(status);
|
|
12
|
+
}
|
|
13
|
+
if (s.includes('progress') || s.includes('pending') || s.includes('queued')) {
|
|
14
|
+
return term.yellow(status);
|
|
15
|
+
}
|
|
16
|
+
return term.dim(status);
|
|
17
|
+
}
|
|
18
|
+
async function pickSolution() {
|
|
19
|
+
const res = await authorizedFetch(BASE);
|
|
20
|
+
if (!res.ok) {
|
|
21
|
+
throw `Failed to fetch solutions (${res.status}).`;
|
|
22
|
+
}
|
|
23
|
+
const data = (await res.json());
|
|
24
|
+
const solutions = (Array.isArray(data) ? data : (data.value ?? data.items ?? data.data ?? []));
|
|
25
|
+
if (solutions.length === 0) {
|
|
26
|
+
throw 'No solutions found.';
|
|
27
|
+
}
|
|
28
|
+
solutions.forEach((s, i) => {
|
|
29
|
+
const name = s.name ?? s.id ?? JSON.stringify(s);
|
|
30
|
+
const id = s.ID ?? s.id ?? '';
|
|
31
|
+
console.log(` ${term.dim(`${i + 1})`)} ${term.bold(String(name))}${id && id !== name ? term.dim(' ' + id) : ''}`);
|
|
32
|
+
});
|
|
33
|
+
const answer = await new Promise(resolve => {
|
|
34
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
35
|
+
rl.question('\nPick a solution: ', ans => {
|
|
36
|
+
rl.close();
|
|
37
|
+
resolve(ans.trim());
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
const idx = parseInt(answer, 10) - 1;
|
|
41
|
+
if (isNaN(idx) || idx < 0 || idx >= solutions.length) {
|
|
42
|
+
throw 'Invalid selection.';
|
|
43
|
+
}
|
|
44
|
+
const chosen = solutions[idx];
|
|
45
|
+
const id = String(chosen.ID ?? chosen.id ?? chosen.name);
|
|
46
|
+
const name = String(chosen.name ?? id);
|
|
47
|
+
return [id, name];
|
|
48
|
+
}
|
|
49
|
+
export async function solutionStatus(args, options = {}) {
|
|
50
|
+
let id = args[0];
|
|
51
|
+
let selectedName;
|
|
52
|
+
if (!id) {
|
|
53
|
+
if (!process.stdin.isTTY) {
|
|
54
|
+
throw 'Usage: jl solution deploy status <id> [--version <version>]';
|
|
55
|
+
}
|
|
56
|
+
;
|
|
57
|
+
[id, selectedName] = await pickSolution();
|
|
58
|
+
console.log(`\nSelected: ${term.bold(selectedName)} ${term.dim(id)}`);
|
|
59
|
+
}
|
|
60
|
+
const versionExplicit = !!options.version;
|
|
61
|
+
let version = options.version;
|
|
62
|
+
if (!version) {
|
|
63
|
+
const vRes = await authorizedFetch(`${BASE}/${id}/versions`);
|
|
64
|
+
if (vRes.ok) {
|
|
65
|
+
const vData = (await vRes.json());
|
|
66
|
+
const versions = (Array.isArray(vData) ? vData : (vData.value ?? vData.items ?? vData.data ?? []));
|
|
67
|
+
const first = versions[0];
|
|
68
|
+
version =
|
|
69
|
+
(typeof first === 'string'
|
|
70
|
+
? first
|
|
71
|
+
: (first?.name ??
|
|
72
|
+
first?.id ??
|
|
73
|
+
first?.version)) ?? 'main';
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
version = 'main';
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
const prefix = `${BASE}/${id}/versions/${version}`;
|
|
80
|
+
let [infoRes, jobsRes] = await Promise.all([
|
|
81
|
+
authorizedFetch(`${prefix}/deploymentInfo()`),
|
|
82
|
+
authorizedFetch(`${prefix}/deploymentJobs`),
|
|
83
|
+
]);
|
|
84
|
+
if (infoRes.status === 404 || jobsRes.status === 404) {
|
|
85
|
+
await new Promise(r => setTimeout(r, 1500));
|
|
86
|
+
[infoRes, jobsRes] = await Promise.all([
|
|
87
|
+
authorizedFetch(`${prefix}/deploymentInfo()`),
|
|
88
|
+
authorizedFetch(`${prefix}/deploymentJobs`),
|
|
89
|
+
]);
|
|
90
|
+
}
|
|
91
|
+
if (infoRes.status === 404 || jobsRes.status === 404) {
|
|
92
|
+
const hint = !versionExplicit ? ` Try ${term.bold('--version <version>')} to specify a different version.` : '';
|
|
93
|
+
console.log(term.dim(`No deployment found for this solution (version: ${version}).`) + hint);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (!infoRes.ok) {
|
|
97
|
+
throw `Failed to fetch deployment info (${infoRes.status}).`;
|
|
98
|
+
}
|
|
99
|
+
if (!jobsRes.ok) {
|
|
100
|
+
throw `Failed to fetch deployment jobs (${jobsRes.status}).`;
|
|
101
|
+
}
|
|
102
|
+
const info = (await infoRes.json());
|
|
103
|
+
const jobsData = (await jobsRes.json());
|
|
104
|
+
const jobs = (Array.isArray(jobsData) ? jobsData : (jobsData.value ?? jobsData.items ?? jobsData.data ?? []));
|
|
105
|
+
console.log(`\n${term.bold('Deployment Info')} ${term.dim(`(${id} version: ${version})`)}`);
|
|
106
|
+
const status = info.status ?? info.deploymentStatus ?? info.state;
|
|
107
|
+
if (status) {
|
|
108
|
+
console.log(` Status: ${statusColor(String(status))}`);
|
|
109
|
+
}
|
|
110
|
+
const url = info.url ?? info.appUrl ?? info.endpoint;
|
|
111
|
+
if (url) {
|
|
112
|
+
console.log(` URL: ${term.cyan(String(url))}`);
|
|
113
|
+
}
|
|
114
|
+
const assets = Array.isArray(info.assets) ? info.assets : [];
|
|
115
|
+
for (const asset of assets) {
|
|
116
|
+
const assetUrl = asset.url ?? asset.appUrl ?? asset.endpoint;
|
|
117
|
+
if (assetUrl) {
|
|
118
|
+
console.log(` ${term.bold(String(asset.asset_name ?? asset.name ?? 'asset'))}: ${term.cyan(String(assetUrl))}`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
const updated = info.updatedAt ?? info.modifiedAt ?? info.lastModified;
|
|
122
|
+
if (updated) {
|
|
123
|
+
console.log(` Updated: ${term.dim(new Date(String(updated)).toLocaleString())}`);
|
|
124
|
+
}
|
|
125
|
+
const knownKeys = new Set([
|
|
126
|
+
'status',
|
|
127
|
+
'deploymentStatus',
|
|
128
|
+
'state',
|
|
129
|
+
'url',
|
|
130
|
+
'appUrl',
|
|
131
|
+
'endpoint',
|
|
132
|
+
'updatedAt',
|
|
133
|
+
'modifiedAt',
|
|
134
|
+
'lastModified',
|
|
135
|
+
'assets',
|
|
136
|
+
]);
|
|
137
|
+
for (const [k, v] of Object.entries(info)) {
|
|
138
|
+
if (!knownKeys.has(k) &&
|
|
139
|
+
!k.startsWith('@') &&
|
|
140
|
+
v !== null &&
|
|
141
|
+
typeof v !== 'undefined' &&
|
|
142
|
+
typeof v !== 'object') {
|
|
143
|
+
console.log(` ${k}:`.padEnd(12) + term.dim(String(v)));
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
console.log(`\n${term.bold('Deployment Jobs')}`);
|
|
147
|
+
if (jobs.length === 0) {
|
|
148
|
+
console.log(` ${term.dim('No deployment jobs found.')}`);
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
const recent = jobs.slice(-10).reverse();
|
|
152
|
+
for (const job of recent) {
|
|
153
|
+
const jobStatus = job.status_code ?? job.deploymentStatus ?? job.status ?? job.state ?? '?';
|
|
154
|
+
const ts = job.createdAt ?? job.startedAt ?? job.timestamp;
|
|
155
|
+
const time = ts ? term.dim(new Date(String(ts)).toLocaleString()) : '';
|
|
156
|
+
const jobId = job.ID ?? job.id ?? job.jobId ?? '';
|
|
157
|
+
console.log(` ${statusColor(String(jobStatus)).padEnd(12)} ${time}${jobId ? term.dim(' ' + jobId) : ''}`);
|
|
158
|
+
}
|
|
159
|
+
console.log();
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=status.js.map
|