fix: allow agent workspace directories in media local roots (#17136)

Merged via /review-pr -> /prepare-pr -> /merge-pr.

Prepared head SHA: 7545ef1e19
Co-authored-by: MisterGuy420 <255743668+MisterGuy420@users.noreply.github.com>
Co-authored-by: gumadeiras <5599352+gumadeiras@users.noreply.github.com>
Reviewed-by: @gumadeiras
This commit is contained in:
Mr. Guy
2026-02-15 10:53:45 -05:00
committed by GitHub
parent 0c57f5e62e
commit e927fd1e35
38 changed files with 388 additions and 35 deletions

View File

@@ -34,6 +34,7 @@ import { finalizeInboundContext } from "../../auto-reply/reply/inbound-context.j
import { dispatchReplyWithDispatcher } from "../../auto-reply/reply/provider-dispatcher.js";
import { resolveCommandAuthorizedFromAuthorizers } from "../../channels/command-gating.js";
import { createReplyPrefixOptions } from "../../channels/reply-prefix.js";
import { getAgentScopedMediaLocalRoots } from "../../media/local-roots.js";
import { buildPairingReply } from "../../pairing/pairing-messages.js";
import {
readChannelAllowFromStore,
@@ -814,6 +815,7 @@ async function dispatchDiscordCommandInteraction(params: {
channel: "discord",
accountId: route.accountId,
});
const mediaLocalRoots = getAgentScopedMediaLocalRoots(cfg, route.agentId);
let didReply = false;
await dispatchReplyWithDispatcher({
@@ -827,6 +829,7 @@ async function dispatchDiscordCommandInteraction(params: {
await deliverDiscordInteractionReply({
interaction,
payload,
mediaLocalRoots,
textLimit: resolveTextChunkLimit(cfg, "discord", accountId, {
fallbackLimit: 2000,
}),
@@ -861,6 +864,7 @@ async function dispatchDiscordCommandInteraction(params: {
async function deliverDiscordInteractionReply(params: {
interaction: CommandInteraction | ButtonInteraction;
payload: ReplyPayload;
mediaLocalRoots?: readonly string[];
textLimit: number;
maxLinesPerMessage?: number;
preferFollowUp: boolean;
@@ -899,7 +903,9 @@ async function deliverDiscordInteractionReply(params: {
if (mediaList.length > 0) {
const media = await Promise.all(
mediaList.map(async (url) => {
const loaded = await loadWebMedia(url);
const loaded = await loadWebMedia(url, {
localRoots: params.mediaLocalRoots,
});
return {
name: loaded.fileName ?? "upload",
data: loaded.buffer,

View File

@@ -39,6 +39,7 @@ type DiscordSendOpts = {
token?: string;
accountId?: string;
mediaUrl?: string;
mediaLocalRoots?: readonly string[];
verbose?: boolean;
rest?: RequestClient;
replyTo?: string;
@@ -140,6 +141,7 @@ export async function sendMessageDiscord(
threadId,
mediaCaption ?? "",
opts.mediaUrl,
opts.mediaLocalRoots,
undefined,
request,
accountInfo.config.maxLinesPerMessage,
@@ -203,6 +205,7 @@ export async function sendMessageDiscord(
channelId,
textWithTables,
opts.mediaUrl,
opts.mediaLocalRoots,
opts.replyTo,
request,
accountInfo.config.maxLinesPerMessage,

View File

@@ -312,6 +312,7 @@ async function sendDiscordMedia(
channelId: string,
text: string,
mediaUrl: string,
mediaLocalRoots: readonly string[] | undefined,
replyTo: string | undefined,
request: DiscordRequest,
maxLinesPerMessage?: number,
@@ -319,7 +320,7 @@ async function sendDiscordMedia(
chunkMode?: ChunkMode,
silent?: boolean,
) {
const media = await loadWebMedia(mediaUrl);
const media = await loadWebMedia(mediaUrl, { localRoots: mediaLocalRoots });
const chunks = text ? buildDiscordTextChunks(text, { maxLinesPerMessage, chunkMode }) : [];
const caption = chunks[0] ?? "";
const hasCaption = caption.trim().length > 0;