@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,157 @@
|
|
|
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.HandshakeWatcher = void 0;
|
|
37
|
+
/**
|
|
38
|
+
* HandshakeWatcher — scans historical and live HandshakeSent events
|
|
39
|
+
* directed at this agent's wallet address.
|
|
40
|
+
*
|
|
41
|
+
* On startup: catch-up scan over the last SCAN_BLOCKS blocks.
|
|
42
|
+
* Then: subscribes to live events via provider.on().
|
|
43
|
+
* Idempotency: processed handshake IDs are persisted to processedIdsPath.
|
|
44
|
+
*/
|
|
45
|
+
const fs = __importStar(require("fs"));
|
|
46
|
+
const path = __importStar(require("path"));
|
|
47
|
+
const ethers_1 = require("ethers");
|
|
48
|
+
const SCAN_BLOCKS = 10000;
|
|
49
|
+
const HANDSHAKE_SENT_ABI = [
|
|
50
|
+
"event HandshakeSent(uint256 indexed handshakeId, address indexed from, address indexed to, uint8 hsType, address token, uint256 amount, string note, uint256 timestamp)",
|
|
51
|
+
];
|
|
52
|
+
class HandshakeWatcher {
|
|
53
|
+
constructor(provider, handshakeAddress, myAddress, onHandshake, processedIdsPath) {
|
|
54
|
+
this.processedIds = new Set();
|
|
55
|
+
this.liveListener = null;
|
|
56
|
+
this.provider = provider;
|
|
57
|
+
this.contract = new ethers_1.ethers.Contract(handshakeAddress, HANDSHAKE_SENT_ABI, provider);
|
|
58
|
+
this.myAddress = myAddress.toLowerCase();
|
|
59
|
+
this.onHandshake = onHandshake;
|
|
60
|
+
this.processedIdsPath = processedIdsPath;
|
|
61
|
+
}
|
|
62
|
+
async start() {
|
|
63
|
+
this.loadProcessedIds();
|
|
64
|
+
await this.catchupScan();
|
|
65
|
+
this.subscribeLive();
|
|
66
|
+
}
|
|
67
|
+
async stop() {
|
|
68
|
+
if (this.liveListener) {
|
|
69
|
+
this.contract.off("HandshakeSent", this.liveListener);
|
|
70
|
+
this.liveListener = null;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// ── Private ──────────────────────────────────────────────────────────────
|
|
74
|
+
loadProcessedIds() {
|
|
75
|
+
try {
|
|
76
|
+
const dir = path.dirname(this.processedIdsPath);
|
|
77
|
+
if (!fs.existsSync(dir))
|
|
78
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
79
|
+
if (fs.existsSync(this.processedIdsPath)) {
|
|
80
|
+
const raw = fs.readFileSync(this.processedIdsPath, "utf-8");
|
|
81
|
+
const ids = JSON.parse(raw);
|
|
82
|
+
this.processedIds = new Set(ids);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
// Start fresh — non-fatal
|
|
87
|
+
this.processedIds = new Set();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
saveProcessedIds() {
|
|
91
|
+
try {
|
|
92
|
+
fs.writeFileSync(this.processedIdsPath, JSON.stringify([...this.processedIds]), { mode: 0o600 });
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
// Non-fatal — will reprocess on next restart at worst
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
async catchupScan() {
|
|
99
|
+
try {
|
|
100
|
+
const latest = await this.provider.getBlockNumber();
|
|
101
|
+
const fromBlock = Math.max(0, latest - SCAN_BLOCKS);
|
|
102
|
+
// Filter: HandshakeSent where `to` = this agent
|
|
103
|
+
const filter = this.contract.filters.HandshakeSent(null, null, this.myAddress);
|
|
104
|
+
const logs = await this.contract.queryFilter(filter, fromBlock, latest);
|
|
105
|
+
for (const log of logs) {
|
|
106
|
+
await this.handleLog(log);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
console.error("[handshake-watcher] catchup scan error:", err);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
subscribeLive() {
|
|
114
|
+
const listener = async (...args) => {
|
|
115
|
+
// ethers v6: last arg is the EventLog
|
|
116
|
+
const log = args[args.length - 1];
|
|
117
|
+
await this.handleLog(log).catch((err) => {
|
|
118
|
+
console.error("[handshake-watcher] live event error:", err);
|
|
119
|
+
});
|
|
120
|
+
};
|
|
121
|
+
this.liveListener = listener;
|
|
122
|
+
this.contract.on("HandshakeSent", listener);
|
|
123
|
+
}
|
|
124
|
+
async handleLog(log) {
|
|
125
|
+
try {
|
|
126
|
+
const args = log.args;
|
|
127
|
+
const handshakeId = args[0].toString();
|
|
128
|
+
const to = args[2];
|
|
129
|
+
// Only process events directed at this agent
|
|
130
|
+
if (to.toLowerCase() !== this.myAddress)
|
|
131
|
+
return;
|
|
132
|
+
// Idempotency check
|
|
133
|
+
if (this.processedIds.has(handshakeId))
|
|
134
|
+
return;
|
|
135
|
+
const event = {
|
|
136
|
+
handshakeId,
|
|
137
|
+
from: args[1],
|
|
138
|
+
to,
|
|
139
|
+
hsType: Number(args[3]),
|
|
140
|
+
token: args[4],
|
|
141
|
+
amount: BigInt(args[5].toString()),
|
|
142
|
+
note: args[6],
|
|
143
|
+
timestamp: Number(args[7]),
|
|
144
|
+
blockNumber: log.blockNumber,
|
|
145
|
+
txHash: log.transactionHash,
|
|
146
|
+
};
|
|
147
|
+
await this.onHandshake(event);
|
|
148
|
+
this.processedIds.add(handshakeId);
|
|
149
|
+
this.saveProcessedIds();
|
|
150
|
+
}
|
|
151
|
+
catch (err) {
|
|
152
|
+
console.error("[handshake-watcher] error processing event:", err);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
exports.HandshakeWatcher = HandshakeWatcher;
|
|
157
|
+
//# sourceMappingURL=handshake-watcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handshake-watcher.js","sourceRoot":"","sources":["../src/handshake-watcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { DaemonConfig } from "./config";
|
|
2
|
+
import type { DaemonDB } from "./server";
|
|
3
|
+
import type { Notifier } from "./notify";
|
|
4
|
+
export interface HireProposal {
|
|
5
|
+
messageId: string;
|
|
6
|
+
hirerAddress: string;
|
|
7
|
+
capability: string;
|
|
8
|
+
priceEth: string;
|
|
9
|
+
deadlineUnix: number;
|
|
10
|
+
specHash: string;
|
|
11
|
+
agreementId?: string;
|
|
12
|
+
signature?: string;
|
|
13
|
+
taskDescription?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface PolicyResult {
|
|
16
|
+
allowed: boolean;
|
|
17
|
+
reason?: string;
|
|
18
|
+
}
|
|
19
|
+
export declare function evaluatePolicy(proposal: HireProposal, config: DaemonConfig, activeCount: number): PolicyResult;
|
|
20
|
+
export declare class HireListener {
|
|
21
|
+
private config;
|
|
22
|
+
private db;
|
|
23
|
+
private notifier;
|
|
24
|
+
private walletAddress;
|
|
25
|
+
private lastSeenMessageId;
|
|
26
|
+
private onApprove;
|
|
27
|
+
constructor(config: DaemonConfig, db: DaemonDB, notifier: Notifier, walletAddress: string);
|
|
28
|
+
setApproveCallback(cb: (hireId: string) => Promise<void>): void;
|
|
29
|
+
poll(): Promise<void>;
|
|
30
|
+
private handleMessage;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=hire-listener.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hire-listener.d.ts","sourceRoot":"","sources":["../src/hire-listener.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAGzC,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAiCD,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,YAAY,EACtB,MAAM,EAAE,YAAY,EACpB,WAAW,EAAE,MAAM,GAClB,YAAY,CAmCd;AAoBD,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,EAAE,CAAW;IACrB,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,iBAAiB,CAAuB;IAChD,OAAO,CAAC,SAAS,CAAoD;gBAGnE,MAAM,EAAE,YAAY,EACpB,EAAE,EAAE,QAAQ,EACZ,QAAQ,EAAE,QAAQ,EAClB,aAAa,EAAE,MAAM;IAQvB,kBAAkB,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAIzD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAsBb,aAAa;CA6F5B"}
|
|
@@ -0,0 +1,237 @@
|
|
|
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.HireListener = void 0;
|
|
37
|
+
exports.evaluatePolicy = evaluatePolicy;
|
|
38
|
+
/**
|
|
39
|
+
* Hire listener — polls relay for incoming hire proposals,
|
|
40
|
+
* evaluates against policy, and queues for approval or auto-accepts.
|
|
41
|
+
*/
|
|
42
|
+
const http = __importStar(require("http"));
|
|
43
|
+
const https = __importStar(require("https"));
|
|
44
|
+
const ethers_1 = require("ethers");
|
|
45
|
+
const prompt_guard_1 = require("./prompt-guard");
|
|
46
|
+
function relayGet(relayUrl, urlPath) {
|
|
47
|
+
return new Promise((resolve, reject) => {
|
|
48
|
+
const parsed = new URL(urlPath, relayUrl);
|
|
49
|
+
const isHttps = parsed.protocol === "https:";
|
|
50
|
+
const mod = isHttps ? https : http;
|
|
51
|
+
const options = {
|
|
52
|
+
hostname: parsed.hostname,
|
|
53
|
+
port: parsed.port || (isHttps ? 443 : 80),
|
|
54
|
+
path: parsed.pathname + (parsed.search || ""),
|
|
55
|
+
method: "GET",
|
|
56
|
+
headers: { "Content-Type": "application/json" },
|
|
57
|
+
};
|
|
58
|
+
const req = mod.request(options, (res) => {
|
|
59
|
+
let raw = "";
|
|
60
|
+
res.on("data", (c) => { raw += c.toString(); });
|
|
61
|
+
res.on("end", () => {
|
|
62
|
+
try {
|
|
63
|
+
resolve({ status: res.statusCode ?? 0, data: JSON.parse(raw) });
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
resolve({ status: res.statusCode ?? 0, data: raw });
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
req.on("error", reject);
|
|
71
|
+
req.end();
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
function evaluatePolicy(proposal, config, activeCount) {
|
|
75
|
+
const policy = config.policy;
|
|
76
|
+
// Concurrency check
|
|
77
|
+
if (activeCount >= config.relay.max_concurrent_agreements) {
|
|
78
|
+
return { allowed: false, reason: "at_capacity" };
|
|
79
|
+
}
|
|
80
|
+
// Price check
|
|
81
|
+
try {
|
|
82
|
+
const priceWei = ethers_1.ethers.parseEther(proposal.priceEth || "0");
|
|
83
|
+
const maxWei = ethers_1.ethers.parseEther(policy.max_price_eth);
|
|
84
|
+
if (priceWei > maxWei) {
|
|
85
|
+
return { allowed: false, reason: "price_exceeds_policy" };
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return { allowed: false, reason: "invalid_price" };
|
|
90
|
+
}
|
|
91
|
+
// Capability check (empty list = accept all)
|
|
92
|
+
if (policy.allowed_capabilities.length > 0 && proposal.capability) {
|
|
93
|
+
if (!policy.allowed_capabilities.includes(proposal.capability)) {
|
|
94
|
+
return { allowed: false, reason: "capability_not_allowed" };
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// Deadline check
|
|
98
|
+
const now = Math.floor(Date.now() / 1000);
|
|
99
|
+
if (proposal.deadlineUnix > 0) {
|
|
100
|
+
if (proposal.deadlineUnix < now + policy.min_hire_lead_time_seconds) {
|
|
101
|
+
return { allowed: false, reason: "deadline_too_soon" };
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return { allowed: true };
|
|
105
|
+
}
|
|
106
|
+
function parseProposal(msg) {
|
|
107
|
+
const payload = (msg.payload ?? msg);
|
|
108
|
+
if (!payload.hirerAddress && !payload.hirer_address && !payload.from)
|
|
109
|
+
return null;
|
|
110
|
+
const taskDesc = String(payload.task ?? payload.taskDescription ?? payload.task_description ?? "");
|
|
111
|
+
return {
|
|
112
|
+
messageId: String(msg.messageId ?? msg.id ?? `msg_${Date.now()}`),
|
|
113
|
+
hirerAddress: String(payload.hirerAddress ?? payload.hirer_address ?? msg.from ?? ""),
|
|
114
|
+
capability: String(payload.capability ?? payload.serviceType ?? ""),
|
|
115
|
+
priceEth: String(payload.priceEth ?? payload.price_eth ?? "0"),
|
|
116
|
+
deadlineUnix: Number(payload.deadlineUnix ?? payload.deadline ?? 0),
|
|
117
|
+
specHash: String(payload.specHash ?? payload.spec_hash ?? ""),
|
|
118
|
+
agreementId: payload.agreementId ? String(payload.agreementId) : undefined,
|
|
119
|
+
signature: payload.signature ? String(payload.signature) : undefined,
|
|
120
|
+
taskDescription: taskDesc || undefined,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
class HireListener {
|
|
124
|
+
constructor(config, db, notifier, walletAddress) {
|
|
125
|
+
this.lastSeenMessageId = null;
|
|
126
|
+
this.onApprove = null;
|
|
127
|
+
this.config = config;
|
|
128
|
+
this.db = db;
|
|
129
|
+
this.notifier = notifier;
|
|
130
|
+
this.walletAddress = walletAddress;
|
|
131
|
+
}
|
|
132
|
+
setApproveCallback(cb) {
|
|
133
|
+
this.onApprove = cb;
|
|
134
|
+
}
|
|
135
|
+
async poll() {
|
|
136
|
+
const relayUrl = this.config.relay.relay_url;
|
|
137
|
+
if (!relayUrl)
|
|
138
|
+
return;
|
|
139
|
+
try {
|
|
140
|
+
const qs = `?address=${encodeURIComponent(this.walletAddress)}` +
|
|
141
|
+
(this.lastSeenMessageId ? `&since=${encodeURIComponent(this.lastSeenMessageId)}` : "");
|
|
142
|
+
const result = await relayGet(relayUrl, `/poll${qs}`);
|
|
143
|
+
const data = result.data;
|
|
144
|
+
const messages = data.messages ?? [];
|
|
145
|
+
for (const msg of messages) {
|
|
146
|
+
this.lastSeenMessageId = String(msg.messageId ?? "");
|
|
147
|
+
await this.handleMessage(msg);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
// Transient relay failure — retry next poll
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
async handleMessage(msg) {
|
|
155
|
+
const proposal = parseProposal(msg);
|
|
156
|
+
if (!proposal)
|
|
157
|
+
return;
|
|
158
|
+
// Dedup — skip if already in DB
|
|
159
|
+
const existing = this.db.getHireRequest(proposal.messageId);
|
|
160
|
+
if (existing)
|
|
161
|
+
return;
|
|
162
|
+
// Count active agreements
|
|
163
|
+
const activeCount = this.db.countActiveHireRequests();
|
|
164
|
+
// Policy evaluation
|
|
165
|
+
const policyResult = evaluatePolicy(proposal, this.config, activeCount);
|
|
166
|
+
if (!policyResult.allowed) {
|
|
167
|
+
// Reject
|
|
168
|
+
const hireId = proposal.messageId;
|
|
169
|
+
this.db.insertHireRequest({
|
|
170
|
+
id: hireId,
|
|
171
|
+
agreement_id: proposal.agreementId ?? null,
|
|
172
|
+
hirer_address: proposal.hirerAddress,
|
|
173
|
+
capability: proposal.capability,
|
|
174
|
+
price_eth: proposal.priceEth,
|
|
175
|
+
deadline_unix: proposal.deadlineUnix,
|
|
176
|
+
spec_hash: proposal.specHash,
|
|
177
|
+
task_description: proposal.taskDescription ?? null,
|
|
178
|
+
status: "rejected",
|
|
179
|
+
reject_reason: policyResult.reason ?? "policy_violation",
|
|
180
|
+
});
|
|
181
|
+
if (this.config.notifications.notify_on_hire_rejected) {
|
|
182
|
+
await this.notifier.notifyHireRejected(hireId, policyResult.reason ?? "policy_violation");
|
|
183
|
+
}
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
if (proposal.taskDescription) {
|
|
187
|
+
const guardResult = (0, prompt_guard_1.guardTaskContent)(proposal.taskDescription);
|
|
188
|
+
if (!guardResult.safe) {
|
|
189
|
+
const hireId = proposal.messageId;
|
|
190
|
+
this.db.insertHireRequest({
|
|
191
|
+
id: hireId,
|
|
192
|
+
agreement_id: proposal.agreementId ?? null,
|
|
193
|
+
hirer_address: proposal.hirerAddress,
|
|
194
|
+
capability: proposal.capability,
|
|
195
|
+
price_eth: proposal.priceEth,
|
|
196
|
+
deadline_unix: proposal.deadlineUnix,
|
|
197
|
+
spec_hash: proposal.specHash,
|
|
198
|
+
task_description: proposal.taskDescription,
|
|
199
|
+
status: "rejected",
|
|
200
|
+
reject_reason: `prompt_guard:${guardResult.category}`,
|
|
201
|
+
});
|
|
202
|
+
await this.notifier.send("hire_rejected", "PromptGuard Rejected Hire", [
|
|
203
|
+
`Hire: ${hireId}`,
|
|
204
|
+
`Category: ${guardResult.category}`,
|
|
205
|
+
`Severity: ${guardResult.severity}`,
|
|
206
|
+
`Excerpt: ${guardResult.excerpt}`,
|
|
207
|
+
].join("\n")).catch(() => { });
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
// Insert as pending_approval or auto-accept
|
|
212
|
+
const hireId = proposal.messageId;
|
|
213
|
+
const status = this.config.policy.auto_accept ? "accepted" : "pending_approval";
|
|
214
|
+
this.db.insertHireRequest({
|
|
215
|
+
id: hireId,
|
|
216
|
+
agreement_id: proposal.agreementId ?? null,
|
|
217
|
+
hirer_address: proposal.hirerAddress,
|
|
218
|
+
capability: proposal.capability,
|
|
219
|
+
price_eth: proposal.priceEth,
|
|
220
|
+
deadline_unix: proposal.deadlineUnix,
|
|
221
|
+
spec_hash: proposal.specHash,
|
|
222
|
+
task_description: proposal.taskDescription ?? null,
|
|
223
|
+
status,
|
|
224
|
+
reject_reason: null,
|
|
225
|
+
});
|
|
226
|
+
if (status === "pending_approval") {
|
|
227
|
+
if (this.config.notifications.notify_on_hire_request) {
|
|
228
|
+
await this.notifier.notifyHireRequest(hireId, proposal.hirerAddress, proposal.priceEth, proposal.capability);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
else if (status === "accepted" && this.onApprove) {
|
|
232
|
+
await this.onApprove(hireId);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
exports.HireListener = HireListener;
|
|
237
|
+
//# sourceMappingURL=hire-listener.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hire-listener.js","sourceRoot":"","sources":["../src/hire-listener.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
/**
|
|
38
|
+
* @arc402/daemon — entrypoint.
|
|
39
|
+
*
|
|
40
|
+
* Phase 1.2 (Spec 46 §16 Pattern 1): Two-process split.
|
|
41
|
+
* - arc402-signer: isolated child, holds machine key, Unix socket only
|
|
42
|
+
* - arc402-api: public child, HTTPS/Express, zero machine key access
|
|
43
|
+
*
|
|
44
|
+
* The machine key env var is stripped from the API process environment
|
|
45
|
+
* to enforce the isolation at the OS level.
|
|
46
|
+
*
|
|
47
|
+
* Legacy single-process mode preserved when --legacy flag is passed.
|
|
48
|
+
*/
|
|
49
|
+
const child_process_1 = require("child_process");
|
|
50
|
+
const path = __importStar(require("path"));
|
|
51
|
+
const config_1 = require("./config");
|
|
52
|
+
const legacy = process.argv.includes("--legacy") ||
|
|
53
|
+
process.env.ARC402_DAEMON_LEGACY === "1";
|
|
54
|
+
const foreground = process.argv.includes("--foreground") ||
|
|
55
|
+
process.env.ARC402_DAEMON_FOREGROUND === "1";
|
|
56
|
+
if (legacy) {
|
|
57
|
+
// ── Legacy single-process mode (Phase 1.1 server.ts) ──────────────────────
|
|
58
|
+
// Preserved for backward compatibility. Removed in a future release.
|
|
59
|
+
const { runDaemon } = require("./server");
|
|
60
|
+
runDaemon(foreground).catch((err) => {
|
|
61
|
+
process.stderr.write(`Daemon fatal error: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
62
|
+
process.exit(1);
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
// ── Two-process split ──────────────────────────────────────────────────────
|
|
67
|
+
runStartupPreflight();
|
|
68
|
+
startTwoProcessDaemon();
|
|
69
|
+
}
|
|
70
|
+
function runStartupPreflight() {
|
|
71
|
+
let config;
|
|
72
|
+
try {
|
|
73
|
+
config = (0, config_1.loadDaemonConfig)();
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
const detail = err instanceof Error ? err.message : String(err);
|
|
77
|
+
process.stderr.write(`ARC-402 daemon startup blocked during config: ${detail}\n`);
|
|
78
|
+
process.stderr.write("\nNext steps:\n");
|
|
79
|
+
process.stderr.write(" 1. Run `arc402 daemon init` to create ~/.arc402/daemon.toml.\n");
|
|
80
|
+
process.stderr.write(" 2. Fill in wallet.contract_address and network.rpc_url before starting the daemon.\n");
|
|
81
|
+
process.stderr.write(" 3. Retry with `arc402-daemon` or `arc402 daemon start`.\n");
|
|
82
|
+
process.exit(1);
|
|
83
|
+
}
|
|
84
|
+
try {
|
|
85
|
+
(0, config_1.loadMachineKey)(config);
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
const detail = err instanceof Error ? err.message : String(err);
|
|
89
|
+
const envVarName = (0, config_1.getMachineKeyEnvVarName)(config);
|
|
90
|
+
process.stderr.write(`ARC-402 daemon startup blocked during machine-key: ${detail}\n`);
|
|
91
|
+
process.stderr.write("\nNext steps:\n");
|
|
92
|
+
process.stderr.write(` 1. Export ${envVarName} with your machine key before starting the daemon.\n`);
|
|
93
|
+
process.stderr.write(" 2. Confirm wallet.machine_key in ~/.arc402/daemon.toml points at that env var.\n");
|
|
94
|
+
process.stderr.write(" 3. Retry after the machine key is available.\n");
|
|
95
|
+
process.exit(1);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
function startTwoProcessDaemon() {
|
|
99
|
+
try {
|
|
100
|
+
const cfg = (0, config_1.loadDaemonConfig)();
|
|
101
|
+
(0, config_1.loadMachineKey)(cfg);
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
105
|
+
process.stderr.write("ARC-402 daemon is not ready to start.\n");
|
|
106
|
+
process.stderr.write(`${message}\n\n`);
|
|
107
|
+
process.stderr.write("Next steps:\n");
|
|
108
|
+
process.stderr.write(" • Run `arc402 setup` for guided onboarding, or `arc402 daemon init` to create daemon.toml.\n");
|
|
109
|
+
process.stderr.write(" • Export the required machine key environment variable before starting the daemon.\n");
|
|
110
|
+
process.stderr.write(" • If this should be a remote operator machine, use `arc402 chat --setup` and choose Remote instead of starting a local daemon.\n");
|
|
111
|
+
process.exit(1);
|
|
112
|
+
}
|
|
113
|
+
const signerPath = path.join(__dirname, "signer.js");
|
|
114
|
+
const apiPath = path.join(__dirname, "api.js");
|
|
115
|
+
// ── Start signer first (creates the Unix socket) ──────────────────────────
|
|
116
|
+
// Signer inherits full env (including ARC402_MACHINE_KEY).
|
|
117
|
+
const signerProcess = (0, child_process_1.fork)(signerPath, [], {
|
|
118
|
+
stdio: foreground ? "inherit" : "pipe",
|
|
119
|
+
});
|
|
120
|
+
if (!foreground && signerProcess.stdout) {
|
|
121
|
+
signerProcess.stdout.on("data", (d) => {
|
|
122
|
+
process.stdout.write(d);
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
if (!foreground && signerProcess.stderr) {
|
|
126
|
+
signerProcess.stderr.on("data", (d) => {
|
|
127
|
+
process.stderr.write(d);
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
signerProcess.on("exit", (code) => {
|
|
131
|
+
process.stderr.write(`[index] signer exited with code ${String(code)} — shutting down\n`);
|
|
132
|
+
apiProcess?.kill("SIGTERM");
|
|
133
|
+
process.exit(1);
|
|
134
|
+
});
|
|
135
|
+
// ── Start API after 1s (socket must exist before api connects) ────────────
|
|
136
|
+
// API env: strip ARC402_MACHINE_KEY so the API process cannot access it.
|
|
137
|
+
let apiProcess;
|
|
138
|
+
setTimeout(() => {
|
|
139
|
+
const apiEnv = { ...process.env };
|
|
140
|
+
// Determine which env var holds the machine key and remove it
|
|
141
|
+
const machineKeyVar = apiEnv.ARC402_MACHINE_KEY
|
|
142
|
+
? "ARC402_MACHINE_KEY"
|
|
143
|
+
: Object.keys(apiEnv).find(k => k.startsWith("ARC402_") && apiEnv[k]?.startsWith("0x"));
|
|
144
|
+
if (machineKeyVar) {
|
|
145
|
+
delete apiEnv[machineKeyVar];
|
|
146
|
+
}
|
|
147
|
+
// Also strip any private key look-alikes under common names
|
|
148
|
+
for (const k of ["PRIVATE_KEY", "MACHINE_PRIVATE_KEY", "ARC402_SIGNER_KEY"]) {
|
|
149
|
+
delete apiEnv[k];
|
|
150
|
+
}
|
|
151
|
+
apiProcess = (0, child_process_1.fork)(apiPath, [], {
|
|
152
|
+
env: apiEnv,
|
|
153
|
+
stdio: foreground ? "inherit" : "pipe",
|
|
154
|
+
});
|
|
155
|
+
if (!foreground && apiProcess.stdout) {
|
|
156
|
+
apiProcess.stdout.on("data", (d) => {
|
|
157
|
+
process.stdout.write(d);
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
if (!foreground && apiProcess.stderr) {
|
|
161
|
+
apiProcess.stderr.on("data", (d) => {
|
|
162
|
+
process.stderr.write(d);
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
apiProcess.on("exit", (code) => {
|
|
166
|
+
process.stderr.write(`[index] api exited with code ${String(code)} — shutting down\n`);
|
|
167
|
+
signerProcess.kill("SIGTERM");
|
|
168
|
+
process.exit(1);
|
|
169
|
+
});
|
|
170
|
+
process.stdout.write("[index] Two-process daemon started (signer + api)\n");
|
|
171
|
+
}, 1000);
|
|
172
|
+
// ── Graceful shutdown ─────────────────────────────────────────────────────
|
|
173
|
+
function shutdown(signal) {
|
|
174
|
+
process.stderr.write(`[index] ${signal} received — shutting down\n`);
|
|
175
|
+
apiProcess?.kill("SIGTERM");
|
|
176
|
+
signerProcess.kill("SIGTERM");
|
|
177
|
+
setTimeout(() => process.exit(0), 3000);
|
|
178
|
+
}
|
|
179
|
+
process.on("SIGTERM", () => shutdown("SIGTERM"));
|
|
180
|
+
process.on("SIGINT", () => shutdown("SIGINT"));
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|