@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.
- package/README.md +1 -1
- package/dist/agents/insight.js +1 -1
- package/dist/agents/insight.js.map +1 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +1 -0
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/embedding-factory.d.ts.map +1 -1
- package/dist/config/embedding-factory.js +23 -12
- package/dist/config/embedding-factory.js.map +1 -1
- package/dist/config/loader.d.ts +11 -0
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +103 -0
- package/dist/config/loader.js.map +1 -1
- package/dist/core/agent-assignment.d.ts +39 -0
- package/dist/core/agent-assignment.d.ts.map +1 -0
- package/dist/core/agent-assignment.js +73 -0
- package/dist/core/agent-assignment.js.map +1 -0
- package/dist/core/dag-checkpoint.d.ts +83 -0
- package/dist/core/dag-checkpoint.d.ts.map +1 -0
- package/dist/core/dag-checkpoint.js +164 -0
- package/dist/core/dag-checkpoint.js.map +1 -0
- package/dist/core/dag-engine.d.ts +9 -0
- package/dist/core/dag-engine.d.ts.map +1 -1
- package/dist/core/dag-engine.js +42 -0
- package/dist/core/dag-engine.js.map +1 -1
- package/dist/core/orchestrator-context.d.ts +10 -0
- package/dist/core/orchestrator-context.d.ts.map +1 -0
- package/dist/core/orchestrator-context.js +112 -0
- package/dist/core/orchestrator-context.js.map +1 -0
- package/dist/core/orchestrator-episode.d.ts +13 -0
- package/dist/core/orchestrator-episode.d.ts.map +1 -0
- package/dist/core/orchestrator-episode.js +128 -0
- package/dist/core/orchestrator-episode.js.map +1 -0
- package/dist/core/orchestrator-route.d.ts +20 -0
- package/dist/core/orchestrator-route.d.ts.map +1 -0
- package/dist/core/orchestrator-route.js +51 -0
- package/dist/core/orchestrator-route.js.map +1 -0
- package/dist/core/orchestrator.d.ts +2 -38
- package/dist/core/orchestrator.d.ts.map +1 -1
- package/dist/core/orchestrator.js +97 -286
- package/dist/core/orchestrator.js.map +1 -1
- package/dist/core/triage.d.ts +21 -0
- package/dist/core/triage.d.ts.map +1 -1
- package/dist/core/triage.js +25 -6
- package/dist/core/triage.js.map +1 -1
- package/dist/core/types.d.ts +53 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/graph/context-slicer-types.d.ts +62 -0
- package/dist/graph/context-slicer-types.d.ts.map +1 -0
- package/dist/graph/context-slicer-types.js +13 -0
- package/dist/graph/context-slicer-types.js.map +1 -0
- package/dist/graph/context-slicer-utils.d.ts +24 -0
- package/dist/graph/context-slicer-utils.d.ts.map +1 -0
- package/dist/graph/context-slicer-utils.js +118 -0
- package/dist/graph/context-slicer-utils.js.map +1 -0
- package/dist/graph/context-slicer.d.ts +6 -61
- package/dist/graph/context-slicer.d.ts.map +1 -1
- package/dist/graph/context-slicer.js +73 -170
- package/dist/graph/context-slicer.js.map +1 -1
- package/dist/graph/file-indexer-cache.d.ts +34 -0
- package/dist/graph/file-indexer-cache.d.ts.map +1 -0
- package/dist/graph/file-indexer-cache.js +105 -0
- package/dist/graph/file-indexer-cache.js.map +1 -0
- package/dist/graph/file-indexer-edges.d.ts +55 -0
- package/dist/graph/file-indexer-edges.d.ts.map +1 -0
- package/dist/graph/file-indexer-edges.js +258 -0
- package/dist/graph/file-indexer-edges.js.map +1 -0
- package/dist/graph/file-indexer-nodes.d.ts +43 -0
- package/dist/graph/file-indexer-nodes.d.ts.map +1 -0
- package/dist/graph/file-indexer-nodes.js +137 -0
- package/dist/graph/file-indexer-nodes.js.map +1 -0
- package/dist/graph/file-indexer-walker.d.ts +35 -0
- package/dist/graph/file-indexer-walker.d.ts.map +1 -0
- package/dist/graph/file-indexer-walker.js +80 -0
- package/dist/graph/file-indexer-walker.js.map +1 -0
- package/dist/graph/file-indexer.d.ts +13 -39
- package/dist/graph/file-indexer.d.ts.map +1 -1
- package/dist/graph/file-indexer.js +167 -600
- package/dist/graph/file-indexer.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/integrations/agent-mcp-installer.d.ts +25 -1
- package/dist/integrations/agent-mcp-installer.d.ts.map +1 -1
- package/dist/integrations/agent-mcp-installer.js +160 -4
- package/dist/integrations/agent-mcp-installer.js.map +1 -1
- package/dist/integrations/skill-installer.d.ts +50 -0
- package/dist/integrations/skill-installer.d.ts.map +1 -0
- package/dist/integrations/skill-installer.js +373 -0
- package/dist/integrations/skill-installer.js.map +1 -0
- package/dist/learning/embeddings.d.ts +11 -0
- package/dist/learning/embeddings.d.ts.map +1 -1
- package/dist/learning/embeddings.js +24 -0
- package/dist/learning/embeddings.js.map +1 -1
- package/dist/learning/episodic-memory.d.ts +3 -2
- package/dist/learning/episodic-memory.d.ts.map +1 -1
- package/dist/learning/episodic-memory.js +105 -10
- package/dist/learning/episodic-memory.js.map +1 -1
- package/dist/learning/local-embedding.d.ts.map +1 -1
- package/dist/learning/local-embedding.js +16 -0
- package/dist/learning/local-embedding.js.map +1 -1
- package/dist/learning/seed-skills.d.ts +21 -0
- package/dist/learning/seed-skills.d.ts.map +1 -0
- package/dist/learning/seed-skills.js +113 -0
- package/dist/learning/seed-skills.js.map +1 -0
- package/dist/learning/skill-evolution.d.ts +1 -1
- package/dist/learning/skill-evolution.d.ts.map +1 -1
- package/dist/learning/skill-evolution.js +1 -1
- package/dist/learning/skill-evolution.js.map +1 -1
- package/dist/learning/skill-package.d.ts +55 -0
- package/dist/learning/skill-package.d.ts.map +1 -0
- package/dist/learning/skill-package.js +115 -0
- package/dist/learning/skill-package.js.map +1 -0
- package/dist/learning/triage-telemetry.d.ts +43 -0
- package/dist/learning/triage-telemetry.d.ts.map +1 -0
- package/dist/learning/triage-telemetry.js +114 -0
- package/dist/learning/triage-telemetry.js.map +1 -0
- package/dist/surfaces/cli/index.js +65 -0
- package/dist/surfaces/cli/index.js.map +1 -1
- package/dist/surfaces/cli/init.d.ts +12 -2
- package/dist/surfaces/cli/init.d.ts.map +1 -1
- package/dist/surfaces/cli/init.js +109 -30
- package/dist/surfaces/cli/init.js.map +1 -1
- package/dist/surfaces/cli/output.d.ts.map +1 -1
- package/dist/surfaces/cli/output.js +5 -0
- package/dist/surfaces/cli/output.js.map +1 -1
- package/dist/surfaces/cli/runtime/graph.d.ts +23 -0
- package/dist/surfaces/cli/runtime/graph.d.ts.map +1 -1
- package/dist/surfaces/cli/runtime/graph.js +40 -0
- package/dist/surfaces/cli/runtime/graph.js.map +1 -1
- package/dist/surfaces/cli/runtime/routing.d.ts.map +1 -1
- package/dist/surfaces/cli/runtime/routing.js +8 -1
- package/dist/surfaces/cli/runtime/routing.js.map +1 -1
- package/dist/surfaces/cli/runtime.d.ts +1 -1
- package/dist/surfaces/cli/runtime.d.ts.map +1 -1
- package/dist/surfaces/cli/runtime.js +4 -1
- package/dist/surfaces/cli/runtime.js.map +1 -1
- package/dist/surfaces/mcp/tool-definitions.js +20 -20
- package/dist/surfaces/mcp/tool-definitions.js.map +1 -1
- package/package.json +3 -3
- 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;
|
|
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"}
|
package/dist/core/dag-engine.js
CHANGED
|
@@ -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":";;
|
|
1
|
+
{"version":3,"file":"dag-engine.js","sourceRoot":"","sources":["../../src/core/dag-engine.ts"],"names":[],"mappings":";;AA2BA,gCA0JC;AArLD,4CAAyC;AAGzC,qDAA+D;AAwBxD,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,wCAAwC;IACxC,MAAM,WAAW,GAAG,OAAO,EAAE,WAAW,CAAC;IACzC,MAAM,gBAAgB,GAAG,OAAO,EAAE,gBAAgB,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC;IAC3E,IAAI,UAAqC,CAAC;IAC1C,IAAI,KAAyB,CAAC;IAC9B,MAAM,sBAAsB,GAAa,EAAE,CAAC;IAE5C,IAAI,gBAAgB,IAAI,WAAW,EAAE,CAAC;QACpC,IAAI,CAAC;YACH,UAAU,GAAG,IAAI,8BAAa,CAAC,WAAW,CAAC,CAAC;YAC5C,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,IAAA,6BAAY,EAAC,IAAI,CAAC,CAAC;YAC7C,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YACxD,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACvC,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;oBACjC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;oBACtB,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACtC,CAAC;qBAAM,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;oBACrC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;oBACnB,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACtC,CAAC;YACH,CAAC;YACD,IAAI,sBAAsB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtC,eAAM,CAAC,IAAI,CACT,EAAE,KAAK,EAAE,QAAQ,EAAE,sBAAsB,CAAC,MAAM,EAAE,EAClD,2BAA2B,CAC5B,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,eAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,+BAA+B,CAAC,CAAC;YACxD,UAAU,GAAG,SAAS,CAAC;YACvB,KAAK,GAAG,SAAS,CAAC;QACpB,CAAC;IACH,CAAC;IAED,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;gBACD,uCAAuC;gBACvC,IAAI,UAAU,IAAI,KAAK,EAAE,CAAC;oBACxB,IAAI,CAAC;wBACH,MAAM,UAAU,CAAC,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;oBACrE,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,eAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,sBAAsB,CAAC,CAAC;oBACzE,CAAC;gBACH,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;QACN,GAAG,CAAC,sBAAsB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,sBAAsB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACzE,CAAC;AACJ,CAAC"}
|
|
@@ -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":";;AAiBA,wDAUC;AAED,4DAUC;AAED,wCAuBC;AAED,kDAiBC;AASD,0CAiEC;AA7JD,gEAA8D;AAC9D,uEAIwC;AACxC,qEAAmE;AACnE,+DAA+D;AAC/D,yEAAwE;AACxE,kDAA4C;AAG5C;;;;GAIG;AACI,KAAK,UAAU,sBAAsB,CAAC,OAA4B;IACvE,IAAI,CAAC,OAAO,EAAE,gBAAgB,IAAI,CAAC,OAAO,EAAE,mBAAmB,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QACxF,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,MAAM,IAAA,kCAAiB,EAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,oBAAoB;QACpB,kBAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,mCAAmC,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,wBAAwB,CAC5C,IAAY,EACZ,OAA4B;IAE5B,IAAI,CAAC,OAAO,EAAE,oBAAoB,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAC3D,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,iDAAiD;IACjD,mDAAmD;IACnD,OAAO,IAAA,wCAAmB,EAAC,OAAO,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;AACtF,CAAC;AAEM,KAAK,UAAU,cAAc,CAClC,IAAY,EACZ,GAAkB,EAClB,OAA4B;IAE5B,IAAI,CAAC,OAAO,EAAE,WAAW,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC;QAC1D,OAAO;IACT,CAAC;IAED,IAAI,GAAG,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QAC/B,OAAO;IACT,CAAC;IAED,MAAM,IAAA,oCAAiB,EACrB,OAAO,CAAC,WAAW,EACnB;QACE;YACE,QAAQ,EAAE,cAAc;YACxB,OAAO,EAAE,mBAAmB,IAAI,EAAE;SACnC;KACF,EACD,OAAO,CAAC,UAAU,CACnB,CAAC;AACJ,CAAC;AAEM,KAAK,UAAU,mBAAmB,CACvC,IAAY,EACZ,GAAkB,EAClB,OAA4B;IAE5B,IAAI,CAAC,OAAO,EAAE,mBAAmB,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAC1D,OAAO;IACT,CAAC;IACD,gFAAgF;IAChF,qEAAqE;IACrE,4EAA4E;IAC5E,0EAA0E;IAC1E,IAAI,GAAG,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QAC/B,OAAO;IACT,CAAC;IAED,MAAM,IAAA,sCAAkB,EAAC,OAAO,CAAC,WAAW,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,eAAe,CAAC,MAAkB;IACzC,IAAI,MAAM,KAAK,WAAW;QAAE,OAAO,MAAM,CAAC;IAC1C,IAAI,MAAM,KAAK,uBAAuB;QAAE,OAAO,cAAc,CAAC;IAC9D,IAAI,MAAM,KAAK,WAAW;QAAE,OAAO,SAAS,CAAC;IAC7C,OAAO,MAAM,CAAC;AAChB,CAAC;AAEM,KAAK,UAAU,eAAe,CACnC,IAAY,EACZ,IAAgB,EAChB,GAAkB,EAClB,OAAwB,EACxB,UAAoB,EACpB,OAA4B,EAC5B,QAAiB;IAEjB,gEAAgE;IAChE,mDAAmD;IACnD,IAAI,QAAQ,IAAI,OAAO,EAAE,WAAW,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,IAAA,2CAAqB,EAAC,OAAO,CAAC,WAAW,EAAE,QAAQ,EAAE;gBACzD,iCAAiC;gBACjC,UAAU,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ;gBAClD,WAAW,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ;gBACzD,WAAW,EAAE,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,CAAC,GAAG,CAAC;gBACxC,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,CAAC;gBACnC,WAAW,EAAE,GAAG,CAAC,MAAM;gBACvB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;aACvB,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,aAAa;QACf,CAAC;IACH,CAAC;IAED,IAAI,CAAC,OAAO,EAAE,oBAAoB,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAC3D,OAAO,GAAG,CAAC;IACb,CAAC;IAED,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,cAAc,IAAI,EAAE,EAAE,CAAC;QAC1C,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,QAAQ,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;IACjE,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QAC1C,SAAS,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;IACnC,CAAC;IACD,MAAM,gBAAgB,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEpE,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAC5F,MAAM,WAAW,GAAwC;QACvD,IAAI;QACJ,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC;QACpC,YAAY,EAAE,gBAAgB;QAC9B,OAAO,EAAE,EAAE;QACX,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxE,GAAG,CAAC,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACrE,CAAC;IAEF,MAAM,OAAO,GAAG,MAAM,IAAA,kCAAa,EAAC,OAAO,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAEjG,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5C,EAAE,EAAE,EAAE,CAAC,EAAE;QACT,IAAI,EAAE,EAAE,CAAC,IAAI;QACb,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KAClE,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,GAAG,GAAG;QACN,SAAS,EAAE,OAAO,CAAC,EAAE;QACrB,eAAe,EAAE,gBAAgB;KAClC,CAAC;AACJ,CAAC"}
|
|
@@ -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"}
|