@coffeerunhobby/mcp-ha-connect 2.4.3 → 2.4.5

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 (40) hide show
  1. package/README.md +22 -1
  2. package/dist/net/adapters/omada.d.ts +71 -0
  3. package/dist/net/adapters/omada.js +865 -0
  4. package/dist/net/adapters/omada.js.map +1 -0
  5. package/dist/net/model.d.ts +415 -0
  6. package/dist/net/model.js +26 -0
  7. package/dist/net/model.js.map +1 -0
  8. package/dist/net/validate.d.ts +22 -0
  9. package/dist/net/validate.js +87 -0
  10. package/dist/net/validate.js.map +1 -0
  11. package/dist/omadaClient/accessControl.js +4 -17
  12. package/dist/omadaClient/accessControl.js.map +1 -1
  13. package/dist/omadaClient/index.d.ts +7 -0
  14. package/dist/omadaClient/index.js +11 -0
  15. package/dist/omadaClient/index.js.map +1 -1
  16. package/dist/omadaClient/networkConfig.d.ts +54 -0
  17. package/dist/omadaClient/networkConfig.js +79 -0
  18. package/dist/omadaClient/networkConfig.js.map +1 -0
  19. package/dist/omadaClient/request.d.ts +2 -1
  20. package/dist/omadaClient/request.js +8 -6
  21. package/dist/omadaClient/request.js.map +1 -1
  22. package/dist/tools/common.d.ts +3 -1
  23. package/dist/tools/common.js +2 -2
  24. package/dist/tools/common.js.map +1 -1
  25. package/dist/tools/index.js +4 -0
  26. package/dist/tools/index.js.map +1 -1
  27. package/dist/tools/net/index.d.ts +125 -0
  28. package/dist/tools/net/index.js +193 -0
  29. package/dist/tools/net/index.js.map +1 -0
  30. package/dist/tools/omada/graph.js +3 -1
  31. package/dist/tools/omada/graph.js.map +1 -1
  32. package/dist/utils/ipv4.d.ts +14 -0
  33. package/dist/utils/ipv4.js +37 -0
  34. package/dist/utils/ipv4.js.map +1 -0
  35. package/dist/utils/redact.d.ts +11 -2
  36. package/dist/utils/redact.js +25 -7
  37. package/dist/utils/redact.js.map +1 -1
  38. package/dist/version.d.ts +1 -1
  39. package/dist/version.js +1 -1
  40. package/package.json +1 -1
@@ -8,7 +8,8 @@
8
8
  * response is passed through `redactSecrets` (see toToolResult).
9
9
  *
10
10
  * Only non-empty string values under secret-looking names are replaced, with
11
- * "<redacted>": an empty value stays empty (so "is a password set?" is still
11
+ * "<redacted>" (so are a SIM PIN/PUK and, inside dial-up and VPN sections, account
12
+ * user names): an empty value stays empty (so "is a password set?" is still
12
13
  * answerable), and booleans or numbers under similar names (`hidePwd`,
13
14
  * `encryptionPsk`) are left alone. `token=` / `access_token=` query values inside
14
15
  * URLs are masked as well. The input is never modified.
@@ -21,16 +22,32 @@ export const REDACTED = '<redacted>';
21
22
  * Secret-looking field names, matched on the whole name or its ending
22
23
  * (case-insensitive), from the Omada Open API and Home Assistant responses.
23
24
  */
24
- const SECRET_NAME = /(^key$|password|passwd|pwd$|secret|token$|passphrase|presharedkey|privatekey|securitykey|communitystring|^psk$|md5key|simplekey|authcode|devicekey)/i;
25
+ const SECRET_NAME = /(^key$|password|passwd|pwd$|secret|token$|passphrase|presharedkey|privatekey|securitykey|communitystring|^psk$|md5key|simplekey|authcode|devicekey|^(sim)?pin(code)?$|^puk\d?(code)?$)/i;
26
+ /**
27
+ * Account names that identify a subscription (the ISP PPPoE login, the LTE APN
28
+ * user, VPN users). Redacted only inside dial-up and VPN sections, so ordinary
29
+ * names (Home Assistant users, device names) stay readable.
30
+ */
31
+ const ACCOUNT_NAME = /^(user_?name|username|account)$/i;
32
+ const ACCOUNT_SECTION = /(pppoe|l2tp|pptp|lte|manuallyconfig|apn|dialup|vpn)/i;
25
33
  /** Credentials inside URLs, e.g. /api/camera_proxy/camera.door?token=abc123 */
26
34
  const URL_SECRET = /([?&](?:access_token|token|key|password|secret)=)[^&#\s"]+/gi;
27
35
  export function isSecretName(name) {
28
36
  return SECRET_NAME.test(name);
29
37
  }
30
- export function redactSecrets(value) {
31
- return redact(value, new WeakSet());
38
+ /** Whether a name (an object key, or a resource path such as "/vpn/client-to-site/clients") is a dial-up or VPN section. */
39
+ export function isAccountSection(name) {
40
+ return ACCOUNT_SECTION.test(name);
41
+ }
42
+ /**
43
+ * `accountSection`: the value as a whole comes from a dial-up or VPN section (e.g. an
44
+ * unwrapped list of VPN users), so account names are redacted from the top level on.
45
+ */
46
+ export function redactSecrets(value, options = {}) {
47
+ return redact(value, new WeakSet(), options.accountSection === true);
32
48
  }
33
- function redact(value, seen) {
49
+ /** `inAccountSection`: an enclosing key names a dial-up or VPN section. */
50
+ function redact(value, seen, inAccountSection) {
34
51
  if (typeof value === 'string') {
35
52
  return value.includes('=') ? value.replace(URL_SECRET, `$1${REDACTED}`) : value;
36
53
  }
@@ -42,11 +59,12 @@ function redact(value, seen) {
42
59
  }
43
60
  seen.add(value);
44
61
  if (Array.isArray(value)) {
45
- return value.map((item) => redact(item, seen));
62
+ return value.map((item) => redact(item, seen, inAccountSection));
46
63
  }
47
64
  const out = {};
48
65
  for (const [key, field] of Object.entries(value)) {
49
- out[key] = typeof field === 'string' && field !== '' && isSecretName(key) ? REDACTED : redact(field, seen);
66
+ const secret = isSecretName(key) || (inAccountSection && ACCOUNT_NAME.test(key));
67
+ out[key] = typeof field === 'string' && field !== '' && secret ? REDACTED : redact(field, seen, inAccountSection || ACCOUNT_SECTION.test(key));
50
68
  }
51
69
  return out;
52
70
  }
@@ -1 +1 @@
1
- {"version":3,"file":"redact.js","sourceRoot":"","sources":["../../src/utils/redact.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,MAAM,CAAC,MAAM,QAAQ,GAAG,YAAY,CAAC;AAErC;;;GAGG;AACH,MAAM,WAAW,GACf,sJAAsJ,CAAC;AAEzJ,+EAA+E;AAC/E,MAAM,UAAU,GAAG,8DAA8D,CAAC;AAElF,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,aAAa,CAAI,KAAQ;IACvC,OAAO,MAAM,CAAC,KAAK,EAAE,IAAI,OAAO,EAAE,CAAM,CAAC;AAC3C,CAAC;AAED,SAAS,MAAM,CAAC,KAAc,EAAE,IAAqB;IACnD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAClF,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACpB,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAChB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IACjD,CAAC;IACD,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,EAAE,CAAC;QAC5E,GAAG,CAAC,GAAG,CAAC,GAAG,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,EAAE,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC7G,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"redact.js","sourceRoot":"","sources":["../../src/utils/redact.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,CAAC,MAAM,QAAQ,GAAG,YAAY,CAAC;AAErC;;;GAGG;AACH,MAAM,WAAW,GACf,yLAAyL,CAAC;AAE5L;;;;GAIG;AACH,MAAM,YAAY,GAAG,kCAAkC,CAAC;AACxD,MAAM,eAAe,GAAG,sDAAsD,CAAC;AAE/E,+EAA+E;AAC/E,MAAM,UAAU,GAAG,8DAA8D,CAAC;AAElF,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AAED,4HAA4H;AAC5H,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAI,KAAQ,EAAE,UAAwC,EAAE;IACnF,OAAO,MAAM,CAAC,KAAK,EAAE,IAAI,OAAO,EAAE,EAAE,OAAO,CAAC,cAAc,KAAK,IAAI,CAAM,CAAC;AAC5E,CAAC;AAED,2EAA2E;AAC3E,SAAS,MAAM,CAAC,KAAc,EAAE,IAAqB,EAAE,gBAAyB;IAC9E,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAClF,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACpB,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAChB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC;IACnE,CAAC;IACD,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,EAAE,CAAC;QAC5E,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,IAAI,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACjF,GAAG,CAAC,GAAG,CAAC,GAAG,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,EAAE,IAAI,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,gBAAgB,IAAI,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACjJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
package/dist/version.d.ts CHANGED
@@ -2,4 +2,4 @@
2
2
  * Package version - hardcoded at build time for reliability
3
3
  * Keep in sync with package.json version
4
4
  */
5
- export declare const VERSION = "2.4.3";
5
+ export declare const VERSION = "2.4.5";
package/dist/version.js CHANGED
@@ -2,5 +2,5 @@
2
2
  * Package version - hardcoded at build time for reliability
3
3
  * Keep in sync with package.json version
4
4
  */
5
- export const VERSION = '2.4.3';
5
+ export const VERSION = '2.4.5';
6
6
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coffeerunhobby/mcp-ha-connect",
3
- "version": "2.4.3",
3
+ "version": "2.4.5",
4
4
  "description": "Smart home MCP server for Home Assistant plus Local AI integration",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",