@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.
Files changed (122) hide show
  1. package/bin/arc402-daemon +3 -0
  2. package/dist/abis.d.ts +20 -0
  3. package/dist/abis.d.ts.map +1 -0
  4. package/dist/abis.js +214 -0
  5. package/dist/abis.js.map +1 -0
  6. package/dist/api.d.ts +32 -0
  7. package/dist/api.d.ts.map +1 -0
  8. package/dist/api.js +430 -0
  9. package/dist/api.js.map +1 -0
  10. package/dist/auth-server.d.ts +50 -0
  11. package/dist/auth-server.d.ts.map +1 -0
  12. package/dist/auth-server.js +266 -0
  13. package/dist/auth-server.js.map +1 -0
  14. package/dist/bundler.d.ts +68 -0
  15. package/dist/bundler.d.ts.map +1 -0
  16. package/dist/bundler.js +181 -0
  17. package/dist/bundler.js.map +1 -0
  18. package/dist/capabilities.d.ts +17 -0
  19. package/dist/capabilities.d.ts.map +1 -0
  20. package/dist/capabilities.js +57 -0
  21. package/dist/capabilities.js.map +1 -0
  22. package/dist/compute-metering.d.ts +61 -0
  23. package/dist/compute-metering.d.ts.map +1 -0
  24. package/dist/compute-metering.js +299 -0
  25. package/dist/compute-metering.js.map +1 -0
  26. package/dist/compute-session.d.ts +100 -0
  27. package/dist/compute-session.d.ts.map +1 -0
  28. package/dist/compute-session.js +231 -0
  29. package/dist/compute-session.js.map +1 -0
  30. package/dist/config.d.ts +121 -0
  31. package/dist/config.d.ts.map +1 -0
  32. package/dist/config.js +397 -0
  33. package/dist/config.js.map +1 -0
  34. package/dist/context-manager.d.ts +17 -0
  35. package/dist/context-manager.d.ts.map +1 -0
  36. package/dist/context-manager.js +123 -0
  37. package/dist/context-manager.js.map +1 -0
  38. package/dist/credentials.d.ts +24 -0
  39. package/dist/credentials.d.ts.map +1 -0
  40. package/dist/credentials.js +80 -0
  41. package/dist/credentials.js.map +1 -0
  42. package/dist/delivery-client.d.ts +35 -0
  43. package/dist/delivery-client.d.ts.map +1 -0
  44. package/dist/delivery-client.js +231 -0
  45. package/dist/delivery-client.js.map +1 -0
  46. package/dist/endpoint-policy.d.ts +11 -0
  47. package/dist/endpoint-policy.d.ts.map +1 -0
  48. package/dist/endpoint-policy.js +107 -0
  49. package/dist/endpoint-policy.js.map +1 -0
  50. package/dist/event-watchers.d.ts +11 -0
  51. package/dist/event-watchers.d.ts.map +1 -0
  52. package/dist/event-watchers.js +24 -0
  53. package/dist/event-watchers.js.map +1 -0
  54. package/dist/exec-state.d.ts +37 -0
  55. package/dist/exec-state.d.ts.map +1 -0
  56. package/dist/exec-state.js +53 -0
  57. package/dist/exec-state.js.map +1 -0
  58. package/dist/file-delivery.d.ts +98 -0
  59. package/dist/file-delivery.d.ts.map +1 -0
  60. package/dist/file-delivery.js +473 -0
  61. package/dist/file-delivery.js.map +1 -0
  62. package/dist/handshake-watcher.d.ts +31 -0
  63. package/dist/handshake-watcher.d.ts.map +1 -0
  64. package/dist/handshake-watcher.js +157 -0
  65. package/dist/handshake-watcher.js.map +1 -0
  66. package/dist/hire-listener.d.ts +32 -0
  67. package/dist/hire-listener.d.ts.map +1 -0
  68. package/dist/hire-listener.js +237 -0
  69. package/dist/hire-listener.js.map +1 -0
  70. package/dist/index.d.ts +3 -0
  71. package/dist/index.d.ts.map +1 -0
  72. package/dist/index.js +182 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/job-lifecycle.d.ts +62 -0
  75. package/dist/job-lifecycle.d.ts.map +1 -0
  76. package/dist/job-lifecycle.js +201 -0
  77. package/dist/job-lifecycle.js.map +1 -0
  78. package/dist/notify.d.ts +51 -0
  79. package/dist/notify.d.ts.map +1 -0
  80. package/dist/notify.js +276 -0
  81. package/dist/notify.js.map +1 -0
  82. package/dist/permission-gate.d.ts +30 -0
  83. package/dist/permission-gate.d.ts.map +1 -0
  84. package/dist/permission-gate.js +180 -0
  85. package/dist/permission-gate.js.map +1 -0
  86. package/dist/prompt-guard.d.ts +18 -0
  87. package/dist/prompt-guard.d.ts.map +1 -0
  88. package/dist/prompt-guard.js +70 -0
  89. package/dist/prompt-guard.js.map +1 -0
  90. package/dist/server.d.ts +27 -0
  91. package/dist/server.d.ts.map +1 -0
  92. package/dist/server.js +1956 -0
  93. package/dist/server.js.map +1 -0
  94. package/dist/session-manager.d.ts +55 -0
  95. package/dist/session-manager.d.ts.map +1 -0
  96. package/dist/session-manager.js +139 -0
  97. package/dist/session-manager.js.map +1 -0
  98. package/dist/signer.d.ts +19 -0
  99. package/dist/signer.d.ts.map +1 -0
  100. package/dist/signer.js +195 -0
  101. package/dist/signer.js.map +1 -0
  102. package/dist/token-metering.d.ts +42 -0
  103. package/dist/token-metering.d.ts.map +1 -0
  104. package/dist/token-metering.js +178 -0
  105. package/dist/token-metering.js.map +1 -0
  106. package/dist/userops.d.ts +24 -0
  107. package/dist/userops.d.ts.map +1 -0
  108. package/dist/userops.js +156 -0
  109. package/dist/userops.js.map +1 -0
  110. package/dist/wallet-monitor.d.ts +16 -0
  111. package/dist/wallet-monitor.d.ts.map +1 -0
  112. package/dist/wallet-monitor.js +57 -0
  113. package/dist/wallet-monitor.js.map +1 -0
  114. package/dist/worker-executor.d.ts +81 -0
  115. package/dist/worker-executor.d.ts.map +1 -0
  116. package/dist/worker-executor.js +527 -0
  117. package/dist/worker-executor.js.map +1 -0
  118. package/dist/worker-router.d.ts +63 -0
  119. package/dist/worker-router.d.ts.map +1 -0
  120. package/dist/worker-router.js +263 -0
  121. package/dist/worker-router.js.map +1 -0
  122. 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"}