import path from "path" import { describe, expect, test } from "bun:test" import { fileURLToPath } from "url" import { Instance } from "../../src/project/instance" import { Log } from "../../src/util/log" import { Session } from "../../src/session" import { SessionPrompt } from "../../src/session/prompt" import { MessageV2 } from "../../src/session/message-v2" import { tmpdir } from "../fixture/fixture" Log.init({ print: false }) describe("session.prompt special characters", () => { test("handles filenames with # character", async () => { await using tmp = await tmpdir({ git: true, init: async (dir) => { await Bun.write(path.join(dir, "file#name.txt"), "special content\n") }, }) await Instance.provide({ directory: tmp.path, fn: async () => { const session = await Session.create({}) const template = "Read @file#name.txt" const parts = await SessionPrompt.resolvePromptParts(template) const fileParts = parts.filter((part) => part.type === "file") expect(fileParts.length).toBe(1) expect(fileParts[0].filename).toBe("file#name.txt") // Verify the URL is properly encoded (# should be %23) expect(fileParts[0].url).toContain("%23") // Verify the URL can be correctly converted back to a file path const decodedPath = fileURLToPath(fileParts[0].url) expect(decodedPath).toBe(path.join(tmp.path, "file#name.txt")) const message = await SessionPrompt.prompt({ sessionID: session.id, parts, noReply: true, }) const stored = await MessageV2.get({ sessionID: session.id, messageID: message.info.id }) // Verify the file content was read correctly const textParts = stored.parts.filter((part) => part.type === "text") const hasContent = textParts.some((part) => part.text.includes("special content")) expect(hasContent).toBe(true) await Session.remove(session.id) }, }) }) })