@elizaos/plugin-steward-app 2.0.3-beta.5 → 2.0.3-beta.7

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 (219) hide show
  1. package/dist/ApprovalQueue.d.ts +18 -0
  2. package/dist/ApprovalQueue.d.ts.map +1 -0
  3. package/dist/ApprovalQueue.js +420 -0
  4. package/dist/ApprovalQueue.js.map +1 -0
  5. package/dist/StewardLogo.d.ts +11 -0
  6. package/dist/StewardLogo.d.ts.map +1 -0
  7. package/dist/StewardLogo.js +36 -0
  8. package/dist/StewardLogo.js.map +1 -0
  9. package/dist/StewardView.d.ts +13 -0
  10. package/dist/StewardView.d.ts.map +1 -0
  11. package/dist/StewardView.helpers.d.ts +15 -0
  12. package/dist/StewardView.helpers.d.ts.map +1 -0
  13. package/dist/StewardView.helpers.js +45 -0
  14. package/dist/StewardView.helpers.js.map +1 -0
  15. package/dist/StewardView.interact.d.ts +2 -0
  16. package/dist/StewardView.interact.d.ts.map +1 -0
  17. package/dist/StewardView.interact.js +54 -0
  18. package/dist/StewardView.interact.js.map +1 -0
  19. package/dist/StewardView.js +249 -0
  20. package/dist/StewardView.js.map +1 -0
  21. package/dist/TransactionHistory.d.ts +22 -0
  22. package/dist/TransactionHistory.d.ts.map +1 -0
  23. package/dist/TransactionHistory.js +361 -0
  24. package/dist/TransactionHistory.js.map +1 -0
  25. package/dist/__fixtures__/steward-sdk-fixtures.d.ts +10 -0
  26. package/dist/__fixtures__/steward-sdk-fixtures.d.ts.map +1 -0
  27. package/dist/__fixtures__/steward-sdk-fixtures.js +60 -0
  28. package/dist/__fixtures__/steward-sdk-fixtures.js.map +1 -0
  29. package/dist/actions/wallet-action-shared.d.ts +15 -0
  30. package/dist/actions/wallet-action-shared.d.ts.map +1 -0
  31. package/dist/actions/wallet-action-shared.js +16 -0
  32. package/dist/actions/wallet-action-shared.js.map +1 -0
  33. package/dist/api/binance-skill-helpers.d.ts +21 -0
  34. package/dist/api/binance-skill-helpers.d.ts.map +1 -0
  35. package/dist/api/binance-skill-helpers.js +790 -0
  36. package/dist/api/binance-skill-helpers.js.map +1 -0
  37. package/dist/api/bsc-trade.d.ts +36 -0
  38. package/dist/api/bsc-trade.d.ts.map +1 -0
  39. package/dist/api/bsc-trade.js +796 -0
  40. package/dist/api/bsc-trade.js.map +1 -0
  41. package/dist/api/trade-safety.d.ts +35 -0
  42. package/dist/api/trade-safety.d.ts.map +1 -0
  43. package/dist/api/trade-safety.js +56 -0
  44. package/dist/api/trade-safety.js.map +1 -0
  45. package/dist/api/tx-service.d.ts +53 -0
  46. package/dist/api/tx-service.d.ts.map +1 -0
  47. package/dist/api/tx-service.js +206 -0
  48. package/dist/api/tx-service.js.map +1 -0
  49. package/dist/api/wallet-bsc-routes.d.ts +63 -0
  50. package/dist/api/wallet-bsc-routes.d.ts.map +1 -0
  51. package/dist/api/wallet-bsc-routes.js +337 -0
  52. package/dist/api/wallet-bsc-routes.js.map +1 -0
  53. package/dist/api/wallet-capability.d.ts +2 -0
  54. package/dist/api/wallet-capability.d.ts.map +1 -0
  55. package/dist/api/wallet-capability.js +15 -0
  56. package/dist/api/wallet-capability.js.map +1 -0
  57. package/dist/api/wallet-dex-prices.d.ts +43 -0
  58. package/dist/api/wallet-dex-prices.d.ts.map +1 -0
  59. package/dist/api/wallet-dex-prices.js +132 -0
  60. package/dist/api/wallet-dex-prices.js.map +1 -0
  61. package/dist/api/wallet-evm-balance.d.ts +72 -0
  62. package/dist/api/wallet-evm-balance.d.ts.map +1 -0
  63. package/dist/api/wallet-evm-balance.js +697 -0
  64. package/dist/api/wallet-evm-balance.js.map +1 -0
  65. package/dist/api/wallet-routes.d.ts +27 -0
  66. package/dist/api/wallet-routes.d.ts.map +1 -0
  67. package/dist/api/wallet-routes.js +556 -0
  68. package/dist/api/wallet-routes.js.map +1 -0
  69. package/dist/api/wallet-rpc.d.ts +73 -0
  70. package/dist/api/wallet-rpc.d.ts.map +1 -0
  71. package/dist/api/wallet-rpc.js +460 -0
  72. package/dist/api/wallet-rpc.js.map +1 -0
  73. package/dist/api/wallet-trade-routes.d.ts +104 -0
  74. package/dist/api/wallet-trade-routes.d.ts.map +1 -0
  75. package/dist/api/wallet-trade-routes.js +353 -0
  76. package/dist/api/wallet-trade-routes.js.map +1 -0
  77. package/dist/api/wallet-trading-profile.d.ts +31 -0
  78. package/dist/api/wallet-trading-profile.d.ts.map +1 -0
  79. package/dist/api/wallet-trading-profile.js +500 -0
  80. package/dist/api/wallet-trading-profile.js.map +1 -0
  81. package/dist/api/wallet.d.ts +60 -0
  82. package/dist/api/wallet.d.ts.map +1 -0
  83. package/dist/api/wallet.js +617 -0
  84. package/dist/api/wallet.js.map +1 -0
  85. package/dist/chain-utils.d.ts +10 -0
  86. package/dist/chain-utils.d.ts.map +1 -0
  87. package/dist/chain-utils.js +81 -0
  88. package/dist/chain-utils.js.map +1 -0
  89. package/dist/components/StewardSpatialView.d.ts +74 -0
  90. package/dist/components/StewardSpatialView.d.ts.map +1 -0
  91. package/dist/components/StewardSpatialView.js +309 -0
  92. package/dist/components/StewardSpatialView.js.map +1 -0
  93. package/dist/index.d.ts +20 -0
  94. package/dist/index.d.ts.map +1 -0
  95. package/dist/index.js +77 -0
  96. package/dist/index.js.map +1 -0
  97. package/dist/plugin.d.ts +21 -0
  98. package/dist/plugin.d.ts.map +1 -0
  99. package/dist/plugin.js +319 -0
  100. package/dist/plugin.js.map +1 -0
  101. package/dist/providers/steward-balance.d.ts +12 -0
  102. package/dist/providers/steward-balance.d.ts.map +1 -0
  103. package/dist/providers/steward-balance.js +85 -0
  104. package/dist/providers/steward-balance.js.map +1 -0
  105. package/dist/providers/steward-receive-address.d.ts +12 -0
  106. package/dist/providers/steward-receive-address.d.ts.map +1 -0
  107. package/dist/providers/steward-receive-address.js +47 -0
  108. package/dist/providers/steward-receive-address.js.map +1 -0
  109. package/dist/register-routes.d.ts +2 -0
  110. package/dist/register-routes.d.ts.map +1 -0
  111. package/dist/register-routes.js +6 -0
  112. package/dist/register-routes.js.map +1 -0
  113. package/dist/register-terminal-view.d.ts +15 -0
  114. package/dist/register-terminal-view.d.ts.map +1 -0
  115. package/dist/register-terminal-view.js +34 -0
  116. package/dist/register-terminal-view.js.map +1 -0
  117. package/dist/routes/steward-bridge.d.ts +202 -0
  118. package/dist/routes/steward-bridge.d.ts.map +1 -0
  119. package/dist/routes/steward-bridge.js +776 -0
  120. package/dist/routes/steward-bridge.js.map +1 -0
  121. package/dist/routes/steward-compat-routes.d.ts +21 -0
  122. package/dist/routes/steward-compat-routes.d.ts.map +1 -0
  123. package/dist/routes/steward-compat-routes.js +350 -0
  124. package/dist/routes/steward-compat-routes.js.map +1 -0
  125. package/dist/routes/wallet-browser-compat-routes.d.ts +6 -0
  126. package/dist/routes/wallet-browser-compat-routes.d.ts.map +1 -0
  127. package/dist/routes/wallet-browser-compat-routes.js +402 -0
  128. package/dist/routes/wallet-browser-compat-routes.js.map +1 -0
  129. package/dist/routes/wallet-bsc-core-routes.d.ts +15 -0
  130. package/dist/routes/wallet-bsc-core-routes.d.ts.map +1 -0
  131. package/dist/routes/wallet-bsc-core-routes.js +59 -0
  132. package/dist/routes/wallet-bsc-core-routes.js.map +1 -0
  133. package/dist/routes/wallet-compat-routes.d.ts +13 -0
  134. package/dist/routes/wallet-compat-routes.d.ts.map +1 -0
  135. package/dist/routes/wallet-compat-routes.js +206 -0
  136. package/dist/routes/wallet-compat-routes.js.map +1 -0
  137. package/dist/routes/wallet-core-routes.d.ts +16 -0
  138. package/dist/routes/wallet-core-routes.d.ts.map +1 -0
  139. package/dist/routes/wallet-core-routes.js +48 -0
  140. package/dist/routes/wallet-core-routes.js.map +1 -0
  141. package/dist/routes/wallet-trade-compat-routes.d.ts +11 -0
  142. package/dist/routes/wallet-trade-compat-routes.d.ts.map +1 -0
  143. package/dist/routes/wallet-trade-compat-routes.js +570 -0
  144. package/dist/routes/wallet-trade-compat-routes.js.map +1 -0
  145. package/dist/security/hydrate-wallet-keys-from-platform-store.d.ts +7 -0
  146. package/dist/security/hydrate-wallet-keys-from-platform-store.d.ts.map +1 -0
  147. package/dist/security/hydrate-wallet-keys-from-platform-store.js +43 -0
  148. package/dist/security/hydrate-wallet-keys-from-platform-store.js.map +1 -0
  149. package/dist/security/wallet-os-store-actions.d.ts +14 -0
  150. package/dist/security/wallet-os-store-actions.d.ts.map +1 -0
  151. package/dist/security/wallet-os-store-actions.js +63 -0
  152. package/dist/security/wallet-os-store-actions.js.map +1 -0
  153. package/dist/services/steward-credentials.d.ts +2 -0
  154. package/dist/services/steward-credentials.d.ts.map +1 -0
  155. package/dist/services/steward-credentials.js +2 -0
  156. package/dist/services/steward-credentials.js.map +1 -0
  157. package/dist/services/steward-evm-account.d.ts +75 -0
  158. package/dist/services/steward-evm-account.d.ts.map +1 -0
  159. package/dist/services/steward-evm-account.js +279 -0
  160. package/dist/services/steward-evm-account.js.map +1 -0
  161. package/dist/services/steward-evm-bridge.d.ts +36 -0
  162. package/dist/services/steward-evm-bridge.d.ts.map +1 -0
  163. package/dist/services/steward-evm-bridge.js +78 -0
  164. package/dist/services/steward-evm-bridge.js.map +1 -0
  165. package/dist/services/steward-sidecar/health-check.d.ts +2 -0
  166. package/dist/services/steward-sidecar/health-check.d.ts.map +1 -0
  167. package/dist/services/steward-sidecar/health-check.js +2 -0
  168. package/dist/services/steward-sidecar/health-check.js.map +1 -0
  169. package/dist/services/steward-sidecar/helpers.d.ts +2 -0
  170. package/dist/services/steward-sidecar/helpers.d.ts.map +1 -0
  171. package/dist/services/steward-sidecar/helpers.js +2 -0
  172. package/dist/services/steward-sidecar/helpers.js.map +1 -0
  173. package/dist/services/steward-sidecar/process-management.d.ts +2 -0
  174. package/dist/services/steward-sidecar/process-management.d.ts.map +1 -0
  175. package/dist/services/steward-sidecar/process-management.js +2 -0
  176. package/dist/services/steward-sidecar/process-management.js.map +1 -0
  177. package/dist/services/steward-sidecar/types.d.ts +2 -0
  178. package/dist/services/steward-sidecar/types.d.ts.map +1 -0
  179. package/dist/services/steward-sidecar/types.js +2 -0
  180. package/dist/services/steward-sidecar/types.js.map +1 -0
  181. package/dist/services/steward-sidecar/wallet-setup.d.ts +2 -0
  182. package/dist/services/steward-sidecar/wallet-setup.d.ts.map +1 -0
  183. package/dist/services/steward-sidecar/wallet-setup.js +2 -0
  184. package/dist/services/steward-sidecar/wallet-setup.js.map +1 -0
  185. package/dist/services/steward-sidecar.d.ts +2 -0
  186. package/dist/services/steward-sidecar.d.ts.map +1 -0
  187. package/dist/services/steward-sidecar.js +2 -0
  188. package/dist/services/steward-sidecar.js.map +1 -0
  189. package/dist/services/steward-wallet.d.ts +25 -0
  190. package/dist/services/steward-wallet.d.ts.map +1 -0
  191. package/dist/services/steward-wallet.js +333 -0
  192. package/dist/services/steward-wallet.js.map +1 -0
  193. package/dist/steward-ui-state.d.ts +14 -0
  194. package/dist/steward-ui-state.d.ts.map +1 -0
  195. package/dist/steward-ui-state.js +46 -0
  196. package/dist/steward-ui-state.js.map +1 -0
  197. package/dist/steward-view-bundle.d.ts +3 -0
  198. package/dist/steward-view-bundle.d.ts.map +1 -0
  199. package/dist/steward-view-bundle.js +7 -0
  200. package/dist/steward-view-bundle.js.map +1 -0
  201. package/dist/types/bsc-trade.d.ts +180 -0
  202. package/dist/types/bsc-trade.d.ts.map +1 -0
  203. package/dist/types/bsc-trade.js +1 -0
  204. package/dist/types/bsc-trade.js.map +1 -0
  205. package/dist/types/index.d.ts +3 -0
  206. package/dist/types/index.d.ts.map +1 -0
  207. package/dist/types/index.js +3 -0
  208. package/dist/types/index.js.map +1 -0
  209. package/dist/types/steward.d.ts +83 -0
  210. package/dist/types/steward.d.ts.map +1 -0
  211. package/dist/types/steward.js +1 -0
  212. package/dist/types/steward.js.map +1 -0
  213. package/dist/ui.d.ts +7 -0
  214. package/dist/ui.d.ts.map +1 -0
  215. package/dist/ui.js +7 -0
  216. package/dist/ui.js.map +1 -0
  217. package/dist/views/bundle.js +601 -0
  218. package/dist/views/bundle.js.map +1 -0
  219. package/package.json +8 -8
@@ -0,0 +1,601 @@
1
+ import { useAppSelectorShallow as e } from "@elizaos/ui";
2
+ import { Button as t, Card as n, Divider as r, HStack as i, List as a, SpatialSurface as o, Text as s, VStack as c } from "@elizaos/ui/spatial";
3
+ import { useCallback as l, useEffect as u, useMemo as d, useRef as f, useState as p } from "react";
4
+ import { jsx as m, jsxs as h } from "react/jsx-runtime";
5
+ //#region src/components/StewardSpatialView.tsx
6
+ var g = 25;
7
+ function _(e) {
8
+ switch (e) {
9
+ case "confirmed":
10
+ case "broadcast":
11
+ case "approved":
12
+ case "signed": return "success";
13
+ case "failed":
14
+ case "rejected": return "danger";
15
+ case "pending": return "warning";
16
+ default: return "muted";
17
+ }
18
+ }
19
+ function v(e) {
20
+ return e ? e.length <= 12 ? e : `${e.slice(0, 6)}..${e.slice(-4)}` : "no steward evm address";
21
+ }
22
+ function y(e) {
23
+ let t = e.transaction;
24
+ return {
25
+ queueId: e.queueId,
26
+ requestedAt: e.requestedAt,
27
+ txId: t.id,
28
+ status: t.status,
29
+ chainId: t.request.chainId,
30
+ to: t.request.to,
31
+ value: t.request.value,
32
+ policyCount: t.policyResults.length
33
+ };
34
+ }
35
+ function b(e) {
36
+ return {
37
+ id: e.id,
38
+ createdAt: e.createdAt,
39
+ status: e.status,
40
+ chainId: e.request.chainId,
41
+ to: e.request.to,
42
+ value: e.request.value,
43
+ txHash: e.txHash
44
+ };
45
+ }
46
+ function x({ label: e, value: t }) {
47
+ return /* @__PURE__ */ h(i, {
48
+ gap: 1,
49
+ align: "center",
50
+ children: [/* @__PURE__ */ m(s, {
51
+ style: "caption",
52
+ tone: "muted",
53
+ children: e
54
+ }), /* @__PURE__ */ m(s, {
55
+ style: "caption",
56
+ grow: 1,
57
+ wrap: !1,
58
+ children: t
59
+ })]
60
+ });
61
+ }
62
+ function S({ snapshot: e, dispatch: n }) {
63
+ return /* @__PURE__ */ h(c, {
64
+ gap: 1,
65
+ width: "100%",
66
+ children: [
67
+ /* @__PURE__ */ m(x, {
68
+ label: "configured",
69
+ value: e.configured ? "yes" : "no"
70
+ }),
71
+ /* @__PURE__ */ m(x, {
72
+ label: "available",
73
+ value: e.available ? "yes" : "no"
74
+ }),
75
+ /* @__PURE__ */ m(x, {
76
+ label: "evm",
77
+ value: v(e.evmAddress)
78
+ }),
79
+ !e.connected && !e.loading ? /* @__PURE__ */ m(s, {
80
+ tone: "muted",
81
+ style: "caption",
82
+ wrap: !0,
83
+ children: "Set STEWARD_API_URL and STEWARD_API_KEY to enable vault approvals."
84
+ }) : null,
85
+ /* @__PURE__ */ m(r, { label: "pending approvals" }),
86
+ e.pendingApprovals.length === 0 ? /* @__PURE__ */ m(s, {
87
+ tone: "muted",
88
+ align: "center",
89
+ style: "caption",
90
+ children: e.loading ? "Loading" : "None"
91
+ }) : /* @__PURE__ */ m(a, {
92
+ gap: 1,
93
+ width: "100%",
94
+ children: e.pendingApprovals.map((e) => /* @__PURE__ */ h(c, {
95
+ gap: 0,
96
+ width: "100%",
97
+ agent: `approval-${e.queueId}`,
98
+ children: [
99
+ /* @__PURE__ */ h(i, {
100
+ gap: 1,
101
+ align: "center",
102
+ width: "100%",
103
+ children: [/* @__PURE__ */ m(s, {
104
+ bold: !0,
105
+ grow: 1,
106
+ wrap: !1,
107
+ children: e.txId
108
+ }), /* @__PURE__ */ m(s, {
109
+ style: "caption",
110
+ tone: _(e.status),
111
+ children: e.status
112
+ })]
113
+ }),
114
+ /* @__PURE__ */ h(i, {
115
+ gap: 1,
116
+ align: "center",
117
+ width: "100%",
118
+ children: [/* @__PURE__ */ h(s, {
119
+ style: "caption",
120
+ tone: "muted",
121
+ grow: 1,
122
+ wrap: !1,
123
+ children: [
124
+ "chain ",
125
+ e.chainId,
126
+ " to ",
127
+ e.to
128
+ ]
129
+ }), /* @__PURE__ */ m(t, {
130
+ variant: "ghost",
131
+ tone: "default",
132
+ agent: `copy-${e.queueId}`,
133
+ onPress: n(`copy:${e.to}`),
134
+ children: "Copy"
135
+ })]
136
+ }),
137
+ /* @__PURE__ */ h(s, {
138
+ style: "caption",
139
+ tone: "muted",
140
+ wrap: !1,
141
+ children: [
142
+ "value ",
143
+ e.value,
144
+ " | ",
145
+ e.policyCount,
146
+ " policy"
147
+ ]
148
+ }),
149
+ /* @__PURE__ */ h(i, {
150
+ gap: 1,
151
+ width: "100%",
152
+ children: [/* @__PURE__ */ m(t, {
153
+ tone: "primary",
154
+ grow: 1,
155
+ agent: `approve-${e.queueId}`,
156
+ onPress: n(`approve:${e.queueId}`),
157
+ children: "Approve"
158
+ }), /* @__PURE__ */ m(t, {
159
+ variant: "outline",
160
+ tone: "danger",
161
+ grow: 1,
162
+ agent: `reject-${e.queueId}`,
163
+ onPress: n(`reject:${e.queueId}`),
164
+ children: "Reject"
165
+ })]
166
+ })
167
+ ]
168
+ }, e.queueId))
169
+ })
170
+ ]
171
+ });
172
+ }
173
+ function C({ snapshot: e, dispatch: n }) {
174
+ let o = e.pageSize || g, l = Math.max(1, Math.ceil(e.historyTotal / o)), u = `page ${e.page + 1}/${l}`;
175
+ return /* @__PURE__ */ h(c, {
176
+ gap: 1,
177
+ width: "100%",
178
+ children: [
179
+ /* @__PURE__ */ h(i, {
180
+ gap: 1,
181
+ align: "center",
182
+ width: "100%",
183
+ children: [
184
+ /* @__PURE__ */ h(s, {
185
+ style: "caption",
186
+ tone: "muted",
187
+ grow: 1,
188
+ children: [e.historyTotal, " records"]
189
+ }),
190
+ /* @__PURE__ */ h(t, {
191
+ variant: "outline",
192
+ tone: "default",
193
+ agent: "filter-status",
194
+ onPress: n("filter-status"),
195
+ children: ["status: ", e.statusFilter ?? "all"]
196
+ }),
197
+ /* @__PURE__ */ h(t, {
198
+ variant: "outline",
199
+ tone: "default",
200
+ agent: "filter-chain",
201
+ onPress: n("filter-chain"),
202
+ children: ["chain: ", e.chainFilter ?? "all"]
203
+ })
204
+ ]
205
+ }),
206
+ /* @__PURE__ */ m(r, { label: "transaction history" }),
207
+ e.history.length === 0 ? /* @__PURE__ */ m(s, {
208
+ tone: "muted",
209
+ align: "center",
210
+ style: "caption",
211
+ children: e.loading ? "Loading" : "None"
212
+ }) : /* @__PURE__ */ m(a, {
213
+ gap: 1,
214
+ width: "100%",
215
+ children: e.history.map((e) => /* @__PURE__ */ h(c, {
216
+ gap: 0,
217
+ width: "100%",
218
+ agent: `tx-${e.id}`,
219
+ children: [
220
+ /* @__PURE__ */ h(i, {
221
+ gap: 1,
222
+ align: "center",
223
+ width: "100%",
224
+ children: [
225
+ /* @__PURE__ */ m(s, {
226
+ bold: !0,
227
+ grow: 1,
228
+ wrap: !1,
229
+ children: e.id
230
+ }),
231
+ /* @__PURE__ */ m(s, {
232
+ style: "caption",
233
+ tone: _(e.status),
234
+ children: e.status
235
+ }),
236
+ /* @__PURE__ */ m(t, {
237
+ variant: "ghost",
238
+ tone: "default",
239
+ agent: `copy-${e.id}`,
240
+ onPress: n(`copy:${e.to}`),
241
+ children: "Copy"
242
+ })
243
+ ]
244
+ }),
245
+ /* @__PURE__ */ h(s, {
246
+ style: "caption",
247
+ tone: "muted",
248
+ wrap: !1,
249
+ children: [
250
+ "chain ",
251
+ e.chainId,
252
+ " to ",
253
+ e.to
254
+ ]
255
+ }),
256
+ e.txHash ? /* @__PURE__ */ h(s, {
257
+ style: "caption",
258
+ tone: "muted",
259
+ wrap: !1,
260
+ children: ["hash ", e.txHash]
261
+ }) : null
262
+ ]
263
+ }, e.id))
264
+ }),
265
+ /* @__PURE__ */ h(i, {
266
+ gap: 1,
267
+ align: "center",
268
+ width: "100%",
269
+ children: [
270
+ /* @__PURE__ */ m(t, {
271
+ variant: "outline",
272
+ tone: "default",
273
+ disabled: e.page <= 0,
274
+ agent: "page-prev",
275
+ onPress: n("page-prev"),
276
+ children: "Prev"
277
+ }),
278
+ /* @__PURE__ */ m(s, {
279
+ style: "caption",
280
+ tone: "muted",
281
+ align: "center",
282
+ grow: 1,
283
+ children: u
284
+ }),
285
+ /* @__PURE__ */ m(t, {
286
+ variant: "outline",
287
+ tone: "default",
288
+ disabled: e.page + 1 >= l,
289
+ agent: "page-next",
290
+ onPress: n("page-next"),
291
+ children: "Next"
292
+ })
293
+ ]
294
+ })
295
+ ]
296
+ });
297
+ }
298
+ function w({ snapshot: e, onAction: a }) {
299
+ let o = (e) => () => a?.(e), c = e.tab === "approvals" ? "Approvals" : "History";
300
+ return /* @__PURE__ */ h(n, {
301
+ gap: 1,
302
+ padding: 1,
303
+ children: [
304
+ /* @__PURE__ */ h(i, {
305
+ gap: 1,
306
+ align: "center",
307
+ width: "100%",
308
+ children: [/* @__PURE__ */ m(s, {
309
+ style: "caption",
310
+ tone: e.connected ? "success" : "danger",
311
+ grow: 1,
312
+ children: e.connected ? "connected" : "not-connected"
313
+ }), /* @__PURE__ */ m(s, {
314
+ style: "caption",
315
+ tone: "muted",
316
+ children: v(e.evmAddress)
317
+ })]
318
+ }),
319
+ e.error ? /* @__PURE__ */ m(s, {
320
+ tone: "danger",
321
+ style: "caption",
322
+ wrap: !0,
323
+ children: e.error
324
+ }) : null,
325
+ /* @__PURE__ */ h(i, {
326
+ gap: 1,
327
+ width: "100%",
328
+ wrap: !0,
329
+ children: [
330
+ /* @__PURE__ */ h(t, {
331
+ variant: e.tab === "approvals" ? "solid" : "outline",
332
+ tone: e.tab === "approvals" ? "primary" : "default",
333
+ grow: 1,
334
+ agent: "tab-approvals",
335
+ onPress: o("tab:approvals"),
336
+ children: [
337
+ "Approvals (",
338
+ e.pendingApprovals.length,
339
+ ")"
340
+ ]
341
+ }),
342
+ /* @__PURE__ */ h(t, {
343
+ variant: e.tab === "history" ? "solid" : "outline",
344
+ tone: e.tab === "history" ? "primary" : "default",
345
+ grow: 1,
346
+ agent: "tab-history",
347
+ onPress: o("tab:history"),
348
+ children: [
349
+ "History (",
350
+ e.historyTotal,
351
+ ")"
352
+ ]
353
+ }),
354
+ /* @__PURE__ */ m(t, {
355
+ variant: "ghost",
356
+ tone: "default",
357
+ agent: "refresh",
358
+ onPress: o("refresh"),
359
+ children: e.loading ? "..." : "Refresh"
360
+ })
361
+ ]
362
+ }),
363
+ /* @__PURE__ */ m(r, { label: c }),
364
+ e.tab === "approvals" ? /* @__PURE__ */ m(S, {
365
+ snapshot: e,
366
+ dispatch: o
367
+ }) : /* @__PURE__ */ m(C, {
368
+ snapshot: e,
369
+ dispatch: o
370
+ })
371
+ ]
372
+ });
373
+ }
374
+ //#endregion
375
+ //#region src/StewardView.tsx
376
+ var T = 25, E = [
377
+ null,
378
+ "pending",
379
+ "signed",
380
+ "broadcast",
381
+ "confirmed",
382
+ "rejected",
383
+ "failed"
384
+ ], D = [
385
+ null,
386
+ 1,
387
+ 8453,
388
+ 56,
389
+ 137,
390
+ 42161,
391
+ 101
392
+ ];
393
+ function O(e, t) {
394
+ return e[(e.findIndex((e) => e === t) + 1) % e.length];
395
+ }
396
+ function k() {
397
+ let { getStewardStatus: t, getStewardHistory: n, getStewardPending: r, approveStewardTx: i, rejectStewardTx: a, copyToClipboard: s, setActionNotice: c } = e((e) => ({
398
+ getStewardStatus: e.getStewardStatus,
399
+ getStewardHistory: e.getStewardHistory,
400
+ getStewardPending: e.getStewardPending,
401
+ approveStewardTx: e.approveStewardTx,
402
+ rejectStewardTx: e.rejectStewardTx,
403
+ copyToClipboard: e.copyToClipboard,
404
+ setActionNotice: e.setActionNotice
405
+ })), [h, g] = p("approvals"), [_, v] = p(null), [x, S] = p([]), [C, k] = p([]), [A, j] = p(null), [M, N] = p(null), [P, F] = p(0), [I, L] = p(!1), [R, z] = p(null), B = f(0), V = l(async () => {
406
+ L(!0), z(null);
407
+ try {
408
+ let e = await t();
409
+ if (v(e), !e.connected) {
410
+ S([]), k([]);
411
+ return;
412
+ }
413
+ let [i, a] = await Promise.all([r(), n({
414
+ status: A ?? void 0,
415
+ limit: 200,
416
+ offset: 0
417
+ })]), o = Array.isArray(i) ? i : [], s = B.current;
418
+ if (o.length > s && s > 0) {
419
+ let e = o.length - s;
420
+ c(`${e} new approval${e > 1 ? "s" : ""} pending`, "info", 3e3);
421
+ }
422
+ B.current = o.length, S(o), k(a.records ?? []);
423
+ } catch (e) {
424
+ z(e instanceof Error ? e.message : "Steward refresh failed");
425
+ } finally {
426
+ L(!1);
427
+ }
428
+ }, [
429
+ t,
430
+ r,
431
+ n,
432
+ A,
433
+ c
434
+ ]);
435
+ u(() => {
436
+ V();
437
+ let e = setInterval(() => void V(), 2e4);
438
+ return () => clearInterval(e);
439
+ }, [V]);
440
+ let H = l(async (e) => {
441
+ let t = x.find((t) => t.queueId === e)?.transaction.id;
442
+ if (t) try {
443
+ let n = await i(t);
444
+ n.ok === !1 ? c(n.error ?? "Approval failed", "error", 4e3) : (c("Transaction approved", "success", 3e3), S((t) => t.filter((t) => t.queueId !== e)), B.current = Math.max(0, B.current - 1));
445
+ } catch (e) {
446
+ c(e instanceof Error ? e.message : "Approval failed", "error", 4e3);
447
+ }
448
+ }, [
449
+ x,
450
+ i,
451
+ c
452
+ ]), U = l(async (e) => {
453
+ let t = x.find((t) => t.queueId === e)?.transaction.id;
454
+ if (t) try {
455
+ let n = await a(t);
456
+ n.ok === !1 ? c(n.error ?? "Rejection failed", "error", 4e3) : (c("Transaction rejected", "info", 3e3), S((t) => t.filter((t) => t.queueId !== e)), B.current = Math.max(0, B.current - 1));
457
+ } catch (e) {
458
+ c(e instanceof Error ? e.message : "Rejection failed", "error", 4e3);
459
+ }
460
+ }, [
461
+ x,
462
+ a,
463
+ c
464
+ ]), W = l(async (e) => {
465
+ e && (await s(e), c("Address copied", "success", 2e3));
466
+ }, [s, c]), G = l((e) => {
467
+ if (e.startsWith("approve:")) {
468
+ H(e.slice(8));
469
+ return;
470
+ }
471
+ if (e.startsWith("reject:")) {
472
+ U(e.slice(7));
473
+ return;
474
+ }
475
+ if (e.startsWith("copy:")) {
476
+ W(e.slice(5));
477
+ return;
478
+ }
479
+ switch (e) {
480
+ case "tab:approvals":
481
+ g("approvals");
482
+ return;
483
+ case "tab:history":
484
+ g("history");
485
+ return;
486
+ case "refresh":
487
+ V();
488
+ return;
489
+ case "filter-status":
490
+ j((e) => O(E, e)), F(0);
491
+ return;
492
+ case "filter-chain":
493
+ N((e) => O(D, e)), F(0);
494
+ return;
495
+ case "page-prev":
496
+ F((e) => Math.max(0, e - 1));
497
+ return;
498
+ case "page-next":
499
+ F((e) => e + 1);
500
+ return;
501
+ }
502
+ }, [
503
+ H,
504
+ U,
505
+ W,
506
+ V
507
+ ]), K = d(() => C.filter((e) => M === null || e.request.chainId === M).map(b).sort((e, t) => new Date(t.createdAt).getTime() - new Date(e.createdAt).getTime()), [C, M]), q = Math.max(1, Math.ceil(K.length / T)), J = Math.min(P, q - 1), Y = K.slice(J * T, (J + 1) * T);
508
+ return /* @__PURE__ */ m(o, { children: /* @__PURE__ */ m(w, {
509
+ snapshot: {
510
+ tab: h,
511
+ connected: _?.connected ?? !1,
512
+ configured: _?.configured ?? !1,
513
+ available: _?.available ?? !1,
514
+ evmAddress: _?.evmAddress ?? null,
515
+ pendingApprovals: x.map(y),
516
+ history: Y,
517
+ historyTotal: K.length,
518
+ statusFilter: A,
519
+ chainFilter: M,
520
+ page: J,
521
+ pageSize: T,
522
+ loading: I,
523
+ error: R ?? _?.error ?? null
524
+ },
525
+ onAction: G
526
+ }) });
527
+ }
528
+ //#endregion
529
+ //#region src/StewardView.helpers.ts
530
+ async function A(e) {
531
+ let t = await fetch(e), n = await t.json().catch(() => ({}));
532
+ if (!t.ok) {
533
+ let e = n && typeof n == "object" && "error" in n ? String(n.error) : `Steward request failed with ${t.status}`;
534
+ throw Error(e);
535
+ }
536
+ return n;
537
+ }
538
+ async function j(e, t) {
539
+ let n = await fetch(e, {
540
+ method: "POST",
541
+ headers: { "Content-Type": "application/json" },
542
+ body: JSON.stringify(t)
543
+ }), r = await n.json().catch(() => ({}));
544
+ if (!n.ok) {
545
+ let e = r && typeof r == "object" && "error" in r ? String(r.error) : `Steward request failed with ${n.status}`;
546
+ throw Error(e);
547
+ }
548
+ return r;
549
+ }
550
+ async function M() {
551
+ let e = await A("/api/wallet/steward-status");
552
+ if (!e.connected) return {
553
+ status: e,
554
+ pending: [],
555
+ history: null
556
+ };
557
+ let [t, n] = await Promise.all([A("/api/wallet/steward-pending-approvals"), A("/api/wallet/steward-tx-records?limit=25&offset=0")]);
558
+ return {
559
+ status: e,
560
+ pending: t,
561
+ history: n
562
+ };
563
+ }
564
+ //#endregion
565
+ //#region src/StewardView.interact.ts
566
+ async function N(e, t) {
567
+ if (e === "terminal-steward-state") return {
568
+ viewType: "tui",
569
+ ...await M()
570
+ };
571
+ if (e === "terminal-steward-pending") return {
572
+ viewType: "tui",
573
+ pending: await A("/api/wallet/steward-pending-approvals")
574
+ };
575
+ if (e === "terminal-steward-history") {
576
+ let e = typeof t?.status == "string" ? t.status : "", n = typeof t?.limit == "number" ? t.limit : 50, r = typeof t?.offset == "number" ? t.offset : 0, i = new URLSearchParams({
577
+ limit: String(n),
578
+ offset: String(r)
579
+ });
580
+ return e && i.set("status", e), {
581
+ viewType: "tui",
582
+ history: await A(`/api/wallet/steward-tx-records?${i}`)
583
+ };
584
+ }
585
+ if (e === "terminal-steward-approve" || e === "terminal-steward-deny") {
586
+ let n = typeof t?.txId == "string" ? t.txId.trim() : "";
587
+ if (!n) throw Error("txId is required");
588
+ return {
589
+ viewType: "tui",
590
+ result: await j(e === "terminal-steward-deny" ? "/api/wallet/steward-deny-tx" : "/api/wallet/steward-approve-tx", {
591
+ txId: n,
592
+ reason: typeof t?.reason == "string" ? t.reason : void 0
593
+ })
594
+ };
595
+ }
596
+ throw Error(`Unsupported capability "${e}"`);
597
+ }
598
+ //#endregion
599
+ export { k as StewardView, N as interact };
600
+
601
+ //# sourceMappingURL=bundle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle.js","names":[],"sources":["../../src/components/StewardSpatialView.tsx","../../src/StewardView.tsx","../../src/StewardView.helpers.ts","../../src/StewardView.interact.ts"],"sourcesContent":["/**\n * StewardSpatialView — the Steward approvals + history panel authored once with\n * the spatial vocabulary, so it renders correctly wherever it is displayed:\n *\n * - GUI / XR - mounted in `<SpatialSurface>` (DOM; XR scales up).\n * - TUI - rendered to real terminal lines by the agent terminal, via\n * `registerSpatialTerminalView` (see `register-terminal-view.tsx`).\n *\n * It is purely presentational (a snapshot + an action callback in, primitives\n * out) and imports only the cross-modality primitives plus type-only views of\n * the Steward response shapes, so it is safe to render in the Node agent process\n * where the terminal lives (no browser/app-runtime import).\n */\n\nimport {\n Button,\n Card,\n Divider,\n HStack,\n List,\n type SpatialTone,\n Text,\n VStack,\n} from \"@elizaos/ui/spatial\";\nimport type {\n StewardPendingApproval,\n StewardTxRecord,\n StewardTxStatus,\n} from \"../types/steward.ts\";\n\n/** A pending-approval row in the snapshot (mirrors the loopback pending shape). */\nexport interface StewardApprovalRow {\n queueId: string;\n requestedAt: string;\n txId: string;\n status: string;\n chainId: number;\n to: string;\n value: string;\n /** Count of policy results attached to the transaction. */\n policyCount: number;\n}\n\n/** A history row in the snapshot (mirrors the loopback tx-record shape). */\nexport interface StewardHistoryRow {\n id: string;\n createdAt: string;\n status: StewardTxStatus;\n chainId: number;\n to: string;\n value: string;\n txHash?: string;\n}\n\nexport interface StewardSnapshot {\n /** Active tab — Approvals or History. */\n tab: \"approvals\" | \"history\";\n connected: boolean;\n configured: boolean;\n available: boolean;\n evmAddress: string | null;\n pendingApprovals: StewardApprovalRow[];\n history: StewardHistoryRow[];\n /** Total history records (for pagination, not the visible slice length). */\n historyTotal: number;\n /** Active history filters. */\n statusFilter: string | null;\n chainFilter: number | null;\n /** 0-based page index. */\n page: number;\n pageSize: number;\n loading?: boolean;\n error?: string | null;\n}\n\nconst PAGE_SIZE = 25;\n\nfunction statusTone(status: string): SpatialTone {\n switch (status) {\n case \"confirmed\":\n case \"broadcast\":\n case \"approved\":\n case \"signed\":\n return \"success\";\n case \"failed\":\n case \"rejected\":\n return \"danger\";\n case \"pending\":\n return \"warning\";\n default:\n return \"muted\";\n }\n}\n\nfunction shortAddress(value: string | null | undefined): string {\n if (!value) return \"no steward evm address\";\n if (value.length <= 12) return value;\n return `${value.slice(0, 6)}..${value.slice(-4)}`;\n}\n\n/** Map a native pending-approval entry to the presentational row shape. */\nexport function toStewardApprovalRow(\n entry: StewardPendingApproval,\n): StewardApprovalRow {\n const tx = entry.transaction;\n return {\n queueId: entry.queueId,\n requestedAt: entry.requestedAt,\n txId: tx.id,\n status: tx.status,\n chainId: tx.request.chainId,\n to: tx.request.to,\n value: tx.request.value,\n policyCount: tx.policyResults.length,\n };\n}\n\n/** Map a native tx record to the presentational history row shape. */\nexport function toStewardHistoryRow(\n record: StewardTxRecord,\n): StewardHistoryRow {\n return {\n id: record.id,\n createdAt: record.createdAt,\n status: record.status,\n chainId: record.request.chainId,\n to: record.request.to,\n value: record.request.value,\n txHash: record.txHash,\n };\n}\n\nexport interface StewardSpatialViewProps {\n snapshot: StewardSnapshot;\n /**\n * Dispatch by agent id: `tab:approvals`, `tab:history`, `refresh`,\n * `approve:<queueId>`, `reject:<queueId>`, `copy:<value>`,\n * `filter-status`, `filter-chain`, `page-prev`, `page-next`.\n *\n * `copy:<value>` carries the literal string to copy to the clipboard (the\n * recipient address for both approval and history rows).\n */\n onAction?: (action: string) => void;\n}\n\nfunction StatusLine({ label, value }: { label: string; value: string }) {\n return (\n <HStack gap={1} align=\"center\">\n <Text style=\"caption\" tone=\"muted\">\n {label}\n </Text>\n <Text style=\"caption\" grow={1} wrap={false}>\n {value}\n </Text>\n </HStack>\n );\n}\n\nfunction ApprovalsBody({\n snapshot,\n dispatch,\n}: {\n snapshot: StewardSnapshot;\n dispatch: (action: string) => () => void;\n}) {\n return (\n <VStack gap={1} width=\"100%\">\n <StatusLine\n label=\"configured\"\n value={snapshot.configured ? \"yes\" : \"no\"}\n />\n <StatusLine label=\"available\" value={snapshot.available ? \"yes\" : \"no\"} />\n <StatusLine label=\"evm\" value={shortAddress(snapshot.evmAddress)} />\n\n {!snapshot.connected && !snapshot.loading ? (\n <Text tone=\"muted\" style=\"caption\" wrap>\n Set STEWARD_API_URL and STEWARD_API_KEY to enable vault approvals.\n </Text>\n ) : null}\n\n <Divider label=\"pending approvals\" />\n {snapshot.pendingApprovals.length === 0 ? (\n <Text tone=\"muted\" align=\"center\" style=\"caption\">\n {snapshot.loading ? \"Loading\" : \"None\"}\n </Text>\n ) : (\n <List gap={1} width=\"100%\">\n {snapshot.pendingApprovals.map((item) => (\n <VStack\n key={item.queueId}\n gap={0}\n width=\"100%\"\n agent={`approval-${item.queueId}`}\n >\n <HStack gap={1} align=\"center\" width=\"100%\">\n <Text bold grow={1} wrap={false}>\n {item.txId}\n </Text>\n <Text style=\"caption\" tone={statusTone(item.status)}>\n {item.status}\n </Text>\n </HStack>\n <HStack gap={1} align=\"center\" width=\"100%\">\n <Text style=\"caption\" tone=\"muted\" grow={1} wrap={false}>\n chain {item.chainId} to {item.to}\n </Text>\n <Button\n variant=\"ghost\"\n tone=\"default\"\n agent={`copy-${item.queueId}`}\n onPress={dispatch(`copy:${item.to}`)}\n >\n Copy\n </Button>\n </HStack>\n <Text style=\"caption\" tone=\"muted\" wrap={false}>\n value {item.value} | {item.policyCount} policy\n </Text>\n <HStack gap={1} width=\"100%\">\n <Button\n tone=\"primary\"\n grow={1}\n agent={`approve-${item.queueId}`}\n onPress={dispatch(`approve:${item.queueId}`)}\n >\n Approve\n </Button>\n <Button\n variant=\"outline\"\n tone=\"danger\"\n grow={1}\n agent={`reject-${item.queueId}`}\n onPress={dispatch(`reject:${item.queueId}`)}\n >\n Reject\n </Button>\n </HStack>\n </VStack>\n ))}\n </List>\n )}\n </VStack>\n );\n}\n\nfunction HistoryBody({\n snapshot,\n dispatch,\n}: {\n snapshot: StewardSnapshot;\n dispatch: (action: string) => () => void;\n}) {\n const pageSize = snapshot.pageSize || PAGE_SIZE;\n const totalPages = Math.max(1, Math.ceil(snapshot.historyTotal / pageSize));\n const pageLabel = `page ${snapshot.page + 1}/${totalPages}`;\n return (\n <VStack gap={1} width=\"100%\">\n <HStack gap={1} align=\"center\" width=\"100%\">\n <Text style=\"caption\" tone=\"muted\" grow={1}>\n {snapshot.historyTotal} records\n </Text>\n <Button\n variant=\"outline\"\n tone=\"default\"\n agent=\"filter-status\"\n onPress={dispatch(\"filter-status\")}\n >\n status: {snapshot.statusFilter ?? \"all\"}\n </Button>\n <Button\n variant=\"outline\"\n tone=\"default\"\n agent=\"filter-chain\"\n onPress={dispatch(\"filter-chain\")}\n >\n chain: {snapshot.chainFilter ?? \"all\"}\n </Button>\n </HStack>\n\n <Divider label=\"transaction history\" />\n {snapshot.history.length === 0 ? (\n <Text tone=\"muted\" align=\"center\" style=\"caption\">\n {snapshot.loading ? \"Loading\" : \"None\"}\n </Text>\n ) : (\n <List gap={1} width=\"100%\">\n {snapshot.history.map((tx) => (\n <VStack key={tx.id} gap={0} width=\"100%\" agent={`tx-${tx.id}`}>\n <HStack gap={1} align=\"center\" width=\"100%\">\n <Text bold grow={1} wrap={false}>\n {tx.id}\n </Text>\n <Text style=\"caption\" tone={statusTone(tx.status)}>\n {tx.status}\n </Text>\n <Button\n variant=\"ghost\"\n tone=\"default\"\n agent={`copy-${tx.id}`}\n onPress={dispatch(`copy:${tx.to}`)}\n >\n Copy\n </Button>\n </HStack>\n <Text style=\"caption\" tone=\"muted\" wrap={false}>\n chain {tx.chainId} to {tx.to}\n </Text>\n {tx.txHash ? (\n <Text style=\"caption\" tone=\"muted\" wrap={false}>\n hash {tx.txHash}\n </Text>\n ) : null}\n </VStack>\n ))}\n </List>\n )}\n\n <HStack gap={1} align=\"center\" width=\"100%\">\n <Button\n variant=\"outline\"\n tone=\"default\"\n disabled={snapshot.page <= 0}\n agent=\"page-prev\"\n onPress={dispatch(\"page-prev\")}\n >\n Prev\n </Button>\n <Text style=\"caption\" tone=\"muted\" align=\"center\" grow={1}>\n {pageLabel}\n </Text>\n <Button\n variant=\"outline\"\n tone=\"default\"\n disabled={snapshot.page + 1 >= totalPages}\n agent=\"page-next\"\n onPress={dispatch(\"page-next\")}\n >\n Next\n </Button>\n </HStack>\n </VStack>\n );\n}\n\nexport function StewardSpatialView({\n snapshot,\n onAction,\n}: StewardSpatialViewProps) {\n const dispatch = (action: string) => () => onAction?.(action);\n const title = snapshot.tab === \"approvals\" ? \"Approvals\" : \"History\";\n return (\n <Card gap={1} padding={1}>\n <HStack gap={1} align=\"center\" width=\"100%\">\n <Text\n style=\"caption\"\n tone={snapshot.connected ? \"success\" : \"danger\"}\n grow={1}\n >\n {snapshot.connected ? \"connected\" : \"not-connected\"}\n </Text>\n <Text style=\"caption\" tone=\"muted\">\n {shortAddress(snapshot.evmAddress)}\n </Text>\n </HStack>\n\n {snapshot.error ? (\n <Text tone=\"danger\" style=\"caption\" wrap>\n {snapshot.error}\n </Text>\n ) : null}\n\n <HStack gap={1} width=\"100%\" wrap>\n <Button\n variant={snapshot.tab === \"approvals\" ? \"solid\" : \"outline\"}\n tone={snapshot.tab === \"approvals\" ? \"primary\" : \"default\"}\n grow={1}\n agent=\"tab-approvals\"\n onPress={dispatch(\"tab:approvals\")}\n >\n Approvals ({snapshot.pendingApprovals.length})\n </Button>\n <Button\n variant={snapshot.tab === \"history\" ? \"solid\" : \"outline\"}\n tone={snapshot.tab === \"history\" ? \"primary\" : \"default\"}\n grow={1}\n agent=\"tab-history\"\n onPress={dispatch(\"tab:history\")}\n >\n History ({snapshot.historyTotal})\n </Button>\n <Button\n variant=\"ghost\"\n tone=\"default\"\n agent=\"refresh\"\n onPress={dispatch(\"refresh\")}\n >\n {snapshot.loading ? \"...\" : \"Refresh\"}\n </Button>\n </HStack>\n\n <Divider label={title} />\n\n {snapshot.tab === \"approvals\" ? (\n <ApprovalsBody snapshot={snapshot} dispatch={dispatch} />\n ) : (\n <HistoryBody snapshot={snapshot} dispatch={dispatch} />\n )}\n </Card>\n );\n}\n","/**\n * StewardView — the single GUI/XR data wrapper for the Steward surface.\n *\n * It owns the live vault data (status, pending approvals, transaction history)\n * read through the app store accessors, builds one {@link StewardSnapshot}, and\n * renders the one presentational {@link StewardSpatialView} inside a\n * {@link SpatialSurface}. Omitting the `modality` prop lets `SpatialSurface`\n * auto-detect GUI vs XR via `window.__elizaXRContext`, so the SAME component\n * serves both surfaces. The TUI surface renders the same `StewardSpatialView`\n * through the terminal registry (see `register-terminal-view.tsx`).\n */\n\nimport { useAppSelectorShallow } from \"@elizaos/ui\";\nimport { SpatialSurface } from \"@elizaos/ui/spatial\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n type StewardHistoryRow,\n StewardSpatialView,\n type StewardSnapshot,\n toStewardApprovalRow,\n toStewardHistoryRow,\n} from \"./components/StewardSpatialView.tsx\";\nimport type {\n StewardApprovalActionResponse,\n StewardPendingApproval,\n StewardStatusResponse,\n StewardTxRecord,\n} from \"./types/steward\";\n\ntype StewardTab = \"approvals\" | \"history\";\n\nconst PAGE_SIZE = 25;\n\n/** Status filter cycle for the history tab (null = all). */\nconst STATUS_CYCLE: Array<string | null> = [\n null,\n \"pending\",\n \"signed\",\n \"broadcast\",\n \"confirmed\",\n \"rejected\",\n \"failed\",\n];\n\n/** Chain filter cycle for the history tab (null = all). */\nconst CHAIN_CYCLE: Array<number | null> = [\n null,\n 1,\n 8453,\n 56,\n 137,\n 42161,\n 101,\n];\n\nfunction nextInCycle<T>(cycle: T[], current: T): T {\n const idx = cycle.findIndex((value) => value === current);\n return cycle[(idx + 1) % cycle.length];\n}\n\ninterface StewardStore {\n getStewardStatus: () => Promise<StewardStatusResponse>;\n getStewardHistory: (opts?: {\n status?: string;\n limit?: number;\n offset?: number;\n }) => Promise<{\n records: StewardTxRecord[];\n total: number;\n offset: number;\n limit: number;\n }>;\n getStewardPending: () => Promise<StewardPendingApproval[]>;\n approveStewardTx: (txId: string) => Promise<StewardApprovalActionResponse>;\n rejectStewardTx: (\n txId: string,\n reason?: string,\n ) => Promise<StewardApprovalActionResponse>;\n copyToClipboard: (text: string) => Promise<void>;\n setActionNotice: (\n text: string,\n tone?: \"info\" | \"success\" | \"error\",\n ttlMs?: number,\n ) => void;\n}\n\nexport function StewardView() {\n const {\n getStewardStatus,\n getStewardHistory,\n getStewardPending,\n approveStewardTx,\n rejectStewardTx,\n copyToClipboard,\n setActionNotice,\n } = useAppSelectorShallow((s: StewardStore) => ({\n getStewardStatus: s.getStewardStatus,\n getStewardHistory: s.getStewardHistory,\n getStewardPending: s.getStewardPending,\n approveStewardTx: s.approveStewardTx,\n rejectStewardTx: s.rejectStewardTx,\n copyToClipboard: s.copyToClipboard,\n setActionNotice: s.setActionNotice,\n }));\n\n const [tab, setTab] = useState<StewardTab>(\"approvals\");\n const [status, setStatus] = useState<StewardStatusResponse | null>(null);\n const [pending, setPending] = useState<StewardPendingApproval[]>([]);\n const [history, setHistory] = useState<StewardTxRecord[]>([]);\n const [statusFilter, setStatusFilter] = useState<string | null>(null);\n const [chainFilter, setChainFilter] = useState<number | null>(null);\n const [page, setPage] = useState(0);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const prevCountRef = useRef(0);\n\n const refresh = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const next = await getStewardStatus();\n setStatus(next);\n if (!next.connected) {\n setPending([]);\n setHistory([]);\n return;\n }\n const [nextPending, historyResult] = await Promise.all([\n getStewardPending(),\n getStewardHistory({\n status: statusFilter ?? undefined,\n limit: 200,\n offset: 0,\n }),\n ]);\n const pendingList = Array.isArray(nextPending) ? nextPending : [];\n const prevCount = prevCountRef.current;\n if (pendingList.length > prevCount && prevCount > 0) {\n const delta = pendingList.length - prevCount;\n setActionNotice(\n `${delta} new approval${delta > 1 ? \"s\" : \"\"} pending`,\n \"info\",\n 3000,\n );\n }\n prevCountRef.current = pendingList.length;\n setPending(pendingList);\n setHistory(historyResult.records ?? []);\n } catch (caught) {\n setError(\n caught instanceof Error ? caught.message : \"Steward refresh failed\",\n );\n } finally {\n setLoading(false);\n }\n }, [\n getStewardStatus,\n getStewardPending,\n getStewardHistory,\n statusFilter,\n setActionNotice,\n ]);\n\n // Initial load + a quiet 20s poll, torn down on unmount.\n useEffect(() => {\n void refresh();\n const interval = setInterval(() => void refresh(), 20_000);\n return () => clearInterval(interval);\n }, [refresh]);\n\n const handleApprove = useCallback(\n async (queueId: string) => {\n const entry = pending.find((item) => item.queueId === queueId);\n const txId = entry?.transaction.id;\n if (!txId) return;\n try {\n const result = await approveStewardTx(txId);\n if (result.ok !== false) {\n setActionNotice(\"Transaction approved\", \"success\", 3000);\n setPending((prev) =>\n prev.filter((item) => item.queueId !== queueId),\n );\n prevCountRef.current = Math.max(0, prevCountRef.current - 1);\n } else {\n setActionNotice(result.error ?? \"Approval failed\", \"error\", 4000);\n }\n } catch (caught) {\n setActionNotice(\n caught instanceof Error ? caught.message : \"Approval failed\",\n \"error\",\n 4000,\n );\n }\n },\n [pending, approveStewardTx, setActionNotice],\n );\n\n const handleReject = useCallback(\n async (queueId: string) => {\n const entry = pending.find((item) => item.queueId === queueId);\n const txId = entry?.transaction.id;\n if (!txId) return;\n try {\n const result = await rejectStewardTx(txId);\n if (result.ok !== false) {\n setActionNotice(\"Transaction rejected\", \"info\", 3000);\n setPending((prev) =>\n prev.filter((item) => item.queueId !== queueId),\n );\n prevCountRef.current = Math.max(0, prevCountRef.current - 1);\n } else {\n setActionNotice(result.error ?? \"Rejection failed\", \"error\", 4000);\n }\n } catch (caught) {\n setActionNotice(\n caught instanceof Error ? caught.message : \"Rejection failed\",\n \"error\",\n 4000,\n );\n }\n },\n [pending, rejectStewardTx, setActionNotice],\n );\n\n const handleCopy = useCallback(\n async (value: string) => {\n if (!value) return;\n await copyToClipboard(value);\n setActionNotice(\"Address copied\", \"success\", 2000);\n },\n [copyToClipboard, setActionNotice],\n );\n\n const onAction = useCallback(\n (action: string) => {\n if (action.startsWith(\"approve:\")) {\n void handleApprove(action.slice(\"approve:\".length));\n return;\n }\n if (action.startsWith(\"reject:\")) {\n void handleReject(action.slice(\"reject:\".length));\n return;\n }\n if (action.startsWith(\"copy:\")) {\n void handleCopy(action.slice(\"copy:\".length));\n return;\n }\n switch (action) {\n case \"tab:approvals\":\n setTab(\"approvals\");\n return;\n case \"tab:history\":\n setTab(\"history\");\n return;\n case \"refresh\":\n void refresh();\n return;\n case \"filter-status\":\n setStatusFilter((current) => nextInCycle(STATUS_CYCLE, current));\n setPage(0);\n return;\n case \"filter-chain\":\n setChainFilter((current) => nextInCycle(CHAIN_CYCLE, current));\n setPage(0);\n return;\n case \"page-prev\":\n setPage((p) => Math.max(0, p - 1));\n return;\n case \"page-next\":\n setPage((p) => p + 1);\n return;\n }\n },\n [handleApprove, handleReject, handleCopy, refresh],\n );\n\n // Client-side chain filter + newest-first sort, then paginate.\n const filteredHistory = useMemo(() => {\n const rows: StewardHistoryRow[] = history\n .filter(\n (tx) => chainFilter === null || tx.request.chainId === chainFilter,\n )\n .map(toStewardHistoryRow)\n .sort(\n (a, b) =>\n new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime(),\n );\n return rows;\n }, [history, chainFilter]);\n\n const pageCount = Math.max(1, Math.ceil(filteredHistory.length / PAGE_SIZE));\n const clampedPage = Math.min(page, pageCount - 1);\n const pageRows = filteredHistory.slice(\n clampedPage * PAGE_SIZE,\n (clampedPage + 1) * PAGE_SIZE,\n );\n\n const snapshot: StewardSnapshot = {\n tab,\n connected: status?.connected ?? false,\n configured: status?.configured ?? false,\n available: status?.available ?? false,\n evmAddress: status?.evmAddress ?? null,\n pendingApprovals: pending.map(toStewardApprovalRow),\n history: pageRows,\n historyTotal: filteredHistory.length,\n statusFilter,\n chainFilter,\n page: clampedPage,\n pageSize: PAGE_SIZE,\n loading,\n error: error ?? status?.error ?? null,\n };\n\n return (\n <SpatialSurface>\n <StewardSpatialView snapshot={snapshot} onAction={onAction} />\n </SpatialSurface>\n );\n}\n","// Shared data helpers for the Steward view, used by the `interact` capability\n// handler (in StewardView.interact.ts) that serves the terminal surface. Kept\n// out of the .tsx so that file exports only React components and stays\n// Fast-Refresh-compatible in dev.\nimport type {\n StewardPendingApproval,\n StewardStatusResponse,\n StewardTxRecord,\n} from \"./types/steward\";\n\nexport interface StewardTxRecordsResponse {\n records: StewardTxRecord[];\n total: number;\n offset: number;\n limit: number;\n}\n\nexport async function stewardJson<T>(url: string): Promise<T> {\n const response = await fetch(url);\n const data = await response.json().catch(() => ({}));\n if (!response.ok) {\n const message =\n data && typeof data === \"object\" && \"error\" in data\n ? String(data.error)\n : `Steward request failed with ${response.status}`;\n throw new Error(message);\n }\n return data as T;\n}\n\nexport async function postStewardJson<T>(\n url: string,\n body: Record<string, unknown>,\n): Promise<T> {\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n const data = await response.json().catch(() => ({}));\n if (!response.ok) {\n const message =\n data && typeof data === \"object\" && \"error\" in data\n ? String(data.error)\n : `Steward request failed with ${response.status}`;\n throw new Error(message);\n }\n return data as T;\n}\n\nexport async function loadStewardTuiState(): Promise<{\n status: StewardStatusResponse;\n pending: StewardPendingApproval[];\n history: StewardTxRecordsResponse | null;\n}> {\n const status = await stewardJson<StewardStatusResponse>(\n \"/api/wallet/steward-status\",\n );\n\n if (!status.connected) {\n return { status, pending: [], history: null };\n }\n\n const [pending, history] = await Promise.all([\n stewardJson<StewardPendingApproval[]>(\n \"/api/wallet/steward-pending-approvals\",\n ),\n stewardJson<StewardTxRecordsResponse>(\n \"/api/wallet/steward-tx-records?limit=25&offset=0\",\n ),\n ]);\n\n return { status, pending, history };\n}\n","// View-bundle `interact` capability handler, split out of StewardView.tsx so\n// that file exports only React components and stays Fast-Refresh-compatible\n// (Vite would full-reload a component file that also exports a plain function).\n// The view bundle re-exports `interact` via ./steward-view-bundle.ts.\nimport {\n loadStewardTuiState,\n postStewardJson,\n type StewardTxRecordsResponse,\n stewardJson,\n} from \"./StewardView.helpers\";\nimport type {\n StewardApprovalActionResponse,\n StewardPendingApproval,\n} from \"./types/steward\";\n\nexport async function interact(\n capability: string,\n params?: Record<string, unknown>,\n): Promise<unknown> {\n if (capability === \"terminal-steward-state\") {\n return { viewType: \"tui\", ...(await loadStewardTuiState()) };\n }\n\n if (capability === \"terminal-steward-pending\") {\n return {\n viewType: \"tui\",\n pending: await stewardJson<StewardPendingApproval[]>(\n \"/api/wallet/steward-pending-approvals\",\n ),\n };\n }\n\n if (capability === \"terminal-steward-history\") {\n const status = typeof params?.status === \"string\" ? params.status : \"\";\n const limit = typeof params?.limit === \"number\" ? params.limit : 50;\n const offset = typeof params?.offset === \"number\" ? params.offset : 0;\n const search = new URLSearchParams({\n limit: String(limit),\n offset: String(offset),\n });\n if (status) search.set(\"status\", status);\n return {\n viewType: \"tui\",\n history: await stewardJson<StewardTxRecordsResponse>(\n `/api/wallet/steward-tx-records?${search}`,\n ),\n };\n }\n\n if (\n capability === \"terminal-steward-approve\" ||\n capability === \"terminal-steward-deny\"\n ) {\n const txId = typeof params?.txId === \"string\" ? params.txId.trim() : \"\";\n if (!txId) throw new Error(\"txId is required\");\n const deny = capability === \"terminal-steward-deny\";\n return {\n viewType: \"tui\",\n result: await postStewardJson<StewardApprovalActionResponse>(\n deny ? \"/api/wallet/steward-deny-tx\" : \"/api/wallet/steward-approve-tx\",\n {\n txId,\n reason:\n typeof params?.reason === \"string\" ? params.reason : undefined,\n },\n ),\n };\n }\n\n throw new Error(`Unsupported capability \"${capability}\"`);\n}\n"],"mappings":"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"}