homegraph 1.1.3 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (246) hide show
  1. package/README.md +43 -18
  2. package/dist/arkts/ohos-api-index.d.ts +15 -0
  3. package/dist/arkts/ohos-api-index.d.ts.map +1 -0
  4. package/dist/arkts/ohos-api-index.js +190 -0
  5. package/dist/arkts/ohos-api-index.js.map +1 -0
  6. package/dist/arkts/ohos-sdk-input.d.ts +36 -0
  7. package/dist/arkts/ohos-sdk-input.d.ts.map +1 -0
  8. package/dist/arkts/ohos-sdk-input.js +214 -0
  9. package/dist/arkts/ohos-sdk-input.js.map +1 -0
  10. package/dist/bin/command-supervision.d.ts +12 -0
  11. package/dist/bin/command-supervision.d.ts.map +1 -0
  12. package/dist/bin/command-supervision.js +86 -0
  13. package/dist/bin/command-supervision.js.map +1 -0
  14. package/dist/bin/homegraph.d.ts +1 -1
  15. package/dist/bin/homegraph.js +706 -168
  16. package/dist/bin/homegraph.js.map +1 -1
  17. package/dist/db/index.d.ts +20 -0
  18. package/dist/db/index.d.ts.map +1 -1
  19. package/dist/db/index.js +39 -0
  20. package/dist/db/index.js.map +1 -1
  21. package/dist/db/migrations.d.ts +1 -1
  22. package/dist/db/migrations.d.ts.map +1 -1
  23. package/dist/db/migrations.js +40 -1
  24. package/dist/db/migrations.js.map +1 -1
  25. package/dist/db/queries.d.ts +14 -0
  26. package/dist/db/queries.d.ts.map +1 -1
  27. package/dist/db/queries.js +174 -3
  28. package/dist/db/queries.js.map +1 -1
  29. package/dist/db/schema.sql +20 -0
  30. package/dist/directory.d.ts +32 -0
  31. package/dist/directory.d.ts.map +1 -1
  32. package/dist/directory.js +83 -0
  33. package/dist/directory.js.map +1 -1
  34. package/dist/extraction/arkts-batch-worker.d.ts +2 -0
  35. package/dist/extraction/arkts-batch-worker.d.ts.map +1 -0
  36. package/dist/extraction/arkts-batch-worker.js +28 -0
  37. package/dist/extraction/arkts-batch-worker.js.map +1 -0
  38. package/dist/extraction/context.d.ts +11 -0
  39. package/dist/extraction/context.d.ts.map +1 -1
  40. package/dist/extraction/context.js +20 -0
  41. package/dist/extraction/context.js.map +1 -1
  42. package/dist/extraction/index.d.ts +16 -2
  43. package/dist/extraction/index.d.ts.map +1 -1
  44. package/dist/extraction/index.js +619 -380
  45. package/dist/extraction/index.js.map +1 -1
  46. package/dist/extraction/languages/arkts-state-decorators.d.ts +13 -0
  47. package/dist/extraction/languages/arkts-state-decorators.d.ts.map +1 -0
  48. package/dist/extraction/languages/arkts-state-decorators.js +26 -0
  49. package/dist/extraction/languages/arkts-state-decorators.js.map +1 -0
  50. package/dist/extraction/languages/arkts-viewtree.d.ts +4 -2
  51. package/dist/extraction/languages/arkts-viewtree.d.ts.map +1 -1
  52. package/dist/extraction/languages/arkts-viewtree.js +21 -6
  53. package/dist/extraction/languages/arkts-viewtree.js.map +1 -1
  54. package/dist/extraction/languages/arkts.d.ts +98 -2
  55. package/dist/extraction/languages/arkts.d.ts.map +1 -1
  56. package/dist/extraction/languages/arkts.js +1290 -61
  57. package/dist/extraction/languages/arkts.js.map +1 -1
  58. package/dist/extraction/languages/c-cpp.d.ts +56 -0
  59. package/dist/extraction/languages/c-cpp.d.ts.map +1 -1
  60. package/dist/extraction/languages/c-cpp.js +198 -1
  61. package/dist/extraction/languages/c-cpp.js.map +1 -1
  62. package/dist/extraction/languages/ohos-api-consumer.d.ts +34 -0
  63. package/dist/extraction/languages/ohos-api-consumer.d.ts.map +1 -0
  64. package/dist/extraction/languages/ohos-api-consumer.js +283 -0
  65. package/dist/extraction/languages/ohos-api-consumer.js.map +1 -0
  66. package/dist/extraction/parse-pool.d.ts +126 -0
  67. package/dist/extraction/parse-pool.d.ts.map +1 -0
  68. package/dist/extraction/parse-pool.js +319 -0
  69. package/dist/extraction/parse-pool.js.map +1 -0
  70. package/dist/extraction/tree-sitter-types.d.ts +17 -0
  71. package/dist/extraction/tree-sitter-types.d.ts.map +1 -1
  72. package/dist/extraction/tree-sitter.d.ts +21 -0
  73. package/dist/extraction/tree-sitter.d.ts.map +1 -1
  74. package/dist/extraction/tree-sitter.js +198 -27
  75. package/dist/extraction/tree-sitter.js.map +1 -1
  76. package/dist/graph/traversal.d.ts.map +1 -1
  77. package/dist/graph/traversal.js +76 -17
  78. package/dist/graph/traversal.js.map +1 -1
  79. package/dist/index.d.ts +25 -0
  80. package/dist/index.d.ts.map +1 -1
  81. package/dist/index.js +78 -4
  82. package/dist/index.js.map +1 -1
  83. package/dist/mcp/daemon-paths.d.ts +30 -3
  84. package/dist/mcp/daemon-paths.d.ts.map +1 -1
  85. package/dist/mcp/daemon-paths.js +50 -10
  86. package/dist/mcp/daemon-paths.js.map +1 -1
  87. package/dist/mcp/daemon-registry.d.ts.map +1 -1
  88. package/dist/mcp/daemon-registry.js +7 -3
  89. package/dist/mcp/daemon-registry.js.map +1 -1
  90. package/dist/mcp/daemon.d.ts +48 -0
  91. package/dist/mcp/daemon.d.ts.map +1 -1
  92. package/dist/mcp/daemon.js +196 -32
  93. package/dist/mcp/daemon.js.map +1 -1
  94. package/dist/mcp/engine.d.ts +17 -0
  95. package/dist/mcp/engine.d.ts.map +1 -1
  96. package/dist/mcp/engine.js +73 -1
  97. package/dist/mcp/engine.js.map +1 -1
  98. package/dist/mcp/index.d.ts.map +1 -1
  99. package/dist/mcp/index.js +25 -43
  100. package/dist/mcp/index.js.map +1 -1
  101. package/dist/mcp/ppid-watchdog.d.ts +18 -0
  102. package/dist/mcp/ppid-watchdog.d.ts.map +1 -1
  103. package/dist/mcp/ppid-watchdog.js +37 -0
  104. package/dist/mcp/ppid-watchdog.js.map +1 -1
  105. package/dist/mcp/query-cache.d.ts +25 -0
  106. package/dist/mcp/query-cache.d.ts.map +1 -0
  107. package/dist/mcp/query-cache.js +191 -0
  108. package/dist/mcp/query-cache.js.map +1 -0
  109. package/dist/mcp/query-pool.d.ts +94 -0
  110. package/dist/mcp/query-pool.d.ts.map +1 -0
  111. package/dist/mcp/query-pool.js +297 -0
  112. package/dist/mcp/query-pool.js.map +1 -0
  113. package/dist/mcp/query-worker.d.ts +24 -0
  114. package/dist/mcp/query-worker.d.ts.map +1 -0
  115. package/dist/mcp/query-worker.js +87 -0
  116. package/dist/mcp/query-worker.js.map +1 -0
  117. package/dist/mcp/server-instructions.d.ts +5 -7
  118. package/dist/mcp/server-instructions.d.ts.map +1 -1
  119. package/dist/mcp/server-instructions.js +12 -14
  120. package/dist/mcp/server-instructions.js.map +1 -1
  121. package/dist/mcp/tools.d.ts +77 -0
  122. package/dist/mcp/tools.d.ts.map +1 -1
  123. package/dist/mcp/tools.js +696 -60
  124. package/dist/mcp/tools.js.map +1 -1
  125. package/dist/project-config.d.ts +20 -0
  126. package/dist/project-config.d.ts.map +1 -1
  127. package/dist/project-config.js +42 -2
  128. package/dist/project-config.js.map +1 -1
  129. package/dist/reasoning/login.js +1 -1
  130. package/dist/reasoning/login.js.map +1 -1
  131. package/dist/resolution/c-fnptr-synthesizer.d.ts +0 -28
  132. package/dist/resolution/c-fnptr-synthesizer.d.ts.map +1 -1
  133. package/dist/resolution/c-fnptr-synthesizer.js +765 -79
  134. package/dist/resolution/c-fnptr-synthesizer.js.map +1 -1
  135. package/dist/resolution/callback-synthesizer.d.ts +1 -1
  136. package/dist/resolution/callback-synthesizer.d.ts.map +1 -1
  137. package/dist/resolution/callback-synthesizer.js +72 -11
  138. package/dist/resolution/callback-synthesizer.js.map +1 -1
  139. package/dist/resolution/cooperative-yield.d.ts +32 -0
  140. package/dist/resolution/cooperative-yield.d.ts.map +1 -0
  141. package/dist/resolution/cooperative-yield.js +42 -0
  142. package/dist/resolution/cooperative-yield.js.map +1 -0
  143. package/dist/resolution/index.d.ts +11 -2
  144. package/dist/resolution/index.d.ts.map +1 -1
  145. package/dist/resolution/index.js +72 -4
  146. package/dist/resolution/index.js.map +1 -1
  147. package/dist/resolution/name-matcher.d.ts +22 -0
  148. package/dist/resolution/name-matcher.d.ts.map +1 -1
  149. package/dist/resolution/name-matcher.js +317 -20
  150. package/dist/resolution/name-matcher.js.map +1 -1
  151. package/dist/spec/config.d.ts +7 -11
  152. package/dist/spec/config.d.ts.map +1 -1
  153. package/dist/spec/config.js +77 -48
  154. package/dist/spec/config.js.map +1 -1
  155. package/dist/spec/db/fragment-node.d.ts +1 -0
  156. package/dist/spec/db/fragment-node.d.ts.map +1 -1
  157. package/dist/spec/db/fragment-node.js +8 -0
  158. package/dist/spec/db/fragment-node.js.map +1 -1
  159. package/dist/spec/db/fts.d.ts +14 -0
  160. package/dist/spec/db/fts.d.ts.map +1 -1
  161. package/dist/spec/db/fts.js +43 -4
  162. package/dist/spec/db/fts.js.map +1 -1
  163. package/dist/spec/db/schema.d.ts +6 -3
  164. package/dist/spec/db/schema.d.ts.map +1 -1
  165. package/dist/spec/db/schema.js +36 -4
  166. package/dist/spec/db/schema.js.map +1 -1
  167. package/dist/spec/db/schema.sql +11 -1
  168. package/dist/spec/evolve/logic-checker.d.ts +2 -2
  169. package/dist/spec/evolve/logic-checker.d.ts.map +1 -1
  170. package/dist/spec/evolve/logic-checker.js +3 -27
  171. package/dist/spec/evolve/logic-checker.js.map +1 -1
  172. package/dist/spec/evolve/pipeline.d.ts +21 -19
  173. package/dist/spec/evolve/pipeline.d.ts.map +1 -1
  174. package/dist/spec/evolve/pipeline.js +284 -31
  175. package/dist/spec/evolve/pipeline.js.map +1 -1
  176. package/dist/spec/evolve/spec-rewriter.d.ts +2 -2
  177. package/dist/spec/evolve/spec-rewriter.d.ts.map +1 -1
  178. package/dist/spec/evolve/spec-rewriter.js +7 -31
  179. package/dist/spec/evolve/spec-rewriter.js.map +1 -1
  180. package/dist/spec/graph/queries.d.ts +97 -0
  181. package/dist/spec/graph/queries.d.ts.map +1 -1
  182. package/dist/spec/graph/queries.js +225 -0
  183. package/dist/spec/graph/queries.js.map +1 -1
  184. package/dist/spec/llm/client.d.ts +29 -0
  185. package/dist/spec/llm/client.d.ts.map +1 -0
  186. package/dist/spec/llm/client.js +123 -0
  187. package/dist/spec/llm/client.js.map +1 -0
  188. package/dist/spec/llm/index.d.ts +3 -0
  189. package/dist/spec/llm/index.d.ts.map +1 -0
  190. package/dist/spec/llm/index.js +11 -0
  191. package/dist/spec/llm/index.js.map +1 -0
  192. package/dist/spec/llm/prompts.d.ts +13 -0
  193. package/dist/spec/llm/prompts.d.ts.map +1 -0
  194. package/dist/spec/llm/prompts.js +75 -0
  195. package/dist/spec/llm/prompts.js.map +1 -0
  196. package/dist/spec/mining/git-scanner.d.ts +12 -0
  197. package/dist/spec/mining/git-scanner.d.ts.map +1 -1
  198. package/dist/spec/mining/git-scanner.js +41 -0
  199. package/dist/spec/mining/git-scanner.js.map +1 -1
  200. package/dist/spec/mining/pipeline.d.ts.map +1 -1
  201. package/dist/spec/mining/pipeline.js +14 -1
  202. package/dist/spec/mining/pipeline.js.map +1 -1
  203. package/dist/spec/utils.d.ts +2 -1
  204. package/dist/spec/utils.d.ts.map +1 -1
  205. package/dist/spec/utils.js +3 -1
  206. package/dist/spec/utils.js.map +1 -1
  207. package/dist/sync/worktree.d.ts +9 -0
  208. package/dist/sync/worktree.d.ts.map +1 -1
  209. package/dist/sync/worktree.js +40 -0
  210. package/dist/sync/worktree.js.map +1 -1
  211. package/dist/types.d.ts +6 -1
  212. package/dist/types.d.ts.map +1 -1
  213. package/dist/ui/shimmer-progress.d.ts +2 -0
  214. package/dist/ui/shimmer-progress.d.ts.map +1 -1
  215. package/dist/ui/shimmer-progress.js +19 -2
  216. package/dist/ui/shimmer-progress.js.map +1 -1
  217. package/dist/upgrade/index.js +1 -1
  218. package/dist/upgrade/index.js.map +1 -1
  219. package/package.json +3 -3
  220. package/scripts/agent-eval/repro-concurrent-explore.mjs +119 -0
  221. package/scripts/agent-eval/repro-daemon-clients.mjs +125 -0
  222. package/scripts/exp_boundary_eval/README.md +247 -0
  223. package/scripts/exp_boundary_eval/__pycache__/_utils.cpython-310.pyc +0 -0
  224. package/scripts/exp_boundary_eval/__pycache__/analyze.cpython-310.pyc +0 -0
  225. package/scripts/exp_boundary_eval/__pycache__/deveco_arm.cpython-310.pyc +0 -0
  226. package/scripts/exp_boundary_eval/__pycache__/run_one.cpython-310.pyc +0 -0
  227. package/scripts/exp_boundary_eval/__pycache__/run_session.cpython-310.pyc +0 -0
  228. package/scripts/exp_boundary_eval/__pycache__/setup.cpython-310.pyc +0 -0
  229. package/scripts/exp_boundary_eval/_test_mcp_chain.py +78 -0
  230. package/scripts/exp_boundary_eval/_test_stdin.py +8 -0
  231. package/scripts/exp_boundary_eval/_utils.py +1116 -0
  232. package/scripts/exp_boundary_eval/analyze.py +1313 -0
  233. package/scripts/exp_boundary_eval/data/agents.json +109 -0
  234. package/scripts/exp_boundary_eval/data/experiments.json +140 -0
  235. package/scripts/exp_boundary_eval/deveco_arm.py +519 -0
  236. package/scripts/exp_boundary_eval/run_all.py +378 -0
  237. package/scripts/exp_boundary_eval/run_one.py +165 -0
  238. package/scripts/exp_boundary_eval/run_session.py +158 -0
  239. package/scripts/exp_boundary_eval/setup.py +120 -0
  240. package/scripts/exp_boundary_eval/win_mcp_launcher.py +73 -0
  241. package/scripts/exp_boundary_eval/win_mcp_stdio_wrap.js +36 -0
  242. package/scripts/exp_boundary_eval/win_node_launcher.py +24 -0
  243. package/scripts/npm-shim.js +25 -3
  244. package/scripts/ohos-sdk-publish.mjs +133 -0
  245. package/scripts/qa_eval/README.md +1 -1
  246. package/scripts/qa_eval/agent_runner.py +1 -1
@@ -49,6 +49,7 @@ const utils_1 = require("../utils");
49
49
  const spec_node_1 = require("../db/spec-node");
50
50
  const relations_1 = require("../db/relations");
51
51
  const spec_extractor_1 = require("../mining/spec-extractor");
52
+ const prompts_1 = require("../llm/prompts");
52
53
  const errors_1 = require("../../errors");
53
54
  // =============================================================================
54
55
  // evaluateSpec
@@ -77,40 +78,15 @@ async function evaluateSpec(specId, _specStoragePath, specFilePath, commitMessag
77
78
  }
78
79
  // 2. Truncate commitDiff to 6000 chars
79
80
  const truncatedDiff = (0, utils_1.truncateText)(commitDiff, 6000);
80
- // 3. Build system prompt (EXACT from spec_rewriter.py:238-245)
81
- const systemPrompt = `You are a technical documentation maintainer. Your task is to evaluate whether a git commit requires updating a software design specification (plan.md).
82
-
83
- Given the current plan content, the commit message, and the code diff, determine:
84
- 1. Whether the plan needs to be updated (UPDATE), deprecated (DEPRECATE), or left unchanged (UNCHANGED).
85
- 2. If UPDATE: provide the new title, subtitles (as an array of heading-preview strings), and full rewritten plan_content.
86
- 3. If DEPRECATE: provide a brief explanation in the plan_content field.
87
-
88
- Response format (JSON):
89
- {
90
- "action": "UPDATE" | "DEPRECATE" | "UNCHANGED",
91
- "title": "New spec title (for UPDATE)",
92
- "subtitles": ["heading1 → heading2 - preview", ...],
93
- "plan_content": "Full rewritten markdown content (for UPDATE) or deprecation reason (for DEPRECATE)"
94
- }`;
95
- // 4. Build user prompt (EXACT from spec_rewriter.py:247-280)
96
- const scheduleStr = scheduleNextSpecs.length > 0 ? scheduleNextSpecs.join(', ') : 'none';
97
- const userPrompt = `Current Plan Content:
98
- ${planContent}
99
-
100
- Commit Message:
101
- ${commitMessage}
102
-
103
- Code Diff:
104
- ${truncatedDiff}
105
-
106
- Scheduled specs to be processed next (for context): ${scheduleStr}`;
107
- // 5. Call LLM
81
+ // 3. Build user prompt
82
+ const userPrompt = (0, prompts_1.buildSpecEvaluationUserPrompt)(planContent, commitMessage, truncatedDiff, scheduleNextSpecs);
83
+ // 4. Call LLM
108
84
  if (!client) {
109
85
  (0, errors_1.logDebug)('evaluateSpec: no LLM client, returning UNCHANGED', { specId });
110
86
  return { action: 'UNCHANGED' };
111
87
  }
112
- const result = await client.chatJson(systemPrompt, userPrompt);
113
- // 6. Validate action
88
+ const result = await client.chatJson(prompts_1.SPEC_EVALUATION_SYSTEM_PROMPT, userPrompt);
89
+ // 5. Validate action
114
90
  const rawAction = result.action;
115
91
  let action = 'UNCHANGED';
116
92
  if (rawAction === 'UPDATE' || rawAction === 'DEPRECATE' || rawAction === 'UNCHANGED') {
@@ -122,7 +98,7 @@ Scheduled specs to be processed next (for context): ${scheduleStr}`;
122
98
  rawAction: String(rawAction),
123
99
  });
124
100
  }
125
- // 7. Return EvolveDecision
101
+ // 6. Return EvolveDecision
126
102
  return {
127
103
  action,
128
104
  title: typeof result.title === 'string' ? result.title : undefined,
@@ -1 +1 @@
1
- {"version":3,"file":"spec-rewriter.js","sourceRoot":"","sources":["../../../src/spec/evolve/spec-rewriter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"spec-rewriter.js","sourceRoot":"","sources":["../../../src/spec/evolve/spec-rewriter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2DA,oCA4DC;AAcD,kCA2FC;AAaD,wCAwBC;AArQD;;;;;;;GAOG;AACH,uCAAyB;AAEzB,oCAA2E;AAC3E,+CAKyB;AACzB,+CAMyB;AACzB,6DAA+D;AAE/D,4CAGwB;AACxB,yCAAiD;AAajD,gFAAgF;AAChF,eAAe;AACf,gFAAgF;AAEhF;;;;;;;;;;;GAWG;AACI,KAAK,UAAU,YAAY,CAChC,MAAc,EACd,gBAAwB,EACxB,YAAoB,EACpB,aAAqB,EACrB,UAAkB,EAClB,iBAA2B,EAC3B,MAAkB;IAElB,uBAAuB;IACvB,MAAM,WAAW,GAAG,IAAA,uBAAe,EAAC,YAAY,CAAC,CAAC;IAClD,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QACzB,IAAA,iBAAQ,EAAC,wDAAwD,EAAE;YACjE,MAAM;YACN,YAAY;SACb,CAAC,CAAC;QACH,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACjC,CAAC;IAED,uCAAuC;IACvC,MAAM,aAAa,GAAG,IAAA,oBAAY,EAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAErD,uBAAuB;IACvB,MAAM,UAAU,GAAG,IAAA,uCAA6B,EAC9C,WAAW,EACX,aAAa,EACb,aAAa,EACb,iBAAiB,CAClB,CAAC;IAEF,cAAc;IACd,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,IAAA,iBAAQ,EAAC,kDAAkD,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QACzE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACjC,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,uCAA6B,EAAE,UAAU,CAAC,CAAC;IAEhF,qBAAqB;IACrB,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;IAChC,IAAI,MAAM,GAA6B,WAAW,CAAC;IACnD,IAAI,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,WAAW,IAAI,SAAS,KAAK,WAAW,EAAE,CAAC;QACrF,MAAM,GAAG,SAAS,CAAC;IACrB,CAAC;SAAM,CAAC;QACN,IAAA,gBAAO,EAAC,gEAAgE,EAAE;YACxE,MAAM;YACN,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC;SAC7B,CAAC,CAAC;IACL,CAAC;IAED,2BAA2B;IAC3B,OAAO;QACL,MAAM;QACN,KAAK,EAAE,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;QAClE,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC;YACxC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;YAChE,CAAC,CAAC,SAAS;QACb,YAAY,EACV,OAAO,MAAM,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS;KAC5E,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,cAAc;AACd,gFAAgF;AAEhF;;;;;;;GAOG;AACH,SAAgB,WAAW,CACzB,EAAkB,EAClB,eAAuB,EACvB,SAAiB,EACjB,WAAmB,EACnB,UAAkB,EAClB,QAAwB,EACxB,UAAkB;IAElB,wDAAwD;IACxD,yEAAyE;IACzE,sEAAsE;IACtE,qEAAqE;IACrE,MAAM,OAAO,GAAG,WAAW,GAAG,MAAM,CAAC;IACrC,IAAA,wBAAgB,EAAC,OAAO,EAAE,QAAQ,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;IAEvD,4DAA4D;IAC5D,MAAM,QAAQ,GAAG,IAAA,oCAAmB,EAAC,eAAe,EAAE,SAAS,CAAC,CAAC;IACjE,MAAM,aAAa,GAAG,QAAQ,EAAE,KAAK,CAAC;IACtC,MAAM,iBAAiB,GAAG,QAAQ,EAAE,SAAS,CAAC;IAE9C,uCAAuC;IACvC,MAAM,OAAO,GAAG,IAAA,wBAAY,EAAC,EAAE,EAAE,SAAS,CAAC,CAAC;IAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,IAAA,iBAAQ,EAAC,wDAAwD,EAAE;YACjE,SAAS;SACV,CAAC,CAAC;QACH,oDAAoD;QACpD,IAAI,CAAC;YAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;QAC3D,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,GAAG,CAAC,EAAE,CAAC;IAC9D,CAAC;IAED,6CAA6C;IAC7C,MAAM,OAAO,GAAG,WAAW,GAAG,MAAM,CAAC;IACrC,MAAM,YAAY,GAAG,GAAG,SAAS,KAAK,UAAU,EAAE,CAAC;IACnD,IAAA,0BAAc,EAAC,EAAE,EAAE;QACjB,EAAE,EAAE,YAAY;QAChB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,MAAM,EAAE,YAAY;QACpB,OAAO,EAAE,UAAU;QACnB,QAAQ,EAAE,OAAO;QACjB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACtB,CAAC,CAAC;IAEH,qEAAqE;IACrE,IAAA,uCAA2B,EAAC,EAAE,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;IACzD,IAAA,qCAAyB,EAAC,EAAE,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;IAEvD,2CAA2C;IAC3C,IAAA,sBAAU,EAAC,EAAE,EAAE,SAAS,CAAC,CAAC;IAE1B,2CAA2C;IAC3C,MAAM,UAAU,GAAG,UAAU,GAAG,CAAC,CAAC;IAClC,IAAA,0BAAc,EAAC,EAAE,EAAE;QACjB,EAAE,EAAE,SAAS;QACb,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,aAAa,IAAI,SAAS;QACnD,SAAS,EAAE,QAAQ,CAAC,SAAS,IAAI,iBAAiB,IAAI,EAAE;QACxD,MAAM,EAAE,QAAQ;QAChB,OAAO,EAAE,UAAU;QACnB,QAAQ,EAAE,WAAW;QACrB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACtB,CAAC,CAAC;IAEH,iDAAiD;IACjD,IAAA,kCAAsB,EAAC,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,cAAc,CAAC,CAAC;IAEpE,6CAA6C;IAC7C,IAAA,oCAAwB,EAAC,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IAEhE,8CAA8C;IAC9C,wEAAwE;IACxE,qDAAqD;IACrD,IAAI,CAAC;QACH,EAAE,CAAC,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,IAAA,iBAAQ,EAAC,qEAAqE,EAAE;YAC9E,WAAW;YACX,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IACD,IAAI,CAAC;QACH,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,IAAA,iBAAQ,EAAC,wDAAwD,EAAE;YACjE,OAAO;YACP,WAAW;SACZ,CAAC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;AAC9C,CAAC;AAED,gFAAgF;AAChF,iBAAiB;AACjB,gFAAgF;AAEhF;;;;;;GAMG;AACH,SAAgB,cAAc,CAC5B,EAAkB,EAClB,SAAiB;IAEjB,iCAAiC;IACjC,IAAA,4BAAgB,EAAC,EAAE,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;IAE9C,mCAAmC;IACnC,MAAM,kBAAkB,GAAG,GAAG,SAAS,aAAa,CAAC;IACrD,IAAA,0BAAc,EAAC,EAAE,EAAE;QACjB,EAAE,EAAE,kBAAkB;QACtB,MAAM,EAAE,YAAY;QACpB,OAAO,EAAE,CAAC;QACV,KAAK,EAAE,SAAS;QAChB,SAAS,EAAE,EAAE;QACb,QAAQ,EAAE,EAAE,EAAE,+CAA+C;QAC7D,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACtB,CAAC,CAAC;IAEH,kCAAkC;IAClC,IAAA,kCAAsB,EAAC,EAAE,EAAE,SAAS,EAAE,kBAAkB,EAAE,cAAc,CAAC,CAAC;IAE1E,gCAAgC;IAChC,IAAA,oCAAwB,EAAC,EAAE,EAAE,SAAS,CAAC,CAAC;AAC1C,CAAC"}
@@ -31,6 +31,41 @@ export declare function getSpecContext(db: SqliteDatabase, specId: string, maxCo
31
31
  * @returns Array of distinct spec IDs.
32
32
  */
33
33
  export declare function findSpecsByFragmentPath(db: SqliteDatabase, filePath: string): string[];
34
+ /** Result container returned by findSpecsByFilePath. */
35
+ export interface FindSpecsByFilePathResult {
36
+ /** Matching spec entries (capped at maxResults). */
37
+ results: Array<{
38
+ id: string;
39
+ title: string;
40
+ status: string;
41
+ version: number;
42
+ filePath: string;
43
+ }>;
44
+ /** Number of results actually returned (<= maxResults). */
45
+ matched_count: number;
46
+ /** True when more results exist beyond the cap. */
47
+ truncated: boolean;
48
+ }
49
+ /**
50
+ * Find specs whose code fragments reference the given file path.
51
+ *
52
+ * Traverses: filePath -> code_fragment_nodes -> commit_fragment_relations
53
+ * -> commit_nodes -> spec_commit_relations -> spec_nodes.
54
+ *
55
+ * Uses LIKE matching against code_fragment_nodes.file_path, so partial
56
+ * paths work (e.g. `src/auth.ts` matches `src/auth/login.ts` and
57
+ * `app/src/auth.ts`). LIKE metacharacters (`%`, `_`, `\`) in the
58
+ * filePath are automatically escaped.
59
+ *
60
+ * An empty or whitespace-only filePath is rejected with an error
61
+ * (it would match every spec in the graph).
62
+ *
63
+ * @param db Active SQLite database handle.
64
+ * @param filePath File path to search for (substring LIKE match).
65
+ * @param maxResults Maximum number of results to return (default 100).
66
+ * @returns FindSpecsByFilePathResult with .results, .matched_count, and .truncated.
67
+ */
68
+ export declare function findSpecsByFilePath(db: SqliteDatabase, filePath: string, maxResults?: number): FindSpecsByFilePathResult;
34
69
  /**
35
70
  * Compute statistics about the Spec knowledge graph.
36
71
  *
@@ -55,4 +90,66 @@ export declare function getSpecStats(db: SqliteDatabase): SpecStats;
55
90
  * @returns Array of SpecContext (null results filtered out).
56
91
  */
57
92
  export declare function searchAndGetContext(db: SqliteDatabase, query: string, topK?: number, includeFragments?: boolean): SpecContext[];
93
+ /**
94
+ * Metadata about a code entity for which we want to find associated Specs.
95
+ * Typically sourced from a homegraph.db ``nodes`` row.
96
+ */
97
+ export interface CodeEntityInfo {
98
+ name: string;
99
+ qualifiedName: string;
100
+ kind: string;
101
+ filePath: string;
102
+ startLine: number;
103
+ endLine: number;
104
+ }
105
+ /** A single scored match between a code entity and a Spec. */
106
+ export interface CodeEntitySpecMatch {
107
+ spec: {
108
+ id: string;
109
+ title: string;
110
+ status: string;
111
+ version: number;
112
+ filePath: string;
113
+ timestamp: number;
114
+ };
115
+ /** Five-dimension weighted score (0.0–1.0). */
116
+ score: number;
117
+ /** Score breakdown for transparency. */
118
+ scoreDetail: {
119
+ filePathScore: number;
120
+ contentScore: number;
121
+ nameScore: number;
122
+ recencyScore: number;
123
+ overlapScore: number;
124
+ };
125
+ /** Number of overlapping code fragments for this spec. */
126
+ fragmentCount: number;
127
+ /** Total commits linking this spec to the entity's file. */
128
+ commitCount: number;
129
+ }
130
+ /** Result container for findSpecsByCodeSymbol. */
131
+ export interface FindSpecsByCodeSymbolResult {
132
+ entity: CodeEntityInfo;
133
+ matches: CodeEntitySpecMatch[];
134
+ totalCandidates: number;
135
+ }
136
+ /**
137
+ * Find Specs associated with a code entity by multi-dimensional scoring:
138
+ *
139
+ * 1. File path match (weight 0.30) — most stable anchor; function rarely changes file
140
+ * 2. Code-diff content match via FTS5 (weight 0.25) — catches entity names in diff text
141
+ * that never appear in Spec titles
142
+ * 3. Spec title/subtitle name match via FTS5 (weight 0.15) — semantic alignment
143
+ * 4. Recency (weight 0.20) — newer Specs are more likely to describe current code
144
+ * 5. Line-range overlap (weight 0.10) — soft signal; code drifts over time
145
+ *
146
+ * All five dimensions contribute even when some are zero — a spec without line
147
+ * overlap can still rank first if its content/name/recency scores are high.
148
+ *
149
+ * @param specDb commit4spec.db connection
150
+ * @param entity Code entity info (from homegraph.db nodes)
151
+ * @param topK Maximum matches to return (default 10)
152
+ * @returns Ranked, scored matches with score breakdowns
153
+ */
154
+ export declare function findSpecsByCodeSymbol(specDb: SqliteDatabase, entity: CodeEntityInfo, topK?: number): FindSpecsByCodeSymbolResult;
58
155
  //# sourceMappingURL=queries.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../../src/spec/graph/queries.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAIL,WAAW,EAEX,SAAS,EACV,MAAM,UAAU,CAAC;AAoElB;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAC5B,EAAE,EAAE,cAAc,EAClB,MAAM,EAAE,MAAM,EACd,UAAU,GAAE,MAAU,EACtB,gBAAgB,GAAE,OAAc,GAC/B,WAAW,GAAG,IAAI,CAyEpB;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,EAAE,EAAE,cAAc,EAClB,QAAQ,EAAE,MAAM,GACf,MAAM,EAAE,CAaV;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,cAAc,GAAG,SAAS,CAqD1D;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,cAAc,EAClB,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,MAAW,EACjB,gBAAgB,GAAE,OAAc,GAC/B,WAAW,EAAE,CAwBf"}
1
+ {"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../../src/spec/graph/queries.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAIL,WAAW,EAEX,SAAS,EACV,MAAM,UAAU,CAAC;AAoElB;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAC5B,EAAE,EAAE,cAAc,EAClB,MAAM,EAAE,MAAM,EACd,UAAU,GAAE,MAAU,EACtB,gBAAgB,GAAE,OAAc,GAC/B,WAAW,GAAG,IAAI,CAyEpB;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,EAAE,EAAE,cAAc,EAClB,QAAQ,EAAE,MAAM,GACf,MAAM,EAAE,CAaV;AASD,wDAAwD;AACxD,MAAM,WAAW,yBAAyB;IACxC,oDAAoD;IACpD,OAAO,EAAE,KAAK,CAAC;QACb,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;IACH,2DAA2D;IAC3D,aAAa,EAAE,MAAM,CAAC;IACtB,mDAAmD;IACnD,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,cAAc,EAClB,QAAQ,EAAE,MAAM,EAChB,UAAU,GAAE,MAAsC,GACjD,yBAAyB,CAkD3B;AAGD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,cAAc,GAAG,SAAS,CAqD1D;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,cAAc,EAClB,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,MAAW,EACjB,gBAAgB,GAAE,OAAc,GAC/B,WAAW,EAAE,CAwBf;AAMD;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,8DAA8D;AAC9D,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE;QACJ,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,WAAW,EAAE;QACX,aAAa,EAAE,MAAM,CAAC;QACtB,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,0DAA0D;IAC1D,aAAa,EAAE,MAAM,CAAC;IACtB,4DAA4D;IAC5D,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,kDAAkD;AAClD,MAAM,WAAW,2BAA2B;IAC1C,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,eAAe,EAAE,MAAM,CAAC;CACzB;AAwBD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,cAAc,EACtB,IAAI,GAAE,MAAW,GAChB,2BAA2B,CA0J7B"}
@@ -8,8 +8,10 @@
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.getSpecContext = getSpecContext;
10
10
  exports.findSpecsByFragmentPath = findSpecsByFragmentPath;
11
+ exports.findSpecsByFilePath = findSpecsByFilePath;
11
12
  exports.getSpecStats = getSpecStats;
12
13
  exports.searchAndGetContext = searchAndGetContext;
14
+ exports.findSpecsByCodeSymbol = findSpecsByCodeSymbol;
13
15
  const fts_1 = require("../db/fts");
14
16
  // ===========================================================================
15
17
  // Private helpers
@@ -137,6 +139,66 @@ function findSpecsByFragmentPath(db, filePath) {
137
139
  .all(pattern);
138
140
  return rows.map((r) => r.spec_id);
139
141
  }
142
+ // ===========================================================================
143
+ // findSpecsByFilePath
144
+ // ===========================================================================
145
+ /** Default max results returned by findSpecsByFilePath. */
146
+ const DEFAULT_MAX_SPEC_FIND_RESULTS = 100;
147
+ /**
148
+ * Find specs whose code fragments reference the given file path.
149
+ *
150
+ * Traverses: filePath -> code_fragment_nodes -> commit_fragment_relations
151
+ * -> commit_nodes -> spec_commit_relations -> spec_nodes.
152
+ *
153
+ * Uses LIKE matching against code_fragment_nodes.file_path, so partial
154
+ * paths work (e.g. `src/auth.ts` matches `src/auth/login.ts` and
155
+ * `app/src/auth.ts`). LIKE metacharacters (`%`, `_`, `\`) in the
156
+ * filePath are automatically escaped.
157
+ *
158
+ * An empty or whitespace-only filePath is rejected with an error
159
+ * (it would match every spec in the graph).
160
+ *
161
+ * @param db Active SQLite database handle.
162
+ * @param filePath File path to search for (substring LIKE match).
163
+ * @param maxResults Maximum number of results to return (default 100).
164
+ * @returns FindSpecsByFilePathResult with .results, .matched_count, and .truncated.
165
+ */
166
+ function findSpecsByFilePath(db, filePath, maxResults = DEFAULT_MAX_SPEC_FIND_RESULTS) {
167
+ // Guard against empty input that would match every spec
168
+ if (!filePath || filePath.trim().length === 0) {
169
+ throw new Error('Empty file path is not allowed -- it would match every spec in the knowledge graph. ' +
170
+ 'Provide a concrete file path (e.g. "src/auth.ts") or a partial path (e.g. "src/auth").');
171
+ }
172
+ // Escape LIKE metacharacters (SQLite ESCAPE '\' is used in the query)
173
+ const escaped = filePath
174
+ .replace(/\\/g, '\\\\') // literal backslash
175
+ .replace(/%/g, '\\%') // percent wildcard
176
+ .replace(/_/g, '\\_'); // underscore wildcard
177
+ const pattern = `%${escaped}%`;
178
+ const rows = db
179
+ .prepare(`SELECT DISTINCT s.id, s.title, s.status, s.version, s.file_path
180
+ FROM spec_nodes s
181
+ JOIN spec_commit_relations scr ON scr.spec_id = s.id
182
+ JOIN commit_fragment_relations cfr ON cfr.commit_hash = scr.commit_hash
183
+ JOIN code_fragment_nodes cf ON cf.id = cfr.fragment_id
184
+ WHERE cf.file_path LIKE ? ESCAPE '\\'
185
+ ORDER BY s.id
186
+ LIMIT ?`)
187
+ .all(pattern, maxResults + 1);
188
+ const truncated = rows.length > maxResults;
189
+ const slice = truncated ? rows.slice(0, maxResults) : rows;
190
+ return {
191
+ results: slice.map((r) => ({
192
+ id: r.id,
193
+ title: r.title,
194
+ status: r.status,
195
+ version: r.version,
196
+ filePath: r.file_path,
197
+ })),
198
+ matched_count: slice.length,
199
+ truncated,
200
+ };
201
+ }
140
202
  /**
141
203
  * Compute statistics about the Spec knowledge graph.
142
204
  *
@@ -212,4 +274,167 @@ function searchAndGetContext(db, query, topK = 10, includeFragments = true) {
212
274
  });
213
275
  return scored.map((c) => c.context);
214
276
  }
277
+ /** Weight constants for the five scoring dimensions. */
278
+ const WEIGHTS = {
279
+ filePath: 0.30,
280
+ content: 0.25,
281
+ name: 0.15,
282
+ recency: 0.20,
283
+ overlap: 0.10,
284
+ };
285
+ /** Maximum candidates to consider from the initial file-path JOIN. */
286
+ const MAX_CANDIDATES = 200;
287
+ /**
288
+ * Escape LIKE metacharacters in a string, also escaping the escape character.
289
+ */
290
+ function escapeLike(str) {
291
+ return str
292
+ .replace(/\\/g, '\\\\')
293
+ .replace(/%/g, '\\%')
294
+ .replace(/_/g, '\\_');
295
+ }
296
+ /**
297
+ * Find Specs associated with a code entity by multi-dimensional scoring:
298
+ *
299
+ * 1. File path match (weight 0.30) — most stable anchor; function rarely changes file
300
+ * 2. Code-diff content match via FTS5 (weight 0.25) — catches entity names in diff text
301
+ * that never appear in Spec titles
302
+ * 3. Spec title/subtitle name match via FTS5 (weight 0.15) — semantic alignment
303
+ * 4. Recency (weight 0.20) — newer Specs are more likely to describe current code
304
+ * 5. Line-range overlap (weight 0.10) — soft signal; code drifts over time
305
+ *
306
+ * All five dimensions contribute even when some are zero — a spec without line
307
+ * overlap can still rank first if its content/name/recency scores are high.
308
+ *
309
+ * @param specDb commit4spec.db connection
310
+ * @param entity Code entity info (from homegraph.db nodes)
311
+ * @param topK Maximum matches to return (default 10)
312
+ * @returns Ranked, scored matches with score breakdowns
313
+ */
314
+ function findSpecsByCodeSymbol(specDb, entity, topK = 10) {
315
+ const pathEscaped = escapeLike(entity.filePath);
316
+ const likePattern = `%${pathEscaped}%`;
317
+ const suffixLikePattern = `%${pathEscaped}`; // cf.file_path ends with entity's path
318
+ // -----------------------------------------------------------------------
319
+ // 1. Gather candidates: all specs whose fragments touch the entity's file
320
+ // -----------------------------------------------------------------------
321
+ const candidateRows = specDb
322
+ .prepare(`
323
+ SELECT
324
+ s.id, s.title, s.status, s.version, s.file_path, s.timestamp,
325
+ MAX(
326
+ MIN(cf.end_line, @entityEnd) - MAX(cf.start_line, @entityStart) + 1,
327
+ 0
328
+ ) AS overlap_lines,
329
+ COUNT(DISTINCT cf.id) AS fragment_count,
330
+ COUNT(DISTINCT scr.commit_hash) AS commit_count,
331
+ MAX(CASE
332
+ WHEN cf.file_path = @exactFilePath THEN 3
333
+ WHEN cf.file_path LIKE @suffixLikePattern ESCAPE '\\' THEN 2
334
+ ELSE 1
335
+ END) AS file_path_match_level
336
+ FROM spec_nodes s
337
+ JOIN spec_commit_relations scr ON scr.spec_id = s.id
338
+ JOIN commit_fragment_relations cfr ON cfr.commit_hash = scr.commit_hash
339
+ JOIN code_fragment_nodes cf ON cf.id = cfr.fragment_id
340
+ WHERE s.status = 'active'
341
+ AND cf.file_path LIKE @likePattern ESCAPE '\\'
342
+ GROUP BY s.id
343
+ ORDER BY s.timestamp DESC
344
+ LIMIT @maxCandidates
345
+ `)
346
+ .all({
347
+ entityEnd: entity.endLine,
348
+ entityStart: entity.startLine,
349
+ exactFilePath: entity.filePath,
350
+ suffixLikePattern,
351
+ likePattern,
352
+ maxCandidates: MAX_CANDIDATES,
353
+ });
354
+ // -----------------------------------------------------------------------
355
+ // 2. Content-match signal: search code_fragments_fts for the entity name
356
+ // -----------------------------------------------------------------------
357
+ const contentFragmentIds = new Set((0, fts_1.searchCodeFragments)(specDb, entity.name, 50));
358
+ // Map from spec_id → whether any of its fragments matched in content search
359
+ const contentSpecIds = new Set();
360
+ if (contentFragmentIds.size > 0) {
361
+ const fragsIn = [...contentFragmentIds].map(() => '?').join(',');
362
+ const contentSpecRows = specDb
363
+ .prepare(`
364
+ SELECT DISTINCT scr.spec_id
365
+ FROM commit_fragment_relations cfr
366
+ JOIN spec_commit_relations scr ON scr.commit_hash = cfr.commit_hash
367
+ WHERE cfr.fragment_id IN (${fragsIn})
368
+ `)
369
+ .all(...contentFragmentIds);
370
+ for (const r of contentSpecRows) {
371
+ contentSpecIds.add(r.spec_id);
372
+ }
373
+ }
374
+ // -----------------------------------------------------------------------
375
+ // 3. Name-match signal: search specs_fts for the entity name
376
+ // -----------------------------------------------------------------------
377
+ const nameResults = (0, fts_1.searchSpecs)(specDb, entity.name, topK * 3);
378
+ const nameScoreMap = new Map();
379
+ const nameMaxScore = Math.max(1, ...nameResults.map((r) => r._score ?? 0));
380
+ for (const r of nameResults) {
381
+ nameScoreMap.set(r.id, (r._score ?? 0) / nameMaxScore); // normalize to [0, 1]
382
+ }
383
+ // -----------------------------------------------------------------------
384
+ // 4. Compute weighted score for each candidate
385
+ // -----------------------------------------------------------------------
386
+ const now = Date.now();
387
+ const entityLength = Math.max(1, entity.endLine - entity.startLine + 1);
388
+ const scored = candidateRows.map((row) => {
389
+ // 4a. File-path score — derived from the best-matching fragment's file_path
390
+ // (computed in SQL as file_path_match_level: 3=exact, 2=suffix, 1=LIKE)
391
+ const filePathScore = row.file_path_match_level === 3 ? 1.0
392
+ : row.file_path_match_level === 2 ? 0.8
393
+ : 0.6;
394
+ // 4b. Content score
395
+ const contentScore = contentSpecIds.has(row.id) ? 1.0 : 0;
396
+ // 4c. Name score
397
+ const nameScore = nameScoreMap.get(row.id) ?? 0;
398
+ // 4d. Recency score: MapSpec(timestamp, 0, maxTs)MapSpec => [0, 1]
399
+ const daysSinceUpdate = (now - row.timestamp) / (1000 * 60 * 60 * 24);
400
+ const recencyScore = 1 / (1 + Math.max(0, daysSinceUpdate) / 180);
401
+ // 4e. Overlap score
402
+ const overlapRatio = Math.min(1.0, row.overlap_lines / entityLength);
403
+ const overlapScore = overlapRatio;
404
+ const score = filePathScore * WEIGHTS.filePath +
405
+ contentScore * WEIGHTS.content +
406
+ nameScore * WEIGHTS.name +
407
+ recencyScore * WEIGHTS.recency +
408
+ overlapScore * WEIGHTS.overlap;
409
+ return {
410
+ spec: {
411
+ id: row.id,
412
+ title: row.title,
413
+ status: row.status,
414
+ version: row.version,
415
+ filePath: row.file_path,
416
+ timestamp: row.timestamp,
417
+ },
418
+ score,
419
+ scoreDetail: {
420
+ filePathScore,
421
+ contentScore,
422
+ nameScore,
423
+ recencyScore,
424
+ overlapScore,
425
+ },
426
+ fragmentCount: row.fragment_count,
427
+ commitCount: row.commit_count,
428
+ };
429
+ });
430
+ // -----------------------------------------------------------------------
431
+ // 5. Sort and trim
432
+ // -----------------------------------------------------------------------
433
+ scored.sort((a, b) => b.score - a.score);
434
+ return {
435
+ entity,
436
+ matches: scored.slice(0, topK),
437
+ totalCandidates: candidateRows.length,
438
+ };
439
+ }
215
440
  //# sourceMappingURL=queries.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"queries.js","sourceRoot":"","sources":["../../../src/spec/graph/queries.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"queries.js","sourceRoot":"","sources":["../../../src/spec/graph/queries.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { LLMConfig } from '../config';
2
+ export interface LlmClient {
3
+ chat(systemPrompt: string, userPrompt: string): Promise<string>;
4
+ chatJson(systemPrompt: string, userPrompt: string): Promise<Record<string, unknown>>;
5
+ }
6
+ export declare class OpenAiLlmClient implements LlmClient {
7
+ private config;
8
+ constructor(config: LLMConfig);
9
+ /**
10
+ * Send a chat completion request and return the message content string.
11
+ *
12
+ * Calls the OpenAI-compatible chat completions API and returns
13
+ * `choices[0].message.content`. On any error, returns an empty string.
14
+ */
15
+ chat(systemPrompt: string, userPrompt: string): Promise<string>;
16
+ /**
17
+ * Same as `chat()`, but parses the response as JSON.
18
+ *
19
+ * Parsing strategy (tried in order):
20
+ * 1. Direct `JSON.parse(content)`.
21
+ * 2. Extract from `` ```json ... ``` `` fenced block.
22
+ * 3. Extract from `` ``` ... ``` `` fenced block.
23
+ * 4. Fallback: log a debug warning and return `{}`.
24
+ *
25
+ * Empty or null content from `chat()` also returns `{}`.
26
+ */
27
+ chatJson(systemPrompt: string, userPrompt: string): Promise<Record<string, unknown>>;
28
+ }
29
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/spec/llm/client.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAOtC,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAChE,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACtF;AAMD,qBAAa,eAAgB,YAAW,SAAS;IAC/C,OAAO,CAAC,MAAM,CAAY;gBAEd,MAAM,EAAE,SAAS;IAQ7B;;;;;OAKG;IACG,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAkCrE;;;;;;;;;;OAUG;IACG,QAAQ,CACZ,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CA+CpC"}
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.OpenAiLlmClient = void 0;
7
+ /**
8
+ * Provider-agnostic LLM client for spec self-evolution.
9
+ *
10
+ * Supports OpenAI-compatible chat completions API. No mock mode — callers
11
+ * that need test doubles inject their own stubs implementing the interface.
12
+ *
13
+ * @module spec/llm/client
14
+ */
15
+ const openai_1 = __importDefault(require("openai"));
16
+ const errors_1 = require("../../errors");
17
+ // =============================================================================
18
+ // OpenAiLlmClient
19
+ // =============================================================================
20
+ class OpenAiLlmClient {
21
+ config;
22
+ constructor(config) {
23
+ this.config = config;
24
+ }
25
+ // ===========================================================================
26
+ // chat
27
+ // ===========================================================================
28
+ /**
29
+ * Send a chat completion request and return the message content string.
30
+ *
31
+ * Calls the OpenAI-compatible chat completions API and returns
32
+ * `choices[0].message.content`. On any error, returns an empty string.
33
+ */
34
+ async chat(systemPrompt, userPrompt) {
35
+ const baseURL = this.config.baseUrl
36
+ ? this.config.baseUrl
37
+ : this.config.provider === 'anthropic'
38
+ ? 'https://api.anthropic.com/v1'
39
+ : undefined;
40
+ const client = new openai_1.default({
41
+ apiKey: this.config.apiKey,
42
+ baseURL,
43
+ });
44
+ try {
45
+ const completion = await client.chat.completions.create({
46
+ model: this.config.model,
47
+ temperature: this.config.temperature,
48
+ max_tokens: this.config.maxTokens,
49
+ messages: [
50
+ { role: 'system', content: systemPrompt },
51
+ { role: 'user', content: userPrompt },
52
+ ],
53
+ });
54
+ const content = completion.choices[0]?.message?.content;
55
+ return content ?? '';
56
+ }
57
+ catch {
58
+ return '';
59
+ }
60
+ }
61
+ // ===========================================================================
62
+ // chatJson
63
+ // ===========================================================================
64
+ /**
65
+ * Same as `chat()`, but parses the response as JSON.
66
+ *
67
+ * Parsing strategy (tried in order):
68
+ * 1. Direct `JSON.parse(content)`.
69
+ * 2. Extract from `` ```json ... ``` `` fenced block.
70
+ * 3. Extract from `` ``` ... ``` `` fenced block.
71
+ * 4. Fallback: log a debug warning and return `{}`.
72
+ *
73
+ * Empty or null content from `chat()` also returns `{}`.
74
+ */
75
+ async chatJson(systemPrompt, userPrompt) {
76
+ const raw = await this.chat(systemPrompt, userPrompt);
77
+ if (!raw)
78
+ return {};
79
+ // 1. Direct parse
80
+ try {
81
+ const parsed = JSON.parse(raw);
82
+ if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
83
+ return parsed;
84
+ }
85
+ }
86
+ catch {
87
+ // Fall through to fence extraction
88
+ }
89
+ // 2. ```json ... ``` fence
90
+ const jsonFenceMatch = /```json\s*([\s\S]*?)```/.exec(raw);
91
+ if (jsonFenceMatch) {
92
+ try {
93
+ const parsed = JSON.parse(jsonFenceMatch[1].trim());
94
+ if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
95
+ return parsed;
96
+ }
97
+ }
98
+ catch {
99
+ // Fall through
100
+ }
101
+ }
102
+ // 3. ``` ... ``` fence
103
+ const fenceMatch = /```\s*([\s\S]*?)```/.exec(raw);
104
+ if (fenceMatch) {
105
+ try {
106
+ const parsed = JSON.parse(fenceMatch[1].trim());
107
+ if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
108
+ return parsed;
109
+ }
110
+ }
111
+ catch {
112
+ // Fall through
113
+ }
114
+ }
115
+ // 4. Fallback
116
+ (0, errors_1.logDebug)('chatJson: could not parse response as JSON', {
117
+ raw: raw.length > 200 ? raw.slice(0, 200) + '…' : raw,
118
+ });
119
+ return {};
120
+ }
121
+ }
122
+ exports.OpenAiLlmClient = OpenAiLlmClient;
123
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/spec/llm/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { LlmClient, OpenAiLlmClient } from './client';
2
+ export { LOGIC_CHECK_SYSTEM_PROMPT, buildLogicCheckUserPrompt, SPEC_EVALUATION_SYSTEM_PROMPT, buildSpecEvaluationUserPrompt, } from './prompts';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/spec/llm/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EACL,yBAAyB,EACzB,yBAAyB,EACzB,6BAA6B,EAC7B,6BAA6B,GAC9B,MAAM,WAAW,CAAC"}