@arc402/daemon 1.2.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.
- package/bin/arc402-daemon +3 -0
- package/dist/abis.d.ts +20 -0
- package/dist/abis.d.ts.map +1 -0
- package/dist/abis.js +214 -0
- package/dist/abis.js.map +1 -0
- package/dist/api.d.ts +32 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +430 -0
- package/dist/api.js.map +1 -0
- package/dist/auth-server.d.ts +50 -0
- package/dist/auth-server.d.ts.map +1 -0
- package/dist/auth-server.js +266 -0
- package/dist/auth-server.js.map +1 -0
- package/dist/bundler.d.ts +68 -0
- package/dist/bundler.d.ts.map +1 -0
- package/dist/bundler.js +181 -0
- package/dist/bundler.js.map +1 -0
- package/dist/capabilities.d.ts +17 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +57 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/compute-metering.d.ts +61 -0
- package/dist/compute-metering.d.ts.map +1 -0
- package/dist/compute-metering.js +299 -0
- package/dist/compute-metering.js.map +1 -0
- package/dist/compute-session.d.ts +100 -0
- package/dist/compute-session.d.ts.map +1 -0
- package/dist/compute-session.js +231 -0
- package/dist/compute-session.js.map +1 -0
- package/dist/config.d.ts +121 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +397 -0
- package/dist/config.js.map +1 -0
- package/dist/context-manager.d.ts +17 -0
- package/dist/context-manager.d.ts.map +1 -0
- package/dist/context-manager.js +123 -0
- package/dist/context-manager.js.map +1 -0
- package/dist/credentials.d.ts +24 -0
- package/dist/credentials.d.ts.map +1 -0
- package/dist/credentials.js +80 -0
- package/dist/credentials.js.map +1 -0
- package/dist/delivery-client.d.ts +35 -0
- package/dist/delivery-client.d.ts.map +1 -0
- package/dist/delivery-client.js +231 -0
- package/dist/delivery-client.js.map +1 -0
- package/dist/endpoint-policy.d.ts +11 -0
- package/dist/endpoint-policy.d.ts.map +1 -0
- package/dist/endpoint-policy.js +107 -0
- package/dist/endpoint-policy.js.map +1 -0
- package/dist/event-watchers.d.ts +11 -0
- package/dist/event-watchers.d.ts.map +1 -0
- package/dist/event-watchers.js +24 -0
- package/dist/event-watchers.js.map +1 -0
- package/dist/exec-state.d.ts +37 -0
- package/dist/exec-state.d.ts.map +1 -0
- package/dist/exec-state.js +53 -0
- package/dist/exec-state.js.map +1 -0
- package/dist/file-delivery.d.ts +98 -0
- package/dist/file-delivery.d.ts.map +1 -0
- package/dist/file-delivery.js +473 -0
- package/dist/file-delivery.js.map +1 -0
- package/dist/handshake-watcher.d.ts +31 -0
- package/dist/handshake-watcher.d.ts.map +1 -0
- package/dist/handshake-watcher.js +157 -0
- package/dist/handshake-watcher.js.map +1 -0
- package/dist/hire-listener.d.ts +32 -0
- package/dist/hire-listener.d.ts.map +1 -0
- package/dist/hire-listener.js +237 -0
- package/dist/hire-listener.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +182 -0
- package/dist/index.js.map +1 -0
- package/dist/job-lifecycle.d.ts +62 -0
- package/dist/job-lifecycle.d.ts.map +1 -0
- package/dist/job-lifecycle.js +201 -0
- package/dist/job-lifecycle.js.map +1 -0
- package/dist/notify.d.ts +51 -0
- package/dist/notify.d.ts.map +1 -0
- package/dist/notify.js +276 -0
- package/dist/notify.js.map +1 -0
- package/dist/permission-gate.d.ts +30 -0
- package/dist/permission-gate.d.ts.map +1 -0
- package/dist/permission-gate.js +180 -0
- package/dist/permission-gate.js.map +1 -0
- package/dist/prompt-guard.d.ts +18 -0
- package/dist/prompt-guard.d.ts.map +1 -0
- package/dist/prompt-guard.js +70 -0
- package/dist/prompt-guard.js.map +1 -0
- package/dist/server.d.ts +27 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +1956 -0
- package/dist/server.js.map +1 -0
- package/dist/session-manager.d.ts +55 -0
- package/dist/session-manager.d.ts.map +1 -0
- package/dist/session-manager.js +139 -0
- package/dist/session-manager.js.map +1 -0
- package/dist/signer.d.ts +19 -0
- package/dist/signer.d.ts.map +1 -0
- package/dist/signer.js +195 -0
- package/dist/signer.js.map +1 -0
- package/dist/token-metering.d.ts +42 -0
- package/dist/token-metering.d.ts.map +1 -0
- package/dist/token-metering.js +178 -0
- package/dist/token-metering.js.map +1 -0
- package/dist/userops.d.ts +24 -0
- package/dist/userops.d.ts.map +1 -0
- package/dist/userops.js +156 -0
- package/dist/userops.js.map +1 -0
- package/dist/wallet-monitor.d.ts +16 -0
- package/dist/wallet-monitor.d.ts.map +1 -0
- package/dist/wallet-monitor.js +57 -0
- package/dist/wallet-monitor.js.map +1 -0
- package/dist/worker-executor.d.ts +81 -0
- package/dist/worker-executor.d.ts.map +1 -0
- package/dist/worker-executor.js +527 -0
- package/dist/worker-executor.js.map +1 -0
- package/dist/worker-router.d.ts +63 -0
- package/dist/worker-router.d.ts.map +1 -0
- package/dist/worker-router.js +263 -0
- package/dist/worker-router.js.map +1 -0
- package/package.json +30 -0
|
@@ -0,0 +1,527 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.WorkerExecutor = void 0;
|
|
37
|
+
/**
|
|
38
|
+
* ARC-402 Worker Executor
|
|
39
|
+
*
|
|
40
|
+
* Spawns an agent to complete hired work inside the job directory.
|
|
41
|
+
* On completion, scans the job dir for output files and uploads them to
|
|
42
|
+
* FileDeliveryManager. Computes root hash for on-chain delivery.
|
|
43
|
+
*
|
|
44
|
+
* Supported agent runtimes:
|
|
45
|
+
* - openclaw (preferred): Full OpenClaw gateway — can spawn any ACP
|
|
46
|
+
* (Claude Code, Codex, Gemini, Pi, etc.) and orchestrate multi-agent work.
|
|
47
|
+
* Command: openclaw run '<task>' --workdir <jobDir>
|
|
48
|
+
* - claude-code: Direct Claude Code CLI.
|
|
49
|
+
* Command: claude --permission-mode bypassPermissions --print '<task>'
|
|
50
|
+
* - codex: Direct Codex CLI.
|
|
51
|
+
* Command: codex --print '<task>'
|
|
52
|
+
* - shell: Raw shell execution.
|
|
53
|
+
* Command: /bin/sh -c '<task>'
|
|
54
|
+
*
|
|
55
|
+
* Job directory: ~/.arc402/jobs/agreement-<id>/
|
|
56
|
+
*/
|
|
57
|
+
const fs = __importStar(require("fs"));
|
|
58
|
+
const path = __importStar(require("path"));
|
|
59
|
+
const os = __importStar(require("os"));
|
|
60
|
+
const http = __importStar(require("http"));
|
|
61
|
+
const https = __importStar(require("https"));
|
|
62
|
+
const child_process_1 = require("child_process");
|
|
63
|
+
const job_lifecycle_js_1 = require("./job-lifecycle.js");
|
|
64
|
+
const prompt_guard_js_1 = require("./prompt-guard.js");
|
|
65
|
+
const context_manager_js_1 = require("./context-manager.js");
|
|
66
|
+
const ARC402_DIR = path.join(os.homedir(), ".arc402");
|
|
67
|
+
const JOBS_DIR = path.join(ARC402_DIR, "jobs");
|
|
68
|
+
const WORKER_DIR = process.env.ARC402_WORKER_DIR || path.join(ARC402_DIR, "worker");
|
|
69
|
+
// ─── Helpers: read worker context ─────────────────────────────────────────────
|
|
70
|
+
function readFileOrEmpty(filePath) {
|
|
71
|
+
try {
|
|
72
|
+
return fs.readFileSync(filePath, "utf-8").trim();
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return "";
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Read all .md files from a directory, concatenated, up to maxBytes.
|
|
80
|
+
* Returns empty string if dir doesn't exist or is empty.
|
|
81
|
+
*/
|
|
82
|
+
function readDirMd(dirPath, maxBytes) {
|
|
83
|
+
if (!fs.existsSync(dirPath))
|
|
84
|
+
return "";
|
|
85
|
+
const parts = [];
|
|
86
|
+
let totalSize = 0;
|
|
87
|
+
try {
|
|
88
|
+
const files = fs.readdirSync(dirPath)
|
|
89
|
+
.filter(f => f.endsWith(".md") || f.endsWith(".txt") || f.endsWith(".json"))
|
|
90
|
+
.sort();
|
|
91
|
+
for (const file of files) {
|
|
92
|
+
if (file.startsWith("."))
|
|
93
|
+
continue;
|
|
94
|
+
const content = readFileOrEmpty(path.join(dirPath, file));
|
|
95
|
+
if (!content)
|
|
96
|
+
continue;
|
|
97
|
+
const entry = `### ${file}\n${content}`;
|
|
98
|
+
if (totalSize + entry.length > maxBytes)
|
|
99
|
+
break;
|
|
100
|
+
parts.push(entry);
|
|
101
|
+
totalSize += entry.length;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch { /* dir unreadable */ }
|
|
105
|
+
return parts.join("\n\n");
|
|
106
|
+
}
|
|
107
|
+
// ─── WorkerExecutor ───────────────────────────────────────────────────────────
|
|
108
|
+
class WorkerExecutor {
|
|
109
|
+
constructor(opts) {
|
|
110
|
+
this.jobs = new Map();
|
|
111
|
+
this.queue = [];
|
|
112
|
+
this.runningCount = 0;
|
|
113
|
+
// Callback invoked when a job completes with a root hash
|
|
114
|
+
this.onJobCompleted = null;
|
|
115
|
+
this.onJobFailed = null;
|
|
116
|
+
this.log = () => { };
|
|
117
|
+
this.maxConcurrentJobs = opts.maxConcurrentJobs ?? 2;
|
|
118
|
+
this.jobTimeoutMs = (opts.jobTimeoutSeconds ?? 3600) * 1000;
|
|
119
|
+
this.agentType = opts.agentType ?? "openclaw";
|
|
120
|
+
this.autoExecute = opts.autoExecute ?? true;
|
|
121
|
+
this.delivery = opts.delivery;
|
|
122
|
+
this.signer = opts.signer ?? null;
|
|
123
|
+
this.serviceAgreementAddress = opts.serviceAgreementAddress ?? null;
|
|
124
|
+
}
|
|
125
|
+
// ── Public API ────────────────────────────────────────────────────────────
|
|
126
|
+
/**
|
|
127
|
+
* Enqueue a job. If auto_execute is true, starts immediately (up to concurrency limit).
|
|
128
|
+
* Returns the WorkerExecution record.
|
|
129
|
+
*/
|
|
130
|
+
enqueue(params) {
|
|
131
|
+
const { agreementId, capability, specHash } = params;
|
|
132
|
+
// Idempotent — return existing record if present
|
|
133
|
+
const existing = this.jobs.get(agreementId);
|
|
134
|
+
if (existing)
|
|
135
|
+
return this.toPublic(existing);
|
|
136
|
+
const jobDir = (0, job_lifecycle_js_1.createJobDirectory)(agreementId);
|
|
137
|
+
// Write task.md to job dir
|
|
138
|
+
const taskText = params.taskDescription ?? this.buildTask(capability, specHash, agreementId);
|
|
139
|
+
const guardResult = (0, prompt_guard_js_1.guardTaskContent)(taskText);
|
|
140
|
+
if (!guardResult.safe) {
|
|
141
|
+
throw new Error(`Task content rejected by PromptGuard: ${guardResult.category}`);
|
|
142
|
+
}
|
|
143
|
+
fs.writeFileSync(path.join(jobDir, "task.md"), taskText, "utf-8");
|
|
144
|
+
const record = {
|
|
145
|
+
agreementId,
|
|
146
|
+
capability,
|
|
147
|
+
specHash,
|
|
148
|
+
jobDir,
|
|
149
|
+
agentType: this.agentType,
|
|
150
|
+
pid: null,
|
|
151
|
+
status: "queued",
|
|
152
|
+
startedAt: Date.now(),
|
|
153
|
+
completedAt: null,
|
|
154
|
+
exitCode: null,
|
|
155
|
+
deliverableHash: null,
|
|
156
|
+
error: null,
|
|
157
|
+
process: null,
|
|
158
|
+
timeoutHandle: null,
|
|
159
|
+
};
|
|
160
|
+
this.jobs.set(agreementId, record);
|
|
161
|
+
this.queue.push(agreementId);
|
|
162
|
+
this.log({ event: "worker_queued", agreement_id: agreementId, capability });
|
|
163
|
+
if (this.autoExecute) {
|
|
164
|
+
this.drainQueue();
|
|
165
|
+
}
|
|
166
|
+
return this.toPublic(record);
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Get current status of a job.
|
|
170
|
+
*/
|
|
171
|
+
getStatus(agreementId) {
|
|
172
|
+
const rec = this.jobs.get(agreementId);
|
|
173
|
+
return rec ? this.toPublic(rec) : null;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Get all jobs (for status IPC command).
|
|
177
|
+
*/
|
|
178
|
+
listAll() {
|
|
179
|
+
return Array.from(this.jobs.values()).map(r => this.toPublic(r));
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Read job log contents (for worker-logs IPC command).
|
|
183
|
+
*/
|
|
184
|
+
readLog(agreementId, tail = 200) {
|
|
185
|
+
const logPath = path.join(JOBS_DIR, `agreement-${agreementId}`, "job.log");
|
|
186
|
+
if (!fs.existsSync(logPath))
|
|
187
|
+
return "(no log yet)";
|
|
188
|
+
try {
|
|
189
|
+
const content = fs.readFileSync(logPath, "utf-8");
|
|
190
|
+
const lines = content.split("\n");
|
|
191
|
+
return lines.slice(-tail).join("\n");
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
return "(could not read log)";
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Cancel a queued job. Cannot cancel running jobs.
|
|
199
|
+
*/
|
|
200
|
+
cancel(agreementId) {
|
|
201
|
+
const rec = this.jobs.get(agreementId);
|
|
202
|
+
if (!rec || rec.status !== "queued")
|
|
203
|
+
return false;
|
|
204
|
+
rec.status = "failed";
|
|
205
|
+
rec.error = "cancelled";
|
|
206
|
+
rec.completedAt = Date.now();
|
|
207
|
+
this.queue = this.queue.filter(id => id !== agreementId);
|
|
208
|
+
this.log({ event: "worker_cancelled", agreement_id: agreementId });
|
|
209
|
+
return true;
|
|
210
|
+
}
|
|
211
|
+
// ── Execution ─────────────────────────────────────────────────────────────
|
|
212
|
+
drainQueue() {
|
|
213
|
+
while (this.runningCount < this.maxConcurrentJobs && this.queue.length > 0) {
|
|
214
|
+
const next = this.queue.shift();
|
|
215
|
+
const rec = this.jobs.get(next);
|
|
216
|
+
if (!rec || rec.status !== "queued")
|
|
217
|
+
continue;
|
|
218
|
+
void this.runJob(rec);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
async runJob(rec) {
|
|
222
|
+
this.runningCount++;
|
|
223
|
+
rec.status = "running";
|
|
224
|
+
rec.startedAt = Date.now();
|
|
225
|
+
const logPath = path.join(rec.jobDir, "job.log");
|
|
226
|
+
const logStream = fs.createWriteStream(logPath, { flags: "a" });
|
|
227
|
+
this.log({ event: "worker_started", agreement_id: rec.agreementId, agent: rec.agentType });
|
|
228
|
+
try {
|
|
229
|
+
// openclaw routes through the host gateway HTTP API — no subprocess spawn
|
|
230
|
+
if (rec.agentType === "openclaw") {
|
|
231
|
+
await this.runViaGateway(rec, logStream);
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
const exitCode = await this.spawnAgent(rec, logStream);
|
|
235
|
+
rec.exitCode = exitCode;
|
|
236
|
+
if (exitCode !== 0) {
|
|
237
|
+
throw new Error(`agent exited with code ${exitCode}`);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
// Collect output files and upload
|
|
241
|
+
const manifest = await this.collectDeliverables(rec, logStream);
|
|
242
|
+
rec.deliverableHash = manifest.root_hash;
|
|
243
|
+
logStream.write(`[worker-executor] Deliverable ready — on-chain commit will be handled by daemon onJobCompleted\n`);
|
|
244
|
+
rec.status = "completed";
|
|
245
|
+
rec.completedAt = Date.now();
|
|
246
|
+
this.log({
|
|
247
|
+
event: "worker_completed",
|
|
248
|
+
agreement_id: rec.agreementId,
|
|
249
|
+
root_hash: manifest.root_hash,
|
|
250
|
+
file_count: manifest.files.length,
|
|
251
|
+
duration_ms: rec.completedAt - rec.startedAt,
|
|
252
|
+
});
|
|
253
|
+
this.onJobCompleted?.(rec.agreementId, manifest.root_hash);
|
|
254
|
+
// §9 ContextManager — record learnings from this job (non-blocking)
|
|
255
|
+
context_manager_js_1.contextManager.onJobComplete({
|
|
256
|
+
workerId: this.agentType,
|
|
257
|
+
harness: this.agentType,
|
|
258
|
+
task: rec.capability,
|
|
259
|
+
deliverable: manifest.root_hash,
|
|
260
|
+
agreementId: rec.agreementId,
|
|
261
|
+
durationMs: rec.completedAt - rec.startedAt,
|
|
262
|
+
}).catch(() => { });
|
|
263
|
+
}
|
|
264
|
+
catch (err) {
|
|
265
|
+
const msg = String(err instanceof Error ? err.message : err);
|
|
266
|
+
rec.status = "failed";
|
|
267
|
+
rec.error = msg;
|
|
268
|
+
rec.completedAt = Date.now();
|
|
269
|
+
logStream.write(`\n[worker-executor] FAILED: ${msg}\n`);
|
|
270
|
+
this.log({ event: "worker_failed", agreement_id: rec.agreementId, error: msg });
|
|
271
|
+
this.onJobFailed?.(rec.agreementId, msg);
|
|
272
|
+
}
|
|
273
|
+
finally {
|
|
274
|
+
logStream.end();
|
|
275
|
+
rec.process = null;
|
|
276
|
+
if (rec.timeoutHandle) {
|
|
277
|
+
clearTimeout(rec.timeoutHandle);
|
|
278
|
+
rec.timeoutHandle = null;
|
|
279
|
+
}
|
|
280
|
+
this.runningCount--;
|
|
281
|
+
this.drainQueue();
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Execute a job via the host OpenClaw gateway OpenAI-compatible HTTP API.
|
|
286
|
+
* Uses POST /v1/chat/completions (not /agent).
|
|
287
|
+
*/
|
|
288
|
+
async runViaGateway(rec, logStream) {
|
|
289
|
+
const gatewayUrl = process.env.OPENCLAW_GATEWAY_URL || "http://172.17.0.1:18789";
|
|
290
|
+
const gatewayToken = process.env.OPENCLAW_GATEWAY_TOKEN || "";
|
|
291
|
+
const workerAgentId = process.env.OPENCLAW_WORKER_AGENT_ID || "arc";
|
|
292
|
+
const taskText = this.buildTask(rec.capability, rec.specHash, rec.agreementId);
|
|
293
|
+
logStream.write(`[worker-executor] Routing to OpenClaw gateway: ${gatewayUrl}/v1/chat/completions\n`);
|
|
294
|
+
logStream.write(`[worker-executor] Agent: ${workerAgentId}\n`);
|
|
295
|
+
logStream.write(`[worker-executor] Agreement: ${rec.agreementId}\n`);
|
|
296
|
+
logStream.write(`[worker-executor] Capability: ${rec.capability}\n\n`);
|
|
297
|
+
const payload = JSON.stringify({
|
|
298
|
+
model: `openclaw:${workerAgentId}`,
|
|
299
|
+
messages: [{ role: "user", content: taskText }],
|
|
300
|
+
stream: false,
|
|
301
|
+
metadata: {
|
|
302
|
+
arc402_job_id: rec.agreementId,
|
|
303
|
+
arc402_capability: rec.capability,
|
|
304
|
+
arc402_job_dir: rec.jobDir,
|
|
305
|
+
},
|
|
306
|
+
});
|
|
307
|
+
const response = await new Promise((resolve, reject) => {
|
|
308
|
+
const url = new URL("/v1/chat/completions", gatewayUrl);
|
|
309
|
+
const isHttps = url.protocol === "https:";
|
|
310
|
+
const mod = isHttps ? https : http;
|
|
311
|
+
const headers = {
|
|
312
|
+
"Content-Type": "application/json",
|
|
313
|
+
"Content-Length": Buffer.byteLength(payload),
|
|
314
|
+
"X-ARC402-Job-Id": rec.agreementId,
|
|
315
|
+
"X-ARC402-Capability": rec.capability,
|
|
316
|
+
};
|
|
317
|
+
if (gatewayToken)
|
|
318
|
+
headers["Authorization"] = `Bearer ${gatewayToken}`;
|
|
319
|
+
const req = mod.request({
|
|
320
|
+
hostname: url.hostname,
|
|
321
|
+
port: url.port || (isHttps ? 443 : 80),
|
|
322
|
+
path: url.pathname,
|
|
323
|
+
method: "POST",
|
|
324
|
+
headers,
|
|
325
|
+
timeout: this.jobTimeoutMs,
|
|
326
|
+
}, (res) => {
|
|
327
|
+
let body = "";
|
|
328
|
+
res.on("data", (chunk) => { body += chunk.toString(); });
|
|
329
|
+
res.on("end", () => {
|
|
330
|
+
if (res.statusCode && res.statusCode >= 400) {
|
|
331
|
+
reject(new Error(`Gateway returned ${res.statusCode}: ${body.slice(0, 400)}`));
|
|
332
|
+
}
|
|
333
|
+
else {
|
|
334
|
+
resolve(body);
|
|
335
|
+
}
|
|
336
|
+
});
|
|
337
|
+
});
|
|
338
|
+
req.on("error", (err) => reject(new Error(`Gateway connection failed: ${err.message}`)));
|
|
339
|
+
req.on("timeout", () => {
|
|
340
|
+
req.destroy();
|
|
341
|
+
reject(new Error("gateway_timeout"));
|
|
342
|
+
});
|
|
343
|
+
req.write(payload);
|
|
344
|
+
req.end();
|
|
345
|
+
});
|
|
346
|
+
// Parse OpenAI chat completion response
|
|
347
|
+
let deliverable = response;
|
|
348
|
+
try {
|
|
349
|
+
const parsed = JSON.parse(response);
|
|
350
|
+
const content = parsed.choices?.[0]?.message?.content;
|
|
351
|
+
if (content && content.trim())
|
|
352
|
+
deliverable = content;
|
|
353
|
+
}
|
|
354
|
+
catch {
|
|
355
|
+
// keep raw response
|
|
356
|
+
}
|
|
357
|
+
logStream.write(`[worker-executor] Gateway response received (${deliverable.length} chars)\n`);
|
|
358
|
+
logStream.write(`\n--- Gateway Output ---\n${deliverable}\n`);
|
|
359
|
+
// Try to parse <arc402_delivery> structured file block
|
|
360
|
+
let extractedDeliverable = false;
|
|
361
|
+
const deliveryMatch = deliverable.match(/<arc402_delivery>\s*([\s\S]*?)\s*<\/arc402_delivery>/);
|
|
362
|
+
if (deliveryMatch) {
|
|
363
|
+
try {
|
|
364
|
+
const parsed = JSON.parse(deliveryMatch[1]);
|
|
365
|
+
if (parsed.files && Array.isArray(parsed.files)) {
|
|
366
|
+
for (const file of parsed.files) {
|
|
367
|
+
if (typeof file.name === "string" && typeof file.content === "string") {
|
|
368
|
+
const safeName = path.basename(file.name);
|
|
369
|
+
if (safeName && !safeName.startsWith(".")) {
|
|
370
|
+
const filePath = path.join(rec.jobDir, safeName);
|
|
371
|
+
fs.writeFileSync(filePath, file.content, "utf-8");
|
|
372
|
+
logStream.write(`[worker-executor] Extracted file: ${safeName} (${file.content.length} chars)\n`);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
extractedDeliverable = parsed.files.some(f => path.basename(f.name) === "deliverable.md");
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
catch (parseErr) {
|
|
380
|
+
logStream.write(`[worker-executor] Warning: failed to parse arc402_delivery block: ${parseErr}\n`);
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
// Fallback: write deliverable.md from raw response if not extracted via delivery block
|
|
384
|
+
if (!extractedDeliverable) {
|
|
385
|
+
const deliverablePath = path.join(rec.jobDir, "deliverable.md");
|
|
386
|
+
fs.writeFileSync(deliverablePath, `# Deliverable\n\nAgreement: ${rec.agreementId}\nCapability: ${rec.capability}\n\n---\n\n${deliverable}`, "utf-8");
|
|
387
|
+
logStream.write(`[worker-executor] Deliverable written to ${deliverablePath}\n`);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
spawnAgent(rec, logStream) {
|
|
391
|
+
return new Promise((resolve, reject) => {
|
|
392
|
+
const { cmd, args } = this.buildCommand(rec);
|
|
393
|
+
const taskText = this.buildTask(rec.capability, rec.specHash, rec.agreementId);
|
|
394
|
+
logStream.write(`[worker-executor] Spawning: ${cmd} ${args.join(" ")}\n`);
|
|
395
|
+
logStream.write(`[worker-executor] CWD: ${rec.jobDir}\n`);
|
|
396
|
+
logStream.write(`[worker-executor] Task: ${taskText.slice(0, 200)}\n\n`);
|
|
397
|
+
const child = (0, child_process_1.spawn)(cmd, [...args, taskText], {
|
|
398
|
+
cwd: rec.jobDir,
|
|
399
|
+
env: {
|
|
400
|
+
...process.env,
|
|
401
|
+
// Do NOT pass ARC402_MACHINE_KEY to worker process — security boundary
|
|
402
|
+
ARC402_MACHINE_KEY: undefined,
|
|
403
|
+
// Job context so the agent knows its scope
|
|
404
|
+
ARC402_JOB_ID: rec.agreementId,
|
|
405
|
+
ARC402_WORKER_DIR: WORKER_DIR,
|
|
406
|
+
ARC402_JOB_DIR: rec.jobDir,
|
|
407
|
+
// Unset ANTHROPIC_API_KEY — let OAuth handle auth
|
|
408
|
+
ANTHROPIC_API_KEY: undefined,
|
|
409
|
+
},
|
|
410
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
411
|
+
});
|
|
412
|
+
rec.process = child;
|
|
413
|
+
if (child.pid)
|
|
414
|
+
rec.pid = child.pid;
|
|
415
|
+
child.stdout?.on("data", (chunk) => { logStream.write(chunk); });
|
|
416
|
+
child.stderr?.on("data", (chunk) => { logStream.write(chunk); });
|
|
417
|
+
// Job timeout
|
|
418
|
+
rec.timeoutHandle = setTimeout(() => {
|
|
419
|
+
logStream.write(`\n[worker-executor] TIMEOUT after ${this.jobTimeoutMs}ms\n`);
|
|
420
|
+
child.kill("SIGTERM");
|
|
421
|
+
setTimeout(() => { child.kill("SIGKILL"); }, 5000);
|
|
422
|
+
reject(new Error("job_timeout"));
|
|
423
|
+
}, this.jobTimeoutMs);
|
|
424
|
+
child.on("close", (code) => {
|
|
425
|
+
resolve(code ?? 1);
|
|
426
|
+
});
|
|
427
|
+
child.on("error", (err) => {
|
|
428
|
+
reject(new Error(`spawn_failed: ${err.message}`));
|
|
429
|
+
});
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
buildCommand(rec) {
|
|
433
|
+
switch (rec.agentType) {
|
|
434
|
+
case "openclaw":
|
|
435
|
+
// OpenClaw as the worker runtime — can spawn any ACP (Claude Code,
|
|
436
|
+
// Codex, Gemini, Pi, etc.) and orchestrate multi-agent workflows.
|
|
437
|
+
// This is the preferred runtime because it gives the worker full
|
|
438
|
+
// agent orchestration capability instead of being locked to one CLI.
|
|
439
|
+
return {
|
|
440
|
+
cmd: "openclaw",
|
|
441
|
+
args: ["run", "--workdir", rec.jobDir, "--"],
|
|
442
|
+
};
|
|
443
|
+
case "claude-code":
|
|
444
|
+
return {
|
|
445
|
+
cmd: "claude",
|
|
446
|
+
args: ["--permission-mode", "bypassPermissions", "--print"],
|
|
447
|
+
};
|
|
448
|
+
case "codex":
|
|
449
|
+
return {
|
|
450
|
+
cmd: "codex",
|
|
451
|
+
args: ["--print"],
|
|
452
|
+
};
|
|
453
|
+
case "shell":
|
|
454
|
+
return {
|
|
455
|
+
cmd: "/bin/sh",
|
|
456
|
+
args: ["-c"],
|
|
457
|
+
};
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
buildTask(capability, specHash, agreementId) {
|
|
461
|
+
// ── Worker context injection ──────────────────────────────────────────
|
|
462
|
+
// The worker is a specialised agent with identity, expertise, and memory.
|
|
463
|
+
// All of this is injected BEFORE the task so the agent operates as a
|
|
464
|
+
// trained professional, not a blank slate.
|
|
465
|
+
const soul = readFileOrEmpty(path.join(WORKER_DIR, "SOUL.md"));
|
|
466
|
+
const identity = readFileOrEmpty(path.join(WORKER_DIR, "IDENTITY.md"));
|
|
467
|
+
const learnings = readFileOrEmpty(path.join(WORKER_DIR, "memory", "learnings.md"));
|
|
468
|
+
const knowledge = readDirMd(path.join(WORKER_DIR, "knowledge"), 50000);
|
|
469
|
+
const datasets = readDirMd(path.join(WORKER_DIR, "datasets"), 20000);
|
|
470
|
+
// Task from hire request (may have been written by enqueue())
|
|
471
|
+
const taskFile = path.join(JOBS_DIR, `agreement-${agreementId}`, "task.md");
|
|
472
|
+
const taskContent = readFileOrEmpty(taskFile);
|
|
473
|
+
const sections = [];
|
|
474
|
+
if (soul)
|
|
475
|
+
sections.push(`## Your Identity & Role\n${soul}`);
|
|
476
|
+
if (identity)
|
|
477
|
+
sections.push(`## Identity Card\n${identity}`);
|
|
478
|
+
if (learnings && learnings !== "# Accumulated Learnings\n\nNo learnings yet. Complete your first job to start building expertise.") {
|
|
479
|
+
sections.push(`## Your Accumulated Expertise\nThese are learnings from your previous jobs. Use them.\n\n${learnings}`);
|
|
480
|
+
}
|
|
481
|
+
if (knowledge)
|
|
482
|
+
sections.push(`## Domain Knowledge\nReference material for your specialisation.\n\n${knowledge}`);
|
|
483
|
+
if (datasets)
|
|
484
|
+
sections.push(`## Reference Examples\n${datasets}`);
|
|
485
|
+
const taskFallback = (!taskContent && !capability)
|
|
486
|
+
? `You are a professional AI worker. The hiring agent has requested your services under capability: (unspecified). Produce a high-quality deliverable documenting your analysis and output.`
|
|
487
|
+
: `Complete the work specified by the capability "${capability}".`;
|
|
488
|
+
sections.push(`## Current Task
|
|
489
|
+
Agreement ID: ${agreementId}
|
|
490
|
+
Capability: ${capability}
|
|
491
|
+
Spec Hash: ${specHash}
|
|
492
|
+
|
|
493
|
+
${taskContent || taskFallback}`);
|
|
494
|
+
sections.push(`## Output Instructions
|
|
495
|
+
Complete your work thoroughly and professionally. Your output will be hashed and delivered on-chain.
|
|
496
|
+
|
|
497
|
+
At the end of your response, you MUST include an <arc402_delivery> block containing ALL output files as JSON. This is how your files are transferred to the delivery system. Format:
|
|
498
|
+
|
|
499
|
+
<arc402_delivery>
|
|
500
|
+
{"files":[{"name":"deliverable.md","content":"# Deliverable\\n\\n..."},{"name":"report.md","content":"..."}]}
|
|
501
|
+
</arc402_delivery>
|
|
502
|
+
|
|
503
|
+
Rules:
|
|
504
|
+
- ALWAYS include \`deliverable.md\` as a summary of your work
|
|
505
|
+
- Include ALL substantive output files (reports, code, data, etc.)
|
|
506
|
+
- File content must be valid JSON string (escape newlines as \\n, quotes as \\")
|
|
507
|
+
- Do NOT include task.md or job.log in the delivery block`);
|
|
508
|
+
return sections.join("\n\n---\n\n");
|
|
509
|
+
}
|
|
510
|
+
async collectDeliverables(rec, logStream) {
|
|
511
|
+
logStream.write(`\n[worker-executor] Collecting deliverables from ${rec.jobDir}\n`);
|
|
512
|
+
// Exclude non-deliverable files
|
|
513
|
+
const excludes = ["task.md", "job.log"];
|
|
514
|
+
const manifest = this.delivery.storeDirectory(rec.agreementId, rec.jobDir, excludes);
|
|
515
|
+
logStream.write(`[worker-executor] Uploaded ${manifest.files.length} files, root_hash: ${manifest.root_hash}\n`);
|
|
516
|
+
return manifest;
|
|
517
|
+
}
|
|
518
|
+
// ── Helpers ───────────────────────────────────────────────────────────────
|
|
519
|
+
toPublic(rec) {
|
|
520
|
+
const { process: _proc, timeoutHandle: _th, ...pub } = rec;
|
|
521
|
+
void _proc;
|
|
522
|
+
void _th;
|
|
523
|
+
return pub;
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
exports.WorkerExecutor = WorkerExecutor;
|
|
527
|
+
//# sourceMappingURL=worker-executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-executor.js","sourceRoot":"","sources":["../src/worker-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
export type HarnessConfig = {
|
|
2
|
+
type: "openai-compat";
|
|
3
|
+
endpoint: string;
|
|
4
|
+
model: string;
|
|
5
|
+
token?: string;
|
|
6
|
+
headers?: Record<string, string>;
|
|
7
|
+
timeoutMs?: number;
|
|
8
|
+
} | {
|
|
9
|
+
type: "subprocess";
|
|
10
|
+
command: string;
|
|
11
|
+
args?: string[];
|
|
12
|
+
cwd?: string;
|
|
13
|
+
env?: Record<string, string>;
|
|
14
|
+
timeoutMs?: number;
|
|
15
|
+
} | {
|
|
16
|
+
type: "pty";
|
|
17
|
+
command: string;
|
|
18
|
+
args?: string[];
|
|
19
|
+
cwd?: string;
|
|
20
|
+
env?: Record<string, string>;
|
|
21
|
+
timeoutMs?: number;
|
|
22
|
+
};
|
|
23
|
+
export interface WorkerTask {
|
|
24
|
+
taskId: string;
|
|
25
|
+
prompt: string;
|
|
26
|
+
model?: string;
|
|
27
|
+
maxTokens?: number;
|
|
28
|
+
context?: Record<string, unknown>;
|
|
29
|
+
}
|
|
30
|
+
export interface DeliveryFile {
|
|
31
|
+
name: string;
|
|
32
|
+
content: string;
|
|
33
|
+
}
|
|
34
|
+
export interface DeliveryBlock {
|
|
35
|
+
files: DeliveryFile[];
|
|
36
|
+
}
|
|
37
|
+
export interface WorkerResult {
|
|
38
|
+
taskId: string;
|
|
39
|
+
output: string;
|
|
40
|
+
tokensConsumed?: number;
|
|
41
|
+
model?: string;
|
|
42
|
+
exitCode?: number;
|
|
43
|
+
delivery?: DeliveryBlock | null;
|
|
44
|
+
}
|
|
45
|
+
export declare class WorkerHealthProbe {
|
|
46
|
+
private readonly timeoutMs;
|
|
47
|
+
static readonly DEFAULT_TIMEOUT_MS: number;
|
|
48
|
+
constructor(timeoutMs?: number);
|
|
49
|
+
run<T>(label: string, op: () => Promise<T>, onTimeout?: () => void): Promise<T>;
|
|
50
|
+
}
|
|
51
|
+
export declare class WorkerRouter {
|
|
52
|
+
dispatch(task: WorkerTask, harness: HarnessConfig): Promise<WorkerResult>;
|
|
53
|
+
dispatchOpenAI(task: WorkerTask, harness: Extract<HarnessConfig, {
|
|
54
|
+
type: "openai-compat";
|
|
55
|
+
}>): Promise<WorkerResult>;
|
|
56
|
+
dispatchSubprocess(task: WorkerTask, harness: Extract<HarnessConfig, {
|
|
57
|
+
type: "subprocess" | "pty";
|
|
58
|
+
}>): Promise<WorkerResult>;
|
|
59
|
+
parseDeliveryBlock(output: string): DeliveryBlock | null;
|
|
60
|
+
private toChatCompletionsUrl;
|
|
61
|
+
private extractContent;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=worker-router.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-router.d.ts","sourceRoot":"","sources":["../src/worker-router.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,aAAa,GACrB;IACE,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GACD;IACE,IAAI,EAAE,YAAY,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GACD;IACE,IAAI,EAAE,KAAK,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEN,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;CACjC;AAQD,qBAAa,iBAAiB;IAGhB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAFtC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,SAAiB;gBAEtB,SAAS,SAAuC;IAEvE,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC;CA6BtF;AAED,qBAAa,YAAY;IACjB,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IAezE,cAAc,CAClB,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,OAAO,CAAC,aAAa,EAAE;QAAE,IAAI,EAAE,eAAe,CAAA;KAAE,CAAC,GACzD,OAAO,CAAC,YAAY,CAAC;IAwElB,kBAAkB,CACtB,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,OAAO,CAAC,aAAa,EAAE;QAAE,IAAI,EAAE,YAAY,GAAG,KAAK,CAAA;KAAE,CAAC,GAC9D,OAAO,CAAC,YAAY,CAAC;IA4DxB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IA4BxD,OAAO,CAAC,oBAAoB;IAkB5B,OAAO,CAAC,cAAc;CAavB"}
|