minecodex 2.0.10 → 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
|
|
4
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1995
|
-
|
|
1996
|
-
|
|
1997
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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;
|
|
@@ -34,7 +34,10 @@ function reconcile() {
|
|
|
34
34
|
}, { signal });
|
|
35
35
|
// 作为原生按钮组的独立子项,继承组内 gap,不放进铃铛的 Tooltip 包装层。
|
|
36
36
|
let anchor = bell;
|
|
37
|
-
while (anchor.parentElement &&
|
|
37
|
+
while (anchor.parentElement && anchor.parentElement !== sidebar) {
|
|
38
|
+
const layout = getComputedStyle(anchor.parentElement);
|
|
39
|
+
// 跳过零间距的通知包装层,接入真正带原生 gap 的按钮组。
|
|
40
|
+
if (["flex", "inline-flex"].includes(layout.display) && Number.parseFloat(layout.columnGap) > 0) break;
|
|
38
41
|
anchor = anchor.parentElement;
|
|
39
42
|
}
|
|
40
43
|
anchor.after(button);
|
package/package.json
CHANGED
|
@@ -8,8 +8,9 @@ export function installComposerMenu(signal, ui) {
|
|
|
8
8
|
ui.layer(node, "floating");
|
|
9
9
|
const rect = body.getBoundingClientRect();
|
|
10
10
|
const root = anchor.closest("[data-codex-composer-root], [data-chatgpt-composer]");
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
const nativeSide = anchor.closest("[data-dropdown-overlay-side]")?.getAttribute("data-dropdown-overlay-side");
|
|
12
|
+
// 新会话跟随原生 Add 方向,不能仅凭 home 将 Codex 模式改为向下。
|
|
13
|
+
const below = root?.getAttribute("data-composer-placement") === "home" && nativeSide === "bottom";
|
|
13
14
|
const zoom = Number.parseFloat(getComputedStyle(node).zoom) || 1;
|
|
14
15
|
node.style.left = `${rect.left / zoom}px`;
|
|
15
16
|
node.style.top = `${(below ? rect.bottom + gap : rect.top - gap) / zoom}px`;
|