Files
orca/src/main/text-generation/commit-message-text-generation.ts
T

154 lines
5.5 KiB
TypeScript

import type { BranchNameWorkContext } from '../../shared/branch-name-from-work'
import type { ConversationNameContext } from '../../shared/conversation-name-generation'
import type { CommitMessageDraftContext } from '../../shared/commit-message-generation'
import { LOCAL_COMMIT_MESSAGE_HOST_KEY } from '../../shared/commit-message-host-key'
import type { CommandTemplateBackslash } from '../../shared/commit-message-prompt'
import type {
GeneratedPullRequestFields,
PullRequestDraftContext
} from '../../shared/pull-request-generation'
import type { Repo } from '../../shared/repo-types'
import {
resolveSourceControlAiForOperation,
type ResolvedSourceControlAiGenerationParams
} from '../../shared/source-control-ai'
import type { AiTextOperation } from '../../shared/source-control-ai-types'
import type { TuiAgent } from '../../shared/tui-agent'
import {
discoverModelsLocal,
type CommitMessageModelDiscoveryLocalOptions
} from './commit-message-model-discovery'
import { spawnSourceControlAgent } from './source-control-agent-launch'
import { generateConversationName } from './conversation-name-generation-request'
import { cancelLocalGeneration } from './source-control-generation-lanes'
import {
commandBackslashMode as resolveCommandBackslashMode,
generateBranchName,
generateCommitMessage,
generatePullRequestFields,
trimGeneratedCommitMessage as trimCommitMessage
} from './source-control-text-generation-requests'
import type {
CommitMessageGenerationTarget,
DiscoverCommitMessageModelsResult,
GenerateBranchNameResult,
GenerateConversationNameResult,
GenerateCommitMessageResult,
GeneratePullRequestFieldsResult as GenericGeneratePullRequestFieldsResult,
RemoteCommitMessageExecResult,
TextGenerationOperation
} from './source-control-text-generation-types'
export type GenerateCommitMessageParams = ResolvedSourceControlAiGenerationParams
export type {
CommitMessageGenerationTarget,
CommitMessageModelDiscoveryLocalOptions,
DiscoverCommitMessageModelsResult,
GenerateBranchNameResult,
GenerateConversationNameResult,
GenerateCommitMessageResult,
RemoteCommitMessageExecResult,
TextGenerationOperation
}
export type GeneratePullRequestFieldsResult =
GenericGeneratePullRequestFieldsResult<GeneratedPullRequestFields>
type ResolveCommitMessageSettingsResult =
| { ok: true; params: GenerateCommitMessageParams }
| { ok: false; error: string }
export function trimGeneratedCommitMessage(message: string): string {
return trimCommitMessage(message)
}
export function resolveCommitMessageSettings(
settings: Parameters<typeof resolveSourceControlAiForOperation>[0]['settings'],
discoveryHostKey = LOCAL_COMMIT_MESSAGE_HOST_KEY,
operation: AiTextOperation = 'commitMessage',
repo?: Pick<Repo, 'sourceControlAi'> | null
): ResolveCommitMessageSettingsResult {
const resolved = resolveSourceControlAiForOperation({
settings,
repo,
operation,
discoveryHostKey
})
return resolved.ok ? { ok: true, params: resolved.value.params } : resolved
}
export function resolveTextGenerationParams(
settings: Parameters<typeof resolveSourceControlAiForOperation>[0]['settings'],
discoveryHostKey = LOCAL_COMMIT_MESSAGE_HOST_KEY,
operation: AiTextOperation = 'commitMessage',
repo?: Pick<Repo, 'sourceControlAi'> | null
): ResolveCommitMessageSettingsResult {
return resolveCommitMessageSettings(settings, discoveryHostKey, operation, repo)
}
export function commandBackslashMode(
target: CommitMessageGenerationTarget,
platform: NodeJS.Platform = process.platform
): CommandTemplateBackslash {
return resolveCommandBackslashMode(target, platform)
}
export async function discoverCommitMessageModelsLocal(
agentId: TuiAgent,
env: NodeJS.ProcessEnv | undefined,
agentCommandOverride?: string,
options: CommitMessageModelDiscoveryLocalOptions = {}
): Promise<DiscoverCommitMessageModelsResult> {
return discoverModelsLocal({
agentId,
env,
agentCommandOverride,
options,
backslash: commandBackslashMode({
kind: 'local',
cwd: options.cwd ?? '',
wslDistro: options.wslDistro
}),
spawnAgent: spawnSourceControlAgent
})
}
export function cancelGenerateCommitMessageLocal(cwd: string): void {
cancelLocalGeneration('commit-message', cwd)
}
export function cancelGeneratePullRequestFieldsLocal(cwd: string): void {
cancelLocalGeneration('pull-request-fields', cwd)
}
export function generateCommitMessageFromContext(
context: CommitMessageDraftContext,
params: GenerateCommitMessageParams,
target: CommitMessageGenerationTarget
): Promise<GenerateCommitMessageResult> {
return generateCommitMessage({ context, params, target, spawnAgent: spawnSourceControlAgent })
}
export function generatePullRequestFieldsFromContext(
context: PullRequestDraftContext,
params: GenerateCommitMessageParams,
target: CommitMessageGenerationTarget
): Promise<GeneratePullRequestFieldsResult> {
return generatePullRequestFields({ context, params, target, spawnAgent: spawnSourceControlAgent })
}
export function generateBranchNameFromContext(
context: BranchNameWorkContext,
params: GenerateCommitMessageParams,
target: CommitMessageGenerationTarget
): Promise<GenerateBranchNameResult> {
return generateBranchName({ context, params, target, spawnAgent: spawnSourceControlAgent })
}
export function generateConversationNameFromContext(
context: ConversationNameContext,
params: GenerateCommitMessageParams,
target: CommitMessageGenerationTarget
): Promise<GenerateConversationNameResult> {
return generateConversationName({ context, params, target, spawnAgent: spawnSourceControlAgent })
}