routes.ts 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import { Database } from "@kirincode-ai/core/database/database"
  2. import { LayerNode } from "@kirincode-ai/core/effect/layer-node"
  3. import { httpClient } from "@kirincode-ai/core/effect/app-node-platform"
  4. import { AppNodeBuilder } from "@kirincode-ai/core/effect/app-node-builder"
  5. import { EventV2 } from "@kirincode-ai/core/event"
  6. import { Credential } from "@kirincode-ai/core/credential"
  7. import { PermissionSaved } from "@kirincode-ai/core/permission/saved"
  8. import { PtyTicket } from "@kirincode-ai/core/pty/ticket"
  9. import { SessionV2 } from "@kirincode-ai/core/session"
  10. import { SessionExecution } from "@kirincode-ai/core/session/execution"
  11. import { LocationServiceMap } from "@kirincode-ai/core/location-service-map"
  12. import { SessionExecutionLocal } from "@kirincode-ai/core/session/execution/local"
  13. import { ToolOutputStore } from "@kirincode-ai/core/tool-output-store"
  14. import { HttpRouter, HttpServer } from "effect/unstable/http"
  15. import { HttpApiBuilder } from "effect/unstable/httpapi"
  16. import { Layer, Option } from "effect"
  17. import { Api } from "./api"
  18. import { ServerAuth } from "./auth"
  19. import { handlers } from "./handlers"
  20. import { authorizationLayer } from "./middleware/authorization"
  21. import { schemaErrorLayer } from "./middleware/schema-error"
  22. import { PtyEnvironment } from "./pty-environment"
  23. import { layer as locationLayer } from "./location"
  24. import { sessionLocationLayer } from "./middleware/session-location"
  25. const applicationServices = LayerNode.group([
  26. Database.node,
  27. EventV2.node,
  28. httpClient,
  29. ToolOutputStore.cleanupNode,
  30. SessionV2.node,
  31. PermissionSaved.node,
  32. PtyTicket.node,
  33. Credential.node,
  34. PtyEnvironment.node,
  35. LocationServiceMap.node,
  36. ])
  37. export function createRoutes(password?: string) {
  38. return makeRoutes(
  39. password
  40. ? ServerAuth.Config.configLayer({ username: "kirincode", password: Option.some(password) })
  41. : ServerAuth.Config.layer,
  42. )
  43. }
  44. export function createEmbeddedRoutes() {
  45. return makeRoutes(ServerAuth.Config.configLayer({ username: "kirincode", password: Option.none() }))
  46. }
  47. function makeRoutes<AuthError, AuthServices>(auth: Layer.Layer<ServerAuth.Config, AuthError, AuthServices>) {
  48. const serviceLayer = AppNodeBuilder.build(applicationServices, [[SessionExecution.node, SessionExecutionLocal.node]])
  49. return HttpApiBuilder.layer(Api, { openapiPath: "/openapi.json" }).pipe(
  50. Layer.provide(handlers),
  51. Layer.provide(sessionLocationLayer),
  52. Layer.provide(locationLayer),
  53. Layer.provide(authorizationLayer),
  54. Layer.provide(schemaErrorLayer),
  55. Layer.provide(auth),
  56. Layer.provide(serviceLayer),
  57. )
  58. }
  59. export const routes = createRoutes()
  60. export const webHandler = () =>
  61. HttpRouter.toWebHandler(routes.pipe(Layer.provide(HttpServer.layerServices)), { disableLogger: true })