@xploai/daemon 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,135 @@
1
+ #!/usr/bin/env node
2
+ import crypto from "node:crypto";
3
+ import { Command } from "commander";
4
+ import { homedir } from "node:os";
5
+ import { SkillsScanner, detectAiEnvironment, ClawAdapter, ClaudeCodeAdapter, CodexAdapter, } from "@xploai/core";
6
+ import { BackendClient } from "../src/backend-client.js";
7
+ import { TaskWorker } from "../src/task-worker.js";
8
+ const VERSION = "0.1.0";
9
+ const program = new Command()
10
+ .name("agent-dashboard-daemon")
11
+ .description("Local daemon for Agent Dashboard — polls backend for durable task execution")
12
+ .version(VERSION)
13
+ .option("--backend-url <url>", "HTTP URL of the backend task control plane", process.env.AGENT_DASHBOARD_BACKEND_URL)
14
+ .option("--api-key <key>", "Machine API key for authentication", process.env.AGENT_DASHBOARD_DAEMON_API_KEY)
15
+ .option("--name <name>", "Human-readable machine name", `${homedir().split("/").pop()}_machine`)
16
+ .option("--openclaw-path <path>", "Path to openclaw binary", process.env.OPENCLAW_PATH ?? "openclaw")
17
+ .option("--openclaw-agent <agent>", "Default OpenClaw agent id for agent.message tasks", process.env.OPENCLAW_AGENT ?? "main")
18
+ .option("--openclaw-session-id <sessionId>", "Default OpenClaw session id for agent.message tasks")
19
+ .option("--openclaw-to <target>", "Default OpenClaw target for agent.message tasks")
20
+ .option("--openclaw-local", "Run OpenClaw agent messages with --local by default", false)
21
+ .option("--claude-code-path <path>", "Path to claude binary", process.env.CLAUDE_CODE_PATH ?? "claude")
22
+ .option("--claude-code-model <model>", "Default model for Claude Code tasks")
23
+ .option("--claude-code-max-turns <turns>", "Default max turns for Claude Code tasks")
24
+ .option("--codex-path <path>", "Path to codex binary", process.env.CODEX_PATH ?? "codex")
25
+ .option("--codex-model <model>", "Default model for Codex tasks")
26
+ .option("--codex-approval-mode <mode>", "Default Codex approval mode (suggest|auto-edit|full-auto)")
27
+ .option("--skills-lock <path>", "Path to skills-lock.json");
28
+ program.parse();
29
+ const opts = program.opts();
30
+ async function main() {
31
+ if (!opts.backendUrl) {
32
+ console.error("--backend-url is required (or set AGENT_DASHBOARD_BACKEND_URL)");
33
+ process.exit(1);
34
+ }
35
+ if (!opts.apiKey) {
36
+ console.error("--api-key is required (or set AGENT_DASHBOARD_DAEMON_API_KEY)");
37
+ process.exit(1);
38
+ }
39
+ const skills = new SkillsScanner(opts.skillsLock);
40
+ // Scan skills
41
+ const skillsInfo = skills.scan();
42
+ console.log(`Skills: ${skillsInfo.installedCount} installed, ${skillsInfo.lockedCount} locked`);
43
+ console.log(`Platform: ${skillsInfo.platform}`);
44
+ console.log(`OpenClaw: ${opts.openclawPath}`);
45
+ // Detect installed runtimes (informational — uses PATH-based detection)
46
+ const aiEnv = detectAiEnvironment();
47
+ const detectedRuntimes = aiEnv.tools.map((t) => ({
48
+ id: t.id,
49
+ name: t.name,
50
+ installed: t.installed,
51
+ ready: t.ready,
52
+ version: t.version,
53
+ ...(t.extras ? { extras: t.extras } : {}),
54
+ }));
55
+ console.log(`Detected runtimes: ${detectedRuntimes.map((r) => `${r.id}(${r.ready ? "ready" : "not ready"})`).join(", ") || "none"}`);
56
+ // Build adapters from CLI-configured paths, then probe each one
57
+ const clawOpts = {
58
+ binPath: opts.openclawPath,
59
+ defaults: {
60
+ agent: opts.openclawAgent,
61
+ sessionId: opts.openclawSessionId,
62
+ to: opts.openclawTo,
63
+ local: opts.openclawLocal,
64
+ },
65
+ };
66
+ const claudeCodeOpts = {
67
+ binPath: opts.claudeCodePath,
68
+ defaults: {
69
+ model: opts.claudeCodeModel,
70
+ maxTurns: opts.claudeCodeMaxTurns ? Number(opts.claudeCodeMaxTurns) : undefined,
71
+ },
72
+ };
73
+ const codexOpts = {
74
+ binPath: opts.codexPath,
75
+ defaults: {
76
+ model: opts.codexModel,
77
+ approvalMode: opts.codexApprovalMode,
78
+ },
79
+ };
80
+ const [clawCap, claudeCodeCap, codexCap] = await Promise.all([
81
+ new ClawAdapter(clawOpts).detect(),
82
+ new ClaudeCodeAdapter(claudeCodeOpts).detect(),
83
+ new CodexAdapter(codexOpts).detect(),
84
+ ]);
85
+ // Advertise only agent types whose configured binary is actually executable
86
+ const capabilities = {
87
+ agentTypes: [
88
+ ...(clawCap.available ? ["claw"] : []),
89
+ ...(claudeCodeCap.available ? ["claude_code"] : []),
90
+ ...(codexCap.available ? ["codex"] : []),
91
+ ],
92
+ commands: [...new Set([...clawCap.commands, ...claudeCodeCap.commands, ...codexCap.commands])],
93
+ version: VERSION,
94
+ available: true,
95
+ };
96
+ console.log(`Capabilities: agents=[${capabilities.agentTypes.join(",")}]`);
97
+ // Start backend task worker
98
+ const daemonId = `daemon-${crypto.randomUUID().slice(0, 8)}`;
99
+ console.log(`\nConnecting to backend: ${opts.backendUrl}`);
100
+ console.log(`Machine: ${opts.name}`);
101
+ console.log(`Daemon ID: ${daemonId}`);
102
+ const client = new BackendClient({ baseUrl: opts.backendUrl, apiKey: opts.apiKey });
103
+ const healthy = await client.health();
104
+ if (!healthy) {
105
+ console.error("Backend health check failed — will retry on poll");
106
+ }
107
+ else {
108
+ console.log("Backend health check passed");
109
+ }
110
+ const worker = new TaskWorker({
111
+ client,
112
+ machineName: opts.name,
113
+ daemonId,
114
+ capabilities,
115
+ detectedRuntimes,
116
+ clawOpts: clawCap.available ? clawOpts : undefined,
117
+ claudeCodeOpts: claudeCodeCap.available ? claudeCodeOpts : undefined,
118
+ codexOpts: codexCap.available ? codexOpts : undefined,
119
+ });
120
+ await worker.start();
121
+ console.log("[worker] task polling started");
122
+ // Graceful shutdown
123
+ const shutdown = async () => {
124
+ console.log("\nShutting down...");
125
+ await worker.stop();
126
+ setTimeout(() => process.exit(0), 500);
127
+ };
128
+ process.on("SIGINT", () => void shutdown());
129
+ process.on("SIGTERM", () => void shutdown());
130
+ }
131
+ main().catch((e) => {
132
+ console.error(e);
133
+ process.exit(1);
134
+ });
135
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../bin/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { Task, RuntimeCapability, DetectedRuntime, TaskResult } from "@xploai/shared";
2
+ export interface BackendClientOptions {
3
+ baseUrl: string;
4
+ apiKey: string;
5
+ }
6
+ export declare class BackendClient {
7
+ private baseUrl;
8
+ private headers;
9
+ constructor(opts: BackendClientOptions);
10
+ daemonHeartbeat(daemonId: string, machineId?: string, capabilities?: RuntimeCapability, detectedRuntimes?: DetectedRuntime[]): Promise<{
11
+ ok: boolean;
12
+ machineId?: string;
13
+ machineName?: string;
14
+ }>;
15
+ pollTasks(machineId: string, daemonId: string, capabilities: RuntimeCapability, limit?: number): Promise<Task[]>;
16
+ claimTask(taskId: string, daemonId: string, machineId: string): Promise<string | null>;
17
+ taskHeartbeat(taskId: string, daemonId: string, claimId: string): Promise<boolean>;
18
+ submitResult(taskId: string, daemonId: string, claimId: string, result: TaskResult): Promise<"submitted" | "retryable" | "rejected">;
19
+ reportResultSubmitFailed(taskId: string, daemonId: string, claimId: string, reason?: string): Promise<boolean>;
20
+ health(): Promise<boolean>;
21
+ private post;
22
+ }
@@ -0,0 +1,69 @@
1
+ export class BackendClient {
2
+ baseUrl;
3
+ headers;
4
+ constructor(opts) {
5
+ this.baseUrl = opts.baseUrl.replace(/\/$/, "");
6
+ this.headers = {
7
+ "Content-Type": "application/json",
8
+ Authorization: `Bearer ${opts.apiKey}`,
9
+ };
10
+ }
11
+ async daemonHeartbeat(daemonId, machineId, capabilities, detectedRuntimes) {
12
+ const res = await this.post("/api/daemon/heartbeat", {
13
+ daemonId,
14
+ ...(machineId ? { machineId } : {}),
15
+ capabilities,
16
+ detectedRuntimes,
17
+ });
18
+ if (!res.ok)
19
+ return { ok: false };
20
+ return await res.json();
21
+ }
22
+ async pollTasks(machineId, daemonId, capabilities, limit = 1) {
23
+ const res = await this.post("/api/daemon/poll", { machineId, daemonId, capabilities, limit });
24
+ if (!res.ok)
25
+ return [];
26
+ const body = await res.json();
27
+ return body.tasks;
28
+ }
29
+ async claimTask(taskId, daemonId, machineId) {
30
+ const res = await this.post("/api/daemon/claim", { taskId, daemonId, machineId });
31
+ if (!res.ok)
32
+ return null;
33
+ const body = await res.json();
34
+ return body.claimId;
35
+ }
36
+ async taskHeartbeat(taskId, daemonId, claimId) {
37
+ const res = await this.post("/api/daemon/task-heartbeat", { taskId, daemonId, claimId });
38
+ return res.ok;
39
+ }
40
+ async submitResult(taskId, daemonId, claimId, result) {
41
+ const res = await this.post("/api/daemon/submit-result", { taskId, daemonId, claimId, result });
42
+ if (res.ok)
43
+ return "submitted";
44
+ if (res.status >= 500 || res.status === 408 || res.status === 429)
45
+ return "retryable";
46
+ return "rejected";
47
+ }
48
+ async reportResultSubmitFailed(taskId, daemonId, claimId, reason) {
49
+ const res = await this.post("/api/daemon/result-submit-failed", { taskId, daemonId, claimId, reason });
50
+ return res.ok;
51
+ }
52
+ async health() {
53
+ try {
54
+ const res = await fetch(`${this.baseUrl}/health`, { headers: this.headers });
55
+ return res.ok;
56
+ }
57
+ catch {
58
+ return false;
59
+ }
60
+ }
61
+ async post(path, body) {
62
+ return fetch(`${this.baseUrl}${path}`, {
63
+ method: "POST",
64
+ headers: this.headers,
65
+ body: JSON.stringify(body),
66
+ });
67
+ }
68
+ }
69
+ //# sourceMappingURL=backend-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend-client.js","sourceRoot":"","sources":["../../src/backend-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,40 @@
1
+ import { describe, it } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { execFile } from "node:child_process";
4
+ import { dirname, join } from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+ import { promisify } from "node:util";
7
+ const execFileAsync = promisify(execFile);
8
+ const cliPath = join(dirname(fileURLToPath(import.meta.url)), "..", "bin", "cli.js");
9
+ describe("daemon CLI OpenClaw defaults", () => {
10
+ it("defaults the OpenClaw agent to main", async () => {
11
+ const { stdout } = await execFileAsync(process.execPath, [cliPath, "--help"], {
12
+ env: envWithoutOpenClawAgent(),
13
+ });
14
+ assert.match(openClawAgentHelpLine(stdout), /default: "?main"?/);
15
+ });
16
+ it("uses OPENCLAW_AGENT as the OpenClaw agent default when set", async () => {
17
+ const { stdout } = await execFileAsync(process.execPath, [cliPath, "--help"], {
18
+ env: { ...process.env, OPENCLAW_AGENT: "qa-agent" },
19
+ });
20
+ assert.match(openClawAgentHelpLine(stdout), /default: "?qa-agent"?/);
21
+ });
22
+ });
23
+ function envWithoutOpenClawAgent() {
24
+ const env = { ...process.env };
25
+ delete env.OPENCLAW_AGENT;
26
+ return env;
27
+ }
28
+ function openClawAgentHelpLine(stdout) {
29
+ const lines = stdout.split("\n");
30
+ const optionIndex = lines.findIndex((entry) => entry.includes("--openclaw-agent"));
31
+ assert.notEqual(optionIndex, -1, stdout);
32
+ const block = [lines[optionIndex]];
33
+ for (const line of lines.slice(optionIndex + 1)) {
34
+ if (line.trim().startsWith("--"))
35
+ break;
36
+ block.push(line);
37
+ }
38
+ return block.join(" ");
39
+ }
40
+ //# sourceMappingURL=cli.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.test.js","sourceRoot":"","sources":["../../src/cli.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;AAErF,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE;YAC5E,GAAG,EAAE,uBAAuB,EAAE;SAC/B,CAAC,CAAC;QAEH,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAE,mBAAmB,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC1E,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE;YAC5E,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,cAAc,EAAE,UAAU,EAAE;SACpD,CAAC,CAAC;QAEH,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAE,uBAAuB,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,SAAS,uBAAuB;IAC9B,MAAM,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/B,OAAO,GAAG,CAAC,cAAc,CAAC;IAC1B,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,qBAAqB,CAAC,MAAc;IAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACnF,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAEzC,MAAM,KAAK,GAAa,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;IAC7C,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC,EAAE,CAAC;QAChD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,MAAM;QACxC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC"}
@@ -0,0 +1,45 @@
1
+ import type { RuntimeCapability, DetectedRuntime } from "@xploai/shared";
2
+ import type { BackendClient } from "./backend-client.js";
3
+ import { type ClawAdapterOptions, type ClaudeCodeAdapterOptions, type CodexAdapterOptions } from "@xploai/core";
4
+ export interface TaskWorkerOptions {
5
+ client: BackendClient;
6
+ machineName?: string;
7
+ daemonId: string;
8
+ capabilities: RuntimeCapability;
9
+ detectedRuntimes?: DetectedRuntime[];
10
+ clawOpts?: ClawAdapterOptions;
11
+ claudeCodeOpts?: ClaudeCodeAdapterOptions;
12
+ codexOpts?: CodexAdapterOptions;
13
+ pollIntervalMs?: number;
14
+ heartbeatIntervalMs?: number;
15
+ maxConcurrent?: number;
16
+ }
17
+ export declare class TaskWorker {
18
+ private running;
19
+ private pollTimer;
20
+ private daemonHeartbeatTimer;
21
+ private activeTasks;
22
+ private pendingResults;
23
+ private client;
24
+ private machineId;
25
+ private machineName?;
26
+ private daemonId;
27
+ private capabilities;
28
+ private detectedRuntimes?;
29
+ private clawAdapter;
30
+ private claudeCodeAdapter;
31
+ private codexAdapter;
32
+ private pollIntervalMs;
33
+ private heartbeatIntervalMs;
34
+ private maxConcurrent;
35
+ constructor(opts: TaskWorkerOptions);
36
+ start(): Promise<void>;
37
+ stop(): Promise<void>;
38
+ private schedulePoll;
39
+ private poll;
40
+ private processTask;
41
+ private executeTask;
42
+ private submitWithRetry;
43
+ private flushPendingResults;
44
+ private requireMachineId;
45
+ }
@@ -0,0 +1,218 @@
1
+ import { ClawAdapter, ClaudeCodeAdapter, CodexAdapter, } from "@xploai/core";
2
+ export class TaskWorker {
3
+ running = false;
4
+ pollTimer = null;
5
+ daemonHeartbeatTimer = null;
6
+ activeTasks = new Map();
7
+ pendingResults = new Map();
8
+ client;
9
+ machineId = null;
10
+ machineName;
11
+ daemonId;
12
+ capabilities;
13
+ detectedRuntimes;
14
+ clawAdapter;
15
+ claudeCodeAdapter;
16
+ codexAdapter;
17
+ pollIntervalMs;
18
+ heartbeatIntervalMs;
19
+ maxConcurrent;
20
+ constructor(opts) {
21
+ this.client = opts.client;
22
+ this.machineName = opts.machineName;
23
+ this.daemonId = opts.daemonId;
24
+ this.capabilities = opts.capabilities;
25
+ this.detectedRuntimes = opts.detectedRuntimes;
26
+ this.clawAdapter = opts.clawOpts ? new ClawAdapter(opts.clawOpts) : null;
27
+ this.claudeCodeAdapter = opts.claudeCodeOpts ? new ClaudeCodeAdapter(opts.claudeCodeOpts) : null;
28
+ this.codexAdapter = opts.codexOpts ? new CodexAdapter(opts.codexOpts) : null;
29
+ this.pollIntervalMs = opts.pollIntervalMs ?? 5_000;
30
+ this.heartbeatIntervalMs = opts.heartbeatIntervalMs ?? 30_000;
31
+ this.maxConcurrent = opts.maxConcurrent ?? 1;
32
+ const adapterMap = {
33
+ claw: this.clawAdapter,
34
+ claude_code: this.claudeCodeAdapter,
35
+ codex: this.codexAdapter,
36
+ };
37
+ for (const agentType of this.capabilities.agentTypes) {
38
+ if (!adapterMap[agentType]) {
39
+ throw new Error(`Advertised agentType "${agentType}" has no configured adapter — do not advertise capabilities without a matching executor`);
40
+ }
41
+ }
42
+ }
43
+ async start() {
44
+ if (this.running)
45
+ return;
46
+ this.running = true;
47
+ const heartbeat = await this.client.daemonHeartbeat(this.daemonId, this.machineId ?? undefined, this.capabilities, this.detectedRuntimes);
48
+ if (!heartbeat.ok || !heartbeat.machineId) {
49
+ throw new Error("Failed to register daemon with backend");
50
+ }
51
+ this.machineId = heartbeat.machineId;
52
+ console.log(`[worker] daemon registered: ${this.daemonId} on machine ${heartbeat.machineName ?? this.machineId}`);
53
+ this.daemonHeartbeatTimer = setInterval(async () => {
54
+ try {
55
+ await this.client.daemonHeartbeat(this.daemonId, this.machineId ?? undefined, this.capabilities, this.detectedRuntimes);
56
+ }
57
+ catch (err) {
58
+ console.error("[worker] daemon heartbeat failed:", err);
59
+ }
60
+ }, this.heartbeatIntervalMs);
61
+ this.schedulePoll();
62
+ }
63
+ async stop() {
64
+ this.running = false;
65
+ if (this.pollTimer) {
66
+ clearTimeout(this.pollTimer);
67
+ this.pollTimer = null;
68
+ }
69
+ if (this.daemonHeartbeatTimer) {
70
+ clearInterval(this.daemonHeartbeatTimer);
71
+ this.daemonHeartbeatTimer = null;
72
+ }
73
+ this.activeTasks.clear();
74
+ }
75
+ schedulePoll() {
76
+ if (!this.running)
77
+ return;
78
+ this.pollTimer = setTimeout(() => this.poll(), this.pollIntervalMs);
79
+ }
80
+ async poll() {
81
+ if (!this.running)
82
+ return;
83
+ try {
84
+ await this.flushPendingResults();
85
+ if (this.activeTasks.size >= this.maxConcurrent) {
86
+ this.schedulePoll();
87
+ return;
88
+ }
89
+ const tasks = await this.client.pollTasks(this.requireMachineId(), this.daemonId, this.capabilities, 1);
90
+ if (tasks.length > 0) {
91
+ void this.processTask(tasks[0]);
92
+ }
93
+ }
94
+ catch (err) {
95
+ console.error("[worker] poll error:", err);
96
+ }
97
+ this.schedulePoll();
98
+ }
99
+ async processTask(task) {
100
+ console.log(`[worker] claiming task ${task.id} (${task.agentType ?? task.executor})`);
101
+ const claimId = await this.client.claimTask(task.id, this.daemonId, this.requireMachineId());
102
+ if (!claimId) {
103
+ console.log(`[worker] failed to claim task ${task.id}`);
104
+ return;
105
+ }
106
+ console.log(`[worker] claimed task ${task.id}, claimId=${claimId}`);
107
+ this.activeTasks.set(task.id, { claimId });
108
+ await this.client.taskHeartbeat(task.id, this.daemonId, claimId);
109
+ let result;
110
+ const startTime = Date.now();
111
+ try {
112
+ result = await this.executeTask(task, claimId);
113
+ }
114
+ catch (err) {
115
+ result = {
116
+ taskId: task.id,
117
+ finalStatus: "failed",
118
+ texts: [err.message],
119
+ artifacts: [],
120
+ };
121
+ }
122
+ result.durationMs = Date.now() - startTime;
123
+ this.activeTasks.delete(task.id);
124
+ await this.submitWithRetry(task.id, claimId, result);
125
+ }
126
+ async executeTask(task, claimId) {
127
+ const params = task.metadata?.params ?? {};
128
+ const hooks = {
129
+ onHeartbeat: () => this.client.taskHeartbeat(task.id, this.daemonId, claimId).then(() => { }),
130
+ onProgress: (msg) => console.log(`[worker] task ${task.id}: ${msg}`),
131
+ };
132
+ switch (task.agentType) {
133
+ case "claw":
134
+ if (!this.clawAdapter) {
135
+ return { taskId: task.id, finalStatus: "failed", texts: ["OpenClaw adapter not configured"], artifacts: [] };
136
+ }
137
+ return this.clawAdapter.run(task, params, hooks);
138
+ case "claude_code":
139
+ if (!this.claudeCodeAdapter) {
140
+ return { taskId: task.id, finalStatus: "failed", texts: ["Claude Code adapter not configured"], artifacts: [] };
141
+ }
142
+ return this.claudeCodeAdapter.run(task, params, hooks);
143
+ case "codex":
144
+ if (!this.codexAdapter) {
145
+ return { taskId: task.id, finalStatus: "failed", texts: ["Codex adapter not configured"], artifacts: [] };
146
+ }
147
+ return this.codexAdapter.run(task, params, hooks);
148
+ default:
149
+ return {
150
+ taskId: task.id,
151
+ finalStatus: "failed",
152
+ texts: [`Unsupported agent type: ${task.agentType}`],
153
+ artifacts: [],
154
+ };
155
+ }
156
+ }
157
+ async submitWithRetry(taskId, claimId, result, retries = 3) {
158
+ for (let attempt = 0; attempt < retries; attempt++) {
159
+ try {
160
+ const outcome = await this.client.submitResult(taskId, this.daemonId, claimId, result);
161
+ if (outcome === "submitted") {
162
+ console.log(`[worker] submitted result for task ${taskId}: ${result.finalStatus}`);
163
+ return;
164
+ }
165
+ if (outcome === "rejected") {
166
+ console.warn(`[worker] submit rejected permanently for task ${taskId}`);
167
+ await this.client.reportResultSubmitFailed(taskId, this.daemonId, claimId, "backend rejected final result submission");
168
+ return;
169
+ }
170
+ console.warn(`[worker] submit rejected for task ${taskId} (attempt ${attempt + 1})`);
171
+ }
172
+ catch (err) {
173
+ console.error(`[worker] submit failed for task ${taskId} (attempt ${attempt + 1}):`, err);
174
+ }
175
+ if (attempt < retries - 1) {
176
+ await sleep(1000 * Math.pow(2, attempt));
177
+ }
178
+ }
179
+ console.error(`[worker] retaining pending result for task ${taskId} after ${retries} attempts`);
180
+ this.pendingResults.set(taskId, { claimId, result, nextAttemptAt: Date.now() + 5_000 });
181
+ }
182
+ async flushPendingResults() {
183
+ const now = Date.now();
184
+ for (const [taskId, pending] of this.pendingResults) {
185
+ if (pending.nextAttemptAt > now)
186
+ continue;
187
+ try {
188
+ const outcome = await this.client.submitResult(taskId, this.daemonId, pending.claimId, pending.result);
189
+ if (outcome === "submitted") {
190
+ this.pendingResults.delete(taskId);
191
+ console.log(`[worker] replayed pending result for task ${taskId}: ${pending.result.finalStatus}`);
192
+ continue;
193
+ }
194
+ if (outcome === "rejected") {
195
+ this.pendingResults.delete(taskId);
196
+ console.warn(`[worker] pending result replay rejected permanently for task ${taskId}`);
197
+ await this.client.reportResultSubmitFailed(taskId, this.daemonId, pending.claimId, "backend rejected pending result replay");
198
+ continue;
199
+ }
200
+ console.warn(`[worker] pending result replay rejected for task ${taskId}`);
201
+ }
202
+ catch (err) {
203
+ console.error(`[worker] pending result replay failed for task ${taskId}:`, err);
204
+ }
205
+ pending.nextAttemptAt = Date.now() + 30_000;
206
+ }
207
+ }
208
+ requireMachineId() {
209
+ if (!this.machineId) {
210
+ throw new Error(`Daemon is not registered${this.machineName ? ` for ${this.machineName}` : ""}`);
211
+ }
212
+ return this.machineId;
213
+ }
214
+ }
215
+ function sleep(ms) {
216
+ return new Promise((r) => setTimeout(r, ms));
217
+ }
218
+ //# sourceMappingURL=task-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-worker.js","sourceRoot":"","sources":["../../src/task-worker.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "@xploai/daemon",
3
+ "version": "1.0.0",
4
+ "description": "Local daemon for Agent Dashboard — polls backend for durable task execution.",
5
+ "publishConfig": {
6
+ "access": "public"
7
+ },
8
+ "type": "module",
9
+ "bin": {
10
+ "agent-dashboard-daemon": "dist/bin/cli.js"
11
+ },
12
+ "files": [
13
+ "dist"
14
+ ],
15
+ "scripts": {
16
+ "build": "tsc",
17
+ "dev": "tsx watch bin/cli.ts",
18
+ "test": "npm run build && node --test dist/src/**/*.test.js"
19
+ },
20
+ "dependencies": {
21
+ "@xploai/core": "^1.0.0",
22
+ "@xploai/shared": "^1.0.0",
23
+ "commander": "^12.1.0"
24
+ },
25
+ "devDependencies": {
26
+ "@types/node": "^22.10.1",
27
+ "tsx": "^4.19.2",
28
+ "typescript": "^5.7.2"
29
+ },
30
+ "engines": {
31
+ "node": ">=18"
32
+ }
33
+ }