kirincode.ts 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. import { KirinCode } from "@kirincode-ai/client/effect"
  2. import { AppNodeBuilder } from "@kirincode-ai/core/effect/app-node-builder"
  3. import { LayerNode } from "@kirincode-ai/core/effect/layer-node"
  4. import { PermissionSaved } from "@kirincode-ai/core/permission/saved"
  5. import { ApplicationTools } from "@kirincode-ai/core/tool/application-tools"
  6. import { createEmbeddedRoutes } from "@kirincode-ai/server/routes"
  7. import { Context, Effect, Layer, Scope } from "effect"
  8. import { FetchHttpClient, HttpRouter, HttpServer } from "effect/unstable/http"
  9. export const create = Effect.fn("KirinCode.create")(function* () {
  10. const scope = yield* Scope.Scope
  11. const memoMap = yield* Layer.makeMemoMap
  12. const context = yield* Layer.buildWithMemoMap(
  13. AppNodeBuilder.build(LayerNode.group([ApplicationTools.node, PermissionSaved.node])),
  14. memoMap,
  15. scope,
  16. )
  17. const tools = Context.get(context, ApplicationTools.Service)
  18. const permissions = Context.get(context, PermissionSaved.Service)
  19. const web = yield* Effect.acquireRelease(
  20. Effect.sync(() =>
  21. HttpRouter.toWebHandler(
  22. createEmbeddedRoutes().pipe(
  23. HttpRouter.provideRequest(Layer.succeed(PermissionSaved.Service, permissions)),
  24. Layer.provide(HttpServer.layerServices),
  25. ),
  26. { disableLogger: true, memoMap },
  27. ),
  28. ),
  29. (web) => Effect.promise(web.dispose),
  30. )
  31. const fetch = Object.assign((input: RequestInfo | URL, init?: RequestInit) => web.handler(new Request(input, init)), {
  32. preconnect: () => undefined,
  33. }) satisfies typeof globalThis.fetch
  34. const client = yield* KirinCode.make({ baseUrl: "http://kirincode.local" }).pipe(
  35. Effect.provide(FetchHttpClient.layer),
  36. Effect.provideService(FetchHttpClient.Fetch, fetch),
  37. )
  38. return {
  39. ...client,
  40. tools: { register: tools.register },
  41. }
  42. })
  43. export type Interface = Effect.Success<ReturnType<typeof create>>
  44. export class Service extends Context.Service<Service, Interface>()("@kirincode-ai/sdk-next/KirinCode") {}
  45. export const layer = Layer.effect(Service, create())