@shroud-fi/agent-runtime 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +71 -0
  3. package/dist/cjs/agent.d.ts +235 -0
  4. package/dist/cjs/agent.d.ts.map +1 -0
  5. package/dist/cjs/agent.js +594 -0
  6. package/dist/cjs/agent.js.map +1 -0
  7. package/dist/cjs/browser.d.ts +38 -0
  8. package/dist/cjs/browser.d.ts.map +1 -0
  9. package/dist/cjs/browser.js +94 -0
  10. package/dist/cjs/browser.js.map +1 -0
  11. package/dist/cjs/constants.d.ts +17 -0
  12. package/dist/cjs/constants.d.ts.map +1 -0
  13. package/dist/cjs/constants.js +20 -0
  14. package/dist/cjs/constants.js.map +1 -0
  15. package/dist/cjs/errors.d.ts +107 -0
  16. package/dist/cjs/errors.d.ts.map +1 -0
  17. package/dist/cjs/errors.js +152 -0
  18. package/dist/cjs/errors.js.map +1 -0
  19. package/dist/cjs/factory.d.ts +19 -0
  20. package/dist/cjs/factory.d.ts.map +1 -0
  21. package/dist/cjs/factory.js +46 -0
  22. package/dist/cjs/factory.js.map +1 -0
  23. package/dist/cjs/index.d.ts +6 -0
  24. package/dist/cjs/index.d.ts.map +1 -0
  25. package/dist/cjs/index.js +37 -0
  26. package/dist/cjs/index.js.map +1 -0
  27. package/dist/cjs/package.json +1 -0
  28. package/dist/cjs/types.d.ts +151 -0
  29. package/dist/cjs/types.d.ts.map +1 -0
  30. package/dist/cjs/types.js +10 -0
  31. package/dist/cjs/types.js.map +1 -0
  32. package/dist/esm/agent.d.ts +235 -0
  33. package/dist/esm/agent.d.ts.map +1 -0
  34. package/dist/esm/agent.js +557 -0
  35. package/dist/esm/agent.js.map +1 -0
  36. package/dist/esm/browser.d.ts +38 -0
  37. package/dist/esm/browser.d.ts.map +1 -0
  38. package/dist/esm/browser.js +87 -0
  39. package/dist/esm/browser.js.map +1 -0
  40. package/dist/esm/constants.d.ts +17 -0
  41. package/dist/esm/constants.d.ts.map +1 -0
  42. package/dist/esm/constants.js +17 -0
  43. package/dist/esm/constants.js.map +1 -0
  44. package/dist/esm/errors.d.ts +107 -0
  45. package/dist/esm/errors.d.ts.map +1 -0
  46. package/dist/esm/errors.js +137 -0
  47. package/dist/esm/errors.js.map +1 -0
  48. package/dist/esm/factory.d.ts +19 -0
  49. package/dist/esm/factory.d.ts.map +1 -0
  50. package/dist/esm/factory.js +43 -0
  51. package/dist/esm/factory.js.map +1 -0
  52. package/dist/esm/index.d.ts +6 -0
  53. package/dist/esm/index.d.ts.map +1 -0
  54. package/dist/esm/index.js +16 -0
  55. package/dist/esm/index.js.map +1 -0
  56. package/dist/esm/types.d.ts +151 -0
  57. package/dist/esm/types.d.ts.map +1 -0
  58. package/dist/esm/types.js +9 -0
  59. package/dist/esm/types.js.map +1 -0
  60. package/dist/tsconfig.cjs.tsbuildinfo +1 -0
  61. package/dist/tsconfig.esm.tsbuildinfo +1 -0
  62. package/dist/tsconfig.tsbuildinfo +1 -0
  63. package/package.json +72 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 ShroudFi contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,71 @@
1
+ # @shroud-fi/agent-runtime
2
+
3
+ > The high-level ShroudFi surface most projects integrate against.
4
+
5
+ [![npm](https://img.shields.io/npm/v/@shroud-fi/agent-runtime.svg)](https://www.npmjs.com/package/@shroud-fi/agent-runtime)
6
+ [![license: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](./LICENSE)
7
+
8
+ ```bash
9
+ npm i @shroud-fi/agent-runtime viem
10
+ ```
11
+
12
+ ## What it does
13
+
14
+ `@shroud-fi/agent-runtime` composes `@shroud-fi/core` + `@shroud-fi/payments` + `@shroud-fi/scanning` + `@shroud-fi/relayer` into a single `ShroudAgent` surface. One `createShroudAgent` call wires deterministic identity, transport, scanner, and sweep paths.
15
+
16
+ Most agents only need this package — the lower-level building blocks (`core`, `payments`, `scanning`) are available if you need finer control.
17
+
18
+ ## Quick start
19
+
20
+ ```ts
21
+ import { createShroudAgent } from '@shroud-fi/agent-runtime';
22
+
23
+ const agent = await createShroudAgent({
24
+ chain: 'base',
25
+ masterSeed: process.env.SHROUDFI_MASTER_SEED!,
26
+ rpcUrl: process.env.SHROUDFI_RPC_URL!,
27
+ });
28
+
29
+ // 1. Register your meta-address (idempotent — no-op on second call)
30
+ await agent.register();
31
+
32
+ // 2. Send to a peer agent (by wallet — SDK looks up the meta-address)
33
+ const USDC = '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913';
34
+ await agent.sendToWallet('0xPeerWallet', { token: USDC }, 25_000_000n); // 25 USDC
35
+
36
+ // 3. Detect incoming payments
37
+ const detections = await agent.receive({ fromBlock: 46_800_000n });
38
+
39
+ // 4. Sweep to your real wallet (gasless via relayer if ERC-20)
40
+ for (const d of detections) {
41
+ await agent.sweep(d, '0xYourMain', { viaRelayer: true });
42
+ }
43
+ ```
44
+
45
+ ## The four operations
46
+
47
+ Every agent does the same four things:
48
+
49
+ | Method | Purpose |
50
+ |---|---|
51
+ | `agent.register()` | Publish meta-address into the ERC-6538 registry. Idempotent. |
52
+ | `agent.send(to, asset, amount)` | Send to a stealth meta-address (privacy-native) or a wallet (with auto-lookup). |
53
+ | `agent.sendToWallet(wallet, asset, amount)` | Convenience: send to a plain wallet via meta-address resolution. |
54
+ | `agent.receive(range)` | Scan a block range for inbound payments. |
55
+ | `agent.sweep(detection, destination, opts?)` | Direct or relayer-routed sweep. Auto-routes ERC-20 via Gelato, ETH via EIP-7702 when `viaRelayer: true`. |
56
+
57
+ ## Exports
58
+
59
+ | Symbol | Purpose |
60
+ |---|---|
61
+ | `createShroudAgent(cfg)` | The one entry point. |
62
+ | `ShroudAgent` | Type of the returned object. |
63
+ | `RelayerNotAvailableForETHError` | Thrown for `sweep({ viaRelayer: true })` when the ETH relayer isn't wired and the asset is native ETH. |
64
+
65
+ Full API reference: [shroudfi.live/sdk#agent-runtime](https://shroudfi.live/sdk#agent-runtime)
66
+
67
+ ## License
68
+
69
+ MIT — see [LICENSE](./LICENSE).
70
+
71
+ Part of the [ShroudFi](https://shroudfi.live) privacy SDK for AI agents on Base.
@@ -0,0 +1,235 @@
1
+ /**
2
+ * ShroudAgent — the ergonomic runtime that composes core + payments + scanning
3
+ * + transport into a single class.
4
+ *
5
+ * Privacy invariants (binding — code-reviewer will check):
6
+ * - No console.* anywhere in this file.
7
+ * - No JSON.stringify of keys, identity, detection, signature, or masterSeed.
8
+ * - No key bytes / signature bytes in error messages.
9
+ * - No amount values in error messages.
10
+ * - The spend key never leaves runtime; the scanning module needs it for
11
+ * ECDH derivation only.
12
+ */
13
+ import type { Address, Hash } from 'viem';
14
+ import type { AgentIdentity, StealthMetaAddress } from '@shroud-fi/core';
15
+ import type { PaymentReceipt, SendOptions, SendToWalletAsset } from '@shroud-fi/payments';
16
+ import type { DetectedPayment, FinalityLevel, ScannerBackend } from '@shroud-fi/scanning';
17
+ import type { ShroudFiTransport } from '@shroud-fi/transport';
18
+ import type { AgentRelayerEthSweepOptions, AgentRelayerEthSweepResult, AgentRelayerSweepOptions, AgentRelayerSweepResult, AgentSweepResult, ShroudAgentStartOptions } from './types.js';
19
+ /**
20
+ * Internal options that construct a ShroudAgent. The factory + browser factory
21
+ * funnel all configuration into this shape so the class itself stays simple.
22
+ *
23
+ * @internal — not exported via the public barrel. Use createShroudAgent.
24
+ */
25
+ export interface ShroudAgentInternalOptions {
26
+ readonly identity: AgentIdentity;
27
+ readonly transport: ShroudFiTransport;
28
+ readonly stealthContract: Address;
29
+ /** Override of the ERC-5564 announcer contract; defaults to canonical. */
30
+ readonly announcer?: Address;
31
+ readonly startBlock: bigint;
32
+ readonly finality?: FinalityLevel;
33
+ /** Test-only override of the scanner backend. Never set in production paths. */
34
+ readonly backend?: ScannerBackend;
35
+ /**
36
+ * M3 — when true, `sendToWallet` ensures the agent is registered in the
37
+ * canonical ERC-6538 registry before dispatching the payment.
38
+ */
39
+ readonly autoRegister?: boolean;
40
+ }
41
+ /**
42
+ * The ShroudAgent class. Wraps an EIP-5564 identity + the four ShroudFi
43
+ * packages behind a single ergonomic surface.
44
+ *
45
+ * Constructor is exported but typically reached through `createShroudAgent` or
46
+ * `createShroudAgentFromBrowserWallet`. Direct construction is supported for
47
+ * tests that need to inject a mock scanner backend.
48
+ */
49
+ export declare class ShroudAgent {
50
+ readonly identity: AgentIdentity;
51
+ readonly metaAddress: StealthMetaAddress;
52
+ readonly metaAddressEncoded: string;
53
+ readonly transport: ShroudFiTransport;
54
+ readonly stealthContract: Address;
55
+ private readonly finality;
56
+ private readonly startBlock;
57
+ private readonly announcer;
58
+ private readonly backendOverride;
59
+ private readonly autoRegister;
60
+ private scanner;
61
+ private isStarted;
62
+ private controller;
63
+ constructor(opts: ShroudAgentInternalOptions);
64
+ /**
65
+ * Build a fresh Scanner with this agent's config. Called from start() so
66
+ * each lifecycle gets its own scanner instance (a closed scanner can't be
67
+ * reopened — see H8).
68
+ */
69
+ private buildScanner;
70
+ /**
71
+ * Start receiving detected payments.
72
+ *
73
+ * Returns an AsyncIterable; consumer drives via `for await`. If
74
+ * `opts.backfillFrom` is set, the first phase yields scanRange results,
75
+ * then transitions to live watch().
76
+ *
77
+ * @throws AgentAlreadyStartedError if called twice without stop().
78
+ */
79
+ start(opts?: ShroudAgentStartOptions): AsyncIterable<DetectedPayment>;
80
+ /**
81
+ * Stop the agent. Aborts the internal signal, closes the current scanner,
82
+ * and clears the reference so the next start() builds a fresh one.
83
+ * Idempotent — safe to call multiple times or before start().
84
+ */
85
+ stop(): void;
86
+ /**
87
+ * Send native ETH to a recipient stealth meta-address.
88
+ *
89
+ * Accepts either a parsed StealthMetaAddress or the encoded string form
90
+ * (`st:base:0x...`). String form is decoded via decodeMetaAddress before use.
91
+ */
92
+ send(to: StealthMetaAddress | string, valueWei: bigint): Promise<PaymentReceipt>;
93
+ /**
94
+ * Send an ERC-20 token to a recipient stealth meta-address.
95
+ *
96
+ * Caller MUST have already approved the stealth contract to spend the token
97
+ * — v1 does not include an approve flow.
98
+ */
99
+ sendERC20(to: StealthMetaAddress | string, token: Address, amount: bigint): Promise<PaymentReceipt>;
100
+ /**
101
+ * M3 — read the canonical ERC-6538 registry and return whether the agent's
102
+ * registrant wallet has a non-empty stealth meta-address on file for
103
+ * scheme 1 (the ShroudFi default).
104
+ *
105
+ * The registrant is keyed by `transport.walletClient.account.address` —
106
+ * the EOA that would sign the `registerKeys` transaction. Read-only
107
+ * transports (no walletClient or no account) cannot be registered and
108
+ * therefore return `false`.
109
+ *
110
+ * No side effects, no gas. Safe to call before every send.
111
+ */
112
+ isRegistered(): Promise<boolean>;
113
+ /**
114
+ * M3 — publish the agent's stealth meta-address (33-byte spending pubkey
115
+ * concatenated with 33-byte viewing pubkey) into the canonical ERC-6538
116
+ * registry under scheme 1.
117
+ *
118
+ * Throws `AlreadyRegisteredError` if the registrant wallet already has a
119
+ * non-empty entry. Throws `RegistrationRequiresWalletError` if the
120
+ * transport has no walletClient with an account.
121
+ *
122
+ * Privacy: only the agent's PUBLIC keys cross the wire (these are the
123
+ * same bytes that already live in `metaAddressEncoded`). The spending
124
+ * private key is never touched by this path.
125
+ *
126
+ * @returns the transaction hash of the `registerKeys` call.
127
+ */
128
+ register(): Promise<Hash>;
129
+ /**
130
+ * M3 — composite, idempotent registration helper.
131
+ *
132
+ * Returns `{ registered: false }` if the agent is already registered
133
+ * (no tx broadcast). Otherwise returns `{ registered: true, txHash }`
134
+ * with the registration tx hash.
135
+ *
136
+ * Safe to call before every send — the check is a single eth_call.
137
+ */
138
+ ensureRegistered(): Promise<{
139
+ registered: boolean;
140
+ txHash?: Hash;
141
+ }>;
142
+ /**
143
+ * M4 — ergonomic helper: pay an EVM wallet by its plain address, no
144
+ * meta-address handling on the caller side.
145
+ *
146
+ * Delegates to `sendToWallet` from `@shroud-fi/payments` which does the
147
+ * ERC-6538 registry lookup, decodes the recipient's stealth meta-address,
148
+ * and dispatches `sendETHPayment` or `sendERC20Payment` as appropriate.
149
+ *
150
+ * If the agent was constructed with `autoRegister: true`, this method
151
+ * calls `ensureRegistered` BEFORE dispatching the payment so the agent
152
+ * itself becomes reachable as a stealth-payment recipient the first time
153
+ * it pays someone. A failure inside `ensureRegistered` is wrapped in
154
+ * `AutoRegistrationFailedError` so callers can distinguish setup failures
155
+ * from payment failures via the `cause` chain.
156
+ *
157
+ * Privacy: the recipient wallet address never appears in error messages
158
+ * — `RecipientNotOnboardedError.wallet` exposes it on a structured field
159
+ * for callers that need to show a UI hint.
160
+ */
161
+ sendToWallet(recipientWallet: Address, asset: SendToWalletAsset, amount: bigint, options?: SendOptions): Promise<PaymentReceipt>;
162
+ /**
163
+ * Sweep funds from a detected stealth address to a destination.
164
+ *
165
+ * If `opts.token` is undefined or matches the ETH sentinel (or zero address)
166
+ * the agent dispatches to sweepETH; otherwise it dispatches to sweepERC20
167
+ * with the given token.
168
+ *
169
+ * Direct sweep (the default path) requires the stealth address to hold
170
+ * enough ETH to pay its own gas. When the stealth holds zero ETH set
171
+ * `opts.viaRelayer = true`:
172
+ * - ERC-20 → routed to {@link sweepViaRelayer} (Gelato or self-host).
173
+ * - ETH → routed to {@link sweepEthViaRelayer} via EIP-7702 (P5.1).
174
+ * Requires `opts.ethRelayerOptions.selfHostEndpoint` since there's no
175
+ * third-party fallback for the 7702 path.
176
+ */
177
+ sweep(detection: DetectedPayment, destination: Address, opts?: {
178
+ token?: Address;
179
+ viaRelayer?: boolean;
180
+ relayerContract?: Address;
181
+ relayerOptions?: AgentRelayerSweepOptions;
182
+ ethRelayerContract?: Address;
183
+ ethRelayerOptions?: AgentRelayerEthSweepOptions;
184
+ }): Promise<AgentSweepResult | AgentRelayerSweepResult | AgentRelayerEthSweepResult>;
185
+ /**
186
+ * Gasless ERC-20 sweep via the ShroudFiRelayer + Gelato 1Balance.
187
+ *
188
+ * Lazy-imports `@shroud-fi/relayer` so the agent-runtime bundle stays small
189
+ * for callers that never use the relayer path. The Gelato SDK + axios + ws
190
+ * deps only land in the bundle when this method is actually called.
191
+ *
192
+ * Relayer contract resolution order:
193
+ * 1. `opts.relayerContract` if provided
194
+ * 2. `getRelayer(transport.chain.id)` lookup from `@shroud-fi/transport`
195
+ * 3. Throw `RelayerContractNotConfiguredError`
196
+ *
197
+ * @throws RelayerContractNotConfiguredError if no relayer is resolvable.
198
+ * @throws RelayerNotAvailableForETHError if the agent itself ever invokes
199
+ * this with an ETH-like token (the dispatch in `sweep()` already
200
+ * guards, this guards direct callers too).
201
+ */
202
+ sweepViaRelayer(detection: DetectedPayment, destination: Address, opts: {
203
+ token: Address;
204
+ relayerContract?: Address;
205
+ relayerOptions?: AgentRelayerSweepOptions;
206
+ }): Promise<AgentRelayerSweepResult>;
207
+ /**
208
+ * Self-host dispatch: sign the EIP-2612 permit, POST to the operator's
209
+ * service, return a Gelato-shaped receipt.
210
+ *
211
+ * Privacy: only the (public) permit signature + stealth address + token
212
+ * + destination cross the wire. The stealth private key never leaves the
213
+ * client.
214
+ */
215
+ private sweepViaSelfHost;
216
+ /**
217
+ * P5.1 — gasless ETH sweep via EIP-7702 + self-host relayer service.
218
+ *
219
+ * Dispatch order for the ShroudFiEthRelayer contract address:
220
+ * 1. `opts.ethRelayerContract` if provided
221
+ * 2. `getEthRelayer(transport.chain.id)` lookup
222
+ * 3. Throw EthRelayerContractNotConfiguredError
223
+ *
224
+ * Lazy-imports @shroud-fi/relayer so the agent-runtime bundle stays small
225
+ * for callers that never touch the gasless path.
226
+ *
227
+ * @throws EthRelayerContractNotConfiguredError if no contract is resolvable.
228
+ * @throws EthRelayerEndpointRequiredError if no self-host endpoint is provided.
229
+ */
230
+ sweepEthViaRelayer(detection: DetectedPayment, destination: Address, opts: {
231
+ ethRelayerContract?: Address;
232
+ relayerOptions: AgentRelayerEthSweepOptions;
233
+ }): Promise<AgentRelayerEthSweepResult>;
234
+ }
235
+ //# sourceMappingURL=agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/agent.ts"],"names":[],"mappings":"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"}