diff --git a/api/server/services/Endpoints/agents/initialize.js b/api/server/services/Endpoints/agents/initialize.js index 01b97e97a9..2367f58440 100644 --- a/api/server/services/Endpoints/agents/initialize.js +++ b/api/server/services/Endpoints/agents/initialize.js @@ -295,11 +295,22 @@ const initializeClient = async ({ req, res, signal, endpointOption }) => { if (!ctx.tool_resources) { ctx.tool_resources = {}; } - const addProvisionedFile = (file, resourceType) => { + const addProvisionedFile = (file, resourceType, agentScoped) => { if (!file.file_id) { return; } const resource = ctx.tool_resources[resourceType] ?? {}; + /** Agent-scoped file_search files are embedded under `entity_id: agentId`, so + * they must be queried by `file_ids` (primeFiles marks those `fromAgent` and + * passes `entity_id`); user chat attachments and code files live in `files`. */ + if (agentScoped && resourceType === EToolResources.file_search) { + const fileIds = resource.file_ids ? [...resource.file_ids] : []; + if (!fileIds.includes(file.file_id)) { + fileIds.push(file.file_id); + } + ctx.tool_resources[resourceType] = { ...resource, file_ids: fileIds }; + return; + } const files = resource.files ? [...resource.files] : []; if (!files.some((existing) => existing.file_id === file.file_id)) { files.push(file); @@ -341,7 +352,11 @@ const initializeClient = async ({ req, res, signal, endpointOption }) => { }); if (result.embedded) { file.embedded = true; - addProvisionedFile(file, EToolResources.file_search); + addProvisionedFile( + file, + EToolResources.file_search, + entityIdForFile(file) !== undefined, + ); if (result.fileUpdate) { pendingUpdates.push(result.fileUpdate); } diff --git a/packages/data-provider/src/codeEnvRef.ts b/packages/data-provider/src/codeEnvRef.ts index 81187ff78f..fa66368f6f 100644 --- a/packages/data-provider/src/codeEnvRef.ts +++ b/packages/data-provider/src/codeEnvRef.ts @@ -51,6 +51,9 @@ interface CodeEnvRefBase { id: string; storage_session_id: string; file_id: string; + /** Epoch ms when the file was uploaded to the code env; drives the liveness + * fast-path (distinct from the usage-bumped `updatedAt`). */ + provisionedAt?: number; } export type CodeEnvRef = diff --git a/packages/data-schemas/src/schema/file.ts b/packages/data-schemas/src/schema/file.ts index 1742e503f7..1ae004aae3 100644 --- a/packages/data-schemas/src/schema/file.ts +++ b/packages/data-schemas/src/schema/file.ts @@ -130,6 +130,7 @@ const file: Schema = new Schema( storage_session_id: { type: String, required: true }, file_id: { type: String, required: true }, version: { type: Number }, + provisionedAt: { type: Number }, }, { _id: false }, ),