@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
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
import { loadCache } from '../devices/cache.js';
|
|
2
|
-
import { loadDeviceMeta } from '../devices/device-meta.js';
|
|
3
|
-
import { levenshtein, normalizeDeviceName } from './string.js';
|
|
4
|
-
import { UsageError, StructuredUsageError } from './output.js';
|
|
5
|
-
export const ALL_STRATEGIES = [
|
|
6
|
-
'exact', 'prefix', 'substring', 'fuzzy', 'first', 'require-unique',
|
|
7
|
-
];
|
|
8
|
-
export function isValidStrategy(s) {
|
|
9
|
-
return ALL_STRATEGIES.includes(s);
|
|
10
|
-
}
|
|
11
|
-
function resolveDeviceByName(query, opts = {}) {
|
|
12
|
-
const strategy = opts.strategy ?? 'fuzzy';
|
|
13
|
-
const cache = loadCache();
|
|
14
|
-
if (!cache || Object.keys(cache.devices).length === 0) {
|
|
15
|
-
return { ok: false, ambiguous: false };
|
|
16
|
-
}
|
|
17
|
-
const meta = loadDeviceMeta();
|
|
18
|
-
const q = normalizeDeviceName(query);
|
|
19
|
-
const threshold = Math.min(3, Math.floor(q.length * 0.3));
|
|
20
|
-
const typeFilter = opts.type ? opts.type.toLowerCase() : null;
|
|
21
|
-
const roomFilter = opts.room ? opts.room.toLowerCase() : null;
|
|
22
|
-
const candidates = [];
|
|
23
|
-
for (const [deviceId, device] of Object.entries(cache.devices)) {
|
|
24
|
-
// narrow filters first
|
|
25
|
-
if (opts.category && device.category !== opts.category)
|
|
26
|
-
continue;
|
|
27
|
-
if (typeFilter && device.type.toLowerCase() !== typeFilter)
|
|
28
|
-
continue;
|
|
29
|
-
if (roomFilter) {
|
|
30
|
-
const rn = (device.roomName ?? '').toLowerCase();
|
|
31
|
-
if (rn !== roomFilter && !rn.includes(roomFilter))
|
|
32
|
-
continue;
|
|
33
|
-
}
|
|
34
|
-
const alias = meta.devices[deviceId]?.alias;
|
|
35
|
-
const rawName = normalizeDeviceName(device.name);
|
|
36
|
-
const normAlias = alias ? normalizeDeviceName(alias) : null;
|
|
37
|
-
// exact alias/name wins immediately for lenient strategies.
|
|
38
|
-
// Under require-unique we must NOT short-circuit: there may be other devices
|
|
39
|
-
// that also match (e.g. via substring), making the result ambiguous. Collect
|
|
40
|
-
// the exact hit as a candidate and let the full ambiguity check decide below.
|
|
41
|
-
if ((normAlias && normAlias === q) || rawName === q) {
|
|
42
|
-
if (strategy !== 'require-unique') {
|
|
43
|
-
return { ok: true, deviceId };
|
|
44
|
-
}
|
|
45
|
-
// require-unique: treat exact match as a high-priority candidate (score 0)
|
|
46
|
-
candidates.push({ deviceId, name: device.name, score: 0 });
|
|
47
|
-
continue;
|
|
48
|
-
}
|
|
49
|
-
if (strategy === 'exact')
|
|
50
|
-
continue;
|
|
51
|
-
if (strategy === 'prefix') {
|
|
52
|
-
if ((normAlias && normAlias.startsWith(q)) || rawName.startsWith(q)) {
|
|
53
|
-
candidates.push({ deviceId, name: device.name, score: 1 });
|
|
54
|
-
}
|
|
55
|
-
continue;
|
|
56
|
-
}
|
|
57
|
-
// substring + fuzzy + require-unique + first all share substring match
|
|
58
|
-
if ((normAlias && normAlias.includes(q)) || rawName.includes(q)) {
|
|
59
|
-
candidates.push({ deviceId, name: device.name, score: 1 });
|
|
60
|
-
continue;
|
|
61
|
-
}
|
|
62
|
-
if (strategy === 'substring')
|
|
63
|
-
continue;
|
|
64
|
-
// fuzzy / require-unique / first → also levenshtein
|
|
65
|
-
if (strategy === 'fuzzy' || strategy === 'require-unique' || strategy === 'first') {
|
|
66
|
-
const distName = levenshtein(rawName, q);
|
|
67
|
-
const distAlias = normAlias ? levenshtein(normAlias, q) : Number.POSITIVE_INFINITY;
|
|
68
|
-
const dist = Math.min(distName, distAlias);
|
|
69
|
-
if (dist <= threshold) {
|
|
70
|
-
candidates.push({ deviceId, name: device.name, score: dist + 1 });
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
if (candidates.length === 0)
|
|
75
|
-
return { ok: false, ambiguous: false };
|
|
76
|
-
candidates.sort((a, b) => a.score - b.score);
|
|
77
|
-
if (strategy === 'first') {
|
|
78
|
-
return { ok: true, deviceId: candidates[0].deviceId };
|
|
79
|
-
}
|
|
80
|
-
if (strategy === 'require-unique') {
|
|
81
|
-
if (candidates.length === 1)
|
|
82
|
-
return { ok: true, deviceId: candidates[0].deviceId };
|
|
83
|
-
return { ok: false, ambiguous: true, candidates: candidates.slice(0, 4) };
|
|
84
|
-
}
|
|
85
|
-
// fuzzy / substring / prefix: collapse cluster of near-ties
|
|
86
|
-
const best = candidates[0].score;
|
|
87
|
-
const top = candidates.filter((c) => c.score <= best + 1);
|
|
88
|
-
if (top.length === 1)
|
|
89
|
-
return { ok: true, deviceId: top[0].deviceId };
|
|
90
|
-
return { ok: false, ambiguous: true, candidates: top.slice(0, 4) };
|
|
91
|
-
}
|
|
92
|
-
export function resolveDeviceId(deviceId, nameQuery, opts = {}) {
|
|
93
|
-
if (deviceId && nameQuery) {
|
|
94
|
-
throw new UsageError('Provide either a deviceId argument or --name, not both.');
|
|
95
|
-
}
|
|
96
|
-
if (deviceId)
|
|
97
|
-
return deviceId;
|
|
98
|
-
if (!nameQuery) {
|
|
99
|
-
throw new UsageError('A deviceId argument or --name flag is required.');
|
|
100
|
-
}
|
|
101
|
-
if (opts.strategy && !isValidStrategy(opts.strategy)) {
|
|
102
|
-
throw new UsageError(`--name-strategy must be one of: ${ALL_STRATEGIES.join(', ')} (got "${opts.strategy}")`);
|
|
103
|
-
}
|
|
104
|
-
const cache = loadCache();
|
|
105
|
-
if (!cache) {
|
|
106
|
-
throw new UsageError(`--name requires the device cache. Run 'switchbot devices list' first to populate it.`);
|
|
107
|
-
}
|
|
108
|
-
const result = resolveDeviceByName(nameQuery, opts);
|
|
109
|
-
if (result.ok)
|
|
110
|
-
return result.deviceId;
|
|
111
|
-
if (result.ambiguous) {
|
|
112
|
-
const candidates = result.candidates.map((c) => ({ deviceId: c.deviceId, name: c.name }));
|
|
113
|
-
const narrow = [];
|
|
114
|
-
if (!opts.type)
|
|
115
|
-
narrow.push('--type');
|
|
116
|
-
if (!opts.category)
|
|
117
|
-
narrow.push('--category');
|
|
118
|
-
if (!opts.room)
|
|
119
|
-
narrow.push('--room');
|
|
120
|
-
const strategyHint = opts.strategy === 'fuzzy'
|
|
121
|
-
? `pass --name-strategy=first to pick the best match`
|
|
122
|
-
: `pass --name-strategy=fuzzy or --name-strategy=first to pick the best match`;
|
|
123
|
-
const hint = narrow.length > 0
|
|
124
|
-
? `Narrow with ${narrow.join(' / ')}, refine the name, use the deviceId directly, or ${strategyHint}.`
|
|
125
|
-
: `Refine the name, use the deviceId directly, or ${strategyHint}.`;
|
|
126
|
-
throw new StructuredUsageError(`"${nameQuery}" is ambiguous — ${candidates.length} devices match.`, {
|
|
127
|
-
error: 'ambiguous_name_match',
|
|
128
|
-
query: nameQuery,
|
|
129
|
-
candidates,
|
|
130
|
-
hint,
|
|
131
|
-
});
|
|
132
|
-
}
|
|
133
|
-
const noMatchNarrow = opts.type || opts.category || opts.room
|
|
134
|
-
? ' after applying --type/--category/--room filters'
|
|
135
|
-
: '';
|
|
136
|
-
throw new UsageError(`No device matches "${nameQuery}"${noMatchNarrow}. Run 'switchbot devices list' to see device names.`);
|
|
137
|
-
}
|
|
138
|
-
//# sourceMappingURL=name-resolver.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"name-resolver.js","sourceRoot":"","sources":["../../src/utils/name-resolver.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/output.d.ts
DELETED
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import { type TableStyle } from './flags.js';
|
|
2
|
-
export declare const SCHEMA_VERSION = "1.1";
|
|
3
|
-
export declare function isJsonMode(): boolean;
|
|
4
|
-
export declare function printJson(data: unknown): void;
|
|
5
|
-
/**
|
|
6
|
-
* Emit a structured JSON error envelope on stdout.
|
|
7
|
-
*
|
|
8
|
-
* Bug #SYS-1: Under `--json`, both success and error payloads must share
|
|
9
|
-
* the same output channel (stdout) so a single `cli --json ... | jq` pipe
|
|
10
|
-
* can decode either shape. Use this helper everywhere that previously
|
|
11
|
-
* called `console.error(JSON.stringify({ error: ... }))` in --json mode.
|
|
12
|
-
*
|
|
13
|
-
* The envelope is always `{ schemaVersion, error }` — callers pass only the
|
|
14
|
-
* error payload. Also emits a brief human-readable line on stderr when a
|
|
15
|
-
* TTY is attached, so interactive runs still see the failure.
|
|
16
|
-
*/
|
|
17
|
-
export declare function emitJsonError(errorPayload: Record<string, unknown>): void;
|
|
18
|
-
/**
|
|
19
|
-
* P7: emit the stream-header first line for any NDJSON/streaming command
|
|
20
|
-
* running under `--json`. Downstream JSON consumers can key on
|
|
21
|
-
* `{ stream: true }` to distinguish the header from subsequent event
|
|
22
|
-
* lines, and on `eventKind` / `cadence` to pick a parser strategy.
|
|
23
|
-
*
|
|
24
|
-
* Non-streaming commands (single-object / array output) do NOT emit this
|
|
25
|
-
* header — only watch / events tail / events mqtt-tail.
|
|
26
|
-
*/
|
|
27
|
-
export declare function emitStreamHeader(opts: {
|
|
28
|
-
eventKind: 'tick' | 'event';
|
|
29
|
-
cadence: 'poll' | 'push';
|
|
30
|
-
}): void;
|
|
31
|
-
interface ExitWithErrorOptions {
|
|
32
|
-
message: string;
|
|
33
|
-
kind?: 'usage' | 'guard' | 'runtime';
|
|
34
|
-
code?: number;
|
|
35
|
-
hint?: string;
|
|
36
|
-
context?: Record<string, unknown>;
|
|
37
|
-
extra?: Record<string, unknown>;
|
|
38
|
-
}
|
|
39
|
-
export declare function exitWithError(messageOrOpts: string | ExitWithErrorOptions): never;
|
|
40
|
-
export declare function printTable(headers: string[], rows: (string | number | boolean | null | undefined)[][], styleOverride?: TableStyle): void;
|
|
41
|
-
export declare function printKeyValue(data: Record<string, unknown>): void;
|
|
42
|
-
export declare class UsageError extends Error {
|
|
43
|
-
constructor(message: string);
|
|
44
|
-
}
|
|
45
|
-
export type ErrorSubKind = 'device-offline' | 'device-not-found' | 'scene-not-found' | 'command-not-supported' | 'auth-failed' | 'quota-exceeded' | 'device-internal-error' | 'ambiguous-name-match' | 'unknown-api-error';
|
|
46
|
-
export interface CandidateMatch {
|
|
47
|
-
deviceId?: string;
|
|
48
|
-
sceneId?: string;
|
|
49
|
-
name: string;
|
|
50
|
-
}
|
|
51
|
-
export interface ErrorPayload {
|
|
52
|
-
code: number;
|
|
53
|
-
kind: 'usage' | 'api' | 'runtime' | 'guard';
|
|
54
|
-
subKind?: ErrorSubKind;
|
|
55
|
-
message: string;
|
|
56
|
-
hint?: string;
|
|
57
|
-
/** Structured remediation hint for agent/script consumers. */
|
|
58
|
-
resolutionHint?: string;
|
|
59
|
-
/** Candidate matches when the error is caused by an ambiguous name query. */
|
|
60
|
-
candidateMatches?: CandidateMatch[];
|
|
61
|
-
retryable?: boolean;
|
|
62
|
-
context?: Record<string, unknown>;
|
|
63
|
-
retryAfterMs?: number;
|
|
64
|
-
transient?: boolean;
|
|
65
|
-
errorClass?: 'network' | 'api' | 'device-offline' | 'device-internal-error' | 'guard' | 'usage';
|
|
66
|
-
}
|
|
67
|
-
export declare class StructuredUsageError extends Error {
|
|
68
|
-
readonly context?: Record<string, unknown> | undefined;
|
|
69
|
-
constructor(message: string, context?: Record<string, unknown> | undefined);
|
|
70
|
-
}
|
|
71
|
-
export declare function buildErrorPayload(error: unknown): ErrorPayload;
|
|
72
|
-
export declare function handleError(error: unknown): never;
|
|
73
|
-
export {};
|
package/dist/utils/output.js
DELETED
|
@@ -1,405 +0,0 @@
|
|
|
1
|
-
import Table from 'cli-table3';
|
|
2
|
-
import chalk from 'chalk';
|
|
3
|
-
import { ApiError, DryRunSignal } from '../api/client.js';
|
|
4
|
-
import { getFormat, getTableStyle } from './flags.js';
|
|
5
|
-
export const SCHEMA_VERSION = '1.1';
|
|
6
|
-
export function isJsonMode() {
|
|
7
|
-
return process.argv.includes('--json') || getFormat() === 'json';
|
|
8
|
-
}
|
|
9
|
-
export function printJson(data) {
|
|
10
|
-
console.log(JSON.stringify({ schemaVersion: SCHEMA_VERSION, data }, null, 2));
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Emit a structured JSON error envelope on stdout.
|
|
14
|
-
*
|
|
15
|
-
* Bug #SYS-1: Under `--json`, both success and error payloads must share
|
|
16
|
-
* the same output channel (stdout) so a single `cli --json ... | jq` pipe
|
|
17
|
-
* can decode either shape. Use this helper everywhere that previously
|
|
18
|
-
* called `console.error(JSON.stringify({ error: ... }))` in --json mode.
|
|
19
|
-
*
|
|
20
|
-
* The envelope is always `{ schemaVersion, error }` — callers pass only the
|
|
21
|
-
* error payload. Also emits a brief human-readable line on stderr when a
|
|
22
|
-
* TTY is attached, so interactive runs still see the failure.
|
|
23
|
-
*/
|
|
24
|
-
export function emitJsonError(errorPayload) {
|
|
25
|
-
console.log(JSON.stringify({ schemaVersion: SCHEMA_VERSION, error: errorPayload }));
|
|
26
|
-
if (process.stderr.isTTY) {
|
|
27
|
-
const msg = typeof errorPayload.message === 'string' ? errorPayload.message : 'Error';
|
|
28
|
-
console.error(chalk.red(msg));
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* P7: emit the stream-header first line for any NDJSON/streaming command
|
|
33
|
-
* running under `--json`. Downstream JSON consumers can key on
|
|
34
|
-
* `{ stream: true }` to distinguish the header from subsequent event
|
|
35
|
-
* lines, and on `eventKind` / `cadence` to pick a parser strategy.
|
|
36
|
-
*
|
|
37
|
-
* Non-streaming commands (single-object / array output) do NOT emit this
|
|
38
|
-
* header — only watch / events tail / events mqtt-tail.
|
|
39
|
-
*/
|
|
40
|
-
export function emitStreamHeader(opts) {
|
|
41
|
-
console.log(JSON.stringify({
|
|
42
|
-
schemaVersion: '1',
|
|
43
|
-
stream: true,
|
|
44
|
-
eventKind: opts.eventKind,
|
|
45
|
-
cadence: opts.cadence,
|
|
46
|
-
}));
|
|
47
|
-
}
|
|
48
|
-
export function exitWithError(messageOrOpts) {
|
|
49
|
-
const opts = typeof messageOrOpts === 'string' ? { message: messageOrOpts } : messageOrOpts;
|
|
50
|
-
const { message, kind = 'usage', code = 2, hint, context, extra } = opts;
|
|
51
|
-
if (isJsonMode()) {
|
|
52
|
-
const payload = { code, kind, message };
|
|
53
|
-
if (hint)
|
|
54
|
-
payload.hint = hint;
|
|
55
|
-
if (context)
|
|
56
|
-
payload.context = context;
|
|
57
|
-
if (extra)
|
|
58
|
-
Object.assign(payload, extra);
|
|
59
|
-
emitJsonError(payload);
|
|
60
|
-
}
|
|
61
|
-
else {
|
|
62
|
-
console.error(message);
|
|
63
|
-
if (hint)
|
|
64
|
-
console.error(hint);
|
|
65
|
-
}
|
|
66
|
-
process.exit(code);
|
|
67
|
-
}
|
|
68
|
-
function escapeMarkdownCell(s) {
|
|
69
|
-
// Pipes break markdown table layout; backslash-escape them. Collapse
|
|
70
|
-
// newlines into <br> so each row stays on one line.
|
|
71
|
-
return s.replace(/\|/g, '\\|').replace(/\r?\n/g, '<br>');
|
|
72
|
-
}
|
|
73
|
-
function formatCell(cell, style) {
|
|
74
|
-
if (cell === null || cell === undefined)
|
|
75
|
-
return style === 'markdown' ? '—' : chalk.grey('—');
|
|
76
|
-
if (typeof cell === 'boolean') {
|
|
77
|
-
if (style === 'markdown')
|
|
78
|
-
return cell ? 'Yes' : 'No';
|
|
79
|
-
return cell ? chalk.green('✓') : chalk.red('✗');
|
|
80
|
-
}
|
|
81
|
-
return String(cell);
|
|
82
|
-
}
|
|
83
|
-
function renderMarkdownTable(headers, rows) {
|
|
84
|
-
if (rows.length === 0) {
|
|
85
|
-
return '_(empty)_';
|
|
86
|
-
}
|
|
87
|
-
const head = `| ${headers.map(escapeMarkdownCell).join(' | ')} |`;
|
|
88
|
-
const sep = `| ${headers.map(() => '---').join(' | ')} |`;
|
|
89
|
-
const body = rows.map((r) => `| ${r
|
|
90
|
-
.map((c) => escapeMarkdownCell(formatCell(c, 'markdown')))
|
|
91
|
-
.join(' | ')} |`);
|
|
92
|
-
return [head, sep, ...body].join('\n');
|
|
93
|
-
}
|
|
94
|
-
function renderSimpleTable(headers, rows) {
|
|
95
|
-
const widths = headers.map((h, i) => Math.max(h.length, ...rows.map((r) => String(formatCell(r[i], 'simple')).length)));
|
|
96
|
-
const fmt = (cells) => cells.map((c, i) => c.padEnd(widths[i])).join(' ').trimEnd();
|
|
97
|
-
return [
|
|
98
|
-
fmt(headers),
|
|
99
|
-
...rows.map((r) => fmt(r.map((c) => String(formatCell(c, 'simple'))))),
|
|
100
|
-
].join('\n');
|
|
101
|
-
}
|
|
102
|
-
const ASCII_BORDER_CHARS = {
|
|
103
|
-
top: '-', 'top-mid': '+', 'top-left': '+', 'top-right': '+',
|
|
104
|
-
bottom: '-', 'bottom-mid': '+', 'bottom-left': '+', 'bottom-right': '+',
|
|
105
|
-
left: '|', 'left-mid': '+', mid: '-', 'mid-mid': '+',
|
|
106
|
-
right: '|', 'right-mid': '+', middle: '|',
|
|
107
|
-
};
|
|
108
|
-
export function printTable(headers, rows, styleOverride) {
|
|
109
|
-
const style = styleOverride ?? getTableStyle();
|
|
110
|
-
if (style === 'markdown') {
|
|
111
|
-
console.log(renderMarkdownTable(headers, rows));
|
|
112
|
-
return;
|
|
113
|
-
}
|
|
114
|
-
if (style === 'simple') {
|
|
115
|
-
console.log(renderSimpleTable(headers, rows));
|
|
116
|
-
return;
|
|
117
|
-
}
|
|
118
|
-
const tableOpts = {
|
|
119
|
-
head: headers.map((h) => (style === 'ascii' ? h : chalk.cyan(h))),
|
|
120
|
-
style: style === 'ascii' ? { border: [], head: [] } : { border: ['grey'] },
|
|
121
|
-
};
|
|
122
|
-
if (style === 'ascii') {
|
|
123
|
-
tableOpts.chars = ASCII_BORDER_CHARS;
|
|
124
|
-
}
|
|
125
|
-
const table = new Table(tableOpts);
|
|
126
|
-
for (const row of rows) {
|
|
127
|
-
table.push(row.map((cell) => formatCell(cell, style)));
|
|
128
|
-
}
|
|
129
|
-
console.log(table.toString());
|
|
130
|
-
}
|
|
131
|
-
export function printKeyValue(data) {
|
|
132
|
-
const style = getTableStyle();
|
|
133
|
-
if (style === 'markdown') {
|
|
134
|
-
const entries = Object.entries(data).filter(([, v]) => v !== null && v !== undefined);
|
|
135
|
-
const rows = entries.map(([k, v]) => [k, typeof v === 'object' ? JSON.stringify(v) : String(v)]);
|
|
136
|
-
console.log(renderMarkdownTable(['Key', 'Value'], rows));
|
|
137
|
-
return;
|
|
138
|
-
}
|
|
139
|
-
if (style === 'simple') {
|
|
140
|
-
for (const [key, value] of Object.entries(data)) {
|
|
141
|
-
if (value === null || value === undefined)
|
|
142
|
-
continue;
|
|
143
|
-
const displayValue = typeof value === 'object' ? JSON.stringify(value) : String(value);
|
|
144
|
-
console.log(`${key} ${displayValue}`);
|
|
145
|
-
}
|
|
146
|
-
return;
|
|
147
|
-
}
|
|
148
|
-
const tableOpts = {
|
|
149
|
-
style: style === 'ascii' ? { border: [], head: [] } : { border: ['grey'] },
|
|
150
|
-
};
|
|
151
|
-
if (style === 'ascii') {
|
|
152
|
-
tableOpts.chars = ASCII_BORDER_CHARS;
|
|
153
|
-
}
|
|
154
|
-
const table = new Table(tableOpts);
|
|
155
|
-
for (const [key, value] of Object.entries(data)) {
|
|
156
|
-
if (value === null || value === undefined)
|
|
157
|
-
continue;
|
|
158
|
-
const displayValue = typeof value === 'object' ? JSON.stringify(value) : String(value);
|
|
159
|
-
const keyLabel = style === 'ascii' ? key : chalk.cyan(key);
|
|
160
|
-
table.push({ [keyLabel]: displayValue });
|
|
161
|
-
}
|
|
162
|
-
console.log(table.toString());
|
|
163
|
-
}
|
|
164
|
-
export class UsageError extends Error {
|
|
165
|
-
constructor(message) {
|
|
166
|
-
super(message);
|
|
167
|
-
this.name = 'UsageError';
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
export class StructuredUsageError extends Error {
|
|
171
|
-
context;
|
|
172
|
-
constructor(message, context) {
|
|
173
|
-
super(message);
|
|
174
|
-
this.context = context;
|
|
175
|
-
this.name = 'StructuredUsageError';
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
function classifyApiError(code) {
|
|
179
|
-
switch (code) {
|
|
180
|
-
case 151:
|
|
181
|
-
case 160:
|
|
182
|
-
case 3005: return 'command-not-supported';
|
|
183
|
-
case 152: return 'device-not-found';
|
|
184
|
-
case 161:
|
|
185
|
-
case 171: return 'device-offline';
|
|
186
|
-
case 190: return 'device-internal-error';
|
|
187
|
-
case 401: return 'auth-failed';
|
|
188
|
-
case 429: return 'quota-exceeded';
|
|
189
|
-
default: return 'unknown-api-error';
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
export function buildErrorPayload(error) {
|
|
193
|
-
if (error instanceof StructuredUsageError) {
|
|
194
|
-
const payload = {
|
|
195
|
-
code: 2,
|
|
196
|
-
kind: 'usage',
|
|
197
|
-
message: error.message,
|
|
198
|
-
errorClass: 'usage',
|
|
199
|
-
transient: false,
|
|
200
|
-
};
|
|
201
|
-
if (error.context) {
|
|
202
|
-
const ctx = error.context;
|
|
203
|
-
const { error: errorType, candidates, hint } = ctx;
|
|
204
|
-
if (errorType === 'ambiguous_name_match') {
|
|
205
|
-
payload.subKind = 'ambiguous-name-match';
|
|
206
|
-
}
|
|
207
|
-
if (Array.isArray(candidates) && candidates.length > 0) {
|
|
208
|
-
const normalized = candidates
|
|
209
|
-
.map((c) => {
|
|
210
|
-
if (typeof c !== 'object' || c === null)
|
|
211
|
-
return null;
|
|
212
|
-
const o = c;
|
|
213
|
-
const name = typeof o.name === 'string' ? o.name
|
|
214
|
-
: typeof o.sceneName === 'string' ? o.sceneName
|
|
215
|
-
: '';
|
|
216
|
-
const match = { name };
|
|
217
|
-
if (typeof o.deviceId === 'string')
|
|
218
|
-
match.deviceId = o.deviceId;
|
|
219
|
-
if (typeof o.sceneId === 'string')
|
|
220
|
-
match.sceneId = o.sceneId;
|
|
221
|
-
return match;
|
|
222
|
-
})
|
|
223
|
-
.filter((c) => c !== null && c.name.length > 0);
|
|
224
|
-
if (normalized.length > 0)
|
|
225
|
-
payload.candidateMatches = normalized;
|
|
226
|
-
}
|
|
227
|
-
if (typeof hint === 'string') {
|
|
228
|
-
payload.resolutionHint = hint;
|
|
229
|
-
}
|
|
230
|
-
// Preserve full context for backward compatibility (including candidates / hint).
|
|
231
|
-
payload.context = ctx;
|
|
232
|
-
}
|
|
233
|
-
return payload;
|
|
234
|
-
}
|
|
235
|
-
if (error instanceof UsageError) {
|
|
236
|
-
return { code: 2, kind: 'usage', message: error.message, errorClass: 'usage', transient: false };
|
|
237
|
-
}
|
|
238
|
-
// Idempotency conflict → exit 2 with kind:guard so scripts can react.
|
|
239
|
-
if (error instanceof Error && error.name === 'IdempotencyConflictError') {
|
|
240
|
-
return {
|
|
241
|
-
code: 2,
|
|
242
|
-
kind: 'guard',
|
|
243
|
-
message: error.message,
|
|
244
|
-
errorClass: 'guard',
|
|
245
|
-
transient: false,
|
|
246
|
-
context: {
|
|
247
|
-
existingShape: error.existingShape,
|
|
248
|
-
newShape: error.newShape,
|
|
249
|
-
},
|
|
250
|
-
};
|
|
251
|
-
}
|
|
252
|
-
// Local daily-cap refusal → exit 2 (usage-style refusal before touching net).
|
|
253
|
-
if (error instanceof Error && error.name === 'DailyCapExceededError') {
|
|
254
|
-
return {
|
|
255
|
-
code: 2,
|
|
256
|
-
kind: 'guard',
|
|
257
|
-
message: error.message,
|
|
258
|
-
errorClass: 'guard',
|
|
259
|
-
transient: false,
|
|
260
|
-
context: {
|
|
261
|
-
cap: error.cap,
|
|
262
|
-
total: error.total,
|
|
263
|
-
profile: error.profile,
|
|
264
|
-
},
|
|
265
|
-
};
|
|
266
|
-
}
|
|
267
|
-
const code = error instanceof ApiError ? error.code : 1;
|
|
268
|
-
const kind = error instanceof ApiError ? 'api' : 'runtime';
|
|
269
|
-
const message = error instanceof Error ? error.message : 'An unknown error occurred';
|
|
270
|
-
const hint = error instanceof ApiError ? (error.hint ?? errorHint(error.code)) : null;
|
|
271
|
-
const retryable = error instanceof ApiError ? error.retryable : false;
|
|
272
|
-
const retryAfterMs = error instanceof ApiError ? error.retryAfterMs : undefined;
|
|
273
|
-
const transient = error instanceof ApiError ? error.transient : false;
|
|
274
|
-
// Classify error
|
|
275
|
-
let errorClass = 'api';
|
|
276
|
-
if (kind === 'runtime') {
|
|
277
|
-
errorClass = 'api';
|
|
278
|
-
}
|
|
279
|
-
else if (transient && code >= 500) {
|
|
280
|
-
errorClass = 'api';
|
|
281
|
-
}
|
|
282
|
-
else if (code === 0) {
|
|
283
|
-
errorClass = 'network';
|
|
284
|
-
}
|
|
285
|
-
else if (code >= 400) {
|
|
286
|
-
errorClass = 'api';
|
|
287
|
-
}
|
|
288
|
-
const payload = { code, kind, message, errorClass, transient };
|
|
289
|
-
if (error instanceof ApiError)
|
|
290
|
-
payload.subKind = classifyApiError(error.code);
|
|
291
|
-
if (hint)
|
|
292
|
-
payload.hint = hint;
|
|
293
|
-
if (retryable)
|
|
294
|
-
payload.retryable = true;
|
|
295
|
-
if (retryAfterMs !== undefined)
|
|
296
|
-
payload.retryAfterMs = retryAfterMs;
|
|
297
|
-
return payload;
|
|
298
|
-
}
|
|
299
|
-
export function handleError(error) {
|
|
300
|
-
if (error instanceof DryRunSignal) {
|
|
301
|
-
process.exit(0);
|
|
302
|
-
}
|
|
303
|
-
const payload = buildErrorPayload(error);
|
|
304
|
-
if (isJsonMode()) {
|
|
305
|
-
// Bug #SYS-1: Under --json, route the structured envelope to stdout so
|
|
306
|
-
// `cli --json ... | jq` pipelines can decode the error shape exactly
|
|
307
|
-
// the same way they decode success. Previously it went to stderr, which
|
|
308
|
-
// silently broke every error-path pipeline. TTY users still get a
|
|
309
|
-
// terse human-readable line on stderr so interactive runs don't look
|
|
310
|
-
// like the process simply exited.
|
|
311
|
-
console.log(JSON.stringify({ schemaVersion: SCHEMA_VERSION, error: payload }));
|
|
312
|
-
if (process.stderr.isTTY) {
|
|
313
|
-
console.error(chalk.red(payload.message));
|
|
314
|
-
}
|
|
315
|
-
process.exit(payload.code === 2 ? 2 : 1);
|
|
316
|
-
}
|
|
317
|
-
if (payload.kind === 'usage') {
|
|
318
|
-
console.error(payload.message);
|
|
319
|
-
if (Array.isArray(payload.candidateMatches) && payload.candidateMatches.length > 0) {
|
|
320
|
-
const names = payload.candidateMatches
|
|
321
|
-
.map((c) => {
|
|
322
|
-
const id = c.deviceId ?? c.sceneId;
|
|
323
|
-
if (c.name && id)
|
|
324
|
-
return `${c.name} (${id})`;
|
|
325
|
-
return c.name ?? id ?? JSON.stringify(c);
|
|
326
|
-
})
|
|
327
|
-
.slice(0, 6);
|
|
328
|
-
console.error(`Did you mean: ${names.join(', ')}?`);
|
|
329
|
-
}
|
|
330
|
-
else {
|
|
331
|
-
const ctx = payload.context;
|
|
332
|
-
if (ctx && Array.isArray(ctx.candidates) && ctx.candidates.length > 0) {
|
|
333
|
-
const names = ctx.candidates
|
|
334
|
-
.map((c) => {
|
|
335
|
-
if (typeof c === 'string')
|
|
336
|
-
return c;
|
|
337
|
-
if (c && typeof c === 'object') {
|
|
338
|
-
const o = c;
|
|
339
|
-
const name = typeof o.name === 'string'
|
|
340
|
-
? o.name
|
|
341
|
-
: typeof o.sceneName === 'string' ? o.sceneName : undefined;
|
|
342
|
-
const id = typeof o.deviceId === 'string'
|
|
343
|
-
? o.deviceId
|
|
344
|
-
: typeof o.sceneId === 'string' ? o.sceneId : typeof o.id === 'string' ? o.id : undefined;
|
|
345
|
-
if (name && id)
|
|
346
|
-
return `${name} (${id})`;
|
|
347
|
-
return name ?? id ?? JSON.stringify(c);
|
|
348
|
-
}
|
|
349
|
-
return String(c);
|
|
350
|
-
})
|
|
351
|
-
.slice(0, 6);
|
|
352
|
-
console.error(`Did you mean: ${names.join(', ')}?`);
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
if (payload.resolutionHint) {
|
|
356
|
-
console.error(payload.resolutionHint);
|
|
357
|
-
}
|
|
358
|
-
else {
|
|
359
|
-
const ctx = payload.context;
|
|
360
|
-
if (ctx && typeof ctx.hint === 'string') {
|
|
361
|
-
console.error(ctx.hint);
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
process.exit(2);
|
|
365
|
-
}
|
|
366
|
-
if (payload.kind === 'guard') {
|
|
367
|
-
console.error(chalk.yellow(`Guard: ${payload.message}`));
|
|
368
|
-
process.exit(payload.code === 2 ? 2 : 1);
|
|
369
|
-
}
|
|
370
|
-
if (error instanceof ApiError) {
|
|
371
|
-
console.error(chalk.red(`Error (code ${error.code}): ${payload.message}`));
|
|
372
|
-
if (payload.hint)
|
|
373
|
-
console.error(chalk.grey(`Hint: ${payload.hint}`));
|
|
374
|
-
}
|
|
375
|
-
else if (error instanceof Error) {
|
|
376
|
-
console.error(chalk.red(`Error: ${payload.message}`));
|
|
377
|
-
}
|
|
378
|
-
else {
|
|
379
|
-
console.error(chalk.red('An unknown error occurred'));
|
|
380
|
-
}
|
|
381
|
-
process.exit(1);
|
|
382
|
-
}
|
|
383
|
-
function errorHint(code) {
|
|
384
|
-
switch (code) {
|
|
385
|
-
case 152:
|
|
386
|
-
return "Check the deviceId with 'switchbot devices list' (IDs are case-sensitive).";
|
|
387
|
-
case 160:
|
|
388
|
-
return "Run 'switchbot devices describe <deviceId>' to see which commands this device supports.";
|
|
389
|
-
case 161:
|
|
390
|
-
return 'BLE-only devices require a Hub. Check the hub connection and Wi-Fi.';
|
|
391
|
-
case 171:
|
|
392
|
-
return 'The Hub itself is offline — check its power and Wi-Fi.';
|
|
393
|
-
case 190:
|
|
394
|
-
return 'SwitchBot API code 190 is a generic internal error. Common causes: invalid deviceId, unsupported command/parameter, or the endpoint does not apply (e.g., "webhook query" with no webhook configured). Verify with --verbose.';
|
|
395
|
-
case 401:
|
|
396
|
-
return "Re-run 'switchbot config set-token <token> <secret>', or verify SWITCHBOT_TOKEN / SWITCHBOT_SECRET.";
|
|
397
|
-
case 429:
|
|
398
|
-
return 'Daily quota is 10,000 requests/account — retry after midnight UTC.';
|
|
399
|
-
case 3005:
|
|
400
|
-
return "SwitchBot rejected the command as invalid for this specific device model. For IR remotes, this often means the command works only on --type customize (user-learned buttons). Try 'switchbot devices commands <type>' or check the device's capabilities.";
|
|
401
|
-
default:
|
|
402
|
-
return null;
|
|
403
|
-
}
|
|
404
|
-
}
|
|
405
|
-
//# sourceMappingURL=output.js.map
|
package/dist/utils/output.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAE1D,OAAO,EAAE,SAAS,EAAE,aAAa,EAAmB,MAAM,YAAY,CAAC;AAEvE,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,CAAC;AAEpC,MAAM,UAAU,UAAU;IACxB,OAAO,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,SAAS,EAAE,KAAK,MAAM,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAa;IACrC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,aAAa,EAAE,cAAc,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAChF,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,aAAa,CAAC,YAAqC;IACjE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,aAAa,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;IACpF,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,OAAO,YAAY,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;QACtF,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAChC,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAGhC;IACC,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CAAC;QACb,aAAa,EAAE,GAAG;QAClB,MAAM,EAAE,IAAI;QACZ,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,OAAO,EAAE,IAAI,CAAC,OAAO;KACtB,CAAC,CACH,CAAC;AACJ,CAAC;AAWD,MAAM,UAAU,aAAa,CAAC,aAA4C;IACxE,MAAM,IAAI,GACR,OAAO,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC;IACjF,MAAM,EAAE,OAAO,EAAE,IAAI,GAAG,OAAO,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IACzE,IAAI,UAAU,EAAE,EAAE,CAAC;QACjB,MAAM,OAAO,GAA4B,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QACjE,IAAI,IAAI;YAAE,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;QAC9B,IAAI,OAAO;YAAE,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;QACvC,IAAI,KAAK;YAAE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACzC,aAAa,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACvB,IAAI,IAAI;YAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrB,CAAC;AAED,SAAS,kBAAkB,CAAC,CAAS;IACnC,qEAAqE;IACrE,oDAAoD;IACpD,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,UAAU,CAAC,IAAkD,EAAE,KAAiB;IACvF,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7F,IAAI,OAAO,IAAI,KAAK,SAAS,EAAE,CAAC;QAC9B,IAAI,KAAK,KAAK,UAAU;YAAE,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QACrD,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;AACtB,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAiB,EAAE,IAAwD;IACtG,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IAClE,MAAM,GAAG,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CACnB,CAAC,CAAC,EAAE,EAAE,CACJ,KAAK,CAAC;SACH,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;SACzD,IAAI,CAAC,KAAK,CAAC,IAAI,CACrB,CAAC;IACF,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAiB,EAAE,IAAwD;IACpG,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAClC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAClF,CAAC;IACF,MAAM,GAAG,GAAG,CAAC,KAAe,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;IAC/F,OAAO;QACL,GAAG,CAAC,OAAO,CAAC;QACZ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;KACvE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,kBAAkB,GAAG;IACzB,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG;IAC3D,MAAM,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,cAAc,EAAE,GAAG;IACvE,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG;IACpD,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG;CAC1C,CAAC;AAEF,MAAM,UAAU,UAAU,CACxB,OAAiB,EACjB,IAAwD,EACxD,aAA0B;IAE1B,MAAM,KAAK,GAAG,aAAa,IAAI,aAAa,EAAE,CAAC;IAC/C,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QAChD,OAAO;IACT,CAAC;IACD,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QAC9C,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAA2C;QACxD,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACjE,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE;KAC3E,CAAC;IACF,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;QACtB,SAAS,CAAC,KAAK,GAAG,kBAAkB,CAAC;IACvC,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;IAEnC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IACzD,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAA6B;IACzD,MAAM,KAAK,GAAG,aAAa,EAAE,CAAC;IAC9B,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS,CAAC,CAAC;QACtF,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QACzD,OAAO;IACT,CAAC;IACD,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAChD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;gBAAE,SAAS;YACpD,MAAM,YAAY,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvF,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,KAAK,YAAY,EAAE,CAAC,CAAC;QACzC,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAA2C;QACxD,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE;KAC3E,CAAC;IACF,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;QACtB,SAAS,CAAC,KAAK,GAAG,kBAAkB,CAAC;IACvC,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;IAEnC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAChD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QACpD,MAAM,YAAY,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvF,MAAM,QAAQ,GAAG,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,OAAO,UAAW,SAAQ,KAAK;IACnC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AAoCD,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IACA;IAA7C,YAAY,OAAe,EAAkB,OAAiC;QAC5E,KAAK,CAAC,OAAO,CAAC,CAAC;QAD4B,YAAO,GAAP,OAAO,CAA0B;QAE5E,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAED,SAAS,gBAAgB,CAAC,IAAY;IACpC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,GAAG,CAAC;QACT,KAAK,GAAG,CAAC;QACT,KAAK,IAAI,CAAC,CAAC,OAAO,uBAAuB,CAAC;QAC1C,KAAK,GAAG,CAAC,CAAC,OAAO,kBAAkB,CAAC;QACpC,KAAK,GAAG,CAAC;QACT,KAAK,GAAG,CAAC,CAAC,OAAO,gBAAgB,CAAC;QAClC,KAAK,GAAG,CAAC,CAAC,OAAO,uBAAuB,CAAC;QACzC,KAAK,GAAG,CAAC,CAAC,OAAO,aAAa,CAAC;QAC/B,KAAK,GAAG,CAAC,CAAC,OAAO,gBAAgB,CAAC;QAClC,OAAO,CAAC,CAAE,OAAO,mBAAmB,CAAC;IACvC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,IAAI,KAAK,YAAY,oBAAoB,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAiB;YAC5B,IAAI,EAAE,CAAC;YACP,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,UAAU,EAAE,OAAO;YACnB,SAAS,EAAE,KAAK;SACjB,CAAC;QACF,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,GAAG,GAAG,KAAK,CAAC,OAAkC,CAAC;YACrD,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC;YACnD,IAAI,SAAS,KAAK,sBAAsB,EAAE,CAAC;gBACzC,OAAO,CAAC,OAAO,GAAG,sBAAsB,CAAC;YAC3C,CAAC;YACD,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvD,MAAM,UAAU,GAAI,UAAwB;qBACzC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;oBACT,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;wBAAE,OAAO,IAAI,CAAC;oBACrD,MAAM,CAAC,GAAG,CAA4B,CAAC;oBACvC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;wBAC9C,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;4BAC/C,CAAC,CAAC,EAAE,CAAC;oBACP,MAAM,KAAK,GAAmB,EAAE,IAAI,EAAE,CAAC;oBACvC,IAAI,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ;wBAAE,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;oBAChE,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ;wBAAE,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;oBAC7D,OAAO,KAAK,CAAC;gBACf,CAAC,CAAC;qBACD,MAAM,CAAC,CAAC,CAAC,EAAuB,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACvE,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;oBAAE,OAAO,CAAC,gBAAgB,GAAG,UAAU,CAAC;YACnE,CAAC;YACD,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC7B,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;YAChC,CAAC;YACD,kFAAkF;YAClF,OAAO,CAAC,OAAO,GAAG,GAAG,CAAC;QACxB,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;QAChC,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACnG,CAAC;IACD,sEAAsE;IACtE,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,0BAA0B,EAAE,CAAC;QACxE,OAAO;YACL,IAAI,EAAE,CAAC;YACP,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,UAAU,EAAE,OAAO;YACnB,SAAS,EAAE,KAAK;YAChB,OAAO,EAAE;gBACP,aAAa,EAAG,KAAoC,CAAC,aAAa;gBAClE,QAAQ,EAAG,KAA+B,CAAC,QAAQ;aACpD;SACF,CAAC;IACJ,CAAC;IACD,8EAA8E;IAC9E,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,uBAAuB,EAAE,CAAC;QACrE,OAAO;YACL,IAAI,EAAE,CAAC;YACP,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,UAAU,EAAE,OAAO;YACnB,SAAS,EAAE,KAAK;YAChB,OAAO,EAAE;gBACP,GAAG,EAAG,KAA0B,CAAC,GAAG;gBACpC,KAAK,EAAG,KAA4B,CAAC,KAAK;gBAC1C,OAAO,EAAG,KAA8B,CAAC,OAAO;aACjD;SACF,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,YAAY,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACxD,MAAM,IAAI,GAAyB,KAAK,YAAY,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IACjF,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,2BAA2B,CAAC;IACrF,MAAM,IAAI,GAAG,KAAK,YAAY,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACtF,MAAM,SAAS,GAAG,KAAK,YAAY,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;IACtE,MAAM,YAAY,GAAG,KAAK,YAAY,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;IAChF,MAAM,SAAS,GAAG,KAAK,YAAY,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;IAEtE,iBAAiB;IACjB,IAAI,UAAU,GAA+B,KAAK,CAAC;IACnD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,UAAU,GAAG,KAAK,CAAC;IACrB,CAAC;SAAM,IAAI,SAAS,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC;QACpC,UAAU,GAAG,KAAK,CAAC;IACrB,CAAC;SAAM,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;QACtB,UAAU,GAAG,SAAS,CAAC;IACzB,CAAC;SAAM,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC;QACvB,UAAU,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,MAAM,OAAO,GAAiB,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;IAC7E,IAAI,KAAK,YAAY,QAAQ;QAAE,OAAO,CAAC,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9E,IAAI,IAAI;QAAE,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAC9B,IAAI,SAAS;QAAE,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IACxC,IAAI,YAAY,KAAK,SAAS;QAAE,OAAO,CAAC,YAAY,GAAG,YAAY,CAAC;IACpE,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,IAAI,KAAK,YAAY,YAAY,EAAE,CAAC;QAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAEzC,IAAI,UAAU,EAAE,EAAE,CAAC;QACjB,uEAAuE;QACvE,qEAAqE;QACrE,wEAAwE;QACxE,kEAAkE;QAClE,qEAAqE;QACrE,kCAAkC;QAClC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,aAAa,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;QAC/E,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACzB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC7B,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC/B,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,OAAO,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnF,MAAM,KAAK,GAAG,OAAO,CAAC,gBAAgB;iBACnC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBACT,MAAM,EAAE,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,OAAO,CAAC;gBACnC,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE;oBAAE,OAAO,GAAG,CAAC,CAAC,IAAI,KAAK,EAAE,GAAG,CAAC;gBAC7C,OAAO,CAAC,CAAC,IAAI,IAAI,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAC3C,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,iBAAiB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACtD,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC;YAC5B,IAAI,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtE,MAAM,KAAK,GAAI,GAAG,CAAC,UAAwB;qBACxC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;oBACT,IAAI,OAAO,CAAC,KAAK,QAAQ;wBAAE,OAAO,CAAC,CAAC;oBACpC,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;wBAC/B,MAAM,CAAC,GAAG,CAA4B,CAAC;wBACvC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ;4BACrC,CAAC,CAAC,CAAC,CAAC,IAAI;4BACR,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;wBAC9D,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ;4BACvC,CAAC,CAAC,CAAC,CAAC,QAAQ;4BACZ,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;wBAC5F,IAAI,IAAI,IAAI,EAAE;4BAAE,OAAO,GAAG,IAAI,KAAK,EAAE,GAAG,CAAC;wBACzC,OAAO,IAAI,IAAI,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;oBACzC,CAAC;oBACD,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;gBACnB,CAAC,CAAC;qBACD,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,iBAAiB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;QACD,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC;YAC5B,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACxC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC7B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACzD,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;QAC9B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,IAAI,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC3E,IAAI,OAAO,CAAC,IAAI;YAAE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACvE,CAAC;SAAM,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACxD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,GAAG;YACN,OAAO,4EAA4E,CAAC;QACtF,KAAK,GAAG;YACN,OAAO,yFAAyF,CAAC;QACnG,KAAK,GAAG;YACN,OAAO,qEAAqE,CAAC;QAC/E,KAAK,GAAG;YACN,OAAO,wDAAwD,CAAC;QAClE,KAAK,GAAG;YACN,OAAO,+NAA+N,CAAC;QACzO,KAAK,GAAG;YACN,OAAO,qGAAqG,CAAC;QAC/G,KAAK,GAAG;YACN,OAAO,oEAAoE,CAAC;QAC9E,KAAK,IAAI;YACP,OAAO,2PAA2P,CAAC;QACrQ;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC"}
|