bonecode 1.1.0 → 1.2.1

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 (271) hide show
  1. package/README.md +145 -9
  2. package/bin/bonecode +47 -42
  3. package/compat/opencode_adapter.ts +188 -17
  4. package/dist/bone/output/agent/src/algorithms.d.ts +1 -0
  5. package/dist/bone/output/agent/src/algorithms.js +3 -0
  6. package/dist/bone/output/agent/src/algorithms.js.map +1 -0
  7. package/dist/bone/output/agent/src/audit.d.ts +3 -0
  8. package/dist/bone/output/agent/src/audit.js +40 -0
  9. package/dist/bone/output/agent/src/audit.js.map +1 -0
  10. package/dist/bone/output/agent/src/auth.d.ts +8 -0
  11. package/dist/bone/output/agent/src/auth.js +56 -0
  12. package/dist/bone/output/agent/src/auth.js.map +1 -0
  13. package/dist/bone/output/agent/src/db.d.ts +6 -0
  14. package/dist/bone/output/agent/src/db.js +63 -0
  15. package/dist/bone/output/agent/src/db.js.map +1 -0
  16. package/dist/bone/output/agent/src/events.d.ts +25 -0
  17. package/dist/bone/output/agent/src/events.js +184 -0
  18. package/dist/bone/output/agent/src/events.js.map +1 -0
  19. package/dist/bone/output/agent/src/logger.d.ts +28 -0
  20. package/dist/bone/output/agent/src/logger.js +45 -0
  21. package/dist/bone/output/agent/src/logger.js.map +1 -0
  22. package/dist/bone/output/agent/src/metrics.d.ts +5 -0
  23. package/dist/bone/output/agent/src/metrics.js +60 -0
  24. package/dist/bone/output/agent/src/metrics.js.map +1 -0
  25. package/dist/bone/output/agent/src/routes/agent_instance.d.ts +1 -0
  26. package/dist/bone/output/agent/src/routes/agent_instance.js +253 -0
  27. package/dist/bone/output/agent/src/routes/agent_instance.js.map +1 -0
  28. package/dist/bone/output/agent/src/routes/build_step.d.ts +1 -0
  29. package/dist/bone/output/agent/src/routes/build_step.js +133 -0
  30. package/dist/bone/output/agent/src/routes/build_step.js.map +1 -0
  31. package/dist/bone/output/agent/src/routes/plan.d.ts +1 -0
  32. package/dist/bone/output/agent/src/routes/plan.js +119 -0
  33. package/dist/bone/output/agent/src/routes/plan.js.map +1 -0
  34. package/dist/bone/output/agent/src/routes/task.d.ts +1 -0
  35. package/dist/bone/output/agent/src/routes/task.js +133 -0
  36. package/dist/bone/output/agent/src/routes/task.js.map +1 -0
  37. package/dist/bone/output/agent/src/routes/tool_call.d.ts +1 -0
  38. package/dist/bone/output/agent/src/routes/tool_call.js +190 -0
  39. package/dist/bone/output/agent/src/routes/tool_call.js.map +1 -0
  40. package/dist/bone/output/agent/src/state_machines/agent_instance.d.ts +9 -0
  41. package/dist/bone/output/agent/src/state_machines/agent_instance.js +22 -0
  42. package/dist/bone/output/agent/src/state_machines/agent_instance.js.map +1 -0
  43. package/dist/bone/output/agent/src/state_machines/build_step.d.ts +9 -0
  44. package/dist/bone/output/agent/src/state_machines/build_step.js +20 -0
  45. package/dist/bone/output/agent/src/state_machines/build_step.js.map +1 -0
  46. package/dist/bone/output/agent/src/state_machines/plan.d.ts +9 -0
  47. package/dist/bone/output/agent/src/state_machines/plan.js +20 -0
  48. package/dist/bone/output/agent/src/state_machines/plan.js.map +1 -0
  49. package/dist/bone/output/agent/src/state_machines/task.d.ts +9 -0
  50. package/dist/bone/output/agent/src/state_machines/task.js +20 -0
  51. package/dist/bone/output/agent/src/state_machines/task.js.map +1 -0
  52. package/dist/bone/output/agent/src/state_machines/tool_call.d.ts +9 -0
  53. package/dist/bone/output/agent/src/state_machines/tool_call.js +20 -0
  54. package/dist/bone/output/agent/src/state_machines/tool_call.js.map +1 -0
  55. package/dist/bone/output/rag/src/algorithms.d.ts +1 -0
  56. package/dist/bone/output/rag/src/algorithms.js +3 -0
  57. package/dist/bone/output/rag/src/algorithms.js.map +1 -0
  58. package/dist/bone/output/rag/src/auth.d.ts +8 -0
  59. package/dist/bone/output/rag/src/auth.js +56 -0
  60. package/dist/bone/output/rag/src/auth.js.map +1 -0
  61. package/dist/bone/output/rag/src/db.d.ts +6 -0
  62. package/dist/bone/output/rag/src/db.js +63 -0
  63. package/dist/bone/output/rag/src/db.js.map +1 -0
  64. package/dist/bone/output/rag/src/events.d.ts +25 -0
  65. package/dist/bone/output/rag/src/events.js +184 -0
  66. package/dist/bone/output/rag/src/events.js.map +1 -0
  67. package/dist/bone/output/rag/src/extensions.d.ts +83 -0
  68. package/dist/bone/output/rag/src/extensions.js +329 -0
  69. package/dist/bone/output/rag/src/extensions.js.map +1 -0
  70. package/dist/bone/output/rag/src/flows.d.ts +24 -0
  71. package/dist/bone/output/rag/src/flows.js +236 -0
  72. package/dist/bone/output/rag/src/flows.js.map +1 -0
  73. package/dist/bone/output/rag/src/logger.d.ts +28 -0
  74. package/dist/bone/output/rag/src/logger.js +45 -0
  75. package/dist/bone/output/rag/src/logger.js.map +1 -0
  76. package/dist/bone/output/rag/src/metrics.d.ts +5 -0
  77. package/dist/bone/output/rag/src/metrics.js +60 -0
  78. package/dist/bone/output/rag/src/metrics.js.map +1 -0
  79. package/dist/bone/output/rag/src/routes/code_chunk.d.ts +1 -0
  80. package/dist/bone/output/rag/src/routes/code_chunk.js +100 -0
  81. package/dist/bone/output/rag/src/routes/code_chunk.js.map +1 -0
  82. package/dist/bone/output/rag/src/routes/code_file.d.ts +1 -0
  83. package/dist/bone/output/rag/src/routes/code_file.js +127 -0
  84. package/dist/bone/output/rag/src/routes/code_file.js.map +1 -0
  85. package/dist/bone/output/rag/src/routes/indexing_job.d.ts +1 -0
  86. package/dist/bone/output/rag/src/routes/indexing_job.js +113 -0
  87. package/dist/bone/output/rag/src/routes/indexing_job.js.map +1 -0
  88. package/dist/bone/output/rag/src/routes/knowledge_base.d.ts +1 -0
  89. package/dist/bone/output/rag/src/routes/knowledge_base.js +242 -0
  90. package/dist/bone/output/rag/src/routes/knowledge_base.js.map +1 -0
  91. package/dist/bone/output/rag/src/routes/memory_entry.d.ts +1 -0
  92. package/dist/bone/output/rag/src/routes/memory_entry.js +113 -0
  93. package/dist/bone/output/rag/src/routes/memory_entry.js.map +1 -0
  94. package/dist/bone/output/rag/src/state_machines/code_file.d.ts +9 -0
  95. package/dist/bone/output/rag/src/state_machines/code_file.js +21 -0
  96. package/dist/bone/output/rag/src/state_machines/code_file.js.map +1 -0
  97. package/dist/bone/output/rag/src/state_machines/indexing_job.d.ts +9 -0
  98. package/dist/bone/output/rag/src/state_machines/indexing_job.js +20 -0
  99. package/dist/bone/output/rag/src/state_machines/indexing_job.js.map +1 -0
  100. package/dist/bone/output/rag/src/state_machines/knowledge_base.d.ts +9 -0
  101. package/dist/bone/output/rag/src/state_machines/knowledge_base.js +21 -0
  102. package/dist/bone/output/rag/src/state_machines/knowledge_base.js.map +1 -0
  103. package/dist/bone/output/rag/src/state_machines/memory_entry.d.ts +9 -0
  104. package/dist/bone/output/rag/src/state_machines/memory_entry.js +18 -0
  105. package/dist/bone/output/rag/src/state_machines/memory_entry.js.map +1 -0
  106. package/dist/bone/output/session/src/algorithms.d.ts +1 -0
  107. package/dist/bone/output/session/src/algorithms.js +3 -0
  108. package/dist/bone/output/session/src/algorithms.js.map +1 -0
  109. package/dist/bone/output/session/src/audit.d.ts +3 -0
  110. package/dist/bone/output/session/src/audit.js +40 -0
  111. package/dist/bone/output/session/src/audit.js.map +1 -0
  112. package/dist/bone/output/session/src/auth.d.ts +8 -0
  113. package/dist/bone/output/session/src/auth.js +56 -0
  114. package/dist/bone/output/session/src/auth.js.map +1 -0
  115. package/dist/bone/output/session/src/db.d.ts +6 -0
  116. package/dist/bone/output/session/src/db.js +63 -0
  117. package/dist/bone/output/session/src/db.js.map +1 -0
  118. package/dist/bone/output/session/src/events.d.ts +26 -0
  119. package/dist/bone/output/session/src/events.js +212 -0
  120. package/dist/bone/output/session/src/events.js.map +1 -0
  121. package/dist/bone/output/session/src/extensions.d.ts +41 -0
  122. package/dist/bone/output/session/src/extensions.js +217 -0
  123. package/dist/bone/output/session/src/extensions.js.map +1 -0
  124. package/dist/bone/output/session/src/logger.d.ts +28 -0
  125. package/dist/bone/output/session/src/logger.js +44 -0
  126. package/dist/bone/output/session/src/logger.js.map +1 -0
  127. package/dist/bone/output/session/src/metrics.d.ts +5 -0
  128. package/dist/bone/output/session/src/metrics.js +60 -0
  129. package/dist/bone/output/session/src/metrics.js.map +1 -0
  130. package/dist/bone/output/session/src/routes/message.d.ts +1 -0
  131. package/dist/bone/output/session/src/routes/message.js +120 -0
  132. package/dist/bone/output/session/src/routes/message.js.map +1 -0
  133. package/dist/bone/output/session/src/routes/part.d.ts +1 -0
  134. package/dist/bone/output/session/src/routes/part.js +106 -0
  135. package/dist/bone/output/session/src/routes/part.js.map +1 -0
  136. package/dist/bone/output/session/src/routes/permission.d.ts +1 -0
  137. package/dist/bone/output/session/src/routes/permission.js +106 -0
  138. package/dist/bone/output/session/src/routes/permission.js.map +1 -0
  139. package/dist/bone/output/session/src/routes/project.d.ts +1 -0
  140. package/dist/bone/output/session/src/routes/project.js +106 -0
  141. package/dist/bone/output/session/src/routes/project.js.map +1 -0
  142. package/dist/bone/output/session/src/routes/session.d.ts +1 -0
  143. package/dist/bone/output/session/src/routes/session.js +308 -0
  144. package/dist/bone/output/session/src/routes/session.js.map +1 -0
  145. package/dist/bone/output/session/src/state_machines/session.d.ts +9 -0
  146. package/dist/bone/output/session/src/state_machines/session.js +21 -0
  147. package/dist/bone/output/session/src/state_machines/session.js.map +1 -0
  148. package/dist/bone/output/session/src/websocket.d.ts +15 -0
  149. package/dist/bone/output/session/src/websocket.js +215 -0
  150. package/dist/bone/output/session/src/websocket.js.map +1 -0
  151. package/dist/bone/output/workspace/src/algorithms.d.ts +1 -0
  152. package/dist/bone/output/workspace/src/algorithms.js +3 -0
  153. package/dist/bone/output/workspace/src/algorithms.js.map +1 -0
  154. package/dist/bone/output/workspace/src/auth.d.ts +8 -0
  155. package/dist/bone/output/workspace/src/auth.js +56 -0
  156. package/dist/bone/output/workspace/src/auth.js.map +1 -0
  157. package/dist/bone/output/workspace/src/db.d.ts +6 -0
  158. package/dist/bone/output/workspace/src/db.js +63 -0
  159. package/dist/bone/output/workspace/src/db.js.map +1 -0
  160. package/dist/bone/output/workspace/src/events.d.ts +25 -0
  161. package/dist/bone/output/workspace/src/events.js +184 -0
  162. package/dist/bone/output/workspace/src/events.js.map +1 -0
  163. package/dist/bone/output/workspace/src/logger.d.ts +28 -0
  164. package/dist/bone/output/workspace/src/logger.js +45 -0
  165. package/dist/bone/output/workspace/src/logger.js.map +1 -0
  166. package/dist/bone/output/workspace/src/metrics.d.ts +5 -0
  167. package/dist/bone/output/workspace/src/metrics.js +60 -0
  168. package/dist/bone/output/workspace/src/metrics.js.map +1 -0
  169. package/dist/bone/output/workspace/src/routes/codebase.d.ts +1 -0
  170. package/dist/bone/output/workspace/src/routes/codebase.js +113 -0
  171. package/dist/bone/output/workspace/src/routes/codebase.js.map +1 -0
  172. package/dist/bone/output/workspace/src/routes/snapshot.d.ts +1 -0
  173. package/dist/bone/output/workspace/src/routes/snapshot.js +151 -0
  174. package/dist/bone/output/workspace/src/routes/snapshot.js.map +1 -0
  175. package/dist/bone/output/workspace/src/routes/workspace.d.ts +1 -0
  176. package/dist/bone/output/workspace/src/routes/workspace.js +209 -0
  177. package/dist/bone/output/workspace/src/routes/workspace.js.map +1 -0
  178. package/dist/bone/output/workspace/src/state_machines/codebase.d.ts +9 -0
  179. package/dist/bone/output/workspace/src/state_machines/codebase.js +19 -0
  180. package/dist/bone/output/workspace/src/state_machines/codebase.js.map +1 -0
  181. package/dist/bone/output/workspace/src/state_machines/snapshot.d.ts +9 -0
  182. package/dist/bone/output/workspace/src/state_machines/snapshot.js +18 -0
  183. package/dist/bone/output/workspace/src/state_machines/snapshot.js.map +1 -0
  184. package/dist/bone/output/workspace/src/state_machines/workspace.d.ts +9 -0
  185. package/dist/bone/output/workspace/src/state_machines/workspace.js +19 -0
  186. package/dist/bone/output/workspace/src/state_machines/workspace.js.map +1 -0
  187. package/dist/compat/opencode_adapter.d.ts +25 -0
  188. package/dist/compat/opencode_adapter.js +599 -0
  189. package/dist/compat/opencode_adapter.js.map +1 -0
  190. package/dist/extensions/chunker.d.ts +24 -0
  191. package/dist/extensions/chunker.js +360 -0
  192. package/dist/extensions/chunker.js.map +1 -0
  193. package/dist/extensions/embedding_provider.d.ts +18 -0
  194. package/dist/extensions/embedding_provider.js +150 -0
  195. package/dist/extensions/embedding_provider.js.map +1 -0
  196. package/dist/extensions/llm_provider.d.ts +33 -0
  197. package/dist/extensions/llm_provider.js +338 -0
  198. package/dist/extensions/llm_provider.js.map +1 -0
  199. package/dist/extensions/mcp_bridge.d.ts +44 -0
  200. package/dist/extensions/mcp_bridge.js +151 -0
  201. package/dist/extensions/mcp_bridge.js.map +1 -0
  202. package/dist/extensions/rag_search.d.ts +38 -0
  203. package/dist/extensions/rag_search.js +242 -0
  204. package/dist/extensions/rag_search.js.map +1 -0
  205. package/dist/extensions/snapshot.d.ts +14 -0
  206. package/dist/extensions/snapshot.js +158 -0
  207. package/dist/extensions/snapshot.js.map +1 -0
  208. package/dist/extensions/tool_executor.d.ts +28 -0
  209. package/dist/extensions/tool_executor.js +268 -0
  210. package/dist/extensions/tool_executor.js.map +1 -0
  211. package/dist/src/cli.d.ts +15 -0
  212. package/dist/src/cli.js +687 -0
  213. package/dist/src/cli.js.map +1 -0
  214. package/dist/src/config.d.ts +44 -0
  215. package/dist/src/config.js +165 -0
  216. package/dist/src/config.js.map +1 -0
  217. package/dist/src/context_builder.d.ts +51 -0
  218. package/dist/src/context_builder.js +558 -0
  219. package/dist/src/context_builder.js.map +1 -0
  220. package/dist/src/db_adapter.d.ts +24 -0
  221. package/dist/src/db_adapter.js +341 -0
  222. package/dist/src/db_adapter.js.map +1 -0
  223. package/dist/src/engine/session/compaction_logic.d.ts +11 -0
  224. package/dist/src/engine/session/compaction_logic.js +113 -0
  225. package/dist/src/engine/session/compaction_logic.js.map +1 -0
  226. package/dist/src/engine/session/instruction_loader.d.ts +5 -0
  227. package/dist/src/engine/session/instruction_loader.js +78 -0
  228. package/dist/src/engine/session/instruction_loader.js.map +1 -0
  229. package/dist/src/engine/session/overflow_check.d.ts +14 -0
  230. package/dist/src/engine/session/overflow_check.js +45 -0
  231. package/dist/src/engine/session/overflow_check.js.map +1 -0
  232. package/dist/src/engine/session/prompt.d.ts +45 -0
  233. package/dist/src/engine/session/prompt.js +584 -0
  234. package/dist/src/engine/session/prompt.js.map +1 -0
  235. package/dist/src/engine/session/provider_transform.d.ts +59 -0
  236. package/dist/src/engine/session/provider_transform.js +193 -0
  237. package/dist/src/engine/session/provider_transform.js.map +1 -0
  238. package/dist/src/engine/session/retry_logic.d.ts +12 -0
  239. package/dist/src/engine/session/retry_logic.js +72 -0
  240. package/dist/src/engine/session/retry_logic.js.map +1 -0
  241. package/dist/src/engine/session/system_prompt.d.ts +9 -0
  242. package/dist/src/engine/session/system_prompt.js +96 -0
  243. package/dist/src/engine/session/system_prompt.js.map +1 -0
  244. package/dist/src/engine/session/tool_registry.d.ts +5 -0
  245. package/dist/src/engine/session/tool_registry.js +117 -0
  246. package/dist/src/engine/session/tool_registry.js.map +1 -0
  247. package/dist/src/export.d.ts +13 -0
  248. package/dist/src/export.js +103 -0
  249. package/dist/src/export.js.map +1 -0
  250. package/dist/src/mdns.d.ts +7 -0
  251. package/dist/src/mdns.js +60 -0
  252. package/dist/src/mdns.js.map +1 -0
  253. package/dist/src/rag_worker.d.ts +38 -0
  254. package/dist/src/rag_worker.js +435 -0
  255. package/dist/src/rag_worker.js.map +1 -0
  256. package/dist/src/server.d.ts +11 -0
  257. package/dist/src/server.js +214 -0
  258. package/dist/src/server.js.map +1 -0
  259. package/dist/src/stats.d.ts +45 -0
  260. package/dist/src/stats.js +233 -0
  261. package/dist/src/stats.js.map +1 -0
  262. package/dist/src/tui.d.ts +29 -0
  263. package/dist/src/tui.js +1053 -0
  264. package/dist/src/tui.js.map +1 -0
  265. package/package.json +7 -4
  266. package/src/cli.ts +247 -5
  267. package/src/export.ts +122 -0
  268. package/src/mdns.ts +53 -0
  269. package/src/server.ts +32 -0
  270. package/src/stats.ts +290 -0
  271. package/src/tui.ts +749 -248
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.requireAuth = exports.authMiddleware = void 0;
7
+ const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
8
+ // JWT_SECRET must be set in production. The server will refuse to start without it
9
+ // when NODE_ENV is "production" to prevent accidental use of a weak fallback.
10
+ const JWT_SECRET = (() => {
11
+ const secret = process.env.JWT_SECRET;
12
+ if (!secret) {
13
+ if (process.env.NODE_ENV === "production") {
14
+ console.error("[FATAL] JWT_SECRET environment variable is not set. Refusing to start in production.");
15
+ process.exit(1);
16
+ }
17
+ console.warn("[WARN] JWT_SECRET is not set. Using insecure default — do not use in production.");
18
+ return "bonescript-dev-secret-do-not-use-in-production";
19
+ }
20
+ if (secret.length < 32) {
21
+ console.warn("[WARN] JWT_SECRET is shorter than 32 characters. Use a longer secret in production.");
22
+ }
23
+ return secret;
24
+ })();
25
+ function authMiddleware(req, res, next) {
26
+ const header = req.headers.authorization;
27
+ if (!header || !header.startsWith("Bearer ")) {
28
+ req.auth = { authenticated: false, actor_id: null, trace_id: req.headers["x-trace-id"] || "" };
29
+ next();
30
+ return;
31
+ }
32
+ try {
33
+ const token = header.slice(7);
34
+ const decoded = jsonwebtoken_1.default.verify(token, JWT_SECRET);
35
+ req.auth = {
36
+ authenticated: true,
37
+ actor_id: decoded.sub,
38
+ trace_id: req.headers["x-trace-id"] || "",
39
+ };
40
+ }
41
+ catch {
42
+ req.auth = { authenticated: false, actor_id: null, trace_id: req.headers["x-trace-id"] || "" };
43
+ }
44
+ next();
45
+ }
46
+ exports.authMiddleware = authMiddleware;
47
+ function requireAuth(req, res, next) {
48
+ const auth = req.auth;
49
+ if (!auth || !auth.authenticated) {
50
+ res.status(401).json({ error: { code: "UNAUTHORIZED", message: "Authentication required" } });
51
+ return;
52
+ }
53
+ next();
54
+ }
55
+ exports.requireAuth = requireAuth;
56
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../../../bone/output/session/src/auth.ts"],"names":[],"mappings":";;;;;;AAEA,gEAA+B;AAE/B,mFAAmF;AACnF,8EAA8E;AAC9E,MAAM,UAAU,GAAG,CAAC,GAAG,EAAE;IACvB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IACtC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;YAC1C,OAAO,CAAC,KAAK,CAAC,sFAAsF,CAAC,CAAC;YACtG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,kFAAkF,CAAC,CAAC;QACjG,OAAO,gDAAgD,CAAC;IAC1D,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACvB,OAAO,CAAC,IAAI,CAAC,qFAAqF,CAAC,CAAC;IACtG,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC,EAAE,CAAC;AAQL,SAAgB,cAAc,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB;IAC5E,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;IACzC,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5C,GAAW,CAAC,IAAI,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,YAAY,CAAW,IAAI,EAAE,EAAE,CAAC;QAClH,IAAI,EAAE,CAAC;QACP,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,OAAO,GAAG,sBAAG,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,CAAoB,CAAC;QAChE,GAAW,CAAC,IAAI,GAAG;YAClB,aAAa,EAAE,IAAI;YACnB,QAAQ,EAAE,OAAO,CAAC,GAAG;YACrB,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,YAAY,CAAW,IAAI,EAAE;SACpD,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACN,GAAW,CAAC,IAAI,GAAG,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,YAAY,CAAW,IAAI,EAAE,EAAE,CAAC;IACpH,CAAC;IACD,IAAI,EAAE,CAAC;AACT,CAAC;AAnBD,wCAmBC;AAED,SAAgB,WAAW,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB;IACzE,MAAM,IAAI,GAAiB,GAAW,CAAC,IAAI,CAAC;IAC5C,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;QACjC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,yBAAyB,EAAE,EAAE,CAAC,CAAC;QAC9F,OAAO;IACT,CAAC;IACD,IAAI,EAAE,CAAC;AACT,CAAC;AAPD,kCAOC"}
@@ -0,0 +1,6 @@
1
+ import { PoolClient } from "pg";
2
+ export declare const pool: any;
3
+ export declare function query<T = any>(text: string, params?: any[]): Promise<T[]>;
4
+ export declare function queryOne<T = any>(text: string, params?: any[]): Promise<T | null>;
5
+ export declare function execute(text: string, params?: any[]): Promise<number>;
6
+ export declare function transaction<T>(fn: (client: PoolClient) => Promise<T>): Promise<T>;
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.transaction = exports.execute = exports.queryOne = exports.query = exports.pool = void 0;
4
+ // Generated by BoneScript compiler. DO NOT EDIT.
5
+ const pg_1 = require("pg");
6
+ // Lazy pool — created on first use so DATABASE_URL is read after dotenv loads
7
+ let _pool = null;
8
+ function getPool() {
9
+ if (!_pool) {
10
+ _pool = new pg_1.Pool({ connectionString: process.env.DATABASE_URL || "postgresql://localhost:5432/session_domain", max: 20 });
11
+ _pool.on("error", (err) => console.error("[DB] Pool error (non-fatal):", err.message));
12
+ }
13
+ return _pool;
14
+ }
15
+ exports.pool = new Proxy({}, { get(_t, p) { return getPool()[p]; } });
16
+ async function query(text, params) {
17
+ try {
18
+ const result = await exports.pool.query(text, params);
19
+ return result.rows;
20
+ }
21
+ catch (e) {
22
+ throw new Error(`DB query failed: ${e.message}`);
23
+ }
24
+ }
25
+ exports.query = query;
26
+ async function queryOne(text, params) {
27
+ try {
28
+ const rows = await query(text, params);
29
+ return rows[0] || null;
30
+ }
31
+ catch (e) {
32
+ throw new Error(`DB query failed: ${e.message}`);
33
+ }
34
+ }
35
+ exports.queryOne = queryOne;
36
+ async function execute(text, params) {
37
+ try {
38
+ const result = await exports.pool.query(text, params);
39
+ return result.rowCount || 0;
40
+ }
41
+ catch (e) {
42
+ throw new Error(`DB execute failed: ${e.message}`);
43
+ }
44
+ }
45
+ exports.execute = execute;
46
+ async function transaction(fn) {
47
+ const client = await exports.pool.connect();
48
+ try {
49
+ await client.query("BEGIN");
50
+ const result = await fn(client);
51
+ await client.query("COMMIT");
52
+ return result;
53
+ }
54
+ catch (e) {
55
+ await client.query("ROLLBACK");
56
+ throw e;
57
+ }
58
+ finally {
59
+ client.release();
60
+ }
61
+ }
62
+ exports.transaction = transaction;
63
+ //# sourceMappingURL=db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../../../../../bone/output/session/src/db.ts"],"names":[],"mappings":";;;AAAA,iDAAiD;AACjD,2BAAsC;AAEtC,8EAA8E;AAC9E,IAAI,KAAK,GAAgB,IAAI,CAAC;AAC9B,SAAS,OAAO;IACd,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,KAAK,GAAG,IAAI,SAAI,CAAC,EAAE,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,4CAA4C,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1H,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAU,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9F,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AACY,QAAA,IAAI,GAAG,IAAI,KAAK,CAAC,EAAU,EAAE,EAAE,GAAG,CAAC,EAAO,EAAE,CAAM,IAAI,OAAQ,OAAO,EAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAE/F,KAAK,UAAU,KAAK,CAAU,IAAY,EAAE,MAAc;IAC/D,IAAI,CAAC;QAAC,MAAM,MAAM,GAAG,MAAM,YAAI,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAAC,OAAO,MAAM,CAAC,IAAW,CAAC;IAAC,CAAC;IACjF,OAAO,CAAM,EAAE,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAAC,CAAC;AACtE,CAAC;AAHD,sBAGC;AACM,KAAK,UAAU,QAAQ,CAAU,IAAY,EAAE,MAAc;IAClE,IAAI,CAAC;QAAC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAI,IAAI,EAAE,MAAM,CAAC,CAAC;QAAC,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAAC,CAAC;IAC1E,OAAO,CAAM,EAAE,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAAC,CAAC;AACtE,CAAC;AAHD,4BAGC;AACM,KAAK,UAAU,OAAO,CAAC,IAAY,EAAE,MAAc;IACxD,IAAI,CAAC;QAAC,MAAM,MAAM,GAAG,MAAM,YAAI,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAAC,OAAO,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;IAAC,CAAC;IACnF,OAAO,CAAM,EAAE,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAAC,CAAC;AACxE,CAAC;AAHD,0BAGC;AACM,KAAK,UAAU,WAAW,CAAI,EAAsC;IACzE,MAAM,MAAM,GAAG,MAAM,YAAI,CAAC,OAAO,EAAE,CAAC;IACpC,IAAI,CAAC;QAAC,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAAC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC;QAAC,MAAM,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAAC,OAAO,MAAM,CAAC;IAAC,CAAC;IAClH,OAAO,CAAC,EAAE,CAAC;QAAC,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAAC,MAAM,CAAC,CAAC;IAAC,CAAC;YAC9C,CAAC;QAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IAAC,CAAC;AAC/B,CAAC;AALD,kCAKC"}
@@ -0,0 +1,26 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ /// <reference types="node" />
4
+ /// <reference types="node" />
5
+ /// <reference types="node" />
6
+ import { PoolClient } from "pg";
7
+ export type EventDeliveryMode = "in_process" | "durable";
8
+ export interface EventMetadata {
9
+ source: string;
10
+ timestamp: Date;
11
+ correlation_id: string;
12
+ causation_id: string;
13
+ }
14
+ export interface SystemEvent {
15
+ type: string;
16
+ payload: Record<string, unknown>;
17
+ metadata: EventMetadata;
18
+ }
19
+ type Handler = (event: SystemEvent) => Promise<void>;
20
+ export declare const eventBus: {
21
+ subscribe(type: string, handler: Handler): void;
22
+ unsubscribe(type: string, handler: Handler): void;
23
+ publish(type: string, payload: Record<string, unknown>, source: string, correlationId?: string, client?: PoolClient): Promise<void>;
24
+ startWorker(intervalMs?: number): NodeJS.Timeout | null;
25
+ };
26
+ export {};
@@ -0,0 +1,212 @@
1
+ "use strict";
2
+ // Generated by BoneScript compiler. DO NOT EDIT.
3
+ // Durable event bus with transactional outbox pattern.
4
+ // Set EVENT_MODE=durable in .env to enable.
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.eventBus = void 0;
7
+ const uuid_1 = require("uuid");
8
+ const db_1 = require("./db");
9
+ const logger_1 = require("./logger");
10
+ const metrics_1 = require("./metrics");
11
+ const MODE = process.env.EVENT_MODE || "in_process";
12
+ // Events requiring exactly_once delivery (deduplicated)
13
+ const EXACTLY_ONCE_EVENTS = new Set(["SessionCompacted"]);
14
+ // Events requiring at_least_once delivery (retried until ack)
15
+ const AT_LEAST_ONCE_EVENTS = new Set(["SessionCreated", "SessionStateChanged", "MessageAdded", "PartUpdated"]);
16
+ // ─── In-Process Bus ──────────────────────────────────────────────────────────
17
+ class InProcessBus {
18
+ constructor() {
19
+ this.handlers = new Map();
20
+ }
21
+ subscribe(type, handler) {
22
+ const existing = this.handlers.get(type) || [];
23
+ existing.push(handler);
24
+ this.handlers.set(type, existing);
25
+ }
26
+ unsubscribe(type, handler) {
27
+ const existing = this.handlers.get(type);
28
+ if (!existing)
29
+ return;
30
+ const filtered = existing.filter(h => h !== handler);
31
+ if (filtered.length === 0) {
32
+ this.handlers.delete(type);
33
+ }
34
+ else {
35
+ this.handlers.set(type, filtered);
36
+ }
37
+ }
38
+ async publish(type, payload, source, correlationId) {
39
+ const event = {
40
+ type,
41
+ payload,
42
+ metadata: {
43
+ source,
44
+ timestamp: new Date(),
45
+ correlation_id: correlationId || (0, uuid_1.v4)(),
46
+ causation_id: (0, uuid_1.v4)(),
47
+ },
48
+ };
49
+ (0, metrics_1.counter)("event.published", { type, mode: "in_process" });
50
+ const handlers = this.handlers.get(type) || [];
51
+ for (const handler of handlers) {
52
+ try {
53
+ await handler(event);
54
+ (0, metrics_1.counter)("event.delivered", { type, mode: "in_process" });
55
+ }
56
+ catch (e) {
57
+ (0, metrics_1.counter)("event.delivery_failed", { type, mode: "in_process" });
58
+ logger_1.logger.error("event_handler_failed", { event: type, metadata: { error: e.message } });
59
+ }
60
+ }
61
+ }
62
+ }
63
+ // ─── Durable Bus (Transactional Outbox) ──────────────────────────────────────
64
+ class DurableBus {
65
+ constructor() {
66
+ this.handlers = new Map();
67
+ }
68
+ subscribe(type, handler) {
69
+ const existing = this.handlers.get(type) || [];
70
+ existing.push(handler);
71
+ this.handlers.set(type, existing);
72
+ }
73
+ unsubscribe(type, handler) {
74
+ const existing = this.handlers.get(type);
75
+ if (!existing)
76
+ return;
77
+ const filtered = existing.filter(h => h !== handler);
78
+ if (filtered.length === 0) {
79
+ this.handlers.delete(type);
80
+ }
81
+ else {
82
+ this.handlers.set(type, filtered);
83
+ }
84
+ }
85
+ // Write event to outbox within the current transaction (or a new one)
86
+ async publish(type, payload, source, correlationId, client) {
87
+ const eventId = (0, uuid_1.v4)();
88
+ const corrId = correlationId || (0, uuid_1.v4)();
89
+ const sql = `
90
+ INSERT INTO event_outbox (id, event_type, payload, source, correlation_id)
91
+ VALUES ($1, $2, $3, $4, $5)
92
+ `;
93
+ const params = [eventId, type, JSON.stringify({ ...payload, _event_id: eventId }), source, corrId];
94
+ if (client) {
95
+ // Write within caller's transaction — atomicity guaranteed
96
+ await client.query(sql, params);
97
+ }
98
+ else {
99
+ await db_1.pool.query(sql, params);
100
+ }
101
+ (0, metrics_1.counter)("event.outboxed", { type });
102
+ }
103
+ // Called by the background worker
104
+ async flush() {
105
+ const client = await db_1.pool.connect();
106
+ try {
107
+ await client.query("BEGIN");
108
+ // Fetch pending events (lock rows to prevent concurrent processing)
109
+ const { rows } = await client.query(`
110
+ SELECT id, event_type, payload, source, correlation_id, attempts
111
+ FROM event_outbox
112
+ WHERE status = 'pending' AND scheduled_at <= NOW()
113
+ ORDER BY scheduled_at ASC
114
+ LIMIT 50
115
+ FOR UPDATE SKIP LOCKED
116
+ `);
117
+ for (const row of rows) {
118
+ try {
119
+ // exactly_once: check deduplication table
120
+ if (EXACTLY_ONCE_EVENTS.has(row.event_type)) {
121
+ const { rows: dup } = await client.query("SELECT 1 FROM event_processed WHERE event_id = $1", [row.payload._event_id || row.id]);
122
+ if (dup.length > 0) {
123
+ await client.query("UPDATE event_outbox SET status = 'delivered', delivered_at = NOW() WHERE id = $1", [row.id]);
124
+ continue;
125
+ }
126
+ }
127
+ const event = {
128
+ type: row.event_type,
129
+ payload: row.payload,
130
+ metadata: {
131
+ source: row.source,
132
+ timestamp: new Date(),
133
+ correlation_id: row.correlation_id,
134
+ causation_id: (0, uuid_1.v4)(),
135
+ },
136
+ };
137
+ const handlers = this.handlers.get(row.event_type) || [];
138
+ for (const handler of handlers) {
139
+ await handler(event);
140
+ }
141
+ // Mark delivered
142
+ await client.query("UPDATE event_outbox SET status = 'delivered', delivered_at = NOW(), attempts = attempts + 1 WHERE id = $1", [row.id]);
143
+ // Record for exactly_once deduplication
144
+ if (EXACTLY_ONCE_EVENTS.has(row.event_type)) {
145
+ await client.query("INSERT INTO event_processed (event_id, event_type) VALUES ($1, $2) ON CONFLICT DO NOTHING", [row.payload._event_id || row.id, row.event_type]);
146
+ }
147
+ (0, metrics_1.counter)("event.delivered", { type: row.event_type, mode: "durable" });
148
+ }
149
+ catch (e) {
150
+ const maxAttempts = AT_LEAST_ONCE_EVENTS.has(row.event_type) ? 10 : 3;
151
+ const newAttempts = row.attempts + 1;
152
+ const status = newAttempts >= maxAttempts ? "dead_letter" : "pending";
153
+ const backoffMs = Math.min(1000 * Math.pow(2, newAttempts), 300000);
154
+ await client.query(`UPDATE event_outbox
155
+ SET attempts = $1, last_error = $2, status = $3,
156
+ scheduled_at = NOW() + ($4 || ' milliseconds')::interval
157
+ WHERE id = $5`, [newAttempts, e.message, status, backoffMs, row.id]);
158
+ (0, metrics_1.counter)("event.delivery_failed", { type: row.event_type, mode: "durable" });
159
+ logger_1.logger.error("event_delivery_failed", { event: row.event_type, metadata: { error: e.message, attempts: newAttempts } });
160
+ }
161
+ }
162
+ await client.query("COMMIT");
163
+ }
164
+ catch (e) {
165
+ await client.query("ROLLBACK");
166
+ throw e;
167
+ }
168
+ finally {
169
+ client.release();
170
+ }
171
+ }
172
+ // Start background worker
173
+ startWorker(intervalMs = 1000) {
174
+ logger_1.logger.info("event_worker_started", { event: "startup", metadata: { interval_ms: intervalMs } });
175
+ return setInterval(async () => {
176
+ try {
177
+ await this.flush();
178
+ }
179
+ catch (e) {
180
+ logger_1.logger.error("event_worker_error", { event: "flush_failed", metadata: { error: e.message } });
181
+ }
182
+ }, intervalMs);
183
+ }
184
+ }
185
+ // ─── Unified Interface ────────────────────────────────────────────────────────
186
+ const inProcess = new InProcessBus();
187
+ const durable = new DurableBus();
188
+ exports.eventBus = {
189
+ subscribe(type, handler) {
190
+ inProcess.subscribe(type, handler);
191
+ durable.subscribe(type, handler);
192
+ },
193
+ unsubscribe(type, handler) {
194
+ inProcess.unsubscribe(type, handler);
195
+ durable.unsubscribe(type, handler);
196
+ },
197
+ async publish(type, payload, source, correlationId, client) {
198
+ if (MODE === "durable") {
199
+ await durable.publish(type, payload, source, correlationId, client);
200
+ }
201
+ else {
202
+ await inProcess.publish(type, payload, source, correlationId);
203
+ }
204
+ },
205
+ startWorker(intervalMs) {
206
+ if (MODE === "durable") {
207
+ return durable.startWorker(intervalMs);
208
+ }
209
+ return null;
210
+ },
211
+ };
212
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../../../../bone/output/session/src/events.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Extension point: activate_session
3
+ * STABLE: implementation required.
4
+ */
5
+ export declare function activate_session(session_id: string): Promise<boolean>;
6
+ /**
7
+ * Extension point: deactivate_session
8
+ * Optional.
9
+ */
10
+ export declare function deactivate_session(session_id: string): Promise<void>;
11
+ /**
12
+ * Extension point: send_prompt_to_llm
13
+ * STABLE: implementation required.
14
+ */
15
+ export declare function send_prompt_to_llm(session_id: string, message_id: string): Promise<Record<string, unknown>>;
16
+ /**
17
+ * Extension point: cancel_llm_request
18
+ * Optional.
19
+ */
20
+ export declare function cancel_llm_request(session_id: string): Promise<void>;
21
+ /**
22
+ * Extension point: execute_tool_calls
23
+ * STABLE: implementation required.
24
+ */
25
+ export declare function execute_tool_calls(session_id: string, tool_calls: Array<{
26
+ id: string;
27
+ tool_name: string;
28
+ tool_input: Record<string, unknown>;
29
+ }>): Promise<Array<{
30
+ id: string;
31
+ result: {
32
+ success: boolean;
33
+ output?: string;
34
+ error?: string;
35
+ };
36
+ }>>;
37
+ /**
38
+ * Extension point: revert_tool_effects
39
+ * Optional.
40
+ */
41
+ export declare function revert_tool_effects(session_id: string): Promise<void>;
@@ -0,0 +1,217 @@
1
+ "use strict";
2
+ // Generated by BoneScript compiler.
3
+ // Extension points: implement the functions below.
4
+ // Code between sentinel comments is preserved on recompile.
5
+ // DO NOT remove the sentinel comments.
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || function (mod) {
23
+ if (mod && mod.__esModule) return mod;
24
+ var result = {};
25
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
26
+ __setModuleDefault(result, mod);
27
+ return result;
28
+ };
29
+ Object.defineProperty(exports, "__esModule", { value: true });
30
+ exports.revert_tool_effects = exports.execute_tool_calls = exports.cancel_llm_request = exports.send_prompt_to_llm = exports.deactivate_session = exports.activate_session = void 0;
31
+ const db_1 = require("./db");
32
+ const logger_1 = require("./logger");
33
+ const metrics_1 = require("./metrics");
34
+ const websocket_1 = require("./websocket");
35
+ // ─── LLM helpers ─────────────────────────────────────────────────────────────
36
+ function llmFetch(body) {
37
+ const baseUrl = process.env.OPENAI_BASE_URL || "https://api.openai.com/v1";
38
+ const apiKey = process.env.OPENAI_API_KEY || "not-needed";
39
+ return fetch(`${baseUrl}/chat/completions`, {
40
+ method: "POST",
41
+ headers: { "Content-Type": "application/json", Authorization: `Bearer ${apiKey}` },
42
+ body: JSON.stringify(body),
43
+ });
44
+ }
45
+ /**
46
+ * Extension point: activate_session
47
+ * STABLE: implementation required.
48
+ */
49
+ async function activate_session(session_id) {
50
+ // <bonescript:ext:activate_session:begin>
51
+ const row = await (0, db_1.queryOne)("SELECT state FROM sessions WHERE id = $1", [session_id]);
52
+ if (!row)
53
+ return false;
54
+ if (row.state === "active" || row.state === "busy")
55
+ return true;
56
+ if (!["created", "compacting", "archived"].includes(row.state))
57
+ return false;
58
+ await (0, db_1.query)("UPDATE sessions SET state = 'active', updated_at = NOW() WHERE id = $1", [session_id]);
59
+ return true;
60
+ // <bonescript:ext:activate_session:end>
61
+ }
62
+ exports.activate_session = activate_session;
63
+ /**
64
+ * Extension point: deactivate_session
65
+ * Optional.
66
+ */
67
+ async function deactivate_session(session_id) {
68
+ // <bonescript:ext:deactivate_session:begin>
69
+ await (0, db_1.query)("UPDATE sessions SET state = 'active', updated_at = NOW() WHERE id = $1 AND state = 'busy'", [session_id]);
70
+ // <bonescript:ext:deactivate_session:end>
71
+ }
72
+ exports.deactivate_session = deactivate_session;
73
+ /**
74
+ * Extension point: send_prompt_to_llm
75
+ * STABLE: implementation required.
76
+ */
77
+ async function send_prompt_to_llm(session_id, message_id) {
78
+ // <bonescript:ext:send_prompt_to_llm:begin>
79
+ // Load agent config
80
+ const agentRow = await (0, db_1.queryOne)("SELECT * FROM agent_instances WHERE session_id = $1 AND state IN ('running','waiting_for_tool') ORDER BY created_at DESC LIMIT 1", [session_id]);
81
+ if (!agentRow)
82
+ throw new Error(`No active agent for session ${session_id}`);
83
+ // Load message history with parts
84
+ const messages = await (0, db_1.query)(`SELECT m.id, m.role, m.model_id, m.provider_id,
85
+ json_agg(p.* ORDER BY p.order_index) FILTER (WHERE p.id IS NOT NULL) AS parts
86
+ FROM messages m
87
+ LEFT JOIN parts p ON p.message_id = m.id
88
+ WHERE m.session_id = $1
89
+ GROUP BY m.id ORDER BY m.created_at ASC`, [session_id]);
90
+ // Build AI SDK message array
91
+ const aiMessages = messages.map((m) => {
92
+ const parts = m.parts || [];
93
+ if (m.role === "user") {
94
+ return { role: "user", content: parts.filter((p) => p.part_type === "text").map((p) => ({ type: "text", text: p.data?.text || "" })) };
95
+ }
96
+ if (m.role === "assistant") {
97
+ const content = [];
98
+ for (const p of parts) {
99
+ if (p.part_type === "text")
100
+ content.push({ type: "text", text: p.data?.text || "" });
101
+ else if (p.part_type === "tool_invocation")
102
+ content.push({ type: "tool-call", toolCallId: p.data?.tool_call_id, toolName: p.data?.tool_name, args: p.data?.args });
103
+ }
104
+ return { role: "assistant", content };
105
+ }
106
+ if (m.role === "tool") {
107
+ return { role: "tool", content: parts.filter((p) => p.part_type === "tool_result").map((p) => ({ type: "tool-result", toolCallId: p.data?.tool_call_id, toolName: p.data?.tool_name, result: p.data?.result })) };
108
+ }
109
+ return { role: m.role, content: "" };
110
+ });
111
+ // Inject codebase context using no-embedding strategies
112
+ // (FTS, git recency, session history, import graph, instruction files)
113
+ let systemPrompt = agentRow.config?.system_prompt || agentRow.system_prompt || "";
114
+ try {
115
+ const lastUserMsg = messages.filter((m) => m.role === "user").slice(-1)[0];
116
+ const userText = (lastUserMsg?.parts || []).filter((p) => p.part_type === "text").map((p) => p.data?.text || "").join(" ");
117
+ if (userText) {
118
+ // Get project + worktree for this session
119
+ const sessionRow = await (0, db_1.queryOne)(`SELECT s.project_id, p.worktree FROM sessions s JOIN projects p ON p.id = s.project_id WHERE s.id = $1`, [session_id]);
120
+ if (sessionRow?.worktree) {
121
+ const { buildContext, formatContextForPrompt } = await Promise.resolve().then(() => __importStar(require("../../../../src/context_builder")));
122
+ const ctxResult = await buildContext({
123
+ session_id,
124
+ project_id: sessionRow.project_id,
125
+ worktree: sessionRow.worktree,
126
+ query: userText,
127
+ max_chunks: 10,
128
+ max_chars: 10000,
129
+ });
130
+ const ctxText = formatContextForPrompt(ctxResult, sessionRow.worktree);
131
+ if (ctxText) {
132
+ systemPrompt += `\n\n${ctxText}`;
133
+ logger_1.logger.info("context_injected", { event: "context", metadata: { summary: ctxResult.summary } });
134
+ }
135
+ }
136
+ }
137
+ }
138
+ catch (e) {
139
+ logger_1.logger.error("context_build_failed", { event: "context", metadata: { error: e.message } });
140
+ }
141
+ // Call the LLM
142
+ const model = agentRow.model_id || process.env.DEFAULT_MODEL || "local-model";
143
+ const r = await llmFetch({
144
+ model,
145
+ messages: aiMessages,
146
+ system: systemPrompt || undefined,
147
+ temperature: agentRow.temperature ?? 0.7,
148
+ max_tokens: agentRow.max_tokens ?? 2048,
149
+ });
150
+ if (!r.ok)
151
+ throw new Error(`LLM API error ${r.status}: ${await r.text()}`);
152
+ const data = await r.json();
153
+ const msg = data.choices?.[0]?.message;
154
+ const text = msg?.content || msg?.reasoning_content || "";
155
+ const toolCalls = msg?.tool_calls || [];
156
+ const usage = data.usage || {};
157
+ // Update agent token/cost counters
158
+ await (0, db_1.query)("UPDATE agent_instances SET total_tokens_in = total_tokens_in + $2, total_tokens_out = total_tokens_out + $3, context_window_used = context_window_used + $4, updated_at = NOW() WHERE id = $1", [agentRow.id, usage.prompt_tokens || 0, usage.completion_tokens || 0, (usage.prompt_tokens || 0) + (usage.completion_tokens || 0)]);
159
+ // Broadcast text delta to WebSocket part_stream channel
160
+ if (text) {
161
+ (0, websocket_1.broadcastToChannel)("part_stream", { type: "part.delta", session_id, message_id, delta: { type: "text", text } });
162
+ }
163
+ (0, metrics_1.counter)("llm.request.completed", { model, finish_reason: data.choices?.[0]?.finish_reason || "unknown" });
164
+ return {
165
+ text,
166
+ tool_calls: toolCalls,
167
+ usage: { input_tokens: usage.prompt_tokens || 0, output_tokens: usage.completion_tokens || 0 },
168
+ finish_reason: data.choices?.[0]?.finish_reason,
169
+ };
170
+ // <bonescript:ext:send_prompt_to_llm:end>
171
+ }
172
+ exports.send_prompt_to_llm = send_prompt_to_llm;
173
+ /**
174
+ * Extension point: cancel_llm_request
175
+ * Optional.
176
+ */
177
+ async function cancel_llm_request(session_id) {
178
+ // <bonescript:ext:cancel_llm_request:begin>
179
+ // In-flight requests tracked by AbortController — signal abort
180
+ const controller = activeRequests.get(session_id);
181
+ if (controller) {
182
+ controller.abort();
183
+ activeRequests.delete(session_id);
184
+ }
185
+ // <bonescript:ext:cancel_llm_request:end>
186
+ }
187
+ exports.cancel_llm_request = cancel_llm_request;
188
+ const activeRequests = new Map();
189
+ /**
190
+ * Extension point: execute_tool_calls
191
+ * STABLE: implementation required.
192
+ */
193
+ async function execute_tool_calls(session_id, tool_calls) {
194
+ // <bonescript:ext:execute_tool_calls:begin>
195
+ const { execute_tool_calls: execTools } = await Promise.resolve().then(() => __importStar(require("../../../../extensions/tool_executor")));
196
+ return execTools(session_id, tool_calls);
197
+ // <bonescript:ext:execute_tool_calls:end>
198
+ }
199
+ exports.execute_tool_calls = execute_tool_calls;
200
+ /**
201
+ * Extension point: revert_tool_effects
202
+ * Optional.
203
+ */
204
+ async function revert_tool_effects(session_id) {
205
+ // <bonescript:ext:revert_tool_effects:begin>
206
+ const snapshotRow = await (0, db_1.queryOne)("SELECT git_hash FROM snapshots WHERE session_id = $1 AND state = 'committed' ORDER BY created_at DESC LIMIT 1", [session_id]);
207
+ if (!snapshotRow)
208
+ return;
209
+ const wsRow = await (0, db_1.queryOne)("SELECT w.id FROM workspaces w JOIN sessions s ON s.project_id = w.project_id WHERE s.id = $1 LIMIT 1", [session_id]);
210
+ if (!wsRow)
211
+ return;
212
+ const { git_revert } = await Promise.resolve().then(() => __importStar(require("../../../../extensions/snapshot")));
213
+ await git_revert(wsRow.id, snapshotRow.git_hash);
214
+ // <bonescript:ext:revert_tool_effects:end>
215
+ }
216
+ exports.revert_tool_effects = revert_tool_effects;
217
+ //# sourceMappingURL=extensions.js.map