| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- 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
- }
|