opencode-agora 0.4.2 → 0.4.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 (184) hide show
  1. package/README.md +42 -2
  2. package/dist/cli/app.d.ts.map +1 -1
  3. package/dist/cli/app.js +14 -0
  4. package/dist/cli/app.js.map +1 -1
  5. package/dist/cli/commands/browse.d.ts.map +1 -1
  6. package/dist/cli/commands/browse.js +1 -5
  7. package/dist/cli/commands/browse.js.map +1 -1
  8. package/dist/cli/commands/capabilities.d.ts +3 -0
  9. package/dist/cli/commands/capabilities.d.ts.map +1 -0
  10. package/dist/cli/commands/capabilities.js +146 -0
  11. package/dist/cli/commands/capabilities.js.map +1 -0
  12. package/dist/cli/commands/community.d.ts.map +1 -1
  13. package/dist/cli/commands/community.js.map +1 -1
  14. package/dist/cli/commands/curate.d.ts +9 -0
  15. package/dist/cli/commands/curate.d.ts.map +1 -0
  16. package/dist/cli/commands/curate.js +62 -0
  17. package/dist/cli/commands/curate.js.map +1 -0
  18. package/dist/cli/commands/doctor.d.ts +3 -0
  19. package/dist/cli/commands/doctor.d.ts.map +1 -0
  20. package/dist/cli/commands/doctor.js +77 -0
  21. package/dist/cli/commands/doctor.js.map +1 -0
  22. package/dist/cli/commands/export.d.ts.map +1 -1
  23. package/dist/cli/commands/export.js +5 -3
  24. package/dist/cli/commands/export.js.map +1 -1
  25. package/dist/cli/commands/freeze.d.ts +3 -0
  26. package/dist/cli/commands/freeze.d.ts.map +1 -0
  27. package/dist/cli/commands/freeze.js +62 -0
  28. package/dist/cli/commands/freeze.js.map +1 -0
  29. package/dist/cli/commands/init.d.ts.map +1 -1
  30. package/dist/cli/commands/init.js +5 -1
  31. package/dist/cli/commands/init.js.map +1 -1
  32. package/dist/cli/commands/installed.d.ts +3 -0
  33. package/dist/cli/commands/installed.d.ts.map +1 -0
  34. package/dist/cli/commands/installed.js +82 -0
  35. package/dist/cli/commands/installed.js.map +1 -0
  36. package/dist/cli/commands/marketplace.d.ts.map +1 -1
  37. package/dist/cli/commands/marketplace.js.map +1 -1
  38. package/dist/cli/commands/notify.d.ts.map +1 -1
  39. package/dist/cli/commands/notify.js.map +1 -1
  40. package/dist/cli/commands/operations.d.ts.map +1 -1
  41. package/dist/cli/commands/operations.js +64 -1
  42. package/dist/cli/commands/operations.js.map +1 -1
  43. package/dist/cli/commands/ping.js +2 -1
  44. package/dist/cli/commands/ping.js.map +1 -1
  45. package/dist/cli/commands/scan.js.map +1 -1
  46. package/dist/cli/commands/sync.d.ts +3 -0
  47. package/dist/cli/commands/sync.d.ts.map +1 -0
  48. package/dist/cli/commands/sync.js +172 -0
  49. package/dist/cli/commands/sync.js.map +1 -0
  50. package/dist/cli/commands/today.d.ts.map +1 -1
  51. package/dist/cli/commands/today.js +11 -3
  52. package/dist/cli/commands/today.js.map +1 -1
  53. package/dist/cli/commands/try.d.ts +3 -0
  54. package/dist/cli/commands/try.d.ts.map +1 -0
  55. package/dist/cli/commands/try.js +157 -0
  56. package/dist/cli/commands/try.js.map +1 -0
  57. package/dist/cli/commands/watch.d.ts.map +1 -1
  58. package/dist/cli/commands/watch.js.map +1 -1
  59. package/dist/cli/commands/welcome.d.ts.map +1 -1
  60. package/dist/cli/commands/welcome.js +6 -27
  61. package/dist/cli/commands/welcome.js.map +1 -1
  62. package/dist/cli/commands-meta.d.ts +1 -1
  63. package/dist/cli/commands-meta.d.ts.map +1 -1
  64. package/dist/cli/commands-meta.js +222 -21
  65. package/dist/cli/commands-meta.js.map +1 -1
  66. package/dist/cli/completions-gen.d.ts.map +1 -1
  67. package/dist/cli/completions-gen.js +130 -52
  68. package/dist/cli/completions-gen.js.map +1 -1
  69. package/dist/cli/flags.d.ts.map +1 -1
  70. package/dist/cli/flags.js +7 -0
  71. package/dist/cli/flags.js.map +1 -1
  72. package/dist/cli/format.js +1 -1
  73. package/dist/cli/format.js.map +1 -1
  74. package/dist/cli/helpers.d.ts.map +1 -1
  75. package/dist/cli/helpers.js.map +1 -1
  76. package/dist/cli/mcp-server.d.ts +5 -0
  77. package/dist/cli/mcp-server.d.ts.map +1 -1
  78. package/dist/cli/mcp-server.js +222 -0
  79. package/dist/cli/mcp-server.js.map +1 -1
  80. package/dist/cli/pages/community.d.ts.map +1 -1
  81. package/dist/cli/pages/community.js +4 -7
  82. package/dist/cli/pages/community.js.map +1 -1
  83. package/dist/cli/pages/home.d.ts.map +1 -1
  84. package/dist/cli/pages/home.js +22 -8
  85. package/dist/cli/pages/home.js.map +1 -1
  86. package/dist/cli/pages/marketplace.d.ts.map +1 -1
  87. package/dist/cli/pages/marketplace.js +12 -9
  88. package/dist/cli/pages/marketplace.js.map +1 -1
  89. package/dist/cli/pages/news.d.ts.map +1 -1
  90. package/dist/cli/pages/news.js.map +1 -1
  91. package/dist/cli/pages/stack.d.ts +3 -0
  92. package/dist/cli/pages/stack.d.ts.map +1 -0
  93. package/dist/cli/pages/stack.js +373 -0
  94. package/dist/cli/pages/stack.js.map +1 -0
  95. package/dist/cli/pages/types.d.ts +1 -1
  96. package/dist/cli/pages/types.d.ts.map +1 -1
  97. package/dist/cli/shell.d.ts +1 -1
  98. package/dist/cli/shell.d.ts.map +1 -1
  99. package/dist/cli/shell.js +52 -2
  100. package/dist/cli/shell.js.map +1 -1
  101. package/dist/cli/tui.d.ts.map +1 -1
  102. package/dist/cli/tui.js +14 -4
  103. package/dist/cli/tui.js.map +1 -1
  104. package/dist/community/client.d.ts.map +1 -1
  105. package/dist/community/client.js +3 -1
  106. package/dist/community/client.js.map +1 -1
  107. package/dist/curator/index.d.ts +95 -0
  108. package/dist/curator/index.d.ts.map +1 -0
  109. package/dist/curator/index.js +446 -0
  110. package/dist/curator/index.js.map +1 -0
  111. package/dist/hubs/enrichment.d.ts.map +1 -1
  112. package/dist/hubs/enrichment.js.map +1 -1
  113. package/dist/index.d.ts.map +1 -1
  114. package/dist/index.js +3 -1
  115. package/dist/index.js.map +1 -1
  116. package/dist/marketplace.d.ts +2 -1
  117. package/dist/marketplace.d.ts.map +1 -1
  118. package/dist/marketplace.js +86 -17
  119. package/dist/marketplace.js.map +1 -1
  120. package/dist/outdated.d.ts.map +1 -1
  121. package/dist/outdated.js +25 -4
  122. package/dist/outdated.js.map +1 -1
  123. package/dist/scan.d.ts.map +1 -1
  124. package/dist/scan.js +83 -15
  125. package/dist/scan.js.map +1 -1
  126. package/dist/search/catalog-index.d.ts +107 -0
  127. package/dist/search/catalog-index.d.ts.map +1 -0
  128. package/dist/search/catalog-index.js +276 -0
  129. package/dist/search/catalog-index.js.map +1 -0
  130. package/dist/stack/adapters/claude-code.d.ts +3 -0
  131. package/dist/stack/adapters/claude-code.d.ts.map +1 -0
  132. package/dist/stack/adapters/claude-code.js +282 -0
  133. package/dist/stack/adapters/claude-code.js.map +1 -0
  134. package/dist/stack/adapters/cursor.d.ts +3 -0
  135. package/dist/stack/adapters/cursor.d.ts.map +1 -0
  136. package/dist/stack/adapters/cursor.js +232 -0
  137. package/dist/stack/adapters/cursor.js.map +1 -0
  138. package/dist/stack/adapters/opencode.d.ts +3 -0
  139. package/dist/stack/adapters/opencode.d.ts.map +1 -0
  140. package/dist/stack/adapters/opencode.js +177 -0
  141. package/dist/stack/adapters/opencode.js.map +1 -0
  142. package/dist/stack/adapters/windsurf.d.ts +3 -0
  143. package/dist/stack/adapters/windsurf.d.ts.map +1 -0
  144. package/dist/stack/adapters/windsurf.js +218 -0
  145. package/dist/stack/adapters/windsurf.js.map +1 -0
  146. package/dist/stack/capability-cache.d.ts +19 -0
  147. package/dist/stack/capability-cache.d.ts.map +1 -0
  148. package/dist/stack/capability-cache.js +41 -0
  149. package/dist/stack/capability-cache.js.map +1 -0
  150. package/dist/stack/doctor.d.ts +30 -0
  151. package/dist/stack/doctor.d.ts.map +1 -0
  152. package/dist/stack/doctor.js +227 -0
  153. package/dist/stack/doctor.js.map +1 -0
  154. package/dist/stack/manifest.d.ts +40 -0
  155. package/dist/stack/manifest.d.ts.map +1 -0
  156. package/dist/stack/manifest.js +342 -0
  157. package/dist/stack/manifest.js.map +1 -0
  158. package/dist/stack/mcp-probe.d.ts +23 -0
  159. package/dist/stack/mcp-probe.d.ts.map +1 -0
  160. package/dist/stack/mcp-probe.js +230 -0
  161. package/dist/stack/mcp-probe.js.map +1 -0
  162. package/dist/stack/path-resolve.d.ts +7 -0
  163. package/dist/stack/path-resolve.d.ts.map +1 -0
  164. package/dist/stack/path-resolve.js +37 -0
  165. package/dist/stack/path-resolve.js.map +1 -0
  166. package/dist/stack/registry.d.ts +11 -0
  167. package/dist/stack/registry.d.ts.map +1 -0
  168. package/dist/stack/registry.js +42 -0
  169. package/dist/stack/registry.js.map +1 -0
  170. package/dist/stack/sync.d.ts +20 -0
  171. package/dist/stack/sync.d.ts.map +1 -0
  172. package/dist/stack/sync.js +226 -0
  173. package/dist/stack/sync.js.map +1 -0
  174. package/dist/stack/types.d.ts +53 -0
  175. package/dist/stack/types.d.ts.map +1 -0
  176. package/dist/stack/types.js +2 -0
  177. package/dist/stack/types.js.map +1 -0
  178. package/dist/transcript.d.ts +14 -0
  179. package/dist/transcript.d.ts.map +1 -1
  180. package/dist/transcript.js +98 -1
  181. package/dist/transcript.js.map +1 -1
  182. package/dist/types.d.ts +4 -0
  183. package/dist/types.d.ts.map +1 -1
  184. package/package.json +2 -1
@@ -0,0 +1,342 @@
1
+ import { readFileSync, existsSync } from 'node:fs';
2
+ import { join, resolve } from 'node:path';
3
+ import { atomicWriteFile } from '../atomic-write.js';
4
+ // ── Path helper ───────────────────────────────────────────────────────────────
5
+ export function manifestPath(env) {
6
+ const override = env.env?.AGORA_STACK_FILE;
7
+ if (override)
8
+ return override;
9
+ const cwd = env.cwd ?? process.cwd();
10
+ return join(cwd, 'agora.toml');
11
+ }
12
+ export function opencodeEntryToManifest(entry) {
13
+ const result = {};
14
+ if (entry.type === 'local') {
15
+ result.command = entry.command;
16
+ if (entry.environment && Object.keys(entry.environment).length > 0) {
17
+ result.env = entry.environment;
18
+ }
19
+ }
20
+ else {
21
+ result.url = entry.url;
22
+ }
23
+ if (entry.enabled === false) {
24
+ result.enabled = false;
25
+ }
26
+ return result;
27
+ }
28
+ // ── serverToEntry ─────────────────────────────────────────────────────────────
29
+ export function serverToEntry(server) {
30
+ const entry = {};
31
+ if (server.transport === 'local' && server.command) {
32
+ entry.command = server.command;
33
+ }
34
+ else if (server.transport === 'remote' && server.url) {
35
+ entry.url = server.url;
36
+ }
37
+ if (server.env && Object.keys(server.env).length > 0) {
38
+ entry.env = server.env;
39
+ }
40
+ if (server.enabled === false) {
41
+ entry.enabled = false;
42
+ }
43
+ return entry;
44
+ }
45
+ // ── TOML serializer ───────────────────────────────────────────────────────────
46
+ function needsQuoting(seg) {
47
+ return !/^[A-Za-z0-9_-]+$/.test(seg);
48
+ }
49
+ function tomlSegment(seg) {
50
+ if (needsQuoting(seg)) {
51
+ return `"${escapeString(seg)}"`;
52
+ }
53
+ return seg;
54
+ }
55
+ function escapeString(s) {
56
+ return s.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
57
+ }
58
+ function serializeStringArray(arr) {
59
+ return '[' + arr.map((s) => `"${escapeString(s)}"`).join(', ') + ']';
60
+ }
61
+ function serializeSection(section, entries, lines) {
62
+ const names = Object.keys(entries).sort();
63
+ for (const name of names) {
64
+ const entry = entries[name];
65
+ const seg = tomlSegment(name);
66
+ lines.push(`[${section}.${seg}]`);
67
+ if (entry.command !== undefined) {
68
+ lines.push(`command = ${serializeStringArray(entry.command)}`);
69
+ }
70
+ if (entry.url !== undefined) {
71
+ lines.push(`url = "${escapeString(entry.url)}"`);
72
+ }
73
+ if (entry.enabled === false) {
74
+ lines.push(`enabled = false`);
75
+ }
76
+ if (entry.env && Object.keys(entry.env).length > 0) {
77
+ lines.push(`[${section}.${seg}.env]`);
78
+ for (const key of Object.keys(entry.env).sort()) {
79
+ lines.push(`${key} = "${escapeString(entry.env[key])}"`);
80
+ }
81
+ }
82
+ lines.push('');
83
+ }
84
+ }
85
+ export function serializeManifest(m) {
86
+ const lines = ['# agora stack manifest', ''];
87
+ if (m.mcp && Object.keys(m.mcp).length > 0) {
88
+ serializeSection('mcp', m.mcp, lines);
89
+ }
90
+ if (m.skills && Object.keys(m.skills).length > 0) {
91
+ serializeSection('skills', m.skills, lines);
92
+ }
93
+ if (m.workflows && Object.keys(m.workflows).length > 0) {
94
+ serializeSection('workflows', m.workflows, lines);
95
+ }
96
+ // Remove trailing blank line to get a clean file
97
+ while (lines.length > 0 && lines[lines.length - 1] === '') {
98
+ lines.pop();
99
+ }
100
+ return lines.join('\n') + '\n';
101
+ }
102
+ // ── TOML parser ───────────────────────────────────────────────────────────────
103
+ const KNOWN_SECTIONS = new Set(['mcp', 'skills', 'workflows']);
104
+ const KNOWN_ENTRY_KEYS = new Set(['command', 'url', 'enabled']);
105
+ function parseTomlString(raw, lineNum) {
106
+ if (!raw.startsWith('"') || !raw.endsWith('"') || raw.length < 2) {
107
+ throw new Error(`Line ${lineNum}: expected a double-quoted string, got: ${raw}`);
108
+ }
109
+ const inner = raw.slice(1, -1);
110
+ // Unescape \" and \\ (minimal)
111
+ let result = '';
112
+ for (let i = 0; i < inner.length; i++) {
113
+ if (inner[i] === '\\') {
114
+ i++;
115
+ if (inner[i] === '"')
116
+ result += '"';
117
+ else if (inner[i] === '\\')
118
+ result += '\\';
119
+ else
120
+ throw new Error(`Line ${lineNum}: unknown escape \\${inner[i]}`);
121
+ }
122
+ else {
123
+ result += inner[i];
124
+ }
125
+ }
126
+ return result;
127
+ }
128
+ function parseStringArray(raw, lineNum) {
129
+ const trimmed = raw.trim();
130
+ if (!trimmed.startsWith('[') || !trimmed.endsWith(']')) {
131
+ throw new Error(`Line ${lineNum}: expected a string array [...], got: ${raw}`);
132
+ }
133
+ const inner = trimmed.slice(1, -1).trim();
134
+ if (inner === '')
135
+ return [];
136
+ const items = [];
137
+ let i = 0;
138
+ while (i < inner.length) {
139
+ // skip whitespace and commas
140
+ while (i < inner.length && (inner[i] === ',' || inner[i] === ' ' || inner[i] === '\t'))
141
+ i++;
142
+ if (i >= inner.length)
143
+ break;
144
+ if (inner[i] !== '"') {
145
+ throw new Error(`Line ${lineNum}: expected quoted string in array, got: ${inner[i]}`);
146
+ }
147
+ // find closing quote, respecting escapes
148
+ let j = i + 1;
149
+ while (j < inner.length && !(inner[j] === '"' && inner[j - 1] !== '\\'))
150
+ j++;
151
+ if (j >= inner.length) {
152
+ throw new Error(`Line ${lineNum}: unterminated string in array`);
153
+ }
154
+ items.push(parseTomlString(inner.slice(i, j + 1), lineNum));
155
+ i = j + 1;
156
+ }
157
+ return items;
158
+ }
159
+ function parseTableHeader(line, lineNum) {
160
+ // Strip [ and ]
161
+ const inner = line.slice(1, -1).trim();
162
+ // Parse segments: bare or double-quoted
163
+ const segments = [];
164
+ let i = 0;
165
+ while (i < inner.length) {
166
+ if (inner[i] === '.') {
167
+ i++;
168
+ continue;
169
+ }
170
+ if (inner[i] === '"') {
171
+ // quoted segment
172
+ let j = i + 1;
173
+ while (j < inner.length && !(inner[j] === '"' && inner[j - 1] !== '\\'))
174
+ j++;
175
+ if (j >= inner.length) {
176
+ throw new Error(`Line ${lineNum}: unterminated quoted segment in table header`);
177
+ }
178
+ segments.push(parseTomlString(inner.slice(i, j + 1), lineNum));
179
+ i = j + 1;
180
+ }
181
+ else {
182
+ // bare segment
183
+ let j = i;
184
+ while (j < inner.length && inner[j] !== '.')
185
+ j++;
186
+ const seg = inner.slice(i, j);
187
+ if (!/^[A-Za-z0-9_-]+$/.test(seg)) {
188
+ throw new Error(`Line ${lineNum}: invalid bare key segment: ${seg}`);
189
+ }
190
+ segments.push(seg);
191
+ i = j;
192
+ }
193
+ }
194
+ if (segments.length < 2) {
195
+ throw new Error(`Line ${lineNum}: table header must have at least 2 segments: ${line}`);
196
+ }
197
+ const section = segments[0];
198
+ if (!KNOWN_SECTIONS.has(section)) {
199
+ throw new Error(`Line ${lineNum}: unknown section "${section}" in: ${line}`);
200
+ }
201
+ if (segments.length === 3 && segments[2] === 'env') {
202
+ return { section, name: segments[1], isEnv: true };
203
+ }
204
+ if (segments.length === 2) {
205
+ return { section, name: segments[1], isEnv: false };
206
+ }
207
+ throw new Error(`Line ${lineNum}: unexpected table header depth: ${line}`);
208
+ }
209
+ export function parseManifest(text) {
210
+ const manifest = { mcp: {} };
211
+ let currentSection = null;
212
+ let currentName = null;
213
+ let inEnv = false;
214
+ const lines = text.split('\n');
215
+ for (let idx = 0; idx < lines.length; idx++) {
216
+ const lineNum = idx + 1;
217
+ const line = lines[idx].trim();
218
+ // Skip blank and comment lines
219
+ if (line === '' || line.startsWith('#'))
220
+ continue;
221
+ // Table header
222
+ if (line.startsWith('[')) {
223
+ if (!line.endsWith(']')) {
224
+ throw new Error(`Line ${lineNum}: malformed table header: ${line}`);
225
+ }
226
+ const { section, name, isEnv } = parseTableHeader(line, lineNum);
227
+ currentSection = section;
228
+ currentName = name;
229
+ inEnv = isEnv;
230
+ // Ensure the section map exists
231
+ if (section === 'mcp') {
232
+ manifest.mcp = manifest.mcp ?? {};
233
+ if (!manifest.mcp[name])
234
+ manifest.mcp[name] = {};
235
+ }
236
+ else if (section === 'skills') {
237
+ manifest.skills = manifest.skills ?? {};
238
+ if (!manifest.skills[name])
239
+ manifest.skills[name] = {};
240
+ }
241
+ else if (section === 'workflows') {
242
+ manifest.workflows = manifest.workflows ?? {};
243
+ if (!manifest.workflows[name])
244
+ manifest.workflows[name] = {};
245
+ }
246
+ continue;
247
+ }
248
+ // Key = value
249
+ const eqIdx = line.indexOf('=');
250
+ if (eqIdx === -1) {
251
+ throw new Error(`Line ${lineNum}: expected key = value, got: ${line}`);
252
+ }
253
+ const key = line.slice(0, eqIdx).trim();
254
+ const rawVal = line.slice(eqIdx + 1).trim();
255
+ if (currentSection === null || currentName === null) {
256
+ throw new Error(`Line ${lineNum}: key/value before any table header: ${line}`);
257
+ }
258
+ // Get current entry
259
+ const sectionMap = currentSection === 'mcp'
260
+ ? manifest.mcp
261
+ : currentSection === 'skills'
262
+ ? (manifest.skills ??= {})
263
+ : (manifest.workflows ??= {});
264
+ const entry = (sectionMap[currentName] ??= {});
265
+ if (inEnv) {
266
+ // Any key, string value
267
+ const strVal = parseTomlString(rawVal, lineNum);
268
+ entry.env = entry.env ?? {};
269
+ entry.env[key] = strVal;
270
+ }
271
+ else {
272
+ // Known entry keys only
273
+ if (!KNOWN_ENTRY_KEYS.has(key)) {
274
+ throw new Error(`Line ${lineNum}: unknown key "${key}" in entry table`);
275
+ }
276
+ if (key === 'command') {
277
+ entry.command = parseStringArray(rawVal, lineNum);
278
+ }
279
+ else if (key === 'url') {
280
+ entry.url = parseTomlString(rawVal, lineNum);
281
+ }
282
+ else if (key === 'enabled') {
283
+ if (rawVal === 'true')
284
+ entry.enabled = true;
285
+ else if (rawVal === 'false')
286
+ entry.enabled = false;
287
+ else
288
+ throw new Error(`Line ${lineNum}: enabled must be true or false, got: ${rawVal}`);
289
+ }
290
+ }
291
+ }
292
+ return manifest;
293
+ }
294
+ // ── File I/O ──────────────────────────────────────────────────────────────────
295
+ export function readManifest(path) {
296
+ if (!existsSync(path))
297
+ return null;
298
+ const text = readFileSync(path, 'utf8');
299
+ return parseManifest(text);
300
+ }
301
+ export function writeManifest(path, m) {
302
+ atomicWriteFile(path, serializeManifest(m), 0o644);
303
+ }
304
+ // ── Remote/file loader ────────────────────────────────────────────────────────
305
+ /**
306
+ * Load a StackManifest from a URL or file path.
307
+ * Throws a descriptive Error on fetch failure, missing file, or parse error.
308
+ * The caller is responsible for mapping thrown errors to usageError output.
309
+ */
310
+ export async function loadManifestFromSource(source, opts) {
311
+ let text;
312
+ if (/^https?:\/\//i.test(source)) {
313
+ // URL source
314
+ const fetcher = opts.fetcher ?? globalThis.fetch;
315
+ let res;
316
+ try {
317
+ res = await fetcher(source);
318
+ }
319
+ catch (e) {
320
+ throw new Error(`Could not fetch manifest from ${source}: ${e instanceof Error ? e.message : String(e)}`, { cause: e });
321
+ }
322
+ if (!res.ok) {
323
+ throw new Error(`Could not fetch manifest from ${source}: HTTP ${res.status}`);
324
+ }
325
+ text = await res.text();
326
+ }
327
+ else {
328
+ // File path source
329
+ const absPath = resolve(opts.cwd ?? process.cwd(), source);
330
+ if (!existsSync(absPath)) {
331
+ throw new Error(`Could not read manifest from ${source}: file not found`);
332
+ }
333
+ text = readFileSync(absPath, 'utf8');
334
+ }
335
+ try {
336
+ return parseManifest(text);
337
+ }
338
+ catch (e) {
339
+ throw new Error(`Invalid manifest from ${source}: ${e instanceof Error ? e.message : String(e)}`, { cause: e });
340
+ }
341
+ }
342
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/stack/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAmBrD,iFAAiF;AAEjF,MAAM,UAAU,YAAY,CAAC,GAAa;IACxC,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,EAAE,gBAAgB,CAAC;IAC3C,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACrC,OAAO,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;AACjC,CAAC;AAQD,MAAM,UAAU,uBAAuB,CAAC,KAAuB;IAC7D,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC3B,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC/B,IAAI,KAAK,CAAC,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnE,MAAM,CAAC,GAAG,GAAG,KAAK,CAAC,WAAW,CAAC;QACjC,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;IACzB,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;QAC5B,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;IACzB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,iFAAiF;AAEjF,MAAM,UAAU,aAAa,CAAC,MAAwB;IACpD,MAAM,KAAK,GAAkB,EAAE,CAAC;IAChC,IAAI,MAAM,CAAC,SAAS,KAAK,OAAO,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnD,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IACjC,CAAC;SAAM,IAAI,MAAM,CAAC,SAAS,KAAK,QAAQ,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;QACvD,KAAK,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;IACzB,CAAC;IACD,IAAI,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrD,KAAK,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;IACzB,CAAC;IACD,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;QAC7B,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC;IACxB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,iFAAiF;AAEjF,SAAS,YAAY,CAAC,GAAW;IAC/B,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,WAAW,CAAC,GAAW;IAC9B,IAAI,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,IAAI,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC;IAClC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,YAAY,CAAC,CAAS;IAC7B,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,oBAAoB,CAAC,GAAa;IACzC,OAAO,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;AACvE,CAAC;AAED,SAAS,gBAAgB,CACvB,OAAe,EACf,OAAsC,EACtC,KAAe;IAEf,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,IAAI,OAAO,IAAI,GAAG,GAAG,CAAC,CAAC;QAClC,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAChC,KAAK,CAAC,IAAI,CAAC,aAAa,oBAAoB,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,UAAU,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnD,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAChC,CAAC;QACD,IAAI,KAAK,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnD,KAAK,CAAC,IAAI,CAAC,IAAI,OAAO,IAAI,GAAG,OAAO,CAAC,CAAC;YACtC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;gBAChD,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,OAAO,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,GAAG,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,CAAgB;IAChD,MAAM,KAAK,GAAa,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;IAEvD,IAAI,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3C,gBAAgB,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACxC,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjD,gBAAgB,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC9C,CAAC;IACD,IAAI,CAAC,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvD,gBAAgB,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACpD,CAAC;IAED,iDAAiD;IACjD,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;QAC1D,KAAK,CAAC,GAAG,EAAE,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AACjC,CAAC;AAED,iFAAiF;AAEjF,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;AAC/D,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;AAEhE,SAAS,eAAe,CAAC,GAAW,EAAE,OAAe;IACnD,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjE,MAAM,IAAI,KAAK,CAAC,QAAQ,OAAO,2CAA2C,GAAG,EAAE,CAAC,CAAC;IACnF,CAAC;IACD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/B,+BAA+B;IAC/B,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACtB,CAAC,EAAE,CAAC;YACJ,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG;gBAAE,MAAM,IAAI,GAAG,CAAC;iBAC/B,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI;gBAAE,MAAM,IAAI,IAAI,CAAC;;gBACtC,MAAM,IAAI,KAAK,CAAC,QAAQ,OAAO,sBAAsB,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACxE,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAW,EAAE,OAAe;IACpD,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CAAC,QAAQ,OAAO,yCAAyC,GAAG,EAAE,CAAC,CAAC;IACjF,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1C,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,EAAE,CAAC;IAE5B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QACxB,6BAA6B;QAC7B,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;YAAE,CAAC,EAAE,CAAC;QAC5F,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM;YAAE,MAAM;QAC7B,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,QAAQ,OAAO,2CAA2C,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACxF,CAAC;QACD,yCAAyC;QACzC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC;YAAE,CAAC,EAAE,CAAC;QAC7E,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,QAAQ,OAAO,gCAAgC,CAAC,CAAC;QACnE,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QAC5D,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACZ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CACvB,IAAY,EACZ,OAAe;IAEf,gBAAgB;IAChB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAEvC,wCAAwC;IACxC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QACxB,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACrB,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QACD,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACrB,iBAAiB;YACjB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC;gBAAE,CAAC,EAAE,CAAC;YAC7E,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACtB,MAAM,IAAI,KAAK,CAAC,QAAQ,OAAO,+CAA+C,CAAC,CAAC;YAClF,CAAC;YACD,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;YAC/D,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACZ,CAAC;aAAM,CAAC;YACN,eAAe;YACf,IAAI,CAAC,GAAG,CAAC,CAAC;YACV,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG;gBAAE,CAAC,EAAE,CAAC;YACjD,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC9B,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClC,MAAM,IAAI,KAAK,CAAC,QAAQ,OAAO,+BAA+B,GAAG,EAAE,CAAC,CAAC;YACvE,CAAC;YACD,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC,GAAG,CAAC,CAAC;QACR,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,QAAQ,OAAO,iDAAiD,IAAI,EAAE,CAAC,CAAC;IAC1F,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC5B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,QAAQ,OAAO,sBAAsB,OAAO,SAAS,IAAI,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;QACnD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACrD,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IACtD,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,QAAQ,OAAO,oCAAoC,IAAI,EAAE,CAAC,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,QAAQ,GAAkB,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;IAE5C,IAAI,cAAc,GAAkB,IAAI,CAAC;IACzC,IAAI,WAAW,GAAkB,IAAI,CAAC;IACtC,IAAI,KAAK,GAAG,KAAK,CAAC;IAElB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;QAC5C,MAAM,OAAO,GAAG,GAAG,GAAG,CAAC,CAAC;QACxB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QAE/B,+BAA+B;QAC/B,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAElD,eAAe;QACf,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CAAC,QAAQ,OAAO,6BAA6B,IAAI,EAAE,CAAC,CAAC;YACtE,CAAC;YACD,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACjE,cAAc,GAAG,OAAO,CAAC;YACzB,WAAW,GAAG,IAAI,CAAC;YACnB,KAAK,GAAG,KAAK,CAAC;YAEd,gCAAgC;YAChC,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;gBACtB,QAAQ,CAAC,GAAG,GAAG,QAAQ,CAAC,GAAG,IAAI,EAAE,CAAC;gBAClC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;oBAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACnD,CAAC;iBAAM,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;gBAChC,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC;gBACxC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;oBAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACzD,CAAC;iBAAM,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;gBACnC,QAAQ,CAAC,SAAS,GAAG,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC;gBAC9C,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC;oBAAE,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YAC/D,CAAC;YACD,SAAS;QACX,CAAC;QAED,cAAc;QACd,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,QAAQ,OAAO,gCAAgC,IAAI,EAAE,CAAC,CAAC;QACzE,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAE5C,IAAI,cAAc,KAAK,IAAI,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;YACpD,MAAM,IAAI,KAAK,CAAC,QAAQ,OAAO,wCAAwC,IAAI,EAAE,CAAC,CAAC;QACjF,CAAC;QAED,oBAAoB;QACpB,MAAM,UAAU,GACd,cAAc,KAAK,KAAK;YACtB,CAAC,CAAC,QAAQ,CAAC,GAAG;YACd,CAAC,CAAC,cAAc,KAAK,QAAQ;gBAC3B,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,EAAE,CAAC;gBAC1B,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,KAAK,EAAE,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC;QAE/C,IAAI,KAAK,EAAE,CAAC;YACV,wBAAwB;YACxB,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAChD,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,EAAE,CAAC;YAC5B,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,wBAAwB;YACxB,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC/B,MAAM,IAAI,KAAK,CAAC,QAAQ,OAAO,kBAAkB,GAAG,kBAAkB,CAAC,CAAC;YAC1E,CAAC;YACD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;gBACtB,KAAK,CAAC,OAAO,GAAG,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACpD,CAAC;iBAAM,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;gBACzB,KAAK,CAAC,GAAG,GAAG,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAC/C,CAAC;iBAAM,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;gBAC7B,IAAI,MAAM,KAAK,MAAM;oBAAE,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;qBACvC,IAAI,MAAM,KAAK,OAAO;oBAAE,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC;;oBAC9C,MAAM,IAAI,KAAK,CAAC,QAAQ,OAAO,yCAAyC,MAAM,EAAE,CAAC,CAAC;YACzF,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,iFAAiF;AAEjF,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxC,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,CAAgB;IAC1D,eAAe,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AACrD,CAAC;AAED,iFAAiF;AAEjF;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,MAAc,EACd,IAA2C;IAE3C,IAAI,IAAY,CAAC;IAEjB,IAAI,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACjC,aAAa;QACb,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,UAAU,CAAC,KAAK,CAAC;QACjD,IAAI,GAAa,CAAC;QAClB,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CACb,iCAAiC,MAAM,KAAK,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EACxF,EAAE,KAAK,EAAE,CAAC,EAAE,CACb,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,iCAAiC,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QACjF,CAAC;QACD,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAC1B,CAAC;SAAM,CAAC;QACN,mBAAmB;QACnB,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC;QAC3D,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,gCAAgC,MAAM,kBAAkB,CAAC,CAAC;QAC5E,CAAC;QACD,IAAI,GAAG,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACvC,CAAC;IAED,IAAI,CAAC;QACH,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACb,yBAAyB,MAAM,KAAK,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAChF,EAAE,KAAK,EAAE,CAAC,EAAE,CACb,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,23 @@
1
+ export interface McpTool {
2
+ name: string;
3
+ description?: string;
4
+ }
5
+ export interface McpProbeResult {
6
+ ok: boolean;
7
+ serverInfo?: {
8
+ name?: string;
9
+ version?: string;
10
+ };
11
+ capabilities?: unknown;
12
+ tools?: McpTool[];
13
+ error?: string;
14
+ stderr?: string;
15
+ exitCode?: number | null;
16
+ durationMs?: number;
17
+ }
18
+ export declare function probeMcpServer(command: string[], opts?: {
19
+ env?: Record<string, string | undefined>;
20
+ cwd?: string;
21
+ timeoutMs?: number;
22
+ }): Promise<McpProbeResult>;
23
+ //# sourceMappingURL=mcp-probe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-probe.d.ts","sourceRoot":"","sources":["../../src/stack/mcp-probe.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,UAAU,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACjD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAmBD,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EAAE,EACjB,IAAI,CAAC,EAAE;IACL,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GACA,OAAO,CAAC,cAAc,CAAC,CAyNzB"}
@@ -0,0 +1,230 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { readFileSync } from 'node:fs';
3
+ let _pkgVersion;
4
+ function getPkgVersion() {
5
+ if (_pkgVersion !== undefined)
6
+ return _pkgVersion;
7
+ try {
8
+ const pkg = JSON.parse(readFileSync(new URL('../../package.json', import.meta.url), 'utf8'));
9
+ _pkgVersion = pkg.version ?? '0';
10
+ }
11
+ catch {
12
+ _pkgVersion = '0';
13
+ }
14
+ return _pkgVersion;
15
+ }
16
+ const STDERR_CAP = 4000;
17
+ function appendStderr(buf, chunk) {
18
+ const combined = buf + chunk;
19
+ if (combined.length <= STDERR_CAP)
20
+ return combined;
21
+ // Keep the tail
22
+ return combined.slice(combined.length - STDERR_CAP);
23
+ }
24
+ function stderrSnippet(buf) {
25
+ const trimmed = buf.trimEnd();
26
+ if (!trimmed)
27
+ return '';
28
+ // Last ~200 chars, collapsed to a single line
29
+ const tail = trimmed.length > 200 ? trimmed.slice(trimmed.length - 200) : trimmed;
30
+ return tail.replace(/\r?\n/g, ' ').trim();
31
+ }
32
+ export async function probeMcpServer(command, opts) {
33
+ const timeoutMs = opts?.timeoutMs ?? 15000;
34
+ const startMs = Date.now();
35
+ const mergedEnv = {};
36
+ for (const [k, v] of Object.entries(process.env)) {
37
+ if (v !== undefined)
38
+ mergedEnv[k] = v;
39
+ }
40
+ if (opts?.env) {
41
+ for (const [k, v] of Object.entries(opts.env)) {
42
+ if (v !== undefined)
43
+ mergedEnv[k] = v;
44
+ }
45
+ }
46
+ return new Promise((resolveOuter) => {
47
+ let settled = false;
48
+ let timer = null;
49
+ let currentStage = 'initialize';
50
+ const child = spawn(command[0], command.slice(1), {
51
+ stdio: ['pipe', 'pipe', 'pipe'],
52
+ shell: false,
53
+ env: mergedEnv,
54
+ cwd: opts?.cwd
55
+ });
56
+ // Pending RPC handlers keyed by message id
57
+ const pending = new Map();
58
+ // Partial line buffer for stdout
59
+ let lineBuffer = '';
60
+ // Bounded stderr capture (tail up to STDERR_CAP chars)
61
+ let stderrBuf = '';
62
+ function durationMs() {
63
+ return Date.now() - startMs;
64
+ }
65
+ function cleanup() {
66
+ if (timer !== null) {
67
+ clearTimeout(timer);
68
+ timer = null;
69
+ }
70
+ try {
71
+ child.kill('SIGTERM');
72
+ // Give it a short grace period then SIGKILL
73
+ setTimeout(() => {
74
+ try {
75
+ child.kill('SIGKILL');
76
+ }
77
+ catch {
78
+ // already dead
79
+ }
80
+ }, 300);
81
+ }
82
+ catch {
83
+ // already dead
84
+ }
85
+ }
86
+ function resolve(result) {
87
+ if (settled)
88
+ return;
89
+ settled = true;
90
+ cleanup();
91
+ const capturedStderr = stderrBuf.trimEnd();
92
+ const withStderr = {
93
+ ...result,
94
+ durationMs: durationMs(),
95
+ ...(capturedStderr ? { stderr: capturedStderr } : {})
96
+ };
97
+ resolveOuter(withStderr);
98
+ }
99
+ // Capture stderr (bounded)
100
+ child.stderr.on('data', (chunk) => {
101
+ stderrBuf = appendStderr(stderrBuf, chunk.toString('utf8'));
102
+ });
103
+ // Set overall timeout
104
+ timer = setTimeout(() => {
105
+ const snippet = stderrSnippet(stderrBuf);
106
+ const base = `timed out waiting for ${currentStage}`;
107
+ resolve({ ok: false, error: snippet ? `${base} — stderr: ${snippet}` : base });
108
+ }, timeoutMs);
109
+ child.on('error', (err) => {
110
+ const snippet = stderrSnippet(stderrBuf);
111
+ resolve({ ok: false, error: snippet ? `${err.message} — stderr: ${snippet}` : err.message });
112
+ });
113
+ child.on('close', (code) => {
114
+ if (!settled) {
115
+ const snippet = stderrSnippet(stderrBuf);
116
+ const base = 'server exited';
117
+ resolve({
118
+ ok: false,
119
+ error: snippet ? `${base} — stderr: ${snippet}` : base,
120
+ exitCode: code
121
+ });
122
+ }
123
+ });
124
+ // Parse stdout as newline-delimited JSON
125
+ child.stdout.on('data', (chunk) => {
126
+ lineBuffer += chunk.toString('utf8');
127
+ const lines = lineBuffer.split('\n');
128
+ // Keep the last (potentially incomplete) segment
129
+ lineBuffer = lines.pop() ?? '';
130
+ for (const line of lines) {
131
+ const trimmed = line.trim();
132
+ if (!trimmed)
133
+ continue;
134
+ let msg;
135
+ try {
136
+ msg = JSON.parse(trimmed);
137
+ }
138
+ catch {
139
+ // Not JSON (e.g. server debug output) — ignore
140
+ continue;
141
+ }
142
+ if (typeof msg !== 'object' || msg === null)
143
+ continue;
144
+ const record = msg;
145
+ const id = record.id;
146
+ if (typeof id === 'number' && pending.has(id)) {
147
+ const handler = pending.get(id);
148
+ pending.delete(id);
149
+ handler(msg);
150
+ }
151
+ }
152
+ });
153
+ function writeMsg(msg) {
154
+ const line = JSON.stringify(msg) + '\n';
155
+ child.stdin.write(line);
156
+ }
157
+ // ── Handshake ────────────────────────────────────────────────────────────
158
+ function awaitResponse(id) {
159
+ return new Promise((res) => {
160
+ pending.set(id, (msg) => res(msg));
161
+ });
162
+ }
163
+ async function handshake() {
164
+ // 1. Send initialize
165
+ currentStage = 'initialize';
166
+ writeMsg({
167
+ jsonrpc: '2.0',
168
+ id: 1,
169
+ method: 'initialize',
170
+ params: {
171
+ protocolVersion: '2024-11-05',
172
+ capabilities: {},
173
+ clientInfo: { name: 'agora', version: getPkgVersion() }
174
+ }
175
+ });
176
+ const initResp = await awaitResponse(1);
177
+ if (settled)
178
+ return;
179
+ if (initResp.error) {
180
+ const rpcErr = initResp.error;
181
+ const errMsg = typeof rpcErr === 'object' && rpcErr !== null
182
+ ? (rpcErr.message ?? JSON.stringify(rpcErr))
183
+ : String(rpcErr);
184
+ resolve({ ok: false, error: errMsg });
185
+ return;
186
+ }
187
+ const result = (initResp.result ?? {});
188
+ const serverInfo = result.serverInfo;
189
+ const capabilities = result.capabilities;
190
+ // 2. Send initialized notification (no id)
191
+ currentStage = 'initialized notification';
192
+ writeMsg({ jsonrpc: '2.0', method: 'notifications/initialized' });
193
+ // 3. Request tools/list
194
+ currentStage = 'tools/list';
195
+ writeMsg({ jsonrpc: '2.0', id: 2, method: 'tools/list', params: {} });
196
+ const toolsResp = await awaitResponse(2);
197
+ if (settled)
198
+ return;
199
+ if (toolsResp.error) {
200
+ // Initialize succeeded; tools/list failed — server is still usable
201
+ const rpcErr = toolsResp.error;
202
+ const errMsg = typeof rpcErr === 'object' && rpcErr !== null
203
+ ? (rpcErr.message ?? JSON.stringify(rpcErr))
204
+ : String(rpcErr);
205
+ resolve({ ok: true, serverInfo, capabilities, tools: [], error: errMsg });
206
+ return;
207
+ }
208
+ const toolsResult = (toolsResp.result ?? {});
209
+ const rawTools = Array.isArray(toolsResult.tools) ? toolsResult.tools : [];
210
+ const tools = rawTools.map((t) => {
211
+ const tool = t;
212
+ return {
213
+ name: typeof tool.name === 'string' ? tool.name : '(unknown)',
214
+ ...(typeof tool.description === 'string' ? { description: tool.description } : {})
215
+ };
216
+ });
217
+ resolve({ ok: true, serverInfo, capabilities, tools });
218
+ }
219
+ // Start handshake; any thrown error becomes a failure
220
+ handshake().catch((err) => {
221
+ if (!settled) {
222
+ resolve({
223
+ ok: false,
224
+ error: err instanceof Error ? err.message : String(err)
225
+ });
226
+ }
227
+ });
228
+ });
229
+ }
230
+ //# sourceMappingURL=mcp-probe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-probe.js","sourceRoot":"","sources":["../../src/stack/mcp-probe.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare const KNOWN_RUNNERS: Set<string>;
2
+ /**
3
+ * Returns the absolute path of `command` if found by scanning PATH dirs,
4
+ * else null. Respects PATHEXT on win32. Reads env.PATH or process.env.PATH.
5
+ */
6
+ export declare function resolveOnPath(command: string, env?: Record<string, string | undefined>): string | null;
7
+ //# sourceMappingURL=path-resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-resolve.d.ts","sourceRoot":"","sources":["../../src/stack/path-resolve.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,aAAa,aASxB,CAAC;AAEH;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GACvC,MAAM,GAAG,IAAI,CAwBf"}