api.ts 3.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import { Context } from "effect"
  2. import { HttpApi, HttpApiGroup, HttpApiMiddleware, OpenApi } from "effect/unstable/httpapi"
  3. import { SchemaErrorMiddleware } from "./middleware/schema-error"
  4. import { MessageGroup } from "./groups/message"
  5. import { ModelGroup } from "./groups/model"
  6. import { ProviderGroup } from "./groups/provider"
  7. import { makeSessionGroup } from "./groups/session"
  8. import { makePermissionGroup } from "./groups/permission"
  9. import { FileSystemGroup } from "./groups/fs"
  10. import { CommandGroup } from "./groups/command"
  11. import { SkillGroup } from "./groups/skill"
  12. import { EventGroup, makeEventGroup } from "./groups/event"
  13. import type { Definition } from "@opencode-ai/schema/event"
  14. import { AgentGroup } from "./groups/agent"
  15. import { HealthGroup } from "./groups/health"
  16. import { PtyGroup } from "./groups/pty"
  17. import { makeQuestionGroup } from "./groups/question"
  18. import { ReferenceGroup } from "./groups/reference"
  19. import { Authorization } from "./middleware/authorization"
  20. import { LocationGroup } from "./groups/location"
  21. import { IntegrationGroup } from "./groups/integration"
  22. import { CredentialGroup } from "./groups/credential"
  23. import { ProjectCopyGroup } from "./groups/project-copy"
  24. // Protocol owns middleware placement, while Server injects concrete keys so Core service identities stay downstream.
  25. const makeApiFromGroup = <
  26. const Group extends HttpApiGroup.Any,
  27. LocationId extends HttpApiMiddleware.AnyId,
  28. LocationService,
  29. SessionLocationId extends HttpApiMiddleware.AnyId,
  30. SessionLocationService,
  31. >(
  32. eventGroup: Group,
  33. locationMiddleware: Context.Key<LocationId, LocationService>,
  34. sessionLocationMiddleware: Context.Key<SessionLocationId, SessionLocationService>,
  35. ) =>
  36. HttpApi.make("server")
  37. .add(HealthGroup)
  38. .add(LocationGroup.middleware(locationMiddleware))
  39. .add(AgentGroup.middleware(locationMiddleware))
  40. .add(makeSessionGroup(sessionLocationMiddleware))
  41. .add(MessageGroup.middleware(sessionLocationMiddleware))
  42. .add(ModelGroup.middleware(locationMiddleware))
  43. .add(ProviderGroup.middleware(locationMiddleware))
  44. .add(IntegrationGroup.middleware(locationMiddleware))
  45. .add(CredentialGroup.middleware(locationMiddleware))
  46. .add(makePermissionGroup(locationMiddleware, sessionLocationMiddleware))
  47. .add(FileSystemGroup.middleware(locationMiddleware))
  48. .add(CommandGroup.middleware(locationMiddleware))
  49. .add(SkillGroup.middleware(locationMiddleware))
  50. .add(eventGroup)
  51. .add(PtyGroup.middleware(locationMiddleware))
  52. .add(makeQuestionGroup(locationMiddleware, sessionLocationMiddleware))
  53. .add(ReferenceGroup.middleware(locationMiddleware))
  54. .add(ProjectCopyGroup.middleware(locationMiddleware))
  55. .annotateMerge(
  56. OpenApi.annotations({
  57. title: "opencode HttpApi",
  58. version: "0.0.1",
  59. description: "Experimental HttpApi surface for selected instance routes.",
  60. }),
  61. )
  62. .middleware(Authorization)
  63. .middleware(SchemaErrorMiddleware)
  64. export const makeApi = <
  65. LocationId extends HttpApiMiddleware.AnyId,
  66. LocationService,
  67. SessionLocationId extends HttpApiMiddleware.AnyId,
  68. SessionLocationService,
  69. >(options: {
  70. readonly definitions: ReadonlyArray<Definition>
  71. readonly locationMiddleware: Context.Key<LocationId, LocationService>
  72. readonly sessionLocationMiddleware: Context.Key<SessionLocationId, SessionLocationService>
  73. }) =>
  74. makeApiFromGroup(makeEventGroup(options.definitions), options.locationMiddleware, options.sessionLocationMiddleware)
  75. export const makeDefaultApi = <
  76. LocationId extends HttpApiMiddleware.AnyId,
  77. LocationService,
  78. SessionLocationId extends HttpApiMiddleware.AnyId,
  79. SessionLocationService,
  80. >(options: {
  81. readonly locationMiddleware: Context.Key<LocationId, LocationService>
  82. readonly sessionLocationMiddleware: Context.Key<SessionLocationId, SessionLocationService>
  83. }) => makeApiFromGroup(EventGroup, options.locationMiddleware, options.sessionLocationMiddleware)