@jinn-network/client 0.1.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 (278) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +162 -0
  3. package/deployments/deployment-phase1a-l2-baseSepolia-fast.json +32 -0
  4. package/deployments/deployment-phase1a-token-baseSepolia-fast.json +27 -0
  5. package/deployments/deployment-phase1b-mech-baseSepolia-fast.json +26 -0
  6. package/deployments/deployment-stolas-l2-baseSepolia-fast.json +35 -0
  7. package/dist/adapters/adapter.d.ts +11 -0
  8. package/dist/adapters/adapter.js +2 -0
  9. package/dist/adapters/adapter.js.map +1 -0
  10. package/dist/adapters/local/adapter.d.ts +20 -0
  11. package/dist/adapters/local/adapter.js +146 -0
  12. package/dist/adapters/local/adapter.js.map +1 -0
  13. package/dist/adapters/mech/adapter.d.ts +29 -0
  14. package/dist/adapters/mech/adapter.js +332 -0
  15. package/dist/adapters/mech/adapter.js.map +1 -0
  16. package/dist/adapters/mech/claim-policy.d.ts +40 -0
  17. package/dist/adapters/mech/claim-policy.js +104 -0
  18. package/dist/adapters/mech/claim-policy.js.map +1 -0
  19. package/dist/adapters/mech/contracts.d.ts +44 -0
  20. package/dist/adapters/mech/contracts.js +323 -0
  21. package/dist/adapters/mech/contracts.js.map +1 -0
  22. package/dist/adapters/mech/ipfs.d.ts +43 -0
  23. package/dist/adapters/mech/ipfs.js +142 -0
  24. package/dist/adapters/mech/ipfs.js.map +1 -0
  25. package/dist/adapters/mech/safe.d.ts +15 -0
  26. package/dist/adapters/mech/safe.js +113 -0
  27. package/dist/adapters/mech/safe.js.map +1 -0
  28. package/dist/adapters/mech/types.d.ts +561 -0
  29. package/dist/adapters/mech/types.js +340 -0
  30. package/dist/adapters/mech/types.js.map +1 -0
  31. package/dist/api/balance-build.d.ts +22 -0
  32. package/dist/api/balance-build.js +37 -0
  33. package/dist/api/balance-build.js.map +1 -0
  34. package/dist/api/fleet-build.d.ts +62 -0
  35. package/dist/api/fleet-build.js +91 -0
  36. package/dist/api/fleet-build.js.map +1 -0
  37. package/dist/api/gather-status.d.ts +20 -0
  38. package/dist/api/gather-status.js +137 -0
  39. package/dist/api/gather-status.js.map +1 -0
  40. package/dist/api/history-build.d.ts +32 -0
  41. package/dist/api/history-build.js +48 -0
  42. package/dist/api/history-build.js.map +1 -0
  43. package/dist/api/peers.d.ts +27 -0
  44. package/dist/api/peers.js +94 -0
  45. package/dist/api/peers.js.map +1 -0
  46. package/dist/api/rewards-build.d.ts +20 -0
  47. package/dist/api/rewards-build.js +42 -0
  48. package/dist/api/rewards-build.js.map +1 -0
  49. package/dist/api/server.d.ts +34 -0
  50. package/dist/api/server.js +130 -0
  51. package/dist/api/server.js.map +1 -0
  52. package/dist/api/status-build.d.ts +92 -0
  53. package/dist/api/status-build.js +175 -0
  54. package/dist/api/status-build.js.map +1 -0
  55. package/dist/api/status-rollup-build.d.ts +36 -0
  56. package/dist/api/status-rollup-build.js +69 -0
  57. package/dist/api/status-rollup-build.js.map +1 -0
  58. package/dist/auth/erc8128.d.ts +43 -0
  59. package/dist/auth/erc8128.js +88 -0
  60. package/dist/auth/erc8128.js.map +1 -0
  61. package/dist/bin/jinn.d.ts +11 -0
  62. package/dist/bin/jinn.js +20 -0
  63. package/dist/bin/jinn.js.map +1 -0
  64. package/dist/build-meta.json +3 -0
  65. package/dist/chain-read-errors.d.ts +9 -0
  66. package/dist/chain-read-errors.js +43 -0
  67. package/dist/chain-read-errors.js.map +1 -0
  68. package/dist/cli/action.d.ts +26 -0
  69. package/dist/cli/action.js +56 -0
  70. package/dist/cli/action.js.map +1 -0
  71. package/dist/cli/command.d.ts +62 -0
  72. package/dist/cli/command.js +29 -0
  73. package/dist/cli/command.js.map +1 -0
  74. package/dist/cli/commands/balance.d.ts +3 -0
  75. package/dist/cli/commands/balance.js +46 -0
  76. package/dist/cli/commands/balance.js.map +1 -0
  77. package/dist/cli/commands/bootstrap.d.ts +3 -0
  78. package/dist/cli/commands/bootstrap.js +165 -0
  79. package/dist/cli/commands/bootstrap.js.map +1 -0
  80. package/dist/cli/commands/claim-rewards.d.ts +3 -0
  81. package/dist/cli/commands/claim-rewards.js +121 -0
  82. package/dist/cli/commands/claim-rewards.js.map +1 -0
  83. package/dist/cli/commands/doctor.d.ts +3 -0
  84. package/dist/cli/commands/doctor.js +151 -0
  85. package/dist/cli/commands/doctor.js.map +1 -0
  86. package/dist/cli/commands/fleet-scale.d.ts +3 -0
  87. package/dist/cli/commands/fleet-scale.js +449 -0
  88. package/dist/cli/commands/fleet-scale.js.map +1 -0
  89. package/dist/cli/commands/fleet.d.ts +3 -0
  90. package/dist/cli/commands/fleet.js +45 -0
  91. package/dist/cli/commands/fleet.js.map +1 -0
  92. package/dist/cli/commands/fund-requirements.d.ts +3 -0
  93. package/dist/cli/commands/fund-requirements.js +139 -0
  94. package/dist/cli/commands/fund-requirements.js.map +1 -0
  95. package/dist/cli/commands/history.d.ts +3 -0
  96. package/dist/cli/commands/history.js +61 -0
  97. package/dist/cli/commands/history.js.map +1 -0
  98. package/dist/cli/commands/init.d.ts +3 -0
  99. package/dist/cli/commands/init.js +91 -0
  100. package/dist/cli/commands/init.js.map +1 -0
  101. package/dist/cli/commands/keys-backup.d.ts +3 -0
  102. package/dist/cli/commands/keys-backup.js +107 -0
  103. package/dist/cli/commands/keys-backup.js.map +1 -0
  104. package/dist/cli/commands/logs.d.ts +3 -0
  105. package/dist/cli/commands/logs.js +69 -0
  106. package/dist/cli/commands/logs.js.map +1 -0
  107. package/dist/cli/commands/rewards.d.ts +3 -0
  108. package/dist/cli/commands/rewards.js +54 -0
  109. package/dist/cli/commands/rewards.js.map +1 -0
  110. package/dist/cli/commands/run.d.ts +3 -0
  111. package/dist/cli/commands/run.js +96 -0
  112. package/dist/cli/commands/run.js.map +1 -0
  113. package/dist/cli/commands/status.d.ts +3 -0
  114. package/dist/cli/commands/status.js +54 -0
  115. package/dist/cli/commands/status.js.map +1 -0
  116. package/dist/cli/commands/stop.d.ts +3 -0
  117. package/dist/cli/commands/stop.js +82 -0
  118. package/dist/cli/commands/stop.js.map +1 -0
  119. package/dist/cli/commands/submit-intent.d.ts +3 -0
  120. package/dist/cli/commands/submit-intent.js +169 -0
  121. package/dist/cli/commands/submit-intent.js.map +1 -0
  122. package/dist/cli/commands/version.d.ts +3 -0
  123. package/dist/cli/commands/version.js +114 -0
  124. package/dist/cli/commands/version.js.map +1 -0
  125. package/dist/cli/commands/withdraw.d.ts +3 -0
  126. package/dist/cli/commands/withdraw.js +181 -0
  127. package/dist/cli/commands/withdraw.js.map +1 -0
  128. package/dist/cli/deployment-digest.d.ts +10 -0
  129. package/dist/cli/deployment-digest.js +25 -0
  130. package/dist/cli/deployment-digest.js.map +1 -0
  131. package/dist/cli/execution-context.d.ts +50 -0
  132. package/dist/cli/execution-context.js +154 -0
  133. package/dist/cli/execution-context.js.map +1 -0
  134. package/dist/cli/help.d.ts +3 -0
  135. package/dist/cli/help.js +37 -0
  136. package/dist/cli/help.js.map +1 -0
  137. package/dist/cli/index.d.ts +17 -0
  138. package/dist/cli/index.js +132 -0
  139. package/dist/cli/index.js.map +1 -0
  140. package/dist/cli/introspection-context.d.ts +10 -0
  141. package/dist/cli/introspection-context.js +60 -0
  142. package/dist/cli/introspection-context.js.map +1 -0
  143. package/dist/cli/output.d.ts +36 -0
  144. package/dist/cli/output.js +35 -0
  145. package/dist/cli/output.js.map +1 -0
  146. package/dist/cli/password.d.ts +12 -0
  147. package/dist/cli/password.js +51 -0
  148. package/dist/cli/password.js.map +1 -0
  149. package/dist/config.d.ts +174 -0
  150. package/dist/config.js +252 -0
  151. package/dist/config.js.map +1 -0
  152. package/dist/daemon/creator.d.ts +24 -0
  153. package/dist/daemon/creator.js +80 -0
  154. package/dist/daemon/creator.js.map +1 -0
  155. package/dist/daemon/daemon.d.ts +60 -0
  156. package/dist/daemon/daemon.js +158 -0
  157. package/dist/daemon/daemon.js.map +1 -0
  158. package/dist/daemon/delivery-watcher.d.ts +10 -0
  159. package/dist/daemon/delivery-watcher.js +37 -0
  160. package/dist/daemon/delivery-watcher.js.map +1 -0
  161. package/dist/daemon/restorer.d.ts +19 -0
  162. package/dist/daemon/restorer.js +82 -0
  163. package/dist/daemon/restorer.js.map +1 -0
  164. package/dist/daemon/reward-claim-loop.d.ts +38 -0
  165. package/dist/daemon/reward-claim-loop.js +48 -0
  166. package/dist/daemon/reward-claim-loop.js.map +1 -0
  167. package/dist/discovery/registry.d.ts +43 -0
  168. package/dist/discovery/registry.js +104 -0
  169. package/dist/discovery/registry.js.map +1 -0
  170. package/dist/discovery/subgraph.d.ts +37 -0
  171. package/dist/discovery/subgraph.js +87 -0
  172. package/dist/discovery/subgraph.js.map +1 -0
  173. package/dist/earning/bootstrap.d.ts +79 -0
  174. package/dist/earning/bootstrap.js +989 -0
  175. package/dist/earning/bootstrap.js.map +1 -0
  176. package/dist/earning/contracts.d.ts +431 -0
  177. package/dist/earning/contracts.js +518 -0
  178. package/dist/earning/contracts.js.map +1 -0
  179. package/dist/earning/evidence-simhash.d.ts +59 -0
  180. package/dist/earning/evidence-simhash.js +87 -0
  181. package/dist/earning/evidence-simhash.js.map +1 -0
  182. package/dist/earning/fleet-display-index.d.ts +8 -0
  183. package/dist/earning/fleet-display-index.js +12 -0
  184. package/dist/earning/fleet-display-index.js.map +1 -0
  185. package/dist/earning/fleet-retire.d.ts +28 -0
  186. package/dist/earning/fleet-retire.js +75 -0
  187. package/dist/earning/fleet-retire.js.map +1 -0
  188. package/dist/earning/jinn-rewards.d.ts +62 -0
  189. package/dist/earning/jinn-rewards.js +81 -0
  190. package/dist/earning/jinn-rewards.js.map +1 -0
  191. package/dist/earning/next-service-index.d.ts +4 -0
  192. package/dist/earning/next-service-index.js +7 -0
  193. package/dist/earning/next-service-index.js.map +1 -0
  194. package/dist/earning/orphan-sweep.d.ts +33 -0
  195. package/dist/earning/orphan-sweep.js +157 -0
  196. package/dist/earning/orphan-sweep.js.map +1 -0
  197. package/dist/earning/reconcile.d.ts +37 -0
  198. package/dist/earning/reconcile.js +216 -0
  199. package/dist/earning/reconcile.js.map +1 -0
  200. package/dist/earning/safe-adapter.d.ts +70 -0
  201. package/dist/earning/safe-adapter.js +228 -0
  202. package/dist/earning/safe-adapter.js.map +1 -0
  203. package/dist/earning/stolas-claim.d.ts +47 -0
  204. package/dist/earning/stolas-claim.js +115 -0
  205. package/dist/earning/stolas-claim.js.map +1 -0
  206. package/dist/earning/store.d.ts +36 -0
  207. package/dist/earning/store.js +156 -0
  208. package/dist/earning/store.js.map +1 -0
  209. package/dist/earning/types.d.ts +123 -0
  210. package/dist/earning/types.js +64 -0
  211. package/dist/earning/types.js.map +1 -0
  212. package/dist/earning/viem-clients.d.ts +9 -0
  213. package/dist/earning/viem-clients.js +22 -0
  214. package/dist/earning/viem-clients.js.map +1 -0
  215. package/dist/earning/wallet.d.ts +20 -0
  216. package/dist/earning/wallet.js +103 -0
  217. package/dist/earning/wallet.js.map +1 -0
  218. package/dist/errors/envelope.d.ts +41 -0
  219. package/dist/errors/envelope.js +48 -0
  220. package/dist/errors/envelope.js.map +1 -0
  221. package/dist/index.d.ts +14 -0
  222. package/dist/index.js +17 -0
  223. package/dist/index.js.map +1 -0
  224. package/dist/main.d.ts +32 -0
  225. package/dist/main.js +281 -0
  226. package/dist/main.js.map +1 -0
  227. package/dist/mcp/server.d.ts +14 -0
  228. package/dist/mcp/server.js +205 -0
  229. package/dist/mcp/server.js.map +1 -0
  230. package/dist/operator-errors.d.ts +16 -0
  231. package/dist/operator-errors.js +88 -0
  232. package/dist/operator-errors.js.map +1 -0
  233. package/dist/preflight/claude-binary.d.ts +19 -0
  234. package/dist/preflight/claude-binary.js +44 -0
  235. package/dist/preflight/claude-binary.js.map +1 -0
  236. package/dist/preflight/claude-invocation-envelope.d.ts +11 -0
  237. package/dist/preflight/claude-invocation-envelope.js +67 -0
  238. package/dist/preflight/claude-invocation-envelope.js.map +1 -0
  239. package/dist/runner/claude.d.ts +15 -0
  240. package/dist/runner/claude.js +193 -0
  241. package/dist/runner/claude.js.map +1 -0
  242. package/dist/runner/runner.d.ts +11 -0
  243. package/dist/runner/runner.js +2 -0
  244. package/dist/runner/runner.js.map +1 -0
  245. package/dist/runner/simple.d.ts +8 -0
  246. package/dist/runner/simple.js +11 -0
  247. package/dist/runner/simple.js.map +1 -0
  248. package/dist/store/store.d.ts +74 -0
  249. package/dist/store/store.js +168 -0
  250. package/dist/store/store.js.map +1 -0
  251. package/dist/tx-retry.d.ts +55 -0
  252. package/dist/tx-retry.js +214 -0
  253. package/dist/tx-retry.js.map +1 -0
  254. package/dist/types/desired-state.d.ts +41 -0
  255. package/dist/types/desired-state.js +16 -0
  256. package/dist/types/desired-state.js.map +1 -0
  257. package/dist/types/errors.d.ts +8 -0
  258. package/dist/types/errors.js +17 -0
  259. package/dist/types/errors.js.map +1 -0
  260. package/dist/types/index.d.ts +2 -0
  261. package/dist/types/index.js +3 -0
  262. package/dist/types/index.js.map +1 -0
  263. package/dist/withdraw/args.d.ts +29 -0
  264. package/dist/withdraw/args.js +198 -0
  265. package/dist/withdraw/args.js.map +1 -0
  266. package/dist/withdraw/run-withdraw-plan.d.ts +21 -0
  267. package/dist/withdraw/run-withdraw-plan.js +257 -0
  268. package/dist/withdraw/run-withdraw-plan.js.map +1 -0
  269. package/dist/x402/acquire.d.ts +6 -0
  270. package/dist/x402/acquire.js +32 -0
  271. package/dist/x402/acquire.js.map +1 -0
  272. package/dist/x402/facilitator.d.ts +11 -0
  273. package/dist/x402/facilitator.js +52 -0
  274. package/dist/x402/facilitator.js.map +1 -0
  275. package/dist/x402/handler.d.ts +15 -0
  276. package/dist/x402/handler.js +40 -0
  277. package/dist/x402/handler.js.map +1 -0
  278. package/package.json +72 -0
@@ -0,0 +1,193 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { existsSync, writeFileSync, mkdtempSync, rmSync } from 'node:fs';
3
+ import { dirname, join } from 'node:path';
4
+ import { tmpdir } from 'node:os';
5
+ import { fileURLToPath } from 'node:url';
6
+ import { Store } from '../store/store.js';
7
+ const __dirname = dirname(fileURLToPath(import.meta.url));
8
+ /** MCP subprocess: compiled `server.js` when present, else `node --import tsx server.ts` (dev / yarn e2e). */
9
+ function resolveJinnMcpLauncher(explicitPath) {
10
+ if (explicitPath) {
11
+ return { command: process.execPath, args: [explicitPath] };
12
+ }
13
+ const mcpDir = join(__dirname, '..', 'mcp');
14
+ const js = join(mcpDir, 'server.js');
15
+ const ts = join(mcpDir, 'server.ts');
16
+ if (existsSync(js)) {
17
+ return { command: process.execPath, args: [js] };
18
+ }
19
+ if (existsSync(ts)) {
20
+ return { command: process.execPath, args: ['--import', 'tsx', ts] };
21
+ }
22
+ return { command: process.execPath, args: [js] };
23
+ }
24
+ export class ClaudeRunner {
25
+ claudePath;
26
+ model;
27
+ mcpLauncher;
28
+ constructor(config = {}) {
29
+ this.claudePath = config.claudePath ?? 'claude';
30
+ this.model = config.model;
31
+ this.mcpLauncher = resolveJinnMcpLauncher(config.mcpServerPath);
32
+ }
33
+ async run(desiredState, context) {
34
+ const prompt = buildPrompt(desiredState);
35
+ // Write MCP config to temp dir
36
+ const tmpDir = mkdtempSync(join(tmpdir(), 'jinn-runner-'));
37
+ const mcpConfigPath = join(tmpDir, 'mcp-config.json');
38
+ writeFileSync(mcpConfigPath, JSON.stringify({
39
+ mcpServers: {
40
+ 'jinn-client': {
41
+ command: this.mcpLauncher.command,
42
+ args: this.mcpLauncher.args,
43
+ env: {
44
+ DESIRED_STATE_ID: desiredState.id,
45
+ DESIRED_STATE_DESCRIPTION: desiredState.description,
46
+ DESIRED_STATE_CONTEXT: desiredState.context ? JSON.stringify(desiredState.context) : '',
47
+ DESIRED_STATE_TYPE: desiredState.type ?? '',
48
+ RESTORATION_REQUEST_ID: desiredState.restorationRequestId ?? '',
49
+ REQUEST_ID: context.requestId,
50
+ RESTORATION_DELIVERY_DATA: desiredState.type === 'evaluation' && desiredState.context?.restorationResult
51
+ ? JSON.stringify(desiredState.context.restorationResult)
52
+ : '',
53
+ STORE_PATH: context.storePath ?? '',
54
+ DAEMON_API_URL: context.daemonApiUrl ?? '',
55
+ },
56
+ },
57
+ },
58
+ }));
59
+ try {
60
+ await spawnAgent(this.claudePath, prompt, mcpConfigPath, this.model, context.timeoutMs);
61
+ // Read result from store — the MCP tool published it as an artifact
62
+ if (context.storePath) {
63
+ const store = new Store(context.storePath);
64
+ try {
65
+ const isEvaluation = desiredState.type === 'evaluation';
66
+ const tag = isEvaluation ? 'evaluation-verdict' : 'restoration-result';
67
+ const artifact = store.getArtifactByRequestId(context.requestId, tag);
68
+ if (artifact) {
69
+ return { data: artifact.content };
70
+ }
71
+ }
72
+ finally {
73
+ store.close();
74
+ }
75
+ }
76
+ return { data: '' };
77
+ }
78
+ finally {
79
+ rmSync(tmpDir, { recursive: true, force: true });
80
+ }
81
+ }
82
+ }
83
+ export function buildPrompt(desiredState) {
84
+ let contextSection = '';
85
+ if (desiredState.context && Object.keys(desiredState.context).length > 0) {
86
+ contextSection = `\n## Context\n${JSON.stringify(desiredState.context, null, 2)}\n`;
87
+ }
88
+ const isEvaluation = desiredState.type === 'evaluation';
89
+ const instructions = isEvaluation
90
+ ? `## Instructions
91
+ 1. Use get_desired_state to understand what was requested
92
+ 2. Use get_restoration_delivery to fetch the restoration result
93
+ 3. Evaluate whether the restoration achieved the desired state
94
+ 4. Use submit_restoration_result to report your verdict
95
+ 5. Use report_progress to log progress along the way
96
+ 6. Optionally use publish_artifact to record any insights`
97
+ : `## Instructions
98
+ 1. Use get_desired_state to understand what needs to be restored
99
+ 2. Take the necessary actions to restore it
100
+ 3. Use submit_restoration_result to report what you did
101
+ 4. Use report_progress to log progress along the way
102
+ 5. Optionally use publish_artifact to record any insights`;
103
+ return `You are ${isEvaluation ? 'evaluating a restoration' : 'restoring a desired state'}.
104
+
105
+ ## Desired State
106
+ ID: ${desiredState.id}
107
+ Description: ${desiredState.description}
108
+ ${contextSection}
109
+ ${instructions}
110
+
111
+ Work autonomously. Do not ask questions.`;
112
+ }
113
+ // Environment allowlist for agent subprocess — only pass what's needed.
114
+ // The agent must never see private keys, operator passwords, or secrets.
115
+ const ENV_ALLOWLIST = [
116
+ 'PATH',
117
+ 'HOME',
118
+ 'USER',
119
+ 'SHELL',
120
+ 'LANG',
121
+ 'TERM',
122
+ 'TMPDIR',
123
+ 'XDG_CONFIG_HOME',
124
+ 'XDG_DATA_HOME',
125
+ 'XDG_CACHE_HOME',
126
+ 'NODE_PATH',
127
+ 'NODE_OPTIONS',
128
+ 'NPM_CONFIG_PREFIX',
129
+ ];
130
+ const ENV_BLOCKLIST = [
131
+ 'PRIVATE_KEY',
132
+ 'SECRET',
133
+ 'PASSWORD',
134
+ 'OPERATOR',
135
+ 'MNEMONIC',
136
+ 'KEYSTORE',
137
+ 'API_KEY',
138
+ 'AUTH_TOKEN',
139
+ 'SERVICE_ROLE',
140
+ ];
141
+ function buildAgentEnv() {
142
+ const env = {};
143
+ for (const key of ENV_ALLOWLIST) {
144
+ if (process.env[key])
145
+ env[key] = process.env[key];
146
+ }
147
+ return env;
148
+ }
149
+ function spawnAgent(claudePath, prompt, mcpConfigPath, model, timeoutMs) {
150
+ return new Promise((resolve, reject) => {
151
+ const args = ['-p', prompt, '--mcp-config', mcpConfigPath, '--strict-mcp-config'];
152
+ if (model)
153
+ args.push('--model', model);
154
+ args.push('--allowedTools', 'mcp__jinn-client__*');
155
+ console.log(`[runner] Spawning agent: ${claudePath} ${args.slice(0, 3).join(' ')} ... (timeout: ${timeoutMs}ms)`);
156
+ const agentEnv = buildAgentEnv();
157
+ const child = spawn(claudePath, args, {
158
+ stdio: ['ignore', 'pipe', 'pipe'],
159
+ env: agentEnv,
160
+ timeout: timeoutMs,
161
+ });
162
+ console.log(`[runner] Agent process spawned (pid: ${child.pid})`);
163
+ let stdout = '';
164
+ let stderr = '';
165
+ child.stdout?.on('data', (d) => {
166
+ stdout += d.toString();
167
+ // Stream output as it arrives
168
+ const lines = d.toString().trim();
169
+ if (lines)
170
+ console.log(`[runner:stdout] ${lines.slice(0, 200)}`);
171
+ });
172
+ child.stderr?.on('data', (d) => {
173
+ stderr += d.toString();
174
+ const lines = d.toString().trim();
175
+ if (lines)
176
+ console.error(`[runner:stderr] ${lines.slice(0, 200)}`);
177
+ });
178
+ child.on('exit', (code, signal) => {
179
+ console.log(`[runner] Agent process exited (code: ${code}, signal: ${signal})`);
180
+ if (code === 0) {
181
+ resolve();
182
+ }
183
+ else {
184
+ reject(new Error(`Agent exited with code ${code}, signal ${signal}: ${stderr.slice(0, 500)}`));
185
+ }
186
+ });
187
+ child.on('error', (err) => {
188
+ console.error(`[runner] Agent spawn error:`, err.message);
189
+ reject(err);
190
+ });
191
+ });
192
+ }
193
+ //# sourceMappingURL=claude.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/runner/claude.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { DesiredState, RestorationResult, RequestId } from '../types/index.js';
2
+ export interface RunnerContext {
3
+ requestId: RequestId;
4
+ workingDirectory: string;
5
+ timeoutMs: number;
6
+ storePath?: string;
7
+ daemonApiUrl?: string;
8
+ }
9
+ export interface Runner {
10
+ run(desiredState: DesiredState, context: RunnerContext): Promise<RestorationResult>;
11
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/runner/runner.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ import type { DesiredState, RestorationResult } from '../types/index.js';
2
+ import type { Runner, RunnerContext } from './runner.js';
3
+ export type RestorationFn = (description: string, context?: Record<string, unknown>) => Promise<string>;
4
+ export declare class SimpleRunner implements Runner {
5
+ private readonly fn;
6
+ constructor(fn: RestorationFn);
7
+ run(desiredState: DesiredState, _context: RunnerContext): Promise<RestorationResult>;
8
+ }
@@ -0,0 +1,11 @@
1
+ export class SimpleRunner {
2
+ fn;
3
+ constructor(fn) {
4
+ this.fn = fn;
5
+ }
6
+ async run(desiredState, _context) {
7
+ const data = await this.fn(desiredState.description, desiredState.context);
8
+ return { data };
9
+ }
10
+ }
11
+ //# sourceMappingURL=simple.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simple.js","sourceRoot":"","sources":["../../src/runner/simple.ts"],"names":[],"mappings":"AAKA,MAAM,OAAO,YAAY;IACM;IAA7B,YAA6B,EAAiB;QAAjB,OAAE,GAAF,EAAE,CAAe;IAAG,CAAC;IAElD,KAAK,CAAC,GAAG,CAAC,YAA0B,EAAE,QAAuB;QAC3D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;QAC3E,OAAO,EAAE,IAAI,EAAE,CAAC;IAClB,CAAC;CACF"}
@@ -0,0 +1,74 @@
1
+ export declare class Store {
2
+ private db;
3
+ readonly path: string;
4
+ constructor(dbPath: string);
5
+ recordOwnActivity(requestId: string, role: 'created' | 'claimed' | 'delivered' | 'evaluated'): void;
6
+ isOwnActivity(requestId: string): boolean;
7
+ setShutdownState(state: 'clean' | 'running'): void;
8
+ getShutdownState(): string | null;
9
+ /** Generic config row (e.g. last_reward_claim_tick_at). */
10
+ getConfigValue(key: string): string | null;
11
+ setConfigValue(key: string, value: string): void;
12
+ /** Counts of protocol roles recorded for this node (best-effort activity hints). */
13
+ getOwnActivityCounts(): Record<string, number>;
14
+ /** Latest own_activity rows by insertion order (approximate). */
15
+ getRecentOwnActivity(limit: number): Array<{
16
+ requestId: string;
17
+ role: string;
18
+ }>;
19
+ getLastProcessedBlock(): bigint | null;
20
+ setLastProcessedBlock(block: bigint): void;
21
+ insertArtifact(artifact: {
22
+ id: string;
23
+ desiredStateId: string;
24
+ requestId: string;
25
+ title: string;
26
+ content: string;
27
+ tags: string[];
28
+ outcome: 'SUCCESS' | 'FAILURE' | 'UNKNOWN';
29
+ }): void;
30
+ searchArtifacts(query: {
31
+ tags?: string[];
32
+ outcome?: string;
33
+ requestId?: string;
34
+ desiredStateId?: string;
35
+ after?: string;
36
+ before?: string;
37
+ limit?: number;
38
+ }): Array<{
39
+ id: string;
40
+ title: string;
41
+ content: string;
42
+ tags: string[];
43
+ outcome: string;
44
+ request_id: string;
45
+ desired_state_id: string;
46
+ created_at: string;
47
+ }>;
48
+ insertRemoteArtifact(artifact: {
49
+ id: string;
50
+ desiredStateId: string;
51
+ requestId: string;
52
+ title: string;
53
+ tags: string[];
54
+ outcome: 'SUCCESS' | 'FAILURE' | 'UNKNOWN';
55
+ ownerAddress: string;
56
+ endpoint: string;
57
+ price?: string;
58
+ }): void;
59
+ getArtifactContent(id: string): string | null;
60
+ getRemoteArtifactInfo(id: string): {
61
+ endpoint: string;
62
+ ownerAddress: string;
63
+ price?: string;
64
+ } | null;
65
+ getArtifactByRequestId(requestId: string, tag: string): {
66
+ id: string;
67
+ title: string;
68
+ content: string;
69
+ tags: string[];
70
+ outcome: string;
71
+ } | null;
72
+ cacheRemoteContent(id: string, content: string): void;
73
+ close(): void;
74
+ }
@@ -0,0 +1,168 @@
1
+ import Database from 'better-sqlite3';
2
+ const SCHEMA = `
3
+ CREATE TABLE IF NOT EXISTS own_activity (
4
+ request_id TEXT PRIMARY KEY,
5
+ role TEXT NOT NULL CHECK (role IN ('created', 'claimed', 'delivered', 'evaluated'))
6
+ );
7
+
8
+ CREATE TABLE IF NOT EXISTS config (
9
+ key TEXT PRIMARY KEY,
10
+ value TEXT NOT NULL
11
+ );
12
+
13
+ CREATE TABLE IF NOT EXISTS artifacts (
14
+ id TEXT PRIMARY KEY,
15
+ desired_state_id TEXT NOT NULL,
16
+ request_id TEXT NOT NULL,
17
+ title TEXT NOT NULL,
18
+ content TEXT,
19
+ tags TEXT NOT NULL DEFAULT '[]',
20
+ outcome TEXT NOT NULL CHECK (outcome IN ('SUCCESS', 'FAILURE', 'UNKNOWN')),
21
+ remote INTEGER NOT NULL DEFAULT 0,
22
+ owner_address TEXT,
23
+ endpoint TEXT,
24
+ price TEXT,
25
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
26
+ );
27
+
28
+ CREATE INDEX IF NOT EXISTS idx_artifacts_desired_state ON artifacts (desired_state_id);
29
+ CREATE INDEX IF NOT EXISTS idx_artifacts_outcome ON artifacts (outcome);
30
+ CREATE INDEX IF NOT EXISTS idx_artifacts_remote ON artifacts (remote);
31
+
32
+ `;
33
+ export class Store {
34
+ db;
35
+ path;
36
+ constructor(dbPath) {
37
+ this.path = dbPath;
38
+ this.db = new Database(dbPath);
39
+ this.db.pragma('journal_mode = WAL');
40
+ this.db.exec(SCHEMA);
41
+ }
42
+ recordOwnActivity(requestId, role) {
43
+ this.db.prepare(`INSERT OR REPLACE INTO own_activity (request_id, role) VALUES (?, ?)`).run(requestId, role);
44
+ }
45
+ isOwnActivity(requestId) {
46
+ const row = this.db.prepare('SELECT 1 FROM own_activity WHERE request_id = ?').get(requestId);
47
+ return row !== undefined;
48
+ }
49
+ setShutdownState(state) {
50
+ this.db.prepare('INSERT OR REPLACE INTO config (key, value) VALUES (?, ?)').run('shutdown_state', state);
51
+ }
52
+ getShutdownState() {
53
+ const row = this.db.prepare('SELECT value FROM config WHERE key = ?').get('shutdown_state');
54
+ return row?.value ?? null;
55
+ }
56
+ /** Generic config row (e.g. last_reward_claim_tick_at). */
57
+ getConfigValue(key) {
58
+ const row = this.db.prepare('SELECT value FROM config WHERE key = ?').get(key);
59
+ return row?.value ?? null;
60
+ }
61
+ setConfigValue(key, value) {
62
+ this.db.prepare('INSERT OR REPLACE INTO config (key, value) VALUES (?, ?)').run(key, value);
63
+ }
64
+ /** Counts of protocol roles recorded for this node (best-effort activity hints). */
65
+ getOwnActivityCounts() {
66
+ const rows = this.db.prepare(`SELECT role, COUNT(*) as c FROM own_activity GROUP BY role`).all();
67
+ const out = {};
68
+ for (const r of rows) {
69
+ out[r.role] = r.c;
70
+ }
71
+ return out;
72
+ }
73
+ /** Latest own_activity rows by insertion order (approximate). */
74
+ getRecentOwnActivity(limit) {
75
+ const rows = this.db.prepare(`SELECT request_id, role FROM own_activity ORDER BY rowid DESC LIMIT ?`).all(Math.max(0, Math.min(limit, 1000)));
76
+ return rows.map(r => ({ requestId: r.request_id, role: r.role }));
77
+ }
78
+ getLastProcessedBlock() {
79
+ const row = this.db.prepare('SELECT value FROM config WHERE key = ?').get('last_processed_block');
80
+ return row?.value ? BigInt(row.value) : null;
81
+ }
82
+ setLastProcessedBlock(block) {
83
+ this.db.prepare('INSERT OR REPLACE INTO config (key, value) VALUES (?, ?)').run('last_processed_block', block.toString());
84
+ }
85
+ insertArtifact(artifact) {
86
+ this.db.prepare(`
87
+ INSERT OR REPLACE INTO artifacts (id, desired_state_id, request_id, title, content, tags, outcome)
88
+ VALUES (@id, @desiredStateId, @requestId, @title, @content, @tags, @outcome)
89
+ `).run({
90
+ ...artifact,
91
+ tags: JSON.stringify(artifact.tags),
92
+ });
93
+ }
94
+ searchArtifacts(query) {
95
+ const conditions = [];
96
+ const params = {};
97
+ if (query.outcome) {
98
+ conditions.push('outcome = @outcome');
99
+ params['outcome'] = query.outcome;
100
+ }
101
+ if (query.requestId) {
102
+ conditions.push('request_id = @requestId');
103
+ params['requestId'] = query.requestId;
104
+ }
105
+ if (query.desiredStateId) {
106
+ conditions.push('desired_state_id = @desiredStateId');
107
+ params['desiredStateId'] = query.desiredStateId;
108
+ }
109
+ if (query.after) {
110
+ conditions.push('created_at >= @after');
111
+ params['after'] = query.after;
112
+ }
113
+ if (query.before) {
114
+ conditions.push('created_at <= @before');
115
+ params['before'] = query.before;
116
+ }
117
+ if (query.tags && query.tags.length > 0) {
118
+ for (let i = 0; i < query.tags.length; i++) {
119
+ conditions.push(`tags LIKE @tag${i}`);
120
+ params[`tag${i}`] = `%${query.tags[i]}%`;
121
+ }
122
+ }
123
+ const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
124
+ const limit = query.limit ?? 50;
125
+ const rows = this.db.prepare(`SELECT id, title, content, tags, outcome, request_id, desired_state_id, created_at FROM artifacts ${where} ORDER BY created_at DESC LIMIT ${limit}`).all(params);
126
+ return rows.map(row => ({
127
+ ...row,
128
+ tags: JSON.parse(row.tags),
129
+ }));
130
+ }
131
+ insertRemoteArtifact(artifact) {
132
+ this.db.prepare(`
133
+ INSERT OR REPLACE INTO artifacts (id, desired_state_id, request_id, title, tags, outcome, remote, owner_address, endpoint, price)
134
+ VALUES (@id, @desiredStateId, @requestId, @title, @tags, @outcome, 1, @ownerAddress, @endpoint, @price)
135
+ `).run({
136
+ ...artifact,
137
+ tags: JSON.stringify(artifact.tags),
138
+ price: artifact.price ?? null,
139
+ });
140
+ }
141
+ getArtifactContent(id) {
142
+ const row = this.db.prepare('SELECT content FROM artifacts WHERE id = ?').get(id);
143
+ return row?.content ?? null;
144
+ }
145
+ getRemoteArtifactInfo(id) {
146
+ const row = this.db.prepare('SELECT endpoint, owner_address, price FROM artifacts WHERE id = ? AND remote = 1').get(id);
147
+ if (!row)
148
+ return null;
149
+ return {
150
+ endpoint: row.endpoint,
151
+ ownerAddress: row.owner_address,
152
+ price: row.price ?? undefined,
153
+ };
154
+ }
155
+ getArtifactByRequestId(requestId, tag) {
156
+ const row = this.db.prepare(`SELECT id, title, content, tags, outcome FROM artifacts WHERE request_id = ? AND tags LIKE ? ORDER BY created_at DESC LIMIT 1`).get(requestId, `%${tag}%`);
157
+ if (!row)
158
+ return null;
159
+ return { ...row, tags: JSON.parse(row.tags) };
160
+ }
161
+ cacheRemoteContent(id, content) {
162
+ this.db.prepare('UPDATE artifacts SET content = ? WHERE id = ?').run(content, id);
163
+ }
164
+ close() {
165
+ this.db.close();
166
+ }
167
+ }
168
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/store/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Shared retry policy for transient RPC / transaction submission failures.
3
+ */
4
+ import type { Address, Hex, PublicClient, TransactionReceipt } from 'viem';
5
+ export declare const TX_RETRY_DEFAULTS: {
6
+ readonly maxAttempts: 6;
7
+ readonly baseDelayMs: 400;
8
+ readonly maxDelayMs: 12000;
9
+ /** Extra fee bump per retry attempt after the first (basis points, 1500 = +15%) */
10
+ readonly feeBumpBpsPerAttempt: 1500;
11
+ };
12
+ export declare function flattenErrorMessage(error: unknown): string;
13
+ /**
14
+ * True when the failure is often fixed by waiting, refreshing nonce/fees, or switching RPC timing.
15
+ * Intentionally conservative: do not treat insufficient balance or user rejections as recoverable.
16
+ */
17
+ export declare function isRecoverableTransactionError(error: unknown): boolean;
18
+ export declare function sleep(ms: number): Promise<void>;
19
+ export declare function backoffDelay(attemptIndex: number, baseMs: number, maxMs: number): Promise<void>;
20
+ export interface TxRetryOptions {
21
+ maxAttempts?: number;
22
+ baseDelayMs?: number;
23
+ maxDelayMs?: number;
24
+ /** If set, invoked before each retry (attempt >= 1) for logging/metrics */
25
+ onRetry?: (info: {
26
+ attempt: number;
27
+ error: unknown;
28
+ message: string;
29
+ }) => void;
30
+ }
31
+ export declare function withRecoverableRetry<T>(fn: (attemptIndex: number) => Promise<T>, options?: TxRetryOptions): Promise<T>;
32
+ /** EIP-1559 or legacy gas overrides for viem, increasingly aggressive on later attempts. */
33
+ export declare function viemFeeOverridesForAttempt(publicClient: PublicClient, attemptIndex: number): Promise<{
34
+ maxFeePerGas: bigint;
35
+ maxPriorityFeePerGas: bigint;
36
+ } | {
37
+ gasPrice: bigint;
38
+ } | Record<string, never>>;
39
+ export declare function waitForTransactionReceiptWithRetry(publicClient: PublicClient, hash: Hex, options?: TxRetryOptions & {
40
+ pollingInterval?: number;
41
+ confirmations?: number;
42
+ }): Promise<TransactionReceipt>;
43
+ export declare function viemSendTransactionWithRetry(walletClient: {
44
+ sendTransaction: (tx: any) => Promise<Hex>;
45
+ }, publicClient: PublicClient, txRequest: {
46
+ account: any;
47
+ to?: Address;
48
+ data?: Hex;
49
+ value?: bigint;
50
+ gas?: bigint;
51
+ maxFeePerGas?: bigint;
52
+ maxPriorityFeePerGas?: bigint;
53
+ gasPrice?: bigint;
54
+ [key: string]: any;
55
+ }, options?: TxRetryOptions): Promise<Hex>;