mirror of
https://github.com/danny-avila/LibreChat.git
synced 2026-09-06 06:28:10 +00:00
* feat: add authenticated agent event ingress * style: sort agent ingress imports * fix: harden agent event ingress * fix: bind event provenance to API keys * fix: inspect event input with legacy PII filters * fix: scope event status reads to source keys * fix: bind event status reads to remote sources * feat: add bound event-driven child turns * fix: harden event-bound child continuations * fix: satisfy event binding type contracts * fix: close event actor lifecycle races * fix: harden event actor dispatch continuity * fix: fence event actor resume lifecycle * fix: bind event actor state to lifecycle * fix: preserve cascade write outcomes * test: type cascade failure injection * style: sort cascade test imports * fix: harden event child lifecycle boundaries * fix: make event cleanup retryable * fix: annotate event retention clock * fix: reconcile partial cascade metadata * fix: recheck event binding expiry on resume * fix: fence event actors by retention deadline * fix: close event actor lifecycle races * fix: harden event child lease acquisition * fix: lazy-load event child lease adapter
63 lines
2.1 KiB
JavaScript
63 lines
2.1 KiB
JavaScript
const {
|
|
getRetentionExpiry: getRetentionExpiryWithDeps,
|
|
getAgentFileRetentionExpiry: getAgentFileRetentionExpiryWithDeps,
|
|
} = require('@librechat/api');
|
|
const { logger, createTempChatExpirationDate } = require('@librechat/data-schemas');
|
|
const db = require('~/models');
|
|
|
|
const getRetentionDependencies = () => ({
|
|
getConvo: db.getConvoRetention ?? db.getConvo,
|
|
createExpirationDate: createTempChatExpirationDate,
|
|
logger,
|
|
});
|
|
|
|
/** Event-bound actors inherit the binding's server-authenticated deadline. Never
|
|
* extend files beyond the child conversation that makes them addressable. */
|
|
function getEventBindingRetention(req) {
|
|
const retention = req?._agentEventBindingRetention;
|
|
if (retention?.expiredAt == null) {
|
|
return null;
|
|
}
|
|
const expiredAt =
|
|
retention.expiredAt instanceof Date ? retention.expiredAt : new Date(retention.expiredAt);
|
|
return Number.isNaN(expiredAt.getTime()) ? null : { expiredAt };
|
|
}
|
|
|
|
/**
|
|
* Returns `{ expiredAt }` when the request indicates data retention applies, otherwise `{}`.
|
|
* Spread into file data objects before calling createFile.
|
|
* @param {ServerRequest} req
|
|
* @returns {Promise<{ expiredAt?: Date | null }>}
|
|
*/
|
|
async function getRetentionExpiry(req) {
|
|
const inherited = getEventBindingRetention(req);
|
|
if (inherited != null) {
|
|
return inherited;
|
|
}
|
|
return getRetentionExpiryWithDeps(req, getRetentionDependencies());
|
|
}
|
|
|
|
/**
|
|
* Returns `{ expiredAt }` for agent file uploads when retention applies, otherwise `{}`.
|
|
* @param {object} params
|
|
* @param {ServerRequest} params.req
|
|
* @param {boolean} [params.messageAttachment]
|
|
* @param {string} [params.tool_resource]
|
|
* @param {string} [params.toolResource]
|
|
* @returns {Promise<{ expiredAt?: Date | null }>}
|
|
*/
|
|
async function getAgentFileRetentionExpiry({ tool_resource, toolResource, ...params }) {
|
|
const inherited = getEventBindingRetention(params.req);
|
|
if (inherited != null) {
|
|
return inherited;
|
|
}
|
|
return getAgentFileRetentionExpiryWithDeps(
|
|
{ ...params, toolResource: tool_resource ?? toolResource },
|
|
getRetentionDependencies(),
|
|
);
|
|
}
|
|
|
|
module.exports = {
|
|
getRetentionExpiry,
|
|
getAgentFileRetentionExpiry,
|
|
};
|