@switchbot/openapi-cli 3.2.1 → 3.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/dist/index.js +57349 -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,383 +0,0 @@
|
|
|
1
|
-
import { getEffectiveCatalog, deriveSafetyTier, deriveStatusQueries, } from '../devices/catalog.js';
|
|
2
|
-
import { RESOURCE_CATALOG } from '../devices/resources.js';
|
|
3
|
-
import { loadCache } from '../devices/cache.js';
|
|
4
|
-
import { printJson } from '../utils/output.js';
|
|
5
|
-
import { enumArg, stringArg } from '../utils/arg-parsers.js';
|
|
6
|
-
import { IDENTITY } from './identity.js';
|
|
7
|
-
/** Collect the distinct catalog safety tiers actually used across the given entries. Sorted. */
|
|
8
|
-
function collectSafetyTiersInUse(entries) {
|
|
9
|
-
const seen = new Set();
|
|
10
|
-
for (const e of entries) {
|
|
11
|
-
for (const c of e.commands) {
|
|
12
|
-
seen.add(deriveSafetyTier(c, e));
|
|
13
|
-
}
|
|
14
|
-
// P11: statusQueries contribute the 'read' tier.
|
|
15
|
-
if (deriveStatusQueries(e).length > 0) {
|
|
16
|
-
seen.add('read');
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
return [...seen].sort();
|
|
20
|
-
}
|
|
21
|
-
/** P11: total number of read-only queries exposed across the catalog. */
|
|
22
|
-
function countStatusQueries(entries) {
|
|
23
|
-
return entries.reduce((n, e) => n + deriveStatusQueries(e).length, 0);
|
|
24
|
-
}
|
|
25
|
-
const AGENT_GUIDE = {
|
|
26
|
-
safetyTiers: {
|
|
27
|
-
read: 'No state mutation; safe to call freely — does not consume quota unless noted.',
|
|
28
|
-
action: 'Mutates device or cloud state but is reversible and routine (turnOn, setColor).',
|
|
29
|
-
destructive: 'Hard to reverse / physical-world side effects (unlock, garage open, delete key). Requires explicit user confirmation.',
|
|
30
|
-
},
|
|
31
|
-
riskLevels: {
|
|
32
|
-
low: 'Read-only or non-mutating. Safe to call autonomously.',
|
|
33
|
-
medium: 'Mutates state (action tier). Prefer `plan` workflow. Reversible.',
|
|
34
|
-
high: 'Destructive / hard-to-reverse. Must go through review-before-execute. Direct --yes execution is reserved for explicit dev profiles.',
|
|
35
|
-
},
|
|
36
|
-
recommendedModes: {
|
|
37
|
-
direct: 'May be called directly without a plan step.',
|
|
38
|
-
plan: 'Prefer batching in a plan for traceability and dry-run support.',
|
|
39
|
-
'review-before-execute': 'Must be reviewed/approved before execution. Use `plan save`, `plan review`, `plan approve`, then `plan execute`.',
|
|
40
|
-
},
|
|
41
|
-
verifiability: {
|
|
42
|
-
local: 'Result is fully verifiable from the CLI return value itself.',
|
|
43
|
-
deviceConfirmed: 'Device returns an ack with an observable state field.',
|
|
44
|
-
deviceDependent: 'Verifiability depends on the specific device (IR is never verifiable).',
|
|
45
|
-
none: 'No feedback — e.g. IR transmission. Pair with an external sensor to confirm.',
|
|
46
|
-
},
|
|
47
|
-
};
|
|
48
|
-
function deriveRiskMeta(meta) {
|
|
49
|
-
const riskLevel = meta.agentSafetyTier === 'destructive' ? 'high'
|
|
50
|
-
: meta.agentSafetyTier === 'action' ? 'medium' : 'low';
|
|
51
|
-
return {
|
|
52
|
-
riskLevel,
|
|
53
|
-
requiresConfirmation: meta.agentSafetyTier === 'destructive',
|
|
54
|
-
supportsDryRun: meta.mutating,
|
|
55
|
-
idempotencyHint: meta.idempotencySupported ? 'safe' : meta.mutating ? 'non-idempotent' : 'safe',
|
|
56
|
-
recommendedMode: meta.agentSafetyTier === 'destructive' ? 'review-before-execute'
|
|
57
|
-
: meta.agentSafetyTier === 'action' ? 'plan' : 'direct',
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
function meta(mutating, consumesQuota, idempotencySupported, agentSafetyTier, verifiability, typicalLatencyMs) {
|
|
61
|
-
return { mutating, consumesQuota, idempotencySupported, agentSafetyTier, verifiability, typicalLatencyMs };
|
|
62
|
-
}
|
|
63
|
-
const READ_LOCAL = meta(false, false, false, 'read', 'local', 20);
|
|
64
|
-
const READ_REMOTE = meta(false, true, false, 'read', 'local', 500);
|
|
65
|
-
const ACTION_LOCAL = meta(true, false, false, 'action', 'local', 20);
|
|
66
|
-
const ACTION_REMOTE = meta(true, true, false, 'action', 'deviceDependent', 900);
|
|
67
|
-
const ACTION_REMOTE_IDEMPOTENT = meta(true, true, true, 'action', 'deviceDependent', 900);
|
|
68
|
-
const DESTRUCTIVE_LOCAL = meta(true, false, false, 'destructive', 'local', 20);
|
|
69
|
-
const DESTRUCTIVE_REMOTE = meta(true, true, false, 'destructive', 'deviceDependent', 1200);
|
|
70
|
-
const READ_NONE = meta(false, false, false, 'read', 'none', 50);
|
|
71
|
-
export const COMMAND_META = {
|
|
72
|
-
'agent-bootstrap': READ_LOCAL,
|
|
73
|
-
'auth keychain describe': READ_LOCAL,
|
|
74
|
-
'auth keychain get': READ_LOCAL,
|
|
75
|
-
'auth keychain set': DESTRUCTIVE_LOCAL,
|
|
76
|
-
'auth keychain delete': DESTRUCTIVE_LOCAL,
|
|
77
|
-
'auth keychain migrate': DESTRUCTIVE_LOCAL,
|
|
78
|
-
'cache show': READ_LOCAL,
|
|
79
|
-
'cache clear': ACTION_LOCAL,
|
|
80
|
-
'capabilities': READ_LOCAL,
|
|
81
|
-
'catalog path': READ_LOCAL,
|
|
82
|
-
'catalog show': READ_LOCAL,
|
|
83
|
-
'catalog search': READ_LOCAL,
|
|
84
|
-
'catalog diff': READ_LOCAL,
|
|
85
|
-
'catalog refresh': ACTION_LOCAL,
|
|
86
|
-
'completion': READ_LOCAL,
|
|
87
|
-
'config set-token': DESTRUCTIVE_LOCAL,
|
|
88
|
-
'config show': READ_LOCAL,
|
|
89
|
-
'config list-profiles': READ_LOCAL,
|
|
90
|
-
'config agent-profile': ACTION_LOCAL,
|
|
91
|
-
'daemon start': ACTION_LOCAL,
|
|
92
|
-
'daemon stop': ACTION_LOCAL,
|
|
93
|
-
'daemon status': READ_LOCAL,
|
|
94
|
-
'daemon reload': ACTION_LOCAL,
|
|
95
|
-
'devices list': READ_REMOTE,
|
|
96
|
-
'devices status': READ_REMOTE,
|
|
97
|
-
'devices command': ACTION_REMOTE_IDEMPOTENT,
|
|
98
|
-
'devices types': READ_LOCAL,
|
|
99
|
-
'devices commands': READ_LOCAL,
|
|
100
|
-
'devices describe': READ_REMOTE,
|
|
101
|
-
'devices batch': ACTION_REMOTE_IDEMPOTENT,
|
|
102
|
-
'devices watch': READ_REMOTE,
|
|
103
|
-
'devices explain': READ_LOCAL,
|
|
104
|
-
'devices expand': READ_LOCAL,
|
|
105
|
-
'devices meta set': ACTION_LOCAL,
|
|
106
|
-
'devices meta get': READ_LOCAL,
|
|
107
|
-
'devices meta list': READ_LOCAL,
|
|
108
|
-
'devices meta clear': ACTION_LOCAL,
|
|
109
|
-
'doctor': READ_LOCAL,
|
|
110
|
-
'events tail': READ_NONE,
|
|
111
|
-
'events mqtt-tail': READ_REMOTE,
|
|
112
|
-
'health check': READ_LOCAL,
|
|
113
|
-
'health serve': READ_LOCAL,
|
|
114
|
-
'history show': READ_LOCAL,
|
|
115
|
-
'history replay': ACTION_REMOTE_IDEMPOTENT,
|
|
116
|
-
'history range': READ_LOCAL,
|
|
117
|
-
'history stats': READ_LOCAL,
|
|
118
|
-
'history verify': READ_LOCAL,
|
|
119
|
-
'history aggregate': READ_LOCAL,
|
|
120
|
-
'install': ACTION_LOCAL,
|
|
121
|
-
'mcp serve': READ_LOCAL,
|
|
122
|
-
'plan schema': READ_LOCAL,
|
|
123
|
-
'plan validate': READ_LOCAL,
|
|
124
|
-
'plan suggest': READ_LOCAL,
|
|
125
|
-
'plan run': ACTION_REMOTE_IDEMPOTENT,
|
|
126
|
-
'plan save': ACTION_LOCAL,
|
|
127
|
-
'plan list': READ_LOCAL,
|
|
128
|
-
'plan review': READ_LOCAL,
|
|
129
|
-
'plan approve': DESTRUCTIVE_LOCAL,
|
|
130
|
-
'plan execute': DESTRUCTIVE_REMOTE,
|
|
131
|
-
'policy validate': READ_LOCAL,
|
|
132
|
-
'policy new': ACTION_LOCAL,
|
|
133
|
-
'policy migrate': ACTION_LOCAL,
|
|
134
|
-
'policy diff': READ_LOCAL,
|
|
135
|
-
'policy add-rule': ACTION_LOCAL,
|
|
136
|
-
'policy backup': READ_LOCAL,
|
|
137
|
-
'policy restore': DESTRUCTIVE_LOCAL,
|
|
138
|
-
'quota status': READ_LOCAL,
|
|
139
|
-
'quota reset': ACTION_LOCAL,
|
|
140
|
-
'rules suggest': READ_LOCAL,
|
|
141
|
-
'rules lint': READ_LOCAL,
|
|
142
|
-
'rules list': READ_LOCAL,
|
|
143
|
-
'rules run': ACTION_REMOTE,
|
|
144
|
-
'rules reload': ACTION_LOCAL,
|
|
145
|
-
'rules tail': READ_LOCAL,
|
|
146
|
-
'rules replay': READ_LOCAL,
|
|
147
|
-
'rules webhook-rotate-token': DESTRUCTIVE_LOCAL,
|
|
148
|
-
'rules webhook-show-token': DESTRUCTIVE_LOCAL,
|
|
149
|
-
'rules conflicts': READ_LOCAL,
|
|
150
|
-
'rules doctor': READ_LOCAL,
|
|
151
|
-
'rules summary': READ_LOCAL,
|
|
152
|
-
'rules last-fired': READ_LOCAL,
|
|
153
|
-
'rules explain': READ_LOCAL,
|
|
154
|
-
'schema export': READ_LOCAL,
|
|
155
|
-
'scenes list': READ_REMOTE,
|
|
156
|
-
'scenes execute': ACTION_REMOTE,
|
|
157
|
-
'scenes describe': READ_REMOTE,
|
|
158
|
-
'scenes validate': READ_REMOTE,
|
|
159
|
-
'scenes simulate': READ_REMOTE,
|
|
160
|
-
'scenes explain': READ_REMOTE,
|
|
161
|
-
'status-sync run': ACTION_REMOTE,
|
|
162
|
-
'status-sync start': ACTION_LOCAL,
|
|
163
|
-
'status-sync stop': ACTION_LOCAL,
|
|
164
|
-
'status-sync status': READ_LOCAL,
|
|
165
|
-
'uninstall': ACTION_LOCAL,
|
|
166
|
-
'upgrade-check': READ_REMOTE,
|
|
167
|
-
'webhook setup': ACTION_REMOTE,
|
|
168
|
-
'webhook query': READ_REMOTE,
|
|
169
|
-
'webhook update': ACTION_REMOTE,
|
|
170
|
-
'webhook delete': DESTRUCTIVE_REMOTE,
|
|
171
|
-
};
|
|
172
|
-
function metaFor(command) {
|
|
173
|
-
return COMMAND_META[command] ?? null;
|
|
174
|
-
}
|
|
175
|
-
const MCP_TOOLS = [
|
|
176
|
-
'list_devices',
|
|
177
|
-
'get_device_status',
|
|
178
|
-
'send_command',
|
|
179
|
-
'describe_device',
|
|
180
|
-
'list_scenes',
|
|
181
|
-
'run_scene',
|
|
182
|
-
'search_catalog',
|
|
183
|
-
'account_overview',
|
|
184
|
-
'get_device_history',
|
|
185
|
-
'query_device_history',
|
|
186
|
-
'aggregate_device_history',
|
|
187
|
-
];
|
|
188
|
-
const IDEMPOTENCY_CONTRACT = {
|
|
189
|
-
flag: '--idempotency-key <key>',
|
|
190
|
-
windowSeconds: 60,
|
|
191
|
-
replayBehavior: 'Same (command, parameter, deviceId) within window → returns cached result with replayed:true.',
|
|
192
|
-
conflictBehavior: 'Same key + different (command, parameter) within window → exit 2, error:"idempotency_conflict".',
|
|
193
|
-
keyStorage: 'In-memory SHA-256 fingerprint; raw key never stored, no disk persistence.',
|
|
194
|
-
scope: 'Process-local. Replay + conflict apply within a single long-lived process (MCP session, devices batch, plan run, history replay). Independent CLI invocations do NOT share cache — each fresh `node` process starts empty.',
|
|
195
|
-
mcp: 'MCP send_command accepts the same idempotencyKey field with identical semantics.',
|
|
196
|
-
};
|
|
197
|
-
function enumerateLeafNames(program, prefix = '') {
|
|
198
|
-
const out = [];
|
|
199
|
-
for (const cmd of program.commands) {
|
|
200
|
-
const full = prefix ? `${prefix} ${cmd.name()}` : cmd.name();
|
|
201
|
-
if (cmd.commands.length === 0)
|
|
202
|
-
out.push(full);
|
|
203
|
-
else
|
|
204
|
-
out.push(...enumerateLeafNames(cmd, full));
|
|
205
|
-
}
|
|
206
|
-
return out;
|
|
207
|
-
}
|
|
208
|
-
function validateCommandMetaCoverage(program) {
|
|
209
|
-
const leaves = enumerateLeafNames(program);
|
|
210
|
-
return leaves.filter((leaf) => !COMMAND_META[leaf]).sort().map((leaf) => `missing:${leaf}`);
|
|
211
|
-
}
|
|
212
|
-
function enumerateLeaves(program, prefix = '') {
|
|
213
|
-
const out = [];
|
|
214
|
-
for (const cmd of program.commands) {
|
|
215
|
-
const full = prefix ? `${prefix} ${cmd.name()}` : cmd.name();
|
|
216
|
-
if (cmd.commands.length === 0) {
|
|
217
|
-
const meta = metaFor(full);
|
|
218
|
-
if (!meta)
|
|
219
|
-
throw new Error(`capabilities metadata missing for leaf command "${full}"`);
|
|
220
|
-
out.push({ name: full, ...meta, ...deriveRiskMeta(meta) });
|
|
221
|
-
}
|
|
222
|
-
else {
|
|
223
|
-
out.push(...enumerateLeaves(cmd, full));
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
return out;
|
|
227
|
-
}
|
|
228
|
-
function projectObject(obj, fields) {
|
|
229
|
-
const out = {};
|
|
230
|
-
for (const f of fields) {
|
|
231
|
-
if (f in obj)
|
|
232
|
-
out[f] = obj[f];
|
|
233
|
-
}
|
|
234
|
-
return out;
|
|
235
|
-
}
|
|
236
|
-
export function registerCapabilitiesCommand(program) {
|
|
237
|
-
const SURFACES = ['cli', 'mcp', 'plan', 'mqtt', 'all'];
|
|
238
|
-
program
|
|
239
|
-
.command('capabilities')
|
|
240
|
-
.description('Print a machine-readable manifest of SwitchBot CLI capabilities (for AI agent bootstrap)')
|
|
241
|
-
.option('--minimal', 'Omit per-subcommand flag details to reduce output size (alias of --compact)')
|
|
242
|
-
.option('--compact', 'Emit a compact summary: identity + leaf command list with safety metadata only')
|
|
243
|
-
.option('--used', 'Restrict the catalog summary to device types present in the local cache. Mirrors `schema export --used`.')
|
|
244
|
-
.option('--surface <s>', 'Restrict surfaces block to one of: cli, mcp, plan, mqtt, all (default: all)', enumArg('--surface', SURFACES))
|
|
245
|
-
.option('--project <csv>', 'Project top-level fields (e.g. --project identity,commands,agentGuide)', stringArg('--project'))
|
|
246
|
-
.action((opts) => {
|
|
247
|
-
const coverageIssues = validateCommandMetaCoverage(program);
|
|
248
|
-
if (coverageIssues.length > 0) {
|
|
249
|
-
throw new Error(`capabilities metadata coverage error: ${coverageIssues.join(', ')}`);
|
|
250
|
-
}
|
|
251
|
-
const compact = Boolean(opts.minimal || opts.compact);
|
|
252
|
-
const catalog = getEffectiveCatalog();
|
|
253
|
-
const leaves = enumerateLeaves(program);
|
|
254
|
-
const fullCommands = compact
|
|
255
|
-
? undefined
|
|
256
|
-
: [
|
|
257
|
-
...program.commands,
|
|
258
|
-
{ name: () => 'help', description: () => 'Display help for a command', commands: [], options: [], registeredArguments: [] },
|
|
259
|
-
].map((c) => {
|
|
260
|
-
const full = c.name();
|
|
261
|
-
const entry = {
|
|
262
|
-
name: full,
|
|
263
|
-
description: c.description(),
|
|
264
|
-
};
|
|
265
|
-
entry.subcommands = c.commands.map((s) => {
|
|
266
|
-
const leafName = `${full} ${s.name()}`;
|
|
267
|
-
const meta = metaFor(leafName);
|
|
268
|
-
return {
|
|
269
|
-
name: s.name(),
|
|
270
|
-
description: s.description(),
|
|
271
|
-
args: s.registeredArguments.map((a) => ({
|
|
272
|
-
name: a.name(),
|
|
273
|
-
required: a.required,
|
|
274
|
-
variadic: a.variadic,
|
|
275
|
-
})),
|
|
276
|
-
flags: s.options.map((o) => ({
|
|
277
|
-
flags: o.flags,
|
|
278
|
-
description: o.description,
|
|
279
|
-
})),
|
|
280
|
-
...(meta ?? {}),
|
|
281
|
-
};
|
|
282
|
-
});
|
|
283
|
-
const selfMeta = metaFor(full);
|
|
284
|
-
if (selfMeta)
|
|
285
|
-
Object.assign(entry, selfMeta);
|
|
286
|
-
return entry;
|
|
287
|
-
});
|
|
288
|
-
const globalFlags = compact
|
|
289
|
-
? undefined
|
|
290
|
-
: program.options.map((opt) => ({ flags: opt.flags, description: opt.description }));
|
|
291
|
-
const surfaces = {
|
|
292
|
-
mcp: {
|
|
293
|
-
entry: 'mcp serve',
|
|
294
|
-
protocol: 'stdio (default) or --port <n> for HTTP',
|
|
295
|
-
tools: MCP_TOOLS,
|
|
296
|
-
resources: ['switchbot://events'],
|
|
297
|
-
toolMeta: 'Each MCP tool mirrors the CLI leaf command metadata (mutating, consumesQuota, agentSafetyTier, idempotencySupported).',
|
|
298
|
-
},
|
|
299
|
-
mqtt: {
|
|
300
|
-
mode: 'consumer',
|
|
301
|
-
authSource: 'SWITCHBOT_TOKEN + SWITCHBOT_SECRET (auto-provisioned via POST /v1.1/iot/credential)',
|
|
302
|
-
cliCmd: 'events mqtt-tail',
|
|
303
|
-
mcpResource: 'switchbot://events',
|
|
304
|
-
protocol: 'MQTTS with TLS client certificates (AWS IoT)',
|
|
305
|
-
},
|
|
306
|
-
plan: {
|
|
307
|
-
schemaCmd: 'plan schema',
|
|
308
|
-
validateCmd: 'plan validate -',
|
|
309
|
-
runCmd: 'plan run -',
|
|
310
|
-
},
|
|
311
|
-
cli: {
|
|
312
|
-
catalogCmd: 'schema export',
|
|
313
|
-
discoveryCmd: 'capabilities',
|
|
314
|
-
healthCmd: 'doctor --json',
|
|
315
|
-
healthCmdSchemaVersion: 1,
|
|
316
|
-
helpFlag: '--help',
|
|
317
|
-
idempotencyContract: IDEMPOTENCY_CONTRACT,
|
|
318
|
-
},
|
|
319
|
-
};
|
|
320
|
-
const filteredSurfaces = (() => {
|
|
321
|
-
if (!opts.surface || opts.surface === 'all')
|
|
322
|
-
return surfaces;
|
|
323
|
-
const picked = {};
|
|
324
|
-
if (opts.surface in surfaces) {
|
|
325
|
-
picked[opts.surface] = surfaces[opts.surface];
|
|
326
|
-
}
|
|
327
|
-
return picked;
|
|
328
|
-
})();
|
|
329
|
-
const roles = [...new Set(catalog.map((e) => e.role ?? 'other'))].sort();
|
|
330
|
-
const payload = {
|
|
331
|
-
version: program.version(),
|
|
332
|
-
schemaVersion: '2',
|
|
333
|
-
agentGuide: AGENT_GUIDE,
|
|
334
|
-
identity: IDENTITY,
|
|
335
|
-
surfaces: filteredSurfaces,
|
|
336
|
-
commands: compact ? leaves : fullCommands,
|
|
337
|
-
// Flat command → meta map keyed by full command path. Published in
|
|
338
|
-
// addition to the tree (where every leaf `subcommands[*]` already
|
|
339
|
-
// carries the same fields via spread) so agents can do O(1) lookup
|
|
340
|
-
// without walking the tree. Includes derived risk metadata fields.
|
|
341
|
-
commandMeta: Object.fromEntries(Object.entries(COMMAND_META).map(([k, v]) => [k, { ...v, ...deriveRiskMeta(v) }])),
|
|
342
|
-
...(globalFlags ? { globalFlags } : {}),
|
|
343
|
-
catalog: compact ? undefined : {
|
|
344
|
-
note: 'Device type catalog (commands, status fields, parameters) is available via `schema export`. Use `schema export --capabilities` for entries annotated with CLI safety metadata.',
|
|
345
|
-
typeCount: catalog.length,
|
|
346
|
-
},
|
|
347
|
-
resources: RESOURCE_CATALOG,
|
|
348
|
-
};
|
|
349
|
-
if (!compact)
|
|
350
|
-
payload.generatedAt = new Date().toISOString();
|
|
351
|
-
if (opts.used) {
|
|
352
|
-
const cache = loadCache();
|
|
353
|
-
if (!cache || Object.keys(cache.devices).length === 0) {
|
|
354
|
-
// No cache → return the payload unchanged but add a `usedFilter` note
|
|
355
|
-
// so agents know the filter was requested but noop'd.
|
|
356
|
-
payload.usedFilter = { applied: false, reason: 'no local cache — run `switchbot devices list` first' };
|
|
357
|
-
}
|
|
358
|
-
else {
|
|
359
|
-
const seen = new Set();
|
|
360
|
-
for (const id of Object.keys(cache.devices)) {
|
|
361
|
-
const t = cache.devices[id].type;
|
|
362
|
-
if (t)
|
|
363
|
-
seen.add(t);
|
|
364
|
-
}
|
|
365
|
-
const filteredCatalog = catalog.filter((e) => seen.has(e.type) || (e.aliases ?? []).some((a) => seen.has(a)));
|
|
366
|
-
payload.catalog = {
|
|
367
|
-
typeCount: filteredCatalog.length,
|
|
368
|
-
roles: [...new Set(filteredCatalog.map((e) => e.role ?? 'other'))].sort(),
|
|
369
|
-
destructiveCommandCount: filteredCatalog.reduce((n, e) => n + e.commands.filter((c) => deriveSafetyTier(c, e) === 'destructive').length, 0),
|
|
370
|
-
safetyTiersInUse: collectSafetyTiersInUse(filteredCatalog),
|
|
371
|
-
readOnlyTypeCount: filteredCatalog.filter((e) => e.readOnly).length,
|
|
372
|
-
readOnlyQueryCount: countStatusQueries(filteredCatalog),
|
|
373
|
-
};
|
|
374
|
-
payload.usedFilter = { applied: true, typesInCache: [...seen].sort() };
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
const projected = opts.project
|
|
378
|
-
? projectObject(payload, opts.project.split(',').map((s) => s.trim()).filter(Boolean))
|
|
379
|
-
: payload;
|
|
380
|
-
printJson(projected);
|
|
381
|
-
});
|
|
382
|
-
}
|
|
383
|
-
//# sourceMappingURL=capabilities.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/commands/capabilities.ts"],"names":[],"mappings":"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"}
|