index.ts 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. #!/usr/bin/env bun
  2. import * as NodeRuntime from "@effect/platform-node/NodeRuntime"
  3. import * as NodeServices from "@effect/platform-node/NodeServices"
  4. import { AccountV2 } from "@opencode-ai/core/account"
  5. import { AgentV2 } from "@opencode-ai/core/agent"
  6. import { Catalog } from "@opencode-ai/core/catalog"
  7. import { Config } from "@opencode-ai/core/config"
  8. import { EventV2 } from "@opencode-ai/core/event"
  9. import { Location } from "@opencode-ai/core/location"
  10. import { Npm } from "@opencode-ai/core/npm"
  11. import { PluginV2 } from "@opencode-ai/core/plugin"
  12. import { PluginBoot } from "@opencode-ai/core/plugin/boot"
  13. import { Policy } from "@opencode-ai/core/policy"
  14. import { AbsolutePath } from "@opencode-ai/core/schema"
  15. import * as Effect from "effect/Effect"
  16. import * as Layer from "effect/Layer"
  17. import * as Command from "effect/unstable/cli/Command"
  18. import { DebugCommand } from "./debug"
  19. const cli = Command.make("opencode", {}, () => Effect.void).pipe(
  20. Command.withDescription("OpenCode command line interface"),
  21. Command.withSubcommands([DebugCommand]),
  22. )
  23. const locationLayer = Location.defaultLayer({
  24. directory: AbsolutePath.make(process.cwd()),
  25. })
  26. const policyLayer = Policy.defaultLayer.pipe(Layer.provideMerge(locationLayer))
  27. const pluginLayer = PluginV2.defaultLayer
  28. const eventLayer = EventV2.defaultLayer
  29. const layer = PluginBoot.layer.pipe(
  30. Layer.provideMerge(
  31. Layer.mergeAll(
  32. NodeServices.layer,
  33. Catalog.layer.pipe(Layer.provideMerge(Layer.mergeAll(eventLayer, pluginLayer, policyLayer))),
  34. eventLayer,
  35. pluginLayer,
  36. AccountV2.defaultLayer,
  37. AgentV2.defaultLayer,
  38. Config.defaultLayer.pipe(Layer.provideMerge(policyLayer)),
  39. Npm.defaultLayer,
  40. ),
  41. ),
  42. )
  43. Command.run(cli, { version: "local" }).pipe(Effect.provide(layer), Effect.scoped, NodeRuntime.runMain)