- ctx CLI: validate int() limit arg, wrap FTS5 MATCH in try/except - ctx.rs: FTS5 error message clarity, Mutex::lock() returns Err not panic - sdk-messages.ts: runtime type guards (str/num) replace bare `as` casts - agent-runner.ts: strip ANTHROPIC_* env vars alongside CLAUDE* - agent-dispatcher.ts: timestamps use seconds (match session.rs convention) - remote.rs: disconnect handler uses lock().await not try_lock() - session.rs: propagate pane_ids serialization error - watcher.rs: reject root-level paths instead of silent no-op - lib.rs: log warnings on profile.toml read failure and resource_dir error - agent-bridge.ts: validate event payload is object before cast
69 lines
2 KiB
TypeScript
69 lines
2 KiB
TypeScript
// Agent Bridge — Tauri IPC adapter for sidecar communication
|
|
// Mirrors pty-bridge.ts pattern: invoke for commands, listen for events
|
|
|
|
import { invoke } from '@tauri-apps/api/core';
|
|
import { listen, type UnlistenFn } from '@tauri-apps/api/event';
|
|
|
|
export interface AgentQueryOptions {
|
|
session_id: string;
|
|
prompt: string;
|
|
cwd?: string;
|
|
max_turns?: number;
|
|
max_budget_usd?: number;
|
|
resume_session_id?: string;
|
|
permission_mode?: string;
|
|
setting_sources?: string[];
|
|
system_prompt?: string;
|
|
model?: string;
|
|
claude_config_dir?: string;
|
|
additional_directories?: string[];
|
|
remote_machine_id?: string;
|
|
}
|
|
|
|
export async function queryAgent(options: AgentQueryOptions): Promise<void> {
|
|
if (options.remote_machine_id) {
|
|
const { remote_machine_id: machineId, ...agentOptions } = options;
|
|
return invoke('remote_agent_query', { machineId, options: agentOptions });
|
|
}
|
|
return invoke('agent_query', { options });
|
|
}
|
|
|
|
export async function stopAgent(sessionId: string, remoteMachineId?: string): Promise<void> {
|
|
if (remoteMachineId) {
|
|
return invoke('remote_agent_stop', { machineId: remoteMachineId, sessionId });
|
|
}
|
|
return invoke('agent_stop', { sessionId });
|
|
}
|
|
|
|
export async function isAgentReady(): Promise<boolean> {
|
|
return invoke<boolean>('agent_ready');
|
|
}
|
|
|
|
export async function restartAgent(): Promise<void> {
|
|
return invoke('agent_restart');
|
|
}
|
|
|
|
export interface SidecarMessage {
|
|
type: string;
|
|
sessionId?: string;
|
|
event?: Record<string, unknown>;
|
|
message?: string;
|
|
exitCode?: number | null;
|
|
signal?: string | null;
|
|
}
|
|
|
|
export async function onSidecarMessage(
|
|
callback: (msg: SidecarMessage) => void,
|
|
): Promise<UnlistenFn> {
|
|
return listen<SidecarMessage>('sidecar-message', (event) => {
|
|
const payload = event.payload;
|
|
if (typeof payload !== 'object' || payload === null) return;
|
|
callback(payload as SidecarMessage);
|
|
});
|
|
}
|
|
|
|
export async function onSidecarExited(callback: () => void): Promise<UnlistenFn> {
|
|
return listen('sidecar-exited', () => {
|
|
callback();
|
|
});
|
|
}
|