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.
- package/bin/bonecode +47 -42
- package/compat/opencode_adapter.ts +188 -17
- package/dist/bone/output/agent/src/algorithms.d.ts +1 -0
- package/dist/bone/output/agent/src/algorithms.js +3 -0
- package/dist/bone/output/agent/src/algorithms.js.map +1 -0
- package/dist/bone/output/agent/src/audit.d.ts +3 -0
- package/dist/bone/output/agent/src/audit.js +40 -0
- package/dist/bone/output/agent/src/audit.js.map +1 -0
- package/dist/bone/output/agent/src/auth.d.ts +8 -0
- package/dist/bone/output/agent/src/auth.js +56 -0
- package/dist/bone/output/agent/src/auth.js.map +1 -0
- package/dist/bone/output/agent/src/db.d.ts +6 -0
- package/dist/bone/output/agent/src/db.js +63 -0
- package/dist/bone/output/agent/src/db.js.map +1 -0
- package/dist/bone/output/agent/src/events.d.ts +25 -0
- package/dist/bone/output/agent/src/events.js +184 -0
- package/dist/bone/output/agent/src/events.js.map +1 -0
- package/dist/bone/output/agent/src/logger.d.ts +28 -0
- package/dist/bone/output/agent/src/logger.js +45 -0
- package/dist/bone/output/agent/src/logger.js.map +1 -0
- package/dist/bone/output/agent/src/metrics.d.ts +5 -0
- package/dist/bone/output/agent/src/metrics.js +60 -0
- package/dist/bone/output/agent/src/metrics.js.map +1 -0
- package/dist/bone/output/agent/src/routes/agent_instance.d.ts +1 -0
- package/dist/bone/output/agent/src/routes/agent_instance.js +253 -0
- package/dist/bone/output/agent/src/routes/agent_instance.js.map +1 -0
- package/dist/bone/output/agent/src/routes/build_step.d.ts +1 -0
- package/dist/bone/output/agent/src/routes/build_step.js +133 -0
- package/dist/bone/output/agent/src/routes/build_step.js.map +1 -0
- package/dist/bone/output/agent/src/routes/plan.d.ts +1 -0
- package/dist/bone/output/agent/src/routes/plan.js +119 -0
- package/dist/bone/output/agent/src/routes/plan.js.map +1 -0
- package/dist/bone/output/agent/src/routes/task.d.ts +1 -0
- package/dist/bone/output/agent/src/routes/task.js +133 -0
- package/dist/bone/output/agent/src/routes/task.js.map +1 -0
- package/dist/bone/output/agent/src/routes/tool_call.d.ts +1 -0
- package/dist/bone/output/agent/src/routes/tool_call.js +190 -0
- package/dist/bone/output/agent/src/routes/tool_call.js.map +1 -0
- package/dist/bone/output/agent/src/state_machines/agent_instance.d.ts +9 -0
- package/dist/bone/output/agent/src/state_machines/agent_instance.js +22 -0
- package/dist/bone/output/agent/src/state_machines/agent_instance.js.map +1 -0
- package/dist/bone/output/agent/src/state_machines/build_step.d.ts +9 -0
- package/dist/bone/output/agent/src/state_machines/build_step.js +20 -0
- package/dist/bone/output/agent/src/state_machines/build_step.js.map +1 -0
- package/dist/bone/output/agent/src/state_machines/plan.d.ts +9 -0
- package/dist/bone/output/agent/src/state_machines/plan.js +20 -0
- package/dist/bone/output/agent/src/state_machines/plan.js.map +1 -0
- package/dist/bone/output/agent/src/state_machines/task.d.ts +9 -0
- package/dist/bone/output/agent/src/state_machines/task.js +20 -0
- package/dist/bone/output/agent/src/state_machines/task.js.map +1 -0
- package/dist/bone/output/agent/src/state_machines/tool_call.d.ts +9 -0
- package/dist/bone/output/agent/src/state_machines/tool_call.js +20 -0
- package/dist/bone/output/agent/src/state_machines/tool_call.js.map +1 -0
- package/dist/bone/output/rag/src/algorithms.d.ts +1 -0
- package/dist/bone/output/rag/src/algorithms.js +3 -0
- package/dist/bone/output/rag/src/algorithms.js.map +1 -0
- package/dist/bone/output/rag/src/auth.d.ts +8 -0
- package/dist/bone/output/rag/src/auth.js +56 -0
- package/dist/bone/output/rag/src/auth.js.map +1 -0
- package/dist/bone/output/rag/src/db.d.ts +6 -0
- package/dist/bone/output/rag/src/db.js +63 -0
- package/dist/bone/output/rag/src/db.js.map +1 -0
- package/dist/bone/output/rag/src/events.d.ts +25 -0
- package/dist/bone/output/rag/src/events.js +184 -0
- package/dist/bone/output/rag/src/events.js.map +1 -0
- package/dist/bone/output/rag/src/extensions.d.ts +83 -0
- package/dist/bone/output/rag/src/extensions.js +329 -0
- package/dist/bone/output/rag/src/extensions.js.map +1 -0
- package/dist/bone/output/rag/src/flows.d.ts +24 -0
- package/dist/bone/output/rag/src/flows.js +236 -0
- package/dist/bone/output/rag/src/flows.js.map +1 -0
- package/dist/bone/output/rag/src/logger.d.ts +28 -0
- package/dist/bone/output/rag/src/logger.js +45 -0
- package/dist/bone/output/rag/src/logger.js.map +1 -0
- package/dist/bone/output/rag/src/metrics.d.ts +5 -0
- package/dist/bone/output/rag/src/metrics.js +60 -0
- package/dist/bone/output/rag/src/metrics.js.map +1 -0
- package/dist/bone/output/rag/src/routes/code_chunk.d.ts +1 -0
- package/dist/bone/output/rag/src/routes/code_chunk.js +100 -0
- package/dist/bone/output/rag/src/routes/code_chunk.js.map +1 -0
- package/dist/bone/output/rag/src/routes/code_file.d.ts +1 -0
- package/dist/bone/output/rag/src/routes/code_file.js +127 -0
- package/dist/bone/output/rag/src/routes/code_file.js.map +1 -0
- package/dist/bone/output/rag/src/routes/indexing_job.d.ts +1 -0
- package/dist/bone/output/rag/src/routes/indexing_job.js +113 -0
- package/dist/bone/output/rag/src/routes/indexing_job.js.map +1 -0
- package/dist/bone/output/rag/src/routes/knowledge_base.d.ts +1 -0
- package/dist/bone/output/rag/src/routes/knowledge_base.js +242 -0
- package/dist/bone/output/rag/src/routes/knowledge_base.js.map +1 -0
- package/dist/bone/output/rag/src/routes/memory_entry.d.ts +1 -0
- package/dist/bone/output/rag/src/routes/memory_entry.js +113 -0
- package/dist/bone/output/rag/src/routes/memory_entry.js.map +1 -0
- package/dist/bone/output/rag/src/state_machines/code_file.d.ts +9 -0
- package/dist/bone/output/rag/src/state_machines/code_file.js +21 -0
- package/dist/bone/output/rag/src/state_machines/code_file.js.map +1 -0
- package/dist/bone/output/rag/src/state_machines/indexing_job.d.ts +9 -0
- package/dist/bone/output/rag/src/state_machines/indexing_job.js +20 -0
- package/dist/bone/output/rag/src/state_machines/indexing_job.js.map +1 -0
- package/dist/bone/output/rag/src/state_machines/knowledge_base.d.ts +9 -0
- package/dist/bone/output/rag/src/state_machines/knowledge_base.js +21 -0
- package/dist/bone/output/rag/src/state_machines/knowledge_base.js.map +1 -0
- package/dist/bone/output/rag/src/state_machines/memory_entry.d.ts +9 -0
- package/dist/bone/output/rag/src/state_machines/memory_entry.js +18 -0
- package/dist/bone/output/rag/src/state_machines/memory_entry.js.map +1 -0
- package/dist/bone/output/session/src/algorithms.d.ts +1 -0
- package/dist/bone/output/session/src/algorithms.js +3 -0
- package/dist/bone/output/session/src/algorithms.js.map +1 -0
- package/dist/bone/output/session/src/audit.d.ts +3 -0
- package/dist/bone/output/session/src/audit.js +40 -0
- package/dist/bone/output/session/src/audit.js.map +1 -0
- package/dist/bone/output/session/src/auth.d.ts +8 -0
- package/dist/bone/output/session/src/auth.js +56 -0
- package/dist/bone/output/session/src/auth.js.map +1 -0
- package/dist/bone/output/session/src/db.d.ts +6 -0
- package/dist/bone/output/session/src/db.js +63 -0
- package/dist/bone/output/session/src/db.js.map +1 -0
- package/dist/bone/output/session/src/events.d.ts +26 -0
- package/dist/bone/output/session/src/events.js +212 -0
- package/dist/bone/output/session/src/events.js.map +1 -0
- package/dist/bone/output/session/src/extensions.d.ts +41 -0
- package/dist/bone/output/session/src/extensions.js +217 -0
- package/dist/bone/output/session/src/extensions.js.map +1 -0
- package/dist/bone/output/session/src/logger.d.ts +28 -0
- package/dist/bone/output/session/src/logger.js +44 -0
- package/dist/bone/output/session/src/logger.js.map +1 -0
- package/dist/bone/output/session/src/metrics.d.ts +5 -0
- package/dist/bone/output/session/src/metrics.js +60 -0
- package/dist/bone/output/session/src/metrics.js.map +1 -0
- package/dist/bone/output/session/src/routes/message.d.ts +1 -0
- package/dist/bone/output/session/src/routes/message.js +120 -0
- package/dist/bone/output/session/src/routes/message.js.map +1 -0
- package/dist/bone/output/session/src/routes/part.d.ts +1 -0
- package/dist/bone/output/session/src/routes/part.js +106 -0
- package/dist/bone/output/session/src/routes/part.js.map +1 -0
- package/dist/bone/output/session/src/routes/permission.d.ts +1 -0
- package/dist/bone/output/session/src/routes/permission.js +106 -0
- package/dist/bone/output/session/src/routes/permission.js.map +1 -0
- package/dist/bone/output/session/src/routes/project.d.ts +1 -0
- package/dist/bone/output/session/src/routes/project.js +106 -0
- package/dist/bone/output/session/src/routes/project.js.map +1 -0
- package/dist/bone/output/session/src/routes/session.d.ts +1 -0
- package/dist/bone/output/session/src/routes/session.js +308 -0
- package/dist/bone/output/session/src/routes/session.js.map +1 -0
- package/dist/bone/output/session/src/state_machines/session.d.ts +9 -0
- package/dist/bone/output/session/src/state_machines/session.js +21 -0
- package/dist/bone/output/session/src/state_machines/session.js.map +1 -0
- package/dist/bone/output/session/src/websocket.d.ts +15 -0
- package/dist/bone/output/session/src/websocket.js +215 -0
- package/dist/bone/output/session/src/websocket.js.map +1 -0
- package/dist/bone/output/workspace/src/algorithms.d.ts +1 -0
- package/dist/bone/output/workspace/src/algorithms.js +3 -0
- package/dist/bone/output/workspace/src/algorithms.js.map +1 -0
- package/dist/bone/output/workspace/src/auth.d.ts +8 -0
- package/dist/bone/output/workspace/src/auth.js +56 -0
- package/dist/bone/output/workspace/src/auth.js.map +1 -0
- package/dist/bone/output/workspace/src/db.d.ts +6 -0
- package/dist/bone/output/workspace/src/db.js +63 -0
- package/dist/bone/output/workspace/src/db.js.map +1 -0
- package/dist/bone/output/workspace/src/events.d.ts +25 -0
- package/dist/bone/output/workspace/src/events.js +184 -0
- package/dist/bone/output/workspace/src/events.js.map +1 -0
- package/dist/bone/output/workspace/src/logger.d.ts +28 -0
- package/dist/bone/output/workspace/src/logger.js +45 -0
- package/dist/bone/output/workspace/src/logger.js.map +1 -0
- package/dist/bone/output/workspace/src/metrics.d.ts +5 -0
- package/dist/bone/output/workspace/src/metrics.js +60 -0
- package/dist/bone/output/workspace/src/metrics.js.map +1 -0
- package/dist/bone/output/workspace/src/routes/codebase.d.ts +1 -0
- package/dist/bone/output/workspace/src/routes/codebase.js +113 -0
- package/dist/bone/output/workspace/src/routes/codebase.js.map +1 -0
- package/dist/bone/output/workspace/src/routes/snapshot.d.ts +1 -0
- package/dist/bone/output/workspace/src/routes/snapshot.js +151 -0
- package/dist/bone/output/workspace/src/routes/snapshot.js.map +1 -0
- package/dist/bone/output/workspace/src/routes/workspace.d.ts +1 -0
- package/dist/bone/output/workspace/src/routes/workspace.js +209 -0
- package/dist/bone/output/workspace/src/routes/workspace.js.map +1 -0
- package/dist/bone/output/workspace/src/state_machines/codebase.d.ts +9 -0
- package/dist/bone/output/workspace/src/state_machines/codebase.js +19 -0
- package/dist/bone/output/workspace/src/state_machines/codebase.js.map +1 -0
- package/dist/bone/output/workspace/src/state_machines/snapshot.d.ts +9 -0
- package/dist/bone/output/workspace/src/state_machines/snapshot.js +18 -0
- package/dist/bone/output/workspace/src/state_machines/snapshot.js.map +1 -0
- package/dist/bone/output/workspace/src/state_machines/workspace.d.ts +9 -0
- package/dist/bone/output/workspace/src/state_machines/workspace.js +19 -0
- package/dist/bone/output/workspace/src/state_machines/workspace.js.map +1 -0
- package/dist/compat/opencode_adapter.d.ts +25 -0
- package/dist/compat/opencode_adapter.js +599 -0
- package/dist/compat/opencode_adapter.js.map +1 -0
- package/dist/extensions/chunker.d.ts +24 -0
- package/dist/extensions/chunker.js +360 -0
- package/dist/extensions/chunker.js.map +1 -0
- package/dist/extensions/embedding_provider.d.ts +18 -0
- package/dist/extensions/embedding_provider.js +150 -0
- package/dist/extensions/embedding_provider.js.map +1 -0
- package/dist/extensions/llm_provider.d.ts +33 -0
- package/dist/extensions/llm_provider.js +338 -0
- package/dist/extensions/llm_provider.js.map +1 -0
- package/dist/extensions/mcp_bridge.d.ts +44 -0
- package/dist/extensions/mcp_bridge.js +151 -0
- package/dist/extensions/mcp_bridge.js.map +1 -0
- package/dist/extensions/rag_search.d.ts +38 -0
- package/dist/extensions/rag_search.js +242 -0
- package/dist/extensions/rag_search.js.map +1 -0
- package/dist/extensions/snapshot.d.ts +14 -0
- package/dist/extensions/snapshot.js +158 -0
- package/dist/extensions/snapshot.js.map +1 -0
- package/dist/extensions/tool_executor.d.ts +28 -0
- package/dist/extensions/tool_executor.js +268 -0
- package/dist/extensions/tool_executor.js.map +1 -0
- package/dist/src/cli.d.ts +15 -0
- package/dist/src/cli.js +687 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/config.d.ts +44 -0
- package/dist/src/config.js +165 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/context_builder.d.ts +51 -0
- package/dist/src/context_builder.js +558 -0
- package/dist/src/context_builder.js.map +1 -0
- package/dist/src/db_adapter.d.ts +24 -0
- package/dist/src/db_adapter.js +341 -0
- package/dist/src/db_adapter.js.map +1 -0
- package/dist/src/engine/session/compaction_logic.d.ts +11 -0
- package/dist/src/engine/session/compaction_logic.js +113 -0
- package/dist/src/engine/session/compaction_logic.js.map +1 -0
- package/dist/src/engine/session/instruction_loader.d.ts +5 -0
- package/dist/src/engine/session/instruction_loader.js +78 -0
- package/dist/src/engine/session/instruction_loader.js.map +1 -0
- package/dist/src/engine/session/overflow_check.d.ts +14 -0
- package/dist/src/engine/session/overflow_check.js +45 -0
- package/dist/src/engine/session/overflow_check.js.map +1 -0
- package/dist/src/engine/session/prompt.d.ts +45 -0
- package/dist/src/engine/session/prompt.js +584 -0
- package/dist/src/engine/session/prompt.js.map +1 -0
- package/dist/src/engine/session/provider_transform.d.ts +59 -0
- package/dist/src/engine/session/provider_transform.js +193 -0
- package/dist/src/engine/session/provider_transform.js.map +1 -0
- package/dist/src/engine/session/retry_logic.d.ts +12 -0
- package/dist/src/engine/session/retry_logic.js +72 -0
- package/dist/src/engine/session/retry_logic.js.map +1 -0
- package/dist/src/engine/session/system_prompt.d.ts +9 -0
- package/dist/src/engine/session/system_prompt.js +96 -0
- package/dist/src/engine/session/system_prompt.js.map +1 -0
- package/dist/src/engine/session/tool_registry.d.ts +5 -0
- package/dist/src/engine/session/tool_registry.js +117 -0
- package/dist/src/engine/session/tool_registry.js.map +1 -0
- package/dist/src/export.d.ts +13 -0
- package/dist/src/export.js +103 -0
- package/dist/src/export.js.map +1 -0
- package/dist/src/mdns.d.ts +7 -0
- package/dist/src/mdns.js +60 -0
- package/dist/src/mdns.js.map +1 -0
- package/dist/src/rag_worker.d.ts +38 -0
- package/dist/src/rag_worker.js +435 -0
- package/dist/src/rag_worker.js.map +1 -0
- package/dist/src/server.d.ts +11 -0
- package/dist/src/server.js +214 -0
- package/dist/src/server.js.map +1 -0
- package/dist/src/stats.d.ts +45 -0
- package/dist/src/stats.js +233 -0
- package/dist/src/stats.js.map +1 -0
- package/dist/src/tui.d.ts +29 -0
- package/dist/src/tui.js +1053 -0
- package/dist/src/tui.js.map +1 -0
- package/package.json +7 -4
- package/src/cli.ts +247 -5
- package/src/export.ts +122 -0
- package/src/mdns.ts +53 -0
- package/src/server.ts +32 -0
- package/src/stats.ts +290 -0
- 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>;
|