index.ts 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. #!/usr/bin/env bun
  2. import { NodeRuntime, NodeServices } from "@effect/platform-node"
  3. import { Effect } from "effect"
  4. import { Commands } from "./commands/commands"
  5. import { Runtime } from "./framework/runtime"
  6. import { Observability } from "@opencode-ai/util/observability"
  7. import { Updater } from "./services/updater"
  8. import { OPENCODE_CHANNEL, OPENCODE_LOCAL, OPENCODE_VERSION } from "./version"
  9. import { LayerNode } from "@opencode-ai/util/effect/layer-node"
  10. import { Global } from "@opencode-ai/util/global"
  11. import { AppProcess } from "@opencode-ai/util/process"
  12. import { Config } from "./config"
  13. import { Npm } from "@opencode-ai/util/npm"
  14. const Handlers = Runtime.handlers(Commands, {
  15. $: () => import("./commands/handlers/default"),
  16. acp: () => import("./commands/handlers/acp"),
  17. api: () => import("./commands/handlers/api"),
  18. auth: {
  19. connect: () => import("./commands/handlers/auth/connect"),
  20. },
  21. debug: {
  22. agents: () => import("./commands/handlers/debug/agents"),
  23. },
  24. console: {
  25. login: () => import("./commands/handlers/console/login"),
  26. },
  27. mcp: {
  28. list: () => import("./commands/handlers/mcp/list"),
  29. add: () => import("./commands/handlers/mcp/add"),
  30. auth: () => import("./commands/handlers/mcp/auth"),
  31. logout: () => import("./commands/handlers/mcp/logout"),
  32. },
  33. plugin: {
  34. list: () => import("./commands/handlers/plugin/list"),
  35. },
  36. mini: () => import("./commands/handlers/mini"),
  37. run: () => import("./commands/handlers/run"),
  38. pair: () => import("./commands/handlers/pair"),
  39. service: {
  40. start: () => import("./commands/handlers/service/start"),
  41. restart: () => import("./commands/handlers/service/restart"),
  42. status: () => import("./commands/handlers/service/status"),
  43. stop: () => import("./commands/handlers/service/stop"),
  44. get: () => import("./commands/handlers/service/get"),
  45. set: () => import("./commands/handlers/service/set"),
  46. unset: () => import("./commands/handlers/service/unset"),
  47. },
  48. serve: () => import("./commands/handlers/serve"),
  49. })
  50. Effect.logInfo("cli starting", {
  51. version: OPENCODE_VERSION,
  52. channel: OPENCODE_CHANNEL,
  53. local: OPENCODE_LOCAL,
  54. args: process.argv.slice(2),
  55. }).pipe(
  56. Effect.flatMap(() => Runtime.run(Commands, Handlers, { version: OPENCODE_VERSION })),
  57. Effect.annotateLogs({ role: "cli" }),
  58. Effect.provide(Config.layer),
  59. Effect.provide(Updater.layer),
  60. Effect.provide(
  61. LayerNode.compile(LayerNode.group([Global.node, AppProcess.node, Npm.node]), [
  62. [
  63. Global.node,
  64. Global.layerWith(process.env.OPENCODE_CONFIG_DIR ? { config: process.env.OPENCODE_CONFIG_DIR } : {}),
  65. ],
  66. ]),
  67. ),
  68. Effect.provide(
  69. Observability.layer({
  70. endpoint: process.env.OTEL_EXPORTER_OTLP_ENDPOINT,
  71. headers: process.env.OTEL_EXPORTER_OTLP_HEADERS,
  72. client: process.env.OPENCODE_CLIENT ?? "cli",
  73. version: OPENCODE_VERSION,
  74. channel: OPENCODE_CHANNEL,
  75. }),
  76. ),
  77. Effect.provide(NodeServices.layer),
  78. Effect.scoped,
  79. Effect.tap(() => Effect.sync(() => process.exit(process.exitCode ?? 0))),
  80. NodeRuntime.runMain,
  81. )