@gt-fe/eap-runtime 0.0.8
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 +323 -0
- package/dist/api/handlers/index.d.ts +3 -0
- package/dist/api/handlers/index.js +4 -0
- package/dist/api/handlers/invoke.handler.d.ts +77 -0
- package/dist/api/handlers/invoke.handler.js +411 -0
- package/dist/api/handlers/messages.handler.d.ts +53 -0
- package/dist/api/handlers/messages.handler.js +80 -0
- package/dist/api/handlers/stream.handler.d.ts +92 -0
- package/dist/api/handlers/stream.handler.js +432 -0
- package/dist/api/index.d.ts +3 -0
- package/dist/api/index.js +4 -0
- package/dist/api/middleware/auth.middleware.d.ts +96 -0
- package/dist/api/middleware/auth.middleware.js +158 -0
- package/dist/api/middleware/index.d.ts +1 -0
- package/dist/api/middleware/index.js +2 -0
- package/dist/api/routes/agent.routes.d.ts +44 -0
- package/dist/api/routes/agent.routes.js +204 -0
- package/dist/api/routes/index.d.ts +3 -0
- package/dist/api/routes/index.js +4 -0
- package/dist/api/routes/session.routes.d.ts +82 -0
- package/dist/api/routes/session.routes.js +169 -0
- package/dist/api/routes/task.routes.d.ts +75 -0
- package/dist/api/routes/task.routes.js +108 -0
- package/dist/checkpoint/checkpoint-serializer.d.ts +58 -0
- package/dist/checkpoint/checkpoint-serializer.js +81 -0
- package/dist/checkpoint/composite-checkpoint-saver.d.ts +42 -0
- package/dist/checkpoint/composite-checkpoint-saver.js +118 -0
- package/dist/checkpoint/contracts/checkpoint-saver.contract.d.ts +65 -0
- package/dist/checkpoint/contracts/checkpoint-saver.contract.js +12 -0
- package/dist/checkpoint/contracts/index.d.ts +1 -0
- package/dist/checkpoint/contracts/index.js +1 -0
- package/dist/checkpoint/file-checkpoint-saver.d.ts +19 -0
- package/dist/checkpoint/file-checkpoint-saver.js +98 -0
- package/dist/checkpoint/hybrid-checkpoint-saver.d.ts +130 -0
- package/dist/checkpoint/hybrid-checkpoint-saver.js +211 -0
- package/dist/checkpoint/in-memory-checkpoint-saver.d.ts +14 -0
- package/dist/checkpoint/in-memory-checkpoint-saver.js +46 -0
- package/dist/checkpoint/index.d.ts +16 -0
- package/dist/checkpoint/index.js +13 -0
- package/dist/checkpoint/mongo-checkpoint-saver.d.ts +38 -0
- package/dist/checkpoint/mongo-checkpoint-saver.js +56 -0
- package/dist/checkpoint/pg-checkpoint-saver.d.ts +59 -0
- package/dist/checkpoint/pg-checkpoint-saver.js +140 -0
- package/dist/checkpoint/redis-checkpoint-saver.d.ts +68 -0
- package/dist/checkpoint/redis-checkpoint-saver.js +173 -0
- package/dist/checkpoint/restore-checkpoint.d.ts +33 -0
- package/dist/checkpoint/restore-checkpoint.js +33 -0
- package/dist/common/agent-code.d.ts +10 -0
- package/dist/common/agent-code.js +12 -0
- package/dist/common/concurrency.d.ts +79 -0
- package/dist/common/concurrency.js +121 -0
- package/dist/common/health.d.ts +40 -0
- package/dist/common/health.js +37 -0
- package/dist/common/index.d.ts +5 -0
- package/dist/common/index.js +5 -0
- package/dist/common/logger.d.ts +34 -0
- package/dist/common/logger.js +38 -0
- package/dist/common/queue-consumer.d.ts +125 -0
- package/dist/common/queue-consumer.js +159 -0
- package/dist/common/trace-id.d.ts +2 -0
- package/dist/common/trace-id.js +8 -0
- package/dist/common/types.d.ts +104 -0
- package/dist/common/types.js +14 -0
- package/dist/contracts/index.d.ts +11 -0
- package/dist/contracts/index.js +10 -0
- package/dist/contracts/permission-checker.d.ts +10 -0
- package/dist/contracts/permission-checker.js +4 -0
- package/dist/contracts/trace-collector.d.ts +211 -0
- package/dist/contracts/trace-collector.js +13 -0
- package/dist/governance/governance-client.d.ts +38 -0
- package/dist/governance/governance-client.js +95 -0
- package/dist/governance/index.d.ts +7 -0
- package/dist/governance/index.js +5 -0
- package/dist/governance/permission-guard.d.ts +19 -0
- package/dist/governance/permission-guard.js +59 -0
- package/dist/graph/adapters/index.d.ts +3 -0
- package/dist/graph/adapters/index.js +3 -0
- package/dist/graph/adapters/langgraph-checkpointer.d.ts +40 -0
- package/dist/graph/adapters/langgraph-checkpointer.js +211 -0
- package/dist/graph/adapters/langgraph.adapter.d.ts +190 -0
- package/dist/graph/adapters/langgraph.adapter.js +1303 -0
- package/dist/graph/adapters/subgraph-compiler.d.ts +39 -0
- package/dist/graph/adapters/subgraph-compiler.js +248 -0
- package/dist/graph/condition-evaluator.d.ts +57 -0
- package/dist/graph/condition-evaluator.js +162 -0
- package/dist/graph/contracts/executable-graph.d.ts +340 -0
- package/dist/graph/contracts/executable-graph.js +10 -0
- package/dist/graph/contracts/index.d.ts +2 -0
- package/dist/graph/contracts/index.js +2 -0
- package/dist/graph/contracts/state-graph.contract.d.ts +76 -0
- package/dist/graph/contracts/state-graph.contract.js +11 -0
- package/dist/graph/hitl/hitl-handler.d.ts +199 -0
- package/dist/graph/hitl/hitl-handler.js +480 -0
- package/dist/graph/hitl/index.d.ts +1 -0
- package/dist/graph/hitl/index.js +1 -0
- package/dist/graph/index.d.ts +7 -0
- package/dist/graph/index.js +7 -0
- package/dist/graph/nodes/index.d.ts +2 -0
- package/dist/graph/nodes/index.js +2 -0
- package/dist/graph/nodes/llm-node.d.ts +182 -0
- package/dist/graph/nodes/llm-node.js +281 -0
- package/dist/graph/nodes/skill-bind-node.d.ts +32 -0
- package/dist/graph/nodes/skill-bind-node.js +116 -0
- package/dist/graph/nodes/tool-node.d.ts +75 -0
- package/dist/graph/nodes/tool-node.js +324 -0
- package/dist/graph/resolve-graph-prompt.d.ts +5 -0
- package/dist/graph/resolve-graph-prompt.js +75 -0
- package/dist/graph/retry/budget-aware-retry.d.ts +91 -0
- package/dist/graph/retry/budget-aware-retry.js +126 -0
- package/dist/graph/retry/index.d.ts +9 -0
- package/dist/graph/retry/index.js +8 -0
- package/dist/graph/retry/node-retry.d.ts +123 -0
- package/dist/graph/retry/node-retry.js +235 -0
- package/dist/graph/skill-audit-recorder.d.ts +126 -0
- package/dist/graph/skill-audit-recorder.js +114 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.js +32 -0
- package/dist/memory/compression/compression-stats.d.ts +109 -0
- package/dist/memory/compression/compression-stats.js +144 -0
- package/dist/memory/compression/compression.repository.d.ts +62 -0
- package/dist/memory/compression/compression.repository.js +71 -0
- package/dist/memory/compression/index.d.ts +10 -0
- package/dist/memory/compression/index.js +15 -0
- package/dist/memory/compression/llm-summarize.d.ts +58 -0
- package/dist/memory/compression/llm-summarize.js +192 -0
- package/dist/memory/compression/sliding-window.compression.d.ts +60 -0
- package/dist/memory/compression/sliding-window.compression.js +175 -0
- package/dist/memory/index.d.ts +4 -0
- package/dist/memory/index.js +7 -0
- package/dist/memory/long-term-memory.service.d.ts +94 -0
- package/dist/memory/long-term-memory.service.js +120 -0
- package/dist/memory/message-compression.service.d.ts +128 -0
- package/dist/memory/message-compression.service.js +69 -0
- package/dist/memory/pg-memory.repository.d.ts +44 -0
- package/dist/memory/pg-memory.repository.js +108 -0
- package/dist/memory/semantic-retrieval.service.d.ts +148 -0
- package/dist/memory/semantic-retrieval.service.js +238 -0
- package/dist/providers/echo-llm-provider.d.ts +10 -0
- package/dist/providers/echo-llm-provider.js +87 -0
- package/dist/providers/http-llm-provider.d.ts +35 -0
- package/dist/providers/http-llm-provider.js +404 -0
- package/dist/providers/index.d.ts +7 -0
- package/dist/providers/index.js +5 -0
- package/dist/providers/local-llm-provider.d.ts +27 -0
- package/dist/providers/local-llm-provider.js +105 -0
- package/dist/providers/resolve-llm-model.d.ts +13 -0
- package/dist/providers/resolve-llm-model.js +30 -0
- package/dist/providers/routing-llm-provider.d.ts +28 -0
- package/dist/providers/routing-llm-provider.js +79 -0
- package/dist/registry/agent-models.d.ts +1 -0
- package/dist/registry/agent-models.js +1 -0
- package/dist/registry/agent-registry-client.d.ts +56 -0
- package/dist/registry/agent-registry-client.js +36 -0
- package/dist/registry/definition-cache.d.ts +37 -0
- package/dist/registry/definition-cache.js +82 -0
- package/dist/registry/deployment-snapshot.d.ts +99 -0
- package/dist/registry/deployment-snapshot.js +542 -0
- package/dist/registry/graph-loader.d.ts +134 -0
- package/dist/registry/graph-loader.js +985 -0
- package/dist/registry/index.d.ts +9 -0
- package/dist/registry/index.js +9 -0
- package/dist/registry/preload-errors.d.ts +13 -0
- package/dist/registry/preload-errors.js +35 -0
- package/dist/registry/preload-flags.d.ts +22 -0
- package/dist/registry/preload-flags.js +44 -0
- package/dist/registry/skill-io-guard.d.ts +25 -0
- package/dist/registry/skill-io-guard.js +98 -0
- package/dist/registry/skill-tree.d.ts +27 -0
- package/dist/registry/skill-tree.js +183 -0
- package/dist/runtime/agent-runtime.d.ts +106 -0
- package/dist/runtime/agent-runtime.js +777 -0
- package/dist/runtime/dev-runtime.d.ts +69 -0
- package/dist/runtime/dev-runtime.js +199 -0
- package/dist/runtime/index.d.ts +4 -0
- package/dist/runtime/index.js +3 -0
- package/dist/runtime/storage-profile.d.ts +50 -0
- package/dist/runtime/storage-profile.js +138 -0
- package/dist/runtime/types.d.ts +120 -0
- package/dist/runtime/types.js +9 -0
- package/dist/server.d.ts +12 -0
- package/dist/server.js +161 -0
- package/dist/session/compression-middleware.d.ts +126 -0
- package/dist/session/compression-middleware.js +230 -0
- package/dist/session/file-message.repository.d.ts +25 -0
- package/dist/session/file-message.repository.js +78 -0
- package/dist/session/file-session.repository.d.ts +72 -0
- package/dist/session/file-session.repository.js +212 -0
- package/dist/session/index.d.ts +13 -0
- package/dist/session/index.js +12 -0
- package/dist/session/message.service.d.ts +80 -0
- package/dist/session/message.service.js +128 -0
- package/dist/session/persist-turn-messages.d.ts +145 -0
- package/dist/session/persist-turn-messages.js +325 -0
- package/dist/session/pg-message.repository.d.ts +49 -0
- package/dist/session/pg-message.repository.js +149 -0
- package/dist/session/pg-session.repository.d.ts +46 -0
- package/dist/session/pg-session.repository.js +117 -0
- package/dist/session/session-context.service.d.ts +49 -0
- package/dist/session/session-context.service.js +66 -0
- package/dist/session/session.service.d.ts +194 -0
- package/dist/session/session.service.js +166 -0
- package/dist/sse/connection-event-logger.d.ts +21 -0
- package/dist/sse/connection-event-logger.js +33 -0
- package/dist/sse/contracts/index.d.ts +1 -0
- package/dist/sse/contracts/index.js +1 -0
- package/dist/sse/contracts/sse-emitter.contract.d.ts +74 -0
- package/dist/sse/contracts/sse-emitter.contract.js +11 -0
- package/dist/sse/event-buffer.d.ts +20 -0
- package/dist/sse/event-buffer.js +45 -0
- package/dist/sse/events/code-events.d.ts +19 -0
- package/dist/sse/events/code-events.js +9 -0
- package/dist/sse/events/collaboration-events.d.ts +37 -0
- package/dist/sse/events/collaboration-events.js +11 -0
- package/dist/sse/events/connection-events.d.ts +13 -0
- package/dist/sse/events/connection-events.js +9 -0
- package/dist/sse/events/file-events.d.ts +29 -0
- package/dist/sse/events/file-events.js +10 -0
- package/dist/sse/events/hitl-events.d.ts +33 -0
- package/dist/sse/events/hitl-events.js +10 -0
- package/dist/sse/events/index.d.ts +107 -0
- package/dist/sse/events/index.js +96 -0
- package/dist/sse/events/plan-events.d.ts +38 -0
- package/dist/sse/events/plan-events.js +11 -0
- package/dist/sse/events/reasoning-events.d.ts +35 -0
- package/dist/sse/events/reasoning-events.js +13 -0
- package/dist/sse/events/response-events.d.ts +25 -0
- package/dist/sse/events/response-events.js +12 -0
- package/dist/sse/events/session-events.d.ts +43 -0
- package/dist/sse/events/session-events.js +12 -0
- package/dist/sse/events/skill-events.d.ts +48 -0
- package/dist/sse/events/skill-events.js +11 -0
- package/dist/sse/events/stats-events.d.ts +44 -0
- package/dist/sse/events/stats-events.js +12 -0
- package/dist/sse/events/tool-events.d.ts +68 -0
- package/dist/sse/events/tool-events.js +14 -0
- package/dist/sse/index.d.ts +8 -0
- package/dist/sse/index.js +8 -0
- package/dist/sse/sse-connection-manager.d.ts +116 -0
- package/dist/sse/sse-connection-manager.js +185 -0
- package/dist/sse/sse-emitter.d.ts +108 -0
- package/dist/sse/sse-emitter.js +210 -0
- package/dist/sse/sse-heartbeat.d.ts +58 -0
- package/dist/sse/sse-heartbeat.js +76 -0
- package/dist/sse/trace-collector.d.ts +60 -0
- package/dist/sse/trace-collector.js +107 -0
- package/dist/task/contracts/index.d.ts +2 -0
- package/dist/task/contracts/index.js +1 -0
- package/dist/task/contracts/task-manager.contract.d.ts +160 -0
- package/dist/task/contracts/task-manager.contract.js +10 -0
- package/dist/task/index.d.ts +7 -0
- package/dist/task/index.js +5 -0
- package/dist/task/pg-task.repository.d.ts +47 -0
- package/dist/task/pg-task.repository.js +131 -0
- package/dist/task/task-progress-tracker.d.ts +67 -0
- package/dist/task/task-progress-tracker.js +80 -0
- package/dist/task/task-timeout.d.ts +70 -0
- package/dist/task/task-timeout.js +116 -0
- package/dist/task/task.service.d.ts +84 -0
- package/dist/task/task.service.js +233 -0
- package/dist/token/compression-budget-integration.d.ts +145 -0
- package/dist/token/compression-budget-integration.js +185 -0
- package/dist/token/context-window-budget.d.ts +113 -0
- package/dist/token/context-window-budget.js +134 -0
- package/dist/token/contracts/index.d.ts +1 -0
- package/dist/token/contracts/index.js +1 -0
- package/dist/token/contracts/token-budget.contract.d.ts +77 -0
- package/dist/token/contracts/token-budget.contract.js +11 -0
- package/dist/token/index.d.ts +12 -0
- package/dist/token/index.js +10 -0
- package/dist/token/pg-token-budget.repository.d.ts +39 -0
- package/dist/token/pg-token-budget.repository.js +116 -0
- package/dist/token/session-budget-checker.d.ts +54 -0
- package/dist/token/session-budget-checker.js +72 -0
- package/dist/token/token-budget-guard.d.ts +66 -0
- package/dist/token/token-budget-guard.js +97 -0
- package/dist/token/token-budget.service.d.ts +86 -0
- package/dist/token/token-budget.service.js +130 -0
- package/dist/token/token-detail-mode.d.ts +73 -0
- package/dist/token/token-detail-mode.js +107 -0
- package/dist/token/token-estimator.d.ts +80 -0
- package/dist/token/token-estimator.js +134 -0
- package/dist/token/token-stats.service.d.ts +88 -0
- package/dist/token/token-stats.service.js +94 -0
- package/dist/tool/create-tool-executor.d.ts +33 -0
- package/dist/tool/create-tool-executor.js +60 -0
- package/dist/tool/dev-http-executor.d.ts +18 -0
- package/dist/tool/dev-http-executor.js +96 -0
- package/dist/tool/dev-mcp-executor.d.ts +29 -0
- package/dist/tool/dev-mcp-executor.js +84 -0
- package/dist/tool/dev-tool-executor.d.ts +23 -0
- package/dist/tool/dev-tool-executor.js +55 -0
- package/dist/tool/file-artifact.d.ts +11 -0
- package/dist/tool/file-artifact.js +90 -0
- package/dist/tool/http-tool-executor.d.ts +17 -0
- package/dist/tool/http-tool-executor.js +158 -0
- package/dist/tool/index.d.ts +18 -0
- package/dist/tool/index.js +17 -0
- package/dist/tool/loaded-tool-definition.d.ts +35 -0
- package/dist/tool/loaded-tool-definition.js +9 -0
- package/dist/tool/local-mcp-client.d.ts +23 -0
- package/dist/tool/local-mcp-client.js +225 -0
- package/dist/tool/local-tool-executor.d.ts +37 -0
- package/dist/tool/local-tool-executor.js +249 -0
- package/dist/tool/mcp-tool-executor.d.ts +23 -0
- package/dist/tool/mcp-tool-executor.js +160 -0
- package/dist/tool/mock-tool-executor.d.ts +28 -0
- package/dist/tool/mock-tool-executor.js +65 -0
- package/dist/tool/system-prompt-builder.d.ts +114 -0
- package/dist/tool/system-prompt-builder.js +213 -0
- package/dist/tool/tool-confirmation.d.ts +29 -0
- package/dist/tool/tool-confirmation.js +81 -0
- package/dist/tool/tool-event-emitter.d.ts +58 -0
- package/dist/tool/tool-event-emitter.js +154 -0
- package/dist/tool/tool-execution-router.d.ts +25 -0
- package/dist/tool/tool-execution-router.js +50 -0
- package/dist/tool/tool-executor.interface.d.ts +85 -0
- package/dist/tool/tool-executor.interface.js +7 -0
- package/dist/tool/tool-orchestrator.d.ts +22 -0
- package/dist/tool/tool-orchestrator.js +104 -0
- package/dist/tool/tool-result-injector.d.ts +64 -0
- package/dist/tool/tool-result-injector.js +65 -0
- package/dist/utils/format-error.d.ts +4 -0
- package/dist/utils/format-error.js +4 -0
- package/dist/utils/http-error.d.ts +11 -0
- package/dist/utils/http-error.js +24 -0
- package/package.json +56 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 统计事件 Payload 定义
|
|
3
|
+
*
|
|
4
|
+
* 核心事件:
|
|
5
|
+
* - stats.token_usage
|
|
6
|
+
*
|
|
7
|
+
* 可选事件:
|
|
8
|
+
* - stats.node_token_usage
|
|
9
|
+
*
|
|
10
|
+
* @see design.md §1.6 SSE事件协议定义
|
|
11
|
+
*/
|
|
12
|
+
/** Token 消耗统计(按维度分组) */
|
|
13
|
+
export interface TokenUsageBreakdown {
|
|
14
|
+
/** 输入 token 数 */
|
|
15
|
+
input: number;
|
|
16
|
+
/** 输出 token 数 */
|
|
17
|
+
output: number;
|
|
18
|
+
}
|
|
19
|
+
/** Task 结束时 Token 消耗汇总 */
|
|
20
|
+
export interface StatsTokenUsagePayload {
|
|
21
|
+
/** 总 token 消耗 */
|
|
22
|
+
total: TokenUsageBreakdown;
|
|
23
|
+
/** 按节点分组的 token 消耗 */
|
|
24
|
+
byNode: Record<string, TokenUsageBreakdown>;
|
|
25
|
+
/** 按模型分组的 token 消耗 */
|
|
26
|
+
byModel: Record<string, TokenUsageBreakdown>;
|
|
27
|
+
/** 预估费用(美元) */
|
|
28
|
+
costEstimate: number;
|
|
29
|
+
}
|
|
30
|
+
/** 单节点 Token 消耗 */
|
|
31
|
+
export interface StatsNodeTokenUsagePayload {
|
|
32
|
+
/** 节点 ID */
|
|
33
|
+
nodeId: string;
|
|
34
|
+
/** 使用的模型名称 */
|
|
35
|
+
model: string;
|
|
36
|
+
/** 输入 token 数 */
|
|
37
|
+
inputTokens: number;
|
|
38
|
+
/** 输出 token 数 */
|
|
39
|
+
outputTokens: number;
|
|
40
|
+
/** 预估费用(美元) */
|
|
41
|
+
costEstimate: number;
|
|
42
|
+
/** 该节点本次调用耗时(毫秒),可选 */
|
|
43
|
+
durationMs?: number;
|
|
44
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 工具执行事件 Payload 定义
|
|
3
|
+
*
|
|
4
|
+
* 核心事件:
|
|
5
|
+
* - tool.called
|
|
6
|
+
* - tool.result
|
|
7
|
+
* - tool.error
|
|
8
|
+
*
|
|
9
|
+
* 可选事件:
|
|
10
|
+
* - tool.progress
|
|
11
|
+
*
|
|
12
|
+
* @see design.md §1.6 SSE事件协议定义
|
|
13
|
+
*/
|
|
14
|
+
/** 工具被调用 */
|
|
15
|
+
export interface ToolCalledPayload {
|
|
16
|
+
/** 工具调用 ID */
|
|
17
|
+
toolCallId: string;
|
|
18
|
+
/** 工具名称 */
|
|
19
|
+
toolName: string;
|
|
20
|
+
/** 调用参数 */
|
|
21
|
+
arguments: Record<string, unknown>;
|
|
22
|
+
}
|
|
23
|
+
/** 工具执行结果 */
|
|
24
|
+
export interface ToolResultPayload {
|
|
25
|
+
/** 工具调用 ID */
|
|
26
|
+
toolCallId: string;
|
|
27
|
+
/** 工具名称 */
|
|
28
|
+
toolName: string;
|
|
29
|
+
/** 返回内容 */
|
|
30
|
+
content: unknown;
|
|
31
|
+
/** 是否执行成功 */
|
|
32
|
+
success: boolean;
|
|
33
|
+
}
|
|
34
|
+
/** 工具执行进度 */
|
|
35
|
+
export type ToolProgressStatus = 'started' | 'completed' | 'error' | (string & {});
|
|
36
|
+
export interface ToolProgressPayload {
|
|
37
|
+
/** 工具调用 ID */
|
|
38
|
+
toolCallId: string;
|
|
39
|
+
/** 工具名称 */
|
|
40
|
+
toolName: string;
|
|
41
|
+
/**
|
|
42
|
+
* 进度状态:
|
|
43
|
+
* - started / completed / error(与 agent-with-mcp tool.progress 对齐)
|
|
44
|
+
* - 或其它描述性字符串
|
|
45
|
+
*/
|
|
46
|
+
status: ToolProgressStatus;
|
|
47
|
+
/** 进度百分比 (0-100),可选;started/completed 场景可不传 */
|
|
48
|
+
progress?: number;
|
|
49
|
+
/** status=started 时可选:调用参数 */
|
|
50
|
+
arguments?: Record<string, unknown>;
|
|
51
|
+
/** status=completed 时可选:工具返回摘要/内容 */
|
|
52
|
+
content?: unknown;
|
|
53
|
+
/** status=error 时可选:错误信息 */
|
|
54
|
+
error?: string;
|
|
55
|
+
/** 执行耗时(毫秒),status=completed|error 时可选 */
|
|
56
|
+
executionTime?: number;
|
|
57
|
+
}
|
|
58
|
+
/** 工具执行失败 */
|
|
59
|
+
export interface ToolErrorPayload {
|
|
60
|
+
/** 工具调用 ID */
|
|
61
|
+
toolCallId: string;
|
|
62
|
+
/** 工具名称 */
|
|
63
|
+
toolName: string;
|
|
64
|
+
/** 错误信息 */
|
|
65
|
+
error: string;
|
|
66
|
+
/** 是否会自动重试 */
|
|
67
|
+
willRetry: boolean;
|
|
68
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from './contracts/index.js';
|
|
2
|
+
export * from './events/index.js';
|
|
3
|
+
export * from './sse-emitter.js';
|
|
4
|
+
export * from './sse-heartbeat.js';
|
|
5
|
+
export * from './sse-connection-manager.js';
|
|
6
|
+
export * from './event-buffer.js';
|
|
7
|
+
export * from './connection-event-logger.js';
|
|
8
|
+
export * from './trace-collector.js';
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from './contracts/index.js';
|
|
2
|
+
export * from './events/index.js';
|
|
3
|
+
export * from './sse-emitter.js';
|
|
4
|
+
export * from './sse-heartbeat.js';
|
|
5
|
+
export * from './sse-connection-manager.js';
|
|
6
|
+
export * from './event-buffer.js';
|
|
7
|
+
export * from './connection-event-logger.js';
|
|
8
|
+
export * from './trace-collector.js';
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SSEConnectionManager — SSE 多连接管理器
|
|
3
|
+
*
|
|
4
|
+
* 管理多个并发 SSE 连接,按 taskId 注册/查找/注销。
|
|
5
|
+
* 支持客户端断线检测(自动注销)和断线重连(替换 emitter)。
|
|
6
|
+
*
|
|
7
|
+
* @see design.md §1.1 连接管理:SSE心跳、断线重连支持
|
|
8
|
+
* @see requirements.md Requirement 9 AC3: 断线重连+Checkpoint恢复
|
|
9
|
+
* @see requirements.md Requirement 5 AC5: heartbeat保持连接
|
|
10
|
+
*/
|
|
11
|
+
import type { SSEEmitter } from './sse-emitter.js';
|
|
12
|
+
/**
|
|
13
|
+
* 单个连接的注册选项
|
|
14
|
+
*/
|
|
15
|
+
export interface SSEConnectionOptions {
|
|
16
|
+
/** 连接断开时的回调 */
|
|
17
|
+
onDisconnect?: (taskId: string) => void;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* SSEConnectionManager — 多 SSE 连接注册表
|
|
21
|
+
*
|
|
22
|
+
* 用法:
|
|
23
|
+
* ```ts
|
|
24
|
+
* const manager = new SSEConnectionManager();
|
|
25
|
+
* manager.register(taskId, emitter, { onDisconnect: (id) => console.log(`${id} disconnected`) });
|
|
26
|
+
* manager.getEmitter(taskId)?.emit(event);
|
|
27
|
+
* manager.closeAll(); // graceful shutdown
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export declare class SSEConnectionManager {
|
|
31
|
+
private readonly connections;
|
|
32
|
+
private pollingTimer;
|
|
33
|
+
private readonly pollInterval;
|
|
34
|
+
/**
|
|
35
|
+
* @param pollInterval 断线检测轮询间隔(毫秒),默认 5000
|
|
36
|
+
*/
|
|
37
|
+
constructor(pollInterval?: number);
|
|
38
|
+
/**
|
|
39
|
+
* 注册一个新的 SSE 连接
|
|
40
|
+
*
|
|
41
|
+
* 如果同一 taskId 已存在连接,先关闭旧连接再注册新连接。
|
|
42
|
+
*
|
|
43
|
+
* @param taskId - 任务 ID(连接唯一标识)
|
|
44
|
+
* @param emitter - SSE 事件发射器实例
|
|
45
|
+
* @param options - 可选的连接配置(如 onDisconnect 回调)
|
|
46
|
+
*/
|
|
47
|
+
register(taskId: string, emitter: SSEEmitter, options?: SSEConnectionOptions): void;
|
|
48
|
+
/**
|
|
49
|
+
* 注销指定 taskId 的连接
|
|
50
|
+
*
|
|
51
|
+
* 从注册表中移除(不主动 close emitter,调用方负责生命周期管理)。
|
|
52
|
+
*
|
|
53
|
+
* @param taskId - 要注销的任务 ID
|
|
54
|
+
*/
|
|
55
|
+
unregister(taskId: string): void;
|
|
56
|
+
/**
|
|
57
|
+
* 获取指定 taskId 的 SSEEmitter
|
|
58
|
+
*
|
|
59
|
+
* @param taskId - 任务 ID
|
|
60
|
+
* @returns SSEEmitter 实例,不存在时返回 undefined
|
|
61
|
+
*/
|
|
62
|
+
getEmitter(taskId: string): SSEEmitter | undefined;
|
|
63
|
+
/**
|
|
64
|
+
* 获取当前活跃连接数
|
|
65
|
+
*/
|
|
66
|
+
getActiveConnections(): number;
|
|
67
|
+
/**
|
|
68
|
+
* 检查指定 taskId 是否有活跃的 SSE 连接
|
|
69
|
+
*
|
|
70
|
+
* @param taskId - 任务 ID
|
|
71
|
+
* @returns true 表示有活跃连接
|
|
72
|
+
*/
|
|
73
|
+
isConnected(taskId: string): boolean;
|
|
74
|
+
/**
|
|
75
|
+
* 断线重连:用新 emitter 替换旧连接
|
|
76
|
+
*
|
|
77
|
+
* 客户端断线后重连时调用。关闭旧 emitter(如果还存活),注册新 emitter。
|
|
78
|
+
* 配合 Checkpoint 机制,客户端可恢复接收后续事件。
|
|
79
|
+
*
|
|
80
|
+
* @param taskId - 任务 ID
|
|
81
|
+
* @param newEmitter - 新的 SSE 事件发射器实例
|
|
82
|
+
* @param options - 可选的新连接配置
|
|
83
|
+
*/
|
|
84
|
+
reconnect(taskId: string, newEmitter: SSEEmitter, options?: SSEConnectionOptions): void;
|
|
85
|
+
/**
|
|
86
|
+
* 关闭所有连接(优雅停机)
|
|
87
|
+
*
|
|
88
|
+
* 遍历所有注册的连接并关闭,清空注册表,停止轮询。
|
|
89
|
+
*/
|
|
90
|
+
closeAll(): void;
|
|
91
|
+
/**
|
|
92
|
+
* 销毁管理器,释放资源
|
|
93
|
+
*
|
|
94
|
+
* 停止轮询定时器。不关闭已注册的连接(调用方负责)。
|
|
95
|
+
*/
|
|
96
|
+
destroy(): void;
|
|
97
|
+
/**
|
|
98
|
+
* 启动断线检测轮询
|
|
99
|
+
*
|
|
100
|
+
* 定期检查所有已注册 emitter 的连接状态,
|
|
101
|
+
* 自动注销已断开的连接并触发 onDisconnect 回调。
|
|
102
|
+
*/
|
|
103
|
+
private startPolling;
|
|
104
|
+
/**
|
|
105
|
+
* 停止断线检测轮询
|
|
106
|
+
*/
|
|
107
|
+
private stopPolling;
|
|
108
|
+
/**
|
|
109
|
+
* 检测并处理断开的连接
|
|
110
|
+
*
|
|
111
|
+
* 遍历注册表,对已断开的 emitter 执行:
|
|
112
|
+
* 1. 触发 onDisconnect 回调
|
|
113
|
+
* 2. 从注册表中移除
|
|
114
|
+
*/
|
|
115
|
+
private detectDisconnections;
|
|
116
|
+
}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SSEConnectionManager — SSE 多连接管理器
|
|
3
|
+
*
|
|
4
|
+
* 管理多个并发 SSE 连接,按 taskId 注册/查找/注销。
|
|
5
|
+
* 支持客户端断线检测(自动注销)和断线重连(替换 emitter)。
|
|
6
|
+
*
|
|
7
|
+
* @see design.md §1.1 连接管理:SSE心跳、断线重连支持
|
|
8
|
+
* @see requirements.md Requirement 9 AC3: 断线重连+Checkpoint恢复
|
|
9
|
+
* @see requirements.md Requirement 5 AC5: heartbeat保持连接
|
|
10
|
+
*/
|
|
11
|
+
// ─────────────────────────────────────────────
|
|
12
|
+
// SSEConnectionManager
|
|
13
|
+
// ─────────────────────────────────────────────
|
|
14
|
+
/**
|
|
15
|
+
* SSEConnectionManager — 多 SSE 连接注册表
|
|
16
|
+
*
|
|
17
|
+
* 用法:
|
|
18
|
+
* ```ts
|
|
19
|
+
* const manager = new SSEConnectionManager();
|
|
20
|
+
* manager.register(taskId, emitter, { onDisconnect: (id) => console.log(`${id} disconnected`) });
|
|
21
|
+
* manager.getEmitter(taskId)?.emit(event);
|
|
22
|
+
* manager.closeAll(); // graceful shutdown
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export class SSEConnectionManager {
|
|
26
|
+
connections = new Map();
|
|
27
|
+
pollingTimer = null;
|
|
28
|
+
pollInterval;
|
|
29
|
+
/**
|
|
30
|
+
* @param pollInterval 断线检测轮询间隔(毫秒),默认 5000
|
|
31
|
+
*/
|
|
32
|
+
constructor(pollInterval = 5000) {
|
|
33
|
+
this.pollInterval = pollInterval;
|
|
34
|
+
this.startPolling();
|
|
35
|
+
}
|
|
36
|
+
// ─────────────────────────────────────────────
|
|
37
|
+
// Public API
|
|
38
|
+
// ─────────────────────────────────────────────
|
|
39
|
+
/**
|
|
40
|
+
* 注册一个新的 SSE 连接
|
|
41
|
+
*
|
|
42
|
+
* 如果同一 taskId 已存在连接,先关闭旧连接再注册新连接。
|
|
43
|
+
*
|
|
44
|
+
* @param taskId - 任务 ID(连接唯一标识)
|
|
45
|
+
* @param emitter - SSE 事件发射器实例
|
|
46
|
+
* @param options - 可选的连接配置(如 onDisconnect 回调)
|
|
47
|
+
*/
|
|
48
|
+
register(taskId, emitter, options = {}) {
|
|
49
|
+
// 如果已有连接,先清理旧连接
|
|
50
|
+
const existing = this.connections.get(taskId);
|
|
51
|
+
if (existing) {
|
|
52
|
+
existing.emitter.close();
|
|
53
|
+
}
|
|
54
|
+
this.connections.set(taskId, { emitter, options });
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* 注销指定 taskId 的连接
|
|
58
|
+
*
|
|
59
|
+
* 从注册表中移除(不主动 close emitter,调用方负责生命周期管理)。
|
|
60
|
+
*
|
|
61
|
+
* @param taskId - 要注销的任务 ID
|
|
62
|
+
*/
|
|
63
|
+
unregister(taskId) {
|
|
64
|
+
this.connections.delete(taskId);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* 获取指定 taskId 的 SSEEmitter
|
|
68
|
+
*
|
|
69
|
+
* @param taskId - 任务 ID
|
|
70
|
+
* @returns SSEEmitter 实例,不存在时返回 undefined
|
|
71
|
+
*/
|
|
72
|
+
getEmitter(taskId) {
|
|
73
|
+
return this.connections.get(taskId)?.emitter;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* 获取当前活跃连接数
|
|
77
|
+
*/
|
|
78
|
+
getActiveConnections() {
|
|
79
|
+
return this.connections.size;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* 检查指定 taskId 是否有活跃的 SSE 连接
|
|
83
|
+
*
|
|
84
|
+
* @param taskId - 任务 ID
|
|
85
|
+
* @returns true 表示有活跃连接
|
|
86
|
+
*/
|
|
87
|
+
isConnected(taskId) {
|
|
88
|
+
const entry = this.connections.get(taskId);
|
|
89
|
+
if (!entry) {
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
return entry.emitter.isConnected;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* 断线重连:用新 emitter 替换旧连接
|
|
96
|
+
*
|
|
97
|
+
* 客户端断线后重连时调用。关闭旧 emitter(如果还存活),注册新 emitter。
|
|
98
|
+
* 配合 Checkpoint 机制,客户端可恢复接收后续事件。
|
|
99
|
+
*
|
|
100
|
+
* @param taskId - 任务 ID
|
|
101
|
+
* @param newEmitter - 新的 SSE 事件发射器实例
|
|
102
|
+
* @param options - 可选的新连接配置
|
|
103
|
+
*/
|
|
104
|
+
reconnect(taskId, newEmitter, options) {
|
|
105
|
+
const existing = this.connections.get(taskId);
|
|
106
|
+
const mergedOptions = options ?? existing?.options ?? {};
|
|
107
|
+
// 关闭旧连接(如果还未断开)
|
|
108
|
+
if (existing && existing.emitter.isConnected) {
|
|
109
|
+
existing.emitter.close();
|
|
110
|
+
}
|
|
111
|
+
this.connections.set(taskId, { emitter: newEmitter, options: mergedOptions });
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* 关闭所有连接(优雅停机)
|
|
115
|
+
*
|
|
116
|
+
* 遍历所有注册的连接并关闭,清空注册表,停止轮询。
|
|
117
|
+
*/
|
|
118
|
+
closeAll() {
|
|
119
|
+
for (const [taskId, entry] of this.connections) {
|
|
120
|
+
entry.emitter.close();
|
|
121
|
+
// 触发 onDisconnect 回调
|
|
122
|
+
entry.options.onDisconnect?.(taskId);
|
|
123
|
+
}
|
|
124
|
+
this.connections.clear();
|
|
125
|
+
this.stopPolling();
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* 销毁管理器,释放资源
|
|
129
|
+
*
|
|
130
|
+
* 停止轮询定时器。不关闭已注册的连接(调用方负责)。
|
|
131
|
+
*/
|
|
132
|
+
destroy() {
|
|
133
|
+
this.stopPolling();
|
|
134
|
+
}
|
|
135
|
+
// ─────────────────────────────────────────────
|
|
136
|
+
// Private — 断线检测
|
|
137
|
+
// ─────────────────────────────────────────────
|
|
138
|
+
/**
|
|
139
|
+
* 启动断线检测轮询
|
|
140
|
+
*
|
|
141
|
+
* 定期检查所有已注册 emitter 的连接状态,
|
|
142
|
+
* 自动注销已断开的连接并触发 onDisconnect 回调。
|
|
143
|
+
*/
|
|
144
|
+
startPolling() {
|
|
145
|
+
if (this.pollingTimer !== null) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
this.pollingTimer = setInterval(() => {
|
|
149
|
+
this.detectDisconnections();
|
|
150
|
+
}, this.pollInterval);
|
|
151
|
+
// 不阻塞进程退出
|
|
152
|
+
this.pollingTimer.unref();
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* 停止断线检测轮询
|
|
156
|
+
*/
|
|
157
|
+
stopPolling() {
|
|
158
|
+
if (this.pollingTimer !== null) {
|
|
159
|
+
clearInterval(this.pollingTimer);
|
|
160
|
+
this.pollingTimer = null;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* 检测并处理断开的连接
|
|
165
|
+
*
|
|
166
|
+
* 遍历注册表,对已断开的 emitter 执行:
|
|
167
|
+
* 1. 触发 onDisconnect 回调
|
|
168
|
+
* 2. 从注册表中移除
|
|
169
|
+
*/
|
|
170
|
+
detectDisconnections() {
|
|
171
|
+
const disconnected = [];
|
|
172
|
+
for (const [taskId, entry] of this.connections) {
|
|
173
|
+
if (!entry.emitter.isConnected) {
|
|
174
|
+
disconnected.push(taskId);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
for (const taskId of disconnected) {
|
|
178
|
+
const entry = this.connections.get(taskId);
|
|
179
|
+
if (entry) {
|
|
180
|
+
entry.options.onDisconnect?.(taskId);
|
|
181
|
+
this.connections.delete(taskId);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SSEEmitter — SSE 事件发射器实现
|
|
3
|
+
*
|
|
4
|
+
* 将 SSEEvent 格式化为 SSE 协议并推送到客户端 HTTP 响应流。
|
|
5
|
+
* 管理连接生命周期(connected → emit → close),支持心跳保活。
|
|
6
|
+
*
|
|
7
|
+
* @see contracts/sse-emitter.contract.ts ISSEEmitter 接口
|
|
8
|
+
* @see design.md §1.6 SSE事件协议定义
|
|
9
|
+
* @see requirements.md Requirement 5 AC1-AC5
|
|
10
|
+
* @see requirements.md Requirement 9 AC1-AC4
|
|
11
|
+
*/
|
|
12
|
+
import type { Writable } from 'node:stream';
|
|
13
|
+
import type { ServerResponse } from 'node:http';
|
|
14
|
+
import type { ISSEEmitter, SSEEvent, SSEConnectionState } from './contracts/index.js';
|
|
15
|
+
import type { SSEEventBuffer } from './event-buffer.js';
|
|
16
|
+
/**
|
|
17
|
+
* SSEEmitterOptions — SSE 发射器配置选项
|
|
18
|
+
*/
|
|
19
|
+
export interface SSEEmitterOptions {
|
|
20
|
+
/** 心跳间隔(毫秒),默认 30000 */
|
|
21
|
+
heartbeatInterval?: number;
|
|
22
|
+
/** 是否自动设置 SSE HTTP 响应头,默认 true */
|
|
23
|
+
setHeaders?: boolean;
|
|
24
|
+
/** 关联的 correlationId(用于心跳事件) */
|
|
25
|
+
correlationId?: string;
|
|
26
|
+
/** 关联的 taskId(用于心跳事件) */
|
|
27
|
+
taskId?: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* SSEEmitter — ISSEEmitter 实现类
|
|
31
|
+
*
|
|
32
|
+
* 用法:
|
|
33
|
+
* ```ts
|
|
34
|
+
* const emitter = new SSEEmitter(res, { heartbeatInterval: 30000 });
|
|
35
|
+
* emitter.emit({ type: 'task.started', data: {...}, correlationId, taskId, timestamp });
|
|
36
|
+
* emitter.heartbeat();
|
|
37
|
+
* emitter.close();
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export declare class SSEEmitter implements ISSEEmitter {
|
|
41
|
+
private readonly stream;
|
|
42
|
+
private state;
|
|
43
|
+
private readonly options;
|
|
44
|
+
private heartbeatScheduler;
|
|
45
|
+
/** 最后发送的事件 ID */
|
|
46
|
+
lastEventId: string | null;
|
|
47
|
+
constructor(stream: Writable | ServerResponse, options?: SSEEmitterOptions);
|
|
48
|
+
/**
|
|
49
|
+
* 发射单个 SSE 事件到客户端
|
|
50
|
+
*
|
|
51
|
+
* 格式(含 id 行):
|
|
52
|
+
* ```
|
|
53
|
+
* id: {eventId}
|
|
54
|
+
* event: {type}
|
|
55
|
+
* data: {"correlationId":"...", "taskId":"...", "timestamp":"...", ...data}
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
emit(event: SSEEvent, eventId?: string): void;
|
|
59
|
+
/**
|
|
60
|
+
* 重连时回放断开期间的事件
|
|
61
|
+
*/
|
|
62
|
+
replayFrom(lastEventId: string, buffer: SSEEventBuffer): void;
|
|
63
|
+
/**
|
|
64
|
+
* 关闭 SSE 连接
|
|
65
|
+
*
|
|
66
|
+
* 终止事件流并标记为断开。自动停止心跳定时器。调用后不可再 emit。
|
|
67
|
+
*/
|
|
68
|
+
close(): void;
|
|
69
|
+
/**
|
|
70
|
+
* 发送心跳事件保持连接活跃
|
|
71
|
+
*
|
|
72
|
+
* 推送 `connection.heartbeat` 事件,防止代理/LB 因空闲超时断开连接。
|
|
73
|
+
*/
|
|
74
|
+
heartbeat(): void;
|
|
75
|
+
/**
|
|
76
|
+
* 启动自动周期心跳
|
|
77
|
+
*
|
|
78
|
+
* 按配置的 heartbeatInterval(默认 30s)定时发送心跳事件。
|
|
79
|
+
* 重复调用不会创建多个定时器。
|
|
80
|
+
*/
|
|
81
|
+
startHeartbeat(): void;
|
|
82
|
+
/**
|
|
83
|
+
* 停止自动周期心跳
|
|
84
|
+
*
|
|
85
|
+
* 清除心跳定时器。close() 时自动调用。
|
|
86
|
+
*/
|
|
87
|
+
stopHeartbeat(): void;
|
|
88
|
+
/** 获取当前连接状态 */
|
|
89
|
+
get connectionState(): SSEConnectionState;
|
|
90
|
+
/** 是否处于连接状态 */
|
|
91
|
+
get isConnected(): boolean;
|
|
92
|
+
/**
|
|
93
|
+
* 将 SSEEvent 格式化为 SSE 协议字符串(含 id 行)
|
|
94
|
+
*/
|
|
95
|
+
private formatEvent;
|
|
96
|
+
/**
|
|
97
|
+
* 写入底层流,处理写入错误
|
|
98
|
+
*/
|
|
99
|
+
private write;
|
|
100
|
+
/**
|
|
101
|
+
* 设置 SSE 特定的 HTTP 响应头
|
|
102
|
+
*/
|
|
103
|
+
private setSSEHeaders;
|
|
104
|
+
/**
|
|
105
|
+
* 类型守卫:判断是否为 ServerResponse
|
|
106
|
+
*/
|
|
107
|
+
private isServerResponse;
|
|
108
|
+
}
|