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
package/bin/bonecode CHANGED
@@ -1,62 +1,67 @@
1
1
  #!/usr/bin/env node
2
- // BoneCode CLI entry point
3
- // Resolves and runs the CLI via ts-node (dev) or compiled JS (prod).
2
+ "use strict";
4
3
 
5
4
  const path = require("path");
6
5
  const { spawnSync } = require("child_process");
7
6
  const fs = require("fs");
8
- const os = require("os");
9
7
 
10
- const isWindows = os.platform() === "win32";
11
-
12
- // Resolve the package root (two levels up from bin/)
13
- const scriptPath = fs.realpathSync(__filename);
14
- const pkgRoot = path.dirname(path.dirname(scriptPath));
8
+ // Resolve package root (one level up from bin/)
9
+ const pkgRoot = path.dirname(path.dirname(fs.realpathSync(__filename)));
15
10
 
11
+ // Prefer compiled JS — always built by `npm run build`
16
12
  const cliJs = path.join(pkgRoot, "dist", "src", "cli.js");
17
- const cliTs = path.join(pkgRoot, "src", "cli.ts");
13
+ if (fs.existsSync(cliJs)) {
14
+ const result = spawnSync(process.execPath, [cliJs, ...process.argv.slice(2)], {
15
+ stdio: "inherit",
16
+ cwd: process.cwd(),
17
+ env: process.env,
18
+ });
19
+ process.exit(result.status ?? 0);
20
+ }
18
21
 
19
- function findTsNode() {
20
- // Try local node_modules first
21
- const local = path.join(pkgRoot, "node_modules", ".bin", isWindows ? "ts-node.cmd" : "ts-node");
22
- if (fs.existsSync(local)) return local;
23
- // Fall back to global ts-node
24
- return isWindows ? "ts-node.cmd" : "ts-node";
22
+ // Dev fallback: try tsx (works without compilation, no .cmd issues)
23
+ const cliTs = path.join(pkgRoot, "src", "cli.ts");
24
+ if (!fs.existsSync(cliTs)) {
25
+ console.error("BoneCode: CLI entry point not found.");
26
+ console.error(" Run `npm run build` inside the BoneCode directory first.");
27
+ process.exit(1);
25
28
  }
26
29
 
27
- function run(cmd, args) {
28
- const result = spawnSync(cmd, args, {
30
+ // Find tsx in local node_modules
31
+ const tsxLocal = path.join(pkgRoot, "node_modules", ".bin", "tsx");
32
+ const tsxLocalCmd = tsxLocal + (process.platform === "win32" ? ".cmd" : "");
33
+
34
+ if (fs.existsSync(tsxLocalCmd)) {
35
+ const result = spawnSync(tsxLocalCmd, [cliTs, ...process.argv.slice(2)], {
29
36
  stdio: "inherit",
30
37
  cwd: process.cwd(),
31
38
  env: process.env,
32
- shell: false,
39
+ shell: process.platform === "win32",
33
40
  });
34
-
35
- if (result.error) {
36
- // If the command failed (e.g. .cmd not found), try with shell: true
37
- const result2 = spawnSync(cmd, args, {
38
- stdio: "inherit",
39
- cwd: process.cwd(),
40
- env: process.env,
41
- shell: true,
42
- });
43
- process.exit(result2.status ?? 0);
44
- return;
45
- }
46
-
47
41
  process.exit(result.status ?? 0);
48
42
  }
49
43
 
50
- if (fs.existsSync(cliJs)) {
51
- // Production: use compiled JS
52
- run(process.execPath, [cliJs, ...process.argv.slice(2)]);
53
- } else if (fs.existsSync(cliTs)) {
54
- // Development: use ts-node
55
- const tsNode = findTsNode();
56
- const tsconfig = path.join(pkgRoot, "tsconfig.json");
57
- run(tsNode, ["--project", tsconfig, cliTs, ...process.argv.slice(2)]);
58
- } else {
59
- console.error("BoneCode: could not find CLI entry point.");
60
- console.error(" Run `npm run build` to compile, or ensure ts-node is installed.");
44
+ // Last resort: npx tsx (downloads on first run)
45
+ console.error("BoneCode: compiled JS not found. Building now...");
46
+ const build = spawnSync(
47
+ process.platform === "win32" ? "npm.cmd" : "npm",
48
+ ["run", "build"],
49
+ { stdio: "inherit", cwd: pkgRoot, shell: process.platform === "win32" }
50
+ );
51
+ if (build.status !== 0) {
52
+ console.error("Build failed. Run `npm run build` manually in the BoneCode directory.");
61
53
  process.exit(1);
62
54
  }
55
+
56
+ // Retry with compiled JS
57
+ if (fs.existsSync(cliJs)) {
58
+ const result = spawnSync(process.execPath, [cliJs, ...process.argv.slice(2)], {
59
+ stdio: "inherit",
60
+ cwd: process.cwd(),
61
+ env: process.env,
62
+ });
63
+ process.exit(result.status ?? 0);
64
+ }
65
+
66
+ console.error("Build succeeded but CLI not found at:", cliJs);
67
+ process.exit(1);
@@ -11,7 +11,9 @@
11
11
  * GET /v2/session/:id → get session
12
12
  * DELETE /v2/session/:id → delete_session
13
13
  * POST /v2/session/:id/prompt → run_agent_turn (streaming SSE)
14
- * GET /v2/session/:id/message list messages
14
+ * POST /v2/session/:id/cancel cancel in-flight agent turn
15
+ * POST /v2/session/:id/subagent → spawn child session
16
+ * GET /v2/session/:id/message → list messages (cursor pagination)
15
17
  * GET /v2/session/:id/message/:msgId → get message
16
18
  * GET /v2/event → SSE event stream (global)
17
19
  * GET /v2/provider → list providers
@@ -86,10 +88,12 @@ compatRouter.post("/v2/session", async (req: Request, res: Response) => {
86
88
  }
87
89
  });
88
90
 
89
- // GET /v2/session — list sessions
91
+ // GET /v2/session — list sessions (with optional cursor pagination)
90
92
  compatRouter.get("/v2/session", async (req: Request, res: Response) => {
91
93
  try {
92
- const { projectID, directory, search } = req.query;
94
+ const { projectID, directory, search, cursor, limit: limitStr, direction = "next", roots } = req.query;
95
+ const limit = Math.min(parseInt(String(limitStr || "100")), 200);
96
+
93
97
  let sql = `SELECT * FROM sessions WHERE state != 'deleted'`;
94
98
  const params: unknown[] = [];
95
99
  let idx = 1;
@@ -97,11 +101,43 @@ compatRouter.get("/v2/session", async (req: Request, res: Response) => {
97
101
  if (projectID) { sql += ` AND project_id = $${idx++}`; params.push(projectID); }
98
102
  if (directory) { sql += ` AND directory = $${idx++}`; params.push(directory); }
99
103
  if (search) { sql += ` AND title ILIKE $${idx++}`; params.push(`%${search}%`); }
104
+ if (roots === "true") { sql += ` AND parent_id IS NULL`; }
105
+
106
+ // Cursor-based keyset pagination (opencode v2 pattern)
107
+ if (cursor) {
108
+ try {
109
+ const decoded = JSON.parse(Buffer.from(String(cursor), "base64url").toString("utf8"));
110
+ const { id, time } = decoded;
111
+ if (direction === "next") {
112
+ sql += ` AND (updated_at < $${idx++} OR (updated_at = $${idx++} AND id < $${idx++}))`;
113
+ params.push(new Date(time), new Date(time), id);
114
+ idx += 2; // already incremented above
115
+ } else {
116
+ sql += ` AND (updated_at > $${idx++} OR (updated_at = $${idx++} AND id > $${idx++}))`;
117
+ params.push(new Date(time), new Date(time), id);
118
+ idx += 2;
119
+ }
120
+ } catch {}
121
+ }
100
122
 
101
- sql += ` ORDER BY updated_at DESC LIMIT 100`;
123
+ const orderDir = direction === "previous" ? "ASC" : "DESC";
124
+ sql += ` ORDER BY updated_at ${orderDir}, id ${orderDir} LIMIT $${idx++}`;
125
+ params.push(limit + 1); // fetch one extra to detect "more"
102
126
 
103
127
  const result = await pool.query(sql, params);
104
- res.json(result.rows.map(toOpenCodeSession));
128
+ const rows = result.rows;
129
+ const more = rows.length > limit;
130
+ const slice = more ? rows.slice(0, limit) : rows;
131
+ const items = direction === "previous" ? slice.reverse() : slice;
132
+
133
+ const nextCursor = more && slice.length > 0
134
+ ? Buffer.from(JSON.stringify({
135
+ id: slice[slice.length - 1].id,
136
+ time: new Date(slice[slice.length - 1].updated_at).getTime(),
137
+ })).toString("base64url")
138
+ : undefined;
139
+
140
+ res.json(items.map(toOpenCodeSession));
105
141
  } catch (e: any) {
106
142
  res.status(500).json({ error: { code: "LIST_FAILED", message: e.message } });
107
143
  }
@@ -128,6 +164,35 @@ compatRouter.delete("/v2/session/:id", async (req: Request, res: Response) => {
128
164
  }
129
165
  });
130
166
 
167
+ // POST /v2/session/:id/cancel — cancel an in-flight agent turn
168
+ compatRouter.post("/v2/session/:id/cancel", async (req: Request, res: Response) => {
169
+ const session_id = req.params.id;
170
+ try {
171
+ // Mark any running agents as cancelled
172
+ await pool.query(
173
+ `UPDATE agent_instances SET state = 'cancelled', updated_at = NOW()
174
+ WHERE session_id = $1 AND state IN ('running', 'waiting_for_tool', 'compacting')`,
175
+ [session_id]
176
+ );
177
+ // Move session back to active so the user can keep working
178
+ await pool.query(
179
+ `UPDATE sessions SET state = 'active', updated_at = NOW()
180
+ WHERE id = $1 AND state IN ('busy', 'compacting')`,
181
+ [session_id]
182
+ );
183
+ // Notify subscribers
184
+ await eventBus.publish("AgentFailed", {
185
+ agent_id: "",
186
+ session_id,
187
+ error: "cancelled by user",
188
+ failed_at: new Date().toISOString(),
189
+ }, "CompatAdapter");
190
+ res.json({ ok: true });
191
+ } catch (e: any) {
192
+ res.status(500).json({ error: { code: "CANCEL_FAILED", message: e.message } });
193
+ }
194
+ });
195
+
131
196
  // POST /v2/session/:id/prompt — run agent turn (streaming SSE)
132
197
  compatRouter.post("/v2/session/:id/prompt", requireAuth, async (req: Request, res: Response) => {
133
198
  const session_id = req.params.id;
@@ -211,24 +276,109 @@ compatRouter.post("/v2/session/:id/prompt", requireAuth, async (req: Request, re
211
276
  }
212
277
  });
213
278
 
214
- // GET /v2/session/:id/message — list messages
279
+ // GET /v2/session/:id/message — list messages (with cursor pagination)
215
280
  compatRouter.get("/v2/session/:id/message", async (req: Request, res: Response) => {
216
281
  try {
217
- const result = await pool.query(
218
- `SELECT m.*, json_agg(p.* ORDER BY p.order_index) FILTER (WHERE p.id IS NOT NULL) as parts
282
+ const { cursor, limit: limitStr, direction = "next" } = req.query;
283
+ const limit = Math.min(parseInt(String(limitStr || "200")), 500);
284
+
285
+ let sql = `SELECT m.*, json_agg(p.* ORDER BY p.order_index) FILTER (WHERE p.id IS NOT NULL) as parts
219
286
  FROM messages m
220
287
  LEFT JOIN parts p ON p.message_id = m.id
221
- WHERE m.session_id = $1
222
- GROUP BY m.id
223
- ORDER BY m.created_at ASC`,
224
- [req.params.id]
225
- );
226
- res.json(result.rows.map(toOpenCodeMessage));
288
+ WHERE m.session_id = $1`;
289
+ const params: unknown[] = [req.params.id];
290
+ let idx = 2;
291
+
292
+ if (cursor) {
293
+ try {
294
+ const decoded = JSON.parse(Buffer.from(String(cursor), "base64url").toString("utf8"));
295
+ const { id, time } = decoded;
296
+ if (direction === "next") {
297
+ sql += ` AND (m.created_at < $${idx++} OR (m.created_at = $${idx++} AND m.id < $${idx++}))`;
298
+ params.push(new Date(time), new Date(time), id);
299
+ idx += 2;
300
+ } else {
301
+ sql += ` AND (m.created_at > $${idx++} OR (m.created_at = $${idx++} AND m.id > $${idx++}))`;
302
+ params.push(new Date(time), new Date(time), id);
303
+ idx += 2;
304
+ }
305
+ } catch {}
306
+ }
307
+
308
+ const orderDir = direction === "previous" ? "ASC" : "DESC";
309
+ sql += ` GROUP BY m.id ORDER BY m.created_at ${orderDir}, m.id ${orderDir} LIMIT $${idx++}`;
310
+ params.push(limit + 1);
311
+
312
+ const result = await pool.query(sql, params);
313
+ const rows = result.rows;
314
+ const more = rows.length > limit;
315
+ const slice = more ? rows.slice(0, limit) : rows;
316
+ const items = direction === "previous" ? slice.reverse() : slice;
317
+
318
+ const nextCursor = more && slice.length > 0
319
+ ? Buffer.from(JSON.stringify({
320
+ id: slice[slice.length - 1].id,
321
+ time: new Date(slice[slice.length - 1].created_at).getTime(),
322
+ })).toString("base64url")
323
+ : undefined;
324
+
325
+ res.json(items.map(toOpenCodeMessage));
227
326
  } catch (e: any) {
228
327
  res.status(500).json({ error: { code: "DB_ERROR", message: e.message } });
229
328
  }
230
329
  });
231
330
 
331
+ // POST /v2/session/:id/subagent — spawn a child session and run it
332
+ compatRouter.post("/v2/session/:parentId/subagent", requireAuth, async (req: Request, res: Response) => {
333
+ try {
334
+ const { prompt, agent = "build", modelID, providerID } = req.body;
335
+ if (!prompt) return res.status(400).json({ error: { code: "MISSING_PROMPT", message: "prompt is required" } });
336
+
337
+ const parentId = req.params.parentId;
338
+ const parentResult = await pool.query(`SELECT * FROM sessions WHERE id = $1`, [parentId]);
339
+ if (!parentResult.rows[0]) return res.status(404).json({ error: { code: "NOT_FOUND", message: "Parent session not found" } });
340
+ const parent = parentResult.rows[0];
341
+
342
+ // Create child session
343
+ const childId = require("uuid").v4();
344
+ const slug = `subagent-${Date.now()}`;
345
+ await pool.query(
346
+ `INSERT INTO sessions (id, slug, project_id, parent_id, directory, title, version, state)
347
+ VALUES ($1, $2, $3, $4, $5, $6, $7, 'created')`,
348
+ [childId, slug, parent.project_id, parentId, parent.directory, `Subagent: ${prompt.slice(0, 60)}`, "1.0.0"]
349
+ );
350
+
351
+ // Add user message
352
+ const msgId = require("uuid").v4();
353
+ await pool.query(
354
+ `INSERT INTO messages (id, session_id, role) VALUES ($1, $2, 'user')`,
355
+ [msgId, childId]
356
+ );
357
+ const partId = require("uuid").v4();
358
+ await pool.query(
359
+ `INSERT INTO parts (id, message_id, session_id, part_type, data, order_index) VALUES ($1, $2, $3, 'text', $4, 0)`,
360
+ [partId, msgId, childId, JSON.stringify({ text: prompt })]
361
+ );
362
+
363
+ // Run agent asynchronously
364
+ const { runAgentLoop } = await import("../src/engine/session/prompt");
365
+ runAgentLoop({
366
+ session_id: childId,
367
+ message_id: msgId,
368
+ content: prompt,
369
+ model_id: modelID || process.env.DEFAULT_MODEL || "claude-sonnet-4-5",
370
+ provider_id: providerID || process.env.DEFAULT_PROVIDER || "anthropic",
371
+ agent_name: agent,
372
+ }).catch((e: any) => {
373
+ console.error(`[Subagent] Failed for session ${childId}:`, e.message);
374
+ });
375
+
376
+ res.status(202).json({ childSessionId: childId, status: "running" });
377
+ } catch (e: any) {
378
+ res.status(500).json({ error: { code: "SUBAGENT_FAILED", message: e.message } });
379
+ }
380
+ });
381
+
232
382
  // ─── Global SSE Event Stream ──────────────────────────────────────────────────
233
383
 
234
384
  // GET /v2/event — global SSE stream for all events
@@ -458,16 +608,35 @@ function subscribeToSessionEvents(
458
608
  ): () => void {
459
609
  const handler = async (event: any) => {
460
610
  if (event.payload?.session_id === session_id) {
461
- callback({ type: mapEventType(event.type), data: event.payload });
611
+ // Pass through key tool fields directly so SSE listeners can render them
612
+ const payload: any = { ...event.payload };
613
+ if (event.type === "ToolCallRequested") {
614
+ payload.tool_call_id = event.payload.tool_call_id;
615
+ payload.tool_name = event.payload.tool_name;
616
+ payload.tool_input = event.payload.tool_input;
617
+ }
618
+ if (event.type === "ToolCallCompleted") {
619
+ payload.tool_call_id = event.payload.tool_call_id;
620
+ payload.tool_name = event.payload.tool_name;
621
+ payload.duration_ms = event.payload.duration_ms;
622
+ }
623
+ callback({ type: mapEventType(event.type), data: payload });
462
624
  }
463
625
  };
464
626
 
465
- const types = ["PartUpdated", "MessageAdded", "AgentCompleted", "AgentFailed", "ToolCallRequested"];
627
+ const types = [
628
+ "PartUpdated",
629
+ "MessageAdded",
630
+ "AgentCompleted",
631
+ "AgentFailed",
632
+ "ToolCallRequested",
633
+ "ToolCallCompleted",
634
+ "SessionCompacted",
635
+ ];
466
636
  for (const type of types) {
467
637
  eventBus.subscribe(type, handler);
468
638
  }
469
639
 
470
- // Return a real cleanup function that removes all registered handlers
471
640
  return () => {
472
641
  for (const type of types) {
473
642
  eventBus.unsubscribe(type, handler);
@@ -482,6 +651,8 @@ function mapEventType(boneEventType: string): string {
482
651
  AgentCompleted: "session.updated",
483
652
  AgentFailed: "session.updated",
484
653
  ToolCallRequested: "tool.requested",
654
+ ToolCallCompleted: "tool.completed",
655
+ SessionCompacted: "session.compacted",
485
656
  };
486
657
  return map[boneEventType] || boneEventType.toLowerCase();
487
658
  }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=algorithms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"algorithms.js","sourceRoot":"","sources":["../../../../../bone/output/agent/src/algorithms.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import { Request, Response, NextFunction } from "express";
2
+ export declare function auditLog(action: string, entityType?: string): (req: Request, _res: Response, next: NextFunction) => Promise<void>;
3
+ export declare function getAuditLog(entityType: string, entityId: string): Promise<any[]>;
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ // Generated by BoneScript compiler.
3
+ // Audit middleware for: AgentDomain v1.0.0
4
+ //
5
+ // Modules requiring audit logging:
6
+ // - AgentInstanceService
7
+ // - TaskService
8
+ // - PlanService
9
+ // - BuildStepService
10
+ // - ToolCallService
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.getAuditLog = exports.auditLog = void 0;
13
+ const db_1 = require("./db");
14
+ function auditLog(action, entityType) {
15
+ return async (req, _res, next) => {
16
+ try {
17
+ const auth = req.auth;
18
+ const actorId = auth?.actor_id ?? null;
19
+ const entityId = req.params.id ?? req.body?.id ?? null;
20
+ const payload = req.body ?? null;
21
+ const ipAddress = req.ip ?? null;
22
+ const userAgent = req.headers["user-agent"] ?? null;
23
+ await (0, db_1.query)(`INSERT INTO audit_log
24
+ (actor_id, action, entity_type, entity_id, payload, ip_address, user_agent)
25
+ VALUES ($1, $2, $3, $4, $5, $6, $7)`, [actorId, action, entityType ?? null, entityId, JSON.stringify(payload), ipAddress, userAgent]);
26
+ }
27
+ catch (err) {
28
+ // Audit failures must not block the request — log and continue
29
+ console.error("[audit] Failed to write audit log:", err);
30
+ }
31
+ next();
32
+ };
33
+ }
34
+ exports.auditLog = auditLog;
35
+ async function getAuditLog(entityType, entityId) {
36
+ const result = await (0, db_1.query)("SELECT * FROM audit_log WHERE entity_type = $1 AND entity_id = $2 ORDER BY created_at DESC LIMIT 100", [entityType, entityId]);
37
+ return result;
38
+ }
39
+ exports.getAuditLog = getAuditLog;
40
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../../../../bone/output/agent/src/audit.ts"],"names":[],"mappings":";AAAA,oCAAoC;AACpC,2CAA2C;AAC3C,EAAE;AACF,mCAAmC;AACnC,2BAA2B;AAC3B,kBAAkB;AAClB,kBAAkB;AAClB,uBAAuB;AACvB,sBAAsB;;;AAGtB,6BAA6B;AAE7B,SAAgB,QAAQ,CAAC,MAAc,EAAE,UAAmB;IAC1D,OAAO,KAAK,EAAE,GAAY,EAAE,IAAc,EAAE,IAAkB,EAAiB,EAAE;QAC/E,IAAI,CAAC;YACH,MAAM,IAAI,GAAI,GAAW,CAAC,IAAgD,CAAC;YAC3E,MAAM,OAAO,GAAG,IAAI,EAAE,QAAQ,IAAI,IAAI,CAAC;YACvC,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,IAAK,GAAG,CAAC,IAAgC,EAAE,EAAE,IAAI,IAAI,CAAC;YACpF,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC;YACjC,MAAM,SAAS,GAAG,GAAG,CAAC,EAAE,IAAI,IAAI,CAAC;YACjC,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC;YAEpD,MAAM,IAAA,UAAK,EACT;;8CAEsC,EACtC,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,IAAI,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,CAC/F,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,+DAA+D;YAC/D,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,GAAG,CAAC,CAAC;QAC3D,CAAC;QACD,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;AACJ,CAAC;AAtBD,4BAsBC;AAEM,KAAK,UAAU,WAAW,CAAC,UAAkB,EAAE,QAAgB;IACpE,MAAM,MAAM,GAAG,MAAM,IAAA,UAAK,EACxB,sGAAsG,EACtG,CAAC,UAAU,EAAE,QAAQ,CAAC,CACvB,CAAC;IACF,OAAO,MAAM,CAAC;AAChB,CAAC;AAND,kCAMC"}
@@ -0,0 +1,8 @@
1
+ import { Request, Response, NextFunction } from "express";
2
+ export interface AuthContext {
3
+ authenticated: boolean;
4
+ actor_id: string | null;
5
+ trace_id: string;
6
+ }
7
+ export declare function authMiddleware(req: Request, res: Response, next: NextFunction): void;
8
+ export declare function requireAuth(req: Request, res: Response, next: NextFunction): void;
@@ -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/agent/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/agent_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/agent/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,0CAA0C,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;QACxH,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,25 @@
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
+ publish(type: string, payload: Record<string, unknown>, source: string, correlationId?: string, client?: PoolClient): Promise<void>;
23
+ startWorker(intervalMs?: number): NodeJS.Timeout | null;
24
+ };
25
+ export {};