ethagent 0.2.0 → 1.0.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 (143) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +114 -32
  3. package/bin/ethagent.js +11 -2
  4. package/package.json +30 -8
  5. package/src/app/FirstRun.tsx +412 -0
  6. package/src/app/hooks/useCancelRequest.ts +22 -0
  7. package/src/app/hooks/useDoublePress.ts +46 -0
  8. package/src/app/hooks/useExitOnCtrlC.ts +36 -0
  9. package/src/app/input/AppInputProvider.tsx +116 -0
  10. package/src/app/input/appInputParser.ts +279 -0
  11. package/src/app/keybindings/KeybindingProvider.tsx +134 -0
  12. package/src/app/keybindings/resolver.ts +42 -0
  13. package/src/app/keybindings/types.ts +26 -0
  14. package/src/chat/ChatBottomPane.tsx +280 -0
  15. package/src/chat/ChatInput.tsx +722 -0
  16. package/src/chat/ChatScreen.tsx +1575 -0
  17. package/src/chat/ContextLimitView.tsx +95 -0
  18. package/src/chat/ContinuityEditReviewView.tsx +48 -0
  19. package/src/chat/ConversationStack.tsx +47 -0
  20. package/src/chat/CopyPicker.tsx +52 -0
  21. package/src/chat/MessageList.tsx +609 -0
  22. package/src/chat/PermissionPrompt.tsx +153 -0
  23. package/src/chat/PermissionsView.tsx +159 -0
  24. package/src/chat/PlanApprovalView.tsx +91 -0
  25. package/src/chat/ResumeView.tsx +267 -0
  26. package/src/chat/RewindView.tsx +386 -0
  27. package/src/chat/SessionStatus.tsx +51 -0
  28. package/src/chat/TranscriptView.tsx +202 -0
  29. package/src/chat/chatInputState.ts +247 -0
  30. package/src/chat/chatPaste.ts +49 -0
  31. package/src/chat/chatScreenUtils.ts +187 -0
  32. package/src/chat/chatSessionState.ts +142 -0
  33. package/src/chat/chatTurnOrchestrator.ts +701 -0
  34. package/src/chat/commands.ts +673 -0
  35. package/src/chat/textCursor.ts +202 -0
  36. package/src/chat/toolResultDisplay.ts +8 -0
  37. package/src/chat/transcriptViewport.ts +247 -0
  38. package/src/cli/ResetConfirmView.tsx +61 -0
  39. package/src/cli/main.tsx +177 -0
  40. package/src/cli/preview.tsx +19 -0
  41. package/src/cli/reset.ts +106 -0
  42. package/src/identity/continuity/editor.ts +149 -0
  43. package/src/identity/continuity/envelope.ts +345 -0
  44. package/src/identity/continuity/history.ts +153 -0
  45. package/src/identity/continuity/privateEdit.ts +334 -0
  46. package/src/identity/continuity/publicSkills.ts +173 -0
  47. package/src/identity/continuity/snapshots.ts +183 -0
  48. package/src/identity/continuity/storage.ts +507 -0
  49. package/src/identity/crypto/backupEnvelope.ts +486 -0
  50. package/src/identity/crypto/eth.ts +137 -0
  51. package/src/identity/hub/IdentityHub.tsx +868 -0
  52. package/src/identity/hub/identityHubEffects.ts +1146 -0
  53. package/src/identity/hub/identityHubModel.ts +291 -0
  54. package/src/identity/hub/identityHubReducer.ts +212 -0
  55. package/src/identity/hub/screens/BusyScreen.tsx +26 -0
  56. package/src/identity/hub/screens/ContinuityDashboardScreen.tsx +144 -0
  57. package/src/identity/hub/screens/CreateFlow.tsx +206 -0
  58. package/src/identity/hub/screens/DetailsScreen.tsx +64 -0
  59. package/src/identity/hub/screens/EditProfileFlow.tsx +145 -0
  60. package/src/identity/hub/screens/ErrorScreen.tsx +35 -0
  61. package/src/identity/hub/screens/IdentitySummary.tsx +70 -0
  62. package/src/identity/hub/screens/MenuScreen.tsx +117 -0
  63. package/src/identity/hub/screens/NetworkScreen.tsx +41 -0
  64. package/src/identity/hub/screens/RebackupStorageScreen.tsx +50 -0
  65. package/src/identity/hub/screens/RecoveryConfirmScreen.tsx +85 -0
  66. package/src/identity/hub/screens/RestoreFlow.tsx +206 -0
  67. package/src/identity/hub/screens/StorageCredentialScreen.tsx +128 -0
  68. package/src/identity/hub/screens/WalletApprovalScreen.tsx +43 -0
  69. package/src/identity/profile/imagePicker.ts +180 -0
  70. package/src/identity/registry/erc8004.ts +1106 -0
  71. package/src/identity/registry/registryConfig.ts +69 -0
  72. package/src/identity/storage/ipfs.ts +212 -0
  73. package/src/identity/storage/pinataJwt.ts +53 -0
  74. package/src/identity/wallet/browserWallet.ts +393 -0
  75. package/src/identity/wallet/wallet-page/wallet.html +1082 -0
  76. package/src/mcp/approvals.ts +113 -0
  77. package/src/mcp/config.ts +235 -0
  78. package/src/mcp/manager.ts +541 -0
  79. package/src/mcp/names.ts +19 -0
  80. package/src/mcp/output.ts +96 -0
  81. package/src/models/ModelPicker.tsx +1446 -0
  82. package/src/models/catalog.ts +296 -0
  83. package/src/models/huggingface.ts +651 -0
  84. package/src/models/llamacpp.ts +810 -0
  85. package/src/models/llamacppPreflight.ts +150 -0
  86. package/src/models/modelDisplay.ts +105 -0
  87. package/src/models/modelPickerOptions.ts +421 -0
  88. package/src/models/modelRecommendation.ts +140 -0
  89. package/src/models/runtimeDetection.ts +81 -0
  90. package/src/models/uncensoredCatalog.ts +86 -0
  91. package/src/providers/anthropic.ts +259 -0
  92. package/src/providers/contracts.ts +62 -0
  93. package/src/providers/errors.ts +62 -0
  94. package/src/providers/gemini.ts +152 -0
  95. package/src/providers/openai-chat.ts +472 -0
  96. package/src/providers/registry.ts +42 -0
  97. package/src/providers/retry.ts +58 -0
  98. package/src/providers/sse.ts +93 -0
  99. package/src/runtime/compaction.ts +389 -0
  100. package/src/runtime/cwd.ts +43 -0
  101. package/src/runtime/sessionMode.ts +55 -0
  102. package/src/runtime/systemPrompt.ts +209 -0
  103. package/src/runtime/toolClaimGuards.ts +143 -0
  104. package/src/runtime/toolExecution.ts +304 -0
  105. package/src/runtime/toolIntent.ts +163 -0
  106. package/src/runtime/turn.ts +858 -0
  107. package/src/storage/atomicWrite.ts +68 -0
  108. package/src/storage/config.ts +189 -0
  109. package/src/storage/factoryReset.ts +130 -0
  110. package/src/storage/history.ts +58 -0
  111. package/src/storage/identity.ts +99 -0
  112. package/src/storage/permissions.ts +76 -0
  113. package/src/storage/rewind.ts +246 -0
  114. package/src/storage/secrets.ts +181 -0
  115. package/src/storage/sessionExport.ts +49 -0
  116. package/src/storage/sessions.ts +482 -0
  117. package/src/tools/bashSafety.ts +174 -0
  118. package/src/tools/bashTool.ts +140 -0
  119. package/src/tools/changeDirectoryTool.ts +213 -0
  120. package/src/tools/contracts.ts +179 -0
  121. package/src/tools/deleteFileTool.ts +111 -0
  122. package/src/tools/editTool.ts +160 -0
  123. package/src/tools/editUtils.ts +170 -0
  124. package/src/tools/listDirectoryTool.ts +55 -0
  125. package/src/tools/mcpResourceTools.ts +95 -0
  126. package/src/tools/permissionRules.ts +85 -0
  127. package/src/tools/privateContinuityEditTool.ts +178 -0
  128. package/src/tools/privateContinuityReadTool.ts +107 -0
  129. package/src/tools/readTool.ts +85 -0
  130. package/src/tools/registry.ts +67 -0
  131. package/src/tools/writeFileTool.ts +142 -0
  132. package/src/ui/BrandSplash.tsx +193 -0
  133. package/src/ui/ProgressBar.tsx +34 -0
  134. package/src/ui/Select.tsx +143 -0
  135. package/src/ui/Spinner.tsx +269 -0
  136. package/src/ui/Surface.tsx +47 -0
  137. package/src/ui/TextInput.tsx +97 -0
  138. package/src/ui/theme.ts +59 -0
  139. package/src/utils/clipboard.ts +216 -0
  140. package/src/utils/markdownSegments.ts +51 -0
  141. package/src/utils/messages.ts +35 -0
  142. package/src/utils/withRetry.ts +280 -0
  143. 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://bairon.dev/preview/cli.png" alt="ethagent" width="600" />
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 permanent Ethereum identity. Your knowledge base lives on IPFS. Your agent's identity is registered onchain, tied to your wallet. Your inference never leaves your machine.
4
+ A privacy-first AI agent with a portable Ethereum identity.
5
5
 
6
- ```bash
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
- ## What It Is
8
+ The identity stays portable. The model can change. The private memory stays under wallet-gated encryption.
11
9
 
12
- ethagent bootstraps a local LLM on your machine and builds a personal knowledge base from sources you define. It works completely offline. No wifi, no API, just your hardware. The model is hotswappable, and if you need to, you can point it at a cloud model without losing any context. Offline-capable agents are going to be a core part of how software gets built, and ethagent is built for that from day one.
10
+ ## Install
13
11
 
14
- - Your Ethereum address owns and controls your agent
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
- Wipe your laptop, restore from your address or ENS name, and you're back exactly where you left off.
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
- ```bash
22
- npx ethagent init --from bairon.eth
23
- npx ethagent init --from 0xA1E977e700bF82019beb381F1582575303A389CE
24
- ```
16
+ ## What It Does
25
17
 
26
- ## Why It Exists
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
- AI platforms compete aggressively and users switch between them constantly. Every time you do, your conversation history, custom instructions, and everything your agent learned about you resets to zero. But every prompt you sent to the old platform is still there, training their next model.
26
+ ## First Run
29
27
 
30
- ethagent breaks that cycle. Your knowledge lives on IPFS, your identity lives on Ethereum. Switch models whenever you want. Your agent remembers everything regardless. Your data stays yours, not by policy, but by architecture.
28
+ Start with `ethagent`. The setup flow asks for a model path first, then offers identity setup.
31
29
 
32
- ## How It Works
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
- ethagent accumulates a personal knowledge base from conversations, documents, and corrections you provide. That knowledge base is pinned to IPFS, so it's content-addressed, verifiable, and not locked to any single device. The underlying model is hotswappable, so you can run a local LLM or swap in a cloud model without losing any context.
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
- Your agent's identity is registered onchain using ERC-8004, the token standard for autonomous agents on Ethereum. Identity is tied to an Ethereum address or ENS name, meaning your agent can be fully restored on any machine from just your address.
34
+ ## Identity Hub
37
35
 
38
- Think of it like a tamagotchi that lives in your wallet. You raise it, you feed it knowledge, and only your key can summon it. Every interaction compounds. It doesn't flatten your context into a generic system prompt. It accumulates. And because it lives on IPFS, it follows you to any machine you bring your wallet to.
36
+ The Identity Hub is where the portable identity is managed.
39
37
 
40
- | Layer | Where | What it does |
41
- |-------|-------|--------------|
42
- | Inference | Your machine (or cloud) | Hotswappable model, local-first by default |
43
- | Knowledge | IPFS | Content-addressed, verifiable, portable across any machine |
44
- | Identity | Ethereum | Permanent agent registration via ERC-8004, restorable from address or ENS |
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
- Your knowledge base is encrypted with your wallet's key. Only you can decrypt it. Even though the data lives on IPFS, it's unreadable to anyone without your key. Nobody can clone your agent, read its memories, or extract what it knows about you.
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
- - [npm package](https://www.npmjs.com/package/ethagent)
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
- execFileSync('node', ['--import', 'tsx/esm', cli], { stdio: 'inherit' })
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,36 +1,58 @@
1
1
  {
2
2
  "name": "ethagent",
3
- "version": "0.2.0",
4
- "description": "A privacy-first AI agent with an Ethereum identity",
3
+ "version": "1.0.0",
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
- "ethagent": "./bin/ethagent.js"
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",
25
32
  "offline",
26
33
  "ens"
27
34
  ],
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "git+https://github.com/baairon/ethagent.git"
38
+ },
28
39
  "author": "bairon.eth",
29
40
  "license": "MIT",
30
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",
31
47
  "ink": "^6.8.0",
32
48
  "react": "^19.2.4",
33
- "tsx": "^4.21.0"
49
+ "tsx": "^4.21.0",
50
+ "viem": "^2.48.4",
51
+ "zod": "^3.25.76"
34
52
  },
35
- "devDependencies": {}
53
+ "devDependencies": {
54
+ "@types/node": "^25.6.0",
55
+ "@types/react": "^19.2.14",
56
+ "typescript": "^5.9.3"
57
+ }
36
58
  }