Merge remote-tracking branch 'origin/main' into ethie/pm-clean

Conflicts resolved toward the branch: PM owns dependency preparation, the
Windows shim re-exec/hand-off path stays retired (main's shim-parent wait,
gateway-resume env token and update_cmd_deps tests dropped), docs describe
the PM update flow. The docker workflow parks install-stamp.json around the
toolchain step instead of deleting it so tests/docker can compare provenance.
This commit is contained in:
ethernet
2026-09-19 13:45:07 -04:00
248 changed files with 7070 additions and 5114 deletions

View File

@@ -59,7 +59,7 @@ wss.on('connection', ws =>
)
const entry = `import React from 'react'; import {createRoot} from 'react-dom/client';
import {QueryClient, QueryClientProvider} from '@tanstack/react-query';
import {McpTab} from '${repo}/apps/desktop/src/app/skills/mcp-tab.tsx';
import {McpTab} from '${repo}/apps/desktop/src/app/capabilities/mcp/mcp-tab.tsx';
import {setApiRequestProfile,setApiRequestConnection} from '${repo}/apps/desktop/src/api/client.ts';
setApiRequestProfile('profile-b');setApiRequestConnection('fixture-remote');
const queryClient=new QueryClient({defaultOptions:{queries:{retry:false}}});function Probe(){const [profile,setProfile]=React.useState('profile-b');const [shown,setShown]=React.useState(true);window.cancelFlow=()=>setProfile('profile-c');window.unmountFlow=()=>setShown(false);return <QueryClientProvider client={queryClient}>{shown && <McpTab gateway={null} profile={{connectionId:'fixture-remote',profile}} />}</QueryClientProvider>};createRoot(document.getElementById('root')).render(<Probe/>);`

View File

@@ -75,7 +75,7 @@ async def _heartbeat(agent) -> str:
mixin = GatewayTurnMixin()
adapter = MagicMock()
adapter.send = AsyncMock(return_value=SimpleNamespace(success=True, message_id="hb1"))
mixin._adapter_for_source = MagicMock(return_value=adapter)
mixin._delivery_adapter_for = MagicMock(return_value=adapter)
mixin._should_emit_long_running_notification = MagicMock(side_effect=[True, False])
disp = MagicMock()
disp._display_surface_mode.return_value = "on"

View File

@@ -46,7 +46,7 @@ async def main(base_poller):
runner._run_in_executor_with_context = asyncio.to_thread
adapter = WireAdapter(PlatformConfig(enabled=True, typing_indicator=False), Platform.TELEGRAM)
adapter.wire = []
runner._adapter_for_source = lambda source: adapter
runner._delivery_adapter_for = lambda source: adapter
source = SessionSource(platform=Platform.TELEGRAM, chat_id="42", user_id="42", chat_type="dm")
key = build_session_key(source)
watch = {key: (source, "wire-session")}