@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,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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;GAOG;AACH,uCAAyB;AACzB,2CAA6B;AAC7B,mCAAgC;AAEhC,MAAM,WAAW,GAAG,KAAM,CAAC;AAE3B,MAAM,kBAAkB,GAAG;IACzB,yKAAyK;CAC1K,CAAC;AAeF,MAAa,gBAAgB;IAS3B,YACE,QAAyB,EACzB,gBAAwB,EACxB,SAAiB,EACjB,WAAqD,EACrD,gBAAwB;QARlB,iBAAY,GAAgB,IAAI,GAAG,EAAE,CAAC;QACtC,iBAAY,GAA0C,IAAI,CAAC;QASjE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,QAAQ,GAAG,IAAI,eAAM,CAAC,QAAQ,CAAC,gBAAgB,EAAE,kBAAkB,EAAE,QAAQ,CAAC,CAAC;QACpF,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;QACzC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;YACtD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,4EAA4E;IAEpE,gBAAgB;QACtB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAChD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAChE,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBACzC,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;gBAC5D,MAAM,GAAG,GAAa,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACtC,IAAI,CAAC,YAAY,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,0BAA0B;YAC1B,IAAI,CAAC,YAAY,GAAG,IAAI,GAAG,EAAE,CAAC;QAChC,CAAC;IACH,CAAC;IAEO,gBAAgB;QACtB,IAAI,CAAC;YACH,EAAE,CAAC,aAAa,CACd,IAAI,CAAC,gBAAgB,EACrB,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,EACtC,EAAE,IAAI,EAAE,KAAK,EAAE,CAChB,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,sDAAsD;QACxD,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,WAAW;QACvB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC;YACpD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC,CAAC;YAEpD,gDAAgD;YAChD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YAC/E,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;YAExE,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,MAAM,IAAI,CAAC,SAAS,CAAC,GAAsB,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,GAAG,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAEO,aAAa;QACnB,MAAM,QAAQ,GAAG,KAAK,EAAE,GAAG,IAAe,EAAE,EAAE;YAC5C,sCAAsC;YACtC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAoB,CAAC;YACrD,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACtC,OAAO,CAAC,KAAK,CAAC,uCAAuC,EAAE,GAAG,CAAC,CAAC;YAC9D,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC;QAC7B,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,GAAoB;QAC1C,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;YACtB,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;YACvC,MAAM,EAAE,GAAW,IAAI,CAAC,CAAC,CAAC,CAAC;YAE3B,6CAA6C;YAC7C,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,SAAS;gBAAE,OAAO;YAEhD,oBAAoB;YACpB,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC;gBAAE,OAAO;YAE/C,MAAM,KAAK,GAAmB;gBAC5B,WAAW;gBACX,IAAI,EAAE,IAAI,CAAC,CAAC,CAAW;gBACvB,EAAE;gBACF,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACvB,KAAK,EAAE,IAAI,CAAC,CAAC,CAAW;gBACxB,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;gBAClC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAW;gBACvB,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC1B,WAAW,EAAE,GAAG,CAAC,WAAW;gBAC5B,MAAM,EAAE,GAAG,CAAC,eAAe;aAC5B,CAAC;YAEF,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YAE9B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACnC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC1B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,6CAA6C,EAAE,GAAG,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;CACF;AAhID,4CAgIC"}
@@ -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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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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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"}