@gt-fe/eap-runtime 0.0.19 → 0.0.21

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 (131) hide show
  1. package/README.md +3 -2
  2. package/dist/api/handlers/invoke.handler.d.ts +7 -0
  3. package/dist/api/handlers/invoke.handler.js +57 -24
  4. package/dist/api/handlers/stream.handler.d.ts +6 -0
  5. package/dist/api/handlers/stream.handler.js +59 -39
  6. package/dist/api/routes/agent.routes.d.ts +8 -1
  7. package/dist/common/types.d.ts +2 -2
  8. package/dist/common/types.js +1 -1
  9. package/dist/contracts/index.d.ts +1 -1
  10. package/dist/contracts/trace-collector.d.ts +16 -8
  11. package/dist/execution/index.d.ts +2 -0
  12. package/dist/execution/index.js +2 -0
  13. package/dist/execution/interceptors.d.ts +40 -0
  14. package/dist/execution/interceptors.js +23 -0
  15. package/dist/execution/ports.d.ts +18 -0
  16. package/dist/execution/ports.js +13 -0
  17. package/dist/governance/audit-reporter.d.ts +14 -0
  18. package/dist/governance/audit-reporter.js +18 -0
  19. package/dist/governance/index.d.ts +2 -0
  20. package/dist/governance/index.js +1 -0
  21. package/dist/governance/permission-guard.d.ts +6 -2
  22. package/dist/governance/permission-guard.js +38 -5
  23. package/dist/graph/adapters/graph-nesting.d.ts +12 -0
  24. package/dist/graph/adapters/graph-nesting.js +29 -0
  25. package/dist/graph/adapters/index.d.ts +2 -0
  26. package/dist/graph/adapters/index.js +2 -0
  27. package/dist/graph/adapters/langgraph.adapter.d.ts +26 -11
  28. package/dist/graph/adapters/langgraph.adapter.js +178 -83
  29. package/dist/graph/adapters/skill-entry-span.d.ts +37 -0
  30. package/dist/graph/adapters/skill-entry-span.js +78 -0
  31. package/dist/graph/adapters/skill-isolate.d.ts +17 -0
  32. package/dist/graph/adapters/skill-isolate.js +50 -0
  33. package/dist/graph/adapters/skill-read.d.ts +10 -0
  34. package/dist/graph/adapters/skill-read.js +33 -0
  35. package/dist/graph/adapters/subgraph-compiler.d.ts +7 -2
  36. package/dist/graph/adapters/subgraph-compiler.js +81 -35
  37. package/dist/graph/contracts/executable-graph.d.ts +27 -5
  38. package/dist/graph/hitl/hitl-handler.js +2 -0
  39. package/dist/graph/nodes/index.d.ts +1 -0
  40. package/dist/graph/nodes/index.js +1 -0
  41. package/dist/graph/nodes/llm-node.d.ts +3 -1
  42. package/dist/graph/nodes/llm-node.js +26 -2
  43. package/dist/graph/nodes/rag/dedup.d.ts +20 -0
  44. package/dist/graph/nodes/rag/dedup.js +77 -0
  45. package/dist/graph/nodes/rag/denoise.d.ts +58 -0
  46. package/dist/graph/nodes/rag/denoise.js +220 -0
  47. package/dist/graph/nodes/rag/fusion/fuse.d.ts +11 -0
  48. package/dist/graph/nodes/rag/fusion/fuse.js +25 -0
  49. package/dist/graph/nodes/rag/fusion/normalize.d.ts +9 -0
  50. package/dist/graph/nodes/rag/fusion/normalize.js +135 -0
  51. package/dist/graph/nodes/rag/index.d.ts +18 -0
  52. package/dist/graph/nodes/rag/index.js +17 -0
  53. package/dist/graph/nodes/rag/prompts.d.ts +12 -0
  54. package/dist/graph/nodes/rag/prompts.js +40 -0
  55. package/dist/graph/nodes/rag/rag-node.d.ts +21 -0
  56. package/dist/graph/nodes/rag/rag-node.js +135 -0
  57. package/dist/graph/nodes/rag/rag-search-tool.d.ts +48 -0
  58. package/dist/graph/nodes/rag/rag-search-tool.js +230 -0
  59. package/dist/graph/nodes/rag/react-loop.d.ts +57 -0
  60. package/dist/graph/nodes/rag/react-loop.js +467 -0
  61. package/dist/graph/nodes/rag/retrievers/http-embedder.d.ts +29 -0
  62. package/dist/graph/nodes/rag/retrievers/http-embedder.js +66 -0
  63. package/dist/graph/nodes/rag/retrievers/in-memory-retriever.d.ts +17 -0
  64. package/dist/graph/nodes/rag/retrievers/in-memory-retriever.js +18 -0
  65. package/dist/graph/nodes/rag/retrievers/local-sqlite-retriever.d.ts +46 -0
  66. package/dist/graph/nodes/rag/retrievers/local-sqlite-retriever.js +85 -0
  67. package/dist/graph/nodes/rag/tools.d.ts +90 -0
  68. package/dist/graph/nodes/rag/tools.js +260 -0
  69. package/dist/graph/nodes/rag/types.d.ts +226 -0
  70. package/dist/graph/nodes/rag/types.js +9 -0
  71. package/dist/graph/nodes/tool-node.d.ts +25 -1
  72. package/dist/graph/nodes/tool-node.js +193 -35
  73. package/dist/graph/skill-audit-recorder.d.ts +4 -4
  74. package/dist/graph/skill-audit-recorder.js +3 -3
  75. package/dist/graph/trace-span.d.ts +2 -9
  76. package/dist/graph/trace-span.js +1 -0
  77. package/dist/index.d.ts +3 -1
  78. package/dist/index.js +1 -0
  79. package/dist/memory/semantic-retrieval.service.d.ts +1 -1
  80. package/dist/memory/semantic-retrieval.service.js +13 -23
  81. package/dist/providers/index.d.ts +1 -1
  82. package/dist/providers/index.js +1 -1
  83. package/dist/providers/routing-llm-provider.d.ts +5 -0
  84. package/dist/providers/routing-llm-provider.js +66 -1
  85. package/dist/runtime/agent-runtime.d.ts +5 -0
  86. package/dist/runtime/agent-runtime.js +105 -63
  87. package/dist/runtime/dev-rag-deps.d.ts +21 -0
  88. package/dist/runtime/dev-rag-deps.js +186 -0
  89. package/dist/runtime/dev-runtime.d.ts +16 -1
  90. package/dist/runtime/dev-runtime.js +59 -5
  91. package/dist/runtime/index.d.ts +1 -1
  92. package/dist/runtime/types.d.ts +10 -9
  93. package/dist/session/apply-session-compression.d.ts +81 -0
  94. package/dist/session/apply-session-compression.js +262 -0
  95. package/dist/session/apply-session-memory.d.ts +21 -0
  96. package/dist/session/apply-session-memory.js +48 -0
  97. package/dist/session/index.d.ts +2 -0
  98. package/dist/session/index.js +2 -0
  99. package/dist/session/persist-turn-messages.d.ts +51 -0
  100. package/dist/session/persist-turn-messages.js +140 -3
  101. package/dist/sse/events/index.d.ts +13 -4
  102. package/dist/sse/events/index.js +9 -1
  103. package/dist/sse/events/rag-events.d.ts +63 -0
  104. package/dist/sse/events/rag-events.js +9 -0
  105. package/dist/sse/events/session-events.d.ts +38 -0
  106. package/dist/sse/events/session-events.js +4 -0
  107. package/dist/sse/trace-collector.d.ts +2 -9
  108. package/dist/token/index.d.ts +3 -0
  109. package/dist/token/index.js +2 -0
  110. package/dist/token/record-task-token-usage.d.ts +23 -0
  111. package/dist/token/record-task-token-usage.js +76 -0
  112. package/dist/token/token-detail-mode.d.ts +4 -4
  113. package/dist/token/token-detail-mode.js +4 -4
  114. package/dist/token/token-detail.d.ts +8 -0
  115. package/dist/token/token-detail.js +22 -0
  116. package/dist/token/token-stats.service.d.ts +4 -2
  117. package/dist/token/token-stats.service.js +5 -1
  118. package/dist/tool/create-tool-executor.d.ts +6 -0
  119. package/dist/tool/create-tool-executor.js +4 -3
  120. package/dist/tool/harness-primitives.d.ts +9 -1
  121. package/dist/tool/harness-primitives.js +43 -12
  122. package/dist/tool/index.d.ts +3 -2
  123. package/dist/tool/index.js +3 -2
  124. package/dist/tool/mcp-list.d.ts +12 -0
  125. package/dist/tool/mcp-list.js +15 -0
  126. package/dist/tool/tool-executor.interface.d.ts +27 -0
  127. package/dist/tool/tool-orchestrator.d.ts +3 -1
  128. package/dist/tool/tool-orchestrator.js +15 -6
  129. package/dist/tool/tool-retry.d.ts +15 -0
  130. package/dist/tool/tool-retry.js +69 -0
  131. package/package.json +2 -2
@@ -0,0 +1,18 @@
1
+ /**
2
+ * 执行口类型:不另起引擎,也不改现有调用路径。
3
+ * ISandbox 描述 jail 根目录;execute_command 仍走 harness jail,未经过本接口。
4
+ * IApproval 即 HitlHandler;确认仍走 require_confirmation。
5
+ * OS 级沙箱见 TODO-skill-fs FS-2。
6
+ */
7
+ import type { HitlHandler } from '../graph/hitl/hitl-handler.js';
8
+ /** 命令路径约束。默认:用户目录读写 + 技能包只读。 */
9
+ export interface ISandbox {
10
+ allowedWriteRoots: string[];
11
+ allowedReadRoots: string[];
12
+ }
13
+ export declare function sandboxFromJail(jail: {
14
+ writeRoot: string;
15
+ extraRoots?: string[];
16
+ }): ISandbox;
17
+ /** 人工确认。默认实现是 HitlHandler + require_confirmation。 */
18
+ export type IApproval = HitlHandler;
@@ -0,0 +1,13 @@
1
+ /**
2
+ * 执行口类型:不另起引擎,也不改现有调用路径。
3
+ * ISandbox 描述 jail 根目录;execute_command 仍走 harness jail,未经过本接口。
4
+ * IApproval 即 HitlHandler;确认仍走 require_confirmation。
5
+ * OS 级沙箱见 TODO-skill-fs FS-2。
6
+ */
7
+ export function sandboxFromJail(jail) {
8
+ const extra = jail.extraRoots ?? [];
9
+ return {
10
+ allowedWriteRoots: [jail.writeRoot],
11
+ allowedReadRoots: [jail.writeRoot, ...extra],
12
+ };
13
+ }
@@ -0,0 +1,14 @@
1
+ /**
2
+ * 权限拒绝审计。未注入则只抛错(A-4)。上报失败不挡执行。
3
+ */
4
+ export interface PermissionDenialAudit {
5
+ kind: 'tool' | 'skill';
6
+ resourceId: string;
7
+ reason: string;
8
+ userId?: string | null;
9
+ correlationId?: string;
10
+ }
11
+ export interface IAuditReporter {
12
+ recordDenial(event: PermissionDenialAudit): Promise<void>;
13
+ }
14
+ export declare function reportPermissionDenial(reporter: IAuditReporter | undefined, event: PermissionDenialAudit): Promise<void>;
@@ -0,0 +1,18 @@
1
+ /**
2
+ * 权限拒绝审计。未注入则只抛错(A-4)。上报失败不挡执行。
3
+ */
4
+ import { emitRuntimeLog } from '../common/logger.js';
5
+ export async function reportPermissionDenial(reporter, event) {
6
+ if (!reporter)
7
+ return;
8
+ try {
9
+ await reporter.recordDenial(event);
10
+ }
11
+ catch (err) {
12
+ emitRuntimeLog('warn', 'runtime.audit', 'permission denial audit failed', {
13
+ event: 'runtime.audit.denial_failed',
14
+ resourceId: event.resourceId,
15
+ error: err instanceof Error ? err.message : String(err),
16
+ });
17
+ }
18
+ }
@@ -5,3 +5,5 @@ export type { CallerType, ExecutionContext, GovernancePermissionCheckParams, Gov
5
5
  export type { IGovernanceClient } from './governance-client.js';
6
6
  export { HttpGovernanceClient, AllowAllGovernanceClient, resolveExecutionContext, } from './governance-client.js';
7
7
  export { assertToolPermission, assertSkillPermission, permissionMessage, PermissionDeniedError, GovernanceUnavailableError, } from './permission-guard.js';
8
+ export type { IAuditReporter, PermissionDenialAudit } from './audit-reporter.js';
9
+ export { reportPermissionDenial } from './audit-reporter.js';
@@ -3,3 +3,4 @@
3
3
  */
4
4
  export { HttpGovernanceClient, AllowAllGovernanceClient, resolveExecutionContext, } from './governance-client.js';
5
5
  export { assertToolPermission, assertSkillPermission, permissionMessage, PermissionDeniedError, GovernanceUnavailableError, } from './permission-guard.js';
6
+ export { reportPermissionDenial } from './audit-reporter.js';
@@ -2,7 +2,8 @@
2
2
  * 执行期 Tool 权限守卫
3
3
  */
4
4
  import type { ExecutionContext, PermissionDenyReason } from '@gt-fe/eap-contracts';
5
- import type { IGovernanceClient } from './governance-client.js';
5
+ import { type IGovernanceClient } from './governance-client.js';
6
+ import { type IAuditReporter } from './audit-reporter.js';
6
7
  export declare class GovernanceUnavailableError extends Error {
7
8
  readonly reason: PermissionDenyReason;
8
9
  constructor(message?: string);
@@ -15,6 +16,9 @@ export declare function permissionMessage(kind: 'tool' | 'skill', reason: Permis
15
16
  export declare function assertToolPermission(client: IGovernanceClient | undefined, ctx: ExecutionContext, toolId: string, options?: {
16
17
  dataScope?: 'user-bound' | 'department-bound' | 'global';
17
18
  resourceOwnerId?: string;
19
+ auditReporter?: IAuditReporter;
18
20
  }): Promise<void>;
19
21
  /** Skill 激活守卫(04 R15.3) */
20
- export declare function assertSkillPermission(client: IGovernanceClient | undefined, ctx: ExecutionContext, skillId: string): Promise<void>;
22
+ export declare function assertSkillPermission(client: IGovernanceClient | undefined, ctx: ExecutionContext, skillId: string, options?: {
23
+ auditReporter?: IAuditReporter;
24
+ }): Promise<void>;
@@ -1,6 +1,8 @@
1
1
  /**
2
2
  * 执行期 Tool 权限守卫
3
3
  */
4
+ import { AllowAllGovernanceClient } from './governance-client.js';
5
+ import { reportPermissionDenial } from './audit-reporter.js';
4
6
  export class GovernanceUnavailableError extends Error {
5
7
  reason = 'GOVERNANCE_UNAVAILABLE';
6
8
  constructor(message = '治理服务不可用') {
@@ -27,8 +29,17 @@ export async function assertToolPermission(client, ctx, toolId, options) {
27
29
  if (!client) {
28
30
  return;
29
31
  }
30
- if (!ctx.delegationToken && ctx.callerType === 'user') {
31
- return;
32
+ // 会向治理服务校验的客户端无 token 即拒绝。AllowAll 不校验,不要求 token。
33
+ if (!ctx.delegationToken && !(client instanceof AllowAllGovernanceClient)) {
34
+ const err = new PermissionDeniedError('NO_PERMISSION', permissionMessage('tool', 'NO_PERMISSION'));
35
+ await reportPermissionDenial(options?.auditReporter, {
36
+ kind: 'tool',
37
+ resourceId: toolId,
38
+ reason: 'NO_PERMISSION',
39
+ userId: ctx.userId,
40
+ correlationId: ctx.correlationId,
41
+ });
42
+ throw err;
32
43
  }
33
44
  const result = await client.checkPermission(ctx, {
34
45
  resourceType: 'tool',
@@ -42,16 +53,31 @@ export async function assertToolPermission(client, ctx, toolId, options) {
42
53
  }
43
54
  if (!result.allowed) {
44
55
  const reason = result.reason ?? 'NO_PERMISSION';
56
+ await reportPermissionDenial(options?.auditReporter, {
57
+ kind: 'tool',
58
+ resourceId: toolId,
59
+ reason,
60
+ userId: ctx.userId,
61
+ correlationId: ctx.correlationId,
62
+ });
45
63
  throw new PermissionDeniedError(reason, permissionMessage('tool', reason));
46
64
  }
47
65
  }
48
66
  /** Skill 激活守卫(04 R15.3) */
49
- export async function assertSkillPermission(client, ctx, skillId) {
67
+ export async function assertSkillPermission(client, ctx, skillId, options) {
50
68
  if (!client || !skillId) {
51
69
  return;
52
70
  }
53
- if (!ctx.delegationToken && ctx.callerType === 'user') {
54
- return;
71
+ if (!ctx.delegationToken && !(client instanceof AllowAllGovernanceClient)) {
72
+ const err = new PermissionDeniedError('NO_PERMISSION', permissionMessage('skill', 'NO_PERMISSION'));
73
+ await reportPermissionDenial(options?.auditReporter, {
74
+ kind: 'skill',
75
+ resourceId: skillId,
76
+ reason: 'NO_PERMISSION',
77
+ userId: ctx.userId,
78
+ correlationId: ctx.correlationId,
79
+ });
80
+ throw err;
55
81
  }
56
82
  const result = await client.checkPermission(ctx, {
57
83
  resourceType: 'skill',
@@ -63,6 +89,13 @@ export async function assertSkillPermission(client, ctx, skillId) {
63
89
  }
64
90
  if (!result.allowed) {
65
91
  const reason = result.reason ?? 'NO_PERMISSION';
92
+ await reportPermissionDenial(options?.auditReporter, {
93
+ kind: 'skill',
94
+ resourceId: skillId,
95
+ reason,
96
+ userId: ctx.userId,
97
+ correlationId: ctx.correlationId,
98
+ });
66
99
  throw new PermissionDeniedError(reason, permissionMessage('skill', reason));
67
100
  }
68
101
  }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Skill 子图只允许一层:Agent 图可以有 type=subgraph,子图 DSL 不能再有。
3
+ * Checkpoint / HITL / Span 未按嵌套设计(B14)。
4
+ */
5
+ import type { GraphDSL, GraphNode } from '../contracts/executable-graph.js';
6
+ export declare function subgraphNodesOf(dsl: GraphDSL | undefined): GraphNode[];
7
+ /**
8
+ * Skill 子图(compileSubGraph 入参、父节点内嵌 subgraphDsl、运行时 workflow)不得含 type=subgraph。
9
+ */
10
+ export declare function assertSkillGraphHasNoSubgraphNodes(dsl: GraphDSL, label?: string): void;
11
+ /** 父图 buildGraph:内嵌 subgraphDsl 在编译父图时就拒绝,不等第一次 invoke。 */
12
+ export declare function assertEmbeddedSubgraphsAreFlat(dsl: GraphDSL): void;
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Skill 子图只允许一层:Agent 图可以有 type=subgraph,子图 DSL 不能再有。
3
+ * Checkpoint / HITL / Span 未按嵌套设计(B14)。
4
+ */
5
+ import { AppError, ErrorCodes } from '@gt-fe/eap-contracts';
6
+ export function subgraphNodesOf(dsl) {
7
+ return (dsl?.nodes ?? []).filter((node) => node.type === 'subgraph');
8
+ }
9
+ /**
10
+ * Skill 子图(compileSubGraph 入参、父节点内嵌 subgraphDsl、运行时 workflow)不得含 type=subgraph。
11
+ */
12
+ export function assertSkillGraphHasNoSubgraphNodes(dsl, label) {
13
+ const nested = subgraphNodesOf(dsl);
14
+ if (nested.length === 0)
15
+ return;
16
+ const where = label ?? dsl.name ?? 'unnamed';
17
+ throw new AppError(ErrorCodes.GRAPH_BUILD_FAILED, `Skill 子图不允许再包含 type=subgraph(不支持子图套子图): ${where} → ${nested.map((n) => n.id).join(', ')}`, { exposeMessage: true });
18
+ }
19
+ /** 父图 buildGraph:内嵌 subgraphDsl 在编译父图时就拒绝,不等第一次 invoke。 */
20
+ export function assertEmbeddedSubgraphsAreFlat(dsl) {
21
+ for (const node of dsl.nodes ?? []) {
22
+ if (node.type !== 'subgraph')
23
+ continue;
24
+ const nested = node.config?.['subgraphDsl'];
25
+ if (nested?.nodes?.length) {
26
+ assertSkillGraphHasNoSubgraphNodes(nested, node.id);
27
+ }
28
+ }
29
+ }
@@ -1,3 +1,5 @@
1
1
  export { LangGraphAdapter } from './langgraph.adapter.js';
2
2
  export { LangGraphCheckpointer } from './langgraph-checkpointer.js';
3
3
  export { SubGraphCompiler } from './subgraph-compiler.js';
4
+ export { assertSkillGraphHasNoSubgraphNodes, assertEmbeddedSubgraphsAreFlat, subgraphNodesOf, } from './graph-nesting.js';
5
+ export { isSkillContextIsolated, isolatedSkillMessages, isolatedSkillOutput, } from './skill-isolate.js';
@@ -1,3 +1,5 @@
1
1
  export { LangGraphAdapter } from './langgraph.adapter.js';
2
2
  export { LangGraphCheckpointer } from './langgraph-checkpointer.js';
3
3
  export { SubGraphCompiler } from './subgraph-compiler.js';
4
+ export { assertSkillGraphHasNoSubgraphNodes, assertEmbeddedSubgraphsAreFlat, subgraphNodesOf, } from './graph-nesting.js';
5
+ export { isSkillContextIsolated, isolatedSkillMessages, isolatedSkillOutput, } from './skill-isolate.js';
@@ -12,9 +12,11 @@ import type { ExecutableGraph, GraphDSL, GraphState, RuntimeEvent, CheckpointDat
12
12
  import type { ICheckpointSaver } from '../../checkpoint/contracts/checkpoint-saver.contract.js';
13
13
  import type { HitlHandler } from '../hitl/hitl-handler.js';
14
14
  import { type ILLMProvider } from '../nodes/llm-node.js';
15
+ import { type RagNodeDeps } from '../nodes/rag/index.js';
15
16
  import type { IToolExecutor } from '../../tool/tool-executor.interface.js';
16
17
  import type { IGovernanceClient } from '../../governance/governance-client.js';
17
18
  import { type ConditionEvaluatorFn } from '../condition-evaluator.js';
19
+ import type { ExecutionInterceptors } from '../../execution/interceptors.js';
18
20
  /** 图未写 `config.maxIterations` 时的 recursionLimit。`agent ⇄ tools` 一圈约 2,50 ≈ 24 次工具往返。 */
19
21
  export declare const DEFAULT_GRAPH_RECURSION_LIMIT = 50;
20
22
  /**
@@ -26,6 +28,7 @@ export declare const DEFAULT_GRAPH_RECURSION_LIMIT = 50;
26
28
  * 3. 提供 Checkpoint 提取与恢复能力
27
29
  */
28
30
  export declare class LangGraphAdapter implements IStateGraphEngine {
31
+ private readonly auditReporter?;
29
32
  private readonly checkpointer;
30
33
  private readonly subGraphCompiler;
31
34
  private readonly llmProvider;
@@ -42,11 +45,17 @@ export declare class LangGraphAdapter implements IStateGraphEngine {
42
45
  */
43
46
  private readonly governanceClient?;
44
47
  private hitlHandler?;
45
- constructor(checkpointSaver?: ICheckpointSaver, llmProvider?: ILLMProvider, toolExecutor?: IToolExecutor, governanceClient?: IGovernanceClient, hitlHandler?: HitlHandler);
48
+ private readonly ragNodeDeps?;
49
+ private readonly interceptors?;
50
+ /** 开发 overlay 根;createDevRuntime 在恢复 process.env 之前钉死 */
51
+ private overlayExtraRoots;
52
+ constructor(checkpointSaver?: ICheckpointSaver, llmProvider?: ILLMProvider, toolExecutor?: IToolExecutor, governanceClient?: IGovernanceClient, hitlHandler?: HitlHandler, ragNodeDeps?: RagNodeDeps, interceptors?: ExecutionInterceptors, auditReporter?: import("../../governance/audit-reporter.js").IAuditReporter | undefined);
46
53
  /**
47
54
  * 注册自定义条件评估函数
48
55
  */
49
56
  registerConditionEvaluator(name: string, fn: ConditionEvaluatorFn): void;
57
+ /** SDK 恢复 env 之后仍要把 overlay 算进 LLM jail 根,不能再读 process.env。 */
58
+ bindOverlayExtraRoots(roots: string[] | undefined): void;
50
59
  /**
51
60
  * 节点旁路推送 RuntimeEvent(子图 Skill 生命周期、Tool 执行)。
52
61
  * 无本次执行流式袋时为空操作(纯 invoke)。
@@ -60,6 +69,7 @@ export declare class LangGraphAdapter implements IStateGraphEngine {
60
69
  * Tool 节点执行旁路:started → tool.called + tool.progress;
61
70
  * completed/error → 对应终态 + tool.progress。同一 toolCallId。
62
71
  * 读 SKILL.md / 技能包内文件:成功后再发 skill.loaded / skill.resource_read,同时保留 tool.*。
72
+ * 读 SKILL.md 另发 skill.started / skill.completed(与 Trace type=skill Span 对齐);子图内不重复。
63
73
  */
64
74
  private emitToolExecutionEvents;
65
75
  /**
@@ -110,21 +120,15 @@ export declare class LangGraphAdapter implements IStateGraphEngine {
110
120
  private buildSkillCatalog;
111
121
  private createToolNodeFunction;
112
122
  private createLLMNodeFunction;
123
+ /**
124
+ * RAG 节点:编译期 fail-fast(deps 缺失),请求级状态经 execute(state) 流转
125
+ */
126
+ private createRagNodeFunction;
113
127
  /**
114
128
  * 子图节点:优先 config.subgraphDsl;否则按 skillId 从 state.skillDefinitions.workflow 解析。
115
129
  * 技能正文用短目录 + read_file,不灌 system。
116
130
  */
117
131
  private createSubGraphNodeFunction;
118
- /**
119
- * 并行节点:并行执行多个子任务分支
120
- *
121
- * 支持两种并行模式:
122
- * 1. branches 模式:node.branches 列出要并行执行的节点 ID,每个节点的执行函数由 DSL 定义
123
- * 2. tasks 模式:node.config.tasks 列出要并行执行的异步任务函数
124
- *
125
- * 执行结果合并到 state.__parallelResults 中。
126
- */
127
- private createParallelNodeFunction;
128
132
  /**
129
133
  * 代码执行节点:在受限沙箱中执行用户代码
130
134
  *
@@ -172,6 +176,17 @@ export declare class LangGraphAdapter implements IStateGraphEngine {
172
176
  * 否则多轮回放时 DeepSeek thinking 会因缺少 reasoning_content 而 400,
173
177
  * tool 消息也会丢掉 tool_call_id。
174
178
  */
179
+ /**
180
+ * 工具形态检索面白名单(图声明即真相):tool 节点 config.retrievalSources 声明的
181
+ * 数据源目录 → 本图工具白名单(声明源解析出的工具 + rag_search)。未声明的检索类
182
+ * 工具对主 LLM 工具表与执行链整体不可见/不可用;图未声明 = 不收敓名单(通用形态)。
183
+ *
184
+ * 约束——单检索面假设:find 只取全图首个带 retrievalSources 的 tool 节点、按它过滤
185
+ * 全图 loadedTools。多 tool 节点各声明检索面属未支持场景:第二面的工具会被当成
186
+ * 未声明而过滤,无法各自收敛;如需支持须改为 per-node 收敛(在节点边界分别过滤
187
+ * loadedTools,而非此处全图一次性收敛)。
188
+ */
189
+ private applyDeclaredSearchFace;
175
190
  private graphStateToLangGraphInput;
176
191
  /**
177
192
  * 将 LangGraph updates 模式输出转为平台 RuntimeEvent 序列