源码快照 @ 2026-09-01 (source-only, 剔除非源码素材)
Publish Claude Code Binaries / Stage and publish binaries (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-arm64 (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build linux-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build windows-amd64 (push) Canceled after 0s
Sync Tutti Agent Skills / sync (push) Canceled after 0s
Windows Agent Adapters / Test Windows agent adapters (push) Canceled after 0s
Windows Daemon Adapters / Test Windows daemon adapters (push) Canceled after 0s
Publish Tutti App Runtime / Publish runtime catalog (push) Canceled after 0s
Publish Claude Code Binaries / Stage and publish binaries (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-arm64 (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build linux-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build windows-amd64 (push) Canceled after 0s
Sync Tutti Agent Skills / sync (push) Canceled after 0s
Windows Agent Adapters / Test Windows agent adapters (push) Canceled after 0s
Windows Daemon Adapters / Test Windows daemon adapters (push) Canceled after 0s
Publish Tutti App Runtime / Publish runtime catalog (push) Canceled after 0s
This commit is contained in:
@@ -0,0 +1,105 @@
|
||||
import {
|
||||
desktopIpcChannels,
|
||||
type DesktopWorkspaceAppExternalRendererEvent,
|
||||
type DesktopWorkspaceAppExternalRendererRequest,
|
||||
type DesktopWorkspaceAppExternalRendererResponse
|
||||
} from "../../shared/contracts/ipc.ts";
|
||||
import type {
|
||||
DesktopWorkspaceAppExternalHostApi,
|
||||
DesktopWorkspaceAppExternalHostRequestResult
|
||||
} from "../types.ts";
|
||||
import electron, { type IpcRendererEvent } from "electron";
|
||||
|
||||
const { ipcRenderer } = electron;
|
||||
|
||||
interface WorkspaceAppExternalIpcRenderer {
|
||||
off(
|
||||
channel: string,
|
||||
listener: (
|
||||
event: IpcRendererEvent,
|
||||
request: DesktopWorkspaceAppExternalRendererRequest
|
||||
) => void
|
||||
): void;
|
||||
on(
|
||||
channel: string,
|
||||
listener: (
|
||||
event: IpcRendererEvent,
|
||||
request: DesktopWorkspaceAppExternalRendererRequest
|
||||
) => void
|
||||
): void;
|
||||
send(channel: string, payload: unknown): void;
|
||||
}
|
||||
|
||||
export function createWorkspaceAppExternalDesktopApi(
|
||||
renderer: WorkspaceAppExternalIpcRenderer = ipcRenderer
|
||||
): DesktopWorkspaceAppExternalHostApi {
|
||||
return {
|
||||
onRequest(listener) {
|
||||
let disposed = false;
|
||||
let announcedReady = false;
|
||||
const handler = (
|
||||
_event: IpcRendererEvent,
|
||||
request: DesktopWorkspaceAppExternalRendererRequest
|
||||
) => {
|
||||
void Promise.resolve(listener(request))
|
||||
.then((data) => {
|
||||
sendResponse(request.requestId, data);
|
||||
})
|
||||
.catch((error: unknown) => {
|
||||
sendErrorResponse(request.requestId, error);
|
||||
});
|
||||
};
|
||||
|
||||
renderer.on(desktopIpcChannels.appExternal.rendererRequest, handler);
|
||||
queueMicrotask(() => {
|
||||
if (disposed) {
|
||||
return;
|
||||
}
|
||||
announcedReady = true;
|
||||
renderer.send(desktopIpcChannels.appExternal.rendererReady, {
|
||||
ready: true
|
||||
});
|
||||
});
|
||||
return () => {
|
||||
disposed = true;
|
||||
renderer.off(desktopIpcChannels.appExternal.rendererRequest, handler);
|
||||
if (announcedReady) {
|
||||
renderer.send(desktopIpcChannels.appExternal.rendererReady, {
|
||||
ready: false
|
||||
});
|
||||
}
|
||||
};
|
||||
},
|
||||
sendEvent(event: DesktopWorkspaceAppExternalRendererEvent) {
|
||||
renderer.send(desktopIpcChannels.appExternal.rendererEvent, event);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
function sendResponse(
|
||||
requestId: string,
|
||||
data: DesktopWorkspaceAppExternalHostRequestResult
|
||||
): void {
|
||||
const response: DesktopWorkspaceAppExternalRendererResponse = {
|
||||
requestId,
|
||||
result: {
|
||||
ok: true,
|
||||
data
|
||||
}
|
||||
};
|
||||
ipcRenderer.send(desktopIpcChannels.appExternal.rendererResponse, response);
|
||||
}
|
||||
|
||||
function sendErrorResponse(requestId: string, error: unknown): void {
|
||||
const response: DesktopWorkspaceAppExternalRendererResponse = {
|
||||
requestId,
|
||||
result: {
|
||||
ok: false,
|
||||
error: {
|
||||
code: "UNKNOWN",
|
||||
message: error instanceof Error ? error.message : String(error)
|
||||
}
|
||||
}
|
||||
};
|
||||
ipcRenderer.send(desktopIpcChannels.appExternal.rendererResponse, response);
|
||||
}
|
||||
Reference in New Issue
Block a user