bonecode 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (270) hide show
  1. package/bin/bonecode +47 -42
  2. package/compat/opencode_adapter.ts +188 -17
  3. package/dist/bone/output/agent/src/algorithms.d.ts +1 -0
  4. package/dist/bone/output/agent/src/algorithms.js +3 -0
  5. package/dist/bone/output/agent/src/algorithms.js.map +1 -0
  6. package/dist/bone/output/agent/src/audit.d.ts +3 -0
  7. package/dist/bone/output/agent/src/audit.js +40 -0
  8. package/dist/bone/output/agent/src/audit.js.map +1 -0
  9. package/dist/bone/output/agent/src/auth.d.ts +8 -0
  10. package/dist/bone/output/agent/src/auth.js +56 -0
  11. package/dist/bone/output/agent/src/auth.js.map +1 -0
  12. package/dist/bone/output/agent/src/db.d.ts +6 -0
  13. package/dist/bone/output/agent/src/db.js +63 -0
  14. package/dist/bone/output/agent/src/db.js.map +1 -0
  15. package/dist/bone/output/agent/src/events.d.ts +25 -0
  16. package/dist/bone/output/agent/src/events.js +184 -0
  17. package/dist/bone/output/agent/src/events.js.map +1 -0
  18. package/dist/bone/output/agent/src/logger.d.ts +28 -0
  19. package/dist/bone/output/agent/src/logger.js +45 -0
  20. package/dist/bone/output/agent/src/logger.js.map +1 -0
  21. package/dist/bone/output/agent/src/metrics.d.ts +5 -0
  22. package/dist/bone/output/agent/src/metrics.js +60 -0
  23. package/dist/bone/output/agent/src/metrics.js.map +1 -0
  24. package/dist/bone/output/agent/src/routes/agent_instance.d.ts +1 -0
  25. package/dist/bone/output/agent/src/routes/agent_instance.js +253 -0
  26. package/dist/bone/output/agent/src/routes/agent_instance.js.map +1 -0
  27. package/dist/bone/output/agent/src/routes/build_step.d.ts +1 -0
  28. package/dist/bone/output/agent/src/routes/build_step.js +133 -0
  29. package/dist/bone/output/agent/src/routes/build_step.js.map +1 -0
  30. package/dist/bone/output/agent/src/routes/plan.d.ts +1 -0
  31. package/dist/bone/output/agent/src/routes/plan.js +119 -0
  32. package/dist/bone/output/agent/src/routes/plan.js.map +1 -0
  33. package/dist/bone/output/agent/src/routes/task.d.ts +1 -0
  34. package/dist/bone/output/agent/src/routes/task.js +133 -0
  35. package/dist/bone/output/agent/src/routes/task.js.map +1 -0
  36. package/dist/bone/output/agent/src/routes/tool_call.d.ts +1 -0
  37. package/dist/bone/output/agent/src/routes/tool_call.js +190 -0
  38. package/dist/bone/output/agent/src/routes/tool_call.js.map +1 -0
  39. package/dist/bone/output/agent/src/state_machines/agent_instance.d.ts +9 -0
  40. package/dist/bone/output/agent/src/state_machines/agent_instance.js +22 -0
  41. package/dist/bone/output/agent/src/state_machines/agent_instance.js.map +1 -0
  42. package/dist/bone/output/agent/src/state_machines/build_step.d.ts +9 -0
  43. package/dist/bone/output/agent/src/state_machines/build_step.js +20 -0
  44. package/dist/bone/output/agent/src/state_machines/build_step.js.map +1 -0
  45. package/dist/bone/output/agent/src/state_machines/plan.d.ts +9 -0
  46. package/dist/bone/output/agent/src/state_machines/plan.js +20 -0
  47. package/dist/bone/output/agent/src/state_machines/plan.js.map +1 -0
  48. package/dist/bone/output/agent/src/state_machines/task.d.ts +9 -0
  49. package/dist/bone/output/agent/src/state_machines/task.js +20 -0
  50. package/dist/bone/output/agent/src/state_machines/task.js.map +1 -0
  51. package/dist/bone/output/agent/src/state_machines/tool_call.d.ts +9 -0
  52. package/dist/bone/output/agent/src/state_machines/tool_call.js +20 -0
  53. package/dist/bone/output/agent/src/state_machines/tool_call.js.map +1 -0
  54. package/dist/bone/output/rag/src/algorithms.d.ts +1 -0
  55. package/dist/bone/output/rag/src/algorithms.js +3 -0
  56. package/dist/bone/output/rag/src/algorithms.js.map +1 -0
  57. package/dist/bone/output/rag/src/auth.d.ts +8 -0
  58. package/dist/bone/output/rag/src/auth.js +56 -0
  59. package/dist/bone/output/rag/src/auth.js.map +1 -0
  60. package/dist/bone/output/rag/src/db.d.ts +6 -0
  61. package/dist/bone/output/rag/src/db.js +63 -0
  62. package/dist/bone/output/rag/src/db.js.map +1 -0
  63. package/dist/bone/output/rag/src/events.d.ts +25 -0
  64. package/dist/bone/output/rag/src/events.js +184 -0
  65. package/dist/bone/output/rag/src/events.js.map +1 -0
  66. package/dist/bone/output/rag/src/extensions.d.ts +83 -0
  67. package/dist/bone/output/rag/src/extensions.js +329 -0
  68. package/dist/bone/output/rag/src/extensions.js.map +1 -0
  69. package/dist/bone/output/rag/src/flows.d.ts +24 -0
  70. package/dist/bone/output/rag/src/flows.js +236 -0
  71. package/dist/bone/output/rag/src/flows.js.map +1 -0
  72. package/dist/bone/output/rag/src/logger.d.ts +28 -0
  73. package/dist/bone/output/rag/src/logger.js +45 -0
  74. package/dist/bone/output/rag/src/logger.js.map +1 -0
  75. package/dist/bone/output/rag/src/metrics.d.ts +5 -0
  76. package/dist/bone/output/rag/src/metrics.js +60 -0
  77. package/dist/bone/output/rag/src/metrics.js.map +1 -0
  78. package/dist/bone/output/rag/src/routes/code_chunk.d.ts +1 -0
  79. package/dist/bone/output/rag/src/routes/code_chunk.js +100 -0
  80. package/dist/bone/output/rag/src/routes/code_chunk.js.map +1 -0
  81. package/dist/bone/output/rag/src/routes/code_file.d.ts +1 -0
  82. package/dist/bone/output/rag/src/routes/code_file.js +127 -0
  83. package/dist/bone/output/rag/src/routes/code_file.js.map +1 -0
  84. package/dist/bone/output/rag/src/routes/indexing_job.d.ts +1 -0
  85. package/dist/bone/output/rag/src/routes/indexing_job.js +113 -0
  86. package/dist/bone/output/rag/src/routes/indexing_job.js.map +1 -0
  87. package/dist/bone/output/rag/src/routes/knowledge_base.d.ts +1 -0
  88. package/dist/bone/output/rag/src/routes/knowledge_base.js +242 -0
  89. package/dist/bone/output/rag/src/routes/knowledge_base.js.map +1 -0
  90. package/dist/bone/output/rag/src/routes/memory_entry.d.ts +1 -0
  91. package/dist/bone/output/rag/src/routes/memory_entry.js +113 -0
  92. package/dist/bone/output/rag/src/routes/memory_entry.js.map +1 -0
  93. package/dist/bone/output/rag/src/state_machines/code_file.d.ts +9 -0
  94. package/dist/bone/output/rag/src/state_machines/code_file.js +21 -0
  95. package/dist/bone/output/rag/src/state_machines/code_file.js.map +1 -0
  96. package/dist/bone/output/rag/src/state_machines/indexing_job.d.ts +9 -0
  97. package/dist/bone/output/rag/src/state_machines/indexing_job.js +20 -0
  98. package/dist/bone/output/rag/src/state_machines/indexing_job.js.map +1 -0
  99. package/dist/bone/output/rag/src/state_machines/knowledge_base.d.ts +9 -0
  100. package/dist/bone/output/rag/src/state_machines/knowledge_base.js +21 -0
  101. package/dist/bone/output/rag/src/state_machines/knowledge_base.js.map +1 -0
  102. package/dist/bone/output/rag/src/state_machines/memory_entry.d.ts +9 -0
  103. package/dist/bone/output/rag/src/state_machines/memory_entry.js +18 -0
  104. package/dist/bone/output/rag/src/state_machines/memory_entry.js.map +1 -0
  105. package/dist/bone/output/session/src/algorithms.d.ts +1 -0
  106. package/dist/bone/output/session/src/algorithms.js +3 -0
  107. package/dist/bone/output/session/src/algorithms.js.map +1 -0
  108. package/dist/bone/output/session/src/audit.d.ts +3 -0
  109. package/dist/bone/output/session/src/audit.js +40 -0
  110. package/dist/bone/output/session/src/audit.js.map +1 -0
  111. package/dist/bone/output/session/src/auth.d.ts +8 -0
  112. package/dist/bone/output/session/src/auth.js +56 -0
  113. package/dist/bone/output/session/src/auth.js.map +1 -0
  114. package/dist/bone/output/session/src/db.d.ts +6 -0
  115. package/dist/bone/output/session/src/db.js +63 -0
  116. package/dist/bone/output/session/src/db.js.map +1 -0
  117. package/dist/bone/output/session/src/events.d.ts +26 -0
  118. package/dist/bone/output/session/src/events.js +212 -0
  119. package/dist/bone/output/session/src/events.js.map +1 -0
  120. package/dist/bone/output/session/src/extensions.d.ts +41 -0
  121. package/dist/bone/output/session/src/extensions.js +217 -0
  122. package/dist/bone/output/session/src/extensions.js.map +1 -0
  123. package/dist/bone/output/session/src/logger.d.ts +28 -0
  124. package/dist/bone/output/session/src/logger.js +44 -0
  125. package/dist/bone/output/session/src/logger.js.map +1 -0
  126. package/dist/bone/output/session/src/metrics.d.ts +5 -0
  127. package/dist/bone/output/session/src/metrics.js +60 -0
  128. package/dist/bone/output/session/src/metrics.js.map +1 -0
  129. package/dist/bone/output/session/src/routes/message.d.ts +1 -0
  130. package/dist/bone/output/session/src/routes/message.js +120 -0
  131. package/dist/bone/output/session/src/routes/message.js.map +1 -0
  132. package/dist/bone/output/session/src/routes/part.d.ts +1 -0
  133. package/dist/bone/output/session/src/routes/part.js +106 -0
  134. package/dist/bone/output/session/src/routes/part.js.map +1 -0
  135. package/dist/bone/output/session/src/routes/permission.d.ts +1 -0
  136. package/dist/bone/output/session/src/routes/permission.js +106 -0
  137. package/dist/bone/output/session/src/routes/permission.js.map +1 -0
  138. package/dist/bone/output/session/src/routes/project.d.ts +1 -0
  139. package/dist/bone/output/session/src/routes/project.js +106 -0
  140. package/dist/bone/output/session/src/routes/project.js.map +1 -0
  141. package/dist/bone/output/session/src/routes/session.d.ts +1 -0
  142. package/dist/bone/output/session/src/routes/session.js +308 -0
  143. package/dist/bone/output/session/src/routes/session.js.map +1 -0
  144. package/dist/bone/output/session/src/state_machines/session.d.ts +9 -0
  145. package/dist/bone/output/session/src/state_machines/session.js +21 -0
  146. package/dist/bone/output/session/src/state_machines/session.js.map +1 -0
  147. package/dist/bone/output/session/src/websocket.d.ts +15 -0
  148. package/dist/bone/output/session/src/websocket.js +215 -0
  149. package/dist/bone/output/session/src/websocket.js.map +1 -0
  150. package/dist/bone/output/workspace/src/algorithms.d.ts +1 -0
  151. package/dist/bone/output/workspace/src/algorithms.js +3 -0
  152. package/dist/bone/output/workspace/src/algorithms.js.map +1 -0
  153. package/dist/bone/output/workspace/src/auth.d.ts +8 -0
  154. package/dist/bone/output/workspace/src/auth.js +56 -0
  155. package/dist/bone/output/workspace/src/auth.js.map +1 -0
  156. package/dist/bone/output/workspace/src/db.d.ts +6 -0
  157. package/dist/bone/output/workspace/src/db.js +63 -0
  158. package/dist/bone/output/workspace/src/db.js.map +1 -0
  159. package/dist/bone/output/workspace/src/events.d.ts +25 -0
  160. package/dist/bone/output/workspace/src/events.js +184 -0
  161. package/dist/bone/output/workspace/src/events.js.map +1 -0
  162. package/dist/bone/output/workspace/src/logger.d.ts +28 -0
  163. package/dist/bone/output/workspace/src/logger.js +45 -0
  164. package/dist/bone/output/workspace/src/logger.js.map +1 -0
  165. package/dist/bone/output/workspace/src/metrics.d.ts +5 -0
  166. package/dist/bone/output/workspace/src/metrics.js +60 -0
  167. package/dist/bone/output/workspace/src/metrics.js.map +1 -0
  168. package/dist/bone/output/workspace/src/routes/codebase.d.ts +1 -0
  169. package/dist/bone/output/workspace/src/routes/codebase.js +113 -0
  170. package/dist/bone/output/workspace/src/routes/codebase.js.map +1 -0
  171. package/dist/bone/output/workspace/src/routes/snapshot.d.ts +1 -0
  172. package/dist/bone/output/workspace/src/routes/snapshot.js +151 -0
  173. package/dist/bone/output/workspace/src/routes/snapshot.js.map +1 -0
  174. package/dist/bone/output/workspace/src/routes/workspace.d.ts +1 -0
  175. package/dist/bone/output/workspace/src/routes/workspace.js +209 -0
  176. package/dist/bone/output/workspace/src/routes/workspace.js.map +1 -0
  177. package/dist/bone/output/workspace/src/state_machines/codebase.d.ts +9 -0
  178. package/dist/bone/output/workspace/src/state_machines/codebase.js +19 -0
  179. package/dist/bone/output/workspace/src/state_machines/codebase.js.map +1 -0
  180. package/dist/bone/output/workspace/src/state_machines/snapshot.d.ts +9 -0
  181. package/dist/bone/output/workspace/src/state_machines/snapshot.js +18 -0
  182. package/dist/bone/output/workspace/src/state_machines/snapshot.js.map +1 -0
  183. package/dist/bone/output/workspace/src/state_machines/workspace.d.ts +9 -0
  184. package/dist/bone/output/workspace/src/state_machines/workspace.js +19 -0
  185. package/dist/bone/output/workspace/src/state_machines/workspace.js.map +1 -0
  186. package/dist/compat/opencode_adapter.d.ts +25 -0
  187. package/dist/compat/opencode_adapter.js +599 -0
  188. package/dist/compat/opencode_adapter.js.map +1 -0
  189. package/dist/extensions/chunker.d.ts +24 -0
  190. package/dist/extensions/chunker.js +360 -0
  191. package/dist/extensions/chunker.js.map +1 -0
  192. package/dist/extensions/embedding_provider.d.ts +18 -0
  193. package/dist/extensions/embedding_provider.js +150 -0
  194. package/dist/extensions/embedding_provider.js.map +1 -0
  195. package/dist/extensions/llm_provider.d.ts +33 -0
  196. package/dist/extensions/llm_provider.js +338 -0
  197. package/dist/extensions/llm_provider.js.map +1 -0
  198. package/dist/extensions/mcp_bridge.d.ts +44 -0
  199. package/dist/extensions/mcp_bridge.js +151 -0
  200. package/dist/extensions/mcp_bridge.js.map +1 -0
  201. package/dist/extensions/rag_search.d.ts +38 -0
  202. package/dist/extensions/rag_search.js +242 -0
  203. package/dist/extensions/rag_search.js.map +1 -0
  204. package/dist/extensions/snapshot.d.ts +14 -0
  205. package/dist/extensions/snapshot.js +158 -0
  206. package/dist/extensions/snapshot.js.map +1 -0
  207. package/dist/extensions/tool_executor.d.ts +28 -0
  208. package/dist/extensions/tool_executor.js +268 -0
  209. package/dist/extensions/tool_executor.js.map +1 -0
  210. package/dist/src/cli.d.ts +15 -0
  211. package/dist/src/cli.js +687 -0
  212. package/dist/src/cli.js.map +1 -0
  213. package/dist/src/config.d.ts +44 -0
  214. package/dist/src/config.js +165 -0
  215. package/dist/src/config.js.map +1 -0
  216. package/dist/src/context_builder.d.ts +51 -0
  217. package/dist/src/context_builder.js +558 -0
  218. package/dist/src/context_builder.js.map +1 -0
  219. package/dist/src/db_adapter.d.ts +24 -0
  220. package/dist/src/db_adapter.js +341 -0
  221. package/dist/src/db_adapter.js.map +1 -0
  222. package/dist/src/engine/session/compaction_logic.d.ts +11 -0
  223. package/dist/src/engine/session/compaction_logic.js +113 -0
  224. package/dist/src/engine/session/compaction_logic.js.map +1 -0
  225. package/dist/src/engine/session/instruction_loader.d.ts +5 -0
  226. package/dist/src/engine/session/instruction_loader.js +78 -0
  227. package/dist/src/engine/session/instruction_loader.js.map +1 -0
  228. package/dist/src/engine/session/overflow_check.d.ts +14 -0
  229. package/dist/src/engine/session/overflow_check.js +45 -0
  230. package/dist/src/engine/session/overflow_check.js.map +1 -0
  231. package/dist/src/engine/session/prompt.d.ts +45 -0
  232. package/dist/src/engine/session/prompt.js +584 -0
  233. package/dist/src/engine/session/prompt.js.map +1 -0
  234. package/dist/src/engine/session/provider_transform.d.ts +59 -0
  235. package/dist/src/engine/session/provider_transform.js +193 -0
  236. package/dist/src/engine/session/provider_transform.js.map +1 -0
  237. package/dist/src/engine/session/retry_logic.d.ts +12 -0
  238. package/dist/src/engine/session/retry_logic.js +72 -0
  239. package/dist/src/engine/session/retry_logic.js.map +1 -0
  240. package/dist/src/engine/session/system_prompt.d.ts +9 -0
  241. package/dist/src/engine/session/system_prompt.js +96 -0
  242. package/dist/src/engine/session/system_prompt.js.map +1 -0
  243. package/dist/src/engine/session/tool_registry.d.ts +5 -0
  244. package/dist/src/engine/session/tool_registry.js +117 -0
  245. package/dist/src/engine/session/tool_registry.js.map +1 -0
  246. package/dist/src/export.d.ts +13 -0
  247. package/dist/src/export.js +103 -0
  248. package/dist/src/export.js.map +1 -0
  249. package/dist/src/mdns.d.ts +7 -0
  250. package/dist/src/mdns.js +60 -0
  251. package/dist/src/mdns.js.map +1 -0
  252. package/dist/src/rag_worker.d.ts +38 -0
  253. package/dist/src/rag_worker.js +435 -0
  254. package/dist/src/rag_worker.js.map +1 -0
  255. package/dist/src/server.d.ts +11 -0
  256. package/dist/src/server.js +214 -0
  257. package/dist/src/server.js.map +1 -0
  258. package/dist/src/stats.d.ts +45 -0
  259. package/dist/src/stats.js +233 -0
  260. package/dist/src/stats.js.map +1 -0
  261. package/dist/src/tui.d.ts +29 -0
  262. package/dist/src/tui.js +1053 -0
  263. package/dist/src/tui.js.map +1 -0
  264. package/package.json +7 -4
  265. package/src/cli.ts +247 -5
  266. package/src/export.ts +122 -0
  267. package/src/mdns.ts +53 -0
  268. package/src/server.ts +32 -0
  269. package/src/stats.ts +290 -0
  270. package/src/tui.ts +749 -248
@@ -0,0 +1,558 @@
1
+ "use strict";
2
+ /**
3
+ * BoneCode Context Builder
4
+ *
5
+ * Builds rich codebase context using structural strategies that work
6
+ * without any embedding model:
7
+ * 1. Postgres full-text search (BM25-ranked via ts_rank)
8
+ * 2. Git recency (recently changed files are more relevant)
9
+ * 3. Session history (files read/edited in this session)
10
+ * 4. Import graph expansion (pull in direct dependencies)
11
+ * 5. Instruction file injection (AGENTS.md / CLAUDE.md proximity)
12
+ *
13
+ * OPTIONAL UPGRADE — set EMBEDDING_PROVIDER in .env to enable hybrid search:
14
+ * When EMBEDDING_PROVIDER is set, vector similarity search is added on top
15
+ * of FTS using the bonecode_hybrid_search() stored function (RRF fusion).
16
+ * Without it, pure FTS + structural strategies run — still better than
17
+ * OpenCode's reactive grep approach.
18
+ *
19
+ * To enable embeddings, add to .env:
20
+ * EMBEDDING_PROVIDER=openai # or: ollama, voyage, openai_compatible
21
+ * EMBEDDING_MODEL=text-embedding-3-small
22
+ * EMBEDDING_API_KEY=sk-... # defaults to OPENAI_API_KEY
23
+ * EMBEDDING_BASE_URL= # for local/compatible endpoints
24
+ * EMBEDDING_DIMENSIONS=1536
25
+ */
26
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
27
+ if (k2 === undefined) k2 = k;
28
+ var desc = Object.getOwnPropertyDescriptor(m, k);
29
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
30
+ desc = { enumerable: true, get: function() { return m[k]; } };
31
+ }
32
+ Object.defineProperty(o, k2, desc);
33
+ }) : (function(o, m, k, k2) {
34
+ if (k2 === undefined) k2 = k;
35
+ o[k2] = m[k];
36
+ }));
37
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
38
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
39
+ }) : function(o, v) {
40
+ o["default"] = v;
41
+ });
42
+ var __importStar = (this && this.__importStar) || function (mod) {
43
+ if (mod && mod.__esModule) return mod;
44
+ var result = {};
45
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
46
+ __setModuleDefault(result, mod);
47
+ return result;
48
+ };
49
+ Object.defineProperty(exports, "__esModule", { value: true });
50
+ exports.formatContextForPrompt = exports.buildContext = exports.embeddingsEnabled = void 0;
51
+ const fs = __importStar(require("fs"));
52
+ const path = __importStar(require("path"));
53
+ const db_1 = require("../bone/output/session/src/db");
54
+ const logger_1 = require("../bone/output/session/src/logger");
55
+ // ─── Embedding availability check ────────────────────────────────────────────
56
+ function embeddingsEnabled() {
57
+ return !!(process.env.EMBEDDING_PROVIDER && process.env.EMBEDDING_PROVIDER !== "none");
58
+ }
59
+ exports.embeddingsEnabled = embeddingsEnabled;
60
+ // ─── Main entry point ─────────────────────────────────────────────────────────
61
+ async function buildContext(opts) {
62
+ const { session_id, project_id, worktree, query, max_chunks = 12, max_chars = 12000, } = opts;
63
+ const chunks = [];
64
+ const seen = new Set(); // deduplicate by file_path:start_line
65
+ // Run structural strategies in parallel (always active)
66
+ const [ftsChunks, gitChunks, sessionChunks, instructionFiles] = await Promise.all([
67
+ searchFTS(project_id, query, 20).catch(() => []),
68
+ getGitRecentFiles(worktree, query, 10).catch(() => []),
69
+ getSessionHistory(session_id, worktree, 8).catch(() => []),
70
+ findInstructionFiles(worktree, query).catch(() => []),
71
+ ]);
72
+ // Optional: vector search upgrade when EMBEDDING_PROVIDER is configured
73
+ // Replaces FTS with hybrid search (vector + FTS + RRF) for better recall
74
+ let vectorChunks = [];
75
+ if (embeddingsEnabled() && query.trim()) {
76
+ vectorChunks = await searchVector(project_id, query, 20).catch((e) => {
77
+ logger_1.logger.error("vector_search_failed", { event: "context", metadata: { error: e.message } });
78
+ return [];
79
+ });
80
+ }
81
+ // Merge: prefer vector/hybrid results over pure FTS when available
82
+ const primaryChunks = vectorChunks.length > 0 ? vectorChunks : ftsChunks;
83
+ for (const c of primaryChunks) {
84
+ const key = `${c.file_path}:${c.start_line}`;
85
+ if (!seen.has(key)) {
86
+ seen.add(key);
87
+ chunks.push(c);
88
+ }
89
+ }
90
+ // Add git-recent files not already covered
91
+ for (const c of gitChunks) {
92
+ const key = `${c.file_path}:${c.start_line}`;
93
+ if (!seen.has(key)) {
94
+ seen.add(key);
95
+ chunks.push(c);
96
+ }
97
+ }
98
+ // Add session history files
99
+ for (const c of sessionChunks) {
100
+ const key = `${c.file_path}:${c.start_line}`;
101
+ if (!seen.has(key)) {
102
+ seen.add(key);
103
+ chunks.push(c);
104
+ }
105
+ }
106
+ // Expand top results via import graph
107
+ const topFiles = chunks.slice(0, 5).map(c => c.file_path);
108
+ const importChunks = await expandImportGraph(worktree, topFiles, seen, 6).catch(() => []);
109
+ for (const c of importChunks) {
110
+ const key = `${c.file_path}:${c.start_line}`;
111
+ if (!seen.has(key)) {
112
+ seen.add(key);
113
+ chunks.push(c);
114
+ }
115
+ }
116
+ // Sort by relevance score descending
117
+ chunks.sort((a, b) => b.relevance_score - a.relevance_score);
118
+ // Trim to budget
119
+ const trimmed = trimToCharBudget(chunks.slice(0, max_chunks), max_chars);
120
+ const mode = embeddingsEnabled() && vectorChunks.length > 0 ? "hybrid" : "structural";
121
+ const sources = [...new Set(trimmed.map(c => c.source))].join(", ");
122
+ const summary = trimmed.length > 0
123
+ ? `${trimmed.length} chunks [${mode}] from ${[...new Set(trimmed.map(c => path.basename(c.file_path)))].slice(0, 5).join(", ")} (${sources})`
124
+ : "no relevant context found";
125
+ return { chunks: trimmed, instruction_files: instructionFiles, summary };
126
+ }
127
+ exports.buildContext = buildContext;
128
+ // ─── Strategy 2: Vector Search (optional — requires EMBEDDING_PROVIDER) ───────
129
+ // Uses the bonecode_hybrid_search() stored function (RRF: vector + FTS).
130
+ // Only called when EMBEDDING_PROVIDER is set in .env.
131
+ async function searchVector(project_id, query, limit) {
132
+ if (!query.trim())
133
+ return [];
134
+ // Embed the query using the configured provider
135
+ const { embed_text } = await Promise.resolve().then(() => __importStar(require("../bone/output/rag/src/extensions")));
136
+ const model = process.env.EMBEDDING_MODEL || "text-embedding-nomic-embed-text-v1.5";
137
+ const queryEmbedding = await embed_text(query, model);
138
+ const embStr = "[" + queryEmbedding.join(",") + "]";
139
+ // Use the stored hybrid search function (RRF fusion of vector + FTS)
140
+ const result = await db_1.pool.query(`
141
+ SELECT
142
+ cf.file_path,
143
+ cc.content,
144
+ cc.start_line,
145
+ cc.end_line,
146
+ cc.language,
147
+ cc.symbol_name,
148
+ cc.symbol_type,
149
+ h.rrf_score,
150
+ h.vector_score,
151
+ h.text_score
152
+ FROM bonecode_hybrid_search($1, $2::vector, $3, NULL, NULL, $4) h
153
+ JOIN code_chunks cc ON cc.id = h.chunk_id
154
+ JOIN code_files cf ON cf.id = cc.code_file_id
155
+ JOIN knowledge_bases kb ON kb.id = cc.knowledge_base_id
156
+ WHERE kb.project_id = $5
157
+ ORDER BY h.rrf_score DESC
158
+ `, [
159
+ // knowledge_base_id — find the ready KB for this project
160
+ await getReadyKBId(project_id),
161
+ embStr,
162
+ query,
163
+ limit,
164
+ project_id,
165
+ ]);
166
+ return result.rows.map((row) => ({
167
+ file_path: row.file_path,
168
+ content: row.content,
169
+ start_line: Number(row.start_line),
170
+ end_line: Number(row.end_line),
171
+ language: row.language,
172
+ symbol_name: row.symbol_name,
173
+ symbol_type: row.symbol_type,
174
+ relevance_score: parseFloat(row.rrf_score) * 1000,
175
+ source: "hybrid",
176
+ }));
177
+ }
178
+ async function getReadyKBId(project_id) {
179
+ const result = await db_1.pool.query(`SELECT id FROM knowledge_bases WHERE project_id = $1 AND state = 'ready' ORDER BY updated_at DESC LIMIT 1`, [project_id]);
180
+ return result.rows[0]?.id || "";
181
+ }
182
+ // ─── Strategy 3: Postgres Full-Text Search ────────────────────────────────────
183
+ // Uses the tsvector index already on code_chunks.content.
184
+ // BM25-ranked via ts_rank — no embedding needed.
185
+ async function searchFTS(project_id, query, limit) {
186
+ if (!query.trim())
187
+ return [];
188
+ // Extract meaningful terms — strip common words, keep identifiers
189
+ const terms = extractSearchTerms(query);
190
+ if (terms.length === 0)
191
+ return [];
192
+ // Sanitize each term: keep only alphanumeric + underscore to prevent tsquery injection.
193
+ // Each term is passed as a separate $N parameter and assembled server-side via plainto_tsquery
194
+ // for the rank, and individual prefix-match queries ORed together for the filter.
195
+ const safeTsQuery = terms
196
+ .map(t => t.replace(/[^a-z0-9_]/g, ""))
197
+ .filter(t => t.length >= 2)
198
+ .map(t => `${t}:*`)
199
+ .join(" | ");
200
+ if (!safeTsQuery)
201
+ return [];
202
+ const result = await db_1.pool.query(`
203
+ SELECT
204
+ cf.file_path,
205
+ cc.content,
206
+ cc.start_line,
207
+ cc.end_line,
208
+ cc.language,
209
+ cc.symbol_name,
210
+ cc.symbol_type,
211
+ ts_rank(
212
+ to_tsvector('english', cc.content),
213
+ to_tsquery('english', $2)
214
+ ) AS score
215
+ FROM code_chunks cc
216
+ JOIN code_files cf ON cf.id = cc.code_file_id
217
+ JOIN knowledge_bases kb ON kb.id = cc.knowledge_base_id
218
+ WHERE kb.project_id = $1
219
+ AND to_tsvector('english', cc.content) @@ to_tsquery('english', $2)
220
+ ORDER BY score DESC
221
+ LIMIT $3
222
+ `, [project_id, safeTsQuery, limit]);
223
+ return result.rows.map((row) => ({
224
+ file_path: row.file_path,
225
+ content: row.content,
226
+ start_line: Number(row.start_line),
227
+ end_line: Number(row.end_line),
228
+ language: row.language,
229
+ symbol_name: row.symbol_name,
230
+ symbol_type: row.symbol_type,
231
+ relevance_score: parseFloat(row.score) * 100,
232
+ source: "fts",
233
+ }));
234
+ }
235
+ // ─── Strategy 2: Git Recency ──────────────────────────────────────────────────
236
+ // Files changed in recent commits are more likely to be relevant.
237
+ // Also filters by query terms appearing in the diff.
238
+ async function getGitRecentFiles(worktree, query, limit) {
239
+ if (!fs.existsSync(path.join(worktree, ".git")))
240
+ return [];
241
+ const { execFile } = require("child_process");
242
+ const { promisify } = require("util");
243
+ const exec = promisify(execFile);
244
+ // Get files changed in last 20 commits
245
+ let changedFiles = [];
246
+ try {
247
+ const { stdout } = await exec("git", [
248
+ "log", "--name-only", "--pretty=format:", "-20", "--diff-filter=AM"
249
+ ], { cwd: worktree, timeout: 5000 });
250
+ changedFiles = stdout.split("\n")
251
+ .map((f) => f.trim())
252
+ .filter((f) => f && !f.startsWith("."))
253
+ .filter((f, i, arr) => arr.indexOf(f) === i) // deduplicate
254
+ .slice(0, 30);
255
+ }
256
+ catch {
257
+ return [];
258
+ }
259
+ const terms = extractSearchTerms(query);
260
+ const chunks = [];
261
+ for (const relPath of changedFiles.slice(0, limit * 2)) {
262
+ const fullPath = path.join(worktree, relPath);
263
+ if (!fs.existsSync(fullPath))
264
+ continue;
265
+ const ext = path.extname(relPath).toLowerCase();
266
+ const codeExts = new Set([".ts", ".tsx", ".js", ".jsx", ".py", ".go", ".rs", ".java", ".cs", ".cpp", ".c"]);
267
+ if (!codeExts.has(ext))
268
+ continue;
269
+ try {
270
+ const content = fs.readFileSync(fullPath, "utf-8");
271
+ const lines = content.split("\n");
272
+ // Score by how many query terms appear in the file
273
+ const contentLower = content.toLowerCase();
274
+ const termScore = terms.filter(t => contentLower.includes(t.toLowerCase())).length;
275
+ if (termScore === 0 && terms.length > 0)
276
+ continue;
277
+ // Extract the most relevant section (around first term match)
278
+ const firstMatch = findFirstTermMatch(lines, terms);
279
+ const startLine = Math.max(0, firstMatch - 10);
280
+ const endLine = Math.min(lines.length - 1, firstMatch + 40);
281
+ const snippet = lines.slice(startLine, endLine + 1).join("\n");
282
+ chunks.push({
283
+ file_path: fullPath,
284
+ content: snippet,
285
+ start_line: startLine + 1,
286
+ end_line: endLine + 1,
287
+ language: extToLanguage(ext),
288
+ relevance_score: 30 + termScore * 10,
289
+ source: "git_recency",
290
+ });
291
+ if (chunks.length >= limit)
292
+ break;
293
+ }
294
+ catch {
295
+ continue;
296
+ }
297
+ }
298
+ return chunks;
299
+ }
300
+ // ─── Strategy 3: Session History ─────────────────────────────────────────────
301
+ // Files the agent has already read/edited in this session are highly relevant.
302
+ async function getSessionHistory(session_id, worktree, limit) {
303
+ // Look at tool_calls in this session for read_file / edit_file / write_file
304
+ const result = await db_1.pool.query(`
305
+ SELECT DISTINCT
306
+ tc.tool_input->>'path' AS file_path,
307
+ tc.tool_name,
308
+ tc.created_at
309
+ FROM tool_calls tc
310
+ WHERE tc.session_id = $1
311
+ AND tc.tool_name IN ('read_file', 'edit_file', 'write_file', 'read', 'edit', 'write')
312
+ AND tc.tool_input->>'path' IS NOT NULL
313
+ AND tc.state = 'done'
314
+ ORDER BY tc.created_at DESC
315
+ LIMIT $2
316
+ `, [session_id, limit * 2]);
317
+ const chunks = [];
318
+ const seen = new Set();
319
+ for (const row of result.rows) {
320
+ let filePath = row.file_path;
321
+ if (!path.isAbsolute(filePath))
322
+ filePath = path.join(worktree, filePath);
323
+ if (seen.has(filePath) || !fs.existsSync(filePath))
324
+ continue;
325
+ seen.add(filePath);
326
+ try {
327
+ const content = fs.readFileSync(filePath, "utf-8");
328
+ const lines = content.split("\n");
329
+ // Take first 60 lines as context (usually the most important part)
330
+ const snippet = lines.slice(0, 60).join("\n");
331
+ chunks.push({
332
+ file_path: filePath,
333
+ content: snippet,
334
+ start_line: 1,
335
+ end_line: Math.min(60, lines.length),
336
+ language: extToLanguage(path.extname(filePath)),
337
+ relevance_score: 50, // high — agent already touched this file
338
+ source: "session_history",
339
+ });
340
+ if (chunks.length >= limit)
341
+ break;
342
+ }
343
+ catch {
344
+ continue;
345
+ }
346
+ }
347
+ return chunks;
348
+ }
349
+ // ─── Strategy 4: Import Graph Expansion ──────────────────────────────────────
350
+ // Given a set of relevant files, pull in their direct imports.
351
+ // This ensures the LLM has the types/interfaces/utilities the relevant code depends on.
352
+ async function expandImportGraph(worktree, seedFiles, seen, limit) {
353
+ const chunks = [];
354
+ const toExpand = [...seedFiles];
355
+ for (const filePath of toExpand) {
356
+ if (chunks.length >= limit)
357
+ break;
358
+ if (!fs.existsSync(filePath))
359
+ continue;
360
+ const imports = extractImports(filePath);
361
+ for (const importPath of imports) {
362
+ if (chunks.length >= limit)
363
+ break;
364
+ const resolved = resolveImport(filePath, importPath, worktree);
365
+ if (!resolved || seen.has(`${resolved}:1`))
366
+ continue;
367
+ try {
368
+ const content = fs.readFileSync(resolved, "utf-8");
369
+ const lines = content.split("\n");
370
+ // For imported files, extract just the exports/public API (first 80 lines usually covers it)
371
+ const snippet = lines.slice(0, 80).join("\n");
372
+ seen.add(`${resolved}:1`);
373
+ chunks.push({
374
+ file_path: resolved,
375
+ content: snippet,
376
+ start_line: 1,
377
+ end_line: Math.min(80, lines.length),
378
+ language: extToLanguage(path.extname(resolved)),
379
+ relevance_score: 20, // lower — indirect dependency
380
+ source: "import_graph",
381
+ });
382
+ }
383
+ catch {
384
+ continue;
385
+ }
386
+ }
387
+ }
388
+ return chunks;
389
+ }
390
+ // ─── Strategy 5: Instruction Files ───────────────────────────────────────────
391
+ // Find AGENTS.md, CLAUDE.md, OPENCODE.md near the worktree root.
392
+ // Same approach as OpenCode's instruction.ts.
393
+ async function findInstructionFiles(worktree, _query) {
394
+ const candidates = ["AGENTS.md", "CLAUDE.md", "OPENCODE.md", ".bonecode/instructions.md", "CONTEXT.md"];
395
+ const found = [];
396
+ // Check worktree root and one level down
397
+ const dirsToCheck = [worktree];
398
+ try {
399
+ const entries = fs.readdirSync(worktree, { withFileTypes: true });
400
+ for (const e of entries) {
401
+ if (e.isDirectory() && !e.name.startsWith(".") && e.name !== "node_modules") {
402
+ dirsToCheck.push(path.join(worktree, e.name));
403
+ }
404
+ }
405
+ }
406
+ catch { }
407
+ for (const dir of dirsToCheck.slice(0, 5)) {
408
+ for (const name of candidates) {
409
+ const p = path.join(dir, name);
410
+ if (fs.existsSync(p)) {
411
+ found.push(p);
412
+ break; // one per directory
413
+ }
414
+ }
415
+ }
416
+ return found;
417
+ }
418
+ // ─── Format for LLM ───────────────────────────────────────────────────────────
419
+ function formatContextForPrompt(result, worktree) {
420
+ if (result.chunks.length === 0 && result.instruction_files.length === 0)
421
+ return "";
422
+ const parts = [];
423
+ // Instruction files first (highest priority)
424
+ for (const instrPath of result.instruction_files) {
425
+ try {
426
+ const content = fs.readFileSync(instrPath, "utf-8").trim();
427
+ if (content) {
428
+ const rel = path.relative(worktree, instrPath);
429
+ parts.push(`<!-- Instructions from ${rel} -->\n${content}`);
430
+ }
431
+ }
432
+ catch { }
433
+ }
434
+ // Code chunks
435
+ if (result.chunks.length > 0) {
436
+ parts.push("## Relevant Codebase Context\n");
437
+ for (let i = 0; i < result.chunks.length; i++) {
438
+ const c = result.chunks[i];
439
+ const rel = path.relative(worktree, c.file_path);
440
+ const header = c.symbol_name
441
+ ? `[${i + 1}] ${rel}:${c.start_line}-${c.end_line} (${c.symbol_type}: ${c.symbol_name})`
442
+ : `[${i + 1}] ${rel}:${c.start_line}-${c.end_line}`;
443
+ parts.push(`${header}\n\`\`\`${c.language || ""}\n${c.content.trim()}\n\`\`\``);
444
+ }
445
+ }
446
+ return parts.join("\n\n");
447
+ }
448
+ exports.formatContextForPrompt = formatContextForPrompt;
449
+ // ─── Helpers ──────────────────────────────────────────────────────────────────
450
+ function extractSearchTerms(query) {
451
+ // Extract meaningful identifiers and terms from the query
452
+ // Remove common English stop words, keep code identifiers
453
+ const stopWords = new Set([
454
+ "the", "a", "an", "is", "are", "was", "were", "be", "been", "being",
455
+ "have", "has", "had", "do", "does", "did", "will", "would", "could",
456
+ "should", "may", "might", "shall", "can", "need", "dare", "ought",
457
+ "used", "to", "of", "in", "for", "on", "with", "at", "by", "from",
458
+ "up", "about", "into", "through", "during", "before", "after",
459
+ "above", "below", "between", "out", "off", "over", "under",
460
+ "again", "further", "then", "once", "here", "there", "when",
461
+ "where", "why", "how", "all", "both", "each", "few", "more",
462
+ "most", "other", "some", "such", "no", "nor", "not", "only",
463
+ "own", "same", "so", "than", "too", "very", "just", "but",
464
+ "and", "or", "if", "as", "it", "its", "this", "that", "these",
465
+ "those", "i", "me", "my", "we", "our", "you", "your", "he", "she",
466
+ "him", "her", "they", "them", "what", "which", "who", "whom",
467
+ "implement", "create", "make", "build", "write", "add", "fix",
468
+ "update", "change", "modify", "use", "using", "get", "set",
469
+ "return", "returns", "function", "method", "class", "file",
470
+ "code", "please", "want", "need", "help", "show", "tell",
471
+ ]);
472
+ return query
473
+ .toLowerCase()
474
+ .replace(/[^\w\s]/g, " ")
475
+ .split(/\s+/)
476
+ .filter(t => t.length >= 3 && !stopWords.has(t))
477
+ .filter((t, i, arr) => arr.indexOf(t) === i) // deduplicate
478
+ .slice(0, 8); // max 8 terms for FTS query
479
+ }
480
+ function findFirstTermMatch(lines, terms) {
481
+ if (terms.length === 0)
482
+ return 0;
483
+ for (let i = 0; i < lines.length; i++) {
484
+ const lower = lines[i].toLowerCase();
485
+ if (terms.some(t => lower.includes(t)))
486
+ return i;
487
+ }
488
+ return 0;
489
+ }
490
+ function extToLanguage(ext) {
491
+ const map = {
492
+ ".ts": "typescript", ".tsx": "typescript",
493
+ ".js": "javascript", ".jsx": "javascript", ".mjs": "javascript",
494
+ ".py": "python", ".go": "go", ".rs": "rust", ".java": "java",
495
+ ".cs": "csharp", ".cpp": "cpp", ".c": "c", ".rb": "ruby",
496
+ ".php": "php", ".swift": "swift", ".kt": "kotlin",
497
+ ".md": "markdown", ".json": "json", ".yaml": "yaml", ".toml": "toml",
498
+ ".sql": "sql", ".sh": "bash",
499
+ };
500
+ return map[ext.toLowerCase()] || "text";
501
+ }
502
+ function extractImports(filePath) {
503
+ const ext = path.extname(filePath).toLowerCase();
504
+ const imports = [];
505
+ try {
506
+ const content = fs.readFileSync(filePath, "utf-8");
507
+ if ([".ts", ".tsx", ".js", ".jsx", ".mjs"].includes(ext)) {
508
+ // ES imports: import ... from "..."
509
+ const esImports = content.matchAll(/^import\s+.*?from\s+['"]([^'"]+)['"]/gm);
510
+ for (const m of esImports)
511
+ imports.push(m[1]);
512
+ // require(): const x = require("...")
513
+ const requires = content.matchAll(/require\s*\(\s*['"]([^'"]+)['"]\s*\)/g);
514
+ for (const m of requires)
515
+ imports.push(m[1]);
516
+ }
517
+ else if (ext === ".py") {
518
+ const pyImports = content.matchAll(/^(?:from\s+(\S+)\s+import|import\s+(\S+))/gm);
519
+ for (const m of pyImports)
520
+ imports.push((m[1] || m[2]).replace(/\./g, "/"));
521
+ }
522
+ else if (ext === ".go") {
523
+ const goImports = content.matchAll(/"([^"]+)"/g);
524
+ for (const m of goImports)
525
+ if (m[1].includes("/"))
526
+ imports.push(m[1].split("/").slice(-1)[0]);
527
+ }
528
+ }
529
+ catch { }
530
+ // Only keep relative imports (not node_modules)
531
+ return imports.filter(i => i.startsWith(".") || i.startsWith("/"));
532
+ }
533
+ function resolveImport(fromFile, importPath, worktree) {
534
+ const dir = path.dirname(fromFile);
535
+ const base = path.isAbsolute(importPath) ? importPath : path.resolve(dir, importPath);
536
+ // Try with various extensions
537
+ const exts = ["", ".ts", ".tsx", ".js", ".jsx", "/index.ts", "/index.js"];
538
+ for (const ext of exts) {
539
+ const candidate = base + ext;
540
+ if (fs.existsSync(candidate) && candidate.startsWith(worktree)) {
541
+ return candidate;
542
+ }
543
+ }
544
+ return null;
545
+ }
546
+ function trimToCharBudget(chunks, maxChars) {
547
+ const result = [];
548
+ let total = 0;
549
+ for (const c of chunks) {
550
+ const size = c.content.length;
551
+ if (total + size > maxChars && result.length > 0)
552
+ break;
553
+ result.push(c);
554
+ total += size;
555
+ }
556
+ return result;
557
+ }
558
+ //# sourceMappingURL=context_builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context_builder.js","sourceRoot":"","sources":["../../src/context_builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * BoneCode Database Adapter
3
+ *
4
+ * Provides a unified pool.query() interface that works with either:
5
+ * - PostgreSQL (full experience — RAG, pgvector, durable events)
6
+ * - SQLite (zero-setup fallback — sessions and agent turns only, no RAG)
7
+ *
8
+ * Detection order:
9
+ * 1. If DATABASE_URL is set and Postgres is reachable → use Postgres
10
+ * 2. If Docker is available → offer to auto-start the bonecode-postgres container
11
+ * 3. Otherwise → fall back to SQLite at ~/.bonecode/bonecode.db
12
+ *
13
+ * The SQLite adapter translates the pg Pool.query() interface so all existing
14
+ * code that calls pool.query(sql, params) works without changes.
15
+ * Postgres-specific syntax (RETURNING, ON CONFLICT, jsonb, vector) is
16
+ * translated or stubbed where needed.
17
+ */
18
+ export type DBMode = "postgres" | "sqlite";
19
+ export declare function getDBMode(): DBMode;
20
+ export declare function initDatabase(silent?: boolean): Promise<{
21
+ pool: any;
22
+ mode: DBMode;
23
+ pgAvailable: boolean;
24
+ }>;