@switchbot/openapi-cli 3.2.1 → 3.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/dist/index.js +57419 -170
- package/package.json +9 -5
- package/dist/api/client.d.ts +0 -31
- package/dist/api/client.js +0 -236
- package/dist/api/client.js.map +0 -1
- package/dist/auth.d.ts +0 -1
- package/dist/auth.js +0 -21
- package/dist/auth.js.map +0 -1
- package/dist/commands/agent-bootstrap.d.ts +0 -10
- package/dist/commands/agent-bootstrap.js +0 -200
- package/dist/commands/agent-bootstrap.js.map +0 -1
- package/dist/commands/auth.d.ts +0 -18
- package/dist/commands/auth.js +0 -355
- package/dist/commands/auth.js.map +0 -1
- package/dist/commands/batch.d.ts +0 -2
- package/dist/commands/batch.js +0 -414
- package/dist/commands/batch.js.map +0 -1
- package/dist/commands/cache.d.ts +0 -2
- package/dist/commands/cache.js +0 -127
- package/dist/commands/cache.js.map +0 -1
- package/dist/commands/capabilities.d.ts +0 -31
- package/dist/commands/capabilities.js +0 -383
- package/dist/commands/capabilities.js.map +0 -1
- package/dist/commands/catalog.d.ts +0 -2
- package/dist/commands/catalog.js +0 -360
- package/dist/commands/catalog.js.map +0 -1
- package/dist/commands/completion.d.ts +0 -2
- package/dist/commands/completion.js +0 -386
- package/dist/commands/completion.js.map +0 -1
- package/dist/commands/config.d.ts +0 -21
- package/dist/commands/config.js +0 -377
- package/dist/commands/config.js.map +0 -1
- package/dist/commands/daemon.d.ts +0 -2
- package/dist/commands/daemon.js +0 -411
- package/dist/commands/daemon.js.map +0 -1
- package/dist/commands/device-meta.d.ts +0 -2
- package/dist/commands/device-meta.js +0 -160
- package/dist/commands/device-meta.js.map +0 -1
- package/dist/commands/devices.d.ts +0 -2
- package/dist/commands/devices.js +0 -949
- package/dist/commands/devices.js.map +0 -1
- package/dist/commands/doctor.d.ts +0 -3
- package/dist/commands/doctor.js +0 -1016
- package/dist/commands/doctor.js.map +0 -1
- package/dist/commands/events.d.ts +0 -31
- package/dist/commands/events.js +0 -564
- package/dist/commands/events.js.map +0 -1
- package/dist/commands/expand.d.ts +0 -2
- package/dist/commands/expand.js +0 -131
- package/dist/commands/expand.js.map +0 -1
- package/dist/commands/explain.d.ts +0 -2
- package/dist/commands/explain.js +0 -140
- package/dist/commands/explain.js.map +0 -1
- package/dist/commands/health.d.ts +0 -8
- package/dist/commands/health.js +0 -114
- package/dist/commands/health.js.map +0 -1
- package/dist/commands/history.d.ts +0 -2
- package/dist/commands/history.js +0 -321
- package/dist/commands/history.js.map +0 -1
- package/dist/commands/identity.d.ts +0 -45
- package/dist/commands/identity.js +0 -60
- package/dist/commands/identity.js.map +0 -1
- package/dist/commands/install.d.ts +0 -20
- package/dist/commands/install.js +0 -247
- package/dist/commands/install.js.map +0 -1
- package/dist/commands/mcp.d.ts +0 -14
- package/dist/commands/mcp.js +0 -2018
- package/dist/commands/mcp.js.map +0 -1
- package/dist/commands/plan.d.ts +0 -51
- package/dist/commands/plan.js +0 -654
- package/dist/commands/plan.js.map +0 -1
- package/dist/commands/policy.d.ts +0 -24
- package/dist/commands/policy.js +0 -587
- package/dist/commands/policy.js.map +0 -1
- package/dist/commands/quota.d.ts +0 -2
- package/dist/commands/quota.js +0 -79
- package/dist/commands/quota.js.map +0 -1
- package/dist/commands/rules.d.ts +0 -2
- package/dist/commands/rules.js +0 -876
- package/dist/commands/rules.js.map +0 -1
- package/dist/commands/scenes.d.ts +0 -2
- package/dist/commands/scenes.js +0 -265
- package/dist/commands/scenes.js.map +0 -1
- package/dist/commands/schema.d.ts +0 -2
- package/dist/commands/schema.js +0 -185
- package/dist/commands/schema.js.map +0 -1
- package/dist/commands/status-sync.d.ts +0 -2
- package/dist/commands/status-sync.js +0 -132
- package/dist/commands/status-sync.js.map +0 -1
- package/dist/commands/uninstall.d.ts +0 -20
- package/dist/commands/uninstall.js +0 -238
- package/dist/commands/uninstall.js.map +0 -1
- package/dist/commands/upgrade-check.d.ts +0 -2
- package/dist/commands/upgrade-check.js +0 -107
- package/dist/commands/upgrade-check.js.map +0 -1
- package/dist/commands/watch.d.ts +0 -2
- package/dist/commands/watch.js +0 -195
- package/dist/commands/watch.js.map +0 -1
- package/dist/commands/webhook.d.ts +0 -2
- package/dist/commands/webhook.js +0 -183
- package/dist/commands/webhook.js.map +0 -1
- package/dist/config.d.ts +0 -57
- package/dist/config.js +0 -259
- package/dist/config.js.map +0 -1
- package/dist/credentials/backends/file.d.ts +0 -18
- package/dist/credentials/backends/file.js +0 -102
- package/dist/credentials/backends/file.js.map +0 -1
- package/dist/credentials/backends/linux.d.ts +0 -16
- package/dist/credentials/backends/linux.js +0 -130
- package/dist/credentials/backends/linux.js.map +0 -1
- package/dist/credentials/backends/macos.d.ts +0 -18
- package/dist/credentials/backends/macos.js +0 -130
- package/dist/credentials/backends/macos.js.map +0 -1
- package/dist/credentials/backends/windows.d.ts +0 -23
- package/dist/credentials/backends/windows.js +0 -216
- package/dist/credentials/backends/windows.js.map +0 -1
- package/dist/credentials/keychain.d.ts +0 -83
- package/dist/credentials/keychain.js +0 -89
- package/dist/credentials/keychain.js.map +0 -1
- package/dist/credentials/prime.d.ts +0 -32
- package/dist/credentials/prime.js +0 -53
- package/dist/credentials/prime.js.map +0 -1
- package/dist/devices/cache.d.ts +0 -79
- package/dist/devices/cache.js +0 -294
- package/dist/devices/cache.js.map +0 -1
- package/dist/devices/catalog.d.ts +0 -138
- package/dist/devices/catalog.js +0 -768
- package/dist/devices/catalog.js.map +0 -1
- package/dist/devices/device-meta.d.ts +0 -15
- package/dist/devices/device-meta.js +0 -57
- package/dist/devices/device-meta.js.map +0 -1
- package/dist/devices/history-agg.d.ts +0 -37
- package/dist/devices/history-agg.js +0 -139
- package/dist/devices/history-agg.js.map +0 -1
- package/dist/devices/history-query.d.ts +0 -45
- package/dist/devices/history-query.js +0 -182
- package/dist/devices/history-query.js.map +0 -1
- package/dist/devices/param-validator.d.ts +0 -40
- package/dist/devices/param-validator.js +0 -434
- package/dist/devices/param-validator.js.map +0 -1
- package/dist/devices/resources.d.ts +0 -74
- package/dist/devices/resources.js +0 -271
- package/dist/devices/resources.js.map +0 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js.map +0 -1
- package/dist/install/default-steps.d.ts +0 -66
- package/dist/install/default-steps.js +0 -258
- package/dist/install/default-steps.js.map +0 -1
- package/dist/install/preflight.d.ts +0 -60
- package/dist/install/preflight.js +0 -213
- package/dist/install/preflight.js.map +0 -1
- package/dist/install/steps.d.ts +0 -61
- package/dist/install/steps.js +0 -68
- package/dist/install/steps.js.map +0 -1
- package/dist/lib/command-keywords.d.ts +0 -5
- package/dist/lib/command-keywords.js +0 -18
- package/dist/lib/command-keywords.js.map +0 -1
- package/dist/lib/daemon-state.d.ts +0 -24
- package/dist/lib/daemon-state.js +0 -47
- package/dist/lib/daemon-state.js.map +0 -1
- package/dist/lib/destructive-mode.d.ts +0 -2
- package/dist/lib/destructive-mode.js +0 -13
- package/dist/lib/destructive-mode.js.map +0 -1
- package/dist/lib/devices.d.ts +0 -151
- package/dist/lib/devices.js +0 -383
- package/dist/lib/devices.js.map +0 -1
- package/dist/lib/idempotency.d.ts +0 -46
- package/dist/lib/idempotency.js +0 -107
- package/dist/lib/idempotency.js.map +0 -1
- package/dist/lib/plan-store.d.ts +0 -19
- package/dist/lib/plan-store.js +0 -69
- package/dist/lib/plan-store.js.map +0 -1
- package/dist/lib/request-context.d.ts +0 -7
- package/dist/lib/request-context.js +0 -13
- package/dist/lib/request-context.js.map +0 -1
- package/dist/lib/scenes.d.ts +0 -7
- package/dist/lib/scenes.js +0 -11
- package/dist/lib/scenes.js.map +0 -1
- package/dist/logger.d.ts +0 -4
- package/dist/logger.js +0 -17
- package/dist/logger.js.map +0 -1
- package/dist/mcp/device-history.d.ts +0 -36
- package/dist/mcp/device-history.js +0 -146
- package/dist/mcp/device-history.js.map +0 -1
- package/dist/mcp/events-subscription.d.ts +0 -45
- package/dist/mcp/events-subscription.js +0 -214
- package/dist/mcp/events-subscription.js.map +0 -1
- package/dist/mqtt/client.d.ts +0 -25
- package/dist/mqtt/client.js +0 -181
- package/dist/mqtt/client.js.map +0 -1
- package/dist/mqtt/credential.d.ts +0 -16
- package/dist/mqtt/credential.js +0 -31
- package/dist/mqtt/credential.js.map +0 -1
- package/dist/policy/add-rule.d.ts +0 -21
- package/dist/policy/add-rule.js +0 -125
- package/dist/policy/add-rule.js.map +0 -1
- package/dist/policy/diff.d.ts +0 -21
- package/dist/policy/diff.js +0 -92
- package/dist/policy/diff.js.map +0 -1
- package/dist/policy/format.d.ts +0 -6
- package/dist/policy/format.js +0 -58
- package/dist/policy/format.js.map +0 -1
- package/dist/policy/load.d.ts +0 -32
- package/dist/policy/load.js +0 -62
- package/dist/policy/load.js.map +0 -1
- package/dist/policy/migrate.d.ts +0 -21
- package/dist/policy/migrate.js +0 -68
- package/dist/policy/migrate.js.map +0 -1
- package/dist/policy/schema.d.ts +0 -5
- package/dist/policy/schema.js +0 -19
- package/dist/policy/schema.js.map +0 -1
- package/dist/policy/validate.d.ts +0 -19
- package/dist/policy/validate.js +0 -263
- package/dist/policy/validate.js.map +0 -1
- package/dist/rules/action.d.ts +0 -65
- package/dist/rules/action.js +0 -217
- package/dist/rules/action.js.map +0 -1
- package/dist/rules/audit-query.d.ts +0 -51
- package/dist/rules/audit-query.js +0 -90
- package/dist/rules/audit-query.js.map +0 -1
- package/dist/rules/conflict-analyzer.d.ts +0 -57
- package/dist/rules/conflict-analyzer.js +0 -215
- package/dist/rules/conflict-analyzer.js.map +0 -1
- package/dist/rules/cron-scheduler.d.ts +0 -62
- package/dist/rules/cron-scheduler.js +0 -187
- package/dist/rules/cron-scheduler.js.map +0 -1
- package/dist/rules/destructive.d.ts +0 -20
- package/dist/rules/destructive.js +0 -53
- package/dist/rules/destructive.js.map +0 -1
- package/dist/rules/engine.d.ts +0 -193
- package/dist/rules/engine.js +0 -758
- package/dist/rules/engine.js.map +0 -1
- package/dist/rules/matcher.d.ts +0 -56
- package/dist/rules/matcher.js +0 -231
- package/dist/rules/matcher.js.map +0 -1
- package/dist/rules/pid-file.d.ts +0 -43
- package/dist/rules/pid-file.js +0 -96
- package/dist/rules/pid-file.js.map +0 -1
- package/dist/rules/quiet-hours.d.ts +0 -26
- package/dist/rules/quiet-hours.js +0 -46
- package/dist/rules/quiet-hours.js.map +0 -1
- package/dist/rules/suggest.d.ts +0 -20
- package/dist/rules/suggest.js +0 -96
- package/dist/rules/suggest.js.map +0 -1
- package/dist/rules/throttle.d.ts +0 -61
- package/dist/rules/throttle.js +0 -117
- package/dist/rules/throttle.js.map +0 -1
- package/dist/rules/types.d.ts +0 -117
- package/dist/rules/types.js +0 -35
- package/dist/rules/types.js.map +0 -1
- package/dist/rules/webhook-listener.d.ts +0 -63
- package/dist/rules/webhook-listener.js +0 -224
- package/dist/rules/webhook-listener.js.map +0 -1
- package/dist/rules/webhook-token.d.ts +0 -50
- package/dist/rules/webhook-token.js +0 -91
- package/dist/rules/webhook-token.js.map +0 -1
- package/dist/schema/field-aliases.d.ts +0 -34
- package/dist/schema/field-aliases.js +0 -132
- package/dist/schema/field-aliases.js.map +0 -1
- package/dist/sinks/dispatcher.d.ts +0 -7
- package/dist/sinks/dispatcher.js +0 -13
- package/dist/sinks/dispatcher.js.map +0 -1
- package/dist/sinks/file.d.ts +0 -6
- package/dist/sinks/file.js +0 -20
- package/dist/sinks/file.js.map +0 -1
- package/dist/sinks/format.d.ts +0 -20
- package/dist/sinks/format.js +0 -57
- package/dist/sinks/format.js.map +0 -1
- package/dist/sinks/homeassistant.d.ts +0 -18
- package/dist/sinks/homeassistant.js +0 -45
- package/dist/sinks/homeassistant.js.map +0 -1
- package/dist/sinks/openclaw.d.ts +0 -13
- package/dist/sinks/openclaw.js +0 -34
- package/dist/sinks/openclaw.js.map +0 -1
- package/dist/sinks/stdout.d.ts +0 -4
- package/dist/sinks/stdout.js +0 -6
- package/dist/sinks/stdout.js.map +0 -1
- package/dist/sinks/telegram.d.ts +0 -11
- package/dist/sinks/telegram.js +0 -29
- package/dist/sinks/telegram.js.map +0 -1
- package/dist/sinks/types.d.ts +0 -13
- package/dist/sinks/types.js +0 -2
- package/dist/sinks/types.js.map +0 -1
- package/dist/sinks/webhook.d.ts +0 -6
- package/dist/sinks/webhook.js +0 -23
- package/dist/sinks/webhook.js.map +0 -1
- package/dist/status-sync/manager.d.ts +0 -48
- package/dist/status-sync/manager.js +0 -269
- package/dist/status-sync/manager.js.map +0 -1
- package/dist/utils/arg-parsers.d.ts +0 -16
- package/dist/utils/arg-parsers.js +0 -67
- package/dist/utils/arg-parsers.js.map +0 -1
- package/dist/utils/audit.d.ts +0 -69
- package/dist/utils/audit.js +0 -122
- package/dist/utils/audit.js.map +0 -1
- package/dist/utils/filter.d.ts +0 -81
- package/dist/utils/filter.js +0 -190
- package/dist/utils/filter.js.map +0 -1
- package/dist/utils/flags.d.ts +0 -72
- package/dist/utils/flags.js +0 -187
- package/dist/utils/flags.js.map +0 -1
- package/dist/utils/format.d.ts +0 -9
- package/dist/utils/format.js +0 -118
- package/dist/utils/format.js.map +0 -1
- package/dist/utils/health.d.ts +0 -48
- package/dist/utils/health.js +0 -102
- package/dist/utils/health.js.map +0 -1
- package/dist/utils/help-json.d.ts +0 -39
- package/dist/utils/help-json.js +0 -55
- package/dist/utils/help-json.js.map +0 -1
- package/dist/utils/name-resolver.d.ts +0 -26
- package/dist/utils/name-resolver.js +0 -138
- package/dist/utils/name-resolver.js.map +0 -1
- package/dist/utils/output.d.ts +0 -73
- package/dist/utils/output.js +0 -405
- package/dist/utils/output.js.map +0 -1
- package/dist/utils/quota.d.ts +0 -61
- package/dist/utils/quota.js +0 -228
- package/dist/utils/quota.js.map +0 -1
- package/dist/utils/redact.d.ts +0 -23
- package/dist/utils/redact.js +0 -69
- package/dist/utils/redact.js.map +0 -1
- package/dist/utils/retry.d.ts +0 -72
- package/dist/utils/retry.js +0 -141
- package/dist/utils/retry.js.map +0 -1
- package/dist/utils/string.d.ts +0 -2
- package/dist/utils/string.js +0 -23
- package/dist/utils/string.js.map +0 -1
- package/dist/version.d.ts +0 -2
- package/dist/version.js +0 -5
- package/dist/version.js.map +0 -1
package/dist/lib/idempotency.js
DELETED
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* In-memory LRU cache for idempotent request deduplication.
|
|
3
|
-
* Caches the outcome of a keyed operation for 60 seconds;
|
|
4
|
-
* duplicate keys within the window return the cached result (with a
|
|
5
|
-
* `replayed: true` marker). Duplicate keys within the window for a DIFFERENT
|
|
6
|
-
* (command, parameter) shape raise {@link IdempotencyConflictError}.
|
|
7
|
-
*
|
|
8
|
-
* Keys are stored in-memory as a SHA-256 fingerprint of the user-provided
|
|
9
|
-
* key — the original string never touches the Map keys, so a later heap dump
|
|
10
|
-
* or inadvertent log capture does not leak the raw token.
|
|
11
|
-
*
|
|
12
|
-
* Process-local only — not shared across replicas.
|
|
13
|
-
*/
|
|
14
|
-
import crypto from 'node:crypto';
|
|
15
|
-
const DEFAULT_TTL_MS = 60000; // 60 seconds
|
|
16
|
-
const DEFAULT_MAX_ENTRIES = 1024;
|
|
17
|
-
export class IdempotencyConflictError extends Error {
|
|
18
|
-
key;
|
|
19
|
-
existingShape;
|
|
20
|
-
newShape;
|
|
21
|
-
constructor(message, key, existingShape, newShape) {
|
|
22
|
-
super(message);
|
|
23
|
-
this.key = key;
|
|
24
|
-
this.existingShape = existingShape;
|
|
25
|
-
this.newShape = newShape;
|
|
26
|
-
this.name = 'IdempotencyConflictError';
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
function hashKey(key) {
|
|
30
|
-
return crypto.createHash('sha256').update(key).digest('hex');
|
|
31
|
-
}
|
|
32
|
-
function shapeSignature(command, parameter) {
|
|
33
|
-
// Canonical-ish JSON — stable enough for object equality with no nested sort
|
|
34
|
-
// (callers can pass primitives or small objects).
|
|
35
|
-
let parm;
|
|
36
|
-
try {
|
|
37
|
-
parm = JSON.stringify(parameter ?? 'default');
|
|
38
|
-
}
|
|
39
|
-
catch {
|
|
40
|
-
parm = String(parameter);
|
|
41
|
-
}
|
|
42
|
-
return `${command}::${parm}`;
|
|
43
|
-
}
|
|
44
|
-
export class IdempotencyCache {
|
|
45
|
-
cache = new Map();
|
|
46
|
-
ttlMs;
|
|
47
|
-
maxEntries;
|
|
48
|
-
constructor(ttlMs, maxEntries) {
|
|
49
|
-
this.ttlMs = ttlMs ?? DEFAULT_TTL_MS;
|
|
50
|
-
this.maxEntries = maxEntries ?? DEFAULT_MAX_ENTRIES;
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Execute fn if the key is not cached, or return the cached result if it is.
|
|
54
|
-
* On new execution, caches the result for ttlMs.
|
|
55
|
-
*
|
|
56
|
-
* When `shape` is provided, a cached hit is validated against the original
|
|
57
|
-
* (command, parameter) fingerprint; mismatched shape raises
|
|
58
|
-
* {@link IdempotencyConflictError}.
|
|
59
|
-
*
|
|
60
|
-
* Returns a tuple-esque object with `replayed: true` when the cached
|
|
61
|
-
* result is served. The `result` field is the original cached value.
|
|
62
|
-
*/
|
|
63
|
-
async run(key, fn, shape) {
|
|
64
|
-
if (!key) {
|
|
65
|
-
const result = await fn();
|
|
66
|
-
return { result, replayed: false };
|
|
67
|
-
}
|
|
68
|
-
const hashed = hashKey(key);
|
|
69
|
-
const now = Date.now();
|
|
70
|
-
const cached = this.cache.get(hashed);
|
|
71
|
-
const currentShape = shape ? shapeSignature(shape.command, shape.parameter) : '*';
|
|
72
|
-
if (cached && cached.expiresAt > now) {
|
|
73
|
-
if (shape && cached.shape !== '*' && cached.shape !== currentShape) {
|
|
74
|
-
throw new IdempotencyConflictError(`idempotency_conflict: key was first used for ${cached.shape.replace('::', ' ')}; refusing new shape ${currentShape.replace('::', ' ')}`, '<redacted>', cached.shape, currentShape);
|
|
75
|
-
}
|
|
76
|
-
return { result: cached.result, replayed: true };
|
|
77
|
-
}
|
|
78
|
-
const result = await fn();
|
|
79
|
-
if (this.cache.size >= this.maxEntries) {
|
|
80
|
-
const toRemove = Math.ceil(this.maxEntries * 0.1);
|
|
81
|
-
let removed = 0;
|
|
82
|
-
for (const [k, v] of this.cache.entries()) {
|
|
83
|
-
if (removed >= toRemove)
|
|
84
|
-
break;
|
|
85
|
-
if (v.expiresAt <= now) {
|
|
86
|
-
this.cache.delete(k);
|
|
87
|
-
removed++;
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
if (this.cache.size >= this.maxEntries) {
|
|
91
|
-
const firstKey = this.cache.keys().next().value;
|
|
92
|
-
if (firstKey)
|
|
93
|
-
this.cache.delete(firstKey);
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
this.cache.set(hashed, { result, expiresAt: now + this.ttlMs, shape: currentShape });
|
|
97
|
-
return { result, replayed: false };
|
|
98
|
-
}
|
|
99
|
-
clear() {
|
|
100
|
-
this.cache.clear();
|
|
101
|
-
}
|
|
102
|
-
size() {
|
|
103
|
-
return this.cache.size;
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
export const idempotencyCache = new IdempotencyCache();
|
|
107
|
-
//# sourceMappingURL=idempotency.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"idempotency.js","sourceRoot":"","sources":["../../src/lib/idempotency.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/plan-store.d.ts
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import type { Plan } from '../commands/plan.js';
|
|
2
|
-
export declare const PLANS_DIR: string;
|
|
3
|
-
export type PlanStatus = 'pending' | 'approved' | 'rejected' | 'executed' | 'failed';
|
|
4
|
-
export interface PlanRecord {
|
|
5
|
-
planId: string;
|
|
6
|
-
createdAt: string;
|
|
7
|
-
status: PlanStatus;
|
|
8
|
-
approvedAt?: string;
|
|
9
|
-
executedAt?: string;
|
|
10
|
-
/** Set when status transitions to 'failed'. */
|
|
11
|
-
failedAt?: string;
|
|
12
|
-
/** Summary of why the plan failed (e.g. "1 error, 2 skipped"). */
|
|
13
|
-
failureReason?: string;
|
|
14
|
-
plan: Plan;
|
|
15
|
-
}
|
|
16
|
-
export declare function savePlanRecord(plan: Plan): PlanRecord;
|
|
17
|
-
export declare function loadPlanRecord(planId: string): PlanRecord | null;
|
|
18
|
-
export declare function updatePlanRecord(planId: string, updates: Partial<PlanRecord>): PlanRecord;
|
|
19
|
-
export declare function listPlanRecords(): PlanRecord[];
|
package/dist/lib/plan-store.js
DELETED
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import fs from 'node:fs';
|
|
2
|
-
import os from 'node:os';
|
|
3
|
-
import path from 'node:path';
|
|
4
|
-
import { randomUUID } from 'node:crypto';
|
|
5
|
-
export const PLANS_DIR = path.join(os.homedir(), '.switchbot', 'plans');
|
|
6
|
-
function ensurePlansDir() {
|
|
7
|
-
fs.mkdirSync(PLANS_DIR, { recursive: true, mode: 0o700 });
|
|
8
|
-
}
|
|
9
|
-
function planPath(planId) {
|
|
10
|
-
return path.join(PLANS_DIR, `${planId}.json`);
|
|
11
|
-
}
|
|
12
|
-
const UUID_V4_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
13
|
-
function assertValidPlanId(planId) {
|
|
14
|
-
if (!UUID_V4_RE.test(planId)) {
|
|
15
|
-
throw new Error(`invalid planId: ${planId}`);
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
export function savePlanRecord(plan) {
|
|
19
|
-
ensurePlansDir();
|
|
20
|
-
const record = {
|
|
21
|
-
planId: randomUUID(),
|
|
22
|
-
createdAt: new Date().toISOString(),
|
|
23
|
-
status: 'pending',
|
|
24
|
-
plan,
|
|
25
|
-
};
|
|
26
|
-
fs.writeFileSync(planPath(record.planId), JSON.stringify(record, null, 2), { mode: 0o600 });
|
|
27
|
-
return record;
|
|
28
|
-
}
|
|
29
|
-
export function loadPlanRecord(planId) {
|
|
30
|
-
assertValidPlanId(planId);
|
|
31
|
-
try {
|
|
32
|
-
const raw = fs.readFileSync(planPath(planId), 'utf-8');
|
|
33
|
-
return JSON.parse(raw);
|
|
34
|
-
}
|
|
35
|
-
catch {
|
|
36
|
-
return null;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
export function updatePlanRecord(planId, updates) {
|
|
40
|
-
assertValidPlanId(planId);
|
|
41
|
-
const record = loadPlanRecord(planId);
|
|
42
|
-
if (!record)
|
|
43
|
-
throw new Error(`Plan ${planId} not found in ${PLANS_DIR}`);
|
|
44
|
-
const updated = { ...record, ...updates };
|
|
45
|
-
fs.writeFileSync(planPath(planId), JSON.stringify(updated, null, 2), { mode: 0o600 });
|
|
46
|
-
return updated;
|
|
47
|
-
}
|
|
48
|
-
export function listPlanRecords() {
|
|
49
|
-
try {
|
|
50
|
-
if (!fs.existsSync(PLANS_DIR))
|
|
51
|
-
return [];
|
|
52
|
-
return fs
|
|
53
|
-
.readdirSync(PLANS_DIR)
|
|
54
|
-
.filter((f) => f.endsWith('.json'))
|
|
55
|
-
.flatMap((f) => {
|
|
56
|
-
try {
|
|
57
|
-
return [JSON.parse(fs.readFileSync(path.join(PLANS_DIR, f), 'utf-8'))];
|
|
58
|
-
}
|
|
59
|
-
catch {
|
|
60
|
-
return [];
|
|
61
|
-
}
|
|
62
|
-
})
|
|
63
|
-
.sort((a, b) => a.createdAt.localeCompare(b.createdAt));
|
|
64
|
-
}
|
|
65
|
-
catch {
|
|
66
|
-
return [];
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
//# sourceMappingURL=plan-store.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"plan-store.js","sourceRoot":"","sources":["../../src/lib/plan-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
2
|
-
export interface RequestContext {
|
|
3
|
-
profile?: string;
|
|
4
|
-
}
|
|
5
|
-
export declare const requestContext: AsyncLocalStorage<RequestContext>;
|
|
6
|
-
export declare function withRequestContext<T>(ctx: RequestContext, fn: () => T): T;
|
|
7
|
-
export declare function getActiveProfile(): string | undefined;
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
2
|
-
import { getProfile } from '../utils/flags.js';
|
|
3
|
-
export const requestContext = new AsyncLocalStorage();
|
|
4
|
-
export function withRequestContext(ctx, fn) {
|
|
5
|
-
return requestContext.run(ctx, fn);
|
|
6
|
-
}
|
|
7
|
-
export function getActiveProfile() {
|
|
8
|
-
const ctx = requestContext.getStore();
|
|
9
|
-
if (ctx?.profile !== undefined)
|
|
10
|
-
return ctx.profile;
|
|
11
|
-
return getProfile();
|
|
12
|
-
}
|
|
13
|
-
//# sourceMappingURL=request-context.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"request-context.js","sourceRoot":"","sources":["../../src/lib/request-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAM/C,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,iBAAiB,EAAkB,CAAC;AAEtE,MAAM,UAAU,kBAAkB,CAAI,GAAmB,EAAE,EAAW;IACpE,OAAO,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,MAAM,GAAG,GAAG,cAAc,CAAC,QAAQ,EAAE,CAAC;IACtC,IAAI,GAAG,EAAE,OAAO,KAAK,SAAS;QAAE,OAAO,GAAG,CAAC,OAAO,CAAC;IACnD,OAAO,UAAU,EAAE,CAAC;AACtB,CAAC"}
|
package/dist/lib/scenes.d.ts
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import type { AxiosInstance } from 'axios';
|
|
2
|
-
export interface Scene {
|
|
3
|
-
sceneId: string;
|
|
4
|
-
sceneName: string;
|
|
5
|
-
}
|
|
6
|
-
export declare function fetchScenes(client?: AxiosInstance): Promise<Scene[]>;
|
|
7
|
-
export declare function executeScene(sceneId: string, client?: AxiosInstance): Promise<void>;
|
package/dist/lib/scenes.js
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { createClient } from '../api/client.js';
|
|
2
|
-
export async function fetchScenes(client) {
|
|
3
|
-
const c = client ?? createClient();
|
|
4
|
-
const res = await c.get('/v1.1/scenes');
|
|
5
|
-
return res.data.body;
|
|
6
|
-
}
|
|
7
|
-
export async function executeScene(sceneId, client) {
|
|
8
|
-
const c = client ?? createClient();
|
|
9
|
-
await c.post(`/v1.1/scenes/${sceneId}/execute`);
|
|
10
|
-
}
|
|
11
|
-
//# sourceMappingURL=scenes.js.map
|
package/dist/lib/scenes.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scenes.js","sourceRoot":"","sources":["../../src/lib/scenes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAOhD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAsB;IACtD,MAAM,CAAC,GAAG,MAAM,IAAI,YAAY,EAAE,CAAC;IACnC,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,GAAG,CAAoB,cAAc,CAAC,CAAC;IAC3D,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAe,EAAE,MAAsB;IACxE,MAAM,CAAC,GAAG,MAAM,IAAI,YAAY,EAAE,CAAC;IACnC,MAAM,CAAC,CAAC,IAAI,CAAC,gBAAgB,OAAO,UAAU,CAAC,CAAC;AAClD,CAAC"}
|
package/dist/logger.d.ts
DELETED
package/dist/logger.js
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import pino from 'pino';
|
|
2
|
-
const logLevel = process.env.LOG_LEVEL || 'warn';
|
|
3
|
-
const logFormat = process.env.LOG_FORMAT || 'json';
|
|
4
|
-
const pinoConfig = {
|
|
5
|
-
level: logLevel,
|
|
6
|
-
transport: logFormat === 'pretty'
|
|
7
|
-
? { target: 'pino-pretty' }
|
|
8
|
-
: undefined,
|
|
9
|
-
};
|
|
10
|
-
export const log = pino(pinoConfig);
|
|
11
|
-
export function setLogLevel(level) {
|
|
12
|
-
log.level = level;
|
|
13
|
-
}
|
|
14
|
-
export function getLogLevel() {
|
|
15
|
-
return log.level;
|
|
16
|
-
}
|
|
17
|
-
//# sourceMappingURL=logger.js.map
|
package/dist/logger.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM,CAAC;AACjD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,MAAM,CAAC;AAEnD,MAAM,UAAU,GAAG;IACjB,KAAK,EAAE,QAAQ;IACf,SAAS,EAAE,SAAS,KAAK,QAAQ;QAC/B,CAAC,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE;QAC3B,CAAC,CAAC,SAAS;CACd,CAAC;AAEF,MAAM,CAAC,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;AAEpC,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,GAAG,CAAC,KAAK,CAAC;AACnB,CAAC"}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
export interface HistoryEntry {
|
|
2
|
-
t: string;
|
|
3
|
-
topic: string;
|
|
4
|
-
deviceType: string;
|
|
5
|
-
payload: unknown;
|
|
6
|
-
}
|
|
7
|
-
export interface ControlEvent {
|
|
8
|
-
type: '__connect' | '__reconnect' | '__disconnect' | '__heartbeat';
|
|
9
|
-
at: string;
|
|
10
|
-
eventId: string;
|
|
11
|
-
schemaVersion?: string;
|
|
12
|
-
source?: 'mqtt';
|
|
13
|
-
kind?: 'control';
|
|
14
|
-
controlKind?: 'connect' | 'reconnect' | 'disconnect' | 'heartbeat';
|
|
15
|
-
t?: string;
|
|
16
|
-
}
|
|
17
|
-
export interface DeviceHistory {
|
|
18
|
-
latest: HistoryEntry | null;
|
|
19
|
-
history: HistoryEntry[];
|
|
20
|
-
}
|
|
21
|
-
export declare class DeviceHistoryStore {
|
|
22
|
-
private jsonlSizes;
|
|
23
|
-
/** Reset the in-memory size counter. Tests use this between runs. */
|
|
24
|
-
resetSizes(): void;
|
|
25
|
-
private get dir();
|
|
26
|
-
record(deviceId: string, topic: string, deviceType: string, payload: unknown, t?: string): void;
|
|
27
|
-
/** Append a mqtt control event (no deviceId) to the dedicated __control.jsonl file. */
|
|
28
|
-
recordControl(event: ControlEvent): void;
|
|
29
|
-
private writeJsonl;
|
|
30
|
-
private rotateJsonl;
|
|
31
|
-
getLatest(deviceId: string): HistoryEntry | null;
|
|
32
|
-
getHistory(deviceId: string, limit?: number): HistoryEntry[];
|
|
33
|
-
listDevices(): string[];
|
|
34
|
-
getHistoryDir(): string;
|
|
35
|
-
}
|
|
36
|
-
export declare const deviceHistoryStore: DeviceHistoryStore;
|
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
import fs from 'node:fs';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import os from 'node:os';
|
|
4
|
-
const MAX_HISTORY = 100;
|
|
5
|
-
const JSONL_ROTATE_BYTES = 50 * 1024 * 1024; // 50 MB
|
|
6
|
-
const JSONL_KEEP_ROTATIONS = 3; // .1 .2 .3
|
|
7
|
-
function historyDir() {
|
|
8
|
-
return path.join(os.homedir(), '.switchbot', 'device-history');
|
|
9
|
-
}
|
|
10
|
-
export class DeviceHistoryStore {
|
|
11
|
-
// In-memory size counter so we don't stat() on every append.
|
|
12
|
-
jsonlSizes = new Map();
|
|
13
|
-
/** Reset the in-memory size counter. Tests use this between runs. */
|
|
14
|
-
resetSizes() {
|
|
15
|
-
this.jsonlSizes.clear();
|
|
16
|
-
}
|
|
17
|
-
get dir() {
|
|
18
|
-
return historyDir();
|
|
19
|
-
}
|
|
20
|
-
record(deviceId, topic, deviceType, payload, t) {
|
|
21
|
-
const entry = { t: t ?? new Date().toISOString(), topic, deviceType, payload };
|
|
22
|
-
try {
|
|
23
|
-
if (!fs.existsSync(this.dir))
|
|
24
|
-
fs.mkdirSync(this.dir, { recursive: true });
|
|
25
|
-
// 1. Ring-buffer JSON (back-compat with existing consumers).
|
|
26
|
-
const file = path.join(this.dir, `${deviceId}.json`);
|
|
27
|
-
const existing = fs.existsSync(file)
|
|
28
|
-
? JSON.parse(fs.readFileSync(file, 'utf-8'))
|
|
29
|
-
: { latest: null, history: [] };
|
|
30
|
-
existing.latest = entry;
|
|
31
|
-
existing.history = [entry, ...existing.history].slice(0, MAX_HISTORY);
|
|
32
|
-
fs.writeFileSync(file, JSON.stringify(existing, null, 2), { mode: 0o600 });
|
|
33
|
-
// 2. Append-only JSONL for range queries.
|
|
34
|
-
this.writeJsonl(deviceId, entry);
|
|
35
|
-
}
|
|
36
|
-
catch {
|
|
37
|
-
// best-effort — history loss is non-fatal
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
/** Append a mqtt control event (no deviceId) to the dedicated __control.jsonl file. */
|
|
41
|
-
recordControl(event) {
|
|
42
|
-
try {
|
|
43
|
-
if (!fs.existsSync(this.dir))
|
|
44
|
-
fs.mkdirSync(this.dir, { recursive: true });
|
|
45
|
-
this.writeJsonl('__control', event);
|
|
46
|
-
}
|
|
47
|
-
catch {
|
|
48
|
-
// best-effort — never block the event stream
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
writeJsonl(fileKey, record) {
|
|
52
|
-
try {
|
|
53
|
-
const jsonlPath = path.join(this.dir, `${fileKey}.jsonl`);
|
|
54
|
-
const line = JSON.stringify(record) + '\n';
|
|
55
|
-
const lineBytes = Buffer.byteLength(line, 'utf-8');
|
|
56
|
-
// Seed size counter from disk on first touch (avoids drift across restarts).
|
|
57
|
-
let size = this.jsonlSizes.get(fileKey);
|
|
58
|
-
if (size === undefined) {
|
|
59
|
-
try {
|
|
60
|
-
size = fs.existsSync(jsonlPath) ? fs.statSync(jsonlPath).size : 0;
|
|
61
|
-
}
|
|
62
|
-
catch {
|
|
63
|
-
size = 0;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
if (size + lineBytes > JSONL_ROTATE_BYTES) {
|
|
67
|
-
this.rotateJsonl(fileKey);
|
|
68
|
-
size = 0;
|
|
69
|
-
}
|
|
70
|
-
fs.appendFileSync(jsonlPath, line, { mode: 0o600 });
|
|
71
|
-
this.jsonlSizes.set(fileKey, size + lineBytes);
|
|
72
|
-
}
|
|
73
|
-
catch {
|
|
74
|
-
// best-effort
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
rotateJsonl(fileKey) {
|
|
78
|
-
const base = path.join(this.dir, `${fileKey}.jsonl`);
|
|
79
|
-
// .jsonl.3 is dropped; .2 → .3, .1 → .2, current → .1
|
|
80
|
-
try {
|
|
81
|
-
const oldest = `${base}.${JSONL_KEEP_ROTATIONS}`;
|
|
82
|
-
if (fs.existsSync(oldest))
|
|
83
|
-
fs.rmSync(oldest);
|
|
84
|
-
}
|
|
85
|
-
catch { /* swallow */ }
|
|
86
|
-
for (let i = JSONL_KEEP_ROTATIONS - 1; i >= 1; i--) {
|
|
87
|
-
const from = `${base}.${i}`;
|
|
88
|
-
const to = `${base}.${i + 1}`;
|
|
89
|
-
try {
|
|
90
|
-
if (fs.existsSync(from))
|
|
91
|
-
fs.renameSync(from, to);
|
|
92
|
-
}
|
|
93
|
-
catch { /* swallow */ }
|
|
94
|
-
}
|
|
95
|
-
try {
|
|
96
|
-
if (fs.existsSync(base))
|
|
97
|
-
fs.renameSync(base, `${base}.1`);
|
|
98
|
-
}
|
|
99
|
-
catch { /* swallow */ }
|
|
100
|
-
}
|
|
101
|
-
getLatest(deviceId) {
|
|
102
|
-
try {
|
|
103
|
-
const file = path.join(this.dir, `${deviceId}.json`);
|
|
104
|
-
if (!fs.existsSync(file))
|
|
105
|
-
return null;
|
|
106
|
-
return JSON.parse(fs.readFileSync(file, 'utf-8')).latest;
|
|
107
|
-
}
|
|
108
|
-
catch {
|
|
109
|
-
return null;
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
getHistory(deviceId, limit = 20) {
|
|
113
|
-
try {
|
|
114
|
-
const file = path.join(this.dir, `${deviceId}.json`);
|
|
115
|
-
if (!fs.existsSync(file))
|
|
116
|
-
return [];
|
|
117
|
-
const data = JSON.parse(fs.readFileSync(file, 'utf-8'));
|
|
118
|
-
return data.history.slice(0, Math.min(limit, MAX_HISTORY));
|
|
119
|
-
}
|
|
120
|
-
catch {
|
|
121
|
-
return [];
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
listDevices() {
|
|
125
|
-
try {
|
|
126
|
-
if (!fs.existsSync(this.dir))
|
|
127
|
-
return [];
|
|
128
|
-
const seen = new Set();
|
|
129
|
-
for (const f of fs.readdirSync(this.dir)) {
|
|
130
|
-
if (f.endsWith('.json'))
|
|
131
|
-
seen.add(f.slice(0, -5));
|
|
132
|
-
else if (f.endsWith('.jsonl'))
|
|
133
|
-
seen.add(f.slice(0, -6));
|
|
134
|
-
}
|
|
135
|
-
return Array.from(seen);
|
|
136
|
-
}
|
|
137
|
-
catch {
|
|
138
|
-
return [];
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
getHistoryDir() {
|
|
142
|
-
return this.dir;
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
export const deviceHistoryStore = new DeviceHistoryStore();
|
|
146
|
-
//# sourceMappingURL=device-history.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"device-history.js","sourceRoot":"","sources":["../../src/mcp/device-history.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AA4BzB,MAAM,WAAW,GAAG,GAAG,CAAC;AACxB,MAAM,kBAAkB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,QAAQ;AACrD,MAAM,oBAAoB,GAAG,CAAC,CAAC,CAAe,WAAW;AAEzD,SAAS,UAAU;IACjB,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,gBAAgB,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,OAAO,kBAAkB;IAC7B,6DAA6D;IACrD,UAAU,GAAwB,IAAI,GAAG,EAAE,CAAC;IAEpD,qEAAqE;IACrE,UAAU;QACR,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;IAED,IAAY,GAAG;QACb,OAAO,UAAU,EAAE,CAAC;IACtB,CAAC;IAED,MAAM,CAAC,QAAgB,EAAE,KAAa,EAAE,UAAkB,EAAE,OAAgB,EAAE,CAAU;QACtF,MAAM,KAAK,GAAiB,EAAE,CAAC,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;QAC7F,IAAI,CAAC;YACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;gBAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAE1E,6DAA6D;YAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,OAAO,CAAC,CAAC;YACrD,MAAM,QAAQ,GAAkB,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;gBACjD,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAmB;gBAC/D,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;YAClC,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC;YACxB,QAAQ,CAAC,OAAO,GAAG,CAAC,KAAK,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;YACtE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAE3E,0CAA0C;YAC1C,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,0CAA0C;QAC5C,CAAC;IACH,CAAC;IAED,uFAAuF;IACvF,aAAa,CAAC,KAAmB;QAC/B,IAAI,CAAC;YACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;gBAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1E,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,6CAA6C;QAC/C,CAAC;IACH,CAAC;IAEO,UAAU,CAAC,OAAe,EAAE,MAAe;QACjD,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,QAAQ,CAAC,CAAC;YAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;YAC3C,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAEnD,6EAA6E;YAC7E,IAAI,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACxC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,IAAI,CAAC;oBACH,IAAI,GAAG,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpE,CAAC;gBAAC,MAAM,CAAC;oBACP,IAAI,GAAG,CAAC,CAAC;gBACX,CAAC;YACH,CAAC;YAED,IAAI,IAAI,GAAG,SAAS,GAAG,kBAAkB,EAAE,CAAC;gBAC1C,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;gBAC1B,IAAI,GAAG,CAAC,CAAC;YACX,CAAC;YAED,EAAE,CAAC,cAAc,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACpD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,GAAG,SAAS,CAAC,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,cAAc;QAChB,CAAC;IACH,CAAC;IAEO,WAAW,CAAC,OAAe;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,QAAQ,CAAC,CAAC;QACrD,sDAAsD;QACtD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,GAAG,IAAI,IAAI,oBAAoB,EAAE,CAAC;YACjD,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;gBAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC/C,CAAC;QAAC,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC;QACzB,KAAK,IAAI,CAAC,GAAG,oBAAoB,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACnD,MAAM,IAAI,GAAG,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC;YAC5B,MAAM,EAAE,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC;gBACH,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;oBAAE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACnD,CAAC;YAAC,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC;QAC3B,CAAC;QACD,IAAI,CAAC;YACH,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;gBAAE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC;QAC5D,CAAC;QAAC,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC;IAC3B,CAAC;IAED,SAAS,CAAC,QAAgB;QACxB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,OAAO,CAAC,CAAC;YACrD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC;YACtC,OAAQ,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAmB,CAAC,MAAM,CAAC;QAC9E,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,UAAU,CAAC,QAAgB,EAAE,KAAK,GAAG,EAAE;QACrC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,OAAO,CAAC,CAAC;YACrD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;gBAAE,OAAO,EAAE,CAAC;YACpC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAkB,CAAC;YACzE,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;QAC7D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,WAAW;QACT,IAAI,CAAC;YACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;gBAAE,OAAO,EAAE,CAAC;YACxC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;YAC/B,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACzC,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;oBAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;qBAC7C,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;oBAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1D,CAAC;YACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,GAAG,CAAC;IAClB,CAAC;CACF;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,kBAAkB,EAAE,CAAC"}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import { SwitchBotMqttClient, type MqttState } from '../mqtt/client.js';
|
|
2
|
-
import type { AxiosInstance } from 'axios';
|
|
3
|
-
export interface ShadowEvent {
|
|
4
|
-
kind: 'shadow.updated';
|
|
5
|
-
deviceId: string;
|
|
6
|
-
payload: Record<string, unknown>;
|
|
7
|
-
timestamp: number;
|
|
8
|
-
}
|
|
9
|
-
export interface SubscriptionEvent {
|
|
10
|
-
kind: 'events.reconnected' | 'events.dropped';
|
|
11
|
-
timestamp?: number;
|
|
12
|
-
count?: number;
|
|
13
|
-
sinceTs?: number;
|
|
14
|
-
}
|
|
15
|
-
export type RawEvent = ShadowEvent | SubscriptionEvent;
|
|
16
|
-
export interface EventSubscriber {
|
|
17
|
-
id: string;
|
|
18
|
-
handler: (event: RawEvent) => void;
|
|
19
|
-
filter?: string;
|
|
20
|
-
lastActivity: number;
|
|
21
|
-
}
|
|
22
|
-
export declare class EventSubscriptionManager {
|
|
23
|
-
private mqttClient;
|
|
24
|
-
private subscribers;
|
|
25
|
-
private ringBuffer;
|
|
26
|
-
private ringSize;
|
|
27
|
-
private typeMap;
|
|
28
|
-
private refreshTypeMapTimer;
|
|
29
|
-
private idleCleanupTimer;
|
|
30
|
-
private getClient?;
|
|
31
|
-
private lastRefreshAttempt;
|
|
32
|
-
constructor(mqttClient?: SwitchBotMqttClient, getClient?: () => AxiosInstance);
|
|
33
|
-
initialize(token: string, secret: string): Promise<void>;
|
|
34
|
-
subscribe(id: string, handler: (event: RawEvent) => void, filter?: string): () => void;
|
|
35
|
-
private addEvent;
|
|
36
|
-
private emit;
|
|
37
|
-
private matchesFilter;
|
|
38
|
-
private scheduleTypeMapRefresh;
|
|
39
|
-
private scheduleIdleCleanup;
|
|
40
|
-
private extractDeviceId;
|
|
41
|
-
getState(): MqttState;
|
|
42
|
-
getSubscriberCount(): number;
|
|
43
|
-
getRecentEvents(limit?: number): RawEvent[];
|
|
44
|
-
shutdown(): Promise<void>;
|
|
45
|
-
}
|