@switchbot/openapi-cli 3.2.1 → 3.3.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 (332) hide show
  1. package/README.md +3 -1
  2. package/dist/index.js +57419 -170
  3. package/package.json +9 -5
  4. package/dist/api/client.d.ts +0 -31
  5. package/dist/api/client.js +0 -236
  6. package/dist/api/client.js.map +0 -1
  7. package/dist/auth.d.ts +0 -1
  8. package/dist/auth.js +0 -21
  9. package/dist/auth.js.map +0 -1
  10. package/dist/commands/agent-bootstrap.d.ts +0 -10
  11. package/dist/commands/agent-bootstrap.js +0 -200
  12. package/dist/commands/agent-bootstrap.js.map +0 -1
  13. package/dist/commands/auth.d.ts +0 -18
  14. package/dist/commands/auth.js +0 -355
  15. package/dist/commands/auth.js.map +0 -1
  16. package/dist/commands/batch.d.ts +0 -2
  17. package/dist/commands/batch.js +0 -414
  18. package/dist/commands/batch.js.map +0 -1
  19. package/dist/commands/cache.d.ts +0 -2
  20. package/dist/commands/cache.js +0 -127
  21. package/dist/commands/cache.js.map +0 -1
  22. package/dist/commands/capabilities.d.ts +0 -31
  23. package/dist/commands/capabilities.js +0 -383
  24. package/dist/commands/capabilities.js.map +0 -1
  25. package/dist/commands/catalog.d.ts +0 -2
  26. package/dist/commands/catalog.js +0 -360
  27. package/dist/commands/catalog.js.map +0 -1
  28. package/dist/commands/completion.d.ts +0 -2
  29. package/dist/commands/completion.js +0 -386
  30. package/dist/commands/completion.js.map +0 -1
  31. package/dist/commands/config.d.ts +0 -21
  32. package/dist/commands/config.js +0 -377
  33. package/dist/commands/config.js.map +0 -1
  34. package/dist/commands/daemon.d.ts +0 -2
  35. package/dist/commands/daemon.js +0 -411
  36. package/dist/commands/daemon.js.map +0 -1
  37. package/dist/commands/device-meta.d.ts +0 -2
  38. package/dist/commands/device-meta.js +0 -160
  39. package/dist/commands/device-meta.js.map +0 -1
  40. package/dist/commands/devices.d.ts +0 -2
  41. package/dist/commands/devices.js +0 -949
  42. package/dist/commands/devices.js.map +0 -1
  43. package/dist/commands/doctor.d.ts +0 -3
  44. package/dist/commands/doctor.js +0 -1016
  45. package/dist/commands/doctor.js.map +0 -1
  46. package/dist/commands/events.d.ts +0 -31
  47. package/dist/commands/events.js +0 -564
  48. package/dist/commands/events.js.map +0 -1
  49. package/dist/commands/expand.d.ts +0 -2
  50. package/dist/commands/expand.js +0 -131
  51. package/dist/commands/expand.js.map +0 -1
  52. package/dist/commands/explain.d.ts +0 -2
  53. package/dist/commands/explain.js +0 -140
  54. package/dist/commands/explain.js.map +0 -1
  55. package/dist/commands/health.d.ts +0 -8
  56. package/dist/commands/health.js +0 -114
  57. package/dist/commands/health.js.map +0 -1
  58. package/dist/commands/history.d.ts +0 -2
  59. package/dist/commands/history.js +0 -321
  60. package/dist/commands/history.js.map +0 -1
  61. package/dist/commands/identity.d.ts +0 -45
  62. package/dist/commands/identity.js +0 -60
  63. package/dist/commands/identity.js.map +0 -1
  64. package/dist/commands/install.d.ts +0 -20
  65. package/dist/commands/install.js +0 -247
  66. package/dist/commands/install.js.map +0 -1
  67. package/dist/commands/mcp.d.ts +0 -14
  68. package/dist/commands/mcp.js +0 -2018
  69. package/dist/commands/mcp.js.map +0 -1
  70. package/dist/commands/plan.d.ts +0 -51
  71. package/dist/commands/plan.js +0 -654
  72. package/dist/commands/plan.js.map +0 -1
  73. package/dist/commands/policy.d.ts +0 -24
  74. package/dist/commands/policy.js +0 -587
  75. package/dist/commands/policy.js.map +0 -1
  76. package/dist/commands/quota.d.ts +0 -2
  77. package/dist/commands/quota.js +0 -79
  78. package/dist/commands/quota.js.map +0 -1
  79. package/dist/commands/rules.d.ts +0 -2
  80. package/dist/commands/rules.js +0 -876
  81. package/dist/commands/rules.js.map +0 -1
  82. package/dist/commands/scenes.d.ts +0 -2
  83. package/dist/commands/scenes.js +0 -265
  84. package/dist/commands/scenes.js.map +0 -1
  85. package/dist/commands/schema.d.ts +0 -2
  86. package/dist/commands/schema.js +0 -185
  87. package/dist/commands/schema.js.map +0 -1
  88. package/dist/commands/status-sync.d.ts +0 -2
  89. package/dist/commands/status-sync.js +0 -132
  90. package/dist/commands/status-sync.js.map +0 -1
  91. package/dist/commands/uninstall.d.ts +0 -20
  92. package/dist/commands/uninstall.js +0 -238
  93. package/dist/commands/uninstall.js.map +0 -1
  94. package/dist/commands/upgrade-check.d.ts +0 -2
  95. package/dist/commands/upgrade-check.js +0 -107
  96. package/dist/commands/upgrade-check.js.map +0 -1
  97. package/dist/commands/watch.d.ts +0 -2
  98. package/dist/commands/watch.js +0 -195
  99. package/dist/commands/watch.js.map +0 -1
  100. package/dist/commands/webhook.d.ts +0 -2
  101. package/dist/commands/webhook.js +0 -183
  102. package/dist/commands/webhook.js.map +0 -1
  103. package/dist/config.d.ts +0 -57
  104. package/dist/config.js +0 -259
  105. package/dist/config.js.map +0 -1
  106. package/dist/credentials/backends/file.d.ts +0 -18
  107. package/dist/credentials/backends/file.js +0 -102
  108. package/dist/credentials/backends/file.js.map +0 -1
  109. package/dist/credentials/backends/linux.d.ts +0 -16
  110. package/dist/credentials/backends/linux.js +0 -130
  111. package/dist/credentials/backends/linux.js.map +0 -1
  112. package/dist/credentials/backends/macos.d.ts +0 -18
  113. package/dist/credentials/backends/macos.js +0 -130
  114. package/dist/credentials/backends/macos.js.map +0 -1
  115. package/dist/credentials/backends/windows.d.ts +0 -23
  116. package/dist/credentials/backends/windows.js +0 -216
  117. package/dist/credentials/backends/windows.js.map +0 -1
  118. package/dist/credentials/keychain.d.ts +0 -83
  119. package/dist/credentials/keychain.js +0 -89
  120. package/dist/credentials/keychain.js.map +0 -1
  121. package/dist/credentials/prime.d.ts +0 -32
  122. package/dist/credentials/prime.js +0 -53
  123. package/dist/credentials/prime.js.map +0 -1
  124. package/dist/devices/cache.d.ts +0 -79
  125. package/dist/devices/cache.js +0 -294
  126. package/dist/devices/cache.js.map +0 -1
  127. package/dist/devices/catalog.d.ts +0 -138
  128. package/dist/devices/catalog.js +0 -768
  129. package/dist/devices/catalog.js.map +0 -1
  130. package/dist/devices/device-meta.d.ts +0 -15
  131. package/dist/devices/device-meta.js +0 -57
  132. package/dist/devices/device-meta.js.map +0 -1
  133. package/dist/devices/history-agg.d.ts +0 -37
  134. package/dist/devices/history-agg.js +0 -139
  135. package/dist/devices/history-agg.js.map +0 -1
  136. package/dist/devices/history-query.d.ts +0 -45
  137. package/dist/devices/history-query.js +0 -182
  138. package/dist/devices/history-query.js.map +0 -1
  139. package/dist/devices/param-validator.d.ts +0 -40
  140. package/dist/devices/param-validator.js +0 -434
  141. package/dist/devices/param-validator.js.map +0 -1
  142. package/dist/devices/resources.d.ts +0 -74
  143. package/dist/devices/resources.js +0 -271
  144. package/dist/devices/resources.js.map +0 -1
  145. package/dist/index.d.ts +0 -1
  146. package/dist/index.js.map +0 -1
  147. package/dist/install/default-steps.d.ts +0 -66
  148. package/dist/install/default-steps.js +0 -258
  149. package/dist/install/default-steps.js.map +0 -1
  150. package/dist/install/preflight.d.ts +0 -60
  151. package/dist/install/preflight.js +0 -213
  152. package/dist/install/preflight.js.map +0 -1
  153. package/dist/install/steps.d.ts +0 -61
  154. package/dist/install/steps.js +0 -68
  155. package/dist/install/steps.js.map +0 -1
  156. package/dist/lib/command-keywords.d.ts +0 -5
  157. package/dist/lib/command-keywords.js +0 -18
  158. package/dist/lib/command-keywords.js.map +0 -1
  159. package/dist/lib/daemon-state.d.ts +0 -24
  160. package/dist/lib/daemon-state.js +0 -47
  161. package/dist/lib/daemon-state.js.map +0 -1
  162. package/dist/lib/destructive-mode.d.ts +0 -2
  163. package/dist/lib/destructive-mode.js +0 -13
  164. package/dist/lib/destructive-mode.js.map +0 -1
  165. package/dist/lib/devices.d.ts +0 -151
  166. package/dist/lib/devices.js +0 -383
  167. package/dist/lib/devices.js.map +0 -1
  168. package/dist/lib/idempotency.d.ts +0 -46
  169. package/dist/lib/idempotency.js +0 -107
  170. package/dist/lib/idempotency.js.map +0 -1
  171. package/dist/lib/plan-store.d.ts +0 -19
  172. package/dist/lib/plan-store.js +0 -69
  173. package/dist/lib/plan-store.js.map +0 -1
  174. package/dist/lib/request-context.d.ts +0 -7
  175. package/dist/lib/request-context.js +0 -13
  176. package/dist/lib/request-context.js.map +0 -1
  177. package/dist/lib/scenes.d.ts +0 -7
  178. package/dist/lib/scenes.js +0 -11
  179. package/dist/lib/scenes.js.map +0 -1
  180. package/dist/logger.d.ts +0 -4
  181. package/dist/logger.js +0 -17
  182. package/dist/logger.js.map +0 -1
  183. package/dist/mcp/device-history.d.ts +0 -36
  184. package/dist/mcp/device-history.js +0 -146
  185. package/dist/mcp/device-history.js.map +0 -1
  186. package/dist/mcp/events-subscription.d.ts +0 -45
  187. package/dist/mcp/events-subscription.js +0 -214
  188. package/dist/mcp/events-subscription.js.map +0 -1
  189. package/dist/mqtt/client.d.ts +0 -25
  190. package/dist/mqtt/client.js +0 -181
  191. package/dist/mqtt/client.js.map +0 -1
  192. package/dist/mqtt/credential.d.ts +0 -16
  193. package/dist/mqtt/credential.js +0 -31
  194. package/dist/mqtt/credential.js.map +0 -1
  195. package/dist/policy/add-rule.d.ts +0 -21
  196. package/dist/policy/add-rule.js +0 -125
  197. package/dist/policy/add-rule.js.map +0 -1
  198. package/dist/policy/diff.d.ts +0 -21
  199. package/dist/policy/diff.js +0 -92
  200. package/dist/policy/diff.js.map +0 -1
  201. package/dist/policy/format.d.ts +0 -6
  202. package/dist/policy/format.js +0 -58
  203. package/dist/policy/format.js.map +0 -1
  204. package/dist/policy/load.d.ts +0 -32
  205. package/dist/policy/load.js +0 -62
  206. package/dist/policy/load.js.map +0 -1
  207. package/dist/policy/migrate.d.ts +0 -21
  208. package/dist/policy/migrate.js +0 -68
  209. package/dist/policy/migrate.js.map +0 -1
  210. package/dist/policy/schema.d.ts +0 -5
  211. package/dist/policy/schema.js +0 -19
  212. package/dist/policy/schema.js.map +0 -1
  213. package/dist/policy/validate.d.ts +0 -19
  214. package/dist/policy/validate.js +0 -263
  215. package/dist/policy/validate.js.map +0 -1
  216. package/dist/rules/action.d.ts +0 -65
  217. package/dist/rules/action.js +0 -217
  218. package/dist/rules/action.js.map +0 -1
  219. package/dist/rules/audit-query.d.ts +0 -51
  220. package/dist/rules/audit-query.js +0 -90
  221. package/dist/rules/audit-query.js.map +0 -1
  222. package/dist/rules/conflict-analyzer.d.ts +0 -57
  223. package/dist/rules/conflict-analyzer.js +0 -215
  224. package/dist/rules/conflict-analyzer.js.map +0 -1
  225. package/dist/rules/cron-scheduler.d.ts +0 -62
  226. package/dist/rules/cron-scheduler.js +0 -187
  227. package/dist/rules/cron-scheduler.js.map +0 -1
  228. package/dist/rules/destructive.d.ts +0 -20
  229. package/dist/rules/destructive.js +0 -53
  230. package/dist/rules/destructive.js.map +0 -1
  231. package/dist/rules/engine.d.ts +0 -193
  232. package/dist/rules/engine.js +0 -758
  233. package/dist/rules/engine.js.map +0 -1
  234. package/dist/rules/matcher.d.ts +0 -56
  235. package/dist/rules/matcher.js +0 -231
  236. package/dist/rules/matcher.js.map +0 -1
  237. package/dist/rules/pid-file.d.ts +0 -43
  238. package/dist/rules/pid-file.js +0 -96
  239. package/dist/rules/pid-file.js.map +0 -1
  240. package/dist/rules/quiet-hours.d.ts +0 -26
  241. package/dist/rules/quiet-hours.js +0 -46
  242. package/dist/rules/quiet-hours.js.map +0 -1
  243. package/dist/rules/suggest.d.ts +0 -20
  244. package/dist/rules/suggest.js +0 -96
  245. package/dist/rules/suggest.js.map +0 -1
  246. package/dist/rules/throttle.d.ts +0 -61
  247. package/dist/rules/throttle.js +0 -117
  248. package/dist/rules/throttle.js.map +0 -1
  249. package/dist/rules/types.d.ts +0 -117
  250. package/dist/rules/types.js +0 -35
  251. package/dist/rules/types.js.map +0 -1
  252. package/dist/rules/webhook-listener.d.ts +0 -63
  253. package/dist/rules/webhook-listener.js +0 -224
  254. package/dist/rules/webhook-listener.js.map +0 -1
  255. package/dist/rules/webhook-token.d.ts +0 -50
  256. package/dist/rules/webhook-token.js +0 -91
  257. package/dist/rules/webhook-token.js.map +0 -1
  258. package/dist/schema/field-aliases.d.ts +0 -34
  259. package/dist/schema/field-aliases.js +0 -132
  260. package/dist/schema/field-aliases.js.map +0 -1
  261. package/dist/sinks/dispatcher.d.ts +0 -7
  262. package/dist/sinks/dispatcher.js +0 -13
  263. package/dist/sinks/dispatcher.js.map +0 -1
  264. package/dist/sinks/file.d.ts +0 -6
  265. package/dist/sinks/file.js +0 -20
  266. package/dist/sinks/file.js.map +0 -1
  267. package/dist/sinks/format.d.ts +0 -20
  268. package/dist/sinks/format.js +0 -57
  269. package/dist/sinks/format.js.map +0 -1
  270. package/dist/sinks/homeassistant.d.ts +0 -18
  271. package/dist/sinks/homeassistant.js +0 -45
  272. package/dist/sinks/homeassistant.js.map +0 -1
  273. package/dist/sinks/openclaw.d.ts +0 -13
  274. package/dist/sinks/openclaw.js +0 -34
  275. package/dist/sinks/openclaw.js.map +0 -1
  276. package/dist/sinks/stdout.d.ts +0 -4
  277. package/dist/sinks/stdout.js +0 -6
  278. package/dist/sinks/stdout.js.map +0 -1
  279. package/dist/sinks/telegram.d.ts +0 -11
  280. package/dist/sinks/telegram.js +0 -29
  281. package/dist/sinks/telegram.js.map +0 -1
  282. package/dist/sinks/types.d.ts +0 -13
  283. package/dist/sinks/types.js +0 -2
  284. package/dist/sinks/types.js.map +0 -1
  285. package/dist/sinks/webhook.d.ts +0 -6
  286. package/dist/sinks/webhook.js +0 -23
  287. package/dist/sinks/webhook.js.map +0 -1
  288. package/dist/status-sync/manager.d.ts +0 -48
  289. package/dist/status-sync/manager.js +0 -269
  290. package/dist/status-sync/manager.js.map +0 -1
  291. package/dist/utils/arg-parsers.d.ts +0 -16
  292. package/dist/utils/arg-parsers.js +0 -67
  293. package/dist/utils/arg-parsers.js.map +0 -1
  294. package/dist/utils/audit.d.ts +0 -69
  295. package/dist/utils/audit.js +0 -122
  296. package/dist/utils/audit.js.map +0 -1
  297. package/dist/utils/filter.d.ts +0 -81
  298. package/dist/utils/filter.js +0 -190
  299. package/dist/utils/filter.js.map +0 -1
  300. package/dist/utils/flags.d.ts +0 -72
  301. package/dist/utils/flags.js +0 -187
  302. package/dist/utils/flags.js.map +0 -1
  303. package/dist/utils/format.d.ts +0 -9
  304. package/dist/utils/format.js +0 -118
  305. package/dist/utils/format.js.map +0 -1
  306. package/dist/utils/health.d.ts +0 -48
  307. package/dist/utils/health.js +0 -102
  308. package/dist/utils/health.js.map +0 -1
  309. package/dist/utils/help-json.d.ts +0 -39
  310. package/dist/utils/help-json.js +0 -55
  311. package/dist/utils/help-json.js.map +0 -1
  312. package/dist/utils/name-resolver.d.ts +0 -26
  313. package/dist/utils/name-resolver.js +0 -138
  314. package/dist/utils/name-resolver.js.map +0 -1
  315. package/dist/utils/output.d.ts +0 -73
  316. package/dist/utils/output.js +0 -405
  317. package/dist/utils/output.js.map +0 -1
  318. package/dist/utils/quota.d.ts +0 -61
  319. package/dist/utils/quota.js +0 -228
  320. package/dist/utils/quota.js.map +0 -1
  321. package/dist/utils/redact.d.ts +0 -23
  322. package/dist/utils/redact.js +0 -69
  323. package/dist/utils/redact.js.map +0 -1
  324. package/dist/utils/retry.d.ts +0 -72
  325. package/dist/utils/retry.js +0 -141
  326. package/dist/utils/retry.js.map +0 -1
  327. package/dist/utils/string.d.ts +0 -2
  328. package/dist/utils/string.js +0 -23
  329. package/dist/utils/string.js.map +0 -1
  330. package/dist/version.d.ts +0 -2
  331. package/dist/version.js +0 -5
  332. package/dist/version.js.map +0 -1
@@ -1,434 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"param-validator.js","sourceRoot":"","sources":["../../src/devices/param-validator.ts"],"names":[],"mappings":"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"}
@@ -1,74 +0,0 @@
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[];