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.
@@ -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":"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"}
1
+ {"version":3,"file":"workspace-cmd.js","sourceRoot":"","sources":["../../../src/adapter/workspace-cmd.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,7 @@
5
5
  * - Session: OpenCode conversation (from SQLite)
6
6
  * - Directory: working directory (cwd)
7
7
  */
8
- import type { WeChatOpencodeConfig } from "./config.js";
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,
@@ -1 +1 @@
1
- {"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../src/bridge.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAwBH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAYxD,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;YAoDP,sBAAsB;YAmHtB,oBAAoB;IA8GlC;;;;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"}
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"}
@@ -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, "🔄 Session restarted. Context cleared.");
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 处理。`;