fix(desktop): preserve state across Runtime Host reconnects - #2901

Merged
M4n5ter merged 2 commits into
mainfrom
fix/runtime-host-reconnect-generation
Aug 12, 2026
Merged

fix(desktop): preserve state across Runtime Host reconnects#2901
M4n5ter merged 2 commits into
mainfrom
fix/runtime-host-reconnect-generation

Conversation

@M4n5ter

Copy link
Copy Markdown
Member
English

Summary

Prevent a replaced Runtime Host candidate from returning a late reconnectable-read result. The IPC router reuses its existing per-candidate handler identity as the connection fence and retries the read through the current candidate.

Desktop now distinguishes a real target change from a reconnect to the same target. Same-target reconnects retain Client-owned Session selection, composer drafts, attachments, and quotes while refreshing Host projections. Local-path actions in the titlebar, command palette, and Skills surface are hidden when the active target cannot expose Client paths; project identity remains visible.

Follow-up to #2834.

Verification

  • npm run lint
  • npm run format:check
  • npm run build
  • npm run typecheck
  • npm test -w @maka/desktop — 761 passed
  • npm test -w @maka/ui — 113 passed
  • npx knip --workspace apps/desktop
  • npx knip --workspace packages/ui
  • Electron smoke through agent-browser: the local project breadcrumb remained visible and actionable after making the action optional

Checklist

  • Tests cover the change and fail without it
  • Lint, format, typecheck and the affected suites pass locally

Does this PR entail a change in behavior?

  • Yes — described under Summary above
  • No
简体中文

摘要

阻止已被替换的 Runtime Host candidate 返回延迟完成的可重连读取结果。IPC router 直接复用现有的 candidate handler 身份作为连接 fence,并通过当前 candidate 重新执行读取。

Desktop 现在会区分真正的目标切换和同一目标的重连。同目标重连会保留 Client 侧的 Session 选择、输入草稿、附件和引用,同时刷新 Host 投影。当当前目标无法暴露 Client 路径时,标题栏、命令面板和 Skills 页面会隐藏本地路径操作,但仍保留项目身份展示。

这是 #2834 的跟进修复。

验证

  • npm run lint
  • npm run format:check
  • npm run build
  • npm run typecheck
  • npm test -w @maka/desktop — 761 项通过
  • npm test -w @maka/ui — 113 项通过
  • npx knip --workspace apps/desktop
  • npx knip --workspace packages/ui
  • 使用 agent-browser 完成 Electron smoke:将打开动作改为可选后,本地项目 breadcrumb 仍正常显示且可操作

检查清单

  • 测试覆盖该变更,并会在缺少修复时失败
  • lint、format、typecheck 与受影响测试套件均在本地通过

这个 PR 是否改变行为?

  • 是 — 已在上方摘要说明

AI disclosure: Codex materially assisted with the implementation, validation, and this draft description; M4n5ter remains the contributor of record.

Fence reconnectable reads against replaced candidates so late responses retry through the current connection. Distinguish target changes from same-target reconnects, retain Client-owned drafts, and hide Client-path actions when the active target cannot expose local paths.
Generated-by: Codex
@M4n5ter
M4n5ter marked this pull request as ready for review August 12, 2026 06:37
A replaced Runtime Host candidate must not publish either a stale result or a stale ordinary error. Retry reconnectable reads against the active candidate while preserving the no-replay rule for commands.
Generated-by: Codex
@M4n5ter

Copy link
Copy Markdown
MemberAuthor
English

I have manually reviewed and confirmed the fixes included in this PR, including the follow-up that prevents a replaced Runtime Host candidate from returning either a late result or a late ordinary failure. The resulting reconnect behavior and command no-replay boundary match the intended design.

简体中文

我已人工审查并确认本 PR 所包含的修复,包括后续补充的修复:被替换的 Runtime Host candidate 不会再返回迟到结果或迟到的普通异常。最终的重连行为以及 command 不重放的边界符合预期设计。

@M4n5ter
M4n5ter merged commit 65aec2a into mainAug 12, 2026
10 checks passed
@M4n5ter
M4n5ter deleted the fix/runtime-host-reconnect-generation branch August 12, 2026 06:58
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.

1 participant

@M4n5ter
, '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): preserve state across Runtime Host reconnects - #2901

Merged
M4n5ter merged 2 commits into
mainfrom
fix/runtime-host-reconnect-generation
Aug 12, 2026
Merged

fix(desktop): preserve state across Runtime Host reconnects#2901
M4n5ter merged 2 commits into
mainfrom
fix/runtime-host-reconnect-generation

Conversation

@M4n5ter

Copy link
Copy Markdown
Member
English

Summary

Prevent a replaced Runtime Host candidate from returning a late reconnectable-read result. The IPC router reuses its existing per-candidate handler identity as the connection fence and retries the read through the current candidate.

Desktop now distinguishes a real target change from a reconnect to the same target. Same-target reconnects retain Client-owned Session selection, composer drafts, attachments, and quotes while refreshing Host projections. Local-path actions in the titlebar, command palette, and Skills surface are hidden when the active target cannot expose Client paths; project identity remains visible.

Follow-up to #2834.

Verification

  • npm run lint
  • npm run format:check
  • npm run build
  • npm run typecheck
  • npm test -w @maka/desktop — 761 passed
  • npm test -w @maka/ui — 113 passed
  • npx knip --workspace apps/desktop
  • npx knip --workspace packages/ui
  • Electron smoke through agent-browser: the local project breadcrumb remained visible and actionable after making the action optional

Checklist

  • Tests cover the change and fail without it
  • Lint, format, typecheck and the affected suites pass locally

Does this PR entail a change in behavior?

  • Yes — described under Summary above
  • No
简体中文

摘要

阻止已被替换的 Runtime Host candidate 返回延迟完成的可重连读取结果。IPC router 直接复用现有的 candidate handler 身份作为连接 fence,并通过当前 candidate 重新执行读取。

Desktop 现在会区分真正的目标切换和同一目标的重连。同目标重连会保留 Client 侧的 Session 选择、输入草稿、附件和引用,同时刷新 Host 投影。当当前目标无法暴露 Client 路径时,标题栏、命令面板和 Skills 页面会隐藏本地路径操作,但仍保留项目身份展示。

这是 #2834 的跟进修复。

验证

  • npm run lint
  • npm run format:check
  • npm run build
  • npm run typecheck
  • npm test -w @maka/desktop — 761 项通过
  • npm test -w @maka/ui — 113 项通过
  • npx knip --workspace apps/desktop
  • npx knip --workspace packages/ui
  • 使用 agent-browser 完成 Electron smoke:将打开动作改为可选后,本地项目 breadcrumb 仍正常显示且可操作

检查清单

  • 测试覆盖该变更,并会在缺少修复时失败
  • lint、format、typecheck 与受影响测试套件均在本地通过

这个 PR 是否改变行为?

  • 是 — 已在上方摘要说明

AI disclosure: Codex materially assisted with the implementation, validation, and this draft description; M4n5ter remains the contributor of record.

Fence reconnectable reads against replaced candidates so late responses retry through the current connection. Distinguish target changes from same-target reconnects, retain Client-owned drafts, and hide Client-path actions when the active target cannot expose local paths.
Generated-by: Codex
@M4n5ter
M4n5ter marked this pull request as ready for review August 12, 2026 06:37
A replaced Runtime Host candidate must not publish either a stale result or a stale ordinary error. Retry reconnectable reads against the active candidate while preserving the no-replay rule for commands.
Generated-by: Codex
@M4n5ter

Copy link
Copy Markdown
MemberAuthor
English

I have manually reviewed and confirmed the fixes included in this PR, including the follow-up that prevents a replaced Runtime Host candidate from returning either a late result or a late ordinary failure. The resulting reconnect behavior and command no-replay boundary match the intended design.

简体中文

我已人工审查并确认本 PR 所包含的修复,包括后续补充的修复:被替换的 Runtime Host candidate 不会再返回迟到结果或迟到的普通异常。最终的重连行为以及 command 不重放的边界符合预期设计。

@M4n5ter
M4n5ter merged commit 65aec2a into mainAug 12, 2026
10 checks passed
@M4n5ter
M4n5ter deleted the fix/runtime-host-reconnect-generation branch August 12, 2026 06:58
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.

1 participant

@M4n5ter
, '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): preserve state across Runtime Host reconnects - #2901

Merged
M4n5ter merged 2 commits into
mainfrom
fix/runtime-host-reconnect-generation
Aug 12, 2026
Merged

fix(desktop): preserve state across Runtime Host reconnects#2901
M4n5ter merged 2 commits into
mainfrom
fix/runtime-host-reconnect-generation

Conversation

@M4n5ter

Copy link
Copy Markdown
Member
English

Summary

Prevent a replaced Runtime Host candidate from returning a late reconnectable-read result. The IPC router reuses its existing per-candidate handler identity as the connection fence and retries the read through the current candidate.

Desktop now distinguishes a real target change from a reconnect to the same target. Same-target reconnects retain Client-owned Session selection, composer drafts, attachments, and quotes while refreshing Host projections. Local-path actions in the titlebar, command palette, and Skills surface are hidden when the active target cannot expose Client paths; project identity remains visible.

Follow-up to #2834.

Verification

  • npm run lint
  • npm run format:check
  • npm run build
  • npm run typecheck
  • npm test -w @maka/desktop — 761 passed
  • npm test -w @maka/ui — 113 passed
  • npx knip --workspace apps/desktop
  • npx knip --workspace packages/ui
  • Electron smoke through agent-browser: the local project breadcrumb remained visible and actionable after making the action optional

Checklist

  • Tests cover the change and fail without it
  • Lint, format, typecheck and the affected suites pass locally

Does this PR entail a change in behavior?

  • Yes — described under Summary above
  • No
简体中文

摘要

阻止已被替换的 Runtime Host candidate 返回延迟完成的可重连读取结果。IPC router 直接复用现有的 candidate handler 身份作为连接 fence,并通过当前 candidate 重新执行读取。

Desktop 现在会区分真正的目标切换和同一目标的重连。同目标重连会保留 Client 侧的 Session 选择、输入草稿、附件和引用,同时刷新 Host 投影。当当前目标无法暴露 Client 路径时,标题栏、命令面板和 Skills 页面会隐藏本地路径操作,但仍保留项目身份展示。

这是 #2834 的跟进修复。

验证

  • npm run lint
  • npm run format:check
  • npm run build
  • npm run typecheck
  • npm test -w @maka/desktop — 761 项通过
  • npm test -w @maka/ui — 113 项通过
  • npx knip --workspace apps/desktop
  • npx knip --workspace packages/ui
  • 使用 agent-browser 完成 Electron smoke:将打开动作改为可选后,本地项目 breadcrumb 仍正常显示且可操作

检查清单

  • 测试覆盖该变更,并会在缺少修复时失败
  • lint、format、typecheck 与受影响测试套件均在本地通过

这个 PR 是否改变行为?

  • 是 — 已在上方摘要说明

AI disclosure: Codex materially assisted with the implementation, validation, and this draft description; M4n5ter remains the contributor of record.

Fence reconnectable reads against replaced candidates so late responses retry through the current connection. Distinguish target changes from same-target reconnects, retain Client-owned drafts, and hide Client-path actions when the active target cannot expose local paths.
Generated-by: Codex
@M4n5ter
M4n5ter marked this pull request as ready for review August 12, 2026 06:37
A replaced Runtime Host candidate must not publish either a stale result or a stale ordinary error. Retry reconnectable reads against the active candidate while preserving the no-replay rule for commands.
Generated-by: Codex
@M4n5ter

Copy link
Copy Markdown
MemberAuthor
English

I have manually reviewed and confirmed the fixes included in this PR, including the follow-up that prevents a replaced Runtime Host candidate from returning either a late result or a late ordinary failure. The resulting reconnect behavior and command no-replay boundary match the intended design.

简体中文

我已人工审查并确认本 PR 所包含的修复,包括后续补充的修复:被替换的 Runtime Host candidate 不会再返回迟到结果或迟到的普通异常。最终的重连行为以及 command 不重放的边界符合预期设计。

@M4n5ter
M4n5ter merged commit 65aec2a into mainAug 12, 2026
10 checks passed
@M4n5ter
M4n5ter deleted the fix/runtime-host-reconnect-generation branch August 12, 2026 06:58
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.

1 participant

@M4n5ter
, '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): preserve state across Runtime Host reconnects - #2901

Merged
M4n5ter merged 2 commits into
mainfrom
fix/runtime-host-reconnect-generation
Aug 12, 2026
Merged

fix(desktop): preserve state across Runtime Host reconnects#2901
M4n5ter merged 2 commits into
mainfrom
fix/runtime-host-reconnect-generation

Conversation

@M4n5ter

Copy link
Copy Markdown
Member
English

Summary

Prevent a replaced Runtime Host candidate from returning a late reconnectable-read result. The IPC router reuses its existing per-candidate handler identity as the connection fence and retries the read through the current candidate.

Desktop now distinguishes a real target change from a reconnect to the same target. Same-target reconnects retain Client-owned Session selection, composer drafts, attachments, and quotes while refreshing Host projections. Local-path actions in the titlebar, command palette, and Skills surface are hidden when the active target cannot expose Client paths; project identity remains visible.

Follow-up to #2834.

Verification

  • npm run lint
  • npm run format:check
  • npm run build
  • npm run typecheck
  • npm test -w @maka/desktop — 761 passed
  • npm test -w @maka/ui — 113 passed
  • npx knip --workspace apps/desktop
  • npx knip --workspace packages/ui
  • Electron smoke through agent-browser: the local project breadcrumb remained visible and actionable after making the action optional

Checklist

  • Tests cover the change and fail without it
  • Lint, format, typecheck and the affected suites pass locally

Does this PR entail a change in behavior?

  • Yes — described under Summary above
  • No
简体中文

摘要

阻止已被替换的 Runtime Host candidate 返回延迟完成的可重连读取结果。IPC router 直接复用现有的 candidate handler 身份作为连接 fence,并通过当前 candidate 重新执行读取。

Desktop 现在会区分真正的目标切换和同一目标的重连。同目标重连会保留 Client 侧的 Session 选择、输入草稿、附件和引用,同时刷新 Host 投影。当当前目标无法暴露 Client 路径时,标题栏、命令面板和 Skills 页面会隐藏本地路径操作,但仍保留项目身份展示。

这是 #2834 的跟进修复。

验证

  • npm run lint
  • npm run format:check
  • npm run build
  • npm run typecheck
  • npm test -w @maka/desktop — 761 项通过
  • npm test -w @maka/ui — 113 项通过
  • npx knip --workspace apps/desktop
  • npx knip --workspace packages/ui
  • 使用 agent-browser 完成 Electron smoke:将打开动作改为可选后,本地项目 breadcrumb 仍正常显示且可操作

检查清单

  • 测试覆盖该变更,并会在缺少修复时失败
  • lint、format、typecheck 与受影响测试套件均在本地通过

这个 PR 是否改变行为?

  • 是 — 已在上方摘要说明

AI disclosure: Codex materially assisted with the implementation, validation, and this draft description; M4n5ter remains the contributor of record.

Fence reconnectable reads against replaced candidates so late responses retry through the current connection. Distinguish target changes from same-target reconnects, retain Client-owned drafts, and hide Client-path actions when the active target cannot expose local paths.
Generated-by: Codex
@M4n5ter
M4n5ter marked this pull request as ready for review August 12, 2026 06:37
A replaced Runtime Host candidate must not publish either a stale result or a stale ordinary error. Retry reconnectable reads against the active candidate while preserving the no-replay rule for commands.
Generated-by: Codex
@M4n5ter

Copy link
Copy Markdown
MemberAuthor
English

I have manually reviewed and confirmed the fixes included in this PR, including the follow-up that prevents a replaced Runtime Host candidate from returning either a late result or a late ordinary failure. The resulting reconnect behavior and command no-replay boundary match the intended design.

简体中文

我已人工审查并确认本 PR 所包含的修复,包括后续补充的修复:被替换的 Runtime Host candidate 不会再返回迟到结果或迟到的普通异常。最终的重连行为以及 command 不重放的边界符合预期设计。

@M4n5ter
M4n5ter merged commit 65aec2a into mainAug 12, 2026
10 checks passed
@M4n5ter
M4n5ter deleted the fix/runtime-host-reconnect-generation branch August 12, 2026 06:58
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.

1 participant

@M4n5ter
, '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): preserve state across Runtime Host reconnects - #2901

Merged
M4n5ter merged 2 commits into
mainfrom
fix/runtime-host-reconnect-generation
Aug 12, 2026
Merged

fix(desktop): preserve state across Runtime Host reconnects#2901
M4n5ter merged 2 commits into
mainfrom
fix/runtime-host-reconnect-generation

Conversation

@M4n5ter

Copy link
Copy Markdown
Member
English

Summary

Prevent a replaced Runtime Host candidate from returning a late reconnectable-read result. The IPC router reuses its existing per-candidate handler identity as the connection fence and retries the read through the current candidate.

Desktop now distinguishes a real target change from a reconnect to the same target. Same-target reconnects retain Client-owned Session selection, composer drafts, attachments, and quotes while refreshing Host projections. Local-path actions in the titlebar, command palette, and Skills surface are hidden when the active target cannot expose Client paths; project identity remains visible.

Follow-up to #2834.

Verification

  • npm run lint
  • npm run format:check
  • npm run build
  • npm run typecheck
  • npm test -w @maka/desktop — 761 passed
  • npm test -w @maka/ui — 113 passed
  • npx knip --workspace apps/desktop
  • npx knip --workspace packages/ui
  • Electron smoke through agent-browser: the local project breadcrumb remained visible and actionable after making the action optional

Checklist

  • Tests cover the change and fail without it
  • Lint, format, typecheck and the affected suites pass locally

Does this PR entail a change in behavior?

  • Yes — described under Summary above
  • No
简体中文

摘要

阻止已被替换的 Runtime Host candidate 返回延迟完成的可重连读取结果。IPC router 直接复用现有的 candidate handler 身份作为连接 fence,并通过当前 candidate 重新执行读取。

Desktop 现在会区分真正的目标切换和同一目标的重连。同目标重连会保留 Client 侧的 Session 选择、输入草稿、附件和引用,同时刷新 Host 投影。当当前目标无法暴露 Client 路径时,标题栏、命令面板和 Skills 页面会隐藏本地路径操作,但仍保留项目身份展示。

这是 #2834 的跟进修复。

验证

  • npm run lint
  • npm run format:check
  • npm run build
  • npm run typecheck
  • npm test -w @maka/desktop — 761 项通过
  • npm test -w @maka/ui — 113 项通过
  • npx knip --workspace apps/desktop
  • npx knip --workspace packages/ui
  • 使用 agent-browser 完成 Electron smoke:将打开动作改为可选后,本地项目 breadcrumb 仍正常显示且可操作

检查清单

  • 测试覆盖该变更,并会在缺少修复时失败
  • lint、format、typecheck 与受影响测试套件均在本地通过

这个 PR 是否改变行为?

  • 是 — 已在上方摘要说明

AI disclosure: Codex materially assisted with the implementation, validation, and this draft description; M4n5ter remains the contributor of record.

Fence reconnectable reads against replaced candidates so late responses retry through the current connection. Distinguish target changes from same-target reconnects, retain Client-owned drafts, and hide Client-path actions when the active target cannot expose local paths.
Generated-by: Codex
@M4n5ter
M4n5ter marked this pull request as ready for review August 12, 2026 06:37
A replaced Runtime Host candidate must not publish either a stale result or a stale ordinary error. Retry reconnectable reads against the active candidate while preserving the no-replay rule for commands.
Generated-by: Codex
@M4n5ter

Copy link
Copy Markdown
MemberAuthor
English

I have manually reviewed and confirmed the fixes included in this PR, including the follow-up that prevents a replaced Runtime Host candidate from returning either a late result or a late ordinary failure. The resulting reconnect behavior and command no-replay boundary match the intended design.

简体中文

我已人工审查并确认本 PR 所包含的修复,包括后续补充的修复:被替换的 Runtime Host candidate 不会再返回迟到结果或迟到的普通异常。最终的重连行为以及 command 不重放的边界符合预期设计。

@M4n5ter
M4n5ter merged commit 65aec2a into mainAug 12, 2026
10 checks passed
@M4n5ter
M4n5ter deleted the fix/runtime-host-reconnect-generation branch August 12, 2026 06:58
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.

1 participant

@M4n5ter
, '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): preserve state across Runtime Host reconnects - #2901

Merged
M4n5ter merged 2 commits into
mainfrom
fix/runtime-host-reconnect-generation
Aug 12, 2026
Merged

fix(desktop): preserve state across Runtime Host reconnects#2901
M4n5ter merged 2 commits into
mainfrom
fix/runtime-host-reconnect-generation

Conversation

@M4n5ter

Copy link
Copy Markdown
Member
English

Summary

Prevent a replaced Runtime Host candidate from returning a late reconnectable-read result. The IPC router reuses its existing per-candidate handler identity as the connection fence and retries the read through the current candidate.

Desktop now distinguishes a real target change from a reconnect to the same target. Same-target reconnects retain Client-owned Session selection, composer drafts, attachments, and quotes while refreshing Host projections. Local-path actions in the titlebar, command palette, and Skills surface are hidden when the active target cannot expose Client paths; project identity remains visible.

Follow-up to #2834.

Verification

  • npm run lint
  • npm run format:check
  • npm run build
  • npm run typecheck
  • npm test -w @maka/desktop — 761 passed
  • npm test -w @maka/ui — 113 passed
  • npx knip --workspace apps/desktop
  • npx knip --workspace packages/ui
  • Electron smoke through agent-browser: the local project breadcrumb remained visible and actionable after making the action optional

Checklist

  • Tests cover the change and fail without it
  • Lint, format, typecheck and the affected suites pass locally

Does this PR entail a change in behavior?

  • Yes — described under Summary above
  • No
简体中文

摘要

阻止已被替换的 Runtime Host candidate 返回延迟完成的可重连读取结果。IPC router 直接复用现有的 candidate handler 身份作为连接 fence,并通过当前 candidate 重新执行读取。

Desktop 现在会区分真正的目标切换和同一目标的重连。同目标重连会保留 Client 侧的 Session 选择、输入草稿、附件和引用,同时刷新 Host 投影。当当前目标无法暴露 Client 路径时,标题栏、命令面板和 Skills 页面会隐藏本地路径操作,但仍保留项目身份展示。

这是 #2834 的跟进修复。

验证

  • npm run lint
  • npm run format:check
  • npm run build
  • npm run typecheck
  • npm test -w @maka/desktop — 761 项通过
  • npm test -w @maka/ui — 113 项通过
  • npx knip --workspace apps/desktop
  • npx knip --workspace packages/ui
  • 使用 agent-browser 完成 Electron smoke:将打开动作改为可选后,本地项目 breadcrumb 仍正常显示且可操作

检查清单

  • 测试覆盖该变更,并会在缺少修复时失败
  • lint、format、typecheck 与受影响测试套件均在本地通过

这个 PR 是否改变行为?

  • 是 — 已在上方摘要说明

AI disclosure: Codex materially assisted with the implementation, validation, and this draft description; M4n5ter remains the contributor of record.

Fence reconnectable reads against replaced candidates so late responses retry through the current connection. Distinguish target changes from same-target reconnects, retain Client-owned drafts, and hide Client-path actions when the active target cannot expose local paths.
Generated-by: Codex
@M4n5ter
M4n5ter marked this pull request as ready for review August 12, 2026 06:37
A replaced Runtime Host candidate must not publish either a stale result or a stale ordinary error. Retry reconnectable reads against the active candidate while preserving the no-replay rule for commands.
Generated-by: Codex
@M4n5ter

Copy link
Copy Markdown
MemberAuthor
English

I have manually reviewed and confirmed the fixes included in this PR, including the follow-up that prevents a replaced Runtime Host candidate from returning either a late result or a late ordinary failure. The resulting reconnect behavior and command no-replay boundary match the intended design.

简体中文

我已人工审查并确认本 PR 所包含的修复,包括后续补充的修复:被替换的 Runtime Host candidate 不会再返回迟到结果或迟到的普通异常。最终的重连行为以及 command 不重放的边界符合预期设计。

@M4n5ter
M4n5ter merged commit 65aec2a into mainAug 12, 2026
10 checks passed
@M4n5ter
M4n5ter deleted the fix/runtime-host-reconnect-generation branch August 12, 2026 06:58
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.

1 participant

@M4n5ter
, '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): preserve state across Runtime Host reconnects - #2901

Merged
M4n5ter merged 2 commits into
mainfrom
fix/runtime-host-reconnect-generation
Aug 12, 2026
Merged

fix(desktop): preserve state across Runtime Host reconnects#2901
M4n5ter merged 2 commits into
mainfrom
fix/runtime-host-reconnect-generation

Conversation

@M4n5ter

Copy link
Copy Markdown
Member
English

Summary

Prevent a replaced Runtime Host candidate from returning a late reconnectable-read result. The IPC router reuses its existing per-candidate handler identity as the connection fence and retries the read through the current candidate.

Desktop now distinguishes a real target change from a reconnect to the same target. Same-target reconnects retain Client-owned Session selection, composer drafts, attachments, and quotes while refreshing Host projections. Local-path actions in the titlebar, command palette, and Skills surface are hidden when the active target cannot expose Client paths; project identity remains visible.

Follow-up to #2834.

Verification

  • npm run lint
  • npm run format:check
  • npm run build
  • npm run typecheck
  • npm test -w @maka/desktop — 761 passed
  • npm test -w @maka/ui — 113 passed
  • npx knip --workspace apps/desktop
  • npx knip --workspace packages/ui
  • Electron smoke through agent-browser: the local project breadcrumb remained visible and actionable after making the action optional

Checklist

  • Tests cover the change and fail without it
  • Lint, format, typecheck and the affected suites pass locally

Does this PR entail a change in behavior?

  • Yes — described under Summary above
  • No
简体中文

摘要

阻止已被替换的 Runtime Host candidate 返回延迟完成的可重连读取结果。IPC router 直接复用现有的 candidate handler 身份作为连接 fence,并通过当前 candidate 重新执行读取。

Desktop 现在会区分真正的目标切换和同一目标的重连。同目标重连会保留 Client 侧的 Session 选择、输入草稿、附件和引用,同时刷新 Host 投影。当当前目标无法暴露 Client 路径时,标题栏、命令面板和 Skills 页面会隐藏本地路径操作,但仍保留项目身份展示。

这是 #2834 的跟进修复。

验证

  • npm run lint
  • npm run format:check
  • npm run build
  • npm run typecheck
  • npm test -w @maka/desktop — 761 项通过
  • npm test -w @maka/ui — 113 项通过
  • npx knip --workspace apps/desktop
  • npx knip --workspace packages/ui
  • 使用 agent-browser 完成 Electron smoke:将打开动作改为可选后,本地项目 breadcrumb 仍正常显示且可操作

检查清单

  • 测试覆盖该变更,并会在缺少修复时失败
  • lint、format、typecheck 与受影响测试套件均在本地通过

这个 PR 是否改变行为?

  • 是 — 已在上方摘要说明

AI disclosure: Codex materially assisted with the implementation, validation, and this draft description; M4n5ter remains the contributor of record.

Fence reconnectable reads against replaced candidates so late responses retry through the current connection. Distinguish target changes from same-target reconnects, retain Client-owned drafts, and hide Client-path actions when the active target cannot expose local paths.
Generated-by: Codex
@M4n5ter
M4n5ter marked this pull request as ready for review August 12, 2026 06:37
A replaced Runtime Host candidate must not publish either a stale result or a stale ordinary error. Retry reconnectable reads against the active candidate while preserving the no-replay rule for commands.
Generated-by: Codex
@M4n5ter

Copy link
Copy Markdown
MemberAuthor
English

I have manually reviewed and confirmed the fixes included in this PR, including the follow-up that prevents a replaced Runtime Host candidate from returning either a late result or a late ordinary failure. The resulting reconnect behavior and command no-replay boundary match the intended design.

简体中文

我已人工审查并确认本 PR 所包含的修复,包括后续补充的修复:被替换的 Runtime Host candidate 不会再返回迟到结果或迟到的普通异常。最终的重连行为以及 command 不重放的边界符合预期设计。

@M4n5ter
M4n5ter merged commit 65aec2a into mainAug 12, 2026
10 checks passed
@M4n5ter
M4n5ter deleted the fix/runtime-host-reconnect-generation branch August 12, 2026 06:58
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.

1 participant

@M4n5ter
, '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): preserve state across Runtime Host reconnects - #2901

Merged
M4n5ter merged 2 commits into
mainfrom
fix/runtime-host-reconnect-generation
Aug 12, 2026
Merged

fix(desktop): preserve state across Runtime Host reconnects#2901
M4n5ter merged 2 commits into
mainfrom
fix/runtime-host-reconnect-generation

Conversation

@M4n5ter

Copy link
Copy Markdown
Member
English

Summary

Prevent a replaced Runtime Host candidate from returning a late reconnectable-read result. The IPC router reuses its existing per-candidate handler identity as the connection fence and retries the read through the current candidate.

Desktop now distinguishes a real target change from a reconnect to the same target. Same-target reconnects retain Client-owned Session selection, composer drafts, attachments, and quotes while refreshing Host projections. Local-path actions in the titlebar, command palette, and Skills surface are hidden when the active target cannot expose Client paths; project identity remains visible.

Follow-up to #2834.

Verification

  • npm run lint
  • npm run format:check
  • npm run build
  • npm run typecheck
  • npm test -w @maka/desktop — 761 passed
  • npm test -w @maka/ui — 113 passed
  • npx knip --workspace apps/desktop
  • npx knip --workspace packages/ui
  • Electron smoke through agent-browser: the local project breadcrumb remained visible and actionable after making the action optional

Checklist

  • Tests cover the change and fail without it
  • Lint, format, typecheck and the affected suites pass locally

Does this PR entail a change in behavior?

  • Yes — described under Summary above
  • No
简体中文

摘要

阻止已被替换的 Runtime Host candidate 返回延迟完成的可重连读取结果。IPC router 直接复用现有的 candidate handler 身份作为连接 fence,并通过当前 candidate 重新执行读取。

Desktop 现在会区分真正的目标切换和同一目标的重连。同目标重连会保留 Client 侧的 Session 选择、输入草稿、附件和引用,同时刷新 Host 投影。当当前目标无法暴露 Client 路径时,标题栏、命令面板和 Skills 页面会隐藏本地路径操作,但仍保留项目身份展示。

这是 #2834 的跟进修复。

验证

  • npm run lint
  • npm run format:check
  • npm run build
  • npm run typecheck
  • npm test -w @maka/desktop — 761 项通过
  • npm test -w @maka/ui — 113 项通过
  • npx knip --workspace apps/desktop
  • npx knip --workspace packages/ui
  • 使用 agent-browser 完成 Electron smoke:将打开动作改为可选后,本地项目 breadcrumb 仍正常显示且可操作

检查清单

  • 测试覆盖该变更,并会在缺少修复时失败
  • lint、format、typecheck 与受影响测试套件均在本地通过

这个 PR 是否改变行为?

  • 是 — 已在上方摘要说明

AI disclosure: Codex materially assisted with the implementation, validation, and this draft description; M4n5ter remains the contributor of record.

Fence reconnectable reads against replaced candidates so late responses retry through the current connection. Distinguish target changes from same-target reconnects, retain Client-owned drafts, and hide Client-path actions when the active target cannot expose local paths.
Generated-by: Codex
@M4n5ter
M4n5ter marked this pull request as ready for review August 12, 2026 06:37
A replaced Runtime Host candidate must not publish either a stale result or a stale ordinary error. Retry reconnectable reads against the active candidate while preserving the no-replay rule for commands.
Generated-by: Codex
@M4n5ter

Copy link
Copy Markdown
MemberAuthor
English

I have manually reviewed and confirmed the fixes included in this PR, including the follow-up that prevents a replaced Runtime Host candidate from returning either a late result or a late ordinary failure. The resulting reconnect behavior and command no-replay boundary match the intended design.

简体中文

我已人工审查并确认本 PR 所包含的修复,包括后续补充的修复:被替换的 Runtime Host candidate 不会再返回迟到结果或迟到的普通异常。最终的重连行为以及 command 不重放的边界符合预期设计。

@M4n5ter
M4n5ter merged commit 65aec2a into mainAug 12, 2026
10 checks passed
@M4n5ter
M4n5ter deleted the fix/runtime-host-reconnect-generation branch August 12, 2026 06:58
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.

1 participant

@M4n5ter