@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,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LangGraphCheckpointer — BaseCheckpointSaver 桥接实现
|
|
3
|
+
*
|
|
4
|
+
* 将 LangGraph 的 BaseCheckpointSaver 接口委托到平台的 ICheckpointSaver,
|
|
5
|
+
* 实现 getTuple / put / putWrites / list 与 CheckpointData 之间的数据映射。
|
|
6
|
+
*
|
|
7
|
+
* @see design.md §1.4 Checkpoint 集成
|
|
8
|
+
* @see tasks.md Task 11.5
|
|
9
|
+
*/
|
|
10
|
+
import { BaseCheckpointSaver, } from '@langchain/langgraph';
|
|
11
|
+
/**
|
|
12
|
+
* LangGraphCheckpointer — 桥接 LangGraph BaseCheckpointSaver → ICheckpointSaver
|
|
13
|
+
*
|
|
14
|
+
* intermediate writes(putWrites)先放进程内;checkpoint 快照仍落 ICheckpointSaver。
|
|
15
|
+
*/
|
|
16
|
+
export class LangGraphCheckpointer extends BaseCheckpointSaver {
|
|
17
|
+
saver;
|
|
18
|
+
/** threadId|ns|checkpointId → writes */
|
|
19
|
+
pendingWrites = new Map();
|
|
20
|
+
constructor(saver) {
|
|
21
|
+
super();
|
|
22
|
+
this.saver = saver;
|
|
23
|
+
}
|
|
24
|
+
async getTuple(config) {
|
|
25
|
+
const threadId = this.extractThreadId(config);
|
|
26
|
+
if (!threadId) {
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
const checkpointId = config.configurable?.['checkpoint_id'];
|
|
30
|
+
let data;
|
|
31
|
+
if (checkpointId) {
|
|
32
|
+
data = await this.saver.loadByCheckpointId(checkpointId);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
data = await this.saver.load(threadId);
|
|
36
|
+
}
|
|
37
|
+
if (!data) {
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
return this.checkpointDataToTuple(data, config);
|
|
41
|
+
}
|
|
42
|
+
async put(config, checkpoint, metadata, _newVersions) {
|
|
43
|
+
const threadId = this.extractThreadId(config) ?? `thread-${Date.now()}`;
|
|
44
|
+
const data = this.checkpointToData(threadId, checkpoint, metadata);
|
|
45
|
+
await this.saver.save(threadId, data);
|
|
46
|
+
return {
|
|
47
|
+
...config,
|
|
48
|
+
configurable: {
|
|
49
|
+
...config.configurable,
|
|
50
|
+
thread_id: threadId,
|
|
51
|
+
checkpoint_id: checkpoint.id,
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* 存储与 checkpoint 关联的 intermediate writes(LangGraph 0.2+ 必需;缺此方法会报 putWrites is not a function)
|
|
57
|
+
*/
|
|
58
|
+
async putWrites(config, writes, taskId) {
|
|
59
|
+
const threadId = this.extractThreadId(config);
|
|
60
|
+
const checkpointNs = String(config.configurable?.['checkpoint_ns'] ?? '');
|
|
61
|
+
const checkpointId = config.configurable?.['checkpoint_id'];
|
|
62
|
+
if (!threadId || !checkpointId) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
const outerKey = `${threadId}|${checkpointNs}|${checkpointId}`;
|
|
66
|
+
let bucket = this.pendingWrites.get(outerKey);
|
|
67
|
+
if (!bucket) {
|
|
68
|
+
bucket = new Map();
|
|
69
|
+
this.pendingWrites.set(outerKey, bucket);
|
|
70
|
+
}
|
|
71
|
+
writes.forEach(([channel, value], idx) => {
|
|
72
|
+
const innerKey = `${taskId},${idx}`;
|
|
73
|
+
bucket.set(innerKey, [taskId, String(channel), value]);
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
async *list(config, options) {
|
|
77
|
+
const threadId = this.extractThreadId(config);
|
|
78
|
+
if (!threadId) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
let checkpoints = await this.saver.list(threadId);
|
|
82
|
+
checkpoints.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
|
|
83
|
+
if (options?.before) {
|
|
84
|
+
const beforeId = options.before.configurable?.['checkpoint_id'];
|
|
85
|
+
if (beforeId) {
|
|
86
|
+
const idx = checkpoints.findIndex((cp) => cp.checkpointId === beforeId);
|
|
87
|
+
if (idx >= 0) {
|
|
88
|
+
checkpoints = checkpoints.slice(idx + 1);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if (options?.limit && options.limit > 0) {
|
|
93
|
+
checkpoints = checkpoints.slice(0, options.limit);
|
|
94
|
+
}
|
|
95
|
+
for (const cp of checkpoints) {
|
|
96
|
+
yield this.checkpointDataToTuple(cp, config);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
extractThreadId(config) {
|
|
100
|
+
return config.configurable?.['thread_id'];
|
|
101
|
+
}
|
|
102
|
+
checkpointDataToTuple(data, config) {
|
|
103
|
+
const checkpoint = this.restoreLangGraphCheckpoint(data);
|
|
104
|
+
const metadata = {
|
|
105
|
+
source: 'loop',
|
|
106
|
+
step: data.historyPath.length,
|
|
107
|
+
writes: null,
|
|
108
|
+
};
|
|
109
|
+
const tupleConfig = {
|
|
110
|
+
...config,
|
|
111
|
+
configurable: {
|
|
112
|
+
...config.configurable,
|
|
113
|
+
thread_id: data.threadId,
|
|
114
|
+
checkpoint_id: data.checkpointId,
|
|
115
|
+
},
|
|
116
|
+
};
|
|
117
|
+
const checkpointNs = String(config.configurable?.['checkpoint_ns'] ?? '');
|
|
118
|
+
const outerKey = `${data.threadId}|${checkpointNs}|${data.checkpointId}`;
|
|
119
|
+
const writes = this.pendingWrites.get(outerKey);
|
|
120
|
+
const pendingWrites = writes
|
|
121
|
+
? Array.from(writes.values()).map(([taskId, channel, value]) => [taskId, channel, value])
|
|
122
|
+
: undefined;
|
|
123
|
+
return {
|
|
124
|
+
config: tupleConfig,
|
|
125
|
+
checkpoint,
|
|
126
|
+
metadata,
|
|
127
|
+
...(pendingWrites ? { pendingWrites } : {}),
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* 优先还原 put() 时写入的 engineSnapshot;旧数据兜底补齐 pending_sends=[]。
|
|
132
|
+
*/
|
|
133
|
+
restoreLangGraphCheckpoint(data) {
|
|
134
|
+
const snap = data.engineSnapshot;
|
|
135
|
+
if (snap && typeof snap === 'object') {
|
|
136
|
+
const channelValues = snap.channel_values && typeof snap.channel_values === 'object'
|
|
137
|
+
? snap.channel_values
|
|
138
|
+
: {};
|
|
139
|
+
const channelVersions = snap.channel_versions && typeof snap.channel_versions === 'object'
|
|
140
|
+
? snap.channel_versions
|
|
141
|
+
: {};
|
|
142
|
+
const versionsSeen = snap.versions_seen && typeof snap.versions_seen === 'object'
|
|
143
|
+
? snap.versions_seen
|
|
144
|
+
: {};
|
|
145
|
+
const restored = {
|
|
146
|
+
v: typeof snap.v === 'number' ? snap.v : 1,
|
|
147
|
+
id: typeof snap.id === 'string' && snap.id ? snap.id : data.checkpointId,
|
|
148
|
+
ts: typeof snap.ts === 'string' && snap.ts ? snap.ts : data.createdAt,
|
|
149
|
+
channel_values: channelValues,
|
|
150
|
+
channel_versions: channelVersions,
|
|
151
|
+
versions_seen: versionsSeen,
|
|
152
|
+
pending_sends: Array.isArray(snap.pending_sends) ? snap.pending_sends : [],
|
|
153
|
+
};
|
|
154
|
+
return restored;
|
|
155
|
+
}
|
|
156
|
+
return {
|
|
157
|
+
v: 1,
|
|
158
|
+
id: data.checkpointId,
|
|
159
|
+
ts: data.createdAt,
|
|
160
|
+
channel_values: {
|
|
161
|
+
messages: data.state.messages ?? [],
|
|
162
|
+
currentNode: data.currentNodeId,
|
|
163
|
+
...this.extractExtraState(data),
|
|
164
|
+
},
|
|
165
|
+
channel_versions: { messages: 1, currentNode: 1 },
|
|
166
|
+
versions_seen: {},
|
|
167
|
+
pending_sends: [],
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
checkpointToData(threadId, checkpoint, metadata) {
|
|
171
|
+
const messages = Array.isArray(checkpoint.channel_values['messages'])
|
|
172
|
+
? checkpoint.channel_values['messages']
|
|
173
|
+
: [];
|
|
174
|
+
const currentNodeId = checkpoint.channel_values['currentNode'] ?? '';
|
|
175
|
+
const step = Number.isFinite(metadata.step) ? Math.max(0, Math.min(metadata.step, 1000)) : 0;
|
|
176
|
+
const historyPath = Array.from({ length: step }, () => 'node');
|
|
177
|
+
const raw = checkpoint;
|
|
178
|
+
return {
|
|
179
|
+
checkpointId: checkpoint.id,
|
|
180
|
+
threadId,
|
|
181
|
+
currentNodeId,
|
|
182
|
+
historyPath,
|
|
183
|
+
state: {
|
|
184
|
+
messages: messages.map((msg) => ({
|
|
185
|
+
role: msg['role'] ?? 'user',
|
|
186
|
+
content: msg['content'] ?? '',
|
|
187
|
+
toolCalls: msg['tool_calls'],
|
|
188
|
+
})),
|
|
189
|
+
userId: checkpoint.channel_values['userId'] ?? '',
|
|
190
|
+
},
|
|
191
|
+
engineSnapshot: {
|
|
192
|
+
v: checkpoint.v,
|
|
193
|
+
id: checkpoint.id,
|
|
194
|
+
ts: checkpoint.ts,
|
|
195
|
+
channel_values: checkpoint.channel_values,
|
|
196
|
+
channel_versions: checkpoint.channel_versions,
|
|
197
|
+
versions_seen: checkpoint.versions_seen,
|
|
198
|
+
pending_sends: Array.isArray(raw.pending_sends) ? raw.pending_sends : [],
|
|
199
|
+
},
|
|
200
|
+
createdBy: 'system',
|
|
201
|
+
createdAt: checkpoint.ts,
|
|
202
|
+
updatedBy: 'system',
|
|
203
|
+
updatedAt: checkpoint.ts,
|
|
204
|
+
isDeleted: false,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
extractExtraState(data) {
|
|
208
|
+
const { messages: _m, userId: _u, ...rest } = data.state;
|
|
209
|
+
return rest;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LangGraph Adapter — IStateGraphEngine 的 v1 实现
|
|
3
|
+
*
|
|
4
|
+
* 将平台 StateGraph Contract 映射到 LangGraph.js API,
|
|
5
|
+
* 实现 Graph 的构建、流式执行、同步调用、Checkpoint 和恢复。
|
|
6
|
+
*
|
|
7
|
+
* @see design.md §1.4 StateGraph Contract 与 LangGraph.js 集成
|
|
8
|
+
* @see requirements.md Requirement 1 AC5
|
|
9
|
+
*/
|
|
10
|
+
import type { IStateGraphEngine } from '../contracts/state-graph.contract.js';
|
|
11
|
+
import type { ExecutableGraph, GraphDSL, GraphState, RuntimeEvent, CheckpointData, GraphResult } from '../contracts/executable-graph.js';
|
|
12
|
+
import type { ICheckpointSaver } from '../../checkpoint/contracts/checkpoint-saver.contract.js';
|
|
13
|
+
import type { HitlHandler } from '../hitl/hitl-handler.js';
|
|
14
|
+
import { type ILLMProvider } from '../nodes/llm-node.js';
|
|
15
|
+
import type { IToolExecutor } from '../../tool/tool-executor.interface.js';
|
|
16
|
+
import type { IGovernanceClient } from '../../governance/governance-client.js';
|
|
17
|
+
import { type ConditionEvaluatorFn } from '../condition-evaluator.js';
|
|
18
|
+
/**
|
|
19
|
+
* LangGraphAdapter — 基于 @langchain/langgraph 的 IStateGraphEngine 实现
|
|
20
|
+
*
|
|
21
|
+
* 职责:
|
|
22
|
+
* 1. 解析 GraphDSL → 注册节点、添加边/条件路由 → 编译为可执行图
|
|
23
|
+
* 2. 调用 LangGraph 的 stream/invoke 驱动执行
|
|
24
|
+
* 3. 提供 Checkpoint 提取与恢复能力
|
|
25
|
+
*/
|
|
26
|
+
export declare class LangGraphAdapter implements IStateGraphEngine {
|
|
27
|
+
private readonly checkpointer;
|
|
28
|
+
private readonly subGraphCompiler;
|
|
29
|
+
private readonly llmProvider;
|
|
30
|
+
private readonly toolExecutor?;
|
|
31
|
+
private readonly toolOrchestrator?;
|
|
32
|
+
private readonly toolResultInjector;
|
|
33
|
+
private readonly conditionEvaluator;
|
|
34
|
+
private readonly systemPromptBuilder;
|
|
35
|
+
private readonly skillAuditRecorder;
|
|
36
|
+
/** 流式旁路:LLM token / Tool 执行事件在节点执行中实时入队 */
|
|
37
|
+
private streamSink;
|
|
38
|
+
private streamEventContext;
|
|
39
|
+
private streamChunkIndex;
|
|
40
|
+
private streamIteration;
|
|
41
|
+
private reasoningStartedThisTurn;
|
|
42
|
+
private streamedTextThisTurn;
|
|
43
|
+
/**
|
|
44
|
+
* @param checkpointSaver - 可选的 ICheckpointSaver
|
|
45
|
+
* @param llmProvider - LLM 调用提供者,默认 EchoLLMProvider
|
|
46
|
+
* @param toolExecutor - Tool 执行器(HttpToolExecutor 等)
|
|
47
|
+
*/
|
|
48
|
+
private readonly governanceClient?;
|
|
49
|
+
private hitlHandler?;
|
|
50
|
+
constructor(checkpointSaver?: ICheckpointSaver, llmProvider?: ILLMProvider, toolExecutor?: IToolExecutor, governanceClient?: IGovernanceClient, hitlHandler?: HitlHandler);
|
|
51
|
+
/**
|
|
52
|
+
* 注册自定义条件评估函数
|
|
53
|
+
*/
|
|
54
|
+
registerConditionEvaluator(name: string, fn: ConditionEvaluatorFn): void;
|
|
55
|
+
/**
|
|
56
|
+
* 节点旁路推送 RuntimeEvent(子图 Skill 生命周期、Tool 执行)。
|
|
57
|
+
* 无 streamSink 时为空操作(纯 invoke)。
|
|
58
|
+
*/
|
|
59
|
+
emitStreamEvent(event: RuntimeEvent): void;
|
|
60
|
+
/**
|
|
61
|
+
* 子图 LLM 可清零流式标志;结束后保留「已经 stream 过」以免父图 convertUpdates 再发一遍正文。
|
|
62
|
+
*/
|
|
63
|
+
runIsolatedLlmStreamFlags<T>(work: () => Promise<T>): Promise<T>;
|
|
64
|
+
/**
|
|
65
|
+
* Tool 节点执行旁路:started → tool.called + tool.progress;
|
|
66
|
+
* completed/error → 对应终态 + tool.progress。同一 toolCallId。
|
|
67
|
+
*/
|
|
68
|
+
private emitToolExecutionEvents;
|
|
69
|
+
/**
|
|
70
|
+
* 解析 GraphDSL 并构建可执行图
|
|
71
|
+
*
|
|
72
|
+
* **Request Isolation**: 每次调用都创建全新的 StateGraph 实例并编译,
|
|
73
|
+
* 确保并发请求之间无共享可变状态。Adapter 自身仅持有 readonly 配置(checkpointer、subGraphCompiler),
|
|
74
|
+
* 不缓存任何编译产物或运行时状态。
|
|
75
|
+
*
|
|
76
|
+
* 流程:
|
|
77
|
+
* 1. 创建 StateGraph 实例(配置 channels)
|
|
78
|
+
* 2. 遍历 DSL nodes → addNode 注册节点函数
|
|
79
|
+
* 3. 遍历 DSL edges → addEdge 添加普通边
|
|
80
|
+
* 4. 遍历 DSL conditionalEdges → addConditionalEdges 添加条件路由
|
|
81
|
+
* 5. 设置入口/终止节点
|
|
82
|
+
* 6. compile() 编译
|
|
83
|
+
*/
|
|
84
|
+
buildGraph(dsl: GraphDSL): Promise<ExecutableGraph>;
|
|
85
|
+
/**
|
|
86
|
+
* 流式驱动图执行,逐步 yield RuntimeEvent
|
|
87
|
+
*
|
|
88
|
+
* - LangGraph `streamMode: "updates"`:节点完成后产出 response.chunk / stats 等
|
|
89
|
+
* - LLM token / Tool 执行事件:经 streamSink 在节点执行中实时旁路入队
|
|
90
|
+
* (当前 @langchain/langgraph@0.2 无 messages mode,故用 LLMNode.onChunk 模拟)
|
|
91
|
+
*/
|
|
92
|
+
stream(graph: ExecutableGraph, state: GraphState): AsyncIterableIterator<RuntimeEvent>;
|
|
93
|
+
/**
|
|
94
|
+
* 同步调用图执行,返回完整结果
|
|
95
|
+
*/
|
|
96
|
+
invoke(graph: ExecutableGraph, state: GraphState): Promise<GraphResult>;
|
|
97
|
+
/**
|
|
98
|
+
* 从运行中的图提取 Checkpoint
|
|
99
|
+
*
|
|
100
|
+
* 提取当前执行状态为可持久化的 CheckpointData。
|
|
101
|
+
*/
|
|
102
|
+
checkpoint(graph: ExecutableGraph): CheckpointData;
|
|
103
|
+
/**
|
|
104
|
+
* 从 CheckpointData 恢复可执行图
|
|
105
|
+
*
|
|
106
|
+
* HITL / Fork 续跑请走 `buildGraph(dsl)` + 同一 `thread_id` 的 state。
|
|
107
|
+
* 本方法无 DSL,无法编译出可用 `_engineInstance`。
|
|
108
|
+
*/
|
|
109
|
+
restore(checkpointData: CheckpointData): Promise<ExecutableGraph>;
|
|
110
|
+
/**
|
|
111
|
+
* 根据节点类型创建对应的执行函数
|
|
112
|
+
*/
|
|
113
|
+
private createNodeFunction;
|
|
114
|
+
private createSkillBindNodeFunction;
|
|
115
|
+
private buildSkillCatalog;
|
|
116
|
+
private createToolNodeFunction;
|
|
117
|
+
private createLLMNodeFunction;
|
|
118
|
+
/**
|
|
119
|
+
* 子图节点:优先 config.subgraphDsl;否则按 skillId 从 state.skillDefinitions.workflow 解析。
|
|
120
|
+
* 技能 prompt 由 SubGraphCompiler 写入 activeSkillPrompt,供入口 LLM 拼接。
|
|
121
|
+
*/
|
|
122
|
+
private createSubGraphNodeFunction;
|
|
123
|
+
/**
|
|
124
|
+
* 并行节点:并行执行多个子任务分支
|
|
125
|
+
*
|
|
126
|
+
* 支持两种并行模式:
|
|
127
|
+
* 1. branches 模式:node.branches 列出要并行执行的节点 ID,每个节点的执行函数由 DSL 定义
|
|
128
|
+
* 2. tasks 模式:node.config.tasks 列出要并行执行的异步任务函数
|
|
129
|
+
*
|
|
130
|
+
* 执行结果合并到 state.__parallelResults 中。
|
|
131
|
+
*/
|
|
132
|
+
private createParallelNodeFunction;
|
|
133
|
+
/**
|
|
134
|
+
* 代码执行节点:在受限沙箱中执行用户代码
|
|
135
|
+
*
|
|
136
|
+
* 支持两种模式:
|
|
137
|
+
* 1. inline:node.config.code 为内联 JavaScript/TypeScript 代码字符串
|
|
138
|
+
* 2. handler:node.config.handler 为外部模块路径 + 函数名
|
|
139
|
+
*
|
|
140
|
+
* 安全措施:
|
|
141
|
+
* - 禁止 require/import 动态加载
|
|
142
|
+
* - 执行超时控制(默认 5000ms)
|
|
143
|
+
* - 限制可访问的 state 字段
|
|
144
|
+
*/
|
|
145
|
+
private createCodeNodeFunction;
|
|
146
|
+
/**
|
|
147
|
+
* 受限沙箱执行代码
|
|
148
|
+
*
|
|
149
|
+
* 使用 Function 构造器 + 超时控制,禁止动态模块加载。
|
|
150
|
+
* 注意:这不是完整的安全沙箱,生产环境应使用 vm2/isolated-vm 或容器化方案。
|
|
151
|
+
*/
|
|
152
|
+
private executeCodeInSandbox;
|
|
153
|
+
/**
|
|
154
|
+
* 从 DSL 中提取条件节点关联的分支值
|
|
155
|
+
*/
|
|
156
|
+
private extractBranchValuesFromDsl;
|
|
157
|
+
/**
|
|
158
|
+
* shouldContinue 的 call_tools 只能进 type:tool。
|
|
159
|
+
* 禁止指向 subgraph / llm / code:那是路由信号,不是 Tool 执行。
|
|
160
|
+
* 内嵌 subgraphDsl 同样校验。
|
|
161
|
+
*/
|
|
162
|
+
private assertShouldContinueTargetsTool;
|
|
163
|
+
/**
|
|
164
|
+
* 添加条件路由边到 StateGraph
|
|
165
|
+
*
|
|
166
|
+
* 使用 ConditionEvaluator 对 DSL 中的 conditionFn 表达式求值,
|
|
167
|
+
* 支持 stateField 引用、简单表达式和自定义评估函数。
|
|
168
|
+
*/
|
|
169
|
+
private addConditionalEdge;
|
|
170
|
+
/**
|
|
171
|
+
* 获取编译后图的内部引用
|
|
172
|
+
*/
|
|
173
|
+
private getCompiledRef;
|
|
174
|
+
/**
|
|
175
|
+
* 将 GraphState 转换为 LangGraph 输入格式。
|
|
176
|
+
* 必须原样保留 toolCalls / toolCallId / reasoningContent 等字段,
|
|
177
|
+
* 否则多轮回放时 DeepSeek thinking 会因缺少 reasoning_content 而 400,
|
|
178
|
+
* tool 消息也会丢掉 tool_call_id。
|
|
179
|
+
*/
|
|
180
|
+
private graphStateToLangGraphInput;
|
|
181
|
+
/**
|
|
182
|
+
* 将 LangGraph updates 模式输出转为平台 RuntimeEvent 序列
|
|
183
|
+
*
|
|
184
|
+
* updates 形态:`{ [nodeId]: partialState }`;partialState.messages 仅为该节点新增消息。
|
|
185
|
+
*/
|
|
186
|
+
private convertUpdatesToEvents;
|
|
187
|
+
/** 规范化 updates / values 两种 stream 输出 */
|
|
188
|
+
private normalizeStreamUpdates;
|
|
189
|
+
private extractMessagesFromPartial;
|
|
190
|
+
}
|