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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cursor-bridge",
3
- "version": "6.0.7",
3
+ "version": "6.0.8",
4
4
  "description": "Evidence-backed Cursor Context Engine search and bounded Cursor Agent execution, including a UI-suppressed minimal runtime.",
5
5
  "author": {
6
6
  "name": "Vanyangyang"
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.7 embeds Cursor Bridge 6.0.7, 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.
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)
@@ -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.7";
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 composers=[...document.querySelectorAll('.composer-bar[data-composer-id],.composer-bar,.ui-prompt-input-root,.agent-prompt-input-root,.ui-prompt-input')].filter(visible);
23486
- const composer=composers[composers.length-1]||document;
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
- const triggerSelector='.ui-model-picker__trigger,.vscode-model-picker__trigger';
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
- return JSON.stringify({found:true,state:'ready',text,detail,x:Math.round(rect.x+rect.width/2),y:Math.round(rect.y+rect.height/2)});
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 menus=[...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);
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 _openModelPicker(c) {
25865
- const trigger = await this._readModelPickerTrigger(c);
25866
- if (!trigger.found) {
25867
- throw new Error("Cursor model picker is unavailable in the active Agent composer");
25868
- }
25869
- let snapshot = await this._readModelPickerRows(c);
25870
- if (!snapshot.open) {
25871
- await this._clickModelPickerPoint(c, trigger);
25872
- await sleep2(450);
25873
- snapshot = await this._readModelPickerRows(c);
25874
- }
25875
- if (!snapshot.open) throw new Error("Cursor model picker did not open");
25876
- return { trigger, ...snapshot };
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,
@@ -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.7",
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.7",
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.7"
50
+ "embeddedProductVersion": "6.0.8"
51
51
  }
52
52
  }