From efd65224b131ee782f4c641b2e0c0552783a4ea3 Mon Sep 17 00:00:00 2001 From: Jillian Nerice Castillo Date: Tue, 25 Aug 2026 17:59:56 +0000 Subject: [PATCH 1/2] Add development container --- .devcontainer/devcontainer.json | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .devcontainer/devcontainer.json diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 00000000..12d49984 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,5 @@ +{ + "name": "Project 1", + "image": "node:22-bookworm", + "postCreateCommand": "curl -fsSL https://bun.sh/install | bash" +} \ No newline at end of file From c7545a600a7b9102d98d808270f002de087d2a12 Mon Sep 17 00:00:00 2001 From: Jillian Nerice Castillo Date: Sun, 6 Sep 2026 17:01:52 +0000 Subject: [PATCH 2/2] Extract callback functions from buildRequestParts to reduce return count --- .../prompt-input/build-request-parts.ts | 83 ++++++++++--------- 1 file changed, 46 insertions(+), 37 deletions(-) diff --git a/packages/app/src/components/prompt-input/build-request-parts.ts b/packages/app/src/components/prompt-input/build-request-parts.ts index a1e3448b..c9d85269 100644 --- a/packages/app/src/components/prompt-input/build-request-parts.ts +++ b/packages/app/src/components/prompt-input/build-request-parts.ts @@ -87,19 +87,8 @@ const toOptimisticPart = (part: PromptRequestPart, sessionID: string, messageID: messageID, } } - -export function buildRequestParts(input: BuildRequestPartsInput) { - const requestParts: PromptRequestPart[] = input.text.trim() - ? [ - { - id: Identifier.ascending("part"), - type: "text", - text: input.text, - }, - ] - : [] - - const files = input.prompt.filter(isFileAttachment).map((attachment) => { +function buildFileParts(input: BuildRequestPartsInput) { + return input.prompt.filter(isFileAttachment).map((attachment) => { const path = absolute(input.sessionDirectory, attachment.path) const source = attachment.source ? { @@ -128,8 +117,10 @@ export function buildRequestParts(input: BuildRequestPartsInput) { source, } satisfies PromptRequestPart }) +} - const agents = input.prompt.filter(isAgentAttachment).map((attachment) => { +function buildAgentParts(input: BuildRequestPartsInput): PromptRequestPart[] { + return input.prompt.filter(isAgentAttachment).map((attachment) => { return { id: Identifier.ascending("part"), type: "agent", @@ -141,15 +132,32 @@ export function buildRequestParts(input: BuildRequestPartsInput) { }, } satisfies PromptRequestPart }) +} - const used = new Set(files.map((part) => part.url)) - const context = input.context.flatMap((item) => { +function buildContextMentionParts(sessionDirectory: string, comment: string, used: Set): PromptRequestPart[] { + return parseCommentMentions(comment).flatMap((path) => { + const url = `file://${encodeFilePath(absolute(sessionDirectory, path))}` + if (used.has(url)) return [] + used.add(url) + return [ + { + id: Identifier.ascending("part"), + type: "file", + mime: "text/plain", + url, + filename: getFilename(path), + } satisfies PromptRequestPart, + ] + }) +} + +function buildContextParts(input: BuildRequestPartsInput, used: Set): PromptRequestPart[] { + return input.context.flatMap((item) => { const path = absolute(input.sessionDirectory, item.path) const url = `file://${encodeFilePath(path)}${fileQuery(item.selection)}` const comment = item.comment?.trim() if (!comment && used.has(url)) return [] used.add(url) - const filePart = { id: Identifier.ascending("part"), type: "file", @@ -157,24 +165,8 @@ export function buildRequestParts(input: BuildRequestPartsInput) { url, filename: getFilename(item.path), } satisfies PromptRequestPart - if (!comment) return [filePart] - - const mentions = parseCommentMentions(comment).flatMap((path) => { - const url = `file://${encodeFilePath(absolute(input.sessionDirectory, path))}` - if (used.has(url)) return [] - used.add(url) - return [ - { - id: Identifier.ascending("part"), - type: "file", - mime: "text/plain", - url, - filename: getFilename(path), - } satisfies PromptRequestPart, - ] - }) - + const mentions = buildContextMentionParts(input.sessionDirectory, comment, used) return [ { id: Identifier.ascending("part"), @@ -193,8 +185,10 @@ export function buildRequestParts(input: BuildRequestPartsInput) { ...mentions, ] }) +} - const images = input.images.map((attachment) => { +function buildImageParts(input: BuildRequestPartsInput): PromptRequestPart[] { + return input.images.map((attachment) => { return { id: Identifier.ascending("part"), type: "file", @@ -203,11 +197,26 @@ export function buildRequestParts(input: BuildRequestPartsInput) { filename: attachment.sourcePath ?? attachment.filename, } satisfies PromptRequestPart }) +} +export function buildRequestParts(input: BuildRequestPartsInput) { + const requestParts: PromptRequestPart[] = input.text.trim() + ? [ + { + id: Identifier.ascending("part"), + type: "text", + text: input.text, + }, + ] + : [] + const files = buildFileParts(input) + const agents = buildAgentParts(input) + const used = new Set(files.map((part) => part.url)) + const context = buildContextParts(input, used) + const images = buildImageParts(input) requestParts.push(...files, ...context, ...agents, ...images) - return { requestParts, optimisticParts: requestParts.map((part) => toOptimisticPart(part, input.sessionID, input.messageID)), } -} +} \ No newline at end of file