@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.
Files changed (281) hide show
  1. package/.env.example +1 -1
  2. package/README.md +11 -2
  3. package/dist/omadaClient/client.d.ts +6 -1
  4. package/dist/omadaClient/client.js +12 -1
  5. package/dist/omadaClient/client.js.map +1 -1
  6. package/dist/omadaClient/diagnose.d.ts +68 -0
  7. package/dist/omadaClient/diagnose.js +164 -0
  8. package/dist/omadaClient/diagnose.js.map +1 -0
  9. package/dist/omadaClient/index.d.ts +6 -0
  10. package/dist/omadaClient/index.js +15 -0
  11. package/dist/omadaClient/index.js.map +1 -1
  12. package/dist/omadaClient/macGroups.d.ts +58 -0
  13. package/dist/omadaClient/macGroups.js +124 -0
  14. package/dist/omadaClient/macGroups.js.map +1 -0
  15. package/dist/tools/infra/actions.d.ts +1 -1
  16. package/dist/tools/infra/actions.js +1 -1
  17. package/dist/tools/omada/index.js +6 -0
  18. package/dist/tools/omada/index.js.map +1 -1
  19. package/dist/tools/omada/macGroups.d.ts +19 -0
  20. package/dist/tools/omada/macGroups.js +77 -0
  21. package/dist/tools/omada/macGroups.js.map +1 -0
  22. package/dist/tools/omada/namespace.js +8 -0
  23. package/dist/tools/omada/namespace.js.map +1 -1
  24. package/dist/version.d.ts +1 -1
  25. package/dist/version.js +1 -1
  26. package/package.json +5 -1
  27. package/.codex/review-rules.md +0 -16
  28. package/.dockerignore +0 -8
  29. package/.gitattributes +0 -30
  30. package/.github/workflows/ci.yml +0 -193
  31. package/AGENTS.md +0 -389
  32. package/Dockerfile +0 -50
  33. package/docker-compose.yml +0 -23
  34. package/docs/CHANGELOG.md +0 -341
  35. package/docs/COVERAGE.md +0 -219
  36. package/docs/QUICK_START.md +0 -240
  37. package/eslint.config.js +0 -33
  38. package/n8n/ai-agent-safety-monitor.json +0 -355
  39. package/openapi.json +0 -1259
  40. package/scripts/check-version-sync.mjs +0 -69
  41. package/scripts/generate-jwt.ts +0 -121
  42. package/src/config.ts +0 -440
  43. package/src/haClient/automations.ts +0 -261
  44. package/src/haClient/calendars.ts +0 -94
  45. package/src/haClient/config.ts +0 -52
  46. package/src/haClient/devices.ts +0 -653
  47. package/src/haClient/entities.ts +0 -128
  48. package/src/haClient/events.ts +0 -689
  49. package/src/haClient/history.ts +0 -73
  50. package/src/haClient/index.ts +0 -336
  51. package/src/haClient/request.ts +0 -142
  52. package/src/haClient/services.ts +0 -45
  53. package/src/haClient/states.ts +0 -60
  54. package/src/haClient/updates.ts +0 -58
  55. package/src/haClient/wsCommand.ts +0 -44
  56. package/src/index.ts +0 -164
  57. package/src/localAI/index.ts +0 -88
  58. package/src/localAI/prompts.ts +0 -50
  59. package/src/localAI/providers/base.ts +0 -120
  60. package/src/localAI/providers/ollama.ts +0 -78
  61. package/src/localAI/providers/openai.ts +0 -86
  62. package/src/localAI/types.ts +0 -67
  63. package/src/omadaClient/auth.ts +0 -178
  64. package/src/omadaClient/client.ts +0 -337
  65. package/src/omadaClient/device.ts +0 -118
  66. package/src/omadaClient/index.ts +0 -310
  67. package/src/omadaClient/network.ts +0 -284
  68. package/src/omadaClient/request.ts +0 -365
  69. package/src/omadaClient/security.ts +0 -51
  70. package/src/omadaClient/site.ts +0 -344
  71. package/src/ownerQuestions/service.ts +0 -536
  72. package/src/permissions/index.ts +0 -143
  73. package/src/resources/index.ts +0 -213
  74. package/src/server/auth.ts +0 -175
  75. package/src/server/chatFace.ts +0 -789
  76. package/src/server/chatSlice.ts +0 -57
  77. package/src/server/common.ts +0 -170
  78. package/src/server/eventSubscription.ts +0 -343
  79. package/src/server/http.ts +0 -626
  80. package/src/server/instructions.ts +0 -97
  81. package/src/server/rateLimiter.ts +0 -227
  82. package/src/server/stdio.ts +0 -41
  83. package/src/server/stream.ts +0 -205
  84. package/src/tools/ai/analyzeSensors.ts +0 -33
  85. package/src/tools/ai/index.ts +0 -20
  86. package/src/tools/common.ts +0 -442
  87. package/src/tools/homeassistant/askOwner.ts +0 -133
  88. package/src/tools/homeassistant/automationControls.ts +0 -66
  89. package/src/tools/homeassistant/calendar.ts +0 -97
  90. package/src/tools/homeassistant/callService.ts +0 -25
  91. package/src/tools/homeassistant/controlClimate.ts +0 -68
  92. package/src/tools/homeassistant/controlCover.ts +0 -48
  93. package/src/tools/homeassistant/controlFan.ts +0 -44
  94. package/src/tools/homeassistant/controlLight.ts +0 -38
  95. package/src/tools/homeassistant/controlMediaPlayer.ts +0 -50
  96. package/src/tools/homeassistant/createAutomation.ts +0 -35
  97. package/src/tools/homeassistant/deleteAutomation.ts +0 -24
  98. package/src/tools/homeassistant/entityAction.ts +0 -35
  99. package/src/tools/homeassistant/entityGuard.ts +0 -28
  100. package/src/tools/homeassistant/getAllSensors.ts +0 -46
  101. package/src/tools/homeassistant/getAutomationTrace.ts +0 -30
  102. package/src/tools/homeassistant/getDomainSummary.ts +0 -29
  103. package/src/tools/homeassistant/getEntitiesByDomain.ts +0 -56
  104. package/src/tools/homeassistant/getHistory.ts +0 -24
  105. package/src/tools/homeassistant/getState.ts +0 -24
  106. package/src/tools/homeassistant/getStates.ts +0 -46
  107. package/src/tools/homeassistant/getVersion.ts +0 -21
  108. package/src/tools/homeassistant/index.ts +0 -121
  109. package/src/tools/homeassistant/listAutomations.ts +0 -35
  110. package/src/tools/homeassistant/listEntities.ts +0 -44
  111. package/src/tools/homeassistant/listPersons.ts +0 -46
  112. package/src/tools/homeassistant/sceneAndScript.ts +0 -53
  113. package/src/tools/homeassistant/searchEntities.ts +0 -58
  114. package/src/tools/homeassistant/sendNotification.ts +0 -179
  115. package/src/tools/homeassistant/systemTools.ts +0 -52
  116. package/src/tools/homeassistant/triggerAutomation.ts +0 -24
  117. package/src/tools/index.ts +0 -78
  118. package/src/tools/infra/actions.ts +0 -95
  119. package/src/tools/infra/index.ts +0 -138
  120. package/src/tools/omada/blockClient.ts +0 -28
  121. package/src/tools/omada/cyclePoePort.ts +0 -32
  122. package/src/tools/omada/deleteClient.ts +0 -27
  123. package/src/tools/omada/disableClientRateLimit.ts +0 -23
  124. package/src/tools/omada/getClient.ts +0 -14
  125. package/src/tools/omada/getDevice.ts +0 -14
  126. package/src/tools/omada/getFirewallSetting.ts +0 -14
  127. package/src/tools/omada/getInternetInfo.ts +0 -14
  128. package/src/tools/omada/getLanNetworkList.ts +0 -14
  129. package/src/tools/omada/getLanProfileList.ts +0 -14
  130. package/src/tools/omada/getPortForwardingStatus.ts +0 -26
  131. package/src/tools/omada/getRateLimitProfiles.ts +0 -14
  132. package/src/tools/omada/getSiteNtpStatus.ts +0 -14
  133. package/src/tools/omada/getSsidDetail.ts +0 -22
  134. package/src/tools/omada/getSsidList.ts +0 -21
  135. package/src/tools/omada/getSwitchStackDetail.ts +0 -14
  136. package/src/tools/omada/getThreatList.ts +0 -42
  137. package/src/tools/omada/getWlanGroupList.ts +0 -14
  138. package/src/tools/omada/graph.ts +0 -187
  139. package/src/tools/omada/index.ts +0 -153
  140. package/src/tools/omada/listBlockedClients.ts +0 -17
  141. package/src/tools/omada/listClients.ts +0 -14
  142. package/src/tools/omada/listClientsActivity.ts +0 -25
  143. package/src/tools/omada/listClientsPastConnections.ts +0 -44
  144. package/src/tools/omada/listDevices.ts +0 -14
  145. package/src/tools/omada/listDevicesStats.ts +0 -41
  146. package/src/tools/omada/listMostActiveClients.ts +0 -14
  147. package/src/tools/omada/listSites.ts +0 -18
  148. package/src/tools/omada/namespace.ts +0 -1164
  149. package/src/tools/omada/searchDevices.ts +0 -20
  150. package/src/tools/omada/setClientRateLimit.ts +0 -26
  151. package/src/tools/omada/setClientRateLimitProfile.ts +0 -25
  152. package/src/tools/omada/setSiteNtpServers.ts +0 -36
  153. package/src/tools/omada/setSsidEnabled.ts +0 -38
  154. package/src/tools/omada/unblockClient.ts +0 -26
  155. package/src/tools/types.ts +0 -11
  156. package/src/tools/utils/pagination-schema.ts +0 -27
  157. package/src/types/ai/index.ts +0 -11
  158. package/src/types/ai/types.ts +0 -67
  159. package/src/types/homeassistant/automations.ts +0 -43
  160. package/src/types/homeassistant/calendars.ts +0 -26
  161. package/src/types/homeassistant/config.ts +0 -14
  162. package/src/types/homeassistant/entities.ts +0 -14
  163. package/src/types/homeassistant/errors.ts +0 -33
  164. package/src/types/homeassistant/haConfig.ts +0 -7
  165. package/src/types/homeassistant/history.ts +0 -13
  166. package/src/types/homeassistant/index.ts +0 -46
  167. package/src/types/homeassistant/request.ts +0 -6
  168. package/src/types/homeassistant/serviceCall.ts +0 -18
  169. package/src/types/homeassistant/states.ts +0 -58
  170. package/src/types/homeassistant/updates.ts +0 -28
  171. package/src/types/index.ts +0 -12
  172. package/src/types/omada/activeClientInfo.ts +0 -17
  173. package/src/types/omada/clientActivity.ts +0 -32
  174. package/src/types/omada/clientBlockStatus.ts +0 -11
  175. package/src/types/omada/clientPastConnection.ts +0 -82
  176. package/src/types/omada/index.ts +0 -14
  177. package/src/types/omada/omadaApiResponse.ts +0 -5
  178. package/src/types/omada/omadaClientInfo.ts +0 -11
  179. package/src/types/omada/omadaDeviceInfo.ts +0 -11
  180. package/src/types/omada/omadaDeviceStats.ts +0 -31
  181. package/src/types/omada/omadaSiteSummary.ts +0 -5
  182. package/src/types/omada/oswStackDetail.ts +0 -11
  183. package/src/types/omada/paginatedResult.ts +0 -6
  184. package/src/types/omada/rateLimitProfile.ts +0 -58
  185. package/src/types/omada/threatInfo.ts +0 -38
  186. package/src/types/omada/tokenResult.ts +0 -6
  187. package/src/types.ts +0 -2
  188. package/src/utils/config-validations.ts +0 -68
  189. package/src/utils/jwt.ts +0 -112
  190. package/src/utils/logger.ts +0 -121
  191. package/src/utils/plainText.ts +0 -48
  192. package/src/utils/redact.ts +0 -59
  193. package/src/utils/sanitizeError.ts +0 -18
  194. package/src/utils/tlsDispatcher.ts +0 -69
  195. package/src/version.ts +0 -5
  196. package/tests/bdd/automation-creation.spec.ts +0 -214
  197. package/tests/bdd/automation-management.spec.ts +0 -267
  198. package/tests/bdd/calendar.spec.ts +0 -190
  199. package/tests/bdd/configuration.spec.ts +0 -283
  200. package/tests/bdd/device-control.spec.ts +0 -344
  201. package/tests/bdd/entity-listing.spec.ts +0 -208
  202. package/tests/bdd/entity-search.spec.ts +0 -183
  203. package/tests/bdd/history-retrieval.spec.ts +0 -195
  204. package/tests/bdd/notifications.spec.ts +0 -238
  205. package/tests/bdd/service-calls.spec.ts +0 -144
  206. package/tests/bdd/state-retrieval.spec.ts +0 -204
  207. package/tests/bench/hotpaths.bench.ts +0 -68
  208. package/tests/config.test.ts +0 -355
  209. package/tests/features/automation-creation.feature +0 -36
  210. package/tests/features/automation-management.feature +0 -54
  211. package/tests/features/calendar.feature +0 -37
  212. package/tests/features/configuration.feature +0 -70
  213. package/tests/features/device-control.feature +0 -100
  214. package/tests/features/entity-listing.feature +0 -51
  215. package/tests/features/entity-search.feature +0 -44
  216. package/tests/features/history-retrieval.feature +0 -38
  217. package/tests/features/notifications.feature +0 -37
  218. package/tests/features/service-calls.feature +0 -35
  219. package/tests/features/state-retrieval.feature +0 -37
  220. package/tests/fixtures/openapi-default-slice.json +0 -290
  221. package/tests/haClient/automationTrace.test.ts +0 -59
  222. package/tests/haClient/automations.test.ts +0 -149
  223. package/tests/haClient/config.test.ts +0 -117
  224. package/tests/haClient/entities.test.ts +0 -188
  225. package/tests/haClient/events.test.ts +0 -455
  226. package/tests/haClient/eventsTls.test.ts +0 -52
  227. package/tests/haClient/history.test.ts +0 -228
  228. package/tests/haClient/index.test.ts +0 -243
  229. package/tests/haClient/request.test.ts +0 -217
  230. package/tests/haClient/services.test.ts +0 -120
  231. package/tests/haClient/states.test.ts +0 -119
  232. package/tests/haClient/updates.test.ts +0 -193
  233. package/tests/index.test.ts +0 -160
  234. package/tests/integration/homeassistant.test.ts +0 -144
  235. package/tests/integration/omada.test.ts +0 -167
  236. package/tests/integration/server.test.ts +0 -151
  237. package/tests/localAI/index.test.ts +0 -177
  238. package/tests/localAI/ollama.test.ts +0 -187
  239. package/tests/localAI/openai.test.ts +0 -257
  240. package/tests/omadaClient/actions.test.ts +0 -161
  241. package/tests/omadaClient/clientBlocks.test.ts +0 -170
  242. package/tests/omadaClient/ntp.test.ts +0 -381
  243. package/tests/omadaClient/site.test.ts +0 -37
  244. package/tests/ownerQuestions/service.test.ts +0 -499
  245. package/tests/ownerQuestions/tools.test.ts +0 -186
  246. package/tests/permissions/index.test.ts +0 -217
  247. package/tests/resources/index.test.ts +0 -288
  248. package/tests/scripts/generateJwt.test.ts +0 -44
  249. package/tests/security/accessControl.test.ts +0 -223
  250. package/tests/security/authentication.test.ts +0 -117
  251. package/tests/security/configuration.test.ts +0 -170
  252. package/tests/security/cryptoTransport.test.ts +0 -172
  253. package/tests/security/dependencies.test.ts +0 -152
  254. package/tests/security/injection.test.ts +0 -117
  255. package/tests/security/insecureDesign.test.ts +0 -121
  256. package/tests/security/logging.test.ts +0 -131
  257. package/tests/security/resourceConsumption.test.ts +0 -142
  258. package/tests/server/auth.test.ts +0 -249
  259. package/tests/server/chatFace.test.ts +0 -320
  260. package/tests/server/common.test.ts +0 -84
  261. package/tests/server/http.test.ts +0 -561
  262. package/tests/server/instructions.test.ts +0 -152
  263. package/tests/server/memoizeJsonSchema.test.ts +0 -71
  264. package/tests/server/stdio.test.ts +0 -99
  265. package/tests/server/stream.test.ts +0 -285
  266. package/tests/server/toolVisibility.http.test.ts +0 -111
  267. package/tests/server/toolVisibility.test.ts +0 -129
  268. package/tests/tools/ai/analyzeSensors.test.ts +0 -227
  269. package/tests/tools/common.test.ts +0 -123
  270. package/tests/tools/homeassistant/handlers.test.ts +0 -872
  271. package/tests/tools/infra/invokeAction.test.ts +0 -280
  272. package/tests/tools/omada/graph.test.ts +0 -385
  273. package/tests/tools/omada/handlers.test.ts +0 -897
  274. package/tests/tools/omada/namespace.test.ts +0 -483
  275. package/tests/tools/registry.test.ts +0 -168
  276. package/tests/utils/config-validations.test.ts +0 -352
  277. package/tests/utils/jwt.test.ts +0 -115
  278. package/tests/utils/logger.test.ts +0 -327
  279. package/tests/utils/redact.test.ts +0 -105
  280. package/tsconfig.json +0 -24
  281. 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
- }
@@ -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,5 +0,0 @@
1
- export interface OmadaApiResponse<T> {
2
- errorCode: number;
3
- msg?: string;
4
- result?: T;
5
- }
@@ -1,11 +0,0 @@
1
- export interface OmadaClientInfo {
2
- id?: string;
3
- mac: string;
4
- name?: string;
5
- hostName?: string;
6
- deviceType?: string;
7
- ssid?: string;
8
- ip?: string;
9
- siteId?: string;
10
- [key: string]: unknown;
11
- }
@@ -1,11 +0,0 @@
1
- export interface OmadaDeviceInfo {
2
- mac: string;
3
- name?: string;
4
- deviceId?: string;
5
- type?: string;
6
- model?: string;
7
- ip?: string;
8
- status?: string;
9
- siteId?: string;
10
- [key: string]: unknown;
11
- }
@@ -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,5 +0,0 @@
1
- export interface OmadaSiteSummary {
2
- siteId: string;
3
- name: string;
4
- [key: string]: unknown;
5
- }
@@ -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,6 +0,0 @@
1
- export interface PaginatedResult<T> {
2
- totalRows?: number;
3
- currentPage?: number;
4
- currentSize?: number;
5
- data?: T[];
6
- }
@@ -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
- }
@@ -1,6 +0,0 @@
1
- export interface TokenResult {
2
- accessToken: string;
3
- tokenType: string;
4
- expiresIn: number;
5
- refreshToken?: string;
6
- }
package/src/types.ts DELETED
@@ -1,2 +0,0 @@
1
- // Barrel re-export from types folder
2
- export * from './types/index.js';
@@ -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
- }
@@ -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 };