bonecode 1.0.0 → 1.1.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 (575) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +64 -50
  3. package/bone/output/agent/.dockerignore +7 -7
  4. package/bone/output/agent/.env.example +36 -36
  5. package/bone/output/agent/.github/workflows/ci.yaml +58 -58
  6. package/bone/output/agent/AgentDomain.bone.map +349 -349
  7. package/bone/output/agent/AgentDomain.postman_collection.json +957 -957
  8. package/bone/output/agent/Dockerfile +22 -22
  9. package/bone/output/agent/README.md +47 -47
  10. package/bone/output/agent/admin/index.html +739 -739
  11. package/bone/output/agent/docker-compose.yaml +22 -22
  12. package/bone/output/agent/k8s/deployment.yaml +75 -75
  13. package/bone/output/agent/migrations/agent.sql +36 -36
  14. package/bone/output/agent/migrations/agent_instance.sql +36 -36
  15. package/bone/output/agent/migrations/audit_log.sql +18 -18
  16. package/bone/output/agent/migrations/build_step.sql +34 -34
  17. package/bone/output/agent/migrations/event_outbox.sql +31 -31
  18. package/bone/output/agent/migrations/plan.sql +30 -30
  19. package/bone/output/agent/migrations/task.sql +30 -30
  20. package/bone/output/agent/migrations/tool_call.sql +33 -33
  21. package/bone/output/agent/openapi.yaml +1116 -1116
  22. package/bone/output/agent/package.json +35 -35
  23. package/bone/output/agent/schema.graphql +233 -233
  24. package/bone/output/agent/sdk/client.ts +231 -231
  25. package/bone/output/agent/src/algorithms.ts +2 -2
  26. package/bone/output/agent/src/audit.ts +44 -44
  27. package/bone/output/agent/src/auth.ts +57 -57
  28. package/bone/output/agent/src/cron.ts +12 -12
  29. package/bone/output/agent/src/db.ts +31 -31
  30. package/bone/output/agent/src/debug.ts +66 -66
  31. package/bone/output/agent/src/events.ts +243 -243
  32. package/bone/output/agent/src/extensions.ts +54 -54
  33. package/bone/output/agent/src/failure_rules.ts +322 -322
  34. package/bone/output/agent/src/flows.ts +168 -168
  35. package/bone/output/agent/src/health.ts +43 -43
  36. package/bone/output/agent/src/index.ts +99 -99
  37. package/bone/output/agent/src/logger.ts +69 -66
  38. package/bone/output/agent/src/metrics.ts +75 -75
  39. package/bone/output/agent/src/migrate.ts +351 -351
  40. package/bone/output/agent/src/migration_diff.ts +108 -108
  41. package/bone/output/agent/src/notify.ts +125 -125
  42. package/bone/output/agent/src/routes/plan.ts +91 -91
  43. package/bone/output/agent/src/routes/task.ts +105 -105
  44. package/bone/output/agent/src/routes/tool_call.ts +166 -166
  45. package/bone/output/agent/src/schemas.ts +384 -384
  46. package/bone/output/agent/src/state_machines/agent_instance.ts +24 -24
  47. package/bone/output/agent/src/state_machines/build_step.ts +22 -22
  48. package/bone/output/agent/src/state_machines/plan.ts +22 -22
  49. package/bone/output/agent/src/state_machines/task.ts +22 -22
  50. package/bone/output/agent/src/state_machines/tool_call.ts +22 -22
  51. package/bone/output/agent/src/tests.ts +361 -361
  52. package/bone/output/agent/src/websocket.ts +200 -200
  53. package/bone/output/agent/tsconfig.json +24 -24
  54. package/bone/output/rag/.dockerignore +7 -7
  55. package/bone/output/rag/.env.example +36 -36
  56. package/bone/output/rag/.github/workflows/ci.yaml +58 -58
  57. package/bone/output/rag/Dockerfile +22 -22
  58. package/bone/output/rag/RAGDomain.bone.map +286 -286
  59. package/bone/output/rag/RAGDomain.postman_collection.json +922 -922
  60. package/bone/output/rag/README.md +47 -47
  61. package/bone/output/rag/admin/index.html +817 -817
  62. package/bone/output/rag/docker-compose.yaml +22 -22
  63. package/bone/output/rag/k8s/deployment.yaml +75 -75
  64. package/bone/output/rag/migrations/audit_log.sql +18 -18
  65. package/bone/output/rag/migrations/code_chunk.sql +34 -34
  66. package/bone/output/rag/migrations/code_file.sql +33 -33
  67. package/bone/output/rag/migrations/event_outbox.sql +31 -31
  68. package/bone/output/rag/migrations/indexing_job.sql +33 -33
  69. package/bone/output/rag/migrations/knowledge_base.sql +35 -35
  70. package/bone/output/rag/migrations/memory_entry.sql +34 -34
  71. package/bone/output/rag/openapi.yaml +1097 -1097
  72. package/bone/output/rag/package.json +35 -35
  73. package/bone/output/rag/schema.graphql +245 -245
  74. package/bone/output/rag/sdk/client.ts +234 -234
  75. package/bone/output/rag/src/algorithms.ts +2 -2
  76. package/bone/output/rag/src/audit.ts +37 -37
  77. package/bone/output/rag/src/auth.ts +57 -57
  78. package/bone/output/rag/src/cron.ts +12 -12
  79. package/bone/output/rag/src/db.ts +31 -31
  80. package/bone/output/rag/src/debug.ts +66 -66
  81. package/bone/output/rag/src/events.ts +243 -243
  82. package/bone/output/rag/src/extensions.ts +350 -350
  83. package/bone/output/rag/src/failure_rules.ts +314 -314
  84. package/bone/output/rag/src/flows.ts +239 -239
  85. package/bone/output/rag/src/health.ts +43 -43
  86. package/bone/output/rag/src/index.ts +94 -94
  87. package/bone/output/rag/src/logger.ts +69 -66
  88. package/bone/output/rag/src/metrics.ts +75 -75
  89. package/bone/output/rag/src/migrate.ts +363 -363
  90. package/bone/output/rag/src/migration_diff.ts +108 -108
  91. package/bone/output/rag/src/notify.ts +99 -99
  92. package/bone/output/rag/src/routes/code_chunk.ts +75 -75
  93. package/bone/output/rag/src/routes/code_file.ts +101 -101
  94. package/bone/output/rag/src/routes/indexing_job.ts +87 -87
  95. package/bone/output/rag/src/routes/knowledge_base.ts +230 -230
  96. package/bone/output/rag/src/routes/memory_entry.ts +87 -87
  97. package/bone/output/rag/src/schemas.ts +394 -394
  98. package/bone/output/rag/src/state_machines/code_file.ts +23 -23
  99. package/bone/output/rag/src/state_machines/indexing_job.ts +22 -22
  100. package/bone/output/rag/src/state_machines/knowledge_base.ts +23 -23
  101. package/bone/output/rag/src/state_machines/memory_entry.ts +20 -20
  102. package/bone/output/rag/src/tests.ts +339 -339
  103. package/bone/output/rag/tsconfig.json +24 -24
  104. package/bone/output/session/.dockerignore +7 -7
  105. package/bone/output/session/.env.example +36 -36
  106. package/bone/output/session/.github/workflows/ci.yaml +58 -58
  107. package/bone/output/session/Dockerfile +22 -22
  108. package/bone/output/session/README.md +47 -47
  109. package/bone/output/session/SessionDomain.bone.map +349 -349
  110. package/bone/output/session/SessionDomain.postman_collection.json +957 -957
  111. package/bone/output/session/admin/index.html +666 -666
  112. package/bone/output/session/docker-compose.yaml +22 -22
  113. package/bone/output/session/k8s/deployment.yaml +75 -75
  114. package/bone/output/session/migrations/audit_log.sql +18 -18
  115. package/bone/output/session/migrations/event_outbox.sql +31 -31
  116. package/bone/output/session/migrations/message.sql +31 -31
  117. package/bone/output/session/migrations/part.sql +28 -28
  118. package/bone/output/session/migrations/permission.sql +28 -28
  119. package/bone/output/session/migrations/project.sql +28 -28
  120. package/bone/output/session/migrations/session.sql +38 -38
  121. package/bone/output/session/openapi.yaml +1101 -1101
  122. package/bone/output/session/package.json +35 -35
  123. package/bone/output/session/schema.graphql +222 -222
  124. package/bone/output/session/sdk/client.ts +225 -225
  125. package/bone/output/session/src/algorithms.ts +2 -2
  126. package/bone/output/session/src/audit.ts +44 -44
  127. package/bone/output/session/src/auth.ts +57 -57
  128. package/bone/output/session/src/cron.ts +12 -12
  129. package/bone/output/session/src/db.ts +31 -31
  130. package/bone/output/session/src/debug.ts +66 -66
  131. package/bone/output/session/src/events.ts +270 -270
  132. package/bone/output/session/src/extensions.ts +215 -215
  133. package/bone/output/session/src/failure_rules.ts +283 -283
  134. package/bone/output/session/src/flows.ts +168 -168
  135. package/bone/output/session/src/health.ts +43 -43
  136. package/bone/output/session/src/index.ts +99 -99
  137. package/bone/output/session/src/logger.ts +67 -66
  138. package/bone/output/session/src/metrics.ts +75 -75
  139. package/bone/output/session/src/migrate.ts +331 -331
  140. package/bone/output/session/src/migration_diff.ts +108 -108
  141. package/bone/output/session/src/notify.ts +112 -112
  142. package/bone/output/session/src/routes/message.ts +93 -93
  143. package/bone/output/session/src/routes/part.ts +79 -79
  144. package/bone/output/session/src/routes/permission.ts +79 -79
  145. package/bone/output/session/src/routes/project.ts +79 -79
  146. package/bone/output/session/src/routes/session.ts +294 -294
  147. package/bone/output/session/src/schemas.ts +357 -357
  148. package/bone/output/session/src/state_machines/session.ts +23 -23
  149. package/bone/output/session/src/tests.ts +325 -325
  150. package/bone/output/session/src/websocket.ts +223 -200
  151. package/bone/output/session/tsconfig.json +24 -24
  152. package/bone/output/workspace/.dockerignore +7 -7
  153. package/bone/output/workspace/.env.example +36 -36
  154. package/bone/output/workspace/.github/workflows/ci.yaml +58 -58
  155. package/bone/output/workspace/Dockerfile +22 -22
  156. package/bone/output/workspace/README.md +45 -45
  157. package/bone/output/workspace/WorkspaceDomain.bone.map +188 -188
  158. package/bone/output/workspace/WorkspaceDomain.postman_collection.json +620 -620
  159. package/bone/output/workspace/admin/index.html +484 -484
  160. package/bone/output/workspace/docker-compose.yaml +22 -22
  161. package/bone/output/workspace/k8s/deployment.yaml +75 -75
  162. package/bone/output/workspace/migrations/audit_log.sql +18 -18
  163. package/bone/output/workspace/migrations/codebase.sql +34 -34
  164. package/bone/output/workspace/migrations/event_outbox.sql +31 -31
  165. package/bone/output/workspace/migrations/snapshot.sql +32 -32
  166. package/bone/output/workspace/migrations/workspace.sql +33 -33
  167. package/bone/output/workspace/openapi.yaml +721 -721
  168. package/bone/output/workspace/package.json +35 -35
  169. package/bone/output/workspace/schema.graphql +153 -153
  170. package/bone/output/workspace/sdk/client.ts +155 -155
  171. package/bone/output/workspace/src/algorithms.ts +2 -2
  172. package/bone/output/workspace/src/audit.ts +37 -37
  173. package/bone/output/workspace/src/auth.ts +57 -57
  174. package/bone/output/workspace/src/cron.ts +12 -12
  175. package/bone/output/workspace/src/db.ts +31 -31
  176. package/bone/output/workspace/src/debug.ts +66 -66
  177. package/bone/output/workspace/src/events.ts +243 -243
  178. package/bone/output/workspace/src/extensions.ts +44 -44
  179. package/bone/output/workspace/src/failure_rules.ts +152 -152
  180. package/bone/output/workspace/src/health.ts +43 -43
  181. package/bone/output/workspace/src/index.ts +88 -88
  182. package/bone/output/workspace/src/logger.ts +69 -66
  183. package/bone/output/workspace/src/metrics.ts +75 -75
  184. package/bone/output/workspace/src/migrate.ts +219 -219
  185. package/bone/output/workspace/src/migration_diff.ts +108 -108
  186. package/bone/output/workspace/src/notify.ts +73 -73
  187. package/bone/output/workspace/src/routes/codebase.ts +87 -87
  188. package/bone/output/workspace/src/routes/snapshot.ts +127 -127
  189. package/bone/output/workspace/src/routes/workspace.ts +190 -190
  190. package/bone/output/workspace/src/schemas.ts +231 -231
  191. package/bone/output/workspace/src/state_machines/codebase.ts +21 -21
  192. package/bone/output/workspace/src/state_machines/snapshot.ts +20 -20
  193. package/bone/output/workspace/src/state_machines/workspace.ts +21 -21
  194. package/bone/output/workspace/src/tests.ts +248 -248
  195. package/bone/output/workspace/tsconfig.json +24 -24
  196. package/compat/opencode_adapter.ts +94 -17
  197. package/package.json +15 -2
  198. package/src/cli.ts +66 -107
  199. package/src/db_adapter.ts +354 -0
  200. package/src/engine/account/account.sql.ts +39 -39
  201. package/src/engine/account/account.ts +456 -456
  202. package/src/engine/account/repo.ts +166 -166
  203. package/src/engine/account/schema.ts +99 -99
  204. package/src/engine/account/url.ts +8 -8
  205. package/src/engine/acp/README.md +174 -174
  206. package/src/engine/acp/agent.ts +1968 -1968
  207. package/src/engine/acp/runtime.ts +22 -22
  208. package/src/engine/acp/session.ts +122 -122
  209. package/src/engine/acp/types.ts +24 -24
  210. package/src/engine/agent/agent.ts +463 -463
  211. package/src/engine/agent/generate.txt +75 -75
  212. package/src/engine/agent/prompt/compaction.txt +9 -9
  213. package/src/engine/agent/prompt/explore.txt +18 -18
  214. package/src/engine/agent/prompt/scout.txt +36 -36
  215. package/src/engine/agent/prompt/summary.txt +11 -11
  216. package/src/engine/agent/prompt/title.txt +44 -44
  217. package/src/engine/agent/subagent-permissions.ts +34 -34
  218. package/src/engine/auth/index.ts +96 -96
  219. package/src/engine/background/background/job.ts +200 -200
  220. package/src/engine/background/job.ts +200 -200
  221. package/src/engine/bus/bus-event.ts +45 -45
  222. package/src/engine/bus/global.ts +22 -22
  223. package/src/engine/bus/index.ts +203 -203
  224. package/src/engine/command/command/index.ts +181 -181
  225. package/src/engine/command/command/template/initialize.txt +66 -66
  226. package/src/engine/command/command/template/review.txt +101 -101
  227. package/src/engine/command/index.ts +181 -181
  228. package/src/engine/command/template/initialize.txt +66 -66
  229. package/src/engine/command/template/review.txt +101 -101
  230. package/src/engine/config/agent.ts +172 -172
  231. package/src/engine/config/attachment.ts +25 -25
  232. package/src/engine/config/command.ts +62 -62
  233. package/src/engine/config/config.ts +833 -833
  234. package/src/engine/config/console-state.ts +14 -14
  235. package/src/engine/config/entry-name.ts +16 -16
  236. package/src/engine/config/error.ts +23 -23
  237. package/src/engine/config/formatter.ts +13 -13
  238. package/src/engine/config/layout.ts +6 -6
  239. package/src/engine/config/lsp.ts +43 -43
  240. package/src/engine/config/managed.ts +71 -71
  241. package/src/engine/config/markdown.ts +96 -96
  242. package/src/engine/config/mcp.ts +56 -56
  243. package/src/engine/config/model-id.ts +5 -5
  244. package/src/engine/config/parse.ts +79 -79
  245. package/src/engine/config/paths.ts +45 -45
  246. package/src/engine/config/permission.ts +58 -58
  247. package/src/engine/config/plugin.ts +84 -84
  248. package/src/engine/config/provider.ts +111 -111
  249. package/src/engine/config/reference.ts +23 -23
  250. package/src/engine/config/server.ts +19 -19
  251. package/src/engine/config/skills.ts +14 -14
  252. package/src/engine/config/variable.ts +90 -90
  253. package/src/engine/control-plane/adapters/index.ts +41 -41
  254. package/src/engine/control-plane/adapters/worktree.ts +96 -96
  255. package/src/engine/control-plane/dev/README.md +19 -19
  256. package/src/engine/control-plane/dev/debug-workspace-plugin.ts +73 -73
  257. package/src/engine/control-plane/schema.ts +14 -14
  258. package/src/engine/control-plane/types.ts +59 -59
  259. package/src/engine/control-plane/util.ts +39 -39
  260. package/src/engine/control-plane/workspace-adapter-runtime.ts +51 -51
  261. package/src/engine/control-plane/workspace-context.ts +26 -26
  262. package/src/engine/control-plane/workspace.sql.ts +20 -20
  263. package/src/engine/control-plane/workspace.ts +1072 -1072
  264. package/src/engine/data-migration.ts +161 -161
  265. package/src/engine/effect/app-runtime.ts +143 -143
  266. package/src/engine/effect/bootstrap-runtime.ts +29 -29
  267. package/src/engine/effect/bridge.ts +84 -84
  268. package/src/engine/effect/config-service.ts +67 -67
  269. package/src/engine/effect/instance-ref.ts +11 -11
  270. package/src/engine/effect/instance-registry.ts +12 -12
  271. package/src/engine/effect/instance-state.ts +72 -72
  272. package/src/engine/effect/promise.ts +17 -17
  273. package/src/engine/effect/run-service.ts +47 -47
  274. package/src/engine/effect/runner.ts +217 -217
  275. package/src/engine/effect/runtime-flags.ts +74 -74
  276. package/src/engine/effect/service-use.ts +38 -38
  277. package/src/engine/env/index.ts +37 -37
  278. package/src/engine/event-v2-bridge.ts +89 -89
  279. package/src/engine/file/file/ignore.ts +81 -81
  280. package/src/engine/file/file/index.ts +651 -651
  281. package/src/engine/file/file/protected.ts +59 -59
  282. package/src/engine/file/file/ripgrep.ts +481 -481
  283. package/src/engine/file/file/watcher.ts +167 -167
  284. package/src/engine/file/ignore.ts +81 -81
  285. package/src/engine/file/index.ts +651 -651
  286. package/src/engine/file/protected.ts +59 -59
  287. package/src/engine/file/ripgrep.ts +481 -481
  288. package/src/engine/file/watcher.ts +167 -167
  289. package/src/engine/format/format/formatter.ts +404 -404
  290. package/src/engine/format/format/index.ts +209 -209
  291. package/src/engine/format/formatter.ts +404 -404
  292. package/src/engine/format/index.ts +209 -209
  293. package/src/engine/git/git/index.ts +347 -347
  294. package/src/engine/git/index.ts +347 -347
  295. package/src/engine/id/id.ts +80 -80
  296. package/src/engine/ide/index.ts +70 -70
  297. package/src/engine/image/image/image.ts +176 -176
  298. package/src/engine/image/image.ts +176 -176
  299. package/src/engine/index.ts +251 -251
  300. package/src/engine/installation/index.ts +327 -327
  301. package/src/engine/lsp/client.ts +707 -707
  302. package/src/engine/lsp/diagnostic.ts +29 -29
  303. package/src/engine/lsp/language.ts +121 -121
  304. package/src/engine/lsp/launch.ts +21 -21
  305. package/src/engine/lsp/lsp/client.ts +707 -707
  306. package/src/engine/lsp/lsp/diagnostic.ts +29 -29
  307. package/src/engine/lsp/lsp/language.ts +121 -121
  308. package/src/engine/lsp/lsp/launch.ts +21 -21
  309. package/src/engine/lsp/lsp/lsp.ts +507 -507
  310. package/src/engine/lsp/lsp/server.ts +2064 -2064
  311. package/src/engine/lsp/lsp.ts +507 -507
  312. package/src/engine/lsp/server.ts +2064 -2064
  313. package/src/engine/mcp/auth.ts +146 -146
  314. package/src/engine/mcp/index.ts +958 -958
  315. package/src/engine/mcp/mcp/auth.ts +146 -146
  316. package/src/engine/mcp/mcp/index.ts +958 -958
  317. package/src/engine/mcp/mcp/oauth-callback.ts +232 -232
  318. package/src/engine/mcp/mcp/oauth-provider.ts +214 -214
  319. package/src/engine/mcp/oauth-callback.ts +232 -232
  320. package/src/engine/mcp/oauth-provider.ts +214 -214
  321. package/src/engine/node.ts +6 -6
  322. package/src/engine/patch/index.ts +689 -689
  323. package/src/engine/patch/patch/index.ts +689 -689
  324. package/src/engine/permission/arity.ts +163 -163
  325. package/src/engine/permission/evaluate.ts +15 -15
  326. package/src/engine/permission/index.ts +306 -306
  327. package/src/engine/permission/permission/arity.ts +163 -163
  328. package/src/engine/permission/permission/evaluate.ts +15 -15
  329. package/src/engine/permission/permission/index.ts +306 -306
  330. package/src/engine/permission/permission/schema.ts +13 -13
  331. package/src/engine/permission/schema.ts +13 -13
  332. package/src/engine/plugin/azure.ts +26 -26
  333. package/src/engine/plugin/cloudflare.ts +76 -76
  334. package/src/engine/plugin/codex.ts +622 -622
  335. package/src/engine/plugin/digitalocean.ts +411 -411
  336. package/src/engine/plugin/github-copilot/copilot.ts +394 -394
  337. package/src/engine/plugin/github-copilot/models.ts +196 -196
  338. package/src/engine/plugin/index.ts +295 -295
  339. package/src/engine/plugin/install.ts +439 -439
  340. package/src/engine/plugin/loader.ts +216 -216
  341. package/src/engine/plugin/meta.ts +188 -188
  342. package/src/engine/plugin/shared.ts +323 -323
  343. package/src/engine/project/bootstrap-service.ts +9 -9
  344. package/src/engine/project/bootstrap.ts +75 -75
  345. package/src/engine/project/instance-context.ts +24 -24
  346. package/src/engine/project/instance-layer.ts +11 -11
  347. package/src/engine/project/instance-runtime.ts +16 -16
  348. package/src/engine/project/instance-store.ts +193 -193
  349. package/src/engine/project/project.sql.ts +17 -17
  350. package/src/engine/project/project.ts +537 -537
  351. package/src/engine/project/schema.ts +13 -13
  352. package/src/engine/project/vcs.ts +405 -405
  353. package/src/engine/provider/auth.ts +225 -225
  354. package/src/engine/provider/error.ts +204 -204
  355. package/src/engine/provider/model-status.ts +8 -8
  356. package/src/engine/provider/provider.ts +1843 -1843
  357. package/src/engine/provider/schema.ts +30 -30
  358. package/src/engine/provider/transform.ts +1376 -1376
  359. package/src/engine/pty/index.ts +365 -365
  360. package/src/engine/pty/input.ts +24 -24
  361. package/src/engine/pty/pty/index.ts +365 -365
  362. package/src/engine/pty/pty/input.ts +24 -24
  363. package/src/engine/pty/pty/pty.bun.ts +26 -26
  364. package/src/engine/pty/pty/pty.node.ts +27 -27
  365. package/src/engine/pty/pty/pty.ts +25 -25
  366. package/src/engine/pty/pty/schema.ts +14 -14
  367. package/src/engine/pty/pty/ticket.ts +68 -68
  368. package/src/engine/pty/pty.bun.ts +26 -26
  369. package/src/engine/pty/pty.node.ts +27 -27
  370. package/src/engine/pty/pty.ts +25 -25
  371. package/src/engine/pty/schema.ts +14 -14
  372. package/src/engine/pty/ticket.ts +68 -68
  373. package/src/engine/question/index.ts +213 -213
  374. package/src/engine/question/question/index.ts +213 -213
  375. package/src/engine/question/question/schema.ts +10 -10
  376. package/src/engine/question/schema.ts +10 -10
  377. package/src/engine/reference/reference/reference.ts +241 -241
  378. package/src/engine/reference/reference/repository-cache.ts +147 -147
  379. package/src/engine/reference/reference.ts +241 -241
  380. package/src/engine/reference/repository-cache.ts +147 -147
  381. package/src/engine/session/compaction.ts +651 -651
  382. package/src/engine/session/instruction.ts +238 -238
  383. package/src/engine/session/llm.ts +459 -459
  384. package/src/engine/session/message-error.ts +14 -14
  385. package/src/engine/session/message-v2.ts +1202 -1202
  386. package/src/engine/session/message.ts +146 -146
  387. package/src/engine/session/overflow.ts +32 -32
  388. package/src/engine/session/processor.ts +823 -823
  389. package/src/engine/session/prompt/anthropic.txt +105 -105
  390. package/src/engine/session/prompt/beast.txt +147 -147
  391. package/src/engine/session/prompt/build-switch.txt +5 -5
  392. package/src/engine/session/prompt/codex.txt +79 -79
  393. package/src/engine/session/prompt/copilot-gpt-5.txt +143 -143
  394. package/src/engine/session/prompt/default.txt +105 -105
  395. package/src/engine/session/prompt/gemini.txt +155 -155
  396. package/src/engine/session/prompt/gpt.txt +107 -107
  397. package/src/engine/session/prompt/kimi.txt +95 -95
  398. package/src/engine/session/prompt/max-steps.txt +15 -15
  399. package/src/engine/session/prompt/plan-reminder-anthropic.txt +67 -67
  400. package/src/engine/session/prompt/plan.txt +26 -26
  401. package/src/engine/session/prompt/trinity.txt +97 -97
  402. package/src/engine/session/prompt.ts +66 -9
  403. package/src/engine/session/retry.ts +200 -200
  404. package/src/engine/session/revert.ts +162 -162
  405. package/src/engine/session/run-state.ts +153 -153
  406. package/src/engine/session/schema.ts +26 -26
  407. package/src/engine/session/session.sql.ts +137 -137
  408. package/src/engine/session/session.ts +1011 -1011
  409. package/src/engine/session/status.ts +94 -94
  410. package/src/engine/session/summary.ts +164 -164
  411. package/src/engine/session/system.ts +84 -84
  412. package/src/engine/session/todo.ts +81 -81
  413. package/src/engine/share/session.ts +61 -61
  414. package/src/engine/share/share-next.ts +376 -376
  415. package/src/engine/share/share.sql.ts +13 -13
  416. package/src/engine/shell/shell/shell.ts +215 -215
  417. package/src/engine/shell/shell.ts +215 -215
  418. package/src/engine/skill/discovery.ts +116 -116
  419. package/src/engine/skill/index.ts +336 -336
  420. package/src/engine/skill/prompt/customize-opencode.md +377 -377
  421. package/src/engine/skill/skill/discovery.ts +116 -116
  422. package/src/engine/skill/skill/index.ts +336 -336
  423. package/src/engine/skill/skill/prompt/customize-opencode.md +377 -377
  424. package/src/engine/snapshot/index.ts +762 -762
  425. package/src/engine/snapshot/snapshot/index.ts +762 -762
  426. package/src/engine/sync/README.md +179 -179
  427. package/src/engine/sync/event.sql.ts +17 -17
  428. package/src/engine/sync/index.ts +410 -410
  429. package/src/engine/sync/schema.ts +11 -11
  430. package/src/engine/temporary.ts +33 -33
  431. package/src/engine/tool/apply_patch.ts +313 -313
  432. package/src/engine/tool/apply_patch.txt +33 -33
  433. package/src/engine/tool/edit.ts +711 -711
  434. package/src/engine/tool/edit.txt +10 -10
  435. package/src/engine/tool/external-directory.ts +49 -49
  436. package/src/engine/tool/glob.ts +103 -103
  437. package/src/engine/tool/glob.txt +6 -6
  438. package/src/engine/tool/grep.ts +156 -156
  439. package/src/engine/tool/grep.txt +8 -8
  440. package/src/engine/tool/invalid.ts +21 -21
  441. package/src/engine/tool/json-schema.ts +164 -164
  442. package/src/engine/tool/lsp.ts +113 -113
  443. package/src/engine/tool/lsp.txt +24 -24
  444. package/src/engine/tool/mcp-websearch.ts +96 -96
  445. package/src/engine/tool/plan-enter.txt +14 -14
  446. package/src/engine/tool/plan-exit.txt +13 -13
  447. package/src/engine/tool/plan.ts +78 -78
  448. package/src/engine/tool/question.ts +44 -44
  449. package/src/engine/tool/question.txt +10 -10
  450. package/src/engine/tool/read.ts +337 -337
  451. package/src/engine/tool/read.txt +14 -14
  452. package/src/engine/tool/registry.ts +472 -472
  453. package/src/engine/tool/repo_clone.ts +80 -80
  454. package/src/engine/tool/repo_clone.txt +5 -5
  455. package/src/engine/tool/repo_overview.ts +279 -279
  456. package/src/engine/tool/repo_overview.txt +4 -4
  457. package/src/engine/tool/schema.ts +14 -14
  458. package/src/engine/tool/shell/id.ts +19 -19
  459. package/src/engine/tool/shell/prompt.ts +295 -295
  460. package/src/engine/tool/shell/shell.txt +77 -77
  461. package/src/engine/tool/shell.ts +647 -647
  462. package/src/engine/tool/skill.ts +75 -75
  463. package/src/engine/tool/skill.txt +5 -5
  464. package/src/engine/tool/task.ts +337 -337
  465. package/src/engine/tool/task.txt +58 -58
  466. package/src/engine/tool/task_status.ts +179 -179
  467. package/src/engine/tool/task_status.txt +13 -13
  468. package/src/engine/tool/todo.ts +57 -57
  469. package/src/engine/tool/todowrite.txt +167 -167
  470. package/src/engine/tool/tool/apply_patch.ts +313 -313
  471. package/src/engine/tool/tool/apply_patch.txt +33 -33
  472. package/src/engine/tool/tool/edit.ts +711 -711
  473. package/src/engine/tool/tool/edit.txt +10 -10
  474. package/src/engine/tool/tool/external-directory.ts +49 -49
  475. package/src/engine/tool/tool/glob.ts +103 -103
  476. package/src/engine/tool/tool/glob.txt +6 -6
  477. package/src/engine/tool/tool/grep.ts +156 -156
  478. package/src/engine/tool/tool/grep.txt +8 -8
  479. package/src/engine/tool/tool/invalid.ts +21 -21
  480. package/src/engine/tool/tool/json-schema.ts +164 -164
  481. package/src/engine/tool/tool/lsp.ts +113 -113
  482. package/src/engine/tool/tool/lsp.txt +24 -24
  483. package/src/engine/tool/tool/mcp-websearch.ts +96 -96
  484. package/src/engine/tool/tool/plan-enter.txt +14 -14
  485. package/src/engine/tool/tool/plan-exit.txt +13 -13
  486. package/src/engine/tool/tool/plan.ts +78 -78
  487. package/src/engine/tool/tool/question.ts +44 -44
  488. package/src/engine/tool/tool/question.txt +10 -10
  489. package/src/engine/tool/tool/read.ts +337 -337
  490. package/src/engine/tool/tool/read.txt +14 -14
  491. package/src/engine/tool/tool/registry.ts +472 -472
  492. package/src/engine/tool/tool/repo_clone.ts +80 -80
  493. package/src/engine/tool/tool/repo_clone.txt +5 -5
  494. package/src/engine/tool/tool/repo_overview.ts +279 -279
  495. package/src/engine/tool/tool/repo_overview.txt +4 -4
  496. package/src/engine/tool/tool/schema.ts +14 -14
  497. package/src/engine/tool/tool/shell/id.ts +19 -19
  498. package/src/engine/tool/tool/shell/prompt.ts +295 -295
  499. package/src/engine/tool/tool/shell/shell.txt +77 -77
  500. package/src/engine/tool/tool/shell.ts +647 -647
  501. package/src/engine/tool/tool/skill.ts +75 -75
  502. package/src/engine/tool/tool/skill.txt +5 -5
  503. package/src/engine/tool/tool/task.ts +337 -337
  504. package/src/engine/tool/tool/task.txt +58 -58
  505. package/src/engine/tool/tool/task_status.ts +179 -179
  506. package/src/engine/tool/tool/task_status.txt +13 -13
  507. package/src/engine/tool/tool/todo.ts +57 -57
  508. package/src/engine/tool/tool/todowrite.txt +167 -167
  509. package/src/engine/tool/tool/tool.ts +164 -164
  510. package/src/engine/tool/tool/truncate.ts +160 -160
  511. package/src/engine/tool/tool/truncation-dir.ts +4 -4
  512. package/src/engine/tool/tool/webfetch.ts +192 -192
  513. package/src/engine/tool/tool/webfetch.txt +13 -13
  514. package/src/engine/tool/tool/websearch.ts +143 -143
  515. package/src/engine/tool/tool/websearch.txt +14 -14
  516. package/src/engine/tool/tool/write.ts +104 -104
  517. package/src/engine/tool/tool/write.txt +8 -8
  518. package/src/engine/tool/tool.ts +164 -164
  519. package/src/engine/tool/truncate.ts +160 -160
  520. package/src/engine/tool/truncation-dir.ts +4 -4
  521. package/src/engine/tool/webfetch.ts +192 -192
  522. package/src/engine/tool/webfetch.txt +13 -13
  523. package/src/engine/tool/websearch.ts +143 -143
  524. package/src/engine/tool/websearch.txt +14 -14
  525. package/src/engine/tool/write.ts +104 -104
  526. package/src/engine/tool/write.txt +8 -8
  527. package/src/engine/util/archive.ts +17 -17
  528. package/src/engine/util/bom.ts +31 -31
  529. package/src/engine/util/data-url.ts +9 -9
  530. package/src/engine/util/defer.ts +10 -10
  531. package/src/engine/util/effect-http-client.ts +11 -11
  532. package/src/engine/util/error.ts +88 -88
  533. package/src/engine/util/filesystem.ts +252 -252
  534. package/src/engine/util/format.ts +20 -20
  535. package/src/engine/util/iife.ts +3 -3
  536. package/src/engine/util/lazy.ts +20 -20
  537. package/src/engine/util/local-context.ts +25 -25
  538. package/src/engine/util/locale.ts +86 -86
  539. package/src/engine/util/media.ts +26 -26
  540. package/src/engine/util/process.ts +176 -176
  541. package/src/engine/util/queue.ts +32 -32
  542. package/src/engine/util/record.ts +3 -3
  543. package/src/engine/util/repository.ts +158 -158
  544. package/src/engine/util/rpc.ts +66 -66
  545. package/src/engine/util/signal.ts +12 -12
  546. package/src/engine/util/timeout.ts +13 -13
  547. package/src/engine/util/token.ts +7 -7
  548. package/src/engine/util/util/archive.ts +17 -17
  549. package/src/engine/util/util/bom.ts +31 -31
  550. package/src/engine/util/util/data-url.ts +9 -9
  551. package/src/engine/util/util/defer.ts +10 -10
  552. package/src/engine/util/util/effect-http-client.ts +11 -11
  553. package/src/engine/util/util/error.ts +88 -88
  554. package/src/engine/util/util/filesystem.ts +252 -252
  555. package/src/engine/util/util/format.ts +20 -20
  556. package/src/engine/util/util/iife.ts +3 -3
  557. package/src/engine/util/util/lazy.ts +20 -20
  558. package/src/engine/util/util/local-context.ts +25 -25
  559. package/src/engine/util/util/locale.ts +86 -86
  560. package/src/engine/util/util/media.ts +26 -26
  561. package/src/engine/util/util/process.ts +176 -176
  562. package/src/engine/util/util/queue.ts +32 -32
  563. package/src/engine/util/util/record.ts +3 -3
  564. package/src/engine/util/util/repository.ts +158 -158
  565. package/src/engine/util/util/rpc.ts +66 -66
  566. package/src/engine/util/util/signal.ts +12 -12
  567. package/src/engine/util/util/timeout.ts +13 -13
  568. package/src/engine/util/util/token.ts +7 -7
  569. package/src/engine/util/util/which.ts +14 -14
  570. package/src/engine/util/util/wildcard.ts +59 -59
  571. package/src/engine/util/which.ts +14 -14
  572. package/src/engine/util/wildcard.ts +59 -59
  573. package/src/engine/worktree/index.ts +621 -621
  574. package/src/server.ts +121 -158
  575. package/src/tui.ts +485 -502
@@ -25,6 +25,7 @@ import { Router, Request, Response } from "express";
25
25
  import { pool } from "../bone/output/session/src/db";
26
26
  import { eventBus } from "../bone/output/session/src/events";
27
27
  import { requireAuth } from "../bone/output/session/src/auth";
28
+ import { subscribeToChannel, unsubscribeFromChannel } from "../bone/output/session/src/websocket";
28
29
  import { v4 as uuid } from "uuid";
29
30
 
30
31
  export const compatRouter = Router();
@@ -160,34 +161,50 @@ compatRouter.post("/v2/session/:id/prompt", requireAuth, async (req: Request, re
160
161
  [session_id]
161
162
  );
162
163
 
163
- // Emit session.updated event to SSE subscribers
164
164
  sendSSE(res, "session.updated", { type: "session.updated", properties: { id: session_id } });
165
165
  sendSSE(res, "message.updated", { type: "message.updated", properties: { id: message_id, sessionID: session_id } });
166
166
 
167
- // Subscribe to part updates for this session (live streaming)
168
- const unsubscribe = subscribeToSessionEvents(session_id, (event) => {
167
+ // Subscribe to part_stream BEFORE starting the agent so we don't miss any deltas.
168
+ // The agent loop calls broadcastToChannel("part_stream", {type:"part.delta",...})
169
+ // synchronously during streaming — this handler forwards them straight to SSE.
170
+ const channelHandler = (msg: any) => {
171
+ if (msg.session_id !== session_id) return;
172
+ if (msg.type === "part.delta") {
173
+ sendSSE(res, "part.delta", {
174
+ type: "part.delta",
175
+ delta: msg.delta,
176
+ partID: msg.part_id,
177
+ messageID: msg.message_id,
178
+ });
179
+ }
180
+ };
181
+ subscribeToChannel("part_stream", channelHandler);
182
+
183
+ // Subscribe to eventBus for tool calls and agent state changes
184
+ const unsubscribeEvents = subscribeToSessionEvents(session_id, (event) => {
169
185
  sendSSE(res, event.type, event.data);
170
186
  });
171
187
 
172
- // Start the agent turn (async results come via events)
188
+ const cleanup = () => {
189
+ unsubscribeFromChannel("part_stream", channelHandler);
190
+ unsubscribeEvents();
191
+ };
192
+
193
+ req.on("close", cleanup);
194
+
195
+ // Start agent — runs async, deltas flow via channelHandler above
173
196
  startAgentTurn(session_id, message_id, modelID, providerID)
174
197
  .then(() => {
175
198
  sendSSE(res, "session.updated", { type: "session.updated", properties: { id: session_id } });
176
199
  res.end();
177
200
  })
178
201
  .catch((e) => {
179
- console.error("[AgentLoop] Error:", e.message, e.stack?.split("\n").slice(0,5).join(" | "));
202
+ console.error("[AgentLoop] Error:", e.message);
180
203
  sendSSE(res, "error", { type: "error", properties: { message: e.message } });
181
204
  res.end();
182
205
  })
183
- .finally(() => {
184
- unsubscribe();
185
- });
206
+ .finally(cleanup);
186
207
 
187
- // Handle client disconnect
188
- req.on("close", () => {
189
- unsubscribe();
190
- });
191
208
  } catch (e: any) {
192
209
  sendSSE(res, "error", { type: "error", properties: { message: e.message } });
193
210
  res.end();
@@ -248,11 +265,71 @@ compatRouter.get("/v2/event", (req: Request, res: Response) => {
248
265
  // GET /v2/provider — list available providers
249
266
  compatRouter.get("/v2/provider", (_req: Request, res: Response) => {
250
267
  res.json([
251
- { id: "anthropic", name: "Anthropic", models: ["claude-opus-4-5", "claude-sonnet-4-5", "claude-haiku-3-5"] },
252
- { id: "openai", name: "OpenAI", models: ["gpt-4o", "gpt-4o-mini", "o1", "o3-mini"] },
253
- { id: "google", name: "Google", models: ["gemini-2.0-flash", "gemini-1.5-pro"] },
254
- { id: "ollama", name: "Ollama (local)", models: [] },
255
- { id: "openrouter", name: "OpenRouter", models: [] },
268
+ {
269
+ id: "anthropic", name: "Anthropic",
270
+ models: ["claude-opus-4-5", "claude-sonnet-4-5", "claude-haiku-3-5"],
271
+ keyEnv: "ANTHROPIC_API_KEY", url: "https://console.anthropic.com/",
272
+ },
273
+ {
274
+ id: "openai", name: "OpenAI",
275
+ models: ["gpt-4o", "gpt-4o-mini", "o3-mini", "o4-mini"],
276
+ keyEnv: "OPENAI_API_KEY", url: "https://platform.openai.com/api-keys",
277
+ },
278
+ {
279
+ id: "google", name: "Google Gemini",
280
+ models: ["gemini-2.0-flash", "gemini-2.5-pro", "gemini-1.5-flash"],
281
+ keyEnv: "GOOGLE_API_KEY", url: "https://aistudio.google.com/apikey",
282
+ free: true, freeNote: "Free tier available via Google AI Studio",
283
+ },
284
+ {
285
+ id: "groq", name: "Groq",
286
+ models: ["llama-3.3-70b-versatile", "llama-3.1-8b-instant", "mixtral-8x7b-32768", "gemma2-9b-it"],
287
+ keyEnv: "GROQ_API_KEY", url: "https://console.groq.com/keys",
288
+ free: true, freeNote: "Generous free tier — very fast inference",
289
+ },
290
+ {
291
+ id: "cerebras", name: "Cerebras",
292
+ models: ["llama3.1-8b", "llama3.1-70b", "llama-4-scout-17b-16e-instruct"],
293
+ keyEnv: "CEREBRAS_API_KEY", url: "https://cloud.cerebras.ai/",
294
+ free: true, freeNote: "Free tier — fastest inference available",
295
+ },
296
+ {
297
+ id: "deepseek", name: "DeepSeek",
298
+ models: ["deepseek-chat", "deepseek-reasoner"],
299
+ keyEnv: "DEEPSEEK_API_KEY", url: "https://platform.deepseek.com/api_keys",
300
+ free: false, freeNote: "Paid API but very cheap (~$0.07/1M tokens). Free access via OpenRouter: deepseek/deepseek-chat-v3-0324:free — or via opencode.ai/go (OpenCode's own hosted service)",
301
+ },
302
+ {
303
+ id: "openrouter", name: "OpenRouter",
304
+ models: [
305
+ "deepseek/deepseek-chat-v3-0324:free",
306
+ "deepseek/deepseek-r1:free",
307
+ "meta-llama/llama-3.3-70b-instruct:free",
308
+ "google/gemma-3-27b-it:free",
309
+ "mistralai/mistral-7b-instruct:free",
310
+ ],
311
+ keyEnv: "OPENROUTER_API_KEY", url: "https://openrouter.ai/keys",
312
+ free: true, freeNote: "Free models available — append :free to any model ID. DeepSeek V3 and R1 are free here",
313
+ },
314
+ {
315
+ id: "ollama", name: "Ollama (local)",
316
+ models: [],
317
+ keyEnv: null, url: "https://ollama.com/",
318
+ free: true, freeNote: "Fully local — no API key needed",
319
+ },
320
+ {
321
+ id: "openai_compatible", name: "OpenAI-compatible (LM Studio, vLLM, etc.)",
322
+ models: [],
323
+ keyEnv: "OPENAI_API_KEY", url: "https://lmstudio.ai/",
324
+ free: true, freeNote: "Local models via any OpenAI-compatible endpoint",
325
+ },
326
+ {
327
+ id: "local", name: "Local config (.env)",
328
+ models: [process.env.DEFAULT_MODEL || ""].filter(Boolean),
329
+ keyEnv: null, url: null,
330
+ free: true,
331
+ freeNote: `Uses DEFAULT_PROVIDER=${process.env.DEFAULT_PROVIDER || "openai_compatible"} and DEFAULT_MODEL=${process.env.DEFAULT_MODEL || "(not set)"} from your .env`,
332
+ },
256
333
  ]);
257
334
  });
258
335
 
package/package.json CHANGED
@@ -1,9 +1,17 @@
1
1
  {
2
2
  "name": "bonecode",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "private": false,
5
5
  "description": "BoneCode — a production-grade AI coding agent with BoneScript-generated backend and pgvector RAG",
6
- "keywords": ["ai", "coding-agent", "llm", "rag", "pgvector", "opencode", "bonescript"],
6
+ "keywords": [
7
+ "ai",
8
+ "coding-agent",
9
+ "llm",
10
+ "rag",
11
+ "pgvector",
12
+ "opencode",
13
+ "bonescript"
14
+ ],
7
15
  "author": "BoneCode Contributors",
8
16
  "license": "MIT",
9
17
  "homepage": "https://github.com/Doorman11991/bonecode",
@@ -38,10 +46,15 @@
38
46
  },
39
47
  "dependencies": {
40
48
  "@ai-sdk/anthropic": "1.2.12",
49
+ "@ai-sdk/cerebras": "^2.0.51",
41
50
  "@ai-sdk/google": "1.2.18",
51
+ "@ai-sdk/groq": "^3.0.39",
42
52
  "@ai-sdk/openai": "1.3.22",
43
53
  "@modelcontextprotocol/sdk": "1.10.2",
54
+ "@openrouter/ai-sdk-provider": "^2.9.0",
55
+ "@types/better-sqlite3": "^7.6.13",
44
56
  "ai": "4.3.16",
57
+ "better-sqlite3": "^12.10.0",
45
58
  "cors": "2.8.5",
46
59
  "dotenv": "16.3.1",
47
60
  "express": "4.18.2",
package/src/cli.ts CHANGED
@@ -17,8 +17,7 @@ import "dotenv/config";
17
17
  import * as path from "path";
18
18
  import * as fs from "fs";
19
19
  import * as http from "http";
20
- import * as os from "os";
21
- import { spawn, execSync } from "child_process";
20
+ import { execSync } from "child_process";
22
21
 
23
22
  const PKG_ROOT = path.resolve(__dirname, "..");
24
23
 
@@ -113,97 +112,33 @@ function checkServer(port: number): Promise<boolean> {
113
112
  });
114
113
  }
115
114
 
116
- // ─── Start server ─────────────────────────────────────────────────────────────
117
-
118
- function startServer(port: number, detached = false): Promise<void> {
119
- return new Promise((resolve, reject) => {
120
- const serverScript = path.join(PKG_ROOT, "src", "server.ts");
121
- const tsNode = path.join(PKG_ROOT, "node_modules", ".bin", "ts-node");
122
-
123
- const child = spawn(
124
- fs.existsSync(tsNode) ? tsNode : "ts-node",
125
- ["--project", path.join(PKG_ROOT, "tsconfig.json"), serverScript],
126
- {
127
- cwd: process.cwd(),
128
- env: { ...process.env, PORT: String(port) },
129
- stdio: detached ? "ignore" : ["ignore", "pipe", "pipe"],
130
- detached,
131
- }
132
- );
133
-
134
- if (detached) {
135
- child.unref();
136
- // Wait for server to be ready
137
- let attempts = 0;
138
- const poll = setInterval(async () => {
139
- attempts++;
140
- if (await checkServer(port)) {
141
- clearInterval(poll);
142
- resolve();
143
- } else if (attempts > 30) {
144
- clearInterval(poll);
145
- reject(new Error("Server failed to start within 30 seconds"));
146
- }
147
- }, 1000);
148
- return;
149
- }
150
-
151
- // Pipe server output
152
- child.stdout?.on("data", (d: Buffer) => process.stdout.write(d));
153
- child.stderr?.on("data", (d: Buffer) => process.stderr.write(d));
154
-
155
- child.on("error", reject);
156
- child.on("exit", (code) => {
157
- if (code !== 0) reject(new Error(`Server exited with code ${code}`));
158
- });
159
-
160
- // Resolve once server is ready
161
- let ready = false;
162
- child.stdout?.on("data", (d: Buffer) => {
163
- if (!ready && d.toString().includes("Server running on port")) {
164
- ready = true;
165
- resolve();
166
- }
167
- });
168
- });
169
- }
115
+ // ─── Ensure server is running (in-process) ───────────────────────────────────
170
116
 
171
- // ─── Ensure server is running ─────────────────────────────────────────────────
117
+ let serverStarted = false;
172
118
 
173
119
  async function ensureServer(port: number): Promise<void> {
174
120
  if (await checkServer(port)) return;
175
-
176
- process.stdout.write(`${c.dim}Starting BoneCode server on port ${port}...${c.reset} `);
177
- try {
178
- await startServer(port, true);
179
- console.log(`${c.green}ready${c.reset}`);
180
- } catch (e: any) {
181
- console.log(`${c.red}failed${c.reset}`);
182
- throw e;
121
+ if (serverStarted) return; // already starting
122
+ serverStarted = true;
123
+ await import("./server");
124
+ let attempts = 0;
125
+ while (attempts < 30) {
126
+ if (await checkServer(port)) return;
127
+ await new Promise(r => setTimeout(r, 500));
128
+ attempts++;
183
129
  }
130
+ throw new Error("Server failed to start");
184
131
  }
185
132
 
186
133
  // ─── Commands ─────────────────────────────────────────────────────────────────
187
134
 
188
135
  async function cmdServe(args: string[]) {
189
136
  const port = parseInt(args.find(a => a.startsWith("--port="))?.split("=")[1] || process.env.PORT || "3000");
190
- console.log(`${c.cyan}${c.bold}BoneCode${c.reset} server starting on port ${port}...`);
191
- console.log(`${c.dim} API: http://localhost:${port}/v2/session${c.reset}`);
192
- console.log(`${c.dim} Health: http://localhost:${port}/health${c.reset}`);
193
- console.log(`${c.dim} WebSocket: ws://localhost:${port}/ws${c.reset}`);
194
- console.log(`${c.dim} Press Ctrl+C to stop${c.reset}\n`);
195
-
196
- // Run server in foreground (blocking)
197
- const serverScript = path.join(PKG_ROOT, "src", "server.ts");
198
- const tsNode = path.join(PKG_ROOT, "node_modules", ".bin", "ts-node");
199
- const child = spawn(
200
- fs.existsSync(tsNode) ? tsNode : "ts-node",
201
- ["--project", path.join(PKG_ROOT, "tsconfig.json"), serverScript],
202
- { cwd: process.cwd(), env: { ...process.env, PORT: String(port) }, stdio: "inherit" }
203
- );
204
- child.on("exit", (code) => process.exit(code ?? 0));
205
- process.on("SIGINT", () => child.kill("SIGINT"));
206
- process.on("SIGTERM", () => child.kill("SIGTERM"));
137
+ process.env.PORT = String(port);
138
+ console.log(`${c.cyan}${c.bold}BoneCode${c.reset} server on port ${port} — press Ctrl+C to stop\n`);
139
+ // Start in-process and block forever (until SIGINT/SIGTERM)
140
+ await import("./server");
141
+ await new Promise<void>(() => {}); // keep alive
207
142
  }
208
143
 
209
144
  async function cmdRun(args: string[]) {
@@ -275,6 +210,7 @@ async function cmdRun(args: string[]) {
275
210
  const token = jwtLib.sign({ sub: "tui-user" }, secret, { expiresIn: "24h" });
276
211
 
277
212
  const { startInteractiveTUI } = await import("./tui");
213
+ process.env.BONECODE_TUI = "1";
278
214
  await startInteractiveTUI({ port, token, model: model!, provider, worktree: dir });
279
215
  return;
280
216
  }
@@ -344,20 +280,6 @@ async function streamPrompt(
344
280
  }
345
281
 
346
282
  if (inAssistantTurn) process.stdout.write("\n\n");
347
-
348
- // Fetch and display the final stored response
349
- const msgsR = await fetch(`${baseUrl}/v2/session/${sessionId}/message`, { headers });
350
- const msgs = await msgsR.json() as any[];
351
- const lastAssistant = msgs.filter((m: any) => m.role === "assistant").slice(-1)[0];
352
- if (lastAssistant && !inAssistantTurn) {
353
- const text = (lastAssistant.parts || [])
354
- .filter((p: any) => p.type === "text")
355
- .map((p: any) => p.data?.text || p.text || "")
356
- .join("");
357
- if (text.trim()) {
358
- console.log(`${c.cyan}${c.bold}●${c.reset} ${text.trim()}\n`);
359
- }
360
- }
361
283
  }
362
284
 
363
285
  async function cmdStatus(args: string[]) {
@@ -397,34 +319,71 @@ async function cmdMigrate() {
397
319
  }
398
320
 
399
321
  async function cmdDefault() {
400
- // Default: start server (if not running) then launch the interactive TUI
401
322
  const port = parseInt(process.env.PORT || "3000");
402
323
  const model = process.env.DEFAULT_MODEL || "local-model";
403
324
  const provider = process.env.DEFAULT_PROVIDER || "openai_compatible";
404
325
  const worktree = process.cwd();
405
326
 
406
- // Generate JWT for API calls
407
327
  const jwtLib = require("jsonwebtoken");
408
328
  const secret = process.env.JWT_SECRET || "bonecode-dev-secret-do-not-use-in-production-at-all-ever";
409
329
  const token = jwtLib.sign({ sub: "tui-user" }, secret, { expiresIn: "24h" });
410
330
 
411
- // Start server in background if not already running
412
- const running = await checkServer(port);
413
- if (!running) {
414
- process.stdout.write(`${c.dim}Starting BoneCode server on port ${port}...${c.reset} `);
331
+ // If server is already running externally (e.g. bonecode serve), just attach
332
+ const alreadyRunning = await checkServer(port);
333
+
334
+ if (!alreadyRunning) {
335
+ // Start the server IN-PROCESS — same Node.js instance as the CLI.
336
+ // This means the server dies automatically when the TUI exits.
337
+ // Suppress server startup logs in default (TUI) mode.
338
+ const origWrite = process.stdout.write.bind(process.stdout);
339
+ const origErr = process.stderr.write.bind(process.stderr);
340
+ let startupDone = false;
341
+ const suppress = (chunk: any) => {
342
+ if (startupDone) return false; // let it through after startup
343
+ const s = chunk.toString();
344
+ // Only suppress JSON log lines and the server banner
345
+ if (s.startsWith("{") || s.startsWith("[BoneCode]") || s.startsWith(" OpenCode") ||
346
+ s.startsWith(" Health") || s.startsWith(" Domain") || s.startsWith(" WebSocket")) {
347
+ return true;
348
+ }
349
+ return false;
350
+ };
351
+ (process.stdout as any).write = (chunk: any, ...args: any[]) =>
352
+ suppress(chunk) ? true : origWrite(chunk, ...args);
353
+ (process.stderr as any).write = (chunk: any, ...args: any[]) =>
354
+ suppress(chunk) ? true : origErr(chunk, ...args);
355
+
415
356
  try {
416
- await startServer(port, true);
417
- console.log(`${c.green}ready${c.reset}`);
357
+ process.stdout.write(`${c.dim}Starting BoneCode...${c.reset}\n`);
358
+ await import("./server");
359
+ let attempts = 0;
360
+ while (attempts < 30) {
361
+ if (await checkServer(port)) break;
362
+ await new Promise(r => setTimeout(r, 500));
363
+ attempts++;
364
+ }
365
+ if (!(await checkServer(port))) throw new Error("Server failed to start");
418
366
  } catch (e: any) {
419
- console.error(`\n${c.red}Failed to start server:${c.reset} ${e.message}`);
420
- console.error(`${c.dim}Try: bonecode serve${c.reset}`);
367
+ // Restore stdout before printing error
368
+ (process.stdout as any).write = origWrite;
369
+ (process.stderr as any).write = origErr;
370
+ console.error(`${c.red}Failed to start server:${c.reset} ${e.message}`);
421
371
  process.exit(1);
422
372
  }
373
+
374
+ // Restore stdout now that startup is done
375
+ startupDone = true;
376
+ (process.stdout as any).write = origWrite;
377
+ (process.stderr as any).write = origErr;
423
378
  }
424
379
 
425
- // Launch the interactive TUI
380
+ // Launch TUI process stays alive until user exits
381
+ process.env.BONECODE_TUI = "1";
426
382
  const { startInteractiveTUI } = await import("./tui");
427
383
  await startInteractiveTUI({ port, token, model, provider, worktree });
384
+
385
+ // TUI exited — kill the process (takes the in-process server with it)
386
+ process.exit(0);
428
387
  }
429
388
 
430
389
  // ─── Main ─────────────────────────────────────────────────────────────────────