location-services.ts 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import { Effect, Layer, LayerMap } from "effect"
  2. import { AgentV2 } from "./agent"
  3. import { AISDK } from "./aisdk"
  4. import { Catalog } from "./catalog"
  5. import { CommandV2 } from "./command"
  6. import { Config } from "./config"
  7. import { LayerNode } from "./effect/layer-node"
  8. import { Node } from "./effect/app-node"
  9. import { FileMutation } from "./file-mutation"
  10. import { FileSystem } from "./filesystem"
  11. import { FileSystemSearch } from "./filesystem/search"
  12. import { Watcher } from "./filesystem/watcher"
  13. import { Image } from "./image"
  14. import { Integration } from "./integration"
  15. import { Location } from "./location"
  16. import { LocationMutation } from "./location-mutation"
  17. import { LocationServiceMap } from "./location-service-map"
  18. import { PermissionV2 } from "./permission"
  19. import { PluginV2 } from "./plugin"
  20. import { PluginInternal } from "./plugin/internal"
  21. import { Policy } from "./policy"
  22. import { ProjectCopy } from "./project/copy"
  23. import { Pty } from "./pty"
  24. import { QuestionV2 } from "./question"
  25. import { Reference } from "./reference"
  26. import { ReferenceGuidance } from "./reference/guidance"
  27. import * as SessionRunnerLLM from "./session/runner/llm"
  28. import { SessionRunnerModel } from "./session/runner/model"
  29. import { SessionTodo } from "./session/todo"
  30. import { SkillV2 } from "./skill"
  31. import { SkillGuidance } from "./skill/guidance"
  32. import { Snapshot } from "./snapshot"
  33. import { SystemContextBuiltIns } from "./system-context/builtins"
  34. import { SystemContextRegistry } from "./system-context/registry"
  35. import { BuiltInTools } from "./tool/builtins"
  36. import { ReadToolFileSystem } from "./tool/read-filesystem"
  37. import { ToolRegistry } from "./tool/registry"
  38. import { ToolOutputStore } from "./tool-output-store"
  39. export { LocationServiceMap } from "./location-service-map"
  40. export const locationServices = LayerNode.group([
  41. Location.node,
  42. Policy.node,
  43. Config.node,
  44. AgentV2.node,
  45. CommandV2.node,
  46. Reference.node,
  47. Integration.node,
  48. Catalog.node,
  49. AISDK.node,
  50. PluginV2.node,
  51. PluginInternal.node,
  52. ProjectCopy.node,
  53. ProjectCopy.refreshNode,
  54. FileSystemSearch.node,
  55. FileSystem.node,
  56. Watcher.node,
  57. Pty.node,
  58. SkillV2.node,
  59. SystemContextRegistry.node,
  60. SystemContextBuiltIns.node,
  61. LocationMutation.node,
  62. FileMutation.node,
  63. PermissionV2.node,
  64. ToolOutputStore.node,
  65. ToolRegistry.node,
  66. ToolRegistry.toolsNode,
  67. Image.node,
  68. SkillGuidance.node,
  69. ReferenceGuidance.node,
  70. SessionTodo.node,
  71. QuestionV2.node,
  72. ReadToolFileSystem.node,
  73. BuiltInTools.node,
  74. SessionRunnerModel.node,
  75. Snapshot.node,
  76. SessionRunnerLLM.node,
  77. ])
  78. export type LocationServices = LayerNode.Output<typeof locationServices>
  79. export type LocationError = LayerNode.Error<typeof locationServices>
  80. export function buildLocationServiceMap(
  81. replacements: LayerNode.Replacements = [],
  82. ): Layer.Layer<LocationServiceMap.Service> {
  83. return Layer.effect(
  84. LocationServiceMap.Service,
  85. LayerMap.make(
  86. (ref: Location.Ref) => {
  87. const allReplacements = replacements.concat([[Location.node, Location.boundNode(ref)]])
  88. // Apply replacements during hoist, not afterward: replacements can
  89. // introduce new tagged dependencies (Location.boundNode depends on
  90. // Project), and the hoist walk is the only pass that can still slice
  91. // those back out.
  92. const location = LayerNode.hoist(locationServices, Node.tags.values.global, allReplacements)
  93. return LayerNode.compile(location.node).pipe(
  94. Layer.fresh,
  95. Layer.tap(() =>
  96. Effect.logInfo("booting location services", {
  97. directory: ref.directory,
  98. workspaceID: ref.workspaceID,
  99. }),
  100. ),
  101. Layer.provide(LayerNode.compile(location.hoisted)),
  102. )
  103. },
  104. { idleTimeToLive: "60 minutes" },
  105. ),
  106. )
  107. }
  108. // This is temporary for backwards compatibility
  109. export const locationServiceMapLayer = buildLocationServiceMap()