@serve.zone/dcrouter 13.1.3 → 13.3.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.
Files changed (69) hide show
  1. package/dist_serve/bundle.js +1202 -1133
  2. package/dist_ts/00_commitinfo_data.js +1 -1
  3. package/dist_ts_web/00_commitinfo_data.js +1 -1
  4. package/dist_ts_web/appstate.d.ts +1 -0
  5. package/dist_ts_web/appstate.js +9 -22
  6. package/dist_ts_web/elements/index.d.ts +2 -6
  7. package/dist_ts_web/elements/index.js +3 -7
  8. package/dist_ts_web/elements/network/index.d.ts +6 -0
  9. package/dist_ts_web/elements/network/index.js +7 -0
  10. package/dist_ts_web/elements/{ops-view-network.d.ts → network/ops-view-network-activity.d.ts} +3 -3
  11. package/dist_ts_web/elements/{ops-view-network.js → network/ops-view-network-activity.js} +20 -30
  12. package/dist_ts_web/elements/network/ops-view-network.d.ts +24 -0
  13. package/dist_ts_web/elements/network/ops-view-network.js +151 -0
  14. package/dist_ts_web/elements/{ops-view-networktargets.d.ts → network/ops-view-networktargets.d.ts} +1 -1
  15. package/dist_ts_web/elements/{ops-view-networktargets.js → network/ops-view-networktargets.js} +6 -6
  16. package/dist_ts_web/elements/{ops-view-routes.d.ts → network/ops-view-routes.d.ts} +1 -1
  17. package/dist_ts_web/elements/{ops-view-routes.js → network/ops-view-routes.js} +5 -6
  18. package/dist_ts_web/elements/{ops-view-sourceprofiles.d.ts → network/ops-view-sourceprofiles.d.ts} +1 -1
  19. package/dist_ts_web/elements/{ops-view-sourceprofiles.js → network/ops-view-sourceprofiles.js} +6 -6
  20. package/dist_ts_web/elements/{ops-view-targetprofiles.d.ts → network/ops-view-targetprofiles.d.ts} +2 -2
  21. package/dist_ts_web/elements/{ops-view-targetprofiles.js → network/ops-view-targetprofiles.js} +7 -7
  22. package/dist_ts_web/elements/ops-dashboard.js +4 -27
  23. package/dist_ts_web/elements/ops-view-apitokens.js +2 -1
  24. package/dist_ts_web/elements/ops-view-certificates.js +2 -1
  25. package/dist_ts_web/elements/ops-view-config.js +3 -3
  26. package/dist_ts_web/elements/ops-view-remoteingress.js +2 -1
  27. package/dist_ts_web/elements/ops-view-vpn.js +2 -1
  28. package/dist_ts_web/elements/security/index.d.ts +5 -0
  29. package/dist_ts_web/elements/security/index.js +6 -0
  30. package/dist_ts_web/elements/security/ops-view-security-authentication.d.ts +13 -0
  31. package/dist_ts_web/elements/security/ops-view-security-authentication.js +156 -0
  32. package/dist_ts_web/elements/security/ops-view-security-blocked.d.ts +15 -0
  33. package/dist_ts_web/elements/security/ops-view-security-blocked.js +152 -0
  34. package/dist_ts_web/elements/security/ops-view-security-emailsecurity.d.ts +14 -0
  35. package/dist_ts_web/elements/security/ops-view-security-emailsecurity.js +196 -0
  36. package/dist_ts_web/elements/security/ops-view-security-overview.d.ts +16 -0
  37. package/dist_ts_web/elements/security/ops-view-security-overview.js +204 -0
  38. package/dist_ts_web/elements/security/ops-view-security.d.ts +23 -0
  39. package/dist_ts_web/elements/security/ops-view-security.js +146 -0
  40. package/dist_ts_web/router.d.ts +5 -3
  41. package/dist_ts_web/router.js +69 -17
  42. package/package.json +1 -1
  43. package/ts/00_commitinfo_data.ts +1 -1
  44. package/ts_web/00_commitinfo_data.ts +1 -1
  45. package/ts_web/appstate.ts +10 -24
  46. package/ts_web/elements/index.ts +2 -6
  47. package/ts_web/elements/network/index.ts +6 -0
  48. package/ts_web/elements/{ops-view-network.ts → network/ops-view-network-activity.ts} +43 -53
  49. package/ts_web/elements/network/ops-view-network.ts +119 -0
  50. package/ts_web/elements/{ops-view-networktargets.ts → network/ops-view-networktargets.ts} +5 -5
  51. package/ts_web/elements/{ops-view-routes.ts → network/ops-view-routes.ts} +4 -5
  52. package/ts_web/elements/{ops-view-sourceprofiles.ts → network/ops-view-sourceprofiles.ts} +5 -5
  53. package/ts_web/elements/{ops-view-targetprofiles.ts → network/ops-view-targetprofiles.ts} +6 -6
  54. package/ts_web/elements/ops-dashboard.ts +3 -26
  55. package/ts_web/elements/ops-view-apitokens.ts +1 -0
  56. package/ts_web/elements/ops-view-certificates.ts +1 -0
  57. package/ts_web/elements/ops-view-config.ts +2 -2
  58. package/ts_web/elements/ops-view-remoteingress.ts +1 -0
  59. package/ts_web/elements/ops-view-vpn.ts +1 -0
  60. package/ts_web/elements/security/index.ts +5 -0
  61. package/ts_web/elements/security/ops-view-security-authentication.ts +120 -0
  62. package/ts_web/elements/security/ops-view-security-blocked.ts +117 -0
  63. package/ts_web/elements/security/ops-view-security-emailsecurity.ts +159 -0
  64. package/ts_web/elements/security/ops-view-security-overview.ts +171 -0
  65. package/ts_web/elements/security/ops-view-security.ts +114 -0
  66. package/ts_web/router.ts +75 -17
  67. package/dist_ts_web/elements/ops-view-security.d.ts +0 -24
  68. package/dist_ts_web/elements/ops-view-security.js +0 -481
  69. package/ts_web/elements/ops-view-security.ts +0 -453
@@ -0,0 +1,156 @@
1
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
2
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
3
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
4
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
5
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
6
+ var _, done = false;
7
+ for (var i = decorators.length - 1; i >= 0; i--) {
8
+ var context = {};
9
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
10
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
11
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
12
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
13
+ if (kind === "accessor") {
14
+ if (result === void 0) continue;
15
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
16
+ if (_ = accept(result.get)) descriptor.get = _;
17
+ if (_ = accept(result.set)) descriptor.set = _;
18
+ if (_ = accept(result.init)) initializers.unshift(_);
19
+ }
20
+ else if (_ = accept(result)) {
21
+ if (kind === "field") initializers.unshift(_);
22
+ else descriptor[key] = _;
23
+ }
24
+ }
25
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
26
+ done = true;
27
+ };
28
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
29
+ var useValue = arguments.length > 2;
30
+ for (var i = 0; i < initializers.length; i++) {
31
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
32
+ }
33
+ return useValue ? value : void 0;
34
+ };
35
+ import * as appstate from '../../appstate.js';
36
+ import { DeesElement, customElement, html, state, css, cssManager, } from '@design.estate/dees-element';
37
+ import {} from '@design.estate/dees-catalog';
38
+ let OpsViewSecurityAuthentication = (() => {
39
+ let _classDecorators = [customElement('ops-view-security-authentication')];
40
+ let _classDescriptor;
41
+ let _classExtraInitializers = [];
42
+ let _classThis;
43
+ let _classSuper = DeesElement;
44
+ let _statsState_decorators;
45
+ let _statsState_initializers = [];
46
+ let _statsState_extraInitializers = [];
47
+ var OpsViewSecurityAuthentication = class extends _classSuper {
48
+ static { _classThis = this; }
49
+ static {
50
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
51
+ _statsState_decorators = [state()];
52
+ __esDecorate(this, null, _statsState_decorators, { kind: "accessor", name: "statsState", static: false, private: false, access: { has: obj => "statsState" in obj, get: obj => obj.statsState, set: (obj, value) => { obj.statsState = value; } }, metadata: _metadata }, _statsState_initializers, _statsState_extraInitializers);
53
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
54
+ OpsViewSecurityAuthentication = _classThis = _classDescriptor.value;
55
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
56
+ }
57
+ #statsState_accessor_storage = __runInitializers(this, _statsState_initializers, appstate.statsStatePart.getState());
58
+ get statsState() { return this.#statsState_accessor_storage; }
59
+ set statsState(value) { this.#statsState_accessor_storage = value; }
60
+ constructor() {
61
+ super();
62
+ __runInitializers(this, _statsState_extraInitializers);
63
+ const sub = appstate.statsStatePart
64
+ .select((s) => s)
65
+ .subscribe((s) => {
66
+ this.statsState = s;
67
+ });
68
+ this.rxSubscriptions.push(sub);
69
+ }
70
+ static styles = [
71
+ cssManager.defaultStyles,
72
+ css `
73
+ :host { display: block; }
74
+ h2 {
75
+ margin: 32px 0 16px 0;
76
+ font-size: 24px;
77
+ font-weight: 600;
78
+ color: ${cssManager.bdTheme('#333', '#ccc')};
79
+ }
80
+ dees-statsgrid {
81
+ margin-bottom: 32px;
82
+ }
83
+ `,
84
+ ];
85
+ render() {
86
+ const metrics = this.statsState.securityMetrics;
87
+ if (!metrics) {
88
+ return html `
89
+ <div class="loadingMessage">
90
+ <p>Loading security metrics...</p>
91
+ </div>
92
+ `;
93
+ }
94
+ // Derive auth events from recentEvents
95
+ const allEvents = metrics.recentEvents || [];
96
+ const authEvents = allEvents.filter((evt) => evt.type === 'authentication');
97
+ const successfulLogins = authEvents.filter((evt) => evt.success === true).length;
98
+ const tiles = [
99
+ {
100
+ id: 'authFailures',
101
+ title: 'Authentication Failures',
102
+ value: metrics.authenticationFailures,
103
+ type: 'number',
104
+ icon: 'lucide:LockOpen',
105
+ color: metrics.authenticationFailures > 10 ? '#ef4444' : '#f59e0b',
106
+ description: 'Failed authentication attempts today',
107
+ },
108
+ {
109
+ id: 'successfulLogins',
110
+ title: 'Successful Logins',
111
+ value: successfulLogins,
112
+ type: 'number',
113
+ icon: 'lucide:Lock',
114
+ color: '#22c55e',
115
+ description: 'Successful logins today',
116
+ },
117
+ ];
118
+ // Map auth events to login history table data
119
+ const loginHistory = authEvents.map((evt) => ({
120
+ timestamp: evt.timestamp,
121
+ username: evt.details?.username || 'unknown',
122
+ ipAddress: evt.ipAddress || 'unknown',
123
+ success: evt.success ?? false,
124
+ reason: evt.success ? '' : evt.message || 'Authentication failed',
125
+ }));
126
+ return html `
127
+ <dees-heading level="hr">Authentication</dees-heading>
128
+
129
+ <dees-statsgrid
130
+ .tiles=${tiles}
131
+ .minTileWidth=${200}
132
+ ></dees-statsgrid>
133
+
134
+ <h2>Recent Login Attempts</h2>
135
+ <dees-table
136
+ .heading1=${'Login History'}
137
+ .heading2=${'Recent authentication attempts'}
138
+ .data=${loginHistory}
139
+ .displayFunction=${(item) => ({
140
+ 'Time': new Date(item.timestamp).toLocaleString(),
141
+ 'Username': item.username,
142
+ 'IP Address': item.ipAddress,
143
+ 'Status': item.success ? 'Success' : 'Failed',
144
+ 'Reason': item.reason || '-',
145
+ })}
146
+ ></dees-table>
147
+ `;
148
+ }
149
+ static {
150
+ __runInitializers(_classThis, _classExtraInitializers);
151
+ }
152
+ };
153
+ return OpsViewSecurityAuthentication = _classThis;
154
+ })();
155
+ export { OpsViewSecurityAuthentication };
156
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BzLXZpZXctc2VjdXJpdHktYXV0aGVudGljYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90c193ZWIvZWxlbWVudHMvc2VjdXJpdHkvb3BzLXZpZXctc2VjdXJpdHktYXV0aGVudGljYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFFOUMsT0FBTyxFQUNMLFdBQVcsRUFDWCxhQUFhLEVBQ2IsSUFBSSxFQUNKLEtBQUssRUFDTCxHQUFHLEVBQ0gsVUFBVSxHQUVYLE1BQU0sNkJBQTZCLENBQUM7QUFDckMsT0FBTyxFQUFtQixNQUFNLDZCQUE2QixDQUFDO0lBU2pELDZCQUE2Qjs0QkFEekMsYUFBYSxDQUFDLGtDQUFrQyxDQUFDOzs7O3NCQUNDLFdBQVc7Ozs7NkNBQW5CLFNBQVEsV0FBVzs7OztzQ0FDM0QsS0FBSyxFQUFFO1lBQ1IsbUxBQVMsVUFBVSw2QkFBVixVQUFVLCtGQUE2RDtZQUZsRiw2S0FtR0M7Ozs7UUFqR0MsaUZBQTRDLFFBQVEsQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFHLEVBQUM7UUFBaEYsSUFBUyxVQUFVLGdEQUE2RDtRQUFoRixJQUFTLFVBQVUsc0RBQTZEO1FBRWhGO1lBQ0UsS0FBSyxFQUFFLENBQUM7O1lBQ1IsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLGNBQWM7aUJBQ2hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUNoQixTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtnQkFDZixJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztZQUN0QixDQUFDLENBQUMsQ0FBQztZQUNMLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ2hDO1FBRU0sTUFBTSxDQUFDLE1BQU0sR0FBRztZQUNyQixVQUFVLENBQUMsYUFBYTtZQUN4QixHQUFHLENBQUE7Ozs7OztpQkFNVSxVQUFVLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUM7Ozs7O0tBSzlDO1NBQ0YsQ0FBQztRQUVLLE1BQU07WUFDWCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQztZQUVoRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2IsT0FBTyxJQUFJLENBQUE7Ozs7T0FJVixDQUFDO1lBQ0osQ0FBQztZQUVELHVDQUF1QztZQUN2QyxNQUFNLFNBQVMsR0FBVSxPQUFPLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQztZQUNwRCxNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLGdCQUFnQixDQUFDLENBQUM7WUFDakYsTUFBTSxnQkFBZ0IsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQztZQUV0RixNQUFNLEtBQUssR0FBaUI7Z0JBQzFCO29CQUNFLEVBQUUsRUFBRSxjQUFjO29CQUNsQixLQUFLLEVBQUUseUJBQXlCO29CQUNoQyxLQUFLLEVBQUUsT0FBTyxDQUFDLHNCQUFzQjtvQkFDckMsSUFBSSxFQUFFLFFBQVE7b0JBQ2QsSUFBSSxFQUFFLGlCQUFpQjtvQkFDdkIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxzQkFBc0IsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUztvQkFDbEUsV0FBVyxFQUFFLHNDQUFzQztpQkFDcEQ7Z0JBQ0Q7b0JBQ0UsRUFBRSxFQUFFLGtCQUFrQjtvQkFDdEIsS0FBSyxFQUFFLG1CQUFtQjtvQkFDMUIsS0FBSyxFQUFFLGdCQUFnQjtvQkFDdkIsSUFBSSxFQUFFLFFBQVE7b0JBQ2QsSUFBSSxFQUFFLGFBQWE7b0JBQ25CLEtBQUssRUFBRSxTQUFTO29CQUNoQixXQUFXLEVBQUUseUJBQXlCO2lCQUN2QzthQUNGLENBQUM7WUFFRiw4Q0FBOEM7WUFDOUMsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDakQsU0FBUyxFQUFFLEdBQUcsQ0FBQyxTQUFTO2dCQUN4QixRQUFRLEVBQUUsR0FBRyxDQUFDLE9BQU8sRUFBRSxRQUFRLElBQUksU0FBUztnQkFDNUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxTQUFTLElBQUksU0FBUztnQkFDckMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxPQUFPLElBQUksS0FBSztnQkFDN0IsTUFBTSxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sSUFBSSx1QkFBdUI7YUFDbEUsQ0FBQyxDQUFDLENBQUM7WUFFSixPQUFPLElBQUksQ0FBQTs7OztpQkFJRSxLQUFLO3dCQUNFLEdBQUc7Ozs7O29CQUtQLGVBQWU7b0JBQ2YsZ0NBQWdDO2dCQUNwQyxZQUFZOzJCQUNELENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUM1QixNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLGNBQWMsRUFBRTtnQkFDakQsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRO2dCQUN6QixZQUFZLEVBQUUsSUFBSSxDQUFDLFNBQVM7Z0JBQzVCLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVE7Z0JBQzdDLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxJQUFJLEdBQUc7YUFDN0IsQ0FBQzs7S0FFTCxDQUFDO1FBQ0osQ0FBQzs7WUFsR1UsdURBQTZCOzs7OztTQUE3Qiw2QkFBNkIifQ==
@@ -0,0 +1,15 @@
1
+ import * as appstate from '../../appstate.js';
2
+ import { DeesElement, type TemplateResult } from '@design.estate/dees-element';
3
+ declare global {
4
+ interface HTMLElementTagNameMap {
5
+ 'ops-view-security-blocked': OpsViewSecurityBlocked;
6
+ }
7
+ }
8
+ export declare class OpsViewSecurityBlocked extends DeesElement {
9
+ accessor statsState: appstate.IStatsState;
10
+ constructor();
11
+ static styles: import("@design.estate/dees-element").CSSResult[];
12
+ render(): TemplateResult;
13
+ private clearBlockedIPs;
14
+ private unblockIP;
15
+ }
@@ -0,0 +1,152 @@
1
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
2
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
3
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
4
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
5
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
6
+ var _, done = false;
7
+ for (var i = decorators.length - 1; i >= 0; i--) {
8
+ var context = {};
9
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
10
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
11
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
12
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
13
+ if (kind === "accessor") {
14
+ if (result === void 0) continue;
15
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
16
+ if (_ = accept(result.get)) descriptor.get = _;
17
+ if (_ = accept(result.set)) descriptor.set = _;
18
+ if (_ = accept(result.init)) initializers.unshift(_);
19
+ }
20
+ else if (_ = accept(result)) {
21
+ if (kind === "field") initializers.unshift(_);
22
+ else descriptor[key] = _;
23
+ }
24
+ }
25
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
26
+ done = true;
27
+ };
28
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
29
+ var useValue = arguments.length > 2;
30
+ for (var i = 0; i < initializers.length; i++) {
31
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
32
+ }
33
+ return useValue ? value : void 0;
34
+ };
35
+ import * as appstate from '../../appstate.js';
36
+ import { DeesElement, customElement, html, state, css, cssManager, } from '@design.estate/dees-element';
37
+ import {} from '@design.estate/dees-catalog';
38
+ let OpsViewSecurityBlocked = (() => {
39
+ let _classDecorators = [customElement('ops-view-security-blocked')];
40
+ let _classDescriptor;
41
+ let _classExtraInitializers = [];
42
+ let _classThis;
43
+ let _classSuper = DeesElement;
44
+ let _statsState_decorators;
45
+ let _statsState_initializers = [];
46
+ let _statsState_extraInitializers = [];
47
+ var OpsViewSecurityBlocked = class extends _classSuper {
48
+ static { _classThis = this; }
49
+ static {
50
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
51
+ _statsState_decorators = [state()];
52
+ __esDecorate(this, null, _statsState_decorators, { kind: "accessor", name: "statsState", static: false, private: false, access: { has: obj => "statsState" in obj, get: obj => obj.statsState, set: (obj, value) => { obj.statsState = value; } }, metadata: _metadata }, _statsState_initializers, _statsState_extraInitializers);
53
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
54
+ OpsViewSecurityBlocked = _classThis = _classDescriptor.value;
55
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
56
+ }
57
+ #statsState_accessor_storage = __runInitializers(this, _statsState_initializers, appstate.statsStatePart.getState());
58
+ get statsState() { return this.#statsState_accessor_storage; }
59
+ set statsState(value) { this.#statsState_accessor_storage = value; }
60
+ constructor() {
61
+ super();
62
+ __runInitializers(this, _statsState_extraInitializers);
63
+ const sub = appstate.statsStatePart
64
+ .select((s) => s)
65
+ .subscribe((s) => {
66
+ this.statsState = s;
67
+ });
68
+ this.rxSubscriptions.push(sub);
69
+ }
70
+ static styles = [
71
+ cssManager.defaultStyles,
72
+ css `
73
+ :host { display: block; }
74
+ dees-statsgrid {
75
+ margin-bottom: 32px;
76
+ }
77
+ `,
78
+ ];
79
+ render() {
80
+ const metrics = this.statsState.securityMetrics;
81
+ if (!metrics) {
82
+ return html `
83
+ <div class="loadingMessage">
84
+ <p>Loading security metrics...</p>
85
+ </div>
86
+ `;
87
+ }
88
+ const blockedIPs = metrics.blockedIPs || [];
89
+ const tiles = [
90
+ {
91
+ id: 'totalBlocked',
92
+ title: 'Blocked IPs',
93
+ value: blockedIPs.length,
94
+ type: 'number',
95
+ icon: 'lucide:ShieldBan',
96
+ color: blockedIPs.length > 0 ? '#ef4444' : '#22c55e',
97
+ description: 'Currently blocked addresses',
98
+ },
99
+ ];
100
+ return html `
101
+ <dees-heading level="hr">Blocked IPs</dees-heading>
102
+
103
+ <dees-statsgrid
104
+ .tiles=${tiles}
105
+ .minTileWidth=${200}
106
+ ></dees-statsgrid>
107
+
108
+ <dees-table
109
+ .heading1=${'Blocked IP Addresses'}
110
+ .heading2=${'IPs blocked due to suspicious activity'}
111
+ .data=${blockedIPs.map((ip) => ({ ip }))}
112
+ .displayFunction=${(item) => ({
113
+ 'IP Address': item.ip,
114
+ 'Reason': 'Suspicious activity',
115
+ })}
116
+ .dataActions=${[
117
+ {
118
+ name: 'Unblock',
119
+ iconName: 'lucide:shield-off',
120
+ type: ['contextmenu'],
121
+ actionFunc: async (item) => {
122
+ await this.unblockIP(item.ip);
123
+ },
124
+ },
125
+ {
126
+ name: 'Clear All',
127
+ iconName: 'lucide:trash-2',
128
+ type: ['header'],
129
+ actionFunc: async () => {
130
+ await this.clearBlockedIPs();
131
+ },
132
+ },
133
+ ]}
134
+ ></dees-table>
135
+ `;
136
+ }
137
+ async clearBlockedIPs() {
138
+ // SmartProxy manages IP blocking — not yet exposed via API
139
+ alert('Clearing blocked IPs is not yet supported from the UI.');
140
+ }
141
+ async unblockIP(ip) {
142
+ // SmartProxy manages IP blocking — not yet exposed via API
143
+ alert(`Unblocking IP ${ip} is not yet supported from the UI.`);
144
+ }
145
+ static {
146
+ __runInitializers(_classThis, _classExtraInitializers);
147
+ }
148
+ };
149
+ return OpsViewSecurityBlocked = _classThis;
150
+ })();
151
+ export { OpsViewSecurityBlocked };
152
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BzLXZpZXctc2VjdXJpdHktYmxvY2tlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RzX3dlYi9lbGVtZW50cy9zZWN1cml0eS9vcHMtdmlldy1zZWN1cml0eS1ibG9ja2VkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFtQixDQUFDO0FBRTlDLE9BQU8sRUFDTCxXQUFXLEVBQ1gsYUFBYSxFQUNiLElBQUksRUFDSixLQUFLLEVBQ0wsR0FBRyxFQUNILFVBQVUsR0FFWCxNQUFNLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8sRUFBbUIsTUFBTSw2QkFBNkIsQ0FBQztJQVNqRCxzQkFBc0I7NEJBRGxDLGFBQWEsQ0FBQywyQkFBMkIsQ0FBQzs7OztzQkFDQyxXQUFXOzs7O3NDQUFuQixTQUFRLFdBQVc7Ozs7c0NBQ3BELEtBQUssRUFBRTtZQUNSLG1MQUFTLFVBQVUsNkJBQVYsVUFBVSwrRkFBNkQ7WUFGbEYsNktBZ0dDOzs7O1FBOUZDLGlGQUE0QyxRQUFRLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRyxFQUFDO1FBQWhGLElBQVMsVUFBVSxnREFBNkQ7UUFBaEYsSUFBUyxVQUFVLHNEQUE2RDtRQUVoRjtZQUNFLEtBQUssRUFBRSxDQUFDOztZQUNSLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxjQUFjO2lCQUNoQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztpQkFDaEIsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2YsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7WUFDdEIsQ0FBQyxDQUFDLENBQUM7WUFDTCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNoQztRQUVNLE1BQU0sQ0FBQyxNQUFNLEdBQUc7WUFDckIsVUFBVSxDQUFDLGFBQWE7WUFDeEIsR0FBRyxDQUFBOzs7OztLQUtGO1NBQ0YsQ0FBQztRQUVLLE1BQU07WUFDWCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQztZQUVoRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2IsT0FBTyxJQUFJLENBQUE7Ozs7T0FJVixDQUFDO1lBQ0osQ0FBQztZQUVELE1BQU0sVUFBVSxHQUFhLE9BQU8sQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDO1lBRXRELE1BQU0sS0FBSyxHQUFpQjtnQkFDMUI7b0JBQ0UsRUFBRSxFQUFFLGNBQWM7b0JBQ2xCLEtBQUssRUFBRSxhQUFhO29CQUNwQixLQUFLLEVBQUUsVUFBVSxDQUFDLE1BQU07b0JBQ3hCLElBQUksRUFBRSxRQUFRO29CQUNkLElBQUksRUFBRSxrQkFBa0I7b0JBQ3hCLEtBQUssRUFBRSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTO29CQUNwRCxXQUFXLEVBQUUsNkJBQTZCO2lCQUMzQzthQUNGLENBQUM7WUFFRixPQUFPLElBQUksQ0FBQTs7OztpQkFJRSxLQUFLO3dCQUNFLEdBQUc7Ozs7b0JBSVAsc0JBQXNCO29CQUN0Qix3Q0FBd0M7Z0JBQzVDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDOzJCQUNyQixDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDNUIsWUFBWSxFQUFFLElBQUksQ0FBQyxFQUFFO2dCQUNyQixRQUFRLEVBQUUscUJBQXFCO2FBQ2hDLENBQUM7dUJBQ2E7Z0JBQ2I7b0JBQ0UsSUFBSSxFQUFFLFNBQVM7b0JBQ2YsUUFBUSxFQUFFLG1CQUFtQjtvQkFDN0IsSUFBSSxFQUFFLENBQUMsYUFBc0IsQ0FBQztvQkFDOUIsVUFBVSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRTt3QkFDekIsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDaEMsQ0FBQztpQkFDRjtnQkFDRDtvQkFDRSxJQUFJLEVBQUUsV0FBVztvQkFDakIsUUFBUSxFQUFFLGdCQUFnQjtvQkFDMUIsSUFBSSxFQUFFLENBQUMsUUFBaUIsQ0FBQztvQkFDekIsVUFBVSxFQUFFLEtBQUssSUFBSSxFQUFFO3dCQUNyQixNQUFNLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztvQkFDL0IsQ0FBQztpQkFDRjthQUNGOztLQUVKLENBQUM7UUFDSixDQUFDO1FBRU8sS0FBSyxDQUFDLGVBQWU7WUFDM0IsMkRBQTJEO1lBQzNELEtBQUssQ0FBQyx3REFBd0QsQ0FBQyxDQUFDO1FBQ2xFLENBQUM7UUFFTyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQVU7WUFDaEMsMkRBQTJEO1lBQzNELEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxvQ0FBb0MsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7O1lBL0ZVLHVEQUFzQjs7Ozs7U0FBdEIsc0JBQXNCIn0=
@@ -0,0 +1,14 @@
1
+ import * as appstate from '../../appstate.js';
2
+ import { DeesElement, type TemplateResult } from '@design.estate/dees-element';
3
+ declare global {
4
+ interface HTMLElementTagNameMap {
5
+ 'ops-view-security-emailsecurity': OpsViewSecurityEmailsecurity;
6
+ }
7
+ }
8
+ export declare class OpsViewSecurityEmailsecurity extends DeesElement {
9
+ accessor statsState: appstate.IStatsState;
10
+ constructor();
11
+ static styles: import("@design.estate/dees-element").CSSResult[];
12
+ render(): TemplateResult;
13
+ private saveEmailSecuritySettings;
14
+ }
@@ -0,0 +1,196 @@
1
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
2
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
3
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
4
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
5
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
6
+ var _, done = false;
7
+ for (var i = decorators.length - 1; i >= 0; i--) {
8
+ var context = {};
9
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
10
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
11
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
12
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
13
+ if (kind === "accessor") {
14
+ if (result === void 0) continue;
15
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
16
+ if (_ = accept(result.get)) descriptor.get = _;
17
+ if (_ = accept(result.set)) descriptor.set = _;
18
+ if (_ = accept(result.init)) initializers.unshift(_);
19
+ }
20
+ else if (_ = accept(result)) {
21
+ if (kind === "field") initializers.unshift(_);
22
+ else descriptor[key] = _;
23
+ }
24
+ }
25
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
26
+ done = true;
27
+ };
28
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
29
+ var useValue = arguments.length > 2;
30
+ for (var i = 0; i < initializers.length; i++) {
31
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
32
+ }
33
+ return useValue ? value : void 0;
34
+ };
35
+ import * as appstate from '../../appstate.js';
36
+ import { DeesElement, customElement, html, state, css, cssManager, } from '@design.estate/dees-element';
37
+ import {} from '@design.estate/dees-catalog';
38
+ let OpsViewSecurityEmailsecurity = (() => {
39
+ let _classDecorators = [customElement('ops-view-security-emailsecurity')];
40
+ let _classDescriptor;
41
+ let _classExtraInitializers = [];
42
+ let _classThis;
43
+ let _classSuper = DeesElement;
44
+ let _statsState_decorators;
45
+ let _statsState_initializers = [];
46
+ let _statsState_extraInitializers = [];
47
+ var OpsViewSecurityEmailsecurity = class extends _classSuper {
48
+ static { _classThis = this; }
49
+ static {
50
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
51
+ _statsState_decorators = [state()];
52
+ __esDecorate(this, null, _statsState_decorators, { kind: "accessor", name: "statsState", static: false, private: false, access: { has: obj => "statsState" in obj, get: obj => obj.statsState, set: (obj, value) => { obj.statsState = value; } }, metadata: _metadata }, _statsState_initializers, _statsState_extraInitializers);
53
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
54
+ OpsViewSecurityEmailsecurity = _classThis = _classDescriptor.value;
55
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
56
+ }
57
+ #statsState_accessor_storage = __runInitializers(this, _statsState_initializers, appstate.statsStatePart.getState());
58
+ get statsState() { return this.#statsState_accessor_storage; }
59
+ set statsState(value) { this.#statsState_accessor_storage = value; }
60
+ constructor() {
61
+ super();
62
+ __runInitializers(this, _statsState_extraInitializers);
63
+ const sub = appstate.statsStatePart
64
+ .select((s) => s)
65
+ .subscribe((s) => {
66
+ this.statsState = s;
67
+ });
68
+ this.rxSubscriptions.push(sub);
69
+ }
70
+ static styles = [
71
+ cssManager.defaultStyles,
72
+ css `
73
+ :host { display: block; }
74
+ h2 {
75
+ margin: 32px 0 16px 0;
76
+ font-size: 24px;
77
+ font-weight: 600;
78
+ color: ${cssManager.bdTheme('#333', '#ccc')};
79
+ }
80
+ dees-statsgrid {
81
+ margin-bottom: 32px;
82
+ }
83
+ .securityCard {
84
+ background: ${cssManager.bdTheme('#fff', '#222')};
85
+ border: 1px solid ${cssManager.bdTheme('#e9ecef', '#333')};
86
+ border-radius: 8px;
87
+ padding: 24px;
88
+ position: relative;
89
+ overflow: hidden;
90
+ }
91
+ .actionButton {
92
+ margin-top: 16px;
93
+ }
94
+ `,
95
+ ];
96
+ render() {
97
+ const metrics = this.statsState.securityMetrics;
98
+ if (!metrics) {
99
+ return html `
100
+ <div class="loadingMessage">
101
+ <p>Loading security metrics...</p>
102
+ </div>
103
+ `;
104
+ }
105
+ const tiles = [
106
+ {
107
+ id: 'malware',
108
+ title: 'Malware Detection',
109
+ value: metrics.malwareDetected,
110
+ type: 'number',
111
+ icon: 'lucide:BugOff',
112
+ color: metrics.malwareDetected > 0 ? '#ef4444' : '#22c55e',
113
+ description: 'Malware detected',
114
+ },
115
+ {
116
+ id: 'phishing',
117
+ title: 'Phishing Detection',
118
+ value: metrics.phishingDetected,
119
+ type: 'number',
120
+ icon: 'lucide:Fish',
121
+ color: metrics.phishingDetected > 0 ? '#ef4444' : '#22c55e',
122
+ description: 'Phishing attempts detected',
123
+ },
124
+ {
125
+ id: 'suspicious',
126
+ title: 'Suspicious Activities',
127
+ value: metrics.suspiciousActivities,
128
+ type: 'number',
129
+ icon: 'lucide:TriangleAlert',
130
+ color: metrics.suspiciousActivities > 5 ? '#ef4444' : '#f59e0b',
131
+ description: 'Suspicious activities detected',
132
+ },
133
+ {
134
+ id: 'spam',
135
+ title: 'Spam Detection',
136
+ value: metrics.spamDetected,
137
+ type: 'number',
138
+ icon: 'lucide:Ban',
139
+ color: '#f59e0b',
140
+ description: 'Spam emails blocked',
141
+ },
142
+ ];
143
+ return html `
144
+ <dees-heading level="hr">Email Security</dees-heading>
145
+
146
+ <dees-statsgrid
147
+ .tiles=${tiles}
148
+ .minTileWidth=${200}
149
+ ></dees-statsgrid>
150
+
151
+ <h2>Email Security Configuration</h2>
152
+ <div class="securityCard">
153
+ <dees-form>
154
+ <dees-input-checkbox
155
+ .key=${'enableSPF'}
156
+ .label=${'Enable SPF checking'}
157
+ .value=${true}
158
+ ></dees-input-checkbox>
159
+ <dees-input-checkbox
160
+ .key=${'enableDKIM'}
161
+ .label=${'Enable DKIM validation'}
162
+ .value=${true}
163
+ ></dees-input-checkbox>
164
+ <dees-input-checkbox
165
+ .key=${'enableDMARC'}
166
+ .label=${'Enable DMARC policy enforcement'}
167
+ .value=${true}
168
+ ></dees-input-checkbox>
169
+ <dees-input-checkbox
170
+ .key=${'enableSpamFilter'}
171
+ .label=${'Enable spam filtering'}
172
+ .value=${true}
173
+ ></dees-input-checkbox>
174
+ </dees-form>
175
+ <dees-button
176
+ class="actionButton"
177
+ type="highlighted"
178
+ @click=${() => this.saveEmailSecuritySettings()}
179
+ >
180
+ Save Settings
181
+ </dees-button>
182
+ </div>
183
+ `;
184
+ }
185
+ async saveEmailSecuritySettings() {
186
+ // Config is read-only from the UI for now
187
+ alert('Email security settings are read-only. Update the dcrouter configuration file to change these settings.');
188
+ }
189
+ static {
190
+ __runInitializers(_classThis, _classExtraInitializers);
191
+ }
192
+ };
193
+ return OpsViewSecurityEmailsecurity = _classThis;
194
+ })();
195
+ export { OpsViewSecurityEmailsecurity };
196
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BzLXZpZXctc2VjdXJpdHktZW1haWxzZWN1cml0eS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RzX3dlYi9lbGVtZW50cy9zZWN1cml0eS9vcHMtdmlldy1zZWN1cml0eS1lbWFpbHNlY3VyaXR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFtQixDQUFDO0FBRTlDLE9BQU8sRUFDTCxXQUFXLEVBQ1gsYUFBYSxFQUNiLElBQUksRUFDSixLQUFLLEVBQ0wsR0FBRyxFQUNILFVBQVUsR0FFWCxNQUFNLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8sRUFBbUIsTUFBTSw2QkFBNkIsQ0FBQztJQVNqRCw0QkFBNEI7NEJBRHhDLGFBQWEsQ0FBQyxpQ0FBaUMsQ0FBQzs7OztzQkFDQyxXQUFXOzs7OzRDQUFuQixTQUFRLFdBQVc7Ozs7c0NBQzFELEtBQUssRUFBRTtZQUNSLG1MQUFTLFVBQVUsNkJBQVYsVUFBVSwrRkFBNkQ7WUFGbEYsNktBMElDOzs7O1FBeElDLGlGQUE0QyxRQUFRLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRyxFQUFDO1FBQWhGLElBQVMsVUFBVSxnREFBNkQ7UUFBaEYsSUFBUyxVQUFVLHNEQUE2RDtRQUVoRjtZQUNFLEtBQUssRUFBRSxDQUFDOztZQUNSLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxjQUFjO2lCQUNoQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztpQkFDaEIsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2YsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7WUFDdEIsQ0FBQyxDQUFDLENBQUM7WUFDTCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNoQztRQUVNLE1BQU0sQ0FBQyxN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
@@ -0,0 +1,16 @@
1
+ import * as appstate from '../../appstate.js';
2
+ import { DeesElement, type TemplateResult } from '@design.estate/dees-element';
3
+ declare global {
4
+ interface HTMLElementTagNameMap {
5
+ 'ops-view-security-overview': OpsViewSecurityOverview;
6
+ }
7
+ }
8
+ export declare class OpsViewSecurityOverview extends DeesElement {
9
+ accessor statsState: appstate.IStatsState;
10
+ constructor();
11
+ static styles: import("@design.estate/dees-element").CSSResult[];
12
+ render(): TemplateResult;
13
+ private calculateThreatLevel;
14
+ private getThreatScore;
15
+ private getSecurityEvents;
16
+ }