@switchbot/openapi-cli 3.2.1 → 3.2.2

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 +57349 -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,138 +0,0 @@
1
- import { loadCache } from '../devices/cache.js';
2
- import { loadDeviceMeta } from '../devices/device-meta.js';
3
- import { levenshtein, normalizeDeviceName } from './string.js';
4
- import { UsageError, StructuredUsageError } from './output.js';
5
- export const ALL_STRATEGIES = [
6
- 'exact', 'prefix', 'substring', 'fuzzy', 'first', 'require-unique',
7
- ];
8
- export function isValidStrategy(s) {
9
- return ALL_STRATEGIES.includes(s);
10
- }
11
- function resolveDeviceByName(query, opts = {}) {
12
- const strategy = opts.strategy ?? 'fuzzy';
13
- const cache = loadCache();
14
- if (!cache || Object.keys(cache.devices).length === 0) {
15
- return { ok: false, ambiguous: false };
16
- }
17
- const meta = loadDeviceMeta();
18
- const q = normalizeDeviceName(query);
19
- const threshold = Math.min(3, Math.floor(q.length * 0.3));
20
- const typeFilter = opts.type ? opts.type.toLowerCase() : null;
21
- const roomFilter = opts.room ? opts.room.toLowerCase() : null;
22
- const candidates = [];
23
- for (const [deviceId, device] of Object.entries(cache.devices)) {
24
- // narrow filters first
25
- if (opts.category && device.category !== opts.category)
26
- continue;
27
- if (typeFilter && device.type.toLowerCase() !== typeFilter)
28
- continue;
29
- if (roomFilter) {
30
- const rn = (device.roomName ?? '').toLowerCase();
31
- if (rn !== roomFilter && !rn.includes(roomFilter))
32
- continue;
33
- }
34
- const alias = meta.devices[deviceId]?.alias;
35
- const rawName = normalizeDeviceName(device.name);
36
- const normAlias = alias ? normalizeDeviceName(alias) : null;
37
- // exact alias/name wins immediately for lenient strategies.
38
- // Under require-unique we must NOT short-circuit: there may be other devices
39
- // that also match (e.g. via substring), making the result ambiguous. Collect
40
- // the exact hit as a candidate and let the full ambiguity check decide below.
41
- if ((normAlias && normAlias === q) || rawName === q) {
42
- if (strategy !== 'require-unique') {
43
- return { ok: true, deviceId };
44
- }
45
- // require-unique: treat exact match as a high-priority candidate (score 0)
46
- candidates.push({ deviceId, name: device.name, score: 0 });
47
- continue;
48
- }
49
- if (strategy === 'exact')
50
- continue;
51
- if (strategy === 'prefix') {
52
- if ((normAlias && normAlias.startsWith(q)) || rawName.startsWith(q)) {
53
- candidates.push({ deviceId, name: device.name, score: 1 });
54
- }
55
- continue;
56
- }
57
- // substring + fuzzy + require-unique + first all share substring match
58
- if ((normAlias && normAlias.includes(q)) || rawName.includes(q)) {
59
- candidates.push({ deviceId, name: device.name, score: 1 });
60
- continue;
61
- }
62
- if (strategy === 'substring')
63
- continue;
64
- // fuzzy / require-unique / first → also levenshtein
65
- if (strategy === 'fuzzy' || strategy === 'require-unique' || strategy === 'first') {
66
- const distName = levenshtein(rawName, q);
67
- const distAlias = normAlias ? levenshtein(normAlias, q) : Number.POSITIVE_INFINITY;
68
- const dist = Math.min(distName, distAlias);
69
- if (dist <= threshold) {
70
- candidates.push({ deviceId, name: device.name, score: dist + 1 });
71
- }
72
- }
73
- }
74
- if (candidates.length === 0)
75
- return { ok: false, ambiguous: false };
76
- candidates.sort((a, b) => a.score - b.score);
77
- if (strategy === 'first') {
78
- return { ok: true, deviceId: candidates[0].deviceId };
79
- }
80
- if (strategy === 'require-unique') {
81
- if (candidates.length === 1)
82
- return { ok: true, deviceId: candidates[0].deviceId };
83
- return { ok: false, ambiguous: true, candidates: candidates.slice(0, 4) };
84
- }
85
- // fuzzy / substring / prefix: collapse cluster of near-ties
86
- const best = candidates[0].score;
87
- const top = candidates.filter((c) => c.score <= best + 1);
88
- if (top.length === 1)
89
- return { ok: true, deviceId: top[0].deviceId };
90
- return { ok: false, ambiguous: true, candidates: top.slice(0, 4) };
91
- }
92
- export function resolveDeviceId(deviceId, nameQuery, opts = {}) {
93
- if (deviceId && nameQuery) {
94
- throw new UsageError('Provide either a deviceId argument or --name, not both.');
95
- }
96
- if (deviceId)
97
- return deviceId;
98
- if (!nameQuery) {
99
- throw new UsageError('A deviceId argument or --name flag is required.');
100
- }
101
- if (opts.strategy && !isValidStrategy(opts.strategy)) {
102
- throw new UsageError(`--name-strategy must be one of: ${ALL_STRATEGIES.join(', ')} (got "${opts.strategy}")`);
103
- }
104
- const cache = loadCache();
105
- if (!cache) {
106
- throw new UsageError(`--name requires the device cache. Run 'switchbot devices list' first to populate it.`);
107
- }
108
- const result = resolveDeviceByName(nameQuery, opts);
109
- if (result.ok)
110
- return result.deviceId;
111
- if (result.ambiguous) {
112
- const candidates = result.candidates.map((c) => ({ deviceId: c.deviceId, name: c.name }));
113
- const narrow = [];
114
- if (!opts.type)
115
- narrow.push('--type');
116
- if (!opts.category)
117
- narrow.push('--category');
118
- if (!opts.room)
119
- narrow.push('--room');
120
- const strategyHint = opts.strategy === 'fuzzy'
121
- ? `pass --name-strategy=first to pick the best match`
122
- : `pass --name-strategy=fuzzy or --name-strategy=first to pick the best match`;
123
- const hint = narrow.length > 0
124
- ? `Narrow with ${narrow.join(' / ')}, refine the name, use the deviceId directly, or ${strategyHint}.`
125
- : `Refine the name, use the deviceId directly, or ${strategyHint}.`;
126
- throw new StructuredUsageError(`"${nameQuery}" is ambiguous — ${candidates.length} devices match.`, {
127
- error: 'ambiguous_name_match',
128
- query: nameQuery,
129
- candidates,
130
- hint,
131
- });
132
- }
133
- const noMatchNarrow = opts.type || opts.category || opts.room
134
- ? ' after applying --type/--category/--room filters'
135
- : '';
136
- throw new UsageError(`No device matches "${nameQuery}"${noMatchNarrow}. Run 'switchbot devices list' to see device names.`);
137
- }
138
- //# sourceMappingURL=name-resolver.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"name-resolver.js","sourceRoot":"","sources":["../../src/utils/name-resolver.ts"],"names":[],"mappings":"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"}
@@ -1,73 +0,0 @@
1
- import { type TableStyle } from './flags.js';
2
- export declare const SCHEMA_VERSION = "1.1";
3
- export declare function isJsonMode(): boolean;
4
- export declare function printJson(data: unknown): void;
5
- /**
6
- * Emit a structured JSON error envelope on stdout.
7
- *
8
- * Bug #SYS-1: Under `--json`, both success and error payloads must share
9
- * the same output channel (stdout) so a single `cli --json ... | jq` pipe
10
- * can decode either shape. Use this helper everywhere that previously
11
- * called `console.error(JSON.stringify({ error: ... }))` in --json mode.
12
- *
13
- * The envelope is always `{ schemaVersion, error }` — callers pass only the
14
- * error payload. Also emits a brief human-readable line on stderr when a
15
- * TTY is attached, so interactive runs still see the failure.
16
- */
17
- export declare function emitJsonError(errorPayload: Record<string, unknown>): void;
18
- /**
19
- * P7: emit the stream-header first line for any NDJSON/streaming command
20
- * running under `--json`. Downstream JSON consumers can key on
21
- * `{ stream: true }` to distinguish the header from subsequent event
22
- * lines, and on `eventKind` / `cadence` to pick a parser strategy.
23
- *
24
- * Non-streaming commands (single-object / array output) do NOT emit this
25
- * header — only watch / events tail / events mqtt-tail.
26
- */
27
- export declare function emitStreamHeader(opts: {
28
- eventKind: 'tick' | 'event';
29
- cadence: 'poll' | 'push';
30
- }): void;
31
- interface ExitWithErrorOptions {
32
- message: string;
33
- kind?: 'usage' | 'guard' | 'runtime';
34
- code?: number;
35
- hint?: string;
36
- context?: Record<string, unknown>;
37
- extra?: Record<string, unknown>;
38
- }
39
- export declare function exitWithError(messageOrOpts: string | ExitWithErrorOptions): never;
40
- export declare function printTable(headers: string[], rows: (string | number | boolean | null | undefined)[][], styleOverride?: TableStyle): void;
41
- export declare function printKeyValue(data: Record<string, unknown>): void;
42
- export declare class UsageError extends Error {
43
- constructor(message: string);
44
- }
45
- export type ErrorSubKind = 'device-offline' | 'device-not-found' | 'scene-not-found' | 'command-not-supported' | 'auth-failed' | 'quota-exceeded' | 'device-internal-error' | 'ambiguous-name-match' | 'unknown-api-error';
46
- export interface CandidateMatch {
47
- deviceId?: string;
48
- sceneId?: string;
49
- name: string;
50
- }
51
- export interface ErrorPayload {
52
- code: number;
53
- kind: 'usage' | 'api' | 'runtime' | 'guard';
54
- subKind?: ErrorSubKind;
55
- message: string;
56
- hint?: string;
57
- /** Structured remediation hint for agent/script consumers. */
58
- resolutionHint?: string;
59
- /** Candidate matches when the error is caused by an ambiguous name query. */
60
- candidateMatches?: CandidateMatch[];
61
- retryable?: boolean;
62
- context?: Record<string, unknown>;
63
- retryAfterMs?: number;
64
- transient?: boolean;
65
- errorClass?: 'network' | 'api' | 'device-offline' | 'device-internal-error' | 'guard' | 'usage';
66
- }
67
- export declare class StructuredUsageError extends Error {
68
- readonly context?: Record<string, unknown> | undefined;
69
- constructor(message: string, context?: Record<string, unknown> | undefined);
70
- }
71
- export declare function buildErrorPayload(error: unknown): ErrorPayload;
72
- export declare function handleError(error: unknown): never;
73
- export {};
@@ -1,405 +0,0 @@
1
- import Table from 'cli-table3';
2
- import chalk from 'chalk';
3
- import { ApiError, DryRunSignal } from '../api/client.js';
4
- import { getFormat, getTableStyle } from './flags.js';
5
- export const SCHEMA_VERSION = '1.1';
6
- export function isJsonMode() {
7
- return process.argv.includes('--json') || getFormat() === 'json';
8
- }
9
- export function printJson(data) {
10
- console.log(JSON.stringify({ schemaVersion: SCHEMA_VERSION, data }, null, 2));
11
- }
12
- /**
13
- * Emit a structured JSON error envelope on stdout.
14
- *
15
- * Bug #SYS-1: Under `--json`, both success and error payloads must share
16
- * the same output channel (stdout) so a single `cli --json ... | jq` pipe
17
- * can decode either shape. Use this helper everywhere that previously
18
- * called `console.error(JSON.stringify({ error: ... }))` in --json mode.
19
- *
20
- * The envelope is always `{ schemaVersion, error }` — callers pass only the
21
- * error payload. Also emits a brief human-readable line on stderr when a
22
- * TTY is attached, so interactive runs still see the failure.
23
- */
24
- export function emitJsonError(errorPayload) {
25
- console.log(JSON.stringify({ schemaVersion: SCHEMA_VERSION, error: errorPayload }));
26
- if (process.stderr.isTTY) {
27
- const msg = typeof errorPayload.message === 'string' ? errorPayload.message : 'Error';
28
- console.error(chalk.red(msg));
29
- }
30
- }
31
- /**
32
- * P7: emit the stream-header first line for any NDJSON/streaming command
33
- * running under `--json`. Downstream JSON consumers can key on
34
- * `{ stream: true }` to distinguish the header from subsequent event
35
- * lines, and on `eventKind` / `cadence` to pick a parser strategy.
36
- *
37
- * Non-streaming commands (single-object / array output) do NOT emit this
38
- * header — only watch / events tail / events mqtt-tail.
39
- */
40
- export function emitStreamHeader(opts) {
41
- console.log(JSON.stringify({
42
- schemaVersion: '1',
43
- stream: true,
44
- eventKind: opts.eventKind,
45
- cadence: opts.cadence,
46
- }));
47
- }
48
- export function exitWithError(messageOrOpts) {
49
- const opts = typeof messageOrOpts === 'string' ? { message: messageOrOpts } : messageOrOpts;
50
- const { message, kind = 'usage', code = 2, hint, context, extra } = opts;
51
- if (isJsonMode()) {
52
- const payload = { code, kind, message };
53
- if (hint)
54
- payload.hint = hint;
55
- if (context)
56
- payload.context = context;
57
- if (extra)
58
- Object.assign(payload, extra);
59
- emitJsonError(payload);
60
- }
61
- else {
62
- console.error(message);
63
- if (hint)
64
- console.error(hint);
65
- }
66
- process.exit(code);
67
- }
68
- function escapeMarkdownCell(s) {
69
- // Pipes break markdown table layout; backslash-escape them. Collapse
70
- // newlines into <br> so each row stays on one line.
71
- return s.replace(/\|/g, '\\|').replace(/\r?\n/g, '<br>');
72
- }
73
- function formatCell(cell, style) {
74
- if (cell === null || cell === undefined)
75
- return style === 'markdown' ? '—' : chalk.grey('—');
76
- if (typeof cell === 'boolean') {
77
- if (style === 'markdown')
78
- return cell ? 'Yes' : 'No';
79
- return cell ? chalk.green('✓') : chalk.red('✗');
80
- }
81
- return String(cell);
82
- }
83
- function renderMarkdownTable(headers, rows) {
84
- if (rows.length === 0) {
85
- return '_(empty)_';
86
- }
87
- const head = `| ${headers.map(escapeMarkdownCell).join(' | ')} |`;
88
- const sep = `| ${headers.map(() => '---').join(' | ')} |`;
89
- const body = rows.map((r) => `| ${r
90
- .map((c) => escapeMarkdownCell(formatCell(c, 'markdown')))
91
- .join(' | ')} |`);
92
- return [head, sep, ...body].join('\n');
93
- }
94
- function renderSimpleTable(headers, rows) {
95
- const widths = headers.map((h, i) => Math.max(h.length, ...rows.map((r) => String(formatCell(r[i], 'simple')).length)));
96
- const fmt = (cells) => cells.map((c, i) => c.padEnd(widths[i])).join(' ').trimEnd();
97
- return [
98
- fmt(headers),
99
- ...rows.map((r) => fmt(r.map((c) => String(formatCell(c, 'simple'))))),
100
- ].join('\n');
101
- }
102
- const ASCII_BORDER_CHARS = {
103
- top: '-', 'top-mid': '+', 'top-left': '+', 'top-right': '+',
104
- bottom: '-', 'bottom-mid': '+', 'bottom-left': '+', 'bottom-right': '+',
105
- left: '|', 'left-mid': '+', mid: '-', 'mid-mid': '+',
106
- right: '|', 'right-mid': '+', middle: '|',
107
- };
108
- export function printTable(headers, rows, styleOverride) {
109
- const style = styleOverride ?? getTableStyle();
110
- if (style === 'markdown') {
111
- console.log(renderMarkdownTable(headers, rows));
112
- return;
113
- }
114
- if (style === 'simple') {
115
- console.log(renderSimpleTable(headers, rows));
116
- return;
117
- }
118
- const tableOpts = {
119
- head: headers.map((h) => (style === 'ascii' ? h : chalk.cyan(h))),
120
- style: style === 'ascii' ? { border: [], head: [] } : { border: ['grey'] },
121
- };
122
- if (style === 'ascii') {
123
- tableOpts.chars = ASCII_BORDER_CHARS;
124
- }
125
- const table = new Table(tableOpts);
126
- for (const row of rows) {
127
- table.push(row.map((cell) => formatCell(cell, style)));
128
- }
129
- console.log(table.toString());
130
- }
131
- export function printKeyValue(data) {
132
- const style = getTableStyle();
133
- if (style === 'markdown') {
134
- const entries = Object.entries(data).filter(([, v]) => v !== null && v !== undefined);
135
- const rows = entries.map(([k, v]) => [k, typeof v === 'object' ? JSON.stringify(v) : String(v)]);
136
- console.log(renderMarkdownTable(['Key', 'Value'], rows));
137
- return;
138
- }
139
- if (style === 'simple') {
140
- for (const [key, value] of Object.entries(data)) {
141
- if (value === null || value === undefined)
142
- continue;
143
- const displayValue = typeof value === 'object' ? JSON.stringify(value) : String(value);
144
- console.log(`${key} ${displayValue}`);
145
- }
146
- return;
147
- }
148
- const tableOpts = {
149
- style: style === 'ascii' ? { border: [], head: [] } : { border: ['grey'] },
150
- };
151
- if (style === 'ascii') {
152
- tableOpts.chars = ASCII_BORDER_CHARS;
153
- }
154
- const table = new Table(tableOpts);
155
- for (const [key, value] of Object.entries(data)) {
156
- if (value === null || value === undefined)
157
- continue;
158
- const displayValue = typeof value === 'object' ? JSON.stringify(value) : String(value);
159
- const keyLabel = style === 'ascii' ? key : chalk.cyan(key);
160
- table.push({ [keyLabel]: displayValue });
161
- }
162
- console.log(table.toString());
163
- }
164
- export class UsageError extends Error {
165
- constructor(message) {
166
- super(message);
167
- this.name = 'UsageError';
168
- }
169
- }
170
- export class StructuredUsageError extends Error {
171
- context;
172
- constructor(message, context) {
173
- super(message);
174
- this.context = context;
175
- this.name = 'StructuredUsageError';
176
- }
177
- }
178
- function classifyApiError(code) {
179
- switch (code) {
180
- case 151:
181
- case 160:
182
- case 3005: return 'command-not-supported';
183
- case 152: return 'device-not-found';
184
- case 161:
185
- case 171: return 'device-offline';
186
- case 190: return 'device-internal-error';
187
- case 401: return 'auth-failed';
188
- case 429: return 'quota-exceeded';
189
- default: return 'unknown-api-error';
190
- }
191
- }
192
- export function buildErrorPayload(error) {
193
- if (error instanceof StructuredUsageError) {
194
- const payload = {
195
- code: 2,
196
- kind: 'usage',
197
- message: error.message,
198
- errorClass: 'usage',
199
- transient: false,
200
- };
201
- if (error.context) {
202
- const ctx = error.context;
203
- const { error: errorType, candidates, hint } = ctx;
204
- if (errorType === 'ambiguous_name_match') {
205
- payload.subKind = 'ambiguous-name-match';
206
- }
207
- if (Array.isArray(candidates) && candidates.length > 0) {
208
- const normalized = candidates
209
- .map((c) => {
210
- if (typeof c !== 'object' || c === null)
211
- return null;
212
- const o = c;
213
- const name = typeof o.name === 'string' ? o.name
214
- : typeof o.sceneName === 'string' ? o.sceneName
215
- : '';
216
- const match = { name };
217
- if (typeof o.deviceId === 'string')
218
- match.deviceId = o.deviceId;
219
- if (typeof o.sceneId === 'string')
220
- match.sceneId = o.sceneId;
221
- return match;
222
- })
223
- .filter((c) => c !== null && c.name.length > 0);
224
- if (normalized.length > 0)
225
- payload.candidateMatches = normalized;
226
- }
227
- if (typeof hint === 'string') {
228
- payload.resolutionHint = hint;
229
- }
230
- // Preserve full context for backward compatibility (including candidates / hint).
231
- payload.context = ctx;
232
- }
233
- return payload;
234
- }
235
- if (error instanceof UsageError) {
236
- return { code: 2, kind: 'usage', message: error.message, errorClass: 'usage', transient: false };
237
- }
238
- // Idempotency conflict → exit 2 with kind:guard so scripts can react.
239
- if (error instanceof Error && error.name === 'IdempotencyConflictError') {
240
- return {
241
- code: 2,
242
- kind: 'guard',
243
- message: error.message,
244
- errorClass: 'guard',
245
- transient: false,
246
- context: {
247
- existingShape: error.existingShape,
248
- newShape: error.newShape,
249
- },
250
- };
251
- }
252
- // Local daily-cap refusal → exit 2 (usage-style refusal before touching net).
253
- if (error instanceof Error && error.name === 'DailyCapExceededError') {
254
- return {
255
- code: 2,
256
- kind: 'guard',
257
- message: error.message,
258
- errorClass: 'guard',
259
- transient: false,
260
- context: {
261
- cap: error.cap,
262
- total: error.total,
263
- profile: error.profile,
264
- },
265
- };
266
- }
267
- const code = error instanceof ApiError ? error.code : 1;
268
- const kind = error instanceof ApiError ? 'api' : 'runtime';
269
- const message = error instanceof Error ? error.message : 'An unknown error occurred';
270
- const hint = error instanceof ApiError ? (error.hint ?? errorHint(error.code)) : null;
271
- const retryable = error instanceof ApiError ? error.retryable : false;
272
- const retryAfterMs = error instanceof ApiError ? error.retryAfterMs : undefined;
273
- const transient = error instanceof ApiError ? error.transient : false;
274
- // Classify error
275
- let errorClass = 'api';
276
- if (kind === 'runtime') {
277
- errorClass = 'api';
278
- }
279
- else if (transient && code >= 500) {
280
- errorClass = 'api';
281
- }
282
- else if (code === 0) {
283
- errorClass = 'network';
284
- }
285
- else if (code >= 400) {
286
- errorClass = 'api';
287
- }
288
- const payload = { code, kind, message, errorClass, transient };
289
- if (error instanceof ApiError)
290
- payload.subKind = classifyApiError(error.code);
291
- if (hint)
292
- payload.hint = hint;
293
- if (retryable)
294
- payload.retryable = true;
295
- if (retryAfterMs !== undefined)
296
- payload.retryAfterMs = retryAfterMs;
297
- return payload;
298
- }
299
- export function handleError(error) {
300
- if (error instanceof DryRunSignal) {
301
- process.exit(0);
302
- }
303
- const payload = buildErrorPayload(error);
304
- if (isJsonMode()) {
305
- // Bug #SYS-1: Under --json, route the structured envelope to stdout so
306
- // `cli --json ... | jq` pipelines can decode the error shape exactly
307
- // the same way they decode success. Previously it went to stderr, which
308
- // silently broke every error-path pipeline. TTY users still get a
309
- // terse human-readable line on stderr so interactive runs don't look
310
- // like the process simply exited.
311
- console.log(JSON.stringify({ schemaVersion: SCHEMA_VERSION, error: payload }));
312
- if (process.stderr.isTTY) {
313
- console.error(chalk.red(payload.message));
314
- }
315
- process.exit(payload.code === 2 ? 2 : 1);
316
- }
317
- if (payload.kind === 'usage') {
318
- console.error(payload.message);
319
- if (Array.isArray(payload.candidateMatches) && payload.candidateMatches.length > 0) {
320
- const names = payload.candidateMatches
321
- .map((c) => {
322
- const id = c.deviceId ?? c.sceneId;
323
- if (c.name && id)
324
- return `${c.name} (${id})`;
325
- return c.name ?? id ?? JSON.stringify(c);
326
- })
327
- .slice(0, 6);
328
- console.error(`Did you mean: ${names.join(', ')}?`);
329
- }
330
- else {
331
- const ctx = payload.context;
332
- if (ctx && Array.isArray(ctx.candidates) && ctx.candidates.length > 0) {
333
- const names = ctx.candidates
334
- .map((c) => {
335
- if (typeof c === 'string')
336
- return c;
337
- if (c && typeof c === 'object') {
338
- const o = c;
339
- const name = typeof o.name === 'string'
340
- ? o.name
341
- : typeof o.sceneName === 'string' ? o.sceneName : undefined;
342
- const id = typeof o.deviceId === 'string'
343
- ? o.deviceId
344
- : typeof o.sceneId === 'string' ? o.sceneId : typeof o.id === 'string' ? o.id : undefined;
345
- if (name && id)
346
- return `${name} (${id})`;
347
- return name ?? id ?? JSON.stringify(c);
348
- }
349
- return String(c);
350
- })
351
- .slice(0, 6);
352
- console.error(`Did you mean: ${names.join(', ')}?`);
353
- }
354
- }
355
- if (payload.resolutionHint) {
356
- console.error(payload.resolutionHint);
357
- }
358
- else {
359
- const ctx = payload.context;
360
- if (ctx && typeof ctx.hint === 'string') {
361
- console.error(ctx.hint);
362
- }
363
- }
364
- process.exit(2);
365
- }
366
- if (payload.kind === 'guard') {
367
- console.error(chalk.yellow(`Guard: ${payload.message}`));
368
- process.exit(payload.code === 2 ? 2 : 1);
369
- }
370
- if (error instanceof ApiError) {
371
- console.error(chalk.red(`Error (code ${error.code}): ${payload.message}`));
372
- if (payload.hint)
373
- console.error(chalk.grey(`Hint: ${payload.hint}`));
374
- }
375
- else if (error instanceof Error) {
376
- console.error(chalk.red(`Error: ${payload.message}`));
377
- }
378
- else {
379
- console.error(chalk.red('An unknown error occurred'));
380
- }
381
- process.exit(1);
382
- }
383
- function errorHint(code) {
384
- switch (code) {
385
- case 152:
386
- return "Check the deviceId with 'switchbot devices list' (IDs are case-sensitive).";
387
- case 160:
388
- return "Run 'switchbot devices describe <deviceId>' to see which commands this device supports.";
389
- case 161:
390
- return 'BLE-only devices require a Hub. Check the hub connection and Wi-Fi.';
391
- case 171:
392
- return 'The Hub itself is offline — check its power and Wi-Fi.';
393
- case 190:
394
- return 'SwitchBot API code 190 is a generic internal error. Common causes: invalid deviceId, unsupported command/parameter, or the endpoint does not apply (e.g., "webhook query" with no webhook configured). Verify with --verbose.';
395
- case 401:
396
- return "Re-run 'switchbot config set-token <token> <secret>', or verify SWITCHBOT_TOKEN / SWITCHBOT_SECRET.";
397
- case 429:
398
- return 'Daily quota is 10,000 requests/account — retry after midnight UTC.';
399
- case 3005:
400
- return "SwitchBot rejected the command as invalid for this specific device model. For IR remotes, this often means the command works only on --type customize (user-learned buttons). Try 'switchbot devices commands <type>' or check the device's capabilities.";
401
- default:
402
- return null;
403
- }
404
- }
405
- //# sourceMappingURL=output.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":"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"}