@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,62 @@
|
|
|
1
|
+
import { type AggregatedTokenUsage } from "./token-metering";
|
|
2
|
+
export interface ExecutionReceipt {
|
|
3
|
+
schema: "arc402.execution-receipt.v1";
|
|
4
|
+
agreement_id: string;
|
|
5
|
+
workroom_policy_hash: string;
|
|
6
|
+
started_at: string;
|
|
7
|
+
completed_at: string;
|
|
8
|
+
deliverable_hash: string;
|
|
9
|
+
worker_address: string;
|
|
10
|
+
metrics: {
|
|
11
|
+
wall_clock_seconds: number;
|
|
12
|
+
network_hosts_contacted: string[];
|
|
13
|
+
policy_violations_attempted: number;
|
|
14
|
+
};
|
|
15
|
+
token_usage: AggregatedTokenUsage | null;
|
|
16
|
+
receipt_hash: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Generate and persist an execution receipt after job delivery.
|
|
20
|
+
*/
|
|
21
|
+
export declare function generateReceipt(params: {
|
|
22
|
+
agreementId: string;
|
|
23
|
+
deliverableHash: string;
|
|
24
|
+
walletAddress: string;
|
|
25
|
+
startedAt: string;
|
|
26
|
+
completedAt: string;
|
|
27
|
+
policyFilePath?: string;
|
|
28
|
+
networkHosts?: string[];
|
|
29
|
+
}): ExecutionReceipt;
|
|
30
|
+
/**
|
|
31
|
+
* Extract learnings from a completed job and update worker memory.
|
|
32
|
+
*
|
|
33
|
+
* This creates:
|
|
34
|
+
* 1. A per-job memory file: memory/job-<id>.md
|
|
35
|
+
* 2. Updates the cumulative learnings.md
|
|
36
|
+
* 3. Updates the worker config (job count, earnings)
|
|
37
|
+
*/
|
|
38
|
+
export declare function extractLearnings(params: {
|
|
39
|
+
agreementId: string;
|
|
40
|
+
taskDescription: string;
|
|
41
|
+
deliverableHash: string;
|
|
42
|
+
priceEth: string;
|
|
43
|
+
capability: string;
|
|
44
|
+
wallClockSeconds: number;
|
|
45
|
+
success: boolean;
|
|
46
|
+
}): void;
|
|
47
|
+
/**
|
|
48
|
+
* Create an isolated job directory for a specific agreement.
|
|
49
|
+
* Returns the path to the job workspace.
|
|
50
|
+
*/
|
|
51
|
+
export declare function createJobDirectory(agreementId: string): string;
|
|
52
|
+
/**
|
|
53
|
+
* Clean up a job directory after settlement.
|
|
54
|
+
* Preserves the receipt and job memory — only removes working files.
|
|
55
|
+
*/
|
|
56
|
+
export declare function cleanJobDirectory(agreementId: string): void;
|
|
57
|
+
/**
|
|
58
|
+
* Compute the SHA-256 hash of the current workroom policy.
|
|
59
|
+
* This hash can be registered in AgentRegistry for verifiability.
|
|
60
|
+
*/
|
|
61
|
+
export declare function computePolicyHash(policyFilePath?: string): string;
|
|
62
|
+
//# sourceMappingURL=job-lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"job-lifecycle.d.ts","sourceRoot":"","sources":["../src/job-lifecycle.ts"],"names":[],"mappings":"AAeA,OAAO,EAAmB,KAAK,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAW9E,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,6BAA6B,CAAC;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE;QACP,kBAAkB,EAAE,MAAM,CAAC;QAC3B,uBAAuB,EAAE,MAAM,EAAE,CAAC;QAClC,2BAA2B,EAAE,MAAM,CAAC;KACrC,CAAC;IACF,WAAW,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACzC,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB,GAAG,gBAAgB,CA6CnB;AAID;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC;CAClB,GAAG,IAAI,CA2DP;AAID;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAI9D;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAK3D;AAID;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,CAKjE"}
|
|
@@ -0,0 +1,201 @@
|
|
|
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.generateReceipt = generateReceipt;
|
|
37
|
+
exports.extractLearnings = extractLearnings;
|
|
38
|
+
exports.createJobDirectory = createJobDirectory;
|
|
39
|
+
exports.cleanJobDirectory = cleanJobDirectory;
|
|
40
|
+
exports.computePolicyHash = computePolicyHash;
|
|
41
|
+
/**
|
|
42
|
+
* ARC-402 Job Lifecycle — Post-delivery processing.
|
|
43
|
+
*
|
|
44
|
+
* Handles everything that happens after a worker completes a job:
|
|
45
|
+
* 1. Execution receipt generation
|
|
46
|
+
* 2. Learning extraction from completed work
|
|
47
|
+
* 3. Worker memory update
|
|
48
|
+
* 4. Per-agreement job directory management
|
|
49
|
+
*
|
|
50
|
+
* These functions are called by the daemon after a successful delivery.
|
|
51
|
+
*/
|
|
52
|
+
const fs = __importStar(require("fs"));
|
|
53
|
+
const path = __importStar(require("path"));
|
|
54
|
+
const os = __importStar(require("os"));
|
|
55
|
+
const crypto = __importStar(require("crypto"));
|
|
56
|
+
const token_metering_1 = require("./token-metering");
|
|
57
|
+
const ARC402_DIR = path.join(os.homedir(), ".arc402");
|
|
58
|
+
const RECEIPTS_DIR = path.join(ARC402_DIR, "receipts");
|
|
59
|
+
const WORKER_DIR = path.join(ARC402_DIR, "worker");
|
|
60
|
+
const WORKER_MEMORY_DIR = path.join(WORKER_DIR, "memory");
|
|
61
|
+
const WORKER_CONFIG = path.join(WORKER_DIR, "config.json");
|
|
62
|
+
const JOBS_DIR = path.join(ARC402_DIR, "jobs");
|
|
63
|
+
/**
|
|
64
|
+
* Generate and persist an execution receipt after job delivery.
|
|
65
|
+
*/
|
|
66
|
+
function generateReceipt(params) {
|
|
67
|
+
fs.mkdirSync(RECEIPTS_DIR, { recursive: true });
|
|
68
|
+
// Compute policy hash
|
|
69
|
+
let policyHash = "0x0";
|
|
70
|
+
const policyPath = params.policyFilePath ?? path.join(ARC402_DIR, "openshell-policy.yaml");
|
|
71
|
+
if (fs.existsSync(policyPath)) {
|
|
72
|
+
const content = fs.readFileSync(policyPath, "utf-8");
|
|
73
|
+
policyHash = "0x" + crypto.createHash("sha256").update(content).digest("hex");
|
|
74
|
+
}
|
|
75
|
+
// Calculate wall clock time
|
|
76
|
+
const started = new Date(params.startedAt).getTime();
|
|
77
|
+
const completed = new Date(params.completedAt).getTime();
|
|
78
|
+
const wallClockSeconds = Math.max(0, Math.floor((completed - started) / 1000));
|
|
79
|
+
// Read token usage report (if the worker wrote one)
|
|
80
|
+
const tokenUsage = (0, token_metering_1.readUsageReport)(params.agreementId);
|
|
81
|
+
const receipt = {
|
|
82
|
+
schema: "arc402.execution-receipt.v1",
|
|
83
|
+
agreement_id: params.agreementId,
|
|
84
|
+
workroom_policy_hash: policyHash,
|
|
85
|
+
started_at: params.startedAt,
|
|
86
|
+
completed_at: params.completedAt,
|
|
87
|
+
deliverable_hash: params.deliverableHash,
|
|
88
|
+
worker_address: params.walletAddress,
|
|
89
|
+
metrics: {
|
|
90
|
+
wall_clock_seconds: wallClockSeconds,
|
|
91
|
+
network_hosts_contacted: params.networkHosts ?? [],
|
|
92
|
+
policy_violations_attempted: 0,
|
|
93
|
+
},
|
|
94
|
+
token_usage: tokenUsage,
|
|
95
|
+
receipt_hash: "", // filled below
|
|
96
|
+
};
|
|
97
|
+
// Receipt hash = SHA-256 of the receipt content (without the hash field)
|
|
98
|
+
const hashInput = JSON.stringify({ ...receipt, receipt_hash: undefined });
|
|
99
|
+
receipt.receipt_hash = "0x" + crypto.createHash("sha256").update(hashInput).digest("hex");
|
|
100
|
+
// Persist
|
|
101
|
+
const receiptPath = path.join(RECEIPTS_DIR, `${params.agreementId}.json`);
|
|
102
|
+
fs.writeFileSync(receiptPath, JSON.stringify(receipt, null, 2));
|
|
103
|
+
return receipt;
|
|
104
|
+
}
|
|
105
|
+
// ─── Learning Extraction ──────────────────────────────────────────────────────
|
|
106
|
+
/**
|
|
107
|
+
* Extract learnings from a completed job and update worker memory.
|
|
108
|
+
*
|
|
109
|
+
* This creates:
|
|
110
|
+
* 1. A per-job memory file: memory/job-<id>.md
|
|
111
|
+
* 2. Updates the cumulative learnings.md
|
|
112
|
+
* 3. Updates the worker config (job count, earnings)
|
|
113
|
+
*/
|
|
114
|
+
function extractLearnings(params) {
|
|
115
|
+
fs.mkdirSync(WORKER_MEMORY_DIR, { recursive: true });
|
|
116
|
+
const now = new Date().toISOString();
|
|
117
|
+
const dateStr = now.split("T")[0];
|
|
118
|
+
// 1. Per-job memory file
|
|
119
|
+
const jobMemory = `# Job: ${params.agreementId}
|
|
120
|
+
*Completed: ${now}*
|
|
121
|
+
*Capability: ${params.capability}*
|
|
122
|
+
*Price: ${params.priceEth} ETH*
|
|
123
|
+
*Duration: ${params.wallClockSeconds}s*
|
|
124
|
+
*Outcome: ${params.success ? "delivered" : "failed"}*
|
|
125
|
+
|
|
126
|
+
## Task
|
|
127
|
+
${params.taskDescription}
|
|
128
|
+
|
|
129
|
+
## Deliverable
|
|
130
|
+
Hash: ${params.deliverableHash}
|
|
131
|
+
|
|
132
|
+
## Learnings
|
|
133
|
+
- Completed ${params.capability} task in ${params.wallClockSeconds}s
|
|
134
|
+
- ${params.success ? "Delivered successfully" : "Delivery failed — review required"}
|
|
135
|
+
`;
|
|
136
|
+
const jobFile = path.join(WORKER_MEMORY_DIR, `job-${params.agreementId}.md`);
|
|
137
|
+
fs.writeFileSync(jobFile, jobMemory);
|
|
138
|
+
// 2. Update cumulative learnings.md
|
|
139
|
+
const learningsPath = path.join(WORKER_MEMORY_DIR, "learnings.md");
|
|
140
|
+
let learnings = "";
|
|
141
|
+
if (fs.existsSync(learningsPath)) {
|
|
142
|
+
learnings = fs.readFileSync(learningsPath, "utf-8");
|
|
143
|
+
}
|
|
144
|
+
const newEntry = `\n### ${dateStr} — ${params.capability} (${params.agreementId.slice(0, 8)}...)
|
|
145
|
+
- Duration: ${params.wallClockSeconds}s | Price: ${params.priceEth} ETH | Outcome: ${params.success ? "✓" : "✗"}
|
|
146
|
+
`;
|
|
147
|
+
// Append to learnings
|
|
148
|
+
if (learnings.includes("No learnings yet")) {
|
|
149
|
+
learnings = `# Accumulated Learnings\n\n*Auto-updated after each completed job.*\n${newEntry}`;
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
learnings += newEntry;
|
|
153
|
+
}
|
|
154
|
+
fs.writeFileSync(learningsPath, learnings);
|
|
155
|
+
// 3. Update worker config
|
|
156
|
+
if (fs.existsSync(WORKER_CONFIG)) {
|
|
157
|
+
try {
|
|
158
|
+
const config = JSON.parse(fs.readFileSync(WORKER_CONFIG, "utf-8"));
|
|
159
|
+
config.job_count = (config.job_count || 0) + 1;
|
|
160
|
+
const currentEarnings = parseFloat(config.total_earned_eth || "0");
|
|
161
|
+
const jobEarnings = parseFloat(params.priceEth || "0");
|
|
162
|
+
config.total_earned_eth = (currentEarnings + jobEarnings).toFixed(6);
|
|
163
|
+
config.last_job_at = now;
|
|
164
|
+
fs.writeFileSync(WORKER_CONFIG, JSON.stringify(config, null, 2));
|
|
165
|
+
}
|
|
166
|
+
catch { /* non-fatal — config may be malformed */ }
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// ─── Per-Agreement Job Directory ──────────────────────────────────────────────
|
|
170
|
+
/**
|
|
171
|
+
* Create an isolated job directory for a specific agreement.
|
|
172
|
+
* Returns the path to the job workspace.
|
|
173
|
+
*/
|
|
174
|
+
function createJobDirectory(agreementId) {
|
|
175
|
+
const jobDir = path.join(JOBS_DIR, `agreement-${agreementId}`);
|
|
176
|
+
fs.mkdirSync(jobDir, { recursive: true });
|
|
177
|
+
return jobDir;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Clean up a job directory after settlement.
|
|
181
|
+
* Preserves the receipt and job memory — only removes working files.
|
|
182
|
+
*/
|
|
183
|
+
function cleanJobDirectory(agreementId) {
|
|
184
|
+
const jobDir = path.join(JOBS_DIR, `agreement-${agreementId}`);
|
|
185
|
+
if (fs.existsSync(jobDir)) {
|
|
186
|
+
fs.rmSync(jobDir, { recursive: true, force: true });
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// ─── Policy Hash ──────────────────────────────────────────────────────────────
|
|
190
|
+
/**
|
|
191
|
+
* Compute the SHA-256 hash of the current workroom policy.
|
|
192
|
+
* This hash can be registered in AgentRegistry for verifiability.
|
|
193
|
+
*/
|
|
194
|
+
function computePolicyHash(policyFilePath) {
|
|
195
|
+
const policyPath = policyFilePath ?? path.join(ARC402_DIR, "openshell-policy.yaml");
|
|
196
|
+
if (!fs.existsSync(policyPath))
|
|
197
|
+
return "0x0";
|
|
198
|
+
const content = fs.readFileSync(policyPath, "utf-8");
|
|
199
|
+
return "0x" + crypto.createHash("sha256").update(content).digest("hex");
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=job-lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"job-lifecycle.js","sourceRoot":"","sources":["../src/job-lifecycle.ts"],"names":[],"mappings":"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"}
|
package/dist/notify.d.ts
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { DaemonConfig } from "./config";
|
|
2
|
+
export type NotifyEvent = "hire_request" | "hire_accepted" | "hire_rejected" | "delivery" | "dispute" | "channel_challenge" | "low_balance" | "daemon_started" | "daemon_stopped";
|
|
3
|
+
export interface NotificationChannel {
|
|
4
|
+
send(title: string, body: string): Promise<void>;
|
|
5
|
+
}
|
|
6
|
+
export declare class TelegramChannel implements NotificationChannel {
|
|
7
|
+
private botToken;
|
|
8
|
+
private chatId;
|
|
9
|
+
constructor(botToken: string, chatId: string);
|
|
10
|
+
send(title: string, body: string): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
export declare class DiscordChannel implements NotificationChannel {
|
|
13
|
+
private webhookUrl;
|
|
14
|
+
constructor(webhookUrl: string);
|
|
15
|
+
send(title: string, body: string): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
export declare class WebhookChannel implements NotificationChannel {
|
|
18
|
+
private url;
|
|
19
|
+
private headers;
|
|
20
|
+
constructor(url: string, headers?: Record<string, string>);
|
|
21
|
+
send(title: string, body: string): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
export declare class EmailChannel implements NotificationChannel {
|
|
24
|
+
private cfg;
|
|
25
|
+
constructor(cfg: {
|
|
26
|
+
smtpHost: string;
|
|
27
|
+
smtpPort: number;
|
|
28
|
+
smtpUser: string;
|
|
29
|
+
smtpPass: string;
|
|
30
|
+
to: string;
|
|
31
|
+
});
|
|
32
|
+
send(title: string, body: string): Promise<void>;
|
|
33
|
+
}
|
|
34
|
+
export declare class Notifier {
|
|
35
|
+
private channels;
|
|
36
|
+
private notifyFlags;
|
|
37
|
+
constructor(channels: NotificationChannel[], flags?: Partial<Record<NotifyEvent, boolean>>);
|
|
38
|
+
isEnabled(): boolean;
|
|
39
|
+
send(event: NotifyEvent, title: string, body: string): Promise<void>;
|
|
40
|
+
notifyHireRequest(hireId: string, hirerAddress: string, priceEth: string, capability: string): Promise<void>;
|
|
41
|
+
notifyHireAccepted(hireId: string, agreementId: string): Promise<void>;
|
|
42
|
+
notifyHireRejected(hireId: string, reason: string): Promise<void>;
|
|
43
|
+
notifyDelivery(agreementId: string, deliveryHash: string, userOpHash: string): Promise<void>;
|
|
44
|
+
notifyDispute(agreementId: string, raisedBy: string): Promise<void>;
|
|
45
|
+
notifyChannelChallenge(channelId: string, txHash: string): Promise<void>;
|
|
46
|
+
notifyLowBalance(balanceEth: string, thresholdEth: string): Promise<void>;
|
|
47
|
+
notifyStarted(walletAddress: string, subsystems: string[]): Promise<void>;
|
|
48
|
+
notifyStopped(): Promise<void>;
|
|
49
|
+
}
|
|
50
|
+
export declare function buildNotifier(config: DaemonConfig): Notifier;
|
|
51
|
+
//# sourceMappingURL=notify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notify.d.ts","sourceRoot":"","sources":["../src/notify.ts"],"names":[],"mappings":"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"}
|
package/dist/notify.js
ADDED
|
@@ -0,0 +1,276 @@
|
|
|
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.Notifier = exports.EmailChannel = exports.WebhookChannel = exports.DiscordChannel = exports.TelegramChannel = void 0;
|
|
37
|
+
exports.buildNotifier = buildNotifier;
|
|
38
|
+
/**
|
|
39
|
+
* Multi-channel notification module for daemon events.
|
|
40
|
+
* Supports Telegram, Discord webhooks, generic webhooks, and email (via nodemailer).
|
|
41
|
+
*/
|
|
42
|
+
const https = __importStar(require("https"));
|
|
43
|
+
const http = __importStar(require("http"));
|
|
44
|
+
// ─── HTTP helper ──────────────────────────────────────────────────────────────
|
|
45
|
+
function httpPost(url, payload, extraHeaders) {
|
|
46
|
+
return new Promise((resolve, reject) => {
|
|
47
|
+
const parsed = new URL(url);
|
|
48
|
+
const mod = parsed.protocol === "https:" ? https : http;
|
|
49
|
+
const options = {
|
|
50
|
+
hostname: parsed.hostname,
|
|
51
|
+
port: parsed.port || (parsed.protocol === "https:" ? 443 : 80),
|
|
52
|
+
path: parsed.pathname + parsed.search,
|
|
53
|
+
method: "POST",
|
|
54
|
+
headers: {
|
|
55
|
+
"Content-Type": "application/json",
|
|
56
|
+
"Content-Length": Buffer.byteLength(payload),
|
|
57
|
+
...extraHeaders,
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
const req = mod.request(options, (res) => {
|
|
61
|
+
res.resume();
|
|
62
|
+
res.on("end", () => {
|
|
63
|
+
if (res.statusCode && res.statusCode >= 200 && res.statusCode < 300) {
|
|
64
|
+
resolve();
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
reject(new Error(`HTTP ${res.statusCode}`));
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
req.on("error", reject);
|
|
72
|
+
req.write(payload);
|
|
73
|
+
req.end();
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
// ─── Telegram channel ─────────────────────────────────────────────────────────
|
|
77
|
+
class TelegramChannel {
|
|
78
|
+
constructor(botToken, chatId) {
|
|
79
|
+
this.botToken = botToken;
|
|
80
|
+
this.chatId = chatId;
|
|
81
|
+
}
|
|
82
|
+
async send(title, body) {
|
|
83
|
+
const text = body ? `<b>${title}</b>\n${body}` : `<b>${title}</b>`;
|
|
84
|
+
const payload = JSON.stringify({ chat_id: this.chatId, text, parse_mode: "HTML" });
|
|
85
|
+
const options = {
|
|
86
|
+
hostname: "api.telegram.org",
|
|
87
|
+
port: 443,
|
|
88
|
+
path: `/bot${this.botToken}/sendMessage`,
|
|
89
|
+
method: "POST",
|
|
90
|
+
headers: {
|
|
91
|
+
"Content-Type": "application/json",
|
|
92
|
+
"Content-Length": Buffer.byteLength(payload),
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
await new Promise((resolve, reject) => {
|
|
96
|
+
const req = https.request(options, (res) => {
|
|
97
|
+
let data = "";
|
|
98
|
+
res.on("data", (c) => { data += c.toString(); });
|
|
99
|
+
res.on("end", () => {
|
|
100
|
+
const parsed = JSON.parse(data);
|
|
101
|
+
if (!parsed.ok) {
|
|
102
|
+
reject(new Error(`Telegram API error: ${parsed.description}`));
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
resolve();
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
req.on("error", reject);
|
|
110
|
+
req.write(payload);
|
|
111
|
+
req.end();
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
exports.TelegramChannel = TelegramChannel;
|
|
116
|
+
// ─── Discord channel ──────────────────────────────────────────────────────────
|
|
117
|
+
class DiscordChannel {
|
|
118
|
+
constructor(webhookUrl) {
|
|
119
|
+
this.webhookUrl = webhookUrl;
|
|
120
|
+
}
|
|
121
|
+
async send(title, body) {
|
|
122
|
+
const content = body ? `**${title}**\n${body}` : `**${title}**`;
|
|
123
|
+
await httpPost(this.webhookUrl, JSON.stringify({ content }), {});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
exports.DiscordChannel = DiscordChannel;
|
|
127
|
+
// ─── Generic webhook channel ──────────────────────────────────────────────────
|
|
128
|
+
class WebhookChannel {
|
|
129
|
+
constructor(url, headers = {}) {
|
|
130
|
+
this.url = url;
|
|
131
|
+
this.headers = headers;
|
|
132
|
+
}
|
|
133
|
+
async send(title, body) {
|
|
134
|
+
await httpPost(this.url, JSON.stringify({ title, body, timestamp: new Date().toISOString() }), this.headers);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
exports.WebhookChannel = WebhookChannel;
|
|
138
|
+
// ─── Email channel (optional — requires nodemailer) ───────────────────────────
|
|
139
|
+
class EmailChannel {
|
|
140
|
+
constructor(cfg) {
|
|
141
|
+
this.cfg = cfg;
|
|
142
|
+
}
|
|
143
|
+
async send(title, body) {
|
|
144
|
+
// nodemailer is an optional runtime dependency — load via require to skip
|
|
145
|
+
// compile-time module resolution. Throws a clear message if not installed.
|
|
146
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-explicit-any
|
|
147
|
+
let nodemailer;
|
|
148
|
+
try {
|
|
149
|
+
// Using Function constructor avoids TypeScript static import analysis.
|
|
150
|
+
nodemailer = (new Function("require", "return require('nodemailer')"))(require);
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
throw new Error("nodemailer is not installed. Run: npm install nodemailer");
|
|
154
|
+
}
|
|
155
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
|
|
156
|
+
const transport = nodemailer.createTransport({
|
|
157
|
+
host: this.cfg.smtpHost,
|
|
158
|
+
port: this.cfg.smtpPort,
|
|
159
|
+
auth: { user: this.cfg.smtpUser, pass: this.cfg.smtpPass },
|
|
160
|
+
});
|
|
161
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
|
|
162
|
+
await transport.sendMail({
|
|
163
|
+
from: this.cfg.smtpUser,
|
|
164
|
+
to: this.cfg.to,
|
|
165
|
+
subject: title,
|
|
166
|
+
text: body,
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
exports.EmailChannel = EmailChannel;
|
|
171
|
+
// ─── Notifier ─────────────────────────────────────────────────────────────────
|
|
172
|
+
class Notifier {
|
|
173
|
+
constructor(channels, flags = {}) {
|
|
174
|
+
this.channels = channels;
|
|
175
|
+
this.notifyFlags = {
|
|
176
|
+
hire_request: flags.hire_request ?? true,
|
|
177
|
+
hire_accepted: flags.hire_accepted ?? true,
|
|
178
|
+
hire_rejected: flags.hire_rejected ?? true,
|
|
179
|
+
delivery: flags.delivery ?? true,
|
|
180
|
+
dispute: flags.dispute ?? true,
|
|
181
|
+
channel_challenge: flags.channel_challenge ?? true,
|
|
182
|
+
low_balance: flags.low_balance ?? true,
|
|
183
|
+
daemon_started: true,
|
|
184
|
+
daemon_stopped: true,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
isEnabled() {
|
|
188
|
+
return this.channels.length > 0;
|
|
189
|
+
}
|
|
190
|
+
async send(event, title, body) {
|
|
191
|
+
if (!this.notifyFlags[event])
|
|
192
|
+
return;
|
|
193
|
+
await Promise.all(this.channels.map(async (ch) => {
|
|
194
|
+
try {
|
|
195
|
+
await ch.send(title, body);
|
|
196
|
+
}
|
|
197
|
+
catch (err) {
|
|
198
|
+
process.stderr.write(`[notify] Channel send failed: ${err}\n`);
|
|
199
|
+
}
|
|
200
|
+
}));
|
|
201
|
+
}
|
|
202
|
+
async notifyHireRequest(hireId, hirerAddress, priceEth, capability) {
|
|
203
|
+
const short = hirerAddress.slice(0, 10);
|
|
204
|
+
await this.send("hire_request", "Hire Request", [
|
|
205
|
+
`ID: ${hireId}`,
|
|
206
|
+
`From: ${short}...`,
|
|
207
|
+
`Capability: ${capability || "unspecified"}`,
|
|
208
|
+
`Price: ${priceEth} ETH`,
|
|
209
|
+
``,
|
|
210
|
+
`Approve: arc402 daemon approve ${hireId}`,
|
|
211
|
+
`Reject: arc402 daemon reject ${hireId}`,
|
|
212
|
+
].join("\n"));
|
|
213
|
+
}
|
|
214
|
+
async notifyHireAccepted(hireId, agreementId) {
|
|
215
|
+
await this.send("hire_accepted", "Hire Accepted", `ID: ${hireId}\nAgreement: ${agreementId}`);
|
|
216
|
+
}
|
|
217
|
+
async notifyHireRejected(hireId, reason) {
|
|
218
|
+
await this.send("hire_rejected", "Hire Rejected", `ID: ${hireId}\nReason: ${reason}`);
|
|
219
|
+
}
|
|
220
|
+
async notifyDelivery(agreementId, deliveryHash, userOpHash) {
|
|
221
|
+
await this.send("delivery", "Delivery Submitted", [
|
|
222
|
+
`Agreement: ${agreementId}`,
|
|
223
|
+
`Delivery hash: ${deliveryHash.slice(0, 16)}...`,
|
|
224
|
+
`UserOp: ${userOpHash.slice(0, 16)}...`,
|
|
225
|
+
].join("\n"));
|
|
226
|
+
}
|
|
227
|
+
async notifyDispute(agreementId, raisedBy) {
|
|
228
|
+
await this.send("dispute", "Dispute Raised", `Agreement: ${agreementId}\nBy: ${raisedBy}`);
|
|
229
|
+
}
|
|
230
|
+
async notifyChannelChallenge(channelId, txHash) {
|
|
231
|
+
await this.send("channel_challenge", "Channel Challenged", `Channel: ${channelId.slice(0, 16)}...\nTx: ${txHash.slice(0, 16)}...`);
|
|
232
|
+
}
|
|
233
|
+
async notifyLowBalance(balanceEth, thresholdEth) {
|
|
234
|
+
await this.send("low_balance", "Low Balance Alert", `Current: ${balanceEth} ETH\nThreshold: ${thresholdEth} ETH`);
|
|
235
|
+
}
|
|
236
|
+
async notifyStarted(walletAddress, subsystems) {
|
|
237
|
+
await this.send("daemon_started", "ARC-402 Daemon Started", `Wallet: ${walletAddress}\nSubsystems: ${subsystems.join(", ")}`);
|
|
238
|
+
}
|
|
239
|
+
async notifyStopped() {
|
|
240
|
+
await this.send("daemon_stopped", "ARC-402 Daemon Stopped", "");
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
exports.Notifier = Notifier;
|
|
244
|
+
// ─── Factory ──────────────────────────────────────────────────────────────────
|
|
245
|
+
function buildNotifier(config) {
|
|
246
|
+
const notif = config.notifications;
|
|
247
|
+
const channels = [];
|
|
248
|
+
if (notif.telegram_bot_token && notif.telegram_chat_id) {
|
|
249
|
+
channels.push(new TelegramChannel(notif.telegram_bot_token, notif.telegram_chat_id));
|
|
250
|
+
}
|
|
251
|
+
if (notif.discord?.webhook_url) {
|
|
252
|
+
channels.push(new DiscordChannel(notif.discord.webhook_url));
|
|
253
|
+
}
|
|
254
|
+
if (notif.webhook?.url) {
|
|
255
|
+
channels.push(new WebhookChannel(notif.webhook.url, notif.webhook.headers ?? {}));
|
|
256
|
+
}
|
|
257
|
+
if (notif.email?.smtp_host && notif.email?.smtp_user && notif.email?.to) {
|
|
258
|
+
channels.push(new EmailChannel({
|
|
259
|
+
smtpHost: notif.email.smtp_host,
|
|
260
|
+
smtpPort: notif.email.smtp_port,
|
|
261
|
+
smtpUser: notif.email.smtp_user,
|
|
262
|
+
smtpPass: notif.email.smtp_pass,
|
|
263
|
+
to: notif.email.to,
|
|
264
|
+
}));
|
|
265
|
+
}
|
|
266
|
+
return new Notifier(channels, {
|
|
267
|
+
hire_request: notif.notify_on_hire_request,
|
|
268
|
+
hire_accepted: notif.notify_on_hire_accepted,
|
|
269
|
+
hire_rejected: notif.notify_on_hire_rejected,
|
|
270
|
+
delivery: notif.notify_on_delivery,
|
|
271
|
+
dispute: notif.notify_on_dispute,
|
|
272
|
+
channel_challenge: notif.notify_on_channel_challenge,
|
|
273
|
+
low_balance: notif.notify_on_low_balance,
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
//# sourceMappingURL=notify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notify.js","sourceRoot":"","sources":["../src/notify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { ethers } from "ethers";
|
|
2
|
+
export interface ToolPermissionContext {
|
|
3
|
+
agreementId: string;
|
|
4
|
+
walletAddress: `0x${string}`;
|
|
5
|
+
policyEngineAddress: `0x${string}`;
|
|
6
|
+
provider: ethers.Provider;
|
|
7
|
+
}
|
|
8
|
+
export interface ToolPermission {
|
|
9
|
+
tool: string;
|
|
10
|
+
input: unknown;
|
|
11
|
+
context: ToolPermissionContext;
|
|
12
|
+
}
|
|
13
|
+
export type PermissionDecision = {
|
|
14
|
+
granted: true;
|
|
15
|
+
estimatedSpend?: bigint;
|
|
16
|
+
} | {
|
|
17
|
+
granted: false;
|
|
18
|
+
reason: string;
|
|
19
|
+
estimatedSpend?: bigint;
|
|
20
|
+
};
|
|
21
|
+
export interface PermissionGateDependencies {
|
|
22
|
+
createPolicyEngine?: (address: string, provider: ethers.Provider) => {
|
|
23
|
+
validateSpend: {
|
|
24
|
+
staticCall: (wallet: string, category: string, amount: bigint, contextId: string) => Promise<[boolean, string]>;
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export declare function checkPermissions(p: ToolPermission, deps?: PermissionGateDependencies): Promise<PermissionDecision>;
|
|
29
|
+
export declare function resetPermissionCache(): void;
|
|
30
|
+
//# sourceMappingURL=permission-gate.d.ts.map
|