fix(operation-trace): stop false tamper reports and sharpen resource classification

- Chain integrity: the "read newest hash, then insert" pair in record() could be
  interleaved by concurrent traces (the panel opens a dozen parallel GETs), so two
  rows linked to the same predecessor and one looked like a broken chain even
  though nobody edited anything. Serialize the pair with a per-service lock.
- Resource classification: generic verbs fell back to resource_type='resource', so
  almost every read showed up as "View resource / Resource" (pipelines, bots,
  providers, users, monitoring...). Derive the family from the registered route
  identity (pipeline, bot, model_provider, llm_model, monitoring, user, workspace,
  webhook, api_key, system).
- Frontend: render the resource family for the new types (8 locales) and keep the
  resource_id badge added earlier.

Verified: backend integration 358 passed, ruff check/format clean; frontend tsc,
eslint, prettier and check-i18n all pass.
This commit is contained in:
TyperBody
2026-09-27 00:45:55 +08:00
parent 9964f284e1
commit a4f89cf28f
9 changed files with 162 additions and 19 deletions
+10
View File
@@ -2772,6 +2772,16 @@ const enUS = {
read: 'Everything',
},
resourceTypes: {
bot: 'Bot',
adapter: 'Adapter',
model_provider: 'Model provider',
llm_model: 'Model',
pipeline: 'Pipeline',
user: 'User',
workspace: 'Workspace',
monitoring: 'Monitoring',
webhook: 'Webhook',
api_key: 'API key',
workspace_settings: 'Workspace settings',
member: 'Member',
member_invitation: 'Member invitation',
+10
View File
@@ -2827,6 +2827,16 @@ const esES = {
read: 'Todo',
},
resourceTypes: {
bot: 'Bot',
adapter: 'Adaptador',
model_provider: 'Proveedor de modelos',
llm_model: 'Modelo',
pipeline: 'Pipeline',
user: 'Usuario',
workspace: 'Espacio de trabajo',
monitoring: 'Monitorización',
webhook: 'Webhook',
api_key: 'Clave de API',
workspace_settings: 'Ajustes del espacio de trabajo',
member: 'Miembro',
member_invitation: 'Invitación de miembro',
+10
View File
@@ -2790,6 +2790,16 @@ const jaJP = {
read: '最上位',
},
resourceTypes: {
bot: 'ボット',
adapter: 'アダプター',
model_provider: 'モデルプロバイダー',
llm_model: 'モデル',
pipeline: 'パイプライン',
user: 'ユーザー',
workspace: 'ワークスペース',
monitoring: 'モニタリング',
webhook: 'Webhook',
api_key: 'API キー',
workspace_settings: 'ワークスペース設定',
member: 'メンバー',
member_invitation: 'メンバー招待',
+10
View File
@@ -2797,6 +2797,16 @@ const ruRU = {
read: 'Всё',
},
resourceTypes: {
bot: 'Бот',
adapter: 'Адаптер',
model_provider: 'Провайдер моделей',
llm_model: 'Модель',
pipeline: 'Конвейер',
user: 'Пользователь',
workspace: 'Рабочее пространство',
monitoring: 'Мониторинг',
webhook: 'Webhook',
api_key: 'API-ключ',
workspace_settings: 'Настройки пространства',
member: 'Участник',
member_invitation: 'Приглашение участника',
+10
View File
@@ -2724,6 +2724,16 @@ const thTH = {
read: 'สูงสุด',
},
resourceTypes: {
bot: 'บอท',
adapter: 'อะแดปเตอร์',
model_provider: 'ผู้ให้บริการโมเดล',
llm_model: 'โมเดล',
pipeline: 'ไปป์ไลน์',
user: 'ผู้ใช้',
workspace: 'เวิร์กสเปซ',
monitoring: 'การมอนิเตอร์',
webhook: 'Webhook',
api_key: 'คีย์ API',
workspace_settings: 'การตั้งค่าพื้นที่ทำงาน',
member: 'สมาชิก',
member_invitation: 'คำเชิญสมาชิก',
+10
View File
@@ -2759,6 +2759,16 @@ const viVN = {
read: 'Cao nhất',
},
resourceTypes: {
bot: 'Bot',
adapter: 'Bộ chuyển đổi',
model_provider: 'Nhà cung cấp mô hình',
llm_model: 'Mô hình',
pipeline: 'Đường ống',
user: 'Người dùng',
workspace: 'Workspace',
monitoring: 'Giám sát',
webhook: 'Webhook',
api_key: 'Khóa API',
workspace_settings: 'Cài đặt không gian làm việc',
member: 'Thành viên',
member_invitation: 'Lời mời thành viên',
+10
View File
@@ -2622,6 +2622,16 @@ const zhHans = {
read: '最高级',
},
resourceTypes: {
bot: '机器人',
adapter: '适配器',
model_provider: '模型提供商',
llm_model: '模型',
pipeline: '管道',
user: '用户',
workspace: '工作区',
monitoring: '监控',
webhook: 'Webhook',
api_key: 'API 密钥',
workspace_settings: '工作区设置',
member: '成员',
member_invitation: '成员邀请',
+10
View File
@@ -2623,6 +2623,16 @@ const zhHant = {
read: '最高級',
},
resourceTypes: {
bot: '機器人',
adapter: '適配器',
model_provider: '模型提供商',
llm_model: '模型',
pipeline: '管道',
user: '使用者',
workspace: '工作區',
monitoring: '監控',
webhook: 'Webhook',
api_key: 'API 金鑰',
workspace_settings: '工作區設定',
member: '成員',
member_invitation: '成員邀請',