@knowledgine/core 0.2.0 → 0.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 (107) hide show
  1. package/dist/config/config-loader.d.ts +22 -2
  2. package/dist/config/config-loader.d.ts.map +1 -1
  3. package/dist/config/config-loader.js +50 -15
  4. package/dist/config/config-loader.js.map +1 -1
  5. package/dist/embedding/model-downloader.d.ts.map +1 -1
  6. package/dist/embedding/model-downloader.js +31 -12
  7. package/dist/embedding/model-downloader.js.map +1 -1
  8. package/dist/extraction/causal-link-detector.d.ts +16 -0
  9. package/dist/extraction/causal-link-detector.d.ts.map +1 -0
  10. package/dist/extraction/causal-link-detector.js +142 -0
  11. package/dist/extraction/causal-link-detector.js.map +1 -0
  12. package/dist/extraction/incremental-extractor.d.ts +21 -0
  13. package/dist/extraction/incremental-extractor.d.ts.map +1 -0
  14. package/dist/extraction/incremental-extractor.js +113 -0
  15. package/dist/extraction/incremental-extractor.js.map +1 -0
  16. package/dist/extraction/psp-detector.d.ts +3 -3
  17. package/dist/extraction/psp-detector.d.ts.map +1 -1
  18. package/dist/extraction/psp-detector.js +51 -3
  19. package/dist/extraction/psp-detector.js.map +1 -1
  20. package/dist/feedback/feedback-learner.d.ts.map +1 -1
  21. package/dist/feedback/feedback-learner.js.map +1 -1
  22. package/dist/feedback/feedback-repository.d.ts.map +1 -1
  23. package/dist/feedback/feedback-repository.js +2 -6
  24. package/dist/feedback/feedback-repository.js.map +1 -1
  25. package/dist/graph/entity-extractor.d.ts +3 -0
  26. package/dist/graph/entity-extractor.d.ts.map +1 -1
  27. package/dist/graph/entity-extractor.js +82 -10
  28. package/dist/graph/entity-extractor.js.map +1 -1
  29. package/dist/graph/graph-repository.d.ts +5 -5
  30. package/dist/graph/graph-repository.d.ts.map +1 -1
  31. package/dist/graph/graph-repository.js +12 -12
  32. package/dist/graph/graph-repository.js.map +1 -1
  33. package/dist/index.d.ts +18 -3
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +28 -3
  36. package/dist/index.js.map +1 -1
  37. package/dist/llm/errors.d.ts +8 -0
  38. package/dist/llm/errors.d.ts.map +1 -0
  39. package/dist/llm/errors.js +11 -0
  40. package/dist/llm/errors.js.map +1 -0
  41. package/dist/llm/index.d.ts +7 -0
  42. package/dist/llm/index.d.ts.map +1 -0
  43. package/dist/llm/index.js +5 -0
  44. package/dist/llm/index.js.map +1 -0
  45. package/dist/llm/ollama-provider.d.ts +13 -0
  46. package/dist/llm/ollama-provider.d.ts.map +1 -0
  47. package/dist/llm/ollama-provider.js +130 -0
  48. package/dist/llm/ollama-provider.js.map +1 -0
  49. package/dist/llm/openai-provider.d.ts +15 -0
  50. package/dist/llm/openai-provider.d.ts.map +1 -0
  51. package/dist/llm/openai-provider.js +143 -0
  52. package/dist/llm/openai-provider.js.map +1 -0
  53. package/dist/llm/provider-factory.d.ts +3 -0
  54. package/dist/llm/provider-factory.d.ts.map +1 -0
  55. package/dist/llm/provider-factory.js +25 -0
  56. package/dist/llm/provider-factory.js.map +1 -0
  57. package/dist/llm/types.d.ts +50 -0
  58. package/dist/llm/types.d.ts.map +1 -0
  59. package/dist/llm/types.js +2 -0
  60. package/dist/llm/types.js.map +1 -0
  61. package/dist/provenance/provenance-repository.d.ts +23 -22
  62. package/dist/provenance/provenance-repository.d.ts.map +1 -1
  63. package/dist/provenance/provenance-repository.js +82 -44
  64. package/dist/provenance/provenance-repository.js.map +1 -1
  65. package/dist/search/hybrid-searcher.js +2 -2
  66. package/dist/search/hybrid-searcher.js.map +1 -1
  67. package/dist/search/knowledge-searcher.d.ts +10 -1
  68. package/dist/search/knowledge-searcher.d.ts.map +1 -1
  69. package/dist/search/knowledge-searcher.js +78 -30
  70. package/dist/search/knowledge-searcher.js.map +1 -1
  71. package/dist/search/reasoning-reranker.d.ts +59 -0
  72. package/dist/search/reasoning-reranker.d.ts.map +1 -0
  73. package/dist/search/reasoning-reranker.js +334 -0
  74. package/dist/search/reasoning-reranker.js.map +1 -0
  75. package/dist/search/semantic-searcher.d.ts.map +1 -1
  76. package/dist/search/semantic-searcher.js +3 -2
  77. package/dist/search/semantic-searcher.js.map +1 -1
  78. package/dist/services/knowledge-service.d.ts +4 -0
  79. package/dist/services/knowledge-service.d.ts.map +1 -1
  80. package/dist/services/knowledge-service.js +9 -2
  81. package/dist/services/knowledge-service.js.map +1 -1
  82. package/dist/storage/database.d.ts.map +1 -1
  83. package/dist/storage/database.js +60 -5
  84. package/dist/storage/database.js.map +1 -1
  85. package/dist/storage/knowledge-repository.d.ts +66 -1
  86. package/dist/storage/knowledge-repository.d.ts.map +1 -1
  87. package/dist/storage/knowledge-repository.js +131 -10
  88. package/dist/storage/knowledge-repository.js.map +1 -1
  89. package/dist/storage/migrations/007_spec_alignment.d.ts +3 -0
  90. package/dist/storage/migrations/007_spec_alignment.d.ts.map +1 -0
  91. package/dist/storage/migrations/007_spec_alignment.js +116 -0
  92. package/dist/storage/migrations/007_spec_alignment.js.map +1 -0
  93. package/dist/storage/migrations/008_knowledge_versioning.d.ts +15 -0
  94. package/dist/storage/migrations/008_knowledge_versioning.d.ts.map +1 -0
  95. package/dist/storage/migrations/008_knowledge_versioning.js +69 -0
  96. package/dist/storage/migrations/008_knowledge_versioning.js.map +1 -0
  97. package/dist/storage/migrations/009_extraction_metadata.d.ts +12 -0
  98. package/dist/storage/migrations/009_extraction_metadata.d.ts.map +1 -0
  99. package/dist/storage/migrations/009_extraction_metadata.js +39 -0
  100. package/dist/storage/migrations/009_extraction_metadata.js.map +1 -0
  101. package/dist/storage/migrator.d.ts +3 -1
  102. package/dist/storage/migrator.d.ts.map +1 -1
  103. package/dist/storage/migrator.js +2 -1
  104. package/dist/storage/migrator.js.map +1 -1
  105. package/dist/types.d.ts +2 -0
  106. package/dist/types.d.ts.map +1 -1
  107. package/package.json +1 -1
@@ -1,6 +1,20 @@
1
1
  import type { KnowledgineConfig } from "../config.js";
2
2
  export interface RcConfig {
3
3
  semantic?: boolean;
4
+ defaultPath?: string;
5
+ plugins?: {
6
+ enabled?: string[];
7
+ [pluginId: string]: unknown;
8
+ };
9
+ search?: {
10
+ defaultMode?: "keyword" | "semantic" | "hybrid";
11
+ defaultLimit?: number;
12
+ };
13
+ serve?: {
14
+ defaultPort?: number;
15
+ host?: string;
16
+ };
17
+ llm?: import("../llm/types.js").LLMConfig;
4
18
  [key: string]: unknown;
5
19
  }
6
20
  /**
@@ -9,7 +23,13 @@ export interface RcConfig {
9
23
  */
10
24
  export declare function loadConfig(rootPath: string): KnowledgineConfig;
11
25
  /**
12
- * Write a .knowledginerc.json config file to the project root.
26
+ * Resolve the default root path.
27
+ * Priority: cliPath > KNOWLEDGINE_PATH env > cwd/.knowledginerc.json defaultPath > cwd
13
28
  */
14
- export declare function writeRcConfig(rootPath: string, config: RcConfig): void;
29
+ export declare function resolveDefaultPath(cliPath?: string): string;
30
+ /**
31
+ * Write a .knowledginerc.json config file to the specified directory.
32
+ * Merges with existing config if present.
33
+ */
34
+ export declare function writeRcConfig(dirPath: string, config: RcConfig): void;
15
35
  //# sourceMappingURL=config-loader.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/config/config-loader.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEtD,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,CAgB9D;AAqBD;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI,CAGtE"}
1
+ {"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/config/config-loader.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEtD,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC;IAC9D,MAAM,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACpF,KAAK,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChD,GAAG,CAAC,EAAE,OAAO,iBAAiB,EAAE,SAAS,CAAC;IAC1C,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,CAgB9D;AA2BD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAW3D;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI,CAYrE"}
@@ -20,27 +20,62 @@ export function loadConfig(rootPath) {
20
20
  },
21
21
  });
22
22
  }
23
- function loadRcFile(rootPath) {
24
- const jsonPath = resolve(rootPath, ".knowledginerc.json");
25
- const ymlPath = resolve(rootPath, ".knowledginerc.yml");
26
- try {
27
- if (existsSync(jsonPath)) {
28
- return JSON.parse(readFileSync(jsonPath, "utf-8"));
23
+ function loadRcFile(startDir) {
24
+ let dir = startDir;
25
+ for (let i = 0; i < 5; i++) {
26
+ const jsonPath = resolve(dir, ".knowledginerc.json");
27
+ const ymlPath = resolve(dir, ".knowledginerc.yml");
28
+ try {
29
+ if (existsSync(jsonPath)) {
30
+ return JSON.parse(readFileSync(jsonPath, "utf-8"));
31
+ }
32
+ if (existsSync(ymlPath)) {
33
+ return parseYaml(readFileSync(ymlPath, "utf-8"));
34
+ }
29
35
  }
30
- if (existsSync(ymlPath)) {
31
- return parseYaml(readFileSync(ymlPath, "utf-8"));
36
+ catch (error) {
37
+ console.error(`Warning: Failed to parse config file: ${error instanceof Error ? error.message : String(error)}`);
38
+ return null;
32
39
  }
33
- }
34
- catch (error) {
35
- console.error(`Warning: Failed to parse config file: ${error instanceof Error ? error.message : String(error)}`);
40
+ const parent = resolve(dir, "..");
41
+ if (parent === dir)
42
+ break; // ルートに到達
43
+ dir = parent;
36
44
  }
37
45
  return null;
38
46
  }
39
47
  /**
40
- * Write a .knowledginerc.json config file to the project root.
48
+ * Resolve the default root path.
49
+ * Priority: cliPath > KNOWLEDGINE_PATH env > cwd/.knowledginerc.json defaultPath > cwd
50
+ */
51
+ export function resolveDefaultPath(cliPath) {
52
+ if (cliPath)
53
+ return resolve(cliPath);
54
+ const envPath = process.env["KNOWLEDGINE_PATH"];
55
+ if (envPath)
56
+ return resolve(envPath);
57
+ // Read from cwd's .knowledginerc.json (NOT rootPath's — avoids circular dependency)
58
+ const rcConfig = loadRcFile(process.cwd());
59
+ if (rcConfig?.defaultPath)
60
+ return resolve(rcConfig.defaultPath);
61
+ return resolve(process.cwd());
62
+ }
63
+ /**
64
+ * Write a .knowledginerc.json config file to the specified directory.
65
+ * Merges with existing config if present.
41
66
  */
42
- export function writeRcConfig(rootPath, config) {
43
- const rcPath = resolve(rootPath, ".knowledginerc.json");
44
- writeFileSync(rcPath, JSON.stringify(config, null, 2) + "\n");
67
+ export function writeRcConfig(dirPath, config) {
68
+ const rcPath = resolve(dirPath, ".knowledginerc.json");
69
+ let existing = {};
70
+ try {
71
+ if (existsSync(rcPath)) {
72
+ existing = JSON.parse(readFileSync(rcPath, "utf-8"));
73
+ }
74
+ }
75
+ catch {
76
+ // If existing file is invalid, overwrite it
77
+ }
78
+ const merged = { ...existing, ...config };
79
+ writeFileSync(rcPath, JSON.stringify(merged, null, 2) + "\n");
45
80
  }
46
81
  //# sourceMappingURL=config-loader.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/config/config-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAQ5C;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,QAAgB;IACzC,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAEtC,gCAAgC;IAChC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACxD,MAAM,eAAe,GACnB,WAAW,KAAK,MAAM,IAAI,WAAW,KAAK,GAAG,IAAI,QAAQ,EAAE,QAAQ,KAAK,IAAI,CAAC;IAE/E,OAAO,YAAY,CAAC;QAClB,QAAQ;QACR,SAAS,EAAE;YACT,SAAS,EAAE,kBAAkB;YAC7B,UAAU,EAAE,GAAG;YACf,OAAO,EAAE,eAAe;SACzB;KACF,CAAC,CAAC;AACL,CAAC;AAED,SAAS,UAAU,CAAC,QAAgB;IAClC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC;IAExD,IAAI,CAAC;QACH,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAa,CAAC;QACjE,CAAC;QACD,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,OAAO,SAAS,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAa,CAAC;QAC/D,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,yCAAyC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAClG,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,MAAgB;IAC9D,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAC;IACxD,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AAChE,CAAC"}
1
+ {"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/config/config-loader.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"model-downloader.d.ts","sourceRoot":"","sources":["../../src/embedding/model-downloader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAClD,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED,eAAO,MAAM,WAAW,EAAE,SAAS,EAalC,CAAC;AAyHF,wBAAsB,aAAa,CACjC,YAAY,EAAE,YAAY,EAC1B,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAqBtD"}
1
+ {"version":3,"file":"model-downloader.d.ts","sourceRoot":"","sources":["../../src/embedding/model-downloader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAClD,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAkBD,eAAO,MAAM,WAAW,EAAE,SAAS,EAalC,CAAC;AAgIF,wBAAsB,aAAa,CACjC,YAAY,EAAE,YAAY,EAC1B,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAqBtD"}
@@ -14,17 +14,31 @@ import { mkdirSync, renameSync, unlinkSync, existsSync, statSync, createWriteStr
14
14
  import { get as httpsGet } from "https";
15
15
  import { get as httpGet } from "http";
16
16
  import { pipeline } from "stream/promises";
17
+ const HF_BASE = "https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main";
18
+ /**
19
+ * Select the best quantized ONNX model for the current platform.
20
+ * HuggingFace removed the generic `model_quantized.onnx` and now ships
21
+ * architecture-specific variants.
22
+ */
23
+ function selectOnnxModel() {
24
+ const arch = process.arch; // "arm64" | "x64" | ...
25
+ if (arch === "arm64") {
26
+ return `${HF_BASE}/onnx/model_qint8_arm64.onnx`;
27
+ }
28
+ // x64: prefer AVX2 quantized (widely supported on modern x86_64)
29
+ return `${HF_BASE}/onnx/model_quint8_avx2.onnx`;
30
+ }
17
31
  export const MODEL_FILES = [
18
32
  {
19
- url: "https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/tokenizer.json",
33
+ url: `${HF_BASE}/tokenizer.json`,
20
34
  dest: "tokenizer.json",
21
35
  },
22
36
  {
23
- url: "https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/config.json",
37
+ url: `${HF_BASE}/config.json`,
24
38
  dest: "config.json",
25
39
  },
26
40
  {
27
- url: "https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/onnx/model_quantized.onnx",
41
+ url: selectOnnxModel(),
28
42
  dest: "model.onnx",
29
43
  },
30
44
  ];
@@ -58,24 +72,23 @@ function downloadFile(url, destPath, options, fileName, redirectCount = 0) {
58
72
  };
59
73
  process.on("SIGINT", onSigint);
60
74
  const getFunc = url.startsWith("http://") ? httpGet : httpsGet;
61
- const timer = setTimeout(() => {
62
- aborted = true;
63
- req.destroy();
64
- cleanup();
65
- reject(new Error(`Download timeout (${timeoutMs}ms) for ${fileName}`));
66
- }, timeoutMs);
67
75
  const req = getFunc(url, (response) => {
68
76
  if (aborted)
69
77
  return;
70
78
  // Handle redirects (301, 302, 307, 308)
71
- if (response.statusCode === 301 || response.statusCode === 302 || response.statusCode === 307 || response.statusCode === 308) {
79
+ if (response.statusCode === 301 ||
80
+ response.statusCode === 302 ||
81
+ response.statusCode === 307 ||
82
+ response.statusCode === 308) {
72
83
  clearTimeout(timer);
73
84
  process.removeListener("SIGINT", onSigint);
74
- const location = response.headers.location;
75
- if (!location) {
85
+ const rawLocation = response.headers.location;
86
+ if (!rawLocation) {
76
87
  reject(new Error(`Redirect without location header for ${url}`));
77
88
  return;
78
89
  }
90
+ // Handle relative redirect URLs by resolving against the original URL
91
+ const location = rawLocation.startsWith("/") ? new URL(rawLocation, url).href : rawLocation;
79
92
  downloadFile(location, destPath, options, fileName, redirectCount + 1)
80
93
  .then(resolve)
81
94
  .catch(reject);
@@ -121,6 +134,12 @@ function downloadFile(url, destPath, options, fileName, redirectCount = 0) {
121
134
  reject(err);
122
135
  });
123
136
  });
137
+ const timer = setTimeout(() => {
138
+ aborted = true;
139
+ req.destroy();
140
+ cleanup();
141
+ reject(new Error(`Download timeout (${timeoutMs}ms) for ${fileName}`));
142
+ }, timeoutMs);
124
143
  req.on("error", (err) => {
125
144
  clearTimeout(timer);
126
145
  process.removeListener("SIGINT", onSigint);
@@ -1 +1 @@
1
- {"version":3,"file":"model-downloader.js","sourceRoot":"","sources":["../../src/embedding/model-downloader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,IAAI,CAAC;AAChG,OAAO,EAAE,GAAG,IAAI,QAAQ,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,GAAG,IAAI,OAAO,EAAE,MAAM,MAAM,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAqB3C,MAAM,CAAC,MAAM,WAAW,GAAgB;IACtC;QACE,GAAG,EAAE,2FAA2F;QAChG,IAAI,EAAE,gBAAgB;KACvB;IACD;QACE,GAAG,EAAE,wFAAwF;QAC7F,IAAI,EAAE,aAAa;KACpB;IACD;QACE,GAAG,EAAE,sGAAsG;QAC3G,IAAI,EAAE,YAAY;KACnB;CACF,CAAC;AAEF,SAAS,kBAAkB,CAAC,QAAgB;IAC1C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAChC,OAAO,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;AACvB,CAAC;AAED,SAAS,YAAY,CACnB,GAAW,EACX,QAAgB,EAChB,OAAwB,EACxB,QAAgB,EAChB,gBAAwB,CAAC;IAEzB,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,CAAC,YAAY;IAE5D,IAAI,aAAa,GAAG,YAAY,EAAE,CAAC;QACjC,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,uBAAuB,YAAY,SAAS,GAAG,EAAE,CAAC,CAAC,CAAC;IACtF,CAAC;IAED,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC3C,MAAM,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;QAClC,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,MAAM,OAAO,GAAG,GAAS,EAAE;YACzB,IAAI,CAAC;gBACH,IAAI,UAAU,CAAC,OAAO,CAAC;oBAAE,UAAU,CAAC,OAAO,CAAC,CAAC;YAC/C,CAAC;YAAC,MAAM,CAAC;gBACP,wBAAwB;YAC1B,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,QAAQ,GAAG,GAAS,EAAE;YAC1B,OAAO,GAAG,IAAI,CAAC;YACf,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;QACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAE/B,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;QAE/D,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,OAAO,GAAG,IAAI,CAAC;YACf,GAAG,CAAC,OAAO,EAAE,CAAC;YACd,OAAO,EAAE,CAAC;YACV,MAAM,CAAC,IAAI,KAAK,CAAC,qBAAqB,SAAS,WAAW,QAAQ,EAAE,CAAC,CAAC,CAAC;QACzE,CAAC,EAAE,SAAS,CAAC,CAAC;QAEd,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE;YACpC,IAAI,OAAO;gBAAE,OAAO;YAEpB,wCAAwC;YACxC,IAAI,QAAQ,CAAC,UAAU,KAAK,GAAG,IAAI,QAAQ,CAAC,UAAU,KAAK,GAAG,IAAI,QAAQ,CAAC,UAAU,KAAK,GAAG,IAAI,QAAQ,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;gBAC7H,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBAC3C,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC;gBAC3C,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,MAAM,CAAC,IAAI,KAAK,CAAC,wCAAwC,GAAG,EAAE,CAAC,CAAC,CAAC;oBACjE,OAAO;gBACT,CAAC;gBACD,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,GAAG,CAAC,CAAC;qBACnE,IAAI,CAAC,OAAO,CAAC;qBACb,KAAK,CAAC,MAAM,CAAC,CAAC;gBACjB,OAAO;YACT,CAAC;YAED,IAAI,QAAQ,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;gBAChC,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBAC3C,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,QAAQ,CAAC,UAAU,QAAQ,QAAQ,EAAE,CAAC,CAAC,CAAC;gBACjE,OAAO;YACT,CAAC;YAED,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC;gBAClD,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,EAAE,CAAC;gBAClD,CAAC,CAAC,IAAI,CAAC;YAET,IAAI,UAAU,GAAG,CAAC,CAAC;YACnB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBACpC,UAAU,IAAI,KAAK,CAAC,MAAM,CAAC;gBAC3B,OAAO,CAAC,UAAU,EAAE,CAAC;oBACnB,IAAI,EAAE,QAAQ;oBACd,UAAU;oBACV,KAAK,EAAE,SAAS;iBACjB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,MAAM,UAAU,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAE9C,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC;iBAC3B,IAAI,CAAC,GAAG,EAAE;gBACT,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBAC3C,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO,EAAE,CAAC;oBACV,MAAM,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC;oBACtC,OAAO;gBACT,CAAC;gBACD,gBAAgB;gBAChB,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;gBAC9B,OAAO,CAAC,cAAc,EAAE,CAAC,QAAQ,CAAC,CAAC;gBACnC,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACb,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBAC3C,OAAO,EAAE,CAAC;gBACV,MAAM,CAAC,GAAG,CAAC,CAAC;YACd,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACtB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC3C,OAAO,EAAE,CAAC;YACV,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,YAA0B,EAC1B,UAA2B,EAAE;IAE7B,MAAM,QAAQ,GAAG,YAAY,CAAC,WAAW,EAAE,CAAC;IAC5C,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEzC,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,GAAG,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QAE5C,IAAI,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxB,OAAO,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpC,SAAS;QACX,CAAC;QAED,MAAM,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;AACjC,CAAC"}
1
+ {"version":3,"file":"model-downloader.js","sourceRoot":"","sources":["../../src/embedding/model-downloader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { KnowledgeRepository } from "../storage/knowledge-repository.js";
2
+ export interface CausalLinkSummary {
3
+ causedLinks: number;
4
+ includedInLinks: number;
5
+ triggeredLinks: number;
6
+ errors: number;
7
+ }
8
+ export declare class CausalLinkDetector {
9
+ private repository;
10
+ constructor(repository: KnowledgeRepository);
11
+ detectAll(): CausalLinkSummary;
12
+ detectSessionToCommitLinks(): number;
13
+ detectCommitToPRLinks(): number;
14
+ detectReviewToFixCommitLinks(): number;
15
+ }
16
+ //# sourceMappingURL=causal-link-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"causal-link-detector.d.ts","sourceRoot":"","sources":["../../src/extraction/causal-link-detector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAiB,MAAM,oCAAoC,CAAC;AAE7F,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB;AAoCD,qBAAa,kBAAkB;IACjB,OAAO,CAAC,UAAU;gBAAV,UAAU,EAAE,mBAAmB;IAEnD,SAAS,IAAI,iBAAiB;IA2B9B,0BAA0B,IAAI,MAAM;IAgCpC,qBAAqB,IAAI,MAAM;IAuB/B,4BAA4B,IAAI,MAAM;CA+BvC"}
@@ -0,0 +1,142 @@
1
+ const SESSION_TO_COMMIT_THRESHOLD_SECONDS = 1800; // strictly less than
2
+ const REVIEW_TO_COMMIT_THRESHOLD_SECONDS = 24 * 60 * 60; // 24 hours
3
+ function parseFrontmatter(note) {
4
+ if (!note.frontmatter_json)
5
+ return {};
6
+ try {
7
+ return JSON.parse(note.frontmatter_json);
8
+ }
9
+ catch {
10
+ return {};
11
+ }
12
+ }
13
+ function getTimestampSeconds(isoString) {
14
+ if (!isoString)
15
+ return null;
16
+ const ms = Date.parse(isoString);
17
+ if (isNaN(ms))
18
+ return null;
19
+ return ms / 1000;
20
+ }
21
+ function extractCommitShaFromUri(uri) {
22
+ // git://commit/<sha> パターンから SHA を抽出
23
+ const match = /git:\/\/commit\/([0-9a-f]+)/i.exec(uri);
24
+ return match ? match[1] : null;
25
+ }
26
+ function isPrNote(note) {
27
+ // github://repos/... の形式で "reviews" を含まないもの
28
+ return note.file_path.startsWith("github://") && !note.file_path.includes("/reviews/");
29
+ }
30
+ function isReviewNote(note) {
31
+ return note.file_path.includes("/reviews/");
32
+ }
33
+ export class CausalLinkDetector {
34
+ repository;
35
+ constructor(repository) {
36
+ this.repository = repository;
37
+ }
38
+ detectAll() {
39
+ let errors = 0;
40
+ let causedLinks = 0;
41
+ let includedInLinks = 0;
42
+ let triggeredLinks = 0;
43
+ try {
44
+ causedLinks = this.detectSessionToCommitLinks();
45
+ }
46
+ catch {
47
+ errors++;
48
+ }
49
+ try {
50
+ includedInLinks = this.detectCommitToPRLinks();
51
+ }
52
+ catch {
53
+ errors++;
54
+ }
55
+ try {
56
+ triggeredLinks = this.detectReviewToFixCommitLinks();
57
+ }
58
+ catch {
59
+ errors++;
60
+ }
61
+ return { causedLinks, includedInLinks, triggeredLinks, errors };
62
+ }
63
+ detectSessionToCommitLinks() {
64
+ const sessions = this.repository.getNotesBySourceUriPrefix("claude-session://");
65
+ const commits = this.repository.getNotesBySourceUriPrefix("git://commit/");
66
+ let linked = 0;
67
+ for (const session of sessions) {
68
+ const sessionFm = parseFrontmatter(session);
69
+ const sessionBranch = typeof sessionFm["gitBranch"] === "string" ? sessionFm["gitBranch"] : null;
70
+ const sessionTs = getTimestampSeconds(session.created_at);
71
+ if (sessionTs === null || !sessionBranch)
72
+ continue;
73
+ for (const commit of commits) {
74
+ const commitFm = parseFrontmatter(commit);
75
+ const commitBranch = typeof commitFm["branch"] === "string" ? commitFm["branch"] : null;
76
+ const commitTs = getTimestampSeconds(commit.created_at);
77
+ if (commitTs === null || !commitBranch)
78
+ continue;
79
+ if (sessionBranch !== commitBranch)
80
+ continue;
81
+ const diffSeconds = commitTs - sessionTs;
82
+ if (diffSeconds < 0 || diffSeconds >= SESSION_TO_COMMIT_THRESHOLD_SECONDS)
83
+ continue;
84
+ const saved = this.repository.saveNoteLinkIfNotExists(session.id, commit.id, "caused");
85
+ if (saved)
86
+ linked++;
87
+ }
88
+ }
89
+ return linked;
90
+ }
91
+ detectCommitToPRLinks() {
92
+ const commits = this.repository.getNotesBySourceUriPrefix("git://commit/");
93
+ const allGithub = this.repository.getNotesBySourceUriPrefix("github://");
94
+ const prs = allGithub.filter(isPrNote);
95
+ let linked = 0;
96
+ for (const commit of commits) {
97
+ const sha = extractCommitShaFromUri(commit.file_path);
98
+ if (!sha || sha.length < 7)
99
+ continue;
100
+ // 7文字以上のプレフィックスでマッチ
101
+ for (const pr of prs) {
102
+ const shortSha = sha.slice(0, 7);
103
+ if (!pr.content.includes(shortSha) && !pr.content.includes(sha))
104
+ continue;
105
+ const saved = this.repository.saveNoteLinkIfNotExists(commit.id, pr.id, "included_in");
106
+ if (saved)
107
+ linked++;
108
+ }
109
+ }
110
+ return linked;
111
+ }
112
+ detectReviewToFixCommitLinks() {
113
+ const allGithub = this.repository.getNotesBySourceUriPrefix("github://");
114
+ const reviews = allGithub.filter(isReviewNote);
115
+ const commits = this.repository.getNotesBySourceUriPrefix("git://commit/");
116
+ let linked = 0;
117
+ for (const review of reviews) {
118
+ const reviewFm = parseFrontmatter(review);
119
+ const reviewBranch = typeof reviewFm["branch"] === "string" ? reviewFm["branch"] : null;
120
+ const reviewTs = getTimestampSeconds(review.created_at);
121
+ if (reviewTs === null || !reviewBranch)
122
+ continue;
123
+ for (const commit of commits) {
124
+ const commitFm = parseFrontmatter(commit);
125
+ const commitBranch = typeof commitFm["branch"] === "string" ? commitFm["branch"] : null;
126
+ const commitTs = getTimestampSeconds(commit.created_at);
127
+ if (commitTs === null || !commitBranch)
128
+ continue;
129
+ if (reviewBranch !== commitBranch)
130
+ continue;
131
+ const diffSeconds = commitTs - reviewTs;
132
+ if (diffSeconds < 0 || diffSeconds > REVIEW_TO_COMMIT_THRESHOLD_SECONDS)
133
+ continue;
134
+ const saved = this.repository.saveNoteLinkIfNotExists(review.id, commit.id, "triggered");
135
+ if (saved)
136
+ linked++;
137
+ }
138
+ }
139
+ return linked;
140
+ }
141
+ }
142
+ //# sourceMappingURL=causal-link-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"causal-link-detector.js","sourceRoot":"","sources":["../../src/extraction/causal-link-detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { KnowledgeRepository } from "../storage/knowledge-repository.js";
2
+ import type { GraphRepository } from "../graph/graph-repository.js";
3
+ export interface ExtractionSummary {
4
+ processedNotes: number;
5
+ totalEntities: number;
6
+ totalRelations: number;
7
+ totalPatterns: number;
8
+ errors: number;
9
+ }
10
+ /**
11
+ * 指定した noteIds に対してパターン抽出・エンティティ抽出・関係推論を実行する。
12
+ * 各 ingest ソース (GitHub, git-history, capture, MCP 等) 完了後に呼び出すことで
13
+ * 増分的な抽出を実現する。
14
+ */
15
+ export declare class IncrementalExtractor {
16
+ private repository;
17
+ private graphRepository;
18
+ constructor(repository: KnowledgeRepository, graphRepository: GraphRepository);
19
+ process(noteIds: number[], onProgress?: (current: number, total: number) => void): Promise<ExtractionSummary>;
20
+ }
21
+ //# sourceMappingURL=incremental-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"incremental-extractor.d.ts","sourceRoot":"","sources":["../../src/extraction/incremental-extractor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAOpE,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB;AAoBD;;;;GAIG;AACH,qBAAa,oBAAoB;IAE7B,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,eAAe;gBADf,UAAU,EAAE,mBAAmB,EAC/B,eAAe,EAAE,eAAe;IAGpC,OAAO,CACX,OAAO,EAAE,MAAM,EAAE,EACjB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GACpD,OAAO,CAAC,iBAAiB,CAAC;CA2F9B"}
@@ -0,0 +1,113 @@
1
+ import { PatternExtractor } from "./pattern-extractor.js";
2
+ import { EntityExtractor } from "../graph/entity-extractor.js";
3
+ import { RelationInferrer } from "../graph/relation-inferrer.js";
4
+ const CHUNK_SIZE = 999; // SQLite IN句の変数制限対策
5
+ /**
6
+ * パターンを (type, lineNumber, content) キーで重複排除する
7
+ */
8
+ function deduplicatePatterns(patterns) {
9
+ const seen = new Set();
10
+ const result = [];
11
+ for (const p of patterns) {
12
+ const key = JSON.stringify([p.type, p.lineNumber ?? null, p.content]);
13
+ if (!seen.has(key)) {
14
+ seen.add(key);
15
+ result.push(p);
16
+ }
17
+ }
18
+ return result;
19
+ }
20
+ /**
21
+ * 指定した noteIds に対してパターン抽出・エンティティ抽出・関係推論を実行する。
22
+ * 各 ingest ソース (GitHub, git-history, capture, MCP 等) 完了後に呼び出すことで
23
+ * 増分的な抽出を実現する。
24
+ */
25
+ export class IncrementalExtractor {
26
+ repository;
27
+ graphRepository;
28
+ constructor(repository, graphRepository) {
29
+ this.repository = repository;
30
+ this.graphRepository = graphRepository;
31
+ }
32
+ async process(noteIds, onProgress) {
33
+ // 1. 重複排除
34
+ const uniqueIds = [...new Set(noteIds)];
35
+ const total = uniqueIds.length;
36
+ if (total === 0) {
37
+ return {
38
+ processedNotes: 0,
39
+ totalEntities: 0,
40
+ totalRelations: 0,
41
+ totalPatterns: 0,
42
+ errors: 0,
43
+ };
44
+ }
45
+ const patternExtractor = new PatternExtractor();
46
+ const entityExtractor = new EntityExtractor();
47
+ const inferrer = new RelationInferrer();
48
+ let processedNotes = 0;
49
+ let totalEntities = 0;
50
+ let totalRelations = 0;
51
+ let totalPatterns = 0;
52
+ let errors = 0;
53
+ // 2. チャンク分割(SQLite IN句の変数制限対策)
54
+ for (let chunkStart = 0; chunkStart < total; chunkStart += CHUNK_SIZE) {
55
+ const chunk = uniqueIds.slice(chunkStart, chunkStart + CHUNK_SIZE);
56
+ for (const noteId of chunk) {
57
+ try {
58
+ const note = this.repository.getNoteById(noteId);
59
+ if (!note) {
60
+ errors++;
61
+ continue;
62
+ }
63
+ const frontmatter = note.frontmatter_json ? JSON.parse(note.frontmatter_json) : {};
64
+ const now = new Date().toISOString();
65
+ // パターン抽出
66
+ const dailyPatterns = patternExtractor.extractDailyPatterns(note.content);
67
+ const ticketPatterns = patternExtractor.extractTicketPatterns(note.content);
68
+ const allPatterns = deduplicatePatterns([...dailyPatterns, ...ticketPatterns]);
69
+ this.repository.savePatterns(note.id, allPatterns);
70
+ totalPatterns += allPatterns.length;
71
+ // エンティティ抽出
72
+ const extractedEntities = entityExtractor.extract(note.content, frontmatter);
73
+ const entityList = [];
74
+ for (const entity of extractedEntities) {
75
+ const entityId = this.graphRepository.upsertEntity({
76
+ name: entity.name,
77
+ entityType: entity.entityType,
78
+ createdAt: now,
79
+ });
80
+ this.graphRepository.linkEntityToNote(entityId, note.id);
81
+ entityList.push({ name: entity.name, entityType: entity.entityType });
82
+ }
83
+ totalEntities += extractedEntities.length;
84
+ // 関係推論
85
+ const inferredRelations = inferrer.infer(entityList, frontmatter);
86
+ for (const rel of inferredRelations) {
87
+ const fromEntity = this.graphRepository.getEntityByName(rel.fromName, rel.fromType);
88
+ const toEntity = this.graphRepository.getEntityByName(rel.toName, rel.toType);
89
+ if (fromEntity?.id && toEntity?.id) {
90
+ this.graphRepository.upsertRelation({
91
+ fromEntityId: fromEntity.id,
92
+ toEntityId: toEntity.id,
93
+ relationType: rel.relationType,
94
+ strength: rel.strength,
95
+ createdAt: now,
96
+ });
97
+ totalRelations++;
98
+ }
99
+ }
100
+ // extracted_at を更新
101
+ this.repository.updateExtractedAt(note.id);
102
+ processedNotes++;
103
+ onProgress?.(processedNotes, total);
104
+ }
105
+ catch {
106
+ errors++;
107
+ }
108
+ }
109
+ }
110
+ return { processedNotes, totalEntities, totalRelations, totalPatterns, errors };
111
+ }
112
+ }
113
+ //# sourceMappingURL=incremental-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"incremental-extractor.js","sourceRoot":"","sources":["../../src/extraction/incremental-extractor.ts"],"names":[],"mappings":"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"}
@@ -17,13 +17,13 @@ export declare class ProblemSolutionDetector {
17
17
  category: string;
18
18
  confidence: number;
19
19
  }>): DetectedPair[];
20
- detectPairsAcrossNotes(_problemNote: {
20
+ detectPairsAcrossNotes(problemNote: {
21
21
  id: number;
22
22
  patterns: ExtractedPattern[];
23
- }, _solutionNote: {
23
+ }, solutionNote: {
24
24
  id: number;
25
25
  patterns: ExtractedPattern[];
26
26
  createdAt: string;
27
- }, _problemNoteCreatedAt: string): DetectedPair[];
27
+ }, problemNoteCreatedAt: string): DetectedPair[];
28
28
  }
29
29
  //# sourceMappingURL=psp-detector.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"psp-detector.d.ts","sourceRoot":"","sources":["../../src/extraction/psp-detector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,uBAAuB;IAClC,iBAAiB,CACf,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,EACtE,eAAe,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,GAClF,YAAY,EAAE;IA+CjB,sBAAsB,CACpB,YAAY,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,gBAAgB,EAAE,CAAA;KAAE,EAC1D,aAAa,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,gBAAgB,EAAE,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,EAC9E,qBAAqB,EAAE,MAAM,GAC5B,YAAY,EAAE;CAIlB"}
1
+ {"version":3,"file":"psp-detector.d.ts","sourceRoot":"","sources":["../../src/extraction/psp-detector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AA0BpD,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,uBAAuB;IAClC,iBAAiB,CACf,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,EACtE,eAAe,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,GAClF,YAAY,EAAE;IA+CjB,sBAAsB,CACpB,WAAW,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,gBAAgB,EAAE,CAAA;KAAE,EACzD,YAAY,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,gBAAgB,EAAE,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,EAC7E,oBAAoB,EAAE,MAAM,GAC3B,YAAY,EAAE;CAuClB"}