/** * TextGeneration - Effect service contract for AI-generated Git content. * * Generates commit messages and pull request titles/bodies from repository * context prepared by Git services. * * @module TextGeneration */import { Context } from "effect";import type { Effect } from "effect";import type { ChatAttachment, ModelSelection } from "@t3tools/contracts";import type { TextGenerationError } from "@t3tools/contracts";/** Providers that support git text generation (commit messages, PR content, branch names). */export type TextGenerationProvider = "codex" | "claudeAgent" | "cursor" | "opencode";export interface CommitMessageGenerationInput { cwd: string; branch: string | null; stagedSummary: string; stagedPatch: string; /** When true, the model also returns a semantic branch name for the change. */ includeBranch?: boolean; /** What model and provider to use for generation. */ modelSelection: ModelSelection;}export interface CommitMessageGenerationResult { subject: string; body: string; /** Only present when `includeBranch` was set on the input. */ branch?: string | undefined;}export interface PrContentGenerationInput { cwd: string; baseBranch: string; headBranch: string; commitSummary: string; diffSummary: string; diffPatch: string; /** What model and provider to use for generation. */ modelSelection: ModelSelection;}export interface PrContentGenerationResult { title: string; body: string;}export interface BranchNameGenerationInput { cwd: string; message: string; attachments?: ReadonlyArray<ChatAttachment> | undefined; /** What model and provider to use for generation. */ modelSelection: ModelSelection;}export interface BranchNameGenerationResult { branch: string;}export interface ThreadTitleGenerationInput { cwd: string; message: string; attachments?: ReadonlyArray<ChatAttachment> | undefined; /** What model and provider to use for generation. */ modelSelection: ModelSelection;}export interface ThreadTitleGenerationResult { title: string;}export interface TextGenerationService { generateCommitMessage( input: CommitMessageGenerationInput, ): Promise<CommitMessageGenerationResult>; generatePrContent(input: PrContentGenerationInput): Promise<PrContentGenerationResult>; generateBranchName(input: BranchNameGenerationInput): Promise<BranchNameGenerationResult>; generateThreadTitle(input: ThreadTitleGenerationInput): Promise<ThreadTitleGenerationResult>;}/** * TextGenerationShape - Service API for commit/PR text generation. */export interface TextGenerationShape { /** * Generate a commit message from staged change context. */ readonly generateCommitMessage: ( input: CommitMessageGenerationInput, ) => Effect.Effect<CommitMessageGenerationResult, TextGenerationError>; /** * Generate pull request title/body from branch and diff context. */ readonly generatePrContent: ( input: PrContentGenerationInput, ) => Effect.Effect<PrContentGenerationResult, TextGenerationError>; /** * Generate a concise branch name from a user message. */ readonly generateBranchName: ( input: BranchNameGenerationInput, ) => Effect.Effect<BranchNameGenerationResult, TextGenerationError>; /** * Generate a concise thread title from a user's first message. */ readonly generateThreadTitle: ( input: ThreadTitleGenerationInput, ) => Effect.Effect<ThreadTitleGenerationResult, TextGenerationError>;}/** * TextGeneration - Service tag for commit and PR text generation. */export class TextGeneration extends Context.Service<TextGeneration, TextGenerationShape>()( "t3/git/Services/TextGeneration",) {}
/**
* TextGeneration - Effect service contract for AI-generated Git content.
*
* Generates commit messages and pull request titles/bodies from repository
* context prepared by Git services.
*
* @module TextGeneration
*/
import { Context } from "effect";
import type { Effect } from "effect";
import type { ChatAttachment, ModelSelection } from "@t3tools/contracts";
import type { TextGenerationError } from "@t3tools/contracts";
/** Providers that support git text generation (commit messages, PR content, branch names). */
export type TextGenerationProvider = "codex" | "claudeAgent" | "cursor" | "opencode";
export interface CommitMessageGenerationInput {
cwd: string;
branch: string | null;
stagedSummary: string;
stagedPatch: string;
/** When true, the model also returns a semantic branch name for the change. */
includeBranch?: boolean;
/** What model and provider to use for generation. */
modelSelection: ModelSelection;
}
export interface CommitMessageGenerationResult {
subject: string;
body: string;
/** Only present when `includeBranch` was set on the input. */
branch?: string | undefined;
}
export interface PrContentGenerationInput {
cwd: string;
baseBranch: string;
headBranch: string;
commitSummary: string;
diffSummary: string;
diffPatch: string;
/** What model and provider to use for generation. */
modelSelection: ModelSelection;
}
export interface PrContentGenerationResult {
title: string;
body: string;
}
export interface BranchNameGenerationInput {
cwd: string;
message: string;
attachments?: ReadonlyArray<ChatAttachment> | undefined;
/** What model and provider to use for generation. */
modelSelection: ModelSelection;
}
export interface BranchNameGenerationResult {
branch: string;
}
export interface ThreadTitleGenerationInput {
cwd: string;
message: string;
attachments?: ReadonlyArray<ChatAttachment> | undefined;
/** What model and provider to use for generation. */
modelSelection: ModelSelection;
}
export interface ThreadTitleGenerationResult {
title: string;
}
export interface TextGenerationService {
generateCommitMessage(
input: CommitMessageGenerationInput,
): Promise<CommitMessageGenerationResult>;
generatePrContent(input: PrContentGenerationInput): Promise<PrContentGenerationResult>;
generateBranchName(input: BranchNameGenerationInput): Promise<BranchNameGenerationResult>;
generateThreadTitle(input: ThreadTitleGenerationInput): Promise<ThreadTitleGenerationResult>;
}
/**
* TextGenerationShape - Service API for commit/PR text generation.
*/
export interface TextGenerationShape {
/**
* Generate a commit message from staged change context.
*/
readonly generateCommitMessage: (
input: CommitMessageGenerationInput,
) => Effect.Effect<CommitMessageGenerationResult, TextGenerationError>;
/**
* Generate pull request title/body from branch and diff context.
*/
readonly generatePrContent: (
input: PrContentGenerationInput,
) => Effect.Effect<PrContentGenerationResult, TextGenerationError>;
/**
* Generate a concise branch name from a user message.
*/
readonly generateBranchName: (
input: BranchNameGenerationInput,
) => Effect.Effect<BranchNameGenerationResult, TextGenerationError>;
/**
* Generate a concise thread title from a user's first message.
*/
readonly generateThreadTitle: (
input: ThreadTitleGenerationInput,
) => Effect.Effect<ThreadTitleGenerationResult, TextGenerationError>;
}
/**
* TextGeneration - Service tag for commit and PR text generation.
*/
export class TextGeneration extends Context.Service<TextGeneration, TextGenerationShape>()(
"t3/git/Services/TextGeneration",
) {}