bonecode 1.0.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 (605) hide show
  1. package/ARCHITECTURE.md +183 -0
  2. package/README.md +71 -0
  3. package/bin/bonecode +62 -0
  4. package/bone/migrations/rag_vectors.sql +258 -0
  5. package/bone/output/agent/.dockerignore +7 -0
  6. package/bone/output/agent/.env.example +36 -0
  7. package/bone/output/agent/.github/workflows/ci.yaml +58 -0
  8. package/bone/output/agent/AgentDomain.bone.map +350 -0
  9. package/bone/output/agent/AgentDomain.postman_collection.json +958 -0
  10. package/bone/output/agent/Dockerfile +22 -0
  11. package/bone/output/agent/README.md +47 -0
  12. package/bone/output/agent/admin/index.html +740 -0
  13. package/bone/output/agent/docker-compose.yaml +22 -0
  14. package/bone/output/agent/k8s/deployment.yaml +75 -0
  15. package/bone/output/agent/migrations/agent.sql +36 -0
  16. package/bone/output/agent/migrations/agent_instance.sql +36 -0
  17. package/bone/output/agent/migrations/audit_log.sql +18 -0
  18. package/bone/output/agent/migrations/build_step.sql +34 -0
  19. package/bone/output/agent/migrations/event_outbox.sql +31 -0
  20. package/bone/output/agent/migrations/plan.sql +30 -0
  21. package/bone/output/agent/migrations/task.sql +30 -0
  22. package/bone/output/agent/migrations/tool_call.sql +33 -0
  23. package/bone/output/agent/openapi.yaml +1116 -0
  24. package/bone/output/agent/package.json +36 -0
  25. package/bone/output/agent/schema.graphql +233 -0
  26. package/bone/output/agent/sdk/client.ts +231 -0
  27. package/bone/output/agent/src/algorithms.ts +2 -0
  28. package/bone/output/agent/src/audit.ts +44 -0
  29. package/bone/output/agent/src/auth.ts +57 -0
  30. package/bone/output/agent/src/cron.ts +12 -0
  31. package/bone/output/agent/src/db.ts +32 -0
  32. package/bone/output/agent/src/debug.ts +66 -0
  33. package/bone/output/agent/src/events.ts +243 -0
  34. package/bone/output/agent/src/extensions.ts +54 -0
  35. package/bone/output/agent/src/failure_rules.ts +323 -0
  36. package/bone/output/agent/src/flows.ts +168 -0
  37. package/bone/output/agent/src/health.ts +43 -0
  38. package/bone/output/agent/src/index.ts +100 -0
  39. package/bone/output/agent/src/logger.ts +66 -0
  40. package/bone/output/agent/src/metrics.ts +75 -0
  41. package/bone/output/agent/src/migrate.ts +352 -0
  42. package/bone/output/agent/src/migration_diff.ts +108 -0
  43. package/bone/output/agent/src/notify.ts +125 -0
  44. package/bone/output/agent/src/routes/agent_instance.ts +234 -0
  45. package/bone/output/agent/src/routes/build_step.ts +105 -0
  46. package/bone/output/agent/src/routes/plan.ts +91 -0
  47. package/bone/output/agent/src/routes/task.ts +105 -0
  48. package/bone/output/agent/src/routes/tool_call.ts +166 -0
  49. package/bone/output/agent/src/schemas.ts +384 -0
  50. package/bone/output/agent/src/state_machines/agent_instance.ts +24 -0
  51. package/bone/output/agent/src/state_machines/build_step.ts +22 -0
  52. package/bone/output/agent/src/state_machines/plan.ts +22 -0
  53. package/bone/output/agent/src/state_machines/task.ts +22 -0
  54. package/bone/output/agent/src/state_machines/tool_call.ts +22 -0
  55. package/bone/output/agent/src/tests.ts +362 -0
  56. package/bone/output/agent/src/websocket.ts +201 -0
  57. package/bone/output/agent/tsconfig.json +25 -0
  58. package/bone/output/rag/.dockerignore +7 -0
  59. package/bone/output/rag/.env.example +36 -0
  60. package/bone/output/rag/.github/workflows/ci.yaml +58 -0
  61. package/bone/output/rag/Dockerfile +22 -0
  62. package/bone/output/rag/RAGDomain.bone.map +287 -0
  63. package/bone/output/rag/RAGDomain.postman_collection.json +923 -0
  64. package/bone/output/rag/README.md +47 -0
  65. package/bone/output/rag/admin/index.html +818 -0
  66. package/bone/output/rag/docker-compose.yaml +22 -0
  67. package/bone/output/rag/k8s/deployment.yaml +75 -0
  68. package/bone/output/rag/migrations/audit_log.sql +18 -0
  69. package/bone/output/rag/migrations/code_chunk.sql +34 -0
  70. package/bone/output/rag/migrations/code_file.sql +33 -0
  71. package/bone/output/rag/migrations/event_outbox.sql +31 -0
  72. package/bone/output/rag/migrations/indexing_job.sql +33 -0
  73. package/bone/output/rag/migrations/knowledge_base.sql +35 -0
  74. package/bone/output/rag/migrations/memory_entry.sql +34 -0
  75. package/bone/output/rag/openapi.yaml +1097 -0
  76. package/bone/output/rag/package.json +36 -0
  77. package/bone/output/rag/schema.graphql +245 -0
  78. package/bone/output/rag/sdk/client.ts +234 -0
  79. package/bone/output/rag/src/algorithms.ts +2 -0
  80. package/bone/output/rag/src/audit.ts +37 -0
  81. package/bone/output/rag/src/auth.ts +57 -0
  82. package/bone/output/rag/src/cron.ts +12 -0
  83. package/bone/output/rag/src/db.ts +32 -0
  84. package/bone/output/rag/src/debug.ts +66 -0
  85. package/bone/output/rag/src/events.ts +243 -0
  86. package/bone/output/rag/src/extensions.ts +350 -0
  87. package/bone/output/rag/src/failure_rules.ts +315 -0
  88. package/bone/output/rag/src/flows.ts +239 -0
  89. package/bone/output/rag/src/health.ts +43 -0
  90. package/bone/output/rag/src/index.ts +95 -0
  91. package/bone/output/rag/src/logger.ts +66 -0
  92. package/bone/output/rag/src/metrics.ts +75 -0
  93. package/bone/output/rag/src/migrate.ts +364 -0
  94. package/bone/output/rag/src/migration_diff.ts +108 -0
  95. package/bone/output/rag/src/notify.ts +99 -0
  96. package/bone/output/rag/src/routes/code_chunk.ts +75 -0
  97. package/bone/output/rag/src/routes/code_file.ts +101 -0
  98. package/bone/output/rag/src/routes/indexing_job.ts +87 -0
  99. package/bone/output/rag/src/routes/knowledge_base.ts +230 -0
  100. package/bone/output/rag/src/routes/memory_entry.ts +87 -0
  101. package/bone/output/rag/src/schemas.ts +394 -0
  102. package/bone/output/rag/src/state_machines/code_file.ts +23 -0
  103. package/bone/output/rag/src/state_machines/indexing_job.ts +22 -0
  104. package/bone/output/rag/src/state_machines/knowledge_base.ts +23 -0
  105. package/bone/output/rag/src/state_machines/memory_entry.ts +20 -0
  106. package/bone/output/rag/src/tests.ts +340 -0
  107. package/bone/output/rag/tsconfig.json +25 -0
  108. package/bone/output/session/.dockerignore +7 -0
  109. package/bone/output/session/.env.example +36 -0
  110. package/bone/output/session/.github/workflows/ci.yaml +58 -0
  111. package/bone/output/session/Dockerfile +22 -0
  112. package/bone/output/session/README.md +47 -0
  113. package/bone/output/session/SessionDomain.bone.map +350 -0
  114. package/bone/output/session/SessionDomain.postman_collection.json +958 -0
  115. package/bone/output/session/admin/index.html +667 -0
  116. package/bone/output/session/docker-compose.yaml +22 -0
  117. package/bone/output/session/k8s/deployment.yaml +75 -0
  118. package/bone/output/session/migrations/audit_log.sql +18 -0
  119. package/bone/output/session/migrations/event_outbox.sql +31 -0
  120. package/bone/output/session/migrations/message.sql +31 -0
  121. package/bone/output/session/migrations/part.sql +28 -0
  122. package/bone/output/session/migrations/permission.sql +28 -0
  123. package/bone/output/session/migrations/project.sql +28 -0
  124. package/bone/output/session/migrations/session.sql +38 -0
  125. package/bone/output/session/openapi.yaml +1101 -0
  126. package/bone/output/session/package.json +36 -0
  127. package/bone/output/session/schema.graphql +222 -0
  128. package/bone/output/session/sdk/client.ts +225 -0
  129. package/bone/output/session/src/algorithms.ts +2 -0
  130. package/bone/output/session/src/audit.ts +44 -0
  131. package/bone/output/session/src/auth.ts +57 -0
  132. package/bone/output/session/src/cron.ts +12 -0
  133. package/bone/output/session/src/db.ts +32 -0
  134. package/bone/output/session/src/debug.ts +66 -0
  135. package/bone/output/session/src/events.ts +270 -0
  136. package/bone/output/session/src/extensions.ts +215 -0
  137. package/bone/output/session/src/failure_rules.ts +284 -0
  138. package/bone/output/session/src/flows.ts +168 -0
  139. package/bone/output/session/src/health.ts +43 -0
  140. package/bone/output/session/src/index.ts +100 -0
  141. package/bone/output/session/src/logger.ts +66 -0
  142. package/bone/output/session/src/metrics.ts +75 -0
  143. package/bone/output/session/src/migrate.ts +332 -0
  144. package/bone/output/session/src/migration_diff.ts +108 -0
  145. package/bone/output/session/src/notify.ts +112 -0
  146. package/bone/output/session/src/routes/message.ts +93 -0
  147. package/bone/output/session/src/routes/part.ts +79 -0
  148. package/bone/output/session/src/routes/permission.ts +79 -0
  149. package/bone/output/session/src/routes/project.ts +79 -0
  150. package/bone/output/session/src/routes/session.ts +294 -0
  151. package/bone/output/session/src/schemas.ts +357 -0
  152. package/bone/output/session/src/state_machines/session.ts +23 -0
  153. package/bone/output/session/src/tests.ts +326 -0
  154. package/bone/output/session/src/websocket.ts +201 -0
  155. package/bone/output/session/tsconfig.json +25 -0
  156. package/bone/output/workspace/.dockerignore +7 -0
  157. package/bone/output/workspace/.env.example +36 -0
  158. package/bone/output/workspace/.github/workflows/ci.yaml +58 -0
  159. package/bone/output/workspace/Dockerfile +22 -0
  160. package/bone/output/workspace/README.md +45 -0
  161. package/bone/output/workspace/WorkspaceDomain.bone.map +189 -0
  162. package/bone/output/workspace/WorkspaceDomain.postman_collection.json +621 -0
  163. package/bone/output/workspace/admin/index.html +485 -0
  164. package/bone/output/workspace/docker-compose.yaml +22 -0
  165. package/bone/output/workspace/k8s/deployment.yaml +75 -0
  166. package/bone/output/workspace/migrations/audit_log.sql +18 -0
  167. package/bone/output/workspace/migrations/codebase.sql +34 -0
  168. package/bone/output/workspace/migrations/event_outbox.sql +31 -0
  169. package/bone/output/workspace/migrations/snapshot.sql +32 -0
  170. package/bone/output/workspace/migrations/workspace.sql +33 -0
  171. package/bone/output/workspace/openapi.yaml +721 -0
  172. package/bone/output/workspace/package.json +36 -0
  173. package/bone/output/workspace/schema.graphql +153 -0
  174. package/bone/output/workspace/sdk/client.ts +155 -0
  175. package/bone/output/workspace/src/algorithms.ts +2 -0
  176. package/bone/output/workspace/src/audit.ts +37 -0
  177. package/bone/output/workspace/src/auth.ts +57 -0
  178. package/bone/output/workspace/src/cron.ts +12 -0
  179. package/bone/output/workspace/src/db.ts +32 -0
  180. package/bone/output/workspace/src/debug.ts +66 -0
  181. package/bone/output/workspace/src/events.ts +243 -0
  182. package/bone/output/workspace/src/extensions.ts +44 -0
  183. package/bone/output/workspace/src/failure_rules.ts +153 -0
  184. package/bone/output/workspace/src/health.ts +43 -0
  185. package/bone/output/workspace/src/index.ts +89 -0
  186. package/bone/output/workspace/src/logger.ts +66 -0
  187. package/bone/output/workspace/src/metrics.ts +75 -0
  188. package/bone/output/workspace/src/migrate.ts +220 -0
  189. package/bone/output/workspace/src/migration_diff.ts +108 -0
  190. package/bone/output/workspace/src/notify.ts +73 -0
  191. package/bone/output/workspace/src/routes/codebase.ts +87 -0
  192. package/bone/output/workspace/src/routes/snapshot.ts +127 -0
  193. package/bone/output/workspace/src/routes/workspace.ts +190 -0
  194. package/bone/output/workspace/src/schemas.ts +231 -0
  195. package/bone/output/workspace/src/state_machines/codebase.ts +21 -0
  196. package/bone/output/workspace/src/state_machines/snapshot.ts +20 -0
  197. package/bone/output/workspace/src/state_machines/workspace.ts +21 -0
  198. package/bone/output/workspace/src/tests.ts +249 -0
  199. package/bone/output/workspace/tsconfig.json +25 -0
  200. package/compat/opencode_adapter.ts +410 -0
  201. package/package.json +69 -0
  202. package/scripts/check_benchmark_session.js +34 -0
  203. package/scripts/check_finish_event.js +24 -0
  204. package/scripts/check_parts.js +15 -0
  205. package/scripts/compile.js +79 -0
  206. package/scripts/copy_opencode.ps1 +53 -0
  207. package/scripts/create_functions.sql +129 -0
  208. package/scripts/migrate.js +85 -0
  209. package/scripts/migrate_from_opencode.ts +218 -0
  210. package/scripts/test_agent_loop.js +101 -0
  211. package/scripts/test_api.ps1 +116 -0
  212. package/scripts/test_context_builder.js +136 -0
  213. package/scripts/test_context_builder.ts +97 -0
  214. package/scripts/test_rag.js +189 -0
  215. package/scripts/test_stream_events.js +36 -0
  216. package/scripts/test_websocket_and_saga.js +216 -0
  217. package/src/cli.ts +475 -0
  218. package/src/config.ts +162 -0
  219. package/src/context_builder.ts +598 -0
  220. package/src/engine/account/account.sql.ts +39 -0
  221. package/src/engine/account/account.ts +456 -0
  222. package/src/engine/account/repo.ts +166 -0
  223. package/src/engine/account/schema.ts +99 -0
  224. package/src/engine/account/url.ts +8 -0
  225. package/src/engine/acp/README.md +174 -0
  226. package/src/engine/acp/agent.ts +1968 -0
  227. package/src/engine/acp/runtime.ts +22 -0
  228. package/src/engine/acp/session.ts +122 -0
  229. package/src/engine/acp/types.ts +24 -0
  230. package/src/engine/agent/agent.ts +463 -0
  231. package/src/engine/agent/generate.txt +75 -0
  232. package/src/engine/agent/prompt/compaction.txt +9 -0
  233. package/src/engine/agent/prompt/explore.txt +18 -0
  234. package/src/engine/agent/prompt/scout.txt +36 -0
  235. package/src/engine/agent/prompt/summary.txt +11 -0
  236. package/src/engine/agent/prompt/title.txt +44 -0
  237. package/src/engine/agent/subagent-permissions.ts +34 -0
  238. package/src/engine/auth/index.ts +96 -0
  239. package/src/engine/background/background/job.ts +200 -0
  240. package/src/engine/background/job.ts +200 -0
  241. package/src/engine/bus/bus-event.ts +45 -0
  242. package/src/engine/bus/global.ts +22 -0
  243. package/src/engine/bus/index.ts +203 -0
  244. package/src/engine/command/command/index.ts +181 -0
  245. package/src/engine/command/command/template/initialize.txt +66 -0
  246. package/src/engine/command/command/template/review.txt +101 -0
  247. package/src/engine/command/index.ts +181 -0
  248. package/src/engine/command/template/initialize.txt +66 -0
  249. package/src/engine/command/template/review.txt +101 -0
  250. package/src/engine/config/agent.ts +172 -0
  251. package/src/engine/config/attachment.ts +25 -0
  252. package/src/engine/config/command.ts +62 -0
  253. package/src/engine/config/config.ts +833 -0
  254. package/src/engine/config/console-state.ts +14 -0
  255. package/src/engine/config/entry-name.ts +16 -0
  256. package/src/engine/config/error.ts +23 -0
  257. package/src/engine/config/formatter.ts +13 -0
  258. package/src/engine/config/layout.ts +6 -0
  259. package/src/engine/config/lsp.ts +43 -0
  260. package/src/engine/config/managed.ts +71 -0
  261. package/src/engine/config/markdown.ts +96 -0
  262. package/src/engine/config/mcp.ts +56 -0
  263. package/src/engine/config/model-id.ts +5 -0
  264. package/src/engine/config/parse.ts +79 -0
  265. package/src/engine/config/paths.ts +45 -0
  266. package/src/engine/config/permission.ts +58 -0
  267. package/src/engine/config/plugin.ts +84 -0
  268. package/src/engine/config/provider.ts +111 -0
  269. package/src/engine/config/reference.ts +23 -0
  270. package/src/engine/config/server.ts +19 -0
  271. package/src/engine/config/skills.ts +14 -0
  272. package/src/engine/config/variable.ts +90 -0
  273. package/src/engine/control-plane/adapters/index.ts +41 -0
  274. package/src/engine/control-plane/adapters/worktree.ts +96 -0
  275. package/src/engine/control-plane/dev/README.md +19 -0
  276. package/src/engine/control-plane/dev/debug-workspace-plugin.ts +73 -0
  277. package/src/engine/control-plane/schema.ts +14 -0
  278. package/src/engine/control-plane/types.ts +59 -0
  279. package/src/engine/control-plane/util.ts +39 -0
  280. package/src/engine/control-plane/workspace-adapter-runtime.ts +51 -0
  281. package/src/engine/control-plane/workspace-context.ts +26 -0
  282. package/src/engine/control-plane/workspace.sql.ts +20 -0
  283. package/src/engine/control-plane/workspace.ts +1072 -0
  284. package/src/engine/data-migration.ts +161 -0
  285. package/src/engine/effect/app-runtime.ts +143 -0
  286. package/src/engine/effect/bootstrap-runtime.ts +29 -0
  287. package/src/engine/effect/bridge.ts +84 -0
  288. package/src/engine/effect/config-service.ts +67 -0
  289. package/src/engine/effect/instance-ref.ts +11 -0
  290. package/src/engine/effect/instance-registry.ts +12 -0
  291. package/src/engine/effect/instance-state.ts +72 -0
  292. package/src/engine/effect/promise.ts +17 -0
  293. package/src/engine/effect/run-service.ts +47 -0
  294. package/src/engine/effect/runner.ts +217 -0
  295. package/src/engine/effect/runtime-flags.ts +74 -0
  296. package/src/engine/effect/service-use.ts +38 -0
  297. package/src/engine/env/index.ts +37 -0
  298. package/src/engine/event-v2-bridge.ts +89 -0
  299. package/src/engine/file/file/ignore.ts +81 -0
  300. package/src/engine/file/file/index.ts +651 -0
  301. package/src/engine/file/file/protected.ts +59 -0
  302. package/src/engine/file/file/ripgrep.ts +481 -0
  303. package/src/engine/file/file/watcher.ts +167 -0
  304. package/src/engine/file/ignore.ts +81 -0
  305. package/src/engine/file/index.ts +651 -0
  306. package/src/engine/file/protected.ts +59 -0
  307. package/src/engine/file/ripgrep.ts +481 -0
  308. package/src/engine/file/watcher.ts +167 -0
  309. package/src/engine/format/format/formatter.ts +404 -0
  310. package/src/engine/format/format/index.ts +209 -0
  311. package/src/engine/format/formatter.ts +404 -0
  312. package/src/engine/format/index.ts +209 -0
  313. package/src/engine/git/git/index.ts +347 -0
  314. package/src/engine/git/index.ts +347 -0
  315. package/src/engine/id/id.ts +80 -0
  316. package/src/engine/ide/index.ts +70 -0
  317. package/src/engine/image/image/image.ts +176 -0
  318. package/src/engine/image/image.ts +176 -0
  319. package/src/engine/index.ts +251 -0
  320. package/src/engine/installation/index.ts +327 -0
  321. package/src/engine/lsp/client.ts +707 -0
  322. package/src/engine/lsp/diagnostic.ts +29 -0
  323. package/src/engine/lsp/language.ts +121 -0
  324. package/src/engine/lsp/launch.ts +21 -0
  325. package/src/engine/lsp/lsp/client.ts +707 -0
  326. package/src/engine/lsp/lsp/diagnostic.ts +29 -0
  327. package/src/engine/lsp/lsp/language.ts +121 -0
  328. package/src/engine/lsp/lsp/launch.ts +21 -0
  329. package/src/engine/lsp/lsp/lsp.ts +507 -0
  330. package/src/engine/lsp/lsp/server.ts +2064 -0
  331. package/src/engine/lsp/lsp.ts +507 -0
  332. package/src/engine/lsp/server.ts +2064 -0
  333. package/src/engine/mcp/auth.ts +146 -0
  334. package/src/engine/mcp/index.ts +958 -0
  335. package/src/engine/mcp/mcp/auth.ts +146 -0
  336. package/src/engine/mcp/mcp/index.ts +958 -0
  337. package/src/engine/mcp/mcp/oauth-callback.ts +232 -0
  338. package/src/engine/mcp/mcp/oauth-provider.ts +214 -0
  339. package/src/engine/mcp/oauth-callback.ts +232 -0
  340. package/src/engine/mcp/oauth-provider.ts +214 -0
  341. package/src/engine/node.ts +6 -0
  342. package/src/engine/patch/index.ts +689 -0
  343. package/src/engine/patch/patch/index.ts +689 -0
  344. package/src/engine/permission/arity.ts +163 -0
  345. package/src/engine/permission/evaluate.ts +15 -0
  346. package/src/engine/permission/index.ts +306 -0
  347. package/src/engine/permission/permission/arity.ts +163 -0
  348. package/src/engine/permission/permission/evaluate.ts +15 -0
  349. package/src/engine/permission/permission/index.ts +306 -0
  350. package/src/engine/permission/permission/schema.ts +13 -0
  351. package/src/engine/permission/schema.ts +13 -0
  352. package/src/engine/plugin/azure.ts +26 -0
  353. package/src/engine/plugin/cloudflare.ts +76 -0
  354. package/src/engine/plugin/codex.ts +622 -0
  355. package/src/engine/plugin/digitalocean.ts +411 -0
  356. package/src/engine/plugin/github-copilot/copilot.ts +394 -0
  357. package/src/engine/plugin/github-copilot/models.ts +196 -0
  358. package/src/engine/plugin/index.ts +295 -0
  359. package/src/engine/plugin/install.ts +439 -0
  360. package/src/engine/plugin/loader.ts +216 -0
  361. package/src/engine/plugin/meta.ts +188 -0
  362. package/src/engine/plugin/shared.ts +323 -0
  363. package/src/engine/project/bootstrap-service.ts +9 -0
  364. package/src/engine/project/bootstrap.ts +75 -0
  365. package/src/engine/project/instance-context.ts +24 -0
  366. package/src/engine/project/instance-layer.ts +11 -0
  367. package/src/engine/project/instance-runtime.ts +16 -0
  368. package/src/engine/project/instance-store.ts +193 -0
  369. package/src/engine/project/project.sql.ts +17 -0
  370. package/src/engine/project/project.ts +537 -0
  371. package/src/engine/project/schema.ts +13 -0
  372. package/src/engine/project/vcs.ts +405 -0
  373. package/src/engine/provider/auth.ts +225 -0
  374. package/src/engine/provider/error.ts +204 -0
  375. package/src/engine/provider/model-status.ts +8 -0
  376. package/src/engine/provider/provider.ts +1843 -0
  377. package/src/engine/provider/schema.ts +30 -0
  378. package/src/engine/provider/sdk/copilot/AGENTS.md +1 -0
  379. package/src/engine/provider/transform.ts +1376 -0
  380. package/src/engine/pty/index.ts +365 -0
  381. package/src/engine/pty/input.ts +24 -0
  382. package/src/engine/pty/pty/index.ts +365 -0
  383. package/src/engine/pty/pty/input.ts +24 -0
  384. package/src/engine/pty/pty/pty.bun.ts +26 -0
  385. package/src/engine/pty/pty/pty.node.ts +27 -0
  386. package/src/engine/pty/pty/pty.ts +25 -0
  387. package/src/engine/pty/pty/schema.ts +14 -0
  388. package/src/engine/pty/pty/ticket.ts +68 -0
  389. package/src/engine/pty/pty.bun.ts +26 -0
  390. package/src/engine/pty/pty.node.ts +27 -0
  391. package/src/engine/pty/pty.ts +25 -0
  392. package/src/engine/pty/schema.ts +14 -0
  393. package/src/engine/pty/ticket.ts +68 -0
  394. package/src/engine/question/index.ts +213 -0
  395. package/src/engine/question/question/index.ts +213 -0
  396. package/src/engine/question/question/schema.ts +10 -0
  397. package/src/engine/question/schema.ts +10 -0
  398. package/src/engine/reference/reference/reference.ts +241 -0
  399. package/src/engine/reference/reference/repository-cache.ts +147 -0
  400. package/src/engine/reference/reference.ts +241 -0
  401. package/src/engine/reference/repository-cache.ts +147 -0
  402. package/src/engine/session/compaction.ts +651 -0
  403. package/src/engine/session/compaction_logic.ts +120 -0
  404. package/src/engine/session/instruction.ts +238 -0
  405. package/src/engine/session/instruction_loader.ts +54 -0
  406. package/src/engine/session/llm.ts +459 -0
  407. package/src/engine/session/message-error.ts +14 -0
  408. package/src/engine/session/message-v2.ts +1202 -0
  409. package/src/engine/session/message.ts +146 -0
  410. package/src/engine/session/overflow.ts +32 -0
  411. package/src/engine/session/overflow_check.ts +46 -0
  412. package/src/engine/session/processor.ts +823 -0
  413. package/src/engine/session/prompt/anthropic.txt +105 -0
  414. package/src/engine/session/prompt/beast.txt +147 -0
  415. package/src/engine/session/prompt/build-switch.txt +5 -0
  416. package/src/engine/session/prompt/codex.txt +79 -0
  417. package/src/engine/session/prompt/copilot-gpt-5.txt +143 -0
  418. package/src/engine/session/prompt/default.txt +105 -0
  419. package/src/engine/session/prompt/gemini.txt +155 -0
  420. package/src/engine/session/prompt/gpt.txt +107 -0
  421. package/src/engine/session/prompt/kimi.txt +95 -0
  422. package/src/engine/session/prompt/max-steps.txt +16 -0
  423. package/src/engine/session/prompt/plan-reminder-anthropic.txt +67 -0
  424. package/src/engine/session/prompt/plan.txt +26 -0
  425. package/src/engine/session/prompt/trinity.txt +97 -0
  426. package/src/engine/session/prompt.ts +671 -0
  427. package/src/engine/session/provider_transform.ts +187 -0
  428. package/src/engine/session/retry.ts +200 -0
  429. package/src/engine/session/retry_logic.ts +65 -0
  430. package/src/engine/session/revert.ts +162 -0
  431. package/src/engine/session/run-state.ts +153 -0
  432. package/src/engine/session/schema.ts +26 -0
  433. package/src/engine/session/session.sql.ts +137 -0
  434. package/src/engine/session/session.ts +1011 -0
  435. package/src/engine/session/status.ts +94 -0
  436. package/src/engine/session/summary.ts +164 -0
  437. package/src/engine/session/system.ts +84 -0
  438. package/src/engine/session/system_prompt.ts +65 -0
  439. package/src/engine/session/todo.ts +81 -0
  440. package/src/engine/session/tool_registry.ts +162 -0
  441. package/src/engine/share/session.ts +61 -0
  442. package/src/engine/share/share-next.ts +376 -0
  443. package/src/engine/share/share.sql.ts +13 -0
  444. package/src/engine/shell/shell/shell.ts +215 -0
  445. package/src/engine/shell/shell.ts +215 -0
  446. package/src/engine/skill/discovery.ts +116 -0
  447. package/src/engine/skill/index.ts +336 -0
  448. package/src/engine/skill/prompt/customize-opencode.md +377 -0
  449. package/src/engine/skill/skill/discovery.ts +116 -0
  450. package/src/engine/skill/skill/index.ts +336 -0
  451. package/src/engine/skill/skill/prompt/customize-opencode.md +377 -0
  452. package/src/engine/snapshot/index.ts +762 -0
  453. package/src/engine/snapshot/snapshot/index.ts +762 -0
  454. package/src/engine/sync/README.md +179 -0
  455. package/src/engine/sync/event.sql.ts +17 -0
  456. package/src/engine/sync/index.ts +410 -0
  457. package/src/engine/sync/schema.ts +11 -0
  458. package/src/engine/temporary.ts +33 -0
  459. package/src/engine/tool/apply_patch.ts +313 -0
  460. package/src/engine/tool/apply_patch.txt +33 -0
  461. package/src/engine/tool/edit.ts +711 -0
  462. package/src/engine/tool/edit.txt +10 -0
  463. package/src/engine/tool/external-directory.ts +49 -0
  464. package/src/engine/tool/glob.ts +103 -0
  465. package/src/engine/tool/glob.txt +6 -0
  466. package/src/engine/tool/grep.ts +156 -0
  467. package/src/engine/tool/grep.txt +8 -0
  468. package/src/engine/tool/invalid.ts +21 -0
  469. package/src/engine/tool/json-schema.ts +164 -0
  470. package/src/engine/tool/lsp.ts +113 -0
  471. package/src/engine/tool/lsp.txt +24 -0
  472. package/src/engine/tool/mcp-websearch.ts +96 -0
  473. package/src/engine/tool/plan-enter.txt +14 -0
  474. package/src/engine/tool/plan-exit.txt +13 -0
  475. package/src/engine/tool/plan.ts +78 -0
  476. package/src/engine/tool/question.ts +44 -0
  477. package/src/engine/tool/question.txt +10 -0
  478. package/src/engine/tool/read.ts +337 -0
  479. package/src/engine/tool/read.txt +14 -0
  480. package/src/engine/tool/registry.ts +472 -0
  481. package/src/engine/tool/repo_clone.ts +80 -0
  482. package/src/engine/tool/repo_clone.txt +5 -0
  483. package/src/engine/tool/repo_overview.ts +279 -0
  484. package/src/engine/tool/repo_overview.txt +4 -0
  485. package/src/engine/tool/schema.ts +14 -0
  486. package/src/engine/tool/shell/id.ts +19 -0
  487. package/src/engine/tool/shell/prompt.ts +295 -0
  488. package/src/engine/tool/shell/shell.txt +77 -0
  489. package/src/engine/tool/shell.ts +647 -0
  490. package/src/engine/tool/skill.ts +75 -0
  491. package/src/engine/tool/skill.txt +5 -0
  492. package/src/engine/tool/task.ts +337 -0
  493. package/src/engine/tool/task.txt +58 -0
  494. package/src/engine/tool/task_status.ts +179 -0
  495. package/src/engine/tool/task_status.txt +13 -0
  496. package/src/engine/tool/todo.ts +57 -0
  497. package/src/engine/tool/todowrite.txt +167 -0
  498. package/src/engine/tool/tool/apply_patch.ts +313 -0
  499. package/src/engine/tool/tool/apply_patch.txt +33 -0
  500. package/src/engine/tool/tool/edit.ts +711 -0
  501. package/src/engine/tool/tool/edit.txt +10 -0
  502. package/src/engine/tool/tool/external-directory.ts +49 -0
  503. package/src/engine/tool/tool/glob.ts +103 -0
  504. package/src/engine/tool/tool/glob.txt +6 -0
  505. package/src/engine/tool/tool/grep.ts +156 -0
  506. package/src/engine/tool/tool/grep.txt +8 -0
  507. package/src/engine/tool/tool/invalid.ts +21 -0
  508. package/src/engine/tool/tool/json-schema.ts +164 -0
  509. package/src/engine/tool/tool/lsp.ts +113 -0
  510. package/src/engine/tool/tool/lsp.txt +24 -0
  511. package/src/engine/tool/tool/mcp-websearch.ts +96 -0
  512. package/src/engine/tool/tool/plan-enter.txt +14 -0
  513. package/src/engine/tool/tool/plan-exit.txt +13 -0
  514. package/src/engine/tool/tool/plan.ts +78 -0
  515. package/src/engine/tool/tool/question.ts +44 -0
  516. package/src/engine/tool/tool/question.txt +10 -0
  517. package/src/engine/tool/tool/read.ts +337 -0
  518. package/src/engine/tool/tool/read.txt +14 -0
  519. package/src/engine/tool/tool/registry.ts +472 -0
  520. package/src/engine/tool/tool/repo_clone.ts +80 -0
  521. package/src/engine/tool/tool/repo_clone.txt +5 -0
  522. package/src/engine/tool/tool/repo_overview.ts +279 -0
  523. package/src/engine/tool/tool/repo_overview.txt +4 -0
  524. package/src/engine/tool/tool/schema.ts +14 -0
  525. package/src/engine/tool/tool/shell/id.ts +19 -0
  526. package/src/engine/tool/tool/shell/prompt.ts +295 -0
  527. package/src/engine/tool/tool/shell/shell.txt +77 -0
  528. package/src/engine/tool/tool/shell.ts +647 -0
  529. package/src/engine/tool/tool/skill.ts +75 -0
  530. package/src/engine/tool/tool/skill.txt +5 -0
  531. package/src/engine/tool/tool/task.ts +337 -0
  532. package/src/engine/tool/tool/task.txt +58 -0
  533. package/src/engine/tool/tool/task_status.ts +179 -0
  534. package/src/engine/tool/tool/task_status.txt +13 -0
  535. package/src/engine/tool/tool/todo.ts +57 -0
  536. package/src/engine/tool/tool/todowrite.txt +167 -0
  537. package/src/engine/tool/tool/tool.ts +164 -0
  538. package/src/engine/tool/tool/truncate.ts +160 -0
  539. package/src/engine/tool/tool/truncation-dir.ts +4 -0
  540. package/src/engine/tool/tool/webfetch.ts +192 -0
  541. package/src/engine/tool/tool/webfetch.txt +13 -0
  542. package/src/engine/tool/tool/websearch.ts +143 -0
  543. package/src/engine/tool/tool/websearch.txt +14 -0
  544. package/src/engine/tool/tool/write.ts +104 -0
  545. package/src/engine/tool/tool/write.txt +8 -0
  546. package/src/engine/tool/tool.ts +164 -0
  547. package/src/engine/tool/truncate.ts +160 -0
  548. package/src/engine/tool/truncation-dir.ts +4 -0
  549. package/src/engine/tool/webfetch.ts +192 -0
  550. package/src/engine/tool/webfetch.txt +13 -0
  551. package/src/engine/tool/websearch.ts +143 -0
  552. package/src/engine/tool/websearch.txt +14 -0
  553. package/src/engine/tool/write.ts +104 -0
  554. package/src/engine/tool/write.txt +8 -0
  555. package/src/engine/util/archive.ts +17 -0
  556. package/src/engine/util/bom.ts +31 -0
  557. package/src/engine/util/data-url.ts +9 -0
  558. package/src/engine/util/defer.ts +10 -0
  559. package/src/engine/util/effect-http-client.ts +11 -0
  560. package/src/engine/util/error.ts +88 -0
  561. package/src/engine/util/filesystem.ts +252 -0
  562. package/src/engine/util/format.ts +20 -0
  563. package/src/engine/util/iife.ts +3 -0
  564. package/src/engine/util/lazy.ts +20 -0
  565. package/src/engine/util/local-context.ts +25 -0
  566. package/src/engine/util/locale.ts +86 -0
  567. package/src/engine/util/media.ts +26 -0
  568. package/src/engine/util/process.ts +176 -0
  569. package/src/engine/util/queue.ts +32 -0
  570. package/src/engine/util/record.ts +3 -0
  571. package/src/engine/util/repository.ts +158 -0
  572. package/src/engine/util/rpc.ts +66 -0
  573. package/src/engine/util/signal.ts +12 -0
  574. package/src/engine/util/timeout.ts +13 -0
  575. package/src/engine/util/token.ts +7 -0
  576. package/src/engine/util/util/archive.ts +17 -0
  577. package/src/engine/util/util/bom.ts +31 -0
  578. package/src/engine/util/util/data-url.ts +9 -0
  579. package/src/engine/util/util/defer.ts +10 -0
  580. package/src/engine/util/util/effect-http-client.ts +11 -0
  581. package/src/engine/util/util/error.ts +88 -0
  582. package/src/engine/util/util/filesystem.ts +252 -0
  583. package/src/engine/util/util/format.ts +20 -0
  584. package/src/engine/util/util/iife.ts +3 -0
  585. package/src/engine/util/util/lazy.ts +20 -0
  586. package/src/engine/util/util/local-context.ts +25 -0
  587. package/src/engine/util/util/locale.ts +86 -0
  588. package/src/engine/util/util/media.ts +26 -0
  589. package/src/engine/util/util/process.ts +176 -0
  590. package/src/engine/util/util/queue.ts +32 -0
  591. package/src/engine/util/util/record.ts +3 -0
  592. package/src/engine/util/util/repository.ts +158 -0
  593. package/src/engine/util/util/rpc.ts +66 -0
  594. package/src/engine/util/util/signal.ts +12 -0
  595. package/src/engine/util/util/timeout.ts +13 -0
  596. package/src/engine/util/util/token.ts +7 -0
  597. package/src/engine/util/util/which.ts +14 -0
  598. package/src/engine/util/util/wildcard.ts +59 -0
  599. package/src/engine/util/which.ts +14 -0
  600. package/src/engine/util/wildcard.ts +59 -0
  601. package/src/engine/worktree/index.ts +621 -0
  602. package/src/rag_worker.ts +519 -0
  603. package/src/server.ts +201 -0
  604. package/src/tui.ts +637 -0
  605. package/tsconfig.json +24 -0
@@ -0,0 +1,99 @@
1
+ // Generated by BoneScript compiler.
2
+ // Notification service — fires on event emissions.
3
+ // Configure NOTIFY_PROVIDER=resend|sendgrid|log (default: log)
4
+ // Set NOTIFY_API_KEY and NOTIFY_FROM_EMAIL in .env
5
+
6
+ import { SystemEvent } from "./events";
7
+
8
+ export type NotifyProvider = "resend" | "sendgrid" | "log";
9
+
10
+ const PROVIDER = (process.env.NOTIFY_PROVIDER || "log") as NotifyProvider;
11
+ const API_KEY = process.env.NOTIFY_API_KEY || "";
12
+ const FROM_EMAIL = process.env.NOTIFY_FROM_EMAIL || "noreply@example.com";
13
+
14
+ export interface NotifyMessage {
15
+ to: string;
16
+ subject: string;
17
+ body: string;
18
+ }
19
+
20
+ async function sendEmail(msg: NotifyMessage): Promise<void> {
21
+ if (PROVIDER === "log") {
22
+ console.log(`[notify] ${msg.subject} → ${msg.to}`);
23
+ return;
24
+ }
25
+ if (PROVIDER === "resend") {
26
+ const res = await fetch("https://api.resend.com/emails", {
27
+ method: "POST",
28
+ headers: { "Authorization": `Bearer ${API_KEY}`, "Content-Type": "application/json" },
29
+ body: JSON.stringify({ from: FROM_EMAIL, to: msg.to, subject: msg.subject, html: msg.body }),
30
+ });
31
+ if (!res.ok) throw new Error(`Resend error: ${res.status}`);
32
+ return;
33
+ }
34
+ if (PROVIDER === "sendgrid") {
35
+ const res = await fetch("https://api.sendgrid.com/v3/mail/send", {
36
+ method: "POST",
37
+ headers: { "Authorization": `Bearer ${API_KEY}`, "Content-Type": "application/json" },
38
+ body: JSON.stringify({ personalizations: [{ to: [{ email: msg.to }] }], from: { email: FROM_EMAIL }, subject: msg.subject, content: [{ type: "text/html", value: msg.body }] }),
39
+ });
40
+ if (!res.ok) throw new Error(`SendGrid error: ${res.status}`);
41
+ return;
42
+ }
43
+ }
44
+
45
+ // Handler for CodebaseIngestionStarted
46
+ export async function notifyCodebaseIngestionStarted(event: SystemEvent, recipientEmail: string): Promise<void> {
47
+ await sendEmail({
48
+ to: recipientEmail,
49
+ subject: "CodebaseIngestionStarted notification",
50
+ body: `<p>Event <strong>CodebaseIngestionStarted</strong> occurred.</p><pre>${JSON.stringify(event.payload, null, 2)}</pre>`,
51
+ });
52
+ }
53
+
54
+ // Handler for CodebaseIngestionCompleted
55
+ export async function notifyCodebaseIngestionCompleted(event: SystemEvent, recipientEmail: string): Promise<void> {
56
+ await sendEmail({
57
+ to: recipientEmail,
58
+ subject: "CodebaseIngestionCompleted notification",
59
+ body: `<p>Event <strong>CodebaseIngestionCompleted</strong> occurred.</p><pre>${JSON.stringify(event.payload, null, 2)}</pre>`,
60
+ });
61
+ }
62
+
63
+ // Handler for FileIndexed
64
+ export async function notifyFileIndexed(event: SystemEvent, recipientEmail: string): Promise<void> {
65
+ await sendEmail({
66
+ to: recipientEmail,
67
+ subject: "FileIndexed notification",
68
+ body: `<p>Event <strong>FileIndexed</strong> occurred.</p><pre>${JSON.stringify(event.payload, null, 2)}</pre>`,
69
+ });
70
+ }
71
+
72
+ // Handler for MemoryStored
73
+ export async function notifyMemoryStored(event: SystemEvent, recipientEmail: string): Promise<void> {
74
+ await sendEmail({
75
+ to: recipientEmail,
76
+ subject: "MemoryStored notification",
77
+ body: `<p>Event <strong>MemoryStored</strong> occurred.</p><pre>${JSON.stringify(event.payload, null, 2)}</pre>`,
78
+ });
79
+ }
80
+
81
+ export function registerNotificationHandlers(eventBus: any): void {
82
+ // TODO: implement recipient lookup per event type
83
+ // eventBus.subscribe("CodebaseIngestionStarted", async (event: SystemEvent) => {
84
+ // const recipientEmail = await lookupRecipient(event);
85
+ // await notifyCodebaseIngestionStarted(event, recipientEmail);
86
+ // });
87
+ // eventBus.subscribe("CodebaseIngestionCompleted", async (event: SystemEvent) => {
88
+ // const recipientEmail = await lookupRecipient(event);
89
+ // await notifyCodebaseIngestionCompleted(event, recipientEmail);
90
+ // });
91
+ // eventBus.subscribe("FileIndexed", async (event: SystemEvent) => {
92
+ // const recipientEmail = await lookupRecipient(event);
93
+ // await notifyFileIndexed(event, recipientEmail);
94
+ // });
95
+ // eventBus.subscribe("MemoryStored", async (event: SystemEvent) => {
96
+ // const recipientEmail = await lookupRecipient(event);
97
+ // await notifyMemoryStored(event, recipientEmail);
98
+ // });
99
+ }
@@ -0,0 +1,75 @@
1
+ // Generated by BoneScript compiler. DO NOT EDIT.
2
+ // Service: CodeChunkService
3
+ import { Router, Request, Response } from "express";
4
+ import { v4 as uuid } from "uuid";
5
+ import { query, queryOne, execute, pool } from "../db";
6
+ import { eventBus } from "../events";
7
+ import { requireAuth, AuthContext } from "../auth";
8
+ import rateLimit from "express-rate-limit";
9
+ import { logger } from "../logger";
10
+ import { counter } from "../metrics";
11
+ import * as __algorithms from "../algorithms";
12
+ const { shortestPath, topologicalSort, binarySearch, bipartiteMatching, roundRobin, weightedAverage, percentile, rankBy, consistentHash } = __algorithms as any;
13
+
14
+ export const codeChunksRouter = Router();
15
+
16
+ // CREATE
17
+ codeChunksRouter.post("/", requireAuth, async (req: Request, res: Response) => {
18
+ try {
19
+ const id = uuid();
20
+ const { code_file_id, knowledge_base_id, project_id, content, start_line, end_line, chunk_index, language, symbol_name, symbol_type, metadata } = req.body;
21
+ const sql = `INSERT INTO code_chunks (id, code_file_id, knowledge_base_id, project_id, content, start_line, end_line, chunk_index, language, symbol_name, symbol_type, metadata) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12) RETURNING *`;
22
+ const rows = await query(sql, [id, code_file_id, knowledge_base_id, project_id, content, start_line, end_line, chunk_index, language, symbol_name, symbol_type, metadata]);
23
+ counter("entity.created", { entity: "CodeChunk" });
24
+ res.status(201).json(rows[0]);
25
+ } catch (e: any) {
26
+ res.status(400).json({ error: { code: "CREATE_FAILED", message: e.message } });
27
+ }
28
+ });
29
+
30
+ // READ
31
+ codeChunksRouter.get("/:id", requireAuth, async (req: Request, res: Response) => {
32
+ try {
33
+ const row = await queryOne(`SELECT * FROM code_chunks WHERE id = $1`, [req.params.id]);
34
+ if (!row) return res.status(404).json({ error: { code: "NOT_FOUND", message: "Not found" } });
35
+ res.json(row);
36
+ } catch (e: any) {
37
+ res.status(500).json({ error: { code: "DB_ERROR", message: e.message } });
38
+ }
39
+ });
40
+
41
+ // LIST
42
+ codeChunksRouter.get("/", requireAuth, async (req: Request, res: Response) => {
43
+ try {
44
+ const page = parseInt(req.query.page as string) || 1;
45
+ const pageSize = Math.min(parseInt(req.query.page_size as string) || 50, 100);
46
+ const offset = (page - 1) * pageSize;
47
+ const rows = await query(`SELECT code_chunks.*, row_to_json(code_file.*) as code_file FROM code_chunks LEFT JOIN code_files code_file ON code_chunks.code_file_id = code_file.id ORDER BY code_chunks.created_at DESC LIMIT $1 OFFSET $2`, [pageSize, offset]);
48
+ const [{ count }] = await query(`SELECT COUNT(*) as count FROM code_chunks`);
49
+ res.json({ items: rows, total: parseInt(count), page, page_size: pageSize });
50
+ } catch (e: any) {
51
+ res.status(500).json({ error: { code: "DB_ERROR", message: e.message } });
52
+ }
53
+ });
54
+
55
+ // UPDATE
56
+ codeChunksRouter.put("/:id", requireAuth, async (req: Request, res: Response) => {
57
+ const fields = { ...req.body };
58
+ const sets = Object.keys(fields).map((k, i) => `${k} = $${i + 2}`).join(", ");
59
+ const values = Object.values(fields);
60
+ const sql = `UPDATE code_chunks SET ${sets}, updated_at = NOW() WHERE id = $1 RETURNING *`;
61
+ const rows = await query(sql, [req.params.id, ...values]);
62
+ if (rows.length === 0) return res.status(404).json({ error: { code: "NOT_FOUND", message: "Not found" } });
63
+ res.json(rows[0]);
64
+ });
65
+
66
+ // DELETE
67
+ codeChunksRouter.delete("/:id", requireAuth, async (req: Request, res: Response) => {
68
+ try {
69
+ const count = await execute(`DELETE FROM code_chunks WHERE id = $1`, [req.params.id]);
70
+ if (count === 0) return res.status(404).json({ error: { code: "NOT_FOUND", message: "Not found" } });
71
+ res.status(204).send();
72
+ } catch (e: any) {
73
+ res.status(500).json({ error: { code: "DB_ERROR", message: e.message } });
74
+ }
75
+ });
@@ -0,0 +1,101 @@
1
+ // Generated by BoneScript compiler. DO NOT EDIT.
2
+ // Service: CodeFileService
3
+ import { Router, Request, Response } from "express";
4
+ import { v4 as uuid } from "uuid";
5
+ import { query, queryOne, execute, pool } from "../db";
6
+ import { eventBus } from "../events";
7
+ import { requireAuth, AuthContext } from "../auth";
8
+ import rateLimit from "express-rate-limit";
9
+ import { logger } from "../logger";
10
+ import { counter } from "../metrics";
11
+ import * as __algorithms from "../algorithms";
12
+ const { shortestPath, topologicalSort, binarySearch, bipartiteMatching, roundRobin, weightedAverage, percentile, rankBy, consistentHash } = __algorithms as any;
13
+
14
+ import { transitionCodeFile, CODEFILE_INITIAL } from "../state_machines/code_file";
15
+
16
+ export const codeFilesRouter = Router();
17
+
18
+ // CREATE
19
+ codeFilesRouter.post("/", requireAuth, async (req: Request, res: Response) => {
20
+ try {
21
+ const id = uuid();
22
+ const { knowledge_base_id, project_id, file_path, language, file_hash, file_size_bytes, total_chunks, last_modified_at, metadata } = req.body;
23
+ const state = CODEFILE_INITIAL;
24
+ const sql = `INSERT INTO code_files (id, knowledge_base_id, project_id, file_path, language, file_hash, file_size_bytes, total_chunks, last_modified_at, metadata, state) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11) RETURNING *`;
25
+ const rows = await query(sql, [id, knowledge_base_id, project_id, file_path, language, file_hash, file_size_bytes, total_chunks, last_modified_at, metadata, state]);
26
+ counter("entity.created", { entity: "CodeFile" });
27
+ res.status(201).json(rows[0]);
28
+ } catch (e: any) {
29
+ res.status(400).json({ error: { code: "CREATE_FAILED", message: e.message } });
30
+ }
31
+ });
32
+
33
+ // READ
34
+ codeFilesRouter.get("/:id", requireAuth, async (req: Request, res: Response) => {
35
+ try {
36
+ const row = await queryOne(`SELECT * FROM code_files WHERE id = $1`, [req.params.id]);
37
+ if (!row) return res.status(404).json({ error: { code: "NOT_FOUND", message: "Not found" } });
38
+ res.json(row);
39
+ } catch (e: any) {
40
+ res.status(500).json({ error: { code: "DB_ERROR", message: e.message } });
41
+ }
42
+ });
43
+
44
+ // LIST
45
+ codeFilesRouter.get("/", requireAuth, async (req: Request, res: Response) => {
46
+ try {
47
+ const page = parseInt(req.query.page as string) || 1;
48
+ const pageSize = Math.min(parseInt(req.query.page_size as string) || 50, 100);
49
+ const offset = (page - 1) * pageSize;
50
+ const rows = await query(`SELECT code_files.*, row_to_json(knowledge_base.*) as knowledge_base FROM code_files LEFT JOIN knowledge_bases knowledge_base ON code_files.knowledge_base_id = knowledge_base.id ORDER BY code_files.created_at DESC LIMIT $1 OFFSET $2`, [pageSize, offset]);
51
+ const [{ count }] = await query(`SELECT COUNT(*) as count FROM code_files`);
52
+ res.json({ items: rows, total: parseInt(count), page, page_size: pageSize });
53
+ } catch (e: any) {
54
+ res.status(500).json({ error: { code: "DB_ERROR", message: e.message } });
55
+ }
56
+ });
57
+
58
+ // UPDATE
59
+ codeFilesRouter.put("/:id", requireAuth, async (req: Request, res: Response) => {
60
+ const fields = { ...req.body };
61
+ // State machine enforcement
62
+ if (fields.state !== undefined) {
63
+ const current = await queryOne<{ state: string }>(`SELECT state FROM code_files WHERE id = $1`, [req.params.id]);
64
+ if (!current) return res.status(404).json({ error: { code: "NOT_FOUND", message: "Not found" } });
65
+ // Find the trigger for this state transition
66
+ const trigger = `${current.state}_to_${fields.state}`;
67
+ const tr = transitionCodeFile(current.state as any, trigger);
68
+ if (!tr.ok) return res.status(422).json({ error: { code: "INVALID_TRANSITION", message: `Cannot transition from ${current.state} to ${fields.state}` } });
69
+ }
70
+ const sets = Object.keys(fields).map((k, i) => `${k} = $${i + 2}`).join(", ");
71
+ const values = Object.values(fields);
72
+ const sql = `UPDATE code_files SET ${sets}, updated_at = NOW() WHERE id = $1 RETURNING *`;
73
+ const rows = await query(sql, [req.params.id, ...values]);
74
+ if (rows.length === 0) return res.status(404).json({ error: { code: "NOT_FOUND", message: "Not found" } });
75
+ res.json(rows[0]);
76
+ });
77
+
78
+ // DELETE
79
+ codeFilesRouter.delete("/:id", requireAuth, async (req: Request, res: Response) => {
80
+ try {
81
+ const count = await execute(`DELETE FROM code_files WHERE id = $1`, [req.params.id]);
82
+ if (count === 0) return res.status(404).json({ error: { code: "NOT_FOUND", message: "Not found" } });
83
+ res.status(204).send();
84
+ } catch (e: any) {
85
+ res.status(500).json({ error: { code: "DB_ERROR", message: e.message } });
86
+ }
87
+ });
88
+
89
+ // RELATION: chunks (has_many CodeChunk)
90
+ codeFilesRouter.get("/:id/chunks", requireAuth, async (req: Request, res: Response) => {
91
+ try {
92
+ const page = parseInt(req.query.page as string) || 1;
93
+ const pageSize = Math.min(parseInt(req.query.page_size as string) || 50, 100);
94
+ const offset = (page - 1) * pageSize;
95
+ const rows = await query(`SELECT * FROM code_chunks WHERE code_file_id = $1 ORDER BY created_at DESC LIMIT $2 OFFSET $3`, [req.params.id, pageSize, offset]);
96
+ const [{ count }] = await query(`SELECT COUNT(*) as count FROM code_chunks WHERE code_file_id = $1`, [req.params.id]);
97
+ res.json({ items: rows, total: parseInt(count), page, page_size: pageSize });
98
+ } catch (e: any) {
99
+ res.status(500).json({ error: { code: "DB_ERROR", message: e.message } });
100
+ }
101
+ });
@@ -0,0 +1,87 @@
1
+ // Generated by BoneScript compiler. DO NOT EDIT.
2
+ // Service: IndexingJobService
3
+ import { Router, Request, Response } from "express";
4
+ import { v4 as uuid } from "uuid";
5
+ import { query, queryOne, execute, pool } from "../db";
6
+ import { eventBus } from "../events";
7
+ import { requireAuth, AuthContext } from "../auth";
8
+ import rateLimit from "express-rate-limit";
9
+ import { logger } from "../logger";
10
+ import { counter } from "../metrics";
11
+ import * as __algorithms from "../algorithms";
12
+ const { shortestPath, topologicalSort, binarySearch, bipartiteMatching, roundRobin, weightedAverage, percentile, rankBy, consistentHash } = __algorithms as any;
13
+
14
+ import { transitionIndexingJob, INDEXINGJOB_INITIAL } from "../state_machines/indexing_job";
15
+
16
+ export const indexingJobsRouter = Router();
17
+
18
+ // CREATE
19
+ indexingJobsRouter.post("/", requireAuth, async (req: Request, res: Response) => {
20
+ try {
21
+ const id = uuid();
22
+ const { knowledge_base_id, project_id, job_type, file_paths, files_total, files_processed, chunks_total, chunks_embedded, error } = req.body;
23
+ const state = INDEXINGJOB_INITIAL;
24
+ const sql = `INSERT INTO indexing_jobs (id, knowledge_base_id, project_id, job_type, file_paths, files_total, files_processed, chunks_total, chunks_embedded, error, state) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11) RETURNING *`;
25
+ const rows = await query(sql, [id, knowledge_base_id, project_id, job_type, file_paths, files_total, files_processed, chunks_total, chunks_embedded, error, state]);
26
+ counter("entity.created", { entity: "IndexingJob" });
27
+ res.status(201).json(rows[0]);
28
+ } catch (e: any) {
29
+ res.status(400).json({ error: { code: "CREATE_FAILED", message: e.message } });
30
+ }
31
+ });
32
+
33
+ // READ
34
+ indexingJobsRouter.get("/:id", requireAuth, async (req: Request, res: Response) => {
35
+ try {
36
+ const row = await queryOne(`SELECT * FROM indexing_jobs WHERE id = $1`, [req.params.id]);
37
+ if (!row) return res.status(404).json({ error: { code: "NOT_FOUND", message: "Not found" } });
38
+ res.json(row);
39
+ } catch (e: any) {
40
+ res.status(500).json({ error: { code: "DB_ERROR", message: e.message } });
41
+ }
42
+ });
43
+
44
+ // LIST
45
+ indexingJobsRouter.get("/", requireAuth, async (req: Request, res: Response) => {
46
+ try {
47
+ const page = parseInt(req.query.page as string) || 1;
48
+ const pageSize = Math.min(parseInt(req.query.page_size as string) || 50, 100);
49
+ const offset = (page - 1) * pageSize;
50
+ const rows = await query(`SELECT * FROM indexing_jobs ORDER BY created_at DESC LIMIT $1 OFFSET $2`, [pageSize, offset]);
51
+ const [{ count }] = await query(`SELECT COUNT(*) as count FROM indexing_jobs`);
52
+ res.json({ items: rows, total: parseInt(count), page, page_size: pageSize });
53
+ } catch (e: any) {
54
+ res.status(500).json({ error: { code: "DB_ERROR", message: e.message } });
55
+ }
56
+ });
57
+
58
+ // UPDATE
59
+ indexingJobsRouter.put("/:id", requireAuth, async (req: Request, res: Response) => {
60
+ const fields = { ...req.body };
61
+ // State machine enforcement
62
+ if (fields.state !== undefined) {
63
+ const current = await queryOne<{ state: string }>(`SELECT state FROM indexing_jobs WHERE id = $1`, [req.params.id]);
64
+ if (!current) return res.status(404).json({ error: { code: "NOT_FOUND", message: "Not found" } });
65
+ // Find the trigger for this state transition
66
+ const trigger = `${current.state}_to_${fields.state}`;
67
+ const tr = transitionIndexingJob(current.state as any, trigger);
68
+ if (!tr.ok) return res.status(422).json({ error: { code: "INVALID_TRANSITION", message: `Cannot transition from ${current.state} to ${fields.state}` } });
69
+ }
70
+ const sets = Object.keys(fields).map((k, i) => `${k} = $${i + 2}`).join(", ");
71
+ const values = Object.values(fields);
72
+ const sql = `UPDATE indexing_jobs SET ${sets}, updated_at = NOW() WHERE id = $1 RETURNING *`;
73
+ const rows = await query(sql, [req.params.id, ...values]);
74
+ if (rows.length === 0) return res.status(404).json({ error: { code: "NOT_FOUND", message: "Not found" } });
75
+ res.json(rows[0]);
76
+ });
77
+
78
+ // DELETE
79
+ indexingJobsRouter.delete("/:id", requireAuth, async (req: Request, res: Response) => {
80
+ try {
81
+ const count = await execute(`DELETE FROM indexing_jobs WHERE id = $1`, [req.params.id]);
82
+ if (count === 0) return res.status(404).json({ error: { code: "NOT_FOUND", message: "Not found" } });
83
+ res.status(204).send();
84
+ } catch (e: any) {
85
+ res.status(500).json({ error: { code: "DB_ERROR", message: e.message } });
86
+ }
87
+ });
@@ -0,0 +1,230 @@
1
+ // Generated by BoneScript compiler. DO NOT EDIT.
2
+ // Service: KnowledgeBaseService
3
+ import { Router, Request, Response } from "express";
4
+ import { v4 as uuid } from "uuid";
5
+ import { query, queryOne, execute, pool } from "../db";
6
+ import { eventBus } from "../events";
7
+ import { requireAuth, AuthContext } from "../auth";
8
+ import rateLimit from "express-rate-limit";
9
+ import { logger } from "../logger";
10
+ import { counter } from "../metrics";
11
+ import * as __algorithms from "../algorithms";
12
+ const { shortestPath, topologicalSort, binarySearch, bipartiteMatching, roundRobin, weightedAverage, percentile, rankBy, consistentHash } = __algorithms as any;
13
+
14
+ import { transitionKnowledgeBase, KNOWLEDGEBASE_INITIAL } from "../state_machines/knowledge_base";
15
+
16
+ export const knowledgeBasesRouter = Router();
17
+
18
+ // CREATE
19
+ knowledgeBasesRouter.post("/", requireAuth, async (req: Request, res: Response) => {
20
+ try {
21
+ const id = uuid();
22
+ const { project_id, name, description, embedding_model, embedding_dimensions, chunk_strategy, chunk_size, chunk_overlap, total_files, total_chunks, last_indexed_at } = req.body;
23
+ const state = KNOWLEDGEBASE_INITIAL;
24
+ const sql = `INSERT INTO knowledge_bases (id, project_id, name, description, embedding_model, embedding_dimensions, chunk_strategy, chunk_size, chunk_overlap, total_files, total_chunks, last_indexed_at, state) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13) RETURNING *`;
25
+ const rows = await query(sql, [id, project_id, name, description, embedding_model, embedding_dimensions, chunk_strategy, chunk_size, chunk_overlap, total_files, total_chunks, last_indexed_at, state]);
26
+ counter("entity.created", { entity: "KnowledgeBase" });
27
+ res.status(201).json(rows[0]);
28
+ } catch (e: any) {
29
+ res.status(400).json({ error: { code: "CREATE_FAILED", message: e.message } });
30
+ }
31
+ });
32
+
33
+ // READ
34
+ knowledgeBasesRouter.get("/:id", requireAuth, async (req: Request, res: Response) => {
35
+ try {
36
+ const row = await queryOne(`SELECT * FROM knowledge_bases WHERE id = $1`, [req.params.id]);
37
+ if (!row) return res.status(404).json({ error: { code: "NOT_FOUND", message: "Not found" } });
38
+ res.json(row);
39
+ } catch (e: any) {
40
+ res.status(500).json({ error: { code: "DB_ERROR", message: e.message } });
41
+ }
42
+ });
43
+
44
+ // LIST
45
+ knowledgeBasesRouter.get("/", requireAuth, async (req: Request, res: Response) => {
46
+ try {
47
+ const page = parseInt(req.query.page as string) || 1;
48
+ const pageSize = Math.min(parseInt(req.query.page_size as string) || 50, 100);
49
+ const offset = (page - 1) * pageSize;
50
+ const rows = await query(`SELECT * FROM knowledge_bases ORDER BY created_at DESC LIMIT $1 OFFSET $2`, [pageSize, offset]);
51
+ const [{ count }] = await query(`SELECT COUNT(*) as count FROM knowledge_bases`);
52
+ res.json({ items: rows, total: parseInt(count), page, page_size: pageSize });
53
+ } catch (e: any) {
54
+ res.status(500).json({ error: { code: "DB_ERROR", message: e.message } });
55
+ }
56
+ });
57
+
58
+ // UPDATE
59
+ knowledgeBasesRouter.put("/:id", requireAuth, async (req: Request, res: Response) => {
60
+ const fields = { ...req.body };
61
+ // State machine enforcement
62
+ if (fields.state !== undefined) {
63
+ const current = await queryOne<{ state: string }>(`SELECT state FROM knowledge_bases WHERE id = $1`, [req.params.id]);
64
+ if (!current) return res.status(404).json({ error: { code: "NOT_FOUND", message: "Not found" } });
65
+ // Find the trigger for this state transition
66
+ const trigger = `${current.state}_to_${fields.state}`;
67
+ const tr = transitionKnowledgeBase(current.state as any, trigger);
68
+ if (!tr.ok) return res.status(422).json({ error: { code: "INVALID_TRANSITION", message: `Cannot transition from ${current.state} to ${fields.state}` } });
69
+ }
70
+ const sets = Object.keys(fields).map((k, i) => `${k} = $${i + 2}`).join(", ");
71
+ const values = Object.values(fields);
72
+ const sql = `UPDATE knowledge_bases SET ${sets}, updated_at = NOW() WHERE id = $1 RETURNING *`;
73
+ const rows = await query(sql, [req.params.id, ...values]);
74
+ if (rows.length === 0) return res.status(404).json({ error: { code: "NOT_FOUND", message: "Not found" } });
75
+ res.json(rows[0]);
76
+ });
77
+
78
+ // DELETE
79
+ knowledgeBasesRouter.delete("/:id", requireAuth, async (req: Request, res: Response) => {
80
+ try {
81
+ const count = await execute(`DELETE FROM knowledge_bases WHERE id = $1`, [req.params.id]);
82
+ if (count === 0) return res.status(404).json({ error: { code: "NOT_FOUND", message: "Not found" } });
83
+ res.status(204).send();
84
+ } catch (e: any) {
85
+ res.status(500).json({ error: { code: "DB_ERROR", message: e.message } });
86
+ }
87
+ });
88
+
89
+ // CAPABILITY: ingest_codebase
90
+ knowledgeBasesRouter.post("/ingest-codebase", requireAuth, async (req: Request, res: Response) => {
91
+ const auth: AuthContext = (req as any).auth;
92
+ try {
93
+ // sync: eventual — effects applied, events queued via outbox
94
+ const { file_paths } = req.body;
95
+
96
+ // Fetch entities
97
+ const knowledge_base = await queryOne(`SELECT * FROM knowledge_bases WHERE id = $1`, [req.body.knowledge_base_id || req.params.id]);
98
+ if (!knowledge_base) {
99
+ return res.status(404).json({ error: { code: "NOT_FOUND", message: "knowledge_base not found" } });
100
+ }
101
+
102
+ // Preconditions
103
+ if (!([["empty", "ready", "stale", "error"]].flat().includes(knowledge_base?.state))) {
104
+ return res.status(422).json({ error: { code: "PRECONDITION_FAILED", message: "knowledge_base.state in [\\\"empty\\\", \\\"ready\\\", \\\"stale\\\", \\\"error\\\"]" } });
105
+ }
106
+
107
+ // Effects (applied in declaration order)
108
+ const __effect_0 = await query(`UPDATE knowledge_bases SET state = $1, updated_at = NOW() WHERE id = $2 RETURNING *`, ["indexing", req.body.knowledge_base_id || req.params.id]);
109
+ if (!__effect_0 || __effect_0.length === 0) {
110
+ throw new Error("Effect failed: knowledge_base.state = \"indexing\"");
111
+ }
112
+
113
+ // Emit events
114
+ await eventBus.publish("CodebaseIngestionStarted", { knowledge_base_id: knowledge_base?.id, timestamp: new Date().toISOString(), actor_id: auth.actor_id }, "KnowledgeBaseService", auth.trace_id);
115
+
116
+ res.json({ ok: true, action: "ingest_codebase", entity: knowledge_base });
117
+ } catch (e: any) {
118
+ res.status(400).json({ error: { code: "CAPABILITY_FAILED", message: e.message } });
119
+ }
120
+ });
121
+
122
+ // CAPABILITY: index_file
123
+ knowledgeBasesRouter.post("/index-file", requireAuth, async (req: Request, res: Response) => {
124
+ const auth: AuthContext = (req as any).auth;
125
+ try {
126
+ // sync: eventual — effects applied, events queued via outbox
127
+ const { file_path } = req.body;
128
+
129
+ // Fetch entities
130
+ const knowledge_base = await queryOne(`SELECT * FROM knowledge_bases WHERE id = $1`, [req.body.knowledge_base_id || req.params.id]);
131
+ if (!knowledge_base) {
132
+ return res.status(404).json({ error: { code: "NOT_FOUND", message: "knowledge_base not found" } });
133
+ }
134
+
135
+ // Preconditions
136
+ if (!([["indexing", "ready", "reindexing"]].flat().includes(knowledge_base?.state))) {
137
+ return res.status(422).json({ error: { code: "PRECONDITION_FAILED", message: "knowledge_base.state in [\\\"indexing\\\", \\\"ready\\\", \\\"reindexing\\\"]" } });
138
+ }
139
+ if (!(file_path?.length >= 1)) {
140
+ return res.status(422).json({ error: { code: "PRECONDITION_FAILED", message: "file_path.length >= 1" } });
141
+ }
142
+
143
+ // Emit events
144
+ await eventBus.publish("FileIndexed", { knowledge_base_id: knowledge_base?.id, timestamp: new Date().toISOString(), actor_id: auth.actor_id }, "KnowledgeBaseService", auth.trace_id);
145
+
146
+ res.json({ ok: true, action: "index_file", entity: knowledge_base });
147
+ } catch (e: any) {
148
+ res.status(400).json({ error: { code: "CAPABILITY_FAILED", message: e.message } });
149
+ }
150
+ });
151
+
152
+ // CAPABILITY: retrieve_context
153
+ knowledgeBasesRouter.post("/retrieve-context", requireAuth, async (req: Request, res: Response) => {
154
+ const auth: AuthContext = (req as any).auth;
155
+ try {
156
+ // sync: eventual — effects applied, events queued via outbox
157
+ const { query, limit } = req.body;
158
+
159
+ // Fetch entities
160
+ const knowledge_base = await queryOne(`SELECT * FROM knowledge_bases WHERE id = $1`, [req.body.knowledge_base_id || req.params.id]);
161
+ if (!knowledge_base) {
162
+ return res.status(404).json({ error: { code: "NOT_FOUND", message: "knowledge_base not found" } });
163
+ }
164
+
165
+ // Preconditions
166
+ if (!(knowledge_base?.state === "ready")) {
167
+ return res.status(422).json({ error: { code: "PRECONDITION_FAILED", message: "knowledge_base.state == \\\"ready\\\"" } });
168
+ }
169
+ if (!(query?.length >= 1)) {
170
+ return res.status(422).json({ error: { code: "PRECONDITION_FAILED", message: "query.length >= 1" } });
171
+ }
172
+ if (!(limit >= 1)) {
173
+ return res.status(422).json({ error: { code: "PRECONDITION_FAILED", message: "limit >= 1" } });
174
+ }
175
+ if (!(limit <= 100)) {
176
+ return res.status(422).json({ error: { code: "PRECONDITION_FAILED", message: "limit <= 100" } });
177
+ }
178
+
179
+ res.json({ ok: true, action: "retrieve_context", entity: knowledge_base });
180
+ } catch (e: any) {
181
+ res.status(400).json({ error: { code: "CAPABILITY_FAILED", message: e.message } });
182
+ }
183
+ });
184
+
185
+ // CAPABILITY: semantic_search
186
+ knowledgeBasesRouter.post("/semantic-search", requireAuth, async (req: Request, res: Response) => {
187
+ const auth: AuthContext = (req as any).auth;
188
+ try {
189
+ // sync: eventual — effects applied, events queued via outbox
190
+ const { query, filters, limit } = req.body;
191
+
192
+ // Fetch entities
193
+ const knowledge_base = await queryOne(`SELECT * FROM knowledge_bases WHERE id = $1`, [req.body.knowledge_base_id || req.params.id]);
194
+ if (!knowledge_base) {
195
+ return res.status(404).json({ error: { code: "NOT_FOUND", message: "knowledge_base not found" } });
196
+ }
197
+
198
+ // Preconditions
199
+ if (!(knowledge_base?.state === "ready")) {
200
+ return res.status(422).json({ error: { code: "PRECONDITION_FAILED", message: "knowledge_base.state == \\\"ready\\\"" } });
201
+ }
202
+ if (!(query?.length >= 1)) {
203
+ return res.status(422).json({ error: { code: "PRECONDITION_FAILED", message: "query.length >= 1" } });
204
+ }
205
+ if (!(limit >= 1)) {
206
+ return res.status(422).json({ error: { code: "PRECONDITION_FAILED", message: "limit >= 1" } });
207
+ }
208
+ if (!(limit <= 200)) {
209
+ return res.status(422).json({ error: { code: "PRECONDITION_FAILED", message: "limit <= 200" } });
210
+ }
211
+
212
+ res.json({ ok: true, action: "semantic_search", entity: knowledge_base });
213
+ } catch (e: any) {
214
+ res.status(400).json({ error: { code: "CAPABILITY_FAILED", message: e.message } });
215
+ }
216
+ });
217
+
218
+ // RELATION: files (has_many CodeFile)
219
+ knowledgeBasesRouter.get("/:id/files", requireAuth, async (req: Request, res: Response) => {
220
+ try {
221
+ const page = parseInt(req.query.page as string) || 1;
222
+ const pageSize = Math.min(parseInt(req.query.page_size as string) || 50, 100);
223
+ const offset = (page - 1) * pageSize;
224
+ const rows = await query(`SELECT * FROM code_files WHERE knowledge_base_id = $1 ORDER BY created_at DESC LIMIT $2 OFFSET $3`, [req.params.id, pageSize, offset]);
225
+ const [{ count }] = await query(`SELECT COUNT(*) as count FROM code_files WHERE knowledge_base_id = $1`, [req.params.id]);
226
+ res.json({ items: rows, total: parseInt(count), page, page_size: pageSize });
227
+ } catch (e: any) {
228
+ res.status(500).json({ error: { code: "DB_ERROR", message: e.message } });
229
+ }
230
+ });