@roarpeng/graphflow 1.1.0 → 1.3.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 (153) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +49 -3
  3. package/dist/agents/insight.js +5 -3
  4. package/dist/agents/insight.js.map +1 -1
  5. package/dist/agents/planner.d.ts.map +1 -1
  6. package/dist/agents/planner.js +7 -2
  7. package/dist/agents/planner.js.map +1 -1
  8. package/dist/config/defaults.d.ts.map +1 -1
  9. package/dist/config/defaults.js +1 -0
  10. package/dist/config/defaults.js.map +1 -1
  11. package/dist/config/embedding-factory.d.ts.map +1 -1
  12. package/dist/config/embedding-factory.js +23 -12
  13. package/dist/config/embedding-factory.js.map +1 -1
  14. package/dist/config/loader.d.ts +11 -0
  15. package/dist/config/loader.d.ts.map +1 -1
  16. package/dist/config/loader.js +103 -0
  17. package/dist/config/loader.js.map +1 -1
  18. package/dist/core/agent-assignment.d.ts +39 -0
  19. package/dist/core/agent-assignment.d.ts.map +1 -0
  20. package/dist/core/agent-assignment.js +73 -0
  21. package/dist/core/agent-assignment.js.map +1 -0
  22. package/dist/core/agent-delegation.d.ts +1 -0
  23. package/dist/core/agent-delegation.d.ts.map +1 -1
  24. package/dist/core/agent-delegation.js +30 -1
  25. package/dist/core/agent-delegation.js.map +1 -1
  26. package/dist/core/dag-checkpoint.d.ts +83 -0
  27. package/dist/core/dag-checkpoint.d.ts.map +1 -0
  28. package/dist/core/dag-checkpoint.js +164 -0
  29. package/dist/core/dag-checkpoint.js.map +1 -0
  30. package/dist/core/dag-engine.d.ts +9 -0
  31. package/dist/core/dag-engine.d.ts.map +1 -1
  32. package/dist/core/dag-engine.js +42 -0
  33. package/dist/core/dag-engine.js.map +1 -1
  34. package/dist/core/merge-agent-insight.d.ts.map +1 -1
  35. package/dist/core/merge-agent-insight.js +39 -8
  36. package/dist/core/merge-agent-insight.js.map +1 -1
  37. package/dist/core/orchestrator-context.d.ts +10 -0
  38. package/dist/core/orchestrator-context.d.ts.map +1 -0
  39. package/dist/core/orchestrator-context.js +112 -0
  40. package/dist/core/orchestrator-context.js.map +1 -0
  41. package/dist/core/orchestrator-episode.d.ts +13 -0
  42. package/dist/core/orchestrator-episode.d.ts.map +1 -0
  43. package/dist/core/orchestrator-episode.js +128 -0
  44. package/dist/core/orchestrator-episode.js.map +1 -0
  45. package/dist/core/orchestrator-route.d.ts +20 -0
  46. package/dist/core/orchestrator-route.d.ts.map +1 -0
  47. package/dist/core/orchestrator-route.js +51 -0
  48. package/dist/core/orchestrator-route.js.map +1 -0
  49. package/dist/core/orchestrator.d.ts +2 -38
  50. package/dist/core/orchestrator.d.ts.map +1 -1
  51. package/dist/core/orchestrator.js +97 -286
  52. package/dist/core/orchestrator.js.map +1 -1
  53. package/dist/core/triage.d.ts +21 -0
  54. package/dist/core/triage.d.ts.map +1 -1
  55. package/dist/core/triage.js +25 -6
  56. package/dist/core/triage.js.map +1 -1
  57. package/dist/core/types.d.ts +53 -0
  58. package/dist/core/types.d.ts.map +1 -1
  59. package/dist/graph/context-slicer-types.d.ts +62 -0
  60. package/dist/graph/context-slicer-types.d.ts.map +1 -0
  61. package/dist/graph/context-slicer-types.js +13 -0
  62. package/dist/graph/context-slicer-types.js.map +1 -0
  63. package/dist/graph/context-slicer-utils.d.ts +24 -0
  64. package/dist/graph/context-slicer-utils.d.ts.map +1 -0
  65. package/dist/graph/context-slicer-utils.js +118 -0
  66. package/dist/graph/context-slicer-utils.js.map +1 -0
  67. package/dist/graph/context-slicer.d.ts +6 -61
  68. package/dist/graph/context-slicer.d.ts.map +1 -1
  69. package/dist/graph/context-slicer.js +73 -170
  70. package/dist/graph/context-slicer.js.map +1 -1
  71. package/dist/graph/file-indexer-cache.d.ts +34 -0
  72. package/dist/graph/file-indexer-cache.d.ts.map +1 -0
  73. package/dist/graph/file-indexer-cache.js +105 -0
  74. package/dist/graph/file-indexer-cache.js.map +1 -0
  75. package/dist/graph/file-indexer-edges.d.ts +55 -0
  76. package/dist/graph/file-indexer-edges.d.ts.map +1 -0
  77. package/dist/graph/file-indexer-edges.js +258 -0
  78. package/dist/graph/file-indexer-edges.js.map +1 -0
  79. package/dist/graph/file-indexer-nodes.d.ts +43 -0
  80. package/dist/graph/file-indexer-nodes.d.ts.map +1 -0
  81. package/dist/graph/file-indexer-nodes.js +137 -0
  82. package/dist/graph/file-indexer-nodes.js.map +1 -0
  83. package/dist/graph/file-indexer-walker.d.ts +35 -0
  84. package/dist/graph/file-indexer-walker.d.ts.map +1 -0
  85. package/dist/graph/file-indexer-walker.js +80 -0
  86. package/dist/graph/file-indexer-walker.js.map +1 -0
  87. package/dist/graph/file-indexer.d.ts +13 -39
  88. package/dist/graph/file-indexer.d.ts.map +1 -1
  89. package/dist/graph/file-indexer.js +167 -600
  90. package/dist/graph/file-indexer.js.map +1 -1
  91. package/dist/index.d.ts +1 -1
  92. package/dist/index.d.ts.map +1 -1
  93. package/dist/index.js +2 -1
  94. package/dist/index.js.map +1 -1
  95. package/dist/integrations/agent-mcp-installer.d.ts +25 -1
  96. package/dist/integrations/agent-mcp-installer.d.ts.map +1 -1
  97. package/dist/integrations/agent-mcp-installer.js +174 -13
  98. package/dist/integrations/agent-mcp-installer.js.map +1 -1
  99. package/dist/integrations/skill-installer.d.ts +80 -0
  100. package/dist/integrations/skill-installer.d.ts.map +1 -0
  101. package/dist/integrations/skill-installer.js +612 -0
  102. package/dist/integrations/skill-installer.js.map +1 -0
  103. package/dist/learning/embeddings.d.ts +11 -0
  104. package/dist/learning/embeddings.d.ts.map +1 -1
  105. package/dist/learning/embeddings.js +24 -0
  106. package/dist/learning/embeddings.js.map +1 -1
  107. package/dist/learning/episodic-memory.d.ts +3 -2
  108. package/dist/learning/episodic-memory.d.ts.map +1 -1
  109. package/dist/learning/episodic-memory.js +105 -10
  110. package/dist/learning/episodic-memory.js.map +1 -1
  111. package/dist/learning/local-embedding.d.ts.map +1 -1
  112. package/dist/learning/local-embedding.js +16 -0
  113. package/dist/learning/local-embedding.js.map +1 -1
  114. package/dist/learning/seed-skills.d.ts +21 -0
  115. package/dist/learning/seed-skills.d.ts.map +1 -0
  116. package/dist/learning/seed-skills.js +113 -0
  117. package/dist/learning/seed-skills.js.map +1 -0
  118. package/dist/learning/skill-evolution.d.ts +1 -1
  119. package/dist/learning/skill-evolution.d.ts.map +1 -1
  120. package/dist/learning/skill-evolution.js +1 -1
  121. package/dist/learning/skill-evolution.js.map +1 -1
  122. package/dist/learning/skill-package.d.ts +55 -0
  123. package/dist/learning/skill-package.d.ts.map +1 -0
  124. package/dist/learning/skill-package.js +115 -0
  125. package/dist/learning/skill-package.js.map +1 -0
  126. package/dist/learning/triage-telemetry.d.ts +43 -0
  127. package/dist/learning/triage-telemetry.d.ts.map +1 -0
  128. package/dist/learning/triage-telemetry.js +114 -0
  129. package/dist/learning/triage-telemetry.js.map +1 -0
  130. package/dist/surfaces/cli/index.js +74 -0
  131. package/dist/surfaces/cli/index.js.map +1 -1
  132. package/dist/surfaces/cli/init.d.ts +28 -2
  133. package/dist/surfaces/cli/init.d.ts.map +1 -1
  134. package/dist/surfaces/cli/init.js +163 -30
  135. package/dist/surfaces/cli/init.js.map +1 -1
  136. package/dist/surfaces/cli/output.d.ts.map +1 -1
  137. package/dist/surfaces/cli/output.js +6 -0
  138. package/dist/surfaces/cli/output.js.map +1 -1
  139. package/dist/surfaces/cli/runtime/graph.d.ts +23 -0
  140. package/dist/surfaces/cli/runtime/graph.d.ts.map +1 -1
  141. package/dist/surfaces/cli/runtime/graph.js +40 -0
  142. package/dist/surfaces/cli/runtime/graph.js.map +1 -1
  143. package/dist/surfaces/cli/runtime/routing.d.ts.map +1 -1
  144. package/dist/surfaces/cli/runtime/routing.js +8 -1
  145. package/dist/surfaces/cli/runtime/routing.js.map +1 -1
  146. package/dist/surfaces/cli/runtime.d.ts +1 -1
  147. package/dist/surfaces/cli/runtime.d.ts.map +1 -1
  148. package/dist/surfaces/cli/runtime.js +4 -1
  149. package/dist/surfaces/cli/runtime.js.map +1 -1
  150. package/dist/surfaces/mcp/tool-definitions.js +20 -20
  151. package/dist/surfaces/mcp/tool-definitions.js.map +1 -1
  152. package/package.json +4 -3
  153. package/scripts/safe-postinstall.cjs +323 -5
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ /**
3
+ * agent-assignment.ts — 多 Agent 协作编排基础
4
+ *
5
+ * 基于任务描述关键词自动为 DAG 节点分配建议的 agent 专业领域(AgentSpecialty)。
6
+ * 这是规划阶段的标注框架,不涉及真正的多 agent 执行,只标注建议的 agent 角色,
7
+ * 供 executionDescriptor 携带,方便外部编排器 / 人工决策参考。
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.inferAgentSpecialty = inferAgentSpecialty;
11
+ exports.assignAgentsToTasks = assignAgentsToTasks;
12
+ exports.buildAgentAssignments = buildAgentAssignments;
13
+ /** 各专业领域的关键词匹配规则(小写匹配) */
14
+ const SPECIALTY_KEYWORDS = {
15
+ testing: ["test", "testing", "spec", "vitest", "jest", "unit test", "e2e", "coverage"],
16
+ frontend: ["ui", "component", "css", "style", "react", "vue", "dom", "layout", "render", "view"],
17
+ backend: ["api", "server", "database", "model", "endpoint", "route", "service", "schema", "migration", "orm"],
18
+ docs: ["doc", "readme", "changelog", "documentation", "guide", "tutorial", "wiki"],
19
+ };
20
+ /**
21
+ * 根据任务描述推断建议的 agent 专业领域。
22
+ *
23
+ * 匹配优先级:testing > frontend > backend > docs > general。
24
+ * 当多个领域都匹配时,取第一个命中的领域(按上述优先级顺序)。
25
+ *
26
+ * @param description 任务描述
27
+ * @returns 建议的 AgentSpecialty
28
+ */
29
+ function inferAgentSpecialty(description) {
30
+ const text = (description ?? "").toLowerCase();
31
+ if (!text) {
32
+ return "general";
33
+ }
34
+ const order = ["testing", "frontend", "backend", "docs"];
35
+ for (const specialty of order) {
36
+ const keywords = SPECIALTY_KEYWORDS[specialty];
37
+ if (keywords.some((kw) => text.includes(kw))) {
38
+ return specialty;
39
+ }
40
+ }
41
+ return "general";
42
+ }
43
+ /**
44
+ * 为 DAG 任务节点列表自动分配建议的 agent 专业领域。
45
+ *
46
+ * 该函数不修改原始节点对象,返回带有 assignedAgent 字段的新节点数组。
47
+ * 如果节点已显式指定 assignedAgent,则保留原值不覆盖。
48
+ *
49
+ * @param nodes DAG 任务节点列表
50
+ * @returns 标注了 assignedAgent 的新节点列表
51
+ */
52
+ function assignAgentsToTasks(nodes) {
53
+ return nodes.map((node) => {
54
+ // 已显式指定的不覆盖
55
+ if (node.assignedAgent) {
56
+ return node;
57
+ }
58
+ const specialty = inferAgentSpecialty(node.description);
59
+ return { ...node, assignedAgent: specialty };
60
+ });
61
+ }
62
+ /**
63
+ * 将任务节点列表转换为 executionDescriptor 使用的 agent 分配映射。
64
+ *
65
+ * @param nodes 已分配 agent 的任务节点列表
66
+ * @returns agent 分配映射数组
67
+ */
68
+ function buildAgentAssignments(nodes) {
69
+ return nodes
70
+ .filter((node) => Boolean(node.assignedAgent))
71
+ .map((node) => ({ taskId: node.id, specialty: node.assignedAgent }));
72
+ }
73
+ //# sourceMappingURL=agent-assignment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-assignment.js","sourceRoot":"","sources":["../../src/core/agent-assignment.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAqBH,kDAeC;AAWD,kDASC;AAQD,sDAMC;AAlED,0BAA0B;AAC1B,MAAM,kBAAkB,GAAyD;IAC/E,OAAO,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,CAAC;IACtF,QAAQ,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC;IAChG,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,CAAC;IAC7G,IAAI,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,eAAe,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC;CACnF,CAAC;AAEF;;;;;;;;GAQG;AACH,SAAgB,mBAAmB,CAAC,WAAmB;IACrD,MAAM,IAAI,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC/C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,KAAK,GAAyC,CAAC,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IAC/F,KAAK,MAAM,SAAS,IAAI,KAAK,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAC/C,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YAC7C,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,mBAAmB,CAAC,KAAiB;IACnD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACxB,YAAY;QACZ,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,SAAS,GAAG,mBAAmB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACxD,OAAO,EAAE,GAAG,IAAI,EAAE,aAAa,EAAE,SAAS,EAAE,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,SAAgB,qBAAqB,CACnC,KAAiB;IAEjB,OAAO,KAAK;SACT,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;SAC7C,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,aAAc,EAAE,CAAC,CAAC,CAAC;AAC1E,CAAC"}
@@ -7,6 +7,7 @@ export interface AgentWorkItem {
7
7
  prompt: string;
8
8
  expectedFormat: "json";
9
9
  responseSchema: Record<string, unknown>;
10
+ optional?: boolean;
10
11
  }
11
12
  export type AgentDelegationMode = "llm" | "agent-delegated" | "heuristic";
12
13
  export interface AgentDelegatedPlanInsight {
@@ -1 +1 @@
1
- {"version":3,"file":"agent-delegation.d.ts","sourceRoot":"","sources":["../../src/core/agent-delegation.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,UAAU,GAAG,WAAW,GAAG,iBAAiB,CAAC;IACnD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACzC;AAED,MAAM,MAAM,mBAAmB,GAAG,KAAK,GAAG,iBAAiB,GAAG,WAAW,CAAC;AAE1E,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,mBAAmB,CAAC;IAC1B,OAAO,EAAE,cAAc,CAAC;IACxB,IAAI,EAAE,QAAQ,EAAE,CAAC;IACjB,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;IACjC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAQD,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE,CA4BxE;AAED,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,aAAa,EAAE,GACzB,MAAM,CAgBR;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,QAAQ,EAAE,CAwB/F;AAED,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,MAAM,GAAG,yBAAyB,CAYtF;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAO1E"}
1
+ {"version":3,"file":"agent-delegation.d.ts","sourceRoot":"","sources":["../../src/core/agent-delegation.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,UAAU,GAAG,WAAW,GAAG,iBAAiB,CAAC;IACnD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,MAAM,mBAAmB,GAAG,KAAK,GAAG,iBAAiB,GAAG,WAAW,CAAC;AAE1E,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,mBAAmB,CAAC;IAC1B,OAAO,EAAE,cAAc,CAAC;IACxB,IAAI,EAAE,QAAQ,EAAE,CAAC;IACjB,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;IACjC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAQD,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE,CA0DxE;AAED,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,aAAa,EAAE,GACzB,MAAM,CAkBR;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,QAAQ,EAAE,CAwB/F;AAED,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,MAAM,GAAG,yBAAyB,CAYtF;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAO1E"}
@@ -21,6 +21,35 @@ function buildAgentInsightWorkItems(task) {
21
21
  expectedFormat: "json",
22
22
  responseSchema: HAT_RESPONSE_SCHEMA,
23
23
  }));
24
+ insight_1.SIX_HATS.forEach((hat, index) => {
25
+ items.push({
26
+ id: `why-${index + 1}-${hat.color}`,
27
+ kind: "five-whys",
28
+ hat: hat.name,
29
+ optional: true,
30
+ prompt: [
31
+ `Task: ${task}`,
32
+ "",
33
+ `[OPTIONAL — only answer if your ${hat.name} observation had certainty < 0.6]`,
34
+ `You are drilling into your ${hat.name} observation with a 5-Why chain.`,
35
+ `Focus per step: ${hat.whyFocus}`,
36
+ `Final convergence: ${hat.whyRootFocus}`,
37
+ "",
38
+ "Produce up to 5 Why steps, each a {question, answer}, then the converged rootCause.",
39
+ "Return ONLY a JSON object:",
40
+ "{",
41
+ ' "steps": [{"question": "Why ...?", "answer": "..."}],',
42
+ ' "rootCause": "the single root cause this chain converges to"',
43
+ "}",
44
+ "If the hat's certainty was >= 0.6, skip this item (do not submit).",
45
+ ].join("\n"),
46
+ expectedFormat: "json",
47
+ responseSchema: {
48
+ steps: "Array<{question:string, answer:string}>",
49
+ rootCause: "string — the converged root cause",
50
+ },
51
+ });
52
+ });
24
53
  items.push({
25
54
  id: "plan-refinement",
26
55
  kind: "plan-refinement",
@@ -50,7 +79,7 @@ function buildAgentDelegationInstructions(task, workItems) {
50
79
  "Work items:",
51
80
  ];
52
81
  for (const item of workItems) {
53
- lines.push(`- ${item.id} (${item.kind}${item.hat ? ` / ${item.hat}` : ""})`);
82
+ lines.push(`- ${item.id} (${item.kind}${item.hat ? ` / ${item.hat}` : ""})${item.optional ? " [optional]" : ""}`);
54
83
  }
55
84
  return lines.join("\n");
56
85
  }
@@ -1 +1 @@
1
- {"version":3,"file":"agent-delegation.js","sourceRoot":"","sources":["../../src/core/agent-delegation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-delegation.js","sourceRoot":"","sources":["../../src/core/agent-delegation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * dag-checkpoint.ts — DAG 执行状态持久化(Checkpoint)
3
+ *
4
+ * 在每个 DAG 节点执行完成后,将节点状态(id, status, result, retryCount, executedAt)
5
+ * 持久化到图存储中(作为 TaskRun 类型的 GraphNode)。
6
+ *
7
+ * Checkpoint ID 使用 `dag:${taskHash}` 格式:
8
+ * - taskHash 由 DAG 计划(节点 id / 描述 / 依赖)计算得出,保证同一计划可恢复。
9
+ * - 整个 DAG 的 checkpoint 以单个 TaskRun GraphNode 的形式存储,content 字段为 JSON。
10
+ *
11
+ * 向后兼容:当图存储不支持 checkpoint 所需操作(getNodesByIds / upsertNodes)时,
12
+ * 所有 checkpoint 操作都会优雅降级为纯内存执行,不会抛出错误。
13
+ */
14
+ import type { TaskNode } from "./types";
15
+ import type { GraphClient } from "../graph/client-factory";
16
+ /** 单个节点的 checkpoint 状态快照 */
17
+ export interface CheckpointNodeState {
18
+ /** 节点 id */
19
+ id: string;
20
+ /** 节点最终状态 */
21
+ status: "COMPLETED" | "FAILED";
22
+ /** 执行结果(成功 / 失败) */
23
+ result: boolean;
24
+ /** 节点重试次数 */
25
+ retryCount: number;
26
+ /** 执行完成时间(ISO 字符串) */
27
+ executedAt: string;
28
+ }
29
+ /**
30
+ * 计算 DAG 计划的任务哈希。
31
+ *
32
+ * 哈希输入为所有节点的 id / description / dependencies 的规范化拼接,
33
+ * 保证相同计划产生相同哈希,从而命中同一 checkpoint。
34
+ */
35
+ export declare function computeTaskHash(plan: TaskNode[]): string;
36
+ /**
37
+ * 根据计划生成 checkpoint ID,格式 `dag:${taskHash}`。
38
+ */
39
+ export declare function computeDagId(plan: TaskNode[]): string;
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
+ export declare class DagCheckpoint {
53
+ private readonly graphClient;
54
+ /** 内存缓存:nodeId -> 节点状态。避免每次保存都重复读取图存储。 */
55
+ private readonly cache;
56
+ /** 是否已从图存储加载过一次 */
57
+ private hydrated;
58
+ constructor(graphClient: GraphClient);
59
+ /**
60
+ * 从图存储加载 checkpoint,返回已完成节点的状态映射。
61
+ *
62
+ * 多次调用只会读取一次图存储,后续返回内存缓存。
63
+ * 如果图存储不支持 getNodesByIds 或读取失败,返回空映射(优雅降级)。
64
+ */
65
+ loadCheckpoint(dagId: string): Promise<Map<string, CheckpointNodeState>>;
66
+ /**
67
+ * 持久化单个节点的完成状态到图存储。
68
+ *
69
+ * 内部维护内存缓存,每次保存都会将完整 checkpoint 重新写入图存储,
70
+ * 保证崩溃后可从最近一次保存点恢复。
71
+ */
72
+ saveNodeCompletion(dagId: string, node: TaskNode, result: boolean): Promise<void>;
73
+ /**
74
+ * 清除指定 DAG 的 checkpoint(例如全部完成后清理)。
75
+ * 图存储支持 deleteNode 时才生效。
76
+ */
77
+ clearCheckpoint(dagId: string): Promise<void>;
78
+ /** 从图存储读取 checkpoint 内容并填充内存缓存。 */
79
+ private hydrate;
80
+ /** 将当前内存缓存写入图存储(单个 TaskRun GraphNode)。 */
81
+ private persist;
82
+ }
83
+ //# sourceMappingURL=dag-checkpoint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dag-checkpoint.d.ts","sourceRoot":"","sources":["../../src/core/dag-checkpoint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAG3D,4BAA4B;AAC5B,MAAM,WAAW,mBAAmB;IAClC,YAAY;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,aAAa;IACb,MAAM,EAAE,WAAW,GAAG,QAAQ,CAAC;IAC/B,oBAAoB;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,sBAAsB;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAQD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,CAMxD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,CAErD;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,aAAa;IAMZ,OAAO,CAAC,QAAQ,CAAC,WAAW;IALxC,0CAA0C;IAC1C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA0C;IAChE,mBAAmB;IACnB,OAAO,CAAC,QAAQ,CAAS;gBAEI,WAAW,EAAE,WAAW;IAErD;;;;;OAKG;IACG,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IAY9E;;;;;OAKG;IACG,kBAAkB,CACtB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,OAAO,GACd,OAAO,CAAC,IAAI,CAAC;IAkBhB;;;OAGG;IACG,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYnD,mCAAmC;YACrB,OAAO;IAqBrB,0CAA0C;YAC5B,OAAO;CAsBtB"}
@@ -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":"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"}
1
+ {"version":3,"file":"dag-engine.js","sourceRoot":"","sources":["../../src/core/dag-engine.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"merge-agent-insight.d.ts","sourceRoot":"","sources":["../../src/core/merge-agent-insight.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,cAAc,EAAwB,MAAM,mBAAmB,CAAC;AAKxF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,OAAO,KAAK,EAAa,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGnD,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,cAAc,CAAC;IACxB,IAAI,EAAE,QAAQ,EAAE,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;CACxB;AAuCD,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAc/B;AA+DD,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,kBAAkB,EAAE,GAC5B,wBAAwB,CA+D1B;AAED,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,wBAAwB,CAAC,CAGnC"}
1
+ {"version":3,"file":"merge-agent-insight.d.ts","sourceRoot":"","sources":["../../src/core/merge-agent-insight.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,cAAc,EAGpB,MAAM,mBAAmB,CAAC;AAK3B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,OAAO,KAAK,EAAa,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGnD,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,cAAc,CAAC;IACxB,IAAI,EAAE,QAAQ,EAAE,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;CACxB;AAuCD,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAc/B;AAkGD,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,kBAAkB,EAAE,GAC5B,wBAAwB,CAmE1B;AAED,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,wBAAwB,CAAC,CAGnC"}
@@ -60,16 +60,43 @@ function readHatFields(parsed) {
60
60
  const criticalInsight = typeof parsed.criticalInsight === "string" ? parsed.criticalInsight.trim() : observation;
61
61
  return { observation, certainty, criticalInsight };
62
62
  }
63
+ function parseWhyChain(parsed, observation) {
64
+ const rawSteps = parsed.steps;
65
+ if (!Array.isArray(rawSteps) || rawSteps.length === 0) {
66
+ return null;
67
+ }
68
+ const steps = rawSteps.slice(0, 5).map((raw, i) => {
69
+ const step = (raw && typeof raw === "object" ? raw : {});
70
+ return {
71
+ level: (i + 1),
72
+ question: String(step.question ?? ""),
73
+ answer: String(step.answer ?? ""),
74
+ certainty: Math.min(0.95, 0.3 + (i + 1) * 0.13),
75
+ };
76
+ });
77
+ const lastAnswer = steps[steps.length - 1]?.answer ?? "";
78
+ const rootCause = typeof parsed.rootCause === "string" && parsed.rootCause.trim()
79
+ ? parsed.rootCause.trim()
80
+ : lastAnswer || observation;
81
+ return {
82
+ initialObservation: observation,
83
+ certainty: steps[0]?.certainty ?? 0.5,
84
+ steps,
85
+ rootCause,
86
+ };
87
+ }
63
88
  function buildRefinedStatement(task, hatResults) {
64
89
  const rootCauses = hatResults
65
90
  .filter((hat) => hat.whyChain !== null)
66
91
  .map((hat) => hat.whyChain.rootCause)
67
92
  .join("; ");
93
+ const blueSynthesis = hatResults.find((h) => h.hat.color === "blue")?.criticalInsight ?? "";
68
94
  const value = hatResults.find((hat) => hat.hat.color === "yellow")?.observation ?? "";
69
- if (!rootCauses && !value) {
95
+ if (!rootCauses && !blueSynthesis && !value) {
70
96
  return task;
71
97
  }
72
- return `核心问题: ${rootCauses || "待探索"} | 核心价值: ${value || "待发现"}`;
98
+ const coreProblem = rootCauses || blueSynthesis || "待探索";
99
+ return `核心问题: ${coreProblem} | 核心价值: ${value || "待发现"}`;
73
100
  }
74
101
  function parsePlanItems(parsed) {
75
102
  const raw = parsed.items;
@@ -103,27 +130,31 @@ function parsePlanItems(parsed) {
103
130
  return items.length > 0 ? items.slice(0, 8) : [];
104
131
  }
105
132
  function mergeAgentInsights(task, records) {
106
- const expectedIds = (0, agent_delegation_1.buildAgentInsightWorkItems)(task).map((item) => item.id);
133
+ const allItems = (0, agent_delegation_1.buildAgentInsightWorkItems)(task);
134
+ const requiredIds = allItems.filter((i) => !i.optional).map((i) => i.id);
107
135
  const byWorkItem = new Map();
108
136
  for (const record of records) {
109
137
  byWorkItem.set(record.workItemId, record);
110
138
  }
111
- const submittedIds = expectedIds.filter((id) => byWorkItem.has(id));
112
- const missing = expectedIds.filter((id) => !byWorkItem.has(id));
139
+ const submittedIds = requiredIds.filter((id) => byWorkItem.has(id));
140
+ const missing = requiredIds.filter((id) => !byWorkItem.has(id));
113
141
  const complete = missing.length === 0;
114
142
  const hatResults = [];
115
- for (const hat of insight_1.SIX_HATS) {
116
- const workItemId = `hat-${insight_1.SIX_HATS.indexOf(hat) + 1}-${hat.color}`;
143
+ for (let index = 0; index < insight_1.SIX_HATS.length; index++) {
144
+ const hat = insight_1.SIX_HATS[index];
145
+ const workItemId = `hat-${index + 1}-${hat.color}`;
117
146
  const record = byWorkItem.get(workItemId);
118
147
  if (!record) {
119
148
  continue;
120
149
  }
121
150
  const fields = readHatFields(record.parsed);
151
+ const whyRecord = byWorkItem.get(`why-${index + 1}-${hat.color}`);
152
+ const whyChain = whyRecord ? parseWhyChain(whyRecord.parsed, fields.observation) : null;
122
153
  hatResults.push({
123
154
  hat,
124
155
  observation: fields.observation,
125
156
  certainty: fields.certainty,
126
- whyChain: null,
157
+ whyChain,
127
158
  criticalInsight: fields.criticalInsight,
128
159
  });
129
160
  }