UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

192 lines (191 loc) 7.66 kB
import { l as normalizeOptionalString } from "./string-coerce-CIXf7egm.js"; import { t as ErrorCodes } from "./gateway-error-details-w0nAGBBp.js"; import { S as validateAuditRunInspectParams, b as validateAuditActivityListParams, x as validateAuditListParams } from "./src-BiL5aQto.js"; import { d as errorShape } from "./error-codes-Bo8q2D1o.js"; import { f as findAuditActivityFilterConflict } from "./audit-activity-mkM4q0OU.js"; import { t as assertValidParams } from "./validation-pzrlzFvo.js"; import { t as parsePositiveAuditCursor } from "./audit-cursor-B-p0ImK5.js"; import { a as isExecutionDecisionCursor, c as listAuditEvents, i as ExecutionDecisionCursorError, t as inspectExecutionIdentityRun } from "./execution-identity-context-B0gwJgCx.js"; //#region src/gateway/server-methods/audit.ts const DEFAULT_AUDIT_LIST_LIMIT = 100; const MAX_AUDIT_LIST_LIMIT = 500; function serializeAuditRunInspectResult(inspected) { const result = { schemaVersion: inspected.schemaVersion, run: inspected.run, identity: inspected.identity, decisionDisplays: inspected.decisionDisplays, coverage: inspected.coverage }; if (inspected.nextDecisionCursor !== void 0) result.nextDecisionCursor = inspected.nextDecisionCursor; if (inspected.nextExecutionCursor !== void 0) result.nextExecutionCursor = inspected.nextExecutionCursor; return result; } function isOwnerDecisionCursor(value) { return parsePositiveAuditCursor(value) === null && isExecutionDecisionCursor(value); } /** Preserve the shipped audit.list result shape for run/tool-only clients. */ function mapLegacyAuditEvent(event) { const { schemaVersion: _schemaVersion, actorType, actorId, ...legacyEvent } = event; return { ...legacyEvent, actor: { type: actorType, id: actorId } }; } function mapAuditActivityEvent(event) { if (event.kind === "agent_run") { const { actorType, actorId, ...activity } = event; return { ...activity, eventType: "agent_run", actor: { type: actorType, id: actorId } }; } if (event.kind === "tool_action") { const { actorType, actorId, ...activity } = event; return { ...activity, eventType: "tool_action", actor: { type: actorType, id: actorId } }; } if (event.direction === "inbound") { const { actorType, actorId, ...activity } = event; const actor = actorType === "channel_sender" ? { type: "channel_sender", id: actorId } : { type: "system", id: actorId }; return { ...activity, eventType: "inbound_message", actor }; } if (event.action !== "message.outbound.finished") throw new Error("nonterminal outbound messages are not audit activity records"); const { actorType, actorId, ...activity } = event; return { ...activity, eventType: "outbound_message", actor: { type: actorType, id: actorId } }; } function invalidRangeOrCursor(params) { const cursor = parsePositiveAuditCursor(params.cursor); return { ...cursor !== void 0 && cursor !== null ? { cursor } : {}, invalid: cursor === null || params.after !== void 0 && params.before !== void 0 && params.after > params.before }; } const auditHandlers = { "audit.list": ({ params, respond }) => { if (!assertValidParams(params, validateAuditListParams, "audit.list", respond)) return; const parsed = invalidRangeOrCursor(params); if (parsed.invalid) { respond(false, void 0, errorShape(ErrorCodes.INVALID_REQUEST, "invalid audit.list range or cursor")); return; } const agentId = normalizeOptionalString(params.agentId); const sessionKey = normalizeOptionalString(params.sessionKey); const runId = normalizeOptionalString(params.runId); const page = listAuditEvents({ limit: Math.min(params.limit ?? DEFAULT_AUDIT_LIST_LIMIT, MAX_AUDIT_LIST_LIMIT), ...parsed.cursor !== void 0 ? { cursor: parsed.cursor } : {}, filters: { ...agentId ? { agentId } : {}, ...sessionKey ? { sessionKey } : {}, ...runId ? { runId } : {}, ...params.kind ? { kind: params.kind } : {}, ...params.status ? { status: params.status } : {}, ...params.after !== void 0 ? { after: params.after } : {}, ...params.before !== void 0 ? { before: params.before } : {} } }); respond(true, { events: page.events.map((event) => { if (event.kind === "message") throw new Error("legacy audit.list cannot project message records"); return mapLegacyAuditEvent(event); }), ...page.nextCursor !== void 0 ? { nextCursor: String(page.nextCursor) } : {} }); }, "audit.activity.list": ({ params, respond }) => { if (!assertValidParams(params, validateAuditActivityListParams, "audit.activity.list", respond)) return; const filterConflict = findAuditActivityFilterConflict(params); if (filterConflict) { const detail = filterConflict.type === "kind" ? `${filterConflict.field} only applies to kind ${filterConflict.supportedKinds.join(" or ")}` : `${filterConflict.field} cannot be combined with ${filterConflict.conflictingField}`; respond(false, void 0, errorShape(ErrorCodes.INVALID_REQUEST, `invalid audit.activity.list filters: ${detail}`)); return; } const parsed = invalidRangeOrCursor(params); if (parsed.invalid) { respond(false, void 0, errorShape(ErrorCodes.INVALID_REQUEST, "invalid audit.activity.list range or cursor")); return; } const agentId = normalizeOptionalString(params.agentId); const sessionKey = normalizeOptionalString(params.sessionKey); const runId = normalizeOptionalString(params.runId); const page = listAuditEvents({ limit: Math.min(params.limit ?? DEFAULT_AUDIT_LIST_LIMIT, MAX_AUDIT_LIST_LIMIT), ...parsed.cursor !== void 0 ? { cursor: parsed.cursor } : {}, filters: { includeMessages: true, ...agentId ? { agentId } : {}, ...sessionKey ? { sessionKey } : {}, ...runId ? { runId } : {}, ...params.kind ? { kind: params.kind } : {}, ...params.status ? { status: params.status } : {}, ...params.direction ? { direction: params.direction } : {}, ...params.channel ? { channel: params.channel } : {}, ...params.after !== void 0 ? { after: params.after } : {}, ...params.before !== void 0 ? { before: params.before } : {} } }); respond(true, { events: page.events.map(mapAuditActivityEvent), ...page.nextCursor !== void 0 ? { nextCursor: String(page.nextCursor) } : {} }); }, "audit.run.inspect": ({ params, respond }) => { if (!assertValidParams(params, validateAuditRunInspectParams, "audit.run.inspect", respond)) return; const decisionCursor = params.decisionCursor; const executionOffset = typeof params.runId !== "string" || params.executionCursor === decisionCursor && decisionCursor !== void 0 && isOwnerDecisionCursor(decisionCursor) ? void 0 : parsePositiveAuditCursor(params.executionCursor); if (decisionCursor !== void 0 && !isExecutionDecisionCursor(decisionCursor) || executionOffset === null) { respond(false, void 0, errorShape(ErrorCodes.INVALID_REQUEST, "invalid audit.run.inspect cursor")); return; } try { respond(true, serializeAuditRunInspectResult(inspectExecutionIdentityRun({ ...typeof params.runId === "string" ? { runId: params.runId, ...executionOffset !== void 0 ? { executionOffset } : {}, executionLimit: params.executionLimit ?? 50 } : { executionId: params.executionId }, ...decisionCursor !== void 0 ? { decisionCursor } : {}, decisionLimit: params.decisionLimit ?? 50 }))); } catch (error) { if (error instanceof ExecutionDecisionCursorError) { respond(false, void 0, errorShape(ErrorCodes.INVALID_REQUEST, error.message)); return; } throw error; } } }; //#endregion export { auditHandlers };