@mekareteriker/opencode-mcp 1.10.2-mekareteriker.0
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 +204 -0
- package/LICENSE +22 -0
- package/README.md +174 -0
- package/dist/client.d.ts +60 -0
- package/dist/client.js +282 -0
- package/dist/client.js.map +1 -0
- package/dist/helpers.d.ts +150 -0
- package/dist/helpers.js +575 -0
- package/dist/helpers.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.js +198 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts.d.ts +9 -0
- package/dist/prompts.js +210 -0
- package/dist/prompts.js.map +1 -0
- package/dist/resources.d.ts +10 -0
- package/dist/resources.js +197 -0
- package/dist/resources.js.map +1 -0
- package/dist/server-manager.d.ts +72 -0
- package/dist/server-manager.js +264 -0
- package/dist/server-manager.js.map +1 -0
- package/dist/tools/config.d.ts +3 -0
- package/dist/tools/config.js +105 -0
- package/dist/tools/config.js.map +1 -0
- package/dist/tools/events.d.ts +6 -0
- package/dist/tools/events.js +63 -0
- package/dist/tools/events.js.map +1 -0
- package/dist/tools/file.d.ts +3 -0
- package/dist/tools/file.js +153 -0
- package/dist/tools/file.js.map +1 -0
- package/dist/tools/global.d.ts +3 -0
- package/dist/tools/global.js +17 -0
- package/dist/tools/global.js.map +1 -0
- package/dist/tools/message.d.ts +3 -0
- package/dist/tools/message.js +169 -0
- package/dist/tools/message.js.map +1 -0
- package/dist/tools/misc.d.ts +3 -0
- package/dist/tools/misc.js +298 -0
- package/dist/tools/misc.js.map +1 -0
- package/dist/tools/project.d.ts +3 -0
- package/dist/tools/project.js +62 -0
- package/dist/tools/project.js.map +1 -0
- package/dist/tools/provider.d.ts +3 -0
- package/dist/tools/provider.js +175 -0
- package/dist/tools/provider.js.map +1 -0
- package/dist/tools/session.d.ts +3 -0
- package/dist/tools/session.js +392 -0
- package/dist/tools/session.js.map +1 -0
- package/dist/tools/tui.d.ts +7 -0
- package/dist/tools/tui.js +121 -0
- package/dist/tools/tui.js.map +1 -0
- package/dist/tools/workflow.d.ts +7 -0
- package/dist/tools/workflow.js +775 -0
- package/dist/tools/workflow.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { toolJson, toolError, toolResult, directoryParam, destructive } from "../helpers.js";
|
|
3
|
+
export function registerMiscTools(server, client) {
|
|
4
|
+
// --- Path & VCS ---
|
|
5
|
+
server.tool("opencode_path_get", "Get the current working path of the opencode server", {
|
|
6
|
+
directory: directoryParam,
|
|
7
|
+
}, async ({ directory }) => {
|
|
8
|
+
try {
|
|
9
|
+
const raw = await client.get("/path", undefined, directory);
|
|
10
|
+
const p = raw;
|
|
11
|
+
if (p && typeof p === "object" && !Array.isArray(p)) {
|
|
12
|
+
const labels = {
|
|
13
|
+
worktree: "Working directory",
|
|
14
|
+
directory: "Project directory",
|
|
15
|
+
config: "Config",
|
|
16
|
+
state: "State",
|
|
17
|
+
home: "Home",
|
|
18
|
+
};
|
|
19
|
+
const lines = [];
|
|
20
|
+
for (const [key, label] of Object.entries(labels)) {
|
|
21
|
+
if (p[key])
|
|
22
|
+
lines.push(`${label}: ${p[key]}`);
|
|
23
|
+
}
|
|
24
|
+
// Any extra keys not in our map
|
|
25
|
+
for (const [k, v] of Object.entries(p)) {
|
|
26
|
+
if (!labels[k])
|
|
27
|
+
lines.push(`${k}: ${v}`);
|
|
28
|
+
}
|
|
29
|
+
return toolResult(lines.length > 0 ? lines.join("\n") : JSON.stringify(p, null, 2));
|
|
30
|
+
}
|
|
31
|
+
return toolJson(raw);
|
|
32
|
+
}
|
|
33
|
+
catch (e) {
|
|
34
|
+
return toolError(e);
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
server.tool("opencode_vcs_info", "Get VCS (version control) info for the current project (branch, remote, status)", {
|
|
38
|
+
directory: directoryParam,
|
|
39
|
+
}, async ({ directory }) => {
|
|
40
|
+
try {
|
|
41
|
+
const raw = await client.get("/vcs", undefined, directory);
|
|
42
|
+
const v = raw;
|
|
43
|
+
if (!v || typeof v !== "object") {
|
|
44
|
+
return toolResult("No VCS info available.");
|
|
45
|
+
}
|
|
46
|
+
const lines = [];
|
|
47
|
+
if (v.branch)
|
|
48
|
+
lines.push(`Branch: ${v.branch}`);
|
|
49
|
+
if (v.remote)
|
|
50
|
+
lines.push(`Remote: ${v.remote}`);
|
|
51
|
+
if (v.sha)
|
|
52
|
+
lines.push(`HEAD: ${v.sha}`);
|
|
53
|
+
if (v.dirty !== undefined)
|
|
54
|
+
lines.push(`Dirty: ${v.dirty}`);
|
|
55
|
+
if (v.ahead !== undefined)
|
|
56
|
+
lines.push(`Ahead: ${v.ahead}`);
|
|
57
|
+
if (v.behind !== undefined)
|
|
58
|
+
lines.push(`Behind: ${v.behind}`);
|
|
59
|
+
if (v.type)
|
|
60
|
+
lines.push(`Type: ${v.type}`);
|
|
61
|
+
if (lines.length === 0) {
|
|
62
|
+
// Fallback: show all keys
|
|
63
|
+
for (const [k, val] of Object.entries(v)) {
|
|
64
|
+
lines.push(`${k}: ${typeof val === "object" ? JSON.stringify(val) : val}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return toolResult(`## VCS Info\n${lines.join("\n")}`);
|
|
68
|
+
}
|
|
69
|
+
catch (e) {
|
|
70
|
+
return toolError(e);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
// --- Instance ---
|
|
74
|
+
server.tool("opencode_instance_dispose", "Dispose the current opencode instance (shuts it down). WARNING: This is destructive and will terminate the server.", {
|
|
75
|
+
directory: directoryParam,
|
|
76
|
+
}, destructive, async ({ directory }) => {
|
|
77
|
+
try {
|
|
78
|
+
await client.post("/instance/dispose", undefined, { directory });
|
|
79
|
+
return toolResult("Instance disposed.");
|
|
80
|
+
}
|
|
81
|
+
catch (e) {
|
|
82
|
+
return toolError(e);
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
// --- Agents ---
|
|
86
|
+
server.tool("opencode_agent_list", "List all available agents with their names, descriptions, and modes (primary/subagent)", {
|
|
87
|
+
directory: directoryParam,
|
|
88
|
+
}, async ({ directory }) => {
|
|
89
|
+
try {
|
|
90
|
+
const agents = (await client.get("/agent", undefined, directory));
|
|
91
|
+
if (!agents || agents.length === 0) {
|
|
92
|
+
return toolResult("No agents found.");
|
|
93
|
+
}
|
|
94
|
+
const formatted = agents.map((a) => {
|
|
95
|
+
const name = a.name ?? a.id ?? "?";
|
|
96
|
+
const mode = a.mode ?? "?";
|
|
97
|
+
const desc = a.description ?? "(no description)";
|
|
98
|
+
return `- ${name} [${mode}]: ${desc}`;
|
|
99
|
+
}).join("\n");
|
|
100
|
+
return toolResult(formatted);
|
|
101
|
+
}
|
|
102
|
+
catch (e) {
|
|
103
|
+
return toolError(e);
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
// --- Commands ---
|
|
107
|
+
server.tool("opencode_command_list", "List all available commands (built-in and custom slash commands)", {
|
|
108
|
+
directory: directoryParam,
|
|
109
|
+
}, async ({ directory }) => {
|
|
110
|
+
try {
|
|
111
|
+
const raw = await client.get("/command", undefined, directory);
|
|
112
|
+
const commands = Array.isArray(raw) ? raw : [];
|
|
113
|
+
if (commands.length === 0) {
|
|
114
|
+
return toolResult("No commands available.");
|
|
115
|
+
}
|
|
116
|
+
const lines = commands.map((c) => {
|
|
117
|
+
const name = c.name ?? c.id ?? "?";
|
|
118
|
+
const rawDesc = (c.description ?? c.desc ?? "");
|
|
119
|
+
// Truncate to first line, cap at 120 chars to avoid multi-line descriptions leaking
|
|
120
|
+
const desc = rawDesc.split("\n")[0].slice(0, 120);
|
|
121
|
+
return `- /${name}${desc ? `: ${desc}` : ""}`;
|
|
122
|
+
});
|
|
123
|
+
return toolResult(`## Commands (${commands.length})\n${lines.join("\n")}`);
|
|
124
|
+
}
|
|
125
|
+
catch (e) {
|
|
126
|
+
return toolError(e);
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
// --- LSP ---
|
|
130
|
+
server.tool("opencode_lsp_status", "Get the status of LSP (Language Server Protocol) servers", {
|
|
131
|
+
directory: directoryParam,
|
|
132
|
+
}, async ({ directory }) => {
|
|
133
|
+
try {
|
|
134
|
+
const raw = await client.get("/lsp", undefined, directory);
|
|
135
|
+
const servers = Array.isArray(raw) ? raw : [];
|
|
136
|
+
if (servers.length === 0) {
|
|
137
|
+
return toolResult("No LSP servers running.");
|
|
138
|
+
}
|
|
139
|
+
const lines = servers.map((s) => {
|
|
140
|
+
const name = s.name ?? s.id ?? s.language ?? "?";
|
|
141
|
+
const status = s.status ?? s.state ?? "unknown";
|
|
142
|
+
const lang = s.language ? ` (${s.language})` : "";
|
|
143
|
+
return `- ${name}${lang}: ${status}`;
|
|
144
|
+
});
|
|
145
|
+
return toolResult(`## LSP Servers (${servers.length})\n${lines.join("\n")}`);
|
|
146
|
+
}
|
|
147
|
+
catch (e) {
|
|
148
|
+
return toolError(e);
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
// --- Formatter ---
|
|
152
|
+
server.tool("opencode_formatter_status", "Get the status of configured formatters", {
|
|
153
|
+
directory: directoryParam,
|
|
154
|
+
}, async ({ directory }) => {
|
|
155
|
+
try {
|
|
156
|
+
const raw = await client.get("/formatter", undefined, directory);
|
|
157
|
+
const formatters = Array.isArray(raw) ? raw : [];
|
|
158
|
+
if (formatters.length === 0) {
|
|
159
|
+
return toolResult("No formatters configured.");
|
|
160
|
+
}
|
|
161
|
+
const enabled = formatters.filter((f) => f.enabled || f.status === "enabled" || f.active);
|
|
162
|
+
const disabled = formatters.filter((f) => !enabled.includes(f));
|
|
163
|
+
const lines = [];
|
|
164
|
+
if (enabled.length > 0) {
|
|
165
|
+
lines.push("**Enabled:**");
|
|
166
|
+
for (const f of enabled) {
|
|
167
|
+
const name = f.name ?? f.id ?? "?";
|
|
168
|
+
const globs = f.globs ?? f.patterns ?? "";
|
|
169
|
+
const globStr = Array.isArray(globs) ? ` (${globs.join(", ")})` : globs ? ` (${globs})` : "";
|
|
170
|
+
lines.push(`- ${name}${globStr}`);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
if (disabled.length > 0) {
|
|
174
|
+
lines.push(`\n+${disabled.length} more formatters available but not enabled.`);
|
|
175
|
+
}
|
|
176
|
+
return toolResult(`## Formatters (${enabled.length} enabled / ${formatters.length} total)\n${lines.join("\n")}`);
|
|
177
|
+
}
|
|
178
|
+
catch (e) {
|
|
179
|
+
return toolError(e);
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
// --- MCP servers ---
|
|
183
|
+
server.tool("opencode_mcp_status", "Get the status of all MCP servers configured in opencode", {
|
|
184
|
+
directory: directoryParam,
|
|
185
|
+
}, async ({ directory }) => {
|
|
186
|
+
try {
|
|
187
|
+
const raw = await client.get("/mcp", undefined, directory);
|
|
188
|
+
// MCP status may be an object keyed by server name or an array
|
|
189
|
+
if (raw && typeof raw === "object" && !Array.isArray(raw)) {
|
|
190
|
+
const entries = Object.entries(raw);
|
|
191
|
+
if (entries.length === 0) {
|
|
192
|
+
return toolResult("No MCP servers configured.");
|
|
193
|
+
}
|
|
194
|
+
const lines = entries.map(([name, value]) => {
|
|
195
|
+
const s = value;
|
|
196
|
+
const status = s.status ?? s.state ?? "unknown";
|
|
197
|
+
const tools = s.tools;
|
|
198
|
+
const toolCount = Array.isArray(tools) ? tools.length : typeof tools === "number" ? tools : "";
|
|
199
|
+
const toolStr = toolCount !== "" ? ` | ${toolCount} tools` : "";
|
|
200
|
+
return `- ${name}: ${status}${toolStr}`;
|
|
201
|
+
});
|
|
202
|
+
return toolResult(`## MCP Servers (${entries.length})\n${lines.join("\n")}`);
|
|
203
|
+
}
|
|
204
|
+
const servers = Array.isArray(raw) ? raw : [];
|
|
205
|
+
if (servers.length === 0) {
|
|
206
|
+
return toolResult("No MCP servers configured.");
|
|
207
|
+
}
|
|
208
|
+
const lines = servers.map((s) => {
|
|
209
|
+
const name = s.name ?? s.id ?? "?";
|
|
210
|
+
const status = s.status ?? s.state ?? "unknown";
|
|
211
|
+
return `- ${name}: ${status}`;
|
|
212
|
+
});
|
|
213
|
+
return toolResult(`## MCP Servers (${servers.length})\n${lines.join("\n")}`);
|
|
214
|
+
}
|
|
215
|
+
catch (e) {
|
|
216
|
+
return toolError(e);
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
server.tool("opencode_mcp_add", "Add an MCP server dynamically to opencode", {
|
|
220
|
+
name: z.string().describe("Name for the MCP server"),
|
|
221
|
+
config: z
|
|
222
|
+
.record(z.string(), z.unknown())
|
|
223
|
+
.describe("MCP server configuration object"),
|
|
224
|
+
directory: directoryParam,
|
|
225
|
+
}, async ({ name, config, directory }) => {
|
|
226
|
+
try {
|
|
227
|
+
return toolJson(await client.post("/mcp", { name, config }, { directory }));
|
|
228
|
+
}
|
|
229
|
+
catch (e) {
|
|
230
|
+
return toolError(e);
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
// --- Tools (Experimental) ---
|
|
234
|
+
server.tool("opencode_tool_ids", "List all available tool IDs that the LLM can use (experimental)", {
|
|
235
|
+
directory: directoryParam,
|
|
236
|
+
}, async ({ directory }) => {
|
|
237
|
+
try {
|
|
238
|
+
const raw = await client.get("/experimental/tool/ids", undefined, directory);
|
|
239
|
+
const ids = Array.isArray(raw) ? raw : [];
|
|
240
|
+
if (ids.length === 0) {
|
|
241
|
+
return toolResult("No tools available.");
|
|
242
|
+
}
|
|
243
|
+
return toolResult(`## Tools (${ids.length})\n${ids.map((id) => `- ${id}`).join("\n")}`);
|
|
244
|
+
}
|
|
245
|
+
catch (e) {
|
|
246
|
+
return toolError(e);
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
server.tool("opencode_tool_list", "List tools with JSON schemas for a given provider and model (experimental)", {
|
|
250
|
+
provider: z.string().describe("Provider ID"),
|
|
251
|
+
model: z.string().describe("Model ID"),
|
|
252
|
+
directory: directoryParam,
|
|
253
|
+
}, async ({ provider, model, directory }) => {
|
|
254
|
+
try {
|
|
255
|
+
const raw = await client.get("/experimental/tool", { provider, model }, directory);
|
|
256
|
+
const tools = Array.isArray(raw) ? raw : [];
|
|
257
|
+
if (tools.length === 0) {
|
|
258
|
+
return toolResult("No tools available for this provider/model.");
|
|
259
|
+
}
|
|
260
|
+
const lines = tools.map((t) => {
|
|
261
|
+
const id = t.id ?? t.name ?? "?";
|
|
262
|
+
const desc = t.description;
|
|
263
|
+
// Show first line of description only (many are multi-paragraph)
|
|
264
|
+
const shortDesc = desc ? desc.split("\n")[0].slice(0, 120) : "";
|
|
265
|
+
return `- ${id}${shortDesc ? `: ${shortDesc}` : ""}`;
|
|
266
|
+
});
|
|
267
|
+
return toolResult(`## Tools for ${provider}/${model} (${tools.length})\n${lines.join("\n")}`);
|
|
268
|
+
}
|
|
269
|
+
catch (e) {
|
|
270
|
+
return toolError(e);
|
|
271
|
+
}
|
|
272
|
+
});
|
|
273
|
+
// --- Logging ---
|
|
274
|
+
server.tool("opencode_log", "Write a log entry to the opencode server", {
|
|
275
|
+
service: z.string().describe("Service name for the log entry"),
|
|
276
|
+
level: z
|
|
277
|
+
.enum(["debug", "info", "warn", "error"])
|
|
278
|
+
.describe("Log level"),
|
|
279
|
+
message: z.string().describe("Log message"),
|
|
280
|
+
extra: z
|
|
281
|
+
.record(z.string(), z.unknown())
|
|
282
|
+
.optional()
|
|
283
|
+
.describe("Extra data to include in the log entry"),
|
|
284
|
+
directory: directoryParam,
|
|
285
|
+
}, async ({ service, level, message, extra, directory }) => {
|
|
286
|
+
try {
|
|
287
|
+
const body = { service, level, message };
|
|
288
|
+
if (extra)
|
|
289
|
+
body.extra = extra;
|
|
290
|
+
await client.post("/log", body, { directory });
|
|
291
|
+
return toolResult(`Log entry written [${level}] ${service}: ${message}`);
|
|
292
|
+
}
|
|
293
|
+
catch (e) {
|
|
294
|
+
return toolError(e);
|
|
295
|
+
}
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
//# sourceMappingURL=misc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"misc.js","sourceRoot":"","sources":["../../src/tools/misc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { toolJson, toolError, toolResult, directoryParam } from "../helpers.js";
|
|
2
|
+
/** Format a project object into a compact summary. */
|
|
3
|
+
function formatProject(p) {
|
|
4
|
+
const worktree = (p.worktree ?? "unknown");
|
|
5
|
+
const name = (worktree !== "unknown" ? worktree.split("/").filter(Boolean).pop() : undefined)
|
|
6
|
+
?? p.name ?? p.id ?? "unknown";
|
|
7
|
+
const lines = [];
|
|
8
|
+
lines.push(`Name: ${name}`);
|
|
9
|
+
lines.push(`Path: ${worktree}`);
|
|
10
|
+
if (p.vcs)
|
|
11
|
+
lines.push(`VCS: ${p.vcs}`);
|
|
12
|
+
if (p.id)
|
|
13
|
+
lines.push(`ID: ${p.id}`);
|
|
14
|
+
const time = p.time;
|
|
15
|
+
if (time?.created) {
|
|
16
|
+
lines.push(`Created: ${new Date(time.created).toISOString()}`);
|
|
17
|
+
}
|
|
18
|
+
if (time?.updated) {
|
|
19
|
+
lines.push(`Updated: ${new Date(time.updated).toISOString()}`);
|
|
20
|
+
}
|
|
21
|
+
return lines.join("\n");
|
|
22
|
+
}
|
|
23
|
+
export function registerProjectTools(server, client) {
|
|
24
|
+
server.tool("opencode_project_list", "List all projects known to the opencode server", {
|
|
25
|
+
directory: directoryParam,
|
|
26
|
+
}, async ({ directory }) => {
|
|
27
|
+
try {
|
|
28
|
+
const raw = await client.get("/project", undefined, directory);
|
|
29
|
+
const projects = Array.isArray(raw) ? raw : [];
|
|
30
|
+
if (projects.length === 0) {
|
|
31
|
+
return toolResult("No projects found.");
|
|
32
|
+
}
|
|
33
|
+
const lines = projects.map((p) => {
|
|
34
|
+
const worktree = (p.worktree ?? "?");
|
|
35
|
+
const name = (worktree !== "?" ? worktree.split("/").filter(Boolean).pop() : undefined)
|
|
36
|
+
?? p.name ?? p.id ?? "(root)";
|
|
37
|
+
const vcs = p.vcs ? ` [${p.vcs}]` : "";
|
|
38
|
+
return `- ${name}: ${worktree}${vcs}`;
|
|
39
|
+
});
|
|
40
|
+
return toolResult(`## Projects (${projects.length})\n${lines.join("\n")}`);
|
|
41
|
+
}
|
|
42
|
+
catch (e) {
|
|
43
|
+
return toolError(e);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
server.tool("opencode_project_current", "Get the current active project", {
|
|
47
|
+
directory: directoryParam,
|
|
48
|
+
}, async ({ directory }) => {
|
|
49
|
+
try {
|
|
50
|
+
const raw = await client.get("/project/current", undefined, directory);
|
|
51
|
+
const p = raw;
|
|
52
|
+
if (p && typeof p === "object") {
|
|
53
|
+
return toolResult(formatProject(p));
|
|
54
|
+
}
|
|
55
|
+
return toolJson(raw);
|
|
56
|
+
}
|
|
57
|
+
catch (e) {
|
|
58
|
+
return toolError(e);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/tools/project.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { toolJson, toolError, toolResult, directoryParam, isProviderConfigured } from "../helpers.js";
|
|
3
|
+
export function registerProviderTools(server, client) {
|
|
4
|
+
server.tool("opencode_provider_list", "List all configured providers with their connection status. Returns a compact summary — use opencode_provider_models to see models for a specific provider.", {
|
|
5
|
+
directory: directoryParam,
|
|
6
|
+
}, async ({ directory }) => {
|
|
7
|
+
try {
|
|
8
|
+
const raw = await client.get("/provider", undefined, directory);
|
|
9
|
+
const providers = (raw && typeof raw === "object" && "all" in raw
|
|
10
|
+
? raw.all
|
|
11
|
+
: raw);
|
|
12
|
+
if (!Array.isArray(providers) || providers.length === 0) {
|
|
13
|
+
return toolResult("No providers configured.");
|
|
14
|
+
}
|
|
15
|
+
const countModels = (p) => {
|
|
16
|
+
const m = p.models;
|
|
17
|
+
return Array.isArray(m) ? m.length : m && typeof m === "object" ? Object.keys(m).length : 0;
|
|
18
|
+
};
|
|
19
|
+
const configured = providers.filter(isProviderConfigured);
|
|
20
|
+
const unconfigured = providers.filter((p) => !isProviderConfigured(p));
|
|
21
|
+
const lines = [];
|
|
22
|
+
if (configured.length > 0) {
|
|
23
|
+
lines.push("**Configured:**");
|
|
24
|
+
for (const p of configured) {
|
|
25
|
+
const id = p.id ?? p.name ?? "?";
|
|
26
|
+
const mc = countModels(p);
|
|
27
|
+
const envVars = Array.isArray(p.env) ? ` (via ${p.env.join(", ")})` : "";
|
|
28
|
+
lines.push(`- ${id}: ${mc} model${mc !== 1 ? "s" : ""}${envVars}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
lines.push("**No providers configured.** Use `opencode_auth_set` or set environment variables.");
|
|
33
|
+
}
|
|
34
|
+
if (unconfigured.length > 0) {
|
|
35
|
+
lines.push(`\n**Not configured:** ${unconfigured.length} more providers available`);
|
|
36
|
+
// Show up to 5 popular ones
|
|
37
|
+
const popularIds = new Set(["anthropic", "openai", "google", "openrouter", "groq", "deepseek", "mistral", "huggingface"]);
|
|
38
|
+
const popular = unconfigured.filter((p) => popularIds.has(p.id)).slice(0, 5);
|
|
39
|
+
if (popular.length > 0) {
|
|
40
|
+
for (const p of popular) {
|
|
41
|
+
const id = p.id ?? "?";
|
|
42
|
+
const mc = countModels(p);
|
|
43
|
+
lines.push(`- ${id}: ${mc} model${mc !== 1 ? "s" : ""}`);
|
|
44
|
+
}
|
|
45
|
+
const rest = unconfigured.length - popular.length;
|
|
46
|
+
if (rest > 0)
|
|
47
|
+
lines.push(`- ... and ${rest} more`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return toolResult(`## Providers (${configured.length} configured / ${providers.length} total)\n${lines.join("\n")}\n\nUse \`opencode_provider_models\` with a provider ID to see its models.`);
|
|
51
|
+
}
|
|
52
|
+
catch (e) {
|
|
53
|
+
return toolError(e);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
server.tool("opencode_provider_models", "List available models for a specific provider. Call opencode_provider_list first to see provider IDs.", {
|
|
57
|
+
providerId: z
|
|
58
|
+
.string()
|
|
59
|
+
.describe("Provider ID (e.g. 'anthropic', 'openrouter', 'google')"),
|
|
60
|
+
limit: z
|
|
61
|
+
.number()
|
|
62
|
+
.optional()
|
|
63
|
+
.describe("Max models to show (default 30). Use 0 for all."),
|
|
64
|
+
directory: directoryParam,
|
|
65
|
+
}, async ({ providerId, limit, directory }) => {
|
|
66
|
+
try {
|
|
67
|
+
const raw = await client.get("/provider", undefined, directory);
|
|
68
|
+
const providers = (raw && typeof raw === "object" && "all" in raw
|
|
69
|
+
? raw.all
|
|
70
|
+
: raw);
|
|
71
|
+
if (!Array.isArray(providers)) {
|
|
72
|
+
return toolError("Unexpected provider response format.");
|
|
73
|
+
}
|
|
74
|
+
const provider = providers.find((p) => (p.id ?? p.name) === providerId);
|
|
75
|
+
if (!provider) {
|
|
76
|
+
const allIds = providers.map((p) => p.id ?? p.name);
|
|
77
|
+
const shown = allIds.slice(0, 10);
|
|
78
|
+
const rest = allIds.length - shown.length;
|
|
79
|
+
const available = shown.join(", ") + (rest > 0 ? ` ... and ${rest} more` : "");
|
|
80
|
+
return toolResult(`Provider "${providerId}" not found. Available: ${available || "none"}\n\nUse \`opencode_provider_list\` to see all providers.`, true);
|
|
81
|
+
}
|
|
82
|
+
const configured = isProviderConfigured(provider);
|
|
83
|
+
const rawModels = provider.models;
|
|
84
|
+
const modelList = Array.isArray(rawModels)
|
|
85
|
+
? rawModels
|
|
86
|
+
: rawModels && typeof rawModels === "object"
|
|
87
|
+
? Object.values(rawModels)
|
|
88
|
+
: [];
|
|
89
|
+
if (modelList.length === 0) {
|
|
90
|
+
return toolResult(`Provider "${providerId}" (${configured ? "configured" : "NOT CONFIGURED"}) has no models available.`);
|
|
91
|
+
}
|
|
92
|
+
const maxItems = limit === 0 ? modelList.length : (limit ?? 30);
|
|
93
|
+
const shown = modelList.slice(0, maxItems);
|
|
94
|
+
const lines = shown.map((m) => {
|
|
95
|
+
const id = m.id ?? m.name ?? "?";
|
|
96
|
+
const name = m.name && m.name !== m.id ? ` — ${m.name}` : "";
|
|
97
|
+
return `- ${id}${name}`;
|
|
98
|
+
});
|
|
99
|
+
const truncNote = modelList.length > maxItems
|
|
100
|
+
? `\n\n... and ${modelList.length - maxItems} more. Use \`limit: 0\` to see all.`
|
|
101
|
+
: "";
|
|
102
|
+
return toolResult(`## ${providerId} (${configured ? "configured" : "NOT CONFIGURED"}) — ${modelList.length} model${modelList.length !== 1 ? "s" : ""}\n${lines.join("\n")}${truncNote}`);
|
|
103
|
+
}
|
|
104
|
+
catch (e) {
|
|
105
|
+
return toolError(e);
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
server.tool("opencode_provider_auth_methods", "Get available authentication methods for all providers", {
|
|
109
|
+
directory: directoryParam,
|
|
110
|
+
}, async ({ directory }) => {
|
|
111
|
+
try {
|
|
112
|
+
const raw = await client.get("/provider/auth", undefined, directory);
|
|
113
|
+
if (raw && typeof raw === "object" && !Array.isArray(raw)) {
|
|
114
|
+
const entries = Object.entries(raw);
|
|
115
|
+
if (entries.length === 0) {
|
|
116
|
+
return toolResult("No authentication methods available.");
|
|
117
|
+
}
|
|
118
|
+
const lines = entries.map(([providerId, methods]) => {
|
|
119
|
+
const arr = Array.isArray(methods) ? methods : [];
|
|
120
|
+
const methodDescs = arr.map((m) => {
|
|
121
|
+
const type = m.type ?? "?";
|
|
122
|
+
const label = m.label ?? "";
|
|
123
|
+
return label ? `${type} (${label})` : String(type);
|
|
124
|
+
});
|
|
125
|
+
return `- ${providerId}: ${methodDescs.join(", ") || "none"}`;
|
|
126
|
+
});
|
|
127
|
+
return toolResult(`## Auth Methods (${entries.length} providers)\n${lines.join("\n")}`);
|
|
128
|
+
}
|
|
129
|
+
return toolJson(raw);
|
|
130
|
+
}
|
|
131
|
+
catch (e) {
|
|
132
|
+
return toolError(e);
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
// Auth routes run OUTSIDE the directory middleware in the OpenCode server,
|
|
136
|
+
// so these tools do not accept a directory parameter.
|
|
137
|
+
server.tool("opencode_provider_oauth_authorize", "Start OAuth authorization for a provider", {
|
|
138
|
+
providerId: z.string().describe("Provider ID to authorize"),
|
|
139
|
+
}, async ({ providerId }) => {
|
|
140
|
+
try {
|
|
141
|
+
return toolJson(await client.post(`/provider/${providerId}/oauth/authorize`));
|
|
142
|
+
}
|
|
143
|
+
catch (e) {
|
|
144
|
+
return toolError(e);
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
server.tool("opencode_provider_oauth_callback", "Handle OAuth callback for a provider", {
|
|
148
|
+
providerId: z.string().describe("Provider ID"),
|
|
149
|
+
callbackData: z
|
|
150
|
+
.record(z.string(), z.unknown())
|
|
151
|
+
.describe("OAuth callback data"),
|
|
152
|
+
}, async ({ providerId, callbackData }) => {
|
|
153
|
+
try {
|
|
154
|
+
await client.post(`/provider/${providerId}/oauth/callback`, callbackData);
|
|
155
|
+
return toolResult("OAuth callback processed.");
|
|
156
|
+
}
|
|
157
|
+
catch (e) {
|
|
158
|
+
return toolError(e);
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
server.tool("opencode_auth_set", "Set authentication credentials for a provider (e.g. API key). Credentials are stored globally and shared across all projects.", {
|
|
162
|
+
providerId: z.string().describe("Provider ID (e.g. 'anthropic')"),
|
|
163
|
+
type: z.string().describe("Auth type (e.g. 'api')"),
|
|
164
|
+
key: z.string().describe("API key or credential value"),
|
|
165
|
+
}, async ({ providerId, type, key }) => {
|
|
166
|
+
try {
|
|
167
|
+
await client.put(`/auth/${providerId}`, { type, key });
|
|
168
|
+
return toolResult(`Auth credentials set for ${providerId}.`);
|
|
169
|
+
}
|
|
170
|
+
catch (e) {
|
|
171
|
+
return toolError(e);
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/tools/provider.ts"],"names":[],"mappings":"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"}
|