evaengine 1.0.3 → 1.0.5

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.
@@ -1,504 +0,0 @@
1
- # EvaEngine Runtime Architecture
2
-
3
- **文档类型**: Runtime Architecture
4
- **目标读者**: AI Coding Agent
5
- **适用范围**: EvaEngine Runtime 及其后续演进
6
-
7
- ## 1. Runtime 的目的
8
-
9
- EvaEngine Runtime 的目的,是把一个 Node.js 应用从“若干可执行模块”组织成“一个具有统一运行规则的应用系统”。
10
-
11
- Runtime 解决的核心问题不是 HTTP 路由,而是:
12
-
13
- - 不同应用入口如何共享同一套能力。
14
- - 基础设施何时创建、如何替换、何时关闭。
15
- - 配置、日志、缓存、认证、数据库和外部服务如何被统一装配。
16
- - 应用组件如何在运行前被发现、注册和验证。
17
- - CLI、Cron、HTTP 等入口如何进入相同的应用执行模型。
18
-
19
- Runtime 的基本设计判断是:
20
-
21
- > 入口可以不同,运行时能力和生命周期必须保持一致。
22
-
23
- ## 2. Runtime 的边界
24
-
25
- Runtime 位于应用入口和基础设施之间:
26
-
27
- ```text
28
- External Entry
29
- HTTP / CLI / Cron / Worker
30
- |
31
- v
32
- Application Runtime
33
- Context / Providers / DI / Lifecycle
34
- |
35
- v
36
- Application Capabilities
37
- Config / Logger / Cache / DB / HTTP / Auth / Events
38
- |
39
- v
40
- Infrastructure and Domain
41
- ```
42
-
43
- Runtime 不拥有具体业务规则,也不应成为所有业务逻辑的容器。它负责组装、协调和约束,而不是决定领域行为。
44
-
45
- ## 3. 生命周期
46
-
47
- ### 3.1 生命周期阶段
48
-
49
- EvaEngine 当前的运行过程可以抽象为:
50
-
51
- ```text
52
- Construct
53
- -> Register
54
- -> Bootstrap
55
- -> Bind
56
- -> Execute
57
- -> Stop
58
- -> Shutdown
59
- ```
60
-
61
- ### 3.2 Construct
62
-
63
- Runtime 首先建立应用上下文,包括:
64
-
65
- - 项目根目录。
66
- - 配置目录。
67
- - 源码目录。
68
- - 运行模式。
69
- - 端口和入口相关元数据。
70
-
71
- 设计原因:
72
-
73
- 所有后续组件都应从同一个 Runtime context 获取环境信息,而不是各自推断工作目录、配置位置或运行模式。
74
-
75
- ### 3.3 Register
76
-
77
- Register 阶段声明 Runtime 将提供哪些能力:
78
-
79
- - 基础服务。
80
- - Web 专用服务。
81
- - CLI 专用服务。
82
- - Middleware。
83
- - Command。
84
- - 可选实现,例如不同 JWT provider。
85
-
86
- Register 的主要职责是建立组件关系,不应在此阶段执行长时间外部操作。
87
-
88
- ### 3.4 Bootstrap
89
-
90
- Bootstrap 阶段根据当前运行模式完成 Provider 装配:
91
-
92
- ```text
93
- Runtime
94
- -> Service Providers
95
- -> DI bindings
96
- -> Service graph
97
- -> Middleware Providers
98
- -> middleware bindings
99
- -> Command registration
100
- ```
101
-
102
- Bootstrap 的意义是让应用在真正执行请求或命令之前拥有一个可预测的能力图谱。
103
-
104
- ### 3.5 Bind
105
-
106
- Provider 把能力绑定到 DI container。绑定可以是:
107
-
108
- - Class。
109
- - Value。
110
- - Factory/method。
111
- - 根据配置选择的实现。
112
-
113
- DI 负责延迟解析和构造对象。这样 Runtime 可以在装配阶段描述依赖,而不需要立即创建所有外部资源。
114
-
115
- ### 3.6 Execute
116
-
117
- 执行阶段由不同入口驱动:
118
-
119
- - HTTP 请求进入 Express middleware chain。
120
- - CLI 参数进入 Command。
121
- - Cron schedule 触发 Command。
122
- - 未来 Worker 可以进入同一 Command/Use Case boundary。
123
-
124
- 执行阶段应该只依赖已经完成 bootstrap 的 Runtime context。
125
-
126
- ### 3.7 Stop
127
-
128
- Stop 阶段停止接受新的执行工作:
129
-
130
- - 停止 Cron 调度。
131
- - 停止接收新的 HTTP 请求。
132
- - 停止派发新的后台任务。
133
- - 等待必要的进行中操作完成。
134
-
135
- ### 3.8 Shutdown
136
-
137
- Shutdown 阶段释放 Runtime 持有的资源:
138
-
139
- - Redis/数据库连接。
140
- - HTTP client 连接。
141
- - Event/worker 资源。
142
- - 日志和 tracing buffer。
143
- - HTTP server。
144
-
145
- 当前实现对 shutdown 的协调仍然不完整。未来 Runtime 应将 shutdown 变成 Provider 的正式契约,而不是由调用者分别清理资源。
146
-
147
- ## 4. 核心组件关系
148
-
149
- ### 4.1 Engine
150
-
151
- Engine 是 Runtime 的控制中心。它负责:
152
-
153
- - 识别运行模式。
154
- - 组织 Provider 注册顺序。
155
- - 管理 HTTP/CLI/Cron 入口。
156
- - 保存应用 metadata。
157
- - 管理 Command registry。
158
- - 安装默认错误处理。
159
- - 持有 server 和 Cron 生命周期状态。
160
-
161
- Engine 不应直接承担领域逻辑。它只应协调入口、能力和生命周期。
162
-
163
- ### 4.2 Runtime Context
164
-
165
- 当前 Runtime context 主要由 Engine metadata、DI container 和运行状态共同表达。
166
-
167
- 概念上,Runtime context 应包含:
168
-
169
- ```text
170
- RuntimeContext
171
- metadata
172
- mode
173
- configuration
174
- provider registry
175
- dependency container
176
- resource registry
177
- logger/observability
178
- shutdown state
179
- ```
180
-
181
- 将这些状态显式集中在 Context 中,可以避免多个 Engine 实例之间共享隐式全局状态。
182
-
183
- ### 4.3 Provider Registry
184
-
185
- Provider Registry 描述 Runtime 可以装配哪些能力。Provider 的作用是把能力从具体实现中隔离出来。
186
-
187
- ```text
188
- Provider
189
- -> choose implementation
190
- -> configure implementation
191
- -> bind capability
192
- -> participate in lifecycle
193
- ```
194
-
195
- 例如,认证能力可以根据配置选择 local JWT 或 Kong JWT;缓存能力可以选择 Redis store 或 Null store。
196
-
197
- ### 4.4 DI Container
198
-
199
- DI Container 是运行时对象图的解析器,而不是业务注册表。
200
-
201
- 它解决:
202
-
203
- - 依赖关系解析。
204
- - 延迟实例化。
205
- - 测试替换。
206
- - 命名 capability 绑定。
207
-
208
- 它不应成为业务状态的长期存储,也不应隐藏跨 Runtime 的共享状态。
209
-
210
- ### 4.5 Service Capabilities
211
-
212
- 服务是 Runtime 暴露给应用的能力边界,例如 Config、Logger、Redis、Cache、HTTP client、JWT 和 EventManager。
213
-
214
- 组件关系:
215
-
216
- ```text
217
- Provider
218
- -> DI binding
219
- -> Service capability
220
- -> Domain/Application consumer
221
- ```
222
-
223
- 应用依赖 capability 的行为,而不是依赖具体第三方库的对象结构。
224
-
225
- ### 4.6 Middleware Runtime
226
-
227
- Middleware Provider 把认证、Session、Trace、Validation、Debug 和 Cache 等横切能力装配到 HTTP pipeline。
228
-
229
- ```text
230
- Request
231
- -> Session
232
- -> Auth
233
- -> Validation
234
- -> Trace/Debug/Cache
235
- -> Application handler
236
- -> Error handler
237
- ```
238
-
239
- Middleware 的设计原因是把跨请求的规则集中处理,避免业务 handler 重复实现安全、日志和观测逻辑。
240
-
241
- ### 4.7 Command Runtime
242
-
243
- Command 是 CLI、Cron 和未来 Worker 入口的统一适配层。
244
-
245
- ```text
246
- CLI/Cron/Worker
247
- -> Command
248
- -> Application operation
249
- ```
250
-
251
- Command 应保持轻量,负责输入解析和执行编排;业务规则应继续下沉到 Use Case 或 Domain service。
252
-
253
- ## 5. 数据流
254
-
255
- ### 5.1 Bootstrap 数据流
256
-
257
- ```text
258
- Project metadata
259
- -> Config path and runtime mode
260
- -> Config capability
261
- -> Provider decisions
262
- -> DI bindings
263
- -> Resolvable service graph
264
- ```
265
-
266
- 配置首先影响 Runtime context,随后影响 Provider 选择,最后影响具体服务实例。
267
-
268
- 因此配置不是普通的全局变量,而是 Runtime capability 的输入。
269
-
270
- ### 5.2 HTTP 数据流
271
-
272
- ```text
273
- HTTP request
274
- -> Runtime middleware chain
275
- -> request context / namespace
276
- -> authentication and validation
277
- -> application handler
278
- -> injected services
279
- -> domain/persistence/external APIs
280
- -> response
281
- -> logs/traces/cache headers
282
- ```
283
-
284
- 请求数据应沿着明确的边界流动:
285
-
286
- - Request metadata 由 middleware 提取。
287
- - Auth 结果写入 request context。
288
- - 业务逻辑通过 capability 访问外部资源。
289
- - Response metadata 由 Trace、Cache 和错误处理统一补充。
290
-
291
- ### 5.3 CLI/Cron 数据流
292
-
293
- ```text
294
- Arguments or schedule
295
- -> Command metadata
296
- -> parsed options
297
- -> Command instance
298
- -> injected capabilities
299
- -> application operation
300
- -> result / error / logs
301
- ```
302
-
303
- CLI 和 Cron 不应重新创建一套基础设施。它们应复用同一 Runtime provider model。
304
-
305
- ### 5.4 Metadata 数据流
306
-
307
- ```text
308
- Source / Entity / Exception metadata
309
- -> scanner/parser
310
- -> registry or fragment model
311
- -> generated contract
312
- -> Swagger/OpenAPI/diagnostic output
313
- ```
314
-
315
- Metadata pipeline 的目的,是让 Runtime 可以理解和描述应用,而不是只执行应用。
316
-
317
- ## 6. 控制流
318
-
319
- ### 6.1 Web 控制流
320
-
321
- ```text
322
- new Engine
323
- -> bootstrap web providers
324
- -> register middleware
325
- -> attach error handling
326
- -> start HTTP server
327
- -> receive request
328
- -> execute middleware chain
329
- -> invoke application handler
330
- -> finalize response
331
- -> shutdown on process termination
332
- ```
333
-
334
- Engine 控制入口,Provider 控制能力,Middleware 控制请求横切行为,Application handler 控制具体业务流程。
335
-
336
- ### 6.2 CLI 控制流
337
-
338
- ```text
339
- new Engine(cli)
340
- -> bootstrap CLI providers
341
- -> register command classes
342
- -> parse command name and options
343
- -> instantiate selected command
344
- -> execute command
345
- -> report error
346
- -> release resources
347
- ```
348
-
349
- Command registry 是 CLI 控制流中的路由表。Command name 是外部入口到应用操作之间的稳定标识。
350
-
351
- ### 6.3 Cron 控制流
352
-
353
- ```text
354
- register schedule
355
- -> validate command exists
356
- -> create scheduler handle
357
- -> invoke command per schedule
358
- -> retain handle
359
- -> clear handles during stop
360
- ```
361
-
362
- Cron handler 必须可被追踪和清理。调度器不能成为脱离 Runtime 生命周期的后台资源。
363
-
364
- ### 6.4 错误控制流
365
-
366
- ```text
367
- failure in capability / middleware / command
368
- -> wrapper or runtime boundary
369
- -> normalized error
370
- -> application error handler
371
- -> log/trace
372
- -> protocol-specific response or process result
373
- ```
374
-
375
- 错误处理的目的不是隐藏错误,而是让错误在正确的 Runtime boundary 被分类、观测和转换。
376
-
377
- ## 7. 扩展点
378
-
379
- ### 7.1 Service Provider
380
-
381
- 最主要的 Runtime 扩展点。
382
-
383
- 适用于:
384
-
385
- - 新增基础设施能力。
386
- - 替换现有实现。
387
- - 根据配置选择实现。
388
- - 为测试提供 fake capability。
389
-
390
- 新增 Provider 时必须定义:
391
-
392
- - capability name。
393
- - 输入配置。
394
- - 依赖关系。
395
- - 实例生命周期。
396
- - 失败语义。
397
- - shutdown 行为。
398
-
399
- ### 7.2 Middleware Provider
400
-
401
- 适用于 HTTP 横切能力:
402
-
403
- - Authentication。
404
- - Authorization。
405
- - Validation。
406
- - Tracing。
407
- - Request/response logging。
408
- - Rate limiting。
409
- - Caching。
410
-
411
- Middleware 不应直接把不可替换的基础设施对象暴露给业务层。
412
-
413
- ### 7.3 Command
414
-
415
- 适用于 CLI、Cron 和 Worker adapter。Command 应声明自己的名称、描述和输入规格,并将业务执行交给 Use Case。
416
-
417
- ### 7.4 Capability Adapter
418
-
419
- 当接入新的数据库、消息系统、外部 API 或观测系统时,应先增加 capability adapter,再由 Provider 绑定,而不是从 Engine 或业务代码直接调用第三方库。
420
-
421
- ### 7.5 Metadata Provider
422
-
423
- 适用于:
424
-
425
- - OpenAPI/Swagger。
426
- - Domain schema。
427
- - AI tool schema。
428
- - Command catalog。
429
- - Event schema。
430
- - Runtime diagnostics。
431
-
432
- Metadata provider 必须使用明确 schema,不应依赖无法解释的隐式扫描结果。
433
-
434
- ## 8. 设计限制
435
-
436
- ### 8.1 当前生命周期不完整
437
-
438
- Provider 当前以注册为主,boot/start/stop/shutdown 语义尚未完全统一。因此资源创建和释放仍可能分散在 Service、Engine 或调用者中。
439
-
440
- ### 8.2 全局状态风险
441
-
442
- DI、Express app、配置、Redis client 或其他 registry 如果以全局状态存在,会限制多 Runtime 并存、测试隔离和多租户场景。
443
-
444
- ### 8.3 DI 是运行时类型系统
445
-
446
- 命名 DI 缺少编译期检查。错误的名称、错误的绑定顺序和错误的实例类型可能在运行时才暴露。
447
-
448
- ### 8.4 Entity 与 Persistence 耦合
449
-
450
- Entity runtime 同时承担模型扫描、ORM model、查询和 metadata 来源。它不等同于独立 Domain Entity。
451
-
452
- ### 8.5 EventManager 不是可靠消息系统
453
-
454
- 进程内事件不提供持久化、重试、跨进程传递或 dead-letter 语义。
455
-
456
- ### 8.6 Middleware 顺序是隐含契约
457
-
458
- Session、Auth、Trace、Validation、Cache 和 Error handler 的顺序会影响行为。新增 middleware 时必须明确其前置依赖和响应阶段行为。
459
-
460
- ### 8.7 自动扫描带来隐式依赖
461
-
462
- 文件扫描和 metadata 推断降低了配置成本,但也会使依赖关系不明显。扫描失败、文件命名变化或 schema 变化必须具有可诊断错误。
463
-
464
- ### 8.8 第三方实现不属于 Runtime contract
465
-
466
- Redis client、ORM、HTTP client、logger、scheduler 等库都应被视为可替换实现。Runtime contract 不应暴露它们的内部字段、生命周期或错误类型,除非这是明确的兼容性承诺。
467
-
468
- ## 9. AI Agent 修改规则
469
-
470
- AI Agent 在修改 Runtime 相关代码时,应按以下顺序判断:
471
-
472
- 1. 这是入口控制、能力装配、请求流、命令流还是资源生命周期问题?
473
- 2. 修改的是 public contract 还是内部实现?
474
- 3. 是否改变了 Provider 注册顺序或依赖图?
475
- 4. 是否引入了新的全局状态或隐式 singleton?
476
- 5. 是否需要新的 shutdown 行为?
477
- 6. 是否改变了 HTTP、CLI、Cron 之间的共享语义?
478
- 7. 是否需要 capability contract test,而不仅是单元测试?
479
- 8. 是否可以通过 adapter 隔离第三方依赖?
480
-
481
- 默认原则:
482
-
483
- - 先保持 Runtime 语义,再优化实现。
484
- - 先定义边界,再添加依赖。
485
- - 先补生命周期,再引入长连接或后台任务。
486
- - 先验证错误和关闭路径,再验证 happy path。
487
- - 不把 Domain logic 放入 Engine、Provider 或 Middleware。
488
-
489
- ## 10. Runtime 结论
490
-
491
- EvaEngine Runtime 的价值在于统一应用入口、集中装配能力、控制基础设施边界,并让应用可以在 Web、CLI 和 Cron 等运行模式之间共享同一套架构语义。
492
-
493
- 它的核心不是 Engine 对象本身,而是以下关系:
494
-
495
- ```text
496
- Runtime controls lifecycle
497
- Provider composes capabilities
498
- DI resolves dependencies
499
- Middleware shapes request flow
500
- Command adapts non-HTTP entry points
501
- Metadata explains application structure
502
- ```
503
-
504
- 未来 Runtime 的演进方向,应继续保留这些关系,同时加强 Context 隔离、Provider lifecycle、类型安全、可观测性和可靠资源关闭。