mirror of
https://gitea.toothfairyai.com/ToothFairyAI/tf_code.git
synced 2026-04-03 23:53:46 +00:00
Co-authored-by: adamelmore <2363879+adamdottv@users.noreply.github.com> Co-authored-by: David Hill <iamdavidhill@gmail.com>
89 lines
3.0 KiB
TypeScript
89 lines
3.0 KiB
TypeScript
import type { FileSelection } from "@/context/file"
|
|
|
|
export type PromptComment = {
|
|
path: string
|
|
selection?: FileSelection
|
|
comment: string
|
|
preview?: string
|
|
origin?: "review" | "file"
|
|
}
|
|
|
|
function selection(selection: unknown) {
|
|
if (!selection || typeof selection !== "object") return undefined
|
|
const startLine = Number((selection as FileSelection).startLine)
|
|
const startChar = Number((selection as FileSelection).startChar)
|
|
const endLine = Number((selection as FileSelection).endLine)
|
|
const endChar = Number((selection as FileSelection).endChar)
|
|
if (![startLine, startChar, endLine, endChar].every(Number.isFinite)) return undefined
|
|
return {
|
|
startLine,
|
|
startChar,
|
|
endLine,
|
|
endChar,
|
|
} satisfies FileSelection
|
|
}
|
|
|
|
export function createCommentMetadata(input: PromptComment) {
|
|
return {
|
|
opencodeComment: {
|
|
path: input.path,
|
|
selection: input.selection,
|
|
comment: input.comment,
|
|
preview: input.preview,
|
|
origin: input.origin,
|
|
},
|
|
}
|
|
}
|
|
|
|
export function readCommentMetadata(value: unknown) {
|
|
if (!value || typeof value !== "object") return
|
|
const meta = (value as { opencodeComment?: unknown }).opencodeComment
|
|
if (!meta || typeof meta !== "object") return
|
|
const path = (meta as { path?: unknown }).path
|
|
const comment = (meta as { comment?: unknown }).comment
|
|
if (typeof path !== "string" || typeof comment !== "string") return
|
|
const preview = (meta as { preview?: unknown }).preview
|
|
const origin = (meta as { origin?: unknown }).origin
|
|
return {
|
|
path,
|
|
selection: selection((meta as { selection?: unknown }).selection),
|
|
comment,
|
|
preview: typeof preview === "string" ? preview : undefined,
|
|
origin: origin === "review" || origin === "file" ? origin : undefined,
|
|
} satisfies PromptComment
|
|
}
|
|
|
|
export function formatCommentNote(input: { path: string; selection?: FileSelection; comment: string }) {
|
|
const start = input.selection ? Math.min(input.selection.startLine, input.selection.endLine) : undefined
|
|
const end = input.selection ? Math.max(input.selection.startLine, input.selection.endLine) : undefined
|
|
const range =
|
|
start === undefined || end === undefined
|
|
? "this file"
|
|
: start === end
|
|
? `line ${start}`
|
|
: `lines ${start} through ${end}`
|
|
return `The user made the following comment regarding ${range} of ${input.path}: ${input.comment}`
|
|
}
|
|
|
|
export function parseCommentNote(text: string) {
|
|
const match = text.match(
|
|
/^The user made the following comment regarding (this file|line (\d+)|lines (\d+) through (\d+)) of (.+?): ([\s\S]+)$/,
|
|
)
|
|
if (!match) return
|
|
const start = match[2] ? Number(match[2]) : match[3] ? Number(match[3]) : undefined
|
|
const end = match[2] ? Number(match[2]) : match[4] ? Number(match[4]) : undefined
|
|
return {
|
|
path: match[5],
|
|
selection:
|
|
start !== undefined && end !== undefined
|
|
? {
|
|
startLine: start,
|
|
startChar: 0,
|
|
endLine: end,
|
|
endChar: 0,
|
|
}
|
|
: undefined,
|
|
comment: match[6],
|
|
} satisfies PromptComment
|
|
}
|