@marimo-team/islands 0.21.1-dev13 → 0.21.1-dev15

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/dist/main.js CHANGED
@@ -70724,7 +70724,7 @@ Image URL: ${r.imageUrl}`)), contextToXml({
70724
70724
  return Logger.warn("Failed to get version from mount config"), null;
70725
70725
  }
70726
70726
  }
70727
- const marimoVersionAtom = atom(getVersionFromMountConfig() || "0.21.1-dev13"), showCodeInRunModeAtom = atom(true);
70727
+ const marimoVersionAtom = atom(getVersionFromMountConfig() || "0.21.1-dev15"), showCodeInRunModeAtom = atom(true);
70728
70728
  atom(null);
70729
70729
  var import_compiler_runtime$89 = require_compiler_runtime();
70730
70730
  function useKeydownOnElement(e, r) {
@@ -99235,7 +99235,7 @@ ${c}
99235
99235
  0
99236
99236
  ], DRAG_HANDLE = "grid-drag-handle";
99237
99237
  const GridLayoutRenderer = (e) => {
99238
- let r = (0, import_compiler_runtime$9.c)(160), { layout: c, setLayout: d, cells: f, mode: _ } = e, v = _ === "read", y;
99238
+ let r = (0, import_compiler_runtime$9.c)(161), { layout: c, setLayout: d, cells: f, mode: _ } = e, v = _ === "read", y;
99239
99239
  r[0] === c.cells ? y = r[1] : (y = new Set(c.cells.map(_temp$4)), r[0] = c.cells, r[1] = y);
99240
99240
  let S = y, [w, E] = (0, import_react.useState)(null), [O, M] = (0, import_react.useState)(false), I;
99241
99241
  r[2] === c.columns ? I = r[3] : (I = {
@@ -99278,14 +99278,16 @@ ${c}
99278
99278
  r[60] !== I2 || r[61] !== G2 || r[62] !== q2 ? (UY = cn("w-full mx-auto bg-background flex-1 min-h-full", I2, G2, q2), r[60] = I2, r[61] = G2, r[62] = q2, r[63] = UY) : UY = r[63], r[64] === v ? WY = r[65] : (WY = v ? [
99279
99279
  20,
99280
99280
  20
99281
- ] : void 0, r[64] = v, r[65] = WY), GY = MARGIN, KY = false, qY = null, JY = true, YY = c.rowHeight, r[66] !== c || r[67] !== d ? (XY = (e3) => d({
99282
- ...c,
99283
- cells: e3
99284
- }), r[66] = c, r[67] = d, r[68] = XY) : XY = r[68], r[69] === w ? ZY = r[70] : (ZY = w ? {
99281
+ ] : void 0, r[64] = v, r[65] = WY), GY = MARGIN, KY = false, qY = null, JY = true, YY = c.rowHeight, r[66] !== v || r[67] !== c || r[68] !== d ? (XY = (e3) => {
99282
+ v || d({
99283
+ ...c,
99284
+ cells: e3
99285
+ });
99286
+ }, r[66] = v, r[67] = c, r[68] = d, r[69] = XY) : XY = r[69], r[70] === w ? ZY = r[71] : (ZY = w ? {
99285
99287
  i: w.i,
99286
99288
  w: w.w || 2,
99287
99289
  h: w.h || 2
99288
- } : void 0, r[69] = w, r[70] = ZY), r[71] !== LY || r[72] !== c || r[73] !== d ? (QY = (e3, r2, f2) => {
99290
+ } : void 0, r[70] = w, r[71] = ZY), r[72] !== LY || r[73] !== c || r[74] !== d ? (QY = (e3, r2, f2) => {
99289
99291
  LY.onDragStop(), r2 && d({
99290
99292
  ...c,
99291
99293
  cells: [
@@ -99293,15 +99295,15 @@ ${c}
99293
99295
  r2
99294
99296
  ]
99295
99297
  });
99296
- }, r[71] = LY, r[72] = c, r[73] = d, r[74] = QY) : QY = r[74], r[75] === LY ? ($Y = r[76], eX = r[77], tX = r[78]) : ($Y = (e3, r2, c2, d2, f2) => {
99298
+ }, r[72] = LY, r[73] = c, r[74] = d, r[75] = QY) : QY = r[75], r[76] === LY ? ($Y = r[77], eX = r[78], tX = r[79]) : ($Y = (e3, r2, c2, d2, f2) => {
99297
99299
  LY.onDragStart(f2);
99298
99300
  }, eX = (e3, r2, c2, d2, f2) => {
99299
99301
  LY.onDragMove(f2);
99300
99302
  }, tX = () => {
99301
99303
  LY.onDragStop();
99302
- }, r[75] = LY, r[76] = $Y, r[77] = eX, r[78] = tX), nX = _temp3$2, rX = zY, iX = zY, aX = zY, oX = zY ? `.${DRAG_HANDLE}` : "noop";
99304
+ }, r[76] = LY, r[77] = $Y, r[78] = eX, r[79] = tX), nX = _temp3$2, rX = zY, iX = zY, aX = zY, oX = zY ? `.${DRAG_HANDLE}` : "noop";
99303
99305
  let IY2;
99304
- r[79] === S ? IY2 = r[80] : (IY2 = (e3) => S.has(e3.id), r[79] = S, r[80] = IY2), sX = f.filter(IY2).map((r2) => {
99306
+ r[80] === S ? IY2 = r[81] : (IY2 = (e3) => S.has(e3.id), r[80] = S, r[81] = IY2), sX = f.filter(IY2).map((r2) => {
99305
99307
  let f2 = e2.get(r2.id), v2 = c.scrollableCells.has(r2.id) ?? false, y3 = c.cellSide.get(r2.id), S2 = (0, import_jsx_runtime.jsx)(GridCell, {
99306
99308
  code: r2.code,
99307
99309
  mode: _,
@@ -99333,7 +99335,7 @@ ${c}
99333
99335
  }), r[10] = f, r[11] = z, r[12] = LY, r[13] = w, r[14] = zY, r[15] = S, r[16] = RY, r[17] = v, r[18] = c, r[19] = _, r[20] = d, r[21] = BY, r[22] = VY, r[23] = HY, r[24] = UY, r[25] = WY, r[26] = GY, r[27] = KY, r[28] = qY, r[29] = JY, r[30] = YY, r[31] = XY, r[32] = ZY, r[33] = QY, r[34] = $Y, r[35] = eX, r[36] = tX, r[37] = nX, r[38] = rX, r[39] = iX, r[40] = aX, r[41] = oX, r[42] = sX, r[43] = cX, r[44] = lX, r[45] = uX, r[46] = dX;
99334
99336
  } else BY = r[21], VY = r[22], HY = r[23], UY = r[24], WY = r[25], GY = r[26], KY = r[27], qY = r[28], JY = r[29], YY = r[30], XY = r[31], ZY = r[32], QY = r[33], $Y = r[34], eX = r[35], tX = r[36], nX = r[37], rX = r[38], iX = r[39], aX = r[40], oX = r[41], sX = r[42], cX = r[43], lX = r[44], uX = r[45], dX = r[46];
99335
99337
  let fX;
99336
- r[81] !== BY || r[82] !== HY || r[83] !== UY || r[84] !== WY || r[85] !== GY || r[86] !== KY || r[87] !== qY || r[88] !== JY || r[89] !== YY || r[90] !== XY || r[91] !== ZY || r[92] !== QY || r[93] !== $Y || r[94] !== eX || r[95] !== tX || r[96] !== nX || r[97] !== rX || r[98] !== iX || r[99] !== aX || r[100] !== oX || r[101] !== sX || r[102] !== cX || r[103] !== lX || r[104] !== uX || r[105] !== dX ? (fX = (0, import_jsx_runtime.jsx)(BY, {
99338
+ r[82] !== BY || r[83] !== HY || r[84] !== UY || r[85] !== WY || r[86] !== GY || r[87] !== KY || r[88] !== qY || r[89] !== JY || r[90] !== YY || r[91] !== XY || r[92] !== ZY || r[93] !== QY || r[94] !== $Y || r[95] !== eX || r[96] !== tX || r[97] !== nX || r[98] !== rX || r[99] !== iX || r[100] !== aX || r[101] !== oX || r[102] !== sX || r[103] !== cX || r[104] !== lX || r[105] !== uX || r[106] !== dX ? (fX = (0, import_jsx_runtime.jsx)(BY, {
99337
99339
  breakpoint: cX,
99338
99340
  layouts: lX,
99339
99341
  style: uX,
@@ -99358,28 +99360,28 @@ ${c}
99358
99360
  isResizable: aX,
99359
99361
  draggableHandle: oX,
99360
99362
  children: sX
99361
- }), r[81] = BY, r[82] = HY, r[83] = UY, r[84] = WY, r[85] = GY, r[86] = KY, r[87] = qY, r[88] = JY, r[89] = YY, r[90] = XY, r[91] = ZY, r[92] = QY, r[93] = $Y, r[94] = eX, r[95] = tX, r[96] = nX, r[97] = rX, r[98] = iX, r[99] = aX, r[100] = oX, r[101] = sX, r[102] = cX, r[103] = lX, r[104] = uX, r[105] = dX, r[106] = fX) : fX = r[106];
99363
+ }), r[82] = BY, r[83] = HY, r[84] = UY, r[85] = WY, r[86] = GY, r[87] = KY, r[88] = qY, r[89] = JY, r[90] = YY, r[91] = XY, r[92] = ZY, r[93] = QY, r[94] = $Y, r[95] = eX, r[96] = tX, r[97] = nX, r[98] = rX, r[99] = iX, r[100] = aX, r[101] = oX, r[102] = sX, r[103] = cX, r[104] = lX, r[105] = uX, r[106] = dX, r[107] = fX) : fX = r[107];
99362
99364
  let pX = fX, mX, hX, gX, _X, vX, yX, bX;
99363
- if (r[107] !== f || r[108] !== pX || r[109] !== S || r[110] !== O || r[111] !== v || r[112] !== c || r[113] !== _ || r[114] !== d || r[115] !== VY) {
99365
+ if (r[108] !== f || r[109] !== pX || r[110] !== S || r[111] !== O || r[112] !== v || r[113] !== c || r[114] !== _ || r[115] !== d || r[116] !== VY) {
99364
99366
  bX = /* @__PURE__ */ Symbol.for("react.early_return_sentinel");
99365
99367
  bb0: {
99366
99368
  let e2;
99367
- r[124] === S ? e2 = r[125] : (e2 = (e3) => !S.has(e3.id), r[124] = S, r[125] = e2);
99369
+ r[125] === S ? e2 = r[126] : (e2 = (e3) => !S.has(e3.id), r[125] = S, r[126] = e2);
99368
99370
  let y2 = f.filter(e2);
99369
99371
  if (v) {
99370
99372
  if (c.bordered) {
99371
99373
  let e4;
99372
- r[126] !== pX || r[127] !== VY ? (e4 = (0, import_jsx_runtime.jsx)("div", {
99374
+ r[127] !== pX || r[128] !== VY ? (e4 = (0, import_jsx_runtime.jsx)("div", {
99373
99375
  className: "flex flex-1 flex-col items-center",
99374
99376
  children: (0, import_jsx_runtime.jsx)("div", {
99375
99377
  style: VY,
99376
99378
  className: "bg-background flex-1 border-t border-x rounded-t shadow-sm w-full overflow-hidden",
99377
99379
  children: pX
99378
99380
  })
99379
- }), r[126] = pX, r[127] = VY, r[128] = e4) : e4 = r[128], pX = e4;
99381
+ }), r[127] = pX, r[128] = VY, r[129] = e4) : e4 = r[129], pX = e4;
99380
99382
  }
99381
99383
  let e3 = y2.filter(_temp4$2), d2;
99382
- r[129] === _ ? d2 = r[130] : (d2 = (e4) => (0, import_jsx_runtime.jsx)(GridCell, {
99384
+ r[130] === _ ? d2 = r[131] : (d2 = (e4) => (0, import_jsx_runtime.jsx)(GridCell, {
99383
99385
  code: e4.code,
99384
99386
  mode: _,
99385
99387
  cellId: e4.id,
@@ -99387,7 +99389,7 @@ ${c}
99387
99389
  status: e4.status,
99388
99390
  isScrollable: false,
99389
99391
  hidden: false
99390
- }, e4.id), r[129] = _, r[130] = d2), bX = (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, {
99392
+ }, e4.id), r[130] = _, r[131] = d2), bX = (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, {
99391
99393
  children: [
99392
99394
  pX,
99393
99395
  (0, import_jsx_runtime.jsx)("div", {
@@ -99400,33 +99402,33 @@ ${c}
99400
99402
  }
99401
99403
  if (c.bordered) {
99402
99404
  let e3;
99403
- r[131] === pX ? e3 = r[132] : (e3 = (0, import_jsx_runtime.jsx)("div", {
99405
+ r[132] === pX ? e3 = r[133] : (e3 = (0, import_jsx_runtime.jsx)("div", {
99404
99406
  className: "h-full overflow-auto",
99405
99407
  children: pX
99406
- }), r[131] = pX, r[132] = e3);
99408
+ }), r[132] = pX, r[133] = e3);
99407
99409
  let c2;
99408
- r[133] !== VY || r[134] !== e3 ? (c2 = (0, import_jsx_runtime.jsx)("div", {
99410
+ r[134] !== VY || r[135] !== e3 ? (c2 = (0, import_jsx_runtime.jsx)("div", {
99409
99411
  style: VY,
99410
99412
  className: "bg-background border-t border-x rounded-t shadow-sm w-full mx-auto mt-4 h-[calc(100%-1rem)] overflow-hidden",
99411
99413
  children: e3
99412
- }), r[133] = VY, r[134] = e3, r[135] = c2) : c2 = r[135], pX = c2;
99414
+ }), r[134] = VY, r[135] = e3, r[136] = c2) : c2 = r[136], pX = c2;
99413
99415
  }
99414
- r[136] !== O || r[137] !== c || r[138] !== d ? (yX = (0, import_jsx_runtime.jsx)(GridControls, {
99416
+ r[137] !== O || r[138] !== c || r[139] !== d ? (yX = (0, import_jsx_runtime.jsx)(GridControls, {
99415
99417
  layout: c,
99416
99418
  setLayout: d,
99417
99419
  isLocked: O,
99418
99420
  setIsLocked: M
99419
- }), r[136] = O, r[137] = c, r[138] = d, r[139] = yX) : yX = r[139];
99421
+ }), r[137] = O, r[138] = c, r[139] = d, r[140] = yX) : yX = r[140];
99420
99422
  let w2;
99421
- r[140] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (_X = cn("relative flex z-10 flex-1 overflow-hidden"), w2 = cn("grow overflow-auto transparent-when-disconnected"), r[140] = _X, r[141] = w2) : (_X = r[140], w2 = r[141]), r[142] === pX ? vX = r[143] : (vX = (0, import_jsx_runtime.jsx)("div", {
99423
+ r[141] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (_X = cn("relative flex z-10 flex-1 overflow-hidden"), w2 = cn("grow overflow-auto transparent-when-disconnected"), r[141] = _X, r[142] = w2) : (_X = r[141], w2 = r[142]), r[143] === pX ? vX = r[144] : (vX = (0, import_jsx_runtime.jsx)("div", {
99422
99424
  className: w2,
99423
99425
  children: pX
99424
- }), r[142] = pX, r[143] = vX), mX = "flex-none flex flex-col w-[300px] p-2 pb-20 gap-2 overflow-auto bg-(--slate-2) border-t border-x rounded-t shadow-sm transparent-when-disconnected mx-2 mt-4", r[144] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (hX = (0, import_jsx_runtime.jsx)("div", {
99426
+ }), r[143] = pX, r[144] = vX), mX = "flex-none flex flex-col w-[300px] p-2 pb-20 gap-2 overflow-auto bg-(--slate-2) border-t border-x rounded-t shadow-sm transparent-when-disconnected mx-2 mt-4", r[145] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (hX = (0, import_jsx_runtime.jsx)("div", {
99425
99427
  className: "text font-bold text-(--slate-20) shrink-0",
99426
99428
  children: "Outputs"
99427
- }), r[144] = hX) : hX = r[144];
99429
+ }), r[145] = hX) : hX = r[145];
99428
99430
  let I2;
99429
- r[145] !== c.columns || r[146] !== c.rowHeight || r[147] !== _ ? (I2 = (e3) => (0, import_jsx_runtime.jsx)("div", {
99431
+ r[146] !== c.columns || r[147] !== c.rowHeight || r[148] !== _ ? (I2 = (e3) => (0, import_jsx_runtime.jsx)("div", {
99430
99432
  draggable: true,
99431
99433
  unselectable: "on",
99432
99434
  "data-cell-id": e3.id,
@@ -99449,34 +99451,34 @@ ${c}
99449
99451
  status: e3.status,
99450
99452
  hidden: false
99451
99453
  })
99452
- }, e3.id), r[145] = c.columns, r[146] = c.rowHeight, r[147] = _, r[148] = I2) : I2 = r[148], gX = y2.map(I2);
99454
+ }, e3.id), r[146] = c.columns, r[147] = c.rowHeight, r[148] = _, r[149] = I2) : I2 = r[149], gX = y2.map(I2);
99453
99455
  }
99454
- r[107] = f, r[108] = pX, r[109] = S, r[110] = O, r[111] = v, r[112] = c, r[113] = _, r[114] = d, r[115] = VY, r[116] = mX, r[117] = hX, r[118] = gX, r[119] = _X, r[120] = vX, r[121] = yX, r[122] = bX, r[123] = pX;
99455
- } else mX = r[116], hX = r[117], gX = r[118], _X = r[119], vX = r[120], yX = r[121], bX = r[122], pX = r[123];
99456
+ r[108] = f, r[109] = pX, r[110] = S, r[111] = O, r[112] = v, r[113] = c, r[114] = _, r[115] = d, r[116] = VY, r[117] = mX, r[118] = hX, r[119] = gX, r[120] = _X, r[121] = vX, r[122] = yX, r[123] = bX, r[124] = pX;
99457
+ } else mX = r[117], hX = r[118], gX = r[119], _X = r[120], vX = r[121], yX = r[122], bX = r[123], pX = r[124];
99456
99458
  if (bX !== /* @__PURE__ */ Symbol.for("react.early_return_sentinel")) return bX;
99457
99459
  let xX;
99458
- r[149] !== mX || r[150] !== hX || r[151] !== gX ? (xX = (0, import_jsx_runtime.jsxs)("div", {
99460
+ r[150] !== mX || r[151] !== hX || r[152] !== gX ? (xX = (0, import_jsx_runtime.jsxs)("div", {
99459
99461
  className: mX,
99460
99462
  children: [
99461
99463
  hX,
99462
99464
  gX
99463
99465
  ]
99464
- }), r[149] = mX, r[150] = hX, r[151] = gX, r[152] = xX) : xX = r[152];
99466
+ }), r[150] = mX, r[151] = hX, r[152] = gX, r[153] = xX) : xX = r[153];
99465
99467
  let SX;
99466
- r[153] !== _X || r[154] !== vX || r[155] !== xX ? (SX = (0, import_jsx_runtime.jsxs)("div", {
99468
+ r[154] !== _X || r[155] !== vX || r[156] !== xX ? (SX = (0, import_jsx_runtime.jsxs)("div", {
99467
99469
  className: _X,
99468
99470
  children: [
99469
99471
  vX,
99470
99472
  xX
99471
99473
  ]
99472
- }), r[153] = _X, r[154] = vX, r[155] = xX, r[156] = SX) : SX = r[156];
99474
+ }), r[154] = _X, r[155] = vX, r[156] = xX, r[157] = SX) : SX = r[157];
99473
99475
  let CX;
99474
- return r[157] !== yX || r[158] !== SX ? (CX = (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, {
99476
+ return r[158] !== yX || r[159] !== SX ? (CX = (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, {
99475
99477
  children: [
99476
99478
  yX,
99477
99479
  SX
99478
99480
  ]
99479
- }), r[157] = yX, r[158] = SX, r[159] = CX) : CX = r[159], CX;
99481
+ }), r[158] = yX, r[159] = SX, r[160] = CX) : CX = r[160], CX;
99480
99482
  };
99481
99483
  var GridCell = (0, import_react.memo)((e) => {
99482
99484
  let r = (0, import_compiler_runtime$9.c)(20), { output: c, cellId: d, status: f, mode: _, code: v, hidden: y, isScrollable: S, side: w, className: E } = e, O;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@marimo-team/islands",
3
- "version": "0.21.1-dev13",
3
+ "version": "0.21.1-dev15",
4
4
  "main": "dist/main.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "type": "module",
@@ -158,12 +158,19 @@ export const GridLayoutRenderer: React.FC<Props> = ({
158
158
  compactType={null}
159
159
  preventCollision={true}
160
160
  rowHeight={layout.rowHeight}
161
- onLayoutChange={(cellLayouts) =>
161
+ onLayoutChange={(cellLayouts) => {
162
+ // Don't update state in read mode — the layout is static and
163
+ // updating triggers a re-render cycle that causes an infinite loop
164
+ // (React error https://react.dev/errors/185 Maximum update depth exceeded).
165
+ // https://github.com/marimo-team/marimo/issues/8644
166
+ if (isReading) {
167
+ return;
168
+ }
162
169
  setLayout({
163
170
  ...layout,
164
171
  cells: cellLayouts,
165
- })
166
- }
172
+ });
173
+ }}
167
174
  droppingItem={
168
175
  droppingItem
169
176
  ? {
@@ -1115,6 +1115,60 @@ class Foo:
1115
1115
  `);
1116
1116
  });
1117
1117
 
1118
+ test("should not highlight attribute access matching a for-loop variable", () => {
1119
+ // When `tool` is used as a for-loop variable, `mcp.tool` (attribute access)
1120
+ // should NOT have `tool` highlighted — it's a property, not a variable reference.
1121
+ expect(
1122
+ runHighlight(
1123
+ ["mcp", "client"],
1124
+ `
1125
+ @mcp.tool
1126
+ def roll_dice():
1127
+ pass
1128
+
1129
+ async with client:
1130
+ for tool in await client.list_tools():
1131
+ print(tool)
1132
+ `,
1133
+ ),
1134
+ ).toMatchInlineSnapshot(`
1135
+ "
1136
+ @mcp.tool
1137
+ ^^^
1138
+ def roll_dice():
1139
+ pass
1140
+
1141
+ async with client:
1142
+ ^^^^^^
1143
+ for tool in await client.list_tools():
1144
+ ^^^^^^
1145
+ print(tool)
1146
+ "
1147
+ `);
1148
+ });
1149
+
1150
+ test("should not highlight property name matching a global variable", () => {
1151
+ // `tool` is a global variable, but `mcp.tool` should not highlight `tool`
1152
+ // because it's a property access, not a variable reference.
1153
+ expect(
1154
+ runHighlight(
1155
+ ["mcp", "tool"],
1156
+ `
1157
+ @mcp.tool
1158
+ def roll_dice():
1159
+ pass
1160
+ `,
1161
+ ),
1162
+ ).toMatchInlineSnapshot(`
1163
+ "
1164
+ @mcp.tool
1165
+ ^^^
1166
+ def roll_dice():
1167
+ pass
1168
+ "
1169
+ `);
1170
+ });
1171
+
1118
1172
  test("class property self-reference", () => {
1119
1173
  expect(
1120
1174
  runHighlight(
@@ -462,6 +462,7 @@ export function findReactiveVariables(options: {
462
462
  ): boolean {
463
463
  return (
464
464
  allVariableNames.has(varName) &&
465
+ !isPropertyAccess(cursor) &&
465
466
  !isKeywordArgumentName(cursor) &&
466
467
  !isAssignmentTarget(cursor)
467
468
  );
@@ -529,6 +530,19 @@ function isAssignmentTarget(cursor: TreeCursor): boolean {
529
530
  return false;
530
531
  }
531
532
 
533
+ /** Checks whether a `VariableName` is a property access (e.g. `tool` in `mcp.tool`). */
534
+ function isPropertyAccess(cursor: TreeCursor): boolean {
535
+ // Check if the previous sibling is a "." node, which means this
536
+ // VariableName is a property access rather than a standalone variable.
537
+ // This handles both MemberExpression (e.g. `obj.attr`) and Decorator
538
+ // (e.g. `@mcp.tool`) where the parser emits flat sibling nodes.
539
+ const temp = cursor.node.cursor();
540
+ if (temp.prevSibling() && temp.name === ".") {
541
+ return true;
542
+ }
543
+ return false;
544
+ }
545
+
532
546
  /**
533
547
  * Checks if the syntax tree contains any syntax errors.
534
548
  * If there are errors, we shouldn't show reactive variable highlighting.