integration.ts 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. import { Integration } from "@opencode-ai/schema/integration"
  2. import { Location } from "@opencode-ai/schema/location"
  3. import { Schema } from "effect"
  4. import { HttpApiEndpoint, HttpApiGroup, HttpApiSchema, OpenApi } from "effect/unstable/httpapi"
  5. import { InvalidRequestError } from "../errors"
  6. import { LocationQuery, locationQueryOpenApi } from "./location"
  7. const Inputs = Schema.Record(Schema.String, Schema.String)
  8. export const IntegrationGroup = HttpApiGroup.make("server.integration")
  9. .add(
  10. HttpApiEndpoint.get("integration.list", "/api/integration", {
  11. query: LocationQuery,
  12. success: Location.response(Schema.Array(Integration.Info)),
  13. })
  14. .annotateMerge(locationQueryOpenApi)
  15. .annotateMerge(
  16. OpenApi.annotations({
  17. identifier: "v2.integration.list",
  18. summary: "List integrations",
  19. description: "Retrieve available integrations and their authentication methods.",
  20. }),
  21. ),
  22. )
  23. .add(
  24. HttpApiEndpoint.get("integration.get", "/api/integration/:integrationID", {
  25. params: { integrationID: Integration.ID },
  26. query: LocationQuery,
  27. success: Location.response(Schema.UndefinedOr(Integration.Info)),
  28. })
  29. .annotateMerge(locationQueryOpenApi)
  30. .annotateMerge(
  31. OpenApi.annotations({
  32. identifier: "v2.integration.get",
  33. summary: "Get integration",
  34. description: "Retrieve one integration and its authentication methods.",
  35. }),
  36. ),
  37. )
  38. .add(
  39. HttpApiEndpoint.post("integration.connect.key", "/api/integration/:integrationID/connect/key", {
  40. params: { integrationID: Integration.ID },
  41. query: LocationQuery,
  42. payload: Schema.Struct({
  43. key: Schema.String,
  44. label: Schema.optional(Schema.String),
  45. }),
  46. success: HttpApiSchema.NoContent,
  47. error: InvalidRequestError,
  48. })
  49. .annotateMerge(locationQueryOpenApi)
  50. .annotateMerge(
  51. OpenApi.annotations({
  52. identifier: "v2.integration.connect.key",
  53. summary: "Connect with key",
  54. description: "Run a key authentication method and store the resulting credential.",
  55. }),
  56. ),
  57. )
  58. .add(
  59. HttpApiEndpoint.post("integration.connect.oauth", "/api/integration/:integrationID/connect/oauth", {
  60. params: { integrationID: Integration.ID },
  61. query: LocationQuery,
  62. payload: Schema.Struct({
  63. methodID: Integration.MethodID,
  64. inputs: Inputs,
  65. label: Schema.optional(Schema.String),
  66. }),
  67. success: Location.response(Integration.Attempt),
  68. error: InvalidRequestError,
  69. })
  70. .annotateMerge(locationQueryOpenApi)
  71. .annotateMerge(
  72. OpenApi.annotations({
  73. identifier: "v2.integration.connect.oauth",
  74. summary: "Begin OAuth connection",
  75. description: "Start an OAuth attempt and return the authorization details.",
  76. }),
  77. ),
  78. )
  79. .add(
  80. HttpApiEndpoint.get("integration.attempt.status", "/api/integration/attempt/:attemptID", {
  81. params: { attemptID: Integration.AttemptID },
  82. query: LocationQuery,
  83. success: Location.response(Integration.AttemptStatus),
  84. })
  85. .annotateMerge(locationQueryOpenApi)
  86. .annotateMerge(
  87. OpenApi.annotations({
  88. identifier: "v2.integration.attempt.status",
  89. summary: "Get OAuth attempt status",
  90. description: "Poll the current status of an OAuth attempt.",
  91. }),
  92. ),
  93. )
  94. .add(
  95. HttpApiEndpoint.post("integration.attempt.complete", "/api/integration/attempt/:attemptID/complete", {
  96. params: { attemptID: Integration.AttemptID },
  97. query: LocationQuery,
  98. payload: Schema.Struct({ code: Schema.optional(Schema.String) }),
  99. success: HttpApiSchema.NoContent,
  100. error: InvalidRequestError,
  101. })
  102. .annotateMerge(locationQueryOpenApi)
  103. .annotateMerge(
  104. OpenApi.annotations({
  105. identifier: "v2.integration.attempt.complete",
  106. summary: "Complete OAuth connection",
  107. description: "Complete a code-based OAuth attempt and store the resulting credential.",
  108. }),
  109. ),
  110. )
  111. .add(
  112. HttpApiEndpoint.delete("integration.attempt.cancel", "/api/integration/attempt/:attemptID", {
  113. params: { attemptID: Integration.AttemptID },
  114. query: LocationQuery,
  115. success: HttpApiSchema.NoContent,
  116. })
  117. .annotateMerge(locationQueryOpenApi)
  118. .annotateMerge(
  119. OpenApi.annotations({
  120. identifier: "v2.integration.attempt.cancel",
  121. summary: "Cancel OAuth connection",
  122. description: "Cancel an OAuth attempt and release its resources.",
  123. }),
  124. ),
  125. )
  126. .annotateMerge(
  127. OpenApi.annotations({ title: "integrations", description: "Integration discovery and authentication routes." }),
  128. )