wechat-bridge-opencode 0.1.8 → 0.1.9
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/README.md +25 -0
- package/dist/package.json +1 -1
- package/dist/src/acp/agent-manager.d.ts +10 -0
- package/dist/src/acp/agent-manager.d.ts.map +1 -1
- package/dist/src/acp/agent-manager.js +55 -9
- package/dist/src/acp/agent-manager.js.map +1 -1
- package/dist/src/acp/session.d.ts +70 -0
- package/dist/src/acp/session.d.ts.map +1 -1
- package/dist/src/acp/session.js +171 -2
- package/dist/src/acp/session.js.map +1 -1
- package/dist/src/adapter/workspace-cmd.d.ts +16 -0
- package/dist/src/adapter/workspace-cmd.d.ts.map +1 -1
- package/dist/src/adapter/workspace-cmd.js +108 -0
- package/dist/src/adapter/workspace-cmd.js.map +1 -1
- package/dist/src/bridge.d.ts +4 -1
- package/dist/src/bridge.d.ts.map +1 -1
- package/dist/src/bridge.js +275 -4
- package/dist/src/bridge.js.map +1 -1
- package/package.json +1 -1
|
@@ -111,6 +111,86 @@ export function parseSessionCommand(text) {
|
|
|
111
111
|
return null;
|
|
112
112
|
}
|
|
113
113
|
}
|
|
114
|
+
export function parseAgentCommand(text) {
|
|
115
|
+
const trimmed = text.trim();
|
|
116
|
+
const match = trimmed.match(/^\/agent\s+(.+)$/i);
|
|
117
|
+
if (!match)
|
|
118
|
+
return null;
|
|
119
|
+
const args = match[1].trim().split(/\s+/);
|
|
120
|
+
const subcommand = args[0]?.toLowerCase();
|
|
121
|
+
switch (subcommand) {
|
|
122
|
+
case "list":
|
|
123
|
+
case "ls":
|
|
124
|
+
return { kind: "list" };
|
|
125
|
+
case "switch":
|
|
126
|
+
case "sw":
|
|
127
|
+
case "use": {
|
|
128
|
+
const target = args.slice(1).join(" ");
|
|
129
|
+
if (!target)
|
|
130
|
+
return null;
|
|
131
|
+
return { kind: "switch", name: target };
|
|
132
|
+
}
|
|
133
|
+
case "status":
|
|
134
|
+
case "current":
|
|
135
|
+
return { kind: "status" };
|
|
136
|
+
default:
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
export function parseModelCommand(text) {
|
|
141
|
+
const trimmed = text.trim();
|
|
142
|
+
const match = trimmed.match(/^\/model\s+(.+)$/i);
|
|
143
|
+
if (!match)
|
|
144
|
+
return null;
|
|
145
|
+
const args = match[1].trim().split(/\s+/);
|
|
146
|
+
const subcommand = args[0]?.toLowerCase();
|
|
147
|
+
switch (subcommand) {
|
|
148
|
+
case "list":
|
|
149
|
+
case "ls": {
|
|
150
|
+
const provider = args.slice(1).join(" ").trim() || undefined;
|
|
151
|
+
return { kind: "list", provider };
|
|
152
|
+
}
|
|
153
|
+
case "switch":
|
|
154
|
+
case "sw":
|
|
155
|
+
case "use": {
|
|
156
|
+
const target = args.slice(1).join(" ");
|
|
157
|
+
if (!target)
|
|
158
|
+
return null;
|
|
159
|
+
return { kind: "switch", name: target };
|
|
160
|
+
}
|
|
161
|
+
case "status":
|
|
162
|
+
case "current":
|
|
163
|
+
return { kind: "status" };
|
|
164
|
+
default:
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
export function parseReasoningCommand(text) {
|
|
169
|
+
const trimmed = text.trim();
|
|
170
|
+
const match = trimmed.match(/^\/reasoning\s+(.+)$/i);
|
|
171
|
+
if (!match)
|
|
172
|
+
return null;
|
|
173
|
+
const args = match[1].trim().split(/\s+/);
|
|
174
|
+
const subcommand = args[0]?.toLowerCase();
|
|
175
|
+
switch (subcommand) {
|
|
176
|
+
case "list":
|
|
177
|
+
case "ls":
|
|
178
|
+
return { kind: "list" };
|
|
179
|
+
case "switch":
|
|
180
|
+
case "sw":
|
|
181
|
+
case "use": {
|
|
182
|
+
const target = args.slice(1).join(" ");
|
|
183
|
+
if (!target)
|
|
184
|
+
return null;
|
|
185
|
+
return { kind: "switch", name: target };
|
|
186
|
+
}
|
|
187
|
+
case "status":
|
|
188
|
+
case "current":
|
|
189
|
+
return { kind: "status" };
|
|
190
|
+
default:
|
|
191
|
+
return null;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
114
194
|
export function formatWorkspaceList(workspaces, activeId) {
|
|
115
195
|
if (workspaces.length === 0)
|
|
116
196
|
return "No workspaces configured.";
|
|
@@ -183,6 +263,20 @@ export function formatHelp() {
|
|
|
183
263
|
" /session status Show current session",
|
|
184
264
|
" (shorthand: /s ...)",
|
|
185
265
|
"",
|
|
266
|
+
"── Agent / Model / Reasoning ──",
|
|
267
|
+
" /agent list List available agents (build, plan, etc.)",
|
|
268
|
+
" /agent switch <id> Switch agent mode",
|
|
269
|
+
" /agent status Show current agent",
|
|
270
|
+
" (shorthand: /a ...)",
|
|
271
|
+
"",
|
|
272
|
+
" /model list List available models",
|
|
273
|
+
" /model switch <provider/model> Switch model",
|
|
274
|
+
" /model status Show current model",
|
|
275
|
+
"",
|
|
276
|
+
" /reasoning list List reasoning levels",
|
|
277
|
+
" /reasoning switch <level> Switch reasoning level",
|
|
278
|
+
" /reasoning status Show current reasoning level",
|
|
279
|
+
"",
|
|
186
280
|
"── Help ──",
|
|
187
281
|
" /help Show this help message",
|
|
188
282
|
].join("\n");
|
|
@@ -209,6 +303,20 @@ export function formatHelpWithNativeCommands(nativeCommands) {
|
|
|
209
303
|
" /session status Show current session",
|
|
210
304
|
" (shorthand: /s ...)",
|
|
211
305
|
"",
|
|
306
|
+
"── Agent / Model / Reasoning ──",
|
|
307
|
+
" /agent list List available agents (build, plan, etc.)",
|
|
308
|
+
" /agent switch <id> Switch agent mode",
|
|
309
|
+
" /agent status Show current agent",
|
|
310
|
+
" (shorthand: /a ...)",
|
|
311
|
+
"",
|
|
312
|
+
" /model list List available models",
|
|
313
|
+
" /model switch <provider/model> Switch model",
|
|
314
|
+
" /model status Show current model",
|
|
315
|
+
"",
|
|
316
|
+
" /reasoning list List reasoning levels",
|
|
317
|
+
" /reasoning switch <level> Switch reasoning level",
|
|
318
|
+
" /reasoning status Show current reasoning level",
|
|
319
|
+
"",
|
|
212
320
|
" /help Show this help message",
|
|
213
321
|
];
|
|
214
322
|
if (nativeCommands.length > 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-cmd.js","sourceRoot":"","sources":["../../../src/adapter/workspace-cmd.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;
|
|
1
|
+
{"version":3,"file":"workspace-cmd.js","sourceRoot":"","sources":["../../../src/adapter/workspace-cmd.ts"],"names":[],"mappings":"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"}
|
package/dist/src/bridge.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* - Session: OpenCode conversation (from SQLite)
|
|
6
6
|
* - Directory: working directory (cwd)
|
|
7
7
|
*/
|
|
8
|
-
import type
|
|
8
|
+
import { type WeChatOpencodeConfig } from "./config.js";
|
|
9
9
|
export declare class WeChatOpencodeBridge {
|
|
10
10
|
private config;
|
|
11
11
|
private abortController;
|
|
@@ -30,6 +30,9 @@ export declare class WeChatOpencodeBridge {
|
|
|
30
30
|
private handleMessage;
|
|
31
31
|
private handleDirectoryCommand;
|
|
32
32
|
private handleSessionCommand;
|
|
33
|
+
private handleAgentCommand;
|
|
34
|
+
private handleModelCommand;
|
|
35
|
+
private handleReasoningCommand;
|
|
33
36
|
/**
|
|
34
37
|
* Detect if text is an unrecognized slash command.
|
|
35
38
|
* Returns a hint message if it's a slash command not handled by bridge,
|
package/dist/src/bridge.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../src/bridge.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../src/bridge.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA4BH,OAAO,EAAqB,KAAK,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAa3E,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,eAAe,CAAyB;IAChD,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,UAAU,CAAgC;IAClD,OAAO,CAAC,aAAa,CAA4D;IACjF,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,GAAG,CAAwB;gBAEvB,MAAM,EAAE,oBAAoB,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI;IAK/D,KAAK,CAAC,IAAI,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAC;QAAC,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAuE1F,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAa3B,OAAO,CAAC,cAAc;IAmBtB,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,kBAAkB;IAgF1B,OAAO,CAAC,aAAa;IAerB,OAAO,CAAC,aAAa;YA4EP,sBAAsB;YAmHtB,oBAAoB;YA8GpB,kBAAkB;YAuFlB,kBAAkB;YAqHlB,sBAAsB;IAgEpC;;;;OAIG;IACH,OAAO,CAAC,yBAAyB;IAiBjC;;OAEG;YACW,aAAa;IAM3B,OAAO,CAAC,sBAAsB;YAQhB,cAAc;YAMd,SAAS;YAaT,cAAc;YAoCd,qBAAqB;YAUrB,mBAAmB;YAcnB,eAAe;IAoB7B,OAAO,CAAC,cAAc;CAcvB"}
|
package/dist/src/bridge.js
CHANGED
|
@@ -18,7 +18,7 @@ import { SessionManager } from "./acp/session.js";
|
|
|
18
18
|
import { listSessions } from "./acp/opencode-sessions.js";
|
|
19
19
|
import { weixinMessageToPrompt } from "./adapter/inbound.js";
|
|
20
20
|
import { formatForWeChat } from "./adapter/outbound.js";
|
|
21
|
-
import { parseWorkspaceCommand, parseSessionCommand, parseHelpCommand, formatHelpWithNativeCommands, } from "./adapter/workspace-cmd.js";
|
|
21
|
+
import { parseWorkspaceCommand, parseSessionCommand, parseAgentCommand, parseModelCommand, parseReasoningCommand, parseHelpCommand, formatHelpWithNativeCommands, } from "./adapter/workspace-cmd.js";
|
|
22
22
|
const TEXT_CHUNK_LIMIT = 4000;
|
|
23
23
|
const TOOL_API_PORT = 18792;
|
|
24
24
|
const TOOL_API_HOST = "127.0.0.1";
|
|
@@ -263,6 +263,27 @@ export class WeChatOpencodeBridge {
|
|
|
263
263
|
});
|
|
264
264
|
return;
|
|
265
265
|
}
|
|
266
|
+
const aCmd = parseAgentCommand(textContent);
|
|
267
|
+
if (aCmd) {
|
|
268
|
+
this.handleAgentCommand(userId, contextToken, aCmd).catch((err) => {
|
|
269
|
+
this.log(`Agent command error: ${String(err)}`);
|
|
270
|
+
});
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
const mCmd = parseModelCommand(textContent);
|
|
274
|
+
if (mCmd) {
|
|
275
|
+
this.handleModelCommand(userId, contextToken, mCmd).catch((err) => {
|
|
276
|
+
this.log(`Model command error: ${String(err)}`);
|
|
277
|
+
});
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
const rCmd = parseReasoningCommand(textContent);
|
|
281
|
+
if (rCmd) {
|
|
282
|
+
this.handleReasoningCommand(userId, contextToken, rCmd).catch((err) => {
|
|
283
|
+
this.log(`Reasoning command error: ${String(err)}`);
|
|
284
|
+
});
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
266
287
|
// Check for unrecognized slash commands — send hint immediately, then forward to agent
|
|
267
288
|
const slashHint = this.detectUnknownSlashCommand(textContent);
|
|
268
289
|
if (slashHint) {
|
|
@@ -472,7 +493,7 @@ export class WeChatOpencodeBridge {
|
|
|
472
493
|
case "new": {
|
|
473
494
|
const cwd = this.userStates.get(userId)?.cwd ?? this.config.agent.cwd;
|
|
474
495
|
await this.sessionManager.createNewSession(userId, contextToken, cwd);
|
|
475
|
-
await this.sendReply(userId, contextToken, "
|
|
496
|
+
await this.sendReply(userId, contextToken, "✅ Session restarted. Context cleared.");
|
|
476
497
|
break;
|
|
477
498
|
}
|
|
478
499
|
case "remove": {
|
|
@@ -481,6 +502,256 @@ export class WeChatOpencodeBridge {
|
|
|
481
502
|
}
|
|
482
503
|
}
|
|
483
504
|
}
|
|
505
|
+
// ─── Agent commands (/agent or /a) ───
|
|
506
|
+
async handleAgentCommand(userId, contextToken, cmd) {
|
|
507
|
+
if (!this.sessionManager)
|
|
508
|
+
return;
|
|
509
|
+
switch (cmd.kind) {
|
|
510
|
+
case "list": {
|
|
511
|
+
const currentMode = this.sessionManager.getActiveMode(userId);
|
|
512
|
+
const availableModes = this.sessionManager.getAvailableModes(userId);
|
|
513
|
+
const lines = ["🤖 Agent (mode):"];
|
|
514
|
+
if (availableModes && availableModes.length > 0) {
|
|
515
|
+
for (let i = 0; i < availableModes.length; i++) {
|
|
516
|
+
const m = availableModes[i];
|
|
517
|
+
const marker = m.id === currentMode ? " ✅" : "";
|
|
518
|
+
lines.push(` ${i + 1}. ${m.name}${marker}`);
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
else {
|
|
522
|
+
lines.push(" (OpenCode 未返回可用模式)");
|
|
523
|
+
}
|
|
524
|
+
lines.push("");
|
|
525
|
+
lines.push(`💡 使用 /agent switch <name|序号> 切换`);
|
|
526
|
+
await this.sendReply(userId, contextToken, lines.join("\n"));
|
|
527
|
+
break;
|
|
528
|
+
}
|
|
529
|
+
case "switch": {
|
|
530
|
+
const availableModes = this.sessionManager.getAvailableModes(userId);
|
|
531
|
+
const input = cmd.name.trim();
|
|
532
|
+
// Try numeric index first
|
|
533
|
+
const index = parseInt(input, 10);
|
|
534
|
+
if (!isNaN(index) && index >= 1 && index <= (availableModes?.length ?? 0)) {
|
|
535
|
+
const m = availableModes[index - 1];
|
|
536
|
+
const current = this.sessionManager.getActiveMode(userId);
|
|
537
|
+
if (current === m.id) {
|
|
538
|
+
await this.sendReply(userId, contextToken, `已在 ${m.name} mode,无需切换`);
|
|
539
|
+
return;
|
|
540
|
+
}
|
|
541
|
+
try {
|
|
542
|
+
await this.sessionManager.switchAgent(userId, m.id);
|
|
543
|
+
await this.sendReply(userId, contextToken, `✅ Agent 已切换至 ${m.name}`);
|
|
544
|
+
}
|
|
545
|
+
catch (err) {
|
|
546
|
+
await this.sendReply(userId, contextToken, `⚠️ 切换失败: ${String(err)}`);
|
|
547
|
+
}
|
|
548
|
+
return;
|
|
549
|
+
}
|
|
550
|
+
// Try matching by name (exact, case-insensitive)
|
|
551
|
+
const matchingMode = availableModes?.find((m) => m.name.toLowerCase() === input.toLowerCase() || m.id.toLowerCase() === input.toLowerCase());
|
|
552
|
+
if (!matchingMode) {
|
|
553
|
+
const count = availableModes?.length ?? 0;
|
|
554
|
+
await this.sendReply(userId, contextToken, `⚠️ 未找到 "${input}",可用模式数: ${count}`);
|
|
555
|
+
return;
|
|
556
|
+
}
|
|
557
|
+
const current = this.sessionManager.getActiveMode(userId);
|
|
558
|
+
if (current === matchingMode.id) {
|
|
559
|
+
await this.sendReply(userId, contextToken, `已在 ${matchingMode.name} mode,无需切换`);
|
|
560
|
+
return;
|
|
561
|
+
}
|
|
562
|
+
try {
|
|
563
|
+
await this.sessionManager.switchAgent(userId, matchingMode.id);
|
|
564
|
+
await this.sendReply(userId, contextToken, `✅ Agent 已切换至 ${matchingMode.name}`);
|
|
565
|
+
}
|
|
566
|
+
catch (err) {
|
|
567
|
+
await this.sendReply(userId, contextToken, `⚠️ 切换失败: ${String(err)}`);
|
|
568
|
+
}
|
|
569
|
+
break;
|
|
570
|
+
}
|
|
571
|
+
case "status": {
|
|
572
|
+
const mode = this.sessionManager.getActiveMode(userId);
|
|
573
|
+
if (mode) {
|
|
574
|
+
const matching = this.sessionManager.getAvailableModes(userId)?.find((m) => m.id === mode);
|
|
575
|
+
await this.sendReply(userId, contextToken, `🤖 当前 Agent: ${matching?.name ?? mode}`);
|
|
576
|
+
}
|
|
577
|
+
else {
|
|
578
|
+
await this.sendReply(userId, contextToken, `🤖 Agent: (未设置)`);
|
|
579
|
+
}
|
|
580
|
+
break;
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
// ─── Model commands (/model) ───
|
|
585
|
+
async handleModelCommand(userId, contextToken, cmd) {
|
|
586
|
+
if (!this.sessionManager)
|
|
587
|
+
return;
|
|
588
|
+
switch (cmd.kind) {
|
|
589
|
+
case "list": {
|
|
590
|
+
const availableModels = this.sessionManager.getAvailableModels(userId);
|
|
591
|
+
const currentModelId = this.sessionManager.getCurrentModel(userId);
|
|
592
|
+
const lines = ["📱 Models:"];
|
|
593
|
+
if (!availableModels || availableModels.length === 0) {
|
|
594
|
+
lines.push(" (OpenCode 未返回可用模型)");
|
|
595
|
+
}
|
|
596
|
+
else {
|
|
597
|
+
// Extract provider from modelId (before first '/')
|
|
598
|
+
const providers = new Map();
|
|
599
|
+
for (const m of availableModels) {
|
|
600
|
+
const provider = m.modelId.split("/")[0];
|
|
601
|
+
if (!providers.has(provider))
|
|
602
|
+
providers.set(provider, []);
|
|
603
|
+
providers.get(provider).push(m);
|
|
604
|
+
}
|
|
605
|
+
const providerArg = cmd.provider;
|
|
606
|
+
if (providerArg) {
|
|
607
|
+
// /model list <provider> — show models for specific provider
|
|
608
|
+
const models = providers.get(providerArg);
|
|
609
|
+
if (!models || models.length === 0) {
|
|
610
|
+
const allProviders = Array.from(providers.keys()).join(", ");
|
|
611
|
+
lines.push(` ⚠️ 未找到 provider "${providerArg}"`);
|
|
612
|
+
lines.push(` 可用 providers: ${allProviders}`);
|
|
613
|
+
}
|
|
614
|
+
else {
|
|
615
|
+
// Cache and show with index
|
|
616
|
+
this.sessionManager.cacheModelListForProvider(userId, providerArg, models);
|
|
617
|
+
lines.push(` [${providerArg}]`);
|
|
618
|
+
for (let i = 0; i < models.length; i++) {
|
|
619
|
+
const m = models[i];
|
|
620
|
+
const marker = m.modelId === currentModelId ? " ✅" : "";
|
|
621
|
+
lines.push(` ${i + 1}. ${m.modelId}${marker}`);
|
|
622
|
+
}
|
|
623
|
+
lines.push("");
|
|
624
|
+
lines.push(`💡 使用 /model switch <序号|模型名> 切换`);
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
else {
|
|
628
|
+
// /model list — show providers and model counts
|
|
629
|
+
for (const [provider, models] of providers) {
|
|
630
|
+
const marker = currentModelId?.startsWith(`${provider}/`) ? " ✅" : "";
|
|
631
|
+
lines.push(` ${provider} (${models.length})${marker}`);
|
|
632
|
+
}
|
|
633
|
+
lines.push("");
|
|
634
|
+
lines.push(`💡 使用 /model list <provider> 查看模型列表`);
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
await this.sendReply(userId, contextToken, lines.join("\n"));
|
|
638
|
+
break;
|
|
639
|
+
}
|
|
640
|
+
case "switch": {
|
|
641
|
+
const input = cmd.name.trim();
|
|
642
|
+
const index = parseInt(input, 10);
|
|
643
|
+
// If input is a number, use ONLY the last queried provider's cached models
|
|
644
|
+
if (!isNaN(index)) {
|
|
645
|
+
const cached = this.sessionManager.getCachedModelsForLastQueried(userId);
|
|
646
|
+
if (!cached || cached.length === 0) {
|
|
647
|
+
await this.sendReply(userId, contextToken, `⚠️ 索引 ${index} 无效,请先 /model list <provider> 查看`);
|
|
648
|
+
return;
|
|
649
|
+
}
|
|
650
|
+
if (index >= 1 && index <= cached.length) {
|
|
651
|
+
const m = cached[index - 1];
|
|
652
|
+
try {
|
|
653
|
+
await this.sessionManager.setModel(userId, m.modelId);
|
|
654
|
+
}
|
|
655
|
+
catch (err) {
|
|
656
|
+
await this.sendReply(userId, contextToken, `⚠️ 切换失败: ${String(err)}`);
|
|
657
|
+
return;
|
|
658
|
+
}
|
|
659
|
+
await this.sendReply(userId, contextToken, `✅ Model 已切换至 ${m.name} (${m.modelId})`);
|
|
660
|
+
}
|
|
661
|
+
else {
|
|
662
|
+
await this.sendReply(userId, contextToken, `⚠️ 索引 ${index} 无效,有效范围: 1-${cached.length}`);
|
|
663
|
+
}
|
|
664
|
+
return;
|
|
665
|
+
}
|
|
666
|
+
// Otherwise, treat as full model name
|
|
667
|
+
switch (input) {
|
|
668
|
+
default:
|
|
669
|
+
if (!input.includes("/")) {
|
|
670
|
+
await this.sendReply(userId, contextToken, `⚠️ 需要提供完整模型名 (provider/model),如: anthropic/claude-sonnet-4-5`);
|
|
671
|
+
return;
|
|
672
|
+
}
|
|
673
|
+
try {
|
|
674
|
+
await this.sessionManager.setModel(userId, input);
|
|
675
|
+
}
|
|
676
|
+
catch (err) {
|
|
677
|
+
await this.sendReply(userId, contextToken, `⚠️ 切换失败: ${String(err)}`);
|
|
678
|
+
return;
|
|
679
|
+
}
|
|
680
|
+
await this.sendReply(userId, contextToken, `✅ Model 已切换至 ${input}`);
|
|
681
|
+
break;
|
|
682
|
+
}
|
|
683
|
+
break;
|
|
684
|
+
}
|
|
685
|
+
case "status": {
|
|
686
|
+
const model = this.sessionManager.getCurrentModel(userId);
|
|
687
|
+
if (model) {
|
|
688
|
+
await this.sendReply(userId, contextToken, `📱 当前 Model: ${model}`);
|
|
689
|
+
}
|
|
690
|
+
else {
|
|
691
|
+
await this.sendReply(userId, contextToken, `📱 Model: (未设置)`);
|
|
692
|
+
}
|
|
693
|
+
break;
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
}
|
|
697
|
+
// ─── Reasoning commands (/reasoning) ───
|
|
698
|
+
async handleReasoningCommand(userId, contextToken, cmd) {
|
|
699
|
+
if (!this.sessionManager)
|
|
700
|
+
return;
|
|
701
|
+
switch (cmd.kind) {
|
|
702
|
+
case "list": {
|
|
703
|
+
const configOptions = this.sessionManager.getConfigOptions(userId);
|
|
704
|
+
const thoughtLevelOpt = configOptions?.find((o) => o.category === "thought_level");
|
|
705
|
+
const lines = ["🧠 推理级别 (thought_level):"];
|
|
706
|
+
if (thoughtLevelOpt?.type === "select") {
|
|
707
|
+
const current = thoughtLevelOpt.currentValue;
|
|
708
|
+
for (const opt of thoughtLevelOpt.options) {
|
|
709
|
+
if ("value" in opt) {
|
|
710
|
+
const marker = opt.value === current ? " ✅" : "";
|
|
711
|
+
const desc = opt.description ? ` — ${opt.description}` : "";
|
|
712
|
+
lines.push(` ${opt.value}${marker} — ${opt.name}${desc}`);
|
|
713
|
+
}
|
|
714
|
+
else {
|
|
715
|
+
lines.push(` ── ${opt.name} ──`);
|
|
716
|
+
for (const o of opt.options) {
|
|
717
|
+
const marker = o.value === current ? " ✅" : "";
|
|
718
|
+
const desc = o.description ? ` — ${o.description}` : "";
|
|
719
|
+
lines.push(` ${o.value}${marker} — ${o.name}${desc}`);
|
|
720
|
+
}
|
|
721
|
+
}
|
|
722
|
+
}
|
|
723
|
+
}
|
|
724
|
+
else {
|
|
725
|
+
lines.push(" (OpenCode 未返回推理级别配置)");
|
|
726
|
+
}
|
|
727
|
+
lines.push("");
|
|
728
|
+
lines.push(`💡 使用 /reasoning switch <level> 切换`);
|
|
729
|
+
await this.sendReply(userId, contextToken, lines.join("\n"));
|
|
730
|
+
break;
|
|
731
|
+
}
|
|
732
|
+
case "switch": {
|
|
733
|
+
const level = cmd.name.toLowerCase();
|
|
734
|
+
try {
|
|
735
|
+
await this.sessionManager.setReasoning(userId, level);
|
|
736
|
+
await this.sendReply(userId, contextToken, `✅ 推理级别已切换至 ${level}`);
|
|
737
|
+
}
|
|
738
|
+
catch (err) {
|
|
739
|
+
await this.sendReply(userId, contextToken, `⚠️ 切换失败: ${String(err)}`);
|
|
740
|
+
}
|
|
741
|
+
break;
|
|
742
|
+
}
|
|
743
|
+
case "status": {
|
|
744
|
+
const reasoning = this.sessionManager.getCurrentReasoning(userId);
|
|
745
|
+
if (reasoning) {
|
|
746
|
+
await this.sendReply(userId, contextToken, `🧠 当前推理级别: ${reasoning}`);
|
|
747
|
+
}
|
|
748
|
+
else {
|
|
749
|
+
await this.sendReply(userId, contextToken, `🧠 推理级别: (未设置)`);
|
|
750
|
+
}
|
|
751
|
+
break;
|
|
752
|
+
}
|
|
753
|
+
}
|
|
754
|
+
}
|
|
484
755
|
// ─── Helpers ───
|
|
485
756
|
/**
|
|
486
757
|
* Detect if text is an unrecognized slash command.
|
|
@@ -496,8 +767,8 @@ export class WeChatOpencodeBridge {
|
|
|
496
767
|
if (!match)
|
|
497
768
|
return null;
|
|
498
769
|
const cmdName = match[1].toLowerCase();
|
|
499
|
-
// Bridge-known commands: workspace, ws, session, s, help, h, ?
|
|
500
|
-
const bridgeCommands = ["workspace", "ws", "session", "s", "help", "h", "?"];
|
|
770
|
+
// Bridge-known commands: workspace, ws, session, s, agent, a, model, reasoning, help, h, ?
|
|
771
|
+
const bridgeCommands = ["workspace", "ws", "session", "s", "agent", "a", "model", "reasoning", "help", "h", "?"];
|
|
501
772
|
if (bridgeCommands.includes(cmdName))
|
|
502
773
|
return null;
|
|
503
774
|
return `⚠️ 指令 "/${match[1]}" 不是 Bridge 内置指令,已转交 Agent 处理。`;
|