@gt-fe/eap-runtime 0.0.13 → 0.0.14

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 (114) hide show
  1. package/README.md +3 -1
  2. package/dist/api/handlers/invoke.handler.d.ts +1 -1
  3. package/dist/api/handlers/invoke.handler.js +3 -0
  4. package/dist/api/handlers/stream.handler.d.ts +1 -1
  5. package/dist/api/handlers/stream.handler.js +4 -1
  6. package/dist/api/routes/agent.routes.d.ts +2 -2
  7. package/dist/common/index.d.ts +1 -0
  8. package/dist/common/index.js +1 -0
  9. package/dist/common/logger.d.ts +16 -4
  10. package/dist/common/logger.js +82 -16
  11. package/dist/common/runtime-package-version.d.ts +2 -0
  12. package/dist/common/runtime-package-version.js +5 -0
  13. package/dist/common/types.d.ts +5 -5
  14. package/dist/common/types.js +2 -2
  15. package/dist/contracts/permission-checker.d.ts +1 -1
  16. package/dist/debug/llm-turn-log.d.ts +12 -0
  17. package/dist/debug/llm-turn-log.js +1 -0
  18. package/dist/governance/governance-client.d.ts +1 -1
  19. package/dist/governance/index.d.ts +1 -1
  20. package/dist/governance/permission-guard.d.ts +1 -1
  21. package/dist/graph/adapters/langgraph.adapter.d.ts +3 -1
  22. package/dist/graph/adapters/langgraph.adapter.js +67 -14
  23. package/dist/graph/adapters/subgraph-compiler.js +5 -2
  24. package/dist/graph/contracts/executable-graph.d.ts +19 -8
  25. package/dist/graph/contracts/executable-graph.js +1 -1
  26. package/dist/graph/nodes/llm-node.d.ts +3 -0
  27. package/dist/graph/nodes/llm-node.js +8 -0
  28. package/dist/graph/nodes/skill-bind-node.d.ts +3 -4
  29. package/dist/graph/nodes/skill-bind-node.js +1 -20
  30. package/dist/graph/nodes/tool-node.d.ts +2 -0
  31. package/dist/graph/nodes/tool-node.js +20 -14
  32. package/dist/index.d.ts +1 -1
  33. package/dist/memory/compression/index.d.ts +1 -1
  34. package/dist/memory/compression/index.js +1 -1
  35. package/dist/memory/compression/sliding-window.compression.js +7 -7
  36. package/dist/memory/index.d.ts +1 -1
  37. package/dist/memory/index.js +1 -1
  38. package/dist/memory/message-compression.service.d.ts +12 -1
  39. package/dist/memory/message-compression.service.js +29 -1
  40. package/dist/providers/http-llm-provider.d.ts +1 -0
  41. package/dist/providers/http-llm-provider.js +4 -1
  42. package/dist/providers/index.d.ts +1 -1
  43. package/dist/providers/index.js +1 -1
  44. package/dist/providers/local-llm-provider.d.ts +4 -1
  45. package/dist/providers/local-llm-provider.js +15 -3
  46. package/dist/providers/routing-llm-provider.js +13 -4
  47. package/dist/registry/agent-models.d.ts +1 -1
  48. package/dist/registry/agent-models.js +1 -1
  49. package/dist/registry/agent-registry-client.d.ts +1 -1
  50. package/dist/registry/deployment-snapshot.js +19 -17
  51. package/dist/registry/graph-loader.d.ts +11 -1
  52. package/dist/registry/graph-loader.js +115 -66
  53. package/dist/registry/preload-errors.d.ts +1 -1
  54. package/dist/registry/preload-errors.js +1 -1
  55. package/dist/registry/skill-io-guard.js +1 -1
  56. package/dist/registry/skill-tree.js +1 -1
  57. package/dist/runtime/agent-runtime.d.ts +3 -3
  58. package/dist/runtime/agent-runtime.js +14 -4
  59. package/dist/runtime/dev-runtime.d.ts +2 -0
  60. package/dist/runtime/dev-runtime.js +2 -0
  61. package/dist/runtime/types.d.ts +4 -4
  62. package/dist/server.js +1 -1
  63. package/dist/session/compression-middleware.d.ts +2 -1
  64. package/dist/session/compression-middleware.js +7 -4
  65. package/dist/sse/events/skill-events.d.ts +1 -1
  66. package/dist/sse/events/skill-events.js +1 -1
  67. package/dist/sse/events/stats-events.d.ts +9 -0
  68. package/dist/token/compression-budget-integration.d.ts +1 -1
  69. package/dist/token/compression-budget-integration.js +18 -10
  70. package/dist/token/context-window.d.ts +42 -0
  71. package/dist/token/context-window.js +73 -0
  72. package/dist/token/index.d.ts +1 -0
  73. package/dist/token/index.js +1 -0
  74. package/dist/tool/create-tool-executor.d.ts +1 -1
  75. package/dist/tool/dev-http-executor.d.ts +2 -1
  76. package/dist/tool/dev-http-executor.js +14 -2
  77. package/dist/tool/dev-mcp-executor.d.ts +11 -1
  78. package/dist/tool/dev-mcp-executor.js +27 -1
  79. package/dist/tool/dev-tool-executor.d.ts +2 -1
  80. package/dist/tool/dev-tool-executor.js +6 -0
  81. package/dist/tool/harness-command.js +1 -1
  82. package/dist/tool/harness-primitives.d.ts +7 -0
  83. package/dist/tool/harness-primitives.js +57 -6
  84. package/dist/tool/http-tool-executor.js +1 -1
  85. package/dist/tool/index.d.ts +2 -1
  86. package/dist/tool/index.js +1 -0
  87. package/dist/tool/local-mcp-client.d.ts +5 -2
  88. package/dist/tool/local-mcp-client.js +130 -3
  89. package/dist/tool/local-tool-executor.d.ts +3 -2
  90. package/dist/tool/local-tool-executor.js +16 -1
  91. package/dist/tool/mcp-list.d.ts +53 -0
  92. package/dist/tool/mcp-list.js +199 -0
  93. package/dist/tool/mcp-tool-executor.d.ts +6 -1
  94. package/dist/tool/mcp-tool-executor.js +53 -1
  95. package/dist/tool/skill-dir-infer.d.ts +17 -0
  96. package/dist/tool/skill-dir-infer.js +81 -0
  97. package/dist/tool/skill-script-refs.d.ts +1 -8
  98. package/dist/tool/skill-script-refs.js +32 -20
  99. package/dist/tool/system-prompt-builder.d.ts +35 -16
  100. package/dist/tool/system-prompt-builder.js +30 -58
  101. package/dist/tool/timeout.d.ts +2 -2
  102. package/dist/tool/timeout.js +6 -3
  103. package/dist/tool/tool-execution-router.d.ts +3 -2
  104. package/dist/tool/tool-execution-router.js +8 -1
  105. package/dist/tool/tool-executor.interface.d.ts +11 -0
  106. package/dist/tool/tool-orchestrator.d.ts +1 -1
  107. package/dist/tool/tool-orchestrator.js +1 -1
  108. package/dist/utils/format-error.d.ts +2 -2
  109. package/dist/utils/format-error.js +2 -2
  110. package/dist/utils/http-error.d.ts +2 -2
  111. package/dist/utils/http-error.js +2 -2
  112. package/package.json +6 -33
  113. package/dist/registry/mcp-stdio-cwd.d.ts +0 -5
  114. package/dist/registry/mcp-stdio-cwd.js +0 -13
@@ -1,4 +1,4 @@
1
1
  export { LongTermMemoryService, InMemoryMemoryRepository, type IMemoryRepository, type MemoryRecord, type MemoryType, type CompressionResult, } from './long-term-memory.service.js';
2
2
  export { PostgresMemoryRepository } from './pg-memory.repository.js';
3
- export { SlidingWindowCompression, TruncateCompression, type IMessageCompressionService, type CompressionConfig, type SummarizeFunction, DEFAULT_COMPRESSION_CONFIG, estimateMessagesTokens, countRounds, } from './compression/index.js';
3
+ export { SlidingWindowCompression, TruncateCompression, type IMessageCompressionService, type CompressionConfig, type SummarizeFunction, DEFAULT_COMPRESSION_CONFIG, COMPRESSION_WINDOW_FACTOR, resolveCompressionMaxTokens, estimateMessagesTokens, countRounds, } from './compression/index.js';
4
4
  export { SemanticRetrievalService, InMemoryVectorStore, type RetrievalConfig, type RetrievalStrategy, type RetrievalResult, type IVectorStore, type VectorResult, type EmbeddingFunction, DEFAULT_RETRIEVAL_CONFIG, } from './semantic-retrieval.service.js';
@@ -2,6 +2,6 @@
2
2
  export { LongTermMemoryService, InMemoryMemoryRepository, } from './long-term-memory.service.js';
3
3
  export { PostgresMemoryRepository } from './pg-memory.repository.js';
4
4
  // 消息压缩模块
5
- export { SlidingWindowCompression, TruncateCompression, DEFAULT_COMPRESSION_CONFIG, estimateMessagesTokens, countRounds, } from './compression/index.js';
5
+ export { SlidingWindowCompression, TruncateCompression, DEFAULT_COMPRESSION_CONFIG, COMPRESSION_WINDOW_FACTOR, resolveCompressionMaxTokens, estimateMessagesTokens, countRounds, } from './compression/index.js';
6
6
  // 语义检索模块
7
7
  export { SemanticRetrievalService, InMemoryVectorStore, DEFAULT_RETRIEVAL_CONFIG, } from './semantic-retrieval.service.js';
@@ -18,8 +18,10 @@ export type CompressionStrategy = 'sliding-window' | 'truncate' | 'headroom';
18
18
  export interface CompressionConfig {
19
19
  /** 压缩策略(默认 sliding-window) */
20
20
  strategy: CompressionStrategy;
21
- /** 触发压缩的 Token 上限(默认模型 context window 的 70%) */
21
+ /** 触发压缩的 Token 上限。有 maxContextTokens 且未显式传 maxTokens 时按 window×系数 */
22
22
  maxTokens: number;
23
+ /** 模型上下文窗。有则 maxTokens = floor(window × COMPRESSION_WINDOW_FACTOR) */
24
+ maxContextTokens?: number;
23
25
  /** 备用:按轮次触发(默认 20 轮) */
24
26
  maxRounds: number;
25
27
  /** 压缩后保留的最近轮次(默认 5 轮) */
@@ -29,6 +31,15 @@ export interface CompressionConfig {
29
31
  /** 用于摘要的模型(可选,默认使用当前 Agent 的模型) */
30
32
  summaryModel?: string;
31
33
  }
34
+ /** 触发阈值 = 模型窗口 × 此系数(与原先 100000/128000 一致) */
35
+ export declare const COMPRESSION_WINDOW_FACTOR = 0.7;
36
+ /** 无模型窗口时的触发阈值(旧默认,按 128k×0.7) */
37
+ export declare const COMPRESSION_MAX_TOKENS_FALLBACK = 100000;
38
+ export declare function resolveCompressionMaxTokens(window?: number, factor?: number): number;
39
+ /**
40
+ * 合并压缩配置。未显式传 maxTokens 且有 maxContextTokens 时,按窗口×系数。
41
+ */
42
+ export declare function mergeCompressionConfig(base: CompressionConfig, override?: Partial<CompressionConfig>): CompressionConfig;
32
43
  /**
33
44
  * 默认压缩配置
34
45
  */
@@ -7,12 +7,40 @@
7
7
  * @see design.md §1.1 记忆管理
8
8
  * @see requirements.md Requirement 4.3
9
9
  */
10
+ /** 触发阈值 = 模型窗口 × 此系数(与原先 100000/128000 一致) */
11
+ export const COMPRESSION_WINDOW_FACTOR = 0.7;
12
+ /** 无模型窗口时的触发阈值(旧默认,按 128k×0.7) */
13
+ export const COMPRESSION_MAX_TOKENS_FALLBACK = 100000;
14
+ export function resolveCompressionMaxTokens(window, factor = COMPRESSION_WINDOW_FACTOR) {
15
+ if (typeof window === 'number' && Number.isFinite(window) && window > 0) {
16
+ const f = typeof factor === 'number' && Number.isFinite(factor) && factor > 0 && factor <= 1
17
+ ? factor
18
+ : COMPRESSION_WINDOW_FACTOR;
19
+ return Math.max(1, Math.floor(window * f));
20
+ }
21
+ return COMPRESSION_MAX_TOKENS_FALLBACK;
22
+ }
23
+ /**
24
+ * 合并压缩配置。未显式传 maxTokens 且有 maxContextTokens 时,按窗口×系数。
25
+ */
26
+ export function mergeCompressionConfig(base, override) {
27
+ if (!override)
28
+ return { ...base };
29
+ const merged = { ...base, ...override };
30
+ if (Object.prototype.hasOwnProperty.call(override, 'maxTokens')) {
31
+ return merged;
32
+ }
33
+ if (override.maxContextTokens) {
34
+ merged.maxTokens = resolveCompressionMaxTokens(override.maxContextTokens);
35
+ }
36
+ return merged;
37
+ }
10
38
  /**
11
39
  * 默认压缩配置
12
40
  */
13
41
  export const DEFAULT_COMPRESSION_CONFIG = {
14
42
  strategy: 'sliding-window',
15
- maxTokens: 100000, // 约 70% of 128k context
43
+ maxTokens: COMPRESSION_MAX_TOKENS_FALLBACK,
16
44
  maxRounds: 20,
17
45
  preserveRecentRounds: 5,
18
46
  compressionRatio: 0.3,
@@ -9,6 +9,7 @@
9
9
  import type { GraphMessage } from '../graph/contracts/executable-graph.js';
10
10
  import type { ILLMProvider, LLMNodeConfig, LLMResponse, LLMChunk } from '../graph/nodes/llm-node.js';
11
11
  import { type ILlmTurnLog } from '../debug/llm-turn-log.js';
12
+ export declare const DEFAULT_LLM_HTTP_TIMEOUT_MS = 180000;
12
13
  export interface HttpLLMProviderConfig {
13
14
  apiKey: string;
14
15
  baseUrl?: string;
@@ -8,6 +8,8 @@
8
8
  */
9
9
  import { resolveLlmModelName } from './resolve-llm-model.js';
10
10
  import { createFileLlmTurnLogFromEnv, maskApiKey } from '../debug/llm-turn-log.js';
11
+ import { buildContextUsage, turnSectionChars } from '../token/context-window.js';
12
+ export const DEFAULT_LLM_HTTP_TIMEOUT_MS = 180_000;
11
13
  export class HttpLLMProvider {
12
14
  apiKey;
13
15
  baseUrl;
@@ -18,7 +20,7 @@ export class HttpLLMProvider {
18
20
  this.apiKey = config.apiKey;
19
21
  this.baseUrl = (config.baseUrl ?? 'https://api.openai.com/v1').replace(/\/$/, '');
20
22
  this.defaultModel = config.defaultModel ?? 'DeepSeek-V4-Pro';
21
- this.timeoutMs = config.timeoutMs ?? 60000;
23
+ this.timeoutMs = config.timeoutMs ?? DEFAULT_LLM_HTTP_TIMEOUT_MS;
22
24
  this.turnLog = 'turnLog' in config ? config.turnLog : createFileLlmTurnLogFromEnv();
23
25
  }
24
26
  async writeTurn(args) {
@@ -57,6 +59,7 @@ export class HttpLLMProvider {
57
59
  error: args.response.error,
58
60
  },
59
61
  latencyMs: Date.now() - args.startedAt,
62
+ context: buildContextUsage(args.response.inputTokens, args.config.maxContextTokens, turnSectionChars(args.config, args.messages)),
60
63
  });
61
64
  }
62
65
  catch (err) {
@@ -1,5 +1,5 @@
1
1
  export { EchoLLMProvider, createDefaultLLMProvider } from './echo-llm-provider.js';
2
- export { HttpLLMProvider, type HttpLLMProviderConfig } from './http-llm-provider.js';
2
+ export { HttpLLMProvider, DEFAULT_LLM_HTTP_TIMEOUT_MS, type HttpLLMProviderConfig } from './http-llm-provider.js';
3
3
  export { RoutingLLMProvider, type RoutingLLMProviderConfig } from './routing-llm-provider.js';
4
4
  export { resolveLlmModelName, canOverrideGraphModel } from './resolve-llm-model.js';
5
5
  export { createLocalLlmProvider, requireLocalLlmConnections, resolveLocalLlmConnection, parseLocalLlmConnectionRefs, hydrateLocalLlmConnections, LLM_CONNECTIONS_ENV, } from './local-llm-provider.js';
@@ -1,5 +1,5 @@
1
1
  export { EchoLLMProvider, createDefaultLLMProvider } from './echo-llm-provider.js';
2
- export { HttpLLMProvider } from './http-llm-provider.js';
2
+ export { HttpLLMProvider, DEFAULT_LLM_HTTP_TIMEOUT_MS } from './http-llm-provider.js';
3
3
  export { RoutingLLMProvider } from './routing-llm-provider.js';
4
4
  export { resolveLlmModelName, canOverrideGraphModel } from './resolve-llm-model.js';
5
5
  export { createLocalLlmProvider, requireLocalLlmConnections, resolveLocalLlmConnection, parseLocalLlmConnectionRefs, hydrateLocalLlmConnections, LLM_CONNECTIONS_ENV, } from './local-llm-provider.js';
@@ -4,16 +4,19 @@
4
4
  */
5
5
  import type { ILLMProvider } from '../graph/nodes/llm-node.js';
6
6
  import type { ILlmTurnLog } from '../debug/llm-turn-log.js';
7
- import { type ModelCallDefaults } from '@gt-fe/eap-contracts';
7
+ import { type ModelCallDefaults } from '@eap/contracts';
8
8
  export interface LocalLlmConnection {
9
9
  baseUrl: string;
10
10
  apiKey: string;
11
11
  defaults?: ModelCallDefaults;
12
+ /** HttpLLMProvider 超时(毫秒);缺省用 DEFAULT_LLM_HTTP_TIMEOUT_MS */
13
+ timeoutMs?: number;
12
14
  }
13
15
  export interface LocalLlmConnectionRef {
14
16
  baseUrl: string;
15
17
  apiKeyEnv: string;
16
18
  defaults?: ModelCallDefaults;
19
+ timeoutMs?: number;
17
20
  }
18
21
  export interface LocalLlmConnectionRefs {
19
22
  default?: LocalLlmConnectionRef;
@@ -2,8 +2,13 @@
2
2
  * 本地多模型 LLM:按节点 model 选网关。仅 dev。
3
3
  * 连接表里只带 apiKeyEnv,密钥从 process.env 读取,不进 JSON。
4
4
  */
5
- import { mergeModelCallParams } from '@gt-fe/eap-contracts';
5
+ import { mergeModelCallParams } from '@eap/contracts';
6
6
  import { HttpLLMProvider } from './http-llm-provider.js';
7
+ function parseTimeoutMs(value) {
8
+ if (typeof value !== 'number' || !Number.isFinite(value) || value < 1000)
9
+ return undefined;
10
+ return Math.min(3_600_000, Math.trunc(value));
11
+ }
7
12
  export const LLM_CONNECTIONS_ENV = 'EAP_LLM_CONNECTIONS';
8
13
  export function parseLocalLlmConnectionRefs(env = process.env) {
9
14
  const raw = env[LLM_CONNECTIONS_ENV]?.trim();
@@ -42,7 +47,13 @@ export function hydrateLocalLlmConnections(refs, env = process.env) {
42
47
  const apiKey = env[ref.apiKeyEnv]?.trim();
43
48
  if (!apiKey)
44
49
  return undefined;
45
- return { baseUrl: ref.baseUrl, apiKey, defaults: ref.defaults };
50
+ const timeoutMs = parseTimeoutMs(ref.timeoutMs);
51
+ return {
52
+ baseUrl: ref.baseUrl,
53
+ apiKey,
54
+ defaults: ref.defaults,
55
+ ...(timeoutMs !== undefined ? { timeoutMs } : {}),
56
+ };
46
57
  };
47
58
  const byModel = {};
48
59
  for (const [name, ref] of Object.entries(refs.byModel ?? {})) {
@@ -97,7 +108,7 @@ class LocalLlmProvider {
97
108
  }
98
109
  providerFor(model) {
99
110
  const connection = resolveLocalLlmConnection(this.connections, model);
100
- const cacheKey = `${connection.baseUrl}\0${connection.apiKey}\0${model ?? ''}`;
111
+ const cacheKey = `${connection.baseUrl}\0${connection.apiKey}\0${model ?? ''}\0${connection.timeoutMs ?? ''}`;
101
112
  const cached = this.cache.get(cacheKey);
102
113
  if (cached)
103
114
  return cached;
@@ -105,6 +116,7 @@ class LocalLlmProvider {
105
116
  apiKey: connection.apiKey,
106
117
  baseUrl: connection.baseUrl,
107
118
  defaultModel: model,
119
+ timeoutMs: connection.timeoutMs,
108
120
  turnLog: this.turnLog,
109
121
  });
110
122
  this.cache.set(cacheKey, provider);
@@ -11,9 +11,9 @@
11
11
  * - 支持任意 OpenAI 兼容 API(OpenAI / DeepSeek / 本地 Ollama 等)
12
12
  * - 连接配置由 Foundation 统一管理,Runtime 无感知
13
13
  */
14
- import { mergeModelCallParams } from '@gt-fe/eap-contracts';
14
+ import { mergeModelCallParams } from '@eap/contracts';
15
15
  import { EchoLLMProvider } from './echo-llm-provider.js';
16
- import { HttpLLMProvider } from './http-llm-provider.js';
16
+ import { DEFAULT_LLM_HTTP_TIMEOUT_MS, HttpLLMProvider } from './http-llm-provider.js';
17
17
  export class RoutingLLMProvider {
18
18
  foundationUrl;
19
19
  fallback;
@@ -35,7 +35,12 @@ export class RoutingLLMProvider {
35
35
  }
36
36
  withCallDefaults(config, selected) {
37
37
  const merged = mergeModelCallParams(config, selected.defaults);
38
- return { ...config, ...merged, model: selected.name };
38
+ return {
39
+ ...config,
40
+ ...merged,
41
+ model: selected.name,
42
+ maxContextTokens: selected.maxContextTokens ?? config.maxContextTokens,
43
+ };
39
44
  }
40
45
  async selectModel(config) {
41
46
  try {
@@ -50,11 +55,14 @@ export class RoutingLLMProvider {
50
55
  if (res.ok) {
51
56
  const body = await res.json();
52
57
  if (body.data?.name) {
58
+ const window = body.data.maxContextTokens
59
+ ?? body.data.capabilities?.maxContextTokens;
53
60
  return {
54
61
  name: body.data.name,
55
62
  provider: body.data.provider,
56
63
  connection: body.data.connection ?? null,
57
64
  defaults: body.data.defaults ?? null,
65
+ ...(typeof window === 'number' && window > 0 ? { maxContextTokens: window } : {}),
58
66
  };
59
67
  }
60
68
  }
@@ -71,7 +79,7 @@ export class RoutingLLMProvider {
71
79
  apiKey: selected.connection.apiKey ?? '',
72
80
  baseUrl: selected.connection.baseUrl,
73
81
  defaultModel: selected.name,
74
- timeoutMs: selected.connection.timeoutMs,
82
+ timeoutMs: selected.connection.timeoutMs ?? DEFAULT_LLM_HTTP_TIMEOUT_MS,
75
83
  turnLog: this.turnLog,
76
84
  });
77
85
  }
@@ -81,6 +89,7 @@ export class RoutingLLMProvider {
81
89
  apiKey: process.env.OPENAI_API_KEY,
82
90
  baseUrl: process.env.OPENAI_BASE_URL,
83
91
  defaultModel: selected.name,
92
+ timeoutMs: DEFAULT_LLM_HTTP_TIMEOUT_MS,
84
93
  turnLog: this.turnLog,
85
94
  });
86
95
  }
@@ -1 +1 @@
1
- export { resolveDeclaredModels, resolveAgentDefaultModel, resolveAgentModelAllowlist, } from '@gt-fe/eap-contracts';
1
+ export { resolveDeclaredModels, resolveAgentDefaultModel, resolveAgentModelAllowlist, } from '@eap/contracts';
@@ -1 +1 @@
1
- export { resolveDeclaredModels, resolveAgentDefaultModel, resolveAgentModelAllowlist, } from '@gt-fe/eap-contracts';
1
+ export { resolveDeclaredModels, resolveAgentDefaultModel, resolveAgentModelAllowlist, } from '@eap/contracts';
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Agent Registry 客户端 — 从 foundation-service 拉取 Agent 定义
3
3
  */
4
- /** Agent 清单(与 @gt-fe/eap-contracts AgentManifest 对齐) */
4
+ /** Agent 清单(与 @eap/contracts AgentManifest 对齐) */
5
5
  export interface AgentManifest {
6
6
  id: string;
7
7
  name: string;
@@ -13,7 +13,7 @@ import { readdir, readFile, access } from 'node:fs/promises';
13
13
  import { createHash } from 'node:crypto';
14
14
  import path from 'node:path';
15
15
  import { constants as fsConstants } from 'node:fs';
16
- import { parseSkillMd } from '@gt-fe/eap-contracts';
16
+ import { parseSkillMd } from '@eap/contracts';
17
17
  import { findSkillEntryFile } from './skill-tree.js';
18
18
  import { preloadMissing, preloadPackageCorrupt, } from './preload-errors.js';
19
19
  import { isRequireChecksum, resolvePreloadBehaviorFlags, } from './preload-flags.js';
@@ -538,35 +538,37 @@ export class FileSystemDeploymentSnapshot {
538
538
  break;
539
539
  }
540
540
  }
541
- if (!manifest && entryFile) {
542
- const parsed = parseSkillMd(await readFile(entryFile, 'utf8'));
543
- if (!parsed)
541
+ const parsedMd = entryFile
542
+ ? parseSkillMd(await readFile(entryFile, 'utf8'))
543
+ : null;
544
+ if (!manifest) {
545
+ if (!parsedMd)
544
546
  continue;
545
547
  manifest = {
546
- code: parsed.frontmatter.name,
547
- name: parsed.frontmatter.name,
548
- description: parsed.frontmatter.description,
549
- ...(parsed.frontmatter.license ? { license: parsed.frontmatter.license } : {}),
548
+ code: ref.skillId,
549
+ name: parsedMd.frontmatter.name,
550
+ description: parsedMd.frontmatter.description,
551
+ ...(parsedMd.frontmatter.license ? { license: parsedMd.frontmatter.license } : {}),
550
552
  };
551
553
  manifestPath = entryFile;
552
554
  }
555
+ else if (parsedMd) {
556
+ manifest = {
557
+ ...manifest,
558
+ name: parsedMd.frontmatter.name,
559
+ description: parsedMd.frontmatter.description,
560
+ ...(parsedMd.frontmatter.license ? { license: parsedMd.frontmatter.license } : {}),
561
+ };
562
+ }
553
563
  if (!manifest || !manifestPath)
554
564
  continue;
555
- if (!manifest.description && entryFile) {
556
- const parsed = parseSkillMd(await readFile(entryFile, 'utf8'));
557
- if (parsed?.frontmatter.description) {
558
- manifest = { ...manifest, description: parsed.frontmatter.description };
559
- if (!manifest.name)
560
- manifest.name = parsed.frontmatter.name;
561
- }
562
- }
563
565
  const isUserOverridePath = bundlePath.includes('/users/') || bundlePath.includes('\\users\\');
564
566
  const isAuthorOverlay = extraRoots.some((root) => root && isPathInside(root, bundlePath));
565
567
  if (ref.sha256 && !isUserOverridePath && !isAuthorOverlay && manifestPath.endsWith('.json')) {
566
568
  const actual = await sha256OfFile(manifestPath);
567
569
  await assertDigestMatch(ref.sha256, actual, `skill ${ref.skillId}`, { path: manifestPath });
568
570
  }
569
- const skillId = String(manifest.code ?? ref.skillId);
571
+ const skillId = String(ref.skillId);
570
572
  return {
571
573
  skillId,
572
574
  name: String(manifest.name ?? ref.name ?? skillId),
@@ -7,7 +7,7 @@
7
7
  import type { GraphDSL } from '../graph/contracts/executable-graph.js';
8
8
  import type { AgentRegistryClient } from './agent-registry-client.js';
9
9
  import type { DeploymentContext } from '../tool/tool-execution-router.js';
10
- import type { ILocalToolInstallStore } from '@gt-fe/eap-contracts';
10
+ import type { ILocalToolInstallStore } from '@eap/contracts';
11
11
  import { type LoadedToolDefinition } from '../tool/loaded-tool-definition.js';
12
12
  import type { LoadedSkillInfo } from '../tool/system-prompt-builder.js';
13
13
  import { type IDeploymentSnapshot } from './deployment-snapshot.js';
@@ -17,6 +17,11 @@ export interface LoadAgentOptions {
17
17
  /** 跳过读写进程内定义缓存 */
18
18
  bypassCache?: boolean;
19
19
  }
20
+ export declare function resolveAgentSystemPromptFromLoader(loader: {
21
+ resolveAgentSystemPrompt?: (agentCode: string, version?: string) => Promise<string | undefined>;
22
+ } | undefined, agentCode: string, version?: string): Promise<string | undefined>;
23
+ /** manifest.prompts.system;空白视为缺省。 */
24
+ export declare function extractAgentSystemPrompt(manifest: unknown): string | undefined;
20
25
  export interface GraphLoaderConfig {
21
26
  registryClient?: AgentRegistryClient;
22
27
  deploymentContext?: DeploymentContext;
@@ -104,6 +109,11 @@ export declare class GraphLoader {
104
109
  private cloneCached;
105
110
  loadGraph(agentCode: string, options?: LoadAgentOptions): Promise<GraphDSL>;
106
111
  private loadGraphFromSource;
112
+ /**
113
+ * Agent 基线系统提示词(manifest.prompts.system)。
114
+ * 每轮 execute/stream 注入 GraphState.agentSystemPrompt;不写进节点 config。
115
+ */
116
+ resolveAgentSystemPrompt(agentCode: string, version?: string): Promise<string | undefined>;
107
117
  /**
108
118
  * 解析 agent tools[] + graph tool 节点 union;
109
119
  * server+预装:以预装 manifest 为准;desktop 合并 ILocalToolInstallStore。