feat(plugin): add integration registration
This commit is contained in:
parent
1f842fa654
commit
48f8b5de98
12 changed files with 342 additions and 263 deletions
|
|
@ -8,9 +8,12 @@ export type { CommandDraft, CommandHooks } from "./command.js"
|
|||
export type { EventHooks } from "./event.js"
|
||||
export type {
|
||||
IntegrationDraft,
|
||||
IntegrationDefinition,
|
||||
IntegrationHooks,
|
||||
IntegrationMethodDefinition,
|
||||
IntegrationMethodRegistration,
|
||||
IntegrationSearchCapabilityRegistration,
|
||||
IntegrationOAuthMethodDefinition,
|
||||
IntegrationSearchDefinition,
|
||||
} from "./integration.js"
|
||||
export type { ReferenceDraft, ReferenceHooks } from "./reference.js"
|
||||
export type { SkillDraft, SkillHooks } from "./skill.js"
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ import type {
|
|||
import type { IntegrationApi } from "@opencode-ai/client/effect/api"
|
||||
import type { Search } from "@opencode-ai/schema/search"
|
||||
import type { Effect, Scope } from "effect"
|
||||
import type { TransformHook } from "./registration.js"
|
||||
import type { Registration, TransformHook } from "./registration.js"
|
||||
|
||||
export type IntegrationOAuthAuthorization = {
|
||||
readonly url: string
|
||||
|
|
@ -45,18 +45,29 @@ export type IntegrationMethodRegistration =
|
|||
readonly method: IntegrationEnvMethod
|
||||
}
|
||||
|
||||
export interface IntegrationSearchCapabilityRegistration {
|
||||
readonly integrationID: string
|
||||
readonly capability: {
|
||||
readonly type: "search"
|
||||
readonly connection: "optional" | "required"
|
||||
}
|
||||
export type IntegrationOAuthMethodDefinition = IntegrationOAuthMethod & {
|
||||
readonly authorize: (inputs: IntegrationInputs) => Effect.Effect<IntegrationOAuthAuthorization, unknown, Scope.Scope>
|
||||
readonly refresh?: (credential: CredentialOAuth) => Effect.Effect<CredentialOAuth, unknown>
|
||||
readonly credentialLabel?: (credential: CredentialOAuth) => string | undefined
|
||||
}
|
||||
|
||||
export type IntegrationMethodDefinition = IntegrationOAuthMethodDefinition | IntegrationKeyMethod | IntegrationEnvMethod
|
||||
|
||||
export interface IntegrationSearchDefinition {
|
||||
readonly connection: "optional" | "required"
|
||||
readonly execute: (
|
||||
input: Search.Input,
|
||||
context: { readonly credential?: CredentialValue; readonly sessionID?: string },
|
||||
) => Effect.Effect<Search.ProviderOutput, unknown>
|
||||
}
|
||||
|
||||
export interface IntegrationDefinition {
|
||||
readonly id: string
|
||||
readonly name: string
|
||||
readonly methods?: readonly IntegrationMethodDefinition[]
|
||||
readonly search?: IntegrationSearchDefinition
|
||||
}
|
||||
|
||||
export interface IntegrationDraft {
|
||||
list(): readonly IntegrationRef[]
|
||||
get(id: string): IntegrationRef | undefined
|
||||
|
|
@ -67,16 +78,10 @@ export interface IntegrationDraft {
|
|||
update(input: IntegrationMethodRegistration): void
|
||||
remove(integrationID: string, method: IntegrationMethod): void
|
||||
}
|
||||
readonly capability: {
|
||||
readonly search: {
|
||||
list(): readonly IntegrationSearchCapabilityRegistration[]
|
||||
update(input: IntegrationSearchCapabilityRegistration): void
|
||||
remove(integrationID: string): void
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export interface IntegrationHooks extends IntegrationApi<unknown> {
|
||||
readonly register: (definition: IntegrationDefinition) => Effect.Effect<Registration, never, Scope.Scope>
|
||||
readonly transform: TransformHook<IntegrationDraft>
|
||||
readonly reload: () => Effect.Effect<void>
|
||||
readonly connection: {
|
||||
|
|
|
|||
|
|
@ -9,9 +9,13 @@ export type { CommandDraft, CommandHooks } from "./command.js"
|
|||
export type { EventHooks } from "./event.js"
|
||||
export type {
|
||||
IntegrationDraft,
|
||||
IntegrationDefinition,
|
||||
IntegrationHooks,
|
||||
IntegrationMethodDefinition,
|
||||
IntegrationMethodRegistration,
|
||||
IntegrationSearchCapabilityRegistration,
|
||||
IntegrationOAuthAuthorization,
|
||||
IntegrationOAuthMethodDefinition,
|
||||
IntegrationSearchDefinition,
|
||||
} from "./integration.js"
|
||||
export type { ReferenceDraft, ReferenceHooks } from "./reference.js"
|
||||
export type { SessionHooks } from "./runtime.js"
|
||||
|
|
|
|||
|
|
@ -1,34 +1,59 @@
|
|||
import type { IntegrationApi } from "@opencode-ai/client/promise/api"
|
||||
import type { IntegrationMethodRegistration } from "../effect/integration.js"
|
||||
import type { CredentialValue } from "@opencode-ai/sdk/v2/types"
|
||||
import type {
|
||||
CredentialOAuth,
|
||||
CredentialValue,
|
||||
IntegrationEnvMethod,
|
||||
IntegrationInputs,
|
||||
IntegrationKeyMethod,
|
||||
IntegrationOAuthMethod,
|
||||
} from "@opencode-ai/sdk/v2/types"
|
||||
import type { Search } from "@opencode-ai/schema/search"
|
||||
import type { TransformHook } from "./registration.js"
|
||||
import type { Registration, TransformHook } from "./registration.js"
|
||||
|
||||
export type { IntegrationMethodRegistration }
|
||||
|
||||
export interface IntegrationSearchCapabilityRegistration {
|
||||
readonly integrationID: string
|
||||
readonly capability: {
|
||||
readonly type: "search"
|
||||
readonly connection: "optional" | "required"
|
||||
}
|
||||
export type IntegrationOAuthAuthorization = {
|
||||
readonly url: string
|
||||
readonly instructions: string
|
||||
} & (
|
||||
| {
|
||||
readonly mode: "auto"
|
||||
readonly callback: Promise<CredentialOAuth>
|
||||
}
|
||||
| {
|
||||
readonly mode: "code"
|
||||
readonly callback: (code: string) => Promise<CredentialOAuth>
|
||||
}
|
||||
)
|
||||
|
||||
export type IntegrationOAuthMethodDefinition = IntegrationOAuthMethod & {
|
||||
readonly authorize: (inputs: IntegrationInputs) => Promise<IntegrationOAuthAuthorization>
|
||||
readonly refresh?: (credential: CredentialOAuth) => Promise<CredentialOAuth>
|
||||
readonly credentialLabel?: (credential: CredentialOAuth) => string | undefined
|
||||
}
|
||||
|
||||
export type IntegrationMethodDefinition = IntegrationOAuthMethodDefinition | IntegrationKeyMethod | IntegrationEnvMethod
|
||||
|
||||
export interface IntegrationSearchDefinition {
|
||||
readonly connection: "optional" | "required"
|
||||
readonly execute: (
|
||||
input: Search.Input,
|
||||
context: { readonly credential?: CredentialValue; readonly sessionID?: string; readonly signal: AbortSignal },
|
||||
) => Promise<Search.ProviderOutput>
|
||||
}
|
||||
|
||||
export interface IntegrationDraft extends Omit<import("../effect/integration.js").IntegrationDraft, "capability"> {
|
||||
readonly capability: {
|
||||
readonly search: {
|
||||
list(): readonly IntegrationSearchCapabilityRegistration[]
|
||||
update(input: IntegrationSearchCapabilityRegistration): void
|
||||
remove(integrationID: string): void
|
||||
}
|
||||
}
|
||||
export interface IntegrationDefinition {
|
||||
readonly id: string
|
||||
readonly name: string
|
||||
readonly methods?: readonly IntegrationMethodDefinition[]
|
||||
readonly search?: IntegrationSearchDefinition
|
||||
}
|
||||
|
||||
export type IntegrationDraft = import("../effect/integration.js").IntegrationDraft
|
||||
|
||||
export interface IntegrationHooks extends IntegrationApi {
|
||||
readonly register: (definition: IntegrationDefinition) => Promise<Registration>
|
||||
readonly transform: TransformHook<IntegrationDraft>
|
||||
readonly reload: () => Promise<void>
|
||||
readonly connection: {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue