pi-cursor-bridge 0.2.7 → 0.2.8
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/.codex-plugin/plugin.json +1 -1
- package/README.md +1 -1
- package/dist/cursor-bridge.mjs +145 -37
- package/extensions/index.ts +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -12,6 +12,6 @@ pi install npm:pi-cursor-bridge
|
|
|
12
12
|
|
|
13
13
|
Restart Pi after installation. Initialize the current project by asking Pi to initialize Cursor Bridge for the absolute project path, then use it normally. The package includes the `cce-routing` and `cursor-delegate` Skills and registers the native Cursor Bridge MCP tools directly in Pi.
|
|
14
14
|
|
|
15
|
-
Pi wrapper 0.2.
|
|
15
|
+
Pi wrapper 0.2.8 embeds Cursor Bridge 6.0.8, including Cursor 3.21 model-provider alias matching and `reasoning_effort` verification for Grok 4.7/high. Its result contract returns a compact receipt for background `cursor_do` work: poll `cursor_status(task_id)` normally, retrieve the terminal raw reply with `cursor_status(task_id, detail="result")`, check `isError` before using its content, and use `detail="full"` only when diagnostics are needed. Cursor must be installed and signed in. Current end-to-end compatibility claims remain scoped to the environments documented in the main repository.
|
|
16
16
|
|
|
17
17
|
Full documentation: [English](https://github.com/Vanyangyang/cursor-bridge#readme) · [简体中文](https://github.com/Vanyangyang/cursor-bridge/blob/main/README.zh-CN.md)
|
package/dist/cursor-bridge.mjs
CHANGED
|
@@ -22990,7 +22990,7 @@ function updateCursorSessionRegistry(filePath, mutator, options = {}) {
|
|
|
22990
22990
|
// server.mjs
|
|
22991
22991
|
init_cursor_ensure_core();
|
|
22992
22992
|
init_lifecycle_paths();
|
|
22993
|
-
var PLUGIN_VERSION = "6.0.
|
|
22993
|
+
var PLUGIN_VERSION = "6.0.8";
|
|
22994
22994
|
var CDP_PORT2 = Number(process.env.CURSOR_BRIDGE_CDP_PORT || 9223);
|
|
22995
22995
|
var ORIGIN = `http://localhost:${CDP_PORT2}`;
|
|
22996
22996
|
var QUERY_TIMEOUT = Number(process.env.CURSOR_BRIDGE_TIMEOUT || 3e5);
|
|
@@ -23481,21 +23481,45 @@ function exprClickBoundComposerStop(agentId) {
|
|
|
23481
23481
|
}
|
|
23482
23482
|
var EXPR_FIND_NEWAGENT = `(function(){const b=[...document.querySelectorAll('button,[role=button],a.action-label,.codicon')].find(e=>{if(e.offsetParent===null||e.closest('.glass-sidebar-agent-menu-btn'))return false;const s=(e.getAttribute('aria-label')||'')+' '+(e.getAttribute('title')||'')+' '+(e.innerText||'');return /(?:^|\\s)New (?:Agent|Chat)(?:\\s|$)/i.test(s);});if(!b)return '';const r=b.getBoundingClientRect();return JSON.stringify({x:Math.round(r.x+r.width/2),y:Math.round(r.y+r.height/2)});})()`;
|
|
23483
23483
|
var MODEL_PICKER_VISIBLE_BODY = `
|
|
23484
|
+
${INPUT_PICKER_BODY}
|
|
23484
23485
|
const visible=(node)=>!!(node&&(node.offsetParent!==null||(node.getClientRects&&node.getClientRects().length>0)));
|
|
23485
|
-
const
|
|
23486
|
-
const
|
|
23486
|
+
const inputs=inputCandidates();
|
|
23487
|
+
const ownerSelector='.composer-bar[data-composer-id],.composer-bar,.ui-prompt-input-root,.agent-prompt-input-root,.ui-prompt-input';
|
|
23488
|
+
const composer=inputs.length===1?inputs[0].closest(ownerSelector):null;
|
|
23489
|
+
const triggerSelector='.ui-model-picker__trigger,.vscode-model-picker__trigger';
|
|
23490
|
+
const candidates=composer?[...composer.querySelectorAll(triggerSelector)]
|
|
23491
|
+
.filter(node=>visible(node)&&node.closest(ownerSelector)===composer):[];
|
|
23492
|
+
const trigger=candidates.length===1?candidates[0]:null;
|
|
23493
|
+
const shell=inputs.length===1?inputs[0].closest('[data-agent-panel-conversation-shell][data-glass-agent-id]'):null;
|
|
23494
|
+
const owner=trigger?{triggerId:trigger.getAttribute('id'),composerId:composer.getAttribute('data-composer-id'),agentId:shell&&shell.getAttribute('data-glass-agent-id')}:null;
|
|
23487
23495
|
`;
|
|
23488
23496
|
var EXPR_MODEL_PICKER_TRIGGER = `(function(){
|
|
23489
23497
|
${MODEL_PICKER_VISIBLE_BODY}
|
|
23490
|
-
|
|
23491
|
-
const candidates=[...composer.querySelectorAll(triggerSelector)].filter(visible);
|
|
23492
|
-
const trigger=candidates[candidates.length-1]||[...document.querySelectorAll(triggerSelector)].filter(visible).pop();
|
|
23493
|
-
if(!trigger)return JSON.stringify({found:false,state:'trigger_missing'});
|
|
23498
|
+
if(!trigger)return JSON.stringify({found:false,state:inputs.length!==1?'input_ambiguous':!composer?'composer_missing':candidates.length>1?'trigger_ambiguous':'trigger_missing',inputCount:inputs.length,triggerCount:candidates.length});
|
|
23494
23499
|
const rect=trigger.getBoundingClientRect();
|
|
23495
23500
|
const text=String(trigger.querySelector('.ui-model-picker__trigger-text,.vscode-model-picker__trigger-text')?.innerText||trigger.innerText||'').replace(/\\s+/g,' ').trim();
|
|
23496
23501
|
const detail=String(trigger.querySelector('.ui-model-picker__trigger-variant-suffix,.vscode-model-picker__trigger-variant-suffix')?.innerText||'').replace(/\\s+/g,' ').trim();
|
|
23497
|
-
|
|
23502
|
+
const x=Math.round(rect.x+rect.width/2),y=Math.round(rect.y+rect.height/2);
|
|
23503
|
+
let state='ready';
|
|
23504
|
+
if(trigger.disabled||trigger.getAttribute('aria-disabled')==='true'||trigger.closest('[inert]')||getComputedStyle(trigger).pointerEvents==='none')state='trigger_disabled';
|
|
23505
|
+
else if(!Number.isFinite(x)||!Number.isFinite(y)||rect.width<=0||rect.height<=0||x<0||y<0||x>=innerWidth||y>=innerHeight)state='trigger_offscreen';
|
|
23506
|
+
else {const hit=document.elementFromPoint(x,y);if(!hit||hit!==trigger&&!trigger.contains(hit))state='trigger_occluded';}
|
|
23507
|
+
return JSON.stringify({found:true,state,interactive:state==='ready',expanded:trigger.getAttribute('aria-expanded'),text,detail,x,y,...owner});
|
|
23498
23508
|
})()`;
|
|
23509
|
+
function exprActivateClosedModelPicker(expected) {
|
|
23510
|
+
return `(function(){
|
|
23511
|
+
const expected=${JSON.stringify(expected)};
|
|
23512
|
+
const current=JSON.parse(${EXPR_MODEL_PICKER_TRIGGER});
|
|
23513
|
+
if(!current.found||current.interactive!==true||current.expanded!=='false')return JSON.stringify({clicked:false,state:'trigger_not_closed_and_interactive'});
|
|
23514
|
+
if(!current.triggerId||['triggerId','composerId','agentId','x','y'].some(key=>(current[key]??null)!==(expected[key]??null)))return JSON.stringify({clicked:false,state:'trigger_changed'});
|
|
23515
|
+
${MODEL_PICKER_VISIBLE_BODY}
|
|
23516
|
+
if(!trigger||trigger.getAttribute('id')!==current.triggerId)return JSON.stringify({clicked:false,state:'trigger_changed'});
|
|
23517
|
+
// Use the same button's normal click handler after a native click failed
|
|
23518
|
+
// to expand it. The closed-state and hit checks occur in this same turn.
|
|
23519
|
+
trigger.click();
|
|
23520
|
+
return JSON.stringify({clicked:true,state:'closed_trigger_activated',owner});
|
|
23521
|
+
})()`;
|
|
23522
|
+
}
|
|
23499
23523
|
function classifyModelPickerRowKind(text, hasItemName, menuTestId, submenuTestId, ariaHaspopup, hasParamCheck, inSubmenu) {
|
|
23500
23524
|
const menu = String(menuTestId || "").toLowerCase();
|
|
23501
23525
|
const submenu = String(submenuTestId || "").toLowerCase();
|
|
@@ -23512,7 +23536,32 @@ function classifyModelPickerRowKind(text, hasItemName, menuTestId, submenuTestId
|
|
|
23512
23536
|
var EXPR_MODEL_PICKER_ROWS = `(function(){
|
|
23513
23537
|
${MODEL_PICKER_VISIBLE_BODY}
|
|
23514
23538
|
${classifyModelPickerRowKind.toString()}
|
|
23515
|
-
const
|
|
23539
|
+
const visibleMenus=[...document.querySelectorAll('[data-testid="model-picker-menu"],[data-testid="selected-auto-menu"],[data-testid*="model-parameters"],[data-testid*="parameter-submenu"],[data-component="menu-popup"][data-submenu]')].filter(visible);
|
|
23540
|
+
const menus=[];
|
|
23541
|
+
if(trigger){
|
|
23542
|
+
// Modern menus are portalled. Follow the exact trigger's accessibility
|
|
23543
|
+
// links, including submenu triggers, instead of adopting another picker.
|
|
23544
|
+
const ids=new Set(),controls=new Set();
|
|
23545
|
+
const link=node=>{
|
|
23546
|
+
const id=node.getAttribute('id');if(id)ids.add(id);
|
|
23547
|
+
for(const id of String(node.getAttribute('aria-controls')||'').split(/\\s+/).filter(Boolean))controls.add(id);
|
|
23548
|
+
};
|
|
23549
|
+
link(trigger);
|
|
23550
|
+
for(let pass=0;pass<visibleMenus.length;pass++){
|
|
23551
|
+
let changed=false;
|
|
23552
|
+
for(const menu of visibleMenus){
|
|
23553
|
+
if(menus.includes(menu))continue;
|
|
23554
|
+
const id=menu.getAttribute('id'),labelledBy=String(menu.getAttribute('aria-labelledby')||'').split(/\\s+/).filter(Boolean);
|
|
23555
|
+
if(!(id&&controls.has(id))&&!labelledBy.some(id=>ids.has(id)))continue;
|
|
23556
|
+
menus.push(menu);link(menu);
|
|
23557
|
+
for(const node of menu.querySelectorAll('[id],[aria-controls]'))link(node);
|
|
23558
|
+
changed=true;
|
|
23559
|
+
}
|
|
23560
|
+
if(!changed)break;
|
|
23561
|
+
}
|
|
23562
|
+
if(!ids.size&&!controls.size&&visibleMenus.length===1
|
|
23563
|
+
&&[...document.querySelectorAll(triggerSelector)].filter(visible).length===1)menus.push(visibleMenus[0]);
|
|
23564
|
+
}
|
|
23516
23565
|
const rows=[];
|
|
23517
23566
|
const seen=new Set();
|
|
23518
23567
|
for(const menu of menus){
|
|
@@ -23547,8 +23596,11 @@ var EXPR_MODEL_PICKER_ROWS = `(function(){
|
|
|
23547
23596
|
});
|
|
23548
23597
|
}
|
|
23549
23598
|
}
|
|
23550
|
-
return JSON.stringify({open:menus.length>0,rows});
|
|
23599
|
+
return JSON.stringify({open:menus.length>0,rows,owner});
|
|
23551
23600
|
})()`;
|
|
23601
|
+
function modelPickerOwnerKey(owner) {
|
|
23602
|
+
return owner && JSON.stringify([owner.triggerId || null, owner.composerId || null, owner.agentId || null]);
|
|
23603
|
+
}
|
|
23552
23604
|
var EXPR_SELECTED_AGENT_MODEL_CONFIG = `(function(){
|
|
23553
23605
|
${INPUT_PICKER_BODY}
|
|
23554
23606
|
const inputs=inputCandidates();
|
|
@@ -25843,7 +25895,7 @@ var CursorBridge = class {
|
|
|
25843
25895
|
}
|
|
25844
25896
|
async _readModelPickerRows(c, options) {
|
|
25845
25897
|
const snapshot = await this._readModelPickerValue(c, EXPR_MODEL_PICKER_ROWS, "rows", options);
|
|
25846
|
-
return { open: snapshot.open === true, rows: Array.isArray(snapshot.rows) ? snapshot.rows : [] };
|
|
25898
|
+
return { open: snapshot.open === true, rows: Array.isArray(snapshot.rows) ? snapshot.rows : [], owner: snapshot.owner || null };
|
|
25847
25899
|
}
|
|
25848
25900
|
async _readSelectedAgentModelConfig(c, options) {
|
|
25849
25901
|
return this._readModelPickerValue(c, EXPR_SELECTED_AGENT_MODEL_CONFIG, "selected_agent_model_config", options);
|
|
@@ -25861,19 +25913,67 @@ var CursorBridge = class {
|
|
|
25861
25913
|
if (!point || !Number.isFinite(Number(point.x)) || !Number.isFinite(Number(point.y))) return;
|
|
25862
25914
|
await c.send("Input.dispatchMouseEvent", { type: "mouseMoved", x: Number(point.x), y: Number(point.y) });
|
|
25863
25915
|
}
|
|
25864
|
-
async
|
|
25865
|
-
|
|
25866
|
-
|
|
25867
|
-
|
|
25868
|
-
|
|
25869
|
-
|
|
25870
|
-
|
|
25871
|
-
|
|
25872
|
-
|
|
25873
|
-
|
|
25874
|
-
|
|
25875
|
-
|
|
25876
|
-
|
|
25916
|
+
async _activateClosedModelPicker(c, trigger, options) {
|
|
25917
|
+
return this._readModelPickerValue(c, exprActivateClosedModelPicker(trigger), "closed_trigger_activation", options);
|
|
25918
|
+
}
|
|
25919
|
+
async _openModelPicker(c, job = null, options = {}) {
|
|
25920
|
+
const timeoutMs = Math.max(0, Number(options.timeoutMs ?? 2e3));
|
|
25921
|
+
const pollMs = Math.max(10, Number(options.pollMs ?? 50));
|
|
25922
|
+
const stableMs = Math.max(0, Number(options.stableMs ?? 100));
|
|
25923
|
+
const recoveryDelayMs = Math.max(0, Number(options.recoveryDelayMs ?? 750));
|
|
25924
|
+
const deadline = Date.now() + timeoutMs;
|
|
25925
|
+
let trigger = null, snapshot = { open: false, rows: [] };
|
|
25926
|
+
let stableSignature = null, stableSince = 0, clicked = false, clickedOwner = null;
|
|
25927
|
+
let clickedAt = 0, recoveryAttempted = false, lastPollError = null;
|
|
25928
|
+
const attempts = [];
|
|
25929
|
+
do {
|
|
25930
|
+
this._throwIfCancelledBeforeSend(job);
|
|
25931
|
+
if (deadline - Date.now() < 10) break;
|
|
25932
|
+
try {
|
|
25933
|
+
snapshot = await this._readModelPickerRows(c, { timeoutMs: deadline - Date.now() });
|
|
25934
|
+
if (deadline - Date.now() < 10) break;
|
|
25935
|
+
trigger = await this._readModelPickerTrigger(c, { timeoutMs: deadline - Date.now() });
|
|
25936
|
+
} catch (error2) {
|
|
25937
|
+
if (error2.code !== "CDP_COMMAND_TIMEOUT" || Date.now() < deadline) throw error2;
|
|
25938
|
+
lastPollError = error2.pickerRead || { code: error2.code, message: error2.message };
|
|
25939
|
+
break;
|
|
25940
|
+
}
|
|
25941
|
+
this._throwIfCancelledBeforeSend(job);
|
|
25942
|
+
const sameOwner = modelPickerOwnerKey(snapshot.owner) === modelPickerOwnerKey(trigger);
|
|
25943
|
+
if (snapshot.open && trigger.found && sameOwner && (!clicked || clickedOwner === modelPickerOwnerKey(trigger))) return { trigger, ...snapshot };
|
|
25944
|
+
if (snapshot.open && !sameOwner && !attempts.includes("owner_changed")) attempts.push("owner_changed");
|
|
25945
|
+
if (!clicked) {
|
|
25946
|
+
const interactive = trigger.found && trigger.interactive !== false;
|
|
25947
|
+
const signature = interactive ? JSON.stringify([trigger.triggerId, trigger.composerId, trigger.agentId, trigger.x, trigger.y]) : null;
|
|
25948
|
+
if (!interactive || signature !== stableSignature) {
|
|
25949
|
+
stableSignature = signature;
|
|
25950
|
+
stableSince = Date.now();
|
|
25951
|
+
const state = trigger.state || (interactive ? "ready" : "trigger_missing");
|
|
25952
|
+
if (!attempts.includes(state)) attempts.push(state);
|
|
25953
|
+
}
|
|
25954
|
+
if (interactive && Date.now() - stableSince >= stableMs) {
|
|
25955
|
+
this._throwIfCancelledBeforeSend(job);
|
|
25956
|
+
await this._clickModelPickerPoint(c, trigger);
|
|
25957
|
+
clicked = true;
|
|
25958
|
+
clickedAt = Date.now();
|
|
25959
|
+
clickedOwner = modelPickerOwnerKey(trigger);
|
|
25960
|
+
attempts.push("click_once", "wait_menu");
|
|
25961
|
+
}
|
|
25962
|
+
} else if (!recoveryAttempted && !snapshot.open && sameOwner && clickedOwner === modelPickerOwnerKey(trigger) && trigger.interactive === true && trigger.expanded === "false" && Date.now() - clickedAt >= recoveryDelayMs && deadline - Date.now() >= 10) {
|
|
25963
|
+
this._throwIfCancelledBeforeSend(job);
|
|
25964
|
+
recoveryAttempted = true;
|
|
25965
|
+
const recovered = await this._activateClosedModelPicker(c, trigger, { timeoutMs: deadline - Date.now() });
|
|
25966
|
+
attempts.push(recovered.clicked ? "activate_confirmed_closed_trigger" : recovered.state || "activation_rejected");
|
|
25967
|
+
}
|
|
25968
|
+
if (Date.now() >= deadline) break;
|
|
25969
|
+
await sleep2(Math.min(pollMs, Math.max(0, deadline - Date.now())));
|
|
25970
|
+
} while (Date.now() < deadline);
|
|
25971
|
+
throw createModelSelectionError("Cursor model picker did not open", "picker_did_not_open", true, {
|
|
25972
|
+
attempts,
|
|
25973
|
+
trigger,
|
|
25974
|
+
lastPollError,
|
|
25975
|
+
menu: { open: snapshot.open, rows: (snapshot.rows || []).slice(0, 20) }
|
|
25976
|
+
});
|
|
25877
25977
|
}
|
|
25878
25978
|
async _closeModelPicker(c) {
|
|
25879
25979
|
for (let attempt = 0; attempt < 3; attempt++) {
|
|
@@ -25885,24 +25985,29 @@ var CursorBridge = class {
|
|
|
25885
25985
|
}
|
|
25886
25986
|
if ((await this._readModelPickerRows(c)).open) throw new Error("Cursor model picker did not close after selection");
|
|
25887
25987
|
}
|
|
25888
|
-
async _openModelPickerControl(c, snapshot, controlKind) {
|
|
25988
|
+
async _openModelPickerControl(c, snapshot, controlKind, job = null) {
|
|
25989
|
+
this._throwIfCancelledBeforeSend(job);
|
|
25889
25990
|
const control = (snapshot && snapshot.rows || []).find((row) => row.kind === controlKind && row.disabled !== true);
|
|
25890
25991
|
if (!control) return snapshot;
|
|
25992
|
+
this._throwIfCancelledBeforeSend(job);
|
|
25891
25993
|
await this._clickModelPickerPoint(c, control);
|
|
25892
25994
|
await sleep2(400);
|
|
25893
25995
|
let next = await this._readModelPickerRows(c);
|
|
25894
25996
|
const expectedKind = controlKind === "model_control" ? "model" : "parameter";
|
|
25895
25997
|
if (!next.rows.some((row) => row.kind === expectedKind)) {
|
|
25998
|
+
this._throwIfCancelledBeforeSend(job);
|
|
25896
25999
|
await this._hoverModelPickerPoint(c, control);
|
|
25897
26000
|
await sleep2(350);
|
|
25898
26001
|
next = await this._readModelPickerRows(c);
|
|
25899
26002
|
}
|
|
25900
26003
|
return next;
|
|
25901
26004
|
}
|
|
25902
|
-
async _findModelPickerModel(c, snapshot, requestedModel) {
|
|
26005
|
+
async _findModelPickerModel(c, snapshot, requestedModel, job = null) {
|
|
26006
|
+
this._throwIfCancelledBeforeSend(job);
|
|
25903
26007
|
let modelRow = selectModelPickerRow(snapshot && snapshot.rows, requestedModel, "model");
|
|
25904
26008
|
if (modelRow) return { snapshot, modelRow };
|
|
25905
|
-
const expanded = await this._openModelPickerControl(c, snapshot, "model_control");
|
|
26009
|
+
const expanded = await this._openModelPickerControl(c, snapshot, "model_control", job);
|
|
26010
|
+
this._throwIfCancelledBeforeSend(job);
|
|
25906
26011
|
modelRow = selectModelPickerRow(expanded && expanded.rows, requestedModel, "model");
|
|
25907
26012
|
return { snapshot: expanded, modelRow };
|
|
25908
26013
|
}
|
|
@@ -26047,9 +26152,9 @@ var CursorBridge = class {
|
|
|
26047
26152
|
if (job) job.modelSelection = result2;
|
|
26048
26153
|
return result2;
|
|
26049
26154
|
}
|
|
26050
|
-
const opened = await this._openModelPicker(c);
|
|
26155
|
+
const opened = await this._openModelPicker(c, job);
|
|
26051
26156
|
stage = "locate_model";
|
|
26052
|
-
let located = await this._findModelPickerModel(c, opened, requestedModel);
|
|
26157
|
+
let located = await this._findModelPickerModel(c, opened, requestedModel, job);
|
|
26053
26158
|
modelRow = located.modelRow;
|
|
26054
26159
|
if (!modelRow) {
|
|
26055
26160
|
throw createModelSelectionError(
|
|
@@ -26065,8 +26170,8 @@ var CursorBridge = class {
|
|
|
26065
26170
|
if (!outcome.row && outcome.state === "not_rendered" && !effortPickerReopened) {
|
|
26066
26171
|
effortPickerReopened = true;
|
|
26067
26172
|
await this._closeModelPicker(c);
|
|
26068
|
-
const reopened = await this._openModelPicker(c);
|
|
26069
|
-
located = await this._findModelPickerModel(c, reopened, requestedModel);
|
|
26173
|
+
const reopened = await this._openModelPicker(c, job);
|
|
26174
|
+
located = await this._findModelPickerModel(c, reopened, requestedModel, job);
|
|
26070
26175
|
modelRow = located.modelRow;
|
|
26071
26176
|
if (!modelRow) {
|
|
26072
26177
|
throw createModelSelectionError(
|
|
@@ -26109,8 +26214,8 @@ var CursorBridge = class {
|
|
|
26109
26214
|
this._throwIfCancelledBeforeSend(job);
|
|
26110
26215
|
await this._clickModelPickerPoint(c, modelRow);
|
|
26111
26216
|
await sleep2(550);
|
|
26112
|
-
const reopened = await this._openModelPicker(c);
|
|
26113
|
-
located = await this._findModelPickerModel(c, reopened, requestedModel);
|
|
26217
|
+
const reopened = await this._openModelPicker(c, job);
|
|
26218
|
+
located = await this._findModelPickerModel(c, reopened, requestedModel, job);
|
|
26114
26219
|
modelRow = located.modelRow;
|
|
26115
26220
|
if (!modelRow) {
|
|
26116
26221
|
throw createModelSelectionError(
|
|
@@ -26137,8 +26242,8 @@ var CursorBridge = class {
|
|
|
26137
26242
|
stage = "verify_model";
|
|
26138
26243
|
let trigger2 = await this._readModelPickerTrigger(c);
|
|
26139
26244
|
if (!trigger2.found || !normalizeModelPickerModelText(trigger2.text).includes(normalizeModelPickerModelText(requestedModel))) {
|
|
26140
|
-
const reopened = await this._openModelPicker(c);
|
|
26141
|
-
located = await this._findModelPickerModel(c, reopened, requestedModel);
|
|
26245
|
+
const reopened = await this._openModelPicker(c, job);
|
|
26246
|
+
located = await this._findModelPickerModel(c, reopened, requestedModel, job);
|
|
26142
26247
|
const selected = selectModelPickerRow(located.snapshot.rows.filter((row) => row.selected), requestedModel, "model");
|
|
26143
26248
|
if (!selected) {
|
|
26144
26249
|
throw createModelSelectionError(
|
|
@@ -26151,8 +26256,8 @@ var CursorBridge = class {
|
|
|
26151
26256
|
}
|
|
26152
26257
|
if (requestedEffort) {
|
|
26153
26258
|
stage = "verify_effort";
|
|
26154
|
-
const reopened = await this._openModelPicker(c);
|
|
26155
|
-
located = await this._findModelPickerModel(c, reopened, requestedModel);
|
|
26259
|
+
const reopened = await this._openModelPicker(c, job);
|
|
26260
|
+
located = await this._findModelPickerModel(c, reopened, requestedModel, job);
|
|
26156
26261
|
modelRow = located.modelRow;
|
|
26157
26262
|
if (!modelRow) {
|
|
26158
26263
|
throw createModelSelectionError(
|
|
@@ -26207,6 +26312,8 @@ var CursorBridge = class {
|
|
|
26207
26312
|
errorCode: primaryError.code || `CURSOR_MODEL_${String(failure.failureClass).toUpperCase()}`,
|
|
26208
26313
|
available: failure.available || [],
|
|
26209
26314
|
attempts: failure.attempts || [],
|
|
26315
|
+
trigger: failure.trigger || null,
|
|
26316
|
+
lastPollError: failure.lastPollError || null,
|
|
26210
26317
|
menu: failure.menu || null,
|
|
26211
26318
|
runtimeMode: this.runtimeMode,
|
|
26212
26319
|
lastError: primaryError.message,
|
|
@@ -28294,6 +28401,7 @@ export {
|
|
|
28294
28401
|
createChatPanelUnavailableError,
|
|
28295
28402
|
createProviderError,
|
|
28296
28403
|
cursorStartupBehavior,
|
|
28404
|
+
exprActivateClosedModelPicker,
|
|
28297
28405
|
exprClickBoundComposerStop,
|
|
28298
28406
|
exprClickSelectedAgentStop,
|
|
28299
28407
|
exprCreateAgentForWorkspace,
|
package/extensions/index.ts
CHANGED
|
@@ -10,7 +10,7 @@ const hostWorkspaceId = hostCwd.replace(/\\/g, "/").toLowerCase();
|
|
|
10
10
|
export default createStdioMcpExtension({
|
|
11
11
|
label: "Cursor Bridge",
|
|
12
12
|
clientName: "pi-cursor-bridge",
|
|
13
|
-
packageVersion: "0.2.
|
|
13
|
+
packageVersion: "0.2.8",
|
|
14
14
|
serverName: "cursor-bridge",
|
|
15
15
|
serverScript: join(packageRoot, "dist", "cursor-bridge.mjs"),
|
|
16
16
|
cwd: hostCwd,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pi-cursor-bridge",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.8",
|
|
4
4
|
"description": "Windows only. Use Cursor Context Engine and bounded, explicitly continuous Cursor Agent execution from the Pi coding agent.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -47,6 +47,6 @@
|
|
|
47
47
|
},
|
|
48
48
|
"piPackage": {
|
|
49
49
|
"embeddedProduct": "Cursor Bridge",
|
|
50
|
-
"embeddedProductVersion": "6.0.
|
|
50
|
+
"embeddedProductVersion": "6.0.8"
|
|
51
51
|
}
|
|
52
52
|
}
|