@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,187 +0,0 @@
1
- /**
2
- * Read global flags directly from process.argv (same pattern as isJsonMode).
3
- * Kept simple so subcommand actions don't need to thread program.opts() down.
4
- */
5
- function getFlagValue(...flagNames) {
6
- for (const flag of flagNames) {
7
- const idx = process.argv.indexOf(flag);
8
- if (idx !== -1 && idx + 1 < process.argv.length) {
9
- return process.argv[idx + 1];
10
- }
11
- // Also accept the `--flag=value` token form. Commander.js recognizes it at
12
- // the option layer but global-flag scans like this one used to miss it,
13
- // so `--format=json` silently fell back to the default (table).
14
- const prefix = `${flag}=`;
15
- const combined = process.argv.find((arg) => arg.startsWith(prefix));
16
- if (combined !== undefined) {
17
- return combined.slice(prefix.length);
18
- }
19
- }
20
- return undefined;
21
- }
22
- export function isVerbose() {
23
- return process.argv.includes('--verbose') || process.argv.includes('-v');
24
- }
25
- /**
26
- * Opt-in: disable header redaction in verbose traces. Adds a big warning on
27
- * stderr. Use only when actively debugging an auth issue — never in logs or
28
- * CI output.
29
- */
30
- export function isTraceUnsafe() {
31
- return process.argv.includes('--trace-unsafe');
32
- }
33
- export function isDryRun() {
34
- return process.argv.includes('--dry-run');
35
- }
36
- /** HTTP request timeout in milliseconds. Default 30s. Minimum 100ms (values below 100ms are ignored). */
37
- export function getTimeout() {
38
- const v = getFlagValue('--timeout');
39
- if (!v)
40
- return 30_000;
41
- const n = Number(v);
42
- if (!Number.isFinite(n) || n <= 0)
43
- return 30_000;
44
- if (n < 100) {
45
- process.stderr.write(`Warning: --timeout ${n}ms is too low to complete any request; using 100ms minimum.\n`);
46
- return 100;
47
- }
48
- return n;
49
- }
50
- /** Override for the credentials file path. */
51
- export function getConfigPath() {
52
- return getFlagValue('--config');
53
- }
54
- /** Named profile → ~/.switchbot/profiles/<name>.json. */
55
- export function getProfile() {
56
- return getFlagValue('--profile');
57
- }
58
- /**
59
- * Audit log path. `--audit-log` enables JSONL append on every mutating command.
60
- * Use `--audit-log-path <path>` to specify a custom file; otherwise defaults to
61
- * ~/.switchbot/audit.log. Returns null when --audit-log is absent.
62
- */
63
- export function getAuditLog() {
64
- if (!process.argv.includes('--audit-log'))
65
- return null;
66
- const customPath = getFlagValue('--audit-log-path');
67
- if (customPath)
68
- return customPath;
69
- return `${process.env.HOME ?? process.env.USERPROFILE ?? '.'}/.switchbot/audit.log`;
70
- }
71
- /**
72
- * Max 429 retries before surfacing the error. Default 3. `--no-retry`
73
- * disables retries entirely; `--retry-on-429 <n>` overrides the count.
74
- */
75
- export function getRetryOn429() {
76
- if (process.argv.includes('--no-retry'))
77
- return 0;
78
- const v = getFlagValue('--retry-on-429');
79
- if (v === undefined)
80
- return 3;
81
- const n = Number(v);
82
- if (!Number.isFinite(n) || n < 0)
83
- return 3;
84
- return Math.floor(n);
85
- }
86
- /** Backoff strategy for 429 retries. Default 'exponential'. */
87
- export function getBackoffStrategy() {
88
- const v = getFlagValue('--backoff');
89
- if (v === 'linear')
90
- return 'linear';
91
- return 'exponential';
92
- }
93
- /**
94
- * Max retries on 5xx / gateway-timeout responses for idempotent (GET) reads.
95
- * Default 2. `--no-retry` disables retries entirely. POSTs are not retried
96
- * automatically — use --idempotency-key and let the server dedupe.
97
- */
98
- export function getRetryOn5xx() {
99
- if (process.argv.includes('--no-retry'))
100
- return 0;
101
- const v = getFlagValue('--retry-on-5xx');
102
- if (v === undefined)
103
- return 2;
104
- const n = Number(v);
105
- if (!Number.isFinite(n) || n < 0)
106
- return 2;
107
- return Math.floor(n);
108
- }
109
- /**
110
- * Whether local quota counting is disabled. Quota counting is best-effort
111
- * (see src/utils/quota.ts) — this lets scripts opt out entirely when even
112
- * best-effort file I/O is unwelcome.
113
- */
114
- export function isQuotaDisabled() {
115
- return process.argv.includes('--no-quota');
116
- }
117
- const DEFAULT_LIST_TTL_MS = 60 * 60 * 1000;
118
- function parseDurationToMs(v) {
119
- const m = /^(\d+)(ms|s|m|h|d|w)?$/.exec(v.trim().toLowerCase());
120
- if (!m)
121
- return null;
122
- const n = Number(m[1]);
123
- if (!Number.isFinite(n) || n < 0)
124
- return null;
125
- const unit = m[2] ?? 'ms';
126
- switch (unit) {
127
- case 'ms': return n;
128
- case 's': return n * 1000;
129
- case 'm': return n * 60 * 1000;
130
- case 'h': return n * 60 * 60 * 1000;
131
- case 'd': return n * 24 * 60 * 60 * 1000;
132
- case 'w': return n * 7 * 24 * 60 * 60 * 1000;
133
- default: return null;
134
- }
135
- }
136
- export { parseDurationToMs };
137
- /** The --format flag value, or undefined when absent. */
138
- export function getFormat() {
139
- return getFlagValue('--format');
140
- }
141
- /** Comma-separated --fields value, split into an array. */
142
- export function getFields() {
143
- const v = getFlagValue('--fields');
144
- if (!v)
145
- return undefined;
146
- return v.split(',').map((f) => f.trim()).filter(Boolean);
147
- }
148
- export function getTableStyle() {
149
- const v = getFlagValue('--table-style');
150
- if (v === 'unicode' || v === 'ascii' || v === 'simple' || v === 'markdown')
151
- return v;
152
- if (getFormat() === 'markdown')
153
- return 'markdown';
154
- // TTY → pretty unicode borders. Non-TTY (pipe/redirect) → ascii to avoid
155
- // mojibake in consumer logs.
156
- return process.stdout.isTTY ? 'unicode' : 'ascii';
157
- }
158
- export function getCacheMode() {
159
- if (process.argv.includes('--no-cache')) {
160
- return { listTtlMs: 0, statusTtlMs: 0 };
161
- }
162
- // Individual TTL overrides take precedence over the combined --cache flag.
163
- const listFlag = getFlagValue('--cache-list');
164
- const statusFlag = getFlagValue('--cache-status');
165
- if (listFlag !== undefined || statusFlag !== undefined) {
166
- const listTtlMs = listFlag !== undefined
167
- ? (parseDurationToMs(listFlag) ?? DEFAULT_LIST_TTL_MS)
168
- : DEFAULT_LIST_TTL_MS;
169
- const statusTtlMs = statusFlag !== undefined
170
- ? (parseDurationToMs(statusFlag) ?? 0)
171
- : 0;
172
- return { listTtlMs, statusTtlMs };
173
- }
174
- const v = getFlagValue('--cache');
175
- if (!v || v === 'auto') {
176
- return { listTtlMs: DEFAULT_LIST_TTL_MS, statusTtlMs: 0 };
177
- }
178
- if (v === 'off') {
179
- return { listTtlMs: 0, statusTtlMs: 0 };
180
- }
181
- const ms = parseDurationToMs(v);
182
- if (ms === null || ms === 0) {
183
- return { listTtlMs: DEFAULT_LIST_TTL_MS, statusTtlMs: 0 };
184
- }
185
- return { listTtlMs: ms, statusTtlMs: ms };
186
- }
187
- //# sourceMappingURL=flags.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"flags.js","sourceRoot":"","sources":["../../src/utils/flags.ts"],"names":[],"mappings":"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"}
@@ -1,9 +0,0 @@
1
- export type OutputFormat = 'table' | 'json' | 'jsonl' | 'tsv' | 'yaml' | 'id' | 'markdown';
2
- export declare function parseFormat(flag: string | undefined): OutputFormat;
3
- export declare function resolveFormat(): OutputFormat;
4
- export declare function resolveFields(): string[] | undefined;
5
- export declare function filterFields(headers: string[], rows: unknown[][], fields: string[] | undefined, aliases?: Record<string, string>): {
6
- headers: string[];
7
- rows: unknown[][];
8
- };
9
- export declare function renderRows(headers: string[], rows: unknown[][], format: OutputFormat, fields?: string[], aliases?: Record<string, string>): void;
@@ -1,118 +0,0 @@
1
- import { printTable, printJson, isJsonMode, UsageError, emitJsonError } from './output.js';
2
- import { getFormat, getFields } from './flags.js';
3
- import { dump as yamlDump } from 'js-yaml';
4
- export function parseFormat(flag) {
5
- if (!flag)
6
- return 'table';
7
- const lower = flag.toLowerCase();
8
- switch (lower) {
9
- case 'table': return 'table';
10
- case 'json': return 'json';
11
- case 'jsonl': return 'jsonl';
12
- case 'tsv': return 'tsv';
13
- case 'yaml': return 'yaml';
14
- case 'id': return 'id';
15
- case 'markdown': return 'markdown';
16
- default: {
17
- const msg = `Unknown --format "${flag}". Expected: table, json, jsonl, tsv, yaml, id, markdown.`;
18
- if (isJsonMode()) {
19
- emitJsonError({ code: 2, kind: 'usage', message: msg });
20
- }
21
- else {
22
- console.error(msg);
23
- }
24
- process.exit(2);
25
- }
26
- }
27
- }
28
- export function resolveFormat() {
29
- if (process.argv.includes('--json'))
30
- return 'json';
31
- return parseFormat(getFormat());
32
- }
33
- export function resolveFields() {
34
- return getFields();
35
- }
36
- export function filterFields(headers, rows, fields, aliases) {
37
- if (!fields || fields.length === 0)
38
- return { headers, rows };
39
- const resolved = aliases ? fields.map((f) => aliases[f] ?? f) : fields;
40
- const unknown = fields.filter((_, i) => !headers.includes(resolved[i]));
41
- if (unknown.length > 0) {
42
- throw new UsageError(`Unknown field(s): ${unknown.map((f) => `"${f}"`).join(', ')}. ` +
43
- `Allowed: ${headers.map((f) => `"${f}"`).join(', ')}.`);
44
- }
45
- const indices = resolved.map((f) => headers.indexOf(f));
46
- return {
47
- headers: indices.map((i) => headers[i]),
48
- rows: rows.map((row) => indices.map((i) => row[i])),
49
- };
50
- }
51
- function cellToString(cell) {
52
- if (cell === null || cell === undefined)
53
- return '';
54
- if (typeof cell === 'boolean')
55
- return cell ? 'true' : 'false';
56
- if (typeof cell === 'object')
57
- return JSON.stringify(cell);
58
- return String(cell);
59
- }
60
- function rowToObject(headers, row) {
61
- const obj = {};
62
- for (let i = 0; i < headers.length; i++) {
63
- obj[headers[i]] = row[i] ?? null;
64
- }
65
- return obj;
66
- }
67
- export function renderRows(headers, rows, format, fields, aliases) {
68
- const filtered = filterFields(headers, rows, fields, aliases);
69
- const h = filtered.headers;
70
- const r = filtered.rows;
71
- // Markdown format is rendered as table with markdown style forced regardless
72
- // of the user's --table-style, so `--format markdown` is a self-contained
73
- // contract (bug #8).
74
- if (format === 'markdown') {
75
- printTable(h, r, 'markdown');
76
- return;
77
- }
78
- switch (format) {
79
- case 'table':
80
- printTable(h, r);
81
- break;
82
- case 'json':
83
- printJson(r.map((row) => rowToObject(h, row)));
84
- break;
85
- case 'jsonl':
86
- for (const row of r) {
87
- console.log(JSON.stringify(rowToObject(h, row)));
88
- }
89
- break;
90
- case 'tsv':
91
- console.log(h.join('\t'));
92
- for (const row of r) {
93
- console.log(row.map(cellToString).join('\t'));
94
- }
95
- break;
96
- case 'yaml':
97
- for (const row of r) {
98
- const obj = rowToObject(h, row);
99
- console.log('---');
100
- console.log(yamlDump(obj, { lineWidth: -1 }).trimEnd());
101
- }
102
- break;
103
- case 'id': {
104
- const idIdx = h.indexOf('deviceId') !== -1 ? h.indexOf('deviceId')
105
- : h.indexOf('sceneId') !== -1 ? h.indexOf('sceneId')
106
- : -1;
107
- if (idIdx === -1) {
108
- throw new UsageError(`--format=id requires a "deviceId" or "sceneId" column. ` +
109
- `This command outputs: ${h.map((c) => `"${c}"`).join(', ')}.`);
110
- }
111
- for (const row of r) {
112
- console.log(cellToString(row[idIdx]));
113
- }
114
- break;
115
- }
116
- }
117
- }
118
- //# sourceMappingURL=format.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"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"}
@@ -1,48 +0,0 @@
1
- /**
2
- * Health report utilities — collects process, quota, audit, and circuit
3
- * breaker state into a single snapshot suitable for /health-style checks
4
- * and Prometheus-compatible metrics export.
5
- *
6
- * No side effects: reading is safe to call from any context.
7
- */
8
- export interface QuotaHealth {
9
- used: number;
10
- limit: number;
11
- percentUsed: number;
12
- remaining: number;
13
- status: 'ok' | 'warn' | 'critical';
14
- }
15
- export interface AuditHealth {
16
- present: boolean;
17
- recentErrors: number;
18
- recentTotal: number;
19
- errorRatePercent: number;
20
- status: 'ok' | 'warn';
21
- }
22
- export interface CircuitHealth {
23
- name: string;
24
- state: 'closed' | 'open' | 'half-open';
25
- failures: number;
26
- status: 'ok' | 'open';
27
- }
28
- export interface ProcessHealth {
29
- pid: number;
30
- uptimeSeconds: number;
31
- platform: string;
32
- nodeVersion: string;
33
- memoryMb: number;
34
- }
35
- export interface HealthReport {
36
- generatedAt: string;
37
- overall: 'ok' | 'degraded' | 'down';
38
- process: ProcessHealth;
39
- quota: QuotaHealth;
40
- audit: AuditHealth;
41
- circuit: CircuitHealth;
42
- }
43
- export declare function getHealthReport(auditPath?: string): HealthReport;
44
- /**
45
- * Render a minimal Prometheus-compatible text metrics export.
46
- * Only includes the most actionable gauges.
47
- */
48
- export declare function toPrometheusText(report: HealthReport): string;
@@ -1,102 +0,0 @@
1
- /**
2
- * Health report utilities — collects process, quota, audit, and circuit
3
- * breaker state into a single snapshot suitable for /health-style checks
4
- * and Prometheus-compatible metrics export.
5
- *
6
- * No side effects: reading is safe to call from any context.
7
- */
8
- import fs from 'node:fs';
9
- import os from 'node:os';
10
- import path from 'node:path';
11
- import { todayUsage, DAILY_QUOTA } from './quota.js';
12
- import { readAudit } from './audit.js';
13
- import { apiCircuitBreaker } from '../api/client.js';
14
- const DEFAULT_AUDIT_PATH = path.join(os.homedir(), '.switchbot', 'audit.log');
15
- const AUDIT_ERROR_WINDOW_MS = 24 * 60 * 60 * 1000; // 24h
16
- export function getHealthReport(auditPath = DEFAULT_AUDIT_PATH) {
17
- const now = new Date();
18
- // Process info
19
- const procHealth = {
20
- pid: process.pid,
21
- uptimeSeconds: Math.floor(process.uptime()),
22
- platform: process.platform,
23
- nodeVersion: process.version,
24
- memoryMb: Math.round(process.memoryUsage().rss / 1024 / 1024),
25
- };
26
- // Quota
27
- const { total: used } = todayUsage(now);
28
- const pct = Math.round((used / DAILY_QUOTA) * 100);
29
- const quotaHealth = {
30
- used,
31
- limit: DAILY_QUOTA,
32
- percentUsed: pct,
33
- remaining: Math.max(0, DAILY_QUOTA - used),
34
- status: pct >= 90 ? 'critical' : pct >= 70 ? 'warn' : 'ok',
35
- };
36
- // Audit error rate (last 24h)
37
- let auditHealth;
38
- if (!fs.existsSync(auditPath)) {
39
- auditHealth = { present: false, recentErrors: 0, recentTotal: 0, errorRatePercent: 0, status: 'ok' };
40
- }
41
- else {
42
- const entries = readAudit(auditPath);
43
- const windowStart = now.getTime() - AUDIT_ERROR_WINDOW_MS;
44
- const recent = entries.filter((e) => new Date(e.t).getTime() >= windowStart);
45
- const errors = recent.filter((e) => e.result === 'error').length;
46
- const total = recent.length;
47
- const errorRate = total > 0 ? Math.round((errors / total) * 100) : 0;
48
- auditHealth = {
49
- present: true,
50
- recentErrors: errors,
51
- recentTotal: total,
52
- errorRatePercent: errorRate,
53
- status: errorRate >= 30 ? 'warn' : 'ok',
54
- };
55
- }
56
- // Circuit breaker
57
- const cbStats = apiCircuitBreaker.getStats();
58
- const circuitHealth = {
59
- name: apiCircuitBreaker.name,
60
- state: cbStats.state,
61
- failures: cbStats.failures,
62
- status: cbStats.state === 'open' ? 'open' : 'ok',
63
- };
64
- // Overall
65
- const degraded = quotaHealth.status !== 'ok' ||
66
- auditHealth.status !== 'ok' ||
67
- circuitHealth.status !== 'ok';
68
- const down = circuitHealth.status === 'open';
69
- const overall = down ? 'down' : degraded ? 'degraded' : 'ok';
70
- return {
71
- generatedAt: now.toISOString(),
72
- overall,
73
- process: procHealth,
74
- quota: quotaHealth,
75
- audit: auditHealth,
76
- circuit: circuitHealth,
77
- };
78
- }
79
- /**
80
- * Render a minimal Prometheus-compatible text metrics export.
81
- * Only includes the most actionable gauges.
82
- */
83
- export function toPrometheusText(report) {
84
- const lines = [];
85
- const push = (name, value, help) => {
86
- if (help)
87
- lines.push(`# HELP ${name} ${help}`);
88
- lines.push(`# TYPE ${name} gauge`);
89
- lines.push(`${name} ${value}`);
90
- };
91
- push('switchbot_quota_used_total', report.quota.used, 'SwitchBot API requests used today');
92
- push('switchbot_quota_remaining', report.quota.remaining, 'SwitchBot API quota remaining today');
93
- push('switchbot_quota_percent_used', report.quota.percentUsed, 'SwitchBot API quota percent used today');
94
- push('switchbot_audit_recent_errors', report.audit.recentErrors, 'Audit log errors in the last 24h');
95
- push('switchbot_audit_error_rate_percent', report.audit.errorRatePercent, 'Audit error rate percent (last 24h)');
96
- push('switchbot_circuit_open', report.circuit.state === 'open' ? 1 : 0, 'API circuit breaker open (1=open, 0=closed/half-open)');
97
- push('switchbot_circuit_failures', report.circuit.failures, 'Consecutive API failures recorded by circuit breaker');
98
- push('switchbot_process_uptime_seconds', report.process.uptimeSeconds, 'Process uptime in seconds');
99
- push('switchbot_process_memory_mb', report.process.memoryMb, 'Process RSS memory usage in MB');
100
- return lines.join('\n') + '\n';
101
- }
102
- //# sourceMappingURL=health.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/utils/health.ts"],"names":[],"mappings":"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"}
@@ -1,39 +0,0 @@
1
- import type { Command } from 'commander';
2
- interface ArgJson {
3
- name: string;
4
- required: boolean;
5
- variadic: boolean;
6
- description: string;
7
- }
8
- interface OptionJson {
9
- flags: string;
10
- description: string;
11
- defaultValue?: unknown;
12
- choices?: string[];
13
- }
14
- interface SubcommandJson {
15
- name: string;
16
- description: string;
17
- }
18
- export interface CommandJson {
19
- name: string;
20
- description: string;
21
- /** Root-only — present only when commandToJson() is called with {includeIdentity:true}. */
22
- product?: string;
23
- domain?: string;
24
- vendor?: string;
25
- apiVersion?: string;
26
- apiDocs?: string;
27
- productCategories?: readonly string[];
28
- arguments: ArgJson[];
29
- options: OptionJson[];
30
- subcommands: SubcommandJson[];
31
- }
32
- export interface CommandToJsonOptions {
33
- /** Inject product identity fields at top level. Intended for the root program only. */
34
- includeIdentity?: boolean;
35
- }
36
- export declare function commandToJson(cmd: Command, opts?: CommandToJsonOptions): CommandJson;
37
- /** Walk argv tokens (skipping flags) to find the deepest matching subcommand. */
38
- export declare function resolveTargetCommand(root: Command, argv: string[]): Command;
39
- export {};
@@ -1,55 +0,0 @@
1
- import { IDENTITY } from '../commands/identity.js';
2
- export function commandToJson(cmd, opts = {}) {
3
- const args = cmd.registeredArguments.map((a) => ({
4
- name: a.name(),
5
- required: a.required,
6
- variadic: a.variadic,
7
- description: a.description ?? '',
8
- }));
9
- const options = cmd.options
10
- .filter((o) => o.long !== '--help' && o.long !== '--version')
11
- .map((o) => {
12
- const entry = { flags: o.flags, description: o.description ?? '' };
13
- if (o.defaultValue !== undefined)
14
- entry.defaultValue = o.defaultValue;
15
- if (o.argChoices && o.argChoices.length > 0)
16
- entry.choices = o.argChoices;
17
- return entry;
18
- });
19
- const subcommands = cmd.commands
20
- .filter((c) => !c.name().startsWith('_'))
21
- .map((c) => ({ name: c.name(), description: c.description() }));
22
- const out = {
23
- name: cmd.name(),
24
- description: cmd.description(),
25
- arguments: args,
26
- options,
27
- subcommands,
28
- };
29
- if (opts.includeIdentity) {
30
- out.product = IDENTITY.product;
31
- out.domain = IDENTITY.domain;
32
- out.vendor = IDENTITY.vendor;
33
- out.apiVersion = IDENTITY.apiVersion;
34
- out.apiDocs = IDENTITY.apiDocs;
35
- out.productCategories = IDENTITY.productCategories;
36
- }
37
- return out;
38
- }
39
- /** Walk argv tokens (skipping flags) to find the deepest matching subcommand. */
40
- export function resolveTargetCommand(root, argv) {
41
- let cmd = root;
42
- for (const token of argv) {
43
- if (token.startsWith('-'))
44
- continue;
45
- const sub = cmd.commands.find((c) => c.name() === token || c.aliases().includes(token));
46
- if (sub) {
47
- cmd = sub;
48
- }
49
- else {
50
- break;
51
- }
52
- }
53
- return cmd;
54
- }
55
- //# sourceMappingURL=help-json.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"help-json.js","sourceRoot":"","sources":["../../src/utils/help-json.ts"],"names":[],"mappings":"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"}
@@ -1,26 +0,0 @@
1
- export interface NameMatch {
2
- deviceId: string;
3
- name: string;
4
- score: number;
5
- }
6
- export type NameResolveStrategy = 'exact' | 'prefix' | 'substring' | 'fuzzy' | 'first' | 'require-unique';
7
- export interface NameResolveOptions {
8
- strategy?: NameResolveStrategy;
9
- type?: string;
10
- category?: 'physical' | 'ir';
11
- room?: string;
12
- }
13
- export type NameResolveResult = {
14
- ok: true;
15
- deviceId: string;
16
- } | {
17
- ok: false;
18
- ambiguous: true;
19
- candidates: NameMatch[];
20
- } | {
21
- ok: false;
22
- ambiguous: false;
23
- };
24
- export declare const ALL_STRATEGIES: readonly NameResolveStrategy[];
25
- export declare function isValidStrategy(s: string): s is NameResolveStrategy;
26
- export declare function resolveDeviceId(deviceId: string | undefined, nameQuery: string | undefined, opts?: NameResolveOptions): string;