feat: initialize ZCLAW project with core systems and Tauri desktop

- Created backend core systems:
  - Remote Execution System (远程执行系统)
  - Task Orchestration Engine (任务编排引擎)
  - Persistent Memory System (持续记忆系统)
  - Proactive Service System (主动服务系统)

- Created Tauri desktop app:
  - Three-column layout based on AutoClaw design
  - React + TypeScript + Tailwind CSS
  - Zustand state management
  - Lucide React icons

- Components:
  - Sidebar (Agent list, IM channels, scheduled tasks)
  - ChatArea (Chat interface with message bubbles)
  - RightPanel (Task progress, statistics, next actions)

Next: Test Tauri dev server and integrate with OpenClaw backend
This commit is contained in:
iven
2026-03-11 22:06:07 +08:00
commit 045e9cef5b
59 changed files with 2819 additions and 0 deletions

View File

@@ -0,0 +1,125 @@
// 远程执行系统 - 实现类
import type {
RemoteExecutionSystem,
Device,
Task,
TaskStatus,
StatusHandler,
Result,
DeviceStatus
} from './types';
export class RemoteExecutionEngine implements RemoteExecutionSystem {
private devices: Map<string, Device> = new Map();
private tasks: Map<string, Task> = new Map();
private subscriptions: Map<string, StatusHandler[]> = new Map();
private taskQueue: Task[] = [];
async registerDevice(device: Device): Promise<void> {
this.devices.set(device.id, device);
console.log([RemoteExecution] Device registered: ());
}
async heartbeat(deviceId: string): Promise<DeviceStatus> {
const device = this.devices.get(deviceId);
if (!device) {
throw new Error(Device not found: );
}
device.lastHeartbeat = new Date();
return device.status;
}
async submitTask(task: Task): Promise<string> {
task.id = task.id || this.generateId();
task.status = 'pending';
task.createdAt = new Date();
this.tasks.set(task.id, task);
this.taskQueue.push(task);
console.log([RemoteExecution] Task submitted: );
// 立即执行(后续会改为队列处理)
this.executeTask(task).catch(console.error);
return task.id;
}
async cancelTask(taskId: string): Promise<void> {
const task = this.tasks.get(taskId);
if (!task) {
throw new Error(Task not found: );
}
task.status = 'cancelled';
this.notifySubscribers(taskId, 'cancelled');
}
async getStatus(taskId: string): Promise<TaskStatus> {
const task = this.tasks.get(taskId);
if (!task) {
throw new Error(Task not found: );
}
return task.status;
}
subscribe(taskId: string, handler: StatusHandler): void {
if (!this.subscriptions.has(taskId)) {
this.subscriptions.set(taskId, []);
}
this.subscriptions.get(taskId)!.push(handler);
}
async pushResult(taskId: string, result: Result): Promise<void> {
const task = this.tasks.get(taskId);
if (!task) {
throw new Error(Task not found: );
}
task.result = result;
task.status = result.success ? 'completed' : 'failed';
task.completedAt = new Date();
this.notifySubscribers(taskId, task.status);
}
private async executeTask(task: Task): Promise<void> {
try {
task.status = 'running';
task.startedAt = new Date();
this.notifySubscribers(task.id, 'running');
// TODO: 实际执行逻辑(调用 OpenClaw SDK
console.log([RemoteExecution] Executing task: );
// 模拟执行
await new Promise(resolve => setTimeout(resolve, 1000));
await this.pushResult(task.id, {
taskId: task.id,
success: true,
data: { message: 'Task completed successfully' }
});
} catch (error: any) {
await this.pushResult(task.id, {
taskId: task.id,
success: false,
error: error.message
});
}
}
private notifySubscribers(taskId: string, status: TaskStatus, progress?: number): void {
const handlers = this.subscriptions.get(taskId);
if (handlers) {
handlers.forEach(handler => handler(status, progress));
}
}
private generateId(): string {
return ask__;
}
}