location-layer.ts 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. import { Layer, LayerMap } from "effect"
  2. import { Location } from "./location"
  3. import { Policy } from "./policy"
  4. import { Config } from "./config"
  5. import { PluginV2 } from "./plugin"
  6. import { Catalog } from "./catalog"
  7. import { CommandV2 } from "./command"
  8. import { AgentV2 } from "./agent"
  9. import { PluginBoot } from "./plugin/boot"
  10. import { Project } from "./project"
  11. import { EventV2 } from "./event"
  12. import { Auth } from "./auth"
  13. import { Npm } from "./npm"
  14. import { ModelsDev } from "./models-dev"
  15. import { FSUtil } from "./fs-util"
  16. import { Global } from "./global"
  17. import { Database } from "./database/database"
  18. import { PermissionV2 } from "./permission"
  19. import { PermissionSaved } from "./permission/saved"
  20. import { FileSystem } from "./filesystem"
  21. import { Watcher } from "./filesystem/watcher"
  22. import { LocationMutation } from "./location-mutation"
  23. import { LocationSearch } from "./location-search"
  24. import { FileMutation } from "./file-mutation"
  25. import { ProjectReference } from "./project-reference"
  26. import { RepositoryCache } from "./repository-cache"
  27. import { Pty } from "./pty"
  28. import { SkillV2 } from "./skill"
  29. import { BuiltInTools } from "./tool/builtins"
  30. import { ToolRegistry } from "./tool/registry"
  31. import { ApplicationTools } from "./tool/application-tools"
  32. import { ToolOutputStore } from "./tool-output-store"
  33. import { AppProcess } from "./process"
  34. import { Ripgrep } from "./ripgrep"
  35. import { SessionStore } from "./session/store"
  36. import { SessionTodo } from "./session/todo"
  37. import { QuestionV2 } from "./question"
  38. import { LLMClient } from "@opencode-ai/llm"
  39. import { RequestExecutor } from "@opencode-ai/llm/route"
  40. import * as SessionRunnerLLM from "./session/runner/llm"
  41. import { SessionRunnerModel } from "./session/runner/model"
  42. import { SessionRunCoordinator } from "./session/run-coordinator"
  43. import { SystemContextBuiltIns } from "./system-context-builtins"
  44. import { FetchHttpClient } from "effect/unstable/http"
  45. export class LocationServiceMap extends LayerMap.Service<LocationServiceMap>()("@opencode/example/LocationServiceMap", {
  46. lookup: (ref: Location.Ref) => {
  47. const location = Location.layer(ref)
  48. const permissionsAndTools = ToolRegistry.layer.pipe(Layer.provideMerge(PermissionV2.locationLayer))
  49. const systemContext = SystemContextBuiltIns.locationLayer
  50. const services = Layer.mergeAll(
  51. location,
  52. Policy.locationLayer,
  53. Config.locationLayer,
  54. ProjectReference.locationLayer,
  55. PluginV2.locationLayer,
  56. Catalog.locationLayer,
  57. CommandV2.locationLayer,
  58. AgentV2.locationLayer,
  59. PluginBoot.locationLayer,
  60. FileSystem.locationLayer,
  61. Watcher.locationLayer,
  62. Pty.locationLayer,
  63. SkillV2.locationLayer,
  64. systemContext,
  65. permissionsAndTools,
  66. LocationMutation.locationLayer.pipe(Layer.orDie),
  67. ).pipe(Layer.provideMerge(location))
  68. const commits = FileMutation.locationLayer.pipe(Layer.provide(services))
  69. const searches = LocationSearch.layer.pipe(Layer.provide(Ripgrep.layer), Layer.provide(services))
  70. const resources = ToolOutputStore.layer.pipe(Layer.provide(services))
  71. const todos = SessionTodo.layer.pipe(Layer.provide(services))
  72. const questions = QuestionV2.locationLayer.pipe(Layer.provide(services))
  73. const builtInTools = BuiltInTools.locationLayer.pipe(
  74. Layer.provide(services),
  75. Layer.provide(commits),
  76. Layer.provide(searches),
  77. Layer.provide(resources),
  78. Layer.provide(todos),
  79. Layer.provide(questions),
  80. )
  81. const model = SessionRunnerModel.locationLayer.pipe(Layer.provide(services))
  82. const runner = SessionRunnerLLM.defaultLayer.pipe(Layer.provide(services), Layer.provide(model))
  83. const coordinator = SessionRunCoordinator.layer.pipe(Layer.provide(runner))
  84. return Layer.mergeAll(
  85. services,
  86. commits,
  87. searches,
  88. resources,
  89. todos,
  90. questions,
  91. model,
  92. runner,
  93. coordinator,
  94. builtInTools,
  95. ).pipe(Layer.fresh)
  96. },
  97. idleTimeToLive: "60 minutes",
  98. dependencies: [
  99. Project.defaultLayer,
  100. EventV2.defaultLayer,
  101. Auth.defaultLayer,
  102. Npm.defaultLayer,
  103. ModelsDev.defaultLayer,
  104. FSUtil.defaultLayer,
  105. AppProcess.defaultLayer,
  106. Global.defaultLayer,
  107. Database.defaultLayer,
  108. SessionStore.layer.pipe(Layer.provide(Database.defaultLayer)),
  109. PermissionSaved.defaultLayer,
  110. RepositoryCache.defaultLayer,
  111. LLMClient.layer.pipe(Layer.provide(RequestExecutor.defaultLayer)),
  112. FetchHttpClient.layer,
  113. ToolOutputStore.defaultCleanupLayer,
  114. ApplicationTools.layer,
  115. ],
  116. }) {}