@jinn-network/client 0.1.0 → 0.1.1-canary.4a6ed8b2

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 (269) hide show
  1. package/README.md +98 -11
  2. package/deployments/deployment-jinn-testnet-faucet-baseSepolia-fast.json +15 -0
  3. package/dist/adapters/claim-registry/abi.d.ts +127 -0
  4. package/dist/adapters/claim-registry/abi.js +93 -0
  5. package/dist/adapters/claim-registry/abi.js.map +1 -0
  6. package/dist/adapters/claim-registry/client.d.ts +89 -0
  7. package/dist/adapters/claim-registry/client.js +205 -0
  8. package/dist/adapters/claim-registry/client.js.map +1 -0
  9. package/dist/adapters/mech/adapter.d.ts +2 -0
  10. package/dist/adapters/mech/adapter.js +110 -41
  11. package/dist/adapters/mech/adapter.js.map +1 -1
  12. package/dist/adapters/mech/contracts.d.ts +2 -0
  13. package/dist/adapters/mech/contracts.js +32 -7
  14. package/dist/adapters/mech/contracts.js.map +1 -1
  15. package/dist/adapters/mech/ipfs.d.ts +8 -0
  16. package/dist/adapters/mech/ipfs.js +12 -0
  17. package/dist/adapters/mech/ipfs.js.map +1 -1
  18. package/dist/adapters/mech/types.d.ts +20 -46
  19. package/dist/adapters/mech/types.js +16 -35
  20. package/dist/adapters/mech/types.js.map +1 -1
  21. package/dist/api/gather-status.js +11 -0
  22. package/dist/api/gather-status.js.map +1 -1
  23. package/dist/api/portfolio-v0-build.d.ts +81 -0
  24. package/dist/api/portfolio-v0-build.js +141 -0
  25. package/dist/api/portfolio-v0-build.js.map +1 -0
  26. package/dist/api/portfolio-v0-doctor.d.ts +37 -0
  27. package/dist/api/portfolio-v0-doctor.js +123 -0
  28. package/dist/api/portfolio-v0-doctor.js.map +1 -0
  29. package/dist/api/server.js +12 -0
  30. package/dist/api/server.js.map +1 -1
  31. package/dist/api/status-build.d.ts +6 -0
  32. package/dist/api/status-build.js +1 -0
  33. package/dist/api/status-build.js.map +1 -1
  34. package/dist/api/status-rollup-build.d.ts +4 -0
  35. package/dist/api/status-rollup-build.js +4 -0
  36. package/dist/api/status-rollup-build.js.map +1 -1
  37. package/dist/bin/jinn-mcp.d.ts +14 -0
  38. package/dist/bin/jinn-mcp.js +19 -0
  39. package/dist/bin/jinn-mcp.js.map +1 -0
  40. package/dist/build-meta.json +1 -1
  41. package/dist/cli/commands/auth.d.ts +3 -0
  42. package/dist/cli/commands/auth.js +236 -0
  43. package/dist/cli/commands/auth.js.map +1 -0
  44. package/dist/cli/commands/bootstrap.js +1 -0
  45. package/dist/cli/commands/bootstrap.js.map +1 -1
  46. package/dist/cli/commands/doctor.js +148 -15
  47. package/dist/cli/commands/doctor.js.map +1 -1
  48. package/dist/cli/commands/fund-requirements.js +69 -1
  49. package/dist/cli/commands/fund-requirements.js.map +1 -1
  50. package/dist/cli/commands/history.js +1 -0
  51. package/dist/cli/commands/history.js.map +1 -1
  52. package/dist/cli/commands/init.js +31 -7
  53. package/dist/cli/commands/init.js.map +1 -1
  54. package/dist/cli/commands/keys-backup.js +142 -10
  55. package/dist/cli/commands/keys-backup.js.map +1 -1
  56. package/dist/cli/commands/logs.js +28 -13
  57. package/dist/cli/commands/logs.js.map +1 -1
  58. package/dist/cli/commands/plugin-install.d.ts +3 -0
  59. package/dist/cli/commands/plugin-install.js +799 -0
  60. package/dist/cli/commands/plugin-install.js.map +1 -0
  61. package/dist/cli/commands/quickstart.d.ts +3 -0
  62. package/dist/cli/commands/quickstart.js +236 -0
  63. package/dist/cli/commands/quickstart.js.map +1 -0
  64. package/dist/cli/commands/run.js +6 -0
  65. package/dist/cli/commands/run.js.map +1 -1
  66. package/dist/cli/commands/stop.js +1 -0
  67. package/dist/cli/commands/stop.js.map +1 -1
  68. package/dist/cli/commands/submit-intent.js +79 -5
  69. package/dist/cli/commands/submit-intent.js.map +1 -1
  70. package/dist/cli/commands/update.d.ts +3 -0
  71. package/dist/cli/commands/update.js +154 -0
  72. package/dist/cli/commands/update.js.map +1 -0
  73. package/dist/cli/commands/version.js +15 -1
  74. package/dist/cli/commands/version.js.map +1 -1
  75. package/dist/cli/deployment-digest.js +20 -4
  76. package/dist/cli/deployment-digest.js.map +1 -1
  77. package/dist/cli/index.js +8 -0
  78. package/dist/cli/index.js.map +1 -1
  79. package/dist/cli/password.d.ts +15 -0
  80. package/dist/cli/password.js +29 -1
  81. package/dist/cli/password.js.map +1 -1
  82. package/dist/config.d.ts +110 -7
  83. package/dist/config.js +38 -5
  84. package/dist/config.js.map +1 -1
  85. package/dist/daemon/balance-topup-loop.d.ts +40 -0
  86. package/dist/daemon/balance-topup-loop.js +96 -0
  87. package/dist/daemon/balance-topup-loop.js.map +1 -0
  88. package/dist/daemon/daemon.d.ts +37 -0
  89. package/dist/daemon/daemon.js +98 -1
  90. package/dist/daemon/daemon.js.map +1 -1
  91. package/dist/dashboard/index.html +500 -0
  92. package/dist/earning/bootstrap.d.ts +3 -1
  93. package/dist/earning/bootstrap.js +138 -17
  94. package/dist/earning/bootstrap.js.map +1 -1
  95. package/dist/earning/contracts.d.ts +24 -0
  96. package/dist/earning/contracts.js +20 -1
  97. package/dist/earning/contracts.js.map +1 -1
  98. package/dist/earning/faucet.d.ts +15 -0
  99. package/dist/earning/faucet.js +64 -0
  100. package/dist/earning/faucet.js.map +1 -0
  101. package/dist/earning/store.d.ts +5 -0
  102. package/dist/earning/store.js +7 -3
  103. package/dist/earning/store.js.map +1 -1
  104. package/dist/errors/unauthorized-account.d.ts +10 -0
  105. package/dist/errors/unauthorized-account.js +14 -0
  106. package/dist/errors/unauthorized-account.js.map +1 -0
  107. package/dist/main.js +128 -1
  108. package/dist/main.js.map +1 -1
  109. package/dist/mcp/operator-server.d.ts +34 -0
  110. package/dist/mcp/operator-server.js +219 -0
  111. package/dist/mcp/operator-server.js.map +1 -0
  112. package/dist/operator-errors.js +11 -0
  113. package/dist/operator-errors.js.map +1 -1
  114. package/dist/preflight/claude-auth.d.ts +68 -0
  115. package/dist/preflight/claude-auth.js +171 -0
  116. package/dist/preflight/claude-auth.js.map +1 -0
  117. package/dist/restorer/engine/canonical-json.d.ts +18 -0
  118. package/dist/restorer/engine/canonical-json.js +59 -0
  119. package/dist/restorer/engine/canonical-json.js.map +1 -0
  120. package/dist/restorer/engine/claim.d.ts +69 -0
  121. package/dist/restorer/engine/claim.js +104 -0
  122. package/dist/restorer/engine/claim.js.map +1 -0
  123. package/dist/restorer/engine/delivery.d.ts +52 -0
  124. package/dist/restorer/engine/delivery.js +63 -0
  125. package/dist/restorer/engine/delivery.js.map +1 -0
  126. package/dist/restorer/engine/engine.d.ts +203 -0
  127. package/dist/restorer/engine/engine.js +658 -0
  128. package/dist/restorer/engine/engine.js.map +1 -0
  129. package/dist/restorer/engine/manifest-assembly.d.ts +67 -0
  130. package/dist/restorer/engine/manifest-assembly.js +79 -0
  131. package/dist/restorer/engine/manifest-assembly.js.map +1 -0
  132. package/dist/restorer/engine/packaging.d.ts +87 -0
  133. package/dist/restorer/engine/packaging.js +350 -0
  134. package/dist/restorer/engine/packaging.js.map +1 -0
  135. package/dist/restorer/engine/persistence.d.ts +170 -0
  136. package/dist/restorer/engine/persistence.js +381 -0
  137. package/dist/restorer/engine/persistence.js.map +1 -0
  138. package/dist/restorer/engine/recovery.d.ts +22 -0
  139. package/dist/restorer/engine/recovery.js +24 -0
  140. package/dist/restorer/engine/recovery.js.map +1 -0
  141. package/dist/restorer/engine/registry.d.ts +62 -0
  142. package/dist/restorer/engine/registry.js +73 -0
  143. package/dist/restorer/engine/registry.js.map +1 -0
  144. package/dist/restorer/engine/signing.d.ts +30 -0
  145. package/dist/restorer/engine/signing.js +39 -0
  146. package/dist/restorer/engine/signing.js.map +1 -0
  147. package/dist/restorer/engine/state.d.ts +42 -0
  148. package/dist/restorer/engine/state.js +87 -0
  149. package/dist/restorer/engine/state.js.map +1 -0
  150. package/dist/restorer/impls/claude-mcp-hyperliquid/api-wallet.d.ts +64 -0
  151. package/dist/restorer/impls/claude-mcp-hyperliquid/api-wallet.js +96 -0
  152. package/dist/restorer/impls/claude-mcp-hyperliquid/api-wallet.js.map +1 -0
  153. package/dist/restorer/impls/claude-mcp-hyperliquid/index.d.ts +88 -0
  154. package/dist/restorer/impls/claude-mcp-hyperliquid/index.js +560 -0
  155. package/dist/restorer/impls/claude-mcp-hyperliquid/index.js.map +1 -0
  156. package/dist/restorer/impls/claude-mcp-hyperliquid/mcp-tools.d.ts +137 -0
  157. package/dist/restorer/impls/claude-mcp-hyperliquid/mcp-tools.js +865 -0
  158. package/dist/restorer/impls/claude-mcp-hyperliquid/mcp-tools.js.map +1 -0
  159. package/dist/restorer/impls/claude-mcp-hyperliquid/safety-rails.d.ts +74 -0
  160. package/dist/restorer/impls/claude-mcp-hyperliquid/safety-rails.js +74 -0
  161. package/dist/restorer/impls/claude-mcp-hyperliquid/safety-rails.js.map +1 -0
  162. package/dist/restorer/impls/claude-mcp-hyperliquid/session-orchestrator.d.ts +97 -0
  163. package/dist/restorer/impls/claude-mcp-hyperliquid/session-orchestrator.js +226 -0
  164. package/dist/restorer/impls/claude-mcp-hyperliquid/session-orchestrator.js.map +1 -0
  165. package/dist/restorer/impls/legacy-claude/index.d.ts +42 -0
  166. package/dist/restorer/impls/legacy-claude/index.js +60 -0
  167. package/dist/restorer/impls/legacy-claude/index.js.map +1 -0
  168. package/dist/restorer/impls/portfolio-v0-evaluator/canonical-metrics.d.ts +68 -0
  169. package/dist/restorer/impls/portfolio-v0-evaluator/canonical-metrics.js +117 -0
  170. package/dist/restorer/impls/portfolio-v0-evaluator/canonical-metrics.js.map +1 -0
  171. package/dist/restorer/impls/portfolio-v0-evaluator/checks/availability.d.ts +49 -0
  172. package/dist/restorer/impls/portfolio-v0-evaluator/checks/availability.js +91 -0
  173. package/dist/restorer/impls/portfolio-v0-evaluator/checks/availability.js.map +1 -0
  174. package/dist/restorer/impls/portfolio-v0-evaluator/checks/consistency.d.ts +78 -0
  175. package/dist/restorer/impls/portfolio-v0-evaluator/checks/consistency.js +274 -0
  176. package/dist/restorer/impls/portfolio-v0-evaluator/checks/consistency.js.map +1 -0
  177. package/dist/restorer/impls/portfolio-v0-evaluator/checks/eligibility.d.ts +23 -0
  178. package/dist/restorer/impls/portfolio-v0-evaluator/checks/eligibility.js +49 -0
  179. package/dist/restorer/impls/portfolio-v0-evaluator/checks/eligibility.js.map +1 -0
  180. package/dist/restorer/impls/portfolio-v0-evaluator/checks/integrity.d.ts +25 -0
  181. package/dist/restorer/impls/portfolio-v0-evaluator/checks/integrity.js +44 -0
  182. package/dist/restorer/impls/portfolio-v0-evaluator/checks/integrity.js.map +1 -0
  183. package/dist/restorer/impls/portfolio-v0-evaluator/checks/spec.d.ts +17 -0
  184. package/dist/restorer/impls/portfolio-v0-evaluator/checks/spec.js +43 -0
  185. package/dist/restorer/impls/portfolio-v0-evaluator/checks/spec.js.map +1 -0
  186. package/dist/restorer/impls/portfolio-v0-evaluator/index.d.ts +43 -0
  187. package/dist/restorer/impls/portfolio-v0-evaluator/index.js +431 -0
  188. package/dist/restorer/impls/portfolio-v0-evaluator/index.js.map +1 -0
  189. package/dist/restorer/impls/portfolio-v0-evaluator/score.d.ts +21 -0
  190. package/dist/restorer/impls/portfolio-v0-evaluator/score.js +32 -0
  191. package/dist/restorer/impls/portfolio-v0-evaluator/score.js.map +1 -0
  192. package/dist/restorer/impls/portfolio-v0-evaluator/types.d.ts +32 -0
  193. package/dist/restorer/impls/portfolio-v0-evaluator/types.js +8 -0
  194. package/dist/restorer/impls/portfolio-v0-evaluator/types.js.map +1 -0
  195. package/dist/restorer/impls/prediction-v0-baseline/index.d.ts +26 -0
  196. package/dist/restorer/impls/prediction-v0-baseline/index.js +82 -0
  197. package/dist/restorer/impls/prediction-v0-baseline/index.js.map +1 -0
  198. package/dist/restorer/impls/prediction-v0-baseline/strategy.d.ts +8 -0
  199. package/dist/restorer/impls/prediction-v0-baseline/strategy.js +41 -0
  200. package/dist/restorer/impls/prediction-v0-baseline/strategy.js.map +1 -0
  201. package/dist/restorer/impls/prediction-v0-baseline/types.d.ts +7 -0
  202. package/dist/restorer/impls/prediction-v0-baseline/types.js +2 -0
  203. package/dist/restorer/impls/prediction-v0-baseline/types.js.map +1 -0
  204. package/dist/restorer/impls/prediction-v0-evaluator/canonical-metrics.d.ts +20 -0
  205. package/dist/restorer/impls/prediction-v0-evaluator/canonical-metrics.js +66 -0
  206. package/dist/restorer/impls/prediction-v0-evaluator/canonical-metrics.js.map +1 -0
  207. package/dist/restorer/impls/prediction-v0-evaluator/checks/availability.d.ts +9 -0
  208. package/dist/restorer/impls/prediction-v0-evaluator/checks/availability.js +23 -0
  209. package/dist/restorer/impls/prediction-v0-evaluator/checks/availability.js.map +1 -0
  210. package/dist/restorer/impls/prediction-v0-evaluator/checks/eligibility.d.ts +3 -0
  211. package/dist/restorer/impls/prediction-v0-evaluator/checks/eligibility.js +13 -0
  212. package/dist/restorer/impls/prediction-v0-evaluator/checks/eligibility.js.map +1 -0
  213. package/dist/restorer/impls/prediction-v0-evaluator/checks/integrity.d.ts +7 -0
  214. package/dist/restorer/impls/prediction-v0-evaluator/checks/integrity.js +74 -0
  215. package/dist/restorer/impls/prediction-v0-evaluator/checks/integrity.js.map +1 -0
  216. package/dist/restorer/impls/prediction-v0-evaluator/checks/spec.d.ts +5 -0
  217. package/dist/restorer/impls/prediction-v0-evaluator/checks/spec.js +20 -0
  218. package/dist/restorer/impls/prediction-v0-evaluator/checks/spec.js.map +1 -0
  219. package/dist/restorer/impls/prediction-v0-evaluator/index.d.ts +33 -0
  220. package/dist/restorer/impls/prediction-v0-evaluator/index.js +179 -0
  221. package/dist/restorer/impls/prediction-v0-evaluator/index.js.map +1 -0
  222. package/dist/restorer/impls/prediction-v0-evaluator/score.d.ts +8 -0
  223. package/dist/restorer/impls/prediction-v0-evaluator/score.js +15 -0
  224. package/dist/restorer/impls/prediction-v0-evaluator/score.js.map +1 -0
  225. package/dist/restorer/impls/prediction-v0-evaluator/types.d.ts +7 -0
  226. package/dist/restorer/impls/prediction-v0-evaluator/types.js +2 -0
  227. package/dist/restorer/impls/prediction-v0-evaluator/types.js.map +1 -0
  228. package/dist/restorer/types.d.ts +62 -0
  229. package/dist/restorer/types.js +7 -0
  230. package/dist/restorer/types.js.map +1 -0
  231. package/dist/runner/claude.js +15 -0
  232. package/dist/runner/claude.js.map +1 -1
  233. package/dist/store/store.d.ts +3 -1
  234. package/dist/store/store.js +8 -0
  235. package/dist/store/store.js.map +1 -1
  236. package/dist/tx-retry.js +11 -1
  237. package/dist/tx-retry.js.map +1 -1
  238. package/dist/types/desired-state.d.ts +53 -0
  239. package/dist/types/desired-state.js +20 -0
  240. package/dist/types/desired-state.js.map +1 -1
  241. package/dist/types/index.d.ts +3 -1
  242. package/dist/types/index.js +3 -1
  243. package/dist/types/index.js.map +1 -1
  244. package/dist/types/portfolio.d.ts +1000 -0
  245. package/dist/types/portfolio.js +168 -0
  246. package/dist/types/portfolio.js.map +1 -0
  247. package/dist/types/prediction.d.ts +751 -0
  248. package/dist/types/prediction.js +128 -0
  249. package/dist/types/prediction.js.map +1 -0
  250. package/dist/venues/chainlink/client.d.ts +99 -0
  251. package/dist/venues/chainlink/client.js +130 -0
  252. package/dist/venues/chainlink/client.js.map +1 -0
  253. package/dist/venues/chainlink/feeds.d.ts +8 -0
  254. package/dist/venues/chainlink/feeds.js +9 -0
  255. package/dist/venues/chainlink/feeds.js.map +1 -0
  256. package/dist/venues/hyperliquid/account-value.d.ts +30 -0
  257. package/dist/venues/hyperliquid/account-value.js +30 -0
  258. package/dist/venues/hyperliquid/account-value.js.map +1 -0
  259. package/dist/venues/hyperliquid/client.d.ts +63 -0
  260. package/dist/venues/hyperliquid/client.js +135 -0
  261. package/dist/venues/hyperliquid/client.js.map +1 -0
  262. package/dist/venues/hyperliquid/grid.d.ts +36 -0
  263. package/dist/venues/hyperliquid/grid.js +61 -0
  264. package/dist/venues/hyperliquid/grid.js.map +1 -0
  265. package/dist/venues/hyperliquid/types.d.ts +81 -0
  266. package/dist/venues/hyperliquid/types.js +8 -0
  267. package/dist/venues/hyperliquid/types.js.map +1 -0
  268. package/package.json +18 -3
  269. package/skills/jinn-operator/SKILL.md +213 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operator-server.js","sourceRoot":"","sources":["../../src/mcp/operator-server.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@
2
2
  * User-facing error formatting for operators.
3
3
  * Full stack traces and raw RPC errors are reserved for JINN_DEBUG mode.
4
4
  */
5
+ import { isUnauthorizedAccountError } from './errors/unauthorized-account.js';
5
6
  function envDebugTruthy(value) {
6
7
  if (value === undefined)
7
8
  return false;
@@ -51,6 +52,16 @@ function stringifyUnknown(error) {
51
52
  export function formatBootstrapOperatorMessage(error) {
52
53
  const msg = stringifyUnknown(error);
53
54
  const lower = msg.toLowerCase();
55
+ if (isUnauthorizedAccountError(msg) || msg.includes('curating-agent whitelist')) {
56
+ // Surfaces from `recoverEvictedService` when distributor.reStake reverts
57
+ // because the operator is not in mapCuratingAgents / mapManagingAgents on
58
+ // the stOLAS ExternalStakingDistributor. Keep the full actionable message
59
+ // so `setCuratingAgents` guidance isn't truncated by the 220-char cap.
60
+ return {
61
+ summary: msg.split('reStake revert:')[0]?.trim() ?? msg,
62
+ hint: 'The evicted service cannot self-heal without the distributor owner pre-authorising this operator. See the summary for the setCuratingAgents call, or abandon-and-rebootstrap.',
63
+ };
64
+ }
54
65
  if (msg.includes('GS013')) {
55
66
  return {
56
67
  summary: 'Gnosis Safe could not execute or estimate this transaction (GS013: inner call may have reverted or gas estimation failed).',
@@ -1 +1 @@
1
- {"version":3,"file":"operator-errors.js","sourceRoot":"","sources":["../src/operator-errors.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"operator-errors.js","sourceRoot":"","sources":["../src/operator-errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Preflight: detect Claude auth context and probe authentication status.
3
+ *
4
+ * Three contexts are recognised:
5
+ * - 'container' — running inside a Docker container (/.dockerenv exists)
6
+ * - 'docker-compose' — a docker-compose.yml with a jinn-daemon service lives in cwd
7
+ * - 'bare' — plain host environment (default)
8
+ *
9
+ * Priority:
10
+ * 1. JINN_RUNTIME_MODE env var (authoritative; CI/scripted operators)
11
+ * 2. `runtimeMode` field in the resolved config (persisted by `jinn auth`)
12
+ * 3. Filesystem heuristic (container → docker-compose → bare) as a last resort
13
+ *
14
+ * The filesystem path is a LAST RESORT because running from the `client/`
15
+ * checkout dir misdetects as docker-compose (the package's own compose file
16
+ * names `jinn-daemon`). Operators should set `runtimeMode` at `jinn auth`.
17
+ */
18
+ export type AuthContext = 'container' | 'docker-compose' | 'bare';
19
+ export interface DetectContextOptions {
20
+ cwd: string;
21
+ /** Optional explicit mode, typically from `config.runtimeMode`. Highest priority. */
22
+ configuredMode?: AuthContext;
23
+ /** Optional env (default: process.env). Tests can inject a stub. */
24
+ env?: NodeJS.ProcessEnv;
25
+ /** Override the /.dockerenv existence check (for testing). */
26
+ dockerenvExists?: boolean;
27
+ /** Override the docker-compose.yml jinn-daemon check (for testing). */
28
+ composeServiceExists?: boolean;
29
+ }
30
+ export interface SpawnResult {
31
+ status: number | null;
32
+ stdout: string;
33
+ stderr: string;
34
+ }
35
+ export interface AuthProbeResult {
36
+ authenticated: boolean;
37
+ context: AuthContext;
38
+ detail: string;
39
+ email?: string;
40
+ }
41
+ export interface ProbeOptions {
42
+ context: AuthContext;
43
+ cwd: string;
44
+ /** Inject a pre-computed spawn result (for testing). */
45
+ spawnResult?: SpawnResult;
46
+ }
47
+ export interface LoginResult {
48
+ success: boolean;
49
+ detail: string;
50
+ }
51
+ /**
52
+ * Determine which environment Claude is running in.
53
+ * When `dockerenvExists` / `composeServiceExists` are omitted the function
54
+ * inspects the filesystem directly.
55
+ */
56
+ export declare function detectAuthContext(opts: DetectContextOptions): AuthContext;
57
+ /**
58
+ * Probe whether `claude` is authenticated in the given context.
59
+ * When `spawnResult` is provided (testing) no subprocess is created.
60
+ */
61
+ export declare function probeClaudeAuth(opts: ProbeOptions): AuthProbeResult;
62
+ /**
63
+ * Return the command + args needed to interactively log in to Claude.
64
+ */
65
+ export declare function buildLoginCommand(context: AuthContext, cwd: string): {
66
+ command: string;
67
+ args: string[];
68
+ };
@@ -0,0 +1,171 @@
1
+ /**
2
+ * Preflight: detect Claude auth context and probe authentication status.
3
+ *
4
+ * Three contexts are recognised:
5
+ * - 'container' — running inside a Docker container (/.dockerenv exists)
6
+ * - 'docker-compose' — a docker-compose.yml with a jinn-daemon service lives in cwd
7
+ * - 'bare' — plain host environment (default)
8
+ *
9
+ * Priority:
10
+ * 1. JINN_RUNTIME_MODE env var (authoritative; CI/scripted operators)
11
+ * 2. `runtimeMode` field in the resolved config (persisted by `jinn auth`)
12
+ * 3. Filesystem heuristic (container → docker-compose → bare) as a last resort
13
+ *
14
+ * The filesystem path is a LAST RESORT because running from the `client/`
15
+ * checkout dir misdetects as docker-compose (the package's own compose file
16
+ * names `jinn-daemon`). Operators should set `runtimeMode` at `jinn auth`.
17
+ */
18
+ import { existsSync, readFileSync } from 'node:fs';
19
+ import { spawnSync } from 'node:child_process';
20
+ import { join } from 'node:path';
21
+ // ---------------------------------------------------------------------------
22
+ // detectAuthContext
23
+ // ---------------------------------------------------------------------------
24
+ /**
25
+ * Determine which environment Claude is running in.
26
+ * When `dockerenvExists` / `composeServiceExists` are omitted the function
27
+ * inspects the filesystem directly.
28
+ */
29
+ export function detectAuthContext(opts) {
30
+ const { cwd } = opts;
31
+ const env = opts.env ?? process.env;
32
+ // 1. JINN_RUNTIME_MODE env var (CI / scripted operators).
33
+ const envMode = env['JINN_RUNTIME_MODE'];
34
+ if (envMode === 'bare' || envMode === 'docker-compose' || envMode === 'container') {
35
+ return envMode;
36
+ }
37
+ // 2. Explicit config (persisted by `jinn auth`).
38
+ if (opts.configuredMode) {
39
+ return opts.configuredMode;
40
+ }
41
+ // 3. Filesystem heuristic — last resort. Flawed inside the client/ checkout dir
42
+ // because the package's own docker-compose.yml names jinn-daemon. Prefer
43
+ // setting runtimeMode explicitly.
44
+ const inContainer = opts.dockerenvExists !== undefined
45
+ ? opts.dockerenvExists
46
+ : existsSync('/.dockerenv');
47
+ if (inContainer)
48
+ return 'container';
49
+ const hasComposeService = opts.composeServiceExists !== undefined
50
+ ? opts.composeServiceExists
51
+ : _composeHasJinnDaemon(cwd);
52
+ if (hasComposeService)
53
+ return 'docker-compose';
54
+ return 'bare';
55
+ }
56
+ function _composeHasJinnDaemon(cwd) {
57
+ const composePath = join(cwd, 'docker-compose.yml');
58
+ if (!existsSync(composePath))
59
+ return false;
60
+ try {
61
+ const content = readFileSync(composePath, 'utf8');
62
+ return content.includes('jinn-daemon');
63
+ }
64
+ catch {
65
+ return false;
66
+ }
67
+ }
68
+ // ---------------------------------------------------------------------------
69
+ // probeClaudeAuth
70
+ // ---------------------------------------------------------------------------
71
+ /**
72
+ * Probe whether `claude` is authenticated in the given context.
73
+ * When `spawnResult` is provided (testing) no subprocess is created.
74
+ */
75
+ export function probeClaudeAuth(opts) {
76
+ const { context, cwd } = opts;
77
+ const sr = opts.spawnResult ?? _spawnAuthStatus(context, cwd);
78
+ if (sr.status !== 0) {
79
+ return {
80
+ authenticated: false,
81
+ context,
82
+ detail: sr.stderr || 'claude auth status exited with non-zero status',
83
+ };
84
+ }
85
+ let parsed;
86
+ try {
87
+ parsed = JSON.parse(sr.stdout);
88
+ }
89
+ catch {
90
+ return {
91
+ authenticated: false,
92
+ context,
93
+ detail: 'claude auth status output is not valid JSON',
94
+ };
95
+ }
96
+ if (parsed === null ||
97
+ typeof parsed !== 'object' ||
98
+ !('loggedIn' in parsed) ||
99
+ parsed.loggedIn !== true) {
100
+ return { authenticated: false, context, detail: 'not logged in' };
101
+ }
102
+ const email = typeof parsed.email === 'string'
103
+ ? parsed.email
104
+ : undefined;
105
+ return {
106
+ authenticated: true,
107
+ context,
108
+ detail: email ? `logged in as ${email}` : 'logged in',
109
+ email,
110
+ };
111
+ }
112
+ function _spawnAuthStatus(context, cwd) {
113
+ let command;
114
+ let args;
115
+ if (context === 'docker-compose') {
116
+ command = 'docker';
117
+ args = [
118
+ 'compose',
119
+ '-f',
120
+ join(cwd, 'docker-compose.yml'),
121
+ 'run',
122
+ '--rm',
123
+ '-T',
124
+ '--no-deps',
125
+ '--entrypoint',
126
+ 'claude',
127
+ 'jinn-daemon',
128
+ 'auth',
129
+ 'status',
130
+ ];
131
+ }
132
+ else {
133
+ command = 'claude';
134
+ args = ['auth', 'status'];
135
+ }
136
+ const result = spawnSync(command, args, { encoding: 'utf8' });
137
+ return {
138
+ status: result.status,
139
+ stdout: result.stdout ?? '',
140
+ stderr: result.stderr ?? '',
141
+ };
142
+ }
143
+ // ---------------------------------------------------------------------------
144
+ // buildLoginCommand
145
+ // ---------------------------------------------------------------------------
146
+ /**
147
+ * Return the command + args needed to interactively log in to Claude.
148
+ */
149
+ export function buildLoginCommand(context, cwd) {
150
+ if (context === 'docker-compose') {
151
+ return {
152
+ command: 'docker',
153
+ args: [
154
+ 'compose',
155
+ '-f',
156
+ join(cwd, 'docker-compose.yml'),
157
+ 'run',
158
+ '--rm',
159
+ '-it',
160
+ '--no-deps',
161
+ '--entrypoint',
162
+ 'claude',
163
+ 'jinn-daemon',
164
+ 'auth',
165
+ 'login',
166
+ ],
167
+ };
168
+ }
169
+ return { command: 'claude', args: ['auth', 'login'] };
170
+ }
171
+ //# sourceMappingURL=claude-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-auth.js","sourceRoot":"","sources":["../../src/preflight/claude-auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Canonical JSON serialisation — sorted keys, no whitespace.
3
+ *
4
+ * Used for manifest signing: produce a deterministic byte string that two
5
+ * independent parties can reproduce from the same object graph.
6
+ *
7
+ * Rules:
8
+ * - Object keys are sorted lexicographically (UTF-16 code-unit order, same as
9
+ * Array.prototype.sort() on strings — matches JSON.stringify key insertion
10
+ * order when we control insertion).
11
+ * - Arrays preserve element order.
12
+ * - Numbers: JS default toString (no special formatting).
13
+ * - null, boolean, string: standard JSON encoding.
14
+ * - undefined values in objects are dropped (same as JSON.stringify).
15
+ * - NaN and Infinity are not valid JSON; this function will produce "null" for
16
+ * those values, matching JSON.stringify behaviour.
17
+ */
18
+ export declare function canonicalJson(value: unknown): string;
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Canonical JSON serialisation — sorted keys, no whitespace.
3
+ *
4
+ * Used for manifest signing: produce a deterministic byte string that two
5
+ * independent parties can reproduce from the same object graph.
6
+ *
7
+ * Rules:
8
+ * - Object keys are sorted lexicographically (UTF-16 code-unit order, same as
9
+ * Array.prototype.sort() on strings — matches JSON.stringify key insertion
10
+ * order when we control insertion).
11
+ * - Arrays preserve element order.
12
+ * - Numbers: JS default toString (no special formatting).
13
+ * - null, boolean, string: standard JSON encoding.
14
+ * - undefined values in objects are dropped (same as JSON.stringify).
15
+ * - NaN and Infinity are not valid JSON; this function will produce "null" for
16
+ * those values, matching JSON.stringify behaviour.
17
+ */
18
+ export function canonicalJson(value) {
19
+ if (value === null)
20
+ return 'null';
21
+ if (value === undefined)
22
+ return 'null';
23
+ if (typeof value === 'boolean')
24
+ return value ? 'true' : 'false';
25
+ if (typeof value === 'number') {
26
+ // NaN / Infinity → null, matching JSON.stringify
27
+ if (!isFinite(value))
28
+ return 'null';
29
+ return String(value);
30
+ }
31
+ if (typeof value === 'string')
32
+ return JSON.stringify(value);
33
+ if (Array.isArray(value)) {
34
+ const items = value.map((v) => canonicalJson(v)).join(',');
35
+ return `[${items}]`;
36
+ }
37
+ if (typeof value === 'object') {
38
+ const obj = value;
39
+ const pairs = Object.keys(obj)
40
+ .sort()
41
+ .flatMap((key) => {
42
+ const v = obj[key];
43
+ if (v === undefined)
44
+ return []; // drop undefined (matches JSON.stringify)
45
+ return [`${JSON.stringify(key)}:${canonicalJson(v)}`];
46
+ });
47
+ return `{${pairs.join(',')}}`;
48
+ }
49
+ // Bigint: emit raw decimal digits WITHOUT quotes, matching RFC 8785 and other
50
+ // canonical-JSON libs. JSON.stringify would throw; converting through String()
51
+ // would produce a quoted "12345" instead of the unquoted integer 12345.
52
+ // We do NOT convert through Number() because bigints can exceed JS number precision.
53
+ if (typeof value === 'bigint')
54
+ return value.toString();
55
+ // Fallback: other exotic types — JSON.stringify would throw;
56
+ // we convert to string to avoid hard failures.
57
+ return JSON.stringify(String(value));
58
+ }
59
+ //# sourceMappingURL=canonical-json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonical-json.js","sourceRoot":"","sources":["../../../src/restorer/engine/canonical-json.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IAClC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IACvC,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IAChE,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,iDAAiD;QACjD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,MAAM,CAAC;QACpC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC5D,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3D,OAAO,IAAI,KAAK,GAAG,CAAC;IACtB,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,KAAgC,CAAC;QAC7C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;aAC3B,IAAI,EAAE;aACN,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACf,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;YACnB,IAAI,CAAC,KAAK,SAAS;gBAAE,OAAO,EAAE,CAAC,CAAC,0CAA0C;YAC1E,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QACL,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IAChC,CAAC;IACD,8EAA8E;IAC9E,+EAA+E;IAC/E,wEAAwE;IACxE,qFAAqF;IACrF,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;IACvD,6DAA6D;IAC7D,+CAA+C;IAC/C,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AACvC,CAAC"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Two-layer claim orchestration for the restorer engine.
3
+ *
4
+ * §6.1, §9.1, §9.2 of spec/2026-04-17-portfolio-v0-design.md
5
+ *
6
+ * Layer 1: ClaimRegistry claim — Jinn's work-coordination contract.
7
+ * Layer 2: Marketplace priority claim — calls MechAdapter.claimRequest() to
8
+ * register the priority-mech exclusivity window (300 s responseTimeout).
9
+ *
10
+ * The ClaimRegistry claimTTL is owner-configured per-deployment and is not
11
+ * passed by the client.
12
+ *
13
+ * Recovery:
14
+ * On resume, ClaimRegistryClient.weAlreadyClaimed() is checked before any
15
+ * on-chain write. If we already hold the claim, the ClaimRegistry step is
16
+ * skipped entirely. The marketplace claim is re-attempted because it is
17
+ * stateless from the engine's perspective (MechAdapter is idempotent there).
18
+ *
19
+ * Failure modes:
20
+ * - ClaimRegistry claim fails → throw, no marketplace call, engine marks FAILED.
21
+ * - Marketplace claim fails → release ClaimRegistry claim, throw.
22
+ */
23
+ import type { ClaimRegistryClient } from '../../adapters/claim-registry/client.js';
24
+ /**
25
+ * Minimal interface for the marketplace adapter's claim path.
26
+ * The full MechAdapter satisfies this; tests can inject a stub.
27
+ */
28
+ export interface MarketplaceClaimer {
29
+ claimRequest(requestId: string): Promise<void>;
30
+ }
31
+ /**
32
+ * Parameters describing a single intent's timing window.
33
+ * Extracted from PersistedIntent for testability (no DB dependency).
34
+ */
35
+ export interface ClaimWindow {
36
+ requestId: string;
37
+ /** Window start timestamp in ms (epoch). Used for graceful release decision. */
38
+ windowStartTs: number;
39
+ }
40
+ /** Result of a successful two-layer claim. */
41
+ export interface ClaimResult {
42
+ /** True if the ClaimRegistry claim was freshly placed (false = pre-existing). */
43
+ registryClaimWasFresh: boolean;
44
+ }
45
+ /**
46
+ * Execute the two-layer claim for a single intent.
47
+ *
48
+ * // Claim ordering: ClaimRegistry FIRST (cheap coordination lock), marketplace SECOND.
49
+ * // Spec §6.1 lists them in opposite order but doesn't enforce sequencing — registry-first
50
+ * // is preferred because: (a) ClaimRegistry revert is fast and signals "another restorer
51
+ * // is on it" cleanly; (b) marketplace claim is more expensive (Safe tx + actual gas);
52
+ * // (c) we release ClaimRegistry on marketplace failure to avoid leaking a stale claim.
53
+ *
54
+ * @param claimWindow - Timing data for the intent (requestId, windowStartTs).
55
+ * @param registryClient - ClaimRegistryClient for the deployed ClaimRegistry contract.
56
+ * @param marketplaceClaimer - Adapter whose claimRequest() performs the marketplace claim.
57
+ * @returns ClaimResult on success.
58
+ * @throws If either layer cannot be claimed (after graceful cleanup).
59
+ */
60
+ export declare function executeTwoLayerClaim(claimWindow: ClaimWindow, registryClient: ClaimRegistryClient, marketplaceClaimer: MarketplaceClaimer): Promise<ClaimResult>;
61
+ /**
62
+ * Release the ClaimRegistry claim for an intent that was CLAIMED but whose
63
+ * work window has not yet started (windowStartTs not reached).
64
+ *
65
+ * Used during graceful engine shutdown. No-op if we don't hold the claim.
66
+ *
67
+ * @returns true if the claim was released, false if there was nothing to release.
68
+ */
69
+ export declare function releaseClaimedNotStarted(claimWindow: ClaimWindow, registryClient: ClaimRegistryClient): Promise<boolean>;
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Two-layer claim orchestration for the restorer engine.
3
+ *
4
+ * §6.1, §9.1, §9.2 of spec/2026-04-17-portfolio-v0-design.md
5
+ *
6
+ * Layer 1: ClaimRegistry claim — Jinn's work-coordination contract.
7
+ * Layer 2: Marketplace priority claim — calls MechAdapter.claimRequest() to
8
+ * register the priority-mech exclusivity window (300 s responseTimeout).
9
+ *
10
+ * The ClaimRegistry claimTTL is owner-configured per-deployment and is not
11
+ * passed by the client.
12
+ *
13
+ * Recovery:
14
+ * On resume, ClaimRegistryClient.weAlreadyClaimed() is checked before any
15
+ * on-chain write. If we already hold the claim, the ClaimRegistry step is
16
+ * skipped entirely. The marketplace claim is re-attempted because it is
17
+ * stateless from the engine's perspective (MechAdapter is idempotent there).
18
+ *
19
+ * Failure modes:
20
+ * - ClaimRegistry claim fails → throw, no marketplace call, engine marks FAILED.
21
+ * - Marketplace claim fails → release ClaimRegistry claim, throw.
22
+ */
23
+ // ── Two-layer claim ───────────────────────────────────────────────────────────
24
+ /**
25
+ * Execute the two-layer claim for a single intent.
26
+ *
27
+ * // Claim ordering: ClaimRegistry FIRST (cheap coordination lock), marketplace SECOND.
28
+ * // Spec §6.1 lists them in opposite order but doesn't enforce sequencing — registry-first
29
+ * // is preferred because: (a) ClaimRegistry revert is fast and signals "another restorer
30
+ * // is on it" cleanly; (b) marketplace claim is more expensive (Safe tx + actual gas);
31
+ * // (c) we release ClaimRegistry on marketplace failure to avoid leaking a stale claim.
32
+ *
33
+ * @param claimWindow - Timing data for the intent (requestId, windowStartTs).
34
+ * @param registryClient - ClaimRegistryClient for the deployed ClaimRegistry contract.
35
+ * @param marketplaceClaimer - Adapter whose claimRequest() performs the marketplace claim.
36
+ * @returns ClaimResult on success.
37
+ * @throws If either layer cannot be claimed (after graceful cleanup).
38
+ */
39
+ export async function executeTwoLayerClaim(claimWindow, registryClient, marketplaceClaimer) {
40
+ const requestIdHex = claimWindow.requestId;
41
+ // ── Layer 1: ClaimRegistry ────────────────────────────────────────────────
42
+ // Idempotency check: if we already hold the claim, skip the on-chain write.
43
+ const alreadyClaimed = await registryClient.weAlreadyClaimed(requestIdHex);
44
+ let registryClaimWasFresh = false;
45
+ if (!alreadyClaimed) {
46
+ const result = await registryClient.claimJob(requestIdHex);
47
+ if (!result.claimed) {
48
+ throw new Error(`[claim-orchestration] ClaimRegistry claim failed for ${claimWindow.requestId} — another operator may hold the claim`);
49
+ }
50
+ registryClaimWasFresh = true;
51
+ }
52
+ else {
53
+ console.log(`[claim-orchestration] ClaimRegistry: pre-existing claim found for ${claimWindow.requestId}, skipping re-claim`);
54
+ }
55
+ // ── Layer 2: Marketplace ──────────────────────────────────────────────────
56
+ try {
57
+ await marketplaceClaimer.claimRequest(claimWindow.requestId);
58
+ }
59
+ catch (marketplaceErr) {
60
+ // Marketplace claim failed — release the ClaimRegistry claim we just placed
61
+ // (only if we placed it fresh; pre-existing claims are not ours to release here)
62
+ // TODO(v0 trade-off): on the resume path (weAlreadyClaimed = true, registryClaimWasFresh = false)
63
+ // we do NOT release the ClaimRegistry claim here. Releasing on a transient marketplace failure
64
+ // would forfeit our coordination lock and let a competing restorer take it. The downside is that
65
+ // on a *persistent* failure the claim sits locked until TTL expiry (owner-configured per-deployment).
66
+ // Distinguishing transient vs. permanent failures is non-trivial; for v0 we accept the TTL wait.
67
+ // Future: inspect the marketplace error type and release only on permanent failures.
68
+ if (registryClaimWasFresh) {
69
+ try {
70
+ await registryClient.releaseClaim(requestIdHex);
71
+ console.log(`[claim-orchestration] released ClaimRegistry claim for ${claimWindow.requestId} after marketplace failure`);
72
+ }
73
+ catch (releaseErr) {
74
+ const releaseMsg = releaseErr instanceof Error ? releaseErr.message : String(releaseErr);
75
+ console.error(`[claim-orchestration] failed to release ClaimRegistry claim for ${claimWindow.requestId} after marketplace failure: ${releaseMsg}`);
76
+ }
77
+ }
78
+ throw marketplaceErr;
79
+ }
80
+ return { registryClaimWasFresh };
81
+ }
82
+ // ── Graceful release ──────────────────────────────────────────────────────────
83
+ /**
84
+ * Release the ClaimRegistry claim for an intent that was CLAIMED but whose
85
+ * work window has not yet started (windowStartTs not reached).
86
+ *
87
+ * Used during graceful engine shutdown. No-op if we don't hold the claim.
88
+ *
89
+ * @returns true if the claim was released, false if there was nothing to release.
90
+ */
91
+ export async function releaseClaimedNotStarted(claimWindow, registryClient) {
92
+ const requestIdHex = claimWindow.requestId;
93
+ // Only release if the work window hasn't started yet
94
+ if (Date.now() >= claimWindow.windowStartTs) {
95
+ console.log(`[claim-orchestration] NOT releasing claim for ${claimWindow.requestId} — window already started`);
96
+ return false;
97
+ }
98
+ const released = await registryClient.releaseClaim(requestIdHex);
99
+ if (released) {
100
+ console.log(`[claim-orchestration] released ClaimRegistry claim for ${claimWindow.requestId} (graceful shutdown, before window start)`);
101
+ }
102
+ return released;
103
+ }
104
+ //# sourceMappingURL=claim.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claim.js","sourceRoot":"","sources":["../../../src/restorer/engine/claim.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AA+BH,iFAAiF;AAEjF;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,WAAwB,EACxB,cAAmC,EACnC,kBAAsC;IAEtC,MAAM,YAAY,GAAG,WAAW,CAAC,SAAgB,CAAC;IAElD,6EAA6E;IAE7E,4EAA4E;IAC5E,MAAM,cAAc,GAAG,MAAM,cAAc,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAC3E,IAAI,qBAAqB,GAAG,KAAK,CAAC;IAElC,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAC3D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CACb,wDAAwD,WAAW,CAAC,SAAS,wCAAwC,CACtH,CAAC;QACJ,CAAC;QACD,qBAAqB,GAAG,IAAI,CAAC;IAC/B,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CACT,qEAAqE,WAAW,CAAC,SAAS,qBAAqB,CAChH,CAAC;IACJ,CAAC;IAED,6EAA6E;IAE7E,IAAI,CAAC;QACH,MAAM,kBAAkB,CAAC,YAAY,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,cAAc,EAAE,CAAC;QACxB,4EAA4E;QAC5E,iFAAiF;QACjF,kGAAkG;QAClG,gGAAgG;QAChG,kGAAkG;QAClG,sGAAsG;QACtG,iGAAiG;QACjG,qFAAqF;QACrF,IAAI,qBAAqB,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACH,MAAM,cAAc,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;gBAChD,OAAO,CAAC,GAAG,CACT,0DAA0D,WAAW,CAAC,SAAS,4BAA4B,CAC5G,CAAC;YACJ,CAAC;YAAC,OAAO,UAAU,EAAE,CAAC;gBACpB,MAAM,UAAU,GAAG,UAAU,YAAY,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;gBACzF,OAAO,CAAC,KAAK,CACX,mEAAmE,WAAW,CAAC,SAAS,+BAA+B,UAAU,EAAE,CACpI,CAAC;YACJ,CAAC;QACH,CAAC;QACD,MAAM,cAAc,CAAC;IACvB,CAAC;IAED,OAAO,EAAE,qBAAqB,EAAE,CAAC;AACnC,CAAC;AAED,iFAAiF;AAEjF;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,WAAwB,EACxB,cAAmC;IAEnC,MAAM,YAAY,GAAG,WAAW,CAAC,SAAgB,CAAC;IAElD,qDAAqD;IACrD,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,WAAW,CAAC,aAAa,EAAE,CAAC;QAC5C,OAAO,CAAC,GAAG,CACT,iDAAiD,WAAW,CAAC,SAAS,2BAA2B,CAClG,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;IACjE,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CACT,0DAA0D,WAAW,CAAC,SAAS,2CAA2C,CAC3H,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Restorer engine — mech delivery + JinnRouter.claimDelivery.
3
+ *
4
+ * §6.1 DELIVERING phase.
5
+ *
6
+ * Steps:
7
+ * 1. Encode manifest CID as bytes32 digest (cidToDigestHex).
8
+ * 2. Call mech.deliverToMarketplace(requestId, deliveryDigest) via the Safe.
9
+ * 3. Call JinnRouter.claimDelivery(requestId, evidenceHash) where evidenceHash
10
+ * is the keccak256 hash of the signed manifest (from manifest assembly).
11
+ */
12
+ import type { Hex, PublicClient, WalletClient, Address } from 'viem';
13
+ export interface DeliveryDeps {
14
+ publicClient: PublicClient;
15
+ walletClient: WalletClient;
16
+ safeAddress: Address;
17
+ mechContractAddress: Address;
18
+ routerAddress: Address;
19
+ /** v1 or v2 claimDelivery encoding — matches chain config */
20
+ claimDeliveryVariant: 'v1' | 'v2';
21
+ }
22
+ /**
23
+ * Callback invoked after deliverToMarketplace lands on-chain but BEFORE
24
+ * claimDelivery is called. Callers use this to durably persist the tx hash so
25
+ * that a crash between the two steps can be recovered without re-submitting the
26
+ * deliver transaction.
27
+ */
28
+ export type OnDeliveryTxLanded = (deliveryTxHash: Hex) => void | Promise<void>;
29
+ export interface DeliveryResult {
30
+ deliveryTxHash: Hex;
31
+ claimTxHash: Hex;
32
+ }
33
+ /**
34
+ * Deliver the manifest to the marketplace and claim the delivery on JinnRouter.
35
+ *
36
+ * Crash-recovery safe: if `preExistingDeliveryTxHash` is provided, the
37
+ * deliverToMarketplace step is skipped entirely — the function resumes from
38
+ * the claimDelivery step only. This handles the case where the process crashed
39
+ * after deliver landed on-chain but before the COMPLETE transition was persisted.
40
+ *
41
+ * @param requestId The on-chain request ID (bytes32 hex).
42
+ * @param manifestCid IPFS CID of the signed manifest.
43
+ * @param evidenceHash keccak256 hash of the canonical manifest JSON
44
+ * (from manifest assembly) — used as evidenceHash in claimDelivery V2.
45
+ * @param deps Viem clients + contract addresses.
46
+ * @param preExistingDeliveryTxHash If set, skip deliverToMarketplace and use
47
+ * this as the deliveryTxHash in the result.
48
+ * @param onDeliveryTxLanded Optional callback invoked after
49
+ * deliverToMarketplace succeeds, before claimDelivery. Use this to persist the
50
+ * tx hash so recovery can skip the deliver step on restart.
51
+ */
52
+ export declare function deliverAndClaim(requestId: Hex, manifestCid: string, evidenceHash: Hex, deps: DeliveryDeps, preExistingDeliveryTxHash?: Hex, onDeliveryTxLanded?: OnDeliveryTxLanded): Promise<DeliveryResult>;