@farhanic017/octocode 3.5.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 (716) hide show
  1. package/.swarm_lessons.json +85 -0
  2. package/AGENTS.md +151 -0
  3. package/BUN_SHELL_MIGRATION_PLAN.md +136 -0
  4. package/Dockerfile +18 -0
  5. package/README.md +15 -0
  6. package/bin/octocode +31 -0
  7. package/bunfig.toml +7 -0
  8. package/git +0 -0
  9. package/package.json +151 -0
  10. package/parsers-config.ts +1 -0
  11. package/script/bench-search.ts +115 -0
  12. package/script/bench-test-suite.ts +52 -0
  13. package/script/build.ts +243 -0
  14. package/script/generate.ts +14 -0
  15. package/script/httpapi-exercise.ts +1 -0
  16. package/script/octo-shim.mjs +34 -0
  17. package/script/postinstall.mjs +198 -0
  18. package/script/profile-test-files.ts +42 -0
  19. package/script/publish.ts +211 -0
  20. package/script/run-workspace-server +106 -0
  21. package/script/schema.ts +77 -0
  22. package/script/time.ts +6 -0
  23. package/script/trace-imports.ts +154 -0
  24. package/specs/effect/error-boundaries-plan.md +235 -0
  25. package/specs/effect/errors.md +207 -0
  26. package/specs/effect/facades.md +218 -0
  27. package/specs/effect/guide.md +247 -0
  28. package/specs/effect/instance-context.md +13 -0
  29. package/specs/effect/loose-ends.md +30 -0
  30. package/specs/effect/migration.md +62 -0
  31. package/specs/effect/routes.md +61 -0
  32. package/specs/effect/schema.md +88 -0
  33. package/specs/effect/server-package.md +58 -0
  34. package/specs/effect/todo.md +241 -0
  35. package/specs/effect/tools.md +88 -0
  36. package/specs/openapi-translation-cleanup.md +204 -0
  37. package/specs/tui-plugins.md +544 -0
  38. package/specs/v2/api.ts +67 -0
  39. package/specs/v2/message-shape.md +136 -0
  40. package/specs/v2/notifications.md +13 -0
  41. package/specs/v2/tui-command-shim.md +67 -0
  42. package/src/account/account.ts +459 -0
  43. package/src/account/repo.ts +170 -0
  44. package/src/account/schema.ts +99 -0
  45. package/src/account/url.ts +8 -0
  46. package/src/acp/agent.ts +95 -0
  47. package/src/acp/config-option.ts +203 -0
  48. package/src/acp/content.ts +250 -0
  49. package/src/acp/directory.ts +210 -0
  50. package/src/acp/error.ts +90 -0
  51. package/src/acp/event.ts +345 -0
  52. package/src/acp/permission.ts +145 -0
  53. package/src/acp/profile.ts +42 -0
  54. package/src/acp/service.ts +1062 -0
  55. package/src/acp/tool.ts +321 -0
  56. package/src/acp/usage.ts +239 -0
  57. package/src/agent/agent.ts +451 -0
  58. package/src/agent/generate.txt +75 -0
  59. package/src/agent/prompt/compaction.txt +30 -0
  60. package/src/agent/prompt/explore.txt +18 -0
  61. package/src/agent/prompt/summary.txt +11 -0
  62. package/src/agent/prompt/title.txt +50 -0
  63. package/src/agent/subagent-permissions.ts +35 -0
  64. package/src/audio.d.ts +14 -0
  65. package/src/auth/index.ts +96 -0
  66. package/src/background/job.ts +36 -0
  67. package/src/bus/global.ts +22 -0
  68. package/src/cli/bootstrap.ts +11 -0
  69. package/src/cli/cmd/account.ts +264 -0
  70. package/src/cli/cmd/acp.ts +76 -0
  71. package/src/cli/cmd/agent.ts +259 -0
  72. package/src/cli/cmd/attach.ts +97 -0
  73. package/src/cli/cmd/cmd.ts +7 -0
  74. package/src/cli/cmd/db.ts +62 -0
  75. package/src/cli/cmd/debug/agent.handler.ts +188 -0
  76. package/src/cli/cmd/debug/agent.ts +27 -0
  77. package/src/cli/cmd/debug/config.ts +14 -0
  78. package/src/cli/cmd/debug/file.ts +87 -0
  79. package/src/cli/cmd/debug/index.ts +87 -0
  80. package/src/cli/cmd/debug/lsp.ts +51 -0
  81. package/src/cli/cmd/debug/ripgrep.ts +99 -0
  82. package/src/cli/cmd/debug/scrap.ts +18 -0
  83. package/src/cli/cmd/debug/skill.ts +15 -0
  84. package/src/cli/cmd/debug/snapshot.ts +50 -0
  85. package/src/cli/cmd/debug/startup.ts +11 -0
  86. package/src/cli/cmd/debug/v2.ts +46 -0
  87. package/src/cli/cmd/export.ts +292 -0
  88. package/src/cli/cmd/generate.ts +54 -0
  89. package/src/cli/cmd/github.handler.ts +1594 -0
  90. package/src/cli/cmd/github.shared.ts +30 -0
  91. package/src/cli/cmd/github.ts +42 -0
  92. package/src/cli/cmd/import.ts +224 -0
  93. package/src/cli/cmd/mcp.ts +859 -0
  94. package/src/cli/cmd/models.ts +66 -0
  95. package/src/cli/cmd/plug.ts +230 -0
  96. package/src/cli/cmd/pr.ts +115 -0
  97. package/src/cli/cmd/prompt-display.ts +1 -0
  98. package/src/cli/cmd/providers.ts +550 -0
  99. package/src/cli/cmd/run/demo.ts +1274 -0
  100. package/src/cli/cmd/run/entry.body.ts +205 -0
  101. package/src/cli/cmd/run/footer.command.tsx +1088 -0
  102. package/src/cli/cmd/run/footer.menu.tsx +353 -0
  103. package/src/cli/cmd/run/footer.permission.tsx +482 -0
  104. package/src/cli/cmd/run/footer.prompt.tsx +1351 -0
  105. package/src/cli/cmd/run/footer.question.tsx +580 -0
  106. package/src/cli/cmd/run/footer.subagent.tsx +180 -0
  107. package/src/cli/cmd/run/footer.ts +1153 -0
  108. package/src/cli/cmd/run/footer.view.tsx +992 -0
  109. package/src/cli/cmd/run/footer.width.ts +27 -0
  110. package/src/cli/cmd/run/otel.ts +117 -0
  111. package/src/cli/cmd/run/permission.shared.ts +256 -0
  112. package/src/cli/cmd/run/prompt.editor.ts +157 -0
  113. package/src/cli/cmd/run/prompt.shared.ts +153 -0
  114. package/src/cli/cmd/run/question.shared.ts +340 -0
  115. package/src/cli/cmd/run/runtime.boot.ts +202 -0
  116. package/src/cli/cmd/run/runtime.lifecycle.ts +431 -0
  117. package/src/cli/cmd/run/runtime.queue.ts +349 -0
  118. package/src/cli/cmd/run/runtime.shared.ts +17 -0
  119. package/src/cli/cmd/run/runtime.stdin.ts +37 -0
  120. package/src/cli/cmd/run/runtime.ts +905 -0
  121. package/src/cli/cmd/run/scrollback.shared.ts +92 -0
  122. package/src/cli/cmd/run/scrollback.surface.ts +448 -0
  123. package/src/cli/cmd/run/scrollback.writer.tsx +353 -0
  124. package/src/cli/cmd/run/splash.ts +284 -0
  125. package/src/cli/cmd/run/stream.transport.ts +1465 -0
  126. package/src/cli/cmd/run/stream.ts +175 -0
  127. package/src/cli/cmd/run/subagent-data.ts +876 -0
  128. package/src/cli/cmd/run/theme.ts +690 -0
  129. package/src/cli/cmd/run/tool.ts +1489 -0
  130. package/src/cli/cmd/run/trace.ts +94 -0
  131. package/src/cli/cmd/run/turn-summary.ts +47 -0
  132. package/src/cli/cmd/run/types.ts +350 -0
  133. package/src/cli/cmd/run/variant.shared.ts +215 -0
  134. package/src/cli/cmd/run.ts +897 -0
  135. package/src/cli/cmd/serve.ts +24 -0
  136. package/src/cli/cmd/stats.ts +393 -0
  137. package/src/cli/cmd/tui.ts +264 -0
  138. package/src/cli/cmd/uninstall.ts +353 -0
  139. package/src/cli/cmd/upgrade.ts +74 -0
  140. package/src/cli/cmd/web.ts +84 -0
  141. package/src/cli/effect/prompt.ts +37 -0
  142. package/src/cli/effect-cmd.ts +96 -0
  143. package/src/cli/error.ts +118 -0
  144. package/src/cli/heap.ts +66 -0
  145. package/src/cli/logo.ts +1 -0
  146. package/src/cli/network.ts +64 -0
  147. package/src/cli/tui/layer.ts +7 -0
  148. package/src/cli/tui/photon_rs_bg-bq08arze.wasm +0 -0
  149. package/src/cli/tui/tree-sitter-3jzf13jk.wasm +0 -0
  150. package/src/cli/tui/tree-sitter-bash-hq5s6fxb.wasm +0 -0
  151. package/src/cli/tui/tree-sitter-powershell-ryb2ffqs.wasm +0 -0
  152. package/src/cli/tui/worker.ts +99 -0
  153. package/src/cli/ui.ts +144 -0
  154. package/src/cli/upgrade.ts +53 -0
  155. package/src/command/index.ts +189 -0
  156. package/src/command/template/initialize.txt +66 -0
  157. package/src/command/template/review.txt +101 -0
  158. package/src/command/terminal-ai-commands.ts +567 -0
  159. package/src/config/agent.ts +68 -0
  160. package/src/config/command.ts +45 -0
  161. package/src/config/config.ts +686 -0
  162. package/src/config/entry-name.ts +19 -0
  163. package/src/config/managed.ts +77 -0
  164. package/src/config/markdown.ts +36 -0
  165. package/src/config/parse.ts +79 -0
  166. package/src/config/paths.ts +47 -0
  167. package/src/config/plugin.ts +79 -0
  168. package/src/config/reference.ts +48 -0
  169. package/src/config/tui-cwd.ts +5 -0
  170. package/src/config/tui-host-attention.ts +21 -0
  171. package/src/config/tui-migrate.ts +156 -0
  172. package/src/config/tui.ts +294 -0
  173. package/src/config/variable.ts +91 -0
  174. package/src/control-plane/adapters/index.ts +41 -0
  175. package/src/control-plane/adapters/worktree.ts +96 -0
  176. package/src/control-plane/dev/README.md +19 -0
  177. package/src/control-plane/dev/debug-workspace-plugin.ts +73 -0
  178. package/src/control-plane/types.ts +59 -0
  179. package/src/control-plane/util.ts +39 -0
  180. package/src/control-plane/workspace-adapter-runtime.ts +51 -0
  181. package/src/control-plane/workspace-context.ts +26 -0
  182. package/src/control-plane/workspace.ts +1075 -0
  183. package/src/desktop/agent.ts +147 -0
  184. package/src/desktop/index.ts +247 -0
  185. package/src/desktop/platform.ts +97 -0
  186. package/src/desktop/stream.ts +64 -0
  187. package/src/desktop/vision.ts +52 -0
  188. package/src/desktop/websocket.ts +120 -0
  189. package/src/effect/app-runtime.ts +133 -0
  190. package/src/effect/bootstrap-runtime.ts +23 -0
  191. package/src/effect/bridge.ts +84 -0
  192. package/src/effect/config-service.ts +67 -0
  193. package/src/effect/instance-ref.ts +11 -0
  194. package/src/effect/instance-registry.ts +12 -0
  195. package/src/effect/instance-state.ts +72 -0
  196. package/src/effect/promise.ts +17 -0
  197. package/src/effect/run-service.ts +47 -0
  198. package/src/effect/runner.ts +217 -0
  199. package/src/effect/runtime-flags.ts +76 -0
  200. package/src/env/index.ts +40 -0
  201. package/src/event-v2-bridge.ts +76 -0
  202. package/src/format/formatter.ts +404 -0
  203. package/src/format/index.ts +212 -0
  204. package/src/git/index.ts +347 -0
  205. package/src/id/id.ts +80 -0
  206. package/src/ide/index.ts +70 -0
  207. package/src/image/image.ts +177 -0
  208. package/src/index.ts +208 -0
  209. package/src/installation/index.ts +350 -0
  210. package/src/lsp/client.ts +686 -0
  211. package/src/lsp/diagnostic.ts +29 -0
  212. package/src/lsp/language.ts +121 -0
  213. package/src/lsp/launch.ts +21 -0
  214. package/src/lsp/lsp.ts +517 -0
  215. package/src/lsp/server.ts +2116 -0
  216. package/src/markdown.d.ts +4 -0
  217. package/src/mcp/auth.ts +171 -0
  218. package/src/mcp/builtin.ts +92 -0
  219. package/src/mcp/index.ts +1000 -0
  220. package/src/mcp/oauth-callback.ts +232 -0
  221. package/src/mcp/oauth-provider.ts +217 -0
  222. package/src/node.ts +5 -0
  223. package/src/patch/index.ts +689 -0
  224. package/src/permission/arity.ts +163 -0
  225. package/src/permission/evaluate.ts +1 -0
  226. package/src/permission/index.ts +230 -0
  227. package/src/plugin/azure.ts +26 -0
  228. package/src/plugin/cloudflare.ts +76 -0
  229. package/src/plugin/digitalocean.ts +391 -0
  230. package/src/plugin/github-copilot/copilot.ts +417 -0
  231. package/src/plugin/github-copilot/models.ts +246 -0
  232. package/src/plugin/index.ts +320 -0
  233. package/src/plugin/install.ts +439 -0
  234. package/src/plugin/loader.ts +237 -0
  235. package/src/plugin/meta.ts +188 -0
  236. package/src/plugin/openai/README.md +31 -0
  237. package/src/plugin/openai/codex.ts +647 -0
  238. package/src/plugin/openai/ws-pool.ts +290 -0
  239. package/src/plugin/openai/ws.ts +381 -0
  240. package/src/plugin/shared.ts +323 -0
  241. package/src/plugin/tui/internal.ts +12 -0
  242. package/src/plugin/tui/runtime.ts +1174 -0
  243. package/src/plugin/xai.ts +742 -0
  244. package/src/project/bootstrap-service.ts +9 -0
  245. package/src/project/bootstrap.ts +80 -0
  246. package/src/project/instance-context.ts +24 -0
  247. package/src/project/instance-layer.ts +11 -0
  248. package/src/project/instance-runtime.ts +16 -0
  249. package/src/project/instance-store.ts +207 -0
  250. package/src/project/project.ts +520 -0
  251. package/src/project/vcs.ts +435 -0
  252. package/src/provider/auth.ts +230 -0
  253. package/src/provider/error.ts +188 -0
  254. package/src/provider/model-status.ts +8 -0
  255. package/src/provider/provider.ts +2037 -0
  256. package/src/provider/transform.ts +1367 -0
  257. package/src/pty-preparation.ts +30 -0
  258. package/src/question/index.ts +229 -0
  259. package/src/question/schema.ts +10 -0
  260. package/src/reference/reference.ts +239 -0
  261. package/src/reference/repository-cache.ts +320 -0
  262. package/src/server/auth.ts +48 -0
  263. package/src/server/cors.ts +34 -0
  264. package/src/server/event.ts +13 -0
  265. package/src/server/global-lifecycle.ts +37 -0
  266. package/src/server/init-projectors.ts +3 -0
  267. package/src/server/mdns.ts +60 -0
  268. package/src/server/projectors.ts +1 -0
  269. package/src/server/proxy-util.ts +48 -0
  270. package/src/server/routes/instance/httpapi/AGENTS.md +39 -0
  271. package/src/server/routes/instance/httpapi/api.ts +80 -0
  272. package/src/server/routes/instance/httpapi/errors.ts +193 -0
  273. package/src/server/routes/instance/httpapi/groups/config.ts +65 -0
  274. package/src/server/routes/instance/httpapi/groups/control-plane.ts +35 -0
  275. package/src/server/routes/instance/httpapi/groups/control.ts +76 -0
  276. package/src/server/routes/instance/httpapi/groups/event.ts +29 -0
  277. package/src/server/routes/instance/httpapi/groups/experimental.ts +260 -0
  278. package/src/server/routes/instance/httpapi/groups/file.ts +172 -0
  279. package/src/server/routes/instance/httpapi/groups/global.ts +138 -0
  280. package/src/server/routes/instance/httpapi/groups/instance.ts +206 -0
  281. package/src/server/routes/instance/httpapi/groups/mcp.ts +156 -0
  282. package/src/server/routes/instance/httpapi/groups/metadata.ts +18 -0
  283. package/src/server/routes/instance/httpapi/groups/permission.ts +61 -0
  284. package/src/server/routes/instance/httpapi/groups/project-copy.ts +88 -0
  285. package/src/server/routes/instance/httpapi/groups/project.ts +93 -0
  286. package/src/server/routes/instance/httpapi/groups/provider.ts +101 -0
  287. package/src/server/routes/instance/httpapi/groups/pty.ts +172 -0
  288. package/src/server/routes/instance/httpapi/groups/query.ts +12 -0
  289. package/src/server/routes/instance/httpapi/groups/question.ts +74 -0
  290. package/src/server/routes/instance/httpapi/groups/reference.ts +60 -0
  291. package/src/server/routes/instance/httpapi/groups/sync.ts +113 -0
  292. package/src/server/routes/instance/httpapi/groups/tui.ts +208 -0
  293. package/src/server/routes/instance/httpapi/groups/workspace.ts +141 -0
  294. package/src/server/routes/instance/httpapi/handlers/config.ts +34 -0
  295. package/src/server/routes/instance/httpapi/handlers/control-plane.ts +37 -0
  296. package/src/server/routes/instance/httpapi/handlers/control.ts +37 -0
  297. package/src/server/routes/instance/httpapi/handlers/event.ts +102 -0
  298. package/src/server/routes/instance/httpapi/handlers/experimental.ts +187 -0
  299. package/src/server/routes/instance/httpapi/handlers/file.ts +128 -0
  300. package/src/server/routes/instance/httpapi/handlers/global.ts +157 -0
  301. package/src/server/routes/instance/httpapi/handlers/instance.ts +110 -0
  302. package/src/server/routes/instance/httpapi/handlers/mcp.ts +111 -0
  303. package/src/server/routes/instance/httpapi/handlers/permission.ts +41 -0
  304. package/src/server/routes/instance/httpapi/handlers/project-copy.ts +157 -0
  305. package/src/server/routes/instance/httpapi/handlers/project.ts +63 -0
  306. package/src/server/routes/instance/httpapi/handlers/provider.ts +113 -0
  307. package/src/server/routes/instance/httpapi/handlers/pty.ts +258 -0
  308. package/src/server/routes/instance/httpapi/handlers/question.ts +54 -0
  309. package/src/server/routes/instance/httpapi/handlers/reference.ts +27 -0
  310. package/src/server/routes/instance/httpapi/handlers/sync.ts +95 -0
  311. package/src/server/routes/instance/httpapi/handlers/tui.ts +131 -0
  312. package/src/server/routes/instance/httpapi/handlers/workspace.ts +102 -0
  313. package/src/server/routes/instance/httpapi/lifecycle.ts +57 -0
  314. package/src/server/routes/instance/httpapi/middleware/authorization.ts +150 -0
  315. package/src/server/routes/instance/httpapi/middleware/compression.ts +64 -0
  316. package/src/server/routes/instance/httpapi/middleware/cors-vary.ts +29 -0
  317. package/src/server/routes/instance/httpapi/middleware/error.ts +36 -0
  318. package/src/server/routes/instance/httpapi/middleware/fence.ts +25 -0
  319. package/src/server/routes/instance/httpapi/middleware/instance-context.ts +43 -0
  320. package/src/server/routes/instance/httpapi/middleware/proxy.ts +108 -0
  321. package/src/server/routes/instance/httpapi/middleware/schema-error.ts +42 -0
  322. package/src/server/routes/instance/httpapi/middleware/workspace-routing.ts +250 -0
  323. package/src/server/routes/instance/httpapi/public.ts +535 -0
  324. package/src/server/routes/instance/httpapi/server.ts +281 -0
  325. package/src/server/routes/instance/httpapi/websocket-tracker.ts +57 -0
  326. package/src/server/server.ts +218 -0
  327. package/src/server/shared/fence.ts +68 -0
  328. package/src/server/shared/pty-ticket.ts +15 -0
  329. package/src/server/shared/public-ui.ts +12 -0
  330. package/src/server/shared/tui-control.ts +28 -0
  331. package/src/server/shared/ui.ts +108 -0
  332. package/src/server/shared/workspace-routing.ts +38 -0
  333. package/src/server/tui-event.ts +53 -0
  334. package/src/share/share-next.ts +379 -0
  335. package/src/shell/shell.ts +215 -0
  336. package/src/skill/discovery.ts +115 -0
  337. package/src/skill/index.ts +382 -0
  338. package/src/snapshot/index.ts +762 -0
  339. package/src/sql.d.ts +4 -0
  340. package/src/storage/schema.ts +5 -0
  341. package/src/storage/storage.ts +329 -0
  342. package/src/swarm/evolution.ts +304 -0
  343. package/src/swarm/index.ts +7 -0
  344. package/src/swarm/learning.ts +736 -0
  345. package/src/swarm/vision.ts +131 -0
  346. package/src/sync/README.md +179 -0
  347. package/src/sync/schema.ts +11 -0
  348. package/src/temporary.ts +33 -0
  349. package/src/tool/apply_patch.ts +313 -0
  350. package/src/tool/apply_patch.txt +33 -0
  351. package/src/tool/browser_click.ts +51 -0
  352. package/src/tool/browser_drag.ts +76 -0
  353. package/src/tool/browser_evaluate.ts +51 -0
  354. package/src/tool/browser_hover.ts +51 -0
  355. package/src/tool/browser_navigate.ts +45 -0
  356. package/src/tool/browser_screenshot.ts +66 -0
  357. package/src/tool/browser_select.ts +52 -0
  358. package/src/tool/browser_type.ts +52 -0
  359. package/src/tool/browser_wait.ts +60 -0
  360. package/src/tool/desktop_clipboard.ts +82 -0
  361. package/src/tool/desktop_control.ts +160 -0
  362. package/src/tool/desktop_record.ts +93 -0
  363. package/src/tool/desktop_replay.ts +99 -0
  364. package/src/tool/desktop_screen_record.ts +143 -0
  365. package/src/tool/desktop_window.ts +142 -0
  366. package/src/tool/desktop_workflow.ts +81 -0
  367. package/src/tool/edit.ts +737 -0
  368. package/src/tool/edit.txt +10 -0
  369. package/src/tool/external-directory.ts +49 -0
  370. package/src/tool/glob.ts +84 -0
  371. package/src/tool/glob.txt +6 -0
  372. package/src/tool/grep.ts +140 -0
  373. package/src/tool/grep.txt +8 -0
  374. package/src/tool/invalid.ts +21 -0
  375. package/src/tool/json-schema.ts +164 -0
  376. package/src/tool/lsp.ts +113 -0
  377. package/src/tool/lsp.txt +24 -0
  378. package/src/tool/mcp-websearch.ts +96 -0
  379. package/src/tool/open_app.ts +55 -0
  380. package/src/tool/open_terminal.ts +69 -0
  381. package/src/tool/plan-enter.txt +14 -0
  382. package/src/tool/plan-exit.txt +13 -0
  383. package/src/tool/plan.ts +79 -0
  384. package/src/tool/question.ts +44 -0
  385. package/src/tool/question.txt +10 -0
  386. package/src/tool/read.ts +392 -0
  387. package/src/tool/read.txt +14 -0
  388. package/src/tool/registry.ts +527 -0
  389. package/src/tool/schema.ts +14 -0
  390. package/src/tool/screenshot.ts +72 -0
  391. package/src/tool/shell/id.ts +19 -0
  392. package/src/tool/shell/prompt.ts +307 -0
  393. package/src/tool/shell/shell.txt +21 -0
  394. package/src/tool/shell.ts +669 -0
  395. package/src/tool/skill.ts +72 -0
  396. package/src/tool/skill.txt +5 -0
  397. package/src/tool/task.ts +339 -0
  398. package/src/tool/task.txt +19 -0
  399. package/src/tool/todo.ts +57 -0
  400. package/src/tool/todowrite.txt +44 -0
  401. package/src/tool/tool.ts +180 -0
  402. package/src/tool/truncate.ts +160 -0
  403. package/src/tool/truncation-dir.ts +4 -0
  404. package/src/tool/visual_qa.ts +77 -0
  405. package/src/tool/webfetch.ts +192 -0
  406. package/src/tool/webfetch.txt +13 -0
  407. package/src/tool/websearch.ts +143 -0
  408. package/src/tool/websearch.txt +14 -0
  409. package/src/tool/write.ts +104 -0
  410. package/src/tool/write.txt +8 -0
  411. package/src/util/archive.ts +17 -0
  412. package/src/util/bom.ts +27 -0
  413. package/src/util/data-url.ts +9 -0
  414. package/src/util/defer.ts +10 -0
  415. package/src/util/effect-http-client.ts +11 -0
  416. package/src/util/error.ts +1 -0
  417. package/src/util/filesystem.ts +251 -0
  418. package/src/util/iife.ts +3 -0
  419. package/src/util/lazy.ts +20 -0
  420. package/src/util/local-context.ts +25 -0
  421. package/src/util/locale.ts +2 -0
  422. package/src/util/media.ts +26 -0
  423. package/src/util/process.ts +177 -0
  424. package/src/util/proxy-env.ts +72 -0
  425. package/src/util/queue.ts +32 -0
  426. package/src/util/record.ts +1 -0
  427. package/src/util/repository.ts +232 -0
  428. package/src/util/rpc.ts +66 -0
  429. package/src/util/signal.ts +12 -0
  430. package/src/util/sys-monitor.ts +223 -0
  431. package/src/util/timeout.ts +13 -0
  432. package/src/util/wildcard.ts +59 -0
  433. package/src/worktree/index.ts +645 -0
  434. package/sst-env.d.ts +10 -0
  435. package/test/AGENTS.md +204 -0
  436. package/test/EFFECT_TEST_MIGRATION.md +169 -0
  437. package/test/account/repo.test.ts +353 -0
  438. package/test/account/service.test.ts +453 -0
  439. package/test/acp/config-option.test.ts +229 -0
  440. package/test/acp/content.test.ts +201 -0
  441. package/test/acp/directory.test.ts +186 -0
  442. package/test/acp/error.test.ts +67 -0
  443. package/test/acp/event.test.ts +743 -0
  444. package/test/acp/permission.test.ts +273 -0
  445. package/test/acp/tool.test.ts +210 -0
  446. package/test/acp/usage.test.ts +315 -0
  447. package/test/agent/agent.test.ts +711 -0
  448. package/test/agent/plan-mode-subagent-bypass.test.ts +213 -0
  449. package/test/agent/plugin-agent-regression.test.ts +62 -0
  450. package/test/auth/auth.test.ts +77 -0
  451. package/test/background/job.test.ts +243 -0
  452. package/test/cli/account.test.ts +30 -0
  453. package/test/cli/acp/acp-test-client.ts +97 -0
  454. package/test/cli/acp/config-options.test.ts +103 -0
  455. package/test/cli/acp/helpers.ts +96 -0
  456. package/test/cli/acp/initialize-auth.test.ts +61 -0
  457. package/test/cli/acp/lifecycle.test.ts +118 -0
  458. package/test/cli/acp/prompt-content.test.ts +97 -0
  459. package/test/cli/acp/skills.test.ts +38 -0
  460. package/test/cli/cmd/tui/attention.test.ts +484 -0
  461. package/test/cli/effect-cmd-instance-als.test.ts +39 -0
  462. package/test/cli/error.test.ts +95 -0
  463. package/test/cli/github-action.test.ts +199 -0
  464. package/test/cli/github-remote.test.ts +90 -0
  465. package/test/cli/help/__snapshots__/help-snapshots.test.ts.snap +631 -0
  466. package/test/cli/help/help-snapshots.test.ts +137 -0
  467. package/test/cli/import.test.ts +54 -0
  468. package/test/cli/mcp-add.test.ts +74 -0
  469. package/test/cli/plugin-auth-picker.test.ts +120 -0
  470. package/test/cli/run/entry.body.test.ts +536 -0
  471. package/test/cli/run/footer.menu.test.ts +43 -0
  472. package/test/cli/run/footer.view.test.tsx +1336 -0
  473. package/test/cli/run/footer.width.test.ts +35 -0
  474. package/test/cli/run/permission.shared.test.ts +144 -0
  475. package/test/cli/run/prompt.editor.test.ts +101 -0
  476. package/test/cli/run/prompt.shared.test.ts +101 -0
  477. package/test/cli/run/question.shared.test.ts +115 -0
  478. package/test/cli/run/run-process.test.ts +84 -0
  479. package/test/cli/run/runtime.boot.test.ts +283 -0
  480. package/test/cli/run/runtime.queue.test.ts +481 -0
  481. package/test/cli/run/runtime.stdin.test.ts +71 -0
  482. package/test/cli/run/runtime.test.ts +238 -0
  483. package/test/cli/run/scrollback.surface.test.ts +1065 -0
  484. package/test/cli/run/stream.test.ts +56 -0
  485. package/test/cli/run/stream.transport.test.ts +2363 -0
  486. package/test/cli/run/subagent-data.test.ts +547 -0
  487. package/test/cli/run/theme.test.ts +177 -0
  488. package/test/cli/run/variant.shared.test.ts +217 -0
  489. package/test/cli/serve/serve-process.test.ts +61 -0
  490. package/test/cli/smokes/read-only.test.ts +115 -0
  491. package/test/cli/tui/attach.test.ts +11 -0
  492. package/test/cli/tui/editor-context-zed.test.ts +379 -0
  493. package/test/cli/tui/editor-context.test.tsx +297 -0
  494. package/test/cli/tui/plugin-add.test.ts +110 -0
  495. package/test/cli/tui/plugin-install.test.ts +87 -0
  496. package/test/cli/tui/plugin-lifecycle.test.ts +224 -0
  497. package/test/cli/tui/plugin-loader-entrypoint.test.ts +485 -0
  498. package/test/cli/tui/plugin-loader-pure.test.ts +72 -0
  499. package/test/cli/tui/plugin-loader.test.ts +1332 -0
  500. package/test/cli/tui/plugin-toggle.test.ts +264 -0
  501. package/test/cli/tui/thread.test.ts +36 -0
  502. package/test/cli.test.ts +7 -0
  503. package/test/command/acp-slash-detect.test.ts +202 -0
  504. package/test/command/demo-slash.test.ts +213 -0
  505. package/test/command/slash-head.test.ts +232 -0
  506. package/test/command/slash-parsing.test.ts +193 -0
  507. package/test/command/terminal-ai-commands.test.ts +536 -0
  508. package/test/config/agent-color.test.ts +47 -0
  509. package/test/config/config.test.ts +1994 -0
  510. package/test/config/entry-name.test.ts +57 -0
  511. package/test/config/fixtures/empty-frontmatter.md +4 -0
  512. package/test/config/fixtures/frontmatter.md +28 -0
  513. package/test/config/fixtures/markdown-header.md +11 -0
  514. package/test/config/fixtures/no-frontmatter.md +1 -0
  515. package/test/config/fixtures/weird-model-id.md +13 -0
  516. package/test/config/lsp.test.ts +69 -0
  517. package/test/config/markdown.test.ts +228 -0
  518. package/test/config/plugin.test.ts +0 -0
  519. package/test/config/tui.test.ts +886 -0
  520. package/test/control-plane/adapters.test.ts +71 -0
  521. package/test/control-plane/workspace.test.ts +1704 -0
  522. package/test/effect/app-runtime-logger.test.ts +105 -0
  523. package/test/effect/config-service.test.ts +65 -0
  524. package/test/effect/instance-state.test.ts +391 -0
  525. package/test/effect/run-service.test.ts +89 -0
  526. package/test/effect/runner.test.ts +514 -0
  527. package/test/effect/runtime-flags.test.ts +373 -0
  528. package/test/fake/account.ts +9 -0
  529. package/test/fake/auth.ts +8 -0
  530. package/test/fake/npm.ts +8 -0
  531. package/test/fake/provider.ts +82 -0
  532. package/test/fake/skill.ts +8 -0
  533. package/test/filesystem/filesystem.test.ts +319 -0
  534. package/test/fixture/agent-plugin.constants.ts +6 -0
  535. package/test/fixture/agent-plugin.ts +12 -0
  536. package/test/fixture/config.ts +23 -0
  537. package/test/fixture/db.ts +11 -0
  538. package/test/fixture/fixture.test.ts +26 -0
  539. package/test/fixture/fixture.ts +224 -0
  540. package/test/fixture/flag.ts +20 -0
  541. package/test/fixture/flock-worker.ts +72 -0
  542. package/test/fixture/lsp/fake-lsp-server.js +249 -0
  543. package/test/fixture/plug-worker.ts +96 -0
  544. package/test/fixture/plugin-meta-worker.ts +19 -0
  545. package/test/fixture/plugin.ts +10 -0
  546. package/test/fixture/skills/agents-sdk/SKILL.md +152 -0
  547. package/test/fixture/skills/agents-sdk/references/callable.md +92 -0
  548. package/test/fixture/skills/cloudflare/SKILL.md +211 -0
  549. package/test/fixture/skills/index.json +6 -0
  550. package/test/fixture/tui-environment.tsx +32 -0
  551. package/test/fixture/tui-plugin.ts +357 -0
  552. package/test/fixture/tui-runtime.ts +56 -0
  553. package/test/fixture/tui-sdk.ts +82 -0
  554. package/test/fixture/workspace.ts +30 -0
  555. package/test/format/format.test.ts +228 -0
  556. package/test/git/git.test.ts +178 -0
  557. package/test/ide/ide.test.ts +82 -0
  558. package/test/image/fixtures/picture-5mb-base64.png +0 -0
  559. package/test/image/image.test.ts +123 -0
  560. package/test/installation/installation.test.ts +231 -0
  561. package/test/lib/cli-process.ts +459 -0
  562. package/test/lib/effect.ts +177 -0
  563. package/test/lib/filesystem.ts +10 -0
  564. package/test/lib/llm-server.ts +771 -0
  565. package/test/lib/snapshot.ts +73 -0
  566. package/test/lib/test-provider.ts +37 -0
  567. package/test/lib/websocket.ts +46 -0
  568. package/test/lsp/client.test.ts +493 -0
  569. package/test/lsp/index.test.ts +232 -0
  570. package/test/lsp/jdtls-root.test.ts +459 -0
  571. package/test/lsp/launch.test.ts +22 -0
  572. package/test/lsp/lifecycle.test.ts +160 -0
  573. package/test/mcp/auth.test.ts +78 -0
  574. package/test/mcp/builtin.test.ts +95 -0
  575. package/test/mcp/headers.test.ts +126 -0
  576. package/test/mcp/lifecycle.test.ts +999 -0
  577. package/test/mcp/oauth-auto-connect.test.ts +274 -0
  578. package/test/mcp/oauth-browser.test.ts +232 -0
  579. package/test/mcp/oauth-callback.test.ts +34 -0
  580. package/test/mcp/oauth-provider.test.ts +61 -0
  581. package/test/patch/patch.test.ts +383 -0
  582. package/test/permission/arity.test.ts +33 -0
  583. package/test/permission/next.test.ts +1176 -0
  584. package/test/permission-task.test.ts +318 -0
  585. package/test/plugin/auth-override.test.ts +105 -0
  586. package/test/plugin/cloudflare.test.ts +68 -0
  587. package/test/plugin/codex.test.ts +247 -0
  588. package/test/plugin/github-copilot-models.test.ts +332 -0
  589. package/test/plugin/install-concurrency.test.ts +140 -0
  590. package/test/plugin/install.test.ts +573 -0
  591. package/test/plugin/loader-shared.test.ts +1303 -0
  592. package/test/plugin/meta.test.ts +137 -0
  593. package/test/plugin/openai-rollout.test.ts +17 -0
  594. package/test/plugin/openai-ws.test.ts +877 -0
  595. package/test/plugin/shared.test.ts +88 -0
  596. package/test/plugin/trigger.test.ts +120 -0
  597. package/test/plugin/workspace-adapter.test.ts +137 -0
  598. package/test/plugin/xai.test.ts +634 -0
  599. package/test/preload.ts +99 -0
  600. package/test/project/instance-bootstrap.test.ts +110 -0
  601. package/test/project/instance.test.ts +245 -0
  602. package/test/project/migrate-global.test.ts +170 -0
  603. package/test/project/project-directory.test.ts +169 -0
  604. package/test/project/project.test.ts +818 -0
  605. package/test/project/vcs.test.ts +336 -0
  606. package/test/project/worktree-remove.test.ts +126 -0
  607. package/test/project/worktree.test.ts +320 -0
  608. package/test/provider/amazon-bedrock.test.ts +360 -0
  609. package/test/provider/cf-ai-gateway-e2e.test.ts +132 -0
  610. package/test/provider/digitalocean.test.ts +123 -0
  611. package/test/provider/gitlab-duo.test.ts +412 -0
  612. package/test/provider/header-timeout.test.ts +233 -0
  613. package/test/provider/model-status.test.ts +61 -0
  614. package/test/provider/provider.test.ts +1795 -0
  615. package/test/provider/transform.test.ts +3937 -0
  616. package/test/pty/pty-shell.test.ts +102 -0
  617. package/test/question/question.test.ts +465 -0
  618. package/test/reference/reference.test.ts +311 -0
  619. package/test/server/AGENTS.md +15 -0
  620. package/test/server/auth.test.ts +59 -0
  621. package/test/server/global-bus.ts +31 -0
  622. package/test/server/httpapi-authorization.test.ts +174 -0
  623. package/test/server/httpapi-compression.test.ts +154 -0
  624. package/test/server/httpapi-config.test.ts +113 -0
  625. package/test/server/httpapi-control-plane.test.ts +63 -0
  626. package/test/server/httpapi-cors-vary.test.ts +66 -0
  627. package/test/server/httpapi-cors.test.ts +122 -0
  628. package/test/server/httpapi-error-middleware.test.ts +96 -0
  629. package/test/server/httpapi-event.test.ts +97 -0
  630. package/test/server/httpapi-exercise/assertions.ts +64 -0
  631. package/test/server/httpapi-exercise/backend.ts +144 -0
  632. package/test/server/httpapi-exercise/dsl.ts +210 -0
  633. package/test/server/httpapi-exercise/environment.ts +40 -0
  634. package/test/server/httpapi-exercise/index.ts +1538 -0
  635. package/test/server/httpapi-exercise/report.ts +66 -0
  636. package/test/server/httpapi-exercise/routing.ts +96 -0
  637. package/test/server/httpapi-exercise/runner.ts +267 -0
  638. package/test/server/httpapi-exercise/runtime.ts +52 -0
  639. package/test/server/httpapi-exercise/types.ts +123 -0
  640. package/test/server/httpapi-experimental.test.ts +300 -0
  641. package/test/server/httpapi-file.test.ts +76 -0
  642. package/test/server/httpapi-global.test.ts +66 -0
  643. package/test/server/httpapi-instance-context.test.ts +347 -0
  644. package/test/server/httpapi-instance-route-auth.test.ts +84 -0
  645. package/test/server/httpapi-instance.test.ts +265 -0
  646. package/test/server/httpapi-layer.ts +33 -0
  647. package/test/server/httpapi-listen.test.ts +415 -0
  648. package/test/server/httpapi-mcp-oauth.test.ts +73 -0
  649. package/test/server/httpapi-mcp.test.ts +234 -0
  650. package/test/server/httpapi-mdns.test.ts +82 -0
  651. package/test/server/httpapi-promptasync-context.test.ts +222 -0
  652. package/test/server/httpapi-provider.test.ts +403 -0
  653. package/test/server/httpapi-pty.test.ts +275 -0
  654. package/test/server/httpapi-public-openapi.test.ts +297 -0
  655. package/test/server/httpapi-query-schema-drift.test.ts +330 -0
  656. package/test/server/httpapi-reference.test.ts +56 -0
  657. package/test/server/httpapi-schema-error-body.test.ts +165 -0
  658. package/test/server/httpapi-sdk.test.ts +909 -0
  659. package/test/server/httpapi-sync.test.ts +154 -0
  660. package/test/server/httpapi-ui.test.ts +456 -0
  661. package/test/server/httpapi-v2-location.test.ts +85 -0
  662. package/test/server/httpapi-workspace-routing.test.ts +554 -0
  663. package/test/server/httpapi-workspace.test.ts +515 -0
  664. package/test/server/project-copy.test.ts +101 -0
  665. package/test/server/project-init-git.test.ts +117 -0
  666. package/test/server/proxy-util.test.ts +113 -0
  667. package/test/server/sdk-error-shape.test.ts +84 -0
  668. package/test/server/sdk-v1-smoke.test.ts +60 -0
  669. package/test/server/workspace-proxy.test.ts +181 -0
  670. package/test/server/workspace-routing.test.ts +94 -0
  671. package/test/server/worktree-endpoint-repro.test.ts +307 -0
  672. package/test/share/share-next.test.ts +344 -0
  673. package/test/shell/shell.test.ts +99 -0
  674. package/test/skill/discovery.test.ts +139 -0
  675. package/test/skill/skill.test.ts +571 -0
  676. package/test/snapshot/snapshot.test.ts +1121 -0
  677. package/test/storage/storage.test.ts +296 -0
  678. package/test/storage/workspace-time-migration.test.ts +50 -0
  679. package/test/tool/__snapshots__/parameters.test.ts.snap +484 -0
  680. package/test/tool/__snapshots__/tool.test.ts.snap +9 -0
  681. package/test/tool/apply_patch.test.ts +533 -0
  682. package/test/tool/browser.integration.test.ts +141 -0
  683. package/test/tool/desktop.integration.test.ts +129 -0
  684. package/test/tool/desktop.test.ts +85 -0
  685. package/test/tool/edit.test.ts +578 -0
  686. package/test/tool/external-directory.test.ts +167 -0
  687. package/test/tool/fixtures/large-image.png +0 -0
  688. package/test/tool/fixtures/models-api.json +117299 -0
  689. package/test/tool/glob.test.ts +188 -0
  690. package/test/tool/grep.test.ts +266 -0
  691. package/test/tool/lsp.test.ts +181 -0
  692. package/test/tool/parameters.test.ts +293 -0
  693. package/test/tool/question.test.ts +138 -0
  694. package/test/tool/read.test.ts +659 -0
  695. package/test/tool/registry.test.ts +539 -0
  696. package/test/tool/shell.test.ts +1256 -0
  697. package/test/tool/skill.test.ts +135 -0
  698. package/test/tool/task.test.ts +901 -0
  699. package/test/tool/tool-define.test.ts +153 -0
  700. package/test/tool/truncation.test.ts +266 -0
  701. package/test/tool/webfetch.test.ts +113 -0
  702. package/test/tool/websearch.test.ts +99 -0
  703. package/test/tool/write.test.ts +276 -0
  704. package/test/util/data-url.test.ts +14 -0
  705. package/test/util/error.test.ts +16 -0
  706. package/test/util/filesystem.test.ts +656 -0
  707. package/test/util/glob.test.ts +164 -0
  708. package/test/util/iife.test.ts +36 -0
  709. package/test/util/lazy.test.ts +50 -0
  710. package/test/util/log.test.ts +77 -0
  711. package/test/util/module.test.ts +59 -0
  712. package/test/util/process.test.ts +128 -0
  713. package/test/util/repository.test.ts +93 -0
  714. package/test/util/timeout.test.ts +21 -0
  715. package/test/util/wildcard.test.ts +90 -0
  716. package/tsconfig.json +16 -0
@@ -0,0 +1,320 @@
1
+ import path from "path"
2
+ import { Context, Effect, Layer, Schema } from "effect"
3
+ import { FSUtil } from "@octocode-ai/core/fs-util"
4
+ import { Flock } from "@octocode-ai/core/util/flock"
5
+ import { Git } from "@/git"
6
+ import {
7
+ repositoryCachePath,
8
+ sameRepositoryReference,
9
+ parseRepositoryReference,
10
+ parseRemoteRepositoryReference,
11
+ validateRepositoryBranch,
12
+ InvalidRepositoryBranchError,
13
+ InvalidRepositoryReferenceError,
14
+ UnsupportedLocalRepositoryError,
15
+ type RemoteReference,
16
+ } from "@/util/repository"
17
+
18
+ export type Result = {
19
+ repository: string
20
+ host: string
21
+ remote: string
22
+ localPath: string
23
+ status: "cached" | "cloned" | "refreshed"
24
+ head?: string
25
+ branch?: string
26
+ }
27
+
28
+ export type EnsureInput = {
29
+ reference: RemoteReference
30
+ refresh?: boolean
31
+ branch?: string
32
+ }
33
+
34
+ export class InvalidRepositoryError extends Schema.TaggedErrorClass<InvalidRepositoryError>()(
35
+ "RepositoryCacheInvalidRepositoryError",
36
+ {
37
+ repository: Schema.String,
38
+ message: Schema.String,
39
+ },
40
+ ) {}
41
+
42
+ export class InvalidBranchError extends Schema.TaggedErrorClass<InvalidBranchError>()(
43
+ "RepositoryCacheInvalidBranchError",
44
+ {
45
+ branch: Schema.String,
46
+ message: Schema.String,
47
+ },
48
+ ) {}
49
+
50
+ export class CloneFailedError extends Schema.TaggedErrorClass<CloneFailedError>()("RepositoryCacheCloneFailedError", {
51
+ repository: Schema.String,
52
+ message: Schema.String,
53
+ }) {}
54
+
55
+ export class FetchFailedError extends Schema.TaggedErrorClass<FetchFailedError>()("RepositoryCacheFetchFailedError", {
56
+ repository: Schema.String,
57
+ message: Schema.String,
58
+ }) {}
59
+
60
+ export class CheckoutFailedError extends Schema.TaggedErrorClass<CheckoutFailedError>()(
61
+ "RepositoryCacheCheckoutFailedError",
62
+ {
63
+ repository: Schema.String,
64
+ branch: Schema.String,
65
+ message: Schema.String,
66
+ },
67
+ ) {}
68
+
69
+ export class ResetFailedError extends Schema.TaggedErrorClass<ResetFailedError>()("RepositoryCacheResetFailedError", {
70
+ repository: Schema.String,
71
+ message: Schema.String,
72
+ }) {}
73
+
74
+ export class LockFailedError extends Schema.TaggedErrorClass<LockFailedError>()("RepositoryCacheLockFailedError", {
75
+ localPath: Schema.String,
76
+ message: Schema.String,
77
+ }) {}
78
+
79
+ export class CacheOperationError extends Schema.TaggedErrorClass<CacheOperationError>()(
80
+ "RepositoryCacheOperationError",
81
+ {
82
+ operation: Schema.String,
83
+ path: Schema.String,
84
+ message: Schema.String,
85
+ },
86
+ ) {}
87
+
88
+ export type Error =
89
+ | InvalidRepositoryError
90
+ | InvalidBranchError
91
+ | CloneFailedError
92
+ | FetchFailedError
93
+ | CheckoutFailedError
94
+ | ResetFailedError
95
+ | LockFailedError
96
+ | CacheOperationError
97
+
98
+ export interface Interface {
99
+ ensure: (input: EnsureInput) => Effect.Effect<Result, Error>
100
+ }
101
+
102
+ export class Service extends Context.Service<Service, Interface>()("@octocode/RepositoryCache") {}
103
+
104
+ function statusForRepository(input: { reuse: boolean; refresh?: boolean; branchMatches?: boolean }) {
105
+ if (!input.reuse) return "cloned" as const
106
+ if (input.branchMatches === false) return "refreshed" as const
107
+ if (input.refresh) return "refreshed" as const
108
+ return "cached" as const
109
+ }
110
+
111
+ function resetTarget(input: {
112
+ requestedBranch?: string
113
+ remoteHead: { code: number; stdout: string }
114
+ branch: { code: number; stdout: string }
115
+ }) {
116
+ if (input.requestedBranch) return `origin/${input.requestedBranch}`
117
+ if (input.remoteHead.code === 0 && input.remoteHead.stdout) {
118
+ return input.remoteHead.stdout.replace(/^refs\/remotes\//, "")
119
+ }
120
+ if (input.branch.code === 0 && input.branch.stdout) {
121
+ return `origin/${input.branch.stdout}`
122
+ }
123
+ return "HEAD"
124
+ }
125
+
126
+ function errorMessage(error: unknown) {
127
+ return error instanceof globalThis.Error ? error.message : String(error)
128
+ }
129
+
130
+ export function isError(error: unknown): error is Error {
131
+ return (
132
+ error instanceof InvalidRepositoryError ||
133
+ error instanceof InvalidBranchError ||
134
+ error instanceof CloneFailedError ||
135
+ error instanceof FetchFailedError ||
136
+ error instanceof CheckoutFailedError ||
137
+ error instanceof ResetFailedError ||
138
+ error instanceof LockFailedError ||
139
+ error instanceof CacheOperationError
140
+ )
141
+ }
142
+
143
+ export const parseRemoteReference = Effect.fn("RepositoryCache.parseRemoteReference")(function* (repository: string) {
144
+ try {
145
+ return parseRemoteRepositoryReference(repository)
146
+ } catch (error) {
147
+ if (error instanceof InvalidRepositoryReferenceError || error instanceof UnsupportedLocalRepositoryError) {
148
+ return yield* new InvalidRepositoryError({ repository: error.repository, message: error.message })
149
+ }
150
+ return yield* new InvalidRepositoryError({
151
+ repository,
152
+ message: errorMessage(error),
153
+ })
154
+ }
155
+ })
156
+
157
+ export const validateBranch = Effect.fn("RepositoryCache.validateBranch")(function* (branch: string) {
158
+ try {
159
+ validateRepositoryBranch(branch)
160
+ } catch (error) {
161
+ if (error instanceof InvalidRepositoryBranchError) {
162
+ return yield* new InvalidBranchError({ branch: error.branch, message: error.message })
163
+ }
164
+ return yield* new InvalidBranchError({ branch, message: errorMessage(error) })
165
+ }
166
+ })
167
+
168
+ const ensureWithServices = Effect.fn("RepositoryCache.ensureWithServices")(function* (
169
+ input: EnsureInput,
170
+ services: {
171
+ fs: FSUtil.Interface
172
+ git: Git.Interface
173
+ },
174
+ ) {
175
+ if (input.branch) yield* validateBranch(input.branch)
176
+
177
+ const repository = input.reference.label
178
+ const remote = input.reference.remote
179
+ const localPath = repositoryCachePath(input.reference)
180
+ const cloneTarget = parseRepositoryReference(remote) ?? input.reference
181
+
182
+ return yield* Effect.acquireUseRelease(
183
+ Effect.promise((signal) => Flock.acquire(`repo-clone:${localPath}`, { signal })).pipe(
184
+ Effect.catch((error: unknown) =>
185
+ Effect.fail(new LockFailedError({ localPath, message: errorMessage(error) || `Failed to lock ${localPath}` })),
186
+ ),
187
+ ),
188
+ () =>
189
+ Effect.gen(function* () {
190
+ yield* services.fs.ensureDir(path.dirname(localPath)).pipe(
191
+ Effect.catch((error: unknown) =>
192
+ Effect.fail(
193
+ new CacheOperationError({
194
+ operation: "ensure cache directory",
195
+ path: localPath,
196
+ message: errorMessage(error),
197
+ }),
198
+ ),
199
+ ),
200
+ )
201
+
202
+ const exists = yield* services.fs.existsSafe(localPath)
203
+ const hasGitDir = yield* services.fs.existsSafe(path.join(localPath, ".git"))
204
+ const origin = hasGitDir
205
+ ? yield* services.git.run(["config", "--get", "remote.origin.url"], { cwd: localPath })
206
+ : undefined
207
+ const originReference = origin?.exitCode === 0 ? parseRepositoryReference(origin.text().trim()) : undefined
208
+ const reuse = hasGitDir && Boolean(originReference && sameRepositoryReference(originReference, cloneTarget))
209
+ if (exists && !reuse) {
210
+ yield* services.fs.remove(localPath, { recursive: true }).pipe(
211
+ Effect.catch((error: unknown) =>
212
+ Effect.fail(
213
+ new CacheOperationError({
214
+ operation: "remove stale cache",
215
+ path: localPath,
216
+ message: errorMessage(error),
217
+ }),
218
+ ),
219
+ ),
220
+ )
221
+ }
222
+
223
+ const currentBranch = hasGitDir ? yield* services.git.branch(localPath) : undefined
224
+ const status = statusForRepository({
225
+ reuse,
226
+ refresh: input.refresh,
227
+ branchMatches: input.branch ? currentBranch === input.branch : undefined,
228
+ })
229
+
230
+ if (status === "cloned") {
231
+ const clone = yield* services.git.run(
232
+ ["clone", "--depth", "100", ...(input.branch ? ["--branch", input.branch] : []), "--", remote, localPath],
233
+ { cwd: path.dirname(localPath) },
234
+ )
235
+ if (clone.exitCode !== 0) {
236
+ return yield* new CloneFailedError({
237
+ repository,
238
+ message: clone.stderr.toString().trim() || clone.text().trim() || `Failed to clone ${repository}`,
239
+ })
240
+ }
241
+ }
242
+
243
+ if (status === "refreshed") {
244
+ const fetch = yield* services.git.run(["fetch", "--all", "--prune"], { cwd: localPath })
245
+ if (fetch.exitCode !== 0) {
246
+ return yield* new FetchFailedError({
247
+ repository,
248
+ message: fetch.stderr.toString().trim() || fetch.text().trim() || `Failed to refresh ${repository}`,
249
+ })
250
+ }
251
+
252
+ if (input.branch) {
253
+ const checkout = yield* services.git.run(["checkout", "-B", input.branch, `origin/${input.branch}`], {
254
+ cwd: localPath,
255
+ })
256
+ if (checkout.exitCode !== 0) {
257
+ return yield* new CheckoutFailedError({
258
+ repository,
259
+ branch: input.branch,
260
+ message:
261
+ checkout.stderr.toString().trim() || checkout.text().trim() || `Failed to checkout ${input.branch}`,
262
+ })
263
+ }
264
+ }
265
+
266
+ const remoteHead = yield* services.git.run(["symbolic-ref", "refs/remotes/origin/HEAD"], { cwd: localPath })
267
+ const branch = yield* services.git.run(["symbolic-ref", "--quiet", "--short", "HEAD"], { cwd: localPath })
268
+ const target = resetTarget({
269
+ requestedBranch: input.branch,
270
+ remoteHead: { code: remoteHead.exitCode, stdout: remoteHead.text().trim() },
271
+ branch: { code: branch.exitCode, stdout: branch.text().trim() },
272
+ })
273
+
274
+ const reset = yield* services.git.run(["reset", "--hard", target], { cwd: localPath })
275
+ if (reset.exitCode !== 0) {
276
+ return yield* new ResetFailedError({
277
+ repository,
278
+ message: reset.stderr.toString().trim() || reset.text().trim() || `Failed to reset ${repository}`,
279
+ })
280
+ }
281
+ }
282
+
283
+ const head = yield* services.git.run(["rev-parse", "HEAD"], { cwd: localPath })
284
+ const branch = yield* services.git.branch(localPath)
285
+ const headText = head.exitCode === 0 ? head.text().trim() : undefined
286
+
287
+ return {
288
+ repository,
289
+ host: input.reference.host,
290
+ remote,
291
+ localPath,
292
+ status,
293
+ head: headText,
294
+ branch,
295
+ } satisfies Result
296
+ }),
297
+ (lock) => Effect.promise(() => lock.release()).pipe(Effect.ignore),
298
+ )
299
+ })
300
+
301
+ export const layer: Layer.Layer<Service, never, FSUtil.Service | Git.Service> = Layer.effect(
302
+ Service,
303
+ Effect.gen(function* () {
304
+ const fs = yield* FSUtil.Service
305
+ const git = yield* Git.Service
306
+
307
+ return Service.of({
308
+ ensure: Effect.fn("RepositoryCache.ensure")(function* (input) {
309
+ return yield* ensureWithServices(input, { fs, git })
310
+ }),
311
+ })
312
+ }),
313
+ )
314
+
315
+ export const defaultLayer: Layer.Layer<Service> = layer.pipe(
316
+ Layer.provide(FSUtil.defaultLayer),
317
+ Layer.provide(Git.defaultLayer),
318
+ )
319
+
320
+ export * as RepositoryCache from "./repository-cache"
@@ -0,0 +1,48 @@
1
+ export * as ServerAuth from "./auth"
2
+
3
+ import { ConfigService } from "@/effect/config-service"
4
+ import { Flag } from "@octocode-ai/core/flag/flag"
5
+ import { Config as EffectConfig, Context, Option, Redacted } from "effect"
6
+
7
+ export type Credentials = {
8
+ password?: string
9
+ username?: string
10
+ }
11
+
12
+ export type DecodedCredentials = {
13
+ readonly username: string
14
+ readonly password: Redacted.Redacted
15
+ }
16
+
17
+ export class Config extends ConfigService.Service<Config>()("@octocode/ServerAuthConfig", {
18
+ password: EffectConfig.string("OCTOCODE_SERVER_PASSWORD").pipe(EffectConfig.option),
19
+ username: EffectConfig.string("OCTOCODE_SERVER_USERNAME").pipe(EffectConfig.withDefault("octo")),
20
+ }) {}
21
+
22
+ export type Info = Context.Service.Shape<typeof Config>
23
+
24
+ export function required(config: Info) {
25
+ return Option.isSome(config.password) && config.password.value !== ""
26
+ }
27
+
28
+ export function authorized(credentials: DecodedCredentials, config: Info) {
29
+ return (
30
+ Option.isSome(config.password) &&
31
+ credentials.username === config.username &&
32
+ Redacted.value(credentials.password) === config.password.value
33
+ )
34
+ }
35
+
36
+ export function header(credentials?: Credentials) {
37
+ const password = credentials?.password ?? Flag.OCTOCODE_SERVER_PASSWORD
38
+ if (!password) return undefined
39
+
40
+ const username = credentials?.username ?? Flag.OCTOCODE_SERVER_USERNAME ?? "octo"
41
+ return `Basic ${Buffer.from(`${username}:${password}`).toString("base64")}`
42
+ }
43
+
44
+ export function headers(credentials?: Credentials) {
45
+ const authorization = header(credentials)
46
+ if (!authorization) return undefined
47
+ return { Authorization: authorization }
48
+ }
@@ -0,0 +1,34 @@
1
+ import { Context } from "effect"
2
+
3
+ const octocodeOrigin = /^https:\/\/([a-z0-9-]+\.)*octocode\.ai$/
4
+
5
+ export type CorsOptions = { readonly cors?: ReadonlyArray<string> }
6
+
7
+ export const CorsConfig = Context.Reference<CorsOptions | undefined>("@octocode/ServerCorsConfig", {
8
+ defaultValue: () => undefined,
9
+ })
10
+
11
+ export function isAllowedCorsOrigin(input: string | undefined, opts?: CorsOptions) {
12
+ if (!input) return true
13
+ if (input.startsWith("http://localhost:")) return true
14
+ if (input.startsWith("http://127.0.0.1:")) return true
15
+ if (input.startsWith("oc://renderer")) return true
16
+ if (input === "tauri://localhost" || input === "http://tauri.localhost" || input === "https://tauri.localhost")
17
+ return true
18
+ if (octocodeOrigin.test(input)) return true
19
+ return opts?.cors?.includes(input) ?? false
20
+ }
21
+
22
+ export function isAllowedRequestOrigin(input: string | undefined, host: string | undefined, opts?: CorsOptions) {
23
+ if (!input) return true
24
+ if (host && sameHost(input, host)) return true
25
+ return isAllowedCorsOrigin(input, opts)
26
+ }
27
+
28
+ function sameHost(origin: string, host: string) {
29
+ try {
30
+ return new URL(origin).host === host
31
+ } catch {
32
+ return false
33
+ }
34
+ }
@@ -0,0 +1,13 @@
1
+ import { EventV2 } from "@octocode-ai/core/event"
2
+ import { Schema } from "effect"
3
+
4
+ export const Event = {
5
+ Connected: EventV2.define({ type: "server.connected", schema: {} }),
6
+ Disposed: EventV2.define({ type: "global.disposed", schema: {} }),
7
+ }
8
+
9
+ export const InstanceDisposed = Schema.Struct({
10
+ id: Schema.String,
11
+ type: Schema.Literal("server.instance.disposed"),
12
+ properties: Schema.Struct({ directory: Schema.String }),
13
+ }).annotate({ identifier: "Event.server.instance.disposed" })
@@ -0,0 +1,37 @@
1
+ import { GlobalBus } from "@/bus/global"
2
+ import { InstanceStore } from "@/project/instance-store"
3
+ import * as Log from "@octocode-ai/core/util/log"
4
+ import { Effect } from "effect"
5
+ import { Event } from "./event"
6
+
7
+ const log = Log.create({ service: "server" })
8
+
9
+ export const emitGlobalDisposed = Effect.sync(() =>
10
+ GlobalBus.emit("event", {
11
+ directory: "global",
12
+ payload: {
13
+ type: Event.Disposed.type,
14
+ properties: {},
15
+ },
16
+ }),
17
+ )
18
+
19
+ export const disposeAllInstancesAndEmitGlobalDisposed = Effect.fn("Server.disposeAllInstancesAndEmitGlobalDisposed")(
20
+ function* (options?: { swallowErrors?: boolean }) {
21
+ const store = yield* InstanceStore.Service
22
+ yield* Effect.gen(function* () {
23
+ yield* options?.swallowErrors
24
+ ? store.disposeAll().pipe(
25
+ Effect.catchCause((cause) =>
26
+ Effect.sync(() => {
27
+ log.warn("global disposal failed", { cause })
28
+ }),
29
+ ),
30
+ )
31
+ : store.disposeAll()
32
+ yield* emitGlobalDisposed
33
+ }).pipe(Effect.uninterruptible)
34
+ },
35
+ )
36
+
37
+ export * as GlobalLifecycle from "./global-lifecycle"
@@ -0,0 +1,3 @@
1
+ import { initProjectors } from "./projectors"
2
+
3
+ initProjectors()
@@ -0,0 +1,60 @@
1
+ import * as Log from "@octocode-ai/core/util/log"
2
+ import { Bonjour } from "bonjour-service"
3
+
4
+ const log = Log.create({ service: "mdns" })
5
+
6
+ let bonjour: Bonjour | undefined
7
+ let currentPort: number | undefined
8
+
9
+ export function publish(port: number, domain?: string) {
10
+ if (currentPort === port) return
11
+ if (bonjour) unpublish()
12
+
13
+ try {
14
+ const host = domain ?? "octo.local"
15
+ const name = `octo-${port}`
16
+ bonjour = new Bonjour()
17
+ const service = bonjour.publish({
18
+ name,
19
+ type: "http",
20
+ host,
21
+ port,
22
+ txt: { path: "/" },
23
+ })
24
+
25
+ service.on("up", () => {
26
+ log.info("mDNS service published", { name, port })
27
+ })
28
+
29
+ service.on("error", (err) => {
30
+ log.error("mDNS service error", { error: err })
31
+ })
32
+
33
+ currentPort = port
34
+ } catch (err) {
35
+ log.error("mDNS publish failed", { error: err })
36
+ if (bonjour) {
37
+ try {
38
+ bonjour.destroy()
39
+ } catch {}
40
+ }
41
+ bonjour = undefined
42
+ currentPort = undefined
43
+ }
44
+ }
45
+
46
+ export function unpublish() {
47
+ if (bonjour) {
48
+ try {
49
+ bonjour.unpublishAll()
50
+ bonjour.destroy()
51
+ } catch (err) {
52
+ log.error("mDNS unpublish failed", { error: err })
53
+ }
54
+ bonjour = undefined
55
+ currentPort = undefined
56
+ log.info("mDNS service unpublished")
57
+ }
58
+ }
59
+
60
+ export * as MDNS from "./mdns"
@@ -0,0 +1 @@
1
+ export function initProjectors() {}
@@ -0,0 +1,48 @@
1
+ const hop = new Set([
2
+ "connection",
3
+ "keep-alive",
4
+ "proxy-authenticate",
5
+ "proxy-authorization",
6
+ "proxy-connection",
7
+ "te",
8
+ "trailer",
9
+ "transfer-encoding",
10
+ "upgrade",
11
+ "host",
12
+ ])
13
+
14
+ function sanitize(out: Headers) {
15
+ for (const key of hop) out.delete(key)
16
+ out.delete("accept-encoding")
17
+ out.delete("x-octocode-directory")
18
+ out.delete("x-octocode-workspace")
19
+ }
20
+
21
+ export function headers(input: Request | HeadersInit | Record<string, string>, extra?: HeadersInit) {
22
+ const raw = input instanceof Request ? input.headers : input
23
+ const out = new Headers(raw instanceof Headers ? raw : Object.entries(raw as Record<string, string>))
24
+ sanitize(out)
25
+ if (!extra) return out
26
+ for (const [key, value] of new Headers(extra).entries()) {
27
+ out.set(key, value)
28
+ }
29
+ return out
30
+ }
31
+
32
+ export function websocketProtocols(input: Request | Record<string, string | undefined>) {
33
+ const value = input instanceof Request ? input.headers.get("sec-websocket-protocol") : input["sec-websocket-protocol"]
34
+ if (!value) return []
35
+ return value
36
+ .split(",")
37
+ .map((item) => item.trim())
38
+ .filter(Boolean)
39
+ }
40
+
41
+ export function websocketTargetURL(url: string | URL) {
42
+ const next = new URL(url)
43
+ if (next.protocol === "http:") next.protocol = "ws:"
44
+ if (next.protocol === "https:") next.protocol = "wss:"
45
+ return next.toString()
46
+ }
47
+
48
+ export * as ProxyUtil from "./proxy-util"
@@ -0,0 +1,39 @@
1
+ # HttpApi Route Patterns
2
+
3
+ Use `HttpApiBuilder.group(...)` for normal HTTP endpoints, including streaming HTTP responses such as server-sent events. Handlers should yield stable services once while building the handler layer, then close over those services in endpoint implementations.
4
+
5
+ ```ts
6
+ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session", (handlers) =>
7
+ Effect.gen(function* () {
8
+ const session = yield* Session.Service
9
+
10
+ return handlers.handle("list", () => session.list())
11
+ }),
12
+ )
13
+ ```
14
+
15
+ For SSE endpoints, stay in `HttpApiBuilder.group(...)` and return `HttpServerResponse.stream(...)` from the handler. Annotate the endpoint success schema with `HttpApiSchema.asText({ contentType: "text/event-stream" })` so OpenAPI documents the stream content type.
16
+
17
+ Use `HttpApiBuilder.group(...)` with `handleRaw(...)` for declared endpoints that need the raw request or response, including WebSocket upgrade routes. This keeps endpoint middleware, routing context, and OpenAPI metadata on one typed route tree.
18
+
19
+ ```ts
20
+ export const ptyConnectHandlers = HttpApiBuilder.group(PtyConnectApi, "pty-connect", (handlers) =>
21
+ Effect.gen(function* () {
22
+ const pty = yield* Pty.Service
23
+
24
+ return handlers.handleRaw("connect", (ctx) => connectPty(ctx.request, pty))
25
+ }),
26
+ )
27
+ ```
28
+
29
+ Use raw `HttpRouter.use(...)` only for routes outside the declared API surface, such as a catch-all UI fallback.
30
+
31
+ Avoid `Effect.provide(SomeLayer)` inside request handlers or raw route callbacks. Stable layers should be provided once at the application/layer boundary, not rebuilt or scoped per request.
32
+
33
+ Avoid `HttpRouter.provideRequest(...)` unless the dependency is intentionally request-level. Prefer `HttpRouter.use(...)` for stable app services.
34
+
35
+ Use `Effect.provideService(...)` in middleware only for request-derived context, such as `WorkspaceRouteContext`, `InstanceRef`, or `WorkspaceRef`. Do not use it to smuggle stable services through request effects when they can be yielded at layer construction.
36
+
37
+ Public JSON errors should be explicit `Schema.ErrorClass` contracts declared on each endpoint. Use built-in `HttpApiError.*` classes only when their empty/tagged body is the intended wire shape; for SDK-visible errors with messages, define an API error schema such as `ApiNotFoundError` and fail with that exact declared error. Keep domain and storage services free of HttpApi types, and translate expected domain errors at the handler boundary.
38
+
39
+ When adding middleware, declare endpoint-contract middleware on the owning `HttpApiGroup` and provide its implementation layer at the assembly boundary in `server.ts`. Keep router middleware for truly raw fallback routes or global transport policy.
@@ -0,0 +1,80 @@
1
+ import { Schema } from "effect"
2
+ import { HttpApi } from "effect/unstable/httpapi"
3
+ import { EventV2 } from "@octocode-ai/core/event"
4
+ import { InstanceDisposed } from "@/server/event"
5
+ import { Question } from "@/question"
6
+ import { ConfigApi } from "./groups/config"
7
+ import { ControlApi } from "./groups/control"
8
+ import { ControlPlaneApi } from "./groups/control-plane"
9
+ import { EventApi } from "./groups/event"
10
+ import { ExperimentalApi } from "./groups/experimental"
11
+ import { FileApi } from "./groups/file"
12
+ import { InstanceApi } from "./groups/instance"
13
+ import { McpApi } from "./groups/mcp"
14
+ import { PermissionApi } from "./groups/permission"
15
+ import { ProjectApi } from "./groups/project"
16
+ import { ProjectCopyApi } from "./groups/project-copy"
17
+ import { ProviderApi } from "./groups/provider"
18
+ import { PtyApi, PtyConnectApi } from "./groups/pty"
19
+ import { QuestionApi } from "./groups/question"
20
+ import { ReferenceApi } from "./groups/reference"
21
+ import { SessionApi } from "./groups/session"
22
+ import { SyncApi } from "./groups/sync"
23
+ import { TuiApi } from "./groups/tui"
24
+ import { WorkspaceApi } from "./groups/workspace"
25
+ import { Api } from "@octocode-ai/server/api"
26
+ // GlobalEventSchema snapshots the registry after event-producing groups register their variants.
27
+ import { GlobalApi } from "./groups/global"
28
+ import { Authorization } from "./middleware/authorization"
29
+ import { SchemaErrorMiddleware } from "./middleware/schema-error"
30
+
31
+ const EventSchema = Schema.Union([
32
+ ...EventV2.registry
33
+ .values()
34
+ .map((definition) =>
35
+ Schema.Struct({
36
+ id: EventV2.ID,
37
+ type: Schema.Literal(definition.type),
38
+ properties: definition.data,
39
+ }).annotate({ identifier: `Event.${definition.type}` }),
40
+ )
41
+ .toArray(),
42
+ InstanceDisposed,
43
+ ]).annotate({ identifier: "Event" })
44
+
45
+ export const RootHttpApi = HttpApi.make("octocode-root")
46
+ .addHttpApi(ControlApi)
47
+ .addHttpApi(ControlPlaneApi)
48
+ .addHttpApi(GlobalApi)
49
+ .middleware(SchemaErrorMiddleware)
50
+ .middleware(Authorization)
51
+
52
+ export const InstanceHttpApi = HttpApi.make("octocode-instance")
53
+ .addHttpApi(ConfigApi)
54
+ .addHttpApi(ExperimentalApi)
55
+ .addHttpApi(FileApi)
56
+ .addHttpApi(InstanceApi)
57
+ .addHttpApi(McpApi)
58
+ .addHttpApi(ProjectApi)
59
+ .addHttpApi(ProjectCopyApi)
60
+ .addHttpApi(PtyApi)
61
+ .addHttpApi(QuestionApi)
62
+ .addHttpApi(PermissionApi)
63
+ .addHttpApi(ProviderApi)
64
+ .addHttpApi(ReferenceApi)
65
+ .addHttpApi(SessionApi)
66
+ .addHttpApi(SyncApi)
67
+ .addHttpApi(TuiApi)
68
+ .addHttpApi(WorkspaceApi)
69
+ .middleware(SchemaErrorMiddleware)
70
+
71
+ export const OctoCodeHttpApi = HttpApi.make("octo")
72
+ .addHttpApi(RootHttpApi)
73
+ .addHttpApi(EventApi)
74
+ .addHttpApi(InstanceHttpApi)
75
+ .addHttpApi(Api)
76
+ .addHttpApi(PtyConnectApi)
77
+ .annotate(HttpApi.AdditionalSchemas, [EventSchema, Question.Replied, Question.Rejected])
78
+
79
+ export type RootHttpApiType = typeof RootHttpApi
80
+ export type InstanceHttpApiType = typeof InstanceHttpApi