import type { ProjectSummary, TaskPriority } from "../domain/task"; export interface IntegrationBindingActorMapping { actorId: string; externalAccountId?: string; externalLogin?: string; displayName?: string; trusted?: boolean; } export interface IntegrationBindingOptions { actorMappings?: IntegrationBindingActorMapping[]; [key: string]: unknown; } export interface IntegrationBindingStatus { bindingId: string; state: "running" | "idle" | "blocked" | "error"; authorityId: string | null; lastSuccessfulSyncAt: string | null; lastAttemptedSyncAt: string | null; lastErrorSummary: string | null; updatedAt: string; } import type { ProjectService } from "./project-service"; import type { RepoContextService, ResolvedRepositoryContext } from "./repo-context"; export type IntegrationSyncStrategy = "bidirectional" | "pull" | "push" | "none"; export interface IntegrationBinding { id: string; provider: string; projectId: string; targetKind: string; targetRef: string; strategy: IntegrationSyncStrategy; enabled: boolean; options?: IntegrationBindingOptions; createdAt: string; updatedAt: string; } export interface CreateIntegrationBindingInput { provider: string; projectId: string; targetKind: string; targetRef: string; strategy?: IntegrationSyncStrategy; enabled?: boolean; options?: IntegrationBindingOptions; } export interface UpdateIntegrationBindingInput { bindingId: string; provider?: string; projectId?: string; targetKind?: string; targetRef?: string; strategy?: IntegrationSyncStrategy; enabled?: boolean; options?: IntegrationBindingOptions; } export interface IntegrationBindingFilter { provider?: string; projectId?: string; enabled?: boolean; } export type RepositoryBindingCheckResult = { kind: "registered"; repository: ResolvedRepositoryContext; binding: IntegrationBinding; project: ProjectSummary | null; } | { kind: "not-registered"; repository: ResolvedRepositoryContext; } | { kind: "ambiguous"; reason: "multiple-remotes" | "multiple-matching-bindings"; repositoryPath?: string; repository?: ResolvedRepositoryContext; remotes?: string[]; bindings?: IntegrationBinding[]; } | { kind: "missing-context"; reason: "not-a-git-repository" | "no-remotes"; repositoryPath?: string; } | { kind: "unsupported"; reason: "unsupported-remote-format"; repositoryPath?: string; remoteName: string; remoteUrl: string; }; export type RepositoryProjectRegistrationResult = { kind: "registered"; repository: ResolvedRepositoryContext; project: ProjectSummary; binding: IntegrationBinding; createdProject: boolean; createdBinding: boolean; } | { kind: "already-registered"; repository: ResolvedRepositoryContext; binding: IntegrationBinding; project: ProjectSummary | null; } | RepositoryBindingCheckResult; export interface RegisterRepositoryProjectInput { projectName?: string; repositoryPath?: string; provider?: string; targetRef?: string; description?: string | null; priority?: TaskPriority; strategy?: IntegrationSyncStrategy; enabled?: boolean; } export interface ProjectIntegrationService { listIntegrationBindings(filter?: IntegrationBindingFilter): Promise; getIntegrationBinding(bindingId: string): Promise; updateIntegrationBinding(input: UpdateIntegrationBindingInput): Promise; getIntegrationBindingStatus(bindingId: string): Promise; checkRepositoryBinding(input?: { repositoryPath?: string; provider?: string; targetRef?: string; }): Promise; registerRepositoryProject(input: RegisterRepositoryProjectInput): Promise; } export interface ProjectIntegrationGateway { listIntegrationBindings(filter?: IntegrationBindingFilter): Promise; createIntegrationBinding(input: CreateIntegrationBindingInput): Promise; getIntegrationBinding(bindingId: string): Promise; updateIntegrationBinding(input: UpdateIntegrationBindingInput): Promise; getIntegrationBindingStatus(bindingId: string): Promise; } export interface ProjectIntegrationServiceDependencies { projectService: ProjectService; repoContextService: RepoContextService; gateway: ProjectIntegrationGateway; } declare const createProjectIntegrationService: ({ projectService, repoContextService, gateway, }: ProjectIntegrationServiceDependencies) => ProjectIntegrationService; declare const resolveRepositoryInput: (repoContextService: RepoContextService, input: { repositoryPath?: string; provider?: string; targetRef?: string; }) => Promise; declare const findMatchingBindings: (gateway: ProjectIntegrationGateway, repository: ResolvedRepositoryContext) => Promise; declare const normalizeProjectName: (projectName: string | undefined, targetRef: string) => string; export { createProjectIntegrationService, findMatchingBindings, normalizeProjectName, resolveRepositoryInput, };