@ccpocket/bridge 1.65.0 → 1.66.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/dist/websocket.js CHANGED
@@ -70,6 +70,17 @@ function fallbackCodexReasoningEfforts(model) {
70
70
  return FALLBACK_GPT_5_6_REASONING_EFFORTS;
71
71
  return FALLBACK_CODEX_REASONING_EFFORTS;
72
72
  }
73
+ function fallbackCodexServiceTiers(model) {
74
+ return [
75
+ "gpt-5.6-sol",
76
+ "gpt-5.6-terra",
77
+ "gpt-5.6-luna",
78
+ "gpt-5.5",
79
+ "gpt-5.4",
80
+ ].includes(model)
81
+ ? ["fast"]
82
+ : [];
83
+ }
73
84
  const CODEX_RECENT_THREAD_SOURCE_KINDS = [
74
85
  "cli",
75
86
  "vscode",
@@ -454,6 +465,10 @@ export class BridgeWebSocketServer {
454
465
  model,
455
466
  fallbackCodexReasoningEfforts(model),
456
467
  ]));
468
+ codexModelServiceTiers = Object.fromEntries(FALLBACK_CODEX_MODELS.map((model) => [
469
+ model,
470
+ fallbackCodexServiceTiers(model),
471
+ ]));
457
472
  /** FCM token → push notification locale */
458
473
  tokenLocales = new Map();
459
474
  tokenPrivacyMode = new Map();
@@ -679,6 +694,9 @@ export class BridgeWebSocketServer {
679
694
  if (derivedCodexSettings.modelReasoningEffort !== undefined) {
680
695
  msg.modelReasoningEffort = derivedCodexSettings.modelReasoningEffort;
681
696
  }
697
+ if (derivedCodexSettings.serviceTier !== undefined) {
698
+ msg.serviceTier = derivedCodexSettings.serviceTier;
699
+ }
682
700
  if (derivedCodexSettings.networkAccessEnabled !== undefined) {
683
701
  msg.networkAccessEnabled = derivedCodexSettings.networkAccessEnabled;
684
702
  }
@@ -1059,6 +1077,27 @@ export class BridgeWebSocketServer {
1059
1077
  return String(value);
1060
1078
  }
1061
1079
  }
1080
+ sendCodexCurrentSettings(ws, sessionId, session) {
1081
+ const process = session.process instanceof CodexProcess
1082
+ ? session.process
1083
+ : undefined;
1084
+ const settings = session.codexSettings;
1085
+ this.send(ws, {
1086
+ type: "system",
1087
+ subtype: "codex_settings",
1088
+ sessionId,
1089
+ provider: "codex",
1090
+ ...(settings?.model ?? process?.model
1091
+ ? { model: settings?.model ?? process?.model }
1092
+ : {}),
1093
+ ...(settings?.modelReasoningEffort ?? process?.modelReasoningEffort
1094
+ ? {
1095
+ modelReasoningEffort: settings?.modelReasoningEffort ?? process?.modelReasoningEffort,
1096
+ }
1097
+ : {}),
1098
+ serviceTier: settings?.serviceTier ?? process?.serviceTier ?? "standard",
1099
+ });
1100
+ }
1062
1101
  async sendCodexCanonicalHistorySnapshot(ws, sessionId, session, options = {}) {
1063
1102
  try {
1064
1103
  const entries = await this.codexCanonicalHistoryEntries(session);
@@ -1073,6 +1112,7 @@ export class BridgeWebSocketServer {
1073
1112
  status: session.status,
1074
1113
  reason: "reset",
1075
1114
  });
1115
+ this.sendCodexCurrentSettings(ws, sessionId, session);
1076
1116
  this.sendCodexQueueState(ws, sessionId, session);
1077
1117
  if (options.includeCachedCommands) {
1078
1118
  this.sendCachedCommands(ws, sessionId, session);
@@ -1097,6 +1137,7 @@ export class BridgeWebSocketServer {
1097
1137
  messages: entries.map((entry) => entry.message),
1098
1138
  sessionId,
1099
1139
  });
1140
+ this.sendCodexCurrentSettings(ws, sessionId, session);
1100
1141
  this.send(ws, {
1101
1142
  type: "status",
1102
1143
  status: session.status,
@@ -1583,6 +1624,7 @@ export class BridgeWebSocketServer {
1583
1624
  model: msg.model,
1584
1625
  modelReasoningEffort: msg.modelReasoningEffort ??
1585
1626
  undefined,
1627
+ serviceTier: msg.serviceTier,
1586
1628
  networkAccessEnabled: msg.networkAccessEnabled,
1587
1629
  webSearchMode: msg.webSearchMode ??
1588
1630
  undefined,
@@ -2258,6 +2300,7 @@ export class BridgeWebSocketServer {
2258
2300
  sandboxMode: newSandboxMode,
2259
2301
  model: oldSettings.model,
2260
2302
  modelReasoningEffort: oldSettings.modelReasoningEffort,
2303
+ serviceTier: oldSettings.serviceTier,
2261
2304
  networkAccessEnabled: oldSettings.networkAccessEnabled,
2262
2305
  webSearchMode: oldSettings.webSearchMode,
2263
2306
  collaborationMode: newCollaboration,
@@ -2318,6 +2361,7 @@ export class BridgeWebSocketServer {
2318
2361
  sandboxMode: newSandboxMode,
2319
2362
  model: oldSettings.model,
2320
2363
  modelReasoningEffort: oldSettings.modelReasoningEffort,
2364
+ serviceTier: oldSettings.serviceTier,
2321
2365
  networkAccessEnabled: oldSettings.networkAccessEnabled,
2322
2366
  webSearchMode: oldSettings.webSearchMode,
2323
2367
  collaborationMode: newCollaboration,
@@ -2439,6 +2483,37 @@ export class BridgeWebSocketServer {
2439
2483
  console.log(`[ws] set_codex_model(codex): model=${model} effort=${modelReasoningEffort ?? ""}`);
2440
2484
  break;
2441
2485
  }
2486
+ case "set_codex_speed": {
2487
+ const session = this.resolveSession(msg.sessionId);
2488
+ if (!session || session.provider !== "codex") {
2489
+ this.send(ws, {
2490
+ type: "error",
2491
+ message: "No active Codex session.",
2492
+ errorCode: "set_codex_speed_unsupported",
2493
+ });
2494
+ return;
2495
+ }
2496
+ const serviceTier = msg.serviceTier === "fast" ? "fast" : "standard";
2497
+ if (session.codexSettings?.serviceTier === serviceTier)
2498
+ break;
2499
+ const process = session.process;
2500
+ process.setServiceTier(serviceTier);
2501
+ session.codexSettings = {
2502
+ ...(session.codexSettings ?? {}),
2503
+ serviceTier,
2504
+ };
2505
+ session.lastActivityAt = new Date();
2506
+ this.broadcastSessionMessage(session.id, {
2507
+ type: "system",
2508
+ subtype: "set_codex_speed",
2509
+ sessionId: session.id,
2510
+ provider: "codex",
2511
+ serviceTier,
2512
+ });
2513
+ this.broadcastSessionList();
2514
+ console.log(`[ws] set_codex_speed(codex): serviceTier=${serviceTier}`);
2515
+ break;
2516
+ }
2442
2517
  case "get_goal": {
2443
2518
  const session = this.resolveSession(msg.sessionId);
2444
2519
  if (!session || session.provider !== "codex") {
@@ -2634,6 +2709,7 @@ export class BridgeWebSocketServer {
2634
2709
  sandboxMode: newSandboxMode,
2635
2710
  model: oldSettings.model,
2636
2711
  modelReasoningEffort: oldSettings.modelReasoningEffort,
2712
+ serviceTier: oldSettings.serviceTier,
2637
2713
  networkAccessEnabled: oldSettings.networkAccessEnabled,
2638
2714
  webSearchMode: oldSettings.webSearchMode,
2639
2715
  collaborationMode,
@@ -2685,6 +2761,7 @@ export class BridgeWebSocketServer {
2685
2761
  sandboxMode: newSandboxMode,
2686
2762
  model: oldSettings.model,
2687
2763
  modelReasoningEffort: oldSettings.modelReasoningEffort,
2764
+ serviceTier: oldSettings.serviceTier,
2688
2765
  networkAccessEnabled: oldSettings.networkAccessEnabled,
2689
2766
  webSearchMode: oldSettings.webSearchMode,
2690
2767
  collaborationMode,
@@ -2880,6 +2957,9 @@ export class BridgeWebSocketServer {
2880
2957
  messages: [...splitPastHistory.historyMessages, ...session.history],
2881
2958
  sessionId: msg.sessionId,
2882
2959
  });
2960
+ if (session.provider === "codex") {
2961
+ this.sendCodexCurrentSettings(ws, msg.sessionId, session);
2962
+ }
2883
2963
  this.send(ws, {
2884
2964
  type: "status",
2885
2965
  status: session.status,
@@ -2922,6 +3002,7 @@ export class BridgeWebSocketServer {
2922
3002
  status: session.status,
2923
3003
  ...(result.kind === "snapshot" ? { reason: result.reason } : {}),
2924
3004
  });
3005
+ this.sendCodexCurrentSettings(ws, msg.sessionId, session);
2925
3006
  this.sendCodexQueueState(ws, msg.sessionId, session);
2926
3007
  break;
2927
3008
  }
@@ -3216,6 +3297,7 @@ export class BridgeWebSocketServer {
3216
3297
  model: msg.model,
3217
3298
  modelReasoningEffort: msg.modelReasoningEffort ??
3218
3299
  undefined,
3300
+ serviceTier: msg.serviceTier,
3219
3301
  networkAccessEnabled: msg.networkAccessEnabled,
3220
3302
  webSearchMode: msg.webSearchMode ??
3221
3303
  undefined,
@@ -4786,6 +4868,7 @@ export class BridgeWebSocketServer {
4786
4868
  claudeModelEfforts: this.claudeModelEfforts,
4787
4869
  codexModels: this.codexModels,
4788
4870
  codexModelReasoningEfforts: this.codexModelReasoningEfforts,
4871
+ codexModelServiceTiers: this.codexModelServiceTiers,
4789
4872
  codexProfiles: this.codexProfiles,
4790
4873
  defaultCodexProfile: this.defaultCodexProfile,
4791
4874
  bridgeVersion: getPackageVersion(),
@@ -4816,6 +4899,7 @@ export class BridgeWebSocketServer {
4816
4899
  claudeModelEfforts: this.claudeModelEfforts,
4817
4900
  codexModels: this.codexModels,
4818
4901
  codexModelReasoningEfforts: this.codexModelReasoningEfforts,
4902
+ codexModelServiceTiers: this.codexModelServiceTiers,
4819
4903
  codexProfiles: this.codexProfiles,
4820
4904
  defaultCodexProfile: this.defaultCodexProfile,
4821
4905
  bridgeVersion: getPackageVersion(),
@@ -5156,6 +5240,7 @@ export class BridgeWebSocketServer {
5156
5240
  return models.map((model) => ({
5157
5241
  model,
5158
5242
  supportedReasoningEfforts: fallbackCodexReasoningEfforts(model),
5243
+ supportedServiceTiers: fallbackCodexServiceTiers(model),
5159
5244
  }));
5160
5245
  }
5161
5246
  applyCodexModels(models) {
@@ -5166,6 +5251,12 @@ export class BridgeWebSocketServer {
5166
5251
  ? model.supportedReasoningEfforts
5167
5252
  : fallbackCodexReasoningEfforts(model.model),
5168
5253
  ]));
5254
+ this.codexModelServiceTiers = Object.fromEntries(models.map((model) => [
5255
+ model.model,
5256
+ (model.supportedServiceTiers?.length ?? 0) > 0
5257
+ ? model.supportedServiceTiers
5258
+ : fallbackCodexServiceTiers(model.model),
5259
+ ]));
5169
5260
  }
5170
5261
  applyFallbackCodexModels() {
5171
5262
  this.codexModels = FALLBACK_CODEX_MODELS;
@@ -5173,6 +5264,10 @@ export class BridgeWebSocketServer {
5173
5264
  model,
5174
5265
  fallbackCodexReasoningEfforts(model),
5175
5266
  ]));
5267
+ this.codexModelServiceTiers = Object.fromEntries(FALLBACK_CODEX_MODELS.map((model) => [
5268
+ model,
5269
+ fallbackCodexServiceTiers(model),
5270
+ ]));
5176
5271
  }
5177
5272
  async loadCodexProfiles(projectPath) {
5178
5273
  const process = this.getActiveCodexProcess() ??
@@ -6049,6 +6144,9 @@ export class BridgeWebSocketServer {
6049
6144
  if (session.codexSettings.modelReasoningEffort !== undefined) {
6050
6145
  msg.modelReasoningEffort = session.codexSettings.modelReasoningEffort;
6051
6146
  }
6147
+ if (session.codexSettings.serviceTier !== undefined) {
6148
+ msg.serviceTier = session.codexSettings.serviceTier;
6149
+ }
6052
6150
  if (session.codexSettings.networkAccessEnabled !== undefined) {
6053
6151
  msg.networkAccessEnabled = session.codexSettings.networkAccessEnabled;
6054
6152
  }