@coffeerunhobby/mcp-ha-connect 2.2.1 → 2.3.1
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/.env.example +1 -1
- package/README.md +11 -2
- package/dist/omadaClient/client.d.ts +6 -1
- package/dist/omadaClient/client.js +12 -1
- package/dist/omadaClient/client.js.map +1 -1
- package/dist/omadaClient/diagnose.d.ts +68 -0
- package/dist/omadaClient/diagnose.js +164 -0
- package/dist/omadaClient/diagnose.js.map +1 -0
- package/dist/omadaClient/index.d.ts +6 -0
- package/dist/omadaClient/index.js +15 -0
- package/dist/omadaClient/index.js.map +1 -1
- package/dist/omadaClient/macGroups.d.ts +58 -0
- package/dist/omadaClient/macGroups.js +124 -0
- package/dist/omadaClient/macGroups.js.map +1 -0
- package/dist/tools/infra/actions.d.ts +1 -1
- package/dist/tools/infra/actions.js +1 -1
- package/dist/tools/omada/index.js +6 -0
- package/dist/tools/omada/index.js.map +1 -1
- package/dist/tools/omada/macGroups.d.ts +19 -0
- package/dist/tools/omada/macGroups.js +77 -0
- package/dist/tools/omada/macGroups.js.map +1 -0
- package/dist/tools/omada/namespace.js +8 -0
- package/dist/tools/omada/namespace.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +5 -1
- package/.codex/review-rules.md +0 -16
- package/.dockerignore +0 -8
- package/.gitattributes +0 -30
- package/.github/workflows/ci.yml +0 -193
- package/AGENTS.md +0 -389
- package/Dockerfile +0 -50
- package/docker-compose.yml +0 -23
- package/docs/CHANGELOG.md +0 -341
- package/docs/COVERAGE.md +0 -219
- package/docs/QUICK_START.md +0 -240
- package/eslint.config.js +0 -33
- package/n8n/ai-agent-safety-monitor.json +0 -355
- package/openapi.json +0 -1259
- package/scripts/check-version-sync.mjs +0 -69
- package/scripts/generate-jwt.ts +0 -121
- package/src/config.ts +0 -440
- package/src/haClient/automations.ts +0 -261
- package/src/haClient/calendars.ts +0 -94
- package/src/haClient/config.ts +0 -52
- package/src/haClient/devices.ts +0 -653
- package/src/haClient/entities.ts +0 -128
- package/src/haClient/events.ts +0 -689
- package/src/haClient/history.ts +0 -73
- package/src/haClient/index.ts +0 -336
- package/src/haClient/request.ts +0 -142
- package/src/haClient/services.ts +0 -45
- package/src/haClient/states.ts +0 -60
- package/src/haClient/updates.ts +0 -58
- package/src/haClient/wsCommand.ts +0 -44
- package/src/index.ts +0 -164
- package/src/localAI/index.ts +0 -88
- package/src/localAI/prompts.ts +0 -50
- package/src/localAI/providers/base.ts +0 -120
- package/src/localAI/providers/ollama.ts +0 -78
- package/src/localAI/providers/openai.ts +0 -86
- package/src/localAI/types.ts +0 -67
- package/src/omadaClient/auth.ts +0 -178
- package/src/omadaClient/client.ts +0 -337
- package/src/omadaClient/device.ts +0 -118
- package/src/omadaClient/index.ts +0 -310
- package/src/omadaClient/network.ts +0 -284
- package/src/omadaClient/request.ts +0 -365
- package/src/omadaClient/security.ts +0 -51
- package/src/omadaClient/site.ts +0 -344
- package/src/ownerQuestions/service.ts +0 -536
- package/src/permissions/index.ts +0 -143
- package/src/resources/index.ts +0 -213
- package/src/server/auth.ts +0 -175
- package/src/server/chatFace.ts +0 -789
- package/src/server/chatSlice.ts +0 -57
- package/src/server/common.ts +0 -170
- package/src/server/eventSubscription.ts +0 -343
- package/src/server/http.ts +0 -626
- package/src/server/instructions.ts +0 -97
- package/src/server/rateLimiter.ts +0 -227
- package/src/server/stdio.ts +0 -41
- package/src/server/stream.ts +0 -205
- package/src/tools/ai/analyzeSensors.ts +0 -33
- package/src/tools/ai/index.ts +0 -20
- package/src/tools/common.ts +0 -442
- package/src/tools/homeassistant/askOwner.ts +0 -133
- package/src/tools/homeassistant/automationControls.ts +0 -66
- package/src/tools/homeassistant/calendar.ts +0 -97
- package/src/tools/homeassistant/callService.ts +0 -25
- package/src/tools/homeassistant/controlClimate.ts +0 -68
- package/src/tools/homeassistant/controlCover.ts +0 -48
- package/src/tools/homeassistant/controlFan.ts +0 -44
- package/src/tools/homeassistant/controlLight.ts +0 -38
- package/src/tools/homeassistant/controlMediaPlayer.ts +0 -50
- package/src/tools/homeassistant/createAutomation.ts +0 -35
- package/src/tools/homeassistant/deleteAutomation.ts +0 -24
- package/src/tools/homeassistant/entityAction.ts +0 -35
- package/src/tools/homeassistant/entityGuard.ts +0 -28
- package/src/tools/homeassistant/getAllSensors.ts +0 -46
- package/src/tools/homeassistant/getAutomationTrace.ts +0 -30
- package/src/tools/homeassistant/getDomainSummary.ts +0 -29
- package/src/tools/homeassistant/getEntitiesByDomain.ts +0 -56
- package/src/tools/homeassistant/getHistory.ts +0 -24
- package/src/tools/homeassistant/getState.ts +0 -24
- package/src/tools/homeassistant/getStates.ts +0 -46
- package/src/tools/homeassistant/getVersion.ts +0 -21
- package/src/tools/homeassistant/index.ts +0 -121
- package/src/tools/homeassistant/listAutomations.ts +0 -35
- package/src/tools/homeassistant/listEntities.ts +0 -44
- package/src/tools/homeassistant/listPersons.ts +0 -46
- package/src/tools/homeassistant/sceneAndScript.ts +0 -53
- package/src/tools/homeassistant/searchEntities.ts +0 -58
- package/src/tools/homeassistant/sendNotification.ts +0 -179
- package/src/tools/homeassistant/systemTools.ts +0 -52
- package/src/tools/homeassistant/triggerAutomation.ts +0 -24
- package/src/tools/index.ts +0 -78
- package/src/tools/infra/actions.ts +0 -95
- package/src/tools/infra/index.ts +0 -138
- package/src/tools/omada/blockClient.ts +0 -28
- package/src/tools/omada/cyclePoePort.ts +0 -32
- package/src/tools/omada/deleteClient.ts +0 -27
- package/src/tools/omada/disableClientRateLimit.ts +0 -23
- package/src/tools/omada/getClient.ts +0 -14
- package/src/tools/omada/getDevice.ts +0 -14
- package/src/tools/omada/getFirewallSetting.ts +0 -14
- package/src/tools/omada/getInternetInfo.ts +0 -14
- package/src/tools/omada/getLanNetworkList.ts +0 -14
- package/src/tools/omada/getLanProfileList.ts +0 -14
- package/src/tools/omada/getPortForwardingStatus.ts +0 -26
- package/src/tools/omada/getRateLimitProfiles.ts +0 -14
- package/src/tools/omada/getSiteNtpStatus.ts +0 -14
- package/src/tools/omada/getSsidDetail.ts +0 -22
- package/src/tools/omada/getSsidList.ts +0 -21
- package/src/tools/omada/getSwitchStackDetail.ts +0 -14
- package/src/tools/omada/getThreatList.ts +0 -42
- package/src/tools/omada/getWlanGroupList.ts +0 -14
- package/src/tools/omada/graph.ts +0 -187
- package/src/tools/omada/index.ts +0 -153
- package/src/tools/omada/listBlockedClients.ts +0 -17
- package/src/tools/omada/listClients.ts +0 -14
- package/src/tools/omada/listClientsActivity.ts +0 -25
- package/src/tools/omada/listClientsPastConnections.ts +0 -44
- package/src/tools/omada/listDevices.ts +0 -14
- package/src/tools/omada/listDevicesStats.ts +0 -41
- package/src/tools/omada/listMostActiveClients.ts +0 -14
- package/src/tools/omada/listSites.ts +0 -18
- package/src/tools/omada/namespace.ts +0 -1164
- package/src/tools/omada/searchDevices.ts +0 -20
- package/src/tools/omada/setClientRateLimit.ts +0 -26
- package/src/tools/omada/setClientRateLimitProfile.ts +0 -25
- package/src/tools/omada/setSiteNtpServers.ts +0 -36
- package/src/tools/omada/setSsidEnabled.ts +0 -38
- package/src/tools/omada/unblockClient.ts +0 -26
- package/src/tools/types.ts +0 -11
- package/src/tools/utils/pagination-schema.ts +0 -27
- package/src/types/ai/index.ts +0 -11
- package/src/types/ai/types.ts +0 -67
- package/src/types/homeassistant/automations.ts +0 -43
- package/src/types/homeassistant/calendars.ts +0 -26
- package/src/types/homeassistant/config.ts +0 -14
- package/src/types/homeassistant/entities.ts +0 -14
- package/src/types/homeassistant/errors.ts +0 -33
- package/src/types/homeassistant/haConfig.ts +0 -7
- package/src/types/homeassistant/history.ts +0 -13
- package/src/types/homeassistant/index.ts +0 -46
- package/src/types/homeassistant/request.ts +0 -6
- package/src/types/homeassistant/serviceCall.ts +0 -18
- package/src/types/homeassistant/states.ts +0 -58
- package/src/types/homeassistant/updates.ts +0 -28
- package/src/types/index.ts +0 -12
- package/src/types/omada/activeClientInfo.ts +0 -17
- package/src/types/omada/clientActivity.ts +0 -32
- package/src/types/omada/clientBlockStatus.ts +0 -11
- package/src/types/omada/clientPastConnection.ts +0 -82
- package/src/types/omada/index.ts +0 -14
- package/src/types/omada/omadaApiResponse.ts +0 -5
- package/src/types/omada/omadaClientInfo.ts +0 -11
- package/src/types/omada/omadaDeviceInfo.ts +0 -11
- package/src/types/omada/omadaDeviceStats.ts +0 -31
- package/src/types/omada/omadaSiteSummary.ts +0 -5
- package/src/types/omada/oswStackDetail.ts +0 -11
- package/src/types/omada/paginatedResult.ts +0 -6
- package/src/types/omada/rateLimitProfile.ts +0 -58
- package/src/types/omada/threatInfo.ts +0 -38
- package/src/types/omada/tokenResult.ts +0 -6
- package/src/types.ts +0 -2
- package/src/utils/config-validations.ts +0 -68
- package/src/utils/jwt.ts +0 -112
- package/src/utils/logger.ts +0 -121
- package/src/utils/plainText.ts +0 -48
- package/src/utils/redact.ts +0 -59
- package/src/utils/sanitizeError.ts +0 -18
- package/src/utils/tlsDispatcher.ts +0 -69
- package/src/version.ts +0 -5
- package/tests/bdd/automation-creation.spec.ts +0 -214
- package/tests/bdd/automation-management.spec.ts +0 -267
- package/tests/bdd/calendar.spec.ts +0 -190
- package/tests/bdd/configuration.spec.ts +0 -283
- package/tests/bdd/device-control.spec.ts +0 -344
- package/tests/bdd/entity-listing.spec.ts +0 -208
- package/tests/bdd/entity-search.spec.ts +0 -183
- package/tests/bdd/history-retrieval.spec.ts +0 -195
- package/tests/bdd/notifications.spec.ts +0 -238
- package/tests/bdd/service-calls.spec.ts +0 -144
- package/tests/bdd/state-retrieval.spec.ts +0 -204
- package/tests/bench/hotpaths.bench.ts +0 -68
- package/tests/config.test.ts +0 -355
- package/tests/features/automation-creation.feature +0 -36
- package/tests/features/automation-management.feature +0 -54
- package/tests/features/calendar.feature +0 -37
- package/tests/features/configuration.feature +0 -70
- package/tests/features/device-control.feature +0 -100
- package/tests/features/entity-listing.feature +0 -51
- package/tests/features/entity-search.feature +0 -44
- package/tests/features/history-retrieval.feature +0 -38
- package/tests/features/notifications.feature +0 -37
- package/tests/features/service-calls.feature +0 -35
- package/tests/features/state-retrieval.feature +0 -37
- package/tests/fixtures/openapi-default-slice.json +0 -290
- package/tests/haClient/automationTrace.test.ts +0 -59
- package/tests/haClient/automations.test.ts +0 -149
- package/tests/haClient/config.test.ts +0 -117
- package/tests/haClient/entities.test.ts +0 -188
- package/tests/haClient/events.test.ts +0 -455
- package/tests/haClient/eventsTls.test.ts +0 -52
- package/tests/haClient/history.test.ts +0 -228
- package/tests/haClient/index.test.ts +0 -243
- package/tests/haClient/request.test.ts +0 -217
- package/tests/haClient/services.test.ts +0 -120
- package/tests/haClient/states.test.ts +0 -119
- package/tests/haClient/updates.test.ts +0 -193
- package/tests/index.test.ts +0 -160
- package/tests/integration/homeassistant.test.ts +0 -144
- package/tests/integration/omada.test.ts +0 -167
- package/tests/integration/server.test.ts +0 -151
- package/tests/localAI/index.test.ts +0 -177
- package/tests/localAI/ollama.test.ts +0 -187
- package/tests/localAI/openai.test.ts +0 -257
- package/tests/omadaClient/actions.test.ts +0 -161
- package/tests/omadaClient/clientBlocks.test.ts +0 -170
- package/tests/omadaClient/ntp.test.ts +0 -381
- package/tests/omadaClient/site.test.ts +0 -37
- package/tests/ownerQuestions/service.test.ts +0 -499
- package/tests/ownerQuestions/tools.test.ts +0 -186
- package/tests/permissions/index.test.ts +0 -217
- package/tests/resources/index.test.ts +0 -288
- package/tests/scripts/generateJwt.test.ts +0 -44
- package/tests/security/accessControl.test.ts +0 -223
- package/tests/security/authentication.test.ts +0 -117
- package/tests/security/configuration.test.ts +0 -170
- package/tests/security/cryptoTransport.test.ts +0 -172
- package/tests/security/dependencies.test.ts +0 -152
- package/tests/security/injection.test.ts +0 -117
- package/tests/security/insecureDesign.test.ts +0 -121
- package/tests/security/logging.test.ts +0 -131
- package/tests/security/resourceConsumption.test.ts +0 -142
- package/tests/server/auth.test.ts +0 -249
- package/tests/server/chatFace.test.ts +0 -320
- package/tests/server/common.test.ts +0 -84
- package/tests/server/http.test.ts +0 -561
- package/tests/server/instructions.test.ts +0 -152
- package/tests/server/memoizeJsonSchema.test.ts +0 -71
- package/tests/server/stdio.test.ts +0 -99
- package/tests/server/stream.test.ts +0 -285
- package/tests/server/toolVisibility.http.test.ts +0 -111
- package/tests/server/toolVisibility.test.ts +0 -129
- package/tests/tools/ai/analyzeSensors.test.ts +0 -227
- package/tests/tools/common.test.ts +0 -123
- package/tests/tools/homeassistant/handlers.test.ts +0 -872
- package/tests/tools/infra/invokeAction.test.ts +0 -280
- package/tests/tools/omada/graph.test.ts +0 -385
- package/tests/tools/omada/handlers.test.ts +0 -897
- package/tests/tools/omada/namespace.test.ts +0 -483
- package/tests/tools/registry.test.ts +0 -168
- package/tests/utils/config-validations.test.ts +0 -352
- package/tests/utils/jwt.test.ts +0 -115
- package/tests/utils/logger.test.ts +0 -327
- package/tests/utils/redact.test.ts +0 -105
- package/tsconfig.json +0 -24
- package/vitest.config.ts +0 -38
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Client activity information from dashboard.
|
|
3
|
-
* Contains statistics about new, active, and disconnected clients over time.
|
|
4
|
-
*/
|
|
5
|
-
export interface ClientActivity {
|
|
6
|
-
/** Number of new wireless (EAP) clients */
|
|
7
|
-
newEapClientNum: number;
|
|
8
|
-
/** Number of new wired (switch) clients */
|
|
9
|
-
newSwitchClientNum: number;
|
|
10
|
-
/** Number of active wireless (EAP) clients */
|
|
11
|
-
activeEapClientNum: number;
|
|
12
|
-
/** Number of active wired (switch) clients */
|
|
13
|
-
activeSwitchClientNum: number;
|
|
14
|
-
/** Number of disconnected wireless (EAP) clients */
|
|
15
|
-
disconnectEapClientNum: number;
|
|
16
|
-
/** Number of disconnected wired (switch) clients */
|
|
17
|
-
disconnectSwitchClientNum: number;
|
|
18
|
-
/** Timestamp for this activity snapshot (Unix timestamp in seconds) */
|
|
19
|
-
time: number;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Options for retrieving client activity.
|
|
24
|
-
*/
|
|
25
|
-
export interface GetClientActivityOptions {
|
|
26
|
-
/** Optional site ID, uses default from config if not provided */
|
|
27
|
-
siteId?: string;
|
|
28
|
-
/** Optional start timestamp in seconds (e.g., 1682000000) */
|
|
29
|
-
start?: number;
|
|
30
|
-
/** Optional end timestamp in seconds (e.g., 1682000000) */
|
|
31
|
-
end?: number;
|
|
32
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Result of a client block/unblock operation.
|
|
3
|
-
*/
|
|
4
|
-
export interface ClientBlockStatus {
|
|
5
|
-
/** MAC address of the client that was blocked or unblocked. */
|
|
6
|
-
mac: string;
|
|
7
|
-
/** Site the operation was applied to. */
|
|
8
|
-
siteId: string;
|
|
9
|
-
/** True if the client is now blocked, false if it was unblocked. */
|
|
10
|
-
blocked: boolean;
|
|
11
|
-
}
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Client past connection information from the Omada API.
|
|
3
|
-
* Represents historical client connection data.
|
|
4
|
-
*/
|
|
5
|
-
export interface ClientPastConnection {
|
|
6
|
-
/** Client History ID */
|
|
7
|
-
id?: string;
|
|
8
|
-
|
|
9
|
-
/** Client MAC Address */
|
|
10
|
-
mac?: string;
|
|
11
|
-
|
|
12
|
-
/** Downstream traffic (bytes) */
|
|
13
|
-
download?: number;
|
|
14
|
-
|
|
15
|
-
/** Upstream traffic (bytes) */
|
|
16
|
-
upload?: number;
|
|
17
|
-
|
|
18
|
-
/** Up time (seconds) */
|
|
19
|
-
duration?: number;
|
|
20
|
-
|
|
21
|
-
/** The timestamp (ms) when the client connected */
|
|
22
|
-
firstSeen?: number;
|
|
23
|
-
|
|
24
|
-
/** Last found time, timestamp (ms) */
|
|
25
|
-
lastSeen?: number;
|
|
26
|
-
|
|
27
|
-
/** Client Name */
|
|
28
|
-
name?: string;
|
|
29
|
-
|
|
30
|
-
/** (Wireless) SSID name */
|
|
31
|
-
ssid?: string;
|
|
32
|
-
|
|
33
|
-
/** (Wired) Port ID */
|
|
34
|
-
port?: number;
|
|
35
|
-
|
|
36
|
-
/** (Wireless) Whether it is Guest (used to display the wireless Guest client icon) */
|
|
37
|
-
guest?: boolean;
|
|
38
|
-
|
|
39
|
-
/** Device name */
|
|
40
|
-
deviceName?: string;
|
|
41
|
-
|
|
42
|
-
/** (Wireless) The time (ms) it takes for the client to connect to SSID */
|
|
43
|
-
associationTime?: number;
|
|
44
|
-
|
|
45
|
-
/** IP Address */
|
|
46
|
-
ip?: string;
|
|
47
|
-
|
|
48
|
-
/** IPv6 Addresses */
|
|
49
|
-
ipv6List?: string[];
|
|
50
|
-
|
|
51
|
-
/** Client portal authentication information */
|
|
52
|
-
authInfo?: unknown[]; // AuthInfoOpenApiVO structure not fully specified
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Options for listing client past connections.
|
|
57
|
-
*/
|
|
58
|
-
export interface ListClientsPastConnectionsOptions {
|
|
59
|
-
/** Optional site ID. If not provided, uses the default site from configuration */
|
|
60
|
-
siteId?: string;
|
|
61
|
-
|
|
62
|
-
/** Start page number. Start from 1 */
|
|
63
|
-
page: number;
|
|
64
|
-
|
|
65
|
-
/** Number of entries per page. It should be within the range of 1–1000 */
|
|
66
|
-
pageSize: number;
|
|
67
|
-
|
|
68
|
-
/** Sort parameter may be one of asc or desc. When there are more than one, the first one takes effect */
|
|
69
|
-
sortLastSeen?: 'asc' | 'desc';
|
|
70
|
-
|
|
71
|
-
/** Filter query parameters, support field time range: start timestamp (ms) */
|
|
72
|
-
timeStart?: number;
|
|
73
|
-
|
|
74
|
-
/** Filter query parameters, support field time range: end timestamp (ms) */
|
|
75
|
-
timeEnd?: number;
|
|
76
|
-
|
|
77
|
-
/** Filter query parameters, support field guest: true/false */
|
|
78
|
-
guest?: boolean;
|
|
79
|
-
|
|
80
|
-
/** Fuzzy query parameters, support field name,mac,ssid */
|
|
81
|
-
searchKey?: string;
|
|
82
|
-
}
|
package/src/types/omada/index.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
export type { ActiveClientInfo } from './activeClientInfo.js';
|
|
2
|
-
export type { ClientActivity, GetClientActivityOptions } from './clientActivity.js';
|
|
3
|
-
export type { ClientBlockStatus } from './clientBlockStatus.js';
|
|
4
|
-
export type { ClientPastConnection, ListClientsPastConnectionsOptions } from './clientPastConnection.js';
|
|
5
|
-
export type { OmadaApiResponse } from './omadaApiResponse.js';
|
|
6
|
-
export type { OmadaClientInfo } from './omadaClientInfo.js';
|
|
7
|
-
export type { OmadaDeviceInfo } from './omadaDeviceInfo.js';
|
|
8
|
-
export type { GetDeviceStatsOptions, OmadaDeviceStatItem, OmadaDeviceStats } from './omadaDeviceStats.js';
|
|
9
|
-
export type { OmadaSiteSummary } from './omadaSiteSummary.js';
|
|
10
|
-
export type { OswStackDetail } from './oswStackDetail.js';
|
|
11
|
-
export type { PaginatedResult } from './paginatedResult.js';
|
|
12
|
-
export type { ClientRateLimitSetting, RateLimitProfile, UpdateClientRateLimitRequest } from './rateLimitProfile.js';
|
|
13
|
-
export type { GetThreatListOptions, ThreatInfo } from './threatInfo.js';
|
|
14
|
-
export type { TokenResult } from './tokenResult.js';
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
export interface OmadaDeviceStats {
|
|
2
|
-
page: number;
|
|
3
|
-
pageSize: number;
|
|
4
|
-
totalRows: number;
|
|
5
|
-
data: OmadaDeviceStatItem[];
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export interface OmadaDeviceStatItem {
|
|
9
|
-
mac?: string;
|
|
10
|
-
name?: string;
|
|
11
|
-
model?: string;
|
|
12
|
-
sn?: string;
|
|
13
|
-
type?: string;
|
|
14
|
-
status?: string;
|
|
15
|
-
site?: string;
|
|
16
|
-
siteId?: string;
|
|
17
|
-
tag?: string;
|
|
18
|
-
deviceSeriesType?: number;
|
|
19
|
-
[key: string]: unknown;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export interface GetDeviceStatsOptions {
|
|
23
|
-
page: number;
|
|
24
|
-
pageSize: number;
|
|
25
|
-
searchMacs?: string;
|
|
26
|
-
searchNames?: string;
|
|
27
|
-
searchModels?: string;
|
|
28
|
-
searchSns?: string;
|
|
29
|
-
filterTag?: string;
|
|
30
|
-
filterDeviceSeriesType?: string;
|
|
31
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
export interface OswStackDetail {
|
|
2
|
-
id?: string;
|
|
3
|
-
name?: string;
|
|
4
|
-
siteId?: string;
|
|
5
|
-
masterMac?: string;
|
|
6
|
-
stackDevice?: boolean;
|
|
7
|
-
member?: Array<Record<string, unknown>>;
|
|
8
|
-
ports?: Array<Record<string, unknown>>;
|
|
9
|
-
lags?: Array<Record<string, unknown>>;
|
|
10
|
-
[key: string]: unknown;
|
|
11
|
-
}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Rate limit profile information from Omada API
|
|
3
|
-
*/
|
|
4
|
-
export interface RateLimitProfile {
|
|
5
|
-
/** Profile ID */
|
|
6
|
-
id: string;
|
|
7
|
-
/** Profile name (1-64 characters) */
|
|
8
|
-
name: string;
|
|
9
|
-
/** Whether download limit is enabled */
|
|
10
|
-
downLimitEnable: boolean;
|
|
11
|
-
/** Download limit in Kbps (when downLimitEnable is true) */
|
|
12
|
-
downLimit?: number;
|
|
13
|
-
/** Whether upload limit is enabled */
|
|
14
|
-
upLimitEnable: boolean;
|
|
15
|
-
/** Upload limit in Kbps (when upLimitEnable is true) */
|
|
16
|
-
upLimit?: number;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Client rate limit setting
|
|
21
|
-
*/
|
|
22
|
-
export interface ClientRateLimitSetting {
|
|
23
|
-
/** Rate limit profile ID (null when using custom rate limit) */
|
|
24
|
-
rateLimitId?: string | null;
|
|
25
|
-
/** Whether rate limit is enabled */
|
|
26
|
-
enable: boolean;
|
|
27
|
-
/** Whether upload limit is enabled (for custom rate limit) */
|
|
28
|
-
upEnable?: boolean;
|
|
29
|
-
/** Upload limit in Kbps (for custom rate limit) */
|
|
30
|
-
upLimit?: number;
|
|
31
|
-
/** Whether download limit is enabled (for custom rate limit) */
|
|
32
|
-
downEnable?: boolean;
|
|
33
|
-
/** Download limit in Kbps (for custom rate limit) */
|
|
34
|
-
downLimit?: number;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Request to update client rate limit setting
|
|
39
|
-
*/
|
|
40
|
-
export interface UpdateClientRateLimitRequest {
|
|
41
|
-
/** Mode: 0 = custom rate limit, 1 = use rate limit profile */
|
|
42
|
-
mode: 0 | 1;
|
|
43
|
-
/** Rate limit profile ID (required when mode = 1) */
|
|
44
|
-
rateLimitProfileId?: string;
|
|
45
|
-
/** Custom rate limit settings (required when mode = 0) */
|
|
46
|
-
customRateLimit?: {
|
|
47
|
-
/** Whether rate limit is enabled */
|
|
48
|
-
enable: boolean;
|
|
49
|
-
/** Whether upload limit is enabled */
|
|
50
|
-
upEnable?: boolean;
|
|
51
|
-
/** Upload limit in Kbps */
|
|
52
|
-
upLimit?: number;
|
|
53
|
-
/** Whether download limit is enabled */
|
|
54
|
-
downEnable?: boolean;
|
|
55
|
-
/** Download limit in Kbps */
|
|
56
|
-
downLimit?: number;
|
|
57
|
-
};
|
|
58
|
-
}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
export interface ThreatInfo {
|
|
2
|
-
id?: string;
|
|
3
|
-
omadacId?: string;
|
|
4
|
-
siteId?: string;
|
|
5
|
-
siteName?: string;
|
|
6
|
-
time?: number;
|
|
7
|
-
severity?: number;
|
|
8
|
-
service?: string;
|
|
9
|
-
signature?: string;
|
|
10
|
-
category?: number;
|
|
11
|
-
activity?: string;
|
|
12
|
-
dataUsage?: number;
|
|
13
|
-
srcIp?: string;
|
|
14
|
-
dstIp?: string;
|
|
15
|
-
srcCountry?: string;
|
|
16
|
-
dstCountry?: string;
|
|
17
|
-
protocol?: string;
|
|
18
|
-
sid?: number;
|
|
19
|
-
srcLatitude?: number;
|
|
20
|
-
srcLongitude?: number;
|
|
21
|
-
dstLatitude?: number;
|
|
22
|
-
dstLongitude?: number;
|
|
23
|
-
archived?: boolean;
|
|
24
|
-
classification?: string;
|
|
25
|
-
createTime?: number;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export interface GetThreatListOptions {
|
|
29
|
-
siteList?: string;
|
|
30
|
-
archived: boolean;
|
|
31
|
-
page: number;
|
|
32
|
-
pageSize: number;
|
|
33
|
-
startTime: number;
|
|
34
|
-
endTime: number;
|
|
35
|
-
severity?: number;
|
|
36
|
-
sortTime?: 'asc' | 'desc';
|
|
37
|
-
searchKey?: string;
|
|
38
|
-
}
|
package/src/types.ts
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Configuration validation utilities
|
|
3
|
-
* Uses Node's built-in net module for reliable IP validation
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { isIPv4, isIPv6 } from 'node:net';
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Validates if a string is a valid IPv4 or IPv6 address for binding
|
|
10
|
-
*/
|
|
11
|
-
export function isValidBindAddress(addr: string): boolean {
|
|
12
|
-
return isIPv4(addr) || isIPv6(addr);
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Returns true if the address is a loopback address (localhost-only).
|
|
17
|
-
*
|
|
18
|
-
* Used to enforce that an unauthenticated server (MCP_AUTH_METHOD=none) may only
|
|
19
|
-
* be bound to a loopback interface — never to `0.0.0.0`/`::` or a LAN address.
|
|
20
|
-
*/
|
|
21
|
-
export function isLoopbackAddress(addr: string): boolean {
|
|
22
|
-
if (!addr) return false;
|
|
23
|
-
const a = addr.toLowerCase();
|
|
24
|
-
if (a === 'localhost' || a === '::1') return true;
|
|
25
|
-
// IPv4 loopback is the whole 127.0.0.0/8 block.
|
|
26
|
-
if (isIPv4(a) && a.startsWith('127.')) return true;
|
|
27
|
-
return false;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Validates if a string is a valid hostname
|
|
32
|
-
* Allows alphanumeric characters, hyphens, and dots
|
|
33
|
-
* Must not start or end with hyphen or dot
|
|
34
|
-
*/
|
|
35
|
-
export function isValidHostname(hostname: string): boolean {
|
|
36
|
-
if (!hostname || hostname.length > 253) return false;
|
|
37
|
-
|
|
38
|
-
// Check each label (part between dots)
|
|
39
|
-
const labels = hostname.split('.');
|
|
40
|
-
return labels.every((label) => {
|
|
41
|
-
if (!label || label.length > 63) return false;
|
|
42
|
-
// Must start with alphanumeric, can contain hyphens, must end with alphanumeric
|
|
43
|
-
return /^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?$/.test(label) || label.length === 1;
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Validates if a string is a valid origin (for CORS)
|
|
49
|
-
* Accepts: wildcard (*), valid URLs, hostnames, or IP addresses
|
|
50
|
-
*/
|
|
51
|
-
export function isValidOrigin(origin: string): boolean {
|
|
52
|
-
// Allow wildcard
|
|
53
|
-
if (origin === '*') return true;
|
|
54
|
-
|
|
55
|
-
// Check if it's a valid IP address
|
|
56
|
-
if (isValidBindAddress(origin)) return true;
|
|
57
|
-
|
|
58
|
-
// Check if it's a valid hostname (like 'localhost')
|
|
59
|
-
if (isValidHostname(origin)) return true;
|
|
60
|
-
|
|
61
|
-
// Validate URL format (like 'http://example.com')
|
|
62
|
-
try {
|
|
63
|
-
new URL(origin);
|
|
64
|
-
return true;
|
|
65
|
-
} catch {
|
|
66
|
-
return false;
|
|
67
|
-
}
|
|
68
|
-
}
|
package/src/utils/jwt.ts
DELETED
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Minimal Bearer token verification (HS256 JWT)
|
|
3
|
-
* Zero dependencies - uses Node's crypto
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { createHmac, timingSafeEqual } from 'node:crypto';
|
|
7
|
-
|
|
8
|
-
export interface JwtPayload {
|
|
9
|
-
sub?: string;
|
|
10
|
-
exp?: number;
|
|
11
|
-
iat?: number;
|
|
12
|
-
nbf?: number;
|
|
13
|
-
iss?: string;
|
|
14
|
-
aud?: string | string[];
|
|
15
|
-
[key: string]: unknown;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export interface JwtResult {
|
|
19
|
-
valid: boolean;
|
|
20
|
-
payload?: JwtPayload;
|
|
21
|
-
error?: string;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/** Optional claim-validation policy for verifyJwt. */
|
|
25
|
-
export interface JwtVerifyOptions {
|
|
26
|
-
/** Reject tokens that have no `exp` claim (H3). Default: false (backward-compatible). */
|
|
27
|
-
requireExp?: boolean;
|
|
28
|
-
/** Require `iss` to equal this value when set (L6). */
|
|
29
|
-
issuer?: string;
|
|
30
|
-
/** Require `aud` to include this value when set (L6). */
|
|
31
|
-
audience?: string;
|
|
32
|
-
/** Allowable clock skew in seconds for exp/nbf comparisons (L6). Default: 0. */
|
|
33
|
-
clockSkewSec?: number;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
function b64decode(str: string): string {
|
|
37
|
-
const pad = str + '='.repeat((4 - (str.length % 4)) % 4);
|
|
38
|
-
return Buffer.from(pad.replace(/-/g, '+').replace(/_/g, '/'), 'base64').toString();
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
function b64encode(data: Buffer): string {
|
|
42
|
-
return data.toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
export function verifyJwt(token: string, secret: string, options: JwtVerifyOptions = {}): JwtResult {
|
|
46
|
-
const parts = token.split('.');
|
|
47
|
-
if (parts.length !== 3) {
|
|
48
|
-
return { valid: false, error: 'bad format' };
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
const [h, p, sig] = parts;
|
|
52
|
-
|
|
53
|
-
// Verify signature (timing-safe)
|
|
54
|
-
const expected = b64encode(createHmac('sha256', secret).update(`${h}.${p}`).digest());
|
|
55
|
-
const sigBuf = Buffer.from(sig);
|
|
56
|
-
const expBuf = Buffer.from(expected);
|
|
57
|
-
|
|
58
|
-
if (sigBuf.length !== expBuf.length || !timingSafeEqual(sigBuf, expBuf)) {
|
|
59
|
-
return { valid: false, error: 'bad signature' };
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
// Parse payload
|
|
63
|
-
let payload: JwtPayload;
|
|
64
|
-
try {
|
|
65
|
-
payload = JSON.parse(b64decode(p));
|
|
66
|
-
} catch {
|
|
67
|
-
return { valid: false, error: 'bad payload' };
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
const now = Date.now() / 1000;
|
|
71
|
-
const skew = options.clockSkewSec ?? 0;
|
|
72
|
-
|
|
73
|
-
// Expiration (H3): enforce when present; optionally require it.
|
|
74
|
-
if (payload.exp !== undefined) {
|
|
75
|
-
if (typeof payload.exp !== 'number' || payload.exp < now - skew) {
|
|
76
|
-
return { valid: false, error: 'expired' };
|
|
77
|
-
}
|
|
78
|
-
} else if (options.requireExp) {
|
|
79
|
-
return { valid: false, error: 'missing exp' };
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
// Not-before (L6)
|
|
83
|
-
if (payload.nbf !== undefined) {
|
|
84
|
-
if (typeof payload.nbf !== 'number' || payload.nbf > now + skew) {
|
|
85
|
-
return { valid: false, error: 'not yet valid' };
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// Issuer (L6): only checked when an expected issuer is configured.
|
|
90
|
-
if (options.issuer !== undefined && payload.iss !== options.issuer) {
|
|
91
|
-
return { valid: false, error: 'bad issuer' };
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
// Audience (L6): only checked when an expected audience is configured.
|
|
95
|
-
if (options.audience !== undefined) {
|
|
96
|
-
const aud = payload.aud;
|
|
97
|
-
const ok = Array.isArray(aud) ? aud.includes(options.audience) : aud === options.audience;
|
|
98
|
-
if (!ok) {
|
|
99
|
-
return { valid: false, error: 'bad audience' };
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
return { valid: true, payload };
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
/** Create JWT (for testing/tooling) */
|
|
107
|
-
export function createJwt(payload: JwtPayload, secret: string): string {
|
|
108
|
-
const h = Buffer.from('{"alg":"HS256","typ":"JWT"}').toString('base64url');
|
|
109
|
-
const p = Buffer.from(JSON.stringify(payload)).toString('base64url');
|
|
110
|
-
const sig = b64encode(createHmac('sha256', secret).update(`${h}.${p}`).digest());
|
|
111
|
-
return `${h}.${p}.${sig}`;
|
|
112
|
-
}
|
package/src/utils/logger.ts
DELETED
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Minimal zero-dependency logger
|
|
3
|
-
* Designed for constrained environments (MIPS, embedded, low RAM)
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
type LogFields = Record<string, unknown>;
|
|
7
|
-
type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'silent';
|
|
8
|
-
type LogFormat = 'plain' | 'json' | 'gcp-json';
|
|
9
|
-
|
|
10
|
-
const LEVELS: Record<LogLevel, number> = {
|
|
11
|
-
debug: 0,
|
|
12
|
-
info: 1,
|
|
13
|
-
warn: 2,
|
|
14
|
-
error: 3,
|
|
15
|
-
silent: 4,
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
const SEVERITY: Record<LogLevel, string> = {
|
|
19
|
-
debug: 'DEBUG',
|
|
20
|
-
info: 'INFO',
|
|
21
|
-
warn: 'WARNING',
|
|
22
|
-
error: 'ERROR',
|
|
23
|
-
silent: 'SILENT',
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
let currentLevel: LogLevel = 'info';
|
|
27
|
-
let currentFormat: LogFormat = 'plain';
|
|
28
|
-
let output: NodeJS.WriteStream = process.stderr;
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Initialize the logger with a specific log level and format.
|
|
32
|
-
*/
|
|
33
|
-
export function initLogger(level: LogLevel, format: LogFormat = 'plain', useStderr = false): void {
|
|
34
|
-
currentLevel = level;
|
|
35
|
-
currentFormat = format;
|
|
36
|
-
output = useStderr ? process.stderr : process.stdout;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Set the logger level dynamically
|
|
41
|
-
*/
|
|
42
|
-
export function setLevel(level: LogLevel): void {
|
|
43
|
-
currentLevel = level;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
function formatPlain(_level: LogLevel, message: string, meta?: LogFields): string {
|
|
47
|
-
let metaStr = '';
|
|
48
|
-
if (meta && Object.keys(meta).length > 0) {
|
|
49
|
-
const parts = Object.entries(meta).map(([k, v]) => {
|
|
50
|
-
if (v === undefined || v === null) return `${k}=null`;
|
|
51
|
-
if (typeof v === 'object') return `${k}=${JSON.stringify(v)}`;
|
|
52
|
-
return `${k}=${v}`;
|
|
53
|
-
});
|
|
54
|
-
metaStr = ` (${parts.join(', ')})`;
|
|
55
|
-
}
|
|
56
|
-
return `${message}${metaStr}\n`;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
function formatJson(level: LogLevel, message: string, meta?: LogFields): string {
|
|
60
|
-
const obj: Record<string, unknown> = {
|
|
61
|
-
level: level.toUpperCase(),
|
|
62
|
-
time: new Date().toISOString(),
|
|
63
|
-
message,
|
|
64
|
-
...meta,
|
|
65
|
-
};
|
|
66
|
-
return JSON.stringify(obj) + '\n';
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
function formatGcp(level: LogLevel, message: string, meta?: LogFields): string {
|
|
70
|
-
const obj: Record<string, unknown> = {
|
|
71
|
-
severity: SEVERITY[level],
|
|
72
|
-
time: new Date().toISOString(),
|
|
73
|
-
message,
|
|
74
|
-
...meta,
|
|
75
|
-
};
|
|
76
|
-
return JSON.stringify(obj) + '\n';
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
function write(level: LogLevel, message: string, meta?: LogFields): void {
|
|
80
|
-
if (LEVELS[level] < LEVELS[currentLevel]) return;
|
|
81
|
-
|
|
82
|
-
// Normalize errors in meta
|
|
83
|
-
if (meta) {
|
|
84
|
-
for (const [key, value] of Object.entries(meta)) {
|
|
85
|
-
if (value instanceof Error) {
|
|
86
|
-
meta[key] = { message: value.message, stack: value.stack };
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
let line: string;
|
|
92
|
-
switch (currentFormat) {
|
|
93
|
-
case 'json':
|
|
94
|
-
line = formatJson(level, message, meta);
|
|
95
|
-
break;
|
|
96
|
-
case 'gcp-json':
|
|
97
|
-
line = formatGcp(level, message, meta);
|
|
98
|
-
break;
|
|
99
|
-
default:
|
|
100
|
-
line = formatPlain(level, message, meta);
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
output.write(line);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
export const logger = {
|
|
107
|
-
debug(message: string, meta?: LogFields) {
|
|
108
|
-
write('debug', message, meta);
|
|
109
|
-
},
|
|
110
|
-
info(message: string, meta?: LogFields) {
|
|
111
|
-
write('info', message, meta);
|
|
112
|
-
},
|
|
113
|
-
warn(message: string, meta?: LogFields) {
|
|
114
|
-
write('warn', message, meta);
|
|
115
|
-
},
|
|
116
|
-
error(message: string, meta?: LogFields) {
|
|
117
|
-
write('error', message, meta);
|
|
118
|
-
},
|
|
119
|
-
};
|
|
120
|
-
|
|
121
|
-
export type { LogLevel, LogFormat, LogFields };
|