qlogicagent 0.4.0 → 0.5.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.
- package/README.md +383 -26
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,45 +1,402 @@
|
|
|
1
1
|
# qlogicagent
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
小智 Claw 的本地 AI Agent 运行时。作为 openclaw Gateway 的 CLI 子进程,通过 **JSON-RPC over stdio** 通信,执行完整的 Agent Loop。
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## 功能概览
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
- **44 个内置工具**: 文件操作、Shell 执行、代码编辑、Web 搜索/抓取、图片/视频/音乐生成、MCP 桥接等
|
|
8
|
+
- **多 LLM Provider**: OpenAI、Anthropic、DeepSeek 等,通过统一 `LLMTransport` 接口切换
|
|
9
|
+
- **编排策略**: failover 降级、指数退避重试、并行工具执行、14+ 上下文压缩策略、多代理团队协作
|
|
10
|
+
- **权限系统**: 命令安全分类、规则引擎、用户审批、破坏性命令警告
|
|
11
|
+
- **记忆系统**: 本地 MD 记忆 + QMemory 语义长期记忆 + 会话记忆自动提取 + Dream 整合
|
|
12
|
+
- **会话持久化**: JSONL 对话转录 + 状态快照 + 会话恢复
|
|
13
|
+
- **MCP 协议**: stdio/HTTP 传输、动态工具注入、资源发现
|
|
14
|
+
- **插件系统**: 用户级/项目级插件加载、插件 API
|
|
15
|
+
- **技能系统**: SKILL.md 发现/调用/管理、自主技能学习
|
|
16
|
+
- **Hook 系统**: 30+ 生命周期钩子点,可扩展不侵入核心
|
|
12
17
|
|
|
13
|
-
##
|
|
18
|
+
## 快速开始
|
|
14
19
|
|
|
15
|
-
1.
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
20
|
+
### 1. 环境准备
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
# Node.js 22+
|
|
24
|
+
node --version # v22.x.x+
|
|
25
|
+
|
|
26
|
+
# 安装依赖
|
|
27
|
+
pnpm install
|
|
28
|
+
|
|
29
|
+
# 构建
|
|
30
|
+
pnpm build
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### 2. 配置环境变量
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
cp .env.example .env
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
编辑 `.env`:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
# 日志级别
|
|
43
|
+
LOG_LEVEL=info
|
|
44
|
+
|
|
45
|
+
# QMemory 服务地址(启用长期记忆)
|
|
46
|
+
QMEMORY_BASE_URL=http://127.0.0.1:18800
|
|
47
|
+
|
|
48
|
+
# QMemory API Key(可选)
|
|
49
|
+
# QMEMORY_API_KEY=your-key
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### 3. 启动 QMemory(推荐)
|
|
53
|
+
|
|
54
|
+
qlogicagent 的完整功能依赖本地 QMemory 服务提供语义记忆:
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
# 方式一:直接运行(需 Python 3.11+)
|
|
58
|
+
cd ../qmemory
|
|
59
|
+
pip install -e .
|
|
60
|
+
python -m qmemory --port 18800
|
|
61
|
+
|
|
62
|
+
# 方式二:Docker
|
|
63
|
+
docker run -d -p 18800:18800 qmemory:latest
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
验证 QMemory 运行:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
curl http://127.0.0.1:18800/health
|
|
70
|
+
# {"status":"ok","version":"..."}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### 4. 作为子进程运行
|
|
74
|
+
|
|
75
|
+
qlogicagent 不独立运行,需要由 openclaw Gateway 或其他 JSON-RPC 宿主 spawn:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
# Gateway 自动 spawn(标准方式)
|
|
79
|
+
cd ../openclaw && node scripts/run-node.mjs gateway --port 18789
|
|
80
|
+
|
|
81
|
+
# 手动测试(开发调试用)
|
|
82
|
+
node dist/cli/main.js
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
启动后 agent 等待 stdin 接收 JSON-RPC 请求。
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## JSON-RPC 协议
|
|
90
|
+
|
|
91
|
+
### 请求方法
|
|
92
|
+
|
|
93
|
+
| 方法 | 说明 | 参数 |
|
|
94
|
+
|------|------|------|
|
|
95
|
+
| `agent.hello` | 协议握手 | `{ protocolVersion, hostName, hostVersion }` |
|
|
96
|
+
| `agent.ping` | 心跳检测 | — |
|
|
97
|
+
| `agent.turn` | 执行一轮对话 | 见下方详细说明 |
|
|
98
|
+
| `agent.abort` | 中止当前 turn | `{ turnId }` |
|
|
99
|
+
| `session.list` | 列出历史会话 | `{ limit? }` |
|
|
100
|
+
| `session.resume` | 恢复会话 | `{ sessionId }` |
|
|
101
|
+
| `memory.dream` | 触发记忆整合 | — |
|
|
102
|
+
| `tool.approval.response` | 工具审批响应 | `{ approvalId, decision }` |
|
|
103
|
+
|
|
104
|
+
### agent.turn 参数
|
|
105
|
+
|
|
106
|
+
```json
|
|
107
|
+
{
|
|
108
|
+
"jsonrpc": "2.0",
|
|
109
|
+
"id": 1,
|
|
110
|
+
"method": "agent.turn",
|
|
111
|
+
"params": {
|
|
112
|
+
"turnId": "turn-001",
|
|
113
|
+
"sessionId": "sess-001",
|
|
114
|
+
"messages": [
|
|
115
|
+
{ "role": "user", "content": "帮我分析 src/ 目录结构" }
|
|
116
|
+
],
|
|
117
|
+
"tools": [],
|
|
118
|
+
"config": {
|
|
119
|
+
"provider": "deepseek",
|
|
120
|
+
"model": "deepseek-chat",
|
|
121
|
+
"apiKey": "sk-...",
|
|
122
|
+
"baseUrl": "https://api.deepseek.com",
|
|
123
|
+
"maxRounds": 25,
|
|
124
|
+
"temperature": 0.7,
|
|
125
|
+
"workdir": "/path/to/project",
|
|
126
|
+
"mcpServers": {
|
|
127
|
+
"filesystem": {
|
|
128
|
+
"command": "npx",
|
|
129
|
+
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"]
|
|
130
|
+
}
|
|
131
|
+
},
|
|
132
|
+
"skillPaths": ["/path/to/skills"],
|
|
133
|
+
"systemPrompt": "You are a helpful assistant."
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### 事件流(Agent → Host)
|
|
140
|
+
|
|
141
|
+
| 事件 | 说明 |
|
|
142
|
+
|------|------|
|
|
143
|
+
| `turn.start` | 轮次开始 |
|
|
144
|
+
| `turn.delta` | 文本流式增量 `{ text }` |
|
|
145
|
+
| `turn.end` | 轮次结束 `{ content, usage, model, provider }` |
|
|
146
|
+
| `turn.error` | 执行错误 `{ error, code }` |
|
|
147
|
+
| `turn.tool_call` | 工具调用 `{ callId, name }` |
|
|
148
|
+
| `turn.tool_result` | 工具结果 `{ callId, name, ok }` |
|
|
149
|
+
| `turn.tool_blocked` | 权限拦截 `{ callId, name, reason }` |
|
|
150
|
+
| `turn.skill_instruction` | 技能指令 `{ instruction }` |
|
|
151
|
+
| `turn.sidechain_started` | 子代理启动 `{ depth, role }` |
|
|
152
|
+
| `turn.sidechain_completed` | 子代理完成 `{ depth, toolCallCount }` |
|
|
153
|
+
| `turn.recovery` | 错误恢复 `{ action }` |
|
|
154
|
+
| `turn.plan_update` | 计划更新 `{ slug, content }` |
|
|
155
|
+
| `tool.approval.request` | 请求审批 `{ approvalId, toolName, arguments, message }` |
|
|
156
|
+
|
|
157
|
+
---
|
|
19
158
|
|
|
20
159
|
## 模块结构
|
|
21
160
|
|
|
22
161
|
```
|
|
23
162
|
src/
|
|
24
|
-
├── cli/
|
|
25
|
-
├──
|
|
26
|
-
├──
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
├──
|
|
30
|
-
├──
|
|
31
|
-
|
|
163
|
+
├── cli/ # 组合根:JSON-RPC 协议 + 全模块装配
|
|
164
|
+
│ ├── main.ts # 进程入口
|
|
165
|
+
│ ├── stdio-server.ts # StdioServer (JSON-RPC handler, 工具注册, 配置解析)
|
|
166
|
+
│ └── tool-bootstrap.ts# 工具注册初始化
|
|
167
|
+
│
|
|
168
|
+
├── agent/ # Agent 核心:推理 + 工具循环
|
|
169
|
+
│ ├── agent.ts # Agent 类 (async generator run())
|
|
170
|
+
│ ├── tool-loop.ts # 工具调用循环
|
|
171
|
+
│ ├── types.ts # 核心类型 (ChatMessage, TurnEvent, ToolInvoker...)
|
|
172
|
+
│ └── constants.ts # 运行参数常量
|
|
173
|
+
│
|
|
174
|
+
├── llm/ # LLM 通信层(完全隔离)
|
|
175
|
+
│ ├── transport.ts # LLMTransport 接口
|
|
176
|
+
│ ├── transports/ # OpenAI / Anthropic 实现
|
|
177
|
+
│ ├── provider-registry.ts # Provider 注册表
|
|
178
|
+
│ ├── model-catalog.ts # 模型能力目录
|
|
179
|
+
│ └── llm-client.ts # 一站式客户端工厂
|
|
180
|
+
│
|
|
181
|
+
├── orchestration/ # 编排策略层(纯函数,零外部依赖)
|
|
182
|
+
│ ├── tool-loop-state.ts # 工具循环 FSM
|
|
183
|
+
│ ├── context-compression.ts # 14+ 压缩策略
|
|
184
|
+
│ ├── error-classification.ts # 错误分类
|
|
185
|
+
│ ├── retry-loop.ts # 重试策略
|
|
186
|
+
│ ├── agent-registry.ts # 内置代理类型
|
|
187
|
+
│ ├── fork-subagent.ts # 子代理 fork
|
|
188
|
+
│ ├── team-orchestration.ts # 多代理团队
|
|
189
|
+
│ └── ... # 23 个策略文件
|
|
190
|
+
│
|
|
191
|
+
├── runtime/ # 运行时服务层
|
|
192
|
+
│ ├── session-state.ts # 会话成本追踪
|
|
193
|
+
│ ├── session-persistence.ts # JSONL 对话持久化
|
|
194
|
+
│ ├── session-memory.ts # 会话记忆提取
|
|
195
|
+
│ ├── hook-registry.ts # Hook 系统实现
|
|
196
|
+
│ ├── forked-agent.ts # 子代理执行
|
|
197
|
+
│ ├── dream-agent.ts # 记忆整合 (Dream)
|
|
198
|
+
│ ├── secure-storage.ts # 凭据安全存储
|
|
199
|
+
│ ├── token-budget.ts # Token 预算管理
|
|
200
|
+
│ ├── instruction-loader.ts # .instructions.md 加载
|
|
201
|
+
│ └── ... # 21 个运行时文件
|
|
202
|
+
│
|
|
203
|
+
├── skills/ # 工具与技能层
|
|
204
|
+
│ ├── portable-tool.ts # PortableTool 契约接口
|
|
205
|
+
│ ├── tool-registry.ts # 工具注册表
|
|
206
|
+
│ ├── tools/ # 44 个内置工具
|
|
207
|
+
│ │ ├── shell/ # 命令执行子系统 (11 文件)
|
|
208
|
+
│ │ ├── exec-tool.ts # Shell 执行
|
|
209
|
+
│ │ ├── read-tool.ts # 文件读取
|
|
210
|
+
│ │ ├── write-tool.ts # 文件写入
|
|
211
|
+
│ │ ├── edit-tool.ts # 文件编辑
|
|
212
|
+
│ │ ├── search-tool.ts # 文件搜索
|
|
213
|
+
│ │ ├── web-search-tool.ts # Web 搜索
|
|
214
|
+
│ │ ├── agent-tool.ts # 子代理调用
|
|
215
|
+
│ │ ├── team-tool.ts # 团队管理
|
|
216
|
+
│ │ ├── mcp-tool.ts # MCP 服务器管理
|
|
217
|
+
│ │ └── ... # 其他工具
|
|
218
|
+
│ ├── mcp/ # MCP 桥接 (4 文件)
|
|
219
|
+
│ ├── permissions/ # 权限系统 (9 文件)
|
|
220
|
+
│ ├── plugins/ # 插件系统 (4 文件)
|
|
221
|
+
│ ├── memory-tool.ts # 记忆工具 (MD + QMemory)
|
|
222
|
+
│ ├── qmemory-adapter.ts # QMemory HTTP 适配器
|
|
223
|
+
│ └── skill-loader.ts # 技能发现/加载
|
|
224
|
+
│
|
|
225
|
+
├── contracts/ # 纯类型契约(零依赖)
|
|
226
|
+
│ ├── hooks.ts # 30+ Hook 点定义
|
|
227
|
+
│ ├── planner.ts # 规划器类型
|
|
228
|
+
│ ├── todo.ts # 待办类型
|
|
229
|
+
│ └── skill-candidate.ts # 技能候选类型
|
|
230
|
+
│
|
|
231
|
+
└── config/ # 配置管理
|
|
232
|
+
└── config.ts # CLI 参数解析
|
|
32
233
|
```
|
|
33
234
|
|
|
34
|
-
|
|
235
|
+
---
|
|
236
|
+
|
|
237
|
+
## QMemory 集成
|
|
238
|
+
|
|
239
|
+
qlogicagent 通过 HTTP 连接本地 QMemory 服务实现语义长期记忆。
|
|
240
|
+
|
|
241
|
+
### 记忆层次
|
|
242
|
+
|
|
243
|
+
| 层 | 说明 | 存储 |
|
|
244
|
+
|----|------|------|
|
|
245
|
+
| **MD 记忆** | Agent 主动管理的笔记 (add/replace/remove) | `~/.openclaw/session-memory.md` |
|
|
246
|
+
| **QMemory** | 语义向量记忆,自动提取 + 语义召回 | QMemory 服务 (SQLite + embedding) |
|
|
247
|
+
| **会话转录** | JSONL 对话记录,用于会话恢复 | `~/.openclaw/sessions/<id>/` |
|
|
248
|
+
|
|
249
|
+
### 启用步骤
|
|
250
|
+
|
|
251
|
+
1. 启动 QMemory 服务(见上方"快速开始")
|
|
252
|
+
2. 设置环境变量:`QMEMORY_BASE_URL=http://127.0.0.1:18800`
|
|
253
|
+
3. Agent 自动:
|
|
254
|
+
- 在 `memory.before_recall` hook 预取相关记忆
|
|
255
|
+
- 通过 `memory` 工具的 `search` action 查询语义记忆
|
|
256
|
+
- 会话结束时自动提取关键信息写入 QMemory
|
|
257
|
+
- 达到阈值后触发 Dream 整合(4 阶段:Orient → Gather → Consolidate → Prune)
|
|
258
|
+
|
|
259
|
+
### 不启用 QMemory
|
|
260
|
+
|
|
261
|
+
如果不设置 `QMEMORY_BASE_URL`,Agent 仍可运行,但:
|
|
262
|
+
- ❌ 无语义记忆召回
|
|
263
|
+
- ❌ 无自动记忆提取
|
|
264
|
+
- ❌ 无 Dream 整合
|
|
265
|
+
- ✅ MD 本地记忆仍可用
|
|
266
|
+
- ✅ 会话转录仍正常
|
|
267
|
+
|
|
268
|
+
---
|
|
269
|
+
|
|
270
|
+
## 配置文件
|
|
271
|
+
|
|
272
|
+
### 环境变量
|
|
273
|
+
|
|
274
|
+
| 变量 | 说明 | 默认值 |
|
|
275
|
+
|------|------|--------|
|
|
276
|
+
| `LOG_LEVEL` | 日志级别 (debug/info/warn/error) | `info` |
|
|
277
|
+
| `QMEMORY_BASE_URL` | QMemory 服务地址 | 不设则禁用 |
|
|
278
|
+
| `QMEMORY_API_KEY` | QMemory 认证 Key | — |
|
|
279
|
+
| `QLOGICAGENT_QMEMORY_BASE_URL` | QMemory 地址 (备选变量名) | — |
|
|
280
|
+
|
|
281
|
+
### 用户级配置(`~/.openclaw/`)
|
|
282
|
+
|
|
283
|
+
| 路径 | 说明 |
|
|
284
|
+
|------|------|
|
|
285
|
+
| `~/.openclaw/settings.json` | 权限规则、行为模式 |
|
|
286
|
+
| `~/.openclaw/mcp.json` | 全局 MCP 服务器配置 |
|
|
287
|
+
| `~/.openclaw/plugins/` | 用户级插件目录 |
|
|
288
|
+
| `~/.openclaw/INSTRUCTIONS.md` | 用户级指令 |
|
|
289
|
+
| `~/.openclaw/session-memory.md` | MD 记忆文件 |
|
|
290
|
+
| `~/.openclaw/sessions/` | 会话持久化目录 |
|
|
291
|
+
| `~/.openclaw/.credentials.json` | 安全凭据存储 (0o600) |
|
|
292
|
+
|
|
293
|
+
### 项目级配置
|
|
294
|
+
|
|
295
|
+
| 路径 | 说明 |
|
|
296
|
+
|------|------|
|
|
297
|
+
| `.openclaw/settings.json` | 项目权限规则 |
|
|
298
|
+
| `.openclaw/plugins/` | 项目级插件 |
|
|
299
|
+
| `.openclaw/INSTRUCTIONS.md` | 项目指令 |
|
|
300
|
+
| `INSTRUCTIONS.md` | 项目指令 (根目录) |
|
|
301
|
+
| `INSTRUCTIONS.local.md` | 本地私有指令 |
|
|
302
|
+
|
|
303
|
+
---
|
|
304
|
+
|
|
305
|
+
## MCP 配置
|
|
306
|
+
|
|
307
|
+
### 全局 MCP(`~/.openclaw/mcp.json`)
|
|
308
|
+
|
|
309
|
+
```json
|
|
310
|
+
{
|
|
311
|
+
"filesystem": {
|
|
312
|
+
"command": "npx",
|
|
313
|
+
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/home/user"]
|
|
314
|
+
},
|
|
315
|
+
"github": {
|
|
316
|
+
"command": "npx",
|
|
317
|
+
"args": ["-y", "@modelcontextprotocol/server-github"],
|
|
318
|
+
"env": { "GITHUB_TOKEN": "ghp_..." }
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
### Per-Turn MCP(通过 `agent.turn` config)
|
|
324
|
+
|
|
325
|
+
```json
|
|
326
|
+
{
|
|
327
|
+
"config": {
|
|
328
|
+
"mcpServers": {
|
|
329
|
+
"project-db": {
|
|
330
|
+
"type": "http",
|
|
331
|
+
"url": "http://localhost:3100/mcp"
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
MCP 工具自动注入到 Agent 工具列表,前缀格式:`mcp__servername__toolname`。
|
|
339
|
+
|
|
340
|
+
---
|
|
341
|
+
|
|
342
|
+
## 权限配置
|
|
343
|
+
|
|
344
|
+
### `~/.openclaw/settings.json`
|
|
345
|
+
|
|
346
|
+
```json
|
|
347
|
+
{
|
|
348
|
+
"permissionMode": "default",
|
|
349
|
+
"defaultBehavior": "ask",
|
|
350
|
+
"permissionRules": [
|
|
351
|
+
{
|
|
352
|
+
"pattern": "read",
|
|
353
|
+
"behavior": "allow"
|
|
354
|
+
},
|
|
355
|
+
{
|
|
356
|
+
"pattern": "exec",
|
|
357
|
+
"behavior": "ask"
|
|
358
|
+
},
|
|
359
|
+
{
|
|
360
|
+
"pattern": "write:**/node_modules/**",
|
|
361
|
+
"behavior": "deny"
|
|
362
|
+
}
|
|
363
|
+
]
|
|
364
|
+
}
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
`behavior` 可选值:`allow`(自动允许)、`ask`(请求审批)、`deny`(拒绝)。
|
|
368
|
+
|
|
369
|
+
---
|
|
370
|
+
|
|
371
|
+
## 开发命令
|
|
35
372
|
|
|
36
373
|
```bash
|
|
37
|
-
pnpm
|
|
38
|
-
pnpm
|
|
39
|
-
pnpm dev
|
|
374
|
+
pnpm install # 安装依赖
|
|
375
|
+
pnpm build # esbuild 构建 (scripts/build.mjs)
|
|
376
|
+
pnpm dev # tsx watch 开发模式
|
|
377
|
+
pnpm test # vitest 运行测试
|
|
378
|
+
pnpm test:watch # vitest watch 模式
|
|
379
|
+
pnpm lint # oxlint 代码检查
|
|
380
|
+
pnpm start # 启动 CLI (node dist/cli/main.js)
|
|
40
381
|
```
|
|
41
382
|
|
|
42
383
|
## 测试
|
|
43
384
|
|
|
44
|
-
|
|
45
|
-
|
|
385
|
+
```bash
|
|
386
|
+
pnpm test # 全部测试
|
|
387
|
+
pnpm test -- test/e2e # E2E 协议测试
|
|
388
|
+
pnpm test -- --coverage # 覆盖率
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
- 单元测试:`test/` — LLM provider、orchestration、tool、permission
|
|
392
|
+
- E2E 测试:`test/e2e/` — spawn CLI 进程验证 JSON-RPC 协议
|
|
393
|
+
|
|
394
|
+
## 发布
|
|
395
|
+
|
|
396
|
+
```bash
|
|
397
|
+
# 版本已在 package.json 中更新后:
|
|
398
|
+
git tag v0.4.0
|
|
399
|
+
git push origin master
|
|
400
|
+
git push origin v0.4.0
|
|
401
|
+
# Gitee 流水线自动: build → test → npm publish → Gitee Release
|
|
402
|
+
```
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "qlogicagent",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "XiaozhiClaw Agent CLI — subprocess architecture (JSON-RPC over stdio)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -54,4 +54,4 @@
|
|
|
54
54
|
"typescript": "^5.9.0",
|
|
55
55
|
"vitest": "^3.1.0"
|
|
56
56
|
}
|
|
57
|
-
}
|
|
57
|
+
}
|