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,242 @@
1
+ "use strict";
2
+ /**
3
+ * BoneCode Extension: RAG Hybrid Search
4
+ *
5
+ * Implements the hybrid_search extension point from rag.bone.
6
+ * Combines:
7
+ * 1. pgvector cosine similarity search (semantic)
8
+ * 2. PostgreSQL full-text search (keyword)
9
+ * 3. Metadata filters (language, file path, symbol type)
10
+ * 4. Reciprocal Rank Fusion (RRF) to merge results
11
+ *
12
+ * This file is preserved across BoneScript recompilation.
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.retrieve_context_for_agent = exports.hybrid_search = void 0;
16
+ const db_1 = require("../bone/output/session/src/db");
17
+ const logger_1 = require("../bone/output/session/src/logger");
18
+ const metrics_1 = require("../bone/output/session/src/metrics");
19
+ const embedding_provider_1 = require("./embedding_provider");
20
+ // ─── Hybrid Search ────────────────────────────────────────────────────────────
21
+ // <bonescript:ext:hybrid_search:begin>
22
+ async function hybrid_search(knowledge_base_id, query_embedding, query_text, filters, limit) {
23
+ const startMs = Date.now();
24
+ try {
25
+ // Use the stored function for a single-round-trip hybrid search
26
+ const vectorStr = `[${query_embedding.join(",")}]`;
27
+ const result = await db_1.pool.query(`SELECT * FROM bonecode_hybrid_search($1, $2::vector, $3, $4, $5, $6)`, [
28
+ knowledge_base_id,
29
+ vectorStr,
30
+ query_text,
31
+ filters.language || null,
32
+ filters.symbol_type || null,
33
+ limit,
34
+ ]);
35
+ (0, metrics_1.counter)("rag.search.hybrid", {
36
+ knowledge_base_id,
37
+ results: String(result.rows.length),
38
+ duration_ms: String(Date.now() - startMs),
39
+ });
40
+ return result.rows.map((row) => ({
41
+ chunk_id: row.chunk_id,
42
+ code_file_id: row.code_file_id,
43
+ file_path: row.file_path,
44
+ content: row.content,
45
+ start_line: Number(row.start_line),
46
+ end_line: Number(row.end_line),
47
+ language: row.language,
48
+ symbol_name: row.symbol_name,
49
+ symbol_type: row.symbol_type,
50
+ score: row.rrf_score,
51
+ vector_score: row.vector_score,
52
+ text_score: row.text_score,
53
+ }));
54
+ }
55
+ catch (e) {
56
+ logger_1.logger.error("hybrid_search_failed", {
57
+ event: "search",
58
+ metadata: { error: e.message, knowledge_base_id },
59
+ });
60
+ throw e;
61
+ }
62
+ }
63
+ exports.hybrid_search = hybrid_search;
64
+ // <bonescript:ext:hybrid_search:end>
65
+ // ─── Vector Search ────────────────────────────────────────────────────────────
66
+ async function vectorSearch(knowledge_base_id, queryEmbedding, filters, limit) {
67
+ // Build WHERE clause from filters
68
+ const conditions = ["cc.knowledge_base_id = $1"];
69
+ const params = [knowledge_base_id];
70
+ let paramIdx = 2;
71
+ if (filters.language) {
72
+ conditions.push(`cc.language = $${paramIdx++}`);
73
+ params.push(filters.language);
74
+ }
75
+ if (filters.symbol_type) {
76
+ conditions.push(`cc.symbol_type = $${paramIdx++}`);
77
+ params.push(filters.symbol_type);
78
+ }
79
+ if (filters.file_path_pattern) {
80
+ conditions.push(`cf.file_path ILIKE $${paramIdx++}`);
81
+ params.push(`%${filters.file_path_pattern}%`);
82
+ }
83
+ // pgvector cosine similarity: 1 - (embedding <=> query_vector)
84
+ // Lower distance = higher similarity
85
+ const vectorStr = `[${queryEmbedding.join(",")}]`;
86
+ const sql = `
87
+ SELECT
88
+ cc.id AS chunk_id,
89
+ cc.code_file_id,
90
+ cf.file_path,
91
+ cc.content,
92
+ cc.start_line,
93
+ cc.end_line,
94
+ cc.language,
95
+ cc.symbol_name,
96
+ cc.symbol_type,
97
+ 1 - (cc.embedding <=> $${paramIdx}::vector) AS vector_score
98
+ FROM code_chunks cc
99
+ JOIN code_files cf ON cf.id = cc.code_file_id
100
+ WHERE ${conditions.join(" AND ")}
101
+ AND cc.embedding IS NOT NULL
102
+ ORDER BY cc.embedding <=> $${paramIdx}::vector
103
+ LIMIT $${paramIdx + 1}
104
+ `;
105
+ params.push(vectorStr, limit);
106
+ const result = await db_1.pool.query(sql, params);
107
+ return result.rows.map((row) => ({
108
+ chunk_id: row.chunk_id,
109
+ code_file_id: row.code_file_id,
110
+ file_path: row.file_path,
111
+ content: row.content,
112
+ start_line: row.start_line,
113
+ end_line: row.end_line,
114
+ language: row.language,
115
+ symbol_name: row.symbol_name,
116
+ symbol_type: row.symbol_type,
117
+ score: row.vector_score,
118
+ vector_score: row.vector_score,
119
+ }));
120
+ }
121
+ // ─── Full-Text Search ─────────────────────────────────────────────────────────
122
+ async function fullTextSearch(knowledge_base_id, queryText, filters, limit) {
123
+ const conditions = ["cc.knowledge_base_id = $1"];
124
+ const params = [knowledge_base_id];
125
+ let paramIdx = 2;
126
+ if (filters.language) {
127
+ conditions.push(`cc.language = $${paramIdx++}`);
128
+ params.push(filters.language);
129
+ }
130
+ if (filters.symbol_type) {
131
+ conditions.push(`cc.symbol_type = $${paramIdx++}`);
132
+ params.push(filters.symbol_type);
133
+ }
134
+ if (filters.file_path_pattern) {
135
+ conditions.push(`cf.file_path ILIKE $${paramIdx++}`);
136
+ params.push(`%${filters.file_path_pattern}%`);
137
+ }
138
+ // PostgreSQL full-text search with ts_rank
139
+ const sql = `
140
+ SELECT
141
+ cc.id AS chunk_id,
142
+ cc.code_file_id,
143
+ cf.file_path,
144
+ cc.content,
145
+ cc.start_line,
146
+ cc.end_line,
147
+ cc.language,
148
+ cc.symbol_name,
149
+ cc.symbol_type,
150
+ ts_rank(
151
+ to_tsvector('english', cc.content),
152
+ plainto_tsquery('english', $${paramIdx})
153
+ ) AS text_score
154
+ FROM code_chunks cc
155
+ JOIN code_files cf ON cf.id = cc.code_file_id
156
+ WHERE ${conditions.join(" AND ")}
157
+ AND to_tsvector('english', cc.content) @@ plainto_tsquery('english', $${paramIdx})
158
+ ORDER BY text_score DESC
159
+ LIMIT $${paramIdx + 1}
160
+ `;
161
+ params.push(queryText, limit);
162
+ try {
163
+ const result = await db_1.pool.query(sql, params);
164
+ return result.rows.map((row) => ({
165
+ chunk_id: row.chunk_id,
166
+ code_file_id: row.code_file_id,
167
+ file_path: row.file_path,
168
+ content: row.content,
169
+ start_line: row.start_line,
170
+ end_line: row.end_line,
171
+ language: row.language,
172
+ symbol_name: row.symbol_name,
173
+ symbol_type: row.symbol_type,
174
+ score: row.text_score,
175
+ text_score: row.text_score,
176
+ }));
177
+ }
178
+ catch {
179
+ // Full-text search can fail if query is empty or malformed
180
+ return [];
181
+ }
182
+ }
183
+ // ─── Reciprocal Rank Fusion ───────────────────────────────────────────────────
184
+ /**
185
+ * RRF merges two ranked lists into a single ranking.
186
+ * score(d) = Σ 1 / (k + rank(d)) where k=60 is the standard constant.
187
+ */
188
+ function reciprocalRankFusion(vectorResults, textResults, limit) {
189
+ const K = 60;
190
+ const scores = new Map();
191
+ // Score from vector results
192
+ vectorResults.forEach((result, rank) => {
193
+ const existing = scores.get(result.chunk_id);
194
+ const rrfScore = 1 / (K + rank + 1);
195
+ if (existing) {
196
+ existing.rrf += rrfScore;
197
+ existing.result.vector_score = result.vector_score;
198
+ }
199
+ else {
200
+ scores.set(result.chunk_id, { result, rrf: rrfScore });
201
+ }
202
+ });
203
+ // Score from text results
204
+ textResults.forEach((result, rank) => {
205
+ const existing = scores.get(result.chunk_id);
206
+ const rrfScore = 1 / (K + rank + 1);
207
+ if (existing) {
208
+ existing.rrf += rrfScore;
209
+ existing.result.text_score = result.text_score;
210
+ }
211
+ else {
212
+ scores.set(result.chunk_id, { result: { ...result, text_score: result.text_score }, rrf: rrfScore });
213
+ }
214
+ });
215
+ // Sort by RRF score and return top-k
216
+ return Array.from(scores.values())
217
+ .sort((a, b) => b.rrf - a.rrf)
218
+ .slice(0, limit)
219
+ .map(({ result, rrf }) => ({ ...result, score: rrf }));
220
+ }
221
+ // ─── Context Retrieval (high-level) ──────────────────────────────────────────
222
+ /**
223
+ * High-level context retrieval for agent use.
224
+ * Embeds the query, runs hybrid search, and formats results for LLM context.
225
+ */
226
+ async function retrieve_context_for_agent(knowledge_base_id, query, limit = 10, filters = {}) {
227
+ // Embed the query
228
+ const queryEmbedding = await (0, embedding_provider_1.embed_text)(query, process.env.EMBEDDING_MODEL || "text-embedding-nomic-embed-text-v1.5");
229
+ // Run hybrid search
230
+ const results = await hybrid_search(knowledge_base_id, queryEmbedding, query, filters, limit);
231
+ if (results.length === 0) {
232
+ return "No relevant code found in the knowledge base.";
233
+ }
234
+ // Format results for LLM context
235
+ const formatted = results.map((r, i) => {
236
+ const header = `[${i + 1}] ${r.file_path}:${r.start_line}-${r.end_line}${r.symbol_name ? ` (${r.symbol_type}: ${r.symbol_name})` : ""}`;
237
+ return `${header}\n\`\`\`${r.language || ""}\n${r.content}\n\`\`\``;
238
+ });
239
+ return formatted.join("\n\n");
240
+ }
241
+ exports.retrieve_context_for_agent = retrieve_context_for_agent;
242
+ //# sourceMappingURL=rag_search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rag_search.js","sourceRoot":"","sources":["../../extensions/rag_search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * BoneCode Extension: Git Snapshot
3
+ *
4
+ * Implements the git_snapshot, git_revert, and git_diff extension points
5
+ * from workspace.bone. Uses a separate internal git repository (gitdir)
6
+ * to track file changes without polluting the user's project repo.
7
+ *
8
+ * This mirrors OpenCode's snapshot system but stores metadata in Postgres.
9
+ *
10
+ * This file is preserved across BoneScript recompilation.
11
+ */
12
+ export declare function git_snapshot(workspace_id: string, session_id: string): Promise<string>;
13
+ export declare function git_revert(workspace_id: string, git_hash: string): Promise<Record<string, unknown>>;
14
+ export declare function git_diff(workspace_id: string, from_hash: string, to_hash?: string): Promise<string>;
@@ -0,0 +1,158 @@
1
+ "use strict";
2
+ /**
3
+ * BoneCode Extension: Git Snapshot
4
+ *
5
+ * Implements the git_snapshot, git_revert, and git_diff extension points
6
+ * from workspace.bone. Uses a separate internal git repository (gitdir)
7
+ * to track file changes without polluting the user's project repo.
8
+ *
9
+ * This mirrors OpenCode's snapshot system but stores metadata in Postgres.
10
+ *
11
+ * This file is preserved across BoneScript recompilation.
12
+ */
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
26
+ }) : function(o, v) {
27
+ o["default"] = v;
28
+ });
29
+ var __importStar = (this && this.__importStar) || function (mod) {
30
+ if (mod && mod.__esModule) return mod;
31
+ var result = {};
32
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
33
+ __setModuleDefault(result, mod);
34
+ return result;
35
+ };
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.git_diff = exports.git_revert = exports.git_snapshot = void 0;
38
+ const path = __importStar(require("path"));
39
+ const os = __importStar(require("os"));
40
+ const fs = __importStar(require("fs/promises"));
41
+ const child_process_1 = require("child_process");
42
+ const util_1 = require("util");
43
+ const db_1 = require("../bone/output/session/src/db");
44
+ const logger_1 = require("../bone/output/session/src/logger");
45
+ const execFileAsync = (0, util_1.promisify)(child_process_1.execFile);
46
+ // Internal git repos are stored here, separate from user's project
47
+ const SNAPSHOT_BASE = path.join(os.homedir(), ".bonecode", "snapshots");
48
+ // ─── Git Snapshot ─────────────────────────────────────────────────────────────
49
+ // <bonescript:ext:git_snapshot:begin>
50
+ async function git_snapshot(workspace_id, session_id) {
51
+ const workspaceRow = await db_1.pool.query(`SELECT root_path, project_id FROM workspaces WHERE id = $1`, [workspace_id]);
52
+ if (!workspaceRow.rows[0])
53
+ throw new Error(`Workspace not found: ${workspace_id}`);
54
+ const { root_path, project_id } = workspaceRow.rows[0];
55
+ const gitDir = path.join(SNAPSHOT_BASE, project_id);
56
+ // Initialize internal git repo if needed
57
+ await ensureSnapshotRepo(gitDir, root_path);
58
+ // Stage all changes and commit
59
+ await git(gitDir, root_path, ["add", "-A"]);
60
+ const timestamp = new Date().toISOString();
61
+ const message = `bonecode-snapshot: session=${session_id} at=${timestamp}`;
62
+ try {
63
+ await git(gitDir, root_path, ["commit", "-m", message, "--allow-empty"]);
64
+ }
65
+ catch (e) {
66
+ // "nothing to commit" is fine
67
+ if (!e.message.includes("nothing to commit"))
68
+ throw e;
69
+ }
70
+ // Get the commit hash
71
+ const { stdout } = await git(gitDir, root_path, ["rev-parse", "HEAD"]);
72
+ const hash = stdout.trim();
73
+ logger_1.logger.info("snapshot_created", {
74
+ event: "snapshot",
75
+ metadata: { workspace_id, session_id, hash },
76
+ });
77
+ return hash;
78
+ }
79
+ exports.git_snapshot = git_snapshot;
80
+ // <bonescript:ext:git_snapshot:end>
81
+ // ─── Git Revert ───────────────────────────────────────────────────────────────
82
+ // <bonescript:ext:git_revert:begin>
83
+ async function git_revert(workspace_id, git_hash) {
84
+ const workspaceRow = await db_1.pool.query(`SELECT root_path, project_id FROM workspaces WHERE id = $1`, [workspace_id]);
85
+ if (!workspaceRow.rows[0])
86
+ throw new Error(`Workspace not found: ${workspace_id}`);
87
+ const { root_path, project_id } = workspaceRow.rows[0];
88
+ const gitDir = path.join(SNAPSHOT_BASE, project_id);
89
+ // Get the diff between the target hash and current HEAD
90
+ const { stdout: diffOutput } = await git(gitDir, root_path, [
91
+ "diff",
92
+ git_hash,
93
+ "HEAD",
94
+ "--name-only",
95
+ ]);
96
+ const changedFiles = diffOutput.trim().split("\n").filter(Boolean);
97
+ // Restore each file to the snapshot state
98
+ for (const file of changedFiles) {
99
+ try {
100
+ await git(gitDir, root_path, ["checkout", git_hash, "--", file]);
101
+ }
102
+ catch (e) {
103
+ // File may have been deleted in the snapshot — remove it
104
+ if (e.message.includes("did not match any file")) {
105
+ const fullPath = path.join(root_path, file);
106
+ try {
107
+ await fs.unlink(fullPath);
108
+ }
109
+ catch {
110
+ // File already gone
111
+ }
112
+ }
113
+ }
114
+ }
115
+ logger_1.logger.info("snapshot_reverted", {
116
+ event: "revert",
117
+ metadata: { workspace_id, git_hash, files_reverted: changedFiles.length },
118
+ });
119
+ return { files_reverted: changedFiles.length, files: changedFiles };
120
+ }
121
+ exports.git_revert = git_revert;
122
+ // <bonescript:ext:git_revert:end>
123
+ // ─── Git Diff ─────────────────────────────────────────────────────────────────
124
+ // <bonescript:ext:git_diff:begin>
125
+ async function git_diff(workspace_id, from_hash, to_hash) {
126
+ const workspaceRow = await db_1.pool.query(`SELECT root_path, project_id FROM workspaces WHERE id = $1`, [workspace_id]);
127
+ if (!workspaceRow.rows[0])
128
+ throw new Error(`Workspace not found: ${workspace_id}`);
129
+ const { root_path, project_id } = workspaceRow.rows[0];
130
+ const gitDir = path.join(SNAPSHOT_BASE, project_id);
131
+ const args = ["diff", from_hash];
132
+ if (to_hash)
133
+ args.push(to_hash);
134
+ const { stdout } = await git(gitDir, root_path, args);
135
+ return stdout;
136
+ }
137
+ exports.git_diff = git_diff;
138
+ // <bonescript:ext:git_diff:end>
139
+ // ─── Helpers ──────────────────────────────────────────────────────────────────
140
+ async function ensureSnapshotRepo(gitDir, workTree) {
141
+ await fs.mkdir(gitDir, { recursive: true });
142
+ try {
143
+ await git(gitDir, workTree, ["rev-parse", "--git-dir"]);
144
+ }
145
+ catch {
146
+ // Initialize the repo
147
+ await git(gitDir, workTree, ["init", "--separate-git-dir", gitDir]);
148
+ await git(gitDir, workTree, ["config", "user.email", "bonecode@localhost"]);
149
+ await git(gitDir, workTree, ["config", "user.name", "BoneCode"]);
150
+ }
151
+ }
152
+ async function git(gitDir, workTree, args) {
153
+ return execFileAsync("git", [`--git-dir=${gitDir}`, `--work-tree=${workTree}`, ...args], {
154
+ timeout: 30000,
155
+ maxBuffer: 50 * 1024 * 1024,
156
+ });
157
+ }
158
+ //# sourceMappingURL=snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../extensions/snapshot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * BoneCode Extension: Tool Executor
3
+ *
4
+ * Implements the execute_tool_calls and revert_tool_effects extension points
5
+ * from agent.bone. Provides all built-in tools:
6
+ * - read_file, write_file, edit_file (file system)
7
+ * - run_command (bash/shell execution)
8
+ * - search_files (grep/ripgrep)
9
+ * - list_directory
10
+ * - mcp_call (MCP server bridge)
11
+ *
12
+ * This file is preserved across BoneScript recompilation.
13
+ */
14
+ export interface ToolResult {
15
+ success: boolean;
16
+ output?: string;
17
+ error?: string;
18
+ metadata?: Record<string, unknown>;
19
+ }
20
+ export declare function execute_tool_calls(session_id: string, tool_calls: Array<{
21
+ id: string;
22
+ tool_name: string;
23
+ tool_input: Record<string, unknown>;
24
+ }>): Promise<Array<{
25
+ id: string;
26
+ result: ToolResult;
27
+ }>>;
28
+ export declare function revert_tool_effects(session_id: string): Promise<void>;