@botconnector/bccli 0.4.16 → 0.5.0-rc.4

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 (185) hide show
  1. package/LICENSE +203 -21
  2. package/THIRD_PARTY_NOTICES.md +9 -0
  3. package/branding.mjs +347 -0
  4. package/cli.mjs +120 -0
  5. package/core.mjs +260 -0
  6. package/credentials.mjs +52 -0
  7. package/gateway.mjs +2 -0
  8. package/model-command.mjs +61 -0
  9. package/package.json +35 -59
  10. package/provider-cli.mjs +77 -0
  11. package/providers.mjs +166 -0
  12. package/proxy.mjs +242 -0
  13. package/startup-menu.mjs +120 -0
  14. package/README.en.md +0 -253
  15. package/README.md +0 -250
  16. package/dist/abort.d.ts +0 -5
  17. package/dist/acp-JZW3XHE5.js +0 -221
  18. package/dist/acp.d.ts +0 -44
  19. package/dist/agent.d.ts +0 -147
  20. package/dist/agents.d.ts +0 -4
  21. package/dist/args-XVO7TB4C.js +0 -13
  22. package/dist/args.d.ts +0 -59
  23. package/dist/budget.d.ts +0 -26
  24. package/dist/checkpoints.d.ts +0 -35
  25. package/dist/chunk-3CYQYHPK.js +0 -202
  26. package/dist/chunk-6JK4IBGK.js +0 -1075
  27. package/dist/chunk-6SDRWEPN.js +0 -50
  28. package/dist/chunk-7GM6NN5E.js +0 -341
  29. package/dist/chunk-7XD47KN5.js +0 -71
  30. package/dist/chunk-INMSTUB2.js +0 -56
  31. package/dist/chunk-ISOKH5WB.js +0 -256
  32. package/dist/chunk-JUC3ZOCV.js +0 -50
  33. package/dist/chunk-KDVL2NP6.js +0 -861
  34. package/dist/chunk-KEKDRROL.js +0 -216
  35. package/dist/chunk-KJIXA6MP.js +0 -159
  36. package/dist/chunk-OK2USAXX.js +0 -88
  37. package/dist/chunk-PSO7R5AD.js +0 -10
  38. package/dist/chunk-Q42ZGVAQ.js +0 -91
  39. package/dist/chunk-R754XIBJ.js +0 -523
  40. package/dist/chunk-S3QEZDKB.js +0 -270
  41. package/dist/chunk-SWNRA3EW.js +0 -78
  42. package/dist/chunk-TLCL6DC7.js +0 -378
  43. package/dist/chunk-V5D6PJQN.js +0 -8
  44. package/dist/chunk-YYTFJUO2.js +0 -148
  45. package/dist/chunk-ZJRZTMJF.js +0 -2669
  46. package/dist/cli.d.ts +0 -1
  47. package/dist/cli.js +0 -233
  48. package/dist/clipboardImage.d.ts +0 -17
  49. package/dist/commands.d.ts +0 -16
  50. package/dist/completion-Q7VHOPPV.js +0 -125
  51. package/dist/completion.d.ts +0 -14
  52. package/dist/config-T7MKGJVG.js +0 -34
  53. package/dist/config-YYEAEN2C.js +0 -25
  54. package/dist/config.d.ts +0 -99
  55. package/dist/context.d.ts +0 -13
  56. package/dist/contextWindow.d.ts +0 -3
  57. package/dist/diff.d.ts +0 -7
  58. package/dist/exit.d.ts +0 -9
  59. package/dist/extensions.d.ts +0 -34
  60. package/dist/ghBotCli-7VUGI63S.js +0 -680
  61. package/dist/ghBotCli.d.ts +0 -9
  62. package/dist/ghBotDispatch.d.ts +0 -68
  63. package/dist/ghBotRunner.d.ts +0 -82
  64. package/dist/ghBotServe.d.ts +0 -21
  65. package/dist/ghBotWebhook.d.ts +0 -45
  66. package/dist/hooks.d.ts +0 -27
  67. package/dist/i18n/id.d.ts +0 -1
  68. package/dist/i18n.d.ts +0 -16
  69. package/dist/integrationCli-FBRSTF5F.js +0 -876
  70. package/dist/integrationCli.d.ts +0 -9
  71. package/dist/keybinds.d.ts +0 -22
  72. package/dist/login-BSMUGW7L.js +0 -18
  73. package/dist/login.d.ts +0 -21
  74. package/dist/lsp.d.ts +0 -73
  75. package/dist/mcp/catalog.d.ts +0 -14
  76. package/dist/mcp/config.d.ts +0 -36
  77. package/dist/mcp/manager.d.ts +0 -52
  78. package/dist/mcp/oauth.d.ts +0 -82
  79. package/dist/mcpCli-ZT7CRYMP.js +0 -113
  80. package/dist/mcpCli.d.ts +0 -3
  81. package/dist/mcpServer/serve.d.ts +0 -8
  82. package/dist/mcpServer/server.d.ts +0 -19
  83. package/dist/models.d.ts +0 -13
  84. package/dist/modelsCli-2ZRW4CC4.js +0 -36
  85. package/dist/modelsCli.d.ts +0 -15
  86. package/dist/npmRunner-LU43GM3W.js +0 -46
  87. package/dist/npmRunner.d.ts +0 -21
  88. package/dist/oauthLogin-THSM6FE7.js +0 -210
  89. package/dist/oauthLogin.d.ts +0 -47
  90. package/dist/permissions.d.ts +0 -30
  91. package/dist/pluginSpec.d.ts +0 -25
  92. package/dist/plugins.d.ts +0 -45
  93. package/dist/pluginsCli-EKQI4CJW.js +0 -288
  94. package/dist/pluginsCli.d.ts +0 -16
  95. package/dist/prCli-FMQTOBIV.js +0 -94
  96. package/dist/prCli.d.ts +0 -46
  97. package/dist/presets.d.ts +0 -8
  98. package/dist/print.d.ts +0 -17
  99. package/dist/provider.d.ts +0 -145
  100. package/dist/providerCli-3TFEKV4C.js +0 -15
  101. package/dist/providerCli.d.ts +0 -17
  102. package/dist/providers.d.ts +0 -6
  103. package/dist/reasoning.d.ts +0 -12
  104. package/dist/repomap.d.ts +0 -10
  105. package/dist/sdk.d.ts +0 -61
  106. package/dist/sdk.js +0 -6494
  107. package/dist/serve-3BODPEPR.js +0 -532
  108. package/dist/serve-V6YVZTNR.js +0 -178
  109. package/dist/serve.d.ts +0 -37
  110. package/dist/serveHeartbeat.d.ts +0 -14
  111. package/dist/serveProtocol.d.ts +0 -47
  112. package/dist/session-LX4UNPCD.js +0 -12
  113. package/dist/session.d.ts +0 -33
  114. package/dist/setup-MFG3BWEU.js +0 -24
  115. package/dist/setup.d.ts +0 -79
  116. package/dist/slash/copy.d.ts +0 -1
  117. package/dist/slash/diff.d.ts +0 -1
  118. package/dist/slash/doctor.d.ts +0 -18
  119. package/dist/slash/export.d.ts +0 -2
  120. package/dist/slash/info.d.ts +0 -46
  121. package/dist/slash/memory.d.ts +0 -10
  122. package/dist/statsCli-7MIQHLVW.js +0 -353
  123. package/dist/statsCli.d.ts +0 -62
  124. package/dist/textToolCalls.d.ts +0 -6
  125. package/dist/thinking.d.ts +0 -17
  126. package/dist/tokenBudget.d.ts +0 -22
  127. package/dist/tools/bash.d.ts +0 -54
  128. package/dist/tools/diagnostics.d.ts +0 -13
  129. package/dist/tools/edit.d.ts +0 -12
  130. package/dist/tools/fetch.d.ts +0 -41
  131. package/dist/tools/glob.d.ts +0 -5
  132. package/dist/tools/globSafety.d.ts +0 -7
  133. package/dist/tools/grep.d.ts +0 -25
  134. package/dist/tools/ignore.d.ts +0 -2
  135. package/dist/tools/index.d.ts +0 -12
  136. package/dist/tools/memory.d.ts +0 -13
  137. package/dist/tools/paths.d.ts +0 -4
  138. package/dist/tools/plan.d.ts +0 -10
  139. package/dist/tools/read.d.ts +0 -16
  140. package/dist/tools/repomap.d.ts +0 -2
  141. package/dist/tools/sandbox.d.ts +0 -15
  142. package/dist/tools/shell.d.ts +0 -18
  143. package/dist/tools/skill.d.ts +0 -3
  144. package/dist/tools/task.d.ts +0 -28
  145. package/dist/tools/todo.d.ts +0 -13
  146. package/dist/tools/types.d.ts +0 -52
  147. package/dist/tools/websearch.d.ts +0 -9
  148. package/dist/tools/write.d.ts +0 -5
  149. package/dist/transferCli-SRSYQLSJ.js +0 -73
  150. package/dist/transferCli.d.ts +0 -23
  151. package/dist/ui/App.d.ts +0 -7
  152. package/dist/ui/DiffView.d.ts +0 -3
  153. package/dist/ui/EditableText.d.ts +0 -7
  154. package/dist/ui/LinePrompt.d.ts +0 -6
  155. package/dist/ui/ListPicker.d.ts +0 -11
  156. package/dist/ui/Markdown.d.ts +0 -8
  157. package/dist/ui/McpMenu.d.ts +0 -11
  158. package/dist/ui/ModelPicker.d.ts +0 -6
  159. package/dist/ui/PermissionPrompt.d.ts +0 -5
  160. package/dist/ui/PlanApproval.d.ts +0 -5
  161. package/dist/ui/PromptInput.d.ts +0 -20
  162. package/dist/ui/ProviderMenu.d.ts +0 -10
  163. package/dist/ui/Spinner.d.ts +0 -4
  164. package/dist/ui/StatusBar.d.ts +0 -9
  165. package/dist/ui/TodoList.d.ts +0 -4
  166. package/dist/ui/ToolBlock.d.ts +0 -14
  167. package/dist/ui/complete.d.ts +0 -8
  168. package/dist/ui/index.d.ts +0 -7
  169. package/dist/ui/lineEdit.d.ts +0 -42
  170. package/dist/ui/liveCap.d.ts +0 -9
  171. package/dist/ui/replay.d.ts +0 -4
  172. package/dist/ui/stdinFilter.d.ts +0 -18
  173. package/dist/ui/table.d.ts +0 -20
  174. package/dist/ui/theme.d.ts +0 -5
  175. package/dist/ui/thinkingMouse.d.ts +0 -38
  176. package/dist/ui/transcript.d.ts +0 -55
  177. package/dist/ui/tty.d.ts +0 -11
  178. package/dist/ui/vim.d.ts +0 -26
  179. package/dist/ui-LZ4JGF2V.js +0 -2913
  180. package/dist/update-P7MU4ZM7.js +0 -145
  181. package/dist/update.d.ts +0 -30
  182. package/dist/verify.d.ts +0 -16
  183. package/dist/version.d.ts +0 -1
  184. package/dist/webBudget.d.ts +0 -25
  185. package/dist/worktree.d.ts +0 -12
@@ -1,256 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- MODE_ORDER
4
- } from "./chunk-YYTFJUO2.js";
5
- import {
6
- REASONING_LEVELS,
7
- isReasoningLevel
8
- } from "./chunk-7XD47KN5.js";
9
- import {
10
- ConfigError
11
- } from "./chunk-TLCL6DC7.js";
12
- import {
13
- parseLang,
14
- t
15
- } from "./chunk-R754XIBJ.js";
16
-
17
- // src/args.ts
18
- import { parseArgs } from "util";
19
-
20
- // src/serveProtocol.ts
21
- import { randomBytes, timingSafeEqual } from "crypto";
22
- var MAX_FRAME_BYTES = 262144;
23
- function parseClientFrame(raw) {
24
- let value;
25
- try {
26
- value = JSON.parse(raw);
27
- } catch {
28
- return { error: "invalid JSON frame" };
29
- }
30
- const f = value;
31
- if (typeof f?.streamId !== "string" || f.streamId === "") return { error: "frame requires a streamId" };
32
- if (f.type === "open") {
33
- if (typeof f.target !== "string" || f.target === "") return { error: "open requires a target" };
34
- return { type: "open", streamId: f.streamId, target: f.target };
35
- }
36
- if (f.type === "cancel") return { type: "cancel", streamId: f.streamId };
37
- return { error: `unknown frame type: ${String(f?.type)}` };
38
- }
39
- var LOOPBACK_HOSTS = /* @__PURE__ */ new Set(["127.0.0.1", "localhost", "[::1]", "::1"]);
40
- var LOOPBACK_BIND = /* @__PURE__ */ new Set(["127.0.0.1", "localhost", "::1"]);
41
- function trustFence(headers, port) {
42
- const host = headers.host;
43
- if (!host) return "missing Host header";
44
- let hostname;
45
- let hostPort;
46
- if (host.startsWith("[")) {
47
- const close = host.indexOf("]");
48
- if (close === -1) return `non-loopback Host: ${host}`;
49
- hostname = host.slice(0, close + 1);
50
- hostPort = host[close + 1] === ":" ? Number(host.slice(close + 2)) : 80;
51
- } else {
52
- const sep = host.lastIndexOf(":");
53
- hostname = sep > -1 ? host.slice(0, sep) : host;
54
- hostPort = sep > -1 ? Number(host.slice(sep + 1)) : 80;
55
- }
56
- if (!LOOPBACK_HOSTS.has(hostname)) return `non-loopback Host: ${hostname}`;
57
- if (hostPort !== port) return `Host port ${hostPort} does not match listener ${port}`;
58
- if (headers.origin) {
59
- let origin;
60
- try {
61
- origin = new URL(headers.origin);
62
- } catch {
63
- return "malformed Origin header";
64
- }
65
- const originHost = origin.hostname === "::1" ? "[::1]" : origin.hostname;
66
- const originPort = origin.port ? Number(origin.port) : origin.protocol === "https:" ? 443 : 80;
67
- if (!LOOPBACK_HOSTS.has(originHost)) return `cross-origin Origin: ${headers.origin}`;
68
- if (originPort !== port) return "Origin port mismatch";
69
- }
70
- if (headers["sec-fetch-site"] === "cross-site") return "cross-site request";
71
- return null;
72
- }
73
- function bearerOk(header, token) {
74
- if (!header?.startsWith("Bearer ")) return false;
75
- const got = Buffer.from(header.slice(7));
76
- const want = Buffer.from(token);
77
- return got.length === want.length && timingSafeEqual(got, want);
78
- }
79
- function randomToken() {
80
- return randomBytes(32).toString("hex");
81
- }
82
-
83
- // src/args.ts
84
- var HELP = `BCCLI \u2014 BotConnector's AI coding agent for the terminal
85
-
86
- Usage:
87
- bccli [task] interactive mode (optionally start with a task)
88
- bccli -p "task" run one task without interaction (scripts/CI)
89
- bccli login [provider] OAuth login (or --key paste API key, --logout remove)
90
- bccli models [provider] list models (default: the active provider)
91
- bccli update install the newest bccli from npm
92
- bccli acp run as an ACP agent for editors (Zed, ...)
93
- bccli serve [--port N] serve sessions over HTTP+WS for IDEs/bots
94
- bccli plugins list, install, remove, or update plugins
95
- bccli gh-bot [serve] GitHub comment bot (off-by-default; needs config)
96
- bccli provider list|add <id>|remove <id> manage providers (custom: --url <url> [--name N] [--key-env ENV])
97
- bccli mcp list|add <name>|remove <name>|auth <name>|logout <name>|serve [--base-url <url>] manage MCP servers, or serve this account's tools over stdio
98
- bccli completion <shell> print a shell completion script (bash, zsh, fish, powershell)
99
- bccli stats [--days N] [--tools N] [--models [N|all]] [--project slug]
100
- show token usage from local sessions (default: last 7 days)
101
- bccli export [session] [file] copy a session JSONL to a file (default: last session here)
102
- bccli import <file> import a session JSONL into the current project
103
- bccli pr <number> [--repo owner/name] [task] check out a GitHub PR and run a task on it
104
- bccli integrations show the status of external agent integrations
105
- bccli connect <agent> opencode, aider, cline, dsh, codex, claude-code, openclaw, hermes, crush, kilo, cursor, openai-cli, openai-sdk, openai-compatible
106
- bccli disconnect <agent> remove an integration and restore the previous config
107
-
108
- Options:
109
- -m, --model <provider/model> choose a model, e.g. bc-cloud/glm-5.3-flash
110
- --reasoning <level> auto | off | low | medium | high | max
111
- -c, --continue continue the last session in this folder
112
- -r, --resume pick a session to continue
113
- --allow-all run all tools without asking for permission
114
- --allowed-tools <a,b> tools allowed without asking: bash, edit, fetch
115
- --fail-on-tool-error with -p: exit 1 when any tool call fails (for CI)
116
- -w, --worktree <name> run in git worktree ../<repo>.worktrees/<name> (created, or reused if it exists)
117
- --output-format <fmt> text | json | stream-json for -p (machine-readable output)
118
- --permission-mode <mode> default | acceptEdits | plan | allowAll
119
- --lang <en|id> interface language (default: en; or BCCLI_LANG, or "language" in config)
120
- -v, --version version
121
- -h, --help this help`;
122
- var helpText = () => t(HELP);
123
- function parseCliArgs(argv) {
124
- const expanded = argv.map((a, i) => {
125
- const nextIsFlagOrEnd = i + 1 >= argv.length || argv[i + 1].startsWith("-");
126
- if (a === "--models" && nextIsFlagOrEnd) return "--models=all";
127
- if (a === "--project" && nextIsFlagOrEnd) return "--project=";
128
- return a;
129
- });
130
- const { values, positionals } = parseArgs({
131
- args: expanded,
132
- allowPositionals: true,
133
- options: {
134
- print: { type: "boolean", short: "p" },
135
- model: { type: "string", short: "m" },
136
- reasoning: { type: "string" },
137
- lang: { type: "string" },
138
- continue: { type: "boolean", short: "c" },
139
- resume: { type: "boolean", short: "r" },
140
- "allow-all": { type: "boolean" },
141
- command: { type: "string" },
142
- args: { type: "string" },
143
- "fail-on-tool-error": { type: "boolean" },
144
- "allowed-tools": { type: "string" },
145
- worktree: { type: "string", short: "w" },
146
- "output-format": { type: "string" },
147
- "permission-mode": { type: "string" },
148
- help: { type: "boolean", short: "h" },
149
- version: { type: "boolean", short: "v" },
150
- url: { type: "string" },
151
- name: { type: "string" },
152
- "key-env": { type: "string" },
153
- value: { type: "string", multiple: true },
154
- key: { type: "boolean" },
155
- logout: { type: "boolean" },
156
- port: { type: "string" },
157
- host: { type: "string" },
158
- token: { type: "string" },
159
- "base-url": { type: "string" },
160
- days: { type: "string" },
161
- tools: { type: "string" },
162
- models: { type: "string" },
163
- project: { type: "string" },
164
- repo: { type: "string" },
165
- "fallback-model": { type: "string" }
166
- }
167
- });
168
- const reasoning = values.reasoning;
169
- if (reasoning && !isReasoningLevel(reasoning)) {
170
- throw new ConfigError(t("--reasoning must be one of: {levels}", { levels: REASONING_LEVELS.join(", ") }));
171
- }
172
- const mode = values["permission-mode"];
173
- if (mode && !MODE_ORDER.includes(mode)) {
174
- throw new ConfigError(t("--permission-mode must be one of: {modes}", { modes: MODE_ORDER.join(", ") }));
175
- }
176
- if (values.lang !== void 0 && !parseLang(values.lang)) throw new ConfigError(t("--lang must be one of: en, id"));
177
- const outputFormat = values["output-format"];
178
- if (outputFormat !== void 0 && !["text", "json", "stream-json"].includes(outputFormat)) {
179
- throw new ConfigError(t("--output-format must be one of: {formats}", { formats: "text, json, stream-json" }));
180
- }
181
- const [first, ...rest] = positionals;
182
- const SUBCOMMANDS = ["login", "models", "update", "acp", "serve", "plugins", "gh-bot", "provider", "mcp", "connect", "disconnect", "integrations", "completion", "stats", "export", "import", "pr"];
183
- const command = SUBCOMMANDS.includes(first) ? first : "run";
184
- const words = command === "run" ? positionals : rest;
185
- const port = values.port !== void 0 ? Number(values.port) : void 0;
186
- if (port !== void 0 && (!Number.isInteger(port) || port < 0 || port > 65535)) {
187
- throw new ConfigError(t("--port must be a number between 0 and 65535"));
188
- }
189
- const days = values.days !== void 0 ? Number(values.days) : void 0;
190
- if (days !== void 0 && (!Number.isInteger(days) || days < 1)) {
191
- throw new ConfigError(t("--days must be a positive integer"));
192
- }
193
- const tools = values.tools !== void 0 ? Number(values.tools) : void 0;
194
- if (tools !== void 0 && (!Number.isInteger(tools) || tools < 1)) {
195
- throw new ConfigError(t("--tools must be a positive integer"));
196
- }
197
- let models;
198
- if (values.models !== void 0) {
199
- models = values.models === "" || values.models === "all" ? "all" : values.models;
200
- if (models !== "all" && (!Number.isInteger(Number(models)) || Number(models) < 1)) {
201
- throw new ConfigError(t('--models must be a positive integer or "all"'));
202
- }
203
- }
204
- if (values.host !== void 0 && !LOOPBACK_BIND.has(values.host)) {
205
- throw new ConfigError(t("serve only accepts loopback --host (127.0.0.1, localhost, ::1)"));
206
- }
207
- return {
208
- command,
209
- prompt: command === "run" && words.length ? words.join(" ") : void 0,
210
- print: !!values.print,
211
- model: values.model,
212
- reasoning,
213
- lang: parseLang(values.lang),
214
- continue: !!values.continue,
215
- resume: !!values.resume,
216
- allowAll: !!values["allow-all"],
217
- failOnToolError: !!values["fail-on-tool-error"],
218
- allowedTools: (values["allowed-tools"] ?? "").split(",").map((s) => s.trim()).filter(Boolean),
219
- worktree: values.worktree,
220
- outputFormat,
221
- permissionMode: mode,
222
- help: !!values.help,
223
- version: !!values.version,
224
- loginProvider: command === "login" ? rest[0] ?? "bc-cloud" : void 0,
225
- key: !!values.key,
226
- logout: !!values.logout,
227
- subArgs: ["models", "plugins", "gh-bot", "provider", "mcp", "connect", "disconnect", "integrations", "completion", "stats", "export", "import", "pr"].includes(command) ? rest : [],
228
- url: values.url,
229
- stdioCommand: values.command,
230
- stdioArgs: values.args,
231
- name: values.name,
232
- keyEnv: values["key-env"],
233
- values: values.value ?? [],
234
- port,
235
- host: values.host,
236
- token: values.token,
237
- baseUrl: values["base-url"],
238
- days,
239
- tools,
240
- models,
241
- project: values.project,
242
- repo: values.repo,
243
- fallbackModel: values["fallback-model"]
244
- };
245
- }
246
-
247
- export {
248
- MAX_FRAME_BYTES,
249
- parseClientFrame,
250
- LOOPBACK_BIND,
251
- trustFence,
252
- bearerOk,
253
- randomToken,
254
- helpText,
255
- parseCliArgs
256
- };
@@ -1,50 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- ConfigError
4
- } from "./chunk-TLCL6DC7.js";
5
- import {
6
- t
7
- } from "./chunk-R754XIBJ.js";
8
-
9
- // src/mcp/catalog.ts
10
- var CATALOG = [
11
- { name: "playwright", description: "control a browser (open pages, click, fill forms, screenshot)", config: { command: "npx", args: ["-y", "@playwright/mcp@latest"] } },
12
- { name: "context7", description: "up-to-date library documentation", config: { type: "http", url: "https://mcp.context7.com/mcp" } },
13
- { name: "fetch", description: "fetch web pages as markdown (needs uv)", config: { command: "uvx", args: ["mcp-server-fetch"] } },
14
- {
15
- name: "filesystem",
16
- description: "access folders outside the project",
17
- // biome-ignore lint/suspicious/noTemplateCurlyInString: ${dir} is filled by fillTemplate, not a template literal
18
- config: { command: "npx", args: ["-y", "@modelcontextprotocol/server-filesystem", "${dir}"] },
19
- inputs: [{ key: "dir", label: "Folder the server may access" }]
20
- },
21
- { name: "git", description: "structured git operations (needs uv)", config: { command: "uvx", args: ["mcp-server-git"] } },
22
- {
23
- name: "github",
24
- description: "GitHub issues, PRs, and repos",
25
- // biome-ignore lint/suspicious/noTemplateCurlyInString: ${token} is filled by fillTemplate, not a template literal
26
- config: { type: "http", url: "https://api.githubcopilot.com/mcp/", headers: { Authorization: "Bearer ${token}" } },
27
- inputs: [{ key: "token", label: "GitHub Personal Access Token", secret: true }]
28
- }
29
- ];
30
- function fillTemplate(config, values) {
31
- const missing = /* @__PURE__ */ new Set();
32
- const fill = (s) => s.replace(/\$\{([A-Za-z0-9_]+)\}/g, (_m, key) => {
33
- if (!values[key]) missing.add(key);
34
- return values[key] ?? "";
35
- });
36
- const mapValues = (o) => Object.fromEntries(Object.entries(o).map(([k, v]) => [k, fill(v)]));
37
- const out = config.type === "http" ? { type: "http", url: fill(config.url), ...config.headers ? { headers: mapValues(config.headers) } : {} } : {
38
- ...config.type ? { type: config.type } : {},
39
- command: fill(config.command),
40
- ...config.args ? { args: config.args.map(fill) } : {},
41
- ...config.env ? { env: mapValues(config.env) } : {}
42
- };
43
- if (missing.size) throw new ConfigError(t("Missing MCP fields: {fields}", { fields: [...missing].join(", ") }));
44
- return out;
45
- }
46
-
47
- export {
48
- CATALOG,
49
- fillTemplate
50
- };