mirror of
https://github.com/openclaw/openclaw.git
synced 2026-08-02 20:21:33 +00:00
* feat(linux): canvas via CLI-node + Tauri app IPC bridge * refactor: extract gateway helper modules * build(linux-canvas): register plugin package in lockfile * fix(linux-canvas): move canvas advertise test out of core, regen docs/protocol/deadcode * fix(gateway): break node-catalog/registry import cycle via leaf normalize module; add canvas glossary term * style: oxfmt invoke.ts and runtime.ts after buildNodeEventParams extraction * fix(linux): load Canvas WebView via dedicated data_directory context Wry's Linux/WebKitGTK incognito mode discards Tauri's registered WebContext (wry webkitgtk/mod.rs), so the Canvas window got a fresh ephemeral context without the openclaw-canvas:// scheme handler — the bundled A2UI page never committed (stayed about:blank) and every A2UI command timed out. Use an isolated cache-backed data_directory instead, which keeps the protocol handler while still isolating Canvas storage from the dashboard window. * fix(linux): keep Canvas WebView ephemeral via incognito + data_directory Autoreview flagged that a dedicated data_directory alone persists Canvas browser state (cookies, localStorage, IndexedDB, service workers) across restarts, so an agent that navigates Canvas to a site could leak an authenticated session into a later session. iOS uses a non-persistent store; Linux should match. Add .incognito(true) alongside .data_directory(): the distinct directory gives Tauri a fresh WebContext key so it still attaches the openclaw-canvas:// protocol closure, and incognito makes Wry swap in a fresh *ephemeral* context carrying those protocols. Live-verified on a Wayland/WebKitGTK box: the bundled page still loads (location.href=openclaw-canvas://localhost/index.html, openclawA2UI present, A2UI renders) and the canvas-webview dir holds no persistent cookie/storage files.
88 lines
2.4 KiB
TypeScript
88 lines
2.4 KiB
TypeScript
/** Shared node-host request, result, event, and approval-bin provider contracts. */
|
|
import type { SkillBinTrustEntry, SystemRunApprovalPlan } from "../infra/exec-approvals.js";
|
|
|
|
/**
|
|
* Shared request/result/event types for node-host command execution.
|
|
*
|
|
* These contracts are consumed by Gateway invoke handling, approval planning,
|
|
* and node-host event emission.
|
|
*/
|
|
/** Gateway invoke frame delivered to node-host command handlers. */
|
|
export type NodeInvokeRequestPayload = {
|
|
id: string;
|
|
nodeId: string;
|
|
command: string;
|
|
paramsJSON?: string | null;
|
|
timeoutMs?: number | null;
|
|
idempotencyKey?: string | null;
|
|
sessionKey?: string | null;
|
|
};
|
|
|
|
/** Input payload for a node-host system.run invocation. */
|
|
export type SystemRunParams = {
|
|
command: string[];
|
|
rawCommand?: string | null;
|
|
systemRunPlan?: SystemRunApprovalPlan | null;
|
|
cwd?: string | null;
|
|
env?: Record<string, string>;
|
|
timeoutMs?: number | null;
|
|
needsScreenRecording?: boolean | null;
|
|
agentId?: string | null;
|
|
sessionKey?: string | null;
|
|
approved?: boolean | null;
|
|
approvalDecision?: string | null;
|
|
approvalSource?: string | null;
|
|
runId?: string | null;
|
|
suppressNotifyOnExit?: boolean | null;
|
|
};
|
|
|
|
/** Captured process result returned by system.run execution. */
|
|
export type RunResult = {
|
|
exitCode?: number;
|
|
timedOut: boolean;
|
|
noOutputTimedOut?: boolean;
|
|
success: boolean;
|
|
stdout: string;
|
|
stderr: string;
|
|
error?: string | null;
|
|
truncated: boolean;
|
|
};
|
|
|
|
/** Gateway event payload emitted for exec lifecycle notifications. */
|
|
export type ExecEventPayload = {
|
|
sessionKey: string;
|
|
runId: string;
|
|
host: string;
|
|
command?: string;
|
|
exitCode?: number;
|
|
timedOut?: boolean;
|
|
success?: boolean;
|
|
output?: string;
|
|
reason?: string;
|
|
suppressNotifyOnExit?: boolean;
|
|
};
|
|
|
|
/** Normalized exec result fields used when building finished events. */
|
|
export type ExecFinishedResult = {
|
|
stdout?: string;
|
|
stderr?: string;
|
|
error?: string | null;
|
|
exitCode?: number | null;
|
|
timedOut?: boolean;
|
|
success?: boolean;
|
|
};
|
|
|
|
/** Inputs required to emit an exec finished event. */
|
|
export type ExecFinishedEventParams = {
|
|
sessionKey: string;
|
|
runId: string;
|
|
commandText: string;
|
|
result: ExecFinishedResult;
|
|
suppressNotifyOnExit?: boolean;
|
|
};
|
|
|
|
/** Provider for trusted skill-bin entries used during approval checks. */
|
|
export type SkillBinsProvider = {
|
|
current(force?: boolean): Promise<SkillBinTrustEntry[]>;
|
|
};
|