@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,151 +0,0 @@
1
- import type { AxiosInstance } from 'axios';
2
- import { suggestedActions, type DeviceCatalogEntry, type CommandSpec } from '../devices/catalog.js';
3
- export interface Device {
4
- deviceId: string;
5
- deviceName: string;
6
- deviceType?: string;
7
- enableCloudService: boolean;
8
- hubDeviceId: string;
9
- roomID?: string;
10
- roomName?: string | null;
11
- familyName?: string;
12
- controlType?: string;
13
- }
14
- export interface InfraredDevice {
15
- deviceId: string;
16
- deviceName: string;
17
- remoteType: string;
18
- hubDeviceId: string;
19
- controlType?: string;
20
- }
21
- export interface DeviceListBody {
22
- deviceList: Device[];
23
- infraredRemoteList: InfraredDevice[];
24
- }
25
- export interface DescribeCapabilities {
26
- role: string | null;
27
- readOnly: boolean;
28
- commands: CommandSpec[];
29
- statusFields: string[];
30
- liveStatus?: Record<string, unknown>;
31
- }
32
- export interface DescribeResult {
33
- device: Device | InfraredDevice;
34
- isPhysical: boolean;
35
- typeName: string;
36
- controlType: string | null;
37
- catalog: DeviceCatalogEntry | null;
38
- capabilities: DescribeCapabilities | {
39
- liveStatus: Record<string, unknown>;
40
- } | null;
41
- source: 'catalog' | 'live' | 'catalog+live' | 'none';
42
- suggestedActions: ReturnType<typeof suggestedActions>;
43
- /** For IR remotes: the family/room inherited from their bound Hub. Undefined for physical devices. */
44
- inheritedLocation?: {
45
- family?: string;
46
- room?: string;
47
- roomID?: string;
48
- };
49
- }
50
- export declare class DeviceNotFoundError extends Error {
51
- readonly deviceId: string;
52
- constructor(deviceId: string);
53
- }
54
- export declare class CommandValidationError extends Error {
55
- readonly kind: 'read-only-device' | 'unknown-command' | 'unexpected-parameter' | 'missing-parameter';
56
- readonly hint?: string | undefined;
57
- constructor(message: string, kind: 'read-only-device' | 'unknown-command' | 'unexpected-parameter' | 'missing-parameter', hint?: string | undefined);
58
- }
59
- /** Fetch the full device + IR remote inventory and refresh the local cache. */
60
- export declare function fetchDeviceList(client?: AxiosInstance): Promise<DeviceListBody>;
61
- /** Fetch live status for a single physical device. IR remotes have no status channel. */
62
- export declare function fetchDeviceStatus(deviceId: string, client?: AxiosInstance): Promise<Record<string, unknown>>;
63
- /**
64
- * Execute a command on a device. `parameter` is the fully-parsed value already
65
- * (JSON-object when applicable), not a raw CLI string — callers should parse
66
- * upstream if needed.
67
- */
68
- export declare function executeCommand(deviceId: string, cmd: string, parameter: unknown, commandType: 'command' | 'customize', client?: AxiosInstance, options?: {
69
- idempotencyKey?: string;
70
- planId?: string;
71
- }): Promise<unknown>;
72
- /**
73
- * Validate a command against the locally-cached device → catalog mapping.
74
- * Returns `{ ok: true }` when validation passes or is skipped (unknown device,
75
- * custom IR button, etc.). On a case-only mismatch the canonical command name
76
- * is returned via `normalized` along with a `caseNormalizedFrom` field so the
77
- * caller can emit a warning and continue with the canonical name.
78
- * Returns `{ ok: false, error }` only when the caller should refuse the call.
79
- */
80
- export declare function validateCommand(deviceId: string, cmd: string, parameter: string | undefined, commandType: string): {
81
- ok: true;
82
- normalized?: string;
83
- caseNormalizedFrom?: string;
84
- } | {
85
- ok: false;
86
- error: CommandValidationError;
87
- };
88
- /**
89
- * Inspect catalog annotations to decide whether a command is destructive,
90
- * i.e. has hard-to-reverse real-world effects and should require an explicit
91
- * confirmation from an agent / operator before execution. Customize commands
92
- * are considered non-destructive here — they're user-defined IR buttons
93
- * whose behavior the catalog can't know about.
94
- */
95
- export declare function isDestructiveCommand(deviceType: string | undefined, cmd: string, commandType: string): boolean;
96
- /** Return the safetyReason for a command, or null if not destructive / not found. */
97
- export declare function getDestructiveReason(deviceType: string | undefined, cmd: string, commandType: string): string | null;
98
- /**
99
- * Describe a device by id: metadata + catalog entry (if known) +
100
- * optional live status. Throws `DeviceNotFoundError` when the id is unknown.
101
- */
102
- export declare function describeDevice(deviceId: string, options?: {
103
- live?: boolean;
104
- }, client?: AxiosInstance): Promise<DescribeResult>;
105
- /** Build a map from hubDeviceId → room/family/roomID for IR-remote inheritance. */
106
- export declare function buildHubLocationMap(deviceList: Device[]): Map<string, {
107
- family?: string;
108
- room?: string;
109
- roomID?: string;
110
- }>;
111
- /**
112
- * Search the local catalog by type name / alias. Returns up to `limit`
113
- * entries whose type or alias contains the query (case-insensitive).
114
- * Intended for MCP's `search_catalog` tool — not for dispatching commands.
115
- */
116
- export declare function searchCatalog(query: string, limit?: number): DeviceCatalogEntry[];
117
- /** Shape expected by the MCP describe_device outputSchema. */
118
- export interface McpDescribeShape {
119
- device: {
120
- deviceId: string;
121
- deviceName: string;
122
- deviceType?: string;
123
- enableCloudService?: boolean;
124
- hubDeviceId?: string;
125
- roomID?: string;
126
- roomName?: string | null;
127
- familyName?: string;
128
- controlType?: string;
129
- remoteType?: string;
130
- };
131
- isPhysical: boolean;
132
- typeName: string;
133
- controlType: string | null;
134
- source: 'catalog' | 'live' | 'catalog+live' | 'none';
135
- capabilities: unknown;
136
- suggestedActions: Array<{
137
- command: string;
138
- parameter?: string;
139
- description: string;
140
- }>;
141
- inheritedLocation?: {
142
- family?: string;
143
- room?: string;
144
- };
145
- }
146
- /** Convert a DescribeResult to the shape validated by the MCP outputSchema. */
147
- export declare function toMcpDescribeShape(r: DescribeResult): McpDescribeShape;
148
- /** Shapes the device list body for the MCP list_devices outputSchema. */
149
- export declare function toMcpDeviceListShape(d: Device): Record<string, unknown>;
150
- /** Shapes an infrared remote for the MCP list_devices outputSchema. */
151
- export declare function toMcpIrDeviceShape(d: InfraredDevice): Record<string, unknown>;
@@ -1,383 +0,0 @@
1
- import { createClient } from '../api/client.js';
2
- import { idempotencyCache } from './idempotency.js';
3
- import { findCatalogEntry, suggestedActions, getEffectiveCatalog, deriveSafetyTier, getCommandSafetyReason, } from '../devices/catalog.js';
4
- import { getCachedDevice, updateCacheFromDeviceList, loadCache, isListCacheFresh, getCachedStatus, setCachedStatus, } from '../devices/cache.js';
5
- import { getCacheMode } from '../utils/flags.js';
6
- import { writeAudit } from '../utils/audit.js';
7
- import { isDryRun } from '../utils/flags.js';
8
- export class DeviceNotFoundError extends Error {
9
- deviceId;
10
- constructor(deviceId) {
11
- super(`No device with id "${deviceId}" found on this account.`);
12
- this.deviceId = deviceId;
13
- this.name = 'DeviceNotFoundError';
14
- }
15
- }
16
- export class CommandValidationError extends Error {
17
- kind;
18
- hint;
19
- constructor(message, kind, hint) {
20
- super(message);
21
- this.kind = kind;
22
- this.hint = hint;
23
- this.name = 'CommandValidationError';
24
- }
25
- }
26
- /** Fetch the full device + IR remote inventory and refresh the local cache. */
27
- export async function fetchDeviceList(client) {
28
- // TTL-gated read: when the on-disk cache is younger than the configured
29
- // list TTL, skip the API call and synthesize a DeviceListBody from the
30
- // metadata cache.
31
- const mode = getCacheMode();
32
- if (mode.listTtlMs > 0 && isListCacheFresh(mode.listTtlMs)) {
33
- const cached = loadCache();
34
- if (cached) {
35
- const deviceList = [];
36
- const infraredRemoteList = [];
37
- for (const [deviceId, entry] of Object.entries(cached.devices)) {
38
- if (entry.category === 'physical') {
39
- deviceList.push({
40
- deviceId,
41
- deviceName: entry.name,
42
- deviceType: entry.type,
43
- enableCloudService: entry.enableCloudService ?? true,
44
- hubDeviceId: entry.hubDeviceId ?? '',
45
- roomID: entry.roomID,
46
- roomName: entry.roomName,
47
- familyName: entry.familyName,
48
- controlType: entry.controlType,
49
- });
50
- }
51
- else {
52
- infraredRemoteList.push({
53
- deviceId,
54
- deviceName: entry.name,
55
- remoteType: entry.type,
56
- hubDeviceId: entry.hubDeviceId ?? '',
57
- controlType: entry.controlType,
58
- });
59
- }
60
- }
61
- return { deviceList, infraredRemoteList };
62
- }
63
- }
64
- const c = client ?? createClient();
65
- const res = await c.get('/v1.1/devices');
66
- updateCacheFromDeviceList(res.data.body);
67
- return res.data.body;
68
- }
69
- /** Fetch live status for a single physical device. IR remotes have no status channel. */
70
- export async function fetchDeviceStatus(deviceId, client) {
71
- const mode = getCacheMode();
72
- if (mode.statusTtlMs > 0) {
73
- const cached = getCachedStatus(deviceId, mode.statusTtlMs);
74
- if (cached)
75
- return cached;
76
- }
77
- const c = client ?? createClient();
78
- const res = await c.get(`/v1.1/devices/${deviceId}/status`);
79
- if (mode.statusTtlMs > 0) {
80
- setCachedStatus(deviceId, res.data.body, new Date(), mode.statusTtlMs);
81
- }
82
- return res.data.body;
83
- }
84
- /**
85
- * Execute a command on a device. `parameter` is the fully-parsed value already
86
- * (JSON-object when applicable), not a raw CLI string — callers should parse
87
- * upstream if needed.
88
- */
89
- export async function executeCommand(deviceId, cmd, parameter, commandType, client, options) {
90
- const c = client ?? createClient();
91
- const body = {
92
- command: cmd,
93
- parameter: parameter ?? 'default',
94
- commandType,
95
- };
96
- const baseAudit = {
97
- t: new Date().toISOString(),
98
- kind: 'command',
99
- deviceId,
100
- command: cmd,
101
- parameter,
102
- commandType,
103
- dryRun: isDryRun(),
104
- ...(options?.planId ? { planId: options.planId } : {}),
105
- };
106
- // Wrap in idempotency cache if key is provided
107
- const execute = async () => {
108
- try {
109
- const res = await c.post(`/v1.1/devices/${deviceId}/commands`, body);
110
- writeAudit({ ...baseAudit, result: 'ok' });
111
- return res.data.body;
112
- }
113
- catch (err) {
114
- // Dry-run intercepts throw DryRunSignal — still log the intent.
115
- if (err instanceof Error && err.name === 'DryRunSignal') {
116
- writeAudit({ ...baseAudit, result: 'ok' });
117
- }
118
- else {
119
- writeAudit({
120
- ...baseAudit,
121
- result: 'error',
122
- error: err instanceof Error ? err.message : String(err),
123
- });
124
- }
125
- throw err;
126
- }
127
- };
128
- const { result, replayed } = await idempotencyCache.run(options?.idempotencyKey, execute, { command: cmd, parameter });
129
- if (!replayed)
130
- return result;
131
- // Cached hit — attach replayed marker without mutating the original.
132
- if (result && typeof result === 'object') {
133
- return { ...result, replayed: true };
134
- }
135
- return { value: result, replayed: true };
136
- }
137
- /**
138
- * Validate a command against the locally-cached device → catalog mapping.
139
- * Returns `{ ok: true }` when validation passes or is skipped (unknown device,
140
- * custom IR button, etc.). On a case-only mismatch the canonical command name
141
- * is returned via `normalized` along with a `caseNormalizedFrom` field so the
142
- * caller can emit a warning and continue with the canonical name.
143
- * Returns `{ ok: false, error }` only when the caller should refuse the call.
144
- */
145
- export function validateCommand(deviceId, cmd, parameter, commandType) {
146
- if (commandType === 'customize')
147
- return { ok: true };
148
- const cached = getCachedDevice(deviceId);
149
- if (!cached)
150
- return { ok: true };
151
- const match = findCatalogEntry(cached.type);
152
- if (!match || Array.isArray(match))
153
- return { ok: true };
154
- const builtinCommands = match.commands.filter((c) => c.commandType !== 'customize');
155
- if (match.readOnly || builtinCommands.length === 0) {
156
- return {
157
- ok: false,
158
- error: new CommandValidationError(`${cached.name} (${cached.type}) is a read-only sensor — it has no control commands.`, 'read-only-device', `Use 'switchbot devices status ${deviceId}' to read this device instead.`),
159
- };
160
- }
161
- let spec = builtinCommands.find((c) => c.command === cmd);
162
- let caseNormalizedFrom;
163
- let normalizedCmd = cmd;
164
- if (!spec) {
165
- const unique = [...new Set(builtinCommands.map((c) => c.command))];
166
- const caseMatch = unique.find((c) => c.toLowerCase() === cmd.toLowerCase());
167
- if (caseMatch) {
168
- // Case-only mismatch: normalize and continue.
169
- caseNormalizedFrom = cmd;
170
- normalizedCmd = caseMatch;
171
- spec = builtinCommands.find((c) => c.command === caseMatch);
172
- }
173
- else {
174
- const hint = `Supported commands: ${unique.join(', ')}`;
175
- return {
176
- ok: false,
177
- error: new CommandValidationError(`"${cmd}" is not a supported command for ${cached.name} (${cached.type}).`, 'unknown-command', hint),
178
- };
179
- }
180
- }
181
- if (!spec)
182
- return { ok: true, normalized: normalizedCmd, caseNormalizedFrom };
183
- const noParamExpected = spec.parameter === '—';
184
- const userProvidedParam = parameter !== undefined && parameter !== 'default';
185
- if (noParamExpected && userProvidedParam) {
186
- return {
187
- ok: false,
188
- error: new CommandValidationError(`"${normalizedCmd}" takes no parameter, but one was provided: "${parameter}".`, 'unexpected-parameter', `Try: switchbot devices command ${deviceId} ${normalizedCmd}`),
189
- };
190
- }
191
- // Warn when a parameter is required but the user omitted it
192
- const paramRequired = !noParamExpected && spec.parameter !== 'default';
193
- if (paramRequired && !userProvidedParam) {
194
- const example = spec.exampleParams?.[0];
195
- return {
196
- ok: false,
197
- error: new CommandValidationError(`"${normalizedCmd}" requires a parameter (${spec.parameter}).`, 'missing-parameter', example
198
- ? `Example: switchbot devices command <deviceId> ${normalizedCmd} "${example}"`
199
- : `See: switchbot devices commands ${cached.type}`),
200
- };
201
- }
202
- return { ok: true, normalized: normalizedCmd, caseNormalizedFrom };
203
- }
204
- /**
205
- * Inspect catalog annotations to decide whether a command is destructive,
206
- * i.e. has hard-to-reverse real-world effects and should require an explicit
207
- * confirmation from an agent / operator before execution. Customize commands
208
- * are considered non-destructive here — they're user-defined IR buttons
209
- * whose behavior the catalog can't know about.
210
- */
211
- export function isDestructiveCommand(deviceType, cmd, commandType) {
212
- if (commandType === 'customize')
213
- return false;
214
- if (!deviceType)
215
- return false;
216
- const match = findCatalogEntry(deviceType);
217
- if (!match || Array.isArray(match))
218
- return false;
219
- const spec = match.commands.find((c) => c.command === cmd);
220
- if (!spec)
221
- return false;
222
- return deriveSafetyTier(spec, match) === 'destructive';
223
- }
224
- /** Return the safetyReason for a command, or null if not destructive / not found. */
225
- export function getDestructiveReason(deviceType, cmd, commandType) {
226
- if (commandType === 'customize')
227
- return null;
228
- if (!deviceType)
229
- return null;
230
- const match = findCatalogEntry(deviceType);
231
- if (!match || Array.isArray(match))
232
- return null;
233
- const spec = match.commands.find((c) => c.command === cmd);
234
- return spec ? getCommandSafetyReason(spec) : null;
235
- }
236
- /**
237
- * Describe a device by id: metadata + catalog entry (if known) +
238
- * optional live status. Throws `DeviceNotFoundError` when the id is unknown.
239
- */
240
- export async function describeDevice(deviceId, options = {}, client) {
241
- const body = await fetchDeviceList(client);
242
- const { deviceList, infraredRemoteList } = body;
243
- const physical = deviceList.find((d) => d.deviceId === deviceId);
244
- const ir = infraredRemoteList.find((d) => d.deviceId === deviceId);
245
- if (!physical && !ir)
246
- throw new DeviceNotFoundError(deviceId);
247
- const typeName = physical ? (physical.deviceType ?? '') : ir.remoteType;
248
- const match = typeName ? findCatalogEntry(typeName) : null;
249
- const catalogEntry = !match || Array.isArray(match) ? null : match;
250
- let liveStatus;
251
- if (options.live && physical) {
252
- try {
253
- liveStatus = await fetchDeviceStatus(deviceId, client);
254
- }
255
- catch (err) {
256
- liveStatus = { error: err instanceof Error ? err.message : String(err) };
257
- }
258
- }
259
- const source = catalogEntry
260
- ? liveStatus
261
- ? 'catalog+live'
262
- : 'catalog'
263
- : liveStatus
264
- ? 'live'
265
- : 'none';
266
- const capabilities = catalogEntry
267
- ? {
268
- role: catalogEntry.role ?? null,
269
- readOnly: catalogEntry.readOnly ?? false,
270
- commands: catalogEntry.commands.map((c) => {
271
- const tier = deriveSafetyTier(c, catalogEntry);
272
- const reason = getCommandSafetyReason(c);
273
- return {
274
- ...c,
275
- safetyTier: tier,
276
- ...(reason ? { safetyReason: reason } : {}),
277
- };
278
- }),
279
- statusFields: catalogEntry.statusFields ?? [],
280
- ...(liveStatus !== undefined ? { liveStatus } : {}),
281
- }
282
- : liveStatus !== undefined
283
- ? { liveStatus }
284
- : null;
285
- return {
286
- device: (physical ?? ir),
287
- isPhysical: Boolean(physical),
288
- typeName,
289
- controlType: physical?.controlType ?? ir?.controlType ?? null,
290
- catalog: catalogEntry,
291
- capabilities,
292
- source,
293
- suggestedActions: catalogEntry ? suggestedActions(catalogEntry) : [],
294
- inheritedLocation: ir ? buildHubLocationMap(deviceList).get(ir.hubDeviceId) : undefined,
295
- };
296
- }
297
- /** Build a map from hubDeviceId → room/family/roomID for IR-remote inheritance. */
298
- export function buildHubLocationMap(deviceList) {
299
- const map = new Map();
300
- for (const d of deviceList) {
301
- if (!d.deviceId)
302
- continue;
303
- map.set(d.deviceId, {
304
- family: d.familyName ?? undefined,
305
- room: d.roomName ?? undefined,
306
- roomID: d.roomID ?? undefined,
307
- });
308
- }
309
- return map;
310
- }
311
- /**
312
- * Search the local catalog by type name / alias. Returns up to `limit`
313
- * entries whose type or alias contains the query (case-insensitive).
314
- * Intended for MCP's `search_catalog` tool — not for dispatching commands.
315
- */
316
- export function searchCatalog(query, limit = 20) {
317
- const catalog = getEffectiveCatalog();
318
- const q = query.trim().toLowerCase();
319
- if (!q)
320
- return catalog.slice(0, limit);
321
- const hits = [];
322
- for (const entry of catalog) {
323
- const haystack = [entry.type, ...(entry.aliases ?? [])].map((s) => s.toLowerCase());
324
- if (haystack.some((h) => h.includes(q))) {
325
- hits.push(entry);
326
- if (hits.length >= limit)
327
- break;
328
- }
329
- }
330
- return hits;
331
- }
332
- /** Convert a DescribeResult to the shape validated by the MCP outputSchema. */
333
- export function toMcpDescribeShape(r) {
334
- const d = r.device;
335
- return {
336
- device: {
337
- deviceId: d.deviceId,
338
- deviceName: d.deviceName,
339
- ...(d.deviceType !== undefined ? { deviceType: d.deviceType } : {}),
340
- ...('enableCloudService' in d ? { enableCloudService: d.enableCloudService } : {}),
341
- ...(d.hubDeviceId !== undefined ? { hubDeviceId: d.hubDeviceId } : {}),
342
- ...(d.roomID !== undefined ? { roomID: d.roomID } : {}),
343
- ...(d.roomName !== undefined ? { roomName: d.roomName } : {}),
344
- ...(d.familyName !== undefined ? { familyName: d.familyName } : {}),
345
- ...(d.controlType !== undefined ? { controlType: d.controlType } : {}),
346
- ...('remoteType' in d && d.remoteType !== undefined ? { remoteType: d.remoteType } : {}),
347
- },
348
- isPhysical: r.isPhysical,
349
- typeName: r.typeName,
350
- controlType: r.controlType,
351
- source: r.source,
352
- capabilities: r.capabilities,
353
- suggestedActions: r.suggestedActions,
354
- ...(r.inheritedLocation !== undefined
355
- ? { inheritedLocation: { family: r.inheritedLocation.family, room: r.inheritedLocation.room } }
356
- : {}),
357
- };
358
- }
359
- /** Shapes the device list body for the MCP list_devices outputSchema. */
360
- export function toMcpDeviceListShape(d) {
361
- return {
362
- deviceId: d.deviceId,
363
- deviceName: d.deviceName,
364
- deviceType: d.deviceType,
365
- enableCloudService: d.enableCloudService,
366
- hubDeviceId: d.hubDeviceId,
367
- roomID: d.roomID,
368
- roomName: d.roomName,
369
- familyName: d.familyName,
370
- controlType: d.controlType,
371
- };
372
- }
373
- /** Shapes an infrared remote for the MCP list_devices outputSchema. */
374
- export function toMcpIrDeviceShape(d) {
375
- return {
376
- deviceId: d.deviceId,
377
- deviceName: d.deviceName,
378
- remoteType: d.remoteType,
379
- hubDeviceId: d.hubDeviceId,
380
- controlType: d.controlType,
381
- };
382
- }
383
- //# sourceMappingURL=devices.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"devices.js","sourceRoot":"","sources":["../../src/lib/devices.ts"],"names":[],"mappings":"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"}
@@ -1,46 +0,0 @@
1
- /**
2
- * In-memory LRU cache for idempotent request deduplication.
3
- * Caches the outcome of a keyed operation for 60 seconds;
4
- * duplicate keys within the window return the cached result (with a
5
- * `replayed: true` marker). Duplicate keys within the window for a DIFFERENT
6
- * (command, parameter) shape raise {@link IdempotencyConflictError}.
7
- *
8
- * Keys are stored in-memory as a SHA-256 fingerprint of the user-provided
9
- * key — the original string never touches the Map keys, so a later heap dump
10
- * or inadvertent log capture does not leak the raw token.
11
- *
12
- * Process-local only — not shared across replicas.
13
- */
14
- export declare class IdempotencyConflictError extends Error {
15
- readonly key: string;
16
- readonly existingShape: string;
17
- readonly newShape: string;
18
- constructor(message: string, key: string, existingShape: string, newShape: string);
19
- }
20
- export declare class IdempotencyCache {
21
- private cache;
22
- private readonly ttlMs;
23
- private readonly maxEntries;
24
- constructor(ttlMs?: number, maxEntries?: number);
25
- /**
26
- * Execute fn if the key is not cached, or return the cached result if it is.
27
- * On new execution, caches the result for ttlMs.
28
- *
29
- * When `shape` is provided, a cached hit is validated against the original
30
- * (command, parameter) fingerprint; mismatched shape raises
31
- * {@link IdempotencyConflictError}.
32
- *
33
- * Returns a tuple-esque object with `replayed: true` when the cached
34
- * result is served. The `result` field is the original cached value.
35
- */
36
- run<T>(key: string | undefined, fn: () => Promise<T>, shape?: {
37
- command: string;
38
- parameter: unknown;
39
- }): Promise<{
40
- result: T;
41
- replayed: boolean;
42
- }>;
43
- clear(): void;
44
- size(): number;
45
- }
46
- export declare const idempotencyCache: IdempotencyCache;