@oeronteros-1/opencode-orchestra 0.5.2 → 1.0.1
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/CHANGELOG.md +65 -4
- package/GITHUB_RELEASE_1.0.0.md +84 -0
- package/README.md +95 -7
- package/dashboard-dist/assets/index-CN3CG5oG.js +124 -0
- package/dashboard-dist/assets/{index-89Gs8jun.css → index-j0b0ZK2D.css} +1 -1
- package/dashboard-dist/index.html +2 -2
- package/dist/agents/workers.d.ts +14 -1
- package/dist/agents/workers.js +10 -0
- package/dist/agents/workers.js.map +1 -1
- package/dist/cli.js +93 -9
- package/dist/cli.js.map +1 -1
- package/dist/config/schema.d.ts +23 -0
- package/dist/config/schema.js +18 -1
- package/dist/config/schema.js.map +1 -1
- package/dist/dashboard/server.d.ts +11 -0
- package/dist/dashboard/server.js +152 -33
- package/dist/dashboard/server.js.map +1 -1
- package/dist/diagnostics/completion.d.ts +5 -0
- package/dist/diagnostics/completion.js +145 -0
- package/dist/diagnostics/completion.js.map +1 -0
- package/dist/diagnostics/doctor.d.ts +58 -0
- package/dist/diagnostics/doctor.js +354 -0
- package/dist/diagnostics/doctor.js.map +1 -0
- package/dist/diagnostics/update.d.ts +17 -0
- package/dist/diagnostics/update.js +89 -0
- package/dist/diagnostics/update.js.map +1 -0
- package/dist/index.js +141 -2
- package/dist/index.js.map +1 -1
- package/dist/plugin-status.d.ts +34 -0
- package/dist/plugin-status.js +90 -0
- package/dist/plugin-status.js.map +1 -0
- package/dist/routing/budget-guard.d.ts +36 -0
- package/dist/routing/budget-guard.js +52 -0
- package/dist/routing/budget-guard.js.map +1 -0
- package/dist/routing/classifier-cache.d.ts +25 -0
- package/dist/routing/classifier-cache.js +46 -0
- package/dist/routing/classifier-cache.js.map +1 -0
- package/dist/routing/fallback.d.ts +41 -0
- package/dist/routing/fallback.js +81 -0
- package/dist/routing/fallback.js.map +1 -0
- package/dist/routing/model-discovery.js +3 -1
- package/dist/routing/model-discovery.js.map +1 -1
- package/dist/routing/model-resolver.d.ts +11 -0
- package/dist/routing/model-resolver.js +27 -7
- package/dist/routing/model-resolver.js.map +1 -1
- package/dist/routing/observer.d.ts +22 -0
- package/dist/routing/observer.js +64 -0
- package/dist/routing/observer.js.map +1 -0
- package/dist/routing/planner.d.ts +24 -0
- package/dist/routing/planner.js +106 -0
- package/dist/routing/planner.js.map +1 -0
- package/dist/routing/pricing/estimate.d.ts +60 -0
- package/dist/routing/pricing/estimate.js +81 -0
- package/dist/routing/pricing/estimate.js.map +1 -0
- package/dist/routing/pricing/prices.d.ts +19 -0
- package/dist/routing/pricing/prices.js +74 -0
- package/dist/routing/pricing/prices.js.map +1 -0
- package/dist/routing/pricing/refresh.d.ts +30 -0
- package/dist/routing/pricing/refresh.js +105 -0
- package/dist/routing/pricing/refresh.js.map +1 -0
- package/dist/telemetry/analytics.d.ts +45 -0
- package/dist/telemetry/analytics.js +78 -0
- package/dist/telemetry/analytics.js.map +1 -0
- package/dist/telemetry/ledger.d.ts +13 -1
- package/dist/telemetry/ledger.js +29 -1
- package/dist/telemetry/ledger.js.map +1 -1
- package/dist/tools.d.ts +6 -1
- package/dist/tools.js +77 -7
- package/dist/tools.js.map +1 -1
- package/package.json +17 -4
- package/schema/opencode-orchestra.schema.json +15 -2
- package/dashboard-dist/assets/index-Bhe8OPZD.js +0 -124
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { spawnSync } from "node:child_process";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { parse as parseJsonc, printParseErrorCode } from "jsonc-parser";
|
|
6
|
+
import { openCodeConfigDirectory } from "../config/paths.js";
|
|
7
|
+
import { resolvePluginVersion } from "../plugin-status.js";
|
|
8
|
+
export const PACKAGE_NAME = "@oeronteros-1/opencode-orchestra";
|
|
9
|
+
const STATUS_ORDER = { error: 0, warning: 1, ok: 2, info: 3 };
|
|
10
|
+
function statusIcon(status) {
|
|
11
|
+
switch (status) {
|
|
12
|
+
case "error": return "✗";
|
|
13
|
+
case "warning": return "!";
|
|
14
|
+
case "ok": return "✓";
|
|
15
|
+
case "info": return "·";
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function formatVersion(value) {
|
|
19
|
+
return value && value.trim() ? value.trim() : "unknown";
|
|
20
|
+
}
|
|
21
|
+
function isExecutable(pathLike) {
|
|
22
|
+
return spawnSync(pathLike, ["--version"], { stdio: "ignore" }).status === 0;
|
|
23
|
+
}
|
|
24
|
+
/** Resolve the first executable from a list of candidates. */
|
|
25
|
+
function executable(candidates) {
|
|
26
|
+
return candidates.find((name) => {
|
|
27
|
+
try {
|
|
28
|
+
return spawnSync(name, ["--version"], { stdio: "ignore" }).status === 0;
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
function captureVersion(command, args) {
|
|
36
|
+
const result = spawnSync(command, args, { encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] });
|
|
37
|
+
return result.status === 0 ? result.stdout.trim().split(/\r?\n/)[0] : undefined;
|
|
38
|
+
}
|
|
39
|
+
function pluginName(entry) {
|
|
40
|
+
let raw;
|
|
41
|
+
if (typeof entry === "string")
|
|
42
|
+
raw = entry;
|
|
43
|
+
else if (Array.isArray(entry) && typeof entry[0] === "string")
|
|
44
|
+
raw = entry[0];
|
|
45
|
+
else
|
|
46
|
+
return undefined;
|
|
47
|
+
const slash = raw.lastIndexOf("/");
|
|
48
|
+
const at = slash === -1 ? raw.indexOf("@") : raw.indexOf("@", slash);
|
|
49
|
+
return at === -1 ? raw : raw.slice(0, at);
|
|
50
|
+
}
|
|
51
|
+
export async function readConfigFile(file) {
|
|
52
|
+
let text;
|
|
53
|
+
try {
|
|
54
|
+
text = await readFile(file, "utf8");
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return { path: file, parsed: {}, errors: [], exists: false };
|
|
58
|
+
}
|
|
59
|
+
const errors = [];
|
|
60
|
+
const value = parseJsonc(text, errors, { allowTrailingComma: true, disallowComments: false });
|
|
61
|
+
if (errors.length > 0) {
|
|
62
|
+
return {
|
|
63
|
+
path: file,
|
|
64
|
+
parsed: {},
|
|
65
|
+
errors: errors.map((e) => `${printParseErrorCode(e.error)} @ offset ${e.offset}`),
|
|
66
|
+
exists: true,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
const parsed = typeof value === "object" && value !== null && !Array.isArray(value)
|
|
70
|
+
? value
|
|
71
|
+
: {};
|
|
72
|
+
return { path: file, parsed, errors: [], exists: true };
|
|
73
|
+
}
|
|
74
|
+
export async function findMainConfig(configDirectory) {
|
|
75
|
+
for (const name of ["opencode.json", "opencode.jsonc"]) {
|
|
76
|
+
const candidate = path.join(configDirectory, name);
|
|
77
|
+
try {
|
|
78
|
+
await readFile(candidate, "utf8");
|
|
79
|
+
return candidate;
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// Try the next filename.
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return path.join(configDirectory, "opencode.json");
|
|
86
|
+
}
|
|
87
|
+
/** Extract MCP servers from the opencode main config, preserving order. */
|
|
88
|
+
export function extractMcp(parsed) {
|
|
89
|
+
const mcp = parsed.mcp;
|
|
90
|
+
if (typeof mcp !== "object" || mcp === null || Array.isArray(mcp))
|
|
91
|
+
return [];
|
|
92
|
+
return Object.entries(mcp).map(([name, value]) => ({
|
|
93
|
+
name,
|
|
94
|
+
value: typeof value === "object" && value !== null && !Array.isArray(value)
|
|
95
|
+
? value
|
|
96
|
+
: {},
|
|
97
|
+
}));
|
|
98
|
+
}
|
|
99
|
+
function commandArgv(mcp) {
|
|
100
|
+
const command = mcp.command;
|
|
101
|
+
if (typeof command === "string")
|
|
102
|
+
return [command];
|
|
103
|
+
if (Array.isArray(command))
|
|
104
|
+
return command.filter((item) => typeof item === "string");
|
|
105
|
+
return [];
|
|
106
|
+
}
|
|
107
|
+
function mcpType(mcp) {
|
|
108
|
+
if (typeof mcp.type === "string")
|
|
109
|
+
return mcp.type;
|
|
110
|
+
if (typeof mcp.url === "string")
|
|
111
|
+
return "remote";
|
|
112
|
+
return "local";
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Collect configured local MCP servers and their installed executables.
|
|
116
|
+
* Non-local servers (remote/url/stdio without a command) are skipped.
|
|
117
|
+
*/
|
|
118
|
+
export function collectLocalMcps(parsed) {
|
|
119
|
+
const local = [];
|
|
120
|
+
let nonLocalCount = 0;
|
|
121
|
+
for (const { name, value } of extractMcp(parsed)) {
|
|
122
|
+
const argv = commandArgv(value);
|
|
123
|
+
const type = mcpType(value);
|
|
124
|
+
const enabled = value.enabled !== false;
|
|
125
|
+
if (type === "remote" || (argv.length === 0 && type !== "local" && typeof value.url === "string")) {
|
|
126
|
+
nonLocalCount += 1;
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
if (argv.length === 0) {
|
|
130
|
+
// A "local" entry without a command is unusable, but not remote.
|
|
131
|
+
if (!enabled)
|
|
132
|
+
continue;
|
|
133
|
+
nonLocalCount += 1;
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
const resolved = executable(argv);
|
|
137
|
+
local.push({ name, commands: argv, ...(resolved ? { executable: resolved } : {}) });
|
|
138
|
+
}
|
|
139
|
+
return { local, nonLocalCount };
|
|
140
|
+
}
|
|
141
|
+
/** Resolve an executable from candidate paths, returning its version too. */
|
|
142
|
+
function resolveExecutable(candidates, versionArgs) {
|
|
143
|
+
const found = candidates.find((c) => isExecutable(c));
|
|
144
|
+
if (!found)
|
|
145
|
+
return { executable: undefined, version: undefined };
|
|
146
|
+
return { executable: found, version: captureVersion(found, versionArgs) };
|
|
147
|
+
}
|
|
148
|
+
function localBin(name) {
|
|
149
|
+
const ext = process.platform === "win32" ? ".exe" : "";
|
|
150
|
+
return path.join(os.homedir(), ".local", "bin", `${name}${ext}`);
|
|
151
|
+
}
|
|
152
|
+
/** Candidate install locations for uv across platforms. */
|
|
153
|
+
function uvCandidates() {
|
|
154
|
+
const candidates = [];
|
|
155
|
+
if (process.platform === "win32" && process.env.LOCALAPPDATA) {
|
|
156
|
+
candidates.push({
|
|
157
|
+
label: "%LOCALAPPDATA%/Programs/uv",
|
|
158
|
+
paths: [path.join(process.env.LOCALAPPDATA, "Programs", "uv", "uv.exe")],
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
candidates.push({ label: "~/.local/bin", paths: [localBin("uv")] });
|
|
162
|
+
candidates.push({ label: "~/.cargo/bin", paths: [path.join(os.homedir(), ".cargo", "bin", executableName("uv"))] });
|
|
163
|
+
return candidates;
|
|
164
|
+
}
|
|
165
|
+
function executableName(name) {
|
|
166
|
+
return process.platform === "win32" ? `${name}.exe` : name;
|
|
167
|
+
}
|
|
168
|
+
export function inspectEnvironment() {
|
|
169
|
+
const shell = process.env.SHELL ?? (process.platform === "win32" ? (process.env.COMSPEC ?? "unknown") : "unknown");
|
|
170
|
+
return {
|
|
171
|
+
platform: `${process.platform} (${process.arch})`,
|
|
172
|
+
home: os.homedir(),
|
|
173
|
+
shell,
|
|
174
|
+
nodeVersion: formatVersion(process.version),
|
|
175
|
+
bunVersion: captureVersion("bun", ["--version"]) ?? "not installed",
|
|
176
|
+
pluginVersion: "resolving…",
|
|
177
|
+
openCodeVersion: captureVersion("opencode", ["--version"]) ?? "not installed",
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
export async function runDoctor(options = {}) {
|
|
181
|
+
const configDirectory = path.resolve(options.configDirectory ?? openCodeConfigDirectory());
|
|
182
|
+
const mainConfigPath = await findMainConfig(configDirectory);
|
|
183
|
+
const orchestraConfigPath = path.join(configDirectory, "orchestra.jsonc");
|
|
184
|
+
const [mainConfig, orchestraConfig] = await Promise.all([
|
|
185
|
+
readConfigFile(mainConfigPath),
|
|
186
|
+
readConfigFile(orchestraConfigPath),
|
|
187
|
+
]);
|
|
188
|
+
const checks = [];
|
|
189
|
+
const push = (check) => checks.push(check);
|
|
190
|
+
// --- Config presence & validity ---
|
|
191
|
+
push({
|
|
192
|
+
id: "main-config",
|
|
193
|
+
label: "OpenCode config",
|
|
194
|
+
status: mainConfig.exists ? "ok" : "info",
|
|
195
|
+
detail: mainConfig.exists ? mainConfig.path : "not found (will use OpenCode defaults)",
|
|
196
|
+
...(mainConfig.exists ? {} : { hint: "Run `opencode-orchestra install` to scaffold it." }),
|
|
197
|
+
});
|
|
198
|
+
if (mainConfig.errors.length > 0) {
|
|
199
|
+
push({
|
|
200
|
+
id: "main-config-valid",
|
|
201
|
+
label: "OpenCode config validity",
|
|
202
|
+
status: "error",
|
|
203
|
+
detail: mainConfig.errors.join("; "),
|
|
204
|
+
hint: "Fix the JSONC syntax; the installer and OpenCode cannot read it.",
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
push({
|
|
208
|
+
id: "orchestra-config",
|
|
209
|
+
label: "Orchestra config",
|
|
210
|
+
status: orchestraConfig.exists ? "ok" : "info",
|
|
211
|
+
detail: orchestraConfig.exists ? orchestraConfig.path : "not found (defaults apply)",
|
|
212
|
+
...(orchestraConfig.exists ? {} : { hint: "Run `opencode-orchestra install` to scaffold it." }),
|
|
213
|
+
});
|
|
214
|
+
if (orchestraConfig.errors.length > 0) {
|
|
215
|
+
push({
|
|
216
|
+
id: "orchestra-config-valid",
|
|
217
|
+
label: "Orchestra config validity",
|
|
218
|
+
status: "error",
|
|
219
|
+
detail: orchestraConfig.errors.join("; "),
|
|
220
|
+
hint: "Fix the JSONC syntax so the plugin can load your overrides.",
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
// --- Plugin entry ---
|
|
224
|
+
const plugin = Array.isArray(mainConfig.parsed.plugin) ? mainConfig.parsed.plugin : [];
|
|
225
|
+
const pluginEntry = plugin.map(pluginName).find((name) => name === PACKAGE_NAME);
|
|
226
|
+
push({
|
|
227
|
+
id: "plugin-entry",
|
|
228
|
+
label: "Orchestra plugin entry",
|
|
229
|
+
status: pluginEntry ? "ok" : "warning",
|
|
230
|
+
detail: pluginEntry ? "registered in plugin list" : "not registered",
|
|
231
|
+
...(pluginEntry ? {} : { hint: "Run `opencode-orchestra install` to register the plugin." }),
|
|
232
|
+
});
|
|
233
|
+
// --- MCP server availability ---
|
|
234
|
+
const { local, nonLocalCount } = collectLocalMcps(mainConfig.parsed);
|
|
235
|
+
const known = new Set(["context7", "codebase-memory", "memorygraph"]);
|
|
236
|
+
for (const mcp of local) {
|
|
237
|
+
const isKnown = known.has(mcp.name);
|
|
238
|
+
if (mcp.executable) {
|
|
239
|
+
push({
|
|
240
|
+
id: `mcp-${mcp.name}`,
|
|
241
|
+
label: `MCP ${mcp.name}`,
|
|
242
|
+
status: "ok",
|
|
243
|
+
detail: mcp.executable,
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
push({
|
|
248
|
+
id: `mcp-${mcp.name}`,
|
|
249
|
+
label: `MCP ${mcp.name}`,
|
|
250
|
+
status: "warning",
|
|
251
|
+
detail: `command not found: ${mcp.commands.join(", ")}`,
|
|
252
|
+
...(isKnown ? { hint: "Run the installer with dependency provisioning, or install it manually." } : {}),
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
if (nonLocalCount > 0) {
|
|
257
|
+
push({
|
|
258
|
+
id: "mcp-remote",
|
|
259
|
+
label: "Remote MCP servers",
|
|
260
|
+
status: "info",
|
|
261
|
+
detail: `${nonLocalCount} remote/url server(s) configured (skipped local check)`,
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
// --- Toolchain: uv, memorygraph, codebase-memory ---
|
|
265
|
+
const uv = resolveExecutable(uvCandidates().flatMap((c) => c.paths).concat("uv"), ["--version"]);
|
|
266
|
+
push({
|
|
267
|
+
id: "uv",
|
|
268
|
+
label: "uv",
|
|
269
|
+
status: uv.executable ? "ok" : "warning",
|
|
270
|
+
detail: uv.executable ? `${uv.executable} — ${uv.version ?? "unknown"}` : "not found",
|
|
271
|
+
...(uv.executable
|
|
272
|
+
? {}
|
|
273
|
+
: { hint: "MemoryGraph installs through uv. Install it from https://docs.astral.sh/uv/." }),
|
|
274
|
+
});
|
|
275
|
+
const memorygraphBin = (() => {
|
|
276
|
+
if (!uv.executable)
|
|
277
|
+
return undefined;
|
|
278
|
+
try {
|
|
279
|
+
const dir = spawnSync(uv.executable, ["tool", "dir", "--bin"], { encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] });
|
|
280
|
+
return dir.status === 0 ? dir.stdout.trim() : undefined;
|
|
281
|
+
}
|
|
282
|
+
catch {
|
|
283
|
+
return undefined;
|
|
284
|
+
}
|
|
285
|
+
})();
|
|
286
|
+
const memorygraph = resolveExecutable([
|
|
287
|
+
...(memorygraphBin ? [path.join(memorygraphBin, executableName("memorygraph"))] : []),
|
|
288
|
+
localBin("memorygraph"),
|
|
289
|
+
"memorygraph",
|
|
290
|
+
], ["--version"]);
|
|
291
|
+
push({
|
|
292
|
+
id: "memorygraph",
|
|
293
|
+
label: "MemoryGraph",
|
|
294
|
+
status: memorygraph.executable ? "ok" : "info",
|
|
295
|
+
detail: memorygraph.executable ? `${memorygraph.executable} — ${memorygraph.version ?? "unknown"}` : "not installed",
|
|
296
|
+
...(memorygraph.executable ? {} : { hint: "Run `uv tool install memorygraphMCP`, or `opencode-orchestra install`." }),
|
|
297
|
+
});
|
|
298
|
+
const codebaseMemoryCandidates = [
|
|
299
|
+
"codebase-memory-mcp",
|
|
300
|
+
localBin("codebase-memory-mcp"),
|
|
301
|
+
...(process.platform === "win32" && process.env.LOCALAPPDATA
|
|
302
|
+
? [path.join(process.env.LOCALAPPDATA, "Programs", "codebase-memory-mcp", "codebase-memory-mcp.exe")]
|
|
303
|
+
: []),
|
|
304
|
+
];
|
|
305
|
+
const codebaseMemory = resolveExecutable(codebaseMemoryCandidates, ["--version"]);
|
|
306
|
+
push({
|
|
307
|
+
id: "codebase-memory",
|
|
308
|
+
label: "Codebase Memory",
|
|
309
|
+
status: codebaseMemory.executable ? "ok" : "info",
|
|
310
|
+
detail: codebaseMemory.executable ? `${codebaseMemory.executable} — ${codebaseMemory.version ?? "unknown"}` : "not installed",
|
|
311
|
+
...(codebaseMemory.executable ? {} : { hint: "Run `opencode-orchestra install` to provision it." }),
|
|
312
|
+
});
|
|
313
|
+
return {
|
|
314
|
+
environment: {
|
|
315
|
+
...inspectEnvironment(),
|
|
316
|
+
pluginVersion: await resolvePluginVersion(),
|
|
317
|
+
},
|
|
318
|
+
configDirectory,
|
|
319
|
+
mainConfig,
|
|
320
|
+
orchestraConfig,
|
|
321
|
+
checks: checks.sort((a, b) => STATUS_ORDER[a.status] - STATUS_ORDER[b.status]),
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
export function formatDoctorReport(report) {
|
|
325
|
+
const lines = [];
|
|
326
|
+
lines.push("OpenCode Orchestra doctor");
|
|
327
|
+
lines.push("");
|
|
328
|
+
lines.push(` platform ${report.environment.platform}`);
|
|
329
|
+
lines.push(` home ${report.environment.home}`);
|
|
330
|
+
lines.push(` shell ${report.environment.shell}`);
|
|
331
|
+
lines.push(` node ${report.environment.nodeVersion}`);
|
|
332
|
+
lines.push(` bun ${report.environment.bunVersion}`);
|
|
333
|
+
lines.push(` opencode ${report.environment.openCodeVersion}`);
|
|
334
|
+
lines.push(` orchestra ${report.environment.pluginVersion}`);
|
|
335
|
+
lines.push(` config dir ${report.configDirectory}`);
|
|
336
|
+
lines.push("");
|
|
337
|
+
const errors = report.checks.filter((c) => c.status === "error");
|
|
338
|
+
const warnings = report.checks.filter((c) => c.status === "warning");
|
|
339
|
+
lines.push(`Checks (${report.checks.length}): ${errors.length} error(s), ${warnings.length} warning(s)`);
|
|
340
|
+
lines.push("");
|
|
341
|
+
for (const check of report.checks) {
|
|
342
|
+
const icon = statusIcon(check.status);
|
|
343
|
+
lines.push(` ${icon} ${check.label}`);
|
|
344
|
+
lines.push(` ${check.detail}`);
|
|
345
|
+
if (check.hint)
|
|
346
|
+
lines.push(` → ${check.hint}`);
|
|
347
|
+
}
|
|
348
|
+
if (errors.length === 0) {
|
|
349
|
+
lines.push("");
|
|
350
|
+
lines.push(" All critical checks passed.");
|
|
351
|
+
}
|
|
352
|
+
return lines.join("\n");
|
|
353
|
+
}
|
|
354
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/diagnostics/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export declare const PACKAGE_NAME = "@oeronteros-1/opencode-orchestra";
|
|
2
|
+
/** Compare two dotted versions. Returns negative, zero, or positive. */
|
|
3
|
+
export declare function compareVersions(a: string, b: string): number;
|
|
4
|
+
/**
|
|
5
|
+
* Resolve the latest published version from the npm registry without
|
|
6
|
+
* bundling a network client. Prefers `npm view`, then `bun pm view`, then
|
|
7
|
+
* a direct `fetch` of the registry /latest document.
|
|
8
|
+
*/
|
|
9
|
+
export declare function latestPublishedVersion(): Promise<string | undefined>;
|
|
10
|
+
export interface UpdateCheckResult {
|
|
11
|
+
current: string;
|
|
12
|
+
latest?: string;
|
|
13
|
+
}
|
|
14
|
+
/** True for a bare x.y.z version (pre-release suffixes like -beta are excluded). */
|
|
15
|
+
export declare function isStableSemver(value: string): boolean;
|
|
16
|
+
export declare function formatUpdateResult(result: UpdateCheckResult): string;
|
|
17
|
+
export declare function checkForUpdates(current: string): Promise<UpdateCheckResult>;
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
export const PACKAGE_NAME = "@oeronteros-1/opencode-orchestra";
|
|
3
|
+
const REGISTRY_URL = "https://registry.npmjs.org/@oeronteros-1%2Fopencode-orchestra/latest";
|
|
4
|
+
/** Compare two dotted versions. Returns negative, zero, or positive. */
|
|
5
|
+
export function compareVersions(a, b) {
|
|
6
|
+
const pa = a.split(".").map((n) => Number.parseInt(n, 10) || 0);
|
|
7
|
+
const pb = b.split(".").map((n) => Number.parseInt(n, 10) || 0);
|
|
8
|
+
const length = Math.max(pa.length, pb.length);
|
|
9
|
+
for (let i = 0; i < length; i += 1) {
|
|
10
|
+
const x = pa[i] ?? 0;
|
|
11
|
+
const y = pb[i] ?? 0;
|
|
12
|
+
if (x !== y)
|
|
13
|
+
return x - y;
|
|
14
|
+
}
|
|
15
|
+
return 0;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Resolve the latest published version from the npm registry without
|
|
19
|
+
* bundling a network client. Prefers `npm view`, then `bun pm view`, then
|
|
20
|
+
* a direct `fetch` of the registry /latest document.
|
|
21
|
+
*/
|
|
22
|
+
export async function latestPublishedVersion() {
|
|
23
|
+
for (const [command, args] of [
|
|
24
|
+
["npm", ["view", PACKAGE_NAME, "version"]],
|
|
25
|
+
["bun", ["pm", "view", PACKAGE_NAME, "version"]],
|
|
26
|
+
]) {
|
|
27
|
+
try {
|
|
28
|
+
const result = spawnSync(command, args, { encoding: "utf8", stdio: ["ignore", "pipe", "ignore"], shell: false });
|
|
29
|
+
const first = result.stdout?.trim().split(/\r?\n/)[0];
|
|
30
|
+
if (result.status === 0 && first && /^\d+\.\d+\.\d+/.test(first))
|
|
31
|
+
return first;
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// Try the next fallback.
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
try {
|
|
38
|
+
const response = await fetch(REGISTRY_URL, {
|
|
39
|
+
redirect: "follow",
|
|
40
|
+
headers: { accept: "application/json" },
|
|
41
|
+
});
|
|
42
|
+
if (response.ok) {
|
|
43
|
+
const body = (await response.json());
|
|
44
|
+
if (body.version && /^\d+\.\d+\.\d+/.test(body.version))
|
|
45
|
+
return body.version;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
// No network available.
|
|
50
|
+
}
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
/** True for a bare x.y.z version (pre-release suffixes like -beta are excluded). */
|
|
54
|
+
export function isStableSemver(value) {
|
|
55
|
+
return /^\d+\.\d+\.\d+$/.test(value);
|
|
56
|
+
}
|
|
57
|
+
export function formatUpdateResult(result) {
|
|
58
|
+
const lines = ["OpenCode Orchestra: " + result.current];
|
|
59
|
+
const currentVersion = result.current;
|
|
60
|
+
if (!result.latest) {
|
|
61
|
+
lines.push("Could not reach the npm registry to check for updates.");
|
|
62
|
+
lines.push("Verify network access and retry with opencode-orchestra update.");
|
|
63
|
+
return lines.join("\n");
|
|
64
|
+
}
|
|
65
|
+
// A non-semver current version (unknown, git build, or pre-release like
|
|
66
|
+
// 0.5.3-beta) cannot be compared; just report the published latest.
|
|
67
|
+
if (!isStableSemver(currentVersion)) {
|
|
68
|
+
lines.push("Latest published version: " + result.latest);
|
|
69
|
+
lines.push("Upgrade with: bunx " + PACKAGE_NAME + "@latest install --force");
|
|
70
|
+
return lines.join("\n");
|
|
71
|
+
}
|
|
72
|
+
const level = compareVersions(currentVersion, result.latest);
|
|
73
|
+
if (level < 0) {
|
|
74
|
+
lines.push("A newer version is available: " + result.latest);
|
|
75
|
+
lines.push("Upgrade with: bunx " + PACKAGE_NAME + "@latest install --force");
|
|
76
|
+
}
|
|
77
|
+
else if (level === 0) {
|
|
78
|
+
lines.push("You are on the latest version.");
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
lines.push("Latest published version is older (" + result.latest + "); you may be on a pre-release build.");
|
|
82
|
+
}
|
|
83
|
+
return lines.join("\n");
|
|
84
|
+
}
|
|
85
|
+
export async function checkForUpdates(current) {
|
|
86
|
+
const latest = await latestPublishedVersion();
|
|
87
|
+
return latest ? { current, latest } : { current };
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/diagnostics/update.ts"],"names":[],"mappings":"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"}
|