|
|
@@ -187,17 +187,13 @@ export namespace SessionPrompt {
|
|
|
text: template,
|
|
|
},
|
|
|
]
|
|
|
- const matches = ConfigMarkdown.files(template)
|
|
|
+ const files = ConfigMarkdown.files(template)
|
|
|
const seen = new Set<string>()
|
|
|
- const names = matches
|
|
|
- .map((match) => match[1])
|
|
|
- .filter((name) => {
|
|
|
- if (seen.has(name)) return false
|
|
|
+ await Promise.all(
|
|
|
+ files.map(async (match) => {
|
|
|
+ const name = match[1]
|
|
|
+ if (seen.has(name)) return
|
|
|
seen.add(name)
|
|
|
- return true
|
|
|
- })
|
|
|
- const resolved = await Promise.all(
|
|
|
- names.map(async (name) => {
|
|
|
const filepath = name.startsWith("~/")
|
|
|
? path.join(os.homedir(), name.slice(2))
|
|
|
: path.resolve(Instance.worktree, name)
|
|
|
@@ -205,34 +201,33 @@ export namespace SessionPrompt {
|
|
|
const stats = await fs.stat(filepath).catch(() => undefined)
|
|
|
if (!stats) {
|
|
|
const agent = await Agent.get(name)
|
|
|
- if (!agent) return undefined
|
|
|
- return {
|
|
|
- type: "agent",
|
|
|
- name: agent.name,
|
|
|
- } satisfies PromptInput["parts"][number]
|
|
|
+ if (agent) {
|
|
|
+ parts.push({
|
|
|
+ type: "agent",
|
|
|
+ name: agent.name,
|
|
|
+ })
|
|
|
+ }
|
|
|
+ return
|
|
|
}
|
|
|
|
|
|
if (stats.isDirectory()) {
|
|
|
- return {
|
|
|
+ parts.push({
|
|
|
type: "file",
|
|
|
url: `file://${filepath}`,
|
|
|
filename: name,
|
|
|
mime: "application/x-directory",
|
|
|
- } satisfies PromptInput["parts"][number]
|
|
|
+ })
|
|
|
+ return
|
|
|
}
|
|
|
|
|
|
- return {
|
|
|
+ parts.push({
|
|
|
type: "file",
|
|
|
url: `file://${filepath}`,
|
|
|
filename: name,
|
|
|
mime: "text/plain",
|
|
|
- } satisfies PromptInput["parts"][number]
|
|
|
+ })
|
|
|
}),
|
|
|
)
|
|
|
- for (const item of resolved) {
|
|
|
- if (!item) continue
|
|
|
- parts.push(item)
|
|
|
- }
|
|
|
return parts
|
|
|
}
|
|
|
|
|
|
@@ -432,12 +427,6 @@ export namespace SessionPrompt {
|
|
|
assistantMessage.time.completed = Date.now()
|
|
|
await Session.updateMessage(assistantMessage)
|
|
|
if (result && part.state.status === "running") {
|
|
|
- const attachments = result.attachments?.map((attachment) => ({
|
|
|
- ...attachment,
|
|
|
- id: Identifier.ascending("part"),
|
|
|
- messageID: assistantMessage.id,
|
|
|
- sessionID: assistantMessage.sessionID,
|
|
|
- }))
|
|
|
await Session.updatePart({
|
|
|
...part,
|
|
|
state: {
|
|
|
@@ -446,7 +435,7 @@ export namespace SessionPrompt {
|
|
|
title: result.title,
|
|
|
metadata: result.metadata,
|
|
|
output: result.output,
|
|
|
- attachments,
|
|
|
+ attachments: result.attachments,
|
|
|
time: {
|
|
|
...part.state.time,
|
|
|
end: Date.now(),
|
|
|
@@ -785,13 +774,16 @@ export namespace SessionPrompt {
|
|
|
)
|
|
|
|
|
|
const textParts: string[] = []
|
|
|
- const attachments: Omit<MessageV2.FilePart, "id" | "messageID" | "sessionID">[] = []
|
|
|
+ const attachments: MessageV2.FilePart[] = []
|
|
|
|
|
|
for (const contentItem of result.content) {
|
|
|
if (contentItem.type === "text") {
|
|
|
textParts.push(contentItem.text)
|
|
|
} else if (contentItem.type === "image") {
|
|
|
attachments.push({
|
|
|
+ id: Identifier.ascending("part"),
|
|
|
+ sessionID: input.session.id,
|
|
|
+ messageID: input.processor.message.id,
|
|
|
type: "file",
|
|
|
mime: contentItem.mimeType,
|
|
|
url: `data:${contentItem.mimeType};base64,${contentItem.data}`,
|
|
|
@@ -803,6 +795,9 @@ export namespace SessionPrompt {
|
|
|
}
|
|
|
if (resource.blob) {
|
|
|
attachments.push({
|
|
|
+ id: Identifier.ascending("part"),
|
|
|
+ sessionID: input.session.id,
|
|
|
+ messageID: input.processor.message.id,
|
|
|
type: "file",
|
|
|
mime: resource.mimeType ?? "application/octet-stream",
|
|
|
url: `data:${resource.mimeType ?? "application/octet-stream"};base64,${resource.blob}`,
|
|
|
@@ -1051,7 +1046,6 @@ export namespace SessionPrompt {
|
|
|
pieces.push(
|
|
|
...result.attachments.map((attachment) => ({
|
|
|
...attachment,
|
|
|
- id: Identifier.ascending("part"),
|
|
|
synthetic: true,
|
|
|
filename: attachment.filename ?? part.filename,
|
|
|
messageID: info.id,
|
|
|
@@ -1189,18 +1183,7 @@ export namespace SessionPrompt {
|
|
|
},
|
|
|
]
|
|
|
}),
|
|
|
- )
|
|
|
- .then((x) => x.flat())
|
|
|
- .then((drafts) =>
|
|
|
- drafts.map(
|
|
|
- (part): MessageV2.Part => ({
|
|
|
- ...part,
|
|
|
- id: Identifier.ascending("part"),
|
|
|
- messageID: info.id,
|
|
|
- sessionID: input.sessionID,
|
|
|
- }),
|
|
|
- ),
|
|
|
- )
|
|
|
+ ).then((x) => x.flat())
|
|
|
|
|
|
await Plugin.trigger(
|
|
|
"chat.message",
|