@roarpeng/graphflow 1.9.4 → 1.9.12

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 (245) hide show
  1. package/CHANGELOG.md +133 -0
  2. package/README.md +193 -107
  3. package/dist/agents/atp-example-producer.d.ts +33 -0
  4. package/dist/agents/atp-example-producer.d.ts.map +1 -0
  5. package/dist/agents/atp-example-producer.js +154 -0
  6. package/dist/agents/atp-example-producer.js.map +1 -0
  7. package/dist/agents/planner.d.ts.map +1 -1
  8. package/dist/agents/planner.js +14 -8
  9. package/dist/agents/planner.js.map +1 -1
  10. package/dist/config/defaults.d.ts.map +1 -1
  11. package/dist/config/defaults.js +5 -3
  12. package/dist/config/defaults.js.map +1 -1
  13. package/dist/config/include-extensions.d.ts +3 -1
  14. package/dist/config/include-extensions.d.ts.map +1 -1
  15. package/dist/config/include-extensions.js +6 -3
  16. package/dist/config/include-extensions.js.map +1 -1
  17. package/dist/config/loader.js +1 -1
  18. package/dist/config/loader.js.map +1 -1
  19. package/dist/core/agent-delegation.d.ts +16 -2
  20. package/dist/core/agent-delegation.d.ts.map +1 -1
  21. package/dist/core/agent-delegation.js +48 -5
  22. package/dist/core/agent-delegation.js.map +1 -1
  23. package/dist/core/merge-agent-insight.d.ts.map +1 -1
  24. package/dist/core/merge-agent-insight.js +10 -0
  25. package/dist/core/merge-agent-insight.js.map +1 -1
  26. package/dist/core/orchestrator-episode.d.ts.map +1 -1
  27. package/dist/core/orchestrator-episode.js +24 -0
  28. package/dist/core/orchestrator-episode.js.map +1 -1
  29. package/dist/core/orchestrator.js +52 -1
  30. package/dist/core/orchestrator.js.map +1 -1
  31. package/dist/core/submit-agent-insight.d.ts +17 -0
  32. package/dist/core/submit-agent-insight.d.ts.map +1 -1
  33. package/dist/core/submit-agent-insight.js +28 -0
  34. package/dist/core/submit-agent-insight.js.map +1 -1
  35. package/dist/core/types.d.ts +35 -2
  36. package/dist/core/types.d.ts.map +1 -1
  37. package/dist/graph/client-factory.d.ts +4 -0
  38. package/dist/graph/client-factory.d.ts.map +1 -1
  39. package/dist/graph/client-factory.js +83 -7
  40. package/dist/graph/client-factory.js.map +1 -1
  41. package/dist/graph/context-slicer-types.d.ts +4 -0
  42. package/dist/graph/context-slicer-types.d.ts.map +1 -1
  43. package/dist/graph/context-slicer-types.js +3 -0
  44. package/dist/graph/context-slicer-types.js.map +1 -1
  45. package/dist/graph/context-slicer.d.ts.map +1 -1
  46. package/dist/graph/context-slicer.js +154 -6
  47. package/dist/graph/context-slicer.js.map +1 -1
  48. package/dist/graph/document-convert.d.ts +33 -0
  49. package/dist/graph/document-convert.d.ts.map +1 -0
  50. package/dist/graph/document-convert.js +137 -0
  51. package/dist/graph/document-convert.js.map +1 -0
  52. package/dist/graph/document-semantic-bridge.d.ts +23 -0
  53. package/dist/graph/document-semantic-bridge.d.ts.map +1 -0
  54. package/dist/graph/document-semantic-bridge.js +61 -0
  55. package/dist/graph/document-semantic-bridge.js.map +1 -0
  56. package/dist/graph/document-semantic-ingest.d.ts +48 -0
  57. package/dist/graph/document-semantic-ingest.d.ts.map +1 -0
  58. package/dist/graph/document-semantic-ingest.js +229 -0
  59. package/dist/graph/document-semantic-ingest.js.map +1 -0
  60. package/dist/graph/episode-engineering-links.d.ts +29 -0
  61. package/dist/graph/episode-engineering-links.d.ts.map +1 -0
  62. package/dist/graph/episode-engineering-links.js +63 -0
  63. package/dist/graph/episode-engineering-links.js.map +1 -0
  64. package/dist/graph/file-indexer-edges.d.ts +26 -0
  65. package/dist/graph/file-indexer-edges.d.ts.map +1 -1
  66. package/dist/graph/file-indexer-edges.js +120 -20
  67. package/dist/graph/file-indexer-edges.js.map +1 -1
  68. package/dist/graph/file-indexer-nodes.d.ts +18 -0
  69. package/dist/graph/file-indexer-nodes.d.ts.map +1 -1
  70. package/dist/graph/file-indexer-nodes.js +0 -0
  71. package/dist/graph/file-indexer-nodes.js.map +1 -1
  72. package/dist/graph/file-indexer-walker.d.ts +4 -1
  73. package/dist/graph/file-indexer-walker.d.ts.map +1 -1
  74. package/dist/graph/file-indexer-walker.js +33 -16
  75. package/dist/graph/file-indexer-walker.js.map +1 -1
  76. package/dist/graph/file-indexer.d.ts +5 -0
  77. package/dist/graph/file-indexer.d.ts.map +1 -1
  78. package/dist/graph/file-indexer.js +162 -50
  79. package/dist/graph/file-indexer.js.map +1 -1
  80. package/dist/graph/graph-compression.d.ts +11 -2
  81. package/dist/graph/graph-compression.d.ts.map +1 -1
  82. package/dist/graph/graph-compression.js +153 -16
  83. package/dist/graph/graph-compression.js.map +1 -1
  84. package/dist/graph/graphify-client.d.ts +1 -0
  85. package/dist/graph/graphify-client.d.ts.map +1 -1
  86. package/dist/graph/graphify-client.js +24 -9
  87. package/dist/graph/graphify-client.js.map +1 -1
  88. package/dist/graph/graphify-file-client.d.ts +1 -0
  89. package/dist/graph/graphify-file-client.d.ts.map +1 -1
  90. package/dist/graph/graphify-file-client.js +8 -2
  91. package/dist/graph/graphify-file-client.js.map +1 -1
  92. package/dist/graph/language-indexers/c-cpp.d.ts.map +1 -1
  93. package/dist/graph/language-indexers/c-cpp.js +19 -13
  94. package/dist/graph/language-indexers/c-cpp.js.map +1 -1
  95. package/dist/graph/language-indexers/dart.d.ts.map +1 -1
  96. package/dist/graph/language-indexers/dart.js +2 -6
  97. package/dist/graph/language-indexers/dart.js.map +1 -1
  98. package/dist/graph/language-indexers/go.d.ts.map +1 -1
  99. package/dist/graph/language-indexers/go.js +3 -6
  100. package/dist/graph/language-indexers/go.js.map +1 -1
  101. package/dist/graph/language-indexers/java.d.ts.map +1 -1
  102. package/dist/graph/language-indexers/java.js +2 -6
  103. package/dist/graph/language-indexers/java.js.map +1 -1
  104. package/dist/graph/language-indexers/kotlin.d.ts.map +1 -1
  105. package/dist/graph/language-indexers/kotlin.js +2 -6
  106. package/dist/graph/language-indexers/kotlin.js.map +1 -1
  107. package/dist/graph/language-indexers/python.d.ts.map +1 -1
  108. package/dist/graph/language-indexers/python.js +4 -6
  109. package/dist/graph/language-indexers/python.js.map +1 -1
  110. package/dist/graph/language-indexers/ruby.d.ts.map +1 -1
  111. package/dist/graph/language-indexers/ruby.js +2 -6
  112. package/dist/graph/language-indexers/ruby.js.map +1 -1
  113. package/dist/graph/language-indexers/rust.d.ts.map +1 -1
  114. package/dist/graph/language-indexers/rust.js +3 -6
  115. package/dist/graph/language-indexers/rust.js.map +1 -1
  116. package/dist/graph/language-indexers/swift.d.ts.map +1 -1
  117. package/dist/graph/language-indexers/swift.js +2 -6
  118. package/dist/graph/language-indexers/swift.js.map +1 -1
  119. package/dist/graph/language-indexers/tree-sitter-loader.d.ts +20 -0
  120. package/dist/graph/language-indexers/tree-sitter-loader.d.ts.map +1 -1
  121. package/dist/graph/language-indexers/tree-sitter-loader.js +42 -0
  122. package/dist/graph/language-indexers/tree-sitter-loader.js.map +1 -1
  123. package/dist/graph/memory-pack.d.ts +46 -0
  124. package/dist/graph/memory-pack.d.ts.map +1 -0
  125. package/dist/graph/memory-pack.js +204 -0
  126. package/dist/graph/memory-pack.js.map +1 -0
  127. package/dist/graph/snapshot-view.d.ts.map +1 -1
  128. package/dist/graph/snapshot-view.js +26 -1
  129. package/dist/graph/snapshot-view.js.map +1 -1
  130. package/dist/graph/sqlite-client.d.ts +1 -0
  131. package/dist/graph/sqlite-client.d.ts.map +1 -1
  132. package/dist/graph/sqlite-client.js +15 -4
  133. package/dist/graph/sqlite-client.js.map +1 -1
  134. package/dist/graph/symbol-extract.d.ts +39 -0
  135. package/dist/graph/symbol-extract.d.ts.map +1 -0
  136. package/dist/graph/symbol-extract.js +187 -0
  137. package/dist/graph/symbol-extract.js.map +1 -0
  138. package/dist/hooks/auto-capture.d.ts +87 -0
  139. package/dist/hooks/auto-capture.d.ts.map +1 -0
  140. package/dist/hooks/auto-capture.js +182 -0
  141. package/dist/hooks/auto-capture.js.map +1 -0
  142. package/dist/index.d.ts +7 -2
  143. package/dist/index.d.ts.map +1 -1
  144. package/dist/index.js +21 -2
  145. package/dist/index.js.map +1 -1
  146. package/dist/integrations/agent-mcp-installer.d.ts +87 -5
  147. package/dist/integrations/agent-mcp-installer.d.ts.map +1 -1
  148. package/dist/integrations/agent-mcp-installer.js +418 -60
  149. package/dist/integrations/agent-mcp-installer.js.map +1 -1
  150. package/dist/integrations/agent-profiles/profiles/qoder.d.ts.map +1 -1
  151. package/dist/integrations/agent-profiles/profiles/qoder.js +14 -2
  152. package/dist/integrations/agent-profiles/profiles/qoder.js.map +1 -1
  153. package/dist/integrations/agent-profiles/skills/qoder.js +6 -0
  154. package/dist/integrations/agent-profiles/skills/qoder.js.map +1 -1
  155. package/dist/integrations/claude-code-hooks.d.ts +95 -0
  156. package/dist/integrations/claude-code-hooks.d.ts.map +1 -0
  157. package/dist/integrations/claude-code-hooks.js +321 -0
  158. package/dist/integrations/claude-code-hooks.js.map +1 -0
  159. package/dist/integrations/ensure-anydoc.d.ts +41 -0
  160. package/dist/integrations/ensure-anydoc.d.ts.map +1 -0
  161. package/dist/integrations/ensure-anydoc.js +221 -0
  162. package/dist/integrations/ensure-anydoc.js.map +1 -0
  163. package/dist/integrations/skill-installer.d.ts +26 -3
  164. package/dist/integrations/skill-installer.d.ts.map +1 -1
  165. package/dist/integrations/skill-installer.js +148 -4
  166. package/dist/integrations/skill-installer.js.map +1 -1
  167. package/dist/learning/canary-gate.d.ts +39 -0
  168. package/dist/learning/canary-gate.d.ts.map +1 -0
  169. package/dist/learning/canary-gate.js +57 -0
  170. package/dist/learning/canary-gate.js.map +1 -0
  171. package/dist/learning/skill-consolidate.d.ts +84 -0
  172. package/dist/learning/skill-consolidate.d.ts.map +1 -0
  173. package/dist/learning/skill-consolidate.js +353 -0
  174. package/dist/learning/skill-consolidate.js.map +1 -0
  175. package/dist/learning/skill-flywheel.d.ts +26 -0
  176. package/dist/learning/skill-flywheel.d.ts.map +1 -1
  177. package/dist/learning/skill-flywheel.js +192 -29
  178. package/dist/learning/skill-flywheel.js.map +1 -1
  179. package/dist/learning/skill-opt-lite.d.ts +46 -0
  180. package/dist/learning/skill-opt-lite.d.ts.map +1 -0
  181. package/dist/learning/skill-opt-lite.js +270 -0
  182. package/dist/learning/skill-opt-lite.js.map +1 -0
  183. package/dist/learning/skill-package.d.ts.map +1 -1
  184. package/dist/learning/skill-package.js +80 -6
  185. package/dist/learning/skill-package.js.map +1 -1
  186. package/dist/learning/skill-store.d.ts.map +1 -1
  187. package/dist/learning/skill-store.js +13 -0
  188. package/dist/learning/skill-store.js.map +1 -1
  189. package/dist/learning/skill-types.d.ts +32 -0
  190. package/dist/learning/skill-types.d.ts.map +1 -1
  191. package/dist/learning/skill-types.js +17 -0
  192. package/dist/learning/skill-types.js.map +1 -1
  193. package/dist/skills/index.js +1 -1
  194. package/dist/skills/index.js.map +1 -1
  195. package/dist/surfaces/cli/index.js +46 -5
  196. package/dist/surfaces/cli/index.js.map +1 -1
  197. package/dist/surfaces/cli/init.d.ts +17 -4
  198. package/dist/surfaces/cli/init.d.ts.map +1 -1
  199. package/dist/surfaces/cli/init.js +71 -8
  200. package/dist/surfaces/cli/init.js.map +1 -1
  201. package/dist/surfaces/cli/output.d.ts.map +1 -1
  202. package/dist/surfaces/cli/output.js +4 -2
  203. package/dist/surfaces/cli/output.js.map +1 -1
  204. package/dist/surfaces/cli/runtime/facade.d.ts +2 -1
  205. package/dist/surfaces/cli/runtime/facade.d.ts.map +1 -1
  206. package/dist/surfaces/cli/runtime/facade.js +1 -0
  207. package/dist/surfaces/cli/runtime/facade.js.map +1 -1
  208. package/dist/surfaces/cli/runtime/graph.d.ts +59 -2
  209. package/dist/surfaces/cli/runtime/graph.d.ts.map +1 -1
  210. package/dist/surfaces/cli/runtime/graph.js +120 -7
  211. package/dist/surfaces/cli/runtime/graph.js.map +1 -1
  212. package/dist/surfaces/cli/runtime/learning.d.ts +19 -0
  213. package/dist/surfaces/cli/runtime/learning.d.ts.map +1 -1
  214. package/dist/surfaces/cli/runtime/learning.js +46 -0
  215. package/dist/surfaces/cli/runtime/learning.js.map +1 -1
  216. package/dist/surfaces/cli/runtime/routing.d.ts +6 -3
  217. package/dist/surfaces/cli/runtime/routing.d.ts.map +1 -1
  218. package/dist/surfaces/cli/runtime/routing.js +70 -7
  219. package/dist/surfaces/cli/runtime/routing.js.map +1 -1
  220. package/dist/surfaces/cli/runtime/types.d.ts +54 -0
  221. package/dist/surfaces/cli/runtime/types.d.ts.map +1 -1
  222. package/dist/surfaces/cli/runtime.d.ts +3 -3
  223. package/dist/surfaces/cli/runtime.d.ts.map +1 -1
  224. package/dist/surfaces/cli/runtime.js +6 -2
  225. package/dist/surfaces/cli/runtime.js.map +1 -1
  226. package/dist/surfaces/mcp/server.d.ts +12 -4
  227. package/dist/surfaces/mcp/server.d.ts.map +1 -1
  228. package/dist/surfaces/mcp/server.js +270 -97
  229. package/dist/surfaces/mcp/server.js.map +1 -1
  230. package/dist/surfaces/mcp/tool-definitions.d.ts.map +1 -1
  231. package/dist/surfaces/mcp/tool-definitions.js +15 -0
  232. package/dist/surfaces/mcp/tool-definitions.js.map +1 -1
  233. package/dist/surfaces/mcp/tool-handlers.d.ts +5 -3
  234. package/dist/surfaces/mcp/tool-handlers.d.ts.map +1 -1
  235. package/dist/surfaces/mcp/tool-handlers.js +36 -6
  236. package/dist/surfaces/mcp/tool-handlers.js.map +1 -1
  237. package/dist/utils/logger.d.ts +8 -0
  238. package/dist/utils/logger.d.ts.map +1 -1
  239. package/dist/utils/logger.js +54 -5
  240. package/dist/utils/logger.js.map +1 -1
  241. package/mcp.json +14 -0
  242. package/package.json +19 -1
  243. package/plugin.json +21 -0
  244. package/scripts/safe-postinstall.cjs +36 -1
  245. package/skills/graphflow/SKILL.md +565 -0
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+ /**
3
+ * document-convert.ts — Office/PDF → Markdown via @firecrawl/anydoc (optional).
4
+ *
5
+ * Survey (2026): Firecrawl anydoc leads format coverage/speed for Node;
6
+ * Microsoft MarkItDown is Python/LLM-oriented; Pandoc needs system install.
7
+ * GraphFlow prefers local-first Node: optionalDependency on @firecrawl/anydoc.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.DEFAULT_DOCUMENT_MAX_FILE_SIZE = exports.OFFICE_DOCUMENT_EXTENSIONS = void 0;
11
+ exports.isOfficeDocumentPath = isOfficeDocumentPath;
12
+ exports.resetDocumentConverterCache = resetDocumentConverterCache;
13
+ exports.setDocumentConverterForTests = setDocumentConverterForTests;
14
+ exports.convertDocumentToMarkdown = convertDocumentToMarkdown;
15
+ const node_module_1 = require("node:module");
16
+ const node_path_1 = require("node:path");
17
+ const node_path_2 = require("node:path");
18
+ const logger_js_1 = require("../utils/logger.js");
19
+ const ensure_anydoc_js_1 = require("../integrations/ensure-anydoc.js");
20
+ const requireFn = (0, node_module_1.createRequire)(__filename);
21
+ /** Extensions converted to Markdown before graph indexing. */
22
+ exports.OFFICE_DOCUMENT_EXTENSIONS = [
23
+ ".pdf",
24
+ ".doc",
25
+ ".docx",
26
+ ".docm",
27
+ ".ppt",
28
+ ".pptx",
29
+ ".pptm",
30
+ ".xls",
31
+ ".xlsx",
32
+ ".xlsm",
33
+ ".odt",
34
+ ".ods",
35
+ ".odp",
36
+ ".rtf",
37
+ ".epub",
38
+ ".csv",
39
+ ];
40
+ /** Larger than source files — PDFs/DOCX often exceed 200KB. */
41
+ exports.DEFAULT_DOCUMENT_MAX_FILE_SIZE = 5_000_000;
42
+ function isOfficeDocumentPath(filePath) {
43
+ const ext = (0, node_path_2.extname)(filePath).toLowerCase();
44
+ return exports.OFFICE_DOCUMENT_EXTENSIONS.includes(ext);
45
+ }
46
+ let anydocLoadAttempted = false;
47
+ let anydocModule = null;
48
+ function loadAnydoc() {
49
+ if (anydocLoadAttempted) {
50
+ return anydocModule;
51
+ }
52
+ anydocLoadAttempted = true;
53
+ try {
54
+ (0, ensure_anydoc_js_1.applyAnydocRequireEnv)((0, ensure_anydoc_js_1.resolveAnydocNodeModules)());
55
+ const loaded = (0, ensure_anydoc_js_1.tryRequireAnydoc)();
56
+ if (loaded) {
57
+ anydocModule = loaded;
58
+ return anydocModule;
59
+ }
60
+ anydocModule = requireFn("@firecrawl/anydoc");
61
+ }
62
+ catch (error) {
63
+ const fromEnv = process.env.GRAPHFLOW_ANYDOC_NODE_MODULES?.trim();
64
+ if (fromEnv) {
65
+ try {
66
+ const req = (0, node_module_1.createRequire)((0, node_path_1.join)(fromEnv, "@firecrawl", "anydoc", "package.json"));
67
+ anydocModule = req("@firecrawl/anydoc");
68
+ return anydocModule;
69
+ }
70
+ catch {
71
+ // fall through to warn
72
+ }
73
+ }
74
+ logger_js_1.logger.warn({ err: error instanceof Error ? error.message : String(error) }, "optional @firecrawl/anydoc not available — office/PDF documents will be skipped");
75
+ anydocModule = null;
76
+ }
77
+ return anydocModule;
78
+ }
79
+ /** Test hook: reset optional-dep load cache. */
80
+ function resetDocumentConverterCache() {
81
+ anydocLoadAttempted = false;
82
+ anydocModule = null;
83
+ }
84
+ /** Test hook: inject a fake converter module. */
85
+ function setDocumentConverterForTests(mod) {
86
+ anydocLoadAttempted = true;
87
+ anydocModule = mod;
88
+ }
89
+ /**
90
+ * Convert an office/PDF file to Markdown.
91
+ * Returns skippedReason when the optional converter is missing or conversion fails softly.
92
+ */
93
+ async function convertDocumentToMarkdown(absPath, bytes) {
94
+ const anydoc = loadAnydoc();
95
+ if (!anydoc?.toMarkdown && !anydoc?.toMarkdownBytes) {
96
+ return {
97
+ markdown: "",
98
+ converter: "unavailable",
99
+ skippedReason: "optional-dependency-missing:@firecrawl/anydoc",
100
+ };
101
+ }
102
+ try {
103
+ let markdown = "";
104
+ if (anydoc.toMarkdown) {
105
+ markdown = await anydoc.toMarkdown(absPath);
106
+ }
107
+ else if (anydoc.toMarkdownBytes && bytes) {
108
+ markdown = await anydoc.toMarkdownBytes(bytes);
109
+ }
110
+ else if (anydoc.toMarkdownBytes) {
111
+ const { readFileSync } = await import("node:fs");
112
+ markdown = await anydoc.toMarkdownBytes(readFileSync(absPath));
113
+ }
114
+ const trimmed = markdown?.trim() ?? "";
115
+ if (!trimmed) {
116
+ return {
117
+ markdown: "",
118
+ converter: "anydoc",
119
+ skippedReason: "empty-markdown",
120
+ };
121
+ }
122
+ return { markdown: trimmed, converter: "anydoc" };
123
+ }
124
+ catch (error) {
125
+ const code = error && typeof error === "object" && "code" in error
126
+ ? String(error.code)
127
+ : undefined;
128
+ const message = error instanceof Error ? error.message : String(error);
129
+ logger_js_1.logger.warn({ path: absPath, code, message }, "document conversion failed");
130
+ return {
131
+ markdown: "",
132
+ converter: "anydoc",
133
+ skippedReason: code ? `convert-error:${code}` : `convert-error:${message.slice(0, 120)}`,
134
+ };
135
+ }
136
+ }
137
+ //# sourceMappingURL=document-convert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-convert.js","sourceRoot":"","sources":["../../src/graph/document-convert.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Bridge work items for document semantic extraction after structural indexing.
3
+ * Structure (headings/chunks/links) comes from Markdown conversion; deep
4
+ * semantics are delegated to the host agent via ATP/bridge.
5
+ */
6
+ import type { AgentWorkItem } from "../core/agent-delegation.js";
7
+ export interface DocumentSemanticTarget {
8
+ relPath: string;
9
+ /** Short structural summary (title / top headings). */
10
+ outline: string;
11
+ /** Truncated markdown body for the agent prompt. */
12
+ excerpt: string;
13
+ }
14
+ /**
15
+ * Build optional bridge work items so the host agent extracts entities,
16
+ * claims, and a concise semantic summary, then submits via graphflow_insight.
17
+ */
18
+ export declare function buildDocumentSemanticWorkItems(docs: DocumentSemanticTarget[], options?: {
19
+ maxDocs?: number;
20
+ }): AgentWorkItem[];
21
+ /** Build a short outline string from markdown headings. */
22
+ export declare function outlineFromMarkdown(markdown: string, maxHeadings?: number): string;
23
+ //# sourceMappingURL=document-semantic-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-semantic-bridge.d.ts","sourceRoot":"","sources":["../../src/graph/document-semantic-bridge.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAEjE,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,OAAO,EAAE,MAAM,CAAC;IAChB,oDAAoD;IACpD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,sBAAsB,EAAE,EAC9B,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7B,aAAa,EAAE,CAmCjB;AAED,2DAA2D;AAC3D,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,SAAK,GAAG,MAAM,CAU9E"}
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ /**
3
+ * Bridge work items for document semantic extraction after structural indexing.
4
+ * Structure (headings/chunks/links) comes from Markdown conversion; deep
5
+ * semantics are delegated to the host agent via ATP/bridge.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.buildDocumentSemanticWorkItems = buildDocumentSemanticWorkItems;
9
+ exports.outlineFromMarkdown = outlineFromMarkdown;
10
+ /**
11
+ * Build optional bridge work items so the host agent extracts entities,
12
+ * claims, and a concise semantic summary, then submits via graphflow_insight.
13
+ */
14
+ function buildDocumentSemanticWorkItems(docs, options) {
15
+ const maxDocs = options?.maxDocs ?? 5;
16
+ const selected = docs.slice(0, maxDocs);
17
+ if (selected.length === 0) {
18
+ return [];
19
+ }
20
+ return selected.map((doc, index) => ({
21
+ id: `document-semantic-${index + 1}`,
22
+ kind: "document-semantic",
23
+ optional: true,
24
+ expectedFormat: "json",
25
+ prompt: [
26
+ `Document semantic extraction for: ${doc.relPath}`,
27
+ "",
28
+ "Structural outline (already indexed as graph sections/chunks):",
29
+ doc.outline,
30
+ "",
31
+ "Excerpt:",
32
+ doc.excerpt.slice(0, 4000),
33
+ "",
34
+ "Extract KEY information and semantics for the knowledge graph.",
35
+ "Return JSON only. Then submit via graphflow_insight(mode=\"submit\") with this id.",
36
+ ].join("\n"),
37
+ responseSchema: {
38
+ relPath: `string — echo exactly: ${doc.relPath}`,
39
+ title: "string — document title",
40
+ summary: "string — 2-4 sentence semantic summary",
41
+ keyEntities: "string[] — people/orgs/systems/APIs/modules → Concept nodes",
42
+ requirements: "string[] — normative requirements (preferred over keyClaims)",
43
+ keyClaims: "string[] — fallback facts/requirements if requirements omitted",
44
+ relatedCodeHints: "string[] — code symbol names or relative file paths to link",
45
+ tags: "string[] — short topic tags",
46
+ },
47
+ }));
48
+ }
49
+ /** Build a short outline string from markdown headings. */
50
+ function outlineFromMarkdown(markdown, maxHeadings = 12) {
51
+ const headings = markdown
52
+ .split(/\r?\n/)
53
+ .map((line) => line.trim())
54
+ .filter((line) => /^#{1,3}\s+/.test(line))
55
+ .slice(0, maxHeadings);
56
+ if (headings.length === 0) {
57
+ return "(no headings — body chunk indexed)";
58
+ }
59
+ return headings.join("\n");
60
+ }
61
+ //# sourceMappingURL=document-semantic-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-semantic-bridge.js","sourceRoot":"","sources":["../../src/graph/document-semantic-bridge.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAgBH,wEAsCC;AAGD,kDAUC;AAvDD;;;GAGG;AACH,SAAgB,8BAA8B,CAC5C,IAA8B,EAC9B,OAA8B;IAE9B,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACxC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QACnC,EAAE,EAAE,qBAAqB,KAAK,GAAG,CAAC,EAAE;QACpC,IAAI,EAAE,mBAA4B;QAClC,QAAQ,EAAE,IAAI;QACd,cAAc,EAAE,MAAe;QAC/B,MAAM,EAAE;YACN,qCAAqC,GAAG,CAAC,OAAO,EAAE;YAClD,EAAE;YACF,gEAAgE;YAChE,GAAG,CAAC,OAAO;YACX,EAAE;YACF,UAAU;YACV,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;YAC1B,EAAE;YACF,gEAAgE;YAChE,oFAAoF;SACrF,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ,cAAc,EAAE;YACd,OAAO,EAAE,0BAA0B,GAAG,CAAC,OAAO,EAAE;YAChD,KAAK,EAAE,yBAAyB;YAChC,OAAO,EAAE,wCAAwC;YACjD,WAAW,EAAE,6DAA6D;YAC1E,YAAY,EAAE,8DAA8D;YAC5E,SAAS,EAAE,gEAAgE;YAC3E,gBAAgB,EAAE,6DAA6D;YAC/E,IAAI,EAAE,6BAA6B;SACpC;KACF,CAAC,CAAC,CAAC;AACN,CAAC;AAED,2DAA2D;AAC3D,SAAgB,mBAAmB,CAAC,QAAgB,EAAE,WAAW,GAAG,EAAE;IACpE,MAAM,QAAQ,GAAG,QAAQ;SACtB,KAAK,CAAC,OAAO,CAAC;SACd,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SACzC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;IACzB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,oCAAoC,CAAC;IAC9C,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Upsert document-domain Concept/Requirement nodes and cross-layer edges
3
+ * after a document-semantic bridge submission.
4
+ *
5
+ * Logical Engineering KG (single store):
6
+ * code ←documents/implements→ doc ←derived_from→ experience(insight)
7
+ */
8
+ import type { GraphClient } from "./client-factory.js";
9
+ import type { GraphEdge, GraphNode } from "../core/types.js";
10
+ export interface DocumentSemanticPayload {
11
+ relPath?: string;
12
+ title?: string;
13
+ summary?: string;
14
+ keyEntities?: string[];
15
+ keyClaims?: string[];
16
+ /** Prefer explicit requirements when present; else keyClaims are used. */
17
+ requirements?: string[];
18
+ relatedCodeHints?: string[];
19
+ tags?: string[];
20
+ }
21
+ export interface DocumentSemanticIngestResult {
22
+ conceptIds: string[];
23
+ requirementIds: string[];
24
+ edgeCount: number;
25
+ linkedCodeNodeIds: string[];
26
+ }
27
+ export declare function parseDocumentSemanticPayload(parsed: Record<string, unknown>): DocumentSemanticPayload;
28
+ /**
29
+ * Resolve relatedCodeHints against existing File/Symbol nodes.
30
+ * Paths prefer file: ids; bare names match Symbol metadata.name or content.
31
+ */
32
+ export declare function resolveCodeHintTargets(hints: string[], nodes: GraphNode[], maxLinks?: number): string[];
33
+ /**
34
+ * Build Concept/Requirement nodes + cross-layer edges from a bridge payload.
35
+ */
36
+ export declare function buildDocumentSemanticGraphFragment(payload: DocumentSemanticPayload, options: {
37
+ insightNodeId: string;
38
+ existingNodes?: GraphNode[];
39
+ maxConcepts?: number;
40
+ maxRequirements?: number;
41
+ }): {
42
+ nodes: GraphNode[];
43
+ edges: GraphEdge[];
44
+ linkedCodeNodeIds: string[];
45
+ };
46
+ export declare function ingestDocumentSemanticInsight(client: GraphClient, parsed: Record<string, unknown>, insightNodeId: string): Promise<DocumentSemanticIngestResult>;
47
+ export declare function isDocumentSemanticWorkItemId(workItemId: string): boolean;
48
+ //# sourceMappingURL=document-semantic-ingest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-semantic-ingest.d.ts","sourceRoot":"","sources":["../../src/graph/document-semantic-ingest.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAG7D,MAAM,WAAW,uBAAuB;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,0EAA0E;IAC1E,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,4BAA4B;IAC3C,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B;AAeD,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,uBAAuB,CAqBzB;AAUD;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,EAAE,EACf,KAAK,EAAE,SAAS,EAAE,EAClB,QAAQ,SAAK,GACZ,MAAM,EAAE,CAkEV;AAED;;GAEG;AACH,wBAAgB,kCAAkC,CAChD,OAAO,EAAE,uBAAuB,EAChC,OAAO,EAAE;IACP,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,SAAS,EAAE,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GACA;IAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAAC,KAAK,EAAE,SAAS,EAAE,CAAC;IAAC,iBAAiB,EAAE,MAAM,EAAE,CAAA;CAAE,CAiGzE;AAED,wBAAsB,6BAA6B,CACjD,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,4BAA4B,CAAC,CAqBvC;AAED,wBAAgB,4BAA4B,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAExE"}
@@ -0,0 +1,229 @@
1
+ "use strict";
2
+ /**
3
+ * Upsert document-domain Concept/Requirement nodes and cross-layer edges
4
+ * after a document-semantic bridge submission.
5
+ *
6
+ * Logical Engineering KG (single store):
7
+ * code ←documents/implements→ doc ←derived_from→ experience(insight)
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.parseDocumentSemanticPayload = parseDocumentSemanticPayload;
11
+ exports.resolveCodeHintTargets = resolveCodeHintTargets;
12
+ exports.buildDocumentSemanticGraphFragment = buildDocumentSemanticGraphFragment;
13
+ exports.ingestDocumentSemanticInsight = ingestDocumentSemanticInsight;
14
+ exports.isDocumentSemanticWorkItemId = isDocumentSemanticWorkItemId;
15
+ const hash_js_1 = require("../utils/hash.js");
16
+ function asString(value) {
17
+ return typeof value === "string" ? value.trim() : "";
18
+ }
19
+ function asStringArray(value) {
20
+ if (!Array.isArray(value)) {
21
+ return [];
22
+ }
23
+ return value
24
+ .map((item) => asString(item))
25
+ .filter((item) => item.length > 0);
26
+ }
27
+ function parseDocumentSemanticPayload(parsed) {
28
+ const payload = {
29
+ keyEntities: asStringArray(parsed.keyEntities),
30
+ keyClaims: asStringArray(parsed.keyClaims),
31
+ requirements: asStringArray(parsed.requirements),
32
+ relatedCodeHints: asStringArray(parsed.relatedCodeHints),
33
+ tags: asStringArray(parsed.tags),
34
+ };
35
+ const relPath = asString(parsed.relPath);
36
+ if (relPath) {
37
+ payload.relPath = relPath;
38
+ }
39
+ const title = asString(parsed.title);
40
+ if (title) {
41
+ payload.title = title;
42
+ }
43
+ const summary = asString(parsed.summary);
44
+ if (summary) {
45
+ payload.summary = summary;
46
+ }
47
+ return payload;
48
+ }
49
+ function conceptNodeId(relPath, name) {
50
+ return `concept:${(0, hash_js_1.hashText)(`${relPath}|${name.toLowerCase()}`)}`;
51
+ }
52
+ function requirementNodeId(relPath, claim) {
53
+ return `requirement:${(0, hash_js_1.hashText)(`${relPath}|${claim.toLowerCase()}`)}`;
54
+ }
55
+ /**
56
+ * Resolve relatedCodeHints against existing File/Symbol nodes.
57
+ * Paths prefer file: ids; bare names match Symbol metadata.name or content.
58
+ */
59
+ function resolveCodeHintTargets(hints, nodes, maxLinks = 12) {
60
+ const byId = new Map(nodes.map((n) => [n.id, n]));
61
+ const symbols = nodes.filter((n) => n.type === "Symbol");
62
+ const files = nodes.filter((n) => n.type === "File");
63
+ const found = [];
64
+ const seen = new Set();
65
+ const push = (id) => {
66
+ if (seen.has(id) || found.length >= maxLinks) {
67
+ return;
68
+ }
69
+ if (!byId.has(id)) {
70
+ return;
71
+ }
72
+ seen.add(id);
73
+ found.push(id);
74
+ };
75
+ for (const raw of hints) {
76
+ if (found.length >= maxLinks) {
77
+ break;
78
+ }
79
+ const hint = raw.trim();
80
+ if (!hint) {
81
+ continue;
82
+ }
83
+ if (hint.startsWith("file:") || hint.startsWith("symbol:")) {
84
+ push(hint);
85
+ continue;
86
+ }
87
+ const normalized = hint.replace(/\\/g, "/");
88
+ const asFileId = `file:${normalized.replace(/^\.\//, "")}`;
89
+ if (byId.has(asFileId)) {
90
+ push(asFileId);
91
+ continue;
92
+ }
93
+ const lower = normalized.toLowerCase();
94
+ const fileHit = files.find((f) => {
95
+ const path = f.id.slice("file:".length).toLowerCase();
96
+ return path === lower || path.endsWith(`/${lower}`) || path.endsWith(lower);
97
+ });
98
+ if (fileHit) {
99
+ push(fileHit.id);
100
+ continue;
101
+ }
102
+ const name = normalized.includes("/")
103
+ ? (normalized.split("/").pop() ?? normalized)
104
+ : normalized;
105
+ const nameLower = name.toLowerCase().replace(/\.(ts|tsx|js|jsx|py|go|rs|java)$/i, "");
106
+ const symbolHit = symbols.find((s) => {
107
+ const metaName = asString(s.metadata?.name).toLowerCase();
108
+ if (metaName && metaName === nameLower) {
109
+ return true;
110
+ }
111
+ return s.content.toLowerCase().includes(nameLower);
112
+ });
113
+ if (symbolHit) {
114
+ push(symbolHit.id);
115
+ }
116
+ }
117
+ return found;
118
+ }
119
+ /**
120
+ * Build Concept/Requirement nodes + cross-layer edges from a bridge payload.
121
+ */
122
+ function buildDocumentSemanticGraphFragment(payload, options) {
123
+ const relPath = payload.relPath?.trim();
124
+ if (!relPath) {
125
+ return { nodes: [], edges: [], linkedCodeNodeIds: [] };
126
+ }
127
+ const maxConcepts = options.maxConcepts ?? 12;
128
+ const maxRequirements = options.maxRequirements ?? 12;
129
+ const fileNodeId = `file:${relPath}`;
130
+ const entities = (payload.keyEntities ?? []).slice(0, maxConcepts);
131
+ const requirements = ((payload.requirements?.length ? payload.requirements : payload.keyClaims) ?? []).slice(0, maxRequirements);
132
+ const nodes = [];
133
+ const edges = [];
134
+ const conceptIds = [];
135
+ const requirementIds = [];
136
+ for (const name of entities) {
137
+ const id = conceptNodeId(relPath, name);
138
+ conceptIds.push(id);
139
+ nodes.push({
140
+ id,
141
+ type: "Concept",
142
+ content: name,
143
+ metadata: {
144
+ domain: "doc",
145
+ kind: "concept",
146
+ sourcePath: relPath,
147
+ title: payload.title,
148
+ tags: payload.tags ?? [],
149
+ },
150
+ });
151
+ edges.push({ from: fileNodeId, to: id, relation: "documents" });
152
+ edges.push({ from: id, to: fileNodeId, relation: "derived_from" });
153
+ edges.push({ from: id, to: options.insightNodeId, relation: "derived_from" });
154
+ }
155
+ for (const claim of requirements) {
156
+ const id = requirementNodeId(relPath, claim);
157
+ requirementIds.push(id);
158
+ nodes.push({
159
+ id,
160
+ type: "Requirement",
161
+ content: claim.slice(0, 500),
162
+ metadata: {
163
+ domain: "doc",
164
+ kind: "requirement",
165
+ sourcePath: relPath,
166
+ title: payload.title,
167
+ tags: payload.tags ?? [],
168
+ },
169
+ });
170
+ edges.push({ from: fileNodeId, to: id, relation: "documents" });
171
+ edges.push({ from: id, to: fileNodeId, relation: "derived_from" });
172
+ edges.push({ from: id, to: options.insightNodeId, relation: "derived_from" });
173
+ }
174
+ // Optional: enrich the File node summary via a lightweight Decision-adjacent metadata node —
175
+ // skip; File already exists from indexing.
176
+ const linkedCodeNodeIds = resolveCodeHintTargets(payload.relatedCodeHints ?? [], options.existingNodes ?? []);
177
+ for (const codeId of linkedCodeNodeIds) {
178
+ for (const reqId of requirementIds) {
179
+ edges.push({ from: codeId, to: reqId, relation: "implements" });
180
+ }
181
+ edges.push({ from: fileNodeId, to: codeId, relation: "references" });
182
+ }
183
+ // If summary present, attach as a Concept titled by document title
184
+ const title = payload.title?.trim();
185
+ const summary = payload.summary?.trim();
186
+ if (title && summary && !entities.some((e) => e.toLowerCase() === title.toLowerCase())) {
187
+ const id = conceptNodeId(relPath, `title:${title}`);
188
+ nodes.push({
189
+ id,
190
+ type: "Concept",
191
+ content: `${title} — ${summary}`.slice(0, 500),
192
+ metadata: {
193
+ domain: "doc",
194
+ kind: "document-summary",
195
+ sourcePath: relPath,
196
+ title,
197
+ tags: payload.tags ?? [],
198
+ },
199
+ });
200
+ edges.push({ from: fileNodeId, to: id, relation: "documents" });
201
+ edges.push({ from: id, to: fileNodeId, relation: "derived_from" });
202
+ edges.push({ from: id, to: options.insightNodeId, relation: "derived_from" });
203
+ }
204
+ return { nodes, edges, linkedCodeNodeIds };
205
+ }
206
+ async function ingestDocumentSemanticInsight(client, parsed, insightNodeId) {
207
+ const payload = parseDocumentSemanticPayload(parsed);
208
+ const snapshot = client.readSnapshot?.();
209
+ const fragment = buildDocumentSemanticGraphFragment(payload, {
210
+ insightNodeId,
211
+ existingNodes: snapshot?.nodes ?? [],
212
+ });
213
+ if (fragment.nodes.length > 0) {
214
+ await client.upsertNodes(fragment.nodes);
215
+ }
216
+ if (fragment.edges.length > 0 && client.upsertEdges) {
217
+ await client.upsertEdges(fragment.edges);
218
+ }
219
+ return {
220
+ conceptIds: fragment.nodes.filter((n) => n.type === "Concept").map((n) => n.id),
221
+ requirementIds: fragment.nodes.filter((n) => n.type === "Requirement").map((n) => n.id),
222
+ edgeCount: fragment.edges.length,
223
+ linkedCodeNodeIds: fragment.linkedCodeNodeIds,
224
+ };
225
+ }
226
+ function isDocumentSemanticWorkItemId(workItemId) {
227
+ return workItemId.startsWith("document-semantic");
228
+ }
229
+ //# sourceMappingURL=document-semantic-ingest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-semantic-ingest.js","sourceRoot":"","sources":["../../src/graph/document-semantic-ingest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Link failure (or any) episode Decision nodes to Engineering KG
3
+ * Requirement / Concept / code nodes via derived_from edges.
4
+ *
5
+ * Mirrors document-semantic provenance style (experience ↔ eng nodes),
6
+ * with direction episode → derived_from → requirement|concept|code.
7
+ */
8
+ import type { GraphClient } from "./client-factory.js";
9
+ import type { GraphEdge } from "../core/types.js";
10
+ export type EngineeringLinkHints = {
11
+ requirementIds?: string[];
12
+ conceptIds?: string[];
13
+ /** File paths, symbol names, or file:/symbol: ids resolved against the graph. */
14
+ codeHints?: string[];
15
+ };
16
+ export type LinkEpisodeResult = {
17
+ episodeId: string;
18
+ edgeCount: number;
19
+ edges: GraphEdge[];
20
+ linkedRequirementIds: string[];
21
+ linkedConceptIds: string[];
22
+ linkedCodeNodeIds: string[];
23
+ };
24
+ /**
25
+ * Upsert `derived_from` edges from an episode to Requirement / Concept nodes
26
+ * (and optionally to File/Symbol nodes resolved from codeHints).
27
+ */
28
+ export declare function linkEpisodeToEngineeringNodes(graphClient: GraphClient, episodeId: string, hints: EngineeringLinkHints): Promise<LinkEpisodeResult>;
29
+ //# sourceMappingURL=episode-engineering-links.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"episode-engineering-links.d.ts","sourceRoot":"","sources":["../../src/graph/episode-engineering-links.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAGlD,MAAM,MAAM,oBAAoB,GAAG;IACjC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,iFAAiF;IACjF,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B,CAAC;AAmBF;;;GAGG;AACH,wBAAsB,6BAA6B,CACjD,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC,iBAAiB,CAAC,CAkC5B"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ /**
3
+ * Link failure (or any) episode Decision nodes to Engineering KG
4
+ * Requirement / Concept / code nodes via derived_from edges.
5
+ *
6
+ * Mirrors document-semantic provenance style (experience ↔ eng nodes),
7
+ * with direction episode → derived_from → requirement|concept|code.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.linkEpisodeToEngineeringNodes = linkEpisodeToEngineeringNodes;
11
+ const document_semantic_ingest_js_1 = require("./document-semantic-ingest.js");
12
+ function uniqueNonEmpty(ids) {
13
+ if (!ids || ids.length === 0) {
14
+ return [];
15
+ }
16
+ const seen = new Set();
17
+ const out = [];
18
+ for (const raw of ids) {
19
+ const id = typeof raw === "string" ? raw.trim() : "";
20
+ if (!id || seen.has(id)) {
21
+ continue;
22
+ }
23
+ seen.add(id);
24
+ out.push(id);
25
+ }
26
+ return out;
27
+ }
28
+ /**
29
+ * Upsert `derived_from` edges from an episode to Requirement / Concept nodes
30
+ * (and optionally to File/Symbol nodes resolved from codeHints).
31
+ */
32
+ async function linkEpisodeToEngineeringNodes(graphClient, episodeId, hints) {
33
+ const linkedRequirementIds = uniqueNonEmpty(hints.requirementIds);
34
+ const linkedConceptIds = uniqueNonEmpty(hints.conceptIds);
35
+ let linkedCodeNodeIds = [];
36
+ const codeHints = uniqueNonEmpty(hints.codeHints);
37
+ if (codeHints.length > 0) {
38
+ const snapshot = graphClient.readSnapshot?.();
39
+ linkedCodeNodeIds = (0, document_semantic_ingest_js_1.resolveCodeHintTargets)(codeHints, snapshot?.nodes ?? []);
40
+ }
41
+ const edges = [];
42
+ for (const to of linkedRequirementIds) {
43
+ edges.push({ from: episodeId, to, relation: "derived_from" });
44
+ }
45
+ for (const to of linkedConceptIds) {
46
+ edges.push({ from: episodeId, to, relation: "derived_from" });
47
+ }
48
+ for (const to of linkedCodeNodeIds) {
49
+ edges.push({ from: episodeId, to, relation: "derived_from" });
50
+ }
51
+ if (edges.length > 0 && graphClient.upsertEdges) {
52
+ await graphClient.upsertEdges(edges);
53
+ }
54
+ return {
55
+ episodeId,
56
+ edgeCount: edges.length,
57
+ edges,
58
+ linkedRequirementIds,
59
+ linkedConceptIds,
60
+ linkedCodeNodeIds,
61
+ };
62
+ }
63
+ //# sourceMappingURL=episode-engineering-links.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"episode-engineering-links.js","sourceRoot":"","sources":["../../src/graph/episode-engineering-links.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AA2CH,sEAsCC;AA7ED,+EAAuE;AAkBvE,SAAS,cAAc,CAAC,GAAyB;IAC/C,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;QACtB,MAAM,EAAE,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YACxB,SAAS;QACX,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACb,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,6BAA6B,CACjD,WAAwB,EACxB,SAAiB,EACjB,KAA2B;IAE3B,MAAM,oBAAoB,GAAG,cAAc,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAClE,MAAM,gBAAgB,GAAG,cAAc,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC1D,IAAI,iBAAiB,GAAa,EAAE,CAAC;IAErC,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAClD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,WAAW,CAAC,YAAY,EAAE,EAAE,CAAC;QAC9C,iBAAiB,GAAG,IAAA,oDAAsB,EAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,KAAK,MAAM,EAAE,IAAI,oBAAoB,EAAE,CAAC;QACtC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,CAAC;IAChE,CAAC;IACD,KAAK,MAAM,EAAE,IAAI,gBAAgB,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,CAAC;IAChE,CAAC;IACD,KAAK,MAAM,EAAE,IAAI,iBAAiB,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,WAAW,CAAC,WAAW,EAAE,CAAC;QAChD,MAAM,WAAW,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IAED,OAAO;QACL,SAAS;QACT,SAAS,EAAE,KAAK,CAAC,MAAM;QACvB,KAAK;QACL,oBAAoB;QACpB,gBAAgB;QAChB,iBAAiB;KAClB,CAAC;AACJ,CAAC"}