@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.
Files changed (326) hide show
  1. package/README.md +323 -0
  2. package/dist/api/handlers/index.d.ts +3 -0
  3. package/dist/api/handlers/index.js +4 -0
  4. package/dist/api/handlers/invoke.handler.d.ts +77 -0
  5. package/dist/api/handlers/invoke.handler.js +411 -0
  6. package/dist/api/handlers/messages.handler.d.ts +53 -0
  7. package/dist/api/handlers/messages.handler.js +80 -0
  8. package/dist/api/handlers/stream.handler.d.ts +92 -0
  9. package/dist/api/handlers/stream.handler.js +432 -0
  10. package/dist/api/index.d.ts +3 -0
  11. package/dist/api/index.js +4 -0
  12. package/dist/api/middleware/auth.middleware.d.ts +96 -0
  13. package/dist/api/middleware/auth.middleware.js +158 -0
  14. package/dist/api/middleware/index.d.ts +1 -0
  15. package/dist/api/middleware/index.js +2 -0
  16. package/dist/api/routes/agent.routes.d.ts +44 -0
  17. package/dist/api/routes/agent.routes.js +204 -0
  18. package/dist/api/routes/index.d.ts +3 -0
  19. package/dist/api/routes/index.js +4 -0
  20. package/dist/api/routes/session.routes.d.ts +82 -0
  21. package/dist/api/routes/session.routes.js +169 -0
  22. package/dist/api/routes/task.routes.d.ts +75 -0
  23. package/dist/api/routes/task.routes.js +108 -0
  24. package/dist/checkpoint/checkpoint-serializer.d.ts +58 -0
  25. package/dist/checkpoint/checkpoint-serializer.js +81 -0
  26. package/dist/checkpoint/composite-checkpoint-saver.d.ts +42 -0
  27. package/dist/checkpoint/composite-checkpoint-saver.js +118 -0
  28. package/dist/checkpoint/contracts/checkpoint-saver.contract.d.ts +65 -0
  29. package/dist/checkpoint/contracts/checkpoint-saver.contract.js +12 -0
  30. package/dist/checkpoint/contracts/index.d.ts +1 -0
  31. package/dist/checkpoint/contracts/index.js +1 -0
  32. package/dist/checkpoint/file-checkpoint-saver.d.ts +19 -0
  33. package/dist/checkpoint/file-checkpoint-saver.js +98 -0
  34. package/dist/checkpoint/hybrid-checkpoint-saver.d.ts +130 -0
  35. package/dist/checkpoint/hybrid-checkpoint-saver.js +211 -0
  36. package/dist/checkpoint/in-memory-checkpoint-saver.d.ts +14 -0
  37. package/dist/checkpoint/in-memory-checkpoint-saver.js +46 -0
  38. package/dist/checkpoint/index.d.ts +16 -0
  39. package/dist/checkpoint/index.js +13 -0
  40. package/dist/checkpoint/mongo-checkpoint-saver.d.ts +38 -0
  41. package/dist/checkpoint/mongo-checkpoint-saver.js +56 -0
  42. package/dist/checkpoint/pg-checkpoint-saver.d.ts +59 -0
  43. package/dist/checkpoint/pg-checkpoint-saver.js +140 -0
  44. package/dist/checkpoint/redis-checkpoint-saver.d.ts +68 -0
  45. package/dist/checkpoint/redis-checkpoint-saver.js +173 -0
  46. package/dist/checkpoint/restore-checkpoint.d.ts +33 -0
  47. package/dist/checkpoint/restore-checkpoint.js +33 -0
  48. package/dist/common/agent-code.d.ts +10 -0
  49. package/dist/common/agent-code.js +12 -0
  50. package/dist/common/concurrency.d.ts +79 -0
  51. package/dist/common/concurrency.js +121 -0
  52. package/dist/common/health.d.ts +40 -0
  53. package/dist/common/health.js +37 -0
  54. package/dist/common/index.d.ts +5 -0
  55. package/dist/common/index.js +5 -0
  56. package/dist/common/logger.d.ts +34 -0
  57. package/dist/common/logger.js +38 -0
  58. package/dist/common/queue-consumer.d.ts +125 -0
  59. package/dist/common/queue-consumer.js +159 -0
  60. package/dist/common/trace-id.d.ts +2 -0
  61. package/dist/common/trace-id.js +8 -0
  62. package/dist/common/types.d.ts +104 -0
  63. package/dist/common/types.js +14 -0
  64. package/dist/contracts/index.d.ts +11 -0
  65. package/dist/contracts/index.js +10 -0
  66. package/dist/contracts/permission-checker.d.ts +10 -0
  67. package/dist/contracts/permission-checker.js +4 -0
  68. package/dist/contracts/trace-collector.d.ts +211 -0
  69. package/dist/contracts/trace-collector.js +13 -0
  70. package/dist/governance/governance-client.d.ts +38 -0
  71. package/dist/governance/governance-client.js +95 -0
  72. package/dist/governance/index.d.ts +7 -0
  73. package/dist/governance/index.js +5 -0
  74. package/dist/governance/permission-guard.d.ts +19 -0
  75. package/dist/governance/permission-guard.js +59 -0
  76. package/dist/graph/adapters/index.d.ts +3 -0
  77. package/dist/graph/adapters/index.js +3 -0
  78. package/dist/graph/adapters/langgraph-checkpointer.d.ts +40 -0
  79. package/dist/graph/adapters/langgraph-checkpointer.js +211 -0
  80. package/dist/graph/adapters/langgraph.adapter.d.ts +190 -0
  81. package/dist/graph/adapters/langgraph.adapter.js +1303 -0
  82. package/dist/graph/adapters/subgraph-compiler.d.ts +39 -0
  83. package/dist/graph/adapters/subgraph-compiler.js +248 -0
  84. package/dist/graph/condition-evaluator.d.ts +57 -0
  85. package/dist/graph/condition-evaluator.js +162 -0
  86. package/dist/graph/contracts/executable-graph.d.ts +340 -0
  87. package/dist/graph/contracts/executable-graph.js +10 -0
  88. package/dist/graph/contracts/index.d.ts +2 -0
  89. package/dist/graph/contracts/index.js +2 -0
  90. package/dist/graph/contracts/state-graph.contract.d.ts +76 -0
  91. package/dist/graph/contracts/state-graph.contract.js +11 -0
  92. package/dist/graph/hitl/hitl-handler.d.ts +199 -0
  93. package/dist/graph/hitl/hitl-handler.js +480 -0
  94. package/dist/graph/hitl/index.d.ts +1 -0
  95. package/dist/graph/hitl/index.js +1 -0
  96. package/dist/graph/index.d.ts +7 -0
  97. package/dist/graph/index.js +7 -0
  98. package/dist/graph/nodes/index.d.ts +2 -0
  99. package/dist/graph/nodes/index.js +2 -0
  100. package/dist/graph/nodes/llm-node.d.ts +182 -0
  101. package/dist/graph/nodes/llm-node.js +281 -0
  102. package/dist/graph/nodes/skill-bind-node.d.ts +32 -0
  103. package/dist/graph/nodes/skill-bind-node.js +116 -0
  104. package/dist/graph/nodes/tool-node.d.ts +75 -0
  105. package/dist/graph/nodes/tool-node.js +324 -0
  106. package/dist/graph/resolve-graph-prompt.d.ts +5 -0
  107. package/dist/graph/resolve-graph-prompt.js +75 -0
  108. package/dist/graph/retry/budget-aware-retry.d.ts +91 -0
  109. package/dist/graph/retry/budget-aware-retry.js +126 -0
  110. package/dist/graph/retry/index.d.ts +9 -0
  111. package/dist/graph/retry/index.js +8 -0
  112. package/dist/graph/retry/node-retry.d.ts +123 -0
  113. package/dist/graph/retry/node-retry.js +235 -0
  114. package/dist/graph/skill-audit-recorder.d.ts +126 -0
  115. package/dist/graph/skill-audit-recorder.js +114 -0
  116. package/dist/index.d.ts +21 -0
  117. package/dist/index.js +32 -0
  118. package/dist/memory/compression/compression-stats.d.ts +109 -0
  119. package/dist/memory/compression/compression-stats.js +144 -0
  120. package/dist/memory/compression/compression.repository.d.ts +62 -0
  121. package/dist/memory/compression/compression.repository.js +71 -0
  122. package/dist/memory/compression/index.d.ts +10 -0
  123. package/dist/memory/compression/index.js +15 -0
  124. package/dist/memory/compression/llm-summarize.d.ts +58 -0
  125. package/dist/memory/compression/llm-summarize.js +192 -0
  126. package/dist/memory/compression/sliding-window.compression.d.ts +60 -0
  127. package/dist/memory/compression/sliding-window.compression.js +175 -0
  128. package/dist/memory/index.d.ts +4 -0
  129. package/dist/memory/index.js +7 -0
  130. package/dist/memory/long-term-memory.service.d.ts +94 -0
  131. package/dist/memory/long-term-memory.service.js +120 -0
  132. package/dist/memory/message-compression.service.d.ts +128 -0
  133. package/dist/memory/message-compression.service.js +69 -0
  134. package/dist/memory/pg-memory.repository.d.ts +44 -0
  135. package/dist/memory/pg-memory.repository.js +108 -0
  136. package/dist/memory/semantic-retrieval.service.d.ts +148 -0
  137. package/dist/memory/semantic-retrieval.service.js +238 -0
  138. package/dist/providers/echo-llm-provider.d.ts +10 -0
  139. package/dist/providers/echo-llm-provider.js +87 -0
  140. package/dist/providers/http-llm-provider.d.ts +35 -0
  141. package/dist/providers/http-llm-provider.js +404 -0
  142. package/dist/providers/index.d.ts +7 -0
  143. package/dist/providers/index.js +5 -0
  144. package/dist/providers/local-llm-provider.d.ts +27 -0
  145. package/dist/providers/local-llm-provider.js +105 -0
  146. package/dist/providers/resolve-llm-model.d.ts +13 -0
  147. package/dist/providers/resolve-llm-model.js +30 -0
  148. package/dist/providers/routing-llm-provider.d.ts +28 -0
  149. package/dist/providers/routing-llm-provider.js +79 -0
  150. package/dist/registry/agent-models.d.ts +1 -0
  151. package/dist/registry/agent-models.js +1 -0
  152. package/dist/registry/agent-registry-client.d.ts +56 -0
  153. package/dist/registry/agent-registry-client.js +36 -0
  154. package/dist/registry/definition-cache.d.ts +37 -0
  155. package/dist/registry/definition-cache.js +82 -0
  156. package/dist/registry/deployment-snapshot.d.ts +99 -0
  157. package/dist/registry/deployment-snapshot.js +542 -0
  158. package/dist/registry/graph-loader.d.ts +134 -0
  159. package/dist/registry/graph-loader.js +985 -0
  160. package/dist/registry/index.d.ts +9 -0
  161. package/dist/registry/index.js +9 -0
  162. package/dist/registry/preload-errors.d.ts +13 -0
  163. package/dist/registry/preload-errors.js +35 -0
  164. package/dist/registry/preload-flags.d.ts +22 -0
  165. package/dist/registry/preload-flags.js +44 -0
  166. package/dist/registry/skill-io-guard.d.ts +25 -0
  167. package/dist/registry/skill-io-guard.js +98 -0
  168. package/dist/registry/skill-tree.d.ts +27 -0
  169. package/dist/registry/skill-tree.js +183 -0
  170. package/dist/runtime/agent-runtime.d.ts +106 -0
  171. package/dist/runtime/agent-runtime.js +777 -0
  172. package/dist/runtime/dev-runtime.d.ts +69 -0
  173. package/dist/runtime/dev-runtime.js +199 -0
  174. package/dist/runtime/index.d.ts +4 -0
  175. package/dist/runtime/index.js +3 -0
  176. package/dist/runtime/storage-profile.d.ts +50 -0
  177. package/dist/runtime/storage-profile.js +138 -0
  178. package/dist/runtime/types.d.ts +120 -0
  179. package/dist/runtime/types.js +9 -0
  180. package/dist/server.d.ts +12 -0
  181. package/dist/server.js +161 -0
  182. package/dist/session/compression-middleware.d.ts +126 -0
  183. package/dist/session/compression-middleware.js +230 -0
  184. package/dist/session/file-message.repository.d.ts +25 -0
  185. package/dist/session/file-message.repository.js +78 -0
  186. package/dist/session/file-session.repository.d.ts +72 -0
  187. package/dist/session/file-session.repository.js +212 -0
  188. package/dist/session/index.d.ts +13 -0
  189. package/dist/session/index.js +12 -0
  190. package/dist/session/message.service.d.ts +80 -0
  191. package/dist/session/message.service.js +128 -0
  192. package/dist/session/persist-turn-messages.d.ts +145 -0
  193. package/dist/session/persist-turn-messages.js +325 -0
  194. package/dist/session/pg-message.repository.d.ts +49 -0
  195. package/dist/session/pg-message.repository.js +149 -0
  196. package/dist/session/pg-session.repository.d.ts +46 -0
  197. package/dist/session/pg-session.repository.js +117 -0
  198. package/dist/session/session-context.service.d.ts +49 -0
  199. package/dist/session/session-context.service.js +66 -0
  200. package/dist/session/session.service.d.ts +194 -0
  201. package/dist/session/session.service.js +166 -0
  202. package/dist/sse/connection-event-logger.d.ts +21 -0
  203. package/dist/sse/connection-event-logger.js +33 -0
  204. package/dist/sse/contracts/index.d.ts +1 -0
  205. package/dist/sse/contracts/index.js +1 -0
  206. package/dist/sse/contracts/sse-emitter.contract.d.ts +74 -0
  207. package/dist/sse/contracts/sse-emitter.contract.js +11 -0
  208. package/dist/sse/event-buffer.d.ts +20 -0
  209. package/dist/sse/event-buffer.js +45 -0
  210. package/dist/sse/events/code-events.d.ts +19 -0
  211. package/dist/sse/events/code-events.js +9 -0
  212. package/dist/sse/events/collaboration-events.d.ts +37 -0
  213. package/dist/sse/events/collaboration-events.js +11 -0
  214. package/dist/sse/events/connection-events.d.ts +13 -0
  215. package/dist/sse/events/connection-events.js +9 -0
  216. package/dist/sse/events/file-events.d.ts +29 -0
  217. package/dist/sse/events/file-events.js +10 -0
  218. package/dist/sse/events/hitl-events.d.ts +33 -0
  219. package/dist/sse/events/hitl-events.js +10 -0
  220. package/dist/sse/events/index.d.ts +107 -0
  221. package/dist/sse/events/index.js +96 -0
  222. package/dist/sse/events/plan-events.d.ts +38 -0
  223. package/dist/sse/events/plan-events.js +11 -0
  224. package/dist/sse/events/reasoning-events.d.ts +35 -0
  225. package/dist/sse/events/reasoning-events.js +13 -0
  226. package/dist/sse/events/response-events.d.ts +25 -0
  227. package/dist/sse/events/response-events.js +12 -0
  228. package/dist/sse/events/session-events.d.ts +43 -0
  229. package/dist/sse/events/session-events.js +12 -0
  230. package/dist/sse/events/skill-events.d.ts +48 -0
  231. package/dist/sse/events/skill-events.js +11 -0
  232. package/dist/sse/events/stats-events.d.ts +44 -0
  233. package/dist/sse/events/stats-events.js +12 -0
  234. package/dist/sse/events/tool-events.d.ts +68 -0
  235. package/dist/sse/events/tool-events.js +14 -0
  236. package/dist/sse/index.d.ts +8 -0
  237. package/dist/sse/index.js +8 -0
  238. package/dist/sse/sse-connection-manager.d.ts +116 -0
  239. package/dist/sse/sse-connection-manager.js +185 -0
  240. package/dist/sse/sse-emitter.d.ts +108 -0
  241. package/dist/sse/sse-emitter.js +210 -0
  242. package/dist/sse/sse-heartbeat.d.ts +58 -0
  243. package/dist/sse/sse-heartbeat.js +76 -0
  244. package/dist/sse/trace-collector.d.ts +60 -0
  245. package/dist/sse/trace-collector.js +107 -0
  246. package/dist/task/contracts/index.d.ts +2 -0
  247. package/dist/task/contracts/index.js +1 -0
  248. package/dist/task/contracts/task-manager.contract.d.ts +160 -0
  249. package/dist/task/contracts/task-manager.contract.js +10 -0
  250. package/dist/task/index.d.ts +7 -0
  251. package/dist/task/index.js +5 -0
  252. package/dist/task/pg-task.repository.d.ts +47 -0
  253. package/dist/task/pg-task.repository.js +131 -0
  254. package/dist/task/task-progress-tracker.d.ts +67 -0
  255. package/dist/task/task-progress-tracker.js +80 -0
  256. package/dist/task/task-timeout.d.ts +70 -0
  257. package/dist/task/task-timeout.js +116 -0
  258. package/dist/task/task.service.d.ts +84 -0
  259. package/dist/task/task.service.js +233 -0
  260. package/dist/token/compression-budget-integration.d.ts +145 -0
  261. package/dist/token/compression-budget-integration.js +185 -0
  262. package/dist/token/context-window-budget.d.ts +113 -0
  263. package/dist/token/context-window-budget.js +134 -0
  264. package/dist/token/contracts/index.d.ts +1 -0
  265. package/dist/token/contracts/index.js +1 -0
  266. package/dist/token/contracts/token-budget.contract.d.ts +77 -0
  267. package/dist/token/contracts/token-budget.contract.js +11 -0
  268. package/dist/token/index.d.ts +12 -0
  269. package/dist/token/index.js +10 -0
  270. package/dist/token/pg-token-budget.repository.d.ts +39 -0
  271. package/dist/token/pg-token-budget.repository.js +116 -0
  272. package/dist/token/session-budget-checker.d.ts +54 -0
  273. package/dist/token/session-budget-checker.js +72 -0
  274. package/dist/token/token-budget-guard.d.ts +66 -0
  275. package/dist/token/token-budget-guard.js +97 -0
  276. package/dist/token/token-budget.service.d.ts +86 -0
  277. package/dist/token/token-budget.service.js +130 -0
  278. package/dist/token/token-detail-mode.d.ts +73 -0
  279. package/dist/token/token-detail-mode.js +107 -0
  280. package/dist/token/token-estimator.d.ts +80 -0
  281. package/dist/token/token-estimator.js +134 -0
  282. package/dist/token/token-stats.service.d.ts +88 -0
  283. package/dist/token/token-stats.service.js +94 -0
  284. package/dist/tool/create-tool-executor.d.ts +33 -0
  285. package/dist/tool/create-tool-executor.js +60 -0
  286. package/dist/tool/dev-http-executor.d.ts +18 -0
  287. package/dist/tool/dev-http-executor.js +96 -0
  288. package/dist/tool/dev-mcp-executor.d.ts +29 -0
  289. package/dist/tool/dev-mcp-executor.js +84 -0
  290. package/dist/tool/dev-tool-executor.d.ts +23 -0
  291. package/dist/tool/dev-tool-executor.js +55 -0
  292. package/dist/tool/file-artifact.d.ts +11 -0
  293. package/dist/tool/file-artifact.js +90 -0
  294. package/dist/tool/http-tool-executor.d.ts +17 -0
  295. package/dist/tool/http-tool-executor.js +158 -0
  296. package/dist/tool/index.d.ts +18 -0
  297. package/dist/tool/index.js +17 -0
  298. package/dist/tool/loaded-tool-definition.d.ts +35 -0
  299. package/dist/tool/loaded-tool-definition.js +9 -0
  300. package/dist/tool/local-mcp-client.d.ts +23 -0
  301. package/dist/tool/local-mcp-client.js +225 -0
  302. package/dist/tool/local-tool-executor.d.ts +37 -0
  303. package/dist/tool/local-tool-executor.js +249 -0
  304. package/dist/tool/mcp-tool-executor.d.ts +23 -0
  305. package/dist/tool/mcp-tool-executor.js +160 -0
  306. package/dist/tool/mock-tool-executor.d.ts +28 -0
  307. package/dist/tool/mock-tool-executor.js +65 -0
  308. package/dist/tool/system-prompt-builder.d.ts +114 -0
  309. package/dist/tool/system-prompt-builder.js +213 -0
  310. package/dist/tool/tool-confirmation.d.ts +29 -0
  311. package/dist/tool/tool-confirmation.js +81 -0
  312. package/dist/tool/tool-event-emitter.d.ts +58 -0
  313. package/dist/tool/tool-event-emitter.js +154 -0
  314. package/dist/tool/tool-execution-router.d.ts +25 -0
  315. package/dist/tool/tool-execution-router.js +50 -0
  316. package/dist/tool/tool-executor.interface.d.ts +85 -0
  317. package/dist/tool/tool-executor.interface.js +7 -0
  318. package/dist/tool/tool-orchestrator.d.ts +22 -0
  319. package/dist/tool/tool-orchestrator.js +104 -0
  320. package/dist/tool/tool-result-injector.d.ts +64 -0
  321. package/dist/tool/tool-result-injector.js +65 -0
  322. package/dist/utils/format-error.d.ts +4 -0
  323. package/dist/utils/format-error.js +4 -0
  324. package/dist/utils/http-error.d.ts +11 -0
  325. package/dist/utils/http-error.js +24 -0
  326. package/package.json +56 -0
@@ -0,0 +1,542 @@
1
+ /**
2
+ * Deployment 预装快照读取(RT-4 / 04 Req 8.1 / 联调契约)
3
+ *
4
+ * 目录(Agent 自包含,无全局共享层):
5
+ * {root}/agents/<agentCode>/<version>/preinstall/tools/<toolsetCode>/
6
+ * {root}/agents/<agentCode>/<version>/preinstall/skills/<skillCode>/
7
+ * {root}/agents/<agentCode>/<version>/users/<userId>/skills/<skillCode>/
8
+ *
9
+ * 命名:agentCode / toolsetCode / skillCode / toolName 均为语义化小写标识;
10
+ * Skill 目录无版本层(维护形态为 ZIP 上传整包替换,包内必含 skill.md)。
11
+ */
12
+ import { readdir, readFile, access } from 'node:fs/promises';
13
+ import { createHash } from 'node:crypto';
14
+ import path from 'node:path';
15
+ import { constants as fsConstants } from 'node:fs';
16
+ import { preloadMissing, preloadPackageCorrupt, } from './preload-errors.js';
17
+ import { isRequireChecksum, resolvePreloadBehaviorFlags, } from './preload-flags.js';
18
+ async function pathExists(p) {
19
+ try {
20
+ await access(p, fsConstants.F_OK);
21
+ return true;
22
+ }
23
+ catch {
24
+ return false;
25
+ }
26
+ }
27
+ async function readTextFile(filePath) {
28
+ try {
29
+ return await readFile(filePath, 'utf-8');
30
+ }
31
+ catch {
32
+ return null;
33
+ }
34
+ }
35
+ async function readJsonFile(filePath) {
36
+ const raw = await readTextFile(filePath);
37
+ if (raw == null)
38
+ return null;
39
+ try {
40
+ return JSON.parse(raw);
41
+ }
42
+ catch {
43
+ return null;
44
+ }
45
+ }
46
+ /** JSON 优先;.yaml/.yml 尝试动态加载 yaml 包,失败则视为损坏 */
47
+ async function readDataFile(filePath) {
48
+ const raw = await readTextFile(filePath);
49
+ if (raw == null)
50
+ return null;
51
+ const trimmed = raw.trim();
52
+ if (!trimmed)
53
+ return null;
54
+ try {
55
+ return JSON.parse(trimmed);
56
+ }
57
+ catch {
58
+ // continue to yaml
59
+ }
60
+ const lower = filePath.toLowerCase();
61
+ if (!lower.endsWith('.yaml') && !lower.endsWith('.yml')) {
62
+ throw preloadPackageCorrupt(`无法解析预装文件(非合法 JSON): ${filePath}`);
63
+ }
64
+ // yaml 依赖:已列入 package.json;解析失败仍报 package_corrupt
65
+ try {
66
+ const yamlMod = await import('yaml');
67
+ const parsed = yamlMod.parse(trimmed);
68
+ if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
69
+ return parsed;
70
+ }
71
+ throw preloadPackageCorrupt(`YAML 根节点须为对象: ${filePath}`);
72
+ }
73
+ catch (err) {
74
+ if (err && typeof err === 'object' && 'code' in err)
75
+ throw err;
76
+ const msg = err instanceof Error ? err.message : String(err);
77
+ if (msg.includes('Cannot find package') || msg.includes('Cannot find module')) {
78
+ throw preloadPackageCorrupt(`未安装 yaml 依赖,无法解析 ${filePath};请改用 graph.json 或安装 yaml`);
79
+ }
80
+ throw preloadPackageCorrupt(`无法解析 YAML: ${filePath}`, { cause: msg });
81
+ }
82
+ }
83
+ function isPathInside(root, target) {
84
+ const relativePath = path.relative(path.resolve(root), path.resolve(target));
85
+ return relativePath === '' || (!relativePath.startsWith(`..${path.sep}`) && relativePath !== '..');
86
+ }
87
+ /** 规范化摘要:去 sha256: 前缀、空白,转小写 hex */
88
+ export function normalizeDigest(value) {
89
+ if (typeof value !== 'string')
90
+ return null;
91
+ let s = value.trim();
92
+ if (!s)
93
+ return null;
94
+ if (s.toLowerCase().startsWith('sha256:'))
95
+ s = s.slice(7).trim();
96
+ s = s.toLowerCase();
97
+ if (!/^[0-9a-f]{64}$/.test(s))
98
+ return null;
99
+ return s;
100
+ }
101
+ async function sha256OfFile(filePath) {
102
+ const buf = await readFile(filePath);
103
+ return createHash('sha256').update(buf).digest('hex');
104
+ }
105
+ async function findDigestMatch(items, expectedRaw) {
106
+ const expected = normalizeDigest(expectedRaw);
107
+ if (!expected)
108
+ return undefined;
109
+ for (const item of items) {
110
+ const actual = await sha256OfFile(item.path);
111
+ if (normalizeDigest(actual) === expected)
112
+ return item;
113
+ }
114
+ return undefined;
115
+ }
116
+ async function assertDigestMatch(expectedRaw, actualHex, label, details) {
117
+ const expected = normalizeDigest(expectedRaw);
118
+ if (!expected)
119
+ return;
120
+ if (expected !== actualHex.toLowerCase()) {
121
+ throw preloadPackageCorrupt(`预装校验和不匹配: ${label}`, {
122
+ expected,
123
+ actual: actualHex.toLowerCase(),
124
+ ...details,
125
+ });
126
+ }
127
+ }
128
+ async function pickLatestVersionDir(parent) {
129
+ if (!(await pathExists(parent)))
130
+ return null;
131
+ const entries = await readdir(parent, { withFileTypes: true });
132
+ const dirs = entries.filter((e) => e.isDirectory()).map((e) => e.name);
133
+ if (dirs.includes('current')) {
134
+ return path.join(parent, 'current');
135
+ }
136
+ if (dirs.length === 0)
137
+ return null;
138
+ dirs.sort();
139
+ return path.join(parent, dirs[dirs.length - 1]);
140
+ }
141
+ function skillRefsFromManifest(manifest) {
142
+ const raw = manifest.skillRefs ?? manifest.skills;
143
+ if (!Array.isArray(raw))
144
+ return [];
145
+ const out = [];
146
+ for (const item of raw) {
147
+ if (typeof item === 'string') {
148
+ out.push({ skillId: item });
149
+ continue;
150
+ }
151
+ if (item && typeof item === 'object') {
152
+ const o = item;
153
+ const skillId = String(o.skill ?? o.skillId ?? o.skillCode ?? o.id ?? '');
154
+ if (!skillId)
155
+ continue;
156
+ out.push({
157
+ skillId,
158
+ name: o.name != null ? String(o.name) : undefined,
159
+ version: o.version != null ? String(o.version) : undefined,
160
+ description: o.description != null ? String(o.description) : undefined,
161
+ sha256: typeof o.sha256 === 'string' ? o.sha256 : undefined,
162
+ });
163
+ }
164
+ }
165
+ return out;
166
+ }
167
+ function parseStringList(value) {
168
+ if (!Array.isArray(value))
169
+ return undefined;
170
+ const out = value.filter((x) => typeof x === 'string' && x.length > 0);
171
+ return out.length > 0 ? out : undefined;
172
+ }
173
+ /**
174
+ * 装配引用(toolRefs / 简写 tools[])vs 内联完整 ToolManifest。
175
+ * 含 type/execution 的视为内联定义;仅 toolset/name/version/enabledTools 等视为引用。
176
+ */
177
+ export function isInlineToolDeclaration(item) {
178
+ if (!item || typeof item !== 'object' || Array.isArray(item))
179
+ return false;
180
+ const o = item;
181
+ return o.type != null || o.execution != null;
182
+ }
183
+ function parseToolAssemblyRef(item) {
184
+ if (typeof item === 'string') {
185
+ return item ? { name: item } : null;
186
+ }
187
+ if (!item || typeof item !== 'object' || Array.isArray(item))
188
+ return null;
189
+ if (isInlineToolDeclaration(item))
190
+ return null;
191
+ const o = item;
192
+ const name = String(o.toolset ?? o.name ?? o.toolId ?? o.id ?? '');
193
+ if (!name)
194
+ return null;
195
+ return {
196
+ name,
197
+ toolId: o.toolId != null ? String(o.toolId) : undefined,
198
+ version: o.version != null ? String(o.version) : undefined,
199
+ sha256: typeof o.sha256 === 'string' ? o.sha256 : undefined,
200
+ enabledTools: parseStringList(o.enabledTools),
201
+ autoApprove: parseStringList(o.autoApprove),
202
+ };
203
+ }
204
+ /**
205
+ * 从 agent.manifest 收集工具集装配引用:优先 toolRefs[],再合并简写 tools[](非内联项)。
206
+ */
207
+ function toolRefsFromManifest(manifest) {
208
+ const out = [];
209
+ const byName = new Map();
210
+ const upsert = (ref) => {
211
+ const prev = byName.get(ref.name);
212
+ if (!prev) {
213
+ byName.set(ref.name, ref);
214
+ out.push(ref);
215
+ return;
216
+ }
217
+ // 后写补全白名单等字段,不覆盖已有显式值
218
+ if (!prev.enabledTools && ref.enabledTools)
219
+ prev.enabledTools = ref.enabledTools;
220
+ if (!prev.autoApprove && ref.autoApprove)
221
+ prev.autoApprove = ref.autoApprove;
222
+ if (!prev.version && ref.version)
223
+ prev.version = ref.version;
224
+ if (!prev.sha256 && ref.sha256)
225
+ prev.sha256 = ref.sha256;
226
+ if (!prev.toolId && ref.toolId)
227
+ prev.toolId = ref.toolId;
228
+ };
229
+ for (const item of Array.isArray(manifest.toolRefs) ? manifest.toolRefs : []) {
230
+ const ref = parseToolAssemblyRef(item);
231
+ if (ref)
232
+ upsert(ref);
233
+ }
234
+ for (const item of Array.isArray(manifest.tools) ? manifest.tools : []) {
235
+ const ref = parseToolAssemblyRef(item);
236
+ if (ref)
237
+ upsert(ref);
238
+ }
239
+ return out;
240
+ }
241
+ /**
242
+ * 将 agent.manifest.toolRefs 上的 enabledTools/autoApprove 叠到 snapshot.tools[](snapshot 未带时)。
243
+ */
244
+ export function overlayToolRefPolicies(snapTools, manifest) {
245
+ if (!manifest)
246
+ return snapTools;
247
+ const fromManifest = toolRefsFromManifest(manifest);
248
+ if (fromManifest.length === 0)
249
+ return snapTools;
250
+ const byName = new Map(fromManifest.map((r) => [r.name, r]));
251
+ return snapTools.map((t) => {
252
+ const m = byName.get(t.name) ?? (t.toolId ? byName.get(t.toolId) : undefined);
253
+ if (!m)
254
+ return t;
255
+ return {
256
+ ...t,
257
+ enabledTools: t.enabledTools ?? m.enabledTools,
258
+ autoApprove: t.autoApprove ?? m.autoApprove,
259
+ };
260
+ });
261
+ }
262
+ function normalizeSnapshotToolRefs(raw) {
263
+ if (!Array.isArray(raw))
264
+ return undefined;
265
+ const out = [];
266
+ for (const item of raw) {
267
+ const ref = parseToolAssemblyRef(item);
268
+ if (ref)
269
+ out.push(ref);
270
+ }
271
+ return out;
272
+ }
273
+ function normalizeSnapshotSkillRefs(raw) {
274
+ if (!Array.isArray(raw))
275
+ return undefined;
276
+ const out = [];
277
+ for (const item of raw) {
278
+ if (typeof item === 'string') {
279
+ out.push({ skillId: item });
280
+ continue;
281
+ }
282
+ if (item && typeof item === 'object') {
283
+ const o = item;
284
+ const skillId = String(o.skill ?? o.skillId ?? o.code ?? o.skillCode ?? o.id ?? '');
285
+ if (!skillId)
286
+ continue;
287
+ out.push({
288
+ skillId,
289
+ name: o.name != null ? String(o.name) : undefined,
290
+ version: o.version != null ? String(o.version) : undefined,
291
+ description: o.description != null ? String(o.description) : undefined,
292
+ sha256: typeof o.sha256 === 'string' ? o.sha256 : undefined,
293
+ });
294
+ }
295
+ }
296
+ return out;
297
+ }
298
+ export class FileSystemDeploymentSnapshot {
299
+ root;
300
+ flags;
301
+ constructor(root, options = {}) {
302
+ this.root = root;
303
+ this.flags = resolvePreloadBehaviorFlags({
304
+ requireReady: options.requireReady,
305
+ requireChecksum: options.requireChecksum,
306
+ });
307
+ }
308
+ get requireReady() {
309
+ return this.flags.requireReady;
310
+ }
311
+ async assertReadyIfRequired(bundlePath, label) {
312
+ if (!this.requireReady)
313
+ return;
314
+ const readyPath = path.join(bundlePath, '.ready');
315
+ if (!(await pathExists(readyPath))) {
316
+ throw preloadMissing(`预装未就绪(缺少 .ready): ${label}`, { path: readyPath });
317
+ }
318
+ }
319
+ async verifySnapshotIntegrity(agentDir, snap) {
320
+ const expectedPkg = normalizeDigest(snap.sha256 ?? snap.packageSha256);
321
+ const artifacts = snap.artifacts;
322
+ const hasArtifacts = Array.isArray(artifacts) && artifacts.length > 0;
323
+ if (this.flags.requireChecksum || isRequireChecksum()) {
324
+ if (!expectedPkg && !hasArtifacts) {
325
+ throw preloadPackageCorrupt('已启用 requireChecksum,snapshot 须含 sha256/packageSha256 或非空 artifacts[]', { agentDir });
326
+ }
327
+ }
328
+ if (expectedPkg) {
329
+ const pkgFile = path.join(agentDir, '.package.sha256');
330
+ if (await pathExists(pkgFile)) {
331
+ const raw = (await readTextFile(pkgFile))?.trim() ?? '';
332
+ const fileDigest = normalizeDigest(raw);
333
+ if (!fileDigest) {
334
+ throw preloadPackageCorrupt(`.package.sha256 内容非法`, { path: pkgFile });
335
+ }
336
+ if (fileDigest !== expectedPkg) {
337
+ throw preloadPackageCorrupt(`snapshot.sha256 与 .package.sha256 不一致(以 snapshot 为准核对)`, {
338
+ expected: expectedPkg,
339
+ actual: fileDigest,
340
+ path: pkgFile,
341
+ });
342
+ }
343
+ }
344
+ }
345
+ if (!Array.isArray(artifacts))
346
+ return;
347
+ for (const item of artifacts) {
348
+ if (!item || typeof item !== 'object')
349
+ continue;
350
+ const o = item;
351
+ const rel = typeof o.path === 'string' ? o.path : typeof o.file === 'string' ? o.file : null;
352
+ const expected = normalizeDigest(o.sha256 ?? o.digest);
353
+ if (!rel || !expected)
354
+ continue;
355
+ const full = path.resolve(agentDir, rel);
356
+ if (!isPathInside(agentDir, full)) {
357
+ throw preloadPackageCorrupt(`artifacts.path 越出 agent 包目录: ${rel}`);
358
+ }
359
+ if (!(await pathExists(full))) {
360
+ throw preloadPackageCorrupt(`artifacts 指向的文件不存在: ${rel}`, { path: full });
361
+ }
362
+ const actual = await sha256OfFile(full);
363
+ await assertDigestMatch(expected, actual, `artifact ${rel}`, { path: full });
364
+ }
365
+ }
366
+ async resolveAgentDir(agentCode, version) {
367
+ const agentRoot = path.join(this.root, 'agents', agentCode);
368
+ if (version) {
369
+ const exact = path.join(agentRoot, version);
370
+ return (await pathExists(exact)) ? exact : null;
371
+ }
372
+ return pickLatestVersionDir(agentRoot);
373
+ }
374
+ async loadAgentManifest(agentDir) {
375
+ return ((await readJsonFile(path.join(agentDir, 'agent.manifest.json'))) ??
376
+ (await readJsonFile(path.join(agentDir, 'manifest.json'))));
377
+ }
378
+ async loadGraphDocument(agentDir, manifest) {
379
+ const relative = typeof manifest?.graph === 'string'
380
+ ? manifest.graph
381
+ : typeof manifest?.graphPath === 'string'
382
+ ? String(manifest.graphPath)
383
+ : null;
384
+ const candidates = [];
385
+ if (relative)
386
+ candidates.push(path.join(agentDir, relative));
387
+ candidates.push(path.join(agentDir, 'graph.json'), path.join(agentDir, 'graph.yaml'), path.join(agentDir, 'graph.yml'), path.join(agentDir, 'graph.yaml.json'));
388
+ for (const filePath of candidates) {
389
+ if (!(await pathExists(filePath)))
390
+ continue;
391
+ try {
392
+ const doc = await readDataFile(filePath);
393
+ if (doc)
394
+ return doc;
395
+ }
396
+ catch (err) {
397
+ throw err;
398
+ }
399
+ }
400
+ return null;
401
+ }
402
+ async loadAgentSnapshot(agentCode, version) {
403
+ const agentDir = await this.resolveAgentDir(agentCode, version);
404
+ if (!agentDir)
405
+ return null;
406
+ await this.assertReadyIfRequired(agentDir, `agent ${agentCode}`);
407
+ const snap = (await readJsonFile(path.join(agentDir, 'snapshot.json'))) ??
408
+ (await readJsonFile(path.join(agentDir, 'eap.snapshot.json')));
409
+ const manifest = await this.loadAgentManifest(agentDir);
410
+ const resolvedVersion = version ?? path.basename(agentDir);
411
+ if (snap) {
412
+ await this.verifySnapshotIntegrity(agentDir, snap);
413
+ let graph = snap.graph;
414
+ if (!graph || typeof graph !== 'object') {
415
+ graph = (await this.loadGraphDocument(agentDir, manifest)) ?? undefined;
416
+ }
417
+ return {
418
+ agentCode,
419
+ version: String(snap.version ?? resolvedVersion),
420
+ tools: normalizeSnapshotToolRefs(snap.tools) ?? toolRefsFromManifest(manifest ?? {}),
421
+ skills: normalizeSnapshotSkillRefs(snap.skills) ?? skillRefsFromManifest(manifest ?? {}),
422
+ graph,
423
+ agentDir,
424
+ manifest: manifest ?? undefined,
425
+ };
426
+ }
427
+ const graph = (await this.loadGraphDocument(agentDir, manifest)) ?? undefined;
428
+ return {
429
+ agentCode,
430
+ version: resolvedVersion,
431
+ tools: toolRefsFromManifest(manifest ?? {}),
432
+ skills: skillRefsFromManifest(manifest ?? {}),
433
+ graph,
434
+ agentDir,
435
+ manifest: manifest ?? undefined,
436
+ };
437
+ }
438
+ async loadToolManifest(ref, agentDir) {
439
+ const candidates = [];
440
+ if (agentDir) {
441
+ // Agent 自包含:唯一查找位置为 preinstall/tools/<toolsetCode>(语义化小写标识)
442
+ candidates.push(path.join(agentDir, 'preinstall', 'tools', ref.name));
443
+ if (ref.toolId && ref.toolId !== ref.name) {
444
+ candidates.push(path.join(agentDir, 'preinstall', 'tools', ref.toolId));
445
+ }
446
+ }
447
+ for (const bundlePath of candidates) {
448
+ if (!(await pathExists(bundlePath)))
449
+ continue;
450
+ await this.assertReadyIfRequired(bundlePath, `tool ${ref.name}`);
451
+ const manifestPathCandidates = [
452
+ path.join(bundlePath, 'toolset.manifest.json'),
453
+ path.join(bundlePath, 'tool.manifest.json'),
454
+ path.join(bundlePath, 'manifest.json'),
455
+ ];
456
+ const existingManifests = [];
457
+ for (const mp of manifestPathCandidates) {
458
+ const doc = await readJsonFile(mp);
459
+ if (doc)
460
+ existingManifests.push({ path: mp, doc });
461
+ }
462
+ if (existingManifests.length === 0)
463
+ continue;
464
+ let chosen = existingManifests[0];
465
+ if (ref.sha256) {
466
+ const matched = await findDigestMatch(existingManifests, ref.sha256);
467
+ if (!matched) {
468
+ await assertDigestMatch(ref.sha256, await sha256OfFile(existingManifests[0].path), `tool ${ref.name}`, { path: existingManifests[0].path });
469
+ }
470
+ chosen = matched ?? existingManifests[0];
471
+ }
472
+ const manifest = chosen.doc;
473
+ return {
474
+ toolId: String(manifest.id ?? ref.toolId ?? manifest.code ?? ref.name),
475
+ name: String(manifest.code ?? manifest.name ?? ref.name),
476
+ version: String(manifest.version ?? ref.version ?? path.basename(bundlePath)),
477
+ manifest,
478
+ bundlePath,
479
+ };
480
+ }
481
+ return null;
482
+ }
483
+ async loadSkillManifest(ref, agentDir, userId, extraRoots = []) {
484
+ if (!agentDir)
485
+ return null;
486
+ // 用户装配 → 开发态作者源 extraRoots → Agent 预装
487
+ const candidates = [];
488
+ if (userId != null && userId !== '') {
489
+ candidates.push(path.join(agentDir, 'users', userId, 'skills', ref.skillId));
490
+ }
491
+ for (const root of extraRoots) {
492
+ if (root)
493
+ candidates.push(path.join(root, ref.skillId));
494
+ }
495
+ candidates.push(path.join(agentDir, 'preinstall', 'skills', ref.skillId));
496
+ for (const bundlePath of candidates) {
497
+ if (!(await pathExists(bundlePath)))
498
+ continue;
499
+ await this.assertReadyIfRequired(bundlePath, `skill ${ref.skillId}`);
500
+ const manifestPathCandidates = [
501
+ path.join(bundlePath, 'skill.manifest.json'),
502
+ path.join(bundlePath, 'skill.definition.json'),
503
+ path.join(bundlePath, 'manifest.json'),
504
+ ];
505
+ let manifest = null;
506
+ let manifestPath = null;
507
+ for (const mp of manifestPathCandidates) {
508
+ const doc = await readJsonFile(mp);
509
+ if (doc) {
510
+ manifest = doc;
511
+ manifestPath = mp;
512
+ break;
513
+ }
514
+ }
515
+ if (!manifest || !manifestPath)
516
+ continue;
517
+ // 用户装配层跳过 sha256 校验(用户覆盖版本与预装快照散列不同是正常行为)
518
+ const isUserOverridePath = bundlePath.includes('/users/') || bundlePath.includes('\\users\\');
519
+ const isAuthorOverlay = extraRoots.some((root) => root && isPathInside(root, bundlePath));
520
+ if (ref.sha256 && !isUserOverridePath && !isAuthorOverlay) {
521
+ const actual = await sha256OfFile(manifestPath);
522
+ await assertDigestMatch(ref.sha256, actual, `skill ${ref.skillId}`, { path: manifestPath });
523
+ }
524
+ const skillId = String(manifest.code ?? manifest.skillId ?? manifest.skillCode ?? manifest.id ?? ref.skillId);
525
+ return {
526
+ skillId,
527
+ name: String(manifest.name ?? ref.name ?? skillId),
528
+ version: String(manifest.version ?? ref.version ?? path.basename(bundlePath)),
529
+ description: manifest.description ?? ref.description,
530
+ manifest,
531
+ bundlePath,
532
+ };
533
+ }
534
+ return null;
535
+ }
536
+ }
537
+ export function createDeploymentSnapshotFromEnv(explicitRoot, options) {
538
+ const root = explicitRoot ?? process.env.EAP_PREINSTALL_ROOT;
539
+ if (!root)
540
+ return undefined;
541
+ return new FileSystemDeploymentSnapshot(root, options);
542
+ }
@@ -0,0 +1,134 @@
1
+ /**
2
+ * GraphLoader — 从 Agent Registry / Deployment 预装快照加载 Graph DSL 与 Tool/Skill 定义
3
+ *
4
+ * 生产(server + EAP_PREINSTALL_ROOT):以预装为准,缺失则失败(04 Req 8.1)。
5
+ * 开发态:Registry + 可选 ./tools 本地 manifest。
6
+ */
7
+ import type { GraphDSL } from '../graph/contracts/executable-graph.js';
8
+ import type { AgentRegistryClient } from './agent-registry-client.js';
9
+ import type { DeploymentContext } from '../tool/tool-execution-router.js';
10
+ import type { ILocalToolInstallStore } from '@gt-fe/eap-contracts';
11
+ import { type LoadedToolDefinition } from '../tool/loaded-tool-definition.js';
12
+ import type { LoadedSkillInfo } from '../tool/system-prompt-builder.js';
13
+ import { type IDeploymentSnapshot } from './deployment-snapshot.js';
14
+ export interface LoadAgentOptions {
15
+ /** 覆盖构造时 / 环境默认的 agentVersion */
16
+ agentVersion?: string;
17
+ /** 跳过读写进程内定义缓存 */
18
+ bypassCache?: boolean;
19
+ }
20
+ export interface GraphLoaderConfig {
21
+ registryClient?: AgentRegistryClient;
22
+ deploymentContext?: DeploymentContext;
23
+ localInstallStore?: ILocalToolInstallStore;
24
+ /** dev:本地 Tool manifest 目录,默认 `./tools` 或 `EAP_LOCAL_TOOLS_DIR` */
25
+ localToolsDir?: string;
26
+ /**
27
+ * dev:作者源 Skill 目录(工程 `skills/` 或 `EAP_LOCAL_SKILLS_DIR`)。
28
+ * 查找优先于预装树,低于 users/;生产不要设。
29
+ */
30
+ localSkillsDir?: string;
31
+ /**
32
+ * Deployment 预装根目录(或注入 IDeploymentSnapshot)。
33
+ * 也可用环境变量 EAP_PREINSTALL_ROOT。
34
+ */
35
+ preinstallRoot?: string;
36
+ deploymentSnapshot?: IDeploymentSnapshot;
37
+ /**
38
+ * server 且配置了预装时默认 true:缺失预装则失败,且不回退 Registry 拉定义。
39
+ * 显式 false 可回退 Registry(仅迁移/联调)。
40
+ */
41
+ strictPreinstall?: boolean;
42
+ /** Agent 版本目录名;缺省取 current/最新;可被单次 load 的 agentVersion 覆盖 */
43
+ agentVersion?: string;
44
+ /** 强制 .ready;默认 EAP_PRELOAD_REQUIRE_READY */
45
+ requireReady?: boolean;
46
+ /** 强制 snapshot 校验字段;默认 EAP_PRELOAD_REQUIRE_CHECKSUM */
47
+ requireChecksum?: boolean;
48
+ /**
49
+ * 进程内定义缓存。默认:存在预装根时开启。
50
+ * 环境变量 EAP_PRELOAD_DEFINITION_CACHE=0 关闭。
51
+ */
52
+ definitionCache?: boolean;
53
+ /**
54
+ * Skill 热加载:已装配目录 mtime 变化则丢缓存。
55
+ * 默认:deploymentContext=dev 开启;EAP_SKILL_HOT_RELOAD=0/1 可覆盖。
56
+ */
57
+ skillHotReload?: boolean;
58
+ }
59
+ export interface LoadToolDefinitionsOptions extends LoadAgentOptions {
60
+ /** 仅保留 status=active,默认 true */
61
+ activeOnly?: boolean;
62
+ }
63
+ export interface ExpandToolsetOptions {
64
+ /** 可选白名单;列出则仅启用所列子工具;省略 = 全部 */
65
+ enabledTools?: string[];
66
+ /** 免 HITL 确认的子工具名 */
67
+ autoApprove?: string[];
68
+ }
69
+ export declare class GraphLoader {
70
+ private readonly registryClient?;
71
+ private readonly deploymentContext;
72
+ private readonly localInstallStore?;
73
+ private readonly localToolsDir?;
74
+ private readonly localSkillsDir?;
75
+ private readonly deploymentSnapshot?;
76
+ private readonly strictPreinstall;
77
+ private readonly agentVersion?;
78
+ private readonly definitionCacheEnabled;
79
+ private readonly definitionCache;
80
+ private readonly skillHotReload;
81
+ constructor(config?: GraphLoaderConfig);
82
+ /** 严格预装:禁止用 Registry 拉可执行定义 */
83
+ private get blockRegistryDefinitions();
84
+ private resolveVersion;
85
+ /**
86
+ * 缓存主键版本:显式 version 优先;未传时落到 snapshot.version,
87
+ * 避免 warm(`1.0.0`) 与 load(无 version→@auto) 分属两个键。
88
+ */
89
+ private pinCacheVersion;
90
+ private useCache;
91
+ /** 上线 / 发版后预热进程内定义(模型 C) */
92
+ warmAgent(agentCode: string, options?: LoadAgentOptions & {
93
+ userId?: string;
94
+ }): Promise<{
95
+ graph: boolean;
96
+ tools: boolean;
97
+ skills: boolean;
98
+ skillWarnings: string[];
99
+ }>;
100
+ /** 版本切换 / 下线时失效缓存 */
101
+ invalidateAgent(agentCode: string, agentVersion?: string): void;
102
+ invalidateAllDefinitions(): void;
103
+ definitionCacheSize(): number;
104
+ private cloneCached;
105
+ loadGraph(agentCode: string, options?: LoadAgentOptions): Promise<GraphDSL>;
106
+ private loadGraphFromSource;
107
+ /**
108
+ * 解析 agent tools[] + graph tool 节点 union;
109
+ * server+预装:以预装 manifest 为准;desktop 合并 ILocalToolInstallStore。
110
+ */
111
+ loadToolDefinitions(agentCode: string, options?: LoadToolDefinitionsOptions): Promise<LoadedToolDefinition[]>;
112
+ private loadToolDefinitionsFromSource;
113
+ /**
114
+ * 从预装快照加载已装配 Skill 完整定义(workflow / prompt / toolRefs)
115
+ * @param options.userId 用于解析 users/<userId>/skills(优先于 preinstall/skills)
116
+ * @param options.allowMissingSkills 缺失时跳过而非抛错(warm 预热用)
117
+ */
118
+ loadSkillDefinitions(agentCode: string, options?: LoadAgentOptions & {
119
+ userId?: string;
120
+ allowMissingSkills?: boolean;
121
+ onMissingSkill?: (skillId: string) => void;
122
+ }): Promise<LoadedSkillInfo[]>;
123
+ private loadSkillDefinitionsFromSource;
124
+ private skillTreeStamp;
125
+ /**
126
+ * 候选集 = 装配白名单,否则 snapshot/manifest 声明。
127
+ * 磁盘多出来的未声明目录不进选择清单;正文热加载仍看已装配目录的 mtime。
128
+ */
129
+ private resolveSkillRefs;
130
+ private localSkillRoots;
131
+ resolveAgentDir(agentCode: string, version?: string): Promise<string | null>;
132
+ /** Agent 包目录 + 工程 prompts/(dev 作者源,与 EAP_LOCAL_SKILLS_DIR 同级) */
133
+ resolvePromptRoots(agentCode: string, version?: string): Promise<string[]>;
134
+ }