bonecode 1.0.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (840) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +64 -50
  3. package/bin/bonecode +47 -42
  4. package/bone/output/agent/.dockerignore +7 -7
  5. package/bone/output/agent/.env.example +36 -36
  6. package/bone/output/agent/.github/workflows/ci.yaml +58 -58
  7. package/bone/output/agent/AgentDomain.bone.map +349 -349
  8. package/bone/output/agent/AgentDomain.postman_collection.json +957 -957
  9. package/bone/output/agent/Dockerfile +22 -22
  10. package/bone/output/agent/README.md +47 -47
  11. package/bone/output/agent/admin/index.html +739 -739
  12. package/bone/output/agent/docker-compose.yaml +22 -22
  13. package/bone/output/agent/k8s/deployment.yaml +75 -75
  14. package/bone/output/agent/migrations/agent.sql +36 -36
  15. package/bone/output/agent/migrations/agent_instance.sql +36 -36
  16. package/bone/output/agent/migrations/audit_log.sql +18 -18
  17. package/bone/output/agent/migrations/build_step.sql +34 -34
  18. package/bone/output/agent/migrations/event_outbox.sql +31 -31
  19. package/bone/output/agent/migrations/plan.sql +30 -30
  20. package/bone/output/agent/migrations/task.sql +30 -30
  21. package/bone/output/agent/migrations/tool_call.sql +33 -33
  22. package/bone/output/agent/openapi.yaml +1116 -1116
  23. package/bone/output/agent/package.json +35 -35
  24. package/bone/output/agent/schema.graphql +233 -233
  25. package/bone/output/agent/sdk/client.ts +231 -231
  26. package/bone/output/agent/src/algorithms.ts +2 -2
  27. package/bone/output/agent/src/audit.ts +44 -44
  28. package/bone/output/agent/src/auth.ts +57 -57
  29. package/bone/output/agent/src/cron.ts +12 -12
  30. package/bone/output/agent/src/db.ts +31 -31
  31. package/bone/output/agent/src/debug.ts +66 -66
  32. package/bone/output/agent/src/events.ts +243 -243
  33. package/bone/output/agent/src/extensions.ts +54 -54
  34. package/bone/output/agent/src/failure_rules.ts +322 -322
  35. package/bone/output/agent/src/flows.ts +168 -168
  36. package/bone/output/agent/src/health.ts +43 -43
  37. package/bone/output/agent/src/index.ts +99 -99
  38. package/bone/output/agent/src/logger.ts +69 -66
  39. package/bone/output/agent/src/metrics.ts +75 -75
  40. package/bone/output/agent/src/migrate.ts +351 -351
  41. package/bone/output/agent/src/migration_diff.ts +108 -108
  42. package/bone/output/agent/src/notify.ts +125 -125
  43. package/bone/output/agent/src/routes/plan.ts +91 -91
  44. package/bone/output/agent/src/routes/task.ts +105 -105
  45. package/bone/output/agent/src/routes/tool_call.ts +166 -166
  46. package/bone/output/agent/src/schemas.ts +384 -384
  47. package/bone/output/agent/src/state_machines/agent_instance.ts +24 -24
  48. package/bone/output/agent/src/state_machines/build_step.ts +22 -22
  49. package/bone/output/agent/src/state_machines/plan.ts +22 -22
  50. package/bone/output/agent/src/state_machines/task.ts +22 -22
  51. package/bone/output/agent/src/state_machines/tool_call.ts +22 -22
  52. package/bone/output/agent/src/tests.ts +361 -361
  53. package/bone/output/agent/src/websocket.ts +200 -200
  54. package/bone/output/agent/tsconfig.json +24 -24
  55. package/bone/output/rag/.dockerignore +7 -7
  56. package/bone/output/rag/.env.example +36 -36
  57. package/bone/output/rag/.github/workflows/ci.yaml +58 -58
  58. package/bone/output/rag/Dockerfile +22 -22
  59. package/bone/output/rag/RAGDomain.bone.map +286 -286
  60. package/bone/output/rag/RAGDomain.postman_collection.json +922 -922
  61. package/bone/output/rag/README.md +47 -47
  62. package/bone/output/rag/admin/index.html +817 -817
  63. package/bone/output/rag/docker-compose.yaml +22 -22
  64. package/bone/output/rag/k8s/deployment.yaml +75 -75
  65. package/bone/output/rag/migrations/audit_log.sql +18 -18
  66. package/bone/output/rag/migrations/code_chunk.sql +34 -34
  67. package/bone/output/rag/migrations/code_file.sql +33 -33
  68. package/bone/output/rag/migrations/event_outbox.sql +31 -31
  69. package/bone/output/rag/migrations/indexing_job.sql +33 -33
  70. package/bone/output/rag/migrations/knowledge_base.sql +35 -35
  71. package/bone/output/rag/migrations/memory_entry.sql +34 -34
  72. package/bone/output/rag/openapi.yaml +1097 -1097
  73. package/bone/output/rag/package.json +35 -35
  74. package/bone/output/rag/schema.graphql +245 -245
  75. package/bone/output/rag/sdk/client.ts +234 -234
  76. package/bone/output/rag/src/algorithms.ts +2 -2
  77. package/bone/output/rag/src/audit.ts +37 -37
  78. package/bone/output/rag/src/auth.ts +57 -57
  79. package/bone/output/rag/src/cron.ts +12 -12
  80. package/bone/output/rag/src/db.ts +31 -31
  81. package/bone/output/rag/src/debug.ts +66 -66
  82. package/bone/output/rag/src/events.ts +243 -243
  83. package/bone/output/rag/src/extensions.ts +350 -350
  84. package/bone/output/rag/src/failure_rules.ts +314 -314
  85. package/bone/output/rag/src/flows.ts +239 -239
  86. package/bone/output/rag/src/health.ts +43 -43
  87. package/bone/output/rag/src/index.ts +94 -94
  88. package/bone/output/rag/src/logger.ts +69 -66
  89. package/bone/output/rag/src/metrics.ts +75 -75
  90. package/bone/output/rag/src/migrate.ts +363 -363
  91. package/bone/output/rag/src/migration_diff.ts +108 -108
  92. package/bone/output/rag/src/notify.ts +99 -99
  93. package/bone/output/rag/src/routes/code_chunk.ts +75 -75
  94. package/bone/output/rag/src/routes/code_file.ts +101 -101
  95. package/bone/output/rag/src/routes/indexing_job.ts +87 -87
  96. package/bone/output/rag/src/routes/knowledge_base.ts +230 -230
  97. package/bone/output/rag/src/routes/memory_entry.ts +87 -87
  98. package/bone/output/rag/src/schemas.ts +394 -394
  99. package/bone/output/rag/src/state_machines/code_file.ts +23 -23
  100. package/bone/output/rag/src/state_machines/indexing_job.ts +22 -22
  101. package/bone/output/rag/src/state_machines/knowledge_base.ts +23 -23
  102. package/bone/output/rag/src/state_machines/memory_entry.ts +20 -20
  103. package/bone/output/rag/src/tests.ts +339 -339
  104. package/bone/output/rag/tsconfig.json +24 -24
  105. package/bone/output/session/.dockerignore +7 -7
  106. package/bone/output/session/.env.example +36 -36
  107. package/bone/output/session/.github/workflows/ci.yaml +58 -58
  108. package/bone/output/session/Dockerfile +22 -22
  109. package/bone/output/session/README.md +47 -47
  110. package/bone/output/session/SessionDomain.bone.map +349 -349
  111. package/bone/output/session/SessionDomain.postman_collection.json +957 -957
  112. package/bone/output/session/admin/index.html +666 -666
  113. package/bone/output/session/docker-compose.yaml +22 -22
  114. package/bone/output/session/k8s/deployment.yaml +75 -75
  115. package/bone/output/session/migrations/audit_log.sql +18 -18
  116. package/bone/output/session/migrations/event_outbox.sql +31 -31
  117. package/bone/output/session/migrations/message.sql +31 -31
  118. package/bone/output/session/migrations/part.sql +28 -28
  119. package/bone/output/session/migrations/permission.sql +28 -28
  120. package/bone/output/session/migrations/project.sql +28 -28
  121. package/bone/output/session/migrations/session.sql +38 -38
  122. package/bone/output/session/openapi.yaml +1101 -1101
  123. package/bone/output/session/package.json +35 -35
  124. package/bone/output/session/schema.graphql +222 -222
  125. package/bone/output/session/sdk/client.ts +225 -225
  126. package/bone/output/session/src/algorithms.ts +2 -2
  127. package/bone/output/session/src/audit.ts +44 -44
  128. package/bone/output/session/src/auth.ts +57 -57
  129. package/bone/output/session/src/cron.ts +12 -12
  130. package/bone/output/session/src/db.ts +31 -31
  131. package/bone/output/session/src/debug.ts +66 -66
  132. package/bone/output/session/src/events.ts +270 -270
  133. package/bone/output/session/src/extensions.ts +215 -215
  134. package/bone/output/session/src/failure_rules.ts +283 -283
  135. package/bone/output/session/src/flows.ts +168 -168
  136. package/bone/output/session/src/health.ts +43 -43
  137. package/bone/output/session/src/index.ts +99 -99
  138. package/bone/output/session/src/logger.ts +67 -66
  139. package/bone/output/session/src/metrics.ts +75 -75
  140. package/bone/output/session/src/migrate.ts +331 -331
  141. package/bone/output/session/src/migration_diff.ts +108 -108
  142. package/bone/output/session/src/notify.ts +112 -112
  143. package/bone/output/session/src/routes/message.ts +93 -93
  144. package/bone/output/session/src/routes/part.ts +79 -79
  145. package/bone/output/session/src/routes/permission.ts +79 -79
  146. package/bone/output/session/src/routes/project.ts +79 -79
  147. package/bone/output/session/src/routes/session.ts +294 -294
  148. package/bone/output/session/src/schemas.ts +357 -357
  149. package/bone/output/session/src/state_machines/session.ts +23 -23
  150. package/bone/output/session/src/tests.ts +325 -325
  151. package/bone/output/session/src/websocket.ts +223 -200
  152. package/bone/output/session/tsconfig.json +24 -24
  153. package/bone/output/workspace/.dockerignore +7 -7
  154. package/bone/output/workspace/.env.example +36 -36
  155. package/bone/output/workspace/.github/workflows/ci.yaml +58 -58
  156. package/bone/output/workspace/Dockerfile +22 -22
  157. package/bone/output/workspace/README.md +45 -45
  158. package/bone/output/workspace/WorkspaceDomain.bone.map +188 -188
  159. package/bone/output/workspace/WorkspaceDomain.postman_collection.json +620 -620
  160. package/bone/output/workspace/admin/index.html +484 -484
  161. package/bone/output/workspace/docker-compose.yaml +22 -22
  162. package/bone/output/workspace/k8s/deployment.yaml +75 -75
  163. package/bone/output/workspace/migrations/audit_log.sql +18 -18
  164. package/bone/output/workspace/migrations/codebase.sql +34 -34
  165. package/bone/output/workspace/migrations/event_outbox.sql +31 -31
  166. package/bone/output/workspace/migrations/snapshot.sql +32 -32
  167. package/bone/output/workspace/migrations/workspace.sql +33 -33
  168. package/bone/output/workspace/openapi.yaml +721 -721
  169. package/bone/output/workspace/package.json +35 -35
  170. package/bone/output/workspace/schema.graphql +153 -153
  171. package/bone/output/workspace/sdk/client.ts +155 -155
  172. package/bone/output/workspace/src/algorithms.ts +2 -2
  173. package/bone/output/workspace/src/audit.ts +37 -37
  174. package/bone/output/workspace/src/auth.ts +57 -57
  175. package/bone/output/workspace/src/cron.ts +12 -12
  176. package/bone/output/workspace/src/db.ts +31 -31
  177. package/bone/output/workspace/src/debug.ts +66 -66
  178. package/bone/output/workspace/src/events.ts +243 -243
  179. package/bone/output/workspace/src/extensions.ts +44 -44
  180. package/bone/output/workspace/src/failure_rules.ts +152 -152
  181. package/bone/output/workspace/src/health.ts +43 -43
  182. package/bone/output/workspace/src/index.ts +88 -88
  183. package/bone/output/workspace/src/logger.ts +69 -66
  184. package/bone/output/workspace/src/metrics.ts +75 -75
  185. package/bone/output/workspace/src/migrate.ts +219 -219
  186. package/bone/output/workspace/src/migration_diff.ts +108 -108
  187. package/bone/output/workspace/src/notify.ts +73 -73
  188. package/bone/output/workspace/src/routes/codebase.ts +87 -87
  189. package/bone/output/workspace/src/routes/snapshot.ts +127 -127
  190. package/bone/output/workspace/src/routes/workspace.ts +190 -190
  191. package/bone/output/workspace/src/schemas.ts +231 -231
  192. package/bone/output/workspace/src/state_machines/codebase.ts +21 -21
  193. package/bone/output/workspace/src/state_machines/snapshot.ts +20 -20
  194. package/bone/output/workspace/src/state_machines/workspace.ts +21 -21
  195. package/bone/output/workspace/src/tests.ts +248 -248
  196. package/bone/output/workspace/tsconfig.json +24 -24
  197. package/compat/opencode_adapter.ts +282 -34
  198. package/dist/bone/output/agent/src/algorithms.d.ts +1 -0
  199. package/dist/bone/output/agent/src/algorithms.js +3 -0
  200. package/dist/bone/output/agent/src/algorithms.js.map +1 -0
  201. package/dist/bone/output/agent/src/audit.d.ts +3 -0
  202. package/dist/bone/output/agent/src/audit.js +40 -0
  203. package/dist/bone/output/agent/src/audit.js.map +1 -0
  204. package/dist/bone/output/agent/src/auth.d.ts +8 -0
  205. package/dist/bone/output/agent/src/auth.js +56 -0
  206. package/dist/bone/output/agent/src/auth.js.map +1 -0
  207. package/dist/bone/output/agent/src/db.d.ts +6 -0
  208. package/dist/bone/output/agent/src/db.js +63 -0
  209. package/dist/bone/output/agent/src/db.js.map +1 -0
  210. package/dist/bone/output/agent/src/events.d.ts +25 -0
  211. package/dist/bone/output/agent/src/events.js +184 -0
  212. package/dist/bone/output/agent/src/events.js.map +1 -0
  213. package/dist/bone/output/agent/src/logger.d.ts +28 -0
  214. package/dist/bone/output/agent/src/logger.js +45 -0
  215. package/dist/bone/output/agent/src/logger.js.map +1 -0
  216. package/dist/bone/output/agent/src/metrics.d.ts +5 -0
  217. package/dist/bone/output/agent/src/metrics.js +60 -0
  218. package/dist/bone/output/agent/src/metrics.js.map +1 -0
  219. package/dist/bone/output/agent/src/routes/agent_instance.d.ts +1 -0
  220. package/dist/bone/output/agent/src/routes/agent_instance.js +253 -0
  221. package/dist/bone/output/agent/src/routes/agent_instance.js.map +1 -0
  222. package/dist/bone/output/agent/src/routes/build_step.d.ts +1 -0
  223. package/dist/bone/output/agent/src/routes/build_step.js +133 -0
  224. package/dist/bone/output/agent/src/routes/build_step.js.map +1 -0
  225. package/dist/bone/output/agent/src/routes/plan.d.ts +1 -0
  226. package/dist/bone/output/agent/src/routes/plan.js +119 -0
  227. package/dist/bone/output/agent/src/routes/plan.js.map +1 -0
  228. package/dist/bone/output/agent/src/routes/task.d.ts +1 -0
  229. package/dist/bone/output/agent/src/routes/task.js +133 -0
  230. package/dist/bone/output/agent/src/routes/task.js.map +1 -0
  231. package/dist/bone/output/agent/src/routes/tool_call.d.ts +1 -0
  232. package/dist/bone/output/agent/src/routes/tool_call.js +190 -0
  233. package/dist/bone/output/agent/src/routes/tool_call.js.map +1 -0
  234. package/dist/bone/output/agent/src/state_machines/agent_instance.d.ts +9 -0
  235. package/dist/bone/output/agent/src/state_machines/agent_instance.js +22 -0
  236. package/dist/bone/output/agent/src/state_machines/agent_instance.js.map +1 -0
  237. package/dist/bone/output/agent/src/state_machines/build_step.d.ts +9 -0
  238. package/dist/bone/output/agent/src/state_machines/build_step.js +20 -0
  239. package/dist/bone/output/agent/src/state_machines/build_step.js.map +1 -0
  240. package/dist/bone/output/agent/src/state_machines/plan.d.ts +9 -0
  241. package/dist/bone/output/agent/src/state_machines/plan.js +20 -0
  242. package/dist/bone/output/agent/src/state_machines/plan.js.map +1 -0
  243. package/dist/bone/output/agent/src/state_machines/task.d.ts +9 -0
  244. package/dist/bone/output/agent/src/state_machines/task.js +20 -0
  245. package/dist/bone/output/agent/src/state_machines/task.js.map +1 -0
  246. package/dist/bone/output/agent/src/state_machines/tool_call.d.ts +9 -0
  247. package/dist/bone/output/agent/src/state_machines/tool_call.js +20 -0
  248. package/dist/bone/output/agent/src/state_machines/tool_call.js.map +1 -0
  249. package/dist/bone/output/rag/src/algorithms.d.ts +1 -0
  250. package/dist/bone/output/rag/src/algorithms.js +3 -0
  251. package/dist/bone/output/rag/src/algorithms.js.map +1 -0
  252. package/dist/bone/output/rag/src/auth.d.ts +8 -0
  253. package/dist/bone/output/rag/src/auth.js +56 -0
  254. package/dist/bone/output/rag/src/auth.js.map +1 -0
  255. package/dist/bone/output/rag/src/db.d.ts +6 -0
  256. package/dist/bone/output/rag/src/db.js +63 -0
  257. package/dist/bone/output/rag/src/db.js.map +1 -0
  258. package/dist/bone/output/rag/src/events.d.ts +25 -0
  259. package/dist/bone/output/rag/src/events.js +184 -0
  260. package/dist/bone/output/rag/src/events.js.map +1 -0
  261. package/dist/bone/output/rag/src/extensions.d.ts +83 -0
  262. package/dist/bone/output/rag/src/extensions.js +329 -0
  263. package/dist/bone/output/rag/src/extensions.js.map +1 -0
  264. package/dist/bone/output/rag/src/flows.d.ts +24 -0
  265. package/dist/bone/output/rag/src/flows.js +236 -0
  266. package/dist/bone/output/rag/src/flows.js.map +1 -0
  267. package/dist/bone/output/rag/src/logger.d.ts +28 -0
  268. package/dist/bone/output/rag/src/logger.js +45 -0
  269. package/dist/bone/output/rag/src/logger.js.map +1 -0
  270. package/dist/bone/output/rag/src/metrics.d.ts +5 -0
  271. package/dist/bone/output/rag/src/metrics.js +60 -0
  272. package/dist/bone/output/rag/src/metrics.js.map +1 -0
  273. package/dist/bone/output/rag/src/routes/code_chunk.d.ts +1 -0
  274. package/dist/bone/output/rag/src/routes/code_chunk.js +100 -0
  275. package/dist/bone/output/rag/src/routes/code_chunk.js.map +1 -0
  276. package/dist/bone/output/rag/src/routes/code_file.d.ts +1 -0
  277. package/dist/bone/output/rag/src/routes/code_file.js +127 -0
  278. package/dist/bone/output/rag/src/routes/code_file.js.map +1 -0
  279. package/dist/bone/output/rag/src/routes/indexing_job.d.ts +1 -0
  280. package/dist/bone/output/rag/src/routes/indexing_job.js +113 -0
  281. package/dist/bone/output/rag/src/routes/indexing_job.js.map +1 -0
  282. package/dist/bone/output/rag/src/routes/knowledge_base.d.ts +1 -0
  283. package/dist/bone/output/rag/src/routes/knowledge_base.js +242 -0
  284. package/dist/bone/output/rag/src/routes/knowledge_base.js.map +1 -0
  285. package/dist/bone/output/rag/src/routes/memory_entry.d.ts +1 -0
  286. package/dist/bone/output/rag/src/routes/memory_entry.js +113 -0
  287. package/dist/bone/output/rag/src/routes/memory_entry.js.map +1 -0
  288. package/dist/bone/output/rag/src/state_machines/code_file.d.ts +9 -0
  289. package/dist/bone/output/rag/src/state_machines/code_file.js +21 -0
  290. package/dist/bone/output/rag/src/state_machines/code_file.js.map +1 -0
  291. package/dist/bone/output/rag/src/state_machines/indexing_job.d.ts +9 -0
  292. package/dist/bone/output/rag/src/state_machines/indexing_job.js +20 -0
  293. package/dist/bone/output/rag/src/state_machines/indexing_job.js.map +1 -0
  294. package/dist/bone/output/rag/src/state_machines/knowledge_base.d.ts +9 -0
  295. package/dist/bone/output/rag/src/state_machines/knowledge_base.js +21 -0
  296. package/dist/bone/output/rag/src/state_machines/knowledge_base.js.map +1 -0
  297. package/dist/bone/output/rag/src/state_machines/memory_entry.d.ts +9 -0
  298. package/dist/bone/output/rag/src/state_machines/memory_entry.js +18 -0
  299. package/dist/bone/output/rag/src/state_machines/memory_entry.js.map +1 -0
  300. package/dist/bone/output/session/src/algorithms.d.ts +1 -0
  301. package/dist/bone/output/session/src/algorithms.js +3 -0
  302. package/dist/bone/output/session/src/algorithms.js.map +1 -0
  303. package/dist/bone/output/session/src/audit.d.ts +3 -0
  304. package/dist/bone/output/session/src/audit.js +40 -0
  305. package/dist/bone/output/session/src/audit.js.map +1 -0
  306. package/dist/bone/output/session/src/auth.d.ts +8 -0
  307. package/dist/bone/output/session/src/auth.js +56 -0
  308. package/dist/bone/output/session/src/auth.js.map +1 -0
  309. package/dist/bone/output/session/src/db.d.ts +6 -0
  310. package/dist/bone/output/session/src/db.js +63 -0
  311. package/dist/bone/output/session/src/db.js.map +1 -0
  312. package/dist/bone/output/session/src/events.d.ts +26 -0
  313. package/dist/bone/output/session/src/events.js +212 -0
  314. package/dist/bone/output/session/src/events.js.map +1 -0
  315. package/dist/bone/output/session/src/extensions.d.ts +41 -0
  316. package/dist/bone/output/session/src/extensions.js +217 -0
  317. package/dist/bone/output/session/src/extensions.js.map +1 -0
  318. package/dist/bone/output/session/src/logger.d.ts +28 -0
  319. package/dist/bone/output/session/src/logger.js +44 -0
  320. package/dist/bone/output/session/src/logger.js.map +1 -0
  321. package/dist/bone/output/session/src/metrics.d.ts +5 -0
  322. package/dist/bone/output/session/src/metrics.js +60 -0
  323. package/dist/bone/output/session/src/metrics.js.map +1 -0
  324. package/dist/bone/output/session/src/routes/message.d.ts +1 -0
  325. package/dist/bone/output/session/src/routes/message.js +120 -0
  326. package/dist/bone/output/session/src/routes/message.js.map +1 -0
  327. package/dist/bone/output/session/src/routes/part.d.ts +1 -0
  328. package/dist/bone/output/session/src/routes/part.js +106 -0
  329. package/dist/bone/output/session/src/routes/part.js.map +1 -0
  330. package/dist/bone/output/session/src/routes/permission.d.ts +1 -0
  331. package/dist/bone/output/session/src/routes/permission.js +106 -0
  332. package/dist/bone/output/session/src/routes/permission.js.map +1 -0
  333. package/dist/bone/output/session/src/routes/project.d.ts +1 -0
  334. package/dist/bone/output/session/src/routes/project.js +106 -0
  335. package/dist/bone/output/session/src/routes/project.js.map +1 -0
  336. package/dist/bone/output/session/src/routes/session.d.ts +1 -0
  337. package/dist/bone/output/session/src/routes/session.js +308 -0
  338. package/dist/bone/output/session/src/routes/session.js.map +1 -0
  339. package/dist/bone/output/session/src/state_machines/session.d.ts +9 -0
  340. package/dist/bone/output/session/src/state_machines/session.js +21 -0
  341. package/dist/bone/output/session/src/state_machines/session.js.map +1 -0
  342. package/dist/bone/output/session/src/websocket.d.ts +15 -0
  343. package/dist/bone/output/session/src/websocket.js +215 -0
  344. package/dist/bone/output/session/src/websocket.js.map +1 -0
  345. package/dist/bone/output/workspace/src/algorithms.d.ts +1 -0
  346. package/dist/bone/output/workspace/src/algorithms.js +3 -0
  347. package/dist/bone/output/workspace/src/algorithms.js.map +1 -0
  348. package/dist/bone/output/workspace/src/auth.d.ts +8 -0
  349. package/dist/bone/output/workspace/src/auth.js +56 -0
  350. package/dist/bone/output/workspace/src/auth.js.map +1 -0
  351. package/dist/bone/output/workspace/src/db.d.ts +6 -0
  352. package/dist/bone/output/workspace/src/db.js +63 -0
  353. package/dist/bone/output/workspace/src/db.js.map +1 -0
  354. package/dist/bone/output/workspace/src/events.d.ts +25 -0
  355. package/dist/bone/output/workspace/src/events.js +184 -0
  356. package/dist/bone/output/workspace/src/events.js.map +1 -0
  357. package/dist/bone/output/workspace/src/logger.d.ts +28 -0
  358. package/dist/bone/output/workspace/src/logger.js +45 -0
  359. package/dist/bone/output/workspace/src/logger.js.map +1 -0
  360. package/dist/bone/output/workspace/src/metrics.d.ts +5 -0
  361. package/dist/bone/output/workspace/src/metrics.js +60 -0
  362. package/dist/bone/output/workspace/src/metrics.js.map +1 -0
  363. package/dist/bone/output/workspace/src/routes/codebase.d.ts +1 -0
  364. package/dist/bone/output/workspace/src/routes/codebase.js +113 -0
  365. package/dist/bone/output/workspace/src/routes/codebase.js.map +1 -0
  366. package/dist/bone/output/workspace/src/routes/snapshot.d.ts +1 -0
  367. package/dist/bone/output/workspace/src/routes/snapshot.js +151 -0
  368. package/dist/bone/output/workspace/src/routes/snapshot.js.map +1 -0
  369. package/dist/bone/output/workspace/src/routes/workspace.d.ts +1 -0
  370. package/dist/bone/output/workspace/src/routes/workspace.js +209 -0
  371. package/dist/bone/output/workspace/src/routes/workspace.js.map +1 -0
  372. package/dist/bone/output/workspace/src/state_machines/codebase.d.ts +9 -0
  373. package/dist/bone/output/workspace/src/state_machines/codebase.js +19 -0
  374. package/dist/bone/output/workspace/src/state_machines/codebase.js.map +1 -0
  375. package/dist/bone/output/workspace/src/state_machines/snapshot.d.ts +9 -0
  376. package/dist/bone/output/workspace/src/state_machines/snapshot.js +18 -0
  377. package/dist/bone/output/workspace/src/state_machines/snapshot.js.map +1 -0
  378. package/dist/bone/output/workspace/src/state_machines/workspace.d.ts +9 -0
  379. package/dist/bone/output/workspace/src/state_machines/workspace.js +19 -0
  380. package/dist/bone/output/workspace/src/state_machines/workspace.js.map +1 -0
  381. package/dist/compat/opencode_adapter.d.ts +25 -0
  382. package/dist/compat/opencode_adapter.js +599 -0
  383. package/dist/compat/opencode_adapter.js.map +1 -0
  384. package/dist/extensions/chunker.d.ts +24 -0
  385. package/dist/extensions/chunker.js +360 -0
  386. package/dist/extensions/chunker.js.map +1 -0
  387. package/dist/extensions/embedding_provider.d.ts +18 -0
  388. package/dist/extensions/embedding_provider.js +150 -0
  389. package/dist/extensions/embedding_provider.js.map +1 -0
  390. package/dist/extensions/llm_provider.d.ts +33 -0
  391. package/dist/extensions/llm_provider.js +338 -0
  392. package/dist/extensions/llm_provider.js.map +1 -0
  393. package/dist/extensions/mcp_bridge.d.ts +44 -0
  394. package/dist/extensions/mcp_bridge.js +151 -0
  395. package/dist/extensions/mcp_bridge.js.map +1 -0
  396. package/dist/extensions/rag_search.d.ts +38 -0
  397. package/dist/extensions/rag_search.js +242 -0
  398. package/dist/extensions/rag_search.js.map +1 -0
  399. package/dist/extensions/snapshot.d.ts +14 -0
  400. package/dist/extensions/snapshot.js +158 -0
  401. package/dist/extensions/snapshot.js.map +1 -0
  402. package/dist/extensions/tool_executor.d.ts +28 -0
  403. package/dist/extensions/tool_executor.js +268 -0
  404. package/dist/extensions/tool_executor.js.map +1 -0
  405. package/dist/src/cli.d.ts +15 -0
  406. package/dist/src/cli.js +687 -0
  407. package/dist/src/cli.js.map +1 -0
  408. package/dist/src/config.d.ts +44 -0
  409. package/dist/src/config.js +165 -0
  410. package/dist/src/config.js.map +1 -0
  411. package/dist/src/context_builder.d.ts +51 -0
  412. package/dist/src/context_builder.js +558 -0
  413. package/dist/src/context_builder.js.map +1 -0
  414. package/dist/src/db_adapter.d.ts +24 -0
  415. package/dist/src/db_adapter.js +341 -0
  416. package/dist/src/db_adapter.js.map +1 -0
  417. package/dist/src/engine/session/compaction_logic.d.ts +11 -0
  418. package/dist/src/engine/session/compaction_logic.js +113 -0
  419. package/dist/src/engine/session/compaction_logic.js.map +1 -0
  420. package/dist/src/engine/session/instruction_loader.d.ts +5 -0
  421. package/dist/src/engine/session/instruction_loader.js +78 -0
  422. package/dist/src/engine/session/instruction_loader.js.map +1 -0
  423. package/dist/src/engine/session/overflow_check.d.ts +14 -0
  424. package/dist/src/engine/session/overflow_check.js +45 -0
  425. package/dist/src/engine/session/overflow_check.js.map +1 -0
  426. package/dist/src/engine/session/prompt.d.ts +45 -0
  427. package/dist/src/engine/session/prompt.js +584 -0
  428. package/dist/src/engine/session/prompt.js.map +1 -0
  429. package/dist/src/engine/session/provider_transform.d.ts +59 -0
  430. package/dist/src/engine/session/provider_transform.js +193 -0
  431. package/dist/src/engine/session/provider_transform.js.map +1 -0
  432. package/dist/src/engine/session/retry_logic.d.ts +12 -0
  433. package/dist/src/engine/session/retry_logic.js +72 -0
  434. package/dist/src/engine/session/retry_logic.js.map +1 -0
  435. package/dist/src/engine/session/system_prompt.d.ts +9 -0
  436. package/dist/src/engine/session/system_prompt.js +96 -0
  437. package/dist/src/engine/session/system_prompt.js.map +1 -0
  438. package/dist/src/engine/session/tool_registry.d.ts +5 -0
  439. package/dist/src/engine/session/tool_registry.js +117 -0
  440. package/dist/src/engine/session/tool_registry.js.map +1 -0
  441. package/dist/src/export.d.ts +13 -0
  442. package/dist/src/export.js +103 -0
  443. package/dist/src/export.js.map +1 -0
  444. package/dist/src/mdns.d.ts +7 -0
  445. package/dist/src/mdns.js +60 -0
  446. package/dist/src/mdns.js.map +1 -0
  447. package/dist/src/rag_worker.d.ts +38 -0
  448. package/dist/src/rag_worker.js +435 -0
  449. package/dist/src/rag_worker.js.map +1 -0
  450. package/dist/src/server.d.ts +11 -0
  451. package/dist/src/server.js +214 -0
  452. package/dist/src/server.js.map +1 -0
  453. package/dist/src/stats.d.ts +45 -0
  454. package/dist/src/stats.js +233 -0
  455. package/dist/src/stats.js.map +1 -0
  456. package/dist/src/tui.d.ts +29 -0
  457. package/dist/src/tui.js +1053 -0
  458. package/dist/src/tui.js.map +1 -0
  459. package/package.json +21 -5
  460. package/src/cli.ts +314 -113
  461. package/src/db_adapter.ts +354 -0
  462. package/src/engine/account/account.sql.ts +39 -39
  463. package/src/engine/account/account.ts +456 -456
  464. package/src/engine/account/repo.ts +166 -166
  465. package/src/engine/account/schema.ts +99 -99
  466. package/src/engine/account/url.ts +8 -8
  467. package/src/engine/acp/README.md +174 -174
  468. package/src/engine/acp/agent.ts +1968 -1968
  469. package/src/engine/acp/runtime.ts +22 -22
  470. package/src/engine/acp/session.ts +122 -122
  471. package/src/engine/acp/types.ts +24 -24
  472. package/src/engine/agent/agent.ts +463 -463
  473. package/src/engine/agent/generate.txt +75 -75
  474. package/src/engine/agent/prompt/compaction.txt +9 -9
  475. package/src/engine/agent/prompt/explore.txt +18 -18
  476. package/src/engine/agent/prompt/scout.txt +36 -36
  477. package/src/engine/agent/prompt/summary.txt +11 -11
  478. package/src/engine/agent/prompt/title.txt +44 -44
  479. package/src/engine/agent/subagent-permissions.ts +34 -34
  480. package/src/engine/auth/index.ts +96 -96
  481. package/src/engine/background/background/job.ts +200 -200
  482. package/src/engine/background/job.ts +200 -200
  483. package/src/engine/bus/bus-event.ts +45 -45
  484. package/src/engine/bus/global.ts +22 -22
  485. package/src/engine/bus/index.ts +203 -203
  486. package/src/engine/command/command/index.ts +181 -181
  487. package/src/engine/command/command/template/initialize.txt +66 -66
  488. package/src/engine/command/command/template/review.txt +101 -101
  489. package/src/engine/command/index.ts +181 -181
  490. package/src/engine/command/template/initialize.txt +66 -66
  491. package/src/engine/command/template/review.txt +101 -101
  492. package/src/engine/config/agent.ts +172 -172
  493. package/src/engine/config/attachment.ts +25 -25
  494. package/src/engine/config/command.ts +62 -62
  495. package/src/engine/config/config.ts +833 -833
  496. package/src/engine/config/console-state.ts +14 -14
  497. package/src/engine/config/entry-name.ts +16 -16
  498. package/src/engine/config/error.ts +23 -23
  499. package/src/engine/config/formatter.ts +13 -13
  500. package/src/engine/config/layout.ts +6 -6
  501. package/src/engine/config/lsp.ts +43 -43
  502. package/src/engine/config/managed.ts +71 -71
  503. package/src/engine/config/markdown.ts +96 -96
  504. package/src/engine/config/mcp.ts +56 -56
  505. package/src/engine/config/model-id.ts +5 -5
  506. package/src/engine/config/parse.ts +79 -79
  507. package/src/engine/config/paths.ts +45 -45
  508. package/src/engine/config/permission.ts +58 -58
  509. package/src/engine/config/plugin.ts +84 -84
  510. package/src/engine/config/provider.ts +111 -111
  511. package/src/engine/config/reference.ts +23 -23
  512. package/src/engine/config/server.ts +19 -19
  513. package/src/engine/config/skills.ts +14 -14
  514. package/src/engine/config/variable.ts +90 -90
  515. package/src/engine/control-plane/adapters/index.ts +41 -41
  516. package/src/engine/control-plane/adapters/worktree.ts +96 -96
  517. package/src/engine/control-plane/dev/README.md +19 -19
  518. package/src/engine/control-plane/dev/debug-workspace-plugin.ts +73 -73
  519. package/src/engine/control-plane/schema.ts +14 -14
  520. package/src/engine/control-plane/types.ts +59 -59
  521. package/src/engine/control-plane/util.ts +39 -39
  522. package/src/engine/control-plane/workspace-adapter-runtime.ts +51 -51
  523. package/src/engine/control-plane/workspace-context.ts +26 -26
  524. package/src/engine/control-plane/workspace.sql.ts +20 -20
  525. package/src/engine/control-plane/workspace.ts +1072 -1072
  526. package/src/engine/data-migration.ts +161 -161
  527. package/src/engine/effect/app-runtime.ts +143 -143
  528. package/src/engine/effect/bootstrap-runtime.ts +29 -29
  529. package/src/engine/effect/bridge.ts +84 -84
  530. package/src/engine/effect/config-service.ts +67 -67
  531. package/src/engine/effect/instance-ref.ts +11 -11
  532. package/src/engine/effect/instance-registry.ts +12 -12
  533. package/src/engine/effect/instance-state.ts +72 -72
  534. package/src/engine/effect/promise.ts +17 -17
  535. package/src/engine/effect/run-service.ts +47 -47
  536. package/src/engine/effect/runner.ts +217 -217
  537. package/src/engine/effect/runtime-flags.ts +74 -74
  538. package/src/engine/effect/service-use.ts +38 -38
  539. package/src/engine/env/index.ts +37 -37
  540. package/src/engine/event-v2-bridge.ts +89 -89
  541. package/src/engine/file/file/ignore.ts +81 -81
  542. package/src/engine/file/file/index.ts +651 -651
  543. package/src/engine/file/file/protected.ts +59 -59
  544. package/src/engine/file/file/ripgrep.ts +481 -481
  545. package/src/engine/file/file/watcher.ts +167 -167
  546. package/src/engine/file/ignore.ts +81 -81
  547. package/src/engine/file/index.ts +651 -651
  548. package/src/engine/file/protected.ts +59 -59
  549. package/src/engine/file/ripgrep.ts +481 -481
  550. package/src/engine/file/watcher.ts +167 -167
  551. package/src/engine/format/format/formatter.ts +404 -404
  552. package/src/engine/format/format/index.ts +209 -209
  553. package/src/engine/format/formatter.ts +404 -404
  554. package/src/engine/format/index.ts +209 -209
  555. package/src/engine/git/git/index.ts +347 -347
  556. package/src/engine/git/index.ts +347 -347
  557. package/src/engine/id/id.ts +80 -80
  558. package/src/engine/ide/index.ts +70 -70
  559. package/src/engine/image/image/image.ts +176 -176
  560. package/src/engine/image/image.ts +176 -176
  561. package/src/engine/index.ts +251 -251
  562. package/src/engine/installation/index.ts +327 -327
  563. package/src/engine/lsp/client.ts +707 -707
  564. package/src/engine/lsp/diagnostic.ts +29 -29
  565. package/src/engine/lsp/language.ts +121 -121
  566. package/src/engine/lsp/launch.ts +21 -21
  567. package/src/engine/lsp/lsp/client.ts +707 -707
  568. package/src/engine/lsp/lsp/diagnostic.ts +29 -29
  569. package/src/engine/lsp/lsp/language.ts +121 -121
  570. package/src/engine/lsp/lsp/launch.ts +21 -21
  571. package/src/engine/lsp/lsp/lsp.ts +507 -507
  572. package/src/engine/lsp/lsp/server.ts +2064 -2064
  573. package/src/engine/lsp/lsp.ts +507 -507
  574. package/src/engine/lsp/server.ts +2064 -2064
  575. package/src/engine/mcp/auth.ts +146 -146
  576. package/src/engine/mcp/index.ts +958 -958
  577. package/src/engine/mcp/mcp/auth.ts +146 -146
  578. package/src/engine/mcp/mcp/index.ts +958 -958
  579. package/src/engine/mcp/mcp/oauth-callback.ts +232 -232
  580. package/src/engine/mcp/mcp/oauth-provider.ts +214 -214
  581. package/src/engine/mcp/oauth-callback.ts +232 -232
  582. package/src/engine/mcp/oauth-provider.ts +214 -214
  583. package/src/engine/node.ts +6 -6
  584. package/src/engine/patch/index.ts +689 -689
  585. package/src/engine/patch/patch/index.ts +689 -689
  586. package/src/engine/permission/arity.ts +163 -163
  587. package/src/engine/permission/evaluate.ts +15 -15
  588. package/src/engine/permission/index.ts +306 -306
  589. package/src/engine/permission/permission/arity.ts +163 -163
  590. package/src/engine/permission/permission/evaluate.ts +15 -15
  591. package/src/engine/permission/permission/index.ts +306 -306
  592. package/src/engine/permission/permission/schema.ts +13 -13
  593. package/src/engine/permission/schema.ts +13 -13
  594. package/src/engine/plugin/azure.ts +26 -26
  595. package/src/engine/plugin/cloudflare.ts +76 -76
  596. package/src/engine/plugin/codex.ts +622 -622
  597. package/src/engine/plugin/digitalocean.ts +411 -411
  598. package/src/engine/plugin/github-copilot/copilot.ts +394 -394
  599. package/src/engine/plugin/github-copilot/models.ts +196 -196
  600. package/src/engine/plugin/index.ts +295 -295
  601. package/src/engine/plugin/install.ts +439 -439
  602. package/src/engine/plugin/loader.ts +216 -216
  603. package/src/engine/plugin/meta.ts +188 -188
  604. package/src/engine/plugin/shared.ts +323 -323
  605. package/src/engine/project/bootstrap-service.ts +9 -9
  606. package/src/engine/project/bootstrap.ts +75 -75
  607. package/src/engine/project/instance-context.ts +24 -24
  608. package/src/engine/project/instance-layer.ts +11 -11
  609. package/src/engine/project/instance-runtime.ts +16 -16
  610. package/src/engine/project/instance-store.ts +193 -193
  611. package/src/engine/project/project.sql.ts +17 -17
  612. package/src/engine/project/project.ts +537 -537
  613. package/src/engine/project/schema.ts +13 -13
  614. package/src/engine/project/vcs.ts +405 -405
  615. package/src/engine/provider/auth.ts +225 -225
  616. package/src/engine/provider/error.ts +204 -204
  617. package/src/engine/provider/model-status.ts +8 -8
  618. package/src/engine/provider/provider.ts +1843 -1843
  619. package/src/engine/provider/schema.ts +30 -30
  620. package/src/engine/provider/transform.ts +1376 -1376
  621. package/src/engine/pty/index.ts +365 -365
  622. package/src/engine/pty/input.ts +24 -24
  623. package/src/engine/pty/pty/index.ts +365 -365
  624. package/src/engine/pty/pty/input.ts +24 -24
  625. package/src/engine/pty/pty/pty.bun.ts +26 -26
  626. package/src/engine/pty/pty/pty.node.ts +27 -27
  627. package/src/engine/pty/pty/pty.ts +25 -25
  628. package/src/engine/pty/pty/schema.ts +14 -14
  629. package/src/engine/pty/pty/ticket.ts +68 -68
  630. package/src/engine/pty/pty.bun.ts +26 -26
  631. package/src/engine/pty/pty.node.ts +27 -27
  632. package/src/engine/pty/pty.ts +25 -25
  633. package/src/engine/pty/schema.ts +14 -14
  634. package/src/engine/pty/ticket.ts +68 -68
  635. package/src/engine/question/index.ts +213 -213
  636. package/src/engine/question/question/index.ts +213 -213
  637. package/src/engine/question/question/schema.ts +10 -10
  638. package/src/engine/question/schema.ts +10 -10
  639. package/src/engine/reference/reference/reference.ts +241 -241
  640. package/src/engine/reference/reference/repository-cache.ts +147 -147
  641. package/src/engine/reference/reference.ts +241 -241
  642. package/src/engine/reference/repository-cache.ts +147 -147
  643. package/src/engine/session/compaction.ts +651 -651
  644. package/src/engine/session/instruction.ts +238 -238
  645. package/src/engine/session/llm.ts +459 -459
  646. package/src/engine/session/message-error.ts +14 -14
  647. package/src/engine/session/message-v2.ts +1202 -1202
  648. package/src/engine/session/message.ts +146 -146
  649. package/src/engine/session/overflow.ts +32 -32
  650. package/src/engine/session/processor.ts +823 -823
  651. package/src/engine/session/prompt/anthropic.txt +105 -105
  652. package/src/engine/session/prompt/beast.txt +147 -147
  653. package/src/engine/session/prompt/build-switch.txt +5 -5
  654. package/src/engine/session/prompt/codex.txt +79 -79
  655. package/src/engine/session/prompt/copilot-gpt-5.txt +143 -143
  656. package/src/engine/session/prompt/default.txt +105 -105
  657. package/src/engine/session/prompt/gemini.txt +155 -155
  658. package/src/engine/session/prompt/gpt.txt +107 -107
  659. package/src/engine/session/prompt/kimi.txt +95 -95
  660. package/src/engine/session/prompt/max-steps.txt +15 -15
  661. package/src/engine/session/prompt/plan-reminder-anthropic.txt +67 -67
  662. package/src/engine/session/prompt/plan.txt +26 -26
  663. package/src/engine/session/prompt/trinity.txt +97 -97
  664. package/src/engine/session/prompt.ts +66 -9
  665. package/src/engine/session/retry.ts +200 -200
  666. package/src/engine/session/revert.ts +162 -162
  667. package/src/engine/session/run-state.ts +153 -153
  668. package/src/engine/session/schema.ts +26 -26
  669. package/src/engine/session/session.sql.ts +137 -137
  670. package/src/engine/session/session.ts +1011 -1011
  671. package/src/engine/session/status.ts +94 -94
  672. package/src/engine/session/summary.ts +164 -164
  673. package/src/engine/session/system.ts +84 -84
  674. package/src/engine/session/todo.ts +81 -81
  675. package/src/engine/share/session.ts +61 -61
  676. package/src/engine/share/share-next.ts +376 -376
  677. package/src/engine/share/share.sql.ts +13 -13
  678. package/src/engine/shell/shell/shell.ts +215 -215
  679. package/src/engine/shell/shell.ts +215 -215
  680. package/src/engine/skill/discovery.ts +116 -116
  681. package/src/engine/skill/index.ts +336 -336
  682. package/src/engine/skill/prompt/customize-opencode.md +377 -377
  683. package/src/engine/skill/skill/discovery.ts +116 -116
  684. package/src/engine/skill/skill/index.ts +336 -336
  685. package/src/engine/skill/skill/prompt/customize-opencode.md +377 -377
  686. package/src/engine/snapshot/index.ts +762 -762
  687. package/src/engine/snapshot/snapshot/index.ts +762 -762
  688. package/src/engine/sync/README.md +179 -179
  689. package/src/engine/sync/event.sql.ts +17 -17
  690. package/src/engine/sync/index.ts +410 -410
  691. package/src/engine/sync/schema.ts +11 -11
  692. package/src/engine/temporary.ts +33 -33
  693. package/src/engine/tool/apply_patch.ts +313 -313
  694. package/src/engine/tool/apply_patch.txt +33 -33
  695. package/src/engine/tool/edit.ts +711 -711
  696. package/src/engine/tool/edit.txt +10 -10
  697. package/src/engine/tool/external-directory.ts +49 -49
  698. package/src/engine/tool/glob.ts +103 -103
  699. package/src/engine/tool/glob.txt +6 -6
  700. package/src/engine/tool/grep.ts +156 -156
  701. package/src/engine/tool/grep.txt +8 -8
  702. package/src/engine/tool/invalid.ts +21 -21
  703. package/src/engine/tool/json-schema.ts +164 -164
  704. package/src/engine/tool/lsp.ts +113 -113
  705. package/src/engine/tool/lsp.txt +24 -24
  706. package/src/engine/tool/mcp-websearch.ts +96 -96
  707. package/src/engine/tool/plan-enter.txt +14 -14
  708. package/src/engine/tool/plan-exit.txt +13 -13
  709. package/src/engine/tool/plan.ts +78 -78
  710. package/src/engine/tool/question.ts +44 -44
  711. package/src/engine/tool/question.txt +10 -10
  712. package/src/engine/tool/read.ts +337 -337
  713. package/src/engine/tool/read.txt +14 -14
  714. package/src/engine/tool/registry.ts +472 -472
  715. package/src/engine/tool/repo_clone.ts +80 -80
  716. package/src/engine/tool/repo_clone.txt +5 -5
  717. package/src/engine/tool/repo_overview.ts +279 -279
  718. package/src/engine/tool/repo_overview.txt +4 -4
  719. package/src/engine/tool/schema.ts +14 -14
  720. package/src/engine/tool/shell/id.ts +19 -19
  721. package/src/engine/tool/shell/prompt.ts +295 -295
  722. package/src/engine/tool/shell/shell.txt +77 -77
  723. package/src/engine/tool/shell.ts +647 -647
  724. package/src/engine/tool/skill.ts +75 -75
  725. package/src/engine/tool/skill.txt +5 -5
  726. package/src/engine/tool/task.ts +337 -337
  727. package/src/engine/tool/task.txt +58 -58
  728. package/src/engine/tool/task_status.ts +179 -179
  729. package/src/engine/tool/task_status.txt +13 -13
  730. package/src/engine/tool/todo.ts +57 -57
  731. package/src/engine/tool/todowrite.txt +167 -167
  732. package/src/engine/tool/tool/apply_patch.ts +313 -313
  733. package/src/engine/tool/tool/apply_patch.txt +33 -33
  734. package/src/engine/tool/tool/edit.ts +711 -711
  735. package/src/engine/tool/tool/edit.txt +10 -10
  736. package/src/engine/tool/tool/external-directory.ts +49 -49
  737. package/src/engine/tool/tool/glob.ts +103 -103
  738. package/src/engine/tool/tool/glob.txt +6 -6
  739. package/src/engine/tool/tool/grep.ts +156 -156
  740. package/src/engine/tool/tool/grep.txt +8 -8
  741. package/src/engine/tool/tool/invalid.ts +21 -21
  742. package/src/engine/tool/tool/json-schema.ts +164 -164
  743. package/src/engine/tool/tool/lsp.ts +113 -113
  744. package/src/engine/tool/tool/lsp.txt +24 -24
  745. package/src/engine/tool/tool/mcp-websearch.ts +96 -96
  746. package/src/engine/tool/tool/plan-enter.txt +14 -14
  747. package/src/engine/tool/tool/plan-exit.txt +13 -13
  748. package/src/engine/tool/tool/plan.ts +78 -78
  749. package/src/engine/tool/tool/question.ts +44 -44
  750. package/src/engine/tool/tool/question.txt +10 -10
  751. package/src/engine/tool/tool/read.ts +337 -337
  752. package/src/engine/tool/tool/read.txt +14 -14
  753. package/src/engine/tool/tool/registry.ts +472 -472
  754. package/src/engine/tool/tool/repo_clone.ts +80 -80
  755. package/src/engine/tool/tool/repo_clone.txt +5 -5
  756. package/src/engine/tool/tool/repo_overview.ts +279 -279
  757. package/src/engine/tool/tool/repo_overview.txt +4 -4
  758. package/src/engine/tool/tool/schema.ts +14 -14
  759. package/src/engine/tool/tool/shell/id.ts +19 -19
  760. package/src/engine/tool/tool/shell/prompt.ts +295 -295
  761. package/src/engine/tool/tool/shell/shell.txt +77 -77
  762. package/src/engine/tool/tool/shell.ts +647 -647
  763. package/src/engine/tool/tool/skill.ts +75 -75
  764. package/src/engine/tool/tool/skill.txt +5 -5
  765. package/src/engine/tool/tool/task.ts +337 -337
  766. package/src/engine/tool/tool/task.txt +58 -58
  767. package/src/engine/tool/tool/task_status.ts +179 -179
  768. package/src/engine/tool/tool/task_status.txt +13 -13
  769. package/src/engine/tool/tool/todo.ts +57 -57
  770. package/src/engine/tool/tool/todowrite.txt +167 -167
  771. package/src/engine/tool/tool/tool.ts +164 -164
  772. package/src/engine/tool/tool/truncate.ts +160 -160
  773. package/src/engine/tool/tool/truncation-dir.ts +4 -4
  774. package/src/engine/tool/tool/webfetch.ts +192 -192
  775. package/src/engine/tool/tool/webfetch.txt +13 -13
  776. package/src/engine/tool/tool/websearch.ts +143 -143
  777. package/src/engine/tool/tool/websearch.txt +14 -14
  778. package/src/engine/tool/tool/write.ts +104 -104
  779. package/src/engine/tool/tool/write.txt +8 -8
  780. package/src/engine/tool/tool.ts +164 -164
  781. package/src/engine/tool/truncate.ts +160 -160
  782. package/src/engine/tool/truncation-dir.ts +4 -4
  783. package/src/engine/tool/webfetch.ts +192 -192
  784. package/src/engine/tool/webfetch.txt +13 -13
  785. package/src/engine/tool/websearch.ts +143 -143
  786. package/src/engine/tool/websearch.txt +14 -14
  787. package/src/engine/tool/write.ts +104 -104
  788. package/src/engine/tool/write.txt +8 -8
  789. package/src/engine/util/archive.ts +17 -17
  790. package/src/engine/util/bom.ts +31 -31
  791. package/src/engine/util/data-url.ts +9 -9
  792. package/src/engine/util/defer.ts +10 -10
  793. package/src/engine/util/effect-http-client.ts +11 -11
  794. package/src/engine/util/error.ts +88 -88
  795. package/src/engine/util/filesystem.ts +252 -252
  796. package/src/engine/util/format.ts +20 -20
  797. package/src/engine/util/iife.ts +3 -3
  798. package/src/engine/util/lazy.ts +20 -20
  799. package/src/engine/util/local-context.ts +25 -25
  800. package/src/engine/util/locale.ts +86 -86
  801. package/src/engine/util/media.ts +26 -26
  802. package/src/engine/util/process.ts +176 -176
  803. package/src/engine/util/queue.ts +32 -32
  804. package/src/engine/util/record.ts +3 -3
  805. package/src/engine/util/repository.ts +158 -158
  806. package/src/engine/util/rpc.ts +66 -66
  807. package/src/engine/util/signal.ts +12 -12
  808. package/src/engine/util/timeout.ts +13 -13
  809. package/src/engine/util/token.ts +7 -7
  810. package/src/engine/util/util/archive.ts +17 -17
  811. package/src/engine/util/util/bom.ts +31 -31
  812. package/src/engine/util/util/data-url.ts +9 -9
  813. package/src/engine/util/util/defer.ts +10 -10
  814. package/src/engine/util/util/effect-http-client.ts +11 -11
  815. package/src/engine/util/util/error.ts +88 -88
  816. package/src/engine/util/util/filesystem.ts +252 -252
  817. package/src/engine/util/util/format.ts +20 -20
  818. package/src/engine/util/util/iife.ts +3 -3
  819. package/src/engine/util/util/lazy.ts +20 -20
  820. package/src/engine/util/util/local-context.ts +25 -25
  821. package/src/engine/util/util/locale.ts +86 -86
  822. package/src/engine/util/util/media.ts +26 -26
  823. package/src/engine/util/util/process.ts +176 -176
  824. package/src/engine/util/util/queue.ts +32 -32
  825. package/src/engine/util/util/record.ts +3 -3
  826. package/src/engine/util/util/repository.ts +158 -158
  827. package/src/engine/util/util/rpc.ts +66 -66
  828. package/src/engine/util/util/signal.ts +12 -12
  829. package/src/engine/util/util/timeout.ts +13 -13
  830. package/src/engine/util/util/token.ts +7 -7
  831. package/src/engine/util/util/which.ts +14 -14
  832. package/src/engine/util/util/wildcard.ts +59 -59
  833. package/src/engine/util/which.ts +14 -14
  834. package/src/engine/util/wildcard.ts +59 -59
  835. package/src/engine/worktree/index.ts +621 -621
  836. package/src/export.ts +122 -0
  837. package/src/mdns.ts +53 -0
  838. package/src/server.ts +151 -156
  839. package/src/stats.ts +290 -0
  840. package/src/tui.ts +964 -480
@@ -1,365 +1,365 @@
1
- import { BusEvent } from "@/bus/bus-event"
2
- import { Bus } from "@/bus"
3
- import { Config } from "@/config/config"
4
- import { InstanceState } from "@/effect/instance-state"
5
- import { EffectBridge } from "@/effect/bridge"
6
- import { lazy } from "@opencode-ai/core/util/lazy"
7
- import { Plugin } from "@/plugin"
8
- import { Shell } from "@/shell/shell"
9
- import type { Proc } from "#pty"
10
- import * as Log from "@opencode-ai/core/util/log"
11
- import { PtyID } from "./schema"
12
- import { Effect, Layer, Context, Schema, Types } from "effect"
13
- import { NonNegativeInt, PositiveInt } from "@opencode-ai/core/schema"
14
-
15
- const log = Log.create({ service: "pty" })
16
-
17
- const BUFFER_LIMIT = 1024 * 1024 * 2
18
- const BUFFER_CHUNK = 64 * 1024
19
- const encoder = new TextEncoder()
20
-
21
- type Socket = {
22
- readyState: number
23
- data?: unknown
24
- send: (data: string | Uint8Array | ArrayBuffer) => void
25
- close: (code?: number, reason?: string) => void
26
- }
27
-
28
- const sock = (ws: Socket) => (ws.data && typeof ws.data === "object" ? ws.data : ws)
29
-
30
- type Active = {
31
- info: Info
32
- process: Proc
33
- buffer: string
34
- bufferCursor: number
35
- cursor: number
36
- subscribers: Map<unknown, Socket>
37
- }
38
-
39
- type State = {
40
- dir: string
41
- sessions: Map<PtyID, Active>
42
- }
43
-
44
- // WebSocket control frame: 0x00 + UTF-8 JSON.
45
- const meta = (cursor: number) => {
46
- const json = JSON.stringify({ cursor })
47
- const bytes = encoder.encode(json)
48
- const out = new Uint8Array(bytes.length + 1)
49
- out[0] = 0
50
- out.set(bytes, 1)
51
- return out
52
- }
53
-
54
- const pty = lazy(() => import("#pty"))
55
-
56
- export const Info = Schema.Struct({
57
- id: PtyID,
58
- title: Schema.String,
59
- command: Schema.String,
60
- args: Schema.Array(Schema.String),
61
- cwd: Schema.String,
62
- status: Schema.Literals(["running", "exited"]),
63
- pid: PositiveInt,
64
- }).annotate({ identifier: "Pty" })
65
-
66
- export type Info = Types.DeepMutable<Schema.Schema.Type<typeof Info>>
67
-
68
- export const CreateInput = Schema.Struct({
69
- command: Schema.optional(Schema.String),
70
- args: Schema.optional(Schema.Array(Schema.String)),
71
- cwd: Schema.optional(Schema.String),
72
- title: Schema.optional(Schema.String),
73
- env: Schema.optional(Schema.Record(Schema.String, Schema.String)),
74
- })
75
-
76
- export type CreateInput = Types.DeepMutable<Schema.Schema.Type<typeof CreateInput>>
77
-
78
- export const UpdateInput = Schema.Struct({
79
- title: Schema.optional(Schema.String),
80
- size: Schema.optional(
81
- Schema.Struct({
82
- rows: PositiveInt,
83
- cols: PositiveInt,
84
- }),
85
- ),
86
- })
87
-
88
- export type UpdateInput = Types.DeepMutable<Schema.Schema.Type<typeof UpdateInput>>
89
-
90
- export const Event = {
91
- Created: BusEvent.define("pty.created", Schema.Struct({ info: Info })),
92
- Updated: BusEvent.define("pty.updated", Schema.Struct({ info: Info })),
93
- Exited: BusEvent.define("pty.exited", Schema.Struct({ id: PtyID, exitCode: NonNegativeInt })),
94
- Deleted: BusEvent.define("pty.deleted", Schema.Struct({ id: PtyID })),
95
- }
96
-
97
- export interface Interface {
98
- readonly list: () => Effect.Effect<Info[]>
99
- readonly get: (id: PtyID) => Effect.Effect<Info | undefined>
100
- readonly create: (input: CreateInput) => Effect.Effect<Info>
101
- readonly update: (id: PtyID, input: UpdateInput) => Effect.Effect<Info | undefined>
102
- readonly remove: (id: PtyID) => Effect.Effect<void>
103
- readonly resize: (id: PtyID, cols: number, rows: number) => Effect.Effect<void>
104
- readonly write: (id: PtyID, data: string) => Effect.Effect<void>
105
- readonly connect: (
106
- id: PtyID,
107
- ws: Socket,
108
- cursor?: number,
109
- ) => Effect.Effect<{ onMessage: (message: string | ArrayBuffer) => void; onClose: () => void } | undefined>
110
- }
111
-
112
- export class Service extends Context.Service<Service, Interface>()("@opencode/Pty") {}
113
-
114
- export const layer = Layer.effect(
115
- Service,
116
- Effect.gen(function* () {
117
- const config = yield* Config.Service
118
- const bus = yield* Bus.Service
119
- const plugin = yield* Plugin.Service
120
-
121
- function teardown(session: Active) {
122
- try {
123
- session.process.kill()
124
- } catch {}
125
- for (const [sub, ws] of session.subscribers.entries()) {
126
- try {
127
- if (sock(ws) === sub) ws.close()
128
- } catch {}
129
- }
130
- session.subscribers.clear()
131
- }
132
-
133
- const state = yield* InstanceState.make<State>(
134
- Effect.fn("Pty.state")(function* (ctx) {
135
- const state = {
136
- dir: ctx.directory,
137
- sessions: new Map<PtyID, Active>(),
138
- }
139
-
140
- yield* Effect.addFinalizer(() =>
141
- Effect.sync(() => {
142
- for (const session of state.sessions.values()) {
143
- teardown(session)
144
- }
145
- state.sessions.clear()
146
- }),
147
- )
148
-
149
- return state
150
- }),
151
- )
152
-
153
- const remove = Effect.fn("Pty.remove")(function* (id: PtyID) {
154
- const s = yield* InstanceState.get(state)
155
- const session = s.sessions.get(id)
156
- if (!session) return
157
- s.sessions.delete(id)
158
- log.info("removing session", { id })
159
- teardown(session)
160
- yield* bus.publish(Event.Deleted, { id: session.info.id })
161
- })
162
-
163
- const list = Effect.fn("Pty.list")(function* () {
164
- const s = yield* InstanceState.get(state)
165
- return Array.from(s.sessions.values()).map((session) => session.info)
166
- })
167
-
168
- const get = Effect.fn("Pty.get")(function* (id: PtyID) {
169
- const s = yield* InstanceState.get(state)
170
- return s.sessions.get(id)?.info
171
- })
172
-
173
- const create = Effect.fn("Pty.create")(function* (input: CreateInput) {
174
- const s = yield* InstanceState.get(state)
175
- const bridge = yield* EffectBridge.make()
176
- const cfg = yield* config.get()
177
- const id = PtyID.ascending()
178
- const command = input.command || Shell.preferred(cfg.shell)
179
- const args = input.args || []
180
- if (Shell.login(command)) {
181
- args.push("-l")
182
- }
183
-
184
- const cwd = input.cwd || s.dir
185
- const shell = yield* plugin.trigger("shell.env", { cwd }, { env: {} })
186
- const env = {
187
- ...process.env,
188
- ...input.env,
189
- ...shell.env,
190
- TERM: "xterm-256color",
191
- OPENCODE_TERMINAL: "1",
192
- } as Record<string, string>
193
-
194
- if (process.platform === "win32") {
195
- env.LC_ALL = "C.UTF-8"
196
- env.LC_CTYPE = "C.UTF-8"
197
- env.LANG = "C.UTF-8"
198
- }
199
- log.info("creating session", { id, cmd: command, args, cwd })
200
-
201
- const { spawn } = yield* Effect.promise(() => pty())
202
- const proc = yield* Effect.sync(() =>
203
- spawn(command, args, {
204
- name: "xterm-256color",
205
- cwd,
206
- env,
207
- }),
208
- )
209
-
210
- const info = {
211
- id,
212
- title: input.title || `Terminal ${id.slice(-4)}`,
213
- command,
214
- args,
215
- cwd,
216
- status: "running",
217
- pid: proc.pid,
218
- } as const
219
- const session: Active = {
220
- info,
221
- process: proc,
222
- buffer: "",
223
- bufferCursor: 0,
224
- cursor: 0,
225
- subscribers: new Map(),
226
- }
227
- s.sessions.set(id, session)
228
- proc.onData((chunk) => {
229
- session.cursor += chunk.length
230
-
231
- for (const [key, ws] of session.subscribers.entries()) {
232
- if (ws.readyState !== 1) {
233
- session.subscribers.delete(key)
234
- continue
235
- }
236
- if (sock(ws) !== key) {
237
- session.subscribers.delete(key)
238
- continue
239
- }
240
- try {
241
- ws.send(chunk)
242
- } catch {
243
- session.subscribers.delete(key)
244
- }
245
- }
246
-
247
- session.buffer += chunk
248
- if (session.buffer.length <= BUFFER_LIMIT) return
249
- const excess = session.buffer.length - BUFFER_LIMIT
250
- session.buffer = session.buffer.slice(excess)
251
- session.bufferCursor += excess
252
- })
253
- proc.onExit(({ exitCode }) => {
254
- if (session.info.status === "exited") return
255
- log.info("session exited", { id, exitCode })
256
- session.info.status = "exited"
257
- bridge.fork(bus.publish(Event.Exited, { id, exitCode }))
258
- bridge.fork(remove(id))
259
- })
260
- yield* bus.publish(Event.Created, { info })
261
- return info
262
- })
263
-
264
- const update = Effect.fn("Pty.update")(function* (id: PtyID, input: UpdateInput) {
265
- const s = yield* InstanceState.get(state)
266
- const session = s.sessions.get(id)
267
- if (!session) return
268
- if (input.title) {
269
- session.info.title = input.title
270
- }
271
- if (input.size) {
272
- session.process.resize(input.size.cols, input.size.rows)
273
- }
274
- yield* bus.publish(Event.Updated, { info: session.info })
275
- return session.info
276
- })
277
-
278
- const resize = Effect.fn("Pty.resize")(function* (id: PtyID, cols: number, rows: number) {
279
- const s = yield* InstanceState.get(state)
280
- const session = s.sessions.get(id)
281
- if (session && session.info.status === "running") {
282
- session.process.resize(cols, rows)
283
- }
284
- })
285
-
286
- const write = Effect.fn("Pty.write")(function* (id: PtyID, data: string) {
287
- const s = yield* InstanceState.get(state)
288
- const session = s.sessions.get(id)
289
- if (session && session.info.status === "running") {
290
- session.process.write(data)
291
- }
292
- })
293
-
294
- const connect = Effect.fn("Pty.connect")(function* (id: PtyID, ws: Socket, cursor?: number) {
295
- const s = yield* InstanceState.get(state)
296
- const session = s.sessions.get(id)
297
- if (!session) {
298
- ws.close()
299
- return
300
- }
301
- log.info("client connected to session", { id })
302
-
303
- const sub = sock(ws)
304
- session.subscribers.delete(sub)
305
- session.subscribers.set(sub, ws)
306
-
307
- const cleanup = () => {
308
- session.subscribers.delete(sub)
309
- }
310
-
311
- const start = session.bufferCursor
312
- const end = session.cursor
313
- const from =
314
- cursor === -1 ? end : typeof cursor === "number" && Number.isSafeInteger(cursor) ? Math.max(0, cursor) : 0
315
-
316
- const data = (() => {
317
- if (!session.buffer) return ""
318
- if (from >= end) return ""
319
- const offset = Math.max(0, from - start)
320
- if (offset >= session.buffer.length) return ""
321
- return session.buffer.slice(offset)
322
- })()
323
-
324
- if (data) {
325
- try {
326
- for (let i = 0; i < data.length; i += BUFFER_CHUNK) {
327
- ws.send(data.slice(i, i + BUFFER_CHUNK))
328
- }
329
- } catch {
330
- cleanup()
331
- ws.close()
332
- return
333
- }
334
- }
335
-
336
- try {
337
- ws.send(meta(end))
338
- } catch {
339
- cleanup()
340
- ws.close()
341
- return
342
- }
343
-
344
- return {
345
- onMessage: (message: string | ArrayBuffer) => {
346
- session.process.write(typeof message === "string" ? message : new TextDecoder().decode(message))
347
- },
348
- onClose: () => {
349
- log.info("client disconnected from session", { id })
350
- cleanup()
351
- },
352
- }
353
- })
354
-
355
- return Service.of({ list, get, create, update, remove, resize, write, connect })
356
- }),
357
- )
358
-
359
- export const defaultLayer = layer.pipe(
360
- Layer.provide(Bus.layer),
361
- Layer.provide(Plugin.defaultLayer),
362
- Layer.provide(Config.defaultLayer),
363
- )
364
-
365
- export * as Pty from "."
1
+ import { BusEvent } from "@/bus/bus-event"
2
+ import { Bus } from "@/bus"
3
+ import { Config } from "@/config/config"
4
+ import { InstanceState } from "@/effect/instance-state"
5
+ import { EffectBridge } from "@/effect/bridge"
6
+ import { lazy } from "@opencode-ai/core/util/lazy"
7
+ import { Plugin } from "@/plugin"
8
+ import { Shell } from "@/shell/shell"
9
+ import type { Proc } from "#pty"
10
+ import * as Log from "@opencode-ai/core/util/log"
11
+ import { PtyID } from "./schema"
12
+ import { Effect, Layer, Context, Schema, Types } from "effect"
13
+ import { NonNegativeInt, PositiveInt } from "@opencode-ai/core/schema"
14
+
15
+ const log = Log.create({ service: "pty" })
16
+
17
+ const BUFFER_LIMIT = 1024 * 1024 * 2
18
+ const BUFFER_CHUNK = 64 * 1024
19
+ const encoder = new TextEncoder()
20
+
21
+ type Socket = {
22
+ readyState: number
23
+ data?: unknown
24
+ send: (data: string | Uint8Array | ArrayBuffer) => void
25
+ close: (code?: number, reason?: string) => void
26
+ }
27
+
28
+ const sock = (ws: Socket) => (ws.data && typeof ws.data === "object" ? ws.data : ws)
29
+
30
+ type Active = {
31
+ info: Info
32
+ process: Proc
33
+ buffer: string
34
+ bufferCursor: number
35
+ cursor: number
36
+ subscribers: Map<unknown, Socket>
37
+ }
38
+
39
+ type State = {
40
+ dir: string
41
+ sessions: Map<PtyID, Active>
42
+ }
43
+
44
+ // WebSocket control frame: 0x00 + UTF-8 JSON.
45
+ const meta = (cursor: number) => {
46
+ const json = JSON.stringify({ cursor })
47
+ const bytes = encoder.encode(json)
48
+ const out = new Uint8Array(bytes.length + 1)
49
+ out[0] = 0
50
+ out.set(bytes, 1)
51
+ return out
52
+ }
53
+
54
+ const pty = lazy(() => import("#pty"))
55
+
56
+ export const Info = Schema.Struct({
57
+ id: PtyID,
58
+ title: Schema.String,
59
+ command: Schema.String,
60
+ args: Schema.Array(Schema.String),
61
+ cwd: Schema.String,
62
+ status: Schema.Literals(["running", "exited"]),
63
+ pid: PositiveInt,
64
+ }).annotate({ identifier: "Pty" })
65
+
66
+ export type Info = Types.DeepMutable<Schema.Schema.Type<typeof Info>>
67
+
68
+ export const CreateInput = Schema.Struct({
69
+ command: Schema.optional(Schema.String),
70
+ args: Schema.optional(Schema.Array(Schema.String)),
71
+ cwd: Schema.optional(Schema.String),
72
+ title: Schema.optional(Schema.String),
73
+ env: Schema.optional(Schema.Record(Schema.String, Schema.String)),
74
+ })
75
+
76
+ export type CreateInput = Types.DeepMutable<Schema.Schema.Type<typeof CreateInput>>
77
+
78
+ export const UpdateInput = Schema.Struct({
79
+ title: Schema.optional(Schema.String),
80
+ size: Schema.optional(
81
+ Schema.Struct({
82
+ rows: PositiveInt,
83
+ cols: PositiveInt,
84
+ }),
85
+ ),
86
+ })
87
+
88
+ export type UpdateInput = Types.DeepMutable<Schema.Schema.Type<typeof UpdateInput>>
89
+
90
+ export const Event = {
91
+ Created: BusEvent.define("pty.created", Schema.Struct({ info: Info })),
92
+ Updated: BusEvent.define("pty.updated", Schema.Struct({ info: Info })),
93
+ Exited: BusEvent.define("pty.exited", Schema.Struct({ id: PtyID, exitCode: NonNegativeInt })),
94
+ Deleted: BusEvent.define("pty.deleted", Schema.Struct({ id: PtyID })),
95
+ }
96
+
97
+ export interface Interface {
98
+ readonly list: () => Effect.Effect<Info[]>
99
+ readonly get: (id: PtyID) => Effect.Effect<Info | undefined>
100
+ readonly create: (input: CreateInput) => Effect.Effect<Info>
101
+ readonly update: (id: PtyID, input: UpdateInput) => Effect.Effect<Info | undefined>
102
+ readonly remove: (id: PtyID) => Effect.Effect<void>
103
+ readonly resize: (id: PtyID, cols: number, rows: number) => Effect.Effect<void>
104
+ readonly write: (id: PtyID, data: string) => Effect.Effect<void>
105
+ readonly connect: (
106
+ id: PtyID,
107
+ ws: Socket,
108
+ cursor?: number,
109
+ ) => Effect.Effect<{ onMessage: (message: string | ArrayBuffer) => void; onClose: () => void } | undefined>
110
+ }
111
+
112
+ export class Service extends Context.Service<Service, Interface>()("@opencode/Pty") {}
113
+
114
+ export const layer = Layer.effect(
115
+ Service,
116
+ Effect.gen(function* () {
117
+ const config = yield* Config.Service
118
+ const bus = yield* Bus.Service
119
+ const plugin = yield* Plugin.Service
120
+
121
+ function teardown(session: Active) {
122
+ try {
123
+ session.process.kill()
124
+ } catch {}
125
+ for (const [sub, ws] of session.subscribers.entries()) {
126
+ try {
127
+ if (sock(ws) === sub) ws.close()
128
+ } catch {}
129
+ }
130
+ session.subscribers.clear()
131
+ }
132
+
133
+ const state = yield* InstanceState.make<State>(
134
+ Effect.fn("Pty.state")(function* (ctx) {
135
+ const state = {
136
+ dir: ctx.directory,
137
+ sessions: new Map<PtyID, Active>(),
138
+ }
139
+
140
+ yield* Effect.addFinalizer(() =>
141
+ Effect.sync(() => {
142
+ for (const session of state.sessions.values()) {
143
+ teardown(session)
144
+ }
145
+ state.sessions.clear()
146
+ }),
147
+ )
148
+
149
+ return state
150
+ }),
151
+ )
152
+
153
+ const remove = Effect.fn("Pty.remove")(function* (id: PtyID) {
154
+ const s = yield* InstanceState.get(state)
155
+ const session = s.sessions.get(id)
156
+ if (!session) return
157
+ s.sessions.delete(id)
158
+ log.info("removing session", { id })
159
+ teardown(session)
160
+ yield* bus.publish(Event.Deleted, { id: session.info.id })
161
+ })
162
+
163
+ const list = Effect.fn("Pty.list")(function* () {
164
+ const s = yield* InstanceState.get(state)
165
+ return Array.from(s.sessions.values()).map((session) => session.info)
166
+ })
167
+
168
+ const get = Effect.fn("Pty.get")(function* (id: PtyID) {
169
+ const s = yield* InstanceState.get(state)
170
+ return s.sessions.get(id)?.info
171
+ })
172
+
173
+ const create = Effect.fn("Pty.create")(function* (input: CreateInput) {
174
+ const s = yield* InstanceState.get(state)
175
+ const bridge = yield* EffectBridge.make()
176
+ const cfg = yield* config.get()
177
+ const id = PtyID.ascending()
178
+ const command = input.command || Shell.preferred(cfg.shell)
179
+ const args = input.args || []
180
+ if (Shell.login(command)) {
181
+ args.push("-l")
182
+ }
183
+
184
+ const cwd = input.cwd || s.dir
185
+ const shell = yield* plugin.trigger("shell.env", { cwd }, { env: {} })
186
+ const env = {
187
+ ...process.env,
188
+ ...input.env,
189
+ ...shell.env,
190
+ TERM: "xterm-256color",
191
+ OPENCODE_TERMINAL: "1",
192
+ } as Record<string, string>
193
+
194
+ if (process.platform === "win32") {
195
+ env.LC_ALL = "C.UTF-8"
196
+ env.LC_CTYPE = "C.UTF-8"
197
+ env.LANG = "C.UTF-8"
198
+ }
199
+ log.info("creating session", { id, cmd: command, args, cwd })
200
+
201
+ const { spawn } = yield* Effect.promise(() => pty())
202
+ const proc = yield* Effect.sync(() =>
203
+ spawn(command, args, {
204
+ name: "xterm-256color",
205
+ cwd,
206
+ env,
207
+ }),
208
+ )
209
+
210
+ const info = {
211
+ id,
212
+ title: input.title || `Terminal ${id.slice(-4)}`,
213
+ command,
214
+ args,
215
+ cwd,
216
+ status: "running",
217
+ pid: proc.pid,
218
+ } as const
219
+ const session: Active = {
220
+ info,
221
+ process: proc,
222
+ buffer: "",
223
+ bufferCursor: 0,
224
+ cursor: 0,
225
+ subscribers: new Map(),
226
+ }
227
+ s.sessions.set(id, session)
228
+ proc.onData((chunk) => {
229
+ session.cursor += chunk.length
230
+
231
+ for (const [key, ws] of session.subscribers.entries()) {
232
+ if (ws.readyState !== 1) {
233
+ session.subscribers.delete(key)
234
+ continue
235
+ }
236
+ if (sock(ws) !== key) {
237
+ session.subscribers.delete(key)
238
+ continue
239
+ }
240
+ try {
241
+ ws.send(chunk)
242
+ } catch {
243
+ session.subscribers.delete(key)
244
+ }
245
+ }
246
+
247
+ session.buffer += chunk
248
+ if (session.buffer.length <= BUFFER_LIMIT) return
249
+ const excess = session.buffer.length - BUFFER_LIMIT
250
+ session.buffer = session.buffer.slice(excess)
251
+ session.bufferCursor += excess
252
+ })
253
+ proc.onExit(({ exitCode }) => {
254
+ if (session.info.status === "exited") return
255
+ log.info("session exited", { id, exitCode })
256
+ session.info.status = "exited"
257
+ bridge.fork(bus.publish(Event.Exited, { id, exitCode }))
258
+ bridge.fork(remove(id))
259
+ })
260
+ yield* bus.publish(Event.Created, { info })
261
+ return info
262
+ })
263
+
264
+ const update = Effect.fn("Pty.update")(function* (id: PtyID, input: UpdateInput) {
265
+ const s = yield* InstanceState.get(state)
266
+ const session = s.sessions.get(id)
267
+ if (!session) return
268
+ if (input.title) {
269
+ session.info.title = input.title
270
+ }
271
+ if (input.size) {
272
+ session.process.resize(input.size.cols, input.size.rows)
273
+ }
274
+ yield* bus.publish(Event.Updated, { info: session.info })
275
+ return session.info
276
+ })
277
+
278
+ const resize = Effect.fn("Pty.resize")(function* (id: PtyID, cols: number, rows: number) {
279
+ const s = yield* InstanceState.get(state)
280
+ const session = s.sessions.get(id)
281
+ if (session && session.info.status === "running") {
282
+ session.process.resize(cols, rows)
283
+ }
284
+ })
285
+
286
+ const write = Effect.fn("Pty.write")(function* (id: PtyID, data: string) {
287
+ const s = yield* InstanceState.get(state)
288
+ const session = s.sessions.get(id)
289
+ if (session && session.info.status === "running") {
290
+ session.process.write(data)
291
+ }
292
+ })
293
+
294
+ const connect = Effect.fn("Pty.connect")(function* (id: PtyID, ws: Socket, cursor?: number) {
295
+ const s = yield* InstanceState.get(state)
296
+ const session = s.sessions.get(id)
297
+ if (!session) {
298
+ ws.close()
299
+ return
300
+ }
301
+ log.info("client connected to session", { id })
302
+
303
+ const sub = sock(ws)
304
+ session.subscribers.delete(sub)
305
+ session.subscribers.set(sub, ws)
306
+
307
+ const cleanup = () => {
308
+ session.subscribers.delete(sub)
309
+ }
310
+
311
+ const start = session.bufferCursor
312
+ const end = session.cursor
313
+ const from =
314
+ cursor === -1 ? end : typeof cursor === "number" && Number.isSafeInteger(cursor) ? Math.max(0, cursor) : 0
315
+
316
+ const data = (() => {
317
+ if (!session.buffer) return ""
318
+ if (from >= end) return ""
319
+ const offset = Math.max(0, from - start)
320
+ if (offset >= session.buffer.length) return ""
321
+ return session.buffer.slice(offset)
322
+ })()
323
+
324
+ if (data) {
325
+ try {
326
+ for (let i = 0; i < data.length; i += BUFFER_CHUNK) {
327
+ ws.send(data.slice(i, i + BUFFER_CHUNK))
328
+ }
329
+ } catch {
330
+ cleanup()
331
+ ws.close()
332
+ return
333
+ }
334
+ }
335
+
336
+ try {
337
+ ws.send(meta(end))
338
+ } catch {
339
+ cleanup()
340
+ ws.close()
341
+ return
342
+ }
343
+
344
+ return {
345
+ onMessage: (message: string | ArrayBuffer) => {
346
+ session.process.write(typeof message === "string" ? message : new TextDecoder().decode(message))
347
+ },
348
+ onClose: () => {
349
+ log.info("client disconnected from session", { id })
350
+ cleanup()
351
+ },
352
+ }
353
+ })
354
+
355
+ return Service.of({ list, get, create, update, remove, resize, write, connect })
356
+ }),
357
+ )
358
+
359
+ export const defaultLayer = layer.pipe(
360
+ Layer.provide(Bus.layer),
361
+ Layer.provide(Plugin.defaultLayer),
362
+ Layer.provide(Config.defaultLayer),
363
+ )
364
+
365
+ export * as Pty from "."