@switchbot/openapi-cli 3.2.0 → 3.2.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 (331) hide show
  1. package/dist/api/client.d.ts +31 -0
  2. package/dist/api/client.js +236 -0
  3. package/dist/api/client.js.map +1 -0
  4. package/dist/auth.d.ts +1 -0
  5. package/dist/auth.js +21 -0
  6. package/dist/auth.js.map +1 -0
  7. package/dist/commands/agent-bootstrap.d.ts +10 -0
  8. package/dist/commands/agent-bootstrap.js +200 -0
  9. package/dist/commands/agent-bootstrap.js.map +1 -0
  10. package/dist/commands/auth.d.ts +18 -0
  11. package/dist/commands/auth.js +355 -0
  12. package/dist/commands/auth.js.map +1 -0
  13. package/dist/commands/batch.d.ts +2 -0
  14. package/dist/commands/batch.js +414 -0
  15. package/dist/commands/batch.js.map +1 -0
  16. package/dist/commands/cache.d.ts +2 -0
  17. package/dist/commands/cache.js +127 -0
  18. package/dist/commands/cache.js.map +1 -0
  19. package/dist/commands/capabilities.d.ts +31 -0
  20. package/dist/commands/capabilities.js +383 -0
  21. package/dist/commands/capabilities.js.map +1 -0
  22. package/dist/commands/catalog.d.ts +2 -0
  23. package/dist/commands/catalog.js +360 -0
  24. package/dist/commands/catalog.js.map +1 -0
  25. package/dist/commands/completion.d.ts +2 -0
  26. package/dist/commands/completion.js +386 -0
  27. package/dist/commands/completion.js.map +1 -0
  28. package/dist/commands/config.d.ts +21 -0
  29. package/dist/commands/config.js +377 -0
  30. package/dist/commands/config.js.map +1 -0
  31. package/dist/commands/daemon.d.ts +2 -0
  32. package/dist/commands/daemon.js +411 -0
  33. package/dist/commands/daemon.js.map +1 -0
  34. package/dist/commands/device-meta.d.ts +2 -0
  35. package/dist/commands/device-meta.js +160 -0
  36. package/dist/commands/device-meta.js.map +1 -0
  37. package/dist/commands/devices.d.ts +2 -0
  38. package/dist/commands/devices.js +949 -0
  39. package/dist/commands/devices.js.map +1 -0
  40. package/dist/commands/doctor.d.ts +3 -0
  41. package/dist/commands/doctor.js +1016 -0
  42. package/dist/commands/doctor.js.map +1 -0
  43. package/dist/commands/events.d.ts +31 -0
  44. package/dist/commands/events.js +564 -0
  45. package/dist/commands/events.js.map +1 -0
  46. package/dist/commands/expand.d.ts +2 -0
  47. package/dist/commands/expand.js +131 -0
  48. package/dist/commands/expand.js.map +1 -0
  49. package/dist/commands/explain.d.ts +2 -0
  50. package/dist/commands/explain.js +140 -0
  51. package/dist/commands/explain.js.map +1 -0
  52. package/dist/commands/health.d.ts +8 -0
  53. package/dist/commands/health.js +114 -0
  54. package/dist/commands/health.js.map +1 -0
  55. package/dist/commands/history.d.ts +2 -0
  56. package/dist/commands/history.js +321 -0
  57. package/dist/commands/history.js.map +1 -0
  58. package/dist/commands/identity.d.ts +45 -0
  59. package/dist/commands/identity.js +60 -0
  60. package/dist/commands/identity.js.map +1 -0
  61. package/dist/commands/install.d.ts +20 -0
  62. package/dist/commands/install.js +247 -0
  63. package/dist/commands/install.js.map +1 -0
  64. package/dist/commands/mcp.d.ts +14 -0
  65. package/dist/commands/mcp.js +2018 -0
  66. package/dist/commands/mcp.js.map +1 -0
  67. package/dist/commands/plan.d.ts +51 -0
  68. package/dist/commands/plan.js +654 -0
  69. package/dist/commands/plan.js.map +1 -0
  70. package/dist/commands/policy.d.ts +24 -0
  71. package/dist/commands/policy.js +587 -0
  72. package/dist/commands/policy.js.map +1 -0
  73. package/dist/commands/quota.d.ts +2 -0
  74. package/dist/commands/quota.js +79 -0
  75. package/dist/commands/quota.js.map +1 -0
  76. package/dist/commands/rules.d.ts +2 -0
  77. package/dist/commands/rules.js +876 -0
  78. package/dist/commands/rules.js.map +1 -0
  79. package/dist/commands/scenes.d.ts +2 -0
  80. package/dist/commands/scenes.js +265 -0
  81. package/dist/commands/scenes.js.map +1 -0
  82. package/dist/commands/schema.d.ts +2 -0
  83. package/dist/commands/schema.js +185 -0
  84. package/dist/commands/schema.js.map +1 -0
  85. package/dist/commands/status-sync.d.ts +2 -0
  86. package/dist/commands/status-sync.js +132 -0
  87. package/dist/commands/status-sync.js.map +1 -0
  88. package/dist/commands/uninstall.d.ts +20 -0
  89. package/dist/commands/uninstall.js +238 -0
  90. package/dist/commands/uninstall.js.map +1 -0
  91. package/dist/commands/upgrade-check.d.ts +2 -0
  92. package/dist/commands/upgrade-check.js +107 -0
  93. package/dist/commands/upgrade-check.js.map +1 -0
  94. package/dist/commands/watch.d.ts +2 -0
  95. package/dist/commands/watch.js +195 -0
  96. package/dist/commands/watch.js.map +1 -0
  97. package/dist/commands/webhook.d.ts +2 -0
  98. package/dist/commands/webhook.js +183 -0
  99. package/dist/commands/webhook.js.map +1 -0
  100. package/dist/config.d.ts +57 -0
  101. package/dist/config.js +259 -0
  102. package/dist/config.js.map +1 -0
  103. package/dist/credentials/backends/file.d.ts +18 -0
  104. package/dist/credentials/backends/file.js +102 -0
  105. package/dist/credentials/backends/file.js.map +1 -0
  106. package/dist/credentials/backends/linux.d.ts +16 -0
  107. package/dist/credentials/backends/linux.js +130 -0
  108. package/dist/credentials/backends/linux.js.map +1 -0
  109. package/dist/credentials/backends/macos.d.ts +18 -0
  110. package/dist/credentials/backends/macos.js +130 -0
  111. package/dist/credentials/backends/macos.js.map +1 -0
  112. package/dist/credentials/backends/windows.d.ts +23 -0
  113. package/dist/credentials/backends/windows.js +216 -0
  114. package/dist/credentials/backends/windows.js.map +1 -0
  115. package/dist/credentials/keychain.d.ts +83 -0
  116. package/dist/credentials/keychain.js +89 -0
  117. package/dist/credentials/keychain.js.map +1 -0
  118. package/dist/credentials/prime.d.ts +32 -0
  119. package/dist/credentials/prime.js +53 -0
  120. package/dist/credentials/prime.js.map +1 -0
  121. package/dist/devices/cache.d.ts +79 -0
  122. package/dist/devices/cache.js +294 -0
  123. package/dist/devices/cache.js.map +1 -0
  124. package/dist/devices/catalog.d.ts +138 -0
  125. package/dist/devices/catalog.js +768 -0
  126. package/dist/devices/catalog.js.map +1 -0
  127. package/dist/devices/device-meta.d.ts +15 -0
  128. package/dist/devices/device-meta.js +57 -0
  129. package/dist/devices/device-meta.js.map +1 -0
  130. package/dist/devices/history-agg.d.ts +37 -0
  131. package/dist/devices/history-agg.js +139 -0
  132. package/dist/devices/history-agg.js.map +1 -0
  133. package/dist/devices/history-query.d.ts +45 -0
  134. package/dist/devices/history-query.js +182 -0
  135. package/dist/devices/history-query.js.map +1 -0
  136. package/dist/devices/param-validator.d.ts +40 -0
  137. package/dist/devices/param-validator.js +434 -0
  138. package/dist/devices/param-validator.js.map +1 -0
  139. package/dist/devices/resources.d.ts +74 -0
  140. package/dist/devices/resources.js +271 -0
  141. package/dist/devices/resources.js.map +1 -0
  142. package/dist/index.d.ts +1 -0
  143. package/dist/index.js +170 -56946
  144. package/dist/index.js.map +1 -0
  145. package/dist/install/default-steps.d.ts +66 -0
  146. package/dist/install/default-steps.js +258 -0
  147. package/dist/install/default-steps.js.map +1 -0
  148. package/dist/install/preflight.d.ts +60 -0
  149. package/dist/install/preflight.js +213 -0
  150. package/dist/install/preflight.js.map +1 -0
  151. package/dist/install/steps.d.ts +61 -0
  152. package/dist/install/steps.js +68 -0
  153. package/dist/install/steps.js.map +1 -0
  154. package/dist/lib/command-keywords.d.ts +5 -0
  155. package/dist/lib/command-keywords.js +18 -0
  156. package/dist/lib/command-keywords.js.map +1 -0
  157. package/dist/lib/daemon-state.d.ts +24 -0
  158. package/dist/lib/daemon-state.js +47 -0
  159. package/dist/lib/daemon-state.js.map +1 -0
  160. package/dist/lib/destructive-mode.d.ts +2 -0
  161. package/dist/lib/destructive-mode.js +13 -0
  162. package/dist/lib/destructive-mode.js.map +1 -0
  163. package/dist/lib/devices.d.ts +151 -0
  164. package/dist/lib/devices.js +383 -0
  165. package/dist/lib/devices.js.map +1 -0
  166. package/dist/lib/idempotency.d.ts +46 -0
  167. package/dist/lib/idempotency.js +107 -0
  168. package/dist/lib/idempotency.js.map +1 -0
  169. package/dist/lib/plan-store.d.ts +19 -0
  170. package/dist/lib/plan-store.js +69 -0
  171. package/dist/lib/plan-store.js.map +1 -0
  172. package/dist/lib/request-context.d.ts +7 -0
  173. package/dist/lib/request-context.js +13 -0
  174. package/dist/lib/request-context.js.map +1 -0
  175. package/dist/lib/scenes.d.ts +7 -0
  176. package/dist/lib/scenes.js +11 -0
  177. package/dist/lib/scenes.js.map +1 -0
  178. package/dist/logger.d.ts +4 -0
  179. package/dist/logger.js +17 -0
  180. package/dist/logger.js.map +1 -0
  181. package/dist/mcp/device-history.d.ts +36 -0
  182. package/dist/mcp/device-history.js +146 -0
  183. package/dist/mcp/device-history.js.map +1 -0
  184. package/dist/mcp/events-subscription.d.ts +45 -0
  185. package/dist/mcp/events-subscription.js +214 -0
  186. package/dist/mcp/events-subscription.js.map +1 -0
  187. package/dist/mqtt/client.d.ts +25 -0
  188. package/dist/mqtt/client.js +181 -0
  189. package/dist/mqtt/client.js.map +1 -0
  190. package/dist/mqtt/credential.d.ts +16 -0
  191. package/dist/mqtt/credential.js +31 -0
  192. package/dist/mqtt/credential.js.map +1 -0
  193. package/dist/policy/add-rule.d.ts +21 -0
  194. package/dist/policy/add-rule.js +125 -0
  195. package/dist/policy/add-rule.js.map +1 -0
  196. package/dist/policy/diff.d.ts +21 -0
  197. package/dist/policy/diff.js +92 -0
  198. package/dist/policy/diff.js.map +1 -0
  199. package/dist/policy/format.d.ts +6 -0
  200. package/dist/policy/format.js +58 -0
  201. package/dist/policy/format.js.map +1 -0
  202. package/dist/policy/load.d.ts +32 -0
  203. package/dist/policy/load.js +62 -0
  204. package/dist/policy/load.js.map +1 -0
  205. package/dist/policy/migrate.d.ts +21 -0
  206. package/dist/policy/migrate.js +68 -0
  207. package/dist/policy/migrate.js.map +1 -0
  208. package/dist/policy/schema.d.ts +5 -0
  209. package/dist/policy/schema.js +19 -0
  210. package/dist/policy/schema.js.map +1 -0
  211. package/dist/policy/validate.d.ts +19 -0
  212. package/dist/policy/validate.js +263 -0
  213. package/dist/policy/validate.js.map +1 -0
  214. package/dist/rules/action.d.ts +65 -0
  215. package/dist/rules/action.js +217 -0
  216. package/dist/rules/action.js.map +1 -0
  217. package/dist/rules/audit-query.d.ts +51 -0
  218. package/dist/rules/audit-query.js +90 -0
  219. package/dist/rules/audit-query.js.map +1 -0
  220. package/dist/rules/conflict-analyzer.d.ts +57 -0
  221. package/dist/rules/conflict-analyzer.js +215 -0
  222. package/dist/rules/conflict-analyzer.js.map +1 -0
  223. package/dist/rules/cron-scheduler.d.ts +62 -0
  224. package/dist/rules/cron-scheduler.js +187 -0
  225. package/dist/rules/cron-scheduler.js.map +1 -0
  226. package/dist/rules/destructive.d.ts +20 -0
  227. package/dist/rules/destructive.js +53 -0
  228. package/dist/rules/destructive.js.map +1 -0
  229. package/dist/rules/engine.d.ts +193 -0
  230. package/dist/rules/engine.js +758 -0
  231. package/dist/rules/engine.js.map +1 -0
  232. package/dist/rules/matcher.d.ts +56 -0
  233. package/dist/rules/matcher.js +231 -0
  234. package/dist/rules/matcher.js.map +1 -0
  235. package/dist/rules/pid-file.d.ts +43 -0
  236. package/dist/rules/pid-file.js +96 -0
  237. package/dist/rules/pid-file.js.map +1 -0
  238. package/dist/rules/quiet-hours.d.ts +26 -0
  239. package/dist/rules/quiet-hours.js +46 -0
  240. package/dist/rules/quiet-hours.js.map +1 -0
  241. package/dist/rules/suggest.d.ts +20 -0
  242. package/dist/rules/suggest.js +96 -0
  243. package/dist/rules/suggest.js.map +1 -0
  244. package/dist/rules/throttle.d.ts +61 -0
  245. package/dist/rules/throttle.js +117 -0
  246. package/dist/rules/throttle.js.map +1 -0
  247. package/dist/rules/types.d.ts +117 -0
  248. package/dist/rules/types.js +35 -0
  249. package/dist/rules/types.js.map +1 -0
  250. package/dist/rules/webhook-listener.d.ts +63 -0
  251. package/dist/rules/webhook-listener.js +224 -0
  252. package/dist/rules/webhook-listener.js.map +1 -0
  253. package/dist/rules/webhook-token.d.ts +50 -0
  254. package/dist/rules/webhook-token.js +91 -0
  255. package/dist/rules/webhook-token.js.map +1 -0
  256. package/dist/schema/field-aliases.d.ts +34 -0
  257. package/dist/schema/field-aliases.js +132 -0
  258. package/dist/schema/field-aliases.js.map +1 -0
  259. package/dist/sinks/dispatcher.d.ts +7 -0
  260. package/dist/sinks/dispatcher.js +13 -0
  261. package/dist/sinks/dispatcher.js.map +1 -0
  262. package/dist/sinks/file.d.ts +6 -0
  263. package/dist/sinks/file.js +20 -0
  264. package/dist/sinks/file.js.map +1 -0
  265. package/dist/sinks/format.d.ts +20 -0
  266. package/dist/sinks/format.js +57 -0
  267. package/dist/sinks/format.js.map +1 -0
  268. package/dist/sinks/homeassistant.d.ts +18 -0
  269. package/dist/sinks/homeassistant.js +45 -0
  270. package/dist/sinks/homeassistant.js.map +1 -0
  271. package/dist/sinks/openclaw.d.ts +13 -0
  272. package/dist/sinks/openclaw.js +34 -0
  273. package/dist/sinks/openclaw.js.map +1 -0
  274. package/dist/sinks/stdout.d.ts +4 -0
  275. package/dist/sinks/stdout.js +6 -0
  276. package/dist/sinks/stdout.js.map +1 -0
  277. package/dist/sinks/telegram.d.ts +11 -0
  278. package/dist/sinks/telegram.js +29 -0
  279. package/dist/sinks/telegram.js.map +1 -0
  280. package/dist/sinks/types.d.ts +13 -0
  281. package/dist/sinks/types.js +2 -0
  282. package/dist/sinks/types.js.map +1 -0
  283. package/dist/sinks/webhook.d.ts +6 -0
  284. package/dist/sinks/webhook.js +23 -0
  285. package/dist/sinks/webhook.js.map +1 -0
  286. package/dist/status-sync/manager.d.ts +48 -0
  287. package/dist/status-sync/manager.js +269 -0
  288. package/dist/status-sync/manager.js.map +1 -0
  289. package/dist/utils/arg-parsers.d.ts +16 -0
  290. package/dist/utils/arg-parsers.js +67 -0
  291. package/dist/utils/arg-parsers.js.map +1 -0
  292. package/dist/utils/audit.d.ts +69 -0
  293. package/dist/utils/audit.js +122 -0
  294. package/dist/utils/audit.js.map +1 -0
  295. package/dist/utils/filter.d.ts +81 -0
  296. package/dist/utils/filter.js +190 -0
  297. package/dist/utils/filter.js.map +1 -0
  298. package/dist/utils/flags.d.ts +72 -0
  299. package/dist/utils/flags.js +187 -0
  300. package/dist/utils/flags.js.map +1 -0
  301. package/dist/utils/format.d.ts +9 -0
  302. package/dist/utils/format.js +118 -0
  303. package/dist/utils/format.js.map +1 -0
  304. package/dist/utils/health.d.ts +48 -0
  305. package/dist/utils/health.js +102 -0
  306. package/dist/utils/health.js.map +1 -0
  307. package/dist/utils/help-json.d.ts +39 -0
  308. package/dist/utils/help-json.js +55 -0
  309. package/dist/utils/help-json.js.map +1 -0
  310. package/dist/utils/name-resolver.d.ts +26 -0
  311. package/dist/utils/name-resolver.js +138 -0
  312. package/dist/utils/name-resolver.js.map +1 -0
  313. package/dist/utils/output.d.ts +73 -0
  314. package/dist/utils/output.js +405 -0
  315. package/dist/utils/output.js.map +1 -0
  316. package/dist/utils/quota.d.ts +61 -0
  317. package/dist/utils/quota.js +228 -0
  318. package/dist/utils/quota.js.map +1 -0
  319. package/dist/utils/redact.d.ts +23 -0
  320. package/dist/utils/redact.js +69 -0
  321. package/dist/utils/redact.js.map +1 -0
  322. package/dist/utils/retry.d.ts +72 -0
  323. package/dist/utils/retry.js +141 -0
  324. package/dist/utils/retry.js.map +1 -0
  325. package/dist/utils/string.d.ts +2 -0
  326. package/dist/utils/string.js +23 -0
  327. package/dist/utils/string.js.map +1 -0
  328. package/dist/version.d.ts +2 -0
  329. package/dist/version.js +5 -0
  330. package/dist/version.js.map +1 -0
  331. package/package.json +2 -2
@@ -0,0 +1,434 @@
1
+ import { UsageError } from '../utils/output.js';
2
+ export const AC_MODE_MAP = { auto: 1, cool: 2, dry: 3, fan: 4, heat: 5 };
3
+ export const AC_FAN_MAP = { auto: 1, low: 2, mid: 3, high: 4 };
4
+ export const CURTAIN_MODE_MAP = { default: 'ff', performance: '0', silent: '1' };
5
+ export const RELAY_MODE_MAP = { toggle: 0, edge: 1, detached: 2, momentary: 3 };
6
+ const BLIND_DIRECTION = new Set(['up', 'down']);
7
+ // ---- Semantic-flag builders (used by `devices expand`) --------------------
8
+ export function buildAcSetAll(opts) {
9
+ if (!opts.temp)
10
+ throw new UsageError('--temp is required for setAll (e.g. --temp 26)');
11
+ if (!opts.mode)
12
+ throw new UsageError('--mode is required for setAll (auto|cool|dry|fan|heat)');
13
+ if (!opts.fan)
14
+ throw new UsageError('--fan is required for setAll (auto|low|mid|high)');
15
+ if (!opts.power)
16
+ throw new UsageError('--power is required for setAll (on|off)');
17
+ const temp = parseInt(opts.temp, 10);
18
+ if (!Number.isFinite(temp) || temp < 16 || temp > 30) {
19
+ throw new UsageError(`--temp must be an integer between 16 and 30 (got "${opts.temp}")`);
20
+ }
21
+ const modeInt = AC_MODE_MAP[opts.mode.toLowerCase()];
22
+ if (modeInt === undefined) {
23
+ throw new UsageError(`--mode must be one of: auto, cool, dry, fan, heat (got "${opts.mode}")`);
24
+ }
25
+ const fanInt = AC_FAN_MAP[opts.fan.toLowerCase()];
26
+ if (fanInt === undefined) {
27
+ throw new UsageError(`--fan must be one of: auto, low, mid, high (got "${opts.fan}")`);
28
+ }
29
+ const power = opts.power.toLowerCase();
30
+ if (power !== 'on' && power !== 'off') {
31
+ throw new UsageError(`--power must be "on" or "off" (got "${opts.power}")`);
32
+ }
33
+ return `${temp},${modeInt},${fanInt},${power}`;
34
+ }
35
+ export function buildCurtainSetPosition(opts) {
36
+ if (!opts.position)
37
+ throw new UsageError('--position is required (0-100)');
38
+ const pos = parseInt(opts.position, 10);
39
+ if (!Number.isFinite(pos) || pos < 0 || pos > 100) {
40
+ throw new UsageError(`--position must be an integer between 0 and 100 (got "${opts.position}")`);
41
+ }
42
+ const modeStr = opts.mode ? CURTAIN_MODE_MAP[opts.mode.toLowerCase()] : 'ff';
43
+ if (modeStr === undefined) {
44
+ throw new UsageError(`--mode must be one of: default, performance, silent (got "${opts.mode}")`);
45
+ }
46
+ return `0,${modeStr},${pos}`;
47
+ }
48
+ export function buildBlindTiltSetPosition(opts) {
49
+ if (!opts.direction)
50
+ throw new UsageError('--direction is required (up|down)');
51
+ if (!opts.angle)
52
+ throw new UsageError('--angle is required (0-100)');
53
+ const dir = opts.direction.toLowerCase();
54
+ if (!BLIND_DIRECTION.has(dir)) {
55
+ throw new UsageError(`--direction must be "up" or "down" (got "${opts.direction}")`);
56
+ }
57
+ const angle = parseInt(opts.angle, 10);
58
+ if (!Number.isFinite(angle) || angle < 0 || angle > 100) {
59
+ throw new UsageError(`--angle must be an integer between 0 and 100 (got "${opts.angle}")`);
60
+ }
61
+ return `${dir};${angle}`;
62
+ }
63
+ export function buildRelaySetMode(opts) {
64
+ if (!opts.channel)
65
+ throw new UsageError('--channel is required (1 or 2)');
66
+ if (!opts.mode)
67
+ throw new UsageError('--mode is required (toggle|edge|detached|momentary)');
68
+ const ch = parseInt(opts.channel, 10);
69
+ if (ch !== 1 && ch !== 2) {
70
+ throw new UsageError(`--channel must be 1 or 2 (got "${opts.channel}")`);
71
+ }
72
+ const modeInt = RELAY_MODE_MAP[opts.mode.toLowerCase()];
73
+ if (modeInt === undefined) {
74
+ throw new UsageError(`--mode must be one of: toggle, edge, detached, momentary (got "${opts.mode}")`);
75
+ }
76
+ return `${ch};${modeInt}`;
77
+ }
78
+ /**
79
+ * Validate a raw wire-format parameter string for (deviceType, command)
80
+ * combos where the shape is well-defined. Unknown combos pass through so
81
+ * `devices command` remains a usable escape hatch for types/commands the
82
+ * CLI hasn't modelled yet.
83
+ *
84
+ * On passthrough, `normalized` is left undefined so the caller keeps the
85
+ * original parameter value (preserving the `undefined → "default"` default
86
+ * for no-arg commands).
87
+ */
88
+ export function validateParameter(deviceType, command, raw) {
89
+ if (!deviceType)
90
+ return { ok: true };
91
+ if (deviceType === 'Air Conditioner' && command === 'setAll') {
92
+ return validateAcSetAll(raw);
93
+ }
94
+ if (deviceType.startsWith('Curtain') && command === 'setPosition') {
95
+ return validateCurtainSetPosition(raw);
96
+ }
97
+ if (deviceType.startsWith('Blind Tilt') && command === 'setPosition') {
98
+ return validateBlindTiltSetPosition(raw);
99
+ }
100
+ if (deviceType.startsWith('Relay Switch') && command === 'setMode') {
101
+ return validateRelaySetMode(raw);
102
+ }
103
+ if (command === 'setBrightness' && isBrightnessDevice(deviceType)) {
104
+ return validateSetBrightness(raw);
105
+ }
106
+ if (command === 'setColor' && isColorDevice(deviceType)) {
107
+ return validateSetColor(raw);
108
+ }
109
+ if (command === 'setColorTemperature' && isColorDevice(deviceType)) {
110
+ return validateSetColorTemperature(raw);
111
+ }
112
+ return { ok: true };
113
+ }
114
+ function isBrightnessDevice(deviceType) {
115
+ return (deviceType === 'Color Bulb' ||
116
+ deviceType === 'Strip Light' ||
117
+ deviceType === 'Strip Light 3' ||
118
+ deviceType === 'Ceiling Light' ||
119
+ deviceType === 'Ceiling Light Pro' ||
120
+ deviceType === 'Floor Lamp' ||
121
+ deviceType === 'Light Strip' ||
122
+ deviceType === 'Dimmer' ||
123
+ deviceType === 'Fill Light');
124
+ }
125
+ function isColorDevice(deviceType) {
126
+ return (deviceType === 'Color Bulb' ||
127
+ deviceType === 'Strip Light' ||
128
+ deviceType === 'Strip Light 3' ||
129
+ deviceType === 'Ceiling Light' ||
130
+ deviceType === 'Ceiling Light Pro' ||
131
+ deviceType === 'Floor Lamp' ||
132
+ deviceType === 'Light Strip' ||
133
+ deviceType === 'Fill Light');
134
+ }
135
+ function validateSetBrightness(raw) {
136
+ if (raw === undefined || raw === '' || raw === 'default') {
137
+ return {
138
+ ok: false,
139
+ error: `setBrightness requires an integer 1-100 (percent). Example: "50".`,
140
+ };
141
+ }
142
+ const trimmed = raw.trim();
143
+ if (!/^-?\d+$/.test(trimmed)) {
144
+ return {
145
+ ok: false,
146
+ error: `setBrightness must be an integer 1-100, got ${JSON.stringify(raw)}. ${hintBrightnessRetry()}`,
147
+ };
148
+ }
149
+ const n = Number(trimmed);
150
+ if (!Number.isInteger(n) || n < 1 || n > 100) {
151
+ return {
152
+ ok: false,
153
+ error: `setBrightness must be an integer 1-100, got "${raw}". ${hintBrightnessRetry()}`,
154
+ };
155
+ }
156
+ return { ok: true, normalized: String(n) };
157
+ }
158
+ function hintBrightnessRetry() {
159
+ return `Ask the user whether they meant a percentage (1-100). Example: "50".`;
160
+ }
161
+ // B-12: setColor accepts R:G:B, R,G,B, #RRGGBB, #RGB, or a small CSS named color
162
+ // palette. All forms are normalized to `R:G:B` (the only wire shape SwitchBot
163
+ // accepts) so the caller can POST the result unchanged.
164
+ const NAMED_COLORS = {
165
+ red: [255, 0, 0],
166
+ green: [0, 128, 0],
167
+ lime: [0, 255, 0],
168
+ blue: [0, 0, 255],
169
+ yellow: [255, 255, 0],
170
+ cyan: [0, 255, 255],
171
+ magenta: [255, 0, 255],
172
+ white: [255, 255, 255],
173
+ black: [0, 0, 0],
174
+ orange: [255, 165, 0],
175
+ purple: [128, 0, 128],
176
+ pink: [255, 192, 203],
177
+ brown: [165, 42, 42],
178
+ grey: [128, 128, 128],
179
+ gray: [128, 128, 128],
180
+ warm: [255, 180, 100],
181
+ };
182
+ function validateSetColor(raw) {
183
+ if (raw === undefined || raw === '' || raw === 'default') {
184
+ return {
185
+ ok: false,
186
+ error: `setColor requires a color. Expected one of: "R:G:B" (e.g. "255:0:0"), "#RRGGBB" (e.g. "#FF0000"), "#RGB", "R,G,B", or a named color (${Object.keys(NAMED_COLORS).slice(0, 8).join(', ')}, ...).`,
187
+ };
188
+ }
189
+ const trimmed = raw.trim();
190
+ // Named color.
191
+ const named = NAMED_COLORS[trimmed.toLowerCase()];
192
+ if (named) {
193
+ return { ok: true, normalized: `${named[0]}:${named[1]}:${named[2]}` };
194
+ }
195
+ // Hex #RRGGBB or #RGB.
196
+ if (trimmed.startsWith('#')) {
197
+ const hex = trimmed.slice(1);
198
+ if (/^[0-9a-fA-F]{6}$/.test(hex)) {
199
+ const r = parseInt(hex.slice(0, 2), 16);
200
+ const g = parseInt(hex.slice(2, 4), 16);
201
+ const b = parseInt(hex.slice(4, 6), 16);
202
+ return { ok: true, normalized: `${r}:${g}:${b}` };
203
+ }
204
+ if (/^[0-9a-fA-F]{3}$/.test(hex)) {
205
+ const r = parseInt(hex[0] + hex[0], 16);
206
+ const g = parseInt(hex[1] + hex[1], 16);
207
+ const b = parseInt(hex[2] + hex[2], 16);
208
+ return { ok: true, normalized: `${r}:${g}:${b}` };
209
+ }
210
+ return {
211
+ ok: false,
212
+ error: `setColor "${raw}" is not valid hex. ${hintColorRetry()}`,
213
+ };
214
+ }
215
+ // R:G:B or R,G,B — pick whichever separator appears.
216
+ const sep = trimmed.includes(':') ? ':' : trimmed.includes(',') ? ',' : null;
217
+ if (!sep) {
218
+ return {
219
+ ok: false,
220
+ error: `setColor "${raw}" is not a recognized format. ${hintColorRetry()}`,
221
+ };
222
+ }
223
+ const parts = trimmed.split(sep).map((s) => s.trim());
224
+ if (parts.length !== 3) {
225
+ return {
226
+ ok: false,
227
+ error: `setColor expects 3 components (R${sep}G${sep}B), got ${parts.length} (${JSON.stringify(raw)}). ${hintColorRetry()}`,
228
+ };
229
+ }
230
+ const nums = [];
231
+ for (const p of parts) {
232
+ if (!/^-?\d+$/.test(p)) {
233
+ return {
234
+ ok: false,
235
+ error: `setColor component "${p}" is not an integer. ${hintColorRetry()}`,
236
+ };
237
+ }
238
+ const n = Number(p);
239
+ if (!Number.isInteger(n) || n < 0 || n > 255) {
240
+ return {
241
+ ok: false,
242
+ error: `setColor components must be integers 0-255, got "${p}". ${hintColorRetry()}`,
243
+ };
244
+ }
245
+ nums.push(n);
246
+ }
247
+ return { ok: true, normalized: `${nums[0]}:${nums[1]}:${nums[2]}` };
248
+ }
249
+ function hintColorRetry() {
250
+ return `Expected "R:G:B" (e.g. "255:0:0"), "#RRGGBB", "#RGB", "R,G,B", or a named color.`;
251
+ }
252
+ function validateSetColorTemperature(raw) {
253
+ if (raw === undefined || raw === '' || raw === 'default') {
254
+ return {
255
+ ok: false,
256
+ error: `setColorTemperature requires an integer Kelvin value 2700-6500. Example: "4000".`,
257
+ };
258
+ }
259
+ const trimmed = raw.trim();
260
+ if (!/^-?\d+$/.test(trimmed)) {
261
+ return {
262
+ ok: false,
263
+ error: `setColorTemperature must be an integer 2700-6500, got ${JSON.stringify(raw)}.`,
264
+ };
265
+ }
266
+ const n = Number(trimmed);
267
+ if (!Number.isInteger(n) || n < 2700 || n > 6500) {
268
+ return {
269
+ ok: false,
270
+ error: `setColorTemperature must be an integer 2700-6500, got "${raw}".`,
271
+ };
272
+ }
273
+ return { ok: true, normalized: String(n) };
274
+ }
275
+ function validateAcSetAll(raw) {
276
+ if (raw === undefined || raw === '' || raw === 'default') {
277
+ return {
278
+ ok: false,
279
+ error: `setAll requires a parameter "<temp>,<mode>,<fan>,<on|off>". Example: "26,2,2,on".`,
280
+ };
281
+ }
282
+ if (raw.startsWith('{') || raw.startsWith('[')) {
283
+ return {
284
+ ok: false,
285
+ error: `setAll parameter must be a CSV string like "26,2,2,on", not JSON (got ${JSON.stringify(raw)}).`,
286
+ };
287
+ }
288
+ const parts = raw.split(',');
289
+ if (parts.length !== 4) {
290
+ return {
291
+ ok: false,
292
+ error: `setAll expects 4 comma-separated fields "<temp>,<mode>,<fan>,<on|off>", got ${parts.length} (${JSON.stringify(raw)}). Example: "26,2,2,on".`,
293
+ };
294
+ }
295
+ const [tempStr, modeStr, fanStr, powerStr] = parts.map((s) => s.trim());
296
+ const temp = Number(tempStr);
297
+ if (!Number.isInteger(temp) || temp < 16 || temp > 30) {
298
+ return {
299
+ ok: false,
300
+ error: `setAll field 1 (temp) must be an integer 16-30, got "${tempStr}". Example: "26,2,2,on".`,
301
+ };
302
+ }
303
+ const mode = Number(modeStr);
304
+ if (!Number.isInteger(mode) || mode < 1 || mode > 5) {
305
+ return {
306
+ ok: false,
307
+ error: `setAll field 2 (mode) must be 1-5 (1=auto 2=cool 3=dry 4=fan 5=heat), got "${modeStr}". Example: "26,2,2,on".`,
308
+ };
309
+ }
310
+ const fan = Number(fanStr);
311
+ if (!Number.isInteger(fan) || fan < 1 || fan > 4) {
312
+ return {
313
+ ok: false,
314
+ error: `setAll field 3 (fan) must be 1-4 (1=auto 2=low 3=mid 4=high), got "${fanStr}". Example: "26,2,2,on".`,
315
+ };
316
+ }
317
+ const power = powerStr.toLowerCase();
318
+ if (power !== 'on' && power !== 'off') {
319
+ return {
320
+ ok: false,
321
+ error: `setAll field 4 (power) must be "on" or "off", got "${powerStr}". Example: "26,2,2,on".`,
322
+ };
323
+ }
324
+ return { ok: true, normalized: `${temp},${mode},${fan},${power}` };
325
+ }
326
+ function validateCurtainSetPosition(raw) {
327
+ if (raw === undefined || raw === '' || raw === 'default') {
328
+ return {
329
+ ok: false,
330
+ error: `setPosition requires a parameter. Expected: "<0-100>" or "<index>,<ff|0|1>,<0-100>". Example: "50" or "0,ff,50".`,
331
+ };
332
+ }
333
+ if (!raw.includes(',')) {
334
+ const pos = Number(raw);
335
+ if (!Number.isInteger(pos) || pos < 0 || pos > 100) {
336
+ return {
337
+ ok: false,
338
+ error: `setPosition must be an integer 0-100, got "${raw}". Example: "50".`,
339
+ };
340
+ }
341
+ return { ok: true, normalized: String(pos) };
342
+ }
343
+ const parts = raw.split(',').map((s) => s.trim());
344
+ if (parts.length !== 3) {
345
+ return {
346
+ ok: false,
347
+ error: `setPosition tuple form expects 3 comma-separated fields "<index>,<ff|0|1>,<0-100>", got ${parts.length} (${JSON.stringify(raw)}).`,
348
+ };
349
+ }
350
+ const [idxStr, modeStr, posStr] = parts;
351
+ const idx = Number(idxStr);
352
+ if (!Number.isInteger(idx) || idx < 0) {
353
+ return {
354
+ ok: false,
355
+ error: `setPosition field 1 (index) must be a non-negative integer, got "${idxStr}".`,
356
+ };
357
+ }
358
+ const modeLower = modeStr.toLowerCase();
359
+ if (!['ff', '0', '1'].includes(modeLower)) {
360
+ return {
361
+ ok: false,
362
+ error: `setPosition field 2 (mode) must be "ff", "0", or "1", got "${modeStr}". (ff=default, 0=performance, 1=silent)`,
363
+ };
364
+ }
365
+ const pos = Number(posStr);
366
+ if (!Number.isInteger(pos) || pos < 0 || pos > 100) {
367
+ return {
368
+ ok: false,
369
+ error: `setPosition field 3 (position) must be an integer 0-100, got "${posStr}".`,
370
+ };
371
+ }
372
+ return { ok: true, normalized: `${idx},${modeLower},${pos}` };
373
+ }
374
+ function validateBlindTiltSetPosition(raw) {
375
+ if (raw === undefined || raw === '' || raw === 'default') {
376
+ return {
377
+ ok: false,
378
+ error: `Blind Tilt setPosition requires a parameter. Expected: "<up|down>;<0-100>". Example: "up;50".`,
379
+ };
380
+ }
381
+ const parts = raw.split(';');
382
+ if (parts.length !== 2) {
383
+ return {
384
+ ok: false,
385
+ error: `Blind Tilt setPosition expects "<up|down>;<angle>", got ${JSON.stringify(raw)}. Example: "up;50".`,
386
+ };
387
+ }
388
+ const dir = parts[0].toLowerCase();
389
+ if (!BLIND_DIRECTION.has(dir)) {
390
+ return {
391
+ ok: false,
392
+ error: `Blind Tilt setPosition direction must be "up" or "down", got "${parts[0]}".`,
393
+ };
394
+ }
395
+ const angle = Number(parts[1]);
396
+ if (!Number.isInteger(angle) || angle < 0 || angle > 100) {
397
+ return {
398
+ ok: false,
399
+ error: `Blind Tilt setPosition angle must be an integer 0-100, got "${parts[1]}".`,
400
+ };
401
+ }
402
+ return { ok: true, normalized: `${dir};${angle}` };
403
+ }
404
+ function validateRelaySetMode(raw) {
405
+ if (raw === undefined || raw === '' || raw === 'default') {
406
+ return {
407
+ ok: false,
408
+ error: `Relay Switch setMode requires a parameter. Expected: "<1|2>;<0|1|2|3>". Example: "1;1" (channel 1, edge mode).`,
409
+ };
410
+ }
411
+ const parts = raw.split(';');
412
+ if (parts.length !== 2) {
413
+ return {
414
+ ok: false,
415
+ error: `Relay Switch setMode expects "<channel>;<mode>", got ${JSON.stringify(raw)}. Example: "1;1".`,
416
+ };
417
+ }
418
+ const ch = Number(parts[0]);
419
+ if (ch !== 1 && ch !== 2) {
420
+ return {
421
+ ok: false,
422
+ error: `Relay Switch setMode channel must be 1 or 2, got "${parts[0]}".`,
423
+ };
424
+ }
425
+ const mode = Number(parts[1]);
426
+ if (!Number.isInteger(mode) || mode < 0 || mode > 3) {
427
+ return {
428
+ ok: false,
429
+ error: `Relay Switch setMode mode must be 0-3 (0=toggle 1=edge 2=detached 3=momentary), got "${parts[1]}".`,
430
+ };
431
+ }
432
+ return { ok: true, normalized: `${ch};${mode}` };
433
+ }
434
+ //# sourceMappingURL=param-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"param-validator.js","sourceRoot":"","sources":["../../src/devices/param-validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Declarative metadata for non-device resources exposed by the SwitchBot API:
3
+ * scenes, webhooks, and keypad credentials ("keys").
4
+ *
5
+ * Consumed by `capabilities --json` and `schema export` so AI agents can
6
+ * discover these surfaces the same way they discover device commands.
7
+ *
8
+ * Scope:
9
+ * - Descriptive metadata only (no runtime execution — CLI/MCP handlers stay
10
+ * source-of-truth for behavior).
11
+ * - Webhook event list is derived from the device catalog and is advisory —
12
+ * not every SwitchBot device actually pushes every listed event; refer to
13
+ * the SwitchBot webhook docs for authoritative shapes.
14
+ */
15
+ export type ResourceSafetyTier = 'read' | 'mutation' | 'destructive';
16
+ export interface SceneOperation {
17
+ verb: 'list' | 'execute' | 'describe';
18
+ method: 'GET' | 'POST';
19
+ endpoint: string;
20
+ params: ReadonlyArray<{
21
+ name: string;
22
+ required: boolean;
23
+ type: string;
24
+ }>;
25
+ safetyTier: ResourceSafetyTier;
26
+ }
27
+ export interface SceneSpec {
28
+ description: string;
29
+ operations: ReadonlyArray<SceneOperation>;
30
+ }
31
+ export interface WebhookEndpoint {
32
+ verb: 'setup' | 'query' | 'update' | 'delete';
33
+ method: 'POST';
34
+ path: string;
35
+ safetyTier: ResourceSafetyTier;
36
+ requiredParams: ReadonlyArray<string>;
37
+ }
38
+ export interface WebhookEventField {
39
+ name: string;
40
+ type: 'string' | 'number' | 'boolean' | 'timestamp';
41
+ description: string;
42
+ example?: unknown;
43
+ }
44
+ export interface WebhookEventSpec {
45
+ eventType: string;
46
+ devicePattern: string;
47
+ fields: ReadonlyArray<WebhookEventField>;
48
+ }
49
+ export interface WebhookCatalog {
50
+ endpoints: ReadonlyArray<WebhookEndpoint>;
51
+ events: ReadonlyArray<WebhookEventSpec>;
52
+ constraints: {
53
+ maxUrlLength: number;
54
+ maxWebhooksPerAccount: number;
55
+ };
56
+ }
57
+ export interface KeySpec {
58
+ keyType: 'permanent' | 'timeLimit' | 'disposable' | 'urgent';
59
+ description: string;
60
+ requiredParams: ReadonlyArray<string>;
61
+ optionalParams: ReadonlyArray<string>;
62
+ supportedDevices: ReadonlyArray<string>;
63
+ safetyTier: 'destructive';
64
+ }
65
+ export interface ResourceCatalog {
66
+ scenes: SceneSpec;
67
+ webhooks: WebhookCatalog;
68
+ keys: ReadonlyArray<KeySpec>;
69
+ }
70
+ export declare const RESOURCE_CATALOG: ResourceCatalog;
71
+ /** Convenience: return the list of known webhook event types. */
72
+ export declare function listWebhookEventTypes(): string[];
73
+ /** Convenience: return the list of supported keypad key types. */
74
+ export declare function listKeyTypes(): string[];