@jinn-network/client 0.1.2-canary.d6e72dfd → 0.1.2

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 (218) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/README.md +3 -0
  3. package/dist/adapters/adapter.d.ts +7 -0
  4. package/dist/adapters/mech/adapter.d.ts +4 -0
  5. package/dist/adapters/mech/adapter.js +140 -19
  6. package/dist/adapters/mech/adapter.js.map +1 -1
  7. package/dist/adapters/mech/contracts.d.ts +17 -1
  8. package/dist/adapters/mech/contracts.js +55 -1
  9. package/dist/adapters/mech/contracts.js.map +1 -1
  10. package/dist/adapters/mech/ipfs.d.ts +30 -5
  11. package/dist/adapters/mech/ipfs.js +162 -17
  12. package/dist/adapters/mech/ipfs.js.map +1 -1
  13. package/dist/adapters/mech/safe.js +8 -6
  14. package/dist/adapters/mech/safe.js.map +1 -1
  15. package/dist/adapters/mech/types.d.ts +2 -0
  16. package/dist/adapters/mech/types.js.map +1 -1
  17. package/dist/api/balance-build.js +3 -3
  18. package/dist/api/balance-build.js.map +1 -1
  19. package/dist/api/fleet-build.js +35 -40
  20. package/dist/api/fleet-build.js.map +1 -1
  21. package/dist/api/gather-status.d.ts +5 -0
  22. package/dist/api/gather-status.js +158 -7
  23. package/dist/api/gather-status.js.map +1 -1
  24. package/dist/api/history-build.d.ts +5 -1
  25. package/dist/api/history-build.js +51 -26
  26. package/dist/api/history-build.js.map +1 -1
  27. package/dist/api/portfolio-v0-build.d.ts +3 -1
  28. package/dist/api/portfolio-v0-build.js +12 -10
  29. package/dist/api/portfolio-v0-build.js.map +1 -1
  30. package/dist/api/rewards-build.js +29 -13
  31. package/dist/api/rewards-build.js.map +1 -1
  32. package/dist/api/status-build.d.ts +32 -6
  33. package/dist/api/status-build.js +2 -1
  34. package/dist/api/status-build.js.map +1 -1
  35. package/dist/api/status-rollup-build.d.ts +2 -0
  36. package/dist/api/status-rollup-build.js +30 -3
  37. package/dist/api/status-rollup-build.js.map +1 -1
  38. package/dist/build-meta.json +1 -1
  39. package/dist/cli/commands/auth.js +27 -5
  40. package/dist/cli/commands/auth.js.map +1 -1
  41. package/dist/cli/commands/balance.js +8 -1
  42. package/dist/cli/commands/balance.js.map +1 -1
  43. package/dist/cli/commands/bootstrap.js +22 -0
  44. package/dist/cli/commands/bootstrap.js.map +1 -1
  45. package/dist/cli/commands/doctor.js +33 -3
  46. package/dist/cli/commands/doctor.js.map +1 -1
  47. package/dist/cli/commands/fleet.js +10 -1
  48. package/dist/cli/commands/fleet.js.map +1 -1
  49. package/dist/cli/commands/history.js +25 -6
  50. package/dist/cli/commands/history.js.map +1 -1
  51. package/dist/cli/commands/logs.js +35 -11
  52. package/dist/cli/commands/logs.js.map +1 -1
  53. package/dist/cli/commands/quickstart.js +39 -1
  54. package/dist/cli/commands/quickstart.js.map +1 -1
  55. package/dist/cli/commands/run.js +38 -0
  56. package/dist/cli/commands/run.js.map +1 -1
  57. package/dist/cli/commands/status.js +11 -1
  58. package/dist/cli/commands/status.js.map +1 -1
  59. package/dist/cli/commands/submit-intent.js +62 -99
  60. package/dist/cli/commands/submit-intent.js.map +1 -1
  61. package/dist/cli/intent-registry-access.d.ts +3 -5
  62. package/dist/cli/intent-registry-access.js +12 -34
  63. package/dist/cli/intent-registry-access.js.map +1 -1
  64. package/dist/cli/introspection-context.js +11 -8
  65. package/dist/cli/introspection-context.js.map +1 -1
  66. package/dist/config.d.ts +28 -1
  67. package/dist/config.js +29 -0
  68. package/dist/config.js.map +1 -1
  69. package/dist/daemon/balance-topup-loop.js +32 -4
  70. package/dist/daemon/balance-topup-loop.js.map +1 -1
  71. package/dist/daemon/creator.d.ts +6 -9
  72. package/dist/daemon/creator.js +45 -51
  73. package/dist/daemon/creator.js.map +1 -1
  74. package/dist/daemon/daemon.d.ts +9 -20
  75. package/dist/daemon/daemon.js +34 -27
  76. package/dist/daemon/daemon.js.map +1 -1
  77. package/dist/daemon/delivery-watcher.d.ts +3 -1
  78. package/dist/daemon/delivery-watcher.js +19 -1
  79. package/dist/daemon/delivery-watcher.js.map +1 -1
  80. package/dist/daemon/reward-claim-loop.js +38 -1
  81. package/dist/daemon/reward-claim-loop.js.map +1 -1
  82. package/dist/dashboard/index.html +71 -496
  83. package/dist/discovery/registry.d.ts +54 -0
  84. package/dist/discovery/registry.js +73 -0
  85. package/dist/discovery/registry.js.map +1 -1
  86. package/dist/earning/bootstrap.js +8 -38
  87. package/dist/earning/bootstrap.js.map +1 -1
  88. package/dist/earning/stolas-claim.d.ts +6 -0
  89. package/dist/earning/stolas-claim.js +7 -0
  90. package/dist/earning/stolas-claim.js.map +1 -1
  91. package/dist/intents/kinds/constants.d.ts +5 -0
  92. package/dist/intents/kinds/constants.js +6 -0
  93. package/dist/intents/kinds/constants.js.map +1 -0
  94. package/dist/intents/kinds/index.d.ts +28 -0
  95. package/dist/intents/kinds/index.js +50 -0
  96. package/dist/intents/kinds/index.js.map +1 -0
  97. package/dist/intents/kinds/portfolio-v0.d.ts +2 -0
  98. package/dist/intents/kinds/portfolio-v0.js +13 -0
  99. package/dist/intents/kinds/portfolio-v0.js.map +1 -0
  100. package/dist/intents/kinds/prediction-apy-v0.d.ts +3 -0
  101. package/dist/intents/kinds/prediction-apy-v0.js +21 -0
  102. package/dist/intents/kinds/prediction-apy-v0.js.map +1 -0
  103. package/dist/intents/kinds/prediction-v0.d.ts +3 -0
  104. package/dist/intents/kinds/prediction-v0.js +32 -0
  105. package/dist/intents/kinds/prediction-v0.js.map +1 -0
  106. package/dist/intents/kinds/spec-kind.d.ts +38 -0
  107. package/dist/intents/kinds/spec-kind.js +6 -0
  108. package/dist/intents/kinds/spec-kind.js.map +1 -0
  109. package/dist/intents/posting-service.d.ts +26 -0
  110. package/dist/intents/posting-service.js +218 -0
  111. package/dist/intents/posting-service.js.map +1 -0
  112. package/dist/intents/prediction-apy-v0-auto.js +1 -1
  113. package/dist/intents/prediction-apy-v0-auto.js.map +1 -1
  114. package/dist/intents/prediction-v0-template.d.ts +8 -3
  115. package/dist/intents/prediction-v0-template.js +21 -1
  116. package/dist/intents/prediction-v0-template.js.map +1 -1
  117. package/dist/intents/sources.d.ts +39 -0
  118. package/dist/intents/sources.js +42 -0
  119. package/dist/intents/sources.js.map +1 -0
  120. package/dist/main.js +89 -65
  121. package/dist/main.js.map +1 -1
  122. package/dist/mcp/server.js +8 -4
  123. package/dist/mcp/server.js.map +1 -1
  124. package/dist/observability/emit-event.d.ts +12 -0
  125. package/dist/observability/emit-event.js +27 -0
  126. package/dist/observability/emit-event.js.map +1 -0
  127. package/dist/preflight/api-port.d.ts +13 -0
  128. package/dist/preflight/api-port.js +32 -0
  129. package/dist/preflight/api-port.js.map +1 -0
  130. package/dist/preflight/rpc-network.d.ts +44 -0
  131. package/dist/preflight/rpc-network.js +121 -0
  132. package/dist/preflight/rpc-network.js.map +1 -0
  133. package/dist/restorer/engine/engine.d.ts +10 -0
  134. package/dist/restorer/engine/engine.js +60 -44
  135. package/dist/restorer/engine/engine.js.map +1 -1
  136. package/dist/restorer/impls/claude-mcp-hyperliquid/index.d.ts +7 -4
  137. package/dist/restorer/impls/claude-mcp-hyperliquid/index.js +12 -1
  138. package/dist/restorer/impls/claude-mcp-hyperliquid/index.js.map +1 -1
  139. package/dist/restorer/impls/claude-mcp-prediction/index.d.ts +2 -1
  140. package/dist/restorer/impls/claude-mcp-prediction/index.js +9 -0
  141. package/dist/restorer/impls/claude-mcp-prediction/index.js.map +1 -1
  142. package/dist/restorer/impls/claude-mcp-prediction/types.d.ts +2 -0
  143. package/dist/restorer/impls/claude-mcp-prediction-apy/index.d.ts +34 -0
  144. package/dist/restorer/impls/claude-mcp-prediction-apy/index.js +233 -0
  145. package/dist/restorer/impls/claude-mcp-prediction-apy/index.js.map +1 -0
  146. package/dist/restorer/impls/claude-mcp-prediction-apy/mcp-tools.d.ts +18 -0
  147. package/dist/restorer/impls/claude-mcp-prediction-apy/mcp-tools.js +136 -0
  148. package/dist/restorer/impls/claude-mcp-prediction-apy/mcp-tools.js.map +1 -0
  149. package/dist/restorer/impls/claude-mcp-prediction-apy/prompt.d.ts +7 -0
  150. package/dist/restorer/impls/claude-mcp-prediction-apy/prompt.js +46 -0
  151. package/dist/restorer/impls/claude-mcp-prediction-apy/prompt.js.map +1 -0
  152. package/dist/restorer/impls/claude-mcp-prediction-apy/session-orchestrator.d.ts +27 -0
  153. package/dist/restorer/impls/claude-mcp-prediction-apy/session-orchestrator.js +128 -0
  154. package/dist/restorer/impls/claude-mcp-prediction-apy/session-orchestrator.js.map +1 -0
  155. package/dist/restorer/impls/claude-mcp-prediction-apy/types.d.ts +64 -0
  156. package/dist/restorer/impls/claude-mcp-prediction-apy/types.js +6 -0
  157. package/dist/restorer/impls/claude-mcp-prediction-apy/types.js.map +1 -0
  158. package/dist/restorer/impls/evaluation-context.d.ts +16 -0
  159. package/dist/restorer/impls/evaluation-context.js +18 -0
  160. package/dist/restorer/impls/evaluation-context.js.map +1 -0
  161. package/dist/restorer/impls/index.d.ts +46 -0
  162. package/dist/restorer/impls/index.js +88 -0
  163. package/dist/restorer/impls/index.js.map +1 -0
  164. package/dist/restorer/impls/legacy-claude/index.d.ts +8 -1
  165. package/dist/restorer/impls/legacy-claude/index.js +79 -10
  166. package/dist/restorer/impls/legacy-claude/index.js.map +1 -1
  167. package/dist/restorer/impls/portfolio-v0-evaluator/index.d.ts +2 -1
  168. package/dist/restorer/impls/portfolio-v0-evaluator/index.js +9 -0
  169. package/dist/restorer/impls/portfolio-v0-evaluator/index.js.map +1 -1
  170. package/dist/restorer/impls/portfolio-v0-evaluator/types.d.ts +2 -0
  171. package/dist/restorer/impls/prediction-apy-v0-baseline/index.d.ts +1 -0
  172. package/dist/restorer/impls/prediction-apy-v0-baseline/index.js +12 -3
  173. package/dist/restorer/impls/prediction-apy-v0-baseline/index.js.map +1 -1
  174. package/dist/restorer/impls/prediction-apy-v0-evaluator/canonical-metrics.d.ts +4 -0
  175. package/dist/restorer/impls/prediction-apy-v0-evaluator/canonical-metrics.js +4 -0
  176. package/dist/restorer/impls/prediction-apy-v0-evaluator/canonical-metrics.js.map +1 -1
  177. package/dist/restorer/impls/prediction-apy-v0-evaluator/index.d.ts +6 -3
  178. package/dist/restorer/impls/prediction-apy-v0-evaluator/index.js +55 -33
  179. package/dist/restorer/impls/prediction-apy-v0-evaluator/index.js.map +1 -1
  180. package/dist/restorer/impls/prediction-apy-v0-evaluator/parse-submission.d.ts +7 -0
  181. package/dist/restorer/impls/prediction-apy-v0-evaluator/parse-submission.js +29 -0
  182. package/dist/restorer/impls/prediction-apy-v0-evaluator/parse-submission.js.map +1 -0
  183. package/dist/restorer/impls/prediction-apy-v0-evaluator/types.d.ts +1 -1
  184. package/dist/restorer/impls/prediction-v0-baseline/index.d.ts +2 -0
  185. package/dist/restorer/impls/prediction-v0-baseline/index.js +6 -0
  186. package/dist/restorer/impls/prediction-v0-baseline/index.js.map +1 -1
  187. package/dist/restorer/impls/prediction-v0-evaluator/checks/integrity.d.ts +6 -0
  188. package/dist/restorer/impls/prediction-v0-evaluator/checks/integrity.js +19 -1
  189. package/dist/restorer/impls/prediction-v0-evaluator/checks/integrity.js.map +1 -1
  190. package/dist/restorer/impls/prediction-v0-evaluator/index.d.ts +6 -3
  191. package/dist/restorer/impls/prediction-v0-evaluator/index.js +30 -4
  192. package/dist/restorer/impls/prediction-v0-evaluator/index.js.map +1 -1
  193. package/dist/restorer/impls/prediction-v0-evaluator/types.d.ts +1 -1
  194. package/dist/restorer/types.d.ts +17 -0
  195. package/dist/restorer/types.js +22 -1
  196. package/dist/restorer/types.js.map +1 -1
  197. package/dist/rpc-error-context.d.ts +10 -0
  198. package/dist/rpc-error-context.js +26 -0
  199. package/dist/rpc-error-context.js.map +1 -0
  200. package/dist/store/store.d.ts +98 -0
  201. package/dist/store/store.js +331 -4
  202. package/dist/store/store.js.map +1 -1
  203. package/dist/trajectory/schema.d.ts +510 -0
  204. package/dist/trajectory/schema.js +74 -0
  205. package/dist/trajectory/schema.js.map +1 -0
  206. package/dist/types/prediction-apy.d.ts +21 -10
  207. package/dist/types/prediction-apy.js +17 -5
  208. package/dist/types/prediction-apy.js.map +1 -1
  209. package/dist/types/prediction.d.ts +11 -10
  210. package/dist/types/prediction.js +3 -2
  211. package/dist/types/prediction.js.map +1 -1
  212. package/dist/venues/aave-v3/client.d.ts +6 -2
  213. package/dist/venues/aave-v3/client.js +14 -5
  214. package/dist/venues/aave-v3/client.js.map +1 -1
  215. package/package.json +4 -3
  216. package/dist/daemon/restorer.d.ts +0 -19
  217. package/dist/daemon/restorer.js +0 -82
  218. package/dist/daemon/restorer.js.map +0 -1
@@ -1,500 +1,75 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="utf-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1">
6
- <title>jinn operator dashboard</title>
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>jinn operator</title>
7
3
  <style>
8
- *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
9
- body {
10
- background: #0a0a0f;
11
- color: #e0e0e0;
12
- font-family: "JetBrains Mono", "Fira Code", "SF Mono", monospace;
13
- font-size: 14px;
14
- line-height: 1.5;
15
- padding: 20px;
16
- }
17
- h1 {
18
- font-size: 18px;
19
- font-weight: 600;
20
- margin-bottom: 16px;
21
- color: #e0e0e0;
22
- }
23
- .grid {
24
- display: grid;
25
- grid-template-columns: 1fr;
26
- gap: 12px;
27
- }
28
- @media (min-width: 900px) {
29
- .grid { grid-template-columns: 1fr 1fr; }
30
- .full-width { grid-column: 1 / -1; }
31
- }
32
- .card {
33
- border: 1px solid #1a1a2e;
34
- border-radius: 6px;
35
- padding: 14px 16px;
36
- background: #0f0f18;
37
- }
38
- .card-title {
39
- font-size: 12px;
40
- text-transform: uppercase;
41
- letter-spacing: 0.08em;
42
- color: #888;
43
- margin-bottom: 10px;
44
- }
45
-
46
- /* Health bar */
47
- .health-bar {
48
- display: flex;
49
- align-items: center;
50
- gap: 12px;
51
- flex-wrap: wrap;
52
- }
53
- .health-dot {
54
- width: 10px;
55
- height: 10px;
56
- border-radius: 50%;
57
- flex-shrink: 0;
58
- }
59
- .health-dot.ok { background: #22c55e; }
60
- .health-dot.warn { background: #f59e0b; }
61
- .health-dot.error { background: #ef4444; }
62
- .health-meta {
63
- font-size: 12px;
64
- color: #888;
65
- }
66
-
67
- /* Table */
68
- table {
69
- width: 100%;
70
- border-collapse: collapse;
71
- font-size: 13px;
72
- }
73
- th {
74
- text-align: left;
75
- font-weight: 500;
76
- color: #888;
77
- padding: 4px 8px 4px 0;
78
- border-bottom: 1px solid #1a1a2e;
79
- }
80
- td {
81
- padding: 4px 8px 4px 0;
82
- border-bottom: 1px solid #111;
83
- }
84
-
85
- /* Step badges */
86
- .badge {
87
- display: inline-block;
88
- padding: 1px 6px;
89
- border-radius: 3px;
90
- font-size: 11px;
91
- }
92
- .badge-complete { background: #22c55e22; color: #22c55e; }
93
- .badge-staked, .badge-mech_deployed, .badge-service_staked { background: #3b82f622; color: #3b82f6; }
94
- .badge-awaiting_stake, .badge-awaiting_funding { background: #f59e0b22; color: #f59e0b; }
95
- .badge-default { background: #88888822; color: #888; }
96
-
97
- /* KV pairs */
98
- .kv { display: flex; justify-content: space-between; padding: 3px 0; }
99
- .kv-key { color: #888; }
100
- .kv-val { color: #e0e0e0; text-align: right; }
101
-
102
- /* Warning bg */
103
- .warn-bg { background: #f59e0b11; border-color: #f59e0b44; }
104
- .ok-bg { background: #22c55e08; border-color: #22c55e33; }
105
- .red-bg { background: #ef444411; border-color: #ef444444; }
106
-
107
- /* Activity list */
108
- .activity-list {
109
- max-height: 200px;
110
- overflow-y: auto;
111
- font-size: 12px;
112
- }
113
- .activity-list div {
114
- padding: 2px 0;
115
- border-bottom: 1px solid #111;
116
- }
117
- .activity-list .role { color: #3b82f6; }
118
-
119
- /* Next actions */
120
- .actions-list { list-style: disc; padding-left: 18px; }
121
- .actions-list li { padding: 2px 0; font-size: 13px; }
122
-
123
- .error-msg { color: #ef4444; font-size: 12px; }
124
- .truncated { font-family: inherit; }
125
- </style>
126
- </head>
127
- <body>
128
- <h1>jinn operator dashboard</h1>
4
+ body{background:#0b1020;color:#d5def5;font-family:ui-monospace,Menlo,monospace;padding:16px} .grid{display:grid;gap:12px;grid-template-columns:1fr}
5
+ @media (min-width:900px){.grid{grid-template-columns:1fr 1fr}.full{grid-column:1/-1}}
6
+ .card{border:1px solid #28314e;background:#101933;border-radius:8px;padding:12px}.row{display:flex;justify-content:space-between;gap:8px}.muted{color:#8ea0c9;font-size:12px}
7
+ table{width:100%;border-collapse:collapse}th,td{border-bottom:1px solid #28314e;padding:4px 0;text-align:left;font-size:12px}
8
+ .badge{border:1px solid #3c4f85;padding:2px 6px;border-radius:10px}.ok{color:#6ee7b7}.err{color:#fca5a5}.toast{position:fixed;right:12px;bottom:12px;background:#1f2b4d;padding:8px 10px;border-radius:6px;display:none}
9
+ button{background:#3758c7;color:#fff;border:0;border-radius:6px;padding:6px 8px;cursor:pointer}
10
+ </style></head><body>
11
+ <div class="row"><h1>jinn operator</h1><div><span id="network" class="badge">network</span> <span id="health">...</span> <button id="refresh">Refresh now</button></div></div>
12
+ <div class="muted" id="meta">last poll --</div>
129
13
  <div class="grid">
130
-
131
- <!-- Health bar -->
132
- <div id="panel-health" class="card full-width">
133
- <div class="card-title">health</div>
134
- <div class="health-bar">
135
- <span id="health-dot" class="health-dot warn"></span>
136
- <span id="health-label">connecting...</span>
137
- <span id="health-meta" class="health-meta"></span>
138
- </div>
139
- </div>
140
-
141
- <!-- Fleet -->
142
- <div id="panel-fleet" class="card">
143
- <div class="card-title">fleet</div>
144
- <div id="fleet-content">--</div>
145
- </div>
146
-
147
- <!-- Master gas -->
148
- <div id="panel-gas" class="card">
149
- <div class="card-title">master gas</div>
150
- <div id="gas-content">--</div>
151
- </div>
152
-
153
- <!-- Activity -->
154
- <div id="panel-activity" class="card">
155
- <div class="card-title">activity</div>
156
- <div id="activity-content">--</div>
157
- </div>
158
-
159
- <!-- Rewards -->
160
- <div id="panel-rewards" class="card">
161
- <div class="card-title">rewards</div>
162
- <div id="rewards-content">--</div>
163
- </div>
164
-
165
- <!-- Next actions -->
166
- <div id="panel-actions" class="card full-width">
167
- <div class="card-title">next actions</div>
168
- <div id="actions-content">--</div>
169
- </div>
170
-
14
+ <section class="card full"><h3>In-flight intents</h3><div id="inflight"></div></section>
15
+ <section class="card full"><h3>Recent verdicts</h3><div id="verdicts"></div></section>
16
+ <section class="card"><h3>Earnings</h3><div id="earnings"></div></section>
17
+ <section class="card"><h3>Fleet</h3><div id="fleet"></div></section>
18
+ <section class="card"><h3>Master gas</h3><div id="gas"></div></section>
19
+ <section class="card"><h3>Recent activity</h3><div id="activity"></div></section>
20
+ <section class="card full"><h3>Next actions</h3><div id="actions"></div></section>
171
21
  </div>
172
-
22
+ <div id="footer" class="muted"></div><div id="toast" class="toast">Copied</div>
173
23
  <script>
174
- (function() {
175
- var POLL_INTERVAL = 5000;
176
-
177
- function $(id) { return document.getElementById(id); }
178
-
179
- function truncAddr(addr) {
180
- if (!addr || addr.length < 12) return addr || '--';
181
- return addr.slice(0, 6) + '...' + addr.slice(-4);
182
- }
183
-
184
- function weiToEth(weiStr) {
185
- if (!weiStr) return '--';
186
- try {
187
- var big = BigInt(weiStr);
188
- var intPart = big / 10n**18n;
189
- var fracPart = big % 10n**18n;
190
- var fracStr = fracPart.toString().padStart(18, '0').slice(0, 4);
191
- return intPart.toString() + '.' + fracStr;
192
- } catch(e) { return weiStr; }
193
- }
194
-
195
- function stepBadgeClass(step) {
196
- if (step === 'complete') return 'badge-complete';
197
- if (['staked','mech_deployed','service_staked'].indexOf(step) !== -1) return 'badge-staked';
198
- if (['awaiting_stake','awaiting_funding'].indexOf(step) !== -1) return 'badge-awaiting_stake';
199
- return 'badge-default';
200
- }
201
-
202
- function setHealthIndicator(state, msg) {
203
- var dot = $('health-dot');
204
- var label = $('health-label');
205
- dot.className = 'health-dot ' + (state === 'ok' ? 'ok' : 'error');
206
- label.textContent = state === 'ok' ? 'connected' : 'error: ' + (msg || 'unknown');
207
- }
208
-
209
- function render(data) {
210
- // Health
211
- var dot = $('health-dot');
212
- var label = $('health-label');
213
- var meta = $('health-meta');
214
-
215
- var isShutdown = data.daemon && data.daemon.shutdownState;
216
- var rpcOk = data.rpc && data.rpc.ok;
217
-
218
- if (isShutdown) {
219
- dot.className = 'health-dot warn';
220
- label.textContent = 'shutting down (' + data.daemon.shutdownState + ')';
221
- } else if (!rpcOk) {
222
- dot.className = 'health-dot error';
223
- label.textContent = 'rpc error' + (data.rpc && data.rpc.error ? ': ' + data.rpc.error : '');
224
- } else {
225
- dot.className = 'health-dot ok';
226
- label.textContent = 'healthy';
227
- }
228
-
229
- var metaParts = [];
230
- if (data.rpc && data.rpc.chainId) metaParts.push('chain ' + data.rpc.chainId);
231
- if (data.rpc && data.rpc.blockNumber) metaParts.push('block ' + data.rpc.blockNumber);
232
- if (data.daemon && data.daemon.timestamp) {
233
- var d = new Date(data.daemon.timestamp);
234
- metaParts.push('at ' + d.toLocaleTimeString());
235
- }
236
- meta.textContent = metaParts.join(' | ');
237
-
238
- // Fleet
239
- renderFleet(data.fleet);
240
-
241
- // Master gas
242
- renderGas(data.masterGas);
243
-
244
- // Activity
245
- renderActivity(data.activity);
246
-
247
- // Rewards
248
- renderRewards(data.rewards, data.earnings);
249
-
250
- // Next actions
251
- renderActions(data.nextActions);
252
- }
253
-
254
- function renderFleet(fleet) {
255
- var el = $('fleet-content');
256
- el.textContent = '';
257
-
258
- if (!fleet || !fleet.loaded) {
259
- el.textContent = 'No fleet loaded';
260
- return;
261
- }
262
-
263
- if (fleet.services.length === 0) {
264
- el.textContent = 'No services';
265
- return;
266
- }
267
-
268
- var tbl = document.createElement('table');
269
- var thead = document.createElement('thead');
270
- var hrow = document.createElement('tr');
271
- ['#','step','svcId','safe','mech'].forEach(function(h) {
272
- var th = document.createElement('th');
273
- th.textContent = h;
274
- hrow.appendChild(th);
275
- });
276
- thead.appendChild(hrow);
277
- tbl.appendChild(thead);
278
-
279
- var tbody = document.createElement('tbody');
280
- fleet.services.forEach(function(s) {
281
- var tr = document.createElement('tr');
282
-
283
- var tdIdx = document.createElement('td');
284
- tdIdx.textContent = String(s.index);
285
- tr.appendChild(tdIdx);
286
-
287
- var tdStep = document.createElement('td');
288
- var badge = document.createElement('span');
289
- badge.className = 'badge ' + stepBadgeClass(s.step);
290
- badge.textContent = s.step;
291
- tdStep.appendChild(badge);
292
- tr.appendChild(tdStep);
293
-
294
- var tdSvc = document.createElement('td');
295
- tdSvc.textContent = s.serviceId != null ? String(s.serviceId) : '--';
296
- tr.appendChild(tdSvc);
297
-
298
- var tdSafe = document.createElement('td');
299
- tdSafe.textContent = truncAddr(s.safeAddress);
300
- tdSafe.title = s.safeAddress || '';
301
- tdSafe.className = 'truncated';
302
- tr.appendChild(tdSafe);
303
-
304
- var tdMech = document.createElement('td');
305
- tdMech.textContent = truncAddr(s.mechAddress);
306
- tdMech.title = s.mechAddress || '';
307
- tdMech.className = 'truncated';
308
- tr.appendChild(tdMech);
309
-
310
- tbody.appendChild(tr);
311
- });
312
- tbl.appendChild(tbody);
313
- el.appendChild(tbl);
314
-
315
- var summary = document.createElement('div');
316
- summary.style.marginTop = '8px';
317
- summary.style.fontSize = '12px';
318
- summary.style.color = '#888';
319
- summary.textContent = fleet.stakedLikeCount + ' staked, ' + fleet.completeCount + ' complete';
320
- el.appendChild(summary);
321
- }
322
-
323
- function renderGas(gas) {
324
- var el = $('gas-content');
325
- var panel = $('panel-gas');
326
- el.textContent = '';
327
- panel.className = 'card';
328
-
329
- if (!gas) { el.textContent = '--'; return; }
330
-
331
- var runwayLow = gas.runwayDaysExcess !== undefined && Number(gas.runwayDaysExcess) < 3;
332
- if (runwayLow) {
333
- panel.className = 'card red-bg';
334
- }
335
-
336
- var pairs = [
337
- ['address', truncAddr(gas.address)],
338
- ['balance', weiToEth(gas.balanceWei) + ' ETH'],
339
- ['daily est.', weiToEth(gas.dailyEstimateWei) + ' ETH'],
340
- ['runway', gas.runwayDaysExcess !== undefined ? gas.runwayDaysExcess + ' days' : '--'],
341
- ];
342
- if (gas.error) {
343
- pairs.push(['error', gas.error]);
344
- }
345
-
346
- pairs.forEach(function(p) {
347
- var row = document.createElement('div');
348
- row.className = 'kv';
349
- var k = document.createElement('span');
350
- k.className = 'kv-key';
351
- k.textContent = p[0];
352
- var v = document.createElement('span');
353
- v.className = 'kv-val';
354
- v.textContent = p[1];
355
- if (p[0] === 'address') v.title = gas.address || '';
356
- if (p[0] === 'error') v.className = 'kv-val error-msg';
357
- row.appendChild(k);
358
- row.appendChild(v);
359
- el.appendChild(row);
360
- });
361
- }
362
-
363
- function renderActivity(act) {
364
- var el = $('activity-content');
365
- el.textContent = '';
366
-
367
- if (!act) { el.textContent = '--'; return; }
368
-
369
- // Counts
370
- var counts = act.counts || {};
371
- var keys = Object.keys(counts);
372
- if (keys.length > 0) {
373
- keys.forEach(function(k) {
374
- var row = document.createElement('div');
375
- row.className = 'kv';
376
- var kSpan = document.createElement('span');
377
- kSpan.className = 'kv-key';
378
- kSpan.textContent = k;
379
- var vSpan = document.createElement('span');
380
- vSpan.className = 'kv-val';
381
- vSpan.textContent = String(counts[k]);
382
- row.appendChild(kSpan);
383
- row.appendChild(vSpan);
384
- el.appendChild(row);
385
- });
386
- } else {
387
- var none = document.createElement('div');
388
- none.style.color = '#888';
389
- none.style.fontSize = '12px';
390
- none.textContent = 'no activity recorded';
391
- el.appendChild(none);
392
- }
393
-
394
- // Recent
395
- var recent = act.recent || [];
396
- if (recent.length > 0) {
397
- var hdr = document.createElement('div');
398
- hdr.style.marginTop = '10px';
399
- hdr.style.fontSize = '11px';
400
- hdr.style.color = '#666';
401
- hdr.textContent = 'recent';
402
- el.appendChild(hdr);
403
-
404
- var list = document.createElement('div');
405
- list.className = 'activity-list';
406
- recent.forEach(function(r) {
407
- var item = document.createElement('div');
408
- var roleSpan = document.createElement('span');
409
- roleSpan.className = 'role';
410
- roleSpan.textContent = r.role;
411
- item.appendChild(roleSpan);
412
- var idText = document.createTextNode(' ' + truncAddr(r.requestId));
413
- item.appendChild(idText);
414
- list.appendChild(item);
415
- });
416
- el.appendChild(list);
417
- }
418
- }
419
-
420
- function renderRewards(rewards, earnings) {
421
- var el = $('rewards-content');
422
- el.textContent = '';
423
-
424
- if (!rewards) { el.textContent = '--'; return; }
425
-
426
- var pairs = [
427
- ['pending', rewards.pendingStakingRewardsWei ? weiToEth(rewards.pendingStakingRewardsWei) + ' ETH' : (rewards.pendingRewardsError || '--')],
428
- ['claim interval', rewards.claimLoopIntervalMs ? (rewards.claimLoopIntervalMs / 1000) + 's' : 'disabled'],
429
- ['last claim', rewards.lastClaimTickAt || '--'],
430
- ];
431
-
432
- pairs.forEach(function(p) {
433
- var row = document.createElement('div');
434
- row.className = 'kv';
435
- var k = document.createElement('span');
436
- k.className = 'kv-key';
437
- k.textContent = p[0];
438
- var v = document.createElement('span');
439
- v.className = 'kv-val';
440
- v.textContent = p[1];
441
- if (p[0] === 'pending' && rewards.pendingRewardsError) v.className = 'kv-val error-msg';
442
- row.appendChild(k);
443
- row.appendChild(v);
444
- el.appendChild(row);
445
- });
446
-
447
- if (earnings && earnings.hint) {
448
- var hint = document.createElement('div');
449
- hint.style.marginTop = '8px';
450
- hint.style.fontSize = '11px';
451
- hint.style.color = '#888';
452
- hint.textContent = earnings.hint;
453
- el.appendChild(hint);
454
- }
455
- }
456
-
457
- function renderActions(actions) {
458
- var el = $('actions-content');
459
- var panel = $('panel-actions');
460
- el.textContent = '';
461
-
462
- if (!actions || actions.length === 0) {
463
- panel.className = 'card full-width ok-bg';
464
- el.textContent = 'no urgent actions';
465
- return;
466
- }
467
-
468
- var isOnlyNoUrgent = actions.length === 1 && actions[0].toLowerCase().indexOf('no urgent') !== -1;
469
- panel.className = isOnlyNoUrgent ? 'card full-width ok-bg' : 'card full-width warn-bg';
470
-
471
- var ul = document.createElement('ul');
472
- ul.className = 'actions-list';
473
- actions.forEach(function(a) {
474
- var li = document.createElement('li');
475
- li.textContent = a;
476
- ul.appendChild(li);
477
- });
478
- el.appendChild(ul);
479
- }
480
-
481
- async function poll() {
482
- try {
483
- var res = await fetch('/v1/status');
484
- if (!res.ok) throw new Error('HTTP ' + res.status);
485
- var data = await res.json();
486
- render(data);
487
- setHealthIndicator('ok');
488
- } catch(err) {
489
- setHealthIndicator('error', err.message);
490
- }
491
- }
492
-
493
- document.addEventListener('DOMContentLoaded', function() {
494
- poll();
495
- setInterval(poll, POLL_INTERVAL);
496
- });
497
- })();
498
- </script>
499
- </body>
500
- </html>
24
+ const POLL_MS=5000; let lastPayload=null;
25
+ const $=(id)=>document.getElementById(id);
26
+ const trunc=(v)=>!v?'--':(v.length<12?v:v.slice(0,6)+'...'+v.slice(-4));
27
+ const esc=(s)=>String(s==null?'':s).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/"/g,'&quot;');
28
+ const H=(html)=>({__html:html});
29
+ const cell=(c)=>(c&&typeof c==='object'&&typeof c.__html==='string')?c.__html:esc(String(c));
30
+ const explorer=(network,kind,val)=>network==='mainnet'?`https://basescan.org/${kind}/${encodeURIComponent(String(val))}`:`https://sepolia.basescan.org/${kind}/${encodeURIComponent(String(val))}`;
31
+ function copy(text){navigator.clipboard.writeText(String(text));const t=$('toast');t.style.display='block';setTimeout(()=>t.style.display='none',1500);}
32
+ function link(network,kind,val){
33
+ if(!val)return esc('--');
34
+ const u=explorer(network,kind,val);
35
+ const t=esc(trunc(val));
36
+ return H(`<a href="${esc(u)}" target="_blank" rel="noopener">${t}</a> <button type="button" class="jinn-copy" data-c="${encodeURIComponent(String(val))}">copy</button>`);
37
+ }
38
+ function table(headers,rows){
39
+ return '<table><thead><tr>'+headers.map(h=>'<th>'+esc(h)+'</th>').join('')+'</tr></thead><tbody>'+
40
+ rows.map(r=>'<tr>'+r.map(c=>'<td>'+cell(c)+'</td>').join('')+'</tr>').join('')+'</tbody></table>';
41
+ }
42
+ function render(d){
43
+ lastPayload=d; const net=d.fleet?.chain==='base'?'mainnet':'testnet';
44
+ $('network').textContent=net; $('health').textContent=d.rpc?.ok?'healthy':'rpc error'; $('health').className=d.rpc?.ok?'ok':'err';
45
+ $('meta').textContent='last poll '+new Date().toISOString()+' | chain '+(d.rpc?.chainId??'-')+' block '+(d.rpc?.blockNumber??'-');
46
+ const inflight=(d.portfolioV0?.inFlight??[]).map(i=>[
47
+ trunc(i.requestId),i.state,i.implName??'-',
48
+ new Date(i.windowStartTs).toISOString().slice(11,19)+''+new Date(i.windowEndTs).toISOString().slice(11,19),
49
+ new Date(i.stateUpdatedAt).toISOString().slice(11,19),i.lastError??'-'
50
+ ]);
51
+ $('inflight').innerHTML=inflight.length?table(['requestId','state','impl','window','updated','error'],inflight):'No in-flight intents';
52
+ const verdicts=(d.portfolioV0?.verdicts??[]).map(v=>[v.outcome,link(net,'tx',v.deliveryTxHash||''),v.manifestCid??'-']);
53
+ $('verdicts').innerHTML=verdicts.length?table(['outcome','delivery tx','manifest'],verdicts):'No verdicts';
54
+ const pend=d.rewards?.pendingStakingRewardsWei??'0'; const lc=d.rewards?.lastClaimTickAt??'--';
55
+ $('earnings').innerHTML='pending '+esc(pend)+'<br>last claim '+esc(lc);
56
+ $('fleet').innerHTML=table(['#','step','serviceId','safe'],(d.fleet?.services??[]).map(s=>[s.index,s.step,s.serviceId??'-',link(net,'address',s.safeAddress||'')]));
57
+ const gas=link(net,'address',d.masterGas?.address||'');
58
+ $('gas').innerHTML='master '+cell(gas)+'<br>balance '+esc(d.masterGas?.balanceWei??'0')+'<br>runway '+esc(d.masterGas?.runwayDaysExcess??'--')+' days';
59
+ const act=(d.activity?.recent??[]).slice(0,20).map(a=>[(a.ts??'').slice(11,19),a.kind,trunc(a.requestId),a.txHash?link(net,'tx',a.txHash):'-']);
60
+ $('activity').innerHTML=table(['time','kind','req','tx'],act);
61
+ $('actions').innerHTML=(d.nextActions??[]).map(a=>'<div class="row"><span>'+esc(a)+'</span> <button type="button" class="jinn-copy" data-c="'+encodeURIComponent(a)+'">copy</button></div>').join('')||'No actions';
62
+ $('footer').textContent='DAEMON '+(d.daemon?.version??'v0.0.0')+' · commit '+(d.daemon?.commit??'unknown');
63
+ }
64
+ async function poll(){
65
+ try{
66
+ const r=await fetch('/v1/status'); if(!r.ok) throw new Error(String(r.status));
67
+ render(await r.json());
68
+ }catch(e){
69
+ if(lastPayload) render(lastPayload);
70
+ $('health').textContent='fetch error'; $('health').className='err';
71
+ }
72
+ }
73
+ document.addEventListener('click',(e)=>{ const b=e.target && e.target.closest?e.target.closest('button.jinn-copy'):null; if(b){ const x=b.getAttribute('data-c'); if(x) try{ copy(decodeURIComponent(x));}catch{}} );
74
+ document.addEventListener('DOMContentLoaded',()=>{ $('refresh').onclick=()=>poll(); poll(); setInterval(poll,POLL_MS); });
75
+ </script></body></html>
@@ -40,4 +40,58 @@ export declare class Registry8004 {
40
40
  outcome: string;
41
41
  endpoint: string;
42
42
  }): Promise<bigint>;
43
+ /**
44
+ * Register a signed intent (adw:Intent) on the 8004 Identity Registry.
45
+ *
46
+ * Plan E Task 10 wiring: called after successful IPFS upload of SignedIntentV1.
47
+ */
48
+ registerIntent(intent: {
49
+ intentCid: string;
50
+ kind: string;
51
+ creator: string;
52
+ createdAt: number;
53
+ requestId: `0x${string}`;
54
+ }): Promise<bigint>;
55
+ /**
56
+ * Register an execution envelope (adw:ExecutionEnvelope) on the 8004 Identity Registry.
57
+ *
58
+ * Plan E Task 11 wiring: called after envelope assembly in pack().
59
+ */
60
+ registerEnvelope(envelope: {
61
+ envelopeCid: string;
62
+ kind: string;
63
+ role: 'restoration' | 'verdict';
64
+ evidenceTier: string;
65
+ intentCid: string;
66
+ parentEnvelopeCid?: string;
67
+ measurement?: string;
68
+ participant: string;
69
+ generatedAt: number;
70
+ }): Promise<bigint>;
71
+ /**
72
+ * Register an artifact with a back-pointer to its parent envelope CID
73
+ * (adw:Artifact with parentEnvelopeCid) on the 8004 Identity Registry.
74
+ *
75
+ * Plan E Task 11 wiring: called for each artifact after pack().
76
+ */
77
+ registerArtifactWithParent(artifact: {
78
+ id: string;
79
+ title: string;
80
+ tags: string[];
81
+ outcome: string;
82
+ endpoint: string;
83
+ parentEnvelopeCid: string;
84
+ }): Promise<bigint>;
85
+ /**
86
+ * Register a source bundle (adw:SourceBundle) on the 8004 Identity Registry.
87
+ *
88
+ * One-off operator setup for publishing a release.
89
+ */
90
+ registerSourceBundle(bundle: {
91
+ bundleCid: string;
92
+ measurement: string;
93
+ buildRecipeKind: 'dockerfile' | 'nix' | 'bazel';
94
+ publishedBy: string;
95
+ humanUrl?: string;
96
+ }): Promise<bigint>;
43
97
  }