minecodex 2.0.11 → 2.0.12

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.
@@ -1,14 +1,16 @@
1
1
  export function createModelControllerAdapter(codex,comparableModelLabel) {
2
2
  function controllerView(props) {const view=Object.fromEntries(["models","model","reasoningEffort","powerSelections","selectedPowerSelection","fallbackPowerSelection","serviceTierOptions","selectedServiceTier","onSelectModel","onSelectReasoningEffort","onSelectPower","onCommitPower","onSelectServiceTier"].map(key=>[key,props[key]]));codex.report('model-controller',true);return view;}
3
- function nativeComposerTrigger() {
4
- const triggers = Array.from(document.querySelectorAll("[data-codex-intelligence-trigger]"))
3
+ function nativeComposerTriggers() {
4
+ return Array.from(document.querySelectorAll("[data-codex-intelligence-trigger]"))
5
5
  .filter((trigger) => trigger.checkVisibility({ checkVisibilityCSS: true, checkOpacity: true }));
6
+ }
7
+ function nativeComposerTrigger() {
8
+ const triggers = nativeComposerTriggers();
6
9
  return triggers.find((trigger) => trigger.getAttribute("data-state") === "open")
7
10
  ?? triggers[0] ?? null;
8
11
  }
9
- function nativeComposerModelController() {
12
+ function nativeComposerModelController(trigger = nativeComposerTrigger()) {
10
13
  codex.report("model-controller",false,"task-controller-unavailable");
11
- const trigger = nativeComposerTrigger();
12
14
  let fiber = codex.currentFiber(trigger);
13
15
  let powerController = null;
14
16
  for (let depth = 0; fiber && depth < 40; depth += 1, fiber = fiber.return) {
@@ -102,5 +104,5 @@ function selfCheck() {
102
104
  return {state:available ? "available" : "unavailable",reason:available ? null : "model-controller-unavailable",
103
105
  scopes:[{name:"model-trigger",element:trigger}],checks:[{name:"model-trigger",available:true},{name:"model-controller",available}]};
104
106
  }
105
- return {selfCheck,fastIcons,trigger:nativeComposerTrigger,read:nativeComposerModelController,descriptor:nativeModelDescriptorForItem,setOpen:setReactControlledMenuOpen,selectItem:invokeNativeMenuItemSelect};
107
+ return {selfCheck,fastIcons,trigger:nativeComposerTrigger,triggers:nativeComposerTriggers,read:nativeComposerModelController,descriptor:nativeModelDescriptorForItem,setOpen:setReactControlledMenuOpen,selectItem:invokeNativeMenuItemSelect};
106
108
  }
@@ -13,8 +13,7 @@ export function installModelSlider(signal, { feature, ui, createIcon, requestRef
13
13
  let modelSelectorEffortTransactionTimer = null;
14
14
  let modelSelectorPendingOutsideDismiss = false;
15
15
  let modelSelectorSuppressOutsidePointerSequence = false;
16
- let modelSelectorTriggerObserver = null;
17
- let modelSelectorObservedTrigger = null;
16
+ const modelSelectorTriggerObservers = new Map();
18
17
  let modelSelectorControllerMenu = null;
19
18
  let modelSelectorNativeFastIcons = null;
20
19
  // 持久化脏标记:仅在图标实际变化时写一次 localStorage。
@@ -44,7 +43,7 @@ export function installModelSlider(signal, { feature, ui, createIcon, requestRef
44
43
  }
45
44
  html[data-codex-model-slider-catalog-ready]
46
45
  [data-codex-model-slider-trigger]
47
- [class*="_ModelPickerTriggerModelText_"]:not([data-codex-model-slider-trigger-label]) {
46
+ [class*="_ModelPickerTriggerModelText_"]:not([data-codex-model-slider-trigger-label]):has(+ [data-codex-model-slider-trigger-label]) {
48
47
  display: none !important;
49
48
  }
50
49
  [data-codex-model-slider-trigger-label] {
@@ -1990,14 +1989,11 @@ export function installModelSlider(signal, { feature, ui, createIcon, requestRef
1990
1989
  return /^(select\s+(model|effort)|选择\s*(模型|思考强度))$/i.test(String(value ?? "").trim());
1991
1990
  }
1992
1991
 
1993
- function enhanceComposerModelTrigger(selector) {
1994
- const trigger = nativeComposerTrigger();
1995
- if (!trigger) return;
1996
- if (modelSelectorObservedTrigger !== trigger) {
1997
- modelSelectorTriggerObserver?.disconnect();
1998
- modelSelectorObservedTrigger = trigger;
1999
- modelSelectorTriggerObserver = new MutationObserver(queueEnsure);
2000
- modelSelectorTriggerObserver.observe(trigger, { childList: true, subtree: true, characterData: true });
1992
+ function enhanceComposerModelTrigger(trigger, selector) {
1993
+ if (!modelSelectorTriggerObservers.has(trigger)) {
1994
+ const observer = new MutationObserver(queueEnsure);
1995
+ observer.observe(trigger, { childList: true, subtree: true, characterData: true });
1996
+ modelSelectorTriggerObservers.set(trigger, observer);
2001
1997
  }
2002
1998
  const nativeLabels = Array.from(trigger.querySelectorAll(
2003
1999
  '[class*="_ModelPickerTriggerModelText_"]:not([data-codex-model-slider-trigger-label])',
@@ -2060,7 +2056,14 @@ export function installModelSlider(signal, { feature, ui, createIcon, requestRef
2060
2056
  pruneGenericModelPickerContainers();
2061
2057
  document.documentElement.setAttribute("data-codex-model-slider-catalog-ready", "");
2062
2058
  if (!modelSelectorStyle.isConnected) document.head?.append(modelSelectorStyle);
2063
- enhanceComposerModelTrigger(selector);
2059
+ // 主会话与 side chat 同时维护标签;菜单动作仍跟随原生打开的按钮。
2060
+ const triggers = nativeModel.triggers().filter(trigger => nativeModel.read(trigger));
2061
+ for (const [trigger, observer] of modelSelectorTriggerObservers) {
2062
+ if (triggers.includes(trigger)) continue;
2063
+ observer.disconnect();
2064
+ modelSelectorTriggerObservers.delete(trigger);
2065
+ }
2066
+ for (const trigger of triggers) enhanceComposerModelTrigger(trigger, selector);
2064
2067
  const parentMenu = nativeModelPickerMenu();
2065
2068
  if (modelSelectorControllerMenu && modelSelectorControllerMenu.parentMenu !== parentMenu) {
2066
2069
  closeControllerModelMenu({ immediate: true });
@@ -2092,7 +2095,8 @@ export function installModelSlider(signal, { feature, ui, createIcon, requestRef
2092
2095
  closeControllerModelMenu({ immediate: true });
2093
2096
  clearTimeout(modelSelectorReturnTimer);
2094
2097
  clearTimeout(modelSelectorEffortTransactionTimer);
2095
- modelSelectorTriggerObserver?.disconnect();
2098
+ for (const observer of modelSelectorTriggerObservers.values()) observer.disconnect();
2099
+ modelSelectorTriggerObservers.clear();
2096
2100
  for (const record of modelSelectorPositionObservers.values()) {
2097
2101
  record.observer.disconnect();
2098
2102
  record.resizeObserver.disconnect();
@@ -2100,8 +2104,6 @@ export function installModelSlider(signal, { feature, ui, createIcon, requestRef
2100
2104
  modelSelectorPositionObservers.clear();
2101
2105
  for (const frame of modelSelectorMenuSizeFrames.values()) cancelAnimationFrame(frame);
2102
2106
  modelSelectorMenuSizeFrames.clear();
2103
- modelSelectorTriggerObserver = null;
2104
- modelSelectorObservedTrigger = null;
2105
2107
  modelSelectorReturnTimer = null;
2106
2108
  modelSelectorEffortTransactionTimer = null;
2107
2109
  modelSelectorPendingOutsideDismiss = false;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "minecodex",
3
- "version": "2.0.11",
3
+ "version": "2.0.12",
4
4
  "description": "Lightweight, local-first plugins for the Codex desktop app.",
5
5
  "license": "MIT",
6
6
  "type": "module",