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