Buckets:
| 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 | |
| } | |
Xet Storage Details
- Size:
- 3.08 kB
- Xet hash:
- e488aa88d524128897f8296163f7e3a813190f9522592b5c389de151dbe7d126
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.