@objectstack/platform-objects 6.5.1 → 6.7.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
@@ -425,6 +425,30 @@ var SysAccount = data.ObjectSchema.create({
425
425
  description: "OAuth and authentication provider accounts",
426
426
  titleFormat: "{provider_id} - {account_id}",
427
427
  compactLayout: ["provider_id", "user_id", "account_id"],
428
+ // Custom actions — sysadmins routinely need to revoke a user's OAuth
429
+ // link (e.g. when an SSO provider is decommissioned or the user
430
+ // requests it). Better-auth exposes `/unlink-account { providerId,
431
+ // accountId }` for this. The form is locked to the row's values so
432
+ // it acts as a one-click confirmation rather than a free-form edit.
433
+ actions: [
434
+ {
435
+ name: "unlink_account",
436
+ label: "Unlink Account",
437
+ icon: "unlink",
438
+ variant: "danger",
439
+ mode: "delete",
440
+ locations: ["list_item", "record_header"],
441
+ type: "api",
442
+ target: "/api/v1/auth/unlink-account",
443
+ confirmText: "Unlink this identity link? The user will no longer be able to sign in with this provider until they re-link it from their account settings.",
444
+ successMessage: "Identity link removed",
445
+ refreshAfter: true,
446
+ params: [
447
+ { name: "providerId", field: "provider_id", defaultFromRow: true, required: true },
448
+ { name: "accountId", field: "account_id", defaultFromRow: true, required: true }
449
+ ]
450
+ }
451
+ ],
428
452
  listViews: {
429
453
  mine: {
430
454
  type: "grid",
@@ -1979,6 +2003,96 @@ var SysOauthApplication = data.ObjectSchema.create({
1979
2003
  displayNameField: "name",
1980
2004
  titleFormat: "{name}",
1981
2005
  compactLayout: ["name", "client_id", "type", "disabled"],
2006
+ // Custom actions — all OAuth-application mutations are routed through
2007
+ // better-auth's `@better-auth/oauth-provider` endpoints (and a thin
2008
+ // ObjectStack-added auth route for the enable/disable toggle) rather
2009
+ // than the generic data layer, so server-side validation, secret
2010
+ // hashing, and audit hooks all run. The generic `delete` API method
2011
+ // is intentionally dropped from `apiMethods` below so the only delete
2012
+ // path is the better-auth wrapper.
2013
+ //
2014
+ // Upstream gap (better-auth 1.6.11): the stock `/admin/oauth2/update-client`
2015
+ // endpoint's Zod body schema does NOT accept the `disabled` flag, even
2016
+ // though the column exists and the runtime honours it. We bridge the
2017
+ // gap with `POST /api/v1/auth/admin/oauth2/toggle-disabled`, registered
2018
+ // by plugin-auth, which writes through better-auth's own adapter under
2019
+ // the auth namespace (no generic data-layer bypass). When upstream
2020
+ // ships `disabled` support, retarget the enable/disable actions and
2021
+ // delete the bridge route.
2022
+ actions: [
2023
+ {
2024
+ name: "disable_oauth_application",
2025
+ label: "Disable OAuth Application",
2026
+ icon: "pause-circle",
2027
+ variant: "secondary",
2028
+ mode: "custom",
2029
+ locations: ["list_item", "record_header"],
2030
+ type: "api",
2031
+ method: "POST",
2032
+ target: "/api/v1/auth/admin/oauth2/toggle-disabled",
2033
+ confirmText: "Disable this OAuth application? Active access/refresh tokens issued to it will continue to be rejected at the token, authorize, and introspect endpoints. Existing integrations will stop working immediately.",
2034
+ successMessage: "OAuth application disabled",
2035
+ refreshAfter: true,
2036
+ visible: "!record.disabled",
2037
+ bodyExtra: { disabled: true },
2038
+ params: [
2039
+ { name: "client_id", field: "client_id", defaultFromRow: true, required: true }
2040
+ ]
2041
+ },
2042
+ {
2043
+ name: "enable_oauth_application",
2044
+ label: "Enable OAuth Application",
2045
+ icon: "play-circle",
2046
+ variant: "primary",
2047
+ mode: "custom",
2048
+ locations: ["list_item", "record_header"],
2049
+ type: "api",
2050
+ method: "POST",
2051
+ target: "/api/v1/auth/admin/oauth2/toggle-disabled",
2052
+ confirmText: "Re-enable this OAuth application? Token issuance, authorization, and introspection will resume immediately.",
2053
+ successMessage: "OAuth application enabled",
2054
+ refreshAfter: true,
2055
+ visible: "record.disabled",
2056
+ bodyExtra: { disabled: false },
2057
+ params: [
2058
+ { name: "client_id", field: "client_id", defaultFromRow: true, required: true }
2059
+ ]
2060
+ },
2061
+ {
2062
+ name: "rotate_client_secret",
2063
+ label: "Rotate Client Secret",
2064
+ icon: "refresh-cw",
2065
+ variant: "secondary",
2066
+ mode: "custom",
2067
+ locations: ["list_item", "record_header"],
2068
+ type: "api",
2069
+ method: "POST",
2070
+ target: "/api/v1/auth/oauth2/client/rotate-secret",
2071
+ confirmText: "Rotate this OAuth client's secret? The previous secret will stop working immediately and any integrations using it will break until they are updated with the new secret. The new secret is shown only once.",
2072
+ successMessage: "Client secret rotated \u2014 copy the new value from the response now.",
2073
+ refreshAfter: true,
2074
+ params: [
2075
+ { name: "client_id", field: "client_id", defaultFromRow: true, required: true }
2076
+ ]
2077
+ },
2078
+ {
2079
+ name: "delete_oauth_application",
2080
+ label: "Delete OAuth Application",
2081
+ icon: "trash-2",
2082
+ variant: "danger",
2083
+ mode: "delete",
2084
+ locations: ["list_item", "record_header"],
2085
+ type: "api",
2086
+ method: "POST",
2087
+ target: "/api/v1/auth/oauth2/delete-client",
2088
+ confirmText: "Permanently delete this OAuth application? All issued tokens and consents will be invalidated and integrations using this client_id will stop working immediately. This cannot be undone.",
2089
+ successMessage: "OAuth application deleted",
2090
+ refreshAfter: true,
2091
+ params: [
2092
+ { name: "client_id", field: "client_id", defaultFromRow: true, required: true }
2093
+ ]
2094
+ }
2095
+ ],
1982
2096
  listViews: {
1983
2097
  active: {
1984
2098
  type: "grid",
@@ -2210,7 +2324,12 @@ var SysOauthApplication = data.ObjectSchema.create({
2210
2324
  trackHistory: true,
2211
2325
  searchable: true,
2212
2326
  apiEnabled: true,
2213
- apiMethods: ["get", "list", "delete"],
2327
+ // All mutations (create/update/delete) must go through better-auth's
2328
+ // oauth-provider endpoints under /api/v1/auth/{admin/,}oauth2/* — the
2329
+ // generic data layer is read-only for this object so sysadmins cannot
2330
+ // bypass server-side OAuth validation. The Delete row action above is
2331
+ // wired to /api/v1/auth/oauth2/delete-client.
2332
+ apiMethods: ["get", "list"],
2214
2333
  trash: false,
2215
2334
  mru: false
2216
2335
  }
@@ -2493,6 +2612,83 @@ var SysRole = data.ObjectSchema.create({
2493
2612
  displayNameField: "label",
2494
2613
  titleFormat: "{label}",
2495
2614
  compactLayout: ["label", "name", "active", "is_default"],
2615
+ // Custom actions — system roles drive RBAC and are edited rarely but
2616
+ // require the four high-frequency sysadmin affordances every IdP
2617
+ // (Salesforce, ServiceNow, Okta) ships: activate/deactivate (lifecycle
2618
+ // without losing assignments), mark default (auto-assign to new users),
2619
+ // and clone (template for new roles). All operations hit the generic
2620
+ // data CRUD endpoint exposed by `apiEnabled` — no custom server route
2621
+ // required because `managedBy: 'config'` allows direct mutation.
2622
+ actions: [
2623
+ {
2624
+ name: "activate_role",
2625
+ label: "Activate Role",
2626
+ icon: "circle-check",
2627
+ variant: "secondary",
2628
+ mode: "custom",
2629
+ locations: ["list_item", "record_header"],
2630
+ type: "api",
2631
+ method: "PATCH",
2632
+ target: "/api/v1/data/sys_role/{id}",
2633
+ bodyExtra: { active: true },
2634
+ successMessage: "Role activated",
2635
+ refreshAfter: true
2636
+ },
2637
+ {
2638
+ name: "deactivate_role",
2639
+ label: "Deactivate Role",
2640
+ icon: "circle-off",
2641
+ variant: "danger",
2642
+ mode: "custom",
2643
+ locations: ["list_item", "record_header"],
2644
+ type: "api",
2645
+ method: "PATCH",
2646
+ target: "/api/v1/data/sys_role/{id}",
2647
+ bodyExtra: { active: false },
2648
+ confirmText: "Deactivate this role? Users with the role keep their assignment but the role stops granting permissions until re-activated.",
2649
+ successMessage: "Role deactivated",
2650
+ refreshAfter: true
2651
+ },
2652
+ {
2653
+ name: "set_default_role",
2654
+ label: "Set as Default",
2655
+ icon: "star",
2656
+ variant: "secondary",
2657
+ mode: "custom",
2658
+ locations: ["list_item", "record_header"],
2659
+ type: "api",
2660
+ method: "PATCH",
2661
+ target: "/api/v1/data/sys_role/{id}",
2662
+ bodyExtra: { is_default: true },
2663
+ confirmText: "Make this the default role for new users? Existing users are unaffected.",
2664
+ successMessage: "Default role updated",
2665
+ refreshAfter: true
2666
+ },
2667
+ {
2668
+ // Clone — POST a new sys_role row pre-filled from the source. The
2669
+ // dialog asks only for the new API name / label so the operator
2670
+ // can rename atomically; permissions JSON is copied wholesale via
2671
+ // defaultFromRow.
2672
+ name: "clone_role",
2673
+ label: "Clone Role",
2674
+ icon: "copy",
2675
+ variant: "secondary",
2676
+ mode: "custom",
2677
+ locations: ["list_item", "record_header"],
2678
+ type: "api",
2679
+ method: "POST",
2680
+ target: "/api/v1/data/sys_role",
2681
+ bodyExtra: { is_default: false, active: true },
2682
+ successMessage: "Role cloned",
2683
+ refreshAfter: true,
2684
+ params: [
2685
+ { name: "label", label: "New Display Name", type: "text", required: true },
2686
+ { name: "name", label: "New API Name", type: "text", required: true, helpText: "Unique snake_case machine name" },
2687
+ { field: "description", defaultFromRow: true },
2688
+ { field: "permissions", defaultFromRow: true }
2689
+ ]
2690
+ }
2691
+ ],
2496
2692
  listViews: {
2497
2693
  active: {
2498
2694
  type: "grid",
@@ -2619,6 +2815,64 @@ var SysPermissionSet = data.ObjectSchema.create({
2619
2815
  displayNameField: "label",
2620
2816
  titleFormat: "{label}",
2621
2817
  compactLayout: ["label", "name", "active"],
2818
+ // Custom actions — permission sets are templates assigned to roles or
2819
+ // users (via sys_role_permission_set / sys_user_permission_set). The
2820
+ // sysadmin operations that don't live on the parent-detail tabs are
2821
+ // lifecycle (activate/deactivate without losing assignments) and
2822
+ // clone (build a new permset by tweaking an existing one). Both hit
2823
+ // the generic data CRUD endpoint — managedBy: 'config' permits it.
2824
+ actions: [
2825
+ {
2826
+ name: "activate_permission_set",
2827
+ label: "Activate",
2828
+ icon: "circle-check",
2829
+ variant: "secondary",
2830
+ mode: "custom",
2831
+ locations: ["list_item", "record_header"],
2832
+ type: "api",
2833
+ method: "PATCH",
2834
+ target: "/api/v1/data/sys_permission_set/{id}",
2835
+ bodyExtra: { active: true },
2836
+ successMessage: "Permission set activated",
2837
+ refreshAfter: true
2838
+ },
2839
+ {
2840
+ name: "deactivate_permission_set",
2841
+ label: "Deactivate",
2842
+ icon: "circle-off",
2843
+ variant: "danger",
2844
+ mode: "custom",
2845
+ locations: ["list_item", "record_header"],
2846
+ type: "api",
2847
+ method: "PATCH",
2848
+ target: "/api/v1/data/sys_permission_set/{id}",
2849
+ bodyExtra: { active: false },
2850
+ confirmText: "Deactivate this permission set? Existing assignments stay in place but stop granting access until re-activated.",
2851
+ successMessage: "Permission set deactivated",
2852
+ refreshAfter: true
2853
+ },
2854
+ {
2855
+ name: "clone_permission_set",
2856
+ label: "Clone",
2857
+ icon: "copy",
2858
+ variant: "secondary",
2859
+ mode: "custom",
2860
+ locations: ["list_item", "record_header"],
2861
+ type: "api",
2862
+ method: "POST",
2863
+ target: "/api/v1/data/sys_permission_set",
2864
+ bodyExtra: { active: true },
2865
+ successMessage: "Permission set cloned",
2866
+ refreshAfter: true,
2867
+ params: [
2868
+ { name: "label", label: "New Display Name", type: "text", required: true },
2869
+ { name: "name", label: "New API Name", type: "text", required: true, helpText: "Unique snake_case machine name" },
2870
+ { field: "description", defaultFromRow: true },
2871
+ { field: "object_permissions", defaultFromRow: true },
2872
+ { field: "field_permissions", defaultFromRow: true }
2873
+ ]
2874
+ }
2875
+ ],
2622
2876
  listViews: {
2623
2877
  active: {
2624
2878
  type: "grid",
@@ -6254,8 +6508,7 @@ var SETUP_APP = {
6254
6508
  label: "Overview",
6255
6509
  icon: "layout-dashboard",
6256
6510
  children: [
6257
- { id: "nav_system_overview", type: "dashboard", label: "System Overview", dashboardName: "system_overview", icon: "activity" },
6258
- { id: "nav_security_overview", type: "dashboard", label: "Security Overview", dashboardName: "security_overview", icon: "shield" }
6511
+ { id: "nav_system_overview", type: "dashboard", label: "System Overview", dashboardName: "system_overview", icon: "activity" }
6259
6512
  ]
6260
6513
  },
6261
6514
  {
@@ -6317,9 +6570,17 @@ var SETUP_APP = {
6317
6570
  // is used (not `object`) because settings are stored in a generic
6318
6571
  // K/V table (`sys_setting`) rather than per-namespace objects, and
6319
6572
  // the renderer is a dedicated <SettingsView> page in objectui.
6573
+ //
6574
+ // Order mirrors `builtinSettingsManifests` so left-nav order matches
6575
+ // the All-Settings index. AI groups chat + embedder under one entry
6576
+ // because operators reason about them together; Knowledge is its
6577
+ // own entry because the adapter selection is independent.
6320
6578
  { id: "nav_settings_hub", type: "url", label: "All Settings", url: "/apps/setup/system/settings", icon: "settings-2" },
6321
- { id: "nav_settings_mail", type: "url", label: "Email", url: "/apps/setup/system/settings/mail", icon: "mail" },
6322
6579
  { id: "nav_settings_branding", type: "url", label: "Branding", url: "/apps/setup/system/settings/branding", icon: "palette" },
6580
+ { id: "nav_settings_mail", type: "url", label: "Email", url: "/apps/setup/system/settings/mail", icon: "mail" },
6581
+ { id: "nav_settings_storage", type: "url", label: "File Storage", url: "/apps/setup/system/settings/storage", icon: "hard-drive" },
6582
+ { id: "nav_settings_ai", type: "url", label: "AI & Embedder", url: "/apps/setup/system/settings/ai", icon: "sparkles" },
6583
+ { id: "nav_settings_knowledge", type: "url", label: "Knowledge", url: "/apps/setup/system/settings/knowledge", icon: "book-open" },
6323
6584
  { id: "nav_settings_feature_flags", type: "url", label: "Feature Flags", url: "/apps/setup/system/settings/feature_flags", icon: "flag" }
6324
6585
  ]
6325
6586
  },
@@ -6398,63 +6659,42 @@ var SETUP_APP = {
6398
6659
  var SystemOverviewDashboard = ui.Dashboard.create({
6399
6660
  name: "system_overview",
6400
6661
  label: "System Overview",
6401
- description: "Platform health, sessions, and audit activity",
6402
- // 12-column grid matches the widget `w` values below (3, 6, 12). Without
6403
- // this, the renderer falls back to a 4-column grid and `w: 3` becomes 75%
6404
- // width per metric — so KPI cards stack vertically instead of forming a
6405
- // 4-up row.
6662
+ description: "Platform health, security activity, and recent audit events",
6663
+ // 12-column grid matches the widget `w` values below.
6406
6664
  columns: 12,
6407
6665
  gap: 4,
6408
6666
  widgets: [
6409
- // ── Active Sessions Widget ──────────────────────────────────────
6410
- {
6411
- id: "widget_active_sessions",
6412
- title: "Active Sessions",
6413
- type: "metric",
6414
- object: "sys_session",
6415
- layout: {
6416
- x: 0,
6417
- y: 0,
6418
- w: 3,
6419
- h: 2
6420
- },
6421
- aggregate: "count",
6422
- colorVariant: "blue",
6423
- description: "Number of currently active user sessions"
6424
- },
6425
- // ── Total Users Widget ──────────────────────────────────────────
6667
+ // ── Row 1: Platform KPIs ────────────────────────────────────────
6426
6668
  {
6427
6669
  id: "widget_total_users",
6428
6670
  title: "Total Users",
6429
6671
  type: "metric",
6430
6672
  object: "sys_user",
6431
- layout: {
6432
- x: 3,
6433
- y: 0,
6434
- w: 3,
6435
- h: 2
6436
- },
6673
+ layout: { x: 0, y: 0, w: 3, h: 2 },
6437
6674
  aggregate: "count",
6438
6675
  colorVariant: "teal",
6439
6676
  description: "Total registered users in the system"
6440
6677
  },
6441
- // ── Organizations Widget ────────────────────────────────────────
6442
6678
  {
6443
6679
  id: "widget_organizations",
6444
6680
  title: "Organizations",
6445
6681
  type: "metric",
6446
6682
  object: "sys_organization",
6447
- layout: {
6448
- x: 6,
6449
- y: 0,
6450
- w: 3,
6451
- h: 2
6452
- },
6683
+ layout: { x: 3, y: 0, w: 3, h: 2 },
6453
6684
  aggregate: "count",
6454
6685
  colorVariant: "orange",
6455
6686
  description: "Total organizations on the platform"
6456
6687
  },
6457
- // ── Packages Installed Widget ───────────────────────────────────
6688
+ {
6689
+ id: "widget_active_sessions",
6690
+ title: "Active Sessions",
6691
+ type: "metric",
6692
+ object: "sys_session",
6693
+ layout: { x: 6, y: 0, w: 3, h: 2 },
6694
+ aggregate: "count",
6695
+ colorVariant: "blue",
6696
+ description: "Number of currently active user sessions"
6697
+ },
6458
6698
  {
6459
6699
  id: "widget_packages_installed",
6460
6700
  title: "Packages Installed",
@@ -6463,97 +6703,13 @@ var SystemOverviewDashboard = ui.Dashboard.create({
6463
6703
  // Cloud-only object — only registered when service-tenant is loaded.
6464
6704
  // Hide this widget gracefully in single-environment runtimes.
6465
6705
  requiresObject: "sys_package_installation",
6466
- layout: {
6467
- x: 9,
6468
- y: 0,
6469
- w: 3,
6470
- h: 2
6471
- },
6706
+ layout: { x: 9, y: 0, w: 3, h: 2 },
6472
6707
  filter: { status: "installed" },
6473
6708
  aggregate: "count",
6474
6709
  colorVariant: "success",
6475
6710
  description: "Active package installations across projects"
6476
6711
  },
6477
- // ── Audit Actions by Type ───────────────────────────────────────
6478
- // Note: relative date filters like `NOW() - INTERVAL 7 DAY` are not
6479
- // currently substituted by the analytics layer (see
6480
- // service-analytics/strategies/filter-normalizer.ts). The dashboard's
6481
- // `globalFilters` date-range bar at the bottom is the supported way
6482
- // to scope this widget.
6483
- {
6484
- id: "widget_audit_actions",
6485
- title: "Audit Actions",
6486
- description: "Distribution of audit events by action type",
6487
- type: "pie",
6488
- object: "sys_audit_log",
6489
- layout: {
6490
- x: 0,
6491
- y: 2,
6492
- w: 6,
6493
- h: 4
6494
- },
6495
- categoryField: "action",
6496
- aggregate: "count"
6497
- },
6498
- // ── Session Status Overview ─────────────────────────────────────
6499
- {
6500
- id: "widget_active_orgs",
6501
- title: "Sessions by Organization",
6502
- description: "Active sessions grouped by organization",
6503
- type: "bar",
6504
- object: "sys_session",
6505
- layout: {
6506
- x: 6,
6507
- y: 2,
6508
- w: 6,
6509
- h: 4
6510
- },
6511
- categoryField: "active_organization_id",
6512
- aggregate: "count"
6513
- },
6514
- // ── Recent Audit Log (Table) ────────────────────────────────────
6515
- // `type: 'table'` renders the underlying rows directly, so this
6516
- // panel actually shows the latest events instead of just repeating
6517
- // the total-count metric. `valueField`/`aggregate` are intentionally
6518
- // omitted — table widgets pull raw records.
6519
- {
6520
- id: "widget_recent_events",
6521
- title: "Recent Audit Events",
6522
- description: "Latest platform events",
6523
- type: "table",
6524
- object: "sys_audit_log",
6525
- layout: {
6526
- x: 0,
6527
- y: 6,
6528
- w: 12,
6529
- h: 4
6530
- },
6531
- options: {
6532
- columns: ["created_at", "user_id", "action", "object_name", "record_id"],
6533
- sort: [{ field: "created_at", order: "desc" }],
6534
- pageSize: 20
6535
- }
6536
- }
6537
- ],
6538
- globalFilters: [
6539
- {
6540
- field: "created_at",
6541
- type: "date",
6542
- label: "Date Range",
6543
- scope: "dashboard",
6544
- defaultValue: "last_7_days"
6545
- }
6546
- ]
6547
- });
6548
- var SecurityOverviewDashboard = ui.Dashboard.create({
6549
- name: "security_overview",
6550
- label: "Security Overview",
6551
- description: "Security events, authentication, and audit trails",
6552
- // 12-column grid matches the widget `w` values below.
6553
- columns: 12,
6554
- gap: 4,
6555
- widgets: [
6556
- // ── Login Events Widget ─────────────────────────────────────────
6712
+ // ── Row 2: Security KPIs ────────────────────────────────────────
6557
6713
  // The `sys_audit_log.action` enum doesn't distinguish failed vs
6558
6714
  // successful logins (both fold into `action='login'`). Surfacing a
6559
6715
  // total Login Events count is honest; a "Failed Logins" widget will
@@ -6563,116 +6719,72 @@ var SecurityOverviewDashboard = ui.Dashboard.create({
6563
6719
  title: "Login Events",
6564
6720
  type: "metric",
6565
6721
  object: "sys_audit_log",
6566
- layout: {
6567
- x: 0,
6568
- y: 0,
6569
- w: 3,
6570
- h: 2
6571
- },
6722
+ layout: { x: 0, y: 2, w: 4, h: 2 },
6572
6723
  filter: { action: "login" },
6573
6724
  aggregate: "count",
6574
6725
  colorVariant: "blue",
6575
6726
  description: "Authentication events recorded by the audit log"
6576
6727
  },
6577
- // ── Permission Changes Widget ───────────────────────────────────
6578
6728
  {
6579
6729
  id: "widget_permission_changes",
6580
6730
  title: "Permission Changes",
6581
6731
  type: "metric",
6582
6732
  object: "sys_audit_log",
6583
- layout: {
6584
- x: 3,
6585
- y: 0,
6586
- w: 3,
6587
- h: 2
6588
- },
6733
+ layout: { x: 4, y: 2, w: 4, h: 2 },
6589
6734
  filter: { action: "permission_change" },
6590
6735
  aggregate: "count",
6591
6736
  colorVariant: "warning",
6592
6737
  description: "Recent permission and role modifications"
6593
6738
  },
6594
- // ── System Config Changes Widget ────────────────────────────────
6595
6739
  {
6596
6740
  id: "widget_config_changes",
6597
6741
  title: "Config Changes",
6598
6742
  type: "metric",
6599
6743
  object: "sys_audit_log",
6600
- layout: {
6601
- x: 6,
6602
- y: 0,
6603
- w: 3,
6604
- h: 2
6605
- },
6744
+ layout: { x: 8, y: 2, w: 4, h: 2 },
6606
6745
  filter: { action: "config_change" },
6607
6746
  aggregate: "count",
6608
6747
  colorVariant: "blue",
6609
6748
  description: "System configuration modifications"
6610
6749
  },
6611
- // ── Active Sessions Widget ──────────────────────────────────────
6612
- {
6613
- id: "widget_active_sessions",
6614
- title: "Active Sessions",
6615
- type: "metric",
6616
- object: "sys_session",
6617
- layout: {
6618
- x: 9,
6619
- y: 0,
6620
- w: 3,
6621
- h: 2
6622
- },
6623
- aggregate: "count",
6624
- colorVariant: "success",
6625
- description: "Currently active user sessions"
6626
- },
6627
- // ── Audit Events by Type ────────────────────────────────────────
6750
+ // ── Row 3: Distribution charts ──────────────────────────────────
6751
+ // Note: relative date filters like `NOW() - INTERVAL 7 DAY` are not
6752
+ // currently substituted by the analytics layer (see
6753
+ // service-analytics/strategies/filter-normalizer.ts). The dashboard's
6754
+ // `globalFilters` date-range bar at the bottom is the supported way
6755
+ // to scope these widgets.
6628
6756
  {
6629
6757
  id: "widget_events_by_type",
6630
- title: "Audit Events by Type",
6631
- description: "Distribution of security and audit events",
6758
+ title: "Audit Events by Action",
6759
+ description: "Distribution of audit events by action type",
6632
6760
  type: "pie",
6633
6761
  object: "sys_audit_log",
6634
- layout: {
6635
- x: 0,
6636
- y: 2,
6637
- w: 6,
6638
- h: 4
6639
- },
6762
+ layout: { x: 0, y: 4, w: 6, h: 4 },
6640
6763
  categoryField: "action",
6641
6764
  aggregate: "count"
6642
6765
  },
6643
- // ── Audit Events by User ────────────────────────────────────────
6644
6766
  {
6645
6767
  id: "widget_events_by_user",
6646
6768
  title: "Events by User",
6647
6769
  description: "Activity distribution across users",
6648
6770
  type: "bar",
6649
6771
  object: "sys_audit_log",
6650
- layout: {
6651
- x: 6,
6652
- y: 2,
6653
- w: 6,
6654
- h: 4
6655
- },
6772
+ layout: { x: 6, y: 4, w: 6, h: 4 },
6656
6773
  categoryField: "user_id",
6657
6774
  aggregate: "count"
6658
6775
  },
6659
- // ── Recent Security Events (Table) ──────────────────────────────
6660
- // Real table widget pulls the latest permission/config rows.
6776
+ // ── Row 4: Recent audit events table ────────────────────────────
6777
+ // `type: 'table'` renders the underlying rows directly, so this
6778
+ // panel actually shows the latest events instead of just repeating
6779
+ // the total-count metric. `valueField`/`aggregate` are intentionally
6780
+ // omitted — table widgets pull raw records.
6661
6781
  {
6662
- id: "widget_recent_security_events",
6663
- title: "Recent Security Events",
6664
- description: "Latest permission and config changes",
6782
+ id: "widget_recent_events",
6783
+ title: "Recent Audit Events",
6784
+ description: "Latest platform events (login, permission, config, \u2026)",
6665
6785
  type: "table",
6666
6786
  object: "sys_audit_log",
6667
- layout: {
6668
- x: 0,
6669
- y: 6,
6670
- w: 12,
6671
- h: 4
6672
- },
6673
- filter: {
6674
- action: { $in: ["login", "logout", "permission_change", "config_change"] }
6675
- },
6787
+ layout: { x: 0, y: 8, w: 12, h: 4 },
6676
6788
  options: {
6677
6789
  columns: ["created_at", "user_id", "action", "object_name", "record_id"],
6678
6790
  sort: [{ field: "created_at", order: "desc" }],
@@ -9616,7 +9728,6 @@ var en = {
9616
9728
  group_advanced: { label: "Advanced" },
9617
9729
  // Overview
9618
9730
  nav_system_overview: { label: "System Overview" },
9619
- nav_security_overview: { label: "Security Overview" },
9620
9731
  // People & Organization
9621
9732
  nav_users: { label: "Users" },
9622
9733
  nav_departments: { label: "Departments" },
@@ -9657,12 +9768,8 @@ var en = {
9657
9768
  dashboards: {
9658
9769
  system_overview: {
9659
9770
  label: "System Overview",
9660
- description: "Platform health, sessions, and audit activity",
9771
+ description: "Platform health, security activity, and recent audit events",
9661
9772
  widgets: {
9662
- widget_active_sessions: {
9663
- title: "Active Sessions",
9664
- description: "Number of currently active user sessions"
9665
- },
9666
9773
  widget_total_users: {
9667
9774
  title: "Total Users",
9668
9775
  description: "Total registered users in the system"
@@ -9671,28 +9778,14 @@ var en = {
9671
9778
  title: "Organizations",
9672
9779
  description: "Total organizations on the platform"
9673
9780
  },
9781
+ widget_active_sessions: {
9782
+ title: "Active Sessions",
9783
+ description: "Number of currently active user sessions"
9784
+ },
9674
9785
  widget_packages_installed: {
9675
9786
  title: "Packages Installed",
9676
9787
  description: "Active package installations across projects"
9677
9788
  },
9678
- widget_audit_actions: {
9679
- title: "Audit Actions",
9680
- description: "Distribution of audit events by action type"
9681
- },
9682
- widget_active_orgs: {
9683
- title: "Sessions by Organization",
9684
- description: "Active sessions grouped by organization"
9685
- },
9686
- widget_recent_events: {
9687
- title: "Recent Audit Events",
9688
- description: "Latest platform events"
9689
- }
9690
- }
9691
- },
9692
- security_overview: {
9693
- label: "Security Overview",
9694
- description: "Security events, authentication, and audit trails",
9695
- widgets: {
9696
9789
  widget_login_events: {
9697
9790
  title: "Login Events",
9698
9791
  description: "Authentication events recorded by the audit log"
@@ -9705,21 +9798,17 @@ var en = {
9705
9798
  title: "Config Changes",
9706
9799
  description: "System configuration modifications"
9707
9800
  },
9708
- widget_active_sessions: {
9709
- title: "Active Sessions",
9710
- description: "Currently active user sessions"
9711
- },
9712
9801
  widget_events_by_type: {
9713
- title: "Audit Events by Type",
9714
- description: "Distribution of security and audit events"
9802
+ title: "Audit Events by Action",
9803
+ description: "Distribution of audit events by action type"
9715
9804
  },
9716
9805
  widget_events_by_user: {
9717
9806
  title: "Events by User",
9718
9807
  description: "Activity distribution across users"
9719
9808
  },
9720
- widget_recent_security_events: {
9721
- title: "Recent Security Events",
9722
- description: "Latest permission and config changes"
9809
+ widget_recent_events: {
9810
+ title: "Recent Audit Events",
9811
+ description: "Latest platform events (login, permission, config, \u2026)"
9723
9812
  }
9724
9813
  }
9725
9814
  }
@@ -12653,7 +12742,6 @@ var zhCN = {
12653
12742
  group_diagnostics: { label: "\u8BCA\u65AD" },
12654
12743
  group_advanced: { label: "\u9AD8\u7EA7" },
12655
12744
  nav_system_overview: { label: "\u7CFB\u7EDF\u6982\u89C8" },
12656
- nav_security_overview: { label: "\u5B89\u5168\u6982\u89C8" },
12657
12745
  nav_users: { label: "\u7528\u6237" },
12658
12746
  nav_departments: { label: "\u90E8\u95E8" },
12659
12747
  nav_teams: { label: "\u56E2\u961F" },
@@ -12688,28 +12776,18 @@ var zhCN = {
12688
12776
  dashboards: {
12689
12777
  system_overview: {
12690
12778
  label: "\u7CFB\u7EDF\u6982\u89C8",
12691
- description: "\u5E73\u53F0\u8FD0\u884C\u72B6\u51B5\u3001\u4F1A\u8BDD\u4E0E\u5BA1\u8BA1\u6D3B\u52A8",
12779
+ description: "\u5E73\u53F0\u8FD0\u884C\u72B6\u51B5\u3001\u5B89\u5168\u6D3B\u52A8\u4E0E\u6700\u8FD1\u5BA1\u8BA1\u4E8B\u4EF6",
12692
12780
  widgets: {
12693
- widget_active_sessions: { title: "\u6D3B\u8DC3\u4F1A\u8BDD", description: "\u5F53\u524D\u6D3B\u8DC3\u7528\u6237\u4F1A\u8BDD\u6570\u91CF" },
12694
12781
  widget_total_users: { title: "\u7528\u6237\u603B\u6570", description: "\u7CFB\u7EDF\u4E2D\u5DF2\u6CE8\u518C\u7684\u7528\u6237\u603B\u6570" },
12695
12782
  widget_organizations: { title: "\u7EC4\u7EC7\u6570", description: "\u5E73\u53F0\u4E0A\u7684\u7EC4\u7EC7\u603B\u6570" },
12783
+ widget_active_sessions: { title: "\u6D3B\u8DC3\u4F1A\u8BDD", description: "\u5F53\u524D\u6D3B\u8DC3\u7528\u6237\u4F1A\u8BDD\u6570\u91CF" },
12696
12784
  widget_packages_installed: { title: "\u5DF2\u5B89\u88C5\u5305", description: "\u9879\u76EE\u4E2D\u5DF2\u6FC0\u6D3B\u7684\u5B89\u88C5\u5305\u6570" },
12697
- widget_audit_actions: { title: "\u5BA1\u8BA1\u64CD\u4F5C", description: "\u6309\u64CD\u4F5C\u7C7B\u578B\u5206\u5E03\u7684\u5BA1\u8BA1\u4E8B\u4EF6" },
12698
- widget_active_orgs: { title: "\u6309\u7EC4\u7EC7\u5212\u5206\u4F1A\u8BDD", description: "\u6309\u7EC4\u7EC7\u5206\u7EC4\u7684\u6D3B\u8DC3\u4F1A\u8BDD" },
12699
- widget_recent_events: { title: "\u6700\u8FD1\u5BA1\u8BA1\u4E8B\u4EF6", description: "\u6700\u65B0\u7684\u5E73\u53F0\u4E8B\u4EF6" }
12700
- }
12701
- },
12702
- security_overview: {
12703
- label: "\u5B89\u5168\u6982\u89C8",
12704
- description: "\u5B89\u5168\u4E8B\u4EF6\u3001\u8EAB\u4EFD\u8BA4\u8BC1\u4E0E\u5BA1\u8BA1\u8FFD\u8E2A",
12705
- widgets: {
12706
12785
  widget_login_events: { title: "\u767B\u5F55\u4E8B\u4EF6", description: "\u5BA1\u8BA1\u65E5\u5FD7\u4E2D\u8BB0\u5F55\u7684\u8BA4\u8BC1\u4E8B\u4EF6" },
12707
12786
  widget_permission_changes: { title: "\u6743\u9650\u53D8\u66F4", description: "\u6700\u8FD1\u7684\u6743\u9650\u548C\u89D2\u8272\u4FEE\u6539" },
12708
12787
  widget_config_changes: { title: "\u914D\u7F6E\u53D8\u66F4", description: "\u7CFB\u7EDF\u914D\u7F6E\u4FEE\u6539" },
12709
- widget_active_sessions: { title: "\u6D3B\u8DC3\u4F1A\u8BDD", description: "\u5F53\u524D\u6D3B\u8DC3\u7528\u6237\u4F1A\u8BDD" },
12710
- widget_events_by_type: { title: "\u6309\u7C7B\u578B\u5206\u5E03\u7684\u5BA1\u8BA1\u4E8B\u4EF6", description: "\u5B89\u5168\u4E0E\u5BA1\u8BA1\u4E8B\u4EF6\u5206\u5E03" },
12788
+ widget_events_by_type: { title: "\u6309\u64CD\u4F5C\u5206\u5E03\u7684\u5BA1\u8BA1\u4E8B\u4EF6", description: "\u5BA1\u8BA1\u4E8B\u4EF6\u6309\u64CD\u4F5C\u7C7B\u578B\u5206\u5E03" },
12711
12789
  widget_events_by_user: { title: "\u6309\u7528\u6237\u5206\u5E03\u7684\u4E8B\u4EF6", description: "\u7528\u6237\u6D3B\u52A8\u5206\u5E03" },
12712
- widget_recent_security_events: { title: "\u6700\u8FD1\u5B89\u5168\u4E8B\u4EF6", description: "\u6700\u65B0\u7684\u6743\u9650\u4E0E\u914D\u7F6E\u53D8\u66F4" }
12790
+ widget_recent_events: { title: "\u6700\u8FD1\u5BA1\u8BA1\u4E8B\u4EF6", description: "\u6700\u65B0\u7684\u5E73\u53F0\u4E8B\u4EF6\uFF08\u767B\u5F55\u3001\u6743\u9650\u3001\u914D\u7F6E\u7B49\uFF09" }
12713
12791
  }
12714
12792
  }
12715
12793
  }
@@ -15638,7 +15716,6 @@ var jaJP = {
15638
15716
  group_diagnostics: { label: "\u8A3A\u65AD" },
15639
15717
  group_advanced: { label: "\u8A73\u7D30" },
15640
15718
  nav_system_overview: { label: "\u30B7\u30B9\u30C6\u30E0\u6982\u8981" },
15641
- nav_security_overview: { label: "\u30BB\u30AD\u30E5\u30EA\u30C6\u30A3\u6982\u8981" },
15642
15719
  nav_users: { label: "\u30E6\u30FC\u30B6\u30FC" },
15643
15720
  nav_departments: { label: "\u90E8\u7F72" },
15644
15721
  nav_teams: { label: "\u30C1\u30FC\u30E0" },
@@ -15673,28 +15750,18 @@ var jaJP = {
15673
15750
  dashboards: {
15674
15751
  system_overview: {
15675
15752
  label: "\u30B7\u30B9\u30C6\u30E0\u6982\u8981",
15676
- description: "\u30D7\u30E9\u30C3\u30C8\u30D5\u30A9\u30FC\u30E0\u306E\u5065\u5168\u6027\u3001\u30BB\u30C3\u30B7\u30E7\u30F3\u3001\u76E3\u67FB\u30A2\u30AF\u30C6\u30A3\u30D3\u30C6\u30A3",
15753
+ description: "\u30D7\u30E9\u30C3\u30C8\u30D5\u30A9\u30FC\u30E0\u306E\u5065\u5168\u6027\u3001\u30BB\u30AD\u30E5\u30EA\u30C6\u30A3\u6D3B\u52D5\u3001\u6700\u8FD1\u306E\u76E3\u67FB\u30A4\u30D9\u30F3\u30C8",
15677
15754
  widgets: {
15678
- widget_active_sessions: { title: "\u30A2\u30AF\u30C6\u30A3\u30D6\u30BB\u30C3\u30B7\u30E7\u30F3", description: "\u73FE\u5728\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30E6\u30FC\u30B6\u30FC\u30BB\u30C3\u30B7\u30E7\u30F3\u6570" },
15679
15755
  widget_total_users: { title: "\u30E6\u30FC\u30B6\u30FC\u7DCF\u6570", description: "\u30B7\u30B9\u30C6\u30E0\u306B\u767B\u9332\u3055\u308C\u305F\u30E6\u30FC\u30B6\u30FC\u306E\u7DCF\u6570" },
15680
15756
  widget_organizations: { title: "\u7D44\u7E54", description: "\u30D7\u30E9\u30C3\u30C8\u30D5\u30A9\u30FC\u30E0\u4E0A\u306E\u7D44\u7E54\u7DCF\u6570" },
15757
+ widget_active_sessions: { title: "\u30A2\u30AF\u30C6\u30A3\u30D6\u30BB\u30C3\u30B7\u30E7\u30F3", description: "\u73FE\u5728\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30E6\u30FC\u30B6\u30FC\u30BB\u30C3\u30B7\u30E7\u30F3\u6570" },
15681
15758
  widget_packages_installed: { title: "\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u6E08\u307F\u30D1\u30C3\u30B1\u30FC\u30B8", description: "\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u3067\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30D1\u30C3\u30B1\u30FC\u30B8\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u6570" },
15682
- widget_audit_actions: { title: "\u76E3\u67FB\u30A2\u30AF\u30B7\u30E7\u30F3", description: "\u30A2\u30AF\u30B7\u30E7\u30F3\u30BF\u30A4\u30D7\u5225\u306E\u76E3\u67FB\u30A4\u30D9\u30F3\u30C8\u5206\u5E03" },
15683
- widget_active_orgs: { title: "\u7D44\u7E54\u5225\u30BB\u30C3\u30B7\u30E7\u30F3", description: "\u7D44\u7E54\u5225\u306B\u30B0\u30EB\u30FC\u30D7\u5316\u3055\u308C\u305F\u30A2\u30AF\u30C6\u30A3\u30D6\u30BB\u30C3\u30B7\u30E7\u30F3" },
15684
- widget_recent_events: { title: "\u6700\u8FD1\u306E\u76E3\u67FB\u30A4\u30D9\u30F3\u30C8", description: "\u6700\u65B0\u306E\u30D7\u30E9\u30C3\u30C8\u30D5\u30A9\u30FC\u30E0\u30A4\u30D9\u30F3\u30C8" }
15685
- }
15686
- },
15687
- security_overview: {
15688
- label: "\u30BB\u30AD\u30E5\u30EA\u30C6\u30A3\u6982\u8981",
15689
- description: "\u30BB\u30AD\u30E5\u30EA\u30C6\u30A3\u30A4\u30D9\u30F3\u30C8\u3001\u8A8D\u8A3C\u3001\u76E3\u67FB\u8A3C\u8DE1",
15690
- widgets: {
15691
15759
  widget_login_events: { title: "\u30ED\u30B0\u30A4\u30F3\u30A4\u30D9\u30F3\u30C8", description: "\u76E3\u67FB\u30ED\u30B0\u306B\u8A18\u9332\u3055\u308C\u305F\u8A8D\u8A3C\u30A4\u30D9\u30F3\u30C8" },
15692
15760
  widget_permission_changes: { title: "\u6A29\u9650\u5909\u66F4", description: "\u6700\u8FD1\u306E\u6A29\u9650\u3068\u30ED\u30FC\u30EB\u306E\u5909\u66F4" },
15693
15761
  widget_config_changes: { title: "\u69CB\u6210\u5909\u66F4", description: "\u30B7\u30B9\u30C6\u30E0\u69CB\u6210\u306E\u5909\u66F4" },
15694
- widget_active_sessions: { title: "\u30A2\u30AF\u30C6\u30A3\u30D6\u30BB\u30C3\u30B7\u30E7\u30F3", description: "\u73FE\u5728\u30A2\u30AF\u30C6\u30A3\u30D6\u306A\u30E6\u30FC\u30B6\u30FC\u30BB\u30C3\u30B7\u30E7\u30F3" },
15695
- widget_events_by_type: { title: "\u30BF\u30A4\u30D7\u5225\u76E3\u67FB\u30A4\u30D9\u30F3\u30C8", description: "\u30BB\u30AD\u30E5\u30EA\u30C6\u30A3\u3068\u76E3\u67FB\u30A4\u30D9\u30F3\u30C8\u306E\u5206\u5E03" },
15762
+ widget_events_by_type: { title: "\u30A2\u30AF\u30B7\u30E7\u30F3\u5225\u76E3\u67FB\u30A4\u30D9\u30F3\u30C8", description: "\u30A2\u30AF\u30B7\u30E7\u30F3\u30BF\u30A4\u30D7\u5225\u306E\u76E3\u67FB\u30A4\u30D9\u30F3\u30C8\u5206\u5E03" },
15696
15763
  widget_events_by_user: { title: "\u30E6\u30FC\u30B6\u30FC\u5225\u30A4\u30D9\u30F3\u30C8", description: "\u30E6\u30FC\u30B6\u30FC\u5225\u30A2\u30AF\u30C6\u30A3\u30D3\u30C6\u30A3\u5206\u5E03" },
15697
- widget_recent_security_events: { title: "\u6700\u8FD1\u306E\u30BB\u30AD\u30E5\u30EA\u30C6\u30A3\u30A4\u30D9\u30F3\u30C8", description: "\u6700\u65B0\u306E\u6A29\u9650\u3068\u69CB\u6210\u306E\u5909\u66F4" }
15764
+ widget_recent_events: { title: "\u6700\u8FD1\u306E\u76E3\u67FB\u30A4\u30D9\u30F3\u30C8", description: "\u6700\u65B0\u306E\u30D7\u30E9\u30C3\u30C8\u30D5\u30A9\u30FC\u30E0\u30A4\u30D9\u30F3\u30C8\uFF08\u30ED\u30B0\u30A4\u30F3\u3001\u6A29\u9650\u3001\u69CB\u6210\u306A\u3069\uFF09" }
15698
15765
  }
15699
15766
  }
15700
15767
  }
@@ -18623,7 +18690,6 @@ var esES = {
18623
18690
  group_diagnostics: { label: "Diagn\xF3stico" },
18624
18691
  group_advanced: { label: "Avanzado" },
18625
18692
  nav_system_overview: { label: "Resumen del Sistema" },
18626
- nav_security_overview: { label: "Resumen de Seguridad" },
18627
18693
  nav_users: { label: "Usuarios" },
18628
18694
  nav_departments: { label: "Departamentos" },
18629
18695
  nav_teams: { label: "Equipos" },
@@ -18658,28 +18724,18 @@ var esES = {
18658
18724
  dashboards: {
18659
18725
  system_overview: {
18660
18726
  label: "Resumen del Sistema",
18661
- description: "Estado de la plataforma, sesiones y actividad de auditor\xEDa",
18727
+ description: "Estado de la plataforma, actividad de seguridad y eventos de auditor\xEDa recientes",
18662
18728
  widgets: {
18663
- widget_active_sessions: { title: "Sesiones Activas", description: "N\xFAmero de sesiones de usuario activas en este momento" },
18664
18729
  widget_total_users: { title: "Usuarios Totales", description: "Total de usuarios registrados en el sistema" },
18665
18730
  widget_organizations: { title: "Organizaciones", description: "Total de organizaciones en la plataforma" },
18731
+ widget_active_sessions: { title: "Sesiones Activas", description: "N\xFAmero de sesiones de usuario activas en este momento" },
18666
18732
  widget_packages_installed: { title: "Paquetes Instalados", description: "Instalaciones de paquetes activas en los proyectos" },
18667
- widget_audit_actions: { title: "Acciones de Auditor\xEDa", description: "Distribuci\xF3n de eventos de auditor\xEDa por tipo de acci\xF3n" },
18668
- widget_active_orgs: { title: "Sesiones por Organizaci\xF3n", description: "Sesiones activas agrupadas por organizaci\xF3n" },
18669
- widget_recent_events: { title: "Eventos de Auditor\xEDa Recientes", description: "\xDAltimos eventos de la plataforma" }
18670
- }
18671
- },
18672
- security_overview: {
18673
- label: "Resumen de Seguridad",
18674
- description: "Eventos de seguridad, autenticaci\xF3n y registros de auditor\xEDa",
18675
- widgets: {
18676
18733
  widget_login_events: { title: "Eventos de Inicio de Sesi\xF3n", description: "Eventos de autenticaci\xF3n registrados por el log de auditor\xEDa" },
18677
18734
  widget_permission_changes: { title: "Cambios de Permisos", description: "Modificaciones recientes de permisos y roles" },
18678
18735
  widget_config_changes: { title: "Cambios de Configuraci\xF3n", description: "Modificaciones de configuraci\xF3n del sistema" },
18679
- widget_active_sessions: { title: "Sesiones Activas", description: "Sesiones de usuario actualmente activas" },
18680
- widget_events_by_type: { title: "Eventos de Auditor\xEDa por Tipo", description: "Distribuci\xF3n de eventos de seguridad y auditor\xEDa" },
18736
+ widget_events_by_type: { title: "Eventos de Auditor\xEDa por Acci\xF3n", description: "Distribuci\xF3n de eventos de auditor\xEDa por tipo de acci\xF3n" },
18681
18737
  widget_events_by_user: { title: "Eventos por Usuario", description: "Distribuci\xF3n de actividad entre usuarios" },
18682
- widget_recent_security_events: { title: "Eventos de Seguridad Recientes", description: "\xDAltimos cambios de permisos y configuraci\xF3n" }
18738
+ widget_recent_events: { title: "Eventos de Auditor\xEDa Recientes", description: "\xDAltimos eventos de la plataforma (inicio de sesi\xF3n, permisos, configuraci\xF3n, \u2026)" }
18683
18739
  }
18684
18740
  }
18685
18741
  }
@@ -18694,7 +18750,6 @@ var SetupAppTranslations = {
18694
18750
  };
18695
18751
 
18696
18752
  exports.SETUP_APP = SETUP_APP;
18697
- exports.SecurityOverviewDashboard = SecurityOverviewDashboard;
18698
18753
  exports.SetupAppTranslations = SetupAppTranslations;
18699
18754
  exports.SysAccount = SysAccount;
18700
18755
  exports.SysActivity = SysActivity;