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,161 @@
1
+ import { Context, Effect, Layer } from "effect"
2
+ import { Database } from "./storage/db"
3
+ import { DataMigrationTable } from "./data-migration.sql"
4
+ import * as Log from "@opencode-ai/core/util/log"
5
+ import { and, asc, eq, gt, inArray, sql } from "drizzle-orm"
6
+ import { MessageTable, SessionTable } from "./session/session.sql"
7
+ import type { SessionID } from "./session/schema"
8
+
9
+ export type Migration<R = never> = {
10
+ name: string
11
+ run: Effect.Effect<void, unknown, R>
12
+ }
13
+
14
+ const log = Log.create({ service: "data-migration" })
15
+
16
+ export interface Interface {}
17
+
18
+ export class Service extends Context.Service<Service, Interface>()("@opencode/DataMigration") {}
19
+
20
+ export const layer = Layer.effect(
21
+ Service,
22
+ Effect.gen(function* () {
23
+ const migrations: Migration[] = [
24
+ {
25
+ name: "session_usage_from_messages",
26
+ run: Effect.gen(function* () {
27
+ type Usage = {
28
+ cost: number
29
+ tokens: { input: number; output: number; reasoning: number; cache: { read: number; write: number } }
30
+ }
31
+
32
+ for (let cursor: SessionID | undefined, page = 1; ; page++) {
33
+ const next = yield* Effect.gen(function* () {
34
+ const sessions = yield* Effect.sync(() =>
35
+ Database.use((db) =>
36
+ db
37
+ .select({ id: SessionTable.id })
38
+ .from(SessionTable)
39
+ .where(cursor ? gt(SessionTable.id, cursor) : undefined)
40
+ .orderBy(asc(SessionTable.id))
41
+ .limit(100)
42
+ .all(),
43
+ ),
44
+ )
45
+ if (sessions.length === 0) return
46
+
47
+ yield* Effect.sync(() =>
48
+ Database.transaction((db) => {
49
+ const usageBySession = new Map<SessionID, Usage>(
50
+ sessions.map((session) => [
51
+ session.id,
52
+ { cost: 0, tokens: { input: 0, output: 0, reasoning: 0, cache: { read: 0, write: 0 } } },
53
+ ]),
54
+ )
55
+
56
+ for (const row of db
57
+ .select({
58
+ session_id: MessageTable.session_id,
59
+ cost: sql<number>`coalesce(sum(coalesce(json_extract(${MessageTable.data}, '$.cost'), 0)), 0)`,
60
+ tokens_input: sql<number>`coalesce(sum(coalesce(json_extract(${MessageTable.data}, '$.tokens.input'), 0)), 0)`,
61
+ tokens_output: sql<number>`coalesce(sum(coalesce(json_extract(${MessageTable.data}, '$.tokens.output'), 0)), 0)`,
62
+ tokens_reasoning: sql<number>`coalesce(sum(coalesce(json_extract(${MessageTable.data}, '$.tokens.reasoning'), 0)), 0)`,
63
+ tokens_cache_read: sql<number>`coalesce(sum(coalesce(json_extract(${MessageTable.data}, '$.tokens.cache.read'), 0)), 0)`,
64
+ tokens_cache_write: sql<number>`coalesce(sum(coalesce(json_extract(${MessageTable.data}, '$.tokens.cache.write'), 0)), 0)`,
65
+ })
66
+ .from(MessageTable)
67
+ .where(
68
+ and(
69
+ inArray(
70
+ MessageTable.session_id,
71
+ sessions.map((session) => session.id),
72
+ ),
73
+ sql`json_extract(${MessageTable.data}, '$.role') = 'assistant'`,
74
+ ),
75
+ )
76
+ .groupBy(MessageTable.session_id)
77
+ .all()) {
78
+ const current = usageBySession.get(row.session_id)
79
+ if (!current) continue
80
+ current.cost = row.cost
81
+ current.tokens.input = row.tokens_input
82
+ current.tokens.output = row.tokens_output
83
+ current.tokens.reasoning = row.tokens_reasoning
84
+ current.tokens.cache.read = row.tokens_cache_read
85
+ current.tokens.cache.write = row.tokens_cache_write
86
+ }
87
+
88
+ for (const [sessionID, value] of usageBySession) {
89
+ db.update(SessionTable)
90
+ .set({
91
+ cost: value.cost,
92
+ tokens_input: value.tokens.input,
93
+ tokens_output: value.tokens.output,
94
+ tokens_reasoning: value.tokens.reasoning,
95
+ tokens_cache_read: value.tokens.cache.read,
96
+ tokens_cache_write: value.tokens.cache.write,
97
+ time_updated: sql`${SessionTable.time_updated}`,
98
+ })
99
+ .where(eq(SessionTable.id, sessionID))
100
+ .run()
101
+ }
102
+ }),
103
+ )
104
+
105
+ return sessions.at(-1)?.id
106
+ }).pipe(
107
+ Effect.withSpan("DataMigration.sessionUsage.page", {
108
+ attributes: {
109
+ "data_migration.name": "session_usage_from_messages",
110
+ "data_migration.page": page,
111
+ "data_migration.cursor": cursor ?? "",
112
+ },
113
+ }),
114
+ )
115
+ if (!next) return
116
+ cursor = next
117
+ yield* Effect.sleep("10 millis")
118
+ }
119
+ }),
120
+ },
121
+ ]
122
+
123
+ yield* Effect.gen(function* () {
124
+ if (migrations.length === 0) return
125
+
126
+ // Migrations run in a background fiber, so they must be resumable until
127
+ // their completion row is written.
128
+ for (const migration of migrations) {
129
+ const completed = Database.use((db) =>
130
+ db
131
+ .select({ name: DataMigrationTable.name })
132
+ .from(DataMigrationTable)
133
+ .where(eq(DataMigrationTable.name, migration.name))
134
+ .get(),
135
+ )
136
+ if (completed) continue
137
+
138
+ log.info("running data migration", { name: migration.name })
139
+ yield* migration.run.pipe(Effect.withSpan("DataMigration", { attributes: { name: migration.name } }))
140
+ Database.use((db) =>
141
+ db
142
+ .insert(DataMigrationTable)
143
+ .values({ name: migration.name, time_completed: Date.now() })
144
+ .onConflictDoNothing()
145
+ .run(),
146
+ )
147
+ }
148
+ }).pipe(
149
+ Effect.tapCause((cause) =>
150
+ Effect.logError("failed to run data migrations").pipe(Effect.annotateLogs("cause", cause)),
151
+ ),
152
+ Effect.ignore,
153
+ Effect.forkScoped,
154
+ )
155
+ return Service.of({})
156
+ }),
157
+ )
158
+
159
+ export const defaultLayer = layer
160
+
161
+ export * as DataMigration from "./data-migration"
@@ -0,0 +1,143 @@
1
+ import { Layer, ManagedRuntime } from "effect"
2
+ import { attach } from "./run-service"
3
+ import * as Observability from "@opencode-ai/core/effect/observability"
4
+
5
+ import { AppFileSystem } from "@opencode-ai/core/filesystem"
6
+ import { Bus } from "@/bus"
7
+ import { Auth } from "@/auth"
8
+ import { Account } from "@/account/account"
9
+ import { Config } from "@/config/config"
10
+ import { Git } from "@/git"
11
+ import { Ripgrep } from "@/file/ripgrep"
12
+ import { File } from "@/file"
13
+ import { FileWatcher } from "@/file/watcher"
14
+ import { Storage } from "@/storage/storage"
15
+ import { Snapshot } from "@/snapshot"
16
+ import { Plugin } from "@/plugin"
17
+ import { ModelsDev } from "@opencode-ai/core/models"
18
+ import { Provider } from "@/provider/provider"
19
+ import { ProviderAuth } from "@/provider/auth"
20
+ import { Agent } from "@/agent/agent"
21
+ import { Skill } from "@/skill"
22
+ import { Discovery } from "@/skill/discovery"
23
+ import { Question } from "@/question"
24
+ import { Permission } from "@/permission"
25
+ import { Todo } from "@/session/todo"
26
+ import { Session } from "@/session/session"
27
+ import { SessionStatus } from "@/session/status"
28
+ import { SessionRunState } from "@/session/run-state"
29
+ import { SessionProcessor } from "@/session/processor"
30
+ import { SessionCompaction } from "@/session/compaction"
31
+ import { SessionRevert } from "@/session/revert"
32
+ import { SessionSummary } from "@/session/summary"
33
+ import { SessionPrompt } from "@/session/prompt"
34
+ import { Instruction } from "@/session/instruction"
35
+ import { LLM } from "@/session/llm"
36
+ import { LSP } from "@/lsp/lsp"
37
+ import { MCP } from "@/mcp"
38
+ import { McpAuth } from "@/mcp/auth"
39
+ import { Command } from "@/command"
40
+ import { Truncate } from "@/tool/truncate"
41
+ import { ToolRegistry } from "@/tool/registry"
42
+ import { Format } from "@/format"
43
+ import { InstanceLayer } from "@/project/instance-layer"
44
+ import { Project } from "@/project/project"
45
+ import { Vcs } from "@/project/vcs"
46
+ import { Reference } from "@/reference/reference"
47
+ import { Workspace } from "@/control-plane/workspace"
48
+ import { Worktree } from "@/worktree"
49
+ import { Pty } from "@/pty"
50
+ import { PtyTicket } from "@/pty/ticket"
51
+ import { Installation } from "@/installation"
52
+ import { ShareNext } from "@/share/share-next"
53
+ import { SessionShare } from "@/share/session"
54
+ import { SyncEvent } from "@/sync"
55
+ import { Npm } from "@opencode-ai/core/npm"
56
+ import { memoMap } from "@opencode-ai/core/effect/memo-map"
57
+ import { DataMigration } from "@/data-migration"
58
+ import { BackgroundJob } from "@/background/job"
59
+ import { EventV2Bridge } from "@/event-v2-bridge"
60
+ import { RuntimeFlags } from "@/effect/runtime-flags"
61
+
62
+ export const AppLayer = Layer.mergeAll(
63
+ Npm.defaultLayer,
64
+ AppFileSystem.defaultLayer,
65
+ Bus.defaultLayer,
66
+ Auth.defaultLayer,
67
+ Account.defaultLayer,
68
+ Config.defaultLayer,
69
+ Git.defaultLayer,
70
+ Ripgrep.defaultLayer,
71
+ File.defaultLayer,
72
+ FileWatcher.defaultLayer,
73
+ Storage.defaultLayer,
74
+ Snapshot.defaultLayer,
75
+ Plugin.defaultLayer,
76
+ ModelsDev.defaultLayer,
77
+ Provider.defaultLayer,
78
+ ProviderAuth.defaultLayer,
79
+ Agent.defaultLayer,
80
+ Skill.defaultLayer,
81
+ Discovery.defaultLayer,
82
+ Question.defaultLayer,
83
+ Permission.defaultLayer,
84
+ Todo.defaultLayer,
85
+ Session.defaultLayer,
86
+ SessionStatus.defaultLayer,
87
+ BackgroundJob.defaultLayer,
88
+ RuntimeFlags.defaultLayer,
89
+ SessionRunState.defaultLayer,
90
+ SessionProcessor.defaultLayer,
91
+ SessionCompaction.defaultLayer,
92
+ SessionRevert.defaultLayer,
93
+ SessionSummary.defaultLayer,
94
+ SessionPrompt.defaultLayer,
95
+ Instruction.defaultLayer,
96
+ LLM.defaultLayer,
97
+ LSP.defaultLayer,
98
+ MCP.defaultLayer,
99
+ McpAuth.defaultLayer,
100
+ Command.defaultLayer,
101
+ Truncate.defaultLayer,
102
+ ToolRegistry.defaultLayer,
103
+ Format.defaultLayer,
104
+ Project.defaultLayer,
105
+ Vcs.defaultLayer,
106
+ Reference.defaultLayer,
107
+ Workspace.defaultLayer,
108
+ Worktree.appLayer,
109
+ Pty.defaultLayer,
110
+ PtyTicket.defaultLayer,
111
+ Installation.defaultLayer,
112
+ ShareNext.defaultLayer,
113
+ SessionShare.defaultLayer,
114
+ SyncEvent.defaultLayer,
115
+ EventV2Bridge.defaultLayer,
116
+ DataMigration.defaultLayer,
117
+ ).pipe(Layer.provideMerge(InstanceLayer.layer), Layer.provideMerge(Observability.layer))
118
+
119
+ const rt = ManagedRuntime.make(AppLayer, { memoMap })
120
+ type Runtime = Pick<typeof rt, "runSync" | "runPromise" | "runPromiseExit" | "runFork" | "runCallback" | "dispose">
121
+
122
+ /** Services provided by AppRuntime — i.e. what an Effect run via AppRuntime.runPromise can yield. */
123
+ export type AppServices = ManagedRuntime.ManagedRuntime.Services<typeof rt>
124
+ const wrap = (effect: Parameters<typeof rt.runSync>[0]) => attach(effect as never) as never
125
+
126
+ export const AppRuntime: Runtime = {
127
+ runSync(effect) {
128
+ return rt.runSync(wrap(effect))
129
+ },
130
+ runPromise(effect, options) {
131
+ return rt.runPromise(wrap(effect), options)
132
+ },
133
+ runPromiseExit(effect, options) {
134
+ return rt.runPromiseExit(wrap(effect), options)
135
+ },
136
+ runFork(effect) {
137
+ return rt.runFork(wrap(effect))
138
+ },
139
+ runCallback(effect) {
140
+ return rt.runCallback(wrap(effect))
141
+ },
142
+ dispose: () => rt.dispose(),
143
+ }
@@ -0,0 +1,29 @@
1
+ import { Layer, ManagedRuntime } from "effect"
2
+
3
+ import { Plugin } from "@/plugin"
4
+ import { LSP } from "@/lsp/lsp"
5
+ import { FileWatcher } from "@/file/watcher"
6
+ import { Format } from "@/format"
7
+ import { ShareNext } from "@/share/share-next"
8
+ import { File } from "@/file"
9
+ import { Vcs } from "@/project/vcs"
10
+ import { Snapshot } from "@/snapshot"
11
+ import { Bus } from "@/bus"
12
+ import { Config } from "@/config/config"
13
+ import * as Observability from "@opencode-ai/core/effect/observability"
14
+ import { memoMap } from "@opencode-ai/core/effect/memo-map"
15
+
16
+ export const BootstrapLayer = Layer.mergeAll(
17
+ Config.defaultLayer,
18
+ Plugin.defaultLayer,
19
+ ShareNext.defaultLayer,
20
+ Format.defaultLayer,
21
+ LSP.defaultLayer,
22
+ File.defaultLayer,
23
+ FileWatcher.defaultLayer,
24
+ Vcs.defaultLayer,
25
+ Snapshot.defaultLayer,
26
+ Bus.defaultLayer,
27
+ ).pipe(Layer.provide(Observability.layer))
28
+
29
+ export const BootstrapRuntime = ManagedRuntime.make(BootstrapLayer, { memoMap })
@@ -0,0 +1,84 @@
1
+ import { Context, Effect, Exit, Fiber } from "effect"
2
+ import { WorkspaceContext } from "@/control-plane/workspace-context"
3
+ import type { WorkspaceID } from "@/control-plane/schema"
4
+ import { InstanceRef, WorkspaceRef } from "./instance-ref"
5
+ import { attachWith } from "./run-service"
6
+
7
+ export interface Shape {
8
+ readonly promise: <A, E, R>(effect: Effect.Effect<A, E, R>) => Promise<A>
9
+ readonly fork: <A, E, R>(effect: Effect.Effect<A, E, R>) => Fiber.Fiber<A, E>
10
+ readonly run: <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E>
11
+ readonly bind: <Args extends readonly unknown[], Result>(fn: (...args: Args) => Result) => (...args: Args) => Result
12
+ }
13
+
14
+ function restoreWorkspace<R>(workspace: WorkspaceID | undefined, fn: () => R): R {
15
+ if (workspace !== undefined) return WorkspaceContext.restore(workspace, fn)
16
+ return fn()
17
+ }
18
+
19
+ function captureSync() {
20
+ const fiber = Fiber.getCurrent()
21
+ const instance = fiber ? Context.getReferenceUnsafe(fiber.context, InstanceRef) : undefined
22
+ const workspace =
23
+ (fiber ? Context.getReferenceUnsafe(fiber.context, WorkspaceRef) : undefined) ?? WorkspaceContext.workspaceID
24
+ return { instance, workspace }
25
+ }
26
+
27
+ export const bind = <Args extends readonly unknown[], Result>(fn: (...args: Args) => Result) => {
28
+ const captured = captureSync()
29
+ return (...args: Args) =>
30
+ restoreWorkspace(captured.workspace, () =>
31
+ Effect.runSync(
32
+ attachWith(
33
+ Effect.sync(() => fn(...args)),
34
+ captured,
35
+ ),
36
+ ),
37
+ )
38
+ }
39
+
40
+ /**
41
+ * Bridge from Effect into a Promise-returning JS callback while preserving
42
+ * `WorkspaceContext` AsyncLocalStorage for callback code that still reads it.
43
+ * `InstanceRef` is captured for effects run through the returned bridge APIs;
44
+ * plain JS callbacks that need it should receive the ref explicitly.
45
+ *
46
+ * Mirrors `Effect.promise` but restores workspace ALS first.
47
+ */
48
+ export const fromPromise = <T>(fn: () => Promise<T> | T): Effect.Effect<T> =>
49
+ Effect.gen(function* () {
50
+ const workspace = yield* WorkspaceRef
51
+ return yield* Effect.promise(() => Promise.resolve(restoreWorkspace(workspace, () => fn())))
52
+ })
53
+
54
+ export function make(): Effect.Effect<Shape> {
55
+ return Effect.gen(function* () {
56
+ const ctx = yield* Effect.context()
57
+ const captured = captureSync()
58
+ const instance = (yield* InstanceRef) ?? captured.instance
59
+ const workspace = (yield* WorkspaceRef) ?? captured.workspace
60
+ const wrap = <A, E, R>(effect: Effect.Effect<A, E, R>) =>
61
+ attachWith(effect.pipe(Effect.provide(ctx)) as Effect.Effect<A, E, never>, { instance, workspace })
62
+
63
+ return {
64
+ promise: <A, E, R>(effect: Effect.Effect<A, E, R>) =>
65
+ restoreWorkspace(workspace, () => Effect.runPromise(wrap(effect))),
66
+ fork: <A, E, R>(effect: Effect.Effect<A, E, R>) =>
67
+ restoreWorkspace(workspace, () => Effect.runFork(wrap(effect))),
68
+ run: <A, E, R>(effect: Effect.Effect<A, E, R>) =>
69
+ Effect.callback<A, E>((resume) => {
70
+ restoreWorkspace(workspace, () =>
71
+ Effect.runPromiseExit(wrap(effect)).then((exit) =>
72
+ resume(Exit.isSuccess(exit) ? Effect.succeed(exit.value) : Effect.failCause(exit.cause)),
73
+ ),
74
+ )
75
+ }),
76
+ bind:
77
+ <Args extends readonly unknown[], Result>(fn: (...args: Args) => Result) =>
78
+ (...args: Args) =>
79
+ restoreWorkspace(workspace, () => Effect.runSync(wrap(Effect.sync(() => fn(...args))))),
80
+ } satisfies Shape
81
+ })
82
+ }
83
+
84
+ export * as EffectBridge from "./bridge"
@@ -0,0 +1,67 @@
1
+ import { Config, Context, Effect, Layer } from "effect"
2
+
3
+ type ConfigMap = Record<string, Config.Config<unknown>>
4
+
5
+ /**
6
+ * The service shape inferred from an object of Effect `Config` definitions.
7
+ */
8
+ export type Shape<Fields extends ConfigMap> = {
9
+ readonly [Key in keyof Fields]: Config.Success<Fields[Key]>
10
+ }
11
+
12
+ /**
13
+ * A Context service class with generated layers for config-backed services.
14
+ */
15
+ export type ServiceClass<Self, Id extends string, Service> = Context.ServiceClass<Self, Id, Service> & {
16
+ /** Provide already-parsed config, useful in tests. */
17
+ readonly layer: (input: Service) => Layer.Layer<Self>
18
+ /** Parse config once from the active Effect ConfigProvider and provide the service. */
19
+ readonly defaultLayer: Layer.Layer<Self, Config.ConfigError>
20
+ }
21
+
22
+ /**
23
+ * Create a Context service whose implementation is derived from Effect `Config`.
24
+ *
25
+ * This keeps Effect `Config` as the source of truth for env names, defaults, and
26
+ * validation while generating a typed service plus convenient production/test
27
+ * layers.
28
+ *
29
+ * ```ts
30
+ * class ServerAuthConfig extends ConfigService.Service<ServerAuthConfig>()(
31
+ * "@opencode/ServerAuthConfig",
32
+ * {
33
+ * password: Config.string("OPENCODE_SERVER_PASSWORD").pipe(Config.option),
34
+ * username: Config.string("OPENCODE_SERVER_USERNAME").pipe(Config.withDefault("opencode")),
35
+ * },
36
+ * ) {}
37
+ *
38
+ * const live = ServerAuthConfig.defaultLayer
39
+ * const test = ServerAuthConfig.layer({ password: Option.some("secret"), username: "kit" })
40
+ * ```
41
+ */
42
+ export const Service =
43
+ <Self>() =>
44
+ <const Id extends string, const Fields extends ConfigMap>(id: Id, fields: Fields) => {
45
+ class ConfigTag extends Context.Service<Self, Shape<Fields>>()(id) {
46
+ static layer(input: Shape<Fields>) {
47
+ return Layer.succeed(this, this.of(input))
48
+ }
49
+
50
+ static get defaultLayer() {
51
+ return Layer.effect(
52
+ this,
53
+ Config.all(fields)
54
+ .asEffect()
55
+ .pipe(
56
+ // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion -- Config.all preserves the field shape, but its conditional return type also supports iterable inputs.
57
+ Effect.map((config) => this.of(config as Shape<Fields>)),
58
+ ),
59
+ )
60
+ }
61
+ }
62
+
63
+ // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion -- The generated class carries typed static helpers.
64
+ return ConfigTag as ServiceClass<Self, Id, Shape<Fields>>
65
+ }
66
+
67
+ export * as ConfigService from "./config-service"
@@ -0,0 +1,11 @@
1
+ import { Context } from "effect"
2
+ import type { InstanceContext } from "@/project/instance-context"
3
+ import type { WorkspaceID } from "@/control-plane/schema"
4
+
5
+ export const InstanceRef = Context.Reference<InstanceContext | undefined>("~opencode/InstanceRef", {
6
+ defaultValue: () => undefined,
7
+ })
8
+
9
+ export const WorkspaceRef = Context.Reference<WorkspaceID | undefined>("~opencode/WorkspaceRef", {
10
+ defaultValue: () => undefined,
11
+ })
@@ -0,0 +1,12 @@
1
+ const disposers = new Set<(directory: string) => Promise<void>>()
2
+
3
+ export function registerDisposer(disposer: (directory: string) => Promise<void>) {
4
+ disposers.add(disposer)
5
+ return () => {
6
+ disposers.delete(disposer)
7
+ }
8
+ }
9
+
10
+ export async function disposeInstance(directory: string) {
11
+ await Promise.allSettled([...disposers].map((disposer) => disposer(directory)))
12
+ }
@@ -0,0 +1,72 @@
1
+ import { Effect, ScopedCache, Scope } from "effect"
2
+ import * as EffectLogger from "@opencode-ai/core/effect/logger"
3
+ import type { InstanceContext } from "@/project/instance-context"
4
+ import { InstanceRef, WorkspaceRef } from "./instance-ref"
5
+ import { registerDisposer } from "./instance-registry"
6
+ import { WorkspaceContext } from "@/control-plane/workspace-context"
7
+
8
+ const TypeId = "~opencode/InstanceState"
9
+
10
+ export interface InstanceState<A, E = never, R = never> {
11
+ readonly [TypeId]: typeof TypeId
12
+ readonly cache: ScopedCache.ScopedCache<string, A, E, R>
13
+ }
14
+
15
+ export const context = Effect.gen(function* () {
16
+ const ctx = yield* InstanceRef
17
+ if (!ctx) return yield* Effect.die(new Error("InstanceRef not provided"))
18
+ return ctx
19
+ })
20
+
21
+ export const workspaceID = Effect.gen(function* () {
22
+ return (yield* WorkspaceRef) ?? WorkspaceContext.workspaceID
23
+ })
24
+
25
+ export const directory = Effect.map(context, (ctx) => ctx.directory)
26
+
27
+ export const make = <A, E = never, R = never>(
28
+ init: (ctx: InstanceContext) => Effect.Effect<A, E, R | Scope.Scope>,
29
+ ): Effect.Effect<InstanceState<A, E, Exclude<R, Scope.Scope>>, never, R | Scope.Scope> =>
30
+ Effect.gen(function* () {
31
+ const cache = yield* ScopedCache.make<string, A, E, R>({
32
+ capacity: Number.POSITIVE_INFINITY,
33
+ lookup: () =>
34
+ Effect.gen(function* () {
35
+ return yield* init(yield* context)
36
+ }),
37
+ })
38
+
39
+ const off = registerDisposer((directory) =>
40
+ Effect.runPromise(ScopedCache.invalidate(cache, directory).pipe(Effect.provide(EffectLogger.layer))),
41
+ )
42
+ yield* Effect.addFinalizer(() => Effect.sync(off))
43
+
44
+ return {
45
+ [TypeId]: TypeId,
46
+ cache,
47
+ }
48
+ })
49
+
50
+ export const get = <A, E, R>(self: InstanceState<A, E, R>) =>
51
+ Effect.gen(function* () {
52
+ return yield* ScopedCache.get(self.cache, yield* directory)
53
+ })
54
+
55
+ export const use = <A, E, R, B>(self: InstanceState<A, E, R>, select: (value: A) => B) => Effect.map(get(self), select)
56
+
57
+ export const useEffect = <A, E, R, B, E2, R2>(
58
+ self: InstanceState<A, E, R>,
59
+ select: (value: A) => Effect.Effect<B, E2, R2>,
60
+ ) => Effect.flatMap(get(self), select)
61
+
62
+ export const has = <A, E, R>(self: InstanceState<A, E, R>) =>
63
+ Effect.gen(function* () {
64
+ return yield* ScopedCache.has(self.cache, yield* directory)
65
+ })
66
+
67
+ export const invalidate = <A, E, R>(self: InstanceState<A, E, R>) =>
68
+ Effect.gen(function* () {
69
+ return yield* ScopedCache.invalidate(self.cache, yield* directory)
70
+ })
71
+
72
+ export * as InstanceState from "./instance-state"
@@ -0,0 +1,17 @@
1
+ import { Cause, Effect } from "effect"
2
+
3
+ export function refineRejection<A, E>(
4
+ evaluate: (signal: AbortSignal) => PromiseLike<A>,
5
+ refine: (cause: unknown) => E | undefined,
6
+ ) {
7
+ return Effect.tryPromise(evaluate).pipe(
8
+ Effect.catch((error) => {
9
+ const cause = Cause.isUnknownError(error) ? error.cause : error
10
+ const refined = refine(cause)
11
+ if (refined !== undefined) return Effect.fail(refined)
12
+ return Effect.die(cause)
13
+ }),
14
+ )
15
+ }
16
+
17
+ export * as EffectPromise from "./promise"
@@ -0,0 +1,47 @@
1
+ import { Effect, Fiber, Layer, ManagedRuntime } from "effect"
2
+ import * as Context from "effect/Context"
3
+ import { InstanceRef, WorkspaceRef } from "./instance-ref"
4
+ import * as Observability from "@opencode-ai/core/effect/observability"
5
+ import { WorkspaceContext } from "@/control-plane/workspace-context"
6
+ import type { InstanceContext } from "@/project/instance-context"
7
+ import { memoMap } from "@opencode-ai/core/effect/memo-map"
8
+
9
+ type Refs = {
10
+ instance?: InstanceContext
11
+ workspace?: string
12
+ }
13
+
14
+ export function attachWith<A, E, R>(effect: Effect.Effect<A, E, R>, refs: Refs): Effect.Effect<A, E, R> {
15
+ if (!refs.instance && !refs.workspace) return effect
16
+ if (!refs.instance) return effect.pipe(Effect.provideService(WorkspaceRef, refs.workspace))
17
+ if (!refs.workspace) return effect.pipe(Effect.provideService(InstanceRef, refs.instance))
18
+ return effect.pipe(
19
+ Effect.provideService(InstanceRef, refs.instance),
20
+ Effect.provideService(WorkspaceRef, refs.workspace),
21
+ )
22
+ }
23
+
24
+ export function attach<A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<A, E, R> {
25
+ const workspace = WorkspaceContext.workspaceID
26
+ const fiber = Fiber.getCurrent()
27
+ return attachWith(effect, {
28
+ instance: fiber ? Context.getReferenceUnsafe(fiber.context, InstanceRef) : undefined,
29
+ workspace: workspace ?? (fiber ? Context.getReferenceUnsafe(fiber.context, WorkspaceRef) : undefined),
30
+ })
31
+ }
32
+
33
+ export function makeRuntime<I, S, E>(service: Context.Service<I, S>, layer: Layer.Layer<I, E>) {
34
+ let rt: ManagedRuntime.ManagedRuntime<I, E> | undefined
35
+ const getRuntime = () => (rt ??= ManagedRuntime.make(Layer.provideMerge(layer, Observability.layer), { memoMap }))
36
+
37
+ return {
38
+ runSync: <A, Err>(fn: (svc: S) => Effect.Effect<A, Err, I>) => getRuntime().runSync(attach(service.use(fn))),
39
+ runPromiseExit: <A, Err>(fn: (svc: S) => Effect.Effect<A, Err, I>, options?: Effect.RunOptions) =>
40
+ getRuntime().runPromiseExit(attach(service.use(fn)), options),
41
+ runPromise: <A, Err>(fn: (svc: S) => Effect.Effect<A, Err, I>, options?: Effect.RunOptions) =>
42
+ getRuntime().runPromise(attach(service.use(fn)), options),
43
+ runFork: <A, Err>(fn: (svc: S) => Effect.Effect<A, Err, I>) => getRuntime().runFork(attach(service.use(fn))),
44
+ runCallback: <A, Err>(fn: (svc: S) => Effect.Effect<A, Err, I>) =>
45
+ getRuntime().runCallback(attach(service.use(fn))),
46
+ }
47
+ }