@objectstack/plugin-audit 9.5.0 → 9.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -3,8 +3,13 @@ var __defProp = Object.defineProperty;
3
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
5
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __esm = (fn, res) => function __init() {
7
- return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
6
+ var __esm = (fn, res, err) => function __init() {
7
+ if (err) throw err[0];
8
+ try {
9
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
10
+ } catch (e) {
11
+ throw err = [e], e;
12
+ }
8
13
  };
9
14
  var __export = (target, all) => {
10
15
  for (var name in all)
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/translations/en.objects.generated.ts","../src/translations/zh-CN.objects.generated.ts","../src/translations/ja-JP.objects.generated.ts","../src/translations/es-ES.objects.generated.ts","../src/translations/index.ts","../src/index.ts","../src/objects/sys-audit-log.object.ts","../src/objects/sys-activity.object.ts","../src/objects/sys-comment.object.ts","../src/audit-plugin.ts","../src/audit-writers.ts"],"sourcesContent":["// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\n/**\n * Auto-generated by 'os i18n extract' for locale 'en'.\n * Edit translations in place; re-run extract (with --merge) to fill new gaps.\n * Do not hand-edit the structure — only the leaf string values.\n */\n\nimport type { TranslationData } from '@objectstack/spec/system';\n\nexport const enObjects: NonNullable<TranslationData['objects']> = {\n sys_audit_log: {\n label: \"Audit Log\",\n pluralLabel: \"Audit Logs\",\n description: \"Immutable audit trail for platform events\",\n fields: {\n created_at: {\n label: \"Timestamp\"\n },\n action: {\n label: \"Action\",\n help: \"Action type (snake_case)\",\n options: {\n create: \"create\",\n update: \"update\",\n delete: \"delete\",\n restore: \"restore\",\n login: \"login\",\n logout: \"logout\",\n permission_change: \"permission_change\",\n config_change: \"config_change\",\n export: \"export\",\n import: \"import\"\n }\n },\n user_id: {\n label: \"Actor\",\n help: \"User who performed the action (null for system actions)\"\n },\n object_name: {\n label: \"Object\",\n help: \"Target object (e.g. sys_user, project_task)\"\n },\n record_id: {\n label: \"Record ID\",\n help: \"ID of the affected record\"\n },\n old_value: {\n label: \"Old Value\",\n help: \"JSON-serialized previous state\"\n },\n new_value: {\n label: \"New Value\",\n help: \"JSON-serialized new state\"\n },\n ip_address: {\n label: \"IP Address\"\n },\n user_agent: {\n label: \"User Agent\"\n },\n tenant_id: {\n label: \"Tenant\",\n help: \"Tenant context for multi-tenant isolation\"\n },\n metadata: {\n label: \"Metadata\",\n help: \"JSON-serialized additional context\"\n },\n id: {\n label: \"Audit Log ID\"\n }\n },\n _views: {\n recent: {\n label: \"Recent\"\n },\n writes_only: {\n label: \"Writes\"\n },\n auth_events: {\n label: \"Auth\"\n },\n config_changes: {\n label: \"Config\"\n },\n all_events: {\n label: \"All\"\n }\n }\n },\n sys_activity: {\n label: \"Activity\",\n pluralLabel: \"Activities\",\n description: \"Recent activity stream entries (lightweight, denormalized)\",\n fields: {\n id: {\n label: \"Activity ID\"\n },\n timestamp: {\n label: \"Timestamp\"\n },\n type: {\n label: \"Type\",\n options: {\n created: \"created\",\n updated: \"updated\",\n deleted: \"deleted\",\n commented: \"commented\",\n mentioned: \"mentioned\",\n shared: \"shared\",\n assigned: \"assigned\",\n completed: \"completed\",\n login: \"login\",\n logout: \"logout\",\n system: \"system\"\n }\n },\n summary: {\n label: \"Summary\",\n help: \"Human-readable one-line summary\"\n },\n actor_id: {\n label: \"Actor\"\n },\n actor_name: {\n label: \"Actor Name\"\n },\n actor_avatar_url: {\n label: \"Actor Avatar\"\n },\n object_name: {\n label: \"Object\",\n help: \"Target object short name (e.g. account, sys_user)\"\n },\n record_id: {\n label: \"Record ID\"\n },\n record_label: {\n label: \"Record Label\",\n help: \"Display label of the target record at write time\"\n },\n url: {\n label: \"URL\",\n help: \"Optional deep-link to the activity target\"\n },\n environment_id: {\n label: \"Project\",\n help: \"Environment context (multi-environment deployments)\"\n },\n metadata: {\n label: \"Metadata\",\n help: \"JSON-serialized additional context\"\n }\n }\n },\n sys_comment: {\n label: \"Comment\",\n pluralLabel: \"Comments\",\n description: \"Threaded comments attached to records via thread_id\",\n fields: {\n id: {\n label: \"Comment ID\"\n },\n thread_id: {\n label: \"Thread\",\n help: \"Thread identifier — conventionally `{object}:{record_id}` (e.g. `sys_user:abc123`)\"\n },\n parent_id: {\n label: \"Parent Comment\",\n help: \"Optional parent comment for nested replies\"\n },\n reply_count: {\n label: \"Reply Count\"\n },\n author_id: {\n label: \"Author\"\n },\n author_name: {\n label: \"Author Name\"\n },\n author_avatar_url: {\n label: \"Author Avatar\"\n },\n body: {\n label: \"Body\",\n help: \"Comment text (Markdown supported)\"\n },\n mentions: {\n label: \"Mentions\",\n help: \"JSON array of @mention objects\"\n },\n reactions: {\n label: \"Reactions\",\n help: \"JSON array of emoji reaction objects\"\n },\n is_edited: {\n label: \"Edited\"\n },\n edited_at: {\n label: \"Edited At\"\n },\n visibility: {\n label: \"Visibility\",\n options: {\n public: \"public\",\n internal: \"internal\",\n private: \"private\"\n }\n },\n created_at: {\n label: \"Created At\"\n },\n updated_at: {\n label: \"Updated At\"\n }\n }\n }\n};\n","// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\n/**\n * Auto-generated by 'os i18n extract' for locale 'zh-CN'.\n * Edit translations in place; re-run extract (with --merge) to fill new gaps.\n * Do not hand-edit the structure — only the leaf string values.\n */\n\nimport type { TranslationData } from '@objectstack/spec/system';\n\nexport const zhCNObjects: NonNullable<TranslationData['objects']> = {\n sys_audit_log: {\n label: \"审计日志\",\n pluralLabel: \"审计日志\",\n description: \"平台事件的不可变审计追踪\",\n fields: {\n created_at: {\n label: \"时间戳\"\n },\n action: {\n label: \"操作\",\n help: \"操作类型(snake_case)\",\n options: {\n create: \"创建\",\n update: \"更新\",\n delete: \"删除\",\n restore: \"恢复\",\n login: \"登录\",\n logout: \"登出\",\n permission_change: \"权限变更\",\n config_change: \"配置变更\",\n export: \"导出\",\n import: \"导入\"\n }\n },\n user_id: {\n label: \"执行人\",\n help: \"执行该操作的用户(系统操作时为 null)\"\n },\n object_name: {\n label: \"对象\",\n help: \"目标对象(例如 sys_user、project_task)\"\n },\n record_id: {\n label: \"记录 ID\",\n help: \"受影响记录的 ID\"\n },\n old_value: {\n label: \"旧值\",\n help: \"旧状态的 JSON 序列化内容\"\n },\n new_value: {\n label: \"新值\",\n help: \"新状态的 JSON 序列化内容\"\n },\n ip_address: {\n label: \"IP 地址\"\n },\n user_agent: {\n label: \"用户代理\"\n },\n tenant_id: {\n label: \"租户\",\n help: \"用于多租户隔离的租户上下文\"\n },\n metadata: {\n label: \"元数据\",\n help: \"附加上下文的 JSON 序列化内容\"\n },\n id: {\n label: \"审计日志 ID\"\n }\n },\n _views: {\n recent: {\n label: \"最近\"\n },\n writes_only: {\n label: \"写入\"\n },\n auth_events: {\n label: \"认证\"\n },\n config_changes: {\n label: \"配置\"\n },\n all_events: {\n label: \"全部\"\n }\n }\n },\n sys_activity: {\n label: \"活动\",\n pluralLabel: \"活动\",\n description: \"最近活动流条目(轻量、去规范化)\",\n fields: {\n id: {\n label: \"活动 ID\"\n },\n timestamp: {\n label: \"时间戳\"\n },\n type: {\n label: \"类型\",\n options: {\n created: \"已创建\",\n updated: \"已更新\",\n deleted: \"已删除\",\n commented: \"已评论\",\n mentioned: \"被提及\",\n shared: \"已共享\",\n assigned: \"已分配\",\n completed: \"已完成\",\n login: \"登录\",\n logout: \"登出\",\n system: \"系统\"\n }\n },\n summary: {\n label: \"摘要\",\n help: \"人类可读的单行摘要\"\n },\n actor_id: {\n label: \"执行人\"\n },\n actor_name: {\n label: \"执行人名称\"\n },\n actor_avatar_url: {\n label: \"执行人头像\"\n },\n object_name: {\n label: \"对象\",\n help: \"目标对象短名称(例如 account、sys_user)\"\n },\n record_id: {\n label: \"记录 ID\"\n },\n record_label: {\n label: \"记录标签\",\n help: \"写入时目标记录的显示标签\"\n },\n url: {\n label: \"URL\",\n help: \"指向活动目标的可选深度链接\"\n },\n environment_id: {\n label: \"项目\",\n help: \"项目上下文(多项目部署)\"\n },\n metadata: {\n label: \"元数据\",\n help: \"附加上下文的 JSON 序列化内容\"\n }\n }\n },\n sys_comment: {\n label: \"评论\",\n pluralLabel: \"评论\",\n description: \"通过 thread_id 附加到记录的线程化评论\",\n fields: {\n id: {\n label: \"评论 ID\"\n },\n thread_id: {\n label: \"线程\",\n help: \"线程标识——约定格式为 `{object}:{record_id}`(例如 `sys_user:abc123`)\"\n },\n parent_id: {\n label: \"父评论\",\n help: \"可选的父评论,用于嵌套回复\"\n },\n reply_count: {\n label: \"回复数\"\n },\n author_id: {\n label: \"作者\"\n },\n author_name: {\n label: \"作者名称\"\n },\n author_avatar_url: {\n label: \"作者头像\"\n },\n body: {\n label: \"正文\",\n help: \"评论文本(支持 Markdown)\"\n },\n mentions: {\n label: \"提及\",\n help: \"@mention 对象的 JSON 数组\"\n },\n reactions: {\n label: \"回应\",\n help: \"表情回应对象的 JSON 数组\"\n },\n is_edited: {\n label: \"已编辑\"\n },\n edited_at: {\n label: \"编辑时间\"\n },\n visibility: {\n label: \"可见性\",\n options: {\n public: \"公开\",\n internal: \"内部\",\n private: \"私有\"\n }\n },\n created_at: {\n label: \"创建时间\"\n },\n updated_at: {\n label: \"更新时间\"\n }\n }\n }\n};\n","// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\n/**\n * Auto-generated by 'os i18n extract' for locale 'ja-JP'.\n * Edit translations in place; re-run extract (with --merge) to fill new gaps.\n * Do not hand-edit the structure — only the leaf string values.\n */\n\nimport type { TranslationData } from '@objectstack/spec/system';\n\nexport const jaJPObjects: NonNullable<TranslationData['objects']> = {\n sys_audit_log: {\n label: \"監査ログ\",\n pluralLabel: \"監査ログ\",\n description: \"プラットフォームイベントの不変の監査証跡\",\n fields: {\n created_at: {\n label: \"タイムスタンプ\"\n },\n action: {\n label: \"アクション\",\n help: \"アクションタイプ(snake_case)\",\n options: {\n create: \"作成\",\n update: \"更新\",\n delete: \"削除\",\n restore: \"復元\",\n login: \"ログイン\",\n logout: \"ログアウト\",\n permission_change: \"権限変更\",\n config_change: \"構成変更\",\n export: \"エクスポート\",\n import: \"インポート\"\n }\n },\n user_id: {\n label: \"操作者\",\n help: \"アクションを実行したユーザー(システム操作の場合は null)\"\n },\n object_name: {\n label: \"オブジェクト\",\n help: \"対象オブジェクト(例: sys_user、project_task)\"\n },\n record_id: {\n label: \"レコード ID\",\n help: \"影響を受けたレコードの ID\"\n },\n old_value: {\n label: \"変更前の値\",\n help: \"JSON シリアライズされた以前の状態\"\n },\n new_value: {\n label: \"変更後の値\",\n help: \"JSON シリアライズされた新しい状態\"\n },\n ip_address: {\n label: \"IP アドレス\"\n },\n user_agent: {\n label: \"ユーザーエージェント\"\n },\n tenant_id: {\n label: \"テナント\",\n help: \"マルチテナント分離のためのテナントコンテキスト\"\n },\n metadata: {\n label: \"メタデータ\",\n help: \"JSON シリアライズされた追加コンテキスト\"\n },\n id: {\n label: \"監査ログ ID\"\n }\n },\n _views: {\n recent: {\n label: \"最近\"\n },\n writes_only: {\n label: \"書き込み\"\n },\n auth_events: {\n label: \"認証\"\n },\n config_changes: {\n label: \"構成変更\"\n },\n all_events: {\n label: \"すべて\"\n }\n }\n },\n sys_activity: {\n label: \"アクティビティ\",\n pluralLabel: \"アクティビティ\",\n description: \"最近のアクティビティストリームエントリ(軽量、非正規化)\",\n fields: {\n id: {\n label: \"アクティビティ ID\"\n },\n timestamp: {\n label: \"タイムスタンプ\"\n },\n type: {\n label: \"タイプ\",\n options: {\n created: \"作成\",\n updated: \"更新\",\n deleted: \"削除\",\n commented: \"コメント\",\n mentioned: \"メンション\",\n shared: \"共有\",\n assigned: \"割り当て\",\n completed: \"完了\",\n login: \"ログイン\",\n logout: \"ログアウト\",\n system: \"システム\"\n }\n },\n summary: {\n label: \"サマリー\",\n help: \"判別しやすい 1 行サマリー\"\n },\n actor_id: {\n label: \"操作者\"\n },\n actor_name: {\n label: \"操作者名\"\n },\n actor_avatar_url: {\n label: \"操作者アバター\"\n },\n object_name: {\n label: \"オブジェクト\",\n help: \"対象オブジェクトの短い名前(例: account、sys_user)\"\n },\n record_id: {\n label: \"レコード ID\"\n },\n record_label: {\n label: \"レコード表示名\",\n help: \"書き込み時点の対象レコードの表示名\"\n },\n url: {\n label: \"URL\",\n help: \"アクティビティターゲットへのオプションのディープリンク\"\n },\n environment_id: {\n label: \"プロジェクト\",\n help: \"プロジェクトコンテキスト(マルチプロジェクトデプロイメント)\"\n },\n metadata: {\n label: \"メタデータ\",\n help: \"JSON シリアライズされた追加コンテキスト\"\n }\n }\n },\n sys_comment: {\n label: \"コメント\",\n pluralLabel: \"コメント\",\n description: \"thread_id を介してレコードに添付されたスレッドコメント\",\n fields: {\n id: {\n label: \"コメント ID\"\n },\n thread_id: {\n label: \"スレッド\",\n help: \"スレッド識別子 — 通常は `{object}:{record_id}`(例: `sys_user:abc123`)\"\n },\n parent_id: {\n label: \"親コメント\",\n help: \"ネストした返信用のオプションの親コメント\"\n },\n reply_count: {\n label: \"返信数\"\n },\n author_id: {\n label: \"投稿者\"\n },\n author_name: {\n label: \"投稿者名\"\n },\n author_avatar_url: {\n label: \"投稿者アバター\"\n },\n body: {\n label: \"本文\",\n help: \"コメントテキスト(Markdown 対応)\"\n },\n mentions: {\n label: \"メンション\",\n help: \"@メンションオブジェクトの JSON 配列\"\n },\n reactions: {\n label: \"リアクション\",\n help: \"絵文字リアクションオブジェクトの JSON 配列\"\n },\n is_edited: {\n label: \"編集済み\"\n },\n edited_at: {\n label: \"編集日時\"\n },\n visibility: {\n label: \"公開範囲\",\n options: {\n public: \"公開\",\n internal: \"内部\",\n private: \"非公開\"\n }\n },\n created_at: {\n label: \"作成日時\"\n },\n updated_at: {\n label: \"更新日時\"\n }\n }\n }\n};\n","// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\n/**\n * Auto-generated by 'os i18n extract' for locale 'es-ES'.\n * Edit translations in place; re-run extract (with --merge) to fill new gaps.\n * Do not hand-edit the structure — only the leaf string values.\n */\n\nimport type { TranslationData } from '@objectstack/spec/system';\n\nexport const esESObjects: NonNullable<TranslationData['objects']> = {\n sys_audit_log: {\n label: \"Registro de auditoría\",\n pluralLabel: \"Registros de auditoría\",\n description: \"Registro de auditoría inmutable para eventos de la plataforma\",\n fields: {\n created_at: {\n label: \"Marca temporal\"\n },\n action: {\n label: \"Acción\",\n help: \"Tipo de acción (snake_case).\",\n options: {\n create: \"Crear\",\n update: \"Actualizar\",\n delete: \"Eliminar\",\n restore: \"Restaurar\",\n login: \"Inicio de sesión\",\n logout: \"Cierre de sesión\",\n permission_change: \"Cambio de permisos\",\n config_change: \"Cambio de configuración\",\n export: \"Exportar\",\n import: \"Importar\"\n }\n },\n user_id: {\n label: \"Actor\",\n help: \"Usuario que realizó la acción (null para acciones del sistema).\"\n },\n object_name: {\n label: \"Objeto\",\n help: \"Objeto de destino (p. ej. sys_user, project_task).\"\n },\n record_id: {\n label: \"ID de registro\",\n help: \"ID del registro afectado.\"\n },\n old_value: {\n label: \"Valor anterior\",\n help: \"Estado anterior serializado en JSON.\"\n },\n new_value: {\n label: \"Valor nuevo\",\n help: \"Estado nuevo serializado en JSON.\"\n },\n ip_address: {\n label: \"Dirección IP\"\n },\n user_agent: {\n label: \"Agente de usuario\"\n },\n tenant_id: {\n label: \"Inquilino\",\n help: \"Contexto del tenant para el aislamiento multi-tenant.\"\n },\n metadata: {\n label: \"Metadatos\",\n help: \"Contexto adicional serializado en JSON.\"\n },\n id: {\n label: \"ID de registro de auditoría\"\n }\n },\n _views: {\n recent: {\n label: \"Recientes\"\n },\n writes_only: {\n label: \"Escrituras\"\n },\n auth_events: {\n label: \"Autenticación\"\n },\n config_changes: {\n label: \"Configuración\"\n },\n all_events: {\n label: \"Todos\"\n }\n }\n },\n sys_activity: {\n label: \"Actividad\",\n pluralLabel: \"Actividades\",\n description: \"Entradas recientes del flujo de actividad (ligeras y desnormalizadas).\",\n fields: {\n id: {\n label: \"ID de actividad\"\n },\n timestamp: {\n label: \"Marca temporal\"\n },\n type: {\n label: \"Tipo\",\n options: {\n created: \"Creado\",\n updated: \"Actualizado\",\n deleted: \"Eliminado\",\n commented: \"Comentado\",\n mentioned: \"Mencionado\",\n shared: \"Compartido\",\n assigned: \"Asignado\",\n completed: \"Completado\",\n login: \"Inicio de sesión\",\n logout: \"Cierre de sesión\",\n system: \"Sistema\"\n }\n },\n summary: {\n label: \"Resumen\",\n help: \"Resumen legible de una línea.\"\n },\n actor_id: {\n label: \"Actor\"\n },\n actor_name: {\n label: \"Nombre del actor\"\n },\n actor_avatar_url: {\n label: \"Avatar del actor\"\n },\n object_name: {\n label: \"Objeto\",\n help: \"Nombre corto del objeto de destino (p. ej. account, sys_user).\"\n },\n record_id: {\n label: \"ID de registro\"\n },\n record_label: {\n label: \"Nombre visible del registro\",\n help: \"Nombre visible del registro de destino en el momento de escritura.\"\n },\n url: {\n label: \"URL\",\n help: \"Enlace profundo opcional al destino de la actividad.\"\n },\n environment_id: {\n label: \"Proyecto\",\n help: \"Contexto del proyecto (implementaciones multiproyecto).\"\n },\n metadata: {\n label: \"Metadatos\",\n help: \"Contexto adicional serializado en JSON.\"\n }\n }\n },\n sys_comment: {\n label: \"Comentario\",\n pluralLabel: \"Comentarios\",\n description: \"Comentarios en hilo adjuntos a registros mediante thread_id.\",\n fields: {\n id: {\n label: \"ID de comentario\"\n },\n thread_id: {\n label: \"Hilo\",\n help: \"Identificador del hilo; por convención `{object}:{record_id}` (p. ej. `sys_user:abc123`).\"\n },\n parent_id: {\n label: \"Comentario principal\",\n help: \"Comentario principal opcional para respuestas anidadas.\"\n },\n reply_count: {\n label: \"Número de respuestas\"\n },\n author_id: {\n label: \"Autor\"\n },\n author_name: {\n label: \"Nombre del autor\"\n },\n author_avatar_url: {\n label: \"Avatar del autor\"\n },\n body: {\n label: \"Contenido\",\n help: \"Texto del comentario (compatible con Markdown).\"\n },\n mentions: {\n label: \"Menciones\",\n help: \"Matriz JSON de objetos @mention.\"\n },\n reactions: {\n label: \"Reacciones\",\n help: \"Matriz JSON de objetos de reacción emoji.\"\n },\n is_edited: {\n label: \"Editado\"\n },\n edited_at: {\n label: \"Editado el\"\n },\n visibility: {\n label: \"Visibilidad\",\n options: {\n public: \"Público\",\n internal: \"Interno\",\n private: \"Privado\"\n }\n },\n created_at: {\n label: \"Creado el\"\n },\n updated_at: {\n label: \"Actualizado el\"\n }\n }\n }\n};\n","// Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license.\n\n/**\n * AuditTranslations — i18n bundle owned by this plugin (ADR-0029 D8).\n *\n * Object label/field/view/action translations for the sys_* objects this\n * plugin owns (sys_audit_log / sys_activity / sys_comment / sys_attachment).\n * Loaded at runtime via the plugin's `kernel:ready` hook\n * (`i18n.loadTranslations`). Regenerate with `os i18n extract` against\n * `scripts/i18n-extract.config.ts`.\n */\n\nimport type { TranslationBundle } from '@objectstack/spec/system';\nimport { enObjects } from './en.objects.generated.js';\nimport { zhCNObjects } from './zh-CN.objects.generated.js';\nimport { jaJPObjects } from './ja-JP.objects.generated.js';\nimport { esESObjects } from './es-ES.objects.generated.js';\n\nexport const AuditTranslations: TranslationBundle = {\n en: { objects: enObjects },\n 'zh-CN': { objects: zhCNObjects },\n 'ja-JP': { objects: jaJPObjects },\n 'es-ES': { objects: esESObjects },\n};\n","// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\n/**\n * @objectstack/plugin-audit\n *\n * Audit Plugin for ObjectStack\n * Provides the sys_audit_log system object definition for immutable audit trails.\n */\n\nexport { AuditPlugin } from './audit-plugin.js';\nexport { installAuditWriters } from './audit-writers.js';\n","// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport { ObjectSchema, Field } from '@objectstack/spec/data';\n\n/**\n * sys_audit_log — System Audit Log Object\n *\n * Immutable audit trail for all significant platform events.\n * Records who did what, when, and the before/after state.\n *\n * Every field is `readonly: true` — audit logs are written only by\n * internal system hooks, never via UI forms. API exposes only `get` + `list`.\n *\n * @namespace sys\n */\nexport const SysAuditLog = ObjectSchema.create({\n name: 'sys_audit_log',\n label: 'Audit Log',\n pluralLabel: 'Audit Logs',\n icon: 'scroll-text',\n isSystem: true,\n managedBy: 'append-only',\n description: 'Immutable audit trail for platform events',\n displayNameField: 'action',\n titleFormat: '{action} · {object_name}',\n compactLayout: ['created_at', 'action', 'object_name', 'record_id', 'user_id'],\n\n listViews: {\n recent: {\n type: 'grid',\n name: 'recent',\n label: 'Recent',\n data: { provider: 'object', object: 'sys_audit_log' },\n columns: ['created_at', 'action', 'object_name', 'record_id', 'user_id'],\n sort: [{ field: 'created_at', order: 'desc' }],\n pagination: { pageSize: 50 },\n emptyState: { title: 'No audit events', message: 'Activity will appear here as users interact with the platform.' },\n },\n writes_only: {\n type: 'grid',\n name: 'writes_only',\n label: 'Writes',\n data: { provider: 'object', object: 'sys_audit_log' },\n columns: ['created_at', 'action', 'object_name', 'record_id', 'user_id'],\n filter: [{ field: 'action', operator: 'in', value: ['create', 'update', 'delete', 'restore'] }],\n sort: [{ field: 'created_at', order: 'desc' }],\n pagination: { pageSize: 50 },\n },\n auth_events: {\n type: 'grid',\n name: 'auth_events',\n label: 'Auth',\n data: { provider: 'object', object: 'sys_audit_log' },\n columns: ['created_at', 'action', 'user_id'],\n filter: [{ field: 'action', operator: 'in', value: ['login', 'logout', 'permission_change'] }],\n sort: [{ field: 'created_at', order: 'desc' }],\n pagination: { pageSize: 50 },\n },\n config_changes: {\n type: 'grid',\n name: 'config_changes',\n label: 'Config',\n data: { provider: 'object', object: 'sys_audit_log' },\n columns: ['created_at', 'action', 'object_name', 'user_id'],\n filter: [{ field: 'action', operator: 'in', value: ['config_change', 'export', 'import'] }],\n sort: [{ field: 'created_at', order: 'desc' }],\n pagination: { pageSize: 50 },\n },\n all_events: {\n type: 'grid',\n name: 'all_events',\n label: 'All',\n data: { provider: 'object', object: 'sys_audit_log' },\n columns: ['created_at', 'action', 'object_name', 'record_id', 'user_id'],\n sort: [{ field: 'created_at', order: 'desc' }],\n pagination: { pageSize: 100 },\n },\n },\n\n fields: {\n // ── Event ────────────────────────────────────────────────────\n created_at: Field.datetime({\n label: 'Timestamp',\n required: true,\n defaultValue: 'NOW()',\n readonly: true,\n group: 'Event',\n }),\n\n action: Field.select(\n ['create', 'update', 'delete', 'restore', 'login', 'logout', 'permission_change', 'config_change', 'export', 'import'],\n {\n label: 'Action',\n required: true,\n readonly: true,\n searchable: true,\n description: 'Action type (snake_case)',\n group: 'Event',\n },\n ),\n\n user_id: Field.lookup('sys_user', {\n label: 'Actor',\n required: false,\n readonly: true,\n searchable: true,\n description: 'User who performed the action (null for system actions)',\n group: 'Event',\n }),\n\n // ── Target record ────────────────────────────────────────────\n object_name: Field.text({\n label: 'Object',\n required: false,\n readonly: true,\n searchable: true,\n maxLength: 255,\n description: 'Target object (e.g. sys_user, project_task)',\n group: 'Target',\n }),\n\n record_id: Field.text({\n label: 'Record ID',\n required: false,\n readonly: true,\n searchable: true,\n description: 'ID of the affected record',\n group: 'Target',\n }),\n\n // ── Change payload ───────────────────────────────────────────\n old_value: Field.textarea({\n label: 'Old Value',\n required: false,\n readonly: true,\n description: 'JSON-serialized previous state',\n group: 'Changes',\n }),\n\n new_value: Field.textarea({\n label: 'New Value',\n required: false,\n readonly: true,\n description: 'JSON-serialized new state',\n group: 'Changes',\n }),\n\n // ── Client fingerprint ───────────────────────────────────────\n ip_address: Field.text({\n label: 'IP Address',\n required: false,\n readonly: true,\n maxLength: 45,\n group: 'Client',\n }),\n\n user_agent: Field.textarea({\n label: 'User Agent',\n required: false,\n readonly: true,\n group: 'Client',\n }),\n\n // ── Context ──────────────────────────────────────────────────\n tenant_id: Field.lookup('sys_organization', {\n label: 'Tenant',\n required: false,\n readonly: true,\n description: 'Tenant context for multi-tenant isolation',\n group: 'Context',\n }),\n\n metadata: Field.textarea({\n label: 'Metadata',\n required: false,\n readonly: true,\n description: 'JSON-serialized additional context',\n group: 'Context',\n }),\n\n // ── System ───────────────────────────────────────────────────\n id: Field.text({\n label: 'Audit Log ID',\n required: true,\n readonly: true,\n group: 'System',\n }),\n },\n\n indexes: [\n { fields: ['created_at'] },\n { fields: ['user_id'] },\n { fields: ['object_name', 'record_id'] },\n { fields: ['action'] },\n { fields: ['tenant_id'] },\n ],\n\n enable: {\n trackHistory: false, // Audit logs are themselves the audit trail\n searchable: true,\n apiEnabled: true,\n apiMethods: ['get', 'list'], // Read-only — creation happens via internal system hooks only\n trash: false, // Never soft-delete audit logs\n mru: false,\n clone: false,\n },\n});\n","// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport { ObjectSchema, Field } from '@objectstack/spec/data';\n\n/**\n * sys_activity — Lightweight Activity Stream\n *\n * Append-only \"recent activity\" feed shown on dashboards / overview\n * pages. Distinct from `sys_audit_log` (compliance-grade, structured\n * before/after diffs) and `feed_item` (record-scoped Chatter timeline\n * with comments/reactions/threads). Activity entries are denormalized\n * snapshots optimized for chronological \"what happened lately\" reads.\n *\n * Typical write sources: data triggers, plugin events, UI actions.\n * Typical readers: Studio dashboard, mobile inbox, notification jobs.\n *\n * @namespace sys\n */\nexport const SysActivity = ObjectSchema.create({\n name: 'sys_activity',\n label: 'Activity',\n pluralLabel: 'Activities',\n icon: 'activity',\n isSystem: true,\n managedBy: 'append-only',\n description: 'Recent activity stream entries (lightweight, denormalized)',\n displayNameField: 'summary',\n titleFormat: '{type} · {summary}',\n compactLayout: ['timestamp', 'type', 'actor_name', 'summary'],\n\n fields: {\n id: Field.text({\n label: 'Activity ID',\n required: true,\n readonly: true,\n group: 'System',\n }),\n\n timestamp: Field.datetime({\n label: 'Timestamp',\n required: true,\n defaultValue: 'NOW()',\n readonly: true,\n group: 'Event',\n }),\n\n type: Field.select(\n [\n 'created',\n 'updated',\n 'deleted',\n 'commented',\n 'mentioned',\n 'shared',\n 'assigned',\n 'completed',\n 'login',\n 'logout',\n 'system',\n ],\n {\n label: 'Type',\n required: true,\n readonly: true,\n searchable: true,\n group: 'Event',\n },\n ),\n\n summary: Field.text({\n label: 'Summary',\n required: true,\n readonly: true,\n maxLength: 500,\n searchable: true,\n description: 'Human-readable one-line summary',\n group: 'Event',\n }),\n\n // ── Actor ───────────────────────────────────────────────────\n actor_id: Field.lookup('sys_user', {\n label: 'Actor',\n required: false,\n readonly: true,\n searchable: true,\n group: 'Actor',\n }),\n\n actor_name: Field.text({\n label: 'Actor Name',\n required: false,\n readonly: true,\n group: 'Actor',\n }),\n\n actor_avatar_url: Field.url({\n label: 'Actor Avatar',\n required: false,\n readonly: true,\n group: 'Actor',\n }),\n\n // ── Target ───────────────────────────────────────────────────\n object_name: Field.text({\n label: 'Object',\n required: false,\n readonly: true,\n searchable: true,\n maxLength: 255,\n description: 'Target object short name (e.g. account, sys_user)',\n group: 'Target',\n }),\n\n record_id: Field.text({\n label: 'Record ID',\n required: false,\n readonly: true,\n searchable: true,\n group: 'Target',\n }),\n\n record_label: Field.text({\n label: 'Record Label',\n required: false,\n readonly: true,\n maxLength: 255,\n description: 'Display label of the target record at write time',\n group: 'Target',\n }),\n\n url: Field.url({\n label: 'URL',\n required: false,\n readonly: true,\n description: 'Optional deep-link to the activity target',\n group: 'Target',\n }),\n\n // ── Context ──────────────────────────────────────────────────\n environment_id: Field.lookup('sys_environment', {\n label: 'Environment',\n required: false,\n readonly: true,\n searchable: true,\n description: 'Environment context (multi-environment deployments)',\n group: 'Context',\n }),\n\n metadata: Field.textarea({\n label: 'Metadata',\n required: false,\n readonly: true,\n description: 'JSON-serialized additional context',\n group: 'Context',\n }),\n },\n\n indexes: [\n { fields: ['timestamp'] },\n { fields: ['actor_id'] },\n { fields: ['object_name', 'record_id'] },\n { fields: ['type'] },\n { fields: ['environment_id'] },\n ],\n\n enable: {\n trackHistory: false,\n searchable: true,\n apiEnabled: true,\n apiMethods: ['get', 'list'],\n trash: false,\n mru: false,\n clone: false,\n },\n});\n","// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport { ObjectSchema, Field } from '@objectstack/spec/data';\n\n/**\n * sys_comment — Threaded Record Comments\n *\n * Generic threaded discussion attached to any record via `thread_id`.\n * `thread_id` is conventionally formatted as `{object}:{record_id}`\n * (e.g. `sys_user:abc123`, `account:9001`) so a single index covers\n * \"all comments on this record\" lookups across every object.\n *\n * Distinct from `feed_item` (Salesforce-style Chatter timeline that\n * mixes comments with field changes / events / approvals). Use\n * `sys_comment` when you want a focused threaded discussion surface\n * without the heavier Chatter envelope.\n *\n * @namespace sys\n */\nexport const SysComment = ObjectSchema.create({\n name: 'sys_comment',\n label: 'Comment',\n pluralLabel: 'Comments',\n icon: 'message-square',\n isSystem: true,\n managedBy: 'platform',\n description: 'Threaded comments attached to records via thread_id',\n displayNameField: 'body',\n titleFormat: '{author_name}: {body}',\n compactLayout: ['created_at', 'author_name', 'body'],\n\n fields: {\n id: Field.text({\n label: 'Comment ID',\n required: true,\n readonly: true,\n group: 'System',\n }),\n\n // ── Thread ───────────────────────────────────────────────────\n thread_id: Field.text({\n label: 'Thread',\n required: true,\n searchable: true,\n maxLength: 255,\n description:\n 'Thread identifier — conventionally `{object}:{record_id}` (e.g. `sys_user:abc123`)',\n group: 'Thread',\n }),\n\n parent_id: Field.lookup('sys_comment', {\n label: 'Parent Comment',\n required: false,\n description: 'Optional parent comment for nested replies',\n group: 'Thread',\n }),\n\n reply_count: Field.number({\n label: 'Reply Count',\n defaultValue: 0,\n readonly: true,\n group: 'Thread',\n }),\n\n // ── Author ───────────────────────────────────────────────────\n author_id: Field.lookup('sys_user', {\n label: 'Author',\n required: true,\n searchable: true,\n group: 'Author',\n }),\n\n author_name: Field.text({\n label: 'Author Name',\n required: false,\n group: 'Author',\n }),\n\n author_avatar_url: Field.url({\n label: 'Author Avatar',\n required: false,\n group: 'Author',\n }),\n\n // ── Body ─────────────────────────────────────────────────────\n body: Field.textarea({\n label: 'Body',\n required: true,\n searchable: true,\n description: 'Comment text (Markdown supported)',\n group: 'Body',\n }),\n\n mentions: Field.textarea({\n label: 'Mentions',\n required: false,\n description: 'JSON array of @mention objects',\n group: 'Body',\n }),\n\n reactions: Field.textarea({\n label: 'Reactions',\n required: false,\n description: 'JSON array of emoji reaction objects',\n group: 'Body',\n }),\n\n // ── Lifecycle ────────────────────────────────────────────────\n is_edited: Field.boolean({\n label: 'Edited',\n defaultValue: false,\n group: 'Lifecycle',\n }),\n\n edited_at: Field.datetime({\n label: 'Edited At',\n required: false,\n group: 'Lifecycle',\n }),\n\n visibility: Field.select(\n ['public', 'internal', 'private'],\n {\n label: 'Visibility',\n defaultValue: 'public',\n group: 'Lifecycle',\n },\n ),\n\n created_at: Field.datetime({\n label: 'Created At',\n required: true,\n defaultValue: 'NOW()',\n readonly: true,\n group: 'System',\n }),\n\n updated_at: Field.datetime({\n label: 'Updated At',\n required: false,\n group: 'System',\n }),\n },\n\n indexes: [\n { fields: ['thread_id', 'created_at'] },\n { fields: ['parent_id'] },\n { fields: ['author_id'] },\n ],\n\n enable: {\n trackHistory: true,\n searchable: true,\n apiEnabled: true,\n trash: true,\n mru: false,\n clone: false,\n },\n});\n","// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport type { Plugin, PluginContext } from '@objectstack/core';\nimport type { IDataEngine } from '@objectstack/spec/contracts';\nimport { SysAuditLog, SysActivity, SysComment } from './objects/index.js';\n// Registered here but still owned by platform-objects (the plugin contributes\n// them to the kernel without owning the definition yet):\n// - sys_notification — reworked by ADR-0030 messaging (notification→event).\n// - sys_attachment — a file↔record link belonging with service-storage's\n// sys_file; moves in the storage-domain decomposition, not this audit move.\nimport { SysNotification, SysAttachment } from '@objectstack/platform-objects/audit';\nimport { installAuditWriters, type MessagingEmitSurface } from './audit-writers.js';\n\n/**\n * AuditPlugin\n *\n * Registers the sys_audit_log / sys_activity / sys_comment system objects\n * and installs ObjectQL hook subscribers that automatically write audit\n * trail + activity stream rows on every data mutation.\n *\n * Implements ROADMAP M10.1 (CRM production-readiness).\n */\nexport class AuditPlugin implements Plugin {\n name = 'com.objectstack.audit';\n type = 'standard';\n version = '1.0.0';\n dependencies = ['com.objectstack.engine.objectql'];\n\n async init(ctx: PluginContext): Promise<void> {\n process.stderr.write('[AuditPlugin] init() called\\n');\n // Register audit system objects via the manifest service.\n ctx.getService<{ register(m: any): void }>('manifest').register({\n id: 'com.objectstack.audit',\n name: 'Audit',\n version: '1.0.0',\n type: 'plugin',\n scope: 'system',\n defaultDatasource: 'cloud',\n namespace: 'sys',\n objects: [SysAuditLog, SysActivity, SysComment, SysAttachment, SysNotification],\n // ADR-0029 D7 — contribute the Audit Logs entry into the Setup app's\n // `group_diagnostics` slot. The plugin owns sys_audit_log (K2).\n navigationContributions: [\n {\n app: 'setup',\n group: 'group_diagnostics',\n priority: 100,\n items: [\n { id: 'nav_audit_logs', type: 'object', label: 'Audit Logs', objectName: 'sys_audit_log', icon: 'scroll-text' },\n ],\n },\n ],\n });\n\n // ADR-0029 D8 — contribute this plugin's object translations to the i18n\n // service on kernel:ready (the i18n plugin may register after this one).\n if (typeof (ctx as any).hook === 'function') {\n (ctx as any).hook('kernel:ready', async () => {\n try {\n const i18n = ctx.getService<any>('i18n');\n if (i18n && typeof i18n.loadTranslations === 'function') {\n const { AuditTranslations } = await import('./translations/index.js');\n for (const [locale, data] of Object.entries(AuditTranslations)) {\n i18n.loadTranslations(locale, data as Record<string, unknown>);\n }\n }\n } catch { /* i18n optional */ }\n });\n }\n\n ctx.logger.info('Audit Plugin initialized');\n }\n\n async start(ctx: PluginContext): Promise<void> {\n process.stderr.write('[AuditPlugin] start() called, registering kernel:ready hook\\n');\n // ObjectQL engine is only resolvable after the kernel is ready.\n ctx.hook('kernel:ready', async () => {\n process.stderr.write('[AuditPlugin] kernel:ready fired\\n');\n let engine: IDataEngine | null = null;\n try {\n engine = ctx.getService<IDataEngine>('objectql');\n process.stderr.write(`[AuditPlugin] objectql engine = ${engine ? 'OK' : 'null'} registerHook? ${typeof (engine as any)?.registerHook}\\n`);\n } catch (err) {\n process.stderr.write(`[AuditPlugin] getService(objectql) threw: ${(err as Error).message}\\n`);\n // Fallback alias used in some kernels.\n try {\n engine = ctx.getService<IDataEngine>('data');\n process.stderr.write(`[AuditPlugin] data engine = ${engine ? 'OK' : 'null'}\\n`);\n } catch { /* ignore */ }\n }\n if (!engine) {\n process.stderr.write('[AuditPlugin] NO ENGINE — bailing\\n');\n ctx.logger.warn('AuditPlugin: ObjectQL engine not available — audit writers NOT installed');\n return;\n }\n // Resolve the messaging service lazily at hook time so collaboration\n // @mention / assignment notifications go through the ADR-0030 single\n // ingress (emit) instead of writing sys_notification directly. Messaging\n // may register after audit; lazy resolution tolerates either order.\n const getMessaging = (): MessagingEmitSurface | undefined => {\n try {\n return ctx.getService<MessagingEmitSurface>('messaging');\n } catch {\n return undefined;\n }\n };\n installAuditWriters(engine as any, this.name, { getMessaging });\n process.stderr.write('[AuditPlugin] writers installed\\n');\n ctx.logger.info('AuditPlugin: audit + activity writers installed');\n });\n }\n}\n","// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport type { HookContext } from '@objectstack/spec/data';\nimport type { IDataEngine } from '@objectstack/spec/contracts';\n\n/**\n * Minimal structural view of `NotificationService.emit` (ADR-0030). Declared\n * locally so plugin-audit takes no runtime dependency on service-messaging — it\n * resolves whatever object is registered under the `messaging` service at hook\n * time and routes collaboration notifications through the single ingress.\n */\nexport interface MessagingEmitSurface {\n emit(input: {\n topic: string;\n audience: string[];\n payload?: Record<string, unknown>;\n severity?: 'info' | 'warning' | 'critical';\n dedupKey?: string;\n source?: { object: string; id: string };\n actorId?: string;\n organizationId?: string;\n }): Promise<unknown>;\n}\n\n/** Options for {@link installAuditWriters}. */\nexport interface AuditWriterOptions {\n /**\n * Lazily resolve the messaging service so collaboration `@mention` /\n * assignment notifications go through the ADR-0030 single ingress rather than\n * writing `sys_notification` directly. Returns `undefined` when messaging is\n * not installed — those notifications are then skipped (no pipeline, no bell),\n * matching the `notify` node's degradation.\n */\n getMessaging?(): MessagingEmitSurface | undefined;\n}\n\n/**\n * Audit writer hook installer.\n *\n * Subscribes to the ObjectQL engine's wildcard `before*` / `after*` lifecycle\n * events and writes:\n *\n * - `sys_audit_log` rows — immutable, compliance-grade entries with\n * field-level `old_value` / `new_value` diffs.\n * - `sys_activity` rows — denormalized, human-readable summaries shown\n * in the dashboard recent-activity feed and per-record timelines.\n *\n * Skip rules avoid recursion and noise:\n * - Never audit the audit/activity tables themselves.\n * - Never audit session/presence/auth tables (high-frequency, low value).\n * - Read-only operations (`afterFind`) are never audited.\n *\n * All writes go through `ctx.api.sudo()` so they bypass record-level\n * permissions and always succeed regardless of the calling user's RBAC.\n */\n\n/** Tables that are intentionally excluded from audit/activity writes. */\nconst SKIP_OBJECTS = new Set<string>([\n 'sys_audit_log',\n 'sys_activity',\n 'sys_comment',\n 'sys_session',\n 'sys_presence',\n 'sys_account',\n 'sys_account_session',\n 'sys_account_verification',\n 'sys_account_account',\n]);\n\n/** Fields that are noise in diffs (always change, never user-meaningful). */\nconst NOISE_FIELDS = new Set<string>([\n 'updated_at',\n 'updated_by',\n 'created_at',\n 'created_by',\n]);\n\n/** Action name produced from a HookContext.event string. */\nfunction actionFor(event: string): 'create' | 'update' | 'delete' | null {\n if (event === 'afterInsert') return 'create';\n if (event === 'afterUpdate') return 'update';\n if (event === 'afterDelete') return 'delete';\n return null;\n}\n\n/** Activity type produced from an audit action. */\nfunction activityTypeFor(action: 'create' | 'update' | 'delete'): 'created' | 'updated' | 'deleted' {\n return action === 'create' ? 'created' : action === 'update' ? 'updated' : 'deleted';\n}\n\n/**\n * Compute the human-readable record label from a record by trying common\n * label fields. Falls back to record id.\n */\nfunction recordLabel(record: any, id: string): string {\n if (!record || typeof record !== 'object') return id;\n const candidates = ['name', 'subject', 'title', 'full_name', 'label', 'first_name', 'company', 'email'];\n for (const k of candidates) {\n const v = record[k];\n if (typeof v === 'string' && v.trim()) return v.trim();\n }\n return id;\n}\n\n/**\n * Compute a shallow JSON diff between two records. Returns only keys whose\n * value changed (and ignores keys in `NOISE_FIELDS`). Both sides are\n * serialisable via `JSON.stringify` — values that fail to serialise are\n * coerced to `String(value)`.\n */\nfunction diff(before: Record<string, any>, after: Record<string, any>): { old: Record<string, any>; next: Record<string, any> } {\n const oldOut: Record<string, any> = {};\n const newOut: Record<string, any> = {};\n const keys = new Set<string>([...Object.keys(before || {}), ...Object.keys(after || {})]);\n for (const k of keys) {\n if (NOISE_FIELDS.has(k)) continue;\n const b = before?.[k];\n const a = after?.[k];\n if (safeStringify(b) !== safeStringify(a)) {\n oldOut[k] = b ?? null;\n newOut[k] = a ?? null;\n }\n }\n return { old: oldOut, next: newOut };\n}\n\nfunction safeStringify(v: any): string {\n try { return JSON.stringify(v); } catch { return String(v); }\n}\n\n/**\n * Install audit + activity writers on the given engine. Idempotent per\n * `packageId` — calling twice with the same id replaces the previous\n * registration.\n */\nexport function installAuditWriters(\n engine: any,\n packageId = 'com.objectstack.audit',\n opts: AuditWriterOptions = {},\n): void {\n if (!engine || typeof engine.registerHook !== 'function') return;\n\n const getMessaging = opts.getMessaging ?? (() => undefined);\n\n // Remove any prior installation so we can safely re-install on hot reload.\n if (typeof engine.unregisterHooksByPackage === 'function') {\n engine.unregisterHooksByPackage(packageId);\n }\n\n // Whether a given object's *registered* schema declares a field. The\n // SchemaRegistry auto-injects `organization_id` only in multi-tenant mode\n // (`applySystemFields({ multiTenant })`), so on single-tenant stacks the\n // `sys_audit_log` / `sys_activity` tables have no `organization_id` column.\n // Unconditionally stamping it there made every audit INSERT fail with\n // \"table sys_audit_log has no column named organization_id\" (the error was\n // swallowed, so audit logging was silently non-functional). Resolve the\n // field set lazily from the engine schema and cache it — object schemas are\n // static after registration.\n const fieldSetCache = new Map<string, Set<string> | null>();\n const objectHasField = (objectName: string, field: string): boolean => {\n let set = fieldSetCache.get(objectName);\n if (set === undefined) {\n set = null;\n try {\n const schema: any =\n typeof (engine as any).getSchema === 'function' ? (engine as any).getSchema(objectName) : null;\n const fields = schema?.fields;\n if (fields && typeof fields === 'object' && !Array.isArray(fields)) {\n set = new Set<string>(Object.keys(fields));\n } else if (Array.isArray(fields)) {\n set = new Set<string>(fields.map((f: any) => f?.name).filter(Boolean));\n }\n } catch {\n /* ignore — best-effort; absence just means we skip the stamp */\n }\n fieldSetCache.set(objectName, set);\n }\n return set != null && set.has(field);\n };\n\n /**\n * beforeUpdate / beforeDelete: capture \"previous\" snapshot via api.sudo()\n * so we can compute the diff in the afterXxx hook. We attach the snapshot\n * to the context (`(ctx as any).__previous`) since `HookContext.previous`\n * is officially typed but not always populated by the engine itself.\n */\n const captureBefore = async (ctx: HookContext) => {\n if (SKIP_OBJECTS.has(ctx.object)) return;\n const id = (ctx.input as any)?.id;\n if (!id) return; // bulk update/delete — too costly to snapshot every row here\n try {\n // Use the engine directly (not api.sudo) so we can thread the\n // active transaction through. On drivers with single-connection\n // pools (e.g. SQLite via knex) a sudo() findOne that does NOT\n // carry the open transaction will deadlock for the full\n // acquireConnectionTimeout (~60s) because the outer transaction\n // holds the only connection.\n const trx = (ctx as any).transaction;\n const ql = (ctx as any).ql ?? (ctx as any).api?.engine;\n if (ql?.findOne) {\n const prev = await ql.findOne(ctx.object, {\n where: { id },\n context: { isSystem: true, ...(trx ? { transaction: trx } : {}) },\n });\n if (prev) (ctx as any).__previous = prev;\n return;\n }\n const api: any = (ctx as any).api;\n if (!api?.sudo) return;\n const prev = await api.sudo().object(ctx.object).findOne({ where: { id } });\n if (prev) (ctx as any).__previous = prev;\n } catch {\n /* ignore — best-effort */\n }\n };\n\n engine.registerHook('beforeUpdate', captureBefore, { packageId });\n engine.registerHook('beforeDelete', captureBefore, { packageId });\n\n /**\n * afterInsert / afterUpdate / afterDelete: write audit_log + activity rows.\n * Errors are swallowed (logged) so user-facing CRUD is never broken by\n * audit failures.\n */\n const writeAudit = async (ctx: HookContext) => {\n if (SKIP_OBJECTS.has(ctx.object)) return;\n const action = actionFor(ctx.event);\n if (!action) return;\n\n const api: any = (ctx as any).api;\n if (!api?.sudo) return;\n\n const after: any = ctx.result;\n const before: any = (ctx as any).__previous ?? (ctx as any).previous ?? null;\n\n // Resolve record id from after (insert/update) or before (delete) or input.\n let recordId: string | undefined =\n (typeof after === 'object' && after?.id) ||\n (typeof before === 'object' && before?.id) ||\n ((ctx.input as any)?.id);\n if (recordId !== undefined) recordId = String(recordId);\n\n const sess: any = (ctx as any).session ?? {};\n const userId: string | undefined = sess.userId;\n // Prefer the active session tenant, but fall back to the audited\n // record's own `organization_id`. This matters in two cases:\n // 1. Background jobs / unauthenticated sudo paths where the\n // session has no `tenantId` populated.\n // 2. better-auth's `activeOrganizationId` cache miss on first\n // requests after sign-in, before the active-org has been set\n // on the session row.\n // Without this fallback, audit rows are written with\n // `organization_id=NULL` and the SecurityPlugin's RLS predicate\n // (`organization_id = current_user.organization_id`) hides them\n // forever — making the audit log UI appear permanently empty even\n // though writes succeed.\n const recordOrgId: string | undefined =\n (typeof (ctx.result as any)?.organization_id === 'string' && (ctx.result as any).organization_id) ||\n (typeof ((ctx as any).__previous as any)?.organization_id === 'string' && ((ctx as any).__previous as any).organization_id) ||\n undefined;\n const tenantId: string | undefined = sess.tenantId ?? recordOrgId;\n\n let oldValue: Record<string, any> | null = null;\n let newValue: Record<string, any> | null = null;\n if (action === 'create') {\n newValue = (after && typeof after === 'object') ? { ...after } : null;\n } else if (action === 'update') {\n const d = diff(before || {}, after || {});\n oldValue = d.old;\n newValue = d.next;\n // If nothing meaningfully changed, skip the audit row to avoid noise.\n if (Object.keys(newValue).length === 0) return;\n } else if (action === 'delete') {\n oldValue = before && typeof before === 'object' ? { ...before } : null;\n }\n\n const auditRow: Record<string, any> = {\n action,\n user_id: userId ?? null,\n object_name: ctx.object,\n record_id: recordId ?? null,\n old_value: oldValue ? safeStringify(oldValue) : null,\n new_value: newValue ? safeStringify(newValue) : null,\n // `tenant_id` is the schema-declared \"tenant context\" lookup.\n tenant_id: tenantId ?? null,\n };\n // The platform-default `organization_id` column is what RLS gates on\n // (`organization_id = current_user.organization_id`). The audit writer\n // runs through `api.sudo()` which bypasses the SecurityPlugin's\n // auto-stamping of `organization_id`, so we stamp it explicitly here —\n // without it, non-admin members would see 0 rows on Setup dashboards\n // because RLS would deny every audit row as wrong-tenant. But the column\n // only exists in multi-tenant deployments (the SchemaRegistry auto-injects\n // it conditionally); stamping it on a single-tenant table that lacks the\n // column made every audit INSERT fail. Only stamp it when declared.\n if (objectHasField('sys_audit_log', 'organization_id')) {\n auditRow.organization_id = tenantId ?? null;\n }\n\n const label = recordLabel(after ?? before, recordId ?? '');\n const summary =\n action === 'create' ? `Created ${ctx.object} \"${label}\"` :\n action === 'update' ? `Updated ${ctx.object} \"${label}\"` :\n `Deleted ${ctx.object} \"${label}\"`;\n\n const activityRow: Record<string, any> = {\n type: activityTypeFor(action),\n // Explicit ISO timestamp — `defaultValue: 'NOW()'` on the column\n // isn't resolved by every driver and would otherwise leak the\n // literal string \"NOW()\" into the row.\n timestamp: new Date().toISOString(),\n summary,\n actor_id: userId ?? null,\n object_name: ctx.object,\n record_id: recordId ?? null,\n record_label: label,\n metadata: newValue || oldValue ? safeStringify({ old: oldValue, new: newValue }) : null,\n };\n // Same rationale as auditRow: stamp the tenant column so RLS matches the\n // recipient's organization on read — but only when the (auto-injected)\n // column actually exists, so single-tenant activity writes don't fail.\n if (objectHasField('sys_activity', 'organization_id')) {\n activityRow.organization_id = tenantId ?? null;\n }\n\n try {\n const sys = api.sudo();\n await sys.object('sys_audit_log').create(auditRow);\n await sys.object('sys_activity').create(activityRow);\n // M10.8 / ADR-0030: notify the assignee. Best-effort; never throws into\n // the user-facing CRUD path. Goes through the messaging single ingress\n // (`emit`) — the inbox channel materializes the bell row — rather than\n // writing `sys_notification` directly. If owner_id / assigned_to was\n // newly set (or changed to a different user) on a non-system record, the\n // recipient sees \"Lead X was assigned to you\" without polling.\n //\n // (Comment mentions are handled separately by the sys_comment hook below\n // since SKIP_OBJECTS excludes it from this writer.)\n await writeAssignmentNotifications(getMessaging(), {\n object: ctx.object,\n recordId: recordId ?? null,\n label,\n action,\n before,\n after,\n actorId: userId ?? null,\n tenantId: tenantId ?? null,\n });\n } catch (err) {\n // Log via engine logger if available, but never throw.\n try { (engine as any).logger?.warn?.('Audit write failed', { object: ctx.object, action, err: String((err as any)?.message ?? err) }); } catch {}\n }\n };\n\n engine.registerHook('afterInsert', writeAudit, { packageId });\n engine.registerHook('afterUpdate', writeAudit, { packageId });\n engine.registerHook('afterDelete', writeAudit, { packageId });\n\n /**\n * M10.8: Dedicated hook on `sys_comment` afterInsert that parses the\n * `mentions` JSON field and writes one sys_notification per mentioned\n * user. Lives outside `writeAudit` because sys_comment is in\n * SKIP_OBJECTS (we don't want audit/activity rows for comments —\n * those have their own first-class feed).\n */\n const writeCommentMentions = async (ctx: HookContext) => {\n if (ctx.object !== 'sys_comment') return;\n if (ctx.event !== 'afterInsert') return;\n const messaging = getMessaging();\n if (!messaging) return; // no pipeline installed → no mention notifications\n const row: any = ctx.result;\n if (!row || typeof row !== 'object') return;\n\n // mentions is a JSON-string textarea on sys_comment. Accept either\n // a raw array of user-ids [\"u1\",\"u2\"] or an array of objects\n // [{ id: \"u1\" }, ...]; tolerate parse failures silently.\n let mentions: any = row.mentions;\n if (typeof mentions === 'string') {\n try { mentions = JSON.parse(mentions); } catch { mentions = null; }\n }\n if (!Array.isArray(mentions) || mentions.length === 0) return;\n\n const userIds = mentions\n .map((m: any) => (typeof m === 'string' ? m : m?.id))\n .filter((id: any) => typeof id === 'string' && id.length > 0);\n if (userIds.length === 0) return;\n\n const [source_object, source_id] = String(row.thread_id ?? '').split(':');\n const actorId = row.author_id ?? null;\n const actorName = row.author_name ?? null;\n const bodyPreview = String(row.body ?? '').slice(0, 240);\n const sess: any = (ctx as any).session ?? {};\n const tenantId: string | null = sess.tenantId ?? row.organization_id ?? null;\n const commentId = row.id != null ? String(row.id) : null;\n\n for (const uid of userIds) {\n if (uid === actorId) continue; // don't notify the mention author\n try {\n // ADR-0030 single ingress — emit() writes the L2 event and the inbox\n // channel materializes the bell row + a delivered receipt.\n await messaging.emit({\n topic: 'collab.mention',\n audience: [uid],\n severity: 'info',\n source: source_object ? { object: source_object, id: source_id ?? '' } : undefined,\n actorId: actorId ?? undefined,\n organizationId: tenantId ?? undefined,\n dedupKey: commentId ? `collab.mention:${commentId}:${uid}` : undefined,\n payload: {\n title: actorName ? `${actorName} mentioned you` : 'You were mentioned',\n body: bodyPreview,\n actorName,\n },\n });\n } catch (err) {\n try { (engine as any).logger?.warn?.('Mention notification emit failed', { uid, err: String((err as any)?.message ?? err) }); } catch {}\n }\n }\n };\n engine.registerHook('afterInsert', writeCommentMentions, { packageId });\n}\n\n/**\n * Identify the assignee/owner field of a record. We accept several\n * conventional names so this works across CRM-style objects (owner_id,\n * assigned_to) and platform objects (recipient_id is handled separately).\n */\nconst OWNER_FIELDS = ['owner_id', 'assigned_to', 'assignee_id', 'owner', 'assignee'];\n\nfunction pickOwner(rec: any): string | null {\n if (!rec || typeof rec !== 'object') return null;\n for (const f of OWNER_FIELDS) {\n const v = rec[f];\n if (typeof v === 'string' && v.length > 0) return v;\n }\n return null;\n}\n\nasync function writeAssignmentNotifications(\n messaging: MessagingEmitSurface | undefined,\n params: {\n object: string;\n recordId: string | null;\n label: string;\n action: 'create' | 'update' | 'delete';\n before: any;\n after: any;\n actorId: string | null;\n tenantId: string | null;\n },\n): Promise<void> {\n if (!messaging) return; // no pipeline installed → no assignment notifications\n if (params.action === 'delete') return;\n if (!params.recordId) return;\n\n const newOwner = pickOwner(params.after);\n const oldOwner = pickOwner(params.before);\n if (!newOwner) return;\n if (params.action === 'update' && newOwner === oldOwner) return;\n if (newOwner === params.actorId) return; // self-assignment is silent\n\n try {\n // ADR-0030 single ingress — emit() writes the L2 event and the inbox\n // channel materializes the bell row + a delivered receipt. organizationId\n // is propagated so the recipient (same tenant as the action) sees the\n // materialized row through RLS.\n // Dedup only a true double-fire of the SAME write: scope the key by the\n // record's write-version (updated_at). Without a version component the key\n // would be permanent and a legitimate re-assignment back to a prior owner\n // would be silently suppressed. When no version field exists, omit the key\n // (every assignment notifies — same as the pre-ADR-0030 direct-write path).\n const writeVersion =\n (params.after && typeof params.after === 'object'\n ? params.after.updated_at ?? params.after.modified_at ?? params.after.updated_date\n : null) ?? null;\n await messaging.emit({\n topic: 'collab.assignment',\n audience: [newOwner],\n severity: 'info',\n source: { object: params.object, id: params.recordId },\n actorId: params.actorId ?? undefined,\n organizationId: params.tenantId ?? undefined,\n dedupKey: writeVersion\n ? `collab.assignment:${params.object}:${params.recordId}:${newOwner}:${writeVersion}`\n : undefined,\n payload: {\n title: `${params.object} \"${params.label}\" assigned to you`,\n },\n });\n } catch {\n // best-effort; never throw into CRUD path\n }\n}\n\n// Re-export for convenience.\nexport type { IDataEngine };\n"],"mappings":"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","names":["import_data","import_data","prev","AuditTranslations"]}
1
+ {"version":3,"sources":["../src/translations/en.objects.generated.ts","../src/translations/zh-CN.objects.generated.ts","../src/translations/ja-JP.objects.generated.ts","../src/translations/es-ES.objects.generated.ts","../src/translations/index.ts","../src/index.ts","../src/objects/sys-audit-log.object.ts","../src/objects/sys-activity.object.ts","../src/objects/sys-comment.object.ts","../src/audit-plugin.ts","../src/audit-writers.ts"],"sourcesContent":["// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\n/**\n * Auto-generated by 'os i18n extract' for locale 'en'.\n * Edit translations in place; re-run extract (with --merge) to fill new gaps.\n * Do not hand-edit the structure — only the leaf string values.\n */\n\nimport type { TranslationData } from '@objectstack/spec/system';\n\nexport const enObjects: NonNullable<TranslationData['objects']> = {\n sys_audit_log: {\n label: \"Audit Log\",\n pluralLabel: \"Audit Logs\",\n description: \"Immutable audit trail for platform events\",\n fields: {\n created_at: {\n label: \"Timestamp\"\n },\n action: {\n label: \"Action\",\n help: \"Action type (snake_case)\",\n options: {\n create: \"create\",\n update: \"update\",\n delete: \"delete\",\n restore: \"restore\",\n login: \"login\",\n logout: \"logout\",\n permission_change: \"permission_change\",\n config_change: \"config_change\",\n export: \"export\",\n import: \"import\"\n }\n },\n user_id: {\n label: \"Actor\",\n help: \"User who performed the action (null for system actions)\"\n },\n object_name: {\n label: \"Object\",\n help: \"Target object (e.g. sys_user, project_task)\"\n },\n record_id: {\n label: \"Record ID\",\n help: \"ID of the affected record\"\n },\n old_value: {\n label: \"Old Value\",\n help: \"JSON-serialized previous state\"\n },\n new_value: {\n label: \"New Value\",\n help: \"JSON-serialized new state\"\n },\n ip_address: {\n label: \"IP Address\"\n },\n user_agent: {\n label: \"User Agent\"\n },\n tenant_id: {\n label: \"Tenant\",\n help: \"Tenant context for multi-tenant isolation\"\n },\n metadata: {\n label: \"Metadata\",\n help: \"JSON-serialized additional context\"\n },\n id: {\n label: \"Audit Log ID\"\n }\n },\n _views: {\n recent: {\n label: \"Recent\"\n },\n writes_only: {\n label: \"Writes\"\n },\n auth_events: {\n label: \"Auth\"\n },\n config_changes: {\n label: \"Config\"\n },\n all_events: {\n label: \"All\"\n }\n }\n },\n sys_activity: {\n label: \"Activity\",\n pluralLabel: \"Activities\",\n description: \"Recent activity stream entries (lightweight, denormalized)\",\n fields: {\n id: {\n label: \"Activity ID\"\n },\n timestamp: {\n label: \"Timestamp\"\n },\n type: {\n label: \"Type\",\n options: {\n created: \"created\",\n updated: \"updated\",\n deleted: \"deleted\",\n commented: \"commented\",\n mentioned: \"mentioned\",\n shared: \"shared\",\n assigned: \"assigned\",\n completed: \"completed\",\n login: \"login\",\n logout: \"logout\",\n system: \"system\"\n }\n },\n summary: {\n label: \"Summary\",\n help: \"Human-readable one-line summary\"\n },\n actor_id: {\n label: \"Actor\"\n },\n actor_name: {\n label: \"Actor Name\"\n },\n actor_avatar_url: {\n label: \"Actor Avatar\"\n },\n object_name: {\n label: \"Object\",\n help: \"Target object short name (e.g. account, sys_user)\"\n },\n record_id: {\n label: \"Record ID\"\n },\n record_label: {\n label: \"Record Label\",\n help: \"Display label of the target record at write time\"\n },\n url: {\n label: \"URL\",\n help: \"Optional deep-link to the activity target\"\n },\n environment_id: {\n label: \"Project\",\n help: \"Environment context (multi-environment deployments)\"\n },\n metadata: {\n label: \"Metadata\",\n help: \"JSON-serialized additional context\"\n }\n }\n },\n sys_comment: {\n label: \"Comment\",\n pluralLabel: \"Comments\",\n description: \"Threaded comments attached to records via thread_id\",\n fields: {\n id: {\n label: \"Comment ID\"\n },\n thread_id: {\n label: \"Thread\",\n help: \"Thread identifier — conventionally `{object}:{record_id}` (e.g. `sys_user:abc123`)\"\n },\n parent_id: {\n label: \"Parent Comment\",\n help: \"Optional parent comment for nested replies\"\n },\n reply_count: {\n label: \"Reply Count\"\n },\n author_id: {\n label: \"Author\"\n },\n author_name: {\n label: \"Author Name\"\n },\n author_avatar_url: {\n label: \"Author Avatar\"\n },\n body: {\n label: \"Body\",\n help: \"Comment text (Markdown supported)\"\n },\n mentions: {\n label: \"Mentions\",\n help: \"JSON array of @mention objects\"\n },\n reactions: {\n label: \"Reactions\",\n help: \"JSON array of emoji reaction objects\"\n },\n is_edited: {\n label: \"Edited\"\n },\n edited_at: {\n label: \"Edited At\"\n },\n visibility: {\n label: \"Visibility\",\n options: {\n public: \"public\",\n internal: \"internal\",\n private: \"private\"\n }\n },\n created_at: {\n label: \"Created At\"\n },\n updated_at: {\n label: \"Updated At\"\n }\n }\n }\n};\n","// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\n/**\n * Auto-generated by 'os i18n extract' for locale 'zh-CN'.\n * Edit translations in place; re-run extract (with --merge) to fill new gaps.\n * Do not hand-edit the structure — only the leaf string values.\n */\n\nimport type { TranslationData } from '@objectstack/spec/system';\n\nexport const zhCNObjects: NonNullable<TranslationData['objects']> = {\n sys_audit_log: {\n label: \"审计日志\",\n pluralLabel: \"审计日志\",\n description: \"平台事件的不可变审计追踪\",\n fields: {\n created_at: {\n label: \"时间戳\"\n },\n action: {\n label: \"操作\",\n help: \"操作类型(snake_case)\",\n options: {\n create: \"创建\",\n update: \"更新\",\n delete: \"删除\",\n restore: \"恢复\",\n login: \"登录\",\n logout: \"登出\",\n permission_change: \"权限变更\",\n config_change: \"配置变更\",\n export: \"导出\",\n import: \"导入\"\n }\n },\n user_id: {\n label: \"执行人\",\n help: \"执行该操作的用户(系统操作时为 null)\"\n },\n object_name: {\n label: \"对象\",\n help: \"目标对象(例如 sys_user、project_task)\"\n },\n record_id: {\n label: \"记录 ID\",\n help: \"受影响记录的 ID\"\n },\n old_value: {\n label: \"旧值\",\n help: \"旧状态的 JSON 序列化内容\"\n },\n new_value: {\n label: \"新值\",\n help: \"新状态的 JSON 序列化内容\"\n },\n ip_address: {\n label: \"IP 地址\"\n },\n user_agent: {\n label: \"用户代理\"\n },\n tenant_id: {\n label: \"租户\",\n help: \"用于多租户隔离的租户上下文\"\n },\n metadata: {\n label: \"元数据\",\n help: \"附加上下文的 JSON 序列化内容\"\n },\n id: {\n label: \"审计日志 ID\"\n }\n },\n _views: {\n recent: {\n label: \"最近\"\n },\n writes_only: {\n label: \"写入\"\n },\n auth_events: {\n label: \"认证\"\n },\n config_changes: {\n label: \"配置\"\n },\n all_events: {\n label: \"全部\"\n }\n }\n },\n sys_activity: {\n label: \"活动\",\n pluralLabel: \"活动\",\n description: \"最近活动流条目(轻量、去规范化)\",\n fields: {\n id: {\n label: \"活动 ID\"\n },\n timestamp: {\n label: \"时间戳\"\n },\n type: {\n label: \"类型\",\n options: {\n created: \"已创建\",\n updated: \"已更新\",\n deleted: \"已删除\",\n commented: \"已评论\",\n mentioned: \"被提及\",\n shared: \"已共享\",\n assigned: \"已分配\",\n completed: \"已完成\",\n login: \"登录\",\n logout: \"登出\",\n system: \"系统\"\n }\n },\n summary: {\n label: \"摘要\",\n help: \"人类可读的单行摘要\"\n },\n actor_id: {\n label: \"执行人\"\n },\n actor_name: {\n label: \"执行人名称\"\n },\n actor_avatar_url: {\n label: \"执行人头像\"\n },\n object_name: {\n label: \"对象\",\n help: \"目标对象短名称(例如 account、sys_user)\"\n },\n record_id: {\n label: \"记录 ID\"\n },\n record_label: {\n label: \"记录标签\",\n help: \"写入时目标记录的显示标签\"\n },\n url: {\n label: \"URL\",\n help: \"指向活动目标的可选深度链接\"\n },\n environment_id: {\n label: \"项目\",\n help: \"项目上下文(多项目部署)\"\n },\n metadata: {\n label: \"元数据\",\n help: \"附加上下文的 JSON 序列化内容\"\n }\n }\n },\n sys_comment: {\n label: \"评论\",\n pluralLabel: \"评论\",\n description: \"通过 thread_id 附加到记录的线程化评论\",\n fields: {\n id: {\n label: \"评论 ID\"\n },\n thread_id: {\n label: \"线程\",\n help: \"线程标识——约定格式为 `{object}:{record_id}`(例如 `sys_user:abc123`)\"\n },\n parent_id: {\n label: \"父评论\",\n help: \"可选的父评论,用于嵌套回复\"\n },\n reply_count: {\n label: \"回复数\"\n },\n author_id: {\n label: \"作者\"\n },\n author_name: {\n label: \"作者名称\"\n },\n author_avatar_url: {\n label: \"作者头像\"\n },\n body: {\n label: \"正文\",\n help: \"评论文本(支持 Markdown)\"\n },\n mentions: {\n label: \"提及\",\n help: \"@mention 对象的 JSON 数组\"\n },\n reactions: {\n label: \"回应\",\n help: \"表情回应对象的 JSON 数组\"\n },\n is_edited: {\n label: \"已编辑\"\n },\n edited_at: {\n label: \"编辑时间\"\n },\n visibility: {\n label: \"可见性\",\n options: {\n public: \"公开\",\n internal: \"内部\",\n private: \"私有\"\n }\n },\n created_at: {\n label: \"创建时间\"\n },\n updated_at: {\n label: \"更新时间\"\n }\n }\n }\n};\n","// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\n/**\n * Auto-generated by 'os i18n extract' for locale 'ja-JP'.\n * Edit translations in place; re-run extract (with --merge) to fill new gaps.\n * Do not hand-edit the structure — only the leaf string values.\n */\n\nimport type { TranslationData } from '@objectstack/spec/system';\n\nexport const jaJPObjects: NonNullable<TranslationData['objects']> = {\n sys_audit_log: {\n label: \"監査ログ\",\n pluralLabel: \"監査ログ\",\n description: \"プラットフォームイベントの不変の監査証跡\",\n fields: {\n created_at: {\n label: \"タイムスタンプ\"\n },\n action: {\n label: \"アクション\",\n help: \"アクションタイプ(snake_case)\",\n options: {\n create: \"作成\",\n update: \"更新\",\n delete: \"削除\",\n restore: \"復元\",\n login: \"ログイン\",\n logout: \"ログアウト\",\n permission_change: \"権限変更\",\n config_change: \"構成変更\",\n export: \"エクスポート\",\n import: \"インポート\"\n }\n },\n user_id: {\n label: \"操作者\",\n help: \"アクションを実行したユーザー(システム操作の場合は null)\"\n },\n object_name: {\n label: \"オブジェクト\",\n help: \"対象オブジェクト(例: sys_user、project_task)\"\n },\n record_id: {\n label: \"レコード ID\",\n help: \"影響を受けたレコードの ID\"\n },\n old_value: {\n label: \"変更前の値\",\n help: \"JSON シリアライズされた以前の状態\"\n },\n new_value: {\n label: \"変更後の値\",\n help: \"JSON シリアライズされた新しい状態\"\n },\n ip_address: {\n label: \"IP アドレス\"\n },\n user_agent: {\n label: \"ユーザーエージェント\"\n },\n tenant_id: {\n label: \"テナント\",\n help: \"マルチテナント分離のためのテナントコンテキスト\"\n },\n metadata: {\n label: \"メタデータ\",\n help: \"JSON シリアライズされた追加コンテキスト\"\n },\n id: {\n label: \"監査ログ ID\"\n }\n },\n _views: {\n recent: {\n label: \"最近\"\n },\n writes_only: {\n label: \"書き込み\"\n },\n auth_events: {\n label: \"認証\"\n },\n config_changes: {\n label: \"構成変更\"\n },\n all_events: {\n label: \"すべて\"\n }\n }\n },\n sys_activity: {\n label: \"アクティビティ\",\n pluralLabel: \"アクティビティ\",\n description: \"最近のアクティビティストリームエントリ(軽量、非正規化)\",\n fields: {\n id: {\n label: \"アクティビティ ID\"\n },\n timestamp: {\n label: \"タイムスタンプ\"\n },\n type: {\n label: \"タイプ\",\n options: {\n created: \"作成\",\n updated: \"更新\",\n deleted: \"削除\",\n commented: \"コメント\",\n mentioned: \"メンション\",\n shared: \"共有\",\n assigned: \"割り当て\",\n completed: \"完了\",\n login: \"ログイン\",\n logout: \"ログアウト\",\n system: \"システム\"\n }\n },\n summary: {\n label: \"サマリー\",\n help: \"判別しやすい 1 行サマリー\"\n },\n actor_id: {\n label: \"操作者\"\n },\n actor_name: {\n label: \"操作者名\"\n },\n actor_avatar_url: {\n label: \"操作者アバター\"\n },\n object_name: {\n label: \"オブジェクト\",\n help: \"対象オブジェクトの短い名前(例: account、sys_user)\"\n },\n record_id: {\n label: \"レコード ID\"\n },\n record_label: {\n label: \"レコード表示名\",\n help: \"書き込み時点の対象レコードの表示名\"\n },\n url: {\n label: \"URL\",\n help: \"アクティビティターゲットへのオプションのディープリンク\"\n },\n environment_id: {\n label: \"プロジェクト\",\n help: \"プロジェクトコンテキスト(マルチプロジェクトデプロイメント)\"\n },\n metadata: {\n label: \"メタデータ\",\n help: \"JSON シリアライズされた追加コンテキスト\"\n }\n }\n },\n sys_comment: {\n label: \"コメント\",\n pluralLabel: \"コメント\",\n description: \"thread_id を介してレコードに添付されたスレッドコメント\",\n fields: {\n id: {\n label: \"コメント ID\"\n },\n thread_id: {\n label: \"スレッド\",\n help: \"スレッド識別子 — 通常は `{object}:{record_id}`(例: `sys_user:abc123`)\"\n },\n parent_id: {\n label: \"親コメント\",\n help: \"ネストした返信用のオプションの親コメント\"\n },\n reply_count: {\n label: \"返信数\"\n },\n author_id: {\n label: \"投稿者\"\n },\n author_name: {\n label: \"投稿者名\"\n },\n author_avatar_url: {\n label: \"投稿者アバター\"\n },\n body: {\n label: \"本文\",\n help: \"コメントテキスト(Markdown 対応)\"\n },\n mentions: {\n label: \"メンション\",\n help: \"@メンションオブジェクトの JSON 配列\"\n },\n reactions: {\n label: \"リアクション\",\n help: \"絵文字リアクションオブジェクトの JSON 配列\"\n },\n is_edited: {\n label: \"編集済み\"\n },\n edited_at: {\n label: \"編集日時\"\n },\n visibility: {\n label: \"公開範囲\",\n options: {\n public: \"公開\",\n internal: \"内部\",\n private: \"非公開\"\n }\n },\n created_at: {\n label: \"作成日時\"\n },\n updated_at: {\n label: \"更新日時\"\n }\n }\n }\n};\n","// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\n/**\n * Auto-generated by 'os i18n extract' for locale 'es-ES'.\n * Edit translations in place; re-run extract (with --merge) to fill new gaps.\n * Do not hand-edit the structure — only the leaf string values.\n */\n\nimport type { TranslationData } from '@objectstack/spec/system';\n\nexport const esESObjects: NonNullable<TranslationData['objects']> = {\n sys_audit_log: {\n label: \"Registro de auditoría\",\n pluralLabel: \"Registros de auditoría\",\n description: \"Registro de auditoría inmutable para eventos de la plataforma\",\n fields: {\n created_at: {\n label: \"Marca temporal\"\n },\n action: {\n label: \"Acción\",\n help: \"Tipo de acción (snake_case).\",\n options: {\n create: \"Crear\",\n update: \"Actualizar\",\n delete: \"Eliminar\",\n restore: \"Restaurar\",\n login: \"Inicio de sesión\",\n logout: \"Cierre de sesión\",\n permission_change: \"Cambio de permisos\",\n config_change: \"Cambio de configuración\",\n export: \"Exportar\",\n import: \"Importar\"\n }\n },\n user_id: {\n label: \"Actor\",\n help: \"Usuario que realizó la acción (null para acciones del sistema).\"\n },\n object_name: {\n label: \"Objeto\",\n help: \"Objeto de destino (p. ej. sys_user, project_task).\"\n },\n record_id: {\n label: \"ID de registro\",\n help: \"ID del registro afectado.\"\n },\n old_value: {\n label: \"Valor anterior\",\n help: \"Estado anterior serializado en JSON.\"\n },\n new_value: {\n label: \"Valor nuevo\",\n help: \"Estado nuevo serializado en JSON.\"\n },\n ip_address: {\n label: \"Dirección IP\"\n },\n user_agent: {\n label: \"Agente de usuario\"\n },\n tenant_id: {\n label: \"Inquilino\",\n help: \"Contexto del tenant para el aislamiento multi-tenant.\"\n },\n metadata: {\n label: \"Metadatos\",\n help: \"Contexto adicional serializado en JSON.\"\n },\n id: {\n label: \"ID de registro de auditoría\"\n }\n },\n _views: {\n recent: {\n label: \"Recientes\"\n },\n writes_only: {\n label: \"Escrituras\"\n },\n auth_events: {\n label: \"Autenticación\"\n },\n config_changes: {\n label: \"Configuración\"\n },\n all_events: {\n label: \"Todos\"\n }\n }\n },\n sys_activity: {\n label: \"Actividad\",\n pluralLabel: \"Actividades\",\n description: \"Entradas recientes del flujo de actividad (ligeras y desnormalizadas).\",\n fields: {\n id: {\n label: \"ID de actividad\"\n },\n timestamp: {\n label: \"Marca temporal\"\n },\n type: {\n label: \"Tipo\",\n options: {\n created: \"Creado\",\n updated: \"Actualizado\",\n deleted: \"Eliminado\",\n commented: \"Comentado\",\n mentioned: \"Mencionado\",\n shared: \"Compartido\",\n assigned: \"Asignado\",\n completed: \"Completado\",\n login: \"Inicio de sesión\",\n logout: \"Cierre de sesión\",\n system: \"Sistema\"\n }\n },\n summary: {\n label: \"Resumen\",\n help: \"Resumen legible de una línea.\"\n },\n actor_id: {\n label: \"Actor\"\n },\n actor_name: {\n label: \"Nombre del actor\"\n },\n actor_avatar_url: {\n label: \"Avatar del actor\"\n },\n object_name: {\n label: \"Objeto\",\n help: \"Nombre corto del objeto de destino (p. ej. account, sys_user).\"\n },\n record_id: {\n label: \"ID de registro\"\n },\n record_label: {\n label: \"Nombre visible del registro\",\n help: \"Nombre visible del registro de destino en el momento de escritura.\"\n },\n url: {\n label: \"URL\",\n help: \"Enlace profundo opcional al destino de la actividad.\"\n },\n environment_id: {\n label: \"Proyecto\",\n help: \"Contexto del proyecto (implementaciones multiproyecto).\"\n },\n metadata: {\n label: \"Metadatos\",\n help: \"Contexto adicional serializado en JSON.\"\n }\n }\n },\n sys_comment: {\n label: \"Comentario\",\n pluralLabel: \"Comentarios\",\n description: \"Comentarios en hilo adjuntos a registros mediante thread_id.\",\n fields: {\n id: {\n label: \"ID de comentario\"\n },\n thread_id: {\n label: \"Hilo\",\n help: \"Identificador del hilo; por convención `{object}:{record_id}` (p. ej. `sys_user:abc123`).\"\n },\n parent_id: {\n label: \"Comentario principal\",\n help: \"Comentario principal opcional para respuestas anidadas.\"\n },\n reply_count: {\n label: \"Número de respuestas\"\n },\n author_id: {\n label: \"Autor\"\n },\n author_name: {\n label: \"Nombre del autor\"\n },\n author_avatar_url: {\n label: \"Avatar del autor\"\n },\n body: {\n label: \"Contenido\",\n help: \"Texto del comentario (compatible con Markdown).\"\n },\n mentions: {\n label: \"Menciones\",\n help: \"Matriz JSON de objetos @mention.\"\n },\n reactions: {\n label: \"Reacciones\",\n help: \"Matriz JSON de objetos de reacción emoji.\"\n },\n is_edited: {\n label: \"Editado\"\n },\n edited_at: {\n label: \"Editado el\"\n },\n visibility: {\n label: \"Visibilidad\",\n options: {\n public: \"Público\",\n internal: \"Interno\",\n private: \"Privado\"\n }\n },\n created_at: {\n label: \"Creado el\"\n },\n updated_at: {\n label: \"Actualizado el\"\n }\n }\n }\n};\n","// Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license.\n\n/**\n * AuditTranslations — i18n bundle owned by this plugin (ADR-0029 D8).\n *\n * Object label/field/view/action translations for the sys_* objects this\n * plugin owns (sys_audit_log / sys_activity / sys_comment / sys_attachment).\n * Loaded at runtime via the plugin's `kernel:ready` hook\n * (`i18n.loadTranslations`). Regenerate with `os i18n extract` against\n * `scripts/i18n-extract.config.ts`.\n */\n\nimport type { TranslationBundle } from '@objectstack/spec/system';\nimport { enObjects } from './en.objects.generated.js';\nimport { zhCNObjects } from './zh-CN.objects.generated.js';\nimport { jaJPObjects } from './ja-JP.objects.generated.js';\nimport { esESObjects } from './es-ES.objects.generated.js';\n\nexport const AuditTranslations: TranslationBundle = {\n en: { objects: enObjects },\n 'zh-CN': { objects: zhCNObjects },\n 'ja-JP': { objects: jaJPObjects },\n 'es-ES': { objects: esESObjects },\n};\n","// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\n/**\n * @objectstack/plugin-audit\n *\n * Audit Plugin for ObjectStack\n * Provides the sys_audit_log system object definition for immutable audit trails.\n */\n\nexport { AuditPlugin } from './audit-plugin.js';\nexport { installAuditWriters } from './audit-writers.js';\n","// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport { ObjectSchema, Field } from '@objectstack/spec/data';\n\n/**\n * sys_audit_log — System Audit Log Object\n *\n * Immutable audit trail for all significant platform events.\n * Records who did what, when, and the before/after state.\n *\n * Every field is `readonly: true` — audit logs are written only by\n * internal system hooks, never via UI forms. API exposes only `get` + `list`.\n *\n * @namespace sys\n */\nexport const SysAuditLog = ObjectSchema.create({\n name: 'sys_audit_log',\n label: 'Audit Log',\n pluralLabel: 'Audit Logs',\n icon: 'scroll-text',\n isSystem: true,\n managedBy: 'append-only',\n description: 'Immutable audit trail for platform events',\n displayNameField: 'action',\n titleFormat: '{action} · {object_name}',\n compactLayout: ['created_at', 'action', 'object_name', 'record_id', 'user_id'],\n\n listViews: {\n recent: {\n type: 'grid',\n name: 'recent',\n label: 'Recent',\n data: { provider: 'object', object: 'sys_audit_log' },\n columns: ['created_at', 'action', 'object_name', 'record_id', 'user_id'],\n sort: [{ field: 'created_at', order: 'desc' }],\n pagination: { pageSize: 50 },\n emptyState: { title: 'No audit events', message: 'Activity will appear here as users interact with the platform.' },\n },\n writes_only: {\n type: 'grid',\n name: 'writes_only',\n label: 'Writes',\n data: { provider: 'object', object: 'sys_audit_log' },\n columns: ['created_at', 'action', 'object_name', 'record_id', 'user_id'],\n filter: [{ field: 'action', operator: 'in', value: ['create', 'update', 'delete', 'restore'] }],\n sort: [{ field: 'created_at', order: 'desc' }],\n pagination: { pageSize: 50 },\n },\n auth_events: {\n type: 'grid',\n name: 'auth_events',\n label: 'Auth',\n data: { provider: 'object', object: 'sys_audit_log' },\n columns: ['created_at', 'action', 'user_id'],\n filter: [{ field: 'action', operator: 'in', value: ['login', 'logout', 'permission_change'] }],\n sort: [{ field: 'created_at', order: 'desc' }],\n pagination: { pageSize: 50 },\n },\n config_changes: {\n type: 'grid',\n name: 'config_changes',\n label: 'Config',\n data: { provider: 'object', object: 'sys_audit_log' },\n columns: ['created_at', 'action', 'object_name', 'user_id'],\n filter: [{ field: 'action', operator: 'in', value: ['config_change', 'export', 'import'] }],\n sort: [{ field: 'created_at', order: 'desc' }],\n pagination: { pageSize: 50 },\n },\n all_events: {\n type: 'grid',\n name: 'all_events',\n label: 'All',\n data: { provider: 'object', object: 'sys_audit_log' },\n columns: ['created_at', 'action', 'object_name', 'record_id', 'user_id'],\n sort: [{ field: 'created_at', order: 'desc' }],\n pagination: { pageSize: 100 },\n },\n },\n\n fields: {\n // ── Event ────────────────────────────────────────────────────\n created_at: Field.datetime({\n label: 'Timestamp',\n required: true,\n defaultValue: 'NOW()',\n readonly: true,\n group: 'Event',\n }),\n\n action: Field.select(\n ['create', 'update', 'delete', 'restore', 'login', 'logout', 'permission_change', 'config_change', 'export', 'import'],\n {\n label: 'Action',\n required: true,\n readonly: true,\n searchable: true,\n description: 'Action type (snake_case)',\n group: 'Event',\n },\n ),\n\n user_id: Field.lookup('sys_user', {\n label: 'Actor',\n required: false,\n readonly: true,\n searchable: true,\n description: 'User who performed the action (null for system actions)',\n group: 'Event',\n }),\n\n // ── Target record ────────────────────────────────────────────\n object_name: Field.text({\n label: 'Object',\n required: false,\n readonly: true,\n searchable: true,\n maxLength: 255,\n description: 'Target object (e.g. sys_user, project_task)',\n group: 'Target',\n }),\n\n record_id: Field.text({\n label: 'Record ID',\n required: false,\n readonly: true,\n searchable: true,\n description: 'ID of the affected record',\n group: 'Target',\n }),\n\n // ── Change payload ───────────────────────────────────────────\n old_value: Field.textarea({\n label: 'Old Value',\n required: false,\n readonly: true,\n description: 'JSON-serialized previous state',\n group: 'Changes',\n }),\n\n new_value: Field.textarea({\n label: 'New Value',\n required: false,\n readonly: true,\n description: 'JSON-serialized new state',\n group: 'Changes',\n }),\n\n // ── Client fingerprint ───────────────────────────────────────\n ip_address: Field.text({\n label: 'IP Address',\n required: false,\n readonly: true,\n maxLength: 45,\n group: 'Client',\n }),\n\n user_agent: Field.textarea({\n label: 'User Agent',\n required: false,\n readonly: true,\n group: 'Client',\n }),\n\n // ── Context ──────────────────────────────────────────────────\n tenant_id: Field.lookup('sys_organization', {\n label: 'Tenant',\n required: false,\n readonly: true,\n description: 'Tenant context for multi-tenant isolation',\n group: 'Context',\n }),\n\n metadata: Field.textarea({\n label: 'Metadata',\n required: false,\n readonly: true,\n description: 'JSON-serialized additional context',\n group: 'Context',\n }),\n\n // ── System ───────────────────────────────────────────────────\n id: Field.text({\n label: 'Audit Log ID',\n required: true,\n readonly: true,\n group: 'System',\n }),\n },\n\n indexes: [\n { fields: ['created_at'] },\n { fields: ['user_id'] },\n { fields: ['object_name', 'record_id'] },\n { fields: ['action'] },\n { fields: ['tenant_id'] },\n ],\n\n enable: {\n trackHistory: false, // Audit logs are themselves the audit trail\n searchable: true,\n apiEnabled: true,\n apiMethods: ['get', 'list'], // Read-only — creation happens via internal system hooks only\n trash: false, // Never soft-delete audit logs\n mru: false,\n clone: false,\n },\n});\n","// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport { ObjectSchema, Field } from '@objectstack/spec/data';\n\n/**\n * sys_activity — Lightweight Activity Stream\n *\n * Append-only \"recent activity\" feed shown on dashboards / overview\n * pages. Distinct from `sys_audit_log` (compliance-grade, structured\n * before/after diffs) and `feed_item` (record-scoped Chatter timeline\n * with comments/reactions/threads). Activity entries are denormalized\n * snapshots optimized for chronological \"what happened lately\" reads.\n *\n * Typical write sources: data triggers, plugin events, UI actions.\n * Typical readers: Studio dashboard, mobile inbox, notification jobs.\n *\n * @namespace sys\n */\nexport const SysActivity = ObjectSchema.create({\n name: 'sys_activity',\n label: 'Activity',\n pluralLabel: 'Activities',\n icon: 'activity',\n isSystem: true,\n managedBy: 'append-only',\n description: 'Recent activity stream entries (lightweight, denormalized)',\n displayNameField: 'summary',\n titleFormat: '{type} · {summary}',\n compactLayout: ['timestamp', 'type', 'actor_name', 'summary'],\n\n fields: {\n id: Field.text({\n label: 'Activity ID',\n required: true,\n readonly: true,\n group: 'System',\n }),\n\n timestamp: Field.datetime({\n label: 'Timestamp',\n required: true,\n defaultValue: 'NOW()',\n readonly: true,\n group: 'Event',\n }),\n\n type: Field.select(\n [\n 'created',\n 'updated',\n 'deleted',\n 'commented',\n 'mentioned',\n 'shared',\n 'assigned',\n 'completed',\n 'login',\n 'logout',\n 'system',\n ],\n {\n label: 'Type',\n required: true,\n readonly: true,\n searchable: true,\n group: 'Event',\n },\n ),\n\n summary: Field.text({\n label: 'Summary',\n required: true,\n readonly: true,\n maxLength: 500,\n searchable: true,\n description: 'Human-readable one-line summary',\n group: 'Event',\n }),\n\n // ── Actor ───────────────────────────────────────────────────\n actor_id: Field.lookup('sys_user', {\n label: 'Actor',\n required: false,\n readonly: true,\n searchable: true,\n group: 'Actor',\n }),\n\n actor_name: Field.text({\n label: 'Actor Name',\n required: false,\n readonly: true,\n group: 'Actor',\n }),\n\n actor_avatar_url: Field.url({\n label: 'Actor Avatar',\n required: false,\n readonly: true,\n group: 'Actor',\n }),\n\n // ── Target ───────────────────────────────────────────────────\n object_name: Field.text({\n label: 'Object',\n required: false,\n readonly: true,\n searchable: true,\n maxLength: 255,\n description: 'Target object short name (e.g. account, sys_user)',\n group: 'Target',\n }),\n\n record_id: Field.text({\n label: 'Record ID',\n required: false,\n readonly: true,\n searchable: true,\n group: 'Target',\n }),\n\n record_label: Field.text({\n label: 'Record Label',\n required: false,\n readonly: true,\n maxLength: 255,\n description: 'Display label of the target record at write time',\n group: 'Target',\n }),\n\n url: Field.url({\n label: 'URL',\n required: false,\n readonly: true,\n description: 'Optional deep-link to the activity target',\n group: 'Target',\n }),\n\n // ── Context ──────────────────────────────────────────────────\n environment_id: Field.lookup('sys_environment', {\n label: 'Environment',\n required: false,\n readonly: true,\n searchable: true,\n description: 'Environment context (multi-environment deployments)',\n group: 'Context',\n }),\n\n metadata: Field.textarea({\n label: 'Metadata',\n required: false,\n readonly: true,\n description: 'JSON-serialized additional context',\n group: 'Context',\n }),\n },\n\n indexes: [\n { fields: ['timestamp'] },\n { fields: ['actor_id'] },\n { fields: ['object_name', 'record_id'] },\n { fields: ['type'] },\n { fields: ['environment_id'] },\n ],\n\n enable: {\n trackHistory: false,\n searchable: true,\n apiEnabled: true,\n apiMethods: ['get', 'list'],\n trash: false,\n mru: false,\n clone: false,\n },\n});\n","// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport { ObjectSchema, Field } from '@objectstack/spec/data';\n\n/**\n * sys_comment — Threaded Record Comments\n *\n * Generic threaded discussion attached to any record via `thread_id`.\n * `thread_id` is conventionally formatted as `{object}:{record_id}`\n * (e.g. `sys_user:abc123`, `account:9001`) so a single index covers\n * \"all comments on this record\" lookups across every object.\n *\n * Distinct from `feed_item` (Salesforce-style Chatter timeline that\n * mixes comments with field changes / events / approvals). Use\n * `sys_comment` when you want a focused threaded discussion surface\n * without the heavier Chatter envelope.\n *\n * @namespace sys\n */\nexport const SysComment = ObjectSchema.create({\n name: 'sys_comment',\n label: 'Comment',\n pluralLabel: 'Comments',\n icon: 'message-square',\n isSystem: true,\n managedBy: 'platform',\n description: 'Threaded comments attached to records via thread_id',\n displayNameField: 'body',\n titleFormat: '{author_name}: {body}',\n compactLayout: ['created_at', 'author_name', 'body'],\n\n fields: {\n id: Field.text({\n label: 'Comment ID',\n required: true,\n readonly: true,\n group: 'System',\n }),\n\n // ── Thread ───────────────────────────────────────────────────\n thread_id: Field.text({\n label: 'Thread',\n required: true,\n searchable: true,\n maxLength: 255,\n description:\n 'Thread identifier — conventionally `{object}:{record_id}` (e.g. `sys_user:abc123`)',\n group: 'Thread',\n }),\n\n parent_id: Field.lookup('sys_comment', {\n label: 'Parent Comment',\n required: false,\n description: 'Optional parent comment for nested replies',\n group: 'Thread',\n }),\n\n reply_count: Field.number({\n label: 'Reply Count',\n defaultValue: 0,\n readonly: true,\n group: 'Thread',\n }),\n\n // ── Author ───────────────────────────────────────────────────\n author_id: Field.lookup('sys_user', {\n label: 'Author',\n required: true,\n searchable: true,\n group: 'Author',\n }),\n\n author_name: Field.text({\n label: 'Author Name',\n required: false,\n group: 'Author',\n }),\n\n author_avatar_url: Field.url({\n label: 'Author Avatar',\n required: false,\n group: 'Author',\n }),\n\n // ── Body ─────────────────────────────────────────────────────\n body: Field.textarea({\n label: 'Body',\n required: true,\n searchable: true,\n description: 'Comment text (Markdown supported)',\n group: 'Body',\n }),\n\n mentions: Field.textarea({\n label: 'Mentions',\n required: false,\n description: 'JSON array of @mention objects',\n group: 'Body',\n }),\n\n reactions: Field.textarea({\n label: 'Reactions',\n required: false,\n description: 'JSON array of emoji reaction objects',\n group: 'Body',\n }),\n\n // ── Lifecycle ────────────────────────────────────────────────\n is_edited: Field.boolean({\n label: 'Edited',\n defaultValue: false,\n group: 'Lifecycle',\n }),\n\n edited_at: Field.datetime({\n label: 'Edited At',\n required: false,\n group: 'Lifecycle',\n }),\n\n visibility: Field.select(\n ['public', 'internal', 'private'],\n {\n label: 'Visibility',\n defaultValue: 'public',\n group: 'Lifecycle',\n },\n ),\n\n created_at: Field.datetime({\n label: 'Created At',\n required: true,\n defaultValue: 'NOW()',\n readonly: true,\n group: 'System',\n }),\n\n updated_at: Field.datetime({\n label: 'Updated At',\n required: false,\n group: 'System',\n }),\n },\n\n indexes: [\n { fields: ['thread_id', 'created_at'] },\n { fields: ['parent_id'] },\n { fields: ['author_id'] },\n ],\n\n enable: {\n trackHistory: true,\n searchable: true,\n apiEnabled: true,\n trash: true,\n mru: false,\n clone: false,\n },\n});\n","// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport type { Plugin, PluginContext } from '@objectstack/core';\nimport type { IDataEngine } from '@objectstack/spec/contracts';\nimport { SysAuditLog, SysActivity, SysComment } from './objects/index.js';\n// Registered here but still owned by platform-objects (the plugin contributes\n// them to the kernel without owning the definition yet):\n// - sys_notification — reworked by ADR-0030 messaging (notification→event).\n// - sys_attachment — a file↔record link belonging with service-storage's\n// sys_file; moves in the storage-domain decomposition, not this audit move.\nimport { SysNotification, SysAttachment } from '@objectstack/platform-objects/audit';\nimport { installAuditWriters, type MessagingEmitSurface } from './audit-writers.js';\n\n/**\n * AuditPlugin\n *\n * Registers the sys_audit_log / sys_activity / sys_comment system objects\n * and installs ObjectQL hook subscribers that automatically write audit\n * trail + activity stream rows on every data mutation.\n *\n * Implements ROADMAP M10.1 (CRM production-readiness).\n */\nexport class AuditPlugin implements Plugin {\n name = 'com.objectstack.audit';\n type = 'standard';\n version = '1.0.0';\n dependencies = ['com.objectstack.engine.objectql'];\n\n async init(ctx: PluginContext): Promise<void> {\n process.stderr.write('[AuditPlugin] init() called\\n');\n // Register audit system objects via the manifest service.\n ctx.getService<{ register(m: any): void }>('manifest').register({\n id: 'com.objectstack.audit',\n name: 'Audit',\n version: '1.0.0',\n type: 'plugin',\n scope: 'system',\n defaultDatasource: 'cloud',\n namespace: 'sys',\n objects: [SysAuditLog, SysActivity, SysComment, SysAttachment, SysNotification],\n // ADR-0029 D7 — contribute the Audit Logs entry into the Setup app's\n // `group_diagnostics` slot. The plugin owns sys_audit_log (K2).\n navigationContributions: [\n {\n app: 'setup',\n group: 'group_diagnostics',\n priority: 100,\n items: [\n { id: 'nav_audit_logs', type: 'object', label: 'Audit Logs', objectName: 'sys_audit_log', icon: 'scroll-text' },\n ],\n },\n ],\n });\n\n // ADR-0029 D8 — contribute this plugin's object translations to the i18n\n // service on kernel:ready (the i18n plugin may register after this one).\n if (typeof (ctx as any).hook === 'function') {\n (ctx as any).hook('kernel:ready', async () => {\n try {\n const i18n = ctx.getService<any>('i18n');\n if (i18n && typeof i18n.loadTranslations === 'function') {\n const { AuditTranslations } = await import('./translations/index.js');\n for (const [locale, data] of Object.entries(AuditTranslations)) {\n i18n.loadTranslations(locale, data as Record<string, unknown>);\n }\n }\n } catch { /* i18n optional */ }\n });\n }\n\n ctx.logger.info('Audit Plugin initialized');\n }\n\n async start(ctx: PluginContext): Promise<void> {\n process.stderr.write('[AuditPlugin] start() called, registering kernel:ready hook\\n');\n // ObjectQL engine is only resolvable after the kernel is ready.\n ctx.hook('kernel:ready', async () => {\n process.stderr.write('[AuditPlugin] kernel:ready fired\\n');\n let engine: IDataEngine | null = null;\n try {\n engine = ctx.getService<IDataEngine>('objectql');\n process.stderr.write(`[AuditPlugin] objectql engine = ${engine ? 'OK' : 'null'} registerHook? ${typeof (engine as any)?.registerHook}\\n`);\n } catch (err) {\n process.stderr.write(`[AuditPlugin] getService(objectql) threw: ${(err as Error).message}\\n`);\n // Fallback alias used in some kernels.\n try {\n engine = ctx.getService<IDataEngine>('data');\n process.stderr.write(`[AuditPlugin] data engine = ${engine ? 'OK' : 'null'}\\n`);\n } catch { /* ignore */ }\n }\n if (!engine) {\n process.stderr.write('[AuditPlugin] NO ENGINE — bailing\\n');\n ctx.logger.warn('AuditPlugin: ObjectQL engine not available — audit writers NOT installed');\n return;\n }\n // Resolve the messaging service lazily at hook time so collaboration\n // @mention / assignment notifications go through the ADR-0030 single\n // ingress (emit) instead of writing sys_notification directly. Messaging\n // may register after audit; lazy resolution tolerates either order.\n const getMessaging = (): MessagingEmitSurface | undefined => {\n try {\n return ctx.getService<MessagingEmitSurface>('messaging');\n } catch {\n return undefined;\n }\n };\n installAuditWriters(engine as any, this.name, { getMessaging });\n process.stderr.write('[AuditPlugin] writers installed\\n');\n ctx.logger.info('AuditPlugin: audit + activity writers installed');\n });\n }\n}\n","// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport type { HookContext } from '@objectstack/spec/data';\nimport type { IDataEngine } from '@objectstack/spec/contracts';\n\n/**\n * Minimal structural view of `NotificationService.emit` (ADR-0030). Declared\n * locally so plugin-audit takes no runtime dependency on service-messaging — it\n * resolves whatever object is registered under the `messaging` service at hook\n * time and routes collaboration notifications through the single ingress.\n */\nexport interface MessagingEmitSurface {\n emit(input: {\n topic: string;\n audience: string[];\n payload?: Record<string, unknown>;\n severity?: 'info' | 'warning' | 'critical';\n dedupKey?: string;\n source?: { object: string; id: string };\n actorId?: string;\n organizationId?: string;\n }): Promise<unknown>;\n}\n\n/** Options for {@link installAuditWriters}. */\nexport interface AuditWriterOptions {\n /**\n * Lazily resolve the messaging service so collaboration `@mention` /\n * assignment notifications go through the ADR-0030 single ingress rather than\n * writing `sys_notification` directly. Returns `undefined` when messaging is\n * not installed — those notifications are then skipped (no pipeline, no bell),\n * matching the `notify` node's degradation.\n */\n getMessaging?(): MessagingEmitSurface | undefined;\n}\n\n/**\n * Audit writer hook installer.\n *\n * Subscribes to the ObjectQL engine's wildcard `before*` / `after*` lifecycle\n * events and writes:\n *\n * - `sys_audit_log` rows — immutable, compliance-grade entries with\n * field-level `old_value` / `new_value` diffs.\n * - `sys_activity` rows — denormalized, human-readable summaries shown\n * in the dashboard recent-activity feed and per-record timelines.\n *\n * Skip rules avoid recursion and noise:\n * - Never audit the audit/activity tables themselves.\n * - Never audit session/presence/auth tables (high-frequency, low value).\n * - Read-only operations (`afterFind`) are never audited.\n *\n * All writes go through `ctx.api.sudo()` so they bypass record-level\n * permissions and always succeed regardless of the calling user's RBAC.\n */\n\n/** Tables that are intentionally excluded from audit/activity writes. */\nconst SKIP_OBJECTS = new Set<string>([\n 'sys_audit_log',\n 'sys_activity',\n 'sys_comment',\n 'sys_session',\n 'sys_presence',\n 'sys_account',\n 'sys_account_session',\n 'sys_account_verification',\n 'sys_account_account',\n]);\n\n/** Fields that are noise in diffs (always change, never user-meaningful). */\nconst NOISE_FIELDS = new Set<string>([\n 'updated_at',\n 'updated_by',\n 'created_at',\n 'created_by',\n]);\n\n/** Action name produced from a HookContext.event string. */\nfunction actionFor(event: string): 'create' | 'update' | 'delete' | null {\n if (event === 'afterInsert') return 'create';\n if (event === 'afterUpdate') return 'update';\n if (event === 'afterDelete') return 'delete';\n return null;\n}\n\n/** Activity type produced from an audit action. */\nfunction activityTypeFor(action: 'create' | 'update' | 'delete'): 'created' | 'updated' | 'deleted' {\n return action === 'create' ? 'created' : action === 'update' ? 'updated' : 'deleted';\n}\n\n/**\n * Compute the human-readable record label from a record by trying common\n * label fields. Falls back to record id.\n */\nfunction recordLabel(record: any, id: string): string {\n if (!record || typeof record !== 'object') return id;\n const candidates = ['name', 'subject', 'title', 'full_name', 'label', 'first_name', 'company', 'email'];\n for (const k of candidates) {\n const v = record[k];\n if (typeof v === 'string' && v.trim()) return v.trim();\n }\n return id;\n}\n\n/**\n * Compute a shallow JSON diff between two records. Returns only keys whose\n * value changed (and ignores keys in `NOISE_FIELDS`). Both sides are\n * serialisable via `JSON.stringify` — values that fail to serialise are\n * coerced to `String(value)`.\n */\nfunction diff(before: Record<string, any>, after: Record<string, any>): { old: Record<string, any>; next: Record<string, any> } {\n const oldOut: Record<string, any> = {};\n const newOut: Record<string, any> = {};\n const keys = new Set<string>([...Object.keys(before || {}), ...Object.keys(after || {})]);\n for (const k of keys) {\n if (NOISE_FIELDS.has(k)) continue;\n const b = before?.[k];\n const a = after?.[k];\n if (safeStringify(b) !== safeStringify(a)) {\n oldOut[k] = b ?? null;\n newOut[k] = a ?? null;\n }\n }\n return { old: oldOut, next: newOut };\n}\n\nfunction safeStringify(v: any): string {\n try { return JSON.stringify(v); } catch { return String(v); }\n}\n\n/**\n * Install audit + activity writers on the given engine. Idempotent per\n * `packageId` — calling twice with the same id replaces the previous\n * registration.\n */\nexport function installAuditWriters(\n engine: any,\n packageId = 'com.objectstack.audit',\n opts: AuditWriterOptions = {},\n): void {\n if (!engine || typeof engine.registerHook !== 'function') return;\n\n const getMessaging = opts.getMessaging ?? (() => undefined);\n\n // Remove any prior installation so we can safely re-install on hot reload.\n if (typeof engine.unregisterHooksByPackage === 'function') {\n engine.unregisterHooksByPackage(packageId);\n }\n\n // Whether a given object's *registered* schema declares a field. The\n // SchemaRegistry auto-injects `organization_id` only in multi-tenant mode\n // (`applySystemFields({ multiTenant })`), so on single-tenant stacks the\n // `sys_audit_log` / `sys_activity` tables have no `organization_id` column.\n // Unconditionally stamping it there made every audit INSERT fail with\n // \"table sys_audit_log has no column named organization_id\" (the error was\n // swallowed, so audit logging was silently non-functional). Resolve the\n // field set lazily from the engine schema and cache it — object schemas are\n // static after registration.\n const fieldSetCache = new Map<string, Set<string> | null>();\n const objectHasField = (objectName: string, field: string): boolean => {\n let set = fieldSetCache.get(objectName);\n if (set === undefined) {\n set = null;\n try {\n const schema: any =\n typeof (engine as any).getSchema === 'function' ? (engine as any).getSchema(objectName) : null;\n const fields = schema?.fields;\n if (fields && typeof fields === 'object' && !Array.isArray(fields)) {\n set = new Set<string>(Object.keys(fields));\n } else if (Array.isArray(fields)) {\n set = new Set<string>(fields.map((f: any) => f?.name).filter(Boolean));\n }\n } catch {\n /* ignore — best-effort; absence just means we skip the stamp */\n }\n fieldSetCache.set(objectName, set);\n }\n return set != null && set.has(field);\n };\n\n /**\n * beforeUpdate / beforeDelete: capture \"previous\" snapshot via api.sudo()\n * so we can compute the diff in the afterXxx hook. We attach the snapshot\n * to the context (`(ctx as any).__previous`) since `HookContext.previous`\n * is officially typed but not always populated by the engine itself.\n */\n const captureBefore = async (ctx: HookContext) => {\n if (SKIP_OBJECTS.has(ctx.object)) return;\n const id = (ctx.input as any)?.id;\n if (!id) return; // bulk update/delete — too costly to snapshot every row here\n try {\n // Use the engine directly (not api.sudo) so we can thread the\n // active transaction through. On drivers with single-connection\n // pools (e.g. SQLite via knex) a sudo() findOne that does NOT\n // carry the open transaction will deadlock for the full\n // acquireConnectionTimeout (~60s) because the outer transaction\n // holds the only connection.\n const trx = (ctx as any).transaction;\n const ql = (ctx as any).ql ?? (ctx as any).api?.engine;\n if (ql?.findOne) {\n const prev = await ql.findOne(ctx.object, {\n where: { id },\n context: { isSystem: true, ...(trx ? { transaction: trx } : {}) },\n });\n if (prev) (ctx as any).__previous = prev;\n return;\n }\n const api: any = (ctx as any).api;\n if (!api?.sudo) return;\n const prev = await api.sudo().object(ctx.object).findOne({ where: { id } });\n if (prev) (ctx as any).__previous = prev;\n } catch {\n /* ignore — best-effort */\n }\n };\n\n engine.registerHook('beforeUpdate', captureBefore, { packageId });\n engine.registerHook('beforeDelete', captureBefore, { packageId });\n\n /**\n * afterInsert / afterUpdate / afterDelete: write audit_log + activity rows.\n * Errors are swallowed (logged) so user-facing CRUD is never broken by\n * audit failures.\n */\n const writeAudit = async (ctx: HookContext) => {\n if (SKIP_OBJECTS.has(ctx.object)) return;\n const action = actionFor(ctx.event);\n if (!action) return;\n\n const api: any = (ctx as any).api;\n if (!api?.sudo) return;\n\n const after: any = ctx.result;\n const before: any = (ctx as any).__previous ?? (ctx as any).previous ?? null;\n\n // Resolve record id from after (insert/update) or before (delete) or input.\n let recordId: string | undefined =\n (typeof after === 'object' && after?.id) ||\n (typeof before === 'object' && before?.id) ||\n ((ctx.input as any)?.id);\n if (recordId !== undefined) recordId = String(recordId);\n\n const sess: any = (ctx as any).session ?? {};\n const userId: string | undefined = sess.userId;\n // Prefer the active session tenant, but fall back to the audited\n // record's own `organization_id`. This matters in two cases:\n // 1. Background jobs / unauthenticated sudo paths where the\n // session has no `tenantId` populated.\n // 2. better-auth's `activeOrganizationId` cache miss on first\n // requests after sign-in, before the active-org has been set\n // on the session row.\n // Without this fallback, audit rows are written with\n // `organization_id=NULL` and the SecurityPlugin's RLS predicate\n // (`organization_id = current_user.organization_id`) hides them\n // forever — making the audit log UI appear permanently empty even\n // though writes succeed.\n const recordOrgId: string | undefined =\n (typeof (ctx.result as any)?.organization_id === 'string' && (ctx.result as any).organization_id) ||\n (typeof ((ctx as any).__previous as any)?.organization_id === 'string' && ((ctx as any).__previous as any).organization_id) ||\n undefined;\n const tenantId: string | undefined = sess.tenantId ?? recordOrgId;\n\n let oldValue: Record<string, any> | null = null;\n let newValue: Record<string, any> | null = null;\n if (action === 'create') {\n newValue = (after && typeof after === 'object') ? { ...after } : null;\n } else if (action === 'update') {\n const d = diff(before || {}, after || {});\n oldValue = d.old;\n newValue = d.next;\n // If nothing meaningfully changed, skip the audit row to avoid noise.\n if (Object.keys(newValue).length === 0) return;\n } else if (action === 'delete') {\n oldValue = before && typeof before === 'object' ? { ...before } : null;\n }\n\n const auditRow: Record<string, any> = {\n action,\n user_id: userId ?? null,\n object_name: ctx.object,\n record_id: recordId ?? null,\n old_value: oldValue ? safeStringify(oldValue) : null,\n new_value: newValue ? safeStringify(newValue) : null,\n // `tenant_id` is the schema-declared \"tenant context\" lookup.\n tenant_id: tenantId ?? null,\n };\n // The platform-default `organization_id` column is what RLS gates on\n // (`organization_id = current_user.organization_id`). The audit writer\n // runs through `api.sudo()` which bypasses the SecurityPlugin's\n // auto-stamping of `organization_id`, so we stamp it explicitly here —\n // without it, non-admin members would see 0 rows on Setup dashboards\n // because RLS would deny every audit row as wrong-tenant. But the column\n // only exists in multi-tenant deployments (the SchemaRegistry auto-injects\n // it conditionally); stamping it on a single-tenant table that lacks the\n // column made every audit INSERT fail. Only stamp it when declared.\n if (objectHasField('sys_audit_log', 'organization_id')) {\n auditRow.organization_id = tenantId ?? null;\n }\n\n const label = recordLabel(after ?? before, recordId ?? '');\n const summary =\n action === 'create' ? `Created ${ctx.object} \"${label}\"` :\n action === 'update' ? `Updated ${ctx.object} \"${label}\"` :\n `Deleted ${ctx.object} \"${label}\"`;\n\n const activityRow: Record<string, any> = {\n type: activityTypeFor(action),\n // Explicit ISO timestamp — `defaultValue: 'NOW()'` on the column\n // isn't resolved by every driver and would otherwise leak the\n // literal string \"NOW()\" into the row.\n timestamp: new Date().toISOString(),\n summary,\n actor_id: userId ?? null,\n object_name: ctx.object,\n record_id: recordId ?? null,\n record_label: label,\n metadata: newValue || oldValue ? safeStringify({ old: oldValue, new: newValue }) : null,\n };\n // Same rationale as auditRow: stamp the tenant column so RLS matches the\n // recipient's organization on read — but only when the (auto-injected)\n // column actually exists, so single-tenant activity writes don't fail.\n if (objectHasField('sys_activity', 'organization_id')) {\n activityRow.organization_id = tenantId ?? null;\n }\n\n try {\n const sys = api.sudo();\n await sys.object('sys_audit_log').create(auditRow);\n await sys.object('sys_activity').create(activityRow);\n // M10.8 / ADR-0030: notify the assignee. Best-effort; never throws into\n // the user-facing CRUD path. Goes through the messaging single ingress\n // (`emit`) — the inbox channel materializes the bell row — rather than\n // writing `sys_notification` directly. If owner_id / assigned_to was\n // newly set (or changed to a different user) on a non-system record, the\n // recipient sees \"Lead X was assigned to you\" without polling.\n //\n // (Comment mentions are handled separately by the sys_comment hook below\n // since SKIP_OBJECTS excludes it from this writer.)\n await writeAssignmentNotifications(getMessaging(), {\n object: ctx.object,\n recordId: recordId ?? null,\n label,\n action,\n before,\n after,\n actorId: userId ?? null,\n tenantId: tenantId ?? null,\n });\n } catch (err) {\n // Log via engine logger if available, but never throw.\n try { (engine as any).logger?.warn?.('Audit write failed', { object: ctx.object, action, err: String((err as any)?.message ?? err) }); } catch {}\n }\n };\n\n engine.registerHook('afterInsert', writeAudit, { packageId });\n engine.registerHook('afterUpdate', writeAudit, { packageId });\n engine.registerHook('afterDelete', writeAudit, { packageId });\n\n /**\n * M10.8: Dedicated hook on `sys_comment` afterInsert that parses the\n * `mentions` JSON field and writes one sys_notification per mentioned\n * user. Lives outside `writeAudit` because sys_comment is in\n * SKIP_OBJECTS (we don't want audit/activity rows for comments —\n * those have their own first-class feed).\n */\n const writeCommentMentions = async (ctx: HookContext) => {\n if (ctx.object !== 'sys_comment') return;\n if (ctx.event !== 'afterInsert') return;\n const messaging = getMessaging();\n if (!messaging) return; // no pipeline installed → no mention notifications\n const row: any = ctx.result;\n if (!row || typeof row !== 'object') return;\n\n // mentions is a JSON-string textarea on sys_comment. Accept either\n // a raw array of user-ids [\"u1\",\"u2\"] or an array of objects\n // [{ id: \"u1\" }, ...]; tolerate parse failures silently.\n let mentions: any = row.mentions;\n if (typeof mentions === 'string') {\n try { mentions = JSON.parse(mentions); } catch { mentions = null; }\n }\n if (!Array.isArray(mentions) || mentions.length === 0) return;\n\n const userIds = mentions\n .map((m: any) => (typeof m === 'string' ? m : m?.id))\n .filter((id: any) => typeof id === 'string' && id.length > 0);\n if (userIds.length === 0) return;\n\n const [source_object, source_id] = String(row.thread_id ?? '').split(':');\n const actorId = row.author_id ?? null;\n const actorName = row.author_name ?? null;\n const bodyPreview = String(row.body ?? '').slice(0, 240);\n const sess: any = (ctx as any).session ?? {};\n const tenantId: string | null = sess.tenantId ?? row.organization_id ?? null;\n const commentId = row.id != null ? String(row.id) : null;\n\n for (const uid of userIds) {\n if (uid === actorId) continue; // don't notify the mention author\n try {\n // ADR-0030 single ingress — emit() writes the L2 event and the inbox\n // channel materializes the bell row + a delivered receipt.\n await messaging.emit({\n topic: 'collab.mention',\n audience: [uid],\n severity: 'info',\n source: source_object ? { object: source_object, id: source_id ?? '' } : undefined,\n actorId: actorId ?? undefined,\n organizationId: tenantId ?? undefined,\n dedupKey: commentId ? `collab.mention:${commentId}:${uid}` : undefined,\n payload: {\n title: actorName ? `${actorName} mentioned you` : 'You were mentioned',\n body: bodyPreview,\n actorName,\n },\n });\n } catch (err) {\n try { (engine as any).logger?.warn?.('Mention notification emit failed', { uid, err: String((err as any)?.message ?? err) }); } catch {}\n }\n }\n };\n engine.registerHook('afterInsert', writeCommentMentions, { packageId });\n}\n\n/**\n * Identify the assignee/owner field of a record. We accept several\n * conventional names so this works across CRM-style objects (owner_id,\n * assigned_to) and platform objects (recipient_id is handled separately).\n */\nconst OWNER_FIELDS = ['owner_id', 'assigned_to', 'assignee_id', 'owner', 'assignee'];\n\nfunction pickOwner(rec: any): string | null {\n if (!rec || typeof rec !== 'object') return null;\n for (const f of OWNER_FIELDS) {\n const v = rec[f];\n if (typeof v === 'string' && v.length > 0) return v;\n }\n return null;\n}\n\nasync function writeAssignmentNotifications(\n messaging: MessagingEmitSurface | undefined,\n params: {\n object: string;\n recordId: string | null;\n label: string;\n action: 'create' | 'update' | 'delete';\n before: any;\n after: any;\n actorId: string | null;\n tenantId: string | null;\n },\n): Promise<void> {\n if (!messaging) return; // no pipeline installed → no assignment notifications\n if (params.action === 'delete') return;\n if (!params.recordId) return;\n\n const newOwner = pickOwner(params.after);\n const oldOwner = pickOwner(params.before);\n if (!newOwner) return;\n if (params.action === 'update' && newOwner === oldOwner) return;\n if (newOwner === params.actorId) return; // self-assignment is silent\n\n try {\n // ADR-0030 single ingress — emit() writes the L2 event and the inbox\n // channel materializes the bell row + a delivered receipt. organizationId\n // is propagated so the recipient (same tenant as the action) sees the\n // materialized row through RLS.\n // Dedup only a true double-fire of the SAME write: scope the key by the\n // record's write-version (updated_at). Without a version component the key\n // would be permanent and a legitimate re-assignment back to a prior owner\n // would be silently suppressed. When no version field exists, omit the key\n // (every assignment notifies — same as the pre-ADR-0030 direct-write path).\n const writeVersion =\n (params.after && typeof params.after === 'object'\n ? params.after.updated_at ?? params.after.modified_at ?? params.after.updated_date\n : null) ?? null;\n await messaging.emit({\n topic: 'collab.assignment',\n audience: [newOwner],\n severity: 'info',\n source: { object: params.object, id: params.recordId },\n actorId: params.actorId ?? undefined,\n organizationId: params.tenantId ?? undefined,\n dedupKey: writeVersion\n ? `collab.assignment:${params.object}:${params.recordId}:${newOwner}:${writeVersion}`\n : undefined,\n payload: {\n title: `${params.object} \"${params.label}\" assigned to you`,\n },\n });\n } catch {\n // best-effort; never throw into CRUD path\n }\n}\n\n// Re-export for convenience.\nexport type { IDataEngine };\n"],"mappings":"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","names":["import_data","import_data","prev","AuditTranslations"]}
package/dist/index.mjs CHANGED
@@ -1,7 +1,12 @@
1
1
  var __defProp = Object.defineProperty;
2
2
  var __getOwnPropNames = Object.getOwnPropertyNames;
3
- var __esm = (fn, res) => function __init() {
4
- return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
3
+ var __esm = (fn, res, err) => function __init() {
4
+ if (err) throw err[0];
5
+ try {
6
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
7
+ } catch (e) {
8
+ throw err = [e], e;
9
+ }
5
10
  };
6
11
  var __export = (target, all) => {
7
12
  for (var name in all)
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/translations/en.objects.generated.ts","../src/translations/zh-CN.objects.generated.ts","../src/translations/ja-JP.objects.generated.ts","../src/translations/es-ES.objects.generated.ts","../src/translations/index.ts","../src/objects/sys-audit-log.object.ts","../src/objects/sys-activity.object.ts","../src/objects/sys-comment.object.ts","../src/audit-plugin.ts","../src/audit-writers.ts"],"sourcesContent":["// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\n/**\n * Auto-generated by 'os i18n extract' for locale 'en'.\n * Edit translations in place; re-run extract (with --merge) to fill new gaps.\n * Do not hand-edit the structure — only the leaf string values.\n */\n\nimport type { TranslationData } from '@objectstack/spec/system';\n\nexport const enObjects: NonNullable<TranslationData['objects']> = {\n sys_audit_log: {\n label: \"Audit Log\",\n pluralLabel: \"Audit Logs\",\n description: \"Immutable audit trail for platform events\",\n fields: {\n created_at: {\n label: \"Timestamp\"\n },\n action: {\n label: \"Action\",\n help: \"Action type (snake_case)\",\n options: {\n create: \"create\",\n update: \"update\",\n delete: \"delete\",\n restore: \"restore\",\n login: \"login\",\n logout: \"logout\",\n permission_change: \"permission_change\",\n config_change: \"config_change\",\n export: \"export\",\n import: \"import\"\n }\n },\n user_id: {\n label: \"Actor\",\n help: \"User who performed the action (null for system actions)\"\n },\n object_name: {\n label: \"Object\",\n help: \"Target object (e.g. sys_user, project_task)\"\n },\n record_id: {\n label: \"Record ID\",\n help: \"ID of the affected record\"\n },\n old_value: {\n label: \"Old Value\",\n help: \"JSON-serialized previous state\"\n },\n new_value: {\n label: \"New Value\",\n help: \"JSON-serialized new state\"\n },\n ip_address: {\n label: \"IP Address\"\n },\n user_agent: {\n label: \"User Agent\"\n },\n tenant_id: {\n label: \"Tenant\",\n help: \"Tenant context for multi-tenant isolation\"\n },\n metadata: {\n label: \"Metadata\",\n help: \"JSON-serialized additional context\"\n },\n id: {\n label: \"Audit Log ID\"\n }\n },\n _views: {\n recent: {\n label: \"Recent\"\n },\n writes_only: {\n label: \"Writes\"\n },\n auth_events: {\n label: \"Auth\"\n },\n config_changes: {\n label: \"Config\"\n },\n all_events: {\n label: \"All\"\n }\n }\n },\n sys_activity: {\n label: \"Activity\",\n pluralLabel: \"Activities\",\n description: \"Recent activity stream entries (lightweight, denormalized)\",\n fields: {\n id: {\n label: \"Activity ID\"\n },\n timestamp: {\n label: \"Timestamp\"\n },\n type: {\n label: \"Type\",\n options: {\n created: \"created\",\n updated: \"updated\",\n deleted: \"deleted\",\n commented: \"commented\",\n mentioned: \"mentioned\",\n shared: \"shared\",\n assigned: \"assigned\",\n completed: \"completed\",\n login: \"login\",\n logout: \"logout\",\n system: \"system\"\n }\n },\n summary: {\n label: \"Summary\",\n help: \"Human-readable one-line summary\"\n },\n actor_id: {\n label: \"Actor\"\n },\n actor_name: {\n label: \"Actor Name\"\n },\n actor_avatar_url: {\n label: \"Actor Avatar\"\n },\n object_name: {\n label: \"Object\",\n help: \"Target object short name (e.g. account, sys_user)\"\n },\n record_id: {\n label: \"Record ID\"\n },\n record_label: {\n label: \"Record Label\",\n help: \"Display label of the target record at write time\"\n },\n url: {\n label: \"URL\",\n help: \"Optional deep-link to the activity target\"\n },\n environment_id: {\n label: \"Project\",\n help: \"Environment context (multi-environment deployments)\"\n },\n metadata: {\n label: \"Metadata\",\n help: \"JSON-serialized additional context\"\n }\n }\n },\n sys_comment: {\n label: \"Comment\",\n pluralLabel: \"Comments\",\n description: \"Threaded comments attached to records via thread_id\",\n fields: {\n id: {\n label: \"Comment ID\"\n },\n thread_id: {\n label: \"Thread\",\n help: \"Thread identifier — conventionally `{object}:{record_id}` (e.g. `sys_user:abc123`)\"\n },\n parent_id: {\n label: \"Parent Comment\",\n help: \"Optional parent comment for nested replies\"\n },\n reply_count: {\n label: \"Reply Count\"\n },\n author_id: {\n label: \"Author\"\n },\n author_name: {\n label: \"Author Name\"\n },\n author_avatar_url: {\n label: \"Author Avatar\"\n },\n body: {\n label: \"Body\",\n help: \"Comment text (Markdown supported)\"\n },\n mentions: {\n label: \"Mentions\",\n help: \"JSON array of @mention objects\"\n },\n reactions: {\n label: \"Reactions\",\n help: \"JSON array of emoji reaction objects\"\n },\n is_edited: {\n label: \"Edited\"\n },\n edited_at: {\n label: \"Edited At\"\n },\n visibility: {\n label: \"Visibility\",\n options: {\n public: \"public\",\n internal: \"internal\",\n private: \"private\"\n }\n },\n created_at: {\n label: \"Created At\"\n },\n updated_at: {\n label: \"Updated At\"\n }\n }\n }\n};\n","// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\n/**\n * Auto-generated by 'os i18n extract' for locale 'zh-CN'.\n * Edit translations in place; re-run extract (with --merge) to fill new gaps.\n * Do not hand-edit the structure — only the leaf string values.\n */\n\nimport type { TranslationData } from '@objectstack/spec/system';\n\nexport const zhCNObjects: NonNullable<TranslationData['objects']> = {\n sys_audit_log: {\n label: \"审计日志\",\n pluralLabel: \"审计日志\",\n description: \"平台事件的不可变审计追踪\",\n fields: {\n created_at: {\n label: \"时间戳\"\n },\n action: {\n label: \"操作\",\n help: \"操作类型(snake_case)\",\n options: {\n create: \"创建\",\n update: \"更新\",\n delete: \"删除\",\n restore: \"恢复\",\n login: \"登录\",\n logout: \"登出\",\n permission_change: \"权限变更\",\n config_change: \"配置变更\",\n export: \"导出\",\n import: \"导入\"\n }\n },\n user_id: {\n label: \"执行人\",\n help: \"执行该操作的用户(系统操作时为 null)\"\n },\n object_name: {\n label: \"对象\",\n help: \"目标对象(例如 sys_user、project_task)\"\n },\n record_id: {\n label: \"记录 ID\",\n help: \"受影响记录的 ID\"\n },\n old_value: {\n label: \"旧值\",\n help: \"旧状态的 JSON 序列化内容\"\n },\n new_value: {\n label: \"新值\",\n help: \"新状态的 JSON 序列化内容\"\n },\n ip_address: {\n label: \"IP 地址\"\n },\n user_agent: {\n label: \"用户代理\"\n },\n tenant_id: {\n label: \"租户\",\n help: \"用于多租户隔离的租户上下文\"\n },\n metadata: {\n label: \"元数据\",\n help: \"附加上下文的 JSON 序列化内容\"\n },\n id: {\n label: \"审计日志 ID\"\n }\n },\n _views: {\n recent: {\n label: \"最近\"\n },\n writes_only: {\n label: \"写入\"\n },\n auth_events: {\n label: \"认证\"\n },\n config_changes: {\n label: \"配置\"\n },\n all_events: {\n label: \"全部\"\n }\n }\n },\n sys_activity: {\n label: \"活动\",\n pluralLabel: \"活动\",\n description: \"最近活动流条目(轻量、去规范化)\",\n fields: {\n id: {\n label: \"活动 ID\"\n },\n timestamp: {\n label: \"时间戳\"\n },\n type: {\n label: \"类型\",\n options: {\n created: \"已创建\",\n updated: \"已更新\",\n deleted: \"已删除\",\n commented: \"已评论\",\n mentioned: \"被提及\",\n shared: \"已共享\",\n assigned: \"已分配\",\n completed: \"已完成\",\n login: \"登录\",\n logout: \"登出\",\n system: \"系统\"\n }\n },\n summary: {\n label: \"摘要\",\n help: \"人类可读的单行摘要\"\n },\n actor_id: {\n label: \"执行人\"\n },\n actor_name: {\n label: \"执行人名称\"\n },\n actor_avatar_url: {\n label: \"执行人头像\"\n },\n object_name: {\n label: \"对象\",\n help: \"目标对象短名称(例如 account、sys_user)\"\n },\n record_id: {\n label: \"记录 ID\"\n },\n record_label: {\n label: \"记录标签\",\n help: \"写入时目标记录的显示标签\"\n },\n url: {\n label: \"URL\",\n help: \"指向活动目标的可选深度链接\"\n },\n environment_id: {\n label: \"项目\",\n help: \"项目上下文(多项目部署)\"\n },\n metadata: {\n label: \"元数据\",\n help: \"附加上下文的 JSON 序列化内容\"\n }\n }\n },\n sys_comment: {\n label: \"评论\",\n pluralLabel: \"评论\",\n description: \"通过 thread_id 附加到记录的线程化评论\",\n fields: {\n id: {\n label: \"评论 ID\"\n },\n thread_id: {\n label: \"线程\",\n help: \"线程标识——约定格式为 `{object}:{record_id}`(例如 `sys_user:abc123`)\"\n },\n parent_id: {\n label: \"父评论\",\n help: \"可选的父评论,用于嵌套回复\"\n },\n reply_count: {\n label: \"回复数\"\n },\n author_id: {\n label: \"作者\"\n },\n author_name: {\n label: \"作者名称\"\n },\n author_avatar_url: {\n label: \"作者头像\"\n },\n body: {\n label: \"正文\",\n help: \"评论文本(支持 Markdown)\"\n },\n mentions: {\n label: \"提及\",\n help: \"@mention 对象的 JSON 数组\"\n },\n reactions: {\n label: \"回应\",\n help: \"表情回应对象的 JSON 数组\"\n },\n is_edited: {\n label: \"已编辑\"\n },\n edited_at: {\n label: \"编辑时间\"\n },\n visibility: {\n label: \"可见性\",\n options: {\n public: \"公开\",\n internal: \"内部\",\n private: \"私有\"\n }\n },\n created_at: {\n label: \"创建时间\"\n },\n updated_at: {\n label: \"更新时间\"\n }\n }\n }\n};\n","// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\n/**\n * Auto-generated by 'os i18n extract' for locale 'ja-JP'.\n * Edit translations in place; re-run extract (with --merge) to fill new gaps.\n * Do not hand-edit the structure — only the leaf string values.\n */\n\nimport type { TranslationData } from '@objectstack/spec/system';\n\nexport const jaJPObjects: NonNullable<TranslationData['objects']> = {\n sys_audit_log: {\n label: \"監査ログ\",\n pluralLabel: \"監査ログ\",\n description: \"プラットフォームイベントの不変の監査証跡\",\n fields: {\n created_at: {\n label: \"タイムスタンプ\"\n },\n action: {\n label: \"アクション\",\n help: \"アクションタイプ(snake_case)\",\n options: {\n create: \"作成\",\n update: \"更新\",\n delete: \"削除\",\n restore: \"復元\",\n login: \"ログイン\",\n logout: \"ログアウト\",\n permission_change: \"権限変更\",\n config_change: \"構成変更\",\n export: \"エクスポート\",\n import: \"インポート\"\n }\n },\n user_id: {\n label: \"操作者\",\n help: \"アクションを実行したユーザー(システム操作の場合は null)\"\n },\n object_name: {\n label: \"オブジェクト\",\n help: \"対象オブジェクト(例: sys_user、project_task)\"\n },\n record_id: {\n label: \"レコード ID\",\n help: \"影響を受けたレコードの ID\"\n },\n old_value: {\n label: \"変更前の値\",\n help: \"JSON シリアライズされた以前の状態\"\n },\n new_value: {\n label: \"変更後の値\",\n help: \"JSON シリアライズされた新しい状態\"\n },\n ip_address: {\n label: \"IP アドレス\"\n },\n user_agent: {\n label: \"ユーザーエージェント\"\n },\n tenant_id: {\n label: \"テナント\",\n help: \"マルチテナント分離のためのテナントコンテキスト\"\n },\n metadata: {\n label: \"メタデータ\",\n help: \"JSON シリアライズされた追加コンテキスト\"\n },\n id: {\n label: \"監査ログ ID\"\n }\n },\n _views: {\n recent: {\n label: \"最近\"\n },\n writes_only: {\n label: \"書き込み\"\n },\n auth_events: {\n label: \"認証\"\n },\n config_changes: {\n label: \"構成変更\"\n },\n all_events: {\n label: \"すべて\"\n }\n }\n },\n sys_activity: {\n label: \"アクティビティ\",\n pluralLabel: \"アクティビティ\",\n description: \"最近のアクティビティストリームエントリ(軽量、非正規化)\",\n fields: {\n id: {\n label: \"アクティビティ ID\"\n },\n timestamp: {\n label: \"タイムスタンプ\"\n },\n type: {\n label: \"タイプ\",\n options: {\n created: \"作成\",\n updated: \"更新\",\n deleted: \"削除\",\n commented: \"コメント\",\n mentioned: \"メンション\",\n shared: \"共有\",\n assigned: \"割り当て\",\n completed: \"完了\",\n login: \"ログイン\",\n logout: \"ログアウト\",\n system: \"システム\"\n }\n },\n summary: {\n label: \"サマリー\",\n help: \"判別しやすい 1 行サマリー\"\n },\n actor_id: {\n label: \"操作者\"\n },\n actor_name: {\n label: \"操作者名\"\n },\n actor_avatar_url: {\n label: \"操作者アバター\"\n },\n object_name: {\n label: \"オブジェクト\",\n help: \"対象オブジェクトの短い名前(例: account、sys_user)\"\n },\n record_id: {\n label: \"レコード ID\"\n },\n record_label: {\n label: \"レコード表示名\",\n help: \"書き込み時点の対象レコードの表示名\"\n },\n url: {\n label: \"URL\",\n help: \"アクティビティターゲットへのオプションのディープリンク\"\n },\n environment_id: {\n label: \"プロジェクト\",\n help: \"プロジェクトコンテキスト(マルチプロジェクトデプロイメント)\"\n },\n metadata: {\n label: \"メタデータ\",\n help: \"JSON シリアライズされた追加コンテキスト\"\n }\n }\n },\n sys_comment: {\n label: \"コメント\",\n pluralLabel: \"コメント\",\n description: \"thread_id を介してレコードに添付されたスレッドコメント\",\n fields: {\n id: {\n label: \"コメント ID\"\n },\n thread_id: {\n label: \"スレッド\",\n help: \"スレッド識別子 — 通常は `{object}:{record_id}`(例: `sys_user:abc123`)\"\n },\n parent_id: {\n label: \"親コメント\",\n help: \"ネストした返信用のオプションの親コメント\"\n },\n reply_count: {\n label: \"返信数\"\n },\n author_id: {\n label: \"投稿者\"\n },\n author_name: {\n label: \"投稿者名\"\n },\n author_avatar_url: {\n label: \"投稿者アバター\"\n },\n body: {\n label: \"本文\",\n help: \"コメントテキスト(Markdown 対応)\"\n },\n mentions: {\n label: \"メンション\",\n help: \"@メンションオブジェクトの JSON 配列\"\n },\n reactions: {\n label: \"リアクション\",\n help: \"絵文字リアクションオブジェクトの JSON 配列\"\n },\n is_edited: {\n label: \"編集済み\"\n },\n edited_at: {\n label: \"編集日時\"\n },\n visibility: {\n label: \"公開範囲\",\n options: {\n public: \"公開\",\n internal: \"内部\",\n private: \"非公開\"\n }\n },\n created_at: {\n label: \"作成日時\"\n },\n updated_at: {\n label: \"更新日時\"\n }\n }\n }\n};\n","// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\n/**\n * Auto-generated by 'os i18n extract' for locale 'es-ES'.\n * Edit translations in place; re-run extract (with --merge) to fill new gaps.\n * Do not hand-edit the structure — only the leaf string values.\n */\n\nimport type { TranslationData } from '@objectstack/spec/system';\n\nexport const esESObjects: NonNullable<TranslationData['objects']> = {\n sys_audit_log: {\n label: \"Registro de auditoría\",\n pluralLabel: \"Registros de auditoría\",\n description: \"Registro de auditoría inmutable para eventos de la plataforma\",\n fields: {\n created_at: {\n label: \"Marca temporal\"\n },\n action: {\n label: \"Acción\",\n help: \"Tipo de acción (snake_case).\",\n options: {\n create: \"Crear\",\n update: \"Actualizar\",\n delete: \"Eliminar\",\n restore: \"Restaurar\",\n login: \"Inicio de sesión\",\n logout: \"Cierre de sesión\",\n permission_change: \"Cambio de permisos\",\n config_change: \"Cambio de configuración\",\n export: \"Exportar\",\n import: \"Importar\"\n }\n },\n user_id: {\n label: \"Actor\",\n help: \"Usuario que realizó la acción (null para acciones del sistema).\"\n },\n object_name: {\n label: \"Objeto\",\n help: \"Objeto de destino (p. ej. sys_user, project_task).\"\n },\n record_id: {\n label: \"ID de registro\",\n help: \"ID del registro afectado.\"\n },\n old_value: {\n label: \"Valor anterior\",\n help: \"Estado anterior serializado en JSON.\"\n },\n new_value: {\n label: \"Valor nuevo\",\n help: \"Estado nuevo serializado en JSON.\"\n },\n ip_address: {\n label: \"Dirección IP\"\n },\n user_agent: {\n label: \"Agente de usuario\"\n },\n tenant_id: {\n label: \"Inquilino\",\n help: \"Contexto del tenant para el aislamiento multi-tenant.\"\n },\n metadata: {\n label: \"Metadatos\",\n help: \"Contexto adicional serializado en JSON.\"\n },\n id: {\n label: \"ID de registro de auditoría\"\n }\n },\n _views: {\n recent: {\n label: \"Recientes\"\n },\n writes_only: {\n label: \"Escrituras\"\n },\n auth_events: {\n label: \"Autenticación\"\n },\n config_changes: {\n label: \"Configuración\"\n },\n all_events: {\n label: \"Todos\"\n }\n }\n },\n sys_activity: {\n label: \"Actividad\",\n pluralLabel: \"Actividades\",\n description: \"Entradas recientes del flujo de actividad (ligeras y desnormalizadas).\",\n fields: {\n id: {\n label: \"ID de actividad\"\n },\n timestamp: {\n label: \"Marca temporal\"\n },\n type: {\n label: \"Tipo\",\n options: {\n created: \"Creado\",\n updated: \"Actualizado\",\n deleted: \"Eliminado\",\n commented: \"Comentado\",\n mentioned: \"Mencionado\",\n shared: \"Compartido\",\n assigned: \"Asignado\",\n completed: \"Completado\",\n login: \"Inicio de sesión\",\n logout: \"Cierre de sesión\",\n system: \"Sistema\"\n }\n },\n summary: {\n label: \"Resumen\",\n help: \"Resumen legible de una línea.\"\n },\n actor_id: {\n label: \"Actor\"\n },\n actor_name: {\n label: \"Nombre del actor\"\n },\n actor_avatar_url: {\n label: \"Avatar del actor\"\n },\n object_name: {\n label: \"Objeto\",\n help: \"Nombre corto del objeto de destino (p. ej. account, sys_user).\"\n },\n record_id: {\n label: \"ID de registro\"\n },\n record_label: {\n label: \"Nombre visible del registro\",\n help: \"Nombre visible del registro de destino en el momento de escritura.\"\n },\n url: {\n label: \"URL\",\n help: \"Enlace profundo opcional al destino de la actividad.\"\n },\n environment_id: {\n label: \"Proyecto\",\n help: \"Contexto del proyecto (implementaciones multiproyecto).\"\n },\n metadata: {\n label: \"Metadatos\",\n help: \"Contexto adicional serializado en JSON.\"\n }\n }\n },\n sys_comment: {\n label: \"Comentario\",\n pluralLabel: \"Comentarios\",\n description: \"Comentarios en hilo adjuntos a registros mediante thread_id.\",\n fields: {\n id: {\n label: \"ID de comentario\"\n },\n thread_id: {\n label: \"Hilo\",\n help: \"Identificador del hilo; por convención `{object}:{record_id}` (p. ej. `sys_user:abc123`).\"\n },\n parent_id: {\n label: \"Comentario principal\",\n help: \"Comentario principal opcional para respuestas anidadas.\"\n },\n reply_count: {\n label: \"Número de respuestas\"\n },\n author_id: {\n label: \"Autor\"\n },\n author_name: {\n label: \"Nombre del autor\"\n },\n author_avatar_url: {\n label: \"Avatar del autor\"\n },\n body: {\n label: \"Contenido\",\n help: \"Texto del comentario (compatible con Markdown).\"\n },\n mentions: {\n label: \"Menciones\",\n help: \"Matriz JSON de objetos @mention.\"\n },\n reactions: {\n label: \"Reacciones\",\n help: \"Matriz JSON de objetos de reacción emoji.\"\n },\n is_edited: {\n label: \"Editado\"\n },\n edited_at: {\n label: \"Editado el\"\n },\n visibility: {\n label: \"Visibilidad\",\n options: {\n public: \"Público\",\n internal: \"Interno\",\n private: \"Privado\"\n }\n },\n created_at: {\n label: \"Creado el\"\n },\n updated_at: {\n label: \"Actualizado el\"\n }\n }\n }\n};\n","// Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license.\n\n/**\n * AuditTranslations — i18n bundle owned by this plugin (ADR-0029 D8).\n *\n * Object label/field/view/action translations for the sys_* objects this\n * plugin owns (sys_audit_log / sys_activity / sys_comment / sys_attachment).\n * Loaded at runtime via the plugin's `kernel:ready` hook\n * (`i18n.loadTranslations`). Regenerate with `os i18n extract` against\n * `scripts/i18n-extract.config.ts`.\n */\n\nimport type { TranslationBundle } from '@objectstack/spec/system';\nimport { enObjects } from './en.objects.generated.js';\nimport { zhCNObjects } from './zh-CN.objects.generated.js';\nimport { jaJPObjects } from './ja-JP.objects.generated.js';\nimport { esESObjects } from './es-ES.objects.generated.js';\n\nexport const AuditTranslations: TranslationBundle = {\n en: { objects: enObjects },\n 'zh-CN': { objects: zhCNObjects },\n 'ja-JP': { objects: jaJPObjects },\n 'es-ES': { objects: esESObjects },\n};\n","// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport { ObjectSchema, Field } from '@objectstack/spec/data';\n\n/**\n * sys_audit_log — System Audit Log Object\n *\n * Immutable audit trail for all significant platform events.\n * Records who did what, when, and the before/after state.\n *\n * Every field is `readonly: true` — audit logs are written only by\n * internal system hooks, never via UI forms. API exposes only `get` + `list`.\n *\n * @namespace sys\n */\nexport const SysAuditLog = ObjectSchema.create({\n name: 'sys_audit_log',\n label: 'Audit Log',\n pluralLabel: 'Audit Logs',\n icon: 'scroll-text',\n isSystem: true,\n managedBy: 'append-only',\n description: 'Immutable audit trail for platform events',\n displayNameField: 'action',\n titleFormat: '{action} · {object_name}',\n compactLayout: ['created_at', 'action', 'object_name', 'record_id', 'user_id'],\n\n listViews: {\n recent: {\n type: 'grid',\n name: 'recent',\n label: 'Recent',\n data: { provider: 'object', object: 'sys_audit_log' },\n columns: ['created_at', 'action', 'object_name', 'record_id', 'user_id'],\n sort: [{ field: 'created_at', order: 'desc' }],\n pagination: { pageSize: 50 },\n emptyState: { title: 'No audit events', message: 'Activity will appear here as users interact with the platform.' },\n },\n writes_only: {\n type: 'grid',\n name: 'writes_only',\n label: 'Writes',\n data: { provider: 'object', object: 'sys_audit_log' },\n columns: ['created_at', 'action', 'object_name', 'record_id', 'user_id'],\n filter: [{ field: 'action', operator: 'in', value: ['create', 'update', 'delete', 'restore'] }],\n sort: [{ field: 'created_at', order: 'desc' }],\n pagination: { pageSize: 50 },\n },\n auth_events: {\n type: 'grid',\n name: 'auth_events',\n label: 'Auth',\n data: { provider: 'object', object: 'sys_audit_log' },\n columns: ['created_at', 'action', 'user_id'],\n filter: [{ field: 'action', operator: 'in', value: ['login', 'logout', 'permission_change'] }],\n sort: [{ field: 'created_at', order: 'desc' }],\n pagination: { pageSize: 50 },\n },\n config_changes: {\n type: 'grid',\n name: 'config_changes',\n label: 'Config',\n data: { provider: 'object', object: 'sys_audit_log' },\n columns: ['created_at', 'action', 'object_name', 'user_id'],\n filter: [{ field: 'action', operator: 'in', value: ['config_change', 'export', 'import'] }],\n sort: [{ field: 'created_at', order: 'desc' }],\n pagination: { pageSize: 50 },\n },\n all_events: {\n type: 'grid',\n name: 'all_events',\n label: 'All',\n data: { provider: 'object', object: 'sys_audit_log' },\n columns: ['created_at', 'action', 'object_name', 'record_id', 'user_id'],\n sort: [{ field: 'created_at', order: 'desc' }],\n pagination: { pageSize: 100 },\n },\n },\n\n fields: {\n // ── Event ────────────────────────────────────────────────────\n created_at: Field.datetime({\n label: 'Timestamp',\n required: true,\n defaultValue: 'NOW()',\n readonly: true,\n group: 'Event',\n }),\n\n action: Field.select(\n ['create', 'update', 'delete', 'restore', 'login', 'logout', 'permission_change', 'config_change', 'export', 'import'],\n {\n label: 'Action',\n required: true,\n readonly: true,\n searchable: true,\n description: 'Action type (snake_case)',\n group: 'Event',\n },\n ),\n\n user_id: Field.lookup('sys_user', {\n label: 'Actor',\n required: false,\n readonly: true,\n searchable: true,\n description: 'User who performed the action (null for system actions)',\n group: 'Event',\n }),\n\n // ── Target record ────────────────────────────────────────────\n object_name: Field.text({\n label: 'Object',\n required: false,\n readonly: true,\n searchable: true,\n maxLength: 255,\n description: 'Target object (e.g. sys_user, project_task)',\n group: 'Target',\n }),\n\n record_id: Field.text({\n label: 'Record ID',\n required: false,\n readonly: true,\n searchable: true,\n description: 'ID of the affected record',\n group: 'Target',\n }),\n\n // ── Change payload ───────────────────────────────────────────\n old_value: Field.textarea({\n label: 'Old Value',\n required: false,\n readonly: true,\n description: 'JSON-serialized previous state',\n group: 'Changes',\n }),\n\n new_value: Field.textarea({\n label: 'New Value',\n required: false,\n readonly: true,\n description: 'JSON-serialized new state',\n group: 'Changes',\n }),\n\n // ── Client fingerprint ───────────────────────────────────────\n ip_address: Field.text({\n label: 'IP Address',\n required: false,\n readonly: true,\n maxLength: 45,\n group: 'Client',\n }),\n\n user_agent: Field.textarea({\n label: 'User Agent',\n required: false,\n readonly: true,\n group: 'Client',\n }),\n\n // ── Context ──────────────────────────────────────────────────\n tenant_id: Field.lookup('sys_organization', {\n label: 'Tenant',\n required: false,\n readonly: true,\n description: 'Tenant context for multi-tenant isolation',\n group: 'Context',\n }),\n\n metadata: Field.textarea({\n label: 'Metadata',\n required: false,\n readonly: true,\n description: 'JSON-serialized additional context',\n group: 'Context',\n }),\n\n // ── System ───────────────────────────────────────────────────\n id: Field.text({\n label: 'Audit Log ID',\n required: true,\n readonly: true,\n group: 'System',\n }),\n },\n\n indexes: [\n { fields: ['created_at'] },\n { fields: ['user_id'] },\n { fields: ['object_name', 'record_id'] },\n { fields: ['action'] },\n { fields: ['tenant_id'] },\n ],\n\n enable: {\n trackHistory: false, // Audit logs are themselves the audit trail\n searchable: true,\n apiEnabled: true,\n apiMethods: ['get', 'list'], // Read-only — creation happens via internal system hooks only\n trash: false, // Never soft-delete audit logs\n mru: false,\n clone: false,\n },\n});\n","// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport { ObjectSchema, Field } from '@objectstack/spec/data';\n\n/**\n * sys_activity — Lightweight Activity Stream\n *\n * Append-only \"recent activity\" feed shown on dashboards / overview\n * pages. Distinct from `sys_audit_log` (compliance-grade, structured\n * before/after diffs) and `feed_item` (record-scoped Chatter timeline\n * with comments/reactions/threads). Activity entries are denormalized\n * snapshots optimized for chronological \"what happened lately\" reads.\n *\n * Typical write sources: data triggers, plugin events, UI actions.\n * Typical readers: Studio dashboard, mobile inbox, notification jobs.\n *\n * @namespace sys\n */\nexport const SysActivity = ObjectSchema.create({\n name: 'sys_activity',\n label: 'Activity',\n pluralLabel: 'Activities',\n icon: 'activity',\n isSystem: true,\n managedBy: 'append-only',\n description: 'Recent activity stream entries (lightweight, denormalized)',\n displayNameField: 'summary',\n titleFormat: '{type} · {summary}',\n compactLayout: ['timestamp', 'type', 'actor_name', 'summary'],\n\n fields: {\n id: Field.text({\n label: 'Activity ID',\n required: true,\n readonly: true,\n group: 'System',\n }),\n\n timestamp: Field.datetime({\n label: 'Timestamp',\n required: true,\n defaultValue: 'NOW()',\n readonly: true,\n group: 'Event',\n }),\n\n type: Field.select(\n [\n 'created',\n 'updated',\n 'deleted',\n 'commented',\n 'mentioned',\n 'shared',\n 'assigned',\n 'completed',\n 'login',\n 'logout',\n 'system',\n ],\n {\n label: 'Type',\n required: true,\n readonly: true,\n searchable: true,\n group: 'Event',\n },\n ),\n\n summary: Field.text({\n label: 'Summary',\n required: true,\n readonly: true,\n maxLength: 500,\n searchable: true,\n description: 'Human-readable one-line summary',\n group: 'Event',\n }),\n\n // ── Actor ───────────────────────────────────────────────────\n actor_id: Field.lookup('sys_user', {\n label: 'Actor',\n required: false,\n readonly: true,\n searchable: true,\n group: 'Actor',\n }),\n\n actor_name: Field.text({\n label: 'Actor Name',\n required: false,\n readonly: true,\n group: 'Actor',\n }),\n\n actor_avatar_url: Field.url({\n label: 'Actor Avatar',\n required: false,\n readonly: true,\n group: 'Actor',\n }),\n\n // ── Target ───────────────────────────────────────────────────\n object_name: Field.text({\n label: 'Object',\n required: false,\n readonly: true,\n searchable: true,\n maxLength: 255,\n description: 'Target object short name (e.g. account, sys_user)',\n group: 'Target',\n }),\n\n record_id: Field.text({\n label: 'Record ID',\n required: false,\n readonly: true,\n searchable: true,\n group: 'Target',\n }),\n\n record_label: Field.text({\n label: 'Record Label',\n required: false,\n readonly: true,\n maxLength: 255,\n description: 'Display label of the target record at write time',\n group: 'Target',\n }),\n\n url: Field.url({\n label: 'URL',\n required: false,\n readonly: true,\n description: 'Optional deep-link to the activity target',\n group: 'Target',\n }),\n\n // ── Context ──────────────────────────────────────────────────\n environment_id: Field.lookup('sys_environment', {\n label: 'Environment',\n required: false,\n readonly: true,\n searchable: true,\n description: 'Environment context (multi-environment deployments)',\n group: 'Context',\n }),\n\n metadata: Field.textarea({\n label: 'Metadata',\n required: false,\n readonly: true,\n description: 'JSON-serialized additional context',\n group: 'Context',\n }),\n },\n\n indexes: [\n { fields: ['timestamp'] },\n { fields: ['actor_id'] },\n { fields: ['object_name', 'record_id'] },\n { fields: ['type'] },\n { fields: ['environment_id'] },\n ],\n\n enable: {\n trackHistory: false,\n searchable: true,\n apiEnabled: true,\n apiMethods: ['get', 'list'],\n trash: false,\n mru: false,\n clone: false,\n },\n});\n","// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport { ObjectSchema, Field } from '@objectstack/spec/data';\n\n/**\n * sys_comment — Threaded Record Comments\n *\n * Generic threaded discussion attached to any record via `thread_id`.\n * `thread_id` is conventionally formatted as `{object}:{record_id}`\n * (e.g. `sys_user:abc123`, `account:9001`) so a single index covers\n * \"all comments on this record\" lookups across every object.\n *\n * Distinct from `feed_item` (Salesforce-style Chatter timeline that\n * mixes comments with field changes / events / approvals). Use\n * `sys_comment` when you want a focused threaded discussion surface\n * without the heavier Chatter envelope.\n *\n * @namespace sys\n */\nexport const SysComment = ObjectSchema.create({\n name: 'sys_comment',\n label: 'Comment',\n pluralLabel: 'Comments',\n icon: 'message-square',\n isSystem: true,\n managedBy: 'platform',\n description: 'Threaded comments attached to records via thread_id',\n displayNameField: 'body',\n titleFormat: '{author_name}: {body}',\n compactLayout: ['created_at', 'author_name', 'body'],\n\n fields: {\n id: Field.text({\n label: 'Comment ID',\n required: true,\n readonly: true,\n group: 'System',\n }),\n\n // ── Thread ───────────────────────────────────────────────────\n thread_id: Field.text({\n label: 'Thread',\n required: true,\n searchable: true,\n maxLength: 255,\n description:\n 'Thread identifier — conventionally `{object}:{record_id}` (e.g. `sys_user:abc123`)',\n group: 'Thread',\n }),\n\n parent_id: Field.lookup('sys_comment', {\n label: 'Parent Comment',\n required: false,\n description: 'Optional parent comment for nested replies',\n group: 'Thread',\n }),\n\n reply_count: Field.number({\n label: 'Reply Count',\n defaultValue: 0,\n readonly: true,\n group: 'Thread',\n }),\n\n // ── Author ───────────────────────────────────────────────────\n author_id: Field.lookup('sys_user', {\n label: 'Author',\n required: true,\n searchable: true,\n group: 'Author',\n }),\n\n author_name: Field.text({\n label: 'Author Name',\n required: false,\n group: 'Author',\n }),\n\n author_avatar_url: Field.url({\n label: 'Author Avatar',\n required: false,\n group: 'Author',\n }),\n\n // ── Body ─────────────────────────────────────────────────────\n body: Field.textarea({\n label: 'Body',\n required: true,\n searchable: true,\n description: 'Comment text (Markdown supported)',\n group: 'Body',\n }),\n\n mentions: Field.textarea({\n label: 'Mentions',\n required: false,\n description: 'JSON array of @mention objects',\n group: 'Body',\n }),\n\n reactions: Field.textarea({\n label: 'Reactions',\n required: false,\n description: 'JSON array of emoji reaction objects',\n group: 'Body',\n }),\n\n // ── Lifecycle ────────────────────────────────────────────────\n is_edited: Field.boolean({\n label: 'Edited',\n defaultValue: false,\n group: 'Lifecycle',\n }),\n\n edited_at: Field.datetime({\n label: 'Edited At',\n required: false,\n group: 'Lifecycle',\n }),\n\n visibility: Field.select(\n ['public', 'internal', 'private'],\n {\n label: 'Visibility',\n defaultValue: 'public',\n group: 'Lifecycle',\n },\n ),\n\n created_at: Field.datetime({\n label: 'Created At',\n required: true,\n defaultValue: 'NOW()',\n readonly: true,\n group: 'System',\n }),\n\n updated_at: Field.datetime({\n label: 'Updated At',\n required: false,\n group: 'System',\n }),\n },\n\n indexes: [\n { fields: ['thread_id', 'created_at'] },\n { fields: ['parent_id'] },\n { fields: ['author_id'] },\n ],\n\n enable: {\n trackHistory: true,\n searchable: true,\n apiEnabled: true,\n trash: true,\n mru: false,\n clone: false,\n },\n});\n","// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport type { Plugin, PluginContext } from '@objectstack/core';\nimport type { IDataEngine } from '@objectstack/spec/contracts';\nimport { SysAuditLog, SysActivity, SysComment } from './objects/index.js';\n// Registered here but still owned by platform-objects (the plugin contributes\n// them to the kernel without owning the definition yet):\n// - sys_notification — reworked by ADR-0030 messaging (notification→event).\n// - sys_attachment — a file↔record link belonging with service-storage's\n// sys_file; moves in the storage-domain decomposition, not this audit move.\nimport { SysNotification, SysAttachment } from '@objectstack/platform-objects/audit';\nimport { installAuditWriters, type MessagingEmitSurface } from './audit-writers.js';\n\n/**\n * AuditPlugin\n *\n * Registers the sys_audit_log / sys_activity / sys_comment system objects\n * and installs ObjectQL hook subscribers that automatically write audit\n * trail + activity stream rows on every data mutation.\n *\n * Implements ROADMAP M10.1 (CRM production-readiness).\n */\nexport class AuditPlugin implements Plugin {\n name = 'com.objectstack.audit';\n type = 'standard';\n version = '1.0.0';\n dependencies = ['com.objectstack.engine.objectql'];\n\n async init(ctx: PluginContext): Promise<void> {\n process.stderr.write('[AuditPlugin] init() called\\n');\n // Register audit system objects via the manifest service.\n ctx.getService<{ register(m: any): void }>('manifest').register({\n id: 'com.objectstack.audit',\n name: 'Audit',\n version: '1.0.0',\n type: 'plugin',\n scope: 'system',\n defaultDatasource: 'cloud',\n namespace: 'sys',\n objects: [SysAuditLog, SysActivity, SysComment, SysAttachment, SysNotification],\n // ADR-0029 D7 — contribute the Audit Logs entry into the Setup app's\n // `group_diagnostics` slot. The plugin owns sys_audit_log (K2).\n navigationContributions: [\n {\n app: 'setup',\n group: 'group_diagnostics',\n priority: 100,\n items: [\n { id: 'nav_audit_logs', type: 'object', label: 'Audit Logs', objectName: 'sys_audit_log', icon: 'scroll-text' },\n ],\n },\n ],\n });\n\n // ADR-0029 D8 — contribute this plugin's object translations to the i18n\n // service on kernel:ready (the i18n plugin may register after this one).\n if (typeof (ctx as any).hook === 'function') {\n (ctx as any).hook('kernel:ready', async () => {\n try {\n const i18n = ctx.getService<any>('i18n');\n if (i18n && typeof i18n.loadTranslations === 'function') {\n const { AuditTranslations } = await import('./translations/index.js');\n for (const [locale, data] of Object.entries(AuditTranslations)) {\n i18n.loadTranslations(locale, data as Record<string, unknown>);\n }\n }\n } catch { /* i18n optional */ }\n });\n }\n\n ctx.logger.info('Audit Plugin initialized');\n }\n\n async start(ctx: PluginContext): Promise<void> {\n process.stderr.write('[AuditPlugin] start() called, registering kernel:ready hook\\n');\n // ObjectQL engine is only resolvable after the kernel is ready.\n ctx.hook('kernel:ready', async () => {\n process.stderr.write('[AuditPlugin] kernel:ready fired\\n');\n let engine: IDataEngine | null = null;\n try {\n engine = ctx.getService<IDataEngine>('objectql');\n process.stderr.write(`[AuditPlugin] objectql engine = ${engine ? 'OK' : 'null'} registerHook? ${typeof (engine as any)?.registerHook}\\n`);\n } catch (err) {\n process.stderr.write(`[AuditPlugin] getService(objectql) threw: ${(err as Error).message}\\n`);\n // Fallback alias used in some kernels.\n try {\n engine = ctx.getService<IDataEngine>('data');\n process.stderr.write(`[AuditPlugin] data engine = ${engine ? 'OK' : 'null'}\\n`);\n } catch { /* ignore */ }\n }\n if (!engine) {\n process.stderr.write('[AuditPlugin] NO ENGINE — bailing\\n');\n ctx.logger.warn('AuditPlugin: ObjectQL engine not available — audit writers NOT installed');\n return;\n }\n // Resolve the messaging service lazily at hook time so collaboration\n // @mention / assignment notifications go through the ADR-0030 single\n // ingress (emit) instead of writing sys_notification directly. Messaging\n // may register after audit; lazy resolution tolerates either order.\n const getMessaging = (): MessagingEmitSurface | undefined => {\n try {\n return ctx.getService<MessagingEmitSurface>('messaging');\n } catch {\n return undefined;\n }\n };\n installAuditWriters(engine as any, this.name, { getMessaging });\n process.stderr.write('[AuditPlugin] writers installed\\n');\n ctx.logger.info('AuditPlugin: audit + activity writers installed');\n });\n }\n}\n","// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport type { HookContext } from '@objectstack/spec/data';\nimport type { IDataEngine } from '@objectstack/spec/contracts';\n\n/**\n * Minimal structural view of `NotificationService.emit` (ADR-0030). Declared\n * locally so plugin-audit takes no runtime dependency on service-messaging — it\n * resolves whatever object is registered under the `messaging` service at hook\n * time and routes collaboration notifications through the single ingress.\n */\nexport interface MessagingEmitSurface {\n emit(input: {\n topic: string;\n audience: string[];\n payload?: Record<string, unknown>;\n severity?: 'info' | 'warning' | 'critical';\n dedupKey?: string;\n source?: { object: string; id: string };\n actorId?: string;\n organizationId?: string;\n }): Promise<unknown>;\n}\n\n/** Options for {@link installAuditWriters}. */\nexport interface AuditWriterOptions {\n /**\n * Lazily resolve the messaging service so collaboration `@mention` /\n * assignment notifications go through the ADR-0030 single ingress rather than\n * writing `sys_notification` directly. Returns `undefined` when messaging is\n * not installed — those notifications are then skipped (no pipeline, no bell),\n * matching the `notify` node's degradation.\n */\n getMessaging?(): MessagingEmitSurface | undefined;\n}\n\n/**\n * Audit writer hook installer.\n *\n * Subscribes to the ObjectQL engine's wildcard `before*` / `after*` lifecycle\n * events and writes:\n *\n * - `sys_audit_log` rows — immutable, compliance-grade entries with\n * field-level `old_value` / `new_value` diffs.\n * - `sys_activity` rows — denormalized, human-readable summaries shown\n * in the dashboard recent-activity feed and per-record timelines.\n *\n * Skip rules avoid recursion and noise:\n * - Never audit the audit/activity tables themselves.\n * - Never audit session/presence/auth tables (high-frequency, low value).\n * - Read-only operations (`afterFind`) are never audited.\n *\n * All writes go through `ctx.api.sudo()` so they bypass record-level\n * permissions and always succeed regardless of the calling user's RBAC.\n */\n\n/** Tables that are intentionally excluded from audit/activity writes. */\nconst SKIP_OBJECTS = new Set<string>([\n 'sys_audit_log',\n 'sys_activity',\n 'sys_comment',\n 'sys_session',\n 'sys_presence',\n 'sys_account',\n 'sys_account_session',\n 'sys_account_verification',\n 'sys_account_account',\n]);\n\n/** Fields that are noise in diffs (always change, never user-meaningful). */\nconst NOISE_FIELDS = new Set<string>([\n 'updated_at',\n 'updated_by',\n 'created_at',\n 'created_by',\n]);\n\n/** Action name produced from a HookContext.event string. */\nfunction actionFor(event: string): 'create' | 'update' | 'delete' | null {\n if (event === 'afterInsert') return 'create';\n if (event === 'afterUpdate') return 'update';\n if (event === 'afterDelete') return 'delete';\n return null;\n}\n\n/** Activity type produced from an audit action. */\nfunction activityTypeFor(action: 'create' | 'update' | 'delete'): 'created' | 'updated' | 'deleted' {\n return action === 'create' ? 'created' : action === 'update' ? 'updated' : 'deleted';\n}\n\n/**\n * Compute the human-readable record label from a record by trying common\n * label fields. Falls back to record id.\n */\nfunction recordLabel(record: any, id: string): string {\n if (!record || typeof record !== 'object') return id;\n const candidates = ['name', 'subject', 'title', 'full_name', 'label', 'first_name', 'company', 'email'];\n for (const k of candidates) {\n const v = record[k];\n if (typeof v === 'string' && v.trim()) return v.trim();\n }\n return id;\n}\n\n/**\n * Compute a shallow JSON diff between two records. Returns only keys whose\n * value changed (and ignores keys in `NOISE_FIELDS`). Both sides are\n * serialisable via `JSON.stringify` — values that fail to serialise are\n * coerced to `String(value)`.\n */\nfunction diff(before: Record<string, any>, after: Record<string, any>): { old: Record<string, any>; next: Record<string, any> } {\n const oldOut: Record<string, any> = {};\n const newOut: Record<string, any> = {};\n const keys = new Set<string>([...Object.keys(before || {}), ...Object.keys(after || {})]);\n for (const k of keys) {\n if (NOISE_FIELDS.has(k)) continue;\n const b = before?.[k];\n const a = after?.[k];\n if (safeStringify(b) !== safeStringify(a)) {\n oldOut[k] = b ?? null;\n newOut[k] = a ?? null;\n }\n }\n return { old: oldOut, next: newOut };\n}\n\nfunction safeStringify(v: any): string {\n try { return JSON.stringify(v); } catch { return String(v); }\n}\n\n/**\n * Install audit + activity writers on the given engine. Idempotent per\n * `packageId` — calling twice with the same id replaces the previous\n * registration.\n */\nexport function installAuditWriters(\n engine: any,\n packageId = 'com.objectstack.audit',\n opts: AuditWriterOptions = {},\n): void {\n if (!engine || typeof engine.registerHook !== 'function') return;\n\n const getMessaging = opts.getMessaging ?? (() => undefined);\n\n // Remove any prior installation so we can safely re-install on hot reload.\n if (typeof engine.unregisterHooksByPackage === 'function') {\n engine.unregisterHooksByPackage(packageId);\n }\n\n // Whether a given object's *registered* schema declares a field. The\n // SchemaRegistry auto-injects `organization_id` only in multi-tenant mode\n // (`applySystemFields({ multiTenant })`), so on single-tenant stacks the\n // `sys_audit_log` / `sys_activity` tables have no `organization_id` column.\n // Unconditionally stamping it there made every audit INSERT fail with\n // \"table sys_audit_log has no column named organization_id\" (the error was\n // swallowed, so audit logging was silently non-functional). Resolve the\n // field set lazily from the engine schema and cache it — object schemas are\n // static after registration.\n const fieldSetCache = new Map<string, Set<string> | null>();\n const objectHasField = (objectName: string, field: string): boolean => {\n let set = fieldSetCache.get(objectName);\n if (set === undefined) {\n set = null;\n try {\n const schema: any =\n typeof (engine as any).getSchema === 'function' ? (engine as any).getSchema(objectName) : null;\n const fields = schema?.fields;\n if (fields && typeof fields === 'object' && !Array.isArray(fields)) {\n set = new Set<string>(Object.keys(fields));\n } else if (Array.isArray(fields)) {\n set = new Set<string>(fields.map((f: any) => f?.name).filter(Boolean));\n }\n } catch {\n /* ignore — best-effort; absence just means we skip the stamp */\n }\n fieldSetCache.set(objectName, set);\n }\n return set != null && set.has(field);\n };\n\n /**\n * beforeUpdate / beforeDelete: capture \"previous\" snapshot via api.sudo()\n * so we can compute the diff in the afterXxx hook. We attach the snapshot\n * to the context (`(ctx as any).__previous`) since `HookContext.previous`\n * is officially typed but not always populated by the engine itself.\n */\n const captureBefore = async (ctx: HookContext) => {\n if (SKIP_OBJECTS.has(ctx.object)) return;\n const id = (ctx.input as any)?.id;\n if (!id) return; // bulk update/delete — too costly to snapshot every row here\n try {\n // Use the engine directly (not api.sudo) so we can thread the\n // active transaction through. On drivers with single-connection\n // pools (e.g. SQLite via knex) a sudo() findOne that does NOT\n // carry the open transaction will deadlock for the full\n // acquireConnectionTimeout (~60s) because the outer transaction\n // holds the only connection.\n const trx = (ctx as any).transaction;\n const ql = (ctx as any).ql ?? (ctx as any).api?.engine;\n if (ql?.findOne) {\n const prev = await ql.findOne(ctx.object, {\n where: { id },\n context: { isSystem: true, ...(trx ? { transaction: trx } : {}) },\n });\n if (prev) (ctx as any).__previous = prev;\n return;\n }\n const api: any = (ctx as any).api;\n if (!api?.sudo) return;\n const prev = await api.sudo().object(ctx.object).findOne({ where: { id } });\n if (prev) (ctx as any).__previous = prev;\n } catch {\n /* ignore — best-effort */\n }\n };\n\n engine.registerHook('beforeUpdate', captureBefore, { packageId });\n engine.registerHook('beforeDelete', captureBefore, { packageId });\n\n /**\n * afterInsert / afterUpdate / afterDelete: write audit_log + activity rows.\n * Errors are swallowed (logged) so user-facing CRUD is never broken by\n * audit failures.\n */\n const writeAudit = async (ctx: HookContext) => {\n if (SKIP_OBJECTS.has(ctx.object)) return;\n const action = actionFor(ctx.event);\n if (!action) return;\n\n const api: any = (ctx as any).api;\n if (!api?.sudo) return;\n\n const after: any = ctx.result;\n const before: any = (ctx as any).__previous ?? (ctx as any).previous ?? null;\n\n // Resolve record id from after (insert/update) or before (delete) or input.\n let recordId: string | undefined =\n (typeof after === 'object' && after?.id) ||\n (typeof before === 'object' && before?.id) ||\n ((ctx.input as any)?.id);\n if (recordId !== undefined) recordId = String(recordId);\n\n const sess: any = (ctx as any).session ?? {};\n const userId: string | undefined = sess.userId;\n // Prefer the active session tenant, but fall back to the audited\n // record's own `organization_id`. This matters in two cases:\n // 1. Background jobs / unauthenticated sudo paths where the\n // session has no `tenantId` populated.\n // 2. better-auth's `activeOrganizationId` cache miss on first\n // requests after sign-in, before the active-org has been set\n // on the session row.\n // Without this fallback, audit rows are written with\n // `organization_id=NULL` and the SecurityPlugin's RLS predicate\n // (`organization_id = current_user.organization_id`) hides them\n // forever — making the audit log UI appear permanently empty even\n // though writes succeed.\n const recordOrgId: string | undefined =\n (typeof (ctx.result as any)?.organization_id === 'string' && (ctx.result as any).organization_id) ||\n (typeof ((ctx as any).__previous as any)?.organization_id === 'string' && ((ctx as any).__previous as any).organization_id) ||\n undefined;\n const tenantId: string | undefined = sess.tenantId ?? recordOrgId;\n\n let oldValue: Record<string, any> | null = null;\n let newValue: Record<string, any> | null = null;\n if (action === 'create') {\n newValue = (after && typeof after === 'object') ? { ...after } : null;\n } else if (action === 'update') {\n const d = diff(before || {}, after || {});\n oldValue = d.old;\n newValue = d.next;\n // If nothing meaningfully changed, skip the audit row to avoid noise.\n if (Object.keys(newValue).length === 0) return;\n } else if (action === 'delete') {\n oldValue = before && typeof before === 'object' ? { ...before } : null;\n }\n\n const auditRow: Record<string, any> = {\n action,\n user_id: userId ?? null,\n object_name: ctx.object,\n record_id: recordId ?? null,\n old_value: oldValue ? safeStringify(oldValue) : null,\n new_value: newValue ? safeStringify(newValue) : null,\n // `tenant_id` is the schema-declared \"tenant context\" lookup.\n tenant_id: tenantId ?? null,\n };\n // The platform-default `organization_id` column is what RLS gates on\n // (`organization_id = current_user.organization_id`). The audit writer\n // runs through `api.sudo()` which bypasses the SecurityPlugin's\n // auto-stamping of `organization_id`, so we stamp it explicitly here —\n // without it, non-admin members would see 0 rows on Setup dashboards\n // because RLS would deny every audit row as wrong-tenant. But the column\n // only exists in multi-tenant deployments (the SchemaRegistry auto-injects\n // it conditionally); stamping it on a single-tenant table that lacks the\n // column made every audit INSERT fail. Only stamp it when declared.\n if (objectHasField('sys_audit_log', 'organization_id')) {\n auditRow.organization_id = tenantId ?? null;\n }\n\n const label = recordLabel(after ?? before, recordId ?? '');\n const summary =\n action === 'create' ? `Created ${ctx.object} \"${label}\"` :\n action === 'update' ? `Updated ${ctx.object} \"${label}\"` :\n `Deleted ${ctx.object} \"${label}\"`;\n\n const activityRow: Record<string, any> = {\n type: activityTypeFor(action),\n // Explicit ISO timestamp — `defaultValue: 'NOW()'` on the column\n // isn't resolved by every driver and would otherwise leak the\n // literal string \"NOW()\" into the row.\n timestamp: new Date().toISOString(),\n summary,\n actor_id: userId ?? null,\n object_name: ctx.object,\n record_id: recordId ?? null,\n record_label: label,\n metadata: newValue || oldValue ? safeStringify({ old: oldValue, new: newValue }) : null,\n };\n // Same rationale as auditRow: stamp the tenant column so RLS matches the\n // recipient's organization on read — but only when the (auto-injected)\n // column actually exists, so single-tenant activity writes don't fail.\n if (objectHasField('sys_activity', 'organization_id')) {\n activityRow.organization_id = tenantId ?? null;\n }\n\n try {\n const sys = api.sudo();\n await sys.object('sys_audit_log').create(auditRow);\n await sys.object('sys_activity').create(activityRow);\n // M10.8 / ADR-0030: notify the assignee. Best-effort; never throws into\n // the user-facing CRUD path. Goes through the messaging single ingress\n // (`emit`) — the inbox channel materializes the bell row — rather than\n // writing `sys_notification` directly. If owner_id / assigned_to was\n // newly set (or changed to a different user) on a non-system record, the\n // recipient sees \"Lead X was assigned to you\" without polling.\n //\n // (Comment mentions are handled separately by the sys_comment hook below\n // since SKIP_OBJECTS excludes it from this writer.)\n await writeAssignmentNotifications(getMessaging(), {\n object: ctx.object,\n recordId: recordId ?? null,\n label,\n action,\n before,\n after,\n actorId: userId ?? null,\n tenantId: tenantId ?? null,\n });\n } catch (err) {\n // Log via engine logger if available, but never throw.\n try { (engine as any).logger?.warn?.('Audit write failed', { object: ctx.object, action, err: String((err as any)?.message ?? err) }); } catch {}\n }\n };\n\n engine.registerHook('afterInsert', writeAudit, { packageId });\n engine.registerHook('afterUpdate', writeAudit, { packageId });\n engine.registerHook('afterDelete', writeAudit, { packageId });\n\n /**\n * M10.8: Dedicated hook on `sys_comment` afterInsert that parses the\n * `mentions` JSON field and writes one sys_notification per mentioned\n * user. Lives outside `writeAudit` because sys_comment is in\n * SKIP_OBJECTS (we don't want audit/activity rows for comments —\n * those have their own first-class feed).\n */\n const writeCommentMentions = async (ctx: HookContext) => {\n if (ctx.object !== 'sys_comment') return;\n if (ctx.event !== 'afterInsert') return;\n const messaging = getMessaging();\n if (!messaging) return; // no pipeline installed → no mention notifications\n const row: any = ctx.result;\n if (!row || typeof row !== 'object') return;\n\n // mentions is a JSON-string textarea on sys_comment. Accept either\n // a raw array of user-ids [\"u1\",\"u2\"] or an array of objects\n // [{ id: \"u1\" }, ...]; tolerate parse failures silently.\n let mentions: any = row.mentions;\n if (typeof mentions === 'string') {\n try { mentions = JSON.parse(mentions); } catch { mentions = null; }\n }\n if (!Array.isArray(mentions) || mentions.length === 0) return;\n\n const userIds = mentions\n .map((m: any) => (typeof m === 'string' ? m : m?.id))\n .filter((id: any) => typeof id === 'string' && id.length > 0);\n if (userIds.length === 0) return;\n\n const [source_object, source_id] = String(row.thread_id ?? '').split(':');\n const actorId = row.author_id ?? null;\n const actorName = row.author_name ?? null;\n const bodyPreview = String(row.body ?? '').slice(0, 240);\n const sess: any = (ctx as any).session ?? {};\n const tenantId: string | null = sess.tenantId ?? row.organization_id ?? null;\n const commentId = row.id != null ? String(row.id) : null;\n\n for (const uid of userIds) {\n if (uid === actorId) continue; // don't notify the mention author\n try {\n // ADR-0030 single ingress — emit() writes the L2 event and the inbox\n // channel materializes the bell row + a delivered receipt.\n await messaging.emit({\n topic: 'collab.mention',\n audience: [uid],\n severity: 'info',\n source: source_object ? { object: source_object, id: source_id ?? '' } : undefined,\n actorId: actorId ?? undefined,\n organizationId: tenantId ?? undefined,\n dedupKey: commentId ? `collab.mention:${commentId}:${uid}` : undefined,\n payload: {\n title: actorName ? `${actorName} mentioned you` : 'You were mentioned',\n body: bodyPreview,\n actorName,\n },\n });\n } catch (err) {\n try { (engine as any).logger?.warn?.('Mention notification emit failed', { uid, err: String((err as any)?.message ?? err) }); } catch {}\n }\n }\n };\n engine.registerHook('afterInsert', writeCommentMentions, { packageId });\n}\n\n/**\n * Identify the assignee/owner field of a record. We accept several\n * conventional names so this works across CRM-style objects (owner_id,\n * assigned_to) and platform objects (recipient_id is handled separately).\n */\nconst OWNER_FIELDS = ['owner_id', 'assigned_to', 'assignee_id', 'owner', 'assignee'];\n\nfunction pickOwner(rec: any): string | null {\n if (!rec || typeof rec !== 'object') return null;\n for (const f of OWNER_FIELDS) {\n const v = rec[f];\n if (typeof v === 'string' && v.length > 0) return v;\n }\n return null;\n}\n\nasync function writeAssignmentNotifications(\n messaging: MessagingEmitSurface | undefined,\n params: {\n object: string;\n recordId: string | null;\n label: string;\n action: 'create' | 'update' | 'delete';\n before: any;\n after: any;\n actorId: string | null;\n tenantId: string | null;\n },\n): Promise<void> {\n if (!messaging) return; // no pipeline installed → no assignment notifications\n if (params.action === 'delete') return;\n if (!params.recordId) return;\n\n const newOwner = pickOwner(params.after);\n const oldOwner = pickOwner(params.before);\n if (!newOwner) return;\n if (params.action === 'update' && newOwner === oldOwner) return;\n if (newOwner === params.actorId) return; // self-assignment is silent\n\n try {\n // ADR-0030 single ingress — emit() writes the L2 event and the inbox\n // channel materializes the bell row + a delivered receipt. organizationId\n // is propagated so the recipient (same tenant as the action) sees the\n // materialized row through RLS.\n // Dedup only a true double-fire of the SAME write: scope the key by the\n // record's write-version (updated_at). Without a version component the key\n // would be permanent and a legitimate re-assignment back to a prior owner\n // would be silently suppressed. When no version field exists, omit the key\n // (every assignment notifies — same as the pre-ADR-0030 direct-write path).\n const writeVersion =\n (params.after && typeof params.after === 'object'\n ? params.after.updated_at ?? params.after.modified_at ?? params.after.updated_date\n : null) ?? null;\n await messaging.emit({\n topic: 'collab.assignment',\n audience: [newOwner],\n severity: 'info',\n source: { object: params.object, id: params.recordId },\n actorId: params.actorId ?? undefined,\n organizationId: params.tenantId ?? undefined,\n dedupKey: writeVersion\n ? `collab.assignment:${params.object}:${params.recordId}:${newOwner}:${writeVersion}`\n : undefined,\n payload: {\n title: `${params.object} \"${params.label}\" assigned to you`,\n },\n });\n } catch {\n // best-effort; never throw into CRUD path\n }\n}\n\n// Re-export for convenience.\nexport type { IDataEngine };\n"],"mappings":"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","names":["ObjectSchema","Field","ObjectSchema","Field","prev","AuditTranslations"]}
1
+ {"version":3,"sources":["../src/translations/en.objects.generated.ts","../src/translations/zh-CN.objects.generated.ts","../src/translations/ja-JP.objects.generated.ts","../src/translations/es-ES.objects.generated.ts","../src/translations/index.ts","../src/objects/sys-audit-log.object.ts","../src/objects/sys-activity.object.ts","../src/objects/sys-comment.object.ts","../src/audit-plugin.ts","../src/audit-writers.ts"],"sourcesContent":["// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\n/**\n * Auto-generated by 'os i18n extract' for locale 'en'.\n * Edit translations in place; re-run extract (with --merge) to fill new gaps.\n * Do not hand-edit the structure — only the leaf string values.\n */\n\nimport type { TranslationData } from '@objectstack/spec/system';\n\nexport const enObjects: NonNullable<TranslationData['objects']> = {\n sys_audit_log: {\n label: \"Audit Log\",\n pluralLabel: \"Audit Logs\",\n description: \"Immutable audit trail for platform events\",\n fields: {\n created_at: {\n label: \"Timestamp\"\n },\n action: {\n label: \"Action\",\n help: \"Action type (snake_case)\",\n options: {\n create: \"create\",\n update: \"update\",\n delete: \"delete\",\n restore: \"restore\",\n login: \"login\",\n logout: \"logout\",\n permission_change: \"permission_change\",\n config_change: \"config_change\",\n export: \"export\",\n import: \"import\"\n }\n },\n user_id: {\n label: \"Actor\",\n help: \"User who performed the action (null for system actions)\"\n },\n object_name: {\n label: \"Object\",\n help: \"Target object (e.g. sys_user, project_task)\"\n },\n record_id: {\n label: \"Record ID\",\n help: \"ID of the affected record\"\n },\n old_value: {\n label: \"Old Value\",\n help: \"JSON-serialized previous state\"\n },\n new_value: {\n label: \"New Value\",\n help: \"JSON-serialized new state\"\n },\n ip_address: {\n label: \"IP Address\"\n },\n user_agent: {\n label: \"User Agent\"\n },\n tenant_id: {\n label: \"Tenant\",\n help: \"Tenant context for multi-tenant isolation\"\n },\n metadata: {\n label: \"Metadata\",\n help: \"JSON-serialized additional context\"\n },\n id: {\n label: \"Audit Log ID\"\n }\n },\n _views: {\n recent: {\n label: \"Recent\"\n },\n writes_only: {\n label: \"Writes\"\n },\n auth_events: {\n label: \"Auth\"\n },\n config_changes: {\n label: \"Config\"\n },\n all_events: {\n label: \"All\"\n }\n }\n },\n sys_activity: {\n label: \"Activity\",\n pluralLabel: \"Activities\",\n description: \"Recent activity stream entries (lightweight, denormalized)\",\n fields: {\n id: {\n label: \"Activity ID\"\n },\n timestamp: {\n label: \"Timestamp\"\n },\n type: {\n label: \"Type\",\n options: {\n created: \"created\",\n updated: \"updated\",\n deleted: \"deleted\",\n commented: \"commented\",\n mentioned: \"mentioned\",\n shared: \"shared\",\n assigned: \"assigned\",\n completed: \"completed\",\n login: \"login\",\n logout: \"logout\",\n system: \"system\"\n }\n },\n summary: {\n label: \"Summary\",\n help: \"Human-readable one-line summary\"\n },\n actor_id: {\n label: \"Actor\"\n },\n actor_name: {\n label: \"Actor Name\"\n },\n actor_avatar_url: {\n label: \"Actor Avatar\"\n },\n object_name: {\n label: \"Object\",\n help: \"Target object short name (e.g. account, sys_user)\"\n },\n record_id: {\n label: \"Record ID\"\n },\n record_label: {\n label: \"Record Label\",\n help: \"Display label of the target record at write time\"\n },\n url: {\n label: \"URL\",\n help: \"Optional deep-link to the activity target\"\n },\n environment_id: {\n label: \"Project\",\n help: \"Environment context (multi-environment deployments)\"\n },\n metadata: {\n label: \"Metadata\",\n help: \"JSON-serialized additional context\"\n }\n }\n },\n sys_comment: {\n label: \"Comment\",\n pluralLabel: \"Comments\",\n description: \"Threaded comments attached to records via thread_id\",\n fields: {\n id: {\n label: \"Comment ID\"\n },\n thread_id: {\n label: \"Thread\",\n help: \"Thread identifier — conventionally `{object}:{record_id}` (e.g. `sys_user:abc123`)\"\n },\n parent_id: {\n label: \"Parent Comment\",\n help: \"Optional parent comment for nested replies\"\n },\n reply_count: {\n label: \"Reply Count\"\n },\n author_id: {\n label: \"Author\"\n },\n author_name: {\n label: \"Author Name\"\n },\n author_avatar_url: {\n label: \"Author Avatar\"\n },\n body: {\n label: \"Body\",\n help: \"Comment text (Markdown supported)\"\n },\n mentions: {\n label: \"Mentions\",\n help: \"JSON array of @mention objects\"\n },\n reactions: {\n label: \"Reactions\",\n help: \"JSON array of emoji reaction objects\"\n },\n is_edited: {\n label: \"Edited\"\n },\n edited_at: {\n label: \"Edited At\"\n },\n visibility: {\n label: \"Visibility\",\n options: {\n public: \"public\",\n internal: \"internal\",\n private: \"private\"\n }\n },\n created_at: {\n label: \"Created At\"\n },\n updated_at: {\n label: \"Updated At\"\n }\n }\n }\n};\n","// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\n/**\n * Auto-generated by 'os i18n extract' for locale 'zh-CN'.\n * Edit translations in place; re-run extract (with --merge) to fill new gaps.\n * Do not hand-edit the structure — only the leaf string values.\n */\n\nimport type { TranslationData } from '@objectstack/spec/system';\n\nexport const zhCNObjects: NonNullable<TranslationData['objects']> = {\n sys_audit_log: {\n label: \"审计日志\",\n pluralLabel: \"审计日志\",\n description: \"平台事件的不可变审计追踪\",\n fields: {\n created_at: {\n label: \"时间戳\"\n },\n action: {\n label: \"操作\",\n help: \"操作类型(snake_case)\",\n options: {\n create: \"创建\",\n update: \"更新\",\n delete: \"删除\",\n restore: \"恢复\",\n login: \"登录\",\n logout: \"登出\",\n permission_change: \"权限变更\",\n config_change: \"配置变更\",\n export: \"导出\",\n import: \"导入\"\n }\n },\n user_id: {\n label: \"执行人\",\n help: \"执行该操作的用户(系统操作时为 null)\"\n },\n object_name: {\n label: \"对象\",\n help: \"目标对象(例如 sys_user、project_task)\"\n },\n record_id: {\n label: \"记录 ID\",\n help: \"受影响记录的 ID\"\n },\n old_value: {\n label: \"旧值\",\n help: \"旧状态的 JSON 序列化内容\"\n },\n new_value: {\n label: \"新值\",\n help: \"新状态的 JSON 序列化内容\"\n },\n ip_address: {\n label: \"IP 地址\"\n },\n user_agent: {\n label: \"用户代理\"\n },\n tenant_id: {\n label: \"租户\",\n help: \"用于多租户隔离的租户上下文\"\n },\n metadata: {\n label: \"元数据\",\n help: \"附加上下文的 JSON 序列化内容\"\n },\n id: {\n label: \"审计日志 ID\"\n }\n },\n _views: {\n recent: {\n label: \"最近\"\n },\n writes_only: {\n label: \"写入\"\n },\n auth_events: {\n label: \"认证\"\n },\n config_changes: {\n label: \"配置\"\n },\n all_events: {\n label: \"全部\"\n }\n }\n },\n sys_activity: {\n label: \"活动\",\n pluralLabel: \"活动\",\n description: \"最近活动流条目(轻量、去规范化)\",\n fields: {\n id: {\n label: \"活动 ID\"\n },\n timestamp: {\n label: \"时间戳\"\n },\n type: {\n label: \"类型\",\n options: {\n created: \"已创建\",\n updated: \"已更新\",\n deleted: \"已删除\",\n commented: \"已评论\",\n mentioned: \"被提及\",\n shared: \"已共享\",\n assigned: \"已分配\",\n completed: \"已完成\",\n login: \"登录\",\n logout: \"登出\",\n system: \"系统\"\n }\n },\n summary: {\n label: \"摘要\",\n help: \"人类可读的单行摘要\"\n },\n actor_id: {\n label: \"执行人\"\n },\n actor_name: {\n label: \"执行人名称\"\n },\n actor_avatar_url: {\n label: \"执行人头像\"\n },\n object_name: {\n label: \"对象\",\n help: \"目标对象短名称(例如 account、sys_user)\"\n },\n record_id: {\n label: \"记录 ID\"\n },\n record_label: {\n label: \"记录标签\",\n help: \"写入时目标记录的显示标签\"\n },\n url: {\n label: \"URL\",\n help: \"指向活动目标的可选深度链接\"\n },\n environment_id: {\n label: \"项目\",\n help: \"项目上下文(多项目部署)\"\n },\n metadata: {\n label: \"元数据\",\n help: \"附加上下文的 JSON 序列化内容\"\n }\n }\n },\n sys_comment: {\n label: \"评论\",\n pluralLabel: \"评论\",\n description: \"通过 thread_id 附加到记录的线程化评论\",\n fields: {\n id: {\n label: \"评论 ID\"\n },\n thread_id: {\n label: \"线程\",\n help: \"线程标识——约定格式为 `{object}:{record_id}`(例如 `sys_user:abc123`)\"\n },\n parent_id: {\n label: \"父评论\",\n help: \"可选的父评论,用于嵌套回复\"\n },\n reply_count: {\n label: \"回复数\"\n },\n author_id: {\n label: \"作者\"\n },\n author_name: {\n label: \"作者名称\"\n },\n author_avatar_url: {\n label: \"作者头像\"\n },\n body: {\n label: \"正文\",\n help: \"评论文本(支持 Markdown)\"\n },\n mentions: {\n label: \"提及\",\n help: \"@mention 对象的 JSON 数组\"\n },\n reactions: {\n label: \"回应\",\n help: \"表情回应对象的 JSON 数组\"\n },\n is_edited: {\n label: \"已编辑\"\n },\n edited_at: {\n label: \"编辑时间\"\n },\n visibility: {\n label: \"可见性\",\n options: {\n public: \"公开\",\n internal: \"内部\",\n private: \"私有\"\n }\n },\n created_at: {\n label: \"创建时间\"\n },\n updated_at: {\n label: \"更新时间\"\n }\n }\n }\n};\n","// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\n/**\n * Auto-generated by 'os i18n extract' for locale 'ja-JP'.\n * Edit translations in place; re-run extract (with --merge) to fill new gaps.\n * Do not hand-edit the structure — only the leaf string values.\n */\n\nimport type { TranslationData } from '@objectstack/spec/system';\n\nexport const jaJPObjects: NonNullable<TranslationData['objects']> = {\n sys_audit_log: {\n label: \"監査ログ\",\n pluralLabel: \"監査ログ\",\n description: \"プラットフォームイベントの不変の監査証跡\",\n fields: {\n created_at: {\n label: \"タイムスタンプ\"\n },\n action: {\n label: \"アクション\",\n help: \"アクションタイプ(snake_case)\",\n options: {\n create: \"作成\",\n update: \"更新\",\n delete: \"削除\",\n restore: \"復元\",\n login: \"ログイン\",\n logout: \"ログアウト\",\n permission_change: \"権限変更\",\n config_change: \"構成変更\",\n export: \"エクスポート\",\n import: \"インポート\"\n }\n },\n user_id: {\n label: \"操作者\",\n help: \"アクションを実行したユーザー(システム操作の場合は null)\"\n },\n object_name: {\n label: \"オブジェクト\",\n help: \"対象オブジェクト(例: sys_user、project_task)\"\n },\n record_id: {\n label: \"レコード ID\",\n help: \"影響を受けたレコードの ID\"\n },\n old_value: {\n label: \"変更前の値\",\n help: \"JSON シリアライズされた以前の状態\"\n },\n new_value: {\n label: \"変更後の値\",\n help: \"JSON シリアライズされた新しい状態\"\n },\n ip_address: {\n label: \"IP アドレス\"\n },\n user_agent: {\n label: \"ユーザーエージェント\"\n },\n tenant_id: {\n label: \"テナント\",\n help: \"マルチテナント分離のためのテナントコンテキスト\"\n },\n metadata: {\n label: \"メタデータ\",\n help: \"JSON シリアライズされた追加コンテキスト\"\n },\n id: {\n label: \"監査ログ ID\"\n }\n },\n _views: {\n recent: {\n label: \"最近\"\n },\n writes_only: {\n label: \"書き込み\"\n },\n auth_events: {\n label: \"認証\"\n },\n config_changes: {\n label: \"構成変更\"\n },\n all_events: {\n label: \"すべて\"\n }\n }\n },\n sys_activity: {\n label: \"アクティビティ\",\n pluralLabel: \"アクティビティ\",\n description: \"最近のアクティビティストリームエントリ(軽量、非正規化)\",\n fields: {\n id: {\n label: \"アクティビティ ID\"\n },\n timestamp: {\n label: \"タイムスタンプ\"\n },\n type: {\n label: \"タイプ\",\n options: {\n created: \"作成\",\n updated: \"更新\",\n deleted: \"削除\",\n commented: \"コメント\",\n mentioned: \"メンション\",\n shared: \"共有\",\n assigned: \"割り当て\",\n completed: \"完了\",\n login: \"ログイン\",\n logout: \"ログアウト\",\n system: \"システム\"\n }\n },\n summary: {\n label: \"サマリー\",\n help: \"判別しやすい 1 行サマリー\"\n },\n actor_id: {\n label: \"操作者\"\n },\n actor_name: {\n label: \"操作者名\"\n },\n actor_avatar_url: {\n label: \"操作者アバター\"\n },\n object_name: {\n label: \"オブジェクト\",\n help: \"対象オブジェクトの短い名前(例: account、sys_user)\"\n },\n record_id: {\n label: \"レコード ID\"\n },\n record_label: {\n label: \"レコード表示名\",\n help: \"書き込み時点の対象レコードの表示名\"\n },\n url: {\n label: \"URL\",\n help: \"アクティビティターゲットへのオプションのディープリンク\"\n },\n environment_id: {\n label: \"プロジェクト\",\n help: \"プロジェクトコンテキスト(マルチプロジェクトデプロイメント)\"\n },\n metadata: {\n label: \"メタデータ\",\n help: \"JSON シリアライズされた追加コンテキスト\"\n }\n }\n },\n sys_comment: {\n label: \"コメント\",\n pluralLabel: \"コメント\",\n description: \"thread_id を介してレコードに添付されたスレッドコメント\",\n fields: {\n id: {\n label: \"コメント ID\"\n },\n thread_id: {\n label: \"スレッド\",\n help: \"スレッド識別子 — 通常は `{object}:{record_id}`(例: `sys_user:abc123`)\"\n },\n parent_id: {\n label: \"親コメント\",\n help: \"ネストした返信用のオプションの親コメント\"\n },\n reply_count: {\n label: \"返信数\"\n },\n author_id: {\n label: \"投稿者\"\n },\n author_name: {\n label: \"投稿者名\"\n },\n author_avatar_url: {\n label: \"投稿者アバター\"\n },\n body: {\n label: \"本文\",\n help: \"コメントテキスト(Markdown 対応)\"\n },\n mentions: {\n label: \"メンション\",\n help: \"@メンションオブジェクトの JSON 配列\"\n },\n reactions: {\n label: \"リアクション\",\n help: \"絵文字リアクションオブジェクトの JSON 配列\"\n },\n is_edited: {\n label: \"編集済み\"\n },\n edited_at: {\n label: \"編集日時\"\n },\n visibility: {\n label: \"公開範囲\",\n options: {\n public: \"公開\",\n internal: \"内部\",\n private: \"非公開\"\n }\n },\n created_at: {\n label: \"作成日時\"\n },\n updated_at: {\n label: \"更新日時\"\n }\n }\n }\n};\n","// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\n/**\n * Auto-generated by 'os i18n extract' for locale 'es-ES'.\n * Edit translations in place; re-run extract (with --merge) to fill new gaps.\n * Do not hand-edit the structure — only the leaf string values.\n */\n\nimport type { TranslationData } from '@objectstack/spec/system';\n\nexport const esESObjects: NonNullable<TranslationData['objects']> = {\n sys_audit_log: {\n label: \"Registro de auditoría\",\n pluralLabel: \"Registros de auditoría\",\n description: \"Registro de auditoría inmutable para eventos de la plataforma\",\n fields: {\n created_at: {\n label: \"Marca temporal\"\n },\n action: {\n label: \"Acción\",\n help: \"Tipo de acción (snake_case).\",\n options: {\n create: \"Crear\",\n update: \"Actualizar\",\n delete: \"Eliminar\",\n restore: \"Restaurar\",\n login: \"Inicio de sesión\",\n logout: \"Cierre de sesión\",\n permission_change: \"Cambio de permisos\",\n config_change: \"Cambio de configuración\",\n export: \"Exportar\",\n import: \"Importar\"\n }\n },\n user_id: {\n label: \"Actor\",\n help: \"Usuario que realizó la acción (null para acciones del sistema).\"\n },\n object_name: {\n label: \"Objeto\",\n help: \"Objeto de destino (p. ej. sys_user, project_task).\"\n },\n record_id: {\n label: \"ID de registro\",\n help: \"ID del registro afectado.\"\n },\n old_value: {\n label: \"Valor anterior\",\n help: \"Estado anterior serializado en JSON.\"\n },\n new_value: {\n label: \"Valor nuevo\",\n help: \"Estado nuevo serializado en JSON.\"\n },\n ip_address: {\n label: \"Dirección IP\"\n },\n user_agent: {\n label: \"Agente de usuario\"\n },\n tenant_id: {\n label: \"Inquilino\",\n help: \"Contexto del tenant para el aislamiento multi-tenant.\"\n },\n metadata: {\n label: \"Metadatos\",\n help: \"Contexto adicional serializado en JSON.\"\n },\n id: {\n label: \"ID de registro de auditoría\"\n }\n },\n _views: {\n recent: {\n label: \"Recientes\"\n },\n writes_only: {\n label: \"Escrituras\"\n },\n auth_events: {\n label: \"Autenticación\"\n },\n config_changes: {\n label: \"Configuración\"\n },\n all_events: {\n label: \"Todos\"\n }\n }\n },\n sys_activity: {\n label: \"Actividad\",\n pluralLabel: \"Actividades\",\n description: \"Entradas recientes del flujo de actividad (ligeras y desnormalizadas).\",\n fields: {\n id: {\n label: \"ID de actividad\"\n },\n timestamp: {\n label: \"Marca temporal\"\n },\n type: {\n label: \"Tipo\",\n options: {\n created: \"Creado\",\n updated: \"Actualizado\",\n deleted: \"Eliminado\",\n commented: \"Comentado\",\n mentioned: \"Mencionado\",\n shared: \"Compartido\",\n assigned: \"Asignado\",\n completed: \"Completado\",\n login: \"Inicio de sesión\",\n logout: \"Cierre de sesión\",\n system: \"Sistema\"\n }\n },\n summary: {\n label: \"Resumen\",\n help: \"Resumen legible de una línea.\"\n },\n actor_id: {\n label: \"Actor\"\n },\n actor_name: {\n label: \"Nombre del actor\"\n },\n actor_avatar_url: {\n label: \"Avatar del actor\"\n },\n object_name: {\n label: \"Objeto\",\n help: \"Nombre corto del objeto de destino (p. ej. account, sys_user).\"\n },\n record_id: {\n label: \"ID de registro\"\n },\n record_label: {\n label: \"Nombre visible del registro\",\n help: \"Nombre visible del registro de destino en el momento de escritura.\"\n },\n url: {\n label: \"URL\",\n help: \"Enlace profundo opcional al destino de la actividad.\"\n },\n environment_id: {\n label: \"Proyecto\",\n help: \"Contexto del proyecto (implementaciones multiproyecto).\"\n },\n metadata: {\n label: \"Metadatos\",\n help: \"Contexto adicional serializado en JSON.\"\n }\n }\n },\n sys_comment: {\n label: \"Comentario\",\n pluralLabel: \"Comentarios\",\n description: \"Comentarios en hilo adjuntos a registros mediante thread_id.\",\n fields: {\n id: {\n label: \"ID de comentario\"\n },\n thread_id: {\n label: \"Hilo\",\n help: \"Identificador del hilo; por convención `{object}:{record_id}` (p. ej. `sys_user:abc123`).\"\n },\n parent_id: {\n label: \"Comentario principal\",\n help: \"Comentario principal opcional para respuestas anidadas.\"\n },\n reply_count: {\n label: \"Número de respuestas\"\n },\n author_id: {\n label: \"Autor\"\n },\n author_name: {\n label: \"Nombre del autor\"\n },\n author_avatar_url: {\n label: \"Avatar del autor\"\n },\n body: {\n label: \"Contenido\",\n help: \"Texto del comentario (compatible con Markdown).\"\n },\n mentions: {\n label: \"Menciones\",\n help: \"Matriz JSON de objetos @mention.\"\n },\n reactions: {\n label: \"Reacciones\",\n help: \"Matriz JSON de objetos de reacción emoji.\"\n },\n is_edited: {\n label: \"Editado\"\n },\n edited_at: {\n label: \"Editado el\"\n },\n visibility: {\n label: \"Visibilidad\",\n options: {\n public: \"Público\",\n internal: \"Interno\",\n private: \"Privado\"\n }\n },\n created_at: {\n label: \"Creado el\"\n },\n updated_at: {\n label: \"Actualizado el\"\n }\n }\n }\n};\n","// Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license.\n\n/**\n * AuditTranslations — i18n bundle owned by this plugin (ADR-0029 D8).\n *\n * Object label/field/view/action translations for the sys_* objects this\n * plugin owns (sys_audit_log / sys_activity / sys_comment / sys_attachment).\n * Loaded at runtime via the plugin's `kernel:ready` hook\n * (`i18n.loadTranslations`). Regenerate with `os i18n extract` against\n * `scripts/i18n-extract.config.ts`.\n */\n\nimport type { TranslationBundle } from '@objectstack/spec/system';\nimport { enObjects } from './en.objects.generated.js';\nimport { zhCNObjects } from './zh-CN.objects.generated.js';\nimport { jaJPObjects } from './ja-JP.objects.generated.js';\nimport { esESObjects } from './es-ES.objects.generated.js';\n\nexport const AuditTranslations: TranslationBundle = {\n en: { objects: enObjects },\n 'zh-CN': { objects: zhCNObjects },\n 'ja-JP': { objects: jaJPObjects },\n 'es-ES': { objects: esESObjects },\n};\n","// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport { ObjectSchema, Field } from '@objectstack/spec/data';\n\n/**\n * sys_audit_log — System Audit Log Object\n *\n * Immutable audit trail for all significant platform events.\n * Records who did what, when, and the before/after state.\n *\n * Every field is `readonly: true` — audit logs are written only by\n * internal system hooks, never via UI forms. API exposes only `get` + `list`.\n *\n * @namespace sys\n */\nexport const SysAuditLog = ObjectSchema.create({\n name: 'sys_audit_log',\n label: 'Audit Log',\n pluralLabel: 'Audit Logs',\n icon: 'scroll-text',\n isSystem: true,\n managedBy: 'append-only',\n description: 'Immutable audit trail for platform events',\n displayNameField: 'action',\n titleFormat: '{action} · {object_name}',\n compactLayout: ['created_at', 'action', 'object_name', 'record_id', 'user_id'],\n\n listViews: {\n recent: {\n type: 'grid',\n name: 'recent',\n label: 'Recent',\n data: { provider: 'object', object: 'sys_audit_log' },\n columns: ['created_at', 'action', 'object_name', 'record_id', 'user_id'],\n sort: [{ field: 'created_at', order: 'desc' }],\n pagination: { pageSize: 50 },\n emptyState: { title: 'No audit events', message: 'Activity will appear here as users interact with the platform.' },\n },\n writes_only: {\n type: 'grid',\n name: 'writes_only',\n label: 'Writes',\n data: { provider: 'object', object: 'sys_audit_log' },\n columns: ['created_at', 'action', 'object_name', 'record_id', 'user_id'],\n filter: [{ field: 'action', operator: 'in', value: ['create', 'update', 'delete', 'restore'] }],\n sort: [{ field: 'created_at', order: 'desc' }],\n pagination: { pageSize: 50 },\n },\n auth_events: {\n type: 'grid',\n name: 'auth_events',\n label: 'Auth',\n data: { provider: 'object', object: 'sys_audit_log' },\n columns: ['created_at', 'action', 'user_id'],\n filter: [{ field: 'action', operator: 'in', value: ['login', 'logout', 'permission_change'] }],\n sort: [{ field: 'created_at', order: 'desc' }],\n pagination: { pageSize: 50 },\n },\n config_changes: {\n type: 'grid',\n name: 'config_changes',\n label: 'Config',\n data: { provider: 'object', object: 'sys_audit_log' },\n columns: ['created_at', 'action', 'object_name', 'user_id'],\n filter: [{ field: 'action', operator: 'in', value: ['config_change', 'export', 'import'] }],\n sort: [{ field: 'created_at', order: 'desc' }],\n pagination: { pageSize: 50 },\n },\n all_events: {\n type: 'grid',\n name: 'all_events',\n label: 'All',\n data: { provider: 'object', object: 'sys_audit_log' },\n columns: ['created_at', 'action', 'object_name', 'record_id', 'user_id'],\n sort: [{ field: 'created_at', order: 'desc' }],\n pagination: { pageSize: 100 },\n },\n },\n\n fields: {\n // ── Event ────────────────────────────────────────────────────\n created_at: Field.datetime({\n label: 'Timestamp',\n required: true,\n defaultValue: 'NOW()',\n readonly: true,\n group: 'Event',\n }),\n\n action: Field.select(\n ['create', 'update', 'delete', 'restore', 'login', 'logout', 'permission_change', 'config_change', 'export', 'import'],\n {\n label: 'Action',\n required: true,\n readonly: true,\n searchable: true,\n description: 'Action type (snake_case)',\n group: 'Event',\n },\n ),\n\n user_id: Field.lookup('sys_user', {\n label: 'Actor',\n required: false,\n readonly: true,\n searchable: true,\n description: 'User who performed the action (null for system actions)',\n group: 'Event',\n }),\n\n // ── Target record ────────────────────────────────────────────\n object_name: Field.text({\n label: 'Object',\n required: false,\n readonly: true,\n searchable: true,\n maxLength: 255,\n description: 'Target object (e.g. sys_user, project_task)',\n group: 'Target',\n }),\n\n record_id: Field.text({\n label: 'Record ID',\n required: false,\n readonly: true,\n searchable: true,\n description: 'ID of the affected record',\n group: 'Target',\n }),\n\n // ── Change payload ───────────────────────────────────────────\n old_value: Field.textarea({\n label: 'Old Value',\n required: false,\n readonly: true,\n description: 'JSON-serialized previous state',\n group: 'Changes',\n }),\n\n new_value: Field.textarea({\n label: 'New Value',\n required: false,\n readonly: true,\n description: 'JSON-serialized new state',\n group: 'Changes',\n }),\n\n // ── Client fingerprint ───────────────────────────────────────\n ip_address: Field.text({\n label: 'IP Address',\n required: false,\n readonly: true,\n maxLength: 45,\n group: 'Client',\n }),\n\n user_agent: Field.textarea({\n label: 'User Agent',\n required: false,\n readonly: true,\n group: 'Client',\n }),\n\n // ── Context ──────────────────────────────────────────────────\n tenant_id: Field.lookup('sys_organization', {\n label: 'Tenant',\n required: false,\n readonly: true,\n description: 'Tenant context for multi-tenant isolation',\n group: 'Context',\n }),\n\n metadata: Field.textarea({\n label: 'Metadata',\n required: false,\n readonly: true,\n description: 'JSON-serialized additional context',\n group: 'Context',\n }),\n\n // ── System ───────────────────────────────────────────────────\n id: Field.text({\n label: 'Audit Log ID',\n required: true,\n readonly: true,\n group: 'System',\n }),\n },\n\n indexes: [\n { fields: ['created_at'] },\n { fields: ['user_id'] },\n { fields: ['object_name', 'record_id'] },\n { fields: ['action'] },\n { fields: ['tenant_id'] },\n ],\n\n enable: {\n trackHistory: false, // Audit logs are themselves the audit trail\n searchable: true,\n apiEnabled: true,\n apiMethods: ['get', 'list'], // Read-only — creation happens via internal system hooks only\n trash: false, // Never soft-delete audit logs\n mru: false,\n clone: false,\n },\n});\n","// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport { ObjectSchema, Field } from '@objectstack/spec/data';\n\n/**\n * sys_activity — Lightweight Activity Stream\n *\n * Append-only \"recent activity\" feed shown on dashboards / overview\n * pages. Distinct from `sys_audit_log` (compliance-grade, structured\n * before/after diffs) and `feed_item` (record-scoped Chatter timeline\n * with comments/reactions/threads). Activity entries are denormalized\n * snapshots optimized for chronological \"what happened lately\" reads.\n *\n * Typical write sources: data triggers, plugin events, UI actions.\n * Typical readers: Studio dashboard, mobile inbox, notification jobs.\n *\n * @namespace sys\n */\nexport const SysActivity = ObjectSchema.create({\n name: 'sys_activity',\n label: 'Activity',\n pluralLabel: 'Activities',\n icon: 'activity',\n isSystem: true,\n managedBy: 'append-only',\n description: 'Recent activity stream entries (lightweight, denormalized)',\n displayNameField: 'summary',\n titleFormat: '{type} · {summary}',\n compactLayout: ['timestamp', 'type', 'actor_name', 'summary'],\n\n fields: {\n id: Field.text({\n label: 'Activity ID',\n required: true,\n readonly: true,\n group: 'System',\n }),\n\n timestamp: Field.datetime({\n label: 'Timestamp',\n required: true,\n defaultValue: 'NOW()',\n readonly: true,\n group: 'Event',\n }),\n\n type: Field.select(\n [\n 'created',\n 'updated',\n 'deleted',\n 'commented',\n 'mentioned',\n 'shared',\n 'assigned',\n 'completed',\n 'login',\n 'logout',\n 'system',\n ],\n {\n label: 'Type',\n required: true,\n readonly: true,\n searchable: true,\n group: 'Event',\n },\n ),\n\n summary: Field.text({\n label: 'Summary',\n required: true,\n readonly: true,\n maxLength: 500,\n searchable: true,\n description: 'Human-readable one-line summary',\n group: 'Event',\n }),\n\n // ── Actor ───────────────────────────────────────────────────\n actor_id: Field.lookup('sys_user', {\n label: 'Actor',\n required: false,\n readonly: true,\n searchable: true,\n group: 'Actor',\n }),\n\n actor_name: Field.text({\n label: 'Actor Name',\n required: false,\n readonly: true,\n group: 'Actor',\n }),\n\n actor_avatar_url: Field.url({\n label: 'Actor Avatar',\n required: false,\n readonly: true,\n group: 'Actor',\n }),\n\n // ── Target ───────────────────────────────────────────────────\n object_name: Field.text({\n label: 'Object',\n required: false,\n readonly: true,\n searchable: true,\n maxLength: 255,\n description: 'Target object short name (e.g. account, sys_user)',\n group: 'Target',\n }),\n\n record_id: Field.text({\n label: 'Record ID',\n required: false,\n readonly: true,\n searchable: true,\n group: 'Target',\n }),\n\n record_label: Field.text({\n label: 'Record Label',\n required: false,\n readonly: true,\n maxLength: 255,\n description: 'Display label of the target record at write time',\n group: 'Target',\n }),\n\n url: Field.url({\n label: 'URL',\n required: false,\n readonly: true,\n description: 'Optional deep-link to the activity target',\n group: 'Target',\n }),\n\n // ── Context ──────────────────────────────────────────────────\n environment_id: Field.lookup('sys_environment', {\n label: 'Environment',\n required: false,\n readonly: true,\n searchable: true,\n description: 'Environment context (multi-environment deployments)',\n group: 'Context',\n }),\n\n metadata: Field.textarea({\n label: 'Metadata',\n required: false,\n readonly: true,\n description: 'JSON-serialized additional context',\n group: 'Context',\n }),\n },\n\n indexes: [\n { fields: ['timestamp'] },\n { fields: ['actor_id'] },\n { fields: ['object_name', 'record_id'] },\n { fields: ['type'] },\n { fields: ['environment_id'] },\n ],\n\n enable: {\n trackHistory: false,\n searchable: true,\n apiEnabled: true,\n apiMethods: ['get', 'list'],\n trash: false,\n mru: false,\n clone: false,\n },\n});\n","// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport { ObjectSchema, Field } from '@objectstack/spec/data';\n\n/**\n * sys_comment — Threaded Record Comments\n *\n * Generic threaded discussion attached to any record via `thread_id`.\n * `thread_id` is conventionally formatted as `{object}:{record_id}`\n * (e.g. `sys_user:abc123`, `account:9001`) so a single index covers\n * \"all comments on this record\" lookups across every object.\n *\n * Distinct from `feed_item` (Salesforce-style Chatter timeline that\n * mixes comments with field changes / events / approvals). Use\n * `sys_comment` when you want a focused threaded discussion surface\n * without the heavier Chatter envelope.\n *\n * @namespace sys\n */\nexport const SysComment = ObjectSchema.create({\n name: 'sys_comment',\n label: 'Comment',\n pluralLabel: 'Comments',\n icon: 'message-square',\n isSystem: true,\n managedBy: 'platform',\n description: 'Threaded comments attached to records via thread_id',\n displayNameField: 'body',\n titleFormat: '{author_name}: {body}',\n compactLayout: ['created_at', 'author_name', 'body'],\n\n fields: {\n id: Field.text({\n label: 'Comment ID',\n required: true,\n readonly: true,\n group: 'System',\n }),\n\n // ── Thread ───────────────────────────────────────────────────\n thread_id: Field.text({\n label: 'Thread',\n required: true,\n searchable: true,\n maxLength: 255,\n description:\n 'Thread identifier — conventionally `{object}:{record_id}` (e.g. `sys_user:abc123`)',\n group: 'Thread',\n }),\n\n parent_id: Field.lookup('sys_comment', {\n label: 'Parent Comment',\n required: false,\n description: 'Optional parent comment for nested replies',\n group: 'Thread',\n }),\n\n reply_count: Field.number({\n label: 'Reply Count',\n defaultValue: 0,\n readonly: true,\n group: 'Thread',\n }),\n\n // ── Author ───────────────────────────────────────────────────\n author_id: Field.lookup('sys_user', {\n label: 'Author',\n required: true,\n searchable: true,\n group: 'Author',\n }),\n\n author_name: Field.text({\n label: 'Author Name',\n required: false,\n group: 'Author',\n }),\n\n author_avatar_url: Field.url({\n label: 'Author Avatar',\n required: false,\n group: 'Author',\n }),\n\n // ── Body ─────────────────────────────────────────────────────\n body: Field.textarea({\n label: 'Body',\n required: true,\n searchable: true,\n description: 'Comment text (Markdown supported)',\n group: 'Body',\n }),\n\n mentions: Field.textarea({\n label: 'Mentions',\n required: false,\n description: 'JSON array of @mention objects',\n group: 'Body',\n }),\n\n reactions: Field.textarea({\n label: 'Reactions',\n required: false,\n description: 'JSON array of emoji reaction objects',\n group: 'Body',\n }),\n\n // ── Lifecycle ────────────────────────────────────────────────\n is_edited: Field.boolean({\n label: 'Edited',\n defaultValue: false,\n group: 'Lifecycle',\n }),\n\n edited_at: Field.datetime({\n label: 'Edited At',\n required: false,\n group: 'Lifecycle',\n }),\n\n visibility: Field.select(\n ['public', 'internal', 'private'],\n {\n label: 'Visibility',\n defaultValue: 'public',\n group: 'Lifecycle',\n },\n ),\n\n created_at: Field.datetime({\n label: 'Created At',\n required: true,\n defaultValue: 'NOW()',\n readonly: true,\n group: 'System',\n }),\n\n updated_at: Field.datetime({\n label: 'Updated At',\n required: false,\n group: 'System',\n }),\n },\n\n indexes: [\n { fields: ['thread_id', 'created_at'] },\n { fields: ['parent_id'] },\n { fields: ['author_id'] },\n ],\n\n enable: {\n trackHistory: true,\n searchable: true,\n apiEnabled: true,\n trash: true,\n mru: false,\n clone: false,\n },\n});\n","// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport type { Plugin, PluginContext } from '@objectstack/core';\nimport type { IDataEngine } from '@objectstack/spec/contracts';\nimport { SysAuditLog, SysActivity, SysComment } from './objects/index.js';\n// Registered here but still owned by platform-objects (the plugin contributes\n// them to the kernel without owning the definition yet):\n// - sys_notification — reworked by ADR-0030 messaging (notification→event).\n// - sys_attachment — a file↔record link belonging with service-storage's\n// sys_file; moves in the storage-domain decomposition, not this audit move.\nimport { SysNotification, SysAttachment } from '@objectstack/platform-objects/audit';\nimport { installAuditWriters, type MessagingEmitSurface } from './audit-writers.js';\n\n/**\n * AuditPlugin\n *\n * Registers the sys_audit_log / sys_activity / sys_comment system objects\n * and installs ObjectQL hook subscribers that automatically write audit\n * trail + activity stream rows on every data mutation.\n *\n * Implements ROADMAP M10.1 (CRM production-readiness).\n */\nexport class AuditPlugin implements Plugin {\n name = 'com.objectstack.audit';\n type = 'standard';\n version = '1.0.0';\n dependencies = ['com.objectstack.engine.objectql'];\n\n async init(ctx: PluginContext): Promise<void> {\n process.stderr.write('[AuditPlugin] init() called\\n');\n // Register audit system objects via the manifest service.\n ctx.getService<{ register(m: any): void }>('manifest').register({\n id: 'com.objectstack.audit',\n name: 'Audit',\n version: '1.0.0',\n type: 'plugin',\n scope: 'system',\n defaultDatasource: 'cloud',\n namespace: 'sys',\n objects: [SysAuditLog, SysActivity, SysComment, SysAttachment, SysNotification],\n // ADR-0029 D7 — contribute the Audit Logs entry into the Setup app's\n // `group_diagnostics` slot. The plugin owns sys_audit_log (K2).\n navigationContributions: [\n {\n app: 'setup',\n group: 'group_diagnostics',\n priority: 100,\n items: [\n { id: 'nav_audit_logs', type: 'object', label: 'Audit Logs', objectName: 'sys_audit_log', icon: 'scroll-text' },\n ],\n },\n ],\n });\n\n // ADR-0029 D8 — contribute this plugin's object translations to the i18n\n // service on kernel:ready (the i18n plugin may register after this one).\n if (typeof (ctx as any).hook === 'function') {\n (ctx as any).hook('kernel:ready', async () => {\n try {\n const i18n = ctx.getService<any>('i18n');\n if (i18n && typeof i18n.loadTranslations === 'function') {\n const { AuditTranslations } = await import('./translations/index.js');\n for (const [locale, data] of Object.entries(AuditTranslations)) {\n i18n.loadTranslations(locale, data as Record<string, unknown>);\n }\n }\n } catch { /* i18n optional */ }\n });\n }\n\n ctx.logger.info('Audit Plugin initialized');\n }\n\n async start(ctx: PluginContext): Promise<void> {\n process.stderr.write('[AuditPlugin] start() called, registering kernel:ready hook\\n');\n // ObjectQL engine is only resolvable after the kernel is ready.\n ctx.hook('kernel:ready', async () => {\n process.stderr.write('[AuditPlugin] kernel:ready fired\\n');\n let engine: IDataEngine | null = null;\n try {\n engine = ctx.getService<IDataEngine>('objectql');\n process.stderr.write(`[AuditPlugin] objectql engine = ${engine ? 'OK' : 'null'} registerHook? ${typeof (engine as any)?.registerHook}\\n`);\n } catch (err) {\n process.stderr.write(`[AuditPlugin] getService(objectql) threw: ${(err as Error).message}\\n`);\n // Fallback alias used in some kernels.\n try {\n engine = ctx.getService<IDataEngine>('data');\n process.stderr.write(`[AuditPlugin] data engine = ${engine ? 'OK' : 'null'}\\n`);\n } catch { /* ignore */ }\n }\n if (!engine) {\n process.stderr.write('[AuditPlugin] NO ENGINE — bailing\\n');\n ctx.logger.warn('AuditPlugin: ObjectQL engine not available — audit writers NOT installed');\n return;\n }\n // Resolve the messaging service lazily at hook time so collaboration\n // @mention / assignment notifications go through the ADR-0030 single\n // ingress (emit) instead of writing sys_notification directly. Messaging\n // may register after audit; lazy resolution tolerates either order.\n const getMessaging = (): MessagingEmitSurface | undefined => {\n try {\n return ctx.getService<MessagingEmitSurface>('messaging');\n } catch {\n return undefined;\n }\n };\n installAuditWriters(engine as any, this.name, { getMessaging });\n process.stderr.write('[AuditPlugin] writers installed\\n');\n ctx.logger.info('AuditPlugin: audit + activity writers installed');\n });\n }\n}\n","// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.\n\nimport type { HookContext } from '@objectstack/spec/data';\nimport type { IDataEngine } from '@objectstack/spec/contracts';\n\n/**\n * Minimal structural view of `NotificationService.emit` (ADR-0030). Declared\n * locally so plugin-audit takes no runtime dependency on service-messaging — it\n * resolves whatever object is registered under the `messaging` service at hook\n * time and routes collaboration notifications through the single ingress.\n */\nexport interface MessagingEmitSurface {\n emit(input: {\n topic: string;\n audience: string[];\n payload?: Record<string, unknown>;\n severity?: 'info' | 'warning' | 'critical';\n dedupKey?: string;\n source?: { object: string; id: string };\n actorId?: string;\n organizationId?: string;\n }): Promise<unknown>;\n}\n\n/** Options for {@link installAuditWriters}. */\nexport interface AuditWriterOptions {\n /**\n * Lazily resolve the messaging service so collaboration `@mention` /\n * assignment notifications go through the ADR-0030 single ingress rather than\n * writing `sys_notification` directly. Returns `undefined` when messaging is\n * not installed — those notifications are then skipped (no pipeline, no bell),\n * matching the `notify` node's degradation.\n */\n getMessaging?(): MessagingEmitSurface | undefined;\n}\n\n/**\n * Audit writer hook installer.\n *\n * Subscribes to the ObjectQL engine's wildcard `before*` / `after*` lifecycle\n * events and writes:\n *\n * - `sys_audit_log` rows — immutable, compliance-grade entries with\n * field-level `old_value` / `new_value` diffs.\n * - `sys_activity` rows — denormalized, human-readable summaries shown\n * in the dashboard recent-activity feed and per-record timelines.\n *\n * Skip rules avoid recursion and noise:\n * - Never audit the audit/activity tables themselves.\n * - Never audit session/presence/auth tables (high-frequency, low value).\n * - Read-only operations (`afterFind`) are never audited.\n *\n * All writes go through `ctx.api.sudo()` so they bypass record-level\n * permissions and always succeed regardless of the calling user's RBAC.\n */\n\n/** Tables that are intentionally excluded from audit/activity writes. */\nconst SKIP_OBJECTS = new Set<string>([\n 'sys_audit_log',\n 'sys_activity',\n 'sys_comment',\n 'sys_session',\n 'sys_presence',\n 'sys_account',\n 'sys_account_session',\n 'sys_account_verification',\n 'sys_account_account',\n]);\n\n/** Fields that are noise in diffs (always change, never user-meaningful). */\nconst NOISE_FIELDS = new Set<string>([\n 'updated_at',\n 'updated_by',\n 'created_at',\n 'created_by',\n]);\n\n/** Action name produced from a HookContext.event string. */\nfunction actionFor(event: string): 'create' | 'update' | 'delete' | null {\n if (event === 'afterInsert') return 'create';\n if (event === 'afterUpdate') return 'update';\n if (event === 'afterDelete') return 'delete';\n return null;\n}\n\n/** Activity type produced from an audit action. */\nfunction activityTypeFor(action: 'create' | 'update' | 'delete'): 'created' | 'updated' | 'deleted' {\n return action === 'create' ? 'created' : action === 'update' ? 'updated' : 'deleted';\n}\n\n/**\n * Compute the human-readable record label from a record by trying common\n * label fields. Falls back to record id.\n */\nfunction recordLabel(record: any, id: string): string {\n if (!record || typeof record !== 'object') return id;\n const candidates = ['name', 'subject', 'title', 'full_name', 'label', 'first_name', 'company', 'email'];\n for (const k of candidates) {\n const v = record[k];\n if (typeof v === 'string' && v.trim()) return v.trim();\n }\n return id;\n}\n\n/**\n * Compute a shallow JSON diff between two records. Returns only keys whose\n * value changed (and ignores keys in `NOISE_FIELDS`). Both sides are\n * serialisable via `JSON.stringify` — values that fail to serialise are\n * coerced to `String(value)`.\n */\nfunction diff(before: Record<string, any>, after: Record<string, any>): { old: Record<string, any>; next: Record<string, any> } {\n const oldOut: Record<string, any> = {};\n const newOut: Record<string, any> = {};\n const keys = new Set<string>([...Object.keys(before || {}), ...Object.keys(after || {})]);\n for (const k of keys) {\n if (NOISE_FIELDS.has(k)) continue;\n const b = before?.[k];\n const a = after?.[k];\n if (safeStringify(b) !== safeStringify(a)) {\n oldOut[k] = b ?? null;\n newOut[k] = a ?? null;\n }\n }\n return { old: oldOut, next: newOut };\n}\n\nfunction safeStringify(v: any): string {\n try { return JSON.stringify(v); } catch { return String(v); }\n}\n\n/**\n * Install audit + activity writers on the given engine. Idempotent per\n * `packageId` — calling twice with the same id replaces the previous\n * registration.\n */\nexport function installAuditWriters(\n engine: any,\n packageId = 'com.objectstack.audit',\n opts: AuditWriterOptions = {},\n): void {\n if (!engine || typeof engine.registerHook !== 'function') return;\n\n const getMessaging = opts.getMessaging ?? (() => undefined);\n\n // Remove any prior installation so we can safely re-install on hot reload.\n if (typeof engine.unregisterHooksByPackage === 'function') {\n engine.unregisterHooksByPackage(packageId);\n }\n\n // Whether a given object's *registered* schema declares a field. The\n // SchemaRegistry auto-injects `organization_id` only in multi-tenant mode\n // (`applySystemFields({ multiTenant })`), so on single-tenant stacks the\n // `sys_audit_log` / `sys_activity` tables have no `organization_id` column.\n // Unconditionally stamping it there made every audit INSERT fail with\n // \"table sys_audit_log has no column named organization_id\" (the error was\n // swallowed, so audit logging was silently non-functional). Resolve the\n // field set lazily from the engine schema and cache it — object schemas are\n // static after registration.\n const fieldSetCache = new Map<string, Set<string> | null>();\n const objectHasField = (objectName: string, field: string): boolean => {\n let set = fieldSetCache.get(objectName);\n if (set === undefined) {\n set = null;\n try {\n const schema: any =\n typeof (engine as any).getSchema === 'function' ? (engine as any).getSchema(objectName) : null;\n const fields = schema?.fields;\n if (fields && typeof fields === 'object' && !Array.isArray(fields)) {\n set = new Set<string>(Object.keys(fields));\n } else if (Array.isArray(fields)) {\n set = new Set<string>(fields.map((f: any) => f?.name).filter(Boolean));\n }\n } catch {\n /* ignore — best-effort; absence just means we skip the stamp */\n }\n fieldSetCache.set(objectName, set);\n }\n return set != null && set.has(field);\n };\n\n /**\n * beforeUpdate / beforeDelete: capture \"previous\" snapshot via api.sudo()\n * so we can compute the diff in the afterXxx hook. We attach the snapshot\n * to the context (`(ctx as any).__previous`) since `HookContext.previous`\n * is officially typed but not always populated by the engine itself.\n */\n const captureBefore = async (ctx: HookContext) => {\n if (SKIP_OBJECTS.has(ctx.object)) return;\n const id = (ctx.input as any)?.id;\n if (!id) return; // bulk update/delete — too costly to snapshot every row here\n try {\n // Use the engine directly (not api.sudo) so we can thread the\n // active transaction through. On drivers with single-connection\n // pools (e.g. SQLite via knex) a sudo() findOne that does NOT\n // carry the open transaction will deadlock for the full\n // acquireConnectionTimeout (~60s) because the outer transaction\n // holds the only connection.\n const trx = (ctx as any).transaction;\n const ql = (ctx as any).ql ?? (ctx as any).api?.engine;\n if (ql?.findOne) {\n const prev = await ql.findOne(ctx.object, {\n where: { id },\n context: { isSystem: true, ...(trx ? { transaction: trx } : {}) },\n });\n if (prev) (ctx as any).__previous = prev;\n return;\n }\n const api: any = (ctx as any).api;\n if (!api?.sudo) return;\n const prev = await api.sudo().object(ctx.object).findOne({ where: { id } });\n if (prev) (ctx as any).__previous = prev;\n } catch {\n /* ignore — best-effort */\n }\n };\n\n engine.registerHook('beforeUpdate', captureBefore, { packageId });\n engine.registerHook('beforeDelete', captureBefore, { packageId });\n\n /**\n * afterInsert / afterUpdate / afterDelete: write audit_log + activity rows.\n * Errors are swallowed (logged) so user-facing CRUD is never broken by\n * audit failures.\n */\n const writeAudit = async (ctx: HookContext) => {\n if (SKIP_OBJECTS.has(ctx.object)) return;\n const action = actionFor(ctx.event);\n if (!action) return;\n\n const api: any = (ctx as any).api;\n if (!api?.sudo) return;\n\n const after: any = ctx.result;\n const before: any = (ctx as any).__previous ?? (ctx as any).previous ?? null;\n\n // Resolve record id from after (insert/update) or before (delete) or input.\n let recordId: string | undefined =\n (typeof after === 'object' && after?.id) ||\n (typeof before === 'object' && before?.id) ||\n ((ctx.input as any)?.id);\n if (recordId !== undefined) recordId = String(recordId);\n\n const sess: any = (ctx as any).session ?? {};\n const userId: string | undefined = sess.userId;\n // Prefer the active session tenant, but fall back to the audited\n // record's own `organization_id`. This matters in two cases:\n // 1. Background jobs / unauthenticated sudo paths where the\n // session has no `tenantId` populated.\n // 2. better-auth's `activeOrganizationId` cache miss on first\n // requests after sign-in, before the active-org has been set\n // on the session row.\n // Without this fallback, audit rows are written with\n // `organization_id=NULL` and the SecurityPlugin's RLS predicate\n // (`organization_id = current_user.organization_id`) hides them\n // forever — making the audit log UI appear permanently empty even\n // though writes succeed.\n const recordOrgId: string | undefined =\n (typeof (ctx.result as any)?.organization_id === 'string' && (ctx.result as any).organization_id) ||\n (typeof ((ctx as any).__previous as any)?.organization_id === 'string' && ((ctx as any).__previous as any).organization_id) ||\n undefined;\n const tenantId: string | undefined = sess.tenantId ?? recordOrgId;\n\n let oldValue: Record<string, any> | null = null;\n let newValue: Record<string, any> | null = null;\n if (action === 'create') {\n newValue = (after && typeof after === 'object') ? { ...after } : null;\n } else if (action === 'update') {\n const d = diff(before || {}, after || {});\n oldValue = d.old;\n newValue = d.next;\n // If nothing meaningfully changed, skip the audit row to avoid noise.\n if (Object.keys(newValue).length === 0) return;\n } else if (action === 'delete') {\n oldValue = before && typeof before === 'object' ? { ...before } : null;\n }\n\n const auditRow: Record<string, any> = {\n action,\n user_id: userId ?? null,\n object_name: ctx.object,\n record_id: recordId ?? null,\n old_value: oldValue ? safeStringify(oldValue) : null,\n new_value: newValue ? safeStringify(newValue) : null,\n // `tenant_id` is the schema-declared \"tenant context\" lookup.\n tenant_id: tenantId ?? null,\n };\n // The platform-default `organization_id` column is what RLS gates on\n // (`organization_id = current_user.organization_id`). The audit writer\n // runs through `api.sudo()` which bypasses the SecurityPlugin's\n // auto-stamping of `organization_id`, so we stamp it explicitly here —\n // without it, non-admin members would see 0 rows on Setup dashboards\n // because RLS would deny every audit row as wrong-tenant. But the column\n // only exists in multi-tenant deployments (the SchemaRegistry auto-injects\n // it conditionally); stamping it on a single-tenant table that lacks the\n // column made every audit INSERT fail. Only stamp it when declared.\n if (objectHasField('sys_audit_log', 'organization_id')) {\n auditRow.organization_id = tenantId ?? null;\n }\n\n const label = recordLabel(after ?? before, recordId ?? '');\n const summary =\n action === 'create' ? `Created ${ctx.object} \"${label}\"` :\n action === 'update' ? `Updated ${ctx.object} \"${label}\"` :\n `Deleted ${ctx.object} \"${label}\"`;\n\n const activityRow: Record<string, any> = {\n type: activityTypeFor(action),\n // Explicit ISO timestamp — `defaultValue: 'NOW()'` on the column\n // isn't resolved by every driver and would otherwise leak the\n // literal string \"NOW()\" into the row.\n timestamp: new Date().toISOString(),\n summary,\n actor_id: userId ?? null,\n object_name: ctx.object,\n record_id: recordId ?? null,\n record_label: label,\n metadata: newValue || oldValue ? safeStringify({ old: oldValue, new: newValue }) : null,\n };\n // Same rationale as auditRow: stamp the tenant column so RLS matches the\n // recipient's organization on read — but only when the (auto-injected)\n // column actually exists, so single-tenant activity writes don't fail.\n if (objectHasField('sys_activity', 'organization_id')) {\n activityRow.organization_id = tenantId ?? null;\n }\n\n try {\n const sys = api.sudo();\n await sys.object('sys_audit_log').create(auditRow);\n await sys.object('sys_activity').create(activityRow);\n // M10.8 / ADR-0030: notify the assignee. Best-effort; never throws into\n // the user-facing CRUD path. Goes through the messaging single ingress\n // (`emit`) — the inbox channel materializes the bell row — rather than\n // writing `sys_notification` directly. If owner_id / assigned_to was\n // newly set (or changed to a different user) on a non-system record, the\n // recipient sees \"Lead X was assigned to you\" without polling.\n //\n // (Comment mentions are handled separately by the sys_comment hook below\n // since SKIP_OBJECTS excludes it from this writer.)\n await writeAssignmentNotifications(getMessaging(), {\n object: ctx.object,\n recordId: recordId ?? null,\n label,\n action,\n before,\n after,\n actorId: userId ?? null,\n tenantId: tenantId ?? null,\n });\n } catch (err) {\n // Log via engine logger if available, but never throw.\n try { (engine as any).logger?.warn?.('Audit write failed', { object: ctx.object, action, err: String((err as any)?.message ?? err) }); } catch {}\n }\n };\n\n engine.registerHook('afterInsert', writeAudit, { packageId });\n engine.registerHook('afterUpdate', writeAudit, { packageId });\n engine.registerHook('afterDelete', writeAudit, { packageId });\n\n /**\n * M10.8: Dedicated hook on `sys_comment` afterInsert that parses the\n * `mentions` JSON field and writes one sys_notification per mentioned\n * user. Lives outside `writeAudit` because sys_comment is in\n * SKIP_OBJECTS (we don't want audit/activity rows for comments —\n * those have their own first-class feed).\n */\n const writeCommentMentions = async (ctx: HookContext) => {\n if (ctx.object !== 'sys_comment') return;\n if (ctx.event !== 'afterInsert') return;\n const messaging = getMessaging();\n if (!messaging) return; // no pipeline installed → no mention notifications\n const row: any = ctx.result;\n if (!row || typeof row !== 'object') return;\n\n // mentions is a JSON-string textarea on sys_comment. Accept either\n // a raw array of user-ids [\"u1\",\"u2\"] or an array of objects\n // [{ id: \"u1\" }, ...]; tolerate parse failures silently.\n let mentions: any = row.mentions;\n if (typeof mentions === 'string') {\n try { mentions = JSON.parse(mentions); } catch { mentions = null; }\n }\n if (!Array.isArray(mentions) || mentions.length === 0) return;\n\n const userIds = mentions\n .map((m: any) => (typeof m === 'string' ? m : m?.id))\n .filter((id: any) => typeof id === 'string' && id.length > 0);\n if (userIds.length === 0) return;\n\n const [source_object, source_id] = String(row.thread_id ?? '').split(':');\n const actorId = row.author_id ?? null;\n const actorName = row.author_name ?? null;\n const bodyPreview = String(row.body ?? '').slice(0, 240);\n const sess: any = (ctx as any).session ?? {};\n const tenantId: string | null = sess.tenantId ?? row.organization_id ?? null;\n const commentId = row.id != null ? String(row.id) : null;\n\n for (const uid of userIds) {\n if (uid === actorId) continue; // don't notify the mention author\n try {\n // ADR-0030 single ingress — emit() writes the L2 event and the inbox\n // channel materializes the bell row + a delivered receipt.\n await messaging.emit({\n topic: 'collab.mention',\n audience: [uid],\n severity: 'info',\n source: source_object ? { object: source_object, id: source_id ?? '' } : undefined,\n actorId: actorId ?? undefined,\n organizationId: tenantId ?? undefined,\n dedupKey: commentId ? `collab.mention:${commentId}:${uid}` : undefined,\n payload: {\n title: actorName ? `${actorName} mentioned you` : 'You were mentioned',\n body: bodyPreview,\n actorName,\n },\n });\n } catch (err) {\n try { (engine as any).logger?.warn?.('Mention notification emit failed', { uid, err: String((err as any)?.message ?? err) }); } catch {}\n }\n }\n };\n engine.registerHook('afterInsert', writeCommentMentions, { packageId });\n}\n\n/**\n * Identify the assignee/owner field of a record. We accept several\n * conventional names so this works across CRM-style objects (owner_id,\n * assigned_to) and platform objects (recipient_id is handled separately).\n */\nconst OWNER_FIELDS = ['owner_id', 'assigned_to', 'assignee_id', 'owner', 'assignee'];\n\nfunction pickOwner(rec: any): string | null {\n if (!rec || typeof rec !== 'object') return null;\n for (const f of OWNER_FIELDS) {\n const v = rec[f];\n if (typeof v === 'string' && v.length > 0) return v;\n }\n return null;\n}\n\nasync function writeAssignmentNotifications(\n messaging: MessagingEmitSurface | undefined,\n params: {\n object: string;\n recordId: string | null;\n label: string;\n action: 'create' | 'update' | 'delete';\n before: any;\n after: any;\n actorId: string | null;\n tenantId: string | null;\n },\n): Promise<void> {\n if (!messaging) return; // no pipeline installed → no assignment notifications\n if (params.action === 'delete') return;\n if (!params.recordId) return;\n\n const newOwner = pickOwner(params.after);\n const oldOwner = pickOwner(params.before);\n if (!newOwner) return;\n if (params.action === 'update' && newOwner === oldOwner) return;\n if (newOwner === params.actorId) return; // self-assignment is silent\n\n try {\n // ADR-0030 single ingress — emit() writes the L2 event and the inbox\n // channel materializes the bell row + a delivered receipt. organizationId\n // is propagated so the recipient (same tenant as the action) sees the\n // materialized row through RLS.\n // Dedup only a true double-fire of the SAME write: scope the key by the\n // record's write-version (updated_at). Without a version component the key\n // would be permanent and a legitimate re-assignment back to a prior owner\n // would be silently suppressed. When no version field exists, omit the key\n // (every assignment notifies — same as the pre-ADR-0030 direct-write path).\n const writeVersion =\n (params.after && typeof params.after === 'object'\n ? params.after.updated_at ?? params.after.modified_at ?? params.after.updated_date\n : null) ?? null;\n await messaging.emit({\n topic: 'collab.assignment',\n audience: [newOwner],\n severity: 'info',\n source: { object: params.object, id: params.recordId },\n actorId: params.actorId ?? undefined,\n organizationId: params.tenantId ?? undefined,\n dedupKey: writeVersion\n ? `collab.assignment:${params.object}:${params.recordId}:${newOwner}:${writeVersion}`\n : undefined,\n payload: {\n title: `${params.object} \"${params.label}\" assigned to you`,\n },\n });\n } catch {\n // best-effort; never throw into CRUD path\n }\n}\n\n// Re-export for convenience.\nexport type { IDataEngine };\n"],"mappings":"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","names":["ObjectSchema","Field","ObjectSchema","Field","prev","AuditTranslations"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@objectstack/plugin-audit",
3
- "version": "9.5.0",
3
+ "version": "9.6.0",
4
4
  "license": "Apache-2.0",
5
5
  "description": "Audit Plugin for ObjectStack — System audit log object and audit trail",
6
6
  "main": "dist/index.js",
@@ -13,14 +13,14 @@
13
13
  }
14
14
  },
15
15
  "dependencies": {
16
- "@objectstack/core": "9.5.0",
17
- "@objectstack/platform-objects": "9.5.0",
18
- "@objectstack/spec": "9.5.0"
16
+ "@objectstack/core": "9.6.0",
17
+ "@objectstack/platform-objects": "9.6.0",
18
+ "@objectstack/spec": "9.6.0"
19
19
  },
20
20
  "devDependencies": {
21
- "@types/node": "^25.9.2",
21
+ "@types/node": "^25.9.3",
22
22
  "typescript": "^6.0.3",
23
- "vitest": "^4.1.8"
23
+ "vitest": "^4.1.9"
24
24
  },
25
25
  "keywords": [
26
26
  "objectstack",