@roarpeng/graphflow 1.1.0 → 1.2.0

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 (142) hide show
  1. package/README.md +1 -1
  2. package/dist/agents/insight.js +1 -1
  3. package/dist/agents/insight.js.map +1 -1
  4. package/dist/config/defaults.d.ts.map +1 -1
  5. package/dist/config/defaults.js +1 -0
  6. package/dist/config/defaults.js.map +1 -1
  7. package/dist/config/embedding-factory.d.ts.map +1 -1
  8. package/dist/config/embedding-factory.js +23 -12
  9. package/dist/config/embedding-factory.js.map +1 -1
  10. package/dist/config/loader.d.ts +11 -0
  11. package/dist/config/loader.d.ts.map +1 -1
  12. package/dist/config/loader.js +103 -0
  13. package/dist/config/loader.js.map +1 -1
  14. package/dist/core/agent-assignment.d.ts +39 -0
  15. package/dist/core/agent-assignment.d.ts.map +1 -0
  16. package/dist/core/agent-assignment.js +73 -0
  17. package/dist/core/agent-assignment.js.map +1 -0
  18. package/dist/core/dag-checkpoint.d.ts +83 -0
  19. package/dist/core/dag-checkpoint.d.ts.map +1 -0
  20. package/dist/core/dag-checkpoint.js +164 -0
  21. package/dist/core/dag-checkpoint.js.map +1 -0
  22. package/dist/core/dag-engine.d.ts +9 -0
  23. package/dist/core/dag-engine.d.ts.map +1 -1
  24. package/dist/core/dag-engine.js +42 -0
  25. package/dist/core/dag-engine.js.map +1 -1
  26. package/dist/core/orchestrator-context.d.ts +10 -0
  27. package/dist/core/orchestrator-context.d.ts.map +1 -0
  28. package/dist/core/orchestrator-context.js +112 -0
  29. package/dist/core/orchestrator-context.js.map +1 -0
  30. package/dist/core/orchestrator-episode.d.ts +13 -0
  31. package/dist/core/orchestrator-episode.d.ts.map +1 -0
  32. package/dist/core/orchestrator-episode.js +128 -0
  33. package/dist/core/orchestrator-episode.js.map +1 -0
  34. package/dist/core/orchestrator-route.d.ts +20 -0
  35. package/dist/core/orchestrator-route.d.ts.map +1 -0
  36. package/dist/core/orchestrator-route.js +51 -0
  37. package/dist/core/orchestrator-route.js.map +1 -0
  38. package/dist/core/orchestrator.d.ts +2 -38
  39. package/dist/core/orchestrator.d.ts.map +1 -1
  40. package/dist/core/orchestrator.js +97 -286
  41. package/dist/core/orchestrator.js.map +1 -1
  42. package/dist/core/triage.d.ts +21 -0
  43. package/dist/core/triage.d.ts.map +1 -1
  44. package/dist/core/triage.js +25 -6
  45. package/dist/core/triage.js.map +1 -1
  46. package/dist/core/types.d.ts +53 -0
  47. package/dist/core/types.d.ts.map +1 -1
  48. package/dist/graph/context-slicer-types.d.ts +62 -0
  49. package/dist/graph/context-slicer-types.d.ts.map +1 -0
  50. package/dist/graph/context-slicer-types.js +13 -0
  51. package/dist/graph/context-slicer-types.js.map +1 -0
  52. package/dist/graph/context-slicer-utils.d.ts +24 -0
  53. package/dist/graph/context-slicer-utils.d.ts.map +1 -0
  54. package/dist/graph/context-slicer-utils.js +118 -0
  55. package/dist/graph/context-slicer-utils.js.map +1 -0
  56. package/dist/graph/context-slicer.d.ts +6 -61
  57. package/dist/graph/context-slicer.d.ts.map +1 -1
  58. package/dist/graph/context-slicer.js +73 -170
  59. package/dist/graph/context-slicer.js.map +1 -1
  60. package/dist/graph/file-indexer-cache.d.ts +34 -0
  61. package/dist/graph/file-indexer-cache.d.ts.map +1 -0
  62. package/dist/graph/file-indexer-cache.js +105 -0
  63. package/dist/graph/file-indexer-cache.js.map +1 -0
  64. package/dist/graph/file-indexer-edges.d.ts +55 -0
  65. package/dist/graph/file-indexer-edges.d.ts.map +1 -0
  66. package/dist/graph/file-indexer-edges.js +258 -0
  67. package/dist/graph/file-indexer-edges.js.map +1 -0
  68. package/dist/graph/file-indexer-nodes.d.ts +43 -0
  69. package/dist/graph/file-indexer-nodes.d.ts.map +1 -0
  70. package/dist/graph/file-indexer-nodes.js +137 -0
  71. package/dist/graph/file-indexer-nodes.js.map +1 -0
  72. package/dist/graph/file-indexer-walker.d.ts +35 -0
  73. package/dist/graph/file-indexer-walker.d.ts.map +1 -0
  74. package/dist/graph/file-indexer-walker.js +80 -0
  75. package/dist/graph/file-indexer-walker.js.map +1 -0
  76. package/dist/graph/file-indexer.d.ts +13 -39
  77. package/dist/graph/file-indexer.d.ts.map +1 -1
  78. package/dist/graph/file-indexer.js +167 -600
  79. package/dist/graph/file-indexer.js.map +1 -1
  80. package/dist/index.d.ts +1 -1
  81. package/dist/index.d.ts.map +1 -1
  82. package/dist/index.js +2 -1
  83. package/dist/index.js.map +1 -1
  84. package/dist/integrations/agent-mcp-installer.d.ts +25 -1
  85. package/dist/integrations/agent-mcp-installer.d.ts.map +1 -1
  86. package/dist/integrations/agent-mcp-installer.js +160 -4
  87. package/dist/integrations/agent-mcp-installer.js.map +1 -1
  88. package/dist/integrations/skill-installer.d.ts +50 -0
  89. package/dist/integrations/skill-installer.d.ts.map +1 -0
  90. package/dist/integrations/skill-installer.js +373 -0
  91. package/dist/integrations/skill-installer.js.map +1 -0
  92. package/dist/learning/embeddings.d.ts +11 -0
  93. package/dist/learning/embeddings.d.ts.map +1 -1
  94. package/dist/learning/embeddings.js +24 -0
  95. package/dist/learning/embeddings.js.map +1 -1
  96. package/dist/learning/episodic-memory.d.ts +3 -2
  97. package/dist/learning/episodic-memory.d.ts.map +1 -1
  98. package/dist/learning/episodic-memory.js +105 -10
  99. package/dist/learning/episodic-memory.js.map +1 -1
  100. package/dist/learning/local-embedding.d.ts.map +1 -1
  101. package/dist/learning/local-embedding.js +16 -0
  102. package/dist/learning/local-embedding.js.map +1 -1
  103. package/dist/learning/seed-skills.d.ts +21 -0
  104. package/dist/learning/seed-skills.d.ts.map +1 -0
  105. package/dist/learning/seed-skills.js +113 -0
  106. package/dist/learning/seed-skills.js.map +1 -0
  107. package/dist/learning/skill-evolution.d.ts +1 -1
  108. package/dist/learning/skill-evolution.d.ts.map +1 -1
  109. package/dist/learning/skill-evolution.js +1 -1
  110. package/dist/learning/skill-evolution.js.map +1 -1
  111. package/dist/learning/skill-package.d.ts +55 -0
  112. package/dist/learning/skill-package.d.ts.map +1 -0
  113. package/dist/learning/skill-package.js +115 -0
  114. package/dist/learning/skill-package.js.map +1 -0
  115. package/dist/learning/triage-telemetry.d.ts +43 -0
  116. package/dist/learning/triage-telemetry.d.ts.map +1 -0
  117. package/dist/learning/triage-telemetry.js +114 -0
  118. package/dist/learning/triage-telemetry.js.map +1 -0
  119. package/dist/surfaces/cli/index.js +65 -0
  120. package/dist/surfaces/cli/index.js.map +1 -1
  121. package/dist/surfaces/cli/init.d.ts +12 -2
  122. package/dist/surfaces/cli/init.d.ts.map +1 -1
  123. package/dist/surfaces/cli/init.js +109 -30
  124. package/dist/surfaces/cli/init.js.map +1 -1
  125. package/dist/surfaces/cli/output.d.ts.map +1 -1
  126. package/dist/surfaces/cli/output.js +5 -0
  127. package/dist/surfaces/cli/output.js.map +1 -1
  128. package/dist/surfaces/cli/runtime/graph.d.ts +23 -0
  129. package/dist/surfaces/cli/runtime/graph.d.ts.map +1 -1
  130. package/dist/surfaces/cli/runtime/graph.js +40 -0
  131. package/dist/surfaces/cli/runtime/graph.js.map +1 -1
  132. package/dist/surfaces/cli/runtime/routing.d.ts.map +1 -1
  133. package/dist/surfaces/cli/runtime/routing.js +8 -1
  134. package/dist/surfaces/cli/runtime/routing.js.map +1 -1
  135. package/dist/surfaces/cli/runtime.d.ts +1 -1
  136. package/dist/surfaces/cli/runtime.d.ts.map +1 -1
  137. package/dist/surfaces/cli/runtime.js +4 -1
  138. package/dist/surfaces/cli/runtime.js.map +1 -1
  139. package/dist/surfaces/mcp/tool-definitions.js +20 -20
  140. package/dist/surfaces/mcp/tool-definitions.js.map +1 -1
  141. package/package.json +3 -3
  142. package/scripts/safe-postinstall.cjs +323 -5
@@ -0,0 +1,164 @@
1
+ "use strict";
2
+ /**
3
+ * dag-checkpoint.ts — DAG 执行状态持久化(Checkpoint)
4
+ *
5
+ * 在每个 DAG 节点执行完成后,将节点状态(id, status, result, retryCount, executedAt)
6
+ * 持久化到图存储中(作为 TaskRun 类型的 GraphNode)。
7
+ *
8
+ * Checkpoint ID 使用 `dag:${taskHash}` 格式:
9
+ * - taskHash 由 DAG 计划(节点 id / 描述 / 依赖)计算得出,保证同一计划可恢复。
10
+ * - 整个 DAG 的 checkpoint 以单个 TaskRun GraphNode 的形式存储,content 字段为 JSON。
11
+ *
12
+ * 向后兼容:当图存储不支持 checkpoint 所需操作(getNodesByIds / upsertNodes)时,
13
+ * 所有 checkpoint 操作都会优雅降级为纯内存执行,不会抛出错误。
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.DagCheckpoint = void 0;
17
+ exports.computeTaskHash = computeTaskHash;
18
+ exports.computeDagId = computeDagId;
19
+ const logger_1 = require("../utils/logger");
20
+ const hash_1 = require("../utils/hash");
21
+ /**
22
+ * 计算 DAG 计划的任务哈希。
23
+ *
24
+ * 哈希输入为所有节点的 id / description / dependencies 的规范化拼接,
25
+ * 保证相同计划产生相同哈希,从而命中同一 checkpoint。
26
+ */
27
+ function computeTaskHash(plan) {
28
+ const normalized = plan
29
+ .map((node) => `${node.id}|${node.description}|${[...node.dependencies].sort().join(",")}`)
30
+ .sort()
31
+ .join("||");
32
+ return (0, hash_1.hashText)(normalized);
33
+ }
34
+ /**
35
+ * 根据计划生成 checkpoint ID,格式 `dag:${taskHash}`。
36
+ */
37
+ function computeDagId(plan) {
38
+ return `dag:${computeTaskHash(plan)}`;
39
+ }
40
+ /**
41
+ * DAG Checkpoint 持久化管理器。
42
+ *
43
+ * 用法:
44
+ * ```ts
45
+ * const cp = new DagCheckpoint(graphClient);
46
+ * const restored = await cp.loadCheckpoint(dagId); // 恢复已完成节点
47
+ * await cp.saveNodeCompletion(dagId, node, true); // 持久化节点完成状态
48
+ * ```
49
+ *
50
+ * 所有操作均吞掉错误并记录 warn 日志,确保图存储不可用时不影响 DAG 执行。
51
+ */
52
+ class DagCheckpoint {
53
+ graphClient;
54
+ /** 内存缓存:nodeId -> 节点状态。避免每次保存都重复读取图存储。 */
55
+ cache = new Map();
56
+ /** 是否已从图存储加载过一次 */
57
+ hydrated = false;
58
+ constructor(graphClient) {
59
+ this.graphClient = graphClient;
60
+ }
61
+ /**
62
+ * 从图存储加载 checkpoint,返回已完成节点的状态映射。
63
+ *
64
+ * 多次调用只会读取一次图存储,后续返回内存缓存。
65
+ * 如果图存储不支持 getNodesByIds 或读取失败,返回空映射(优雅降级)。
66
+ */
67
+ async loadCheckpoint(dagId) {
68
+ if (!this.hydrated) {
69
+ this.hydrated = true;
70
+ try {
71
+ await this.hydrate(dagId);
72
+ }
73
+ catch (error) {
74
+ logger_1.logger.warn({ error, dagId }, "DAG checkpoint 读取失败,降级为纯内存执行");
75
+ }
76
+ }
77
+ return new Map(this.cache);
78
+ }
79
+ /**
80
+ * 持久化单个节点的完成状态到图存储。
81
+ *
82
+ * 内部维护内存缓存,每次保存都会将完整 checkpoint 重新写入图存储,
83
+ * 保证崩溃后可从最近一次保存点恢复。
84
+ */
85
+ async saveNodeCompletion(dagId, node, result) {
86
+ const state = {
87
+ id: node.id,
88
+ status: result ? "COMPLETED" : "FAILED",
89
+ result,
90
+ retryCount: node.retryCount,
91
+ executedAt: new Date().toISOString(),
92
+ };
93
+ this.cache.set(node.id, state);
94
+ try {
95
+ await this.persist(dagId);
96
+ }
97
+ catch (error) {
98
+ // 持久化失败不影响内存执行,仅记录告警
99
+ logger_1.logger.warn({ error, dagId, nodeId: node.id }, "DAG checkpoint 持久化失败");
100
+ }
101
+ }
102
+ /**
103
+ * 清除指定 DAG 的 checkpoint(例如全部完成后清理)。
104
+ * 图存储支持 deleteNode 时才生效。
105
+ */
106
+ async clearCheckpoint(dagId) {
107
+ this.cache.clear();
108
+ this.hydrated = true;
109
+ try {
110
+ if (this.graphClient.deleteNode) {
111
+ await this.graphClient.deleteNode(dagId);
112
+ }
113
+ }
114
+ catch (error) {
115
+ logger_1.logger.warn({ error, dagId }, "DAG checkpoint 清除失败");
116
+ }
117
+ }
118
+ /** 从图存储读取 checkpoint 内容并填充内存缓存。 */
119
+ async hydrate(dagId) {
120
+ if (!this.graphClient.getNodesByIds) {
121
+ return;
122
+ }
123
+ const hits = await this.graphClient.getNodesByIds([dagId]);
124
+ const node = hits.find((n) => n.id === dagId && n.type === "TaskRun");
125
+ if (!node) {
126
+ return;
127
+ }
128
+ const parsed = JSON.parse(node.content);
129
+ if (!parsed || typeof parsed !== "object" || !parsed.nodes) {
130
+ return;
131
+ }
132
+ for (const [nodeId, state] of Object.entries(parsed.nodes)) {
133
+ if (state && typeof state.id === "string") {
134
+ this.cache.set(nodeId, state);
135
+ }
136
+ }
137
+ logger_1.logger.info({ dagId, restored: this.cache.size }, "DAG checkpoint 恢复完成");
138
+ }
139
+ /** 将当前内存缓存写入图存储(单个 TaskRun GraphNode)。 */
140
+ async persist(dagId) {
141
+ if (!this.graphClient.upsertNodes) {
142
+ return;
143
+ }
144
+ const content = {
145
+ dagId,
146
+ nodes: Object.fromEntries(this.cache),
147
+ };
148
+ const graphNode = {
149
+ id: dagId,
150
+ type: "TaskRun",
151
+ content: JSON.stringify(content),
152
+ metadata: {
153
+ kind: "dag-checkpoint",
154
+ dagId,
155
+ nodeCount: this.cache.size,
156
+ completed: Array.from(this.cache.values()).filter((s) => s.status === "COMPLETED").length,
157
+ failed: Array.from(this.cache.values()).filter((s) => s.status === "FAILED").length,
158
+ },
159
+ };
160
+ await this.graphClient.upsertNodes([graphNode]);
161
+ }
162
+ }
163
+ exports.DagCheckpoint = DagCheckpoint;
164
+ //# sourceMappingURL=dag-checkpoint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dag-checkpoint.js","sourceRoot":"","sources":["../../src/core/dag-checkpoint.ts"],"names":[],"mappings":"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"}
@@ -1,14 +1,23 @@
1
1
  import type { TaskNode } from "./types";
2
+ import type { GraphClient } from "../graph/client-factory";
2
3
  export type TaskExecutor = (task: TaskNode) => Promise<boolean>;
3
4
  export interface DagExecutionOptions {
4
5
  concurrencyLimit?: number;
5
6
  nodeTimeoutMs?: number;
7
+ /** 图存储客户端,用于 DAG 执行状态持久化(checkpoint)。不提供时纯内存执行。 */
8
+ graphClient?: GraphClient;
9
+ /** DAG 检查点 ID,格式 dag:${taskHash}。不提供时根据 plan 自动计算。 */
10
+ dagId?: string;
11
+ /** 是否启用 checkpoint 持久化,默认当 graphClient 存在时启用。 */
12
+ enableCheckpoint?: boolean;
6
13
  }
7
14
  export interface DagExecutionResult {
8
15
  completed: string[];
9
16
  failed: string[];
10
17
  blocked: string[];
11
18
  rounds: string[][];
19
+ /** 从 checkpoint 恢复(跳过)的节点 id 列表 */
20
+ restoredFromCheckpoint?: string[];
12
21
  }
13
22
  export declare function executeDag(plan: TaskNode[], executor: TaskExecutor, options?: DagExecutionOptions): Promise<DagExecutionResult>;
14
23
  //# sourceMappingURL=dag-engine.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"dag-engine.d.ts","sourceRoot":"","sources":["../../src/core/dag-engine.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,MAAM,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE,QAAQ,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAEhE,MAAM,WAAW,mBAAmB;IAClC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;CACpB;AAED,wBAAsB,UAAU,CAC9B,IAAI,EAAE,QAAQ,EAAE,EAChB,QAAQ,EAAE,YAAY,EACtB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,kBAAkB,CAAC,CA2G7B"}
1
+ {"version":3,"file":"dag-engine.d.ts","sourceRoot":"","sources":["../../src/core/dag-engine.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAG3D,MAAM,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE,QAAQ,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAEhE,MAAM,WAAW,mBAAmB;IAClC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mDAAmD;IACnD,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,sDAAsD;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;IACnB,mCAAmC;IACnC,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC;CACnC;AAED,wBAAsB,UAAU,CAC9B,IAAI,EAAE,QAAQ,EAAE,EAChB,QAAQ,EAAE,YAAY,EACtB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,kBAAkB,CAAC,CAsJ7B"}
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.executeDag = executeDag;
4
4
  const logger_1 = require("../utils/logger");
5
+ const dag_checkpoint_1 = require("./dag-checkpoint");
5
6
  async function executeDag(plan, executor, options) {
6
7
  const tasks = new Map(plan.map((task) => [task.id, task]));
7
8
  const completed = new Set();
@@ -9,6 +10,37 @@ async function executeDag(plan, executor, options) {
9
10
  const blocked = new Set();
10
11
  const rounds = [];
11
12
  const timeoutMs = options?.nodeTimeoutMs ?? 30_000;
13
+ // ── Checkpoint 恢复:尝试加载已完成的节点,跳过重复执行 ──
14
+ const graphClient = options?.graphClient;
15
+ const enableCheckpoint = options?.enableCheckpoint ?? Boolean(graphClient);
16
+ let checkpoint;
17
+ let dagId;
18
+ const restoredFromCheckpoint = [];
19
+ if (enableCheckpoint && graphClient) {
20
+ try {
21
+ checkpoint = new dag_checkpoint_1.DagCheckpoint(graphClient);
22
+ dagId = options?.dagId ?? (0, dag_checkpoint_1.computeDagId)(plan);
23
+ const restored = await checkpoint.loadCheckpoint(dagId);
24
+ for (const [nodeId, state] of restored) {
25
+ if (state.status === "COMPLETED") {
26
+ completed.add(nodeId);
27
+ restoredFromCheckpoint.push(nodeId);
28
+ }
29
+ else if (state.status === "FAILED") {
30
+ failed.add(nodeId);
31
+ restoredFromCheckpoint.push(nodeId);
32
+ }
33
+ }
34
+ if (restoredFromCheckpoint.length > 0) {
35
+ logger_1.logger.info({ dagId, restored: restoredFromCheckpoint.length }, "DAG checkpoint 命中,跳过已完成节点");
36
+ }
37
+ }
38
+ catch (error) {
39
+ logger_1.logger.warn({ error }, "DAG checkpoint 初始化失败,降级为纯内存执行");
40
+ checkpoint = undefined;
41
+ dagId = undefined;
42
+ }
43
+ }
12
44
  while (completed.size + failed.size + blocked.size < tasks.size) {
13
45
  const ready = Array.from(tasks.values()).filter((task) => {
14
46
  if (completed.has(task.id) || failed.has(task.id) || blocked.has(task.id)) {
@@ -90,6 +122,15 @@ async function executeDag(plan, executor, options) {
90
122
  else {
91
123
  failed.add(result.task.id);
92
124
  }
125
+ // 持久化节点完成状态到 checkpoint(失败时优雅降级,不影响执行)
126
+ if (checkpoint && dagId) {
127
+ try {
128
+ await checkpoint.saveNodeCompletion(dagId, result.task, result.ok);
129
+ }
130
+ catch (error) {
131
+ logger_1.logger.warn({ error, taskId: result.task.id }, "DAG checkpoint 持久化失败");
132
+ }
133
+ }
93
134
  }
94
135
  }
95
136
  }
@@ -98,6 +139,7 @@ async function executeDag(plan, executor, options) {
98
139
  failed: Array.from(failed),
99
140
  blocked: Array.from(blocked),
100
141
  rounds,
142
+ ...(restoredFromCheckpoint.length > 0 ? { restoredFromCheckpoint } : {}),
101
143
  };
102
144
  }
103
145
  //# sourceMappingURL=dag-engine.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dag-engine.js","sourceRoot":"","sources":["../../src/core/dag-engine.ts"],"names":[],"mappings":";;AAiBA,gCA+GC;AAhID,4CAAyC;AAiBlC,KAAK,UAAU,UAAU,CAC9B,IAAgB,EAChB,QAAsB,EACtB,OAA6B;IAE7B,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3D,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,MAAM,GAAe,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAG,OAAO,EAAE,aAAa,IAAI,MAAM,CAAC;IAEnD,OAAO,SAAS,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAChE,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;YACvD,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;gBAC1E,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,6CAA6C;YAC7C,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;gBAClC,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;oBAC1E,SAAS;gBACX,CAAC;gBACD,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CACzC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CACnD,CAAC;gBACF,IAAI,YAAY,EAAE,CAAC;oBACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;YACD,+BAA+B;YAC/B,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CACjD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CACvE,CAAC;YACF,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,MAAM;YACR,CAAC;YACD,8BAA8B;YAC9B,IAAI,OAAO,GAAG,IAAI,CAAC;YACnB,OAAO,OAAO,EAAE,CAAC;gBACf,OAAO,GAAG,KAAK,CAAC;gBAChB,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;oBAC7B,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;wBAAE,SAAS;oBACnC,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAC1C,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CACnD,CAAC;oBACF,IAAI,aAAa,EAAE,CAAC;wBAClB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;wBACrB,OAAO,GAAG,IAAI,CAAC;oBACjB,CAAC;gBACH,CAAC;YACH,CAAC;YACD,MAAM;QACR,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAE1C,cAAc;QACd,MAAM,KAAK,GAAG,OAAO,EAAE,gBAAgB,CAAC;QACxC,MAAM,OAAO,GAAiB,EAAE,CAAC;QACjC,IAAI,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC;gBAC7C,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;gBACvB,0CAA0C;gBAC1C,IAAI,aAAwD,CAAC;gBAC7D,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACnC,MAAM,cAAc,GAAG,IAAI,OAAO,CAAU,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;oBACxD,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;gBAC5E,CAAC,CAAC,CAAC;gBACH,IAAI,EAAW,CAAC;gBAChB,IAAI,CAAC;oBACH,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,CAAC;gBACzD,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,eAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,2BAA2B,CAAC,CAAC;oBACtE,EAAE,GAAG,KAAK,CAAC;gBACb,CAAC;wBAAS,CAAC;oBACT,IAAI,aAAa,EAAE,CAAC;wBAClB,YAAY,CAAC,aAAa,CAAC,CAAC;oBAC9B,CAAC;gBACH,CAAC;gBACD,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;YACtB,CAAC,CAAC,CACH,CAAC;YAEF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;oBACd,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAChC,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;QAChC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;QAC1B,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;QAC5B,MAAM;KACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"dag-engine.js","sourceRoot":"","sources":["../../src/core/dag-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { LayeredContextPackage } from "../graph/context-slicer.js";
2
+ import type { PromptContext } from "../routing/provider-executor.js";
3
+ import { type AgentDelegatedPlanInsight } from "./agent-delegation.js";
4
+ import type { OrchestrationInput, TaskRunResult, OrchestrateOptions } from "./types.js";
5
+ export declare function maybeBuildNearLosslessContext(input: OrchestrationInput, options?: OrchestrateOptions): Promise<LayeredContextPackage | undefined>;
6
+ export declare function appendContextFeedback(run: TaskRunResult, contextPackage?: LayeredContextPackage, promptContextLines?: number, options?: OrchestrateOptions): TaskRunResult;
7
+ export declare function buildPromptContext(contextPackage: LayeredContextPackage | undefined, skillHints: string[], episodeSummaries: string[], options?: OrchestrateOptions): PromptContext | undefined;
8
+ export declare function maybeBuildSkillHints(task: string, options?: OrchestrateOptions): Promise<string[]>;
9
+ export declare function maybeRunPlanInsightForComplex(task: string, options?: OrchestrateOptions): Promise<AgentDelegatedPlanInsight | undefined>;
10
+ //# sourceMappingURL=orchestrator-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator-context.d.ts","sourceRoot":"","sources":["../../src/core/orchestrator-context.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAGxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAkC,KAAK,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAEvG,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAGxF,wBAAsB,6BAA6B,CACjD,KAAK,EAAE,kBAAkB,EACzB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,CAyC5C;AAED,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,aAAa,EAClB,cAAc,CAAC,EAAE,qBAAqB,EACtC,kBAAkB,SAAI,EACtB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,aAAa,CAkBf;AAED,wBAAgB,kBAAkB,CAChC,cAAc,EAAE,qBAAqB,GAAG,SAAS,EACjD,UAAU,EAAE,MAAM,EAAE,EACpB,gBAAgB,EAAE,MAAM,EAAE,EAC1B,OAAO,CAAC,EAAE,kBAAkB,GAC3B,aAAa,GAAG,SAAS,CAoB3B;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAMxG;AAED,wBAAsB,6BAA6B,CACjD,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,yBAAyB,GAAG,SAAS,CAAC,CAoBhD"}
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.maybeBuildNearLosslessContext = maybeBuildNearLosslessContext;
4
+ exports.appendContextFeedback = appendContextFeedback;
5
+ exports.buildPromptContext = buildPromptContext;
6
+ exports.maybeBuildSkillHints = maybeBuildSkillHints;
7
+ exports.maybeRunPlanInsightForComplex = maybeRunPlanInsightForComplex;
8
+ const insight_js_1 = require("../agents/insight.js");
9
+ const resolve_js_1 = require("../config/resolve.js");
10
+ const llm_availability_js_1 = require("../config/llm-availability.js");
11
+ const env_js_1 = require("../surfaces/cli/runtime/env.js");
12
+ const skill_flywheel_js_1 = require("../learning/skill-flywheel.js");
13
+ const model_router_js_1 = require("../routing/model-router.js");
14
+ const agent_delegation_js_1 = require("./agent-delegation.js");
15
+ const triage_js_1 = require("./triage.js");
16
+ const logger_js_1 = require("../utils/logger.js");
17
+ async function maybeBuildNearLosslessContext(input, options) {
18
+ if (!options?.enableNearLosslessMode || !options.graphClient) {
19
+ return undefined;
20
+ }
21
+ const query = options.nearLosslessQuery ?? input.task;
22
+ const maxTokens = options.maxContextTokens ?? 1200;
23
+ const packageOptions = {
24
+ ...(options.layerQuota ? { layerQuota: options.layerQuota } : {}),
25
+ ...(options.embeddingProvider ? { embeddingProvider: options.embeddingProvider, enableVectorRecall: true } : {}),
26
+ // Graph-structure compression is zero-cost; enable by default unless explicitly disabled.
27
+ enableGraphCompression: options.enableGraphCompression !== false,
28
+ };
29
+ // Adaptive budget: derive task complexity from triage and let the package
30
+ // estimator resize the token budget. Auto-enable for complex tasks unless
31
+ // explicitly disabled via enableAdaptiveBudget: false.
32
+ const taskMode = (0, triage_js_1.triageTask)(input.task);
33
+ const enableAdaptiveBudget = options.enableAdaptiveBudget !== false &&
34
+ (options.enableAdaptiveBudget === true || taskMode === "complex");
35
+ if (enableAdaptiveBudget) {
36
+ packageOptions.taskMode = taskMode;
37
+ }
38
+ // RepoMap overview fallback for tight budgets (opt-in).
39
+ if (options.enableRepoMapFallback) {
40
+ packageOptions.enableRepoMapFallback = true;
41
+ }
42
+ const { buildEnhancedContextPackage } = await import("../graph/context-slicer.js");
43
+ const pkg = await buildEnhancedContextPackage(options.graphClient, query, input.task, maxTokens, packageOptions);
44
+ options.onContextPackage?.(pkg);
45
+ return pkg;
46
+ }
47
+ function appendContextFeedback(run, contextPackage, promptContextLines = 0, options) {
48
+ let next = run;
49
+ if (contextPackage) {
50
+ next = {
51
+ ...next,
52
+ feedback: `${next.feedback}; context(summary=${contextPackage.summaryChannel.length}, ` +
53
+ `anchors=${contextPackage.anchorChannel.length}, tokens=${contextPackage.tokenEstimate})`,
54
+ };
55
+ }
56
+ if (options?.enableGraphContextInPrompt) {
57
+ next = {
58
+ ...next,
59
+ feedback: `${next.feedback}; promptCtx(lines=${promptContextLines})`,
60
+ promptContextLines,
61
+ };
62
+ }
63
+ return next;
64
+ }
65
+ function buildPromptContext(contextPackage, skillHints, episodeSummaries, options) {
66
+ const includeGraph = options?.enableGraphContextInPrompt === true && contextPackage !== undefined;
67
+ const includeEpisodes = options?.enableEpisodicMemory === true && episodeSummaries.length > 0;
68
+ if (!includeGraph && !includeEpisodes) {
69
+ return undefined;
70
+ }
71
+ const ctx = {};
72
+ if (includeGraph && contextPackage && contextPackage.summaryChannel.length > 0) {
73
+ ctx.summaryChannel = contextPackage.summaryChannel;
74
+ }
75
+ if (includeGraph && skillHints.length > 0) {
76
+ ctx.skillHints = skillHints;
77
+ }
78
+ if (includeEpisodes) {
79
+ ctx.extraInstructions = [...episodeSummaries];
80
+ }
81
+ if (!ctx.summaryChannel && !ctx.skillHints && !ctx.extraInstructions) {
82
+ return undefined;
83
+ }
84
+ return ctx;
85
+ }
86
+ async function maybeBuildSkillHints(task, options) {
87
+ if (!options?.enableSkillFlywheel || !options.graphClient) {
88
+ return [];
89
+ }
90
+ return (0, skill_flywheel_js_1.suggestSkillHints)(options.graphClient, task, options.skillHintsLimit ?? 3);
91
+ }
92
+ async function maybeRunPlanInsightForComplex(task, options) {
93
+ try {
94
+ const config = (0, resolve_js_1.resolveConfig)(options?.configPath);
95
+ if (!(0, llm_availability_js_1.hasUsableLlmProvider)(config)) {
96
+ return (0, agent_delegation_js_1.buildAgentDelegatedPlanInsight)(task);
97
+ }
98
+ (0, env_js_1.applyOpenBmbRuntimeEnv)(config);
99
+ const selection = (0, model_router_js_1.resolveModelForRole)("planner");
100
+ const { insight, plan } = await (0, insight_js_1.planInsight)(task, { selection });
101
+ return {
102
+ mode: "llm",
103
+ insight,
104
+ plan,
105
+ };
106
+ }
107
+ catch (error) {
108
+ logger_js_1.logger.warn({ error, task }, "Plan insight failed, using agent-delegated heuristic");
109
+ return (0, agent_delegation_js_1.buildAgentDelegatedPlanInsight)(task);
110
+ }
111
+ }
112
+ //# sourceMappingURL=orchestrator-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator-context.js","sourceRoot":"","sources":["../../src/core/orchestrator-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { type EpisodeRecord } from "../learning/episodic-memory.js";
2
+ import type { TaskRunResult, TaskNode, OrchestrateOptions } from "./types.js";
3
+ /**
4
+ * 预置种子技能:在技能飞轮启用且显式开启 enableSeedSkills 时,
5
+ * 于 orchestrator 运行早期写入常见工程技能基线(原子 + 复合)。
6
+ * 幂等:已存在的技能节点会被跳过。失败不阻断主流程。
7
+ */
8
+ export declare function maybeSeedInitialSkills(options?: OrchestrateOptions): Promise<void>;
9
+ export declare function maybeFindSimilarEpisodes(task: string, options?: OrchestrateOptions): Promise<EpisodeRecord[]>;
10
+ export declare function maybeSyncGraph(task: string, run: TaskRunResult, options?: OrchestrateOptions): Promise<void>;
11
+ export declare function maybeSyncSkillGraph(task: string, run: TaskRunResult, options?: OrchestrateOptions): Promise<void>;
12
+ export declare function finalizeEpisode(task: string, plan: TaskNode[], run: TaskRunResult, similar: EpisodeRecord[], skillHints: string[], options?: OrchestrateOptions, triageId?: string): Promise<TaskRunResult>;
13
+ //# sourceMappingURL=orchestrator-episode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator-episode.d.ts","sourceRoot":"","sources":["../../src/core/orchestrator-episode.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,aAAa,EACnB,MAAM,gCAAgC,CAAC;AAKxC,OAAO,KAAK,EAAE,aAAa,EAAc,QAAQ,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAE1F;;;;GAIG;AACH,wBAAsB,sBAAsB,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAUxF;AAED,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,aAAa,EAAE,CAAC,CAO1B;AAED,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,aAAa,EAClB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAmBf;AAED,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,aAAa,EAClB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAaf;AASD,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,QAAQ,EAAE,EAChB,GAAG,EAAE,aAAa,EAClB,OAAO,EAAE,aAAa,EAAE,EACxB,UAAU,EAAE,MAAM,EAAE,EACpB,OAAO,CAAC,EAAE,kBAAkB,EAC5B,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,aAAa,CAAC,CAyDxB"}
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.maybeSeedInitialSkills = maybeSeedInitialSkills;
4
+ exports.maybeFindSimilarEpisodes = maybeFindSimilarEpisodes;
5
+ exports.maybeSyncGraph = maybeSyncGraph;
6
+ exports.maybeSyncSkillGraph = maybeSyncSkillGraph;
7
+ exports.finalizeEpisode = finalizeEpisode;
8
+ const post_run_sync_js_1 = require("../hooks/post-run-sync.js");
9
+ const episodic_memory_js_1 = require("../learning/episodic-memory.js");
10
+ const skill_flywheel_js_1 = require("../learning/skill-flywheel.js");
11
+ const seed_skills_js_1 = require("../learning/seed-skills.js");
12
+ const triage_telemetry_js_1 = require("../learning/triage-telemetry.js");
13
+ const logger_js_1 = require("../utils/logger.js");
14
+ /**
15
+ * 预置种子技能:在技能飞轮启用且显式开启 enableSeedSkills 时,
16
+ * 于 orchestrator 运行早期写入常见工程技能基线(原子 + 复合)。
17
+ * 幂等:已存在的技能节点会被跳过。失败不阻断主流程。
18
+ */
19
+ async function maybeSeedInitialSkills(options) {
20
+ if (!options?.enableSeedSkills || !options?.enableSkillFlywheel || !options.graphClient) {
21
+ return;
22
+ }
23
+ try {
24
+ await (0, seed_skills_js_1.seedInitialSkills)(options.graphClient);
25
+ }
26
+ catch (error) {
27
+ // 种子技能写入失败不应阻断编排主流程
28
+ logger_js_1.logger.warn({ error }, "Seed skills initialization failed");
29
+ }
30
+ }
31
+ async function maybeFindSimilarEpisodes(task, options) {
32
+ if (!options?.enableEpisodicMemory || !options.graphClient) {
33
+ return [];
34
+ }
35
+ // 透传 embedding provider 以启用语义检索(余弦相似度 + RRF 融合);
36
+ // 无 provider 时 findSimilarEpisodes 自动降级为纯 Jaccard。
37
+ return (0, episodic_memory_js_1.findSimilarEpisodes)(options.graphClient, task, 3, options.embeddingProvider);
38
+ }
39
+ async function maybeSyncGraph(task, run, options) {
40
+ if (!options?.graphClient || !options.enableAutoGraphSync) {
41
+ return;
42
+ }
43
+ if (run.status !== "COMPLETED") {
44
+ return;
45
+ }
46
+ await (0, post_run_sync_js_1.syncGraphAfterRun)(options.graphClient, [
47
+ {
48
+ filePath: "runtime:task",
49
+ summary: `Task completed: ${task}`,
50
+ },
51
+ ], options.configPath);
52
+ }
53
+ async function maybeSyncSkillGraph(task, run, options) {
54
+ if (!options?.enableSkillFlywheel || !options.graphClient) {
55
+ return;
56
+ }
57
+ // Bridge mode: task is delegated to an external agent whose outcome is unknown.
58
+ // Skip skill score updates until the external agent reports back via
59
+ // updateEpisodeOutcome + applySkillLearning. Otherwise every delegated task
60
+ // would be counted as a failure, permanently sinking skill scores to -20.
61
+ if (run.status === "DELEGATED") {
62
+ return;
63
+ }
64
+ await (0, skill_flywheel_js_1.applySkillLearning)(options.graphClient, task, run);
65
+ }
66
+ function statusToOutcome(status) {
67
+ if (status === "COMPLETED")
68
+ return "pass";
69
+ if (status === "HUMAN_REVIEW_REQUIRED")
70
+ return "human_review";
71
+ if (status === "DELEGATED")
72
+ return "pending";
73
+ return "fail";
74
+ }
75
+ async function finalizeEpisode(task, plan, run, similar, skillHints, options, triageId) {
76
+ // 回填 triage 实际结果(与 episodic memory 独立):只要图客户端可用且有 triageId 即执行。
77
+ // 记录实际步数、是否触发 drift replan、最终状态,用于 triage 准确率数据收集。
78
+ if (triageId && options?.graphClient) {
79
+ try {
80
+ await (0, triage_telemetry_js_1.backfillTriageOutcome)(options.graphClient, triageId, {
81
+ // 根据实际计划步数推断复杂度:多于 1 步视为 complex
82
+ actualMode: plan.length > 1 ? "complex" : "simple",
83
+ actualSteps: plan.length > 0 ? plan.length : run.attempts,
84
+ driftReplan: (run.replanRounds ?? 0) > 0,
85
+ replanRounds: run.replanRounds ?? 0,
86
+ finalStatus: run.status,
87
+ resolvedAt: Date.now(),
88
+ });
89
+ }
90
+ catch {
91
+ // 回填失败不阻断主流程
92
+ }
93
+ }
94
+ if (!options?.enableEpisodicMemory || !options.graphClient) {
95
+ return run;
96
+ }
97
+ const decisions = [];
98
+ for (const rd of run.routeDecisions ?? []) {
99
+ decisions.push(`route ${rd.role}: ${rd.provider}/${rd.model}`);
100
+ }
101
+ for (const hint of skillHints.slice(0, 3)) {
102
+ decisions.push(`skill: ${hint}`);
103
+ }
104
+ const dedupedDecisions = Array.from(new Set(decisions)).slice(0, 6);
105
+ const planProjection = plan.map((node) => ({ id: node.id, description: node.description }));
106
+ const recordInput = {
107
+ task,
108
+ plan: planProjection,
109
+ outcome: statusToOutcome(run.status),
110
+ keyDecisions: dedupedDecisions,
111
+ lessons: [],
112
+ attempts: run.attempts,
113
+ ...(run.executionRounds ? { executionRounds: run.executionRounds } : {}),
114
+ ...(run.feedback !== undefined ? { runFeedback: run.feedback } : {}),
115
+ };
116
+ const episode = await (0, episodic_memory_js_1.recordEpisode)(options.graphClient, recordInput, options.embeddingProvider);
117
+ const similarSummaries = similar.map((ep) => ({
118
+ id: ep.id,
119
+ task: ep.task,
120
+ score: ep.outcome === "pass" ? 1 : ep.outcome === "fail" ? -1 : 0,
121
+ }));
122
+ return {
123
+ ...run,
124
+ episodeId: episode.id,
125
+ similarEpisodes: similarSummaries,
126
+ };
127
+ }
128
+ //# sourceMappingURL=orchestrator-episode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator-episode.js","sourceRoot":"","sources":["../../src/core/orchestrator-episode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { type ProviderName, type ProviderHealthMap } from "../routing/model-router.js";
2
+ import type { RouteDecision, TaskRunResult } from "./types.js";
3
+ export declare function buildRouteDecisions(providerHealth?: ProviderHealthMap, providerFallbackChain?: ProviderName[], configPath?: string): {
4
+ planner: RouteDecision;
5
+ worker: RouteDecision;
6
+ validator: RouteDecision;
7
+ };
8
+ export declare function decisionToSelection(decision: RouteDecision): {
9
+ provider: "openai" | "anthropic" | "bailian" | "doubao";
10
+ model: string;
11
+ tier: "smart" | "economy";
12
+ fallbackApplied: boolean;
13
+ };
14
+ export declare function selectionIfHealthy(selection: ReturnType<typeof decisionToSelection>, providerHealth?: ProviderHealthMap): ReturnType<typeof decisionToSelection> | undefined;
15
+ export declare function appendRouteFeedback(run: TaskRunResult, routeDecisions: {
16
+ planner: RouteDecision;
17
+ worker: RouteDecision;
18
+ validator: RouteDecision;
19
+ }, skillHints: string[]): TaskRunResult;
20
+ //# sourceMappingURL=orchestrator-route.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator-route.d.ts","sourceRoot":"","sources":["../../src/core/orchestrator-route.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACvB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE/D,wBAAgB,mBAAmB,CACjC,cAAc,CAAC,EAAE,iBAAiB,EAClC,qBAAqB,CAAC,EAAE,YAAY,EAAE,EACtC,UAAU,CAAC,EAAE,MAAM,GAClB;IACD,OAAO,EAAE,aAAa,CAAC;IACvB,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,EAAE,aAAa,CAAC;CAC1B,CAWA;AAiBD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,aAAa,GAAG;IAC5D,QAAQ,EAAE,QAAQ,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC;IAC1B,eAAe,EAAE,OAAO,CAAC;CAC1B,CAOA;AAED,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,EACjD,cAAc,CAAC,EAAE,iBAAiB,GACjC,UAAU,CAAC,OAAO,mBAAmB,CAAC,GAAG,SAAS,CAKpD;AAED,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,aAAa,EAClB,cAAc,EAAE;IAAE,OAAO,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,aAAa,CAAC;IAAC,SAAS,EAAE,aAAa,CAAA;CAAE,EAC3F,UAAU,EAAE,MAAM,EAAE,GACnB,aAAa,CAUf"}