ethagent 0.2.1 → 1.0.1
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.
- package/LICENSE +21 -0
- package/README.md +114 -32
- package/bin/ethagent.js +11 -2
- package/package.json +25 -7
- package/src/app/FirstRun.tsx +412 -0
- package/src/app/hooks/useCancelRequest.ts +22 -0
- package/src/app/hooks/useDoublePress.ts +46 -0
- package/src/app/hooks/useExitOnCtrlC.ts +36 -0
- package/src/app/input/AppInputProvider.tsx +116 -0
- package/src/app/input/appInputParser.ts +279 -0
- package/src/app/keybindings/KeybindingProvider.tsx +134 -0
- package/src/app/keybindings/resolver.ts +42 -0
- package/src/app/keybindings/types.ts +26 -0
- package/src/chat/ChatBottomPane.tsx +280 -0
- package/src/chat/ChatInput.tsx +722 -0
- package/src/chat/ChatScreen.tsx +1575 -0
- package/src/chat/ContextLimitView.tsx +95 -0
- package/src/chat/ContinuityEditReviewView.tsx +48 -0
- package/src/chat/ConversationStack.tsx +47 -0
- package/src/chat/CopyPicker.tsx +52 -0
- package/src/chat/MessageList.tsx +609 -0
- package/src/chat/PermissionPrompt.tsx +153 -0
- package/src/chat/PermissionsView.tsx +159 -0
- package/src/chat/PlanApprovalView.tsx +91 -0
- package/src/chat/ResumeView.tsx +267 -0
- package/src/chat/RewindView.tsx +386 -0
- package/src/chat/SessionStatus.tsx +51 -0
- package/src/chat/TranscriptView.tsx +202 -0
- package/src/chat/chatInputState.ts +247 -0
- package/src/chat/chatPaste.ts +49 -0
- package/src/chat/chatScreenUtils.ts +187 -0
- package/src/chat/chatSessionState.ts +142 -0
- package/src/chat/chatTurnOrchestrator.ts +701 -0
- package/src/chat/commands.ts +673 -0
- package/src/chat/textCursor.ts +202 -0
- package/src/chat/toolResultDisplay.ts +8 -0
- package/src/chat/transcriptViewport.ts +247 -0
- package/src/cli/ResetConfirmView.tsx +61 -0
- package/src/cli/main.tsx +177 -0
- package/src/cli/preview.tsx +19 -0
- package/src/cli/reset.ts +106 -0
- package/src/identity/continuity/editor.ts +149 -0
- package/src/identity/continuity/envelope.ts +345 -0
- package/src/identity/continuity/history.ts +153 -0
- package/src/identity/continuity/privateEdit.ts +334 -0
- package/src/identity/continuity/publicSkills.ts +173 -0
- package/src/identity/continuity/snapshots.ts +183 -0
- package/src/identity/continuity/storage.ts +507 -0
- package/src/identity/crypto/backupEnvelope.ts +486 -0
- package/src/identity/crypto/eth.ts +137 -0
- package/src/identity/hub/IdentityHub.tsx +845 -0
- package/src/identity/hub/identityHubEffects.ts +1100 -0
- package/src/identity/hub/identityHubModel.ts +291 -0
- package/src/identity/hub/identityHubReducer.ts +209 -0
- package/src/identity/hub/screens/BusyScreen.tsx +26 -0
- package/src/identity/hub/screens/ContinuityDashboardScreen.tsx +139 -0
- package/src/identity/hub/screens/CreateFlow.tsx +206 -0
- package/src/identity/hub/screens/DetailsScreen.tsx +64 -0
- package/src/identity/hub/screens/EditProfileFlow.tsx +145 -0
- package/src/identity/hub/screens/ErrorScreen.tsx +35 -0
- package/src/identity/hub/screens/IdentitySummary.tsx +70 -0
- package/src/identity/hub/screens/MenuScreen.tsx +117 -0
- package/src/identity/hub/screens/NetworkScreen.tsx +41 -0
- package/src/identity/hub/screens/RebackupStorageScreen.tsx +50 -0
- package/src/identity/hub/screens/RecoveryConfirmScreen.tsx +85 -0
- package/src/identity/hub/screens/RestoreFlow.tsx +206 -0
- package/src/identity/hub/screens/StorageCredentialScreen.tsx +128 -0
- package/src/identity/hub/screens/WalletApprovalScreen.tsx +43 -0
- package/src/identity/profile/imagePicker.ts +180 -0
- package/src/identity/registry/erc8004.ts +1106 -0
- package/src/identity/registry/registryConfig.ts +69 -0
- package/src/identity/storage/ipfs.ts +212 -0
- package/src/identity/storage/pinataJwt.ts +53 -0
- package/src/identity/wallet/browserWallet.ts +393 -0
- package/src/identity/wallet/wallet-page/wallet.html +1082 -0
- package/src/mcp/approvals.ts +113 -0
- package/src/mcp/config.ts +235 -0
- package/src/mcp/manager.ts +541 -0
- package/src/mcp/names.ts +19 -0
- package/src/mcp/output.ts +96 -0
- package/src/models/ModelPicker.tsx +1446 -0
- package/src/models/catalog.ts +296 -0
- package/src/models/huggingface.ts +651 -0
- package/src/models/llamacpp.ts +810 -0
- package/src/models/llamacppPreflight.ts +150 -0
- package/src/models/modelDisplay.ts +105 -0
- package/src/models/modelPickerOptions.ts +421 -0
- package/src/models/modelRecommendation.ts +140 -0
- package/src/models/runtimeDetection.ts +81 -0
- package/src/models/uncensoredCatalog.ts +86 -0
- package/src/providers/anthropic.ts +259 -0
- package/src/providers/contracts.ts +62 -0
- package/src/providers/errors.ts +62 -0
- package/src/providers/gemini.ts +152 -0
- package/src/providers/openai-chat.ts +472 -0
- package/src/providers/registry.ts +42 -0
- package/src/providers/retry.ts +58 -0
- package/src/providers/sse.ts +93 -0
- package/src/runtime/compaction.ts +389 -0
- package/src/runtime/cwd.ts +43 -0
- package/src/runtime/sessionMode.ts +55 -0
- package/src/runtime/systemPrompt.ts +209 -0
- package/src/runtime/toolClaimGuards.ts +143 -0
- package/src/runtime/toolExecution.ts +304 -0
- package/src/runtime/toolIntent.ts +163 -0
- package/src/runtime/turn.ts +858 -0
- package/src/storage/atomicWrite.ts +68 -0
- package/src/storage/config.ts +189 -0
- package/src/storage/factoryReset.ts +130 -0
- package/src/storage/history.ts +58 -0
- package/src/storage/identity.ts +99 -0
- package/src/storage/permissions.ts +76 -0
- package/src/storage/rewind.ts +246 -0
- package/src/storage/secrets.ts +181 -0
- package/src/storage/sessionExport.ts +49 -0
- package/src/storage/sessions.ts +482 -0
- package/src/tools/bashSafety.ts +174 -0
- package/src/tools/bashTool.ts +140 -0
- package/src/tools/changeDirectoryTool.ts +213 -0
- package/src/tools/contracts.ts +179 -0
- package/src/tools/deleteFileTool.ts +111 -0
- package/src/tools/editTool.ts +160 -0
- package/src/tools/editUtils.ts +170 -0
- package/src/tools/listDirectoryTool.ts +55 -0
- package/src/tools/mcpResourceTools.ts +95 -0
- package/src/tools/permissionRules.ts +85 -0
- package/src/tools/privateContinuityEditTool.ts +178 -0
- package/src/tools/privateContinuityReadTool.ts +107 -0
- package/src/tools/readTool.ts +85 -0
- package/src/tools/registry.ts +67 -0
- package/src/tools/writeFileTool.ts +142 -0
- package/src/ui/BrandSplash.tsx +193 -0
- package/src/ui/ProgressBar.tsx +34 -0
- package/src/ui/Select.tsx +143 -0
- package/src/ui/Spinner.tsx +269 -0
- package/src/ui/Surface.tsx +47 -0
- package/src/ui/TextInput.tsx +97 -0
- package/src/ui/theme.ts +59 -0
- package/src/utils/clipboard.ts +216 -0
- package/src/utils/markdownSegments.ts +51 -0
- package/src/utils/messages.ts +35 -0
- package/src/utils/withRetry.ts +280 -0
- package/src/cli.tsx +0 -147
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 bairon.dev
|
|
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
CHANGED
|
@@ -1,55 +1,137 @@
|
|
|
1
|
-
<img src="https://
|
|
1
|
+
<img src="https://raw.githubusercontent.com/baairon/ethagent/master/preview/image.png" alt="ethagent" />
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
A privacy-first AI agent with a
|
|
4
|
+
A privacy-first AI agent with a portable Ethereum identity.
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
npm install -g ethagent
|
|
8
|
-
```
|
|
6
|
+
ethagent is a terminal agent for coding and project work. It gives the agent a wallet-owned ERC-8004 identity, keeps private continuity encrypted, and publishes public capability metadata as structured JSON so other applications and agents can understand what it can do.
|
|
9
7
|
|
|
10
|
-
|
|
8
|
+
The identity stays portable. The model can change. The private memory stays under wallet-gated encryption.
|
|
11
9
|
|
|
12
|
-
|
|
10
|
+
## Install
|
|
13
11
|
|
|
14
|
-
|
|
15
|
-
- Your knowledge base is pinned to IPFS, content-addressed and portable
|
|
16
|
-
- Your agent is registered onchain via [ERC-8004](https://eips.ethereum.org/EIPS/eip-8004)
|
|
17
|
-
- Everything you teach it compounds across sessions, not just within them
|
|
12
|
+
ethagent requires Node.js 20 or newer. Install it from npm with `npm install -g ethagent`, then start it with `ethagent`.
|
|
18
13
|
|
|
19
|
-
|
|
14
|
+
On first run, ethagent guides you through model setup and identity setup. You can use a local GGUF model through llama.cpp, or connect OpenAI, Anthropic, or Gemini.
|
|
20
15
|
|
|
21
|
-
|
|
22
|
-
npx ethagent init --from bairon.eth
|
|
23
|
-
npx ethagent init --from 0xA1E977e700bF82019beb381F1582575303A389CE
|
|
24
|
-
```
|
|
16
|
+
## What It Does
|
|
25
17
|
|
|
26
|
-
|
|
18
|
+
* Runs an AI coding agent in your terminal.
|
|
19
|
+
* Switches between cloud models and local GGUF models.
|
|
20
|
+
* Creates or loads a wallet-owned ERC-8004 agent identity.
|
|
21
|
+
* Encrypts private continuity before IPFS pinning.
|
|
22
|
+
* Publishes public `skills.json` and Agent Card metadata for discovery.
|
|
23
|
+
* Restores the same agent on another machine from the onchain record.
|
|
24
|
+
* Supports workspace tools, managed edit rewind, session resume, context compaction, and MCP servers.
|
|
27
25
|
|
|
28
|
-
|
|
26
|
+
## First Run
|
|
29
27
|
|
|
30
|
-
|
|
28
|
+
Start with `ethagent`. The setup flow asks for a model path first, then offers identity setup.
|
|
31
29
|
|
|
32
|
-
|
|
30
|
+
You can create a new ERC-8004 agent with a browser wallet, load an agent token you already own, or skip identity setup and add it later from the Identity Hub.
|
|
33
31
|
|
|
34
|
-
|
|
32
|
+
Use `Alt+P` to switch models and `Alt+I` to open the Identity Hub. Inside the agent, `/help` shows the live command list for the version you are running.
|
|
35
33
|
|
|
36
|
-
|
|
34
|
+
## Identity Hub
|
|
37
35
|
|
|
38
|
-
|
|
36
|
+
The Identity Hub is where the portable identity is managed.
|
|
39
37
|
|
|
40
|
-
|
|
|
41
|
-
|
|
42
|
-
|
|
|
43
|
-
|
|
|
44
|
-
|
|
|
38
|
+
| Area | What It Controls |
|
|
39
|
+
| --- | --- |
|
|
40
|
+
| Public Metadata | Profile name, description, image, `skills.json`, and Agent Card. |
|
|
41
|
+
| Private Local Files | `SOUL.md`, `MEMORY.md`, and the local copy of `skills.json`. |
|
|
42
|
+
| Recovery | Publishing the current encrypted snapshot or refetching the latest one from chain. |
|
|
43
|
+
| Storage | The Pinata JWT used to pin continuity and metadata to IPFS. |
|
|
44
|
+
| Agent Token | Registry, owner, token, URI, CID, and copyable identity values. |
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
The hub is a recovery panel, not a history archive. The current tokenURI is the source of truth for the latest published state.
|
|
47
|
+
|
|
48
|
+
## Continuity
|
|
49
|
+
|
|
50
|
+
Each identity gets a local continuity vault under `~/.ethagent/continuity`.
|
|
51
|
+
|
|
52
|
+
| File | Visibility | Purpose |
|
|
53
|
+
| --- | --- | --- |
|
|
54
|
+
| `SOUL.md` | Private | Persona, boundaries, standing instructions, and identity framing. |
|
|
55
|
+
| `MEMORY.md` | Private | Durable preferences, project context, decisions, and operating notes. |
|
|
56
|
+
| `skills.json` | Public | Machine-readable capabilities, input modes, output modes, and discovery metadata. |
|
|
57
|
+
|
|
58
|
+
`SOUL.md` and `MEMORY.md` are encrypted before they are pinned to IPFS. They are not published as plaintext in token metadata.
|
|
59
|
+
|
|
60
|
+
`skills.json` is public by design. It uses schema `ethagent.public-skills.v1` and is meant to be easy for other agents, apps, and scanners to parse.
|
|
61
|
+
|
|
62
|
+
## Recovery
|
|
63
|
+
|
|
64
|
+
**Publish Snapshot Now** encrypts the current private continuity, pins the public discovery files, writes current registration metadata, and updates the ERC-8004 tokenURI.
|
|
65
|
+
|
|
66
|
+
**Refetch Latest Snapshot** reads the current tokenURI from chain, downloads the encrypted continuity envelope, asks the owner wallet to sign the decrypt challenge, and restores local continuity files from the published state.
|
|
67
|
+
|
|
68
|
+
Publishing replaces the current onchain pointer. Registration metadata contains the current CIDs only.
|
|
69
|
+
|
|
70
|
+
## Public Discovery
|
|
71
|
+
|
|
72
|
+
The public registration metadata is intentionally compact. It describes the current state of the agent, not its history.
|
|
73
|
+
|
|
74
|
+
It can include:
|
|
75
|
+
|
|
76
|
+
* Agent name, description, and image.
|
|
77
|
+
* Current encrypted continuity CID.
|
|
78
|
+
* Current public `skills.json` CID.
|
|
79
|
+
* Current Agent Card CID.
|
|
80
|
+
* Service entries with canonical `endpoint` values.
|
|
81
|
+
* Registry linkage through `registrations[]`.
|
|
82
|
+
|
|
83
|
+
This is enough for baseline agent-to-agent discovery and delegation without exposing private memory or installing executable code.
|
|
84
|
+
|
|
85
|
+
## Models
|
|
86
|
+
|
|
87
|
+
ethagent works with OpenAI, Anthropic, Gemini, and local GGUF models served through a llama.cpp-compatible endpoint.
|
|
88
|
+
|
|
89
|
+
The model picker can discover provider models, manage cloud API keys, recommend GGUF files for the machine, and start or reconnect to a local runner when supported.
|
|
90
|
+
|
|
91
|
+
The featured local model is [Qwen3.5-9B-Uncensored](https://huggingface.co/HauhauCS/Qwen3.5-9B-Uncensored-HauhauCS-Aggressive). You can also add other Hugging Face GGUF models by repo ID or URL.
|
|
92
|
+
|
|
93
|
+
Cloud API keys are stored in the OS keyring when available. If a keyring is unavailable, ethagent uses an encrypted local file under `~/.ethagent`.
|
|
94
|
+
|
|
95
|
+
## Tools And Workspace
|
|
96
|
+
|
|
97
|
+
ethagent is built for real project work. It can read files, edit files, write new files, delete files, inspect directories, run shell commands, copy text to the clipboard, and connect MCP tools.
|
|
98
|
+
|
|
99
|
+
Tool use is permissioned. Managed edits are tracked so recent workspace changes can be rewound from inside the agent.
|
|
100
|
+
|
|
101
|
+
Sessions are local. You can resume prior sessions, export a transcript, compact older context, and review saved project permissions.
|
|
102
|
+
|
|
103
|
+
## Privacy
|
|
104
|
+
|
|
105
|
+
Public information includes token ownership, tokenURI metadata, public discovery files, and IPFS CIDs.
|
|
106
|
+
|
|
107
|
+
Private information includes plaintext `SOUL.md`, plaintext `MEMORY.md`, sessions, prompt history, API keys, local permissions, and wallet signatures used for decrypting continuity.
|
|
108
|
+
|
|
109
|
+
Continuity snapshots use an EIP-191 wallet signature as unlock material and encrypt with ML-KEM-1024, HKDF-SHA256, and AES-256-GCM. The unlock signature does not submit a transaction, spend funds, or grant token approval.
|
|
110
|
+
|
|
111
|
+
If an ERC-8004 token is transferred, the new holder can see public metadata and encrypted backup CIDs. They cannot decrypt private continuity that was encrypted for the previous owner wallet.
|
|
112
|
+
|
|
113
|
+
## Local Reset
|
|
114
|
+
|
|
115
|
+
`ethagent reset` deletes local ethagent data from this machine while preserving installed local model assets. It does not burn or transfer ERC-8004 tokens, remove public IPFS content, or mutate onchain metadata.
|
|
116
|
+
|
|
117
|
+
Before resetting, use **Publish Snapshot Now** if local continuity changes should become the current recoverable state.
|
|
118
|
+
|
|
119
|
+
## Architecture
|
|
120
|
+
|
|
121
|
+
| Layer | Role |
|
|
122
|
+
| --- | --- |
|
|
123
|
+
| Runtime | Terminal chat UI, sessions, context, permissions, and workspace tools. |
|
|
124
|
+
| Model | Cloud provider or local GGUF runner. |
|
|
125
|
+
| Identity | ERC-8004 token owned by the wallet. |
|
|
126
|
+
| Continuity | Private files encrypted before IPFS pinning. |
|
|
127
|
+
| Discovery | Public `skills.json`, Agent Card, services, and current metadata. |
|
|
128
|
+
| Recovery | Refetch current tokenURI, decrypt the latest snapshot, and restore local files. |
|
|
129
|
+
|
|
130
|
+
The ERC-8004 token is the durable handle. The machine, model, and local session can change around it.
|
|
47
131
|
|
|
48
132
|
## Links
|
|
49
133
|
|
|
50
|
-
|
|
51
|
-
- [GitHub](https://github.com/baairon/ethagent)
|
|
52
|
-
- [ERC-8004 specification](https://eips.ethereum.org/EIPS/eip-8004)
|
|
134
|
+
[npm](https://www.npmjs.com/package/ethagent) · [GitHub](https://github.com/baairon/ethagent) · [ERC-8004](https://eips.ethereum.org/EIPS/eip-8004) · [soul.md](https://soul.md/)
|
|
53
135
|
|
|
54
136
|
## License
|
|
55
137
|
|
package/bin/ethagent.js
CHANGED
|
@@ -4,6 +4,15 @@ import { fileURLToPath } from 'node:url'
|
|
|
4
4
|
import { dirname, join } from 'node:path'
|
|
5
5
|
|
|
6
6
|
const __dirname = dirname(fileURLToPath(import.meta.url))
|
|
7
|
-
const cli = join(__dirname, '..', 'src', 'cli.tsx')
|
|
7
|
+
const cli = join(__dirname, '..', 'src', 'cli', 'main.tsx')
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
try {
|
|
10
|
+
const tsxPath = import.meta.resolve('tsx/esm')
|
|
11
|
+
execFileSync('node', ['--import', tsxPath, cli, ...process.argv.slice(2)], { stdio: 'inherit' })
|
|
12
|
+
} catch (err) {
|
|
13
|
+
if (err?.code === 'ENOENT') {
|
|
14
|
+
process.stderr.write('ethagent: node 20+ is required on PATH. install Node.js, then retry.\n')
|
|
15
|
+
process.exit(127)
|
|
16
|
+
}
|
|
17
|
+
process.exit(typeof err?.status === 'number' ? err.status : 1)
|
|
18
|
+
}
|
package/package.json
CHANGED
|
@@ -1,24 +1,31 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ethagent",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "A privacy-first AI agent with
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"description": "A privacy-first AI agent with a portable Ethereum identity",
|
|
5
5
|
"type": "module",
|
|
6
|
+
"main": "bin/ethagent.js",
|
|
6
7
|
"bin": {
|
|
7
8
|
"ethagent": "bin/ethagent.js"
|
|
8
9
|
},
|
|
9
10
|
"files": [
|
|
10
11
|
"bin",
|
|
11
|
-
"src"
|
|
12
|
+
"src",
|
|
13
|
+
"README.md",
|
|
14
|
+
"LICENSE"
|
|
12
15
|
],
|
|
13
16
|
"scripts": {
|
|
14
|
-
"start": "node bin/ethagent.js"
|
|
17
|
+
"start": "node bin/ethagent.js",
|
|
18
|
+
"typecheck": "tsc --noEmit",
|
|
19
|
+
"test": "node test/run-tests.mjs"
|
|
20
|
+
},
|
|
21
|
+
"engines": {
|
|
22
|
+
"node": ">=20.0.0"
|
|
15
23
|
},
|
|
16
24
|
"keywords": [
|
|
17
25
|
"ethereum",
|
|
18
26
|
"agent",
|
|
19
27
|
"ai",
|
|
20
28
|
"privacy-first",
|
|
21
|
-
"local-llm",
|
|
22
29
|
"ipfs",
|
|
23
30
|
"ERC-8004",
|
|
24
31
|
"onchain",
|
|
@@ -32,9 +39,20 @@
|
|
|
32
39
|
"author": "bairon.eth",
|
|
33
40
|
"license": "MIT",
|
|
34
41
|
"dependencies": {
|
|
42
|
+
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
43
|
+
"@noble/curves": "^1.9.7",
|
|
44
|
+
"@noble/hashes": "^1.8.0",
|
|
45
|
+
"@noble/post-quantum": "^0.6.1",
|
|
46
|
+
"ajv": "^8.18.0",
|
|
35
47
|
"ink": "^6.8.0",
|
|
36
48
|
"react": "^19.2.4",
|
|
37
|
-
"tsx": "^4.21.0"
|
|
49
|
+
"tsx": "^4.21.0",
|
|
50
|
+
"viem": "^2.48.4",
|
|
51
|
+
"zod": "^3.25.76"
|
|
38
52
|
},
|
|
39
|
-
"devDependencies": {
|
|
53
|
+
"devDependencies": {
|
|
54
|
+
"@types/node": "^25.6.0",
|
|
55
|
+
"@types/react": "^19.2.14",
|
|
56
|
+
"typescript": "^5.9.3"
|
|
57
|
+
}
|
|
40
58
|
}
|