onlycode 1.18.0 → 1.19.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 (417) hide show
  1. package/package.json +11 -146
  2. package/src/account/account.ts +0 -463
  3. package/src/account/repo.ts +0 -173
  4. package/src/account/schema.ts +0 -99
  5. package/src/account/url.ts +0 -8
  6. package/src/acp/agent.ts +0 -95
  7. package/src/acp/config-option.ts +0 -203
  8. package/src/acp/content.ts +0 -250
  9. package/src/acp/directory.ts +0 -210
  10. package/src/acp/error.ts +0 -90
  11. package/src/acp/event.ts +0 -342
  12. package/src/acp/permission.ts +0 -124
  13. package/src/acp/profile.ts +0 -42
  14. package/src/acp/service.ts +0 -1048
  15. package/src/acp/session.ts +0 -231
  16. package/src/acp/tool.ts +0 -367
  17. package/src/acp/usage.ts +0 -232
  18. package/src/agent/agent.ts +0 -459
  19. package/src/agent/generate.txt +0 -75
  20. package/src/agent/prompt/compaction.txt +0 -9
  21. package/src/agent/prompt/explore.txt +0 -18
  22. package/src/agent/prompt/summary.txt +0 -11
  23. package/src/agent/prompt/title.txt +0 -44
  24. package/src/agent/subagent-permissions.ts +0 -27
  25. package/src/audio.d.ts +0 -14
  26. package/src/auth/index.ts +0 -99
  27. package/src/background/job.ts +0 -39
  28. package/src/bus/global.ts +0 -22
  29. package/src/cli/bootstrap.ts +0 -11
  30. package/src/cli/cmd/account.ts +0 -264
  31. package/src/cli/cmd/acp.ts +0 -73
  32. package/src/cli/cmd/agent.ts +0 -259
  33. package/src/cli/cmd/attach.ts +0 -97
  34. package/src/cli/cmd/cmd.ts +0 -7
  35. package/src/cli/cmd/db.ts +0 -62
  36. package/src/cli/cmd/debug/agent.handler.ts +0 -193
  37. package/src/cli/cmd/debug/agent.ts +0 -27
  38. package/src/cli/cmd/debug/config.ts +0 -14
  39. package/src/cli/cmd/debug/file.ts +0 -73
  40. package/src/cli/cmd/debug/index.ts +0 -87
  41. package/src/cli/cmd/debug/lsp.ts +0 -50
  42. package/src/cli/cmd/debug/ripgrep.ts +0 -79
  43. package/src/cli/cmd/debug/scrap.ts +0 -15
  44. package/src/cli/cmd/debug/skill.ts +0 -15
  45. package/src/cli/cmd/debug/snapshot.ts +0 -50
  46. package/src/cli/cmd/debug/startup.ts +0 -11
  47. package/src/cli/cmd/debug/v2.ts +0 -44
  48. package/src/cli/cmd/export.ts +0 -292
  49. package/src/cli/cmd/generate.ts +0 -54
  50. package/src/cli/cmd/github.handler.ts +0 -1593
  51. package/src/cli/cmd/github.shared.ts +0 -30
  52. package/src/cli/cmd/github.ts +0 -42
  53. package/src/cli/cmd/import.ts +0 -224
  54. package/src/cli/cmd/mcp.ts +0 -849
  55. package/src/cli/cmd/models.ts +0 -66
  56. package/src/cli/cmd/plug.ts +0 -230
  57. package/src/cli/cmd/pr.ts +0 -115
  58. package/src/cli/cmd/prompt-display.ts +0 -1
  59. package/src/cli/cmd/providers.ts +0 -534
  60. package/src/cli/cmd/run/demo.ts +0 -1274
  61. package/src/cli/cmd/run/entry.body.ts +0 -205
  62. package/src/cli/cmd/run/footer.command.tsx +0 -1064
  63. package/src/cli/cmd/run/footer.menu.tsx +0 -351
  64. package/src/cli/cmd/run/footer.permission.tsx +0 -472
  65. package/src/cli/cmd/run/footer.prompt.tsx +0 -1306
  66. package/src/cli/cmd/run/footer.question.tsx +0 -573
  67. package/src/cli/cmd/run/footer.subagent.tsx +0 -173
  68. package/src/cli/cmd/run/footer.ts +0 -1129
  69. package/src/cli/cmd/run/footer.view.tsx +0 -943
  70. package/src/cli/cmd/run/footer.width.ts +0 -27
  71. package/src/cli/cmd/run/permission.shared.ts +0 -256
  72. package/src/cli/cmd/run/prompt.editor.ts +0 -157
  73. package/src/cli/cmd/run/prompt.shared.ts +0 -153
  74. package/src/cli/cmd/run/question.shared.ts +0 -340
  75. package/src/cli/cmd/run/runtime.boot.ts +0 -202
  76. package/src/cli/cmd/run/runtime.lifecycle.ts +0 -406
  77. package/src/cli/cmd/run/runtime.queue.ts +0 -349
  78. package/src/cli/cmd/run/runtime.shared.ts +0 -17
  79. package/src/cli/cmd/run/runtime.stdin.ts +0 -37
  80. package/src/cli/cmd/run/runtime.ts +0 -814
  81. package/src/cli/cmd/run/scrollback.shared.ts +0 -92
  82. package/src/cli/cmd/run/scrollback.surface.ts +0 -431
  83. package/src/cli/cmd/run/scrollback.writer.tsx +0 -352
  84. package/src/cli/cmd/run/session-data.ts +0 -1113
  85. package/src/cli/cmd/run/session-replay.ts +0 -374
  86. package/src/cli/cmd/run/session.shared.ts +0 -196
  87. package/src/cli/cmd/run/splash.ts +0 -275
  88. package/src/cli/cmd/run/stream.transport.ts +0 -1462
  89. package/src/cli/cmd/run/stream.ts +0 -175
  90. package/src/cli/cmd/run/subagent-data.ts +0 -876
  91. package/src/cli/cmd/run/theme.ts +0 -690
  92. package/src/cli/cmd/run/tool.ts +0 -1489
  93. package/src/cli/cmd/run/trace.ts +0 -94
  94. package/src/cli/cmd/run/turn-summary.ts +0 -47
  95. package/src/cli/cmd/run/types.ts +0 -350
  96. package/src/cli/cmd/run/variant.shared.ts +0 -215
  97. package/src/cli/cmd/run.ts +0 -894
  98. package/src/cli/cmd/serve.ts +0 -24
  99. package/src/cli/cmd/session.ts +0 -147
  100. package/src/cli/cmd/stats.ts +0 -393
  101. package/src/cli/cmd/tui.ts +0 -224
  102. package/src/cli/cmd/uninstall.ts +0 -353
  103. package/src/cli/cmd/upgrade.ts +0 -74
  104. package/src/cli/cmd/web.ts +0 -84
  105. package/src/cli/effect/prompt.ts +0 -37
  106. package/src/cli/effect-cmd.ts +0 -96
  107. package/src/cli/error.ts +0 -130
  108. package/src/cli/heap.ts +0 -45
  109. package/src/cli/logo-pixel.ts +0 -35
  110. package/src/cli/logo.ts +0 -1
  111. package/src/cli/network.ts +0 -64
  112. package/src/cli/tui/layer.ts +0 -7
  113. package/src/cli/tui/validate-session.ts +0 -29
  114. package/src/cli/tui/worker.ts +0 -71
  115. package/src/cli/ui.ts +0 -148
  116. package/src/cli/upgrade.ts +0 -53
  117. package/src/command/index.ts +0 -184
  118. package/src/command/template/initialize.txt +0 -66
  119. package/src/command/template/review.txt +0 -101
  120. package/src/config/agent.ts +0 -59
  121. package/src/config/command.ts +0 -39
  122. package/src/config/config.ts +0 -686
  123. package/src/config/entry-name.ts +0 -19
  124. package/src/config/managed.ts +0 -69
  125. package/src/config/markdown.ts +0 -36
  126. package/src/config/parse.ts +0 -79
  127. package/src/config/paths.ts +0 -45
  128. package/src/config/plugin.ts +0 -79
  129. package/src/config/tui-cwd.ts +0 -5
  130. package/src/config/tui-host-attention.ts +0 -21
  131. package/src/config/tui-migrate.ts +0 -132
  132. package/src/config/tui.ts +0 -274
  133. package/src/config/variable.ts +0 -91
  134. package/src/control-plane/adapters/index.ts +0 -41
  135. package/src/control-plane/adapters/worktree.ts +0 -96
  136. package/src/control-plane/dev/README.md +0 -19
  137. package/src/control-plane/dev/debug-workspace-plugin.ts +0 -73
  138. package/src/control-plane/types.ts +0 -59
  139. package/src/control-plane/util.ts +0 -39
  140. package/src/control-plane/workspace-adapter-runtime.ts +0 -51
  141. package/src/control-plane/workspace-context.ts +0 -26
  142. package/src/control-plane/workspace.ts +0 -989
  143. package/src/effect/app-runtime.ts +0 -132
  144. package/src/effect/bootstrap-runtime.ts +0 -23
  145. package/src/effect/bridge.ts +0 -84
  146. package/src/effect/config-service.ts +0 -67
  147. package/src/effect/instance-ref.ts +0 -11
  148. package/src/effect/instance-registry.ts +0 -12
  149. package/src/effect/instance-state.ts +0 -69
  150. package/src/effect/promise.ts +0 -17
  151. package/src/effect/run-service.ts +0 -47
  152. package/src/effect/runner.ts +0 -217
  153. package/src/effect/runtime-flags.ts +0 -79
  154. package/src/env/index.ts +0 -43
  155. package/src/event-v2-bridge.ts +0 -79
  156. package/src/format/formatter.ts +0 -404
  157. package/src/format/index.ts +0 -205
  158. package/src/git/index.ts +0 -350
  159. package/src/id/id.ts +0 -80
  160. package/src/ide/index.ts +0 -61
  161. package/src/image/image.ts +0 -174
  162. package/src/index.ts +0 -142
  163. package/src/installation/index.ts +0 -350
  164. package/src/lsp/client.ts +0 -650
  165. package/src/lsp/diagnostic.ts +0 -29
  166. package/src/lsp/language.ts +0 -121
  167. package/src/lsp/launch.ts +0 -21
  168. package/src/lsp/lsp.ts +0 -511
  169. package/src/lsp/server.ts +0 -1983
  170. package/src/markdown.d.ts +0 -4
  171. package/src/mcp/auth.ts +0 -174
  172. package/src/mcp/catalog.ts +0 -153
  173. package/src/mcp/index.ts +0 -953
  174. package/src/mcp/oauth-callback.ts +0 -233
  175. package/src/mcp/oauth-provider.ts +0 -206
  176. package/src/node.ts +0 -4
  177. package/src/patch/index.ts +0 -686
  178. package/src/permission/arity.ts +0 -163
  179. package/src/permission/evaluate.ts +0 -1
  180. package/src/permission/index.ts +0 -230
  181. package/src/plugin/azure.ts +0 -26
  182. package/src/plugin/cloudflare.ts +0 -76
  183. package/src/plugin/digitalocean.ts +0 -383
  184. package/src/plugin/github-copilot/copilot.ts +0 -414
  185. package/src/plugin/github-copilot/models.ts +0 -246
  186. package/src/plugin/index.ts +0 -316
  187. package/src/plugin/install.ts +0 -439
  188. package/src/plugin/loader.ts +0 -237
  189. package/src/plugin/meta.ts +0 -188
  190. package/src/plugin/openai/README.md +0 -31
  191. package/src/plugin/openai/codex.ts +0 -641
  192. package/src/plugin/openai/ws-pool.ts +0 -270
  193. package/src/plugin/openai/ws.ts +0 -381
  194. package/src/plugin/pty-environment.ts +0 -24
  195. package/src/plugin/shared.ts +0 -323
  196. package/src/plugin/snowflake-cortex.ts +0 -529
  197. package/src/plugin/tui/internal.ts +0 -10
  198. package/src/plugin/tui/runtime.ts +0 -1130
  199. package/src/plugin/xai.ts +0 -716
  200. package/src/project/bootstrap-service.ts +0 -9
  201. package/src/project/bootstrap.ts +0 -76
  202. package/src/project/instance-context.ts +0 -24
  203. package/src/project/instance-layer.ts +0 -11
  204. package/src/project/instance-runtime.ts +0 -16
  205. package/src/project/instance-store.ts +0 -209
  206. package/src/project/project.ts +0 -519
  207. package/src/project/vcs.ts +0 -431
  208. package/src/provider/auth.ts +0 -233
  209. package/src/provider/error.ts +0 -188
  210. package/src/provider/model-status.ts +0 -8
  211. package/src/provider/provider.ts +0 -1975
  212. package/src/provider/transform.ts +0 -1543
  213. package/src/question/index.ts +0 -229
  214. package/src/question/schema.ts +0 -10
  215. package/src/server/auth.ts +0 -48
  216. package/src/server/event.ts +0 -13
  217. package/src/server/global-lifecycle.ts +0 -28
  218. package/src/server/init-projectors.ts +0 -3
  219. package/src/server/mdns.ts +0 -47
  220. package/src/server/projectors.ts +0 -1
  221. package/src/server/proxy-util.ts +0 -48
  222. package/src/server/routes/instance/httpapi/AGENTS.md +0 -39
  223. package/src/server/routes/instance/httpapi/api.ts +0 -78
  224. package/src/server/routes/instance/httpapi/errors.ts +0 -193
  225. package/src/server/routes/instance/httpapi/groups/config.ts +0 -65
  226. package/src/server/routes/instance/httpapi/groups/control-plane.ts +0 -35
  227. package/src/server/routes/instance/httpapi/groups/control.ts +0 -76
  228. package/src/server/routes/instance/httpapi/groups/event.ts +0 -29
  229. package/src/server/routes/instance/httpapi/groups/experimental.ts +0 -275
  230. package/src/server/routes/instance/httpapi/groups/file.ts +0 -185
  231. package/src/server/routes/instance/httpapi/groups/global.ts +0 -138
  232. package/src/server/routes/instance/httpapi/groups/instance.ts +0 -206
  233. package/src/server/routes/instance/httpapi/groups/mcp.ts +0 -156
  234. package/src/server/routes/instance/httpapi/groups/metadata.ts +0 -18
  235. package/src/server/routes/instance/httpapi/groups/permission.ts +0 -61
  236. package/src/server/routes/instance/httpapi/groups/project-copy.ts +0 -32
  237. package/src/server/routes/instance/httpapi/groups/project.ts +0 -93
  238. package/src/server/routes/instance/httpapi/groups/provider.ts +0 -101
  239. package/src/server/routes/instance/httpapi/groups/pty.ts +0 -172
  240. package/src/server/routes/instance/httpapi/groups/query.ts +0 -12
  241. package/src/server/routes/instance/httpapi/groups/question.ts +0 -74
  242. package/src/server/routes/instance/httpapi/groups/session.ts +0 -462
  243. package/src/server/routes/instance/httpapi/groups/sync.ts +0 -113
  244. package/src/server/routes/instance/httpapi/groups/tui.ts +0 -208
  245. package/src/server/routes/instance/httpapi/groups/workspace.ts +0 -141
  246. package/src/server/routes/instance/httpapi/handlers/config.ts +0 -34
  247. package/src/server/routes/instance/httpapi/handlers/control-plane.ts +0 -37
  248. package/src/server/routes/instance/httpapi/handlers/control.ts +0 -43
  249. package/src/server/routes/instance/httpapi/handlers/event.ts +0 -99
  250. package/src/server/routes/instance/httpapi/handlers/experimental.ts +0 -192
  251. package/src/server/routes/instance/httpapi/handlers/file.ts +0 -139
  252. package/src/server/routes/instance/httpapi/handlers/global.ts +0 -156
  253. package/src/server/routes/instance/httpapi/handlers/instance.ts +0 -110
  254. package/src/server/routes/instance/httpapi/handlers/mcp.ts +0 -111
  255. package/src/server/routes/instance/httpapi/handlers/permission.ts +0 -41
  256. package/src/server/routes/instance/httpapi/handlers/project-copy.ts +0 -83
  257. package/src/server/routes/instance/httpapi/handlers/project.ts +0 -63
  258. package/src/server/routes/instance/httpapi/handlers/provider.ts +0 -113
  259. package/src/server/routes/instance/httpapi/handlers/pty.ts +0 -273
  260. package/src/server/routes/instance/httpapi/handlers/question.ts +0 -54
  261. package/src/server/routes/instance/httpapi/handlers/session-errors.ts +0 -21
  262. package/src/server/routes/instance/httpapi/handlers/session.ts +0 -440
  263. package/src/server/routes/instance/httpapi/handlers/sync.ts +0 -89
  264. package/src/server/routes/instance/httpapi/handlers/tui.ts +0 -131
  265. package/src/server/routes/instance/httpapi/handlers/workspace.ts +0 -102
  266. package/src/server/routes/instance/httpapi/lifecycle.ts +0 -54
  267. package/src/server/routes/instance/httpapi/middleware/authorization.ts +0 -150
  268. package/src/server/routes/instance/httpapi/middleware/compression.ts +0 -64
  269. package/src/server/routes/instance/httpapi/middleware/cors-vary.ts +0 -29
  270. package/src/server/routes/instance/httpapi/middleware/error.ts +0 -43
  271. package/src/server/routes/instance/httpapi/middleware/fence.ts +0 -25
  272. package/src/server/routes/instance/httpapi/middleware/instance-context.ts +0 -43
  273. package/src/server/routes/instance/httpapi/middleware/proxy.ts +0 -108
  274. package/src/server/routes/instance/httpapi/middleware/schema-error.ts +0 -41
  275. package/src/server/routes/instance/httpapi/middleware/workspace-routing.ts +0 -250
  276. package/src/server/routes/instance/httpapi/public.ts +0 -535
  277. package/src/server/routes/instance/httpapi/server.ts +0 -298
  278. package/src/server/routes/instance/httpapi/websocket-tracker.ts +0 -57
  279. package/src/server/server.ts +0 -225
  280. package/src/server/shared/fence.ts +0 -60
  281. package/src/server/shared/pty-ticket.ts +0 -15
  282. package/src/server/shared/public-ui.ts +0 -12
  283. package/src/server/shared/tui-control.ts +0 -28
  284. package/src/server/shared/ui.ts +0 -108
  285. package/src/server/shared/workspace-routing.ts +0 -38
  286. package/src/server/tui-event.ts +0 -53
  287. package/src/session/compaction.ts +0 -620
  288. package/src/session/instruction.ts +0 -241
  289. package/src/session/llm/AGENTS.md +0 -90
  290. package/src/session/llm/ai-sdk.ts +0 -288
  291. package/src/session/llm/native-request.ts +0 -196
  292. package/src/session/llm/native-runtime.ts +0 -195
  293. package/src/session/llm/request.ts +0 -216
  294. package/src/session/llm.ts +0 -415
  295. package/src/session/message-error.ts +0 -14
  296. package/src/session/message-v2.ts +0 -747
  297. package/src/session/message.ts +0 -148
  298. package/src/session/overflow.ts +0 -34
  299. package/src/session/processor.ts +0 -1084
  300. package/src/session/prompt/anthropic.txt +0 -109
  301. package/src/session/prompt/beast.txt +0 -151
  302. package/src/session/prompt/build-switch.txt +0 -9
  303. package/src/session/prompt/codex.txt +0 -83
  304. package/src/session/prompt/copilot-gpt-5.txt +0 -147
  305. package/src/session/prompt/default.txt +0 -99
  306. package/src/session/prompt/gemini.txt +0 -159
  307. package/src/session/prompt/gpt.txt +0 -111
  308. package/src/session/prompt/kimi.txt +0 -99
  309. package/src/session/prompt/plan-mode.txt +0 -74
  310. package/src/session/prompt/plan-reminder-anthropic.txt +0 -71
  311. package/src/session/prompt/plan.txt +0 -30
  312. package/src/session/prompt/trinity.txt +0 -101
  313. package/src/session/prompt.ts +0 -1707
  314. package/src/session/reminders.ts +0 -92
  315. package/src/session/retry.ts +0 -201
  316. package/src/session/revert.ts +0 -160
  317. package/src/session/run-state.ts +0 -156
  318. package/src/session/schema.ts +0 -26
  319. package/src/session/session.ts +0 -1119
  320. package/src/session/status.ts +0 -97
  321. package/src/session/summary.ts +0 -165
  322. package/src/session/system.ts +0 -117
  323. package/src/session/todo.ts +0 -90
  324. package/src/session/tools.ts +0 -207
  325. package/src/share/session.ts +0 -61
  326. package/src/share/share-next.ts +0 -385
  327. package/src/skill/discovery.ts +0 -109
  328. package/src/skill/index.ts +0 -366
  329. package/src/snapshot/index.ts +0 -808
  330. package/src/sql.d.ts +0 -4
  331. package/src/storage/schema.ts +0 -5
  332. package/src/storage/storage.ts +0 -329
  333. package/src/sync/README.md +0 -179
  334. package/src/sync/schema.ts +0 -11
  335. package/src/temporary.ts +0 -31
  336. package/src/tool/apply_patch.ts +0 -315
  337. package/src/tool/apply_patch.txt +0 -33
  338. package/src/tool/apply_patch.zh.txt +0 -33
  339. package/src/tool/description.ts +0 -100
  340. package/src/tool/edit.ts +0 -739
  341. package/src/tool/edit.txt +0 -10
  342. package/src/tool/edit.zh.txt +0 -10
  343. package/src/tool/external-directory.ts +0 -49
  344. package/src/tool/glob.ts +0 -78
  345. package/src/tool/glob.txt +0 -6
  346. package/src/tool/glob.zh.txt +0 -6
  347. package/src/tool/grep.ts +0 -114
  348. package/src/tool/grep.txt +0 -8
  349. package/src/tool/grep.zh.txt +0 -8
  350. package/src/tool/invalid.ts +0 -21
  351. package/src/tool/json-schema.ts +0 -164
  352. package/src/tool/lsp.ts +0 -115
  353. package/src/tool/lsp.txt +0 -24
  354. package/src/tool/lsp.zh.txt +0 -24
  355. package/src/tool/mcp-websearch.ts +0 -96
  356. package/src/tool/plan-enter.txt +0 -14
  357. package/src/tool/plan-enter.zh.txt +0 -14
  358. package/src/tool/plan-exit.txt +0 -13
  359. package/src/tool/plan-exit.zh.txt +0 -13
  360. package/src/tool/plan.ts +0 -81
  361. package/src/tool/question.ts +0 -46
  362. package/src/tool/question.txt +0 -10
  363. package/src/tool/question.zh.txt +0 -10
  364. package/src/tool/read.ts +0 -388
  365. package/src/tool/read.txt +0 -14
  366. package/src/tool/read.zh.txt +0 -14
  367. package/src/tool/registry.ts +0 -440
  368. package/src/tool/schema.ts +0 -14
  369. package/src/tool/shell/id.ts +0 -19
  370. package/src/tool/shell/prompt.ts +0 -307
  371. package/src/tool/shell/shell.txt +0 -21
  372. package/src/tool/shell.ts +0 -657
  373. package/src/tool/skill.ts +0 -73
  374. package/src/tool/skill.txt +0 -5
  375. package/src/tool/skill.zh.txt +0 -5
  376. package/src/tool/task.ts +0 -348
  377. package/src/tool/task.txt +0 -19
  378. package/src/tool/task.zh.txt +0 -19
  379. package/src/tool/todo.ts +0 -59
  380. package/src/tool/todowrite.txt +0 -44
  381. package/src/tool/todowrite.zh.txt +0 -44
  382. package/src/tool/tool.ts +0 -183
  383. package/src/tool/truncate.ts +0 -158
  384. package/src/tool/truncation-dir.ts +0 -4
  385. package/src/tool/webfetch.ts +0 -194
  386. package/src/tool/webfetch.txt +0 -13
  387. package/src/tool/webfetch.zh.txt +0 -13
  388. package/src/tool/websearch.ts +0 -145
  389. package/src/tool/websearch.txt +0 -14
  390. package/src/tool/websearch.zh.txt +0 -14
  391. package/src/tool/write.ts +0 -106
  392. package/src/tool/write.txt +0 -8
  393. package/src/tool/write.zh.txt +0 -8
  394. package/src/util/archive.ts +0 -17
  395. package/src/util/bom.ts +0 -27
  396. package/src/util/data-url.ts +0 -9
  397. package/src/util/defer.ts +0 -10
  398. package/src/util/effect-http-client.ts +0 -11
  399. package/src/util/error.ts +0 -1
  400. package/src/util/filesystem.ts +0 -251
  401. package/src/util/html.ts +0 -8
  402. package/src/util/iife.ts +0 -3
  403. package/src/util/lazy.ts +0 -20
  404. package/src/util/local-context.ts +0 -25
  405. package/src/util/locale.ts +0 -2
  406. package/src/util/media.ts +0 -26
  407. package/src/util/process.ts +0 -177
  408. package/src/util/proxy-env.ts +0 -72
  409. package/src/util/queue.ts +0 -32
  410. package/src/util/record.ts +0 -1
  411. package/src/util/repository.ts +0 -232
  412. package/src/util/rpc.ts +0 -66
  413. package/src/util/signal.ts +0 -12
  414. package/src/util/timeout.ts +0 -13
  415. package/src/util/token.ts +0 -1
  416. package/src/util/wildcard.ts +0 -59
  417. package/src/worktree/index.ts +0 -654
package/src/config/tui.ts DELETED
@@ -1,274 +0,0 @@
1
- export * as TuiConfig from "./tui"
2
-
3
- import path from "path"
4
- import { mergeDeep, unique } from "remeda"
5
- import { Cause, Context, Effect, Fiber, Layer } from "effect"
6
- import { ConfigParse } from "@/config/parse"
7
- import * as ConfigPaths from "@/config/paths"
8
- import { migrateTuiConfig } from "./tui-migrate"
9
- import { resolveHostAttentionSoundPaths } from "./tui-host-attention"
10
- import { Flag } from "@opencode-ai/core/flag/flag"
11
- import { isRecord } from "@opencode-ai/tui/util/record"
12
- import { Global } from "@opencode-ai/core/global"
13
- import { FSUtil } from "@opencode-ai/core/fs-util"
14
- import { CurrentWorkingDirectory } from "./tui-cwd"
15
- import { ConfigPlugin } from "@/config/plugin"
16
- import { TuiKeybind } from "@opencode-ai/tui/config/keybind"
17
- import { InstallationLocal, InstallationVersion } from "@opencode-ai/core/installation/version"
18
- import { makeRuntime } from "@opencode-ai/core/effect/runtime"
19
- import { Filesystem } from "@/util/filesystem"
20
- import { ConfigVariable } from "@/config/variable"
21
- import { Npm } from "@opencode-ai/core/npm"
22
- import { FormatError, FormatUnknownError } from "@/cli/error"
23
- import { TuiConfig } from "@opencode-ai/tui/config"
24
-
25
- export const Info = TuiConfig.Info
26
- export type Info = TuiConfig.Info
27
-
28
- type Acc = {
29
- result: Info
30
- plugin_origins: ConfigPlugin.Origin[]
31
- }
32
-
33
- export type Resolved = TuiConfig.Resolved
34
-
35
- export type HostMetadata = {
36
- plugin_origins?: ConfigPlugin.Origin[]
37
- }
38
-
39
- export interface Interface {
40
- readonly get: () => Effect.Effect<Resolved>
41
- readonly pluginOrigins: () => Effect.Effect<ConfigPlugin.Origin[]>
42
- readonly waitForDependencies: () => Effect.Effect<void>
43
- }
44
-
45
- export class Service extends Context.Service<Service, Interface>()("@opencode/TuiConfig") {}
46
-
47
- function pluginScope(file: string, ctx: { directory: string }): ConfigPlugin.Scope {
48
- if (Filesystem.contains(ctx.directory, file)) return "local"
49
- // if (ctx.worktree !== "/" && Filesystem.contains(ctx.worktree, file)) return "local"
50
- return "global"
51
- }
52
-
53
- function normalize(raw: Record<string, unknown>) {
54
- const data = { ...raw }
55
- if (!("tui" in data)) return data
56
- if (!isRecord(data.tui)) {
57
- delete data.tui
58
- return data
59
- }
60
-
61
- const tui = data.tui
62
- delete data.tui
63
- return {
64
- ...tui,
65
- ...data,
66
- }
67
- }
68
-
69
- function dropUnknownKeybinds(input: Record<string, unknown>) {
70
- if (!isRecord(input.keybinds)) return input
71
-
72
- const invalid = TuiKeybind.unknownKeys(input.keybinds)
73
- if (!invalid.length) return input
74
-
75
- return {
76
- ...input,
77
- keybinds: Object.fromEntries(Object.entries(input.keybinds).filter(([key]) => !invalid.includes(key))),
78
- }
79
- }
80
-
81
- const loadState = Effect.fn("TuiConfig.loadState")(function* (ctx: { directory: string }) {
82
- const afs = yield* FSUtil.Service
83
- let appliedOrder = 0
84
-
85
- const resolvePlugins = (config: Info, configFilepath: string): Effect.Effect<Info> =>
86
- Effect.gen(function* () {
87
- const plugins = config.plugin
88
- if (!plugins) return config
89
- return {
90
- ...config,
91
- plugin: yield* Effect.forEach(plugins, (plugin) =>
92
- Effect.promise(() => ConfigPlugin.resolvePluginSpec(plugin as ConfigPlugin.Origin["spec"], configFilepath)),
93
- ),
94
- }
95
- })
96
-
97
- const load = (text: string, configFilepath: string): Effect.Effect<Info> =>
98
- Effect.gen(function* () {
99
- const expanded = yield* Effect.promise(() =>
100
- ConfigVariable.substitute({ text, type: "path", path: configFilepath, missing: "empty" }),
101
- )
102
- const data = ConfigParse.jsonc(expanded, configFilepath)
103
- if (!isRecord(data)) return {} as Info
104
- // Flatten a nested "tui" key so users who wrote `{ "tui": { ... } }` inside tui.json
105
- // (mirroring the old opencode.json shape) still get their settings applied.
106
- const normalized = dropUnknownKeybinds(normalize(data))
107
- const parsed = ConfigParse.schema(Info, normalized, configFilepath)
108
- const validated = parsed.attention?.sounds
109
- ? {
110
- ...parsed,
111
- attention: {
112
- ...parsed.attention,
113
- sounds: resolveHostAttentionSoundPaths(path.dirname(configFilepath), parsed.attention.sounds),
114
- },
115
- }
116
- : parsed
117
- return yield* resolvePlugins(validated, configFilepath)
118
- }).pipe(
119
- // catchCause (not tapErrorCause + orElseSucceed) because JSONC parsing and validation
120
- // can sync-throw — those become defects, which orElseSucceed wouldn't catch.
121
- Effect.catchCause((cause) =>
122
- Effect.logWarning("skipping invalid tui config", {
123
- path: configFilepath,
124
- reason: FormatError(Cause.squash(cause)) ?? FormatUnknownError(Cause.squash(cause)),
125
- }).pipe(Effect.as({} as Info)),
126
- ),
127
- )
128
-
129
- const loadFile = (filepath: string): Effect.Effect<Info> =>
130
- Effect.gen(function* () {
131
- // Silent-swallow non-NotFound read errors (perms, EISDIR, IO) → log + skip.
132
- // Matches how parse/schema/plugin failures in load() are handled — every
133
- // broken-config path degrades gracefully rather than crashing TUI startup.
134
- const text = yield* afs.readFileStringSafe(filepath).pipe(
135
- Effect.catchCause((cause) =>
136
- Effect.logWarning("failed to read tui config", {
137
- path: filepath,
138
- reason: FormatError(Cause.squash(cause)) ?? FormatUnknownError(Cause.squash(cause)),
139
- }).pipe(Effect.as(undefined)),
140
- ),
141
- )
142
- if (!text) return {} as Info
143
- yield* Effect.logInfo("loading tui config", { path: filepath })
144
- return yield* load(text, filepath)
145
- })
146
-
147
- const mergeFile = (acc: Acc, file: string) =>
148
- Effect.gen(function* () {
149
- const data = yield* loadFile(file)
150
- if (Object.keys(data).length) {
151
- appliedOrder += 1
152
- yield* Effect.logInfo("applying tui config", { path: file, order: appliedOrder })
153
- }
154
- acc.result = mergeDeep(acc.result, data)
155
- if (!data.plugin?.length) return
156
-
157
- const scope = pluginScope(file, ctx)
158
- const plugins = ConfigPlugin.deduplicatePluginOrigins([
159
- ...acc.plugin_origins,
160
- ...data.plugin.map((spec) => ({ spec: spec as ConfigPlugin.Origin["spec"], scope, source: file })),
161
- ])
162
- acc.result = {
163
- ...acc.result,
164
- plugin: plugins.map((item) => item.spec),
165
- }
166
- acc.plugin_origins = plugins
167
- })
168
-
169
- // Every config dir we may read from: global config dir, any `.opencode`
170
- // folders between cwd and home, and OPENCODE_CONFIG_DIR.
171
- const directories = yield* ConfigPaths.directories(ctx.directory)
172
- yield* Effect.promise(() => migrateTuiConfig({ directories, cwd: ctx.directory }))
173
-
174
- const projectFiles = Flag.OPENCODE_DISABLE_PROJECT_CONFIG ? [] : yield* ConfigPaths.files("tui", ctx.directory)
175
-
176
- const acc: Acc = {
177
- result: {},
178
- plugin_origins: [],
179
- }
180
-
181
- // 1. Global tui config (lowest precedence).
182
- for (const file of ConfigPaths.fileInDirectory(Global.Path.config, "tui")) {
183
- yield* mergeFile(acc, file)
184
- }
185
-
186
- // 2. Explicit OPENCODE_TUI_CONFIG override, if set.
187
- if (Flag.OPENCODE_TUI_CONFIG) {
188
- const configFile = Flag.OPENCODE_TUI_CONFIG
189
- yield* mergeFile(acc, configFile)
190
- yield* Effect.logDebug("loaded custom tui config", { path: configFile })
191
- }
192
-
193
- // 3. Project tui files, applied root-first so the closest file wins.
194
- for (const file of projectFiles) {
195
- yield* mergeFile(acc, file)
196
- }
197
-
198
- // 4. `.opencode` directories (and OPENCODE_CONFIG_DIR) discovered while
199
- // walking up the tree. Also returned below so callers can install plugin
200
- // dependencies from each location.
201
- const dirs = unique(directories).filter((dir) => dir.endsWith(".opencode") || dir === Flag.OPENCODE_CONFIG_DIR)
202
-
203
- for (const dir of dirs) {
204
- if (!dir.endsWith(".opencode") && dir !== Flag.OPENCODE_CONFIG_DIR) continue
205
- for (const file of ConfigPaths.fileInDirectory(dir, "tui")) {
206
- yield* mergeFile(acc, file)
207
- }
208
- }
209
-
210
- const result = TuiConfig.resolve(
211
- {
212
- ...acc.result,
213
- },
214
- {
215
- terminalSuspend: process.platform !== "win32",
216
- },
217
- )
218
-
219
- return {
220
- config: result,
221
- pluginOrigins: acc.plugin_origins,
222
- dirs: result.plugin?.length ? dirs : [],
223
- }
224
- })
225
-
226
- export const layer = Layer.effect(
227
- Service,
228
- Effect.gen(function* () {
229
- const directory = yield* CurrentWorkingDirectory
230
- const npm = yield* Npm.Service
231
- const data = yield* loadState({ directory })
232
- const deps = yield* Effect.forEach(
233
- data.dirs,
234
- (dir) =>
235
- npm
236
- .install(dir, {
237
- add: [
238
- {
239
- name: "@opencode-ai/plugin",
240
- version: InstallationLocal ? undefined : InstallationVersion,
241
- },
242
- ],
243
- })
244
- .pipe(Effect.forkScoped),
245
- {
246
- concurrency: "unbounded",
247
- },
248
- )
249
-
250
- const get = Effect.fn("TuiConfig.get")(() => Effect.succeed(data.config))
251
- const pluginOrigins = Effect.fn("TuiConfig.pluginOrigins")(() => Effect.succeed(data.pluginOrigins))
252
-
253
- const waitForDependencies = Effect.fn("TuiConfig.waitForDependencies")(() =>
254
- Effect.forEach(deps, Fiber.join, { concurrency: "unbounded" }).pipe(Effect.ignore(), Effect.asVoid),
255
- )
256
- return Service.of({ get, pluginOrigins, waitForDependencies })
257
- }).pipe(Effect.withSpan("TuiConfig.layer")),
258
- )
259
-
260
- export const defaultLayer = layer.pipe(Layer.provide(Npm.defaultLayer), Layer.provide(FSUtil.defaultLayer))
261
-
262
- const { runPromise } = makeRuntime(Service, defaultLayer)
263
-
264
- export async function waitForDependencies() {
265
- await runPromise((svc) => svc.waitForDependencies())
266
- }
267
-
268
- export async function get() {
269
- return runPromise((svc) => svc.get())
270
- }
271
-
272
- export async function pluginOrigins() {
273
- return runPromise((svc) => svc.pluginOrigins())
274
- }
@@ -1,91 +0,0 @@
1
- export * as ConfigVariable from "./variable"
2
-
3
- import path from "path"
4
- import os from "os"
5
- import { Filesystem } from "@/util/filesystem"
6
- import { InvalidError } from "@opencode-ai/core/v1/config/error"
7
-
8
- type ParseSource =
9
- | {
10
- type: "path"
11
- path: string
12
- }
13
- | {
14
- type: "virtual"
15
- source: string
16
- dir: string
17
- }
18
-
19
- type SubstituteInput = ParseSource & {
20
- text: string
21
- missing?: "error" | "empty"
22
- env?: Record<string, string>
23
- }
24
-
25
- function source(input: ParseSource) {
26
- return input.type === "path" ? input.path : input.source
27
- }
28
-
29
- function dir(input: ParseSource) {
30
- return input.type === "path" ? path.dirname(input.path) : input.dir
31
- }
32
-
33
- /** Apply {env:VAR} and {file:path} substitutions to config text. */
34
- export async function substitute(input: SubstituteInput) {
35
- const missing = input.missing ?? "error"
36
- let text = input.text.replace(/\{env:([^}]+)\}/g, (_, varName) => {
37
- return (input.env?.[varName] ?? process.env[varName]) || ""
38
- })
39
-
40
- const fileMatches = Array.from(text.matchAll(/\{file:[^}]+\}/g))
41
- if (!fileMatches.length) return text
42
-
43
- const configDir = dir(input)
44
- const configSource = source(input)
45
- let out = ""
46
- let cursor = 0
47
-
48
- for (const match of fileMatches) {
49
- const token = match[0]
50
- const index = match.index
51
- out += text.slice(cursor, index)
52
-
53
- const lineStart = text.lastIndexOf("\n", index - 1) + 1
54
- const prefix = text.slice(lineStart, index).trimStart()
55
- if (prefix.startsWith("//")) {
56
- out += token
57
- cursor = index + token.length
58
- continue
59
- }
60
-
61
- let filePath = token.replace(/^\{file:/, "").replace(/\}$/, "")
62
- if (filePath.startsWith("~/")) {
63
- filePath = path.join(os.homedir(), filePath.slice(2))
64
- }
65
-
66
- const resolvedPath = path.isAbsolute(filePath) ? filePath : path.resolve(configDir, filePath)
67
- const fileContent = (
68
- await Filesystem.readText(resolvedPath).catch((error: NodeJS.ErrnoException) => {
69
- if (missing === "empty") return ""
70
-
71
- const errMsg = `bad file reference: "${token}"`
72
- if (error.code === "ENOENT") {
73
- throw new InvalidError(
74
- {
75
- path: configSource,
76
- message: errMsg + ` ${resolvedPath} does not exist`,
77
- },
78
- { cause: error },
79
- )
80
- }
81
- throw new InvalidError({ path: configSource, message: errMsg }, { cause: error })
82
- })
83
- ).trim()
84
-
85
- out += JSON.stringify(fileContent).slice(1, -1)
86
- cursor = index + token.length
87
- }
88
-
89
- out += text.slice(cursor)
90
- return out
91
- }
@@ -1,41 +0,0 @@
1
- import type { ProjectV2 } from "@opencode-ai/core/project"
2
- import type { WorkspaceAdapter, WorkspaceAdapterEntry } from "../types"
3
- import { WorktreeAdapter } from "./worktree"
4
-
5
- const BUILTIN: Record<string, WorkspaceAdapter> = {
6
- worktree: WorktreeAdapter,
7
- }
8
-
9
- const state = new Map<ProjectV2.ID, Map<string, WorkspaceAdapter>>()
10
-
11
- export function getAdapter(projectID: ProjectV2.ID, type: string): WorkspaceAdapter {
12
- const custom = state.get(projectID)?.get(type)
13
- if (custom) return custom
14
-
15
- const builtin = BUILTIN[type]
16
- if (builtin) return builtin
17
-
18
- throw new Error(`Unknown workspace adapter: ${type}`)
19
- }
20
-
21
- export function listAdapters(projectID: ProjectV2.ID): WorkspaceAdapterEntry[] {
22
- return registeredAdapters(projectID).map(([type, adapter]) => ({
23
- type,
24
- name: adapter.name,
25
- description: adapter.description,
26
- }))
27
- }
28
-
29
- export function registeredAdapters(projectID: ProjectV2.ID): [string, WorkspaceAdapter][] {
30
- const adapters = new Map(Object.entries(BUILTIN))
31
- for (const [type, adapter] of state.get(projectID)?.entries() ?? []) adapters.set(type, adapter)
32
- return [...adapters.entries()]
33
- }
34
-
35
- // Plugins can be loaded per-project so we need to scope them. If you
36
- // want to install a global one pass `ProjectV2.ID.global`
37
- export function registerAdapter(projectID: ProjectV2.ID, type: string, adapter: WorkspaceAdapter) {
38
- const adapters = state.get(projectID) ?? new Map<string, WorkspaceAdapter>()
39
- adapters.set(type, adapter)
40
- state.set(projectID, adapters)
41
- }
@@ -1,96 +0,0 @@
1
- import { Effect, Schema } from "effect"
2
- import { InstanceRef, WorkspaceRef } from "@/effect/instance-ref"
3
- import { type WorkspaceAdapter, type WorkspaceAdapterContext, WorkspaceInfo } from "../types"
4
-
5
- const WorktreeConfig = Schema.Struct({
6
- name: WorkspaceInfo.fields.name,
7
- branch: Schema.optional(Schema.NullOr(Schema.String)),
8
- directory: Schema.String,
9
- })
10
- const decodeWorktreeConfig = Schema.decodeUnknownSync(WorktreeConfig)
11
-
12
- async function loadWorktree() {
13
- const [{ AppRuntime }, { Worktree }] = await Promise.all([import("@/effect/app-runtime"), import("@/worktree")])
14
- return { AppRuntime, Worktree }
15
- }
16
-
17
- function requireInstance(context: WorkspaceAdapterContext | undefined) {
18
- if (!context?.instance) throw new Error("Worktree adapter requires an instance context")
19
- return context.instance
20
- }
21
-
22
- const provideContext = <A, E, R>(effect: Effect.Effect<A, E, R>, context: WorkspaceAdapterContext | undefined) =>
23
- effect.pipe(
24
- Effect.provideService(InstanceRef, requireInstance(context)),
25
- Effect.provideService(WorkspaceRef, context?.workspaceID),
26
- )
27
-
28
- export const WorktreeAdapter: WorkspaceAdapter = {
29
- name: "Worktree",
30
- description: "Create a git worktree",
31
- async configure(info, context) {
32
- const { AppRuntime, Worktree } = await loadWorktree()
33
- const next = await AppRuntime.runPromise(
34
- provideContext(
35
- Worktree.Service.use((svc) => svc.makeWorktreeInfo({ detached: true })),
36
- context,
37
- ),
38
- )
39
- return {
40
- ...info,
41
- name: next.name,
42
- directory: next.directory,
43
- }
44
- },
45
- async create(info, _env, _from, context) {
46
- const { AppRuntime, Worktree } = await loadWorktree()
47
- const config = decodeWorktreeConfig(info)
48
- await AppRuntime.runPromise(
49
- provideContext(
50
- Worktree.Service.use((svc) =>
51
- svc.createFromInfo({
52
- name: config.name,
53
- directory: config.directory,
54
- ...(config.branch ? { branch: config.branch } : {}),
55
- }),
56
- ),
57
- context,
58
- ),
59
- )
60
- },
61
- async list(context) {
62
- const { AppRuntime, Worktree } = await loadWorktree()
63
- const ctx = requireInstance(context)
64
- return (
65
- await AppRuntime.runPromise(
66
- provideContext(
67
- Worktree.Service.use((svc) => svc.list()),
68
- context,
69
- ),
70
- )
71
- ).map((info) => ({
72
- type: "worktree",
73
- name: info.name,
74
- branch: info.branch,
75
- directory: info.directory,
76
- projectID: ctx.project.id,
77
- }))
78
- },
79
- async remove(info, context) {
80
- const { AppRuntime, Worktree } = await loadWorktree()
81
- const config = decodeWorktreeConfig(info)
82
- await AppRuntime.runPromise(
83
- provideContext(
84
- Worktree.Service.use((svc) => svc.remove({ directory: config.directory })),
85
- context,
86
- ),
87
- )
88
- },
89
- target(info) {
90
- const config = decodeWorktreeConfig(info)
91
- return {
92
- type: "local",
93
- directory: config.directory,
94
- }
95
- },
96
- }
@@ -1,19 +0,0 @@
1
- This is a plugin to simulate a remote environment locally. Add this to `.opencode/opencode.jsonc`:
2
-
3
- ```json
4
- "plugin": ["../packages/opencode/src/control-plane/dev/debug-workspace-plugin.ts"],
5
- ```
6
-
7
- In a separate terminal, run a separate OnlyCode server. This will act like a remote server and the local instance will proxy all requests to it:
8
-
9
- ```
10
- ./packages/opencode/script/run-workspace-server
11
- ```
12
-
13
- With the plugin install, you can now run OnlyCode and create a `debug` workspace type. This will create a "remote" workspace which talks to the second workspace server started above.
14
-
15
- How this works:
16
-
17
- - The workspace server needs to know the workspace id and port to run. It waits for this information to be written to a file and starts the server when the data is written.
18
- - The debug plugin writes this information in the `create` call to the workspace. So create a `debug` workspace will always kick off a new external server.
19
- - The server script watches for file changes, so whenver you create a new `debug` workspace it will restart with the new information. This means that there is only ever one working `debug` workspace at a time; when you create a new one all previous sessions will show that it can't connect because previous debug workspaces do not exist.
@@ -1,73 +0,0 @@
1
- import type { Plugin } from "@opencode-ai/plugin"
2
- import { rename, writeFile } from "node:fs/promises"
3
- import { randomInt } from "node:crypto"
4
- import { setTimeout as sleep } from "node:timers/promises"
5
-
6
- const DEV_DATA_FILE = "/tmp/opencode-workspace-dev-data.json"
7
- const DEV_DATA_TEMP_FILE = `${DEV_DATA_FILE}.tmp`
8
-
9
- async function waitForHealth(port: number) {
10
- const url = `http://127.0.0.1:${port}/global/health`
11
- const started = Date.now()
12
-
13
- while (Date.now() - started < 30_000) {
14
- try {
15
- const response = await fetch(url)
16
- if (response.ok) {
17
- return
18
- }
19
- } catch {}
20
-
21
- await sleep(250)
22
- }
23
-
24
- throw new Error(`Timed out waiting for debug server health check at ${url}`)
25
- }
26
-
27
- let PORT: number | undefined
28
-
29
- async function writeDebugData(port: number, id: string, env: Record<string, string | undefined>) {
30
- await writeFile(
31
- DEV_DATA_TEMP_FILE,
32
- JSON.stringify(
33
- {
34
- port,
35
- id,
36
- env,
37
- },
38
- null,
39
- 2,
40
- ),
41
- )
42
-
43
- await rename(DEV_DATA_TEMP_FILE, DEV_DATA_FILE)
44
- }
45
-
46
- export const DebugWorkspacePlugin: Plugin = async ({ experimental_workspace }) => {
47
- experimental_workspace.register("debug", {
48
- name: "Debug",
49
- description: "Create a debugging server",
50
- configure(config) {
51
- return config
52
- },
53
- async create(config, env) {
54
- const port = randomInt(5000, 9001)
55
- PORT = port
56
-
57
- await writeDebugData(port, config.id, env)
58
-
59
- await waitForHealth(port)
60
- },
61
- async remove(_config) {},
62
- target(_config) {
63
- return {
64
- type: "remote",
65
- url: `http://localhost:${PORT!}/`,
66
- }
67
- },
68
- })
69
-
70
- return {}
71
- }
72
-
73
- export default DebugWorkspacePlugin
@@ -1,59 +0,0 @@
1
- import { Schema, Struct } from "effect"
2
- import { ProjectV2 } from "@opencode-ai/core/project"
3
- import type { InstanceContext } from "@/project/instance-context"
4
- import { WorkspaceV2 } from "@opencode-ai/core/workspace"
5
- import type { DeepMutable } from "@opencode-ai/core/schema"
6
-
7
- export const WorkspaceInfo = Schema.Struct({
8
- id: WorkspaceV2.ID,
9
- type: Schema.String,
10
- name: Schema.String,
11
- branch: Schema.optional(Schema.NullOr(Schema.String)),
12
- directory: Schema.optional(Schema.NullOr(Schema.String)),
13
- extra: Schema.optional(Schema.NullOr(Schema.Unknown)),
14
- projectID: ProjectV2.ID,
15
- }).annotate({ identifier: "Workspace" })
16
- export type WorkspaceInfo = DeepMutable<Schema.Schema.Type<typeof WorkspaceInfo>>
17
-
18
- export const WorkspaceListedInfo = Schema.Struct(Struct.omit(WorkspaceInfo.fields, ["id"])).annotate({
19
- identifier: "WorkspaceListedInfo",
20
- })
21
- export type WorkspaceListedInfo = DeepMutable<Schema.Schema.Type<typeof WorkspaceListedInfo>>
22
-
23
- export const WorkspaceAdapterEntry = Schema.Struct({
24
- type: Schema.String,
25
- name: Schema.String,
26
- description: Schema.String,
27
- })
28
- export type WorkspaceAdapterEntry = Schema.Schema.Type<typeof WorkspaceAdapterEntry>
29
-
30
- export type Target =
31
- | {
32
- type: "local"
33
- directory: string
34
- }
35
- | {
36
- type: "remote"
37
- url: string | URL
38
- headers?: HeadersInit
39
- }
40
-
41
- export type WorkspaceAdapterContext = {
42
- readonly instance?: InstanceContext
43
- readonly workspaceID?: WorkspaceV2.ID
44
- }
45
-
46
- export type WorkspaceAdapter = {
47
- name: string
48
- description: string
49
- configure(info: WorkspaceInfo, context?: WorkspaceAdapterContext): WorkspaceInfo | Promise<WorkspaceInfo>
50
- create(
51
- info: WorkspaceInfo,
52
- env: Record<string, string | undefined>,
53
- from?: WorkspaceInfo,
54
- context?: WorkspaceAdapterContext,
55
- ): Promise<void>
56
- list?(context?: WorkspaceAdapterContext): WorkspaceListedInfo[] | Promise<WorkspaceListedInfo[]>
57
- remove(info: WorkspaceInfo, context?: WorkspaceAdapterContext): Promise<void>
58
- target(info: WorkspaceInfo, context?: WorkspaceAdapterContext): Target | Promise<Target>
59
- }
@@ -1,39 +0,0 @@
1
- import { GlobalBus, type GlobalEvent } from "@/bus/global"
2
- import { Effect } from "effect"
3
-
4
- export function waitEvent(input: { timeout: number; signal?: AbortSignal; fn: (event: GlobalEvent) => boolean }) {
5
- if (input.signal?.aborted) return Effect.fail(input.signal.reason ?? new Error("Request aborted"))
6
-
7
- return Effect.callback<void, unknown>((resume) => {
8
- const abort = () => {
9
- cleanup()
10
- resume(Effect.fail(input.signal?.reason ?? new Error("Request aborted")))
11
- }
12
-
13
- const handler = (event: GlobalEvent) => {
14
- try {
15
- if (!input.fn(event)) return
16
- cleanup()
17
- resume(Effect.void)
18
- } catch (error) {
19
- cleanup()
20
- resume(Effect.fail(error))
21
- }
22
- }
23
-
24
- const cleanup = () => {
25
- clearTimeout(timeout)
26
- GlobalBus.off("event", handler)
27
- input.signal?.removeEventListener("abort", abort)
28
- }
29
-
30
- const timeout = setTimeout(() => {
31
- cleanup()
32
- resume(Effect.fail(new Error("Timed out waiting for global event")))
33
- }, input.timeout)
34
-
35
- GlobalBus.on("event", handler)
36
- input.signal?.addEventListener("abort", abort, { once: true })
37
- return Effect.sync(cleanup)
38
- })
39
- }