@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.
Files changed (119) hide show
  1. package/LICENSE +38 -0
  2. package/README.md +53 -0
  3. package/dist/bin/commands/a2a.js +12 -0
  4. package/dist/bin/commands/a2a.js.map +1 -0
  5. package/dist/bin/commands/asset.js +20 -0
  6. package/dist/bin/commands/asset.js.map +1 -0
  7. package/dist/bin/commands/auth.js +16 -0
  8. package/dist/bin/commands/auth.js.map +1 -0
  9. package/dist/bin/commands/init.js +20 -0
  10. package/dist/bin/commands/init.js.map +1 -0
  11. package/dist/bin/commands/mcp.js +42 -0
  12. package/dist/bin/commands/mcp.js.map +1 -0
  13. package/dist/bin/commands/pro-code.js +12 -0
  14. package/dist/bin/commands/pro-code.js.map +1 -0
  15. package/dist/bin/commands/skills.js +27 -0
  16. package/dist/bin/commands/skills.js.map +1 -0
  17. package/dist/bin/commands/solution.js +52 -0
  18. package/dist/bin/commands/solution.js.map +1 -0
  19. package/dist/bin/help.js +42 -0
  20. package/dist/bin/help.js.map +1 -0
  21. package/dist/bin/jl.js +59 -0
  22. package/dist/bin/jl.js.map +1 -0
  23. package/dist/bin/login.js +60 -0
  24. package/dist/bin/login.js.map +1 -0
  25. package/dist/bin/logout.js +21 -0
  26. package/dist/bin/logout.js.map +1 -0
  27. package/dist/lib/a2a/message.js +74 -0
  28. package/dist/lib/a2a/message.js.map +1 -0
  29. package/dist/lib/asset/create.js +38 -0
  30. package/dist/lib/asset/create.js.map +1 -0
  31. package/dist/lib/asset/delete.js +57 -0
  32. package/dist/lib/asset/delete.js.map +1 -0
  33. package/dist/lib/asset/discover.js +46 -0
  34. package/dist/lib/asset/discover.js.map +1 -0
  35. package/dist/lib/auth-crypto.js +146 -0
  36. package/dist/lib/auth-crypto.js.map +1 -0
  37. package/dist/lib/auth.js +488 -0
  38. package/dist/lib/auth.js.map +1 -0
  39. package/dist/lib/context.js +35 -0
  40. package/dist/lib/context.js.map +1 -0
  41. package/dist/lib/errors.js +47 -0
  42. package/dist/lib/errors.js.map +1 -0
  43. package/dist/lib/fs-utils.js +34 -0
  44. package/dist/lib/fs-utils.js.map +1 -0
  45. package/dist/lib/init/agents.js +55 -0
  46. package/dist/lib/init/agents.js.map +1 -0
  47. package/dist/lib/init/shared.js +172 -0
  48. package/dist/lib/init/shared.js.map +1 -0
  49. package/dist/lib/mcp/call.js +158 -0
  50. package/dist/lib/mcp/call.js.map +1 -0
  51. package/dist/lib/mcp/client.js +100 -0
  52. package/dist/lib/mcp/client.js.map +1 -0
  53. package/dist/lib/mcp/list.js +20 -0
  54. package/dist/lib/mcp/list.js.map +1 -0
  55. package/dist/lib/mcp/start.js +120 -0
  56. package/dist/lib/mcp/start.js.map +1 -0
  57. package/dist/lib/mcp/tools.js +162 -0
  58. package/dist/lib/mcp/tools.js.map +1 -0
  59. package/dist/lib/plugin.js +77 -0
  60. package/dist/lib/plugin.js.map +1 -0
  61. package/dist/lib/plugins/agent/index.js +32 -0
  62. package/dist/lib/plugins/agent/index.js.map +1 -0
  63. package/dist/lib/plugins/agent/templates/asset.yaml.hbs +31 -0
  64. package/dist/lib/plugins/agent-extension/index.js +32 -0
  65. package/dist/lib/plugins/agent-extension/index.js.map +1 -0
  66. package/dist/lib/plugins/agent-extension/templates/asset.yaml.hbs +15 -0
  67. package/dist/lib/plugins/base-ui/index.js +32 -0
  68. package/dist/lib/plugins/base-ui/index.js.map +1 -0
  69. package/dist/lib/plugins/base-ui/templates/asset.yaml.hbs +8 -0
  70. package/dist/lib/plugins/cap-app/index.js +32 -0
  71. package/dist/lib/plugins/cap-app/index.js.map +1 -0
  72. package/dist/lib/plugins/cap-app/templates/asset.yaml.hbs +37 -0
  73. package/dist/lib/plugins/data-product/index.js +32 -0
  74. package/dist/lib/plugins/data-product/index.js.map +1 -0
  75. package/dist/lib/plugins/data-product/templates/asset.yaml.hbs +9 -0
  76. package/dist/lib/plugins/domain-model-extension/index.js +37 -0
  77. package/dist/lib/plugins/domain-model-extension/index.js.map +1 -0
  78. package/dist/lib/plugins/domain-model-extension/templates/asset.yaml.hbs +15 -0
  79. package/dist/lib/plugins/mcp-server/index.js +36 -0
  80. package/dist/lib/plugins/mcp-server/index.js.map +1 -0
  81. package/dist/lib/plugins/mcp-server/templates/asset.yaml.hbs +9 -0
  82. package/dist/lib/plugins/n8n-workflow/index.js +52 -0
  83. package/dist/lib/plugins/n8n-workflow/index.js.map +1 -0
  84. package/dist/lib/plugins/n8n-workflow/templates/asset.yaml.hbs +18 -0
  85. package/dist/lib/plugins/n8n-workflow/validation/asset-validator.js +62 -0
  86. package/dist/lib/plugins/n8n-workflow/validation/asset-validator.js.map +1 -0
  87. package/dist/lib/plugins/n8n-workflow/validation/yaml-validator.js +51 -0
  88. package/dist/lib/plugins/n8n-workflow/validation/yaml-validator.js.map +1 -0
  89. package/dist/lib/plugins/vercel-app/index.js +32 -0
  90. package/dist/lib/plugins/vercel-app/index.js.map +1 -0
  91. package/dist/lib/plugins/vercel-app/templates/asset.yaml.hbs +12 -0
  92. package/dist/lib/rule.js +2 -0
  93. package/dist/lib/rule.js.map +1 -0
  94. package/dist/lib/schemas/solution-schema.json +178 -0
  95. package/dist/lib/solution/build.js +186 -0
  96. package/dist/lib/solution/build.js.map +1 -0
  97. package/dist/lib/solution/create.js +42 -0
  98. package/dist/lib/solution/create.js.map +1 -0
  99. package/dist/lib/solution/deploy.js +66 -0
  100. package/dist/lib/solution/deploy.js.map +1 -0
  101. package/dist/lib/solution/list.js +21 -0
  102. package/dist/lib/solution/list.js.map +1 -0
  103. package/dist/lib/solution/logs.js +130 -0
  104. package/dist/lib/solution/logs.js.map +1 -0
  105. package/dist/lib/solution/status.js +161 -0
  106. package/dist/lib/solution/status.js.map +1 -0
  107. package/dist/lib/solution/templates/solution.yaml.hbs +9 -0
  108. package/dist/lib/solution/util/build-file.js +4 -0
  109. package/dist/lib/solution/util/build-file.js.map +1 -0
  110. package/dist/lib/template.js +74 -0
  111. package/dist/lib/template.js.map +1 -0
  112. package/dist/lib/term.js +16 -0
  113. package/dist/lib/term.js.map +1 -0
  114. package/dist/lib/validate.js +287 -0
  115. package/dist/lib/validate.js.map +1 -0
  116. package/dist/lib/yaml.js +33 -0
  117. package/dist/lib/yaml.js.map +1 -0
  118. package/dist/package.json +77 -0
  119. 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":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,OAAO,MAAM,gBAAgB,CAAA;AACpC,OAAO,IAAI,MAAM,YAAY,CAAA;AAC7B,OAAO,IAAI,MAAM,YAAY,CAAA;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEpD,SAAS,aAAa,CAAC,GAAW,EAAE,KAAa,EAAE,MAAc;IAC7D,GAAG,CAAC,MAAM,CAAC,GAAG,KAAK,GAAG,IAAI,CAAA;IAC1B,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,IAAI,CAAA;IACrC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,IAAI,CAAA;IACtC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,IAAI,CAAA;AAC1C,CAAC;AAED,SAAS,aAAa,CAAC,GAAW,EAAE,KAAa,EAAE,MAAc;IAC7D,GAAG,CAAC,MAAM,CAAC,GAAG,KAAK,GAAG,IAAI,CAAA;IAC1B,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,IAAI,CAAA;AACzC,CAAC;AAOD,MAAM,KAAK,GAAY,IAAI,CAAC,EAAE;IAC1B,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,CAAA;QAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,IAAI,CAAC,GAAG,CAAC,CAAA;YACT,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBACzB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;YAChD,CAAC;YACD,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;QACZ,CAAC;QACD,KAAK,CAAC,KAAK,GAAG,CAAC,CAAA;IACnB,CAAC;IACD,IAAI,GAAG,GAAG,UAAU,CAAA;IACpB,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACtB,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAA;IACxD,CAAC;IACD,OAAO,CAAC,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAA;AACnC,CAAC,CAAA;AAeD,SAAS,gBAAgB,CAAC,SAAiB,EAAE,UAAkB,EAAE,eAAyB,EAAE;IACxF,MAAM,OAAO,GAAe,EAAE,CAAA;IAE9B,SAAS,UAAU,CAAC,GAAW,EAAE,IAAY;QACzC,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;YACrC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvB,SAAQ;YACZ,CAAC;YACD,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,EAAE,CAAA;YAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;YACjC,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;YAC9B,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBACrB,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;YACzB,CAAC;iBAAM,CAAC;gBACJ,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAA;YAC/B,CAAC;QACL,CAAC;IACL,CAAC;IAED,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;QAC1C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,SAAQ;QACZ,CAAC;QACD,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;QAC9B,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACrB,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QAC7B,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;QACxC,CAAC;IACL,CAAC;IAED,MAAM,YAAY,GAAwB,EAAE,CAAA;IAC5C,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,IAAI,MAAM,GAAG,CAAC,CAAA;IAEd,KAAK,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAA;QACtC,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAA;QAChD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;QAC1C,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAA;QAC3B,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,CAAA;QAEvD,aAAa,CAAC,WAAW,EAAE,UAAU,EAAE,CAAC,CAAC,CAAA;QACzC,aAAa,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;QACjC,aAAa,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QAChC,aAAa,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QAChC,aAAa,CAAC,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QACjC,aAAa,CAAC,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QACjC,aAAa,CAAC,WAAW,EAAE,GAAG,EAAE,EAAE,CAAC,CAAA;QACnC,aAAa,CAAC,WAAW,EAAE,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;QACjD,aAAa,CAAC,WAAW,EAAE,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;QAC/C,aAAa,CAAC,WAAW,EAAE,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;QAChD,aAAa,CAAC,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QACjC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;QAE/B,YAAY,CAAC,IAAI,CAAC;YACd,SAAS;YACT,GAAG;YACH,cAAc,EAAE,UAAU,CAAC,MAAM;YACjC,gBAAgB,EAAE,QAAQ,CAAC,MAAM;YACjC,MAAM;SACT,CAAC,CAAA;QACF,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAA;QACpC,MAAM,IAAI,WAAW,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAA;IACpD,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,CAAA;IAC3B,KAAK,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,YAAY,EAAE,CAAC;QAClG,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,CAAA;QACnD,aAAa,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC,CAAA;QACrC,aAAa,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;QAC7B,aAAa,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;QAC7B,aAAa,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QAC5B,aAAa,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QAC7B,aAAa,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QAC7B,aAAa,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QAC7B,aAAa,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC,CAAA;QAC/B,aAAa,CAAC,OAAO,EAAE,cAAc,EAAE,EAAE,CAAC,CAAA;QAC1C,aAAa,CAAC,OAAO,EAAE,gBAAgB,EAAE,EAAE,CAAC,CAAA;QAC5C,aAAa,CAAC,OAAO,EAAE,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;QAC5C,aAAa,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QAC7B,aAAa,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QAC7B,aAAa,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QAC7B,aAAa,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QAC7B,aAAa,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QAC7B,aAAa,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC,CAAA;QACtC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;QAC3B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACpB,MAAM,IAAI,OAAO,CAAC,MAAM,CAAA;IAC5B,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,GAAG,YAAY,CAAA;IACzC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAC7B,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CAAA;IAClC,aAAa,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IACzB,aAAa,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IACzB,aAAa,CAAC,IAAI,EAAE,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;IAC3C,aAAa,CAAC,IAAI,EAAE,YAAY,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;IAC5C,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC,CAAA;IACpC,aAAa,CAAC,IAAI,EAAE,YAAY,EAAE,EAAE,CAAC,CAAA;IACrC,aAAa,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;IAC1B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAEjB,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;AACvD,CAAC;AAMD,KAAK,UAAU,aAAa,CAAC,KAAe,EAAE,WAAiC,EAAE;IAC7E,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;IACjC,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,CAAA;IAEhE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACpC,MAAM,8CAA8C,CAAA;IACxD,CAAC;IAED,IAAI,YAAqC,CAAA;IACzC,IAAI,CAAC;QACD,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAA;IAClD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,MAAM,IAAI,QAAQ,CACd,2BAA2B,EAC3B,kCAAkC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC7F,CAAA;IACL,CAAC;IAED,MAAM,QAAQ,GAAG,YAAY,EAAE,QAA+C,CAAA;IAC9E,MAAM,IAAI,GAAG,QAAQ,EAAE,IAA0B,CAAA;IACjD,MAAM,OAAO,GAAG,QAAQ,EAAE,OAA6B,CAAA;IAEvD,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,MAAM,0CAA0C,CAAA;IACpD,CAAC;IACD,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,MAAM,6CAA6C,CAAA;IACvD,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;IAChD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IAExB,MAAM,WAAW,GAAG,GAAG,IAAI,IAAI,OAAO,MAAM,CAAA;IAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAA;IAEpD,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IAEpF,IAAI,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAA;IAC9B,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAA;IACtD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,QAAQ,CAAC,6BAA6B,EAAE,0DAA0D,CAAC,CAAA;IACjH,CAAC;IACD,MAAM,gBAAgB,GAAG,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAA;IAChE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,QAAQ,CAAC,6BAA6B,EAAE,sDAAsD,CAAC,CAAA;IAC7G,CAAC;IAED,IAAI,CAAC;QACD,gBAAgB,CAAC,WAAW,EAAE,WAAW,EAAE,CAAC,QAAQ,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC,CAAA;IACrF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,MAAM,IAAI,QAAQ,CAAC,uBAAuB,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;IACvG,CAAC;IAED,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;IACtC,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;IAE7C,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,qBAAqB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,MAAM,MAAM,CAAC,CAAA;IAC3F,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,CAAC,CAAA;AAC1E,CAAC;AAED,eAAe,aAAa,CAAA"}
@@ -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":"AAAA,OAAO,QAAQ,MAAM,eAAe,CAAA;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,IAAI,MAAM,YAAY,CAAA;AAE7B,MAAM,IAAI,GAAG,mDAAmD,CAAA;AAShE,SAAS,GAAG,CAAC,QAAgB;IACzB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;QACzB,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;QACrF,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE;YACxB,EAAE,CAAC,KAAK,EAAE,CAAA;YACV,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAA;QACvB,CAAC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;AACN,CAAC;AAED,KAAK,UAAU,YAAY;IACvB,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,CAAA;IACvC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACV,MAAM,8BAA8B,GAAG,CAAC,MAAM,IAAI,CAAA;IACtD,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA4B,CAAA;IAC1D,MAAM,SAAS,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAG1F,CAAA;IACH,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,qBAAqB,CAAA;IAC/B,CAAC;IACD,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACvB,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,CAAA;QAC7B,OAAO,CAAC,GAAG,CACP,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CACnH,CAAA;IACL,CAAC,CAAC,CAAA;IACF,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,qBAAqB,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAA;IAC9D,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;QACnD,MAAM,oBAAoB,CAAA;IAC9B,CAAC;IACD,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,CAAA;IAC7B,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,CAAA;AACxD,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,EAAU,EAAE,IAAwB;IAC9D,IAAI,IAAI,EAAE,CAAC;QACP,OAAO,IAAI,CAAA;IACf,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,GAAG,IAAI,IAAI,EAAE,WAAW,CAAC,CAAA;IAC3D,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACV,OAAO,MAAM,CAAA;IACjB,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA4B,CAAA;IAC1D,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAc,CAAA;IAC1G,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IACzB,OAAO,CACH,CAAC,OAAO,KAAK,KAAK,QAAQ;QACtB,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,CAAG,KAAiC,EAAE,IAAe;YACnD,KAAiC,EAAE,EAAa;YAChD,KAAiC,EAAE,OAAkB,CAAC,CAAC,IAAI,MAAM,CAC5E,CAAA;AACL,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,IAA+B;IAClD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAA;IACxC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;QACtB,MAAM,MAAM,GAAG,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAA;QAChE,MAAM,EAAE,GAAG,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS,CAAA;QAC1D,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QAC7E,OAAO,CAAC,GAAG,CACP,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAChH,CAAA;IACL,CAAC,CAAC,CAAA;IACF,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,gBAAgB,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAA;IACzD,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAChD,MAAM,oBAAoB,CAAA;IAC9B,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAA;AACxE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAc,EAAE,UAA+B,EAAE;IAChF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAA;IAEjC,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;IAChB,IAAI,CAAC,EAAE,EAAE,CAAC;QACN,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,MAAM,mFAAmF,CAAA;QAC7F,CAAC;QACD,EAAE,GAAG,MAAM,YAAY,EAAE,CAAA;QACzB,OAAO,CAAC,GAAG,EAAE,CAAA;IACjB,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;IAEzD,IAAI,KAAK,GAAG,OAAO,CAAC,GAAG,CAAA;IACvB,IAAI,CAAC,KAAK,EAAE,CAAC;QACT,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,GAAG,IAAI,IAAI,EAAE,aAAa,OAAO,iBAAiB,CAAC,CAAA;QACzF,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,OAAO,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACxC,MAAM,6CAA6C,CAAA;QACvD,CAAC;QACD,MAAM,QAAQ,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,CAA4B,CAAA;QAClE,MAAM,IAAI,GAAG,CACT,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CACpE,CAAA;QAC9B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpB,MAAM,6CAA6C,CAAA;QACvD,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpB,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;QAC7D,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,KAAK,EAAE,CAAC;gBACT,MAAM,6CAA6C,CAAA;YACvD,CAAC;YACD,KAAK,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;YAC3B,OAAO,CAAC,GAAG,EAAE,CAAA;QACjB,CAAC;IACL,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAA;IACpC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;IACpC,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAA;IACtC,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IAE7C,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,GAAG,IAAI,IAAI,EAAE,aAAa,OAAO,mBAAmB,KAAK,WAAW,KAAK,EAAE,CAAC,CAAA;IAClH,IAAI,OAAO,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACzB,MAAM,2EAA2E,CAAA;IACrF,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;QACd,MAAM,yBAAyB,OAAO,CAAC,MAAM,IAAI,CAAA;IACrD,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,CAA4B,CAAA;IAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAA;IAC3D,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACvB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,MAAM,IAAI,GACN,OAAO,IAAI,KAAK,QAAQ;gBACpB,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,CAAE,IAAgC,CAAC,OAAO;oBACzC,IAAgC,CAAC,GAAG;oBACrC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;YAC/B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACrB,CAAC;IACL,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;IACnF,CAAC;AACL,CAAC"}
@@ -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