Compare commits

...
Author SHA1 Message Date
Cursor AgentandDaniel Imms 467eb5a227 fix(addon-image): cast buffer line lookups to IBufferLineExt | undefined
Co-authored-by: Daniel Imms <Tyriar@users.noreply.github.com>
2026-06-06 16:26:54 +00:00
Daniel ImmsandCursor a8632435a6 fix(addon-image): skip missing lines in viewportResize
viewportResize walks the full buffer when the terminal widens but
called line.getBg without checking that lines.get(row) returned a
line. During resize or trim gaps that could throw and abort tile
expansion for remaining rows.

Skip missing buffer lines with continue, consistent with render().

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-03 03:36:42 +00:00
Cursor AgentandDaniel Imms a0919b9004 fix(addon-image): skip missing buffer lines in render
Co-authored-by: Daniel Imms <Tyriar@users.noreply.github.com>
2026-06-03 03:36:41 +00:00
Daniel ImmsandCursor b5e0cdb20c fix(addon-image): scan new columns on viewport width increase
viewportResize() should check whether cells in newly exposed columns
(oldCol + 1 through cols - 1) already have content before expanding
image tiles to the right. The loop used `rightCol > metrics.cols`,
which is false when widening (rightCol starts at oldCol + 1), so the
loop never ran, hasData stayed false, and tiles could overwrite cells
that already held text.

Use `rightCol < metrics.cols` so the emptiness check runs over the
intended column range.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-03 03:36:41 +00:00
ea75b99e2b fix(deps): override serialize-javascript to ^7.0.3 (#5989)
Mocha 11.7.x pulls in serialize-javascript 6.0.2, which is affected by
code injection via RegExp.flags and Date.toISOString (CVE incomplete fix).
Force the patched 7.x release via npm overrides.

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Daniel Imms <Tyriar@users.noreply.github.com>
2026-06-02 13:34:19 +00:00
3 changed files with 15 additions and 40 deletions
+7 -4
View File
@@ -431,8 +431,8 @@ export class ImageStorage implements IDisposable {
// because text writes clear the BG flag but leave image tile data intact.
// This lets top-layer images survive text overwrites (kitty C=1 behavior).
for (let row = start; row <= end; ++row) {
const line = buffer.lines.get(row + buffer.ydisp) as IBufferLineExt;
if (!line) return;
const line = buffer.lines.get(row + buffer.ydisp) as IBufferLineExt | undefined;
if (!line) continue;
for (let col = 0; col < cols; ++col) {
let e: IExtendedAttrsImage;
if (line.getBg(col) & BgFlags.HAS_EXTENDED) {
@@ -513,7 +513,10 @@ export class ImageStorage implements IDisposable {
const rows = buffer.lines.length;
const oldCol = this._viewportMetrics.cols - 1;
for (let row = 0; row < rows; ++row) {
const line = buffer.lines.get(row) as IBufferLineExt;
const line = buffer.lines.get(row) as IBufferLineExt | undefined;
if (!line) {
continue;
}
if (line.getBg(oldCol) & BgFlags.HAS_EXTENDED) {
const e: IExtendedAttrsImage = line._extendedAttrs[oldCol] ?? EMPTY_ATTRS;
const imageId = e.imageId;
@@ -531,7 +534,7 @@ export class ImageStorage implements IDisposable {
}
// expand only if right side is empty (nothing got wrapped from below)
let hasData = false;
for (let rightCol = oldCol + 1; rightCol > metrics.cols; ++rightCol) {
for (let rightCol = oldCol + 1; rightCol < metrics.cols; ++rightCol) {
if (line._data[rightCol * Cell.SIZE + Cell.CONTENT] & Content.HAS_CONTENT_MASK) {
hasData = true;
break;
+5 -36
View File
@@ -6689,16 +6689,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/randombytes": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
"integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"safe-buffer": "^5.1.0"
}
},
"node_modules/range-parser": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
@@ -6932,27 +6922,6 @@
"tslib": "^2.1.0"
}
},
"node_modules/safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "MIT"
},
"node_modules/safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
@@ -7078,13 +7047,13 @@
}
},
"node_modules/serialize-javascript": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
"integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
"version": "7.0.5",
"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-7.0.5.tgz",
"integrity": "sha512-F4LcB0UqUl1zErq+1nYEEzSHJnIwb3AF2XWB94b+afhrekOUijwooAYqFyRbjYkm2PAKBabx6oYv/xDxNi8IBw==",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
"randombytes": "^2.1.0"
"engines": {
"node": ">=20.0.0"
}
},
"node_modules/serve-static": {
+3
View File
@@ -11,6 +11,9 @@
"workspaces": [
"addons/*"
],
"overrides": {
"serialize-javascript": "^7.0.3"
},
"keywords": [
"cli",
"command-line",