fix(desktop): resolve permission overlay assets in bundled dev - #2045

Merged
Astro-Han merged 2 commits into
apache:mainfrom
Colafornia:fix/permission-overlay-bundled-assets
Aug 4, 2026
Merged

fix(desktop): resolve permission overlay assets in bundled dev#2045
Astro-Han merged 2 commits into
apache:mainfrom
Colafornia:fix/permission-overlay-bundled-assets

Conversation

@Colafornia

Copy link
Copy Markdown
Contributor
English

Summary

In bundled desktop development, the macOS guided-permission action opens System Settings but never displays its overlay card.

dev.mjs bundles the main process into dist/main/main.js, while overlayAssetDir() assumed the tsc layout at dist/main/permission-overlay/permission-overlay-main.js. Its fixed ../.. traversal therefore resolved to the nonexistent apps/desktop/overlay directory instead of dist/overlay, so Electron could not load the overlay preload or HTML.

This PR:

  • resolves permission-overlay assets by walking up to the nearest dist directory, matching the existing cursor/PiP overlay pattern;
  • uses that resolver for both the preload and HTML paths;
  • covers the bundled dev and tsc production layouts with a focused regression test.

The getFileIcon() native crash is already fixed on main by #1920 and is not part of this PR.

Reproduction

On macOS, with Accessibility or Screen Recording permission ungranted:

  1. Run npm --workspace @maka/desktop run dev.
  2. Open Settings → Permissions.
  3. Click the guided grant action.

Before this change, System Settings opens but the permission overlay card does not appear. The bundled module resolves assets as follows:

LayoutModule locationAsset directory
tsc productiondist/main/permission-overlay/permission-overlay-main.jsdist/overlay
esbuild dev bundledist/main/main.jsapps/desktop/overlay (missing)

After this change, both layouts resolve to dist/overlay.

Verification

  • npm --workspace @maka/desktop run build:workspace-deps
  • npm --workspace @maka/desktop run build:main
  • node --test apps/desktop/dist/main/__tests__/permission-overlay-path.test.js — 1 passed
  • git diff --check origin/main...HEAD

Not run: the post-fix macOS permission-onboarding flow or the full repository test suite.

中文

概要

在 bundled desktop 开发环境中,macOS 的“引导授权”操作会打开系统设置,但权限引导卡片不会出现。

dev.mjs 将主进程代码合并到 dist/main/main.js,而 overlayAssetDir() 假设模块位于 tsc 输出路径 dist/main/permission-overlay/permission-overlay-main.js。固定的 ../.. 因此解析到不存在的 apps/desktop/overlay,而不是 dist/overlay,导致 Electron 无法加载 overlay 的 preload 和 HTML。

本 PR:

  • 向上查找最近的 dist 目录来解析权限浮层资源,与现有 cursor/PiP overlay 的实现方式保持一致;
  • 将该解析逻辑用于 preload 和 HTML 路径;
  • 添加聚焦回归测试,覆盖 bundled dev 与 tsc production 两种布局。

getFileIcon() 原生崩溃已由 main 上的 #1920 修复,不属于本 PR。

复现路径

在 macOS 上,保持“辅助功能”或“屏幕录制”权限未授权:

  1. 运行 npm --workspace @maka/desktop run dev
  2. 打开“设置 → 权限”。
  3. 点击“引导授权”。

修改前,系统设置会打开,但权限引导卡片不会出现。bundled module 的资源解析结果如下:

布局模块位置资源目录
tsc productiondist/main/permission-overlay/permission-overlay-main.jsdist/overlay
esbuild dev bundledist/main/main.jsapps/desktop/overlay(不存在)

修改后,两种布局均解析到 dist/overlay

验证

  • npm --workspace @maka/desktop run build:workspace-deps
  • npm --workspace @maka/desktop run build:main
  • node --test apps/desktop/dist/main/__tests__/permission-overlay-path.test.js — 1 项通过
  • git diff --check origin/main...HEAD

未运行:修复后的 macOS 权限引导手动流程及完整仓库测试套件。

@Astro-HanAstro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved with a non-blocking suggestion

The fix is correct and follows the established seam. The dist-walk matches the cursor overlay's defaultOverlayDistDir() and PiP's defaultDistDir(), and the parameterized moduleUrl finally makes this walk-up logic unit-testable — the two existing copies have no test coverage at all, so this is a strict improvement.

One non-blocking observation: this is now the third byte-for-byte copy of the same walk-up resolver (cursor-overlay-window.ts, pip-electron.ts, and now permission-overlay-path.ts). That's the rule-of-three point. If you'd like, extracting a shared resolveOverlayAssetDir(moduleUrl = import.meta.url) into e.g. src/main/overlay-assets.ts and switching all three call sites would make the resolver a single source of truth — and the regression test you added would then cover the cursor/PiP paths for free, since they currently have zero coverage. Purely mechanical, low risk, and independent of this fix, so it can be a follow-up.

中文对照

批准,附带一个非阻塞建议

修复正确,且遵循了仓库既有的扩展点:向上查找 dist 的逻辑与 cursor overlay 的 defaultOverlayDistDir()、PiP 的 defaultDistDir() 一致;参数化的 moduleUrl 让这段 walk-up 逻辑第一次可以被单元测试——而现有的两份旧实现完全没有测试覆盖,因此这是净改进。

一个非阻塞观察:这已经是同一段 walk-up 解析器的第三份逐字节相同的复制cursor-overlay-window.tspip-electron.ts,以及现在的 permission-overlay-path.ts),恰好到了 rule-of-three 的提取时机。如果愿意,可以提取共享的 resolveOverlayAssetDir(moduleUrl = import.meta.url)(例如放到 src/main/overlay-assets.ts),三处调用点统一使用,这样你新增的回归测试也能顺带覆盖 cursor/PiP 路径——它们目前是零覆盖。这纯粹是机械替换、风险低,且与本次修复相互独立,可以作为 follow-up 单独做。

@Colafornia
Colaforniaforce-pushed the fix/permission-overlay-bundled-assets branch from 8642907 to 31f1262CompareAugust 4, 2026 01:50

@Astro-HanAstro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approve. The walk-up-to-nearest-dist resolver is correct for every current launch flow (bundled dev, tsc production, macOS dev app, asar), and the cursor/PiP refactor onto the shared resolver is behavior-preserving. Three notes for the record, none blocking: the no-dist fallback returns a silent wrong path (unreachable today, worth an existsSync check if the resolver is ever hardened); the test assertions are POSIX path literals (would break on a Windows runner, moot on the current CI matrix); the resolver diverges from the packaged-assets resourcesPath pattern, which only matters if overlay assets move to extraResources.

@Astro-Han
Astro-Han merged commit 1a4751f into apache:mainAug 4, 2026
11 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Colafornia@Astro-Han
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix(desktop): resolve permission overlay assets in bundled dev - #2045

Merged
Astro-Han merged 2 commits into
apache:mainfrom
Colafornia:fix/permission-overlay-bundled-assets
Aug 4, 2026
Merged

fix(desktop): resolve permission overlay assets in bundled dev#2045
Astro-Han merged 2 commits into
apache:mainfrom
Colafornia:fix/permission-overlay-bundled-assets

Conversation

@Colafornia

Copy link
Copy Markdown
Contributor
English

Summary

In bundled desktop development, the macOS guided-permission action opens System Settings but never displays its overlay card.

dev.mjs bundles the main process into dist/main/main.js, while overlayAssetDir() assumed the tsc layout at dist/main/permission-overlay/permission-overlay-main.js. Its fixed ../.. traversal therefore resolved to the nonexistent apps/desktop/overlay directory instead of dist/overlay, so Electron could not load the overlay preload or HTML.

This PR:

  • resolves permission-overlay assets by walking up to the nearest dist directory, matching the existing cursor/PiP overlay pattern;
  • uses that resolver for both the preload and HTML paths;
  • covers the bundled dev and tsc production layouts with a focused regression test.

The getFileIcon() native crash is already fixed on main by #1920 and is not part of this PR.

Reproduction

On macOS, with Accessibility or Screen Recording permission ungranted:

  1. Run npm --workspace @maka/desktop run dev.
  2. Open Settings → Permissions.
  3. Click the guided grant action.

Before this change, System Settings opens but the permission overlay card does not appear. The bundled module resolves assets as follows:

LayoutModule locationAsset directory
tsc productiondist/main/permission-overlay/permission-overlay-main.jsdist/overlay
esbuild dev bundledist/main/main.jsapps/desktop/overlay (missing)

After this change, both layouts resolve to dist/overlay.

Verification

  • npm --workspace @maka/desktop run build:workspace-deps
  • npm --workspace @maka/desktop run build:main
  • node --test apps/desktop/dist/main/__tests__/permission-overlay-path.test.js — 1 passed
  • git diff --check origin/main...HEAD

Not run: the post-fix macOS permission-onboarding flow or the full repository test suite.

中文

概要

在 bundled desktop 开发环境中,macOS 的“引导授权”操作会打开系统设置,但权限引导卡片不会出现。

dev.mjs 将主进程代码合并到 dist/main/main.js,而 overlayAssetDir() 假设模块位于 tsc 输出路径 dist/main/permission-overlay/permission-overlay-main.js。固定的 ../.. 因此解析到不存在的 apps/desktop/overlay,而不是 dist/overlay,导致 Electron 无法加载 overlay 的 preload 和 HTML。

本 PR:

  • 向上查找最近的 dist 目录来解析权限浮层资源,与现有 cursor/PiP overlay 的实现方式保持一致;
  • 将该解析逻辑用于 preload 和 HTML 路径;
  • 添加聚焦回归测试,覆盖 bundled dev 与 tsc production 两种布局。

getFileIcon() 原生崩溃已由 main 上的 #1920 修复,不属于本 PR。

复现路径

在 macOS 上,保持“辅助功能”或“屏幕录制”权限未授权:

  1. 运行 npm --workspace @maka/desktop run dev
  2. 打开“设置 → 权限”。
  3. 点击“引导授权”。

修改前,系统设置会打开,但权限引导卡片不会出现。bundled module 的资源解析结果如下:

布局模块位置资源目录
tsc productiondist/main/permission-overlay/permission-overlay-main.jsdist/overlay
esbuild dev bundledist/main/main.jsapps/desktop/overlay(不存在)

修改后,两种布局均解析到 dist/overlay

验证

  • npm --workspace @maka/desktop run build:workspace-deps
  • npm --workspace @maka/desktop run build:main
  • node --test apps/desktop/dist/main/__tests__/permission-overlay-path.test.js — 1 项通过
  • git diff --check origin/main...HEAD

未运行:修复后的 macOS 权限引导手动流程及完整仓库测试套件。

@Astro-HanAstro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved with a non-blocking suggestion

The fix is correct and follows the established seam. The dist-walk matches the cursor overlay's defaultOverlayDistDir() and PiP's defaultDistDir(), and the parameterized moduleUrl finally makes this walk-up logic unit-testable — the two existing copies have no test coverage at all, so this is a strict improvement.

One non-blocking observation: this is now the third byte-for-byte copy of the same walk-up resolver (cursor-overlay-window.ts, pip-electron.ts, and now permission-overlay-path.ts). That's the rule-of-three point. If you'd like, extracting a shared resolveOverlayAssetDir(moduleUrl = import.meta.url) into e.g. src/main/overlay-assets.ts and switching all three call sites would make the resolver a single source of truth — and the regression test you added would then cover the cursor/PiP paths for free, since they currently have zero coverage. Purely mechanical, low risk, and independent of this fix, so it can be a follow-up.

中文对照

批准,附带一个非阻塞建议

修复正确,且遵循了仓库既有的扩展点:向上查找 dist 的逻辑与 cursor overlay 的 defaultOverlayDistDir()、PiP 的 defaultDistDir() 一致;参数化的 moduleUrl 让这段 walk-up 逻辑第一次可以被单元测试——而现有的两份旧实现完全没有测试覆盖,因此这是净改进。

一个非阻塞观察:这已经是同一段 walk-up 解析器的第三份逐字节相同的复制cursor-overlay-window.tspip-electron.ts,以及现在的 permission-overlay-path.ts),恰好到了 rule-of-three 的提取时机。如果愿意,可以提取共享的 resolveOverlayAssetDir(moduleUrl = import.meta.url)(例如放到 src/main/overlay-assets.ts),三处调用点统一使用,这样你新增的回归测试也能顺带覆盖 cursor/PiP 路径——它们目前是零覆盖。这纯粹是机械替换、风险低,且与本次修复相互独立,可以作为 follow-up 单独做。

@Colafornia
Colaforniaforce-pushed the fix/permission-overlay-bundled-assets branch from 8642907 to 31f1262CompareAugust 4, 2026 01:50

@Astro-HanAstro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approve. The walk-up-to-nearest-dist resolver is correct for every current launch flow (bundled dev, tsc production, macOS dev app, asar), and the cursor/PiP refactor onto the shared resolver is behavior-preserving. Three notes for the record, none blocking: the no-dist fallback returns a silent wrong path (unreachable today, worth an existsSync check if the resolver is ever hardened); the test assertions are POSIX path literals (would break on a Windows runner, moot on the current CI matrix); the resolver diverges from the packaged-assets resourcesPath pattern, which only matters if overlay assets move to extraResources.

@Astro-Han
Astro-Han merged commit 1a4751f into apache:mainAug 4, 2026
11 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Colafornia@Astro-Han
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(desktop): resolve permission overlay assets in bundled dev - #2045

Merged
Astro-Han merged 2 commits into
apache:mainfrom
Colafornia:fix/permission-overlay-bundled-assets
Aug 4, 2026
Merged

fix(desktop): resolve permission overlay assets in bundled dev#2045
Astro-Han merged 2 commits into
apache:mainfrom
Colafornia:fix/permission-overlay-bundled-assets

Conversation

@Colafornia

Copy link
Copy Markdown
Contributor
English

Summary

In bundled desktop development, the macOS guided-permission action opens System Settings but never displays its overlay card.

dev.mjs bundles the main process into dist/main/main.js, while overlayAssetDir() assumed the tsc layout at dist/main/permission-overlay/permission-overlay-main.js. Its fixed ../.. traversal therefore resolved to the nonexistent apps/desktop/overlay directory instead of dist/overlay, so Electron could not load the overlay preload or HTML.

This PR:

  • resolves permission-overlay assets by walking up to the nearest dist directory, matching the existing cursor/PiP overlay pattern;
  • uses that resolver for both the preload and HTML paths;
  • covers the bundled dev and tsc production layouts with a focused regression test.

The getFileIcon() native crash is already fixed on main by #1920 and is not part of this PR.

Reproduction

On macOS, with Accessibility or Screen Recording permission ungranted:

  1. Run npm --workspace @maka/desktop run dev.
  2. Open Settings → Permissions.
  3. Click the guided grant action.

Before this change, System Settings opens but the permission overlay card does not appear. The bundled module resolves assets as follows:

LayoutModule locationAsset directory
tsc productiondist/main/permission-overlay/permission-overlay-main.jsdist/overlay
esbuild dev bundledist/main/main.jsapps/desktop/overlay (missing)

After this change, both layouts resolve to dist/overlay.

Verification

  • npm --workspace @maka/desktop run build:workspace-deps
  • npm --workspace @maka/desktop run build:main
  • node --test apps/desktop/dist/main/__tests__/permission-overlay-path.test.js — 1 passed
  • git diff --check origin/main...HEAD

Not run: the post-fix macOS permission-onboarding flow or the full repository test suite.

中文

概要

在 bundled desktop 开发环境中,macOS 的“引导授权”操作会打开系统设置,但权限引导卡片不会出现。

dev.mjs 将主进程代码合并到 dist/main/main.js,而 overlayAssetDir() 假设模块位于 tsc 输出路径 dist/main/permission-overlay/permission-overlay-main.js。固定的 ../.. 因此解析到不存在的 apps/desktop/overlay,而不是 dist/overlay,导致 Electron 无法加载 overlay 的 preload 和 HTML。

本 PR:

  • 向上查找最近的 dist 目录来解析权限浮层资源,与现有 cursor/PiP overlay 的实现方式保持一致;
  • 将该解析逻辑用于 preload 和 HTML 路径;
  • 添加聚焦回归测试,覆盖 bundled dev 与 tsc production 两种布局。

getFileIcon() 原生崩溃已由 main 上的 #1920 修复,不属于本 PR。

复现路径

在 macOS 上,保持“辅助功能”或“屏幕录制”权限未授权:

  1. 运行 npm --workspace @maka/desktop run dev
  2. 打开“设置 → 权限”。
  3. 点击“引导授权”。

修改前,系统设置会打开,但权限引导卡片不会出现。bundled module 的资源解析结果如下:

布局模块位置资源目录
tsc productiondist/main/permission-overlay/permission-overlay-main.jsdist/overlay
esbuild dev bundledist/main/main.jsapps/desktop/overlay(不存在)

修改后,两种布局均解析到 dist/overlay

验证

  • npm --workspace @maka/desktop run build:workspace-deps
  • npm --workspace @maka/desktop run build:main
  • node --test apps/desktop/dist/main/__tests__/permission-overlay-path.test.js — 1 项通过
  • git diff --check origin/main...HEAD

未运行:修复后的 macOS 权限引导手动流程及完整仓库测试套件。

@Astro-HanAstro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved with a non-blocking suggestion

The fix is correct and follows the established seam. The dist-walk matches the cursor overlay's defaultOverlayDistDir() and PiP's defaultDistDir(), and the parameterized moduleUrl finally makes this walk-up logic unit-testable — the two existing copies have no test coverage at all, so this is a strict improvement.

One non-blocking observation: this is now the third byte-for-byte copy of the same walk-up resolver (cursor-overlay-window.ts, pip-electron.ts, and now permission-overlay-path.ts). That's the rule-of-three point. If you'd like, extracting a shared resolveOverlayAssetDir(moduleUrl = import.meta.url) into e.g. src/main/overlay-assets.ts and switching all three call sites would make the resolver a single source of truth — and the regression test you added would then cover the cursor/PiP paths for free, since they currently have zero coverage. Purely mechanical, low risk, and independent of this fix, so it can be a follow-up.

中文对照

批准,附带一个非阻塞建议

修复正确,且遵循了仓库既有的扩展点:向上查找 dist 的逻辑与 cursor overlay 的 defaultOverlayDistDir()、PiP 的 defaultDistDir() 一致;参数化的 moduleUrl 让这段 walk-up 逻辑第一次可以被单元测试——而现有的两份旧实现完全没有测试覆盖,因此这是净改进。

一个非阻塞观察:这已经是同一段 walk-up 解析器的第三份逐字节相同的复制cursor-overlay-window.tspip-electron.ts,以及现在的 permission-overlay-path.ts),恰好到了 rule-of-three 的提取时机。如果愿意,可以提取共享的 resolveOverlayAssetDir(moduleUrl = import.meta.url)(例如放到 src/main/overlay-assets.ts),三处调用点统一使用,这样你新增的回归测试也能顺带覆盖 cursor/PiP 路径——它们目前是零覆盖。这纯粹是机械替换、风险低,且与本次修复相互独立,可以作为 follow-up 单独做。

@Colafornia
Colaforniaforce-pushed the fix/permission-overlay-bundled-assets branch from 8642907 to 31f1262CompareAugust 4, 2026 01:50

@Astro-HanAstro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approve. The walk-up-to-nearest-dist resolver is correct for every current launch flow (bundled dev, tsc production, macOS dev app, asar), and the cursor/PiP refactor onto the shared resolver is behavior-preserving. Three notes for the record, none blocking: the no-dist fallback returns a silent wrong path (unreachable today, worth an existsSync check if the resolver is ever hardened); the test assertions are POSIX path literals (would break on a Windows runner, moot on the current CI matrix); the resolver diverges from the packaged-assets resourcesPath pattern, which only matters if overlay assets move to extraResources.

@Astro-Han
Astro-Han merged commit 1a4751f into apache:mainAug 4, 2026
11 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Colafornia@Astro-Han
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(desktop): resolve permission overlay assets in bundled dev - #2045

Merged
Astro-Han merged 2 commits into
apache:mainfrom
Colafornia:fix/permission-overlay-bundled-assets
Aug 4, 2026
Merged

fix(desktop): resolve permission overlay assets in bundled dev#2045
Astro-Han merged 2 commits into
apache:mainfrom
Colafornia:fix/permission-overlay-bundled-assets

Conversation

@Colafornia

Copy link
Copy Markdown
Contributor
English

Summary

In bundled desktop development, the macOS guided-permission action opens System Settings but never displays its overlay card.

dev.mjs bundles the main process into dist/main/main.js, while overlayAssetDir() assumed the tsc layout at dist/main/permission-overlay/permission-overlay-main.js. Its fixed ../.. traversal therefore resolved to the nonexistent apps/desktop/overlay directory instead of dist/overlay, so Electron could not load the overlay preload or HTML.

This PR:

  • resolves permission-overlay assets by walking up to the nearest dist directory, matching the existing cursor/PiP overlay pattern;
  • uses that resolver for both the preload and HTML paths;
  • covers the bundled dev and tsc production layouts with a focused regression test.

The getFileIcon() native crash is already fixed on main by #1920 and is not part of this PR.

Reproduction

On macOS, with Accessibility or Screen Recording permission ungranted:

  1. Run npm --workspace @maka/desktop run dev.
  2. Open Settings → Permissions.
  3. Click the guided grant action.

Before this change, System Settings opens but the permission overlay card does not appear. The bundled module resolves assets as follows:

LayoutModule locationAsset directory
tsc productiondist/main/permission-overlay/permission-overlay-main.jsdist/overlay
esbuild dev bundledist/main/main.jsapps/desktop/overlay (missing)

After this change, both layouts resolve to dist/overlay.

Verification

  • npm --workspace @maka/desktop run build:workspace-deps
  • npm --workspace @maka/desktop run build:main
  • node --test apps/desktop/dist/main/__tests__/permission-overlay-path.test.js — 1 passed
  • git diff --check origin/main...HEAD

Not run: the post-fix macOS permission-onboarding flow or the full repository test suite.

中文

概要

在 bundled desktop 开发环境中,macOS 的“引导授权”操作会打开系统设置,但权限引导卡片不会出现。

dev.mjs 将主进程代码合并到 dist/main/main.js,而 overlayAssetDir() 假设模块位于 tsc 输出路径 dist/main/permission-overlay/permission-overlay-main.js。固定的 ../.. 因此解析到不存在的 apps/desktop/overlay,而不是 dist/overlay,导致 Electron 无法加载 overlay 的 preload 和 HTML。

本 PR:

  • 向上查找最近的 dist 目录来解析权限浮层资源,与现有 cursor/PiP overlay 的实现方式保持一致;
  • 将该解析逻辑用于 preload 和 HTML 路径;
  • 添加聚焦回归测试,覆盖 bundled dev 与 tsc production 两种布局。

getFileIcon() 原生崩溃已由 main 上的 #1920 修复,不属于本 PR。

复现路径

在 macOS 上,保持“辅助功能”或“屏幕录制”权限未授权:

  1. 运行 npm --workspace @maka/desktop run dev
  2. 打开“设置 → 权限”。
  3. 点击“引导授权”。

修改前,系统设置会打开,但权限引导卡片不会出现。bundled module 的资源解析结果如下:

布局模块位置资源目录
tsc productiondist/main/permission-overlay/permission-overlay-main.jsdist/overlay
esbuild dev bundledist/main/main.jsapps/desktop/overlay(不存在)

修改后,两种布局均解析到 dist/overlay

验证

  • npm --workspace @maka/desktop run build:workspace-deps
  • npm --workspace @maka/desktop run build:main
  • node --test apps/desktop/dist/main/__tests__/permission-overlay-path.test.js — 1 项通过
  • git diff --check origin/main...HEAD

未运行:修复后的 macOS 权限引导手动流程及完整仓库测试套件。

@Astro-HanAstro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved with a non-blocking suggestion

The fix is correct and follows the established seam. The dist-walk matches the cursor overlay's defaultOverlayDistDir() and PiP's defaultDistDir(), and the parameterized moduleUrl finally makes this walk-up logic unit-testable — the two existing copies have no test coverage at all, so this is a strict improvement.

One non-blocking observation: this is now the third byte-for-byte copy of the same walk-up resolver (cursor-overlay-window.ts, pip-electron.ts, and now permission-overlay-path.ts). That's the rule-of-three point. If you'd like, extracting a shared resolveOverlayAssetDir(moduleUrl = import.meta.url) into e.g. src/main/overlay-assets.ts and switching all three call sites would make the resolver a single source of truth — and the regression test you added would then cover the cursor/PiP paths for free, since they currently have zero coverage. Purely mechanical, low risk, and independent of this fix, so it can be a follow-up.

中文对照

批准,附带一个非阻塞建议

修复正确,且遵循了仓库既有的扩展点:向上查找 dist 的逻辑与 cursor overlay 的 defaultOverlayDistDir()、PiP 的 defaultDistDir() 一致;参数化的 moduleUrl 让这段 walk-up 逻辑第一次可以被单元测试——而现有的两份旧实现完全没有测试覆盖,因此这是净改进。

一个非阻塞观察:这已经是同一段 walk-up 解析器的第三份逐字节相同的复制cursor-overlay-window.tspip-electron.ts,以及现在的 permission-overlay-path.ts),恰好到了 rule-of-three 的提取时机。如果愿意,可以提取共享的 resolveOverlayAssetDir(moduleUrl = import.meta.url)(例如放到 src/main/overlay-assets.ts),三处调用点统一使用,这样你新增的回归测试也能顺带覆盖 cursor/PiP 路径——它们目前是零覆盖。这纯粹是机械替换、风险低,且与本次修复相互独立,可以作为 follow-up 单独做。

@Colafornia
Colaforniaforce-pushed the fix/permission-overlay-bundled-assets branch from 8642907 to 31f1262CompareAugust 4, 2026 01:50

@Astro-HanAstro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approve. The walk-up-to-nearest-dist resolver is correct for every current launch flow (bundled dev, tsc production, macOS dev app, asar), and the cursor/PiP refactor onto the shared resolver is behavior-preserving. Three notes for the record, none blocking: the no-dist fallback returns a silent wrong path (unreachable today, worth an existsSync check if the resolver is ever hardened); the test assertions are POSIX path literals (would break on a Windows runner, moot on the current CI matrix); the resolver diverges from the packaged-assets resourcesPath pattern, which only matters if overlay assets move to extraResources.

@Astro-Han
Astro-Han merged commit 1a4751f into apache:mainAug 4, 2026
11 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Colafornia@Astro-Han
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix(desktop): resolve permission overlay assets in bundled dev - #2045

Merged
Astro-Han merged 2 commits into
apache:mainfrom
Colafornia:fix/permission-overlay-bundled-assets
Aug 4, 2026
Merged

fix(desktop): resolve permission overlay assets in bundled dev#2045
Astro-Han merged 2 commits into
apache:mainfrom
Colafornia:fix/permission-overlay-bundled-assets

Conversation

@Colafornia

Copy link
Copy Markdown
Contributor
English

Summary

In bundled desktop development, the macOS guided-permission action opens System Settings but never displays its overlay card.

dev.mjs bundles the main process into dist/main/main.js, while overlayAssetDir() assumed the tsc layout at dist/main/permission-overlay/permission-overlay-main.js. Its fixed ../.. traversal therefore resolved to the nonexistent apps/desktop/overlay directory instead of dist/overlay, so Electron could not load the overlay preload or HTML.

This PR:

  • resolves permission-overlay assets by walking up to the nearest dist directory, matching the existing cursor/PiP overlay pattern;
  • uses that resolver for both the preload and HTML paths;
  • covers the bundled dev and tsc production layouts with a focused regression test.

The getFileIcon() native crash is already fixed on main by #1920 and is not part of this PR.

Reproduction

On macOS, with Accessibility or Screen Recording permission ungranted:

  1. Run npm --workspace @maka/desktop run dev.
  2. Open Settings → Permissions.
  3. Click the guided grant action.

Before this change, System Settings opens but the permission overlay card does not appear. The bundled module resolves assets as follows:

LayoutModule locationAsset directory
tsc productiondist/main/permission-overlay/permission-overlay-main.jsdist/overlay
esbuild dev bundledist/main/main.jsapps/desktop/overlay (missing)

After this change, both layouts resolve to dist/overlay.

Verification

  • npm --workspace @maka/desktop run build:workspace-deps
  • npm --workspace @maka/desktop run build:main
  • node --test apps/desktop/dist/main/__tests__/permission-overlay-path.test.js — 1 passed
  • git diff --check origin/main...HEAD

Not run: the post-fix macOS permission-onboarding flow or the full repository test suite.

中文

概要

在 bundled desktop 开发环境中,macOS 的“引导授权”操作会打开系统设置,但权限引导卡片不会出现。

dev.mjs 将主进程代码合并到 dist/main/main.js,而 overlayAssetDir() 假设模块位于 tsc 输出路径 dist/main/permission-overlay/permission-overlay-main.js。固定的 ../.. 因此解析到不存在的 apps/desktop/overlay,而不是 dist/overlay,导致 Electron 无法加载 overlay 的 preload 和 HTML。

本 PR:

  • 向上查找最近的 dist 目录来解析权限浮层资源,与现有 cursor/PiP overlay 的实现方式保持一致;
  • 将该解析逻辑用于 preload 和 HTML 路径;
  • 添加聚焦回归测试,覆盖 bundled dev 与 tsc production 两种布局。

getFileIcon() 原生崩溃已由 main 上的 #1920 修复,不属于本 PR。

复现路径

在 macOS 上,保持“辅助功能”或“屏幕录制”权限未授权:

  1. 运行 npm --workspace @maka/desktop run dev
  2. 打开“设置 → 权限”。
  3. 点击“引导授权”。

修改前,系统设置会打开,但权限引导卡片不会出现。bundled module 的资源解析结果如下:

布局模块位置资源目录
tsc productiondist/main/permission-overlay/permission-overlay-main.jsdist/overlay
esbuild dev bundledist/main/main.jsapps/desktop/overlay(不存在)

修改后,两种布局均解析到 dist/overlay

验证

  • npm --workspace @maka/desktop run build:workspace-deps
  • npm --workspace @maka/desktop run build:main
  • node --test apps/desktop/dist/main/__tests__/permission-overlay-path.test.js — 1 项通过
  • git diff --check origin/main...HEAD

未运行:修复后的 macOS 权限引导手动流程及完整仓库测试套件。

@Astro-HanAstro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved with a non-blocking suggestion

The fix is correct and follows the established seam. The dist-walk matches the cursor overlay's defaultOverlayDistDir() and PiP's defaultDistDir(), and the parameterized moduleUrl finally makes this walk-up logic unit-testable — the two existing copies have no test coverage at all, so this is a strict improvement.

One non-blocking observation: this is now the third byte-for-byte copy of the same walk-up resolver (cursor-overlay-window.ts, pip-electron.ts, and now permission-overlay-path.ts). That's the rule-of-three point. If you'd like, extracting a shared resolveOverlayAssetDir(moduleUrl = import.meta.url) into e.g. src/main/overlay-assets.ts and switching all three call sites would make the resolver a single source of truth — and the regression test you added would then cover the cursor/PiP paths for free, since they currently have zero coverage. Purely mechanical, low risk, and independent of this fix, so it can be a follow-up.

中文对照

批准,附带一个非阻塞建议

修复正确,且遵循了仓库既有的扩展点:向上查找 dist 的逻辑与 cursor overlay 的 defaultOverlayDistDir()、PiP 的 defaultDistDir() 一致;参数化的 moduleUrl 让这段 walk-up 逻辑第一次可以被单元测试——而现有的两份旧实现完全没有测试覆盖,因此这是净改进。

一个非阻塞观察:这已经是同一段 walk-up 解析器的第三份逐字节相同的复制cursor-overlay-window.tspip-electron.ts,以及现在的 permission-overlay-path.ts),恰好到了 rule-of-three 的提取时机。如果愿意,可以提取共享的 resolveOverlayAssetDir(moduleUrl = import.meta.url)(例如放到 src/main/overlay-assets.ts),三处调用点统一使用,这样你新增的回归测试也能顺带覆盖 cursor/PiP 路径——它们目前是零覆盖。这纯粹是机械替换、风险低,且与本次修复相互独立,可以作为 follow-up 单独做。

@Colafornia
Colaforniaforce-pushed the fix/permission-overlay-bundled-assets branch from 8642907 to 31f1262CompareAugust 4, 2026 01:50

@Astro-HanAstro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approve. The walk-up-to-nearest-dist resolver is correct for every current launch flow (bundled dev, tsc production, macOS dev app, asar), and the cursor/PiP refactor onto the shared resolver is behavior-preserving. Three notes for the record, none blocking: the no-dist fallback returns a silent wrong path (unreachable today, worth an existsSync check if the resolver is ever hardened); the test assertions are POSIX path literals (would break on a Windows runner, moot on the current CI matrix); the resolver diverges from the packaged-assets resourcesPath pattern, which only matters if overlay assets move to extraResources.

@Astro-Han
Astro-Han merged commit 1a4751f into apache:mainAug 4, 2026
11 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Colafornia@Astro-Han
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(desktop): resolve permission overlay assets in bundled dev - #2045

Merged
Astro-Han merged 2 commits into
apache:mainfrom
Colafornia:fix/permission-overlay-bundled-assets
Aug 4, 2026
Merged

fix(desktop): resolve permission overlay assets in bundled dev#2045
Astro-Han merged 2 commits into
apache:mainfrom
Colafornia:fix/permission-overlay-bundled-assets

Conversation

@Colafornia

Copy link
Copy Markdown
Contributor
English

Summary

In bundled desktop development, the macOS guided-permission action opens System Settings but never displays its overlay card.

dev.mjs bundles the main process into dist/main/main.js, while overlayAssetDir() assumed the tsc layout at dist/main/permission-overlay/permission-overlay-main.js. Its fixed ../.. traversal therefore resolved to the nonexistent apps/desktop/overlay directory instead of dist/overlay, so Electron could not load the overlay preload or HTML.

This PR:

  • resolves permission-overlay assets by walking up to the nearest dist directory, matching the existing cursor/PiP overlay pattern;
  • uses that resolver for both the preload and HTML paths;
  • covers the bundled dev and tsc production layouts with a focused regression test.

The getFileIcon() native crash is already fixed on main by #1920 and is not part of this PR.

Reproduction

On macOS, with Accessibility or Screen Recording permission ungranted:

  1. Run npm --workspace @maka/desktop run dev.
  2. Open Settings → Permissions.
  3. Click the guided grant action.

Before this change, System Settings opens but the permission overlay card does not appear. The bundled module resolves assets as follows:

LayoutModule locationAsset directory
tsc productiondist/main/permission-overlay/permission-overlay-main.jsdist/overlay
esbuild dev bundledist/main/main.jsapps/desktop/overlay (missing)

After this change, both layouts resolve to dist/overlay.

Verification

  • npm --workspace @maka/desktop run build:workspace-deps
  • npm --workspace @maka/desktop run build:main
  • node --test apps/desktop/dist/main/__tests__/permission-overlay-path.test.js — 1 passed
  • git diff --check origin/main...HEAD

Not run: the post-fix macOS permission-onboarding flow or the full repository test suite.

中文

概要

在 bundled desktop 开发环境中,macOS 的“引导授权”操作会打开系统设置,但权限引导卡片不会出现。

dev.mjs 将主进程代码合并到 dist/main/main.js,而 overlayAssetDir() 假设模块位于 tsc 输出路径 dist/main/permission-overlay/permission-overlay-main.js。固定的 ../.. 因此解析到不存在的 apps/desktop/overlay,而不是 dist/overlay,导致 Electron 无法加载 overlay 的 preload 和 HTML。

本 PR:

  • 向上查找最近的 dist 目录来解析权限浮层资源,与现有 cursor/PiP overlay 的实现方式保持一致;
  • 将该解析逻辑用于 preload 和 HTML 路径;
  • 添加聚焦回归测试,覆盖 bundled dev 与 tsc production 两种布局。

getFileIcon() 原生崩溃已由 main 上的 #1920 修复,不属于本 PR。

复现路径

在 macOS 上,保持“辅助功能”或“屏幕录制”权限未授权:

  1. 运行 npm --workspace @maka/desktop run dev
  2. 打开“设置 → 权限”。
  3. 点击“引导授权”。

修改前,系统设置会打开,但权限引导卡片不会出现。bundled module 的资源解析结果如下:

布局模块位置资源目录
tsc productiondist/main/permission-overlay/permission-overlay-main.jsdist/overlay
esbuild dev bundledist/main/main.jsapps/desktop/overlay(不存在)

修改后,两种布局均解析到 dist/overlay

验证

  • npm --workspace @maka/desktop run build:workspace-deps
  • npm --workspace @maka/desktop run build:main
  • node --test apps/desktop/dist/main/__tests__/permission-overlay-path.test.js — 1 项通过
  • git diff --check origin/main...HEAD

未运行:修复后的 macOS 权限引导手动流程及完整仓库测试套件。

@Astro-HanAstro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved with a non-blocking suggestion

The fix is correct and follows the established seam. The dist-walk matches the cursor overlay's defaultOverlayDistDir() and PiP's defaultDistDir(), and the parameterized moduleUrl finally makes this walk-up logic unit-testable — the two existing copies have no test coverage at all, so this is a strict improvement.

One non-blocking observation: this is now the third byte-for-byte copy of the same walk-up resolver (cursor-overlay-window.ts, pip-electron.ts, and now permission-overlay-path.ts). That's the rule-of-three point. If you'd like, extracting a shared resolveOverlayAssetDir(moduleUrl = import.meta.url) into e.g. src/main/overlay-assets.ts and switching all three call sites would make the resolver a single source of truth — and the regression test you added would then cover the cursor/PiP paths for free, since they currently have zero coverage. Purely mechanical, low risk, and independent of this fix, so it can be a follow-up.

中文对照

批准,附带一个非阻塞建议

修复正确,且遵循了仓库既有的扩展点:向上查找 dist 的逻辑与 cursor overlay 的 defaultOverlayDistDir()、PiP 的 defaultDistDir() 一致;参数化的 moduleUrl 让这段 walk-up 逻辑第一次可以被单元测试——而现有的两份旧实现完全没有测试覆盖,因此这是净改进。

一个非阻塞观察:这已经是同一段 walk-up 解析器的第三份逐字节相同的复制cursor-overlay-window.tspip-electron.ts,以及现在的 permission-overlay-path.ts),恰好到了 rule-of-three 的提取时机。如果愿意,可以提取共享的 resolveOverlayAssetDir(moduleUrl = import.meta.url)(例如放到 src/main/overlay-assets.ts),三处调用点统一使用,这样你新增的回归测试也能顺带覆盖 cursor/PiP 路径——它们目前是零覆盖。这纯粹是机械替换、风险低,且与本次修复相互独立,可以作为 follow-up 单独做。

@Colafornia
Colaforniaforce-pushed the fix/permission-overlay-bundled-assets branch from 8642907 to 31f1262CompareAugust 4, 2026 01:50

@Astro-HanAstro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approve. The walk-up-to-nearest-dist resolver is correct for every current launch flow (bundled dev, tsc production, macOS dev app, asar), and the cursor/PiP refactor onto the shared resolver is behavior-preserving. Three notes for the record, none blocking: the no-dist fallback returns a silent wrong path (unreachable today, worth an existsSync check if the resolver is ever hardened); the test assertions are POSIX path literals (would break on a Windows runner, moot on the current CI matrix); the resolver diverges from the packaged-assets resourcesPath pattern, which only matters if overlay assets move to extraResources.

@Astro-Han
Astro-Han merged commit 1a4751f into apache:mainAug 4, 2026
11 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Colafornia@Astro-Han
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(desktop): resolve permission overlay assets in bundled dev - #2045

Merged
Astro-Han merged 2 commits into
apache:mainfrom
Colafornia:fix/permission-overlay-bundled-assets
Aug 4, 2026
Merged

fix(desktop): resolve permission overlay assets in bundled dev#2045
Astro-Han merged 2 commits into
apache:mainfrom
Colafornia:fix/permission-overlay-bundled-assets

Conversation

@Colafornia

Copy link
Copy Markdown
Contributor
English

Summary

In bundled desktop development, the macOS guided-permission action opens System Settings but never displays its overlay card.

dev.mjs bundles the main process into dist/main/main.js, while overlayAssetDir() assumed the tsc layout at dist/main/permission-overlay/permission-overlay-main.js. Its fixed ../.. traversal therefore resolved to the nonexistent apps/desktop/overlay directory instead of dist/overlay, so Electron could not load the overlay preload or HTML.

This PR:

  • resolves permission-overlay assets by walking up to the nearest dist directory, matching the existing cursor/PiP overlay pattern;
  • uses that resolver for both the preload and HTML paths;
  • covers the bundled dev and tsc production layouts with a focused regression test.

The getFileIcon() native crash is already fixed on main by #1920 and is not part of this PR.

Reproduction

On macOS, with Accessibility or Screen Recording permission ungranted:

  1. Run npm --workspace @maka/desktop run dev.
  2. Open Settings → Permissions.
  3. Click the guided grant action.

Before this change, System Settings opens but the permission overlay card does not appear. The bundled module resolves assets as follows:

LayoutModule locationAsset directory
tsc productiondist/main/permission-overlay/permission-overlay-main.jsdist/overlay
esbuild dev bundledist/main/main.jsapps/desktop/overlay (missing)

After this change, both layouts resolve to dist/overlay.

Verification

  • npm --workspace @maka/desktop run build:workspace-deps
  • npm --workspace @maka/desktop run build:main
  • node --test apps/desktop/dist/main/__tests__/permission-overlay-path.test.js — 1 passed
  • git diff --check origin/main...HEAD

Not run: the post-fix macOS permission-onboarding flow or the full repository test suite.

中文

概要

在 bundled desktop 开发环境中,macOS 的“引导授权”操作会打开系统设置,但权限引导卡片不会出现。

dev.mjs 将主进程代码合并到 dist/main/main.js,而 overlayAssetDir() 假设模块位于 tsc 输出路径 dist/main/permission-overlay/permission-overlay-main.js。固定的 ../.. 因此解析到不存在的 apps/desktop/overlay,而不是 dist/overlay,导致 Electron 无法加载 overlay 的 preload 和 HTML。

本 PR:

  • 向上查找最近的 dist 目录来解析权限浮层资源,与现有 cursor/PiP overlay 的实现方式保持一致;
  • 将该解析逻辑用于 preload 和 HTML 路径;
  • 添加聚焦回归测试,覆盖 bundled dev 与 tsc production 两种布局。

getFileIcon() 原生崩溃已由 main 上的 #1920 修复,不属于本 PR。

复现路径

在 macOS 上,保持“辅助功能”或“屏幕录制”权限未授权:

  1. 运行 npm --workspace @maka/desktop run dev
  2. 打开“设置 → 权限”。
  3. 点击“引导授权”。

修改前,系统设置会打开,但权限引导卡片不会出现。bundled module 的资源解析结果如下:

布局模块位置资源目录
tsc productiondist/main/permission-overlay/permission-overlay-main.jsdist/overlay
esbuild dev bundledist/main/main.jsapps/desktop/overlay(不存在)

修改后,两种布局均解析到 dist/overlay

验证

  • npm --workspace @maka/desktop run build:workspace-deps
  • npm --workspace @maka/desktop run build:main
  • node --test apps/desktop/dist/main/__tests__/permission-overlay-path.test.js — 1 项通过
  • git diff --check origin/main...HEAD

未运行:修复后的 macOS 权限引导手动流程及完整仓库测试套件。

@Astro-HanAstro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved with a non-blocking suggestion

The fix is correct and follows the established seam. The dist-walk matches the cursor overlay's defaultOverlayDistDir() and PiP's defaultDistDir(), and the parameterized moduleUrl finally makes this walk-up logic unit-testable — the two existing copies have no test coverage at all, so this is a strict improvement.

One non-blocking observation: this is now the third byte-for-byte copy of the same walk-up resolver (cursor-overlay-window.ts, pip-electron.ts, and now permission-overlay-path.ts). That's the rule-of-three point. If you'd like, extracting a shared resolveOverlayAssetDir(moduleUrl = import.meta.url) into e.g. src/main/overlay-assets.ts and switching all three call sites would make the resolver a single source of truth — and the regression test you added would then cover the cursor/PiP paths for free, since they currently have zero coverage. Purely mechanical, low risk, and independent of this fix, so it can be a follow-up.

中文对照

批准,附带一个非阻塞建议

修复正确,且遵循了仓库既有的扩展点:向上查找 dist 的逻辑与 cursor overlay 的 defaultOverlayDistDir()、PiP 的 defaultDistDir() 一致;参数化的 moduleUrl 让这段 walk-up 逻辑第一次可以被单元测试——而现有的两份旧实现完全没有测试覆盖,因此这是净改进。

一个非阻塞观察:这已经是同一段 walk-up 解析器的第三份逐字节相同的复制cursor-overlay-window.tspip-electron.ts,以及现在的 permission-overlay-path.ts),恰好到了 rule-of-three 的提取时机。如果愿意,可以提取共享的 resolveOverlayAssetDir(moduleUrl = import.meta.url)(例如放到 src/main/overlay-assets.ts),三处调用点统一使用,这样你新增的回归测试也能顺带覆盖 cursor/PiP 路径——它们目前是零覆盖。这纯粹是机械替换、风险低,且与本次修复相互独立,可以作为 follow-up 单独做。

@Colafornia
Colaforniaforce-pushed the fix/permission-overlay-bundled-assets branch from 8642907 to 31f1262CompareAugust 4, 2026 01:50

@Astro-HanAstro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approve. The walk-up-to-nearest-dist resolver is correct for every current launch flow (bundled dev, tsc production, macOS dev app, asar), and the cursor/PiP refactor onto the shared resolver is behavior-preserving. Three notes for the record, none blocking: the no-dist fallback returns a silent wrong path (unreachable today, worth an existsSync check if the resolver is ever hardened); the test assertions are POSIX path literals (would break on a Windows runner, moot on the current CI matrix); the resolver diverges from the packaged-assets resourcesPath pattern, which only matters if overlay assets move to extraResources.

@Astro-Han
Astro-Han merged commit 1a4751f into apache:mainAug 4, 2026
11 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Colafornia@Astro-Han
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix(desktop): resolve permission overlay assets in bundled dev - #2045

Merged
Astro-Han merged 2 commits into
apache:mainfrom
Colafornia:fix/permission-overlay-bundled-assets
Aug 4, 2026
Merged

fix(desktop): resolve permission overlay assets in bundled dev#2045
Astro-Han merged 2 commits into
apache:mainfrom
Colafornia:fix/permission-overlay-bundled-assets

Conversation

@Colafornia

Copy link
Copy Markdown
Contributor
English

Summary

In bundled desktop development, the macOS guided-permission action opens System Settings but never displays its overlay card.

dev.mjs bundles the main process into dist/main/main.js, while overlayAssetDir() assumed the tsc layout at dist/main/permission-overlay/permission-overlay-main.js. Its fixed ../.. traversal therefore resolved to the nonexistent apps/desktop/overlay directory instead of dist/overlay, so Electron could not load the overlay preload or HTML.

This PR:

  • resolves permission-overlay assets by walking up to the nearest dist directory, matching the existing cursor/PiP overlay pattern;
  • uses that resolver for both the preload and HTML paths;
  • covers the bundled dev and tsc production layouts with a focused regression test.

The getFileIcon() native crash is already fixed on main by #1920 and is not part of this PR.

Reproduction

On macOS, with Accessibility or Screen Recording permission ungranted:

  1. Run npm --workspace @maka/desktop run dev.
  2. Open Settings → Permissions.
  3. Click the guided grant action.

Before this change, System Settings opens but the permission overlay card does not appear. The bundled module resolves assets as follows:

LayoutModule locationAsset directory
tsc productiondist/main/permission-overlay/permission-overlay-main.jsdist/overlay
esbuild dev bundledist/main/main.jsapps/desktop/overlay (missing)

After this change, both layouts resolve to dist/overlay.

Verification

  • npm --workspace @maka/desktop run build:workspace-deps
  • npm --workspace @maka/desktop run build:main
  • node --test apps/desktop/dist/main/__tests__/permission-overlay-path.test.js — 1 passed
  • git diff --check origin/main...HEAD

Not run: the post-fix macOS permission-onboarding flow or the full repository test suite.

中文

概要

在 bundled desktop 开发环境中,macOS 的“引导授权”操作会打开系统设置,但权限引导卡片不会出现。

dev.mjs 将主进程代码合并到 dist/main/main.js,而 overlayAssetDir() 假设模块位于 tsc 输出路径 dist/main/permission-overlay/permission-overlay-main.js。固定的 ../.. 因此解析到不存在的 apps/desktop/overlay,而不是 dist/overlay,导致 Electron 无法加载 overlay 的 preload 和 HTML。

本 PR:

  • 向上查找最近的 dist 目录来解析权限浮层资源,与现有 cursor/PiP overlay 的实现方式保持一致;
  • 将该解析逻辑用于 preload 和 HTML 路径;
  • 添加聚焦回归测试,覆盖 bundled dev 与 tsc production 两种布局。

getFileIcon() 原生崩溃已由 main 上的 #1920 修复,不属于本 PR。

复现路径

在 macOS 上,保持“辅助功能”或“屏幕录制”权限未授权:

  1. 运行 npm --workspace @maka/desktop run dev
  2. 打开“设置 → 权限”。
  3. 点击“引导授权”。

修改前,系统设置会打开,但权限引导卡片不会出现。bundled module 的资源解析结果如下:

布局模块位置资源目录
tsc productiondist/main/permission-overlay/permission-overlay-main.jsdist/overlay
esbuild dev bundledist/main/main.jsapps/desktop/overlay(不存在)

修改后,两种布局均解析到 dist/overlay

验证

  • npm --workspace @maka/desktop run build:workspace-deps
  • npm --workspace @maka/desktop run build:main
  • node --test apps/desktop/dist/main/__tests__/permission-overlay-path.test.js — 1 项通过
  • git diff --check origin/main...HEAD

未运行:修复后的 macOS 权限引导手动流程及完整仓库测试套件。

@Astro-HanAstro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved with a non-blocking suggestion

The fix is correct and follows the established seam. The dist-walk matches the cursor overlay's defaultOverlayDistDir() and PiP's defaultDistDir(), and the parameterized moduleUrl finally makes this walk-up logic unit-testable — the two existing copies have no test coverage at all, so this is a strict improvement.

One non-blocking observation: this is now the third byte-for-byte copy of the same walk-up resolver (cursor-overlay-window.ts, pip-electron.ts, and now permission-overlay-path.ts). That's the rule-of-three point. If you'd like, extracting a shared resolveOverlayAssetDir(moduleUrl = import.meta.url) into e.g. src/main/overlay-assets.ts and switching all three call sites would make the resolver a single source of truth — and the regression test you added would then cover the cursor/PiP paths for free, since they currently have zero coverage. Purely mechanical, low risk, and independent of this fix, so it can be a follow-up.

中文对照

批准,附带一个非阻塞建议

修复正确,且遵循了仓库既有的扩展点:向上查找 dist 的逻辑与 cursor overlay 的 defaultOverlayDistDir()、PiP 的 defaultDistDir() 一致;参数化的 moduleUrl 让这段 walk-up 逻辑第一次可以被单元测试——而现有的两份旧实现完全没有测试覆盖,因此这是净改进。

一个非阻塞观察:这已经是同一段 walk-up 解析器的第三份逐字节相同的复制cursor-overlay-window.tspip-electron.ts,以及现在的 permission-overlay-path.ts),恰好到了 rule-of-three 的提取时机。如果愿意,可以提取共享的 resolveOverlayAssetDir(moduleUrl = import.meta.url)(例如放到 src/main/overlay-assets.ts),三处调用点统一使用,这样你新增的回归测试也能顺带覆盖 cursor/PiP 路径——它们目前是零覆盖。这纯粹是机械替换、风险低,且与本次修复相互独立,可以作为 follow-up 单独做。

@Colafornia
Colaforniaforce-pushed the fix/permission-overlay-bundled-assets branch from 8642907 to 31f1262CompareAugust 4, 2026 01:50

@Astro-HanAstro-Han left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approve. The walk-up-to-nearest-dist resolver is correct for every current launch flow (bundled dev, tsc production, macOS dev app, asar), and the cursor/PiP refactor onto the shared resolver is behavior-preserving. Three notes for the record, none blocking: the no-dist fallback returns a silent wrong path (unreachable today, worth an existsSync check if the resolver is ever hardened); the test assertions are POSIX path literals (would break on a Windows runner, moot on the current CI matrix); the resolver diverges from the packaged-assets resourcesPath pattern, which only matters if overlay assets move to extraResources.

@Astro-Han
Astro-Han merged commit 1a4751f into apache:mainAug 4, 2026
11 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@Colafornia@Astro-Han