Розробка
Патерн обмеження по відділу
Нові автентифіковані маршрути мають застосовувати ізоляцію відділу через forUser() з src/lib/department-scope.ts. forDepartment() залишається як alias для сумісності, але forUser() дає хелпери для дозволів і мультидепартаментного доступу.
Використовуйте найменший scope-хелпер, який відповідає формі даних:
const scope = forUser(request.user);
// Model has departmentId directly.
await prisma.knowledgeBase.findMany({
where: { ...scope.directWhere() },
});
// Model is scoped through Namespace.
await prisma.agentTask.findMany({
where: { ...scope.nestedWhere('namespace') },
});
Користувачі з глобальним scope бачать усі відділи. Решта обмежені своїм обчисленим scope.deptIds — не дозволяйте query-параметру departmentId обходити scope.canSeeDept() або scope.directWhere().
Для raw SQL, який підтримує лише один departmentId-фільтр, беріть значення з scope.departmentId і передавайте як Prisma SQL-параметр:
const departmentFilter = scope.departmentId
? Prisma.sql`AND kb."departmentId" = ${scope.departmentId}`
: Prisma.empty;
Для мультидепартаментного сценарію використовуйте scope.deptIds і фільтр IN (...) замість того, щоб припускати наявність scope.departmentId.
Маршрути також можуть читати request.departmentScope, який декорується після автентифікації через src/plugins/department-scope.ts.
Чекліст маршруту
- Додайте
fastify.authenticateна кожен непублічний маршрут. - Додайте RBAC-middleware, наприклад
requirePermission(), там де операція змінює привілейовані дані. - Застосуйте
forDepartment()абоrequest.departmentScopeперед запитами до записів з scope-обмеженням по відділу. - Повертайте помилки через
sendError(), щоб відповіді мали формат{ error, message, statusCode, details? }. - Додайте route schemas, щоб
/docsзалишався синхронним з рантайм-поведінкою. - Додайте або розширте тести ізоляції відділу, коли новий ендпоінт віддає дані по відділу.
Конвеєр завдань агента
Обробники вхідних каналів не повинні ухвалювати рішень про RAG, довіру або HITL. Для нового каналу:
- розпарсіть транспортний payload;
- знайдіть або створіть користувача, розмову та вхідне повідомлення;
- створіть
AgentTask; - поставте завдання в чергу
agent-tasks; - передайте залежність для вихідних повідомлень, щоб agent runner міг відправляти схвалені або автоматично обійдені відповіді.
Воркер agent runner володіє кроками inject_profile, rag_search, generate і confidence_check. Див. ADR-001.