@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,214 +0,0 @@
1
- import { SwitchBotMqttClient } from '../mqtt/client.js';
2
- import { fetchMqttCredential } from '../mqtt/credential.js';
3
- import { parseFilter, applyFilter } from '../utils/filter.js';
4
- import { fetchDeviceList } from '../lib/devices.js';
5
- import { getCachedDevice } from '../devices/cache.js';
6
- import { createClient } from '../api/client.js';
7
- import { log } from '../logger.js';
8
- import { deviceHistoryStore } from './device-history.js';
9
- export class EventSubscriptionManager {
10
- mqttClient = null;
11
- subscribers = new Map();
12
- ringBuffer = [];
13
- ringSize = 1000;
14
- typeMap = new Map();
15
- refreshTypeMapTimer = null;
16
- idleCleanupTimer = null;
17
- getClient;
18
- lastRefreshAttempt = 0;
19
- constructor(mqttClient, getClient) {
20
- this.mqttClient = mqttClient || null;
21
- this.getClient = getClient;
22
- }
23
- async initialize(token, secret) {
24
- if (!this.mqttClient) {
25
- const credential = await fetchMqttCredential(token, secret);
26
- const client = new SwitchBotMqttClient(credential, () => fetchMqttCredential(token, secret));
27
- client.onStateChange((state) => {
28
- if (state === 'connected') {
29
- this.emit({
30
- kind: 'events.reconnected',
31
- timestamp: Date.now(),
32
- });
33
- client.subscribe(credential.topics.status);
34
- }
35
- });
36
- client.onMessage((topic, payload) => {
37
- try {
38
- const data = JSON.parse(payload.toString());
39
- // Support SwitchBot direct format: { eventType, context: { deviceMac, deviceType, ... } }
40
- // and AWS IoT shadow format: $aws/things/<id>/shadow/... with data.state
41
- const context = data.context;
42
- const deviceId = context?.deviceMac ?? this.extractDeviceId(topic);
43
- const payloadData = context ?? data.state;
44
- const deviceType = String(context?.deviceType ?? 'Unknown');
45
- if (deviceId && payloadData) {
46
- deviceHistoryStore.record(deviceId, topic, deviceType, payloadData);
47
- this.addEvent({
48
- kind: 'shadow.updated',
49
- deviceId,
50
- payload: payloadData,
51
- timestamp: Date.now(),
52
- });
53
- }
54
- }
55
- catch (err) {
56
- log.debug({ err, topic }, 'failed to parse shadow payload');
57
- }
58
- });
59
- await client.connect();
60
- this.mqttClient = client;
61
- }
62
- this.scheduleIdleCleanup();
63
- }
64
- subscribe(id, handler, filter) {
65
- // Validate filter syntax if provided
66
- if (filter) {
67
- parseFilter(filter);
68
- }
69
- const subscriber = {
70
- id,
71
- handler,
72
- filter,
73
- lastActivity: Date.now(),
74
- };
75
- this.subscribers.set(id, subscriber);
76
- // Send recent events that match the filter
77
- for (const event of this.ringBuffer) {
78
- if (this.matchesFilter(event, filter)) {
79
- handler(event);
80
- }
81
- }
82
- return () => {
83
- this.subscribers.delete(id);
84
- };
85
- }
86
- addEvent(event) {
87
- this.ringBuffer.push(event);
88
- // Check for overflow
89
- if (this.ringBuffer.length > this.ringSize) {
90
- const droppedCount = this.ringBuffer.length - this.ringSize;
91
- const oldestTimestamp = this.ringBuffer[0]?.timestamp || Date.now();
92
- // Emit overflow notice to all subscribers
93
- this.emit({
94
- kind: 'events.dropped',
95
- count: droppedCount,
96
- sinceTs: oldestTimestamp,
97
- });
98
- // Trim buffer
99
- this.ringBuffer = this.ringBuffer.slice(-this.ringSize);
100
- }
101
- // Broadcast to matching subscribers
102
- this.emit(event);
103
- }
104
- emit(event) {
105
- for (const subscriber of this.subscribers.values()) {
106
- if (this.matchesFilter(event, subscriber.filter)) {
107
- subscriber.lastActivity = Date.now();
108
- subscriber.handler(event);
109
- }
110
- }
111
- }
112
- matchesFilter(event, filter) {
113
- if (!filter)
114
- return true;
115
- // Only filter shadow events
116
- if (event.kind !== 'shadow.updated')
117
- return true;
118
- try {
119
- // Parse filter and match against device metadata
120
- const clauses = parseFilter(filter);
121
- const deviceId = event.deviceId;
122
- // Get device info from cache
123
- const cached = getCachedDevice(deviceId);
124
- if (!cached) {
125
- // Lazily refresh type map if device unknown
126
- this.scheduleTypeMapRefresh();
127
- return false; // Conservative: drop if unknown
128
- }
129
- // Build a Device-compatible shape for applyFilter
130
- const device = {
131
- deviceId,
132
- deviceType: this.typeMap.get(deviceId) || cached.type,
133
- deviceName: cached.name,
134
- familyName: cached.familyName,
135
- roomName: cached.roomName,
136
- enableCloudService: true,
137
- hubDeviceId: '',
138
- };
139
- // Use applyFilter with single device in list
140
- const matched = applyFilter(clauses, [device], [], new Map());
141
- return matched.length > 0;
142
- }
143
- catch {
144
- return false; // Invalid filter matches nothing
145
- }
146
- }
147
- scheduleTypeMapRefresh() {
148
- if (this.refreshTypeMapTimer || Date.now() - this.lastRefreshAttempt < 5000) {
149
- return; // Already scheduled or too recent
150
- }
151
- this.refreshTypeMapTimer = setTimeout(async () => {
152
- this.refreshTypeMapTimer = null;
153
- this.lastRefreshAttempt = Date.now();
154
- try {
155
- const client = this.getClient?.() || createClient();
156
- const body = await fetchDeviceList(client);
157
- for (const d of body.deviceList) {
158
- if (d.deviceType)
159
- this.typeMap.set(d.deviceId, d.deviceType);
160
- }
161
- for (const ir of body.infraredRemoteList) {
162
- this.typeMap.set(ir.deviceId, ir.remoteType);
163
- }
164
- }
165
- catch {
166
- // Silently fail type map refresh
167
- }
168
- }, 100);
169
- }
170
- scheduleIdleCleanup() {
171
- if (this.idleCleanupTimer)
172
- return;
173
- this.idleCleanupTimer = setInterval(() => {
174
- const now = Date.now();
175
- const idleThreshold = 10 * 60 * 1000; // 10 minutes
176
- for (const [id, subscriber] of this.subscribers.entries()) {
177
- if (now - subscriber.lastActivity > idleThreshold) {
178
- this.subscribers.delete(id);
179
- }
180
- }
181
- }, 60000); // Check every minute
182
- }
183
- extractDeviceId(topic) {
184
- // Topic format: $aws/things/<deviceId>/shadow/update/accepted
185
- const match = topic.match(/\$aws\/things\/([^/]+)\/shadow/);
186
- return match ? match[1] : null;
187
- }
188
- getState() {
189
- if (!this.mqttClient)
190
- return 'disabled';
191
- return this.mqttClient.getState();
192
- }
193
- getSubscriberCount() {
194
- return this.subscribers.size;
195
- }
196
- getRecentEvents(limit = 100) {
197
- return this.ringBuffer.slice(-limit);
198
- }
199
- async shutdown() {
200
- if (this.refreshTypeMapTimer) {
201
- clearTimeout(this.refreshTypeMapTimer);
202
- }
203
- if (this.idleCleanupTimer) {
204
- clearInterval(this.idleCleanupTimer);
205
- }
206
- if (this.mqttClient) {
207
- await this.mqttClient.disconnect();
208
- this.mqttClient = null;
209
- }
210
- this.subscribers.clear();
211
- this.ringBuffer = [];
212
- }
213
- }
214
- //# sourceMappingURL=events-subscription.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"events-subscription.js","sourceRoot":"","sources":["../../src/mcp/events-subscription.ts"],"names":[],"mappings":"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"}
@@ -1,25 +0,0 @@
1
- import type { MqttCredential } from './credential.js';
2
- export type MqttState = 'connecting' | 'connected' | 'reconnecting' | 'failed' | 'disabled';
3
- export type CredentialRefreshCallback = () => Promise<MqttCredential>;
4
- export declare class SwitchBotMqttClient {
5
- private client;
6
- private credential;
7
- private state;
8
- private credentialExpired;
9
- private reconnectAttempts;
10
- private maxReconnectAttempts;
11
- private disconnecting;
12
- private handlers;
13
- private messageHandlers;
14
- private credentialRefreshCallback?;
15
- constructor(credential: MqttCredential, onCredentialExpired?: CredentialRefreshCallback);
16
- connect(): Promise<void>;
17
- private attemptReconnect;
18
- private setState;
19
- subscribe(topic: string): void;
20
- onStateChange(handler: (state: MqttState) => void): () => void;
21
- onMessage(handler: (topic: string, payload: Buffer) => void): () => void;
22
- getState(): MqttState;
23
- isConnected(): boolean;
24
- disconnect(): Promise<void>;
25
- }
@@ -1,181 +0,0 @@
1
- import { connect } from 'mqtt';
2
- export class SwitchBotMqttClient {
3
- client = null;
4
- credential;
5
- state = 'connecting';
6
- credentialExpired = false;
7
- reconnectAttempts = 0;
8
- maxReconnectAttempts = 10;
9
- disconnecting = false;
10
- handlers = new Set();
11
- messageHandlers = new Set();
12
- credentialRefreshCallback;
13
- constructor(credential, onCredentialExpired) {
14
- this.credential = credential;
15
- this.credentialRefreshCallback = onCredentialExpired;
16
- }
17
- async connect() {
18
- if (this.client && this.state === 'connected')
19
- return;
20
- // Remove stale listeners before replacing the client instance, otherwise
21
- // the old client's close event fires after the new connection is established
22
- // (AWS IoT drops the old session), triggering a spurious reconnect loop.
23
- if (this.client) {
24
- this.client.removeAllListeners();
25
- this.client.end(true);
26
- this.client = null;
27
- }
28
- this.setState('connecting');
29
- this.credentialExpired = false;
30
- this.reconnectAttempts = 0;
31
- try {
32
- const { tls, brokerUrl, clientId } = this.credential;
33
- // tls.ca/cert/keyBase64 are PEM strings despite the misleading field name
34
- const options = {
35
- clientId,
36
- ca: tls.caBase64,
37
- cert: tls.certBase64,
38
- key: tls.keyBase64,
39
- rejectUnauthorized: true,
40
- clean: true,
41
- reconnectPeriod: 0,
42
- connectTimeout: 30000,
43
- keepalive: 60,
44
- reschedulePings: true,
45
- };
46
- this.client = connect(brokerUrl, options);
47
- this.client.on('connect', () => {
48
- this.reconnectAttempts = 0;
49
- this.setState('connected');
50
- this.credentialExpired = false;
51
- });
52
- this.client.on('message', (topic, payload) => {
53
- for (const handler of this.messageHandlers) {
54
- handler(topic, payload);
55
- }
56
- });
57
- this.client.on('error', (err) => {
58
- if (err instanceof Error &&
59
- (err.message.includes('certificate') ||
60
- err.message.includes('ECONNRESET') ||
61
- err.message.includes('handshake'))) {
62
- this.credentialExpired = true;
63
- }
64
- });
65
- this.client.on('close', () => {
66
- if (this.disconnecting)
67
- return;
68
- if (this.credentialExpired) {
69
- this.setState('failed');
70
- }
71
- else if (this.reconnectAttempts < this.maxReconnectAttempts) {
72
- this.attemptReconnect();
73
- }
74
- else {
75
- this.setState('failed');
76
- }
77
- });
78
- await new Promise((resolve, reject) => {
79
- const timeout = setTimeout(() => {
80
- reject(new Error('MQTT connection timeout'));
81
- }, 15000);
82
- const onConnect = () => {
83
- clearTimeout(timeout);
84
- this.client?.removeListener('error', onError);
85
- resolve();
86
- };
87
- const onError = (err) => {
88
- clearTimeout(timeout);
89
- this.client?.removeListener('connect', onConnect);
90
- reject(err);
91
- };
92
- if (this.client?.connected) {
93
- clearTimeout(timeout);
94
- resolve();
95
- }
96
- else {
97
- this.client?.once('connect', onConnect);
98
- this.client?.once('error', onError);
99
- }
100
- });
101
- }
102
- catch (err) {
103
- this.setState('failed');
104
- throw err;
105
- }
106
- }
107
- async attemptReconnect() {
108
- this.reconnectAttempts++;
109
- this.setState('reconnecting');
110
- if (this.credentialExpired && this.credentialRefreshCallback) {
111
- try {
112
- this.credential = await this.credentialRefreshCallback();
113
- this.credentialExpired = false;
114
- }
115
- catch {
116
- this.setState('failed');
117
- return;
118
- }
119
- }
120
- const delay = Math.min(30000, 1000 * Math.pow(2, this.reconnectAttempts - 1));
121
- await new Promise((r) => setTimeout(r, delay));
122
- try {
123
- await this.connect();
124
- }
125
- catch {
126
- if (this.reconnectAttempts < this.maxReconnectAttempts) {
127
- await this.attemptReconnect();
128
- }
129
- else {
130
- this.setState('failed');
131
- }
132
- }
133
- }
134
- setState(newState) {
135
- if (this.state !== newState) {
136
- this.state = newState;
137
- for (const handler of this.handlers) {
138
- handler(newState);
139
- }
140
- }
141
- }
142
- subscribe(topic) {
143
- if (this.client && this.state === 'connected') {
144
- this.client.subscribe(topic, (err) => {
145
- if (err) {
146
- console.error(`Failed to subscribe to ${topic}:`, err);
147
- }
148
- });
149
- }
150
- }
151
- onStateChange(handler) {
152
- this.handlers.add(handler);
153
- return () => {
154
- this.handlers.delete(handler);
155
- };
156
- }
157
- onMessage(handler) {
158
- this.messageHandlers.add(handler);
159
- return () => {
160
- this.messageHandlers.delete(handler);
161
- };
162
- }
163
- getState() {
164
- return this.state;
165
- }
166
- isConnected() {
167
- return this.state === 'connected' && this.client?.connected === true;
168
- }
169
- async disconnect() {
170
- this.disconnecting = true;
171
- if (this.client) {
172
- await new Promise((resolve) => {
173
- this.client?.end(false, () => resolve());
174
- });
175
- this.client = null;
176
- }
177
- this.disconnecting = false;
178
- this.setState('failed');
179
- }
180
- }
181
- //# sourceMappingURL=client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/mqtt/client.ts"],"names":[],"mappings":"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"}
@@ -1,16 +0,0 @@
1
- export interface MqttCredential {
2
- brokerUrl: string;
3
- region: string;
4
- clientId: string;
5
- topics: {
6
- status: string;
7
- };
8
- qos: number;
9
- tls: {
10
- enabled: boolean;
11
- caBase64: string;
12
- certBase64: string;
13
- keyBase64: string;
14
- };
15
- }
16
- export declare function fetchMqttCredential(token: string, secret: string): Promise<MqttCredential>;
@@ -1,31 +0,0 @@
1
- import crypto from 'node:crypto';
2
- import { buildAuthHeaders } from '../auth.js';
3
- const CREDENTIAL_ENDPOINT = 'https://api.switchbot.net/v1.1/iot/credential';
4
- export async function fetchMqttCredential(token, secret) {
5
- // Use a random instanceId so each CLI session gets its own clientId, avoiding
6
- // conflicts with the SwitchBot cloud service that shares the same account credentials.
7
- const instanceId = crypto.randomUUID().replace(/-/g, '').slice(0, 16);
8
- const headers = buildAuthHeaders(token, secret);
9
- const res = await fetch(CREDENTIAL_ENDPOINT, {
10
- method: 'POST',
11
- headers,
12
- body: JSON.stringify({ instanceId }),
13
- signal: AbortSignal.timeout(15000),
14
- });
15
- if (!res.ok) {
16
- throw new Error(`MQTT credential request failed: HTTP ${res.status} ${res.statusText}`);
17
- }
18
- const json = (await res.json());
19
- if (json.statusCode !== 100) {
20
- throw new Error(`MQTT credential API error: statusCode ${json.statusCode}`);
21
- }
22
- // Response shape: { statusCode, body: { body: { channels: { mqtt: ... } } } }
23
- const outer = json.body;
24
- const inner = (outer.body ?? outer);
25
- const channels = inner.channels;
26
- if (!channels?.mqtt) {
27
- throw new Error('Unexpected MQTT credential response — channels.mqtt missing');
28
- }
29
- return channels.mqtt;
30
- }
31
- //# sourceMappingURL=credential.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"credential.js","sourceRoot":"","sources":["../../src/mqtt/credential.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAkB9C,MAAM,mBAAmB,GAAG,+CAA+C,CAAC;AAE5E,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,KAAa,EAAE,MAAc;IACrE,8EAA8E;IAC9E,uFAAuF;IACvF,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEtE,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAChD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,mBAAmB,EAAE;QAC3C,MAAM,EAAE,MAAM;QACd,OAAO;QACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,CAAC;QACpC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;KACnC,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,wCAAwC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IAC1F,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA0C,CAAC;IAEzE,IAAI,IAAI,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,yCAAyC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,8EAA8E;IAC9E,MAAM,KAAK,GAAG,IAAI,CAAC,IAA+B,CAAC;IACnD,MAAM,KAAK,GAAG,CAAE,KAAK,CAAC,IAA4C,IAAI,KAAK,CAA4B,CAAC;IACxG,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAgD,CAAC;IAExE,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IACjF,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,CAAC;AACvB,CAAC"}
@@ -1,21 +0,0 @@
1
- export interface AddRuleOptions {
2
- ruleYaml: string;
3
- policyPath: string;
4
- enableAutomation?: boolean;
5
- force?: boolean;
6
- }
7
- export interface AddRuleResult {
8
- ruleName: string;
9
- diff: string;
10
- nextSource: string;
11
- }
12
- export declare class AddRuleError extends Error {
13
- readonly code: string;
14
- constructor(message: string, code: string);
15
- }
16
- export declare function addRuleToPolicySource(opts: AddRuleOptions): AddRuleResult;
17
- export declare function addRuleToPolicyFile(opts: AddRuleOptions & {
18
- dryRun?: boolean;
19
- }): AddRuleResult & {
20
- written: boolean;
21
- };
@@ -1,125 +0,0 @@
1
- import { parseDocument, isMap, isSeq, isScalar, LineCounter } from 'yaml';
2
- import { parse as yamlParse } from 'yaml';
3
- import { loadPolicyFile } from './load.js';
4
- import { validateLoadedPolicy } from './validate.js';
5
- import fs from 'node:fs';
6
- export class AddRuleError extends Error {
7
- code;
8
- constructor(message, code) {
9
- super(message);
10
- this.code = code;
11
- this.name = 'AddRuleError';
12
- }
13
- }
14
- function buildDiff(before, after) {
15
- const beforeLines = before.split('\n');
16
- const afterLines = after.split('\n');
17
- const lines = ['--- before', '+++ after'];
18
- let i = 0;
19
- let j = 0;
20
- while (i < beforeLines.length || j < afterLines.length) {
21
- const b = beforeLines[i];
22
- const a = afterLines[j];
23
- if (i < beforeLines.length && j < afterLines.length && b === a) {
24
- lines.push(` ${b}`);
25
- i++;
26
- j++;
27
- }
28
- else if (j < afterLines.length && (i >= beforeLines.length || b !== a)) {
29
- lines.push(`+${a}`);
30
- j++;
31
- }
32
- else {
33
- lines.push(`-${b}`);
34
- i++;
35
- }
36
- }
37
- return lines.join('\n');
38
- }
39
- function isNullNode(node) {
40
- return isScalar(node) && node.value === null;
41
- }
42
- export function addRuleToPolicySource(opts) {
43
- const loaded = loadPolicyFile(opts.policyPath);
44
- const beforeSource = loaded.source;
45
- // Parse the incoming rule
46
- let ruleObj;
47
- try {
48
- ruleObj = yamlParse(opts.ruleYaml);
49
- }
50
- catch (err) {
51
- throw new AddRuleError(`Could not parse rule YAML: ${err.message}`, 'invalid-rule-yaml');
52
- }
53
- if (!ruleObj || typeof ruleObj !== 'object' || Array.isArray(ruleObj)) {
54
- throw new AddRuleError('Rule YAML must be a single mapping object', 'invalid-rule-shape');
55
- }
56
- const ruleName = ruleObj['name'];
57
- if (typeof ruleName !== 'string' || !ruleName) {
58
- throw new AddRuleError('Rule must have a non-empty "name" field', 'missing-rule-name');
59
- }
60
- // Clone the document using source round-trip (preserves comments)
61
- const clone = parseDocument(beforeSource, { keepSourceTokens: true });
62
- if (!isMap(clone.contents)) {
63
- throw new AddRuleError('Policy root must be a YAML mapping', 'invalid-policy-shape');
64
- }
65
- // Ensure automation block exists
66
- let automationNode = clone.contents.get('automation', true);
67
- if (!automationNode || isNullNode(automationNode)) {
68
- clone.setIn(['automation'], clone.createNode({ enabled: false, rules: [] }));
69
- automationNode = clone.contents.get('automation', true);
70
- }
71
- // Ensure automation.rules exists and is a sequence
72
- const rulesNode = clone.getIn(['automation', 'rules'], true);
73
- if (!rulesNode || isNullNode(rulesNode)) {
74
- clone.setIn(['automation', 'rules'], clone.createNode([]));
75
- }
76
- else if (!isSeq(rulesNode)) {
77
- throw new AddRuleError('automation.rules exists but is not a sequence; cannot append', 'invalid-rules-shape');
78
- }
79
- // Duplicate name check — use JS conversion for simplicity
80
- const policyJs = clone.toJS({ maxAliasCount: 100 });
81
- const existingRulesJs = policyJs['automation']?.['rules'];
82
- const existingRulesArr = Array.isArray(existingRulesJs) ? existingRulesJs : [];
83
- const duplicateIdx = existingRulesArr.findIndex((r) => r?.['name'] === ruleName);
84
- if (duplicateIdx !== -1 && !opts.force) {
85
- throw new AddRuleError(`Rule named "${ruleName}" already exists. Use --force to overwrite.`, 'duplicate-rule-name');
86
- }
87
- if (duplicateIdx !== -1 && opts.force) {
88
- const rulesSeq = clone.getIn(['automation', 'rules'], true);
89
- rulesSeq.items.splice(duplicateIdx, 1);
90
- }
91
- // Enable automation if requested
92
- if (opts.enableAutomation) {
93
- clone.setIn(['automation', 'enabled'], true);
94
- }
95
- // Append the rule
96
- const ruleNode = clone.createNode(ruleObj);
97
- const rulesSeq = clone.getIn(['automation', 'rules'], true);
98
- rulesSeq.items.push(ruleNode);
99
- const nextSource = String(clone);
100
- // Validate the resulting policy
101
- const reLC = new LineCounter();
102
- const reDoc = parseDocument(nextSource, { lineCounter: reLC, keepSourceTokens: true });
103
- const validation = validateLoadedPolicy({
104
- path: opts.policyPath,
105
- source: nextSource,
106
- doc: reDoc,
107
- lineCounter: reLC,
108
- data: reDoc.toJS({ maxAliasCount: 100 }),
109
- });
110
- if (!validation.valid) {
111
- const msgs = validation.errors.map((e) => ` line ${e.line}: ${e.message}`).join('\n');
112
- throw new AddRuleError(`Policy would be invalid after adding the rule:\n${msgs}`, 'validation-failed');
113
- }
114
- const diff = buildDiff(beforeSource, nextSource);
115
- return { ruleName, diff, nextSource };
116
- }
117
- export function addRuleToPolicyFile(opts) {
118
- const result = addRuleToPolicySource(opts);
119
- if (!opts.dryRun) {
120
- fs.writeFileSync(opts.policyPath, result.nextSource, 'utf8');
121
- return { ...result, written: true };
122
- }
123
- return { ...result, written: false };
124
- }
125
- //# sourceMappingURL=add-rule.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"add-rule.js","sourceRoot":"","sources":["../../src/policy/add-rule.ts"],"names":[],"mappings":"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"}