minecodex 1.0.3 → 1.0.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "minecodex",
3
- "version": "1.0.3",
3
+ "version": "1.0.4",
4
4
  "description": "Lightweight, local-first plugins for the Codex desktop app.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -303,6 +303,7 @@ export function createInjectionSource(features, {
303
303
  const modelSelectorOriginalItems = new Map();
304
304
  const modelSelectorOriginalToggleLabels = new Map();
305
305
  const modelSelectorGenericContainers = new Map();
306
+ const modelSelectorNativeToggleHandlers = new Map();
306
307
  const modelSelectorPositionObservers = new Map();
307
308
  const modelSelectorMenuSizeFrames = new Map();
308
309
  let modelSelectorReturnTimer = null;
@@ -954,6 +955,11 @@ export function createInjectionSource(features, {
954
955
  return formatIdentifier(source.slice(source.lastIndexOf("/") + 1));
955
956
  }
956
957
 
958
+ function compactModelLabel(rawValue) {
959
+ const raw = String(rawValue ?? "").trim();
960
+ return formatIdentifier(raw.slice(raw.lastIndexOf("/") + 1));
961
+ }
962
+
957
963
  function brandForModel(identity, selector) {
958
964
  const haystack = `${identity.backend} ${identity.raw}`.toLowerCase();
959
965
  return selector.brands?.find((brand) => (
@@ -1152,7 +1158,10 @@ export function createInjectionSource(features, {
1152
1158
 
1153
1159
  function nativeModelPickerMenu() {
1154
1160
  return Array.from(document.querySelectorAll('[role="menu"][data-state="open"]')).find(
1155
- (menu) => menu.querySelector("[data-reasoning-slider]") && nativeModelPickerRow(menu),
1161
+ (menu) => (
1162
+ menu.querySelector("[data-reasoning-slider]")
1163
+ && (menu.querySelector("[data-model-picker-view-toggle]") || nativeModelPickerRow(menu))
1164
+ ),
1156
1165
  ) ?? null;
1157
1166
  }
1158
1167
 
@@ -1169,6 +1178,14 @@ export function createInjectionSource(features, {
1169
1178
  }
1170
1179
 
1171
1180
  function nativeModelValue(menu) {
1181
+ const toggle = menu?.querySelector("[data-model-picker-view-toggle]");
1182
+ const toggleModelLabel = toggle?.querySelector('[class*="_ViewToggleModelLabel_"]');
1183
+ const toggleValues = String(
1184
+ toggle?.hasAttribute("data-model-picker-view-toggle")
1185
+ ? (toggleModelLabel?.textContent ?? toggle.innerText)
1186
+ : "",
1187
+ ).split("\n").map((value) => value.trim()).filter(Boolean);
1188
+ if (toggleValues.length) return toggleValues[0];
1172
1189
  const row = nativeModelPickerRow(menu);
1173
1190
  const values = String(row?.innerText ?? "").split("\n").map((value) => value.trim()).filter(Boolean);
1174
1191
  if (values.length > 1) return values.at(-1);
@@ -1699,6 +1716,15 @@ export function createInjectionSource(features, {
1699
1716
  }
1700
1717
  }
1701
1718
 
1719
+ function pruneNativeModelToggleHandlers() {
1720
+ for (const [toggle, handlers] of modelSelectorNativeToggleHandlers) {
1721
+ if (toggle.isConnected) continue;
1722
+ toggle.removeEventListener("click", handlers.openModels);
1723
+ toggle.removeEventListener("keydown", handlers.onKeyDown);
1724
+ modelSelectorNativeToggleHandlers.delete(toggle);
1725
+ }
1726
+ }
1727
+
1702
1728
  function closeControllerModelMenu() {
1703
1729
  const record = modelSelectorControllerMenu;
1704
1730
  if (!record) return false;
@@ -2324,13 +2350,7 @@ export function createInjectionSource(features, {
2324
2350
  return true;
2325
2351
  }
2326
2352
 
2327
- function enhanceNativeModelPicker(parentMenu, selector) {
2328
- if (enhanceGenericModelPicker(parentMenu, selector)) return;
2329
- const toggle = parentMenu.querySelector("[data-model-picker-view-toggle]");
2330
- if (!toggle) {
2331
- enhanceGenericModelPicker(parentMenu, selector);
2332
- return;
2333
- }
2353
+ function restoreGenericModelPicker(parentMenu) {
2334
2354
  parentMenu.querySelector(":scope > [data-codex-model-slider-generic]")?.remove();
2335
2355
  parentMenu.removeAttribute("data-codex-model-slider-generic-menu");
2336
2356
  const nativeContainer = parentMenu.firstElementChild;
@@ -2338,19 +2358,42 @@ export function createInjectionSource(features, {
2338
2358
  nativeContainer.style.display = modelSelectorGenericContainers.get(nativeContainer);
2339
2359
  modelSelectorGenericContainers.delete(nativeContainer);
2340
2360
  }
2341
- const raw = nativeModelValue(parentMenu);
2342
- const textNode = firstVisibleTextNode(toggle);
2343
- if (raw && textNode) {
2344
- if (!modelSelectorOriginalToggleLabels.has(textNode)) {
2345
- modelSelectorOriginalToggleLabels.set(textNode, textNode.textContent);
2361
+ }
2362
+
2363
+ function enhanceNativeModelPicker(parentMenu, selector) {
2364
+ const toggle = parentMenu.querySelector("[data-model-picker-view-toggle]");
2365
+ if (toggle) {
2366
+ // 新版 Codex 保留原生 Slider;MCX 只精简模型名并接管模型入口。
2367
+ restoreGenericModelPicker(parentMenu);
2368
+ const raw = nativeModelValue(parentMenu);
2369
+ const textNode = firstVisibleTextNode(toggle);
2370
+ if (raw && textNode) {
2371
+ if (!modelSelectorOriginalToggleLabels.has(textNode)) {
2372
+ modelSelectorOriginalToggleLabels.set(textNode, textNode.textContent);
2373
+ }
2374
+ const label = compactModelLabel(raw);
2375
+ if (textNode.textContent !== label) textNode.textContent = label;
2346
2376
  }
2347
- const label = modelDisplayLabel(modelIdentity(raw), selector);
2348
- if (textNode.textContent !== label) textNode.textContent = label;
2349
- }
2350
- if (!toggle.hasAttribute("data-codex-model-slider-toggle")) {
2351
- toggle.setAttribute("data-codex-model-slider-toggle", "");
2352
- toggle.addEventListener("click", () => openNativeModelSubmenu(parentMenu));
2377
+ if (!toggle.hasAttribute("data-codex-model-slider-toggle")) {
2378
+ const originalAriaExpanded = toggle.getAttribute("aria-expanded");
2379
+ toggle.setAttribute("data-codex-model-slider-toggle", "");
2380
+ const openModels = (event) => {
2381
+ event.preventDefault();
2382
+ event.stopPropagation();
2383
+ event.stopImmediatePropagation();
2384
+ openControllerModelMenu(parentMenu, toggle, selector);
2385
+ };
2386
+ const onKeyDown = (event) => {
2387
+ if (event.key !== "Enter" && event.key !== " ") return;
2388
+ openModels(event);
2389
+ };
2390
+ toggle.addEventListener("click", openModels);
2391
+ toggle.addEventListener("keydown", onKeyDown);
2392
+ modelSelectorNativeToggleHandlers.set(toggle, { openModels, onKeyDown, originalAriaExpanded });
2393
+ }
2394
+ return;
2353
2395
  }
2396
+ if (enhanceGenericModelPicker(parentMenu, selector)) return;
2354
2397
  }
2355
2398
 
2356
2399
  function enhanceComposerModelTrigger(selector) {
@@ -2392,6 +2435,7 @@ export function createInjectionSource(features, {
2392
2435
  const selector = modelSelectorFeature?.modelSelector;
2393
2436
  if (!selector) return;
2394
2437
  pruneModelSubmenuPositionObservers();
2438
+ pruneNativeModelToggleHandlers();
2395
2439
  if (!modelSelectorStyle.isConnected) document.head?.append(modelSelectorStyle);
2396
2440
  enhanceComposerModelTrigger(selector);
2397
2441
  const parentMenu = nativeModelPickerMenu();
@@ -2456,6 +2500,13 @@ export function createInjectionSource(features, {
2456
2500
  for (const [node, value] of modelSelectorOriginalToggleLabels) {
2457
2501
  if (node.isConnected) node.textContent = value;
2458
2502
  }
2503
+ for (const [toggle, handlers] of modelSelectorNativeToggleHandlers) {
2504
+ toggle.removeEventListener("click", handlers.openModels);
2505
+ toggle.removeEventListener("keydown", handlers.onKeyDown);
2506
+ toggle.removeAttribute("data-codex-model-slider-toggle");
2507
+ if (handlers.originalAriaExpanded == null) toggle.removeAttribute("aria-expanded");
2508
+ else toggle.setAttribute("aria-expanded", handlers.originalAriaExpanded);
2509
+ }
2459
2510
  for (const [container, display] of modelSelectorGenericContainers) {
2460
2511
  if (container.isConnected) container.style.display = display;
2461
2512
  }
@@ -2476,6 +2527,7 @@ export function createInjectionSource(features, {
2476
2527
  modelSelectorOriginalItems.clear();
2477
2528
  modelSelectorOriginalToggleLabels.clear();
2478
2529
  modelSelectorGenericContainers.clear();
2530
+ modelSelectorNativeToggleHandlers.clear();
2479
2531
  }
2480
2532
 
2481
2533
  function surfaceKey(featureId, kind, detailId = "") {