@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,60 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Install-orchestrator pre-flight (Phase 3A · F5).
|
|
3
|
-
*
|
|
4
|
-
* Pure library — no CLI entry. Consumers (e.g. a future
|
|
5
|
-
* `openclaw plugins install` command) call `runPreflight()` and decide
|
|
6
|
-
* whether to proceed based on the returned result. Nothing here mutates
|
|
7
|
-
* user state: every check is read-only.
|
|
8
|
-
*
|
|
9
|
-
* The check list mirrors `docs/design/phase3-install.md` step 1 minus
|
|
10
|
-
* the bits that require external services (npm registry / SwitchBot API
|
|
11
|
-
* reachability are left for the installer itself to probe when it has
|
|
12
|
-
* a plan to retry, since they are the flakiest of the lot).
|
|
13
|
-
*/
|
|
14
|
-
export type PreflightStatus = 'ok' | 'warn' | 'fail';
|
|
15
|
-
export interface PreflightCheck {
|
|
16
|
-
name: string;
|
|
17
|
-
status: PreflightStatus;
|
|
18
|
-
message: string;
|
|
19
|
-
hint?: string;
|
|
20
|
-
}
|
|
21
|
-
export interface PreflightResult {
|
|
22
|
-
checks: PreflightCheck[];
|
|
23
|
-
/** True when no check is at 'fail'. Warnings are informational. */
|
|
24
|
-
ok: boolean;
|
|
25
|
-
}
|
|
26
|
-
export interface PreflightOptions {
|
|
27
|
-
/**
|
|
28
|
-
* Minimum required major version of Node.js. Defaults to 18 (current
|
|
29
|
-
* package.json "engines.node" floor).
|
|
30
|
-
*/
|
|
31
|
-
minNodeMajor?: number;
|
|
32
|
-
/**
|
|
33
|
-
* Override process.version for deterministic tests.
|
|
34
|
-
*/
|
|
35
|
-
nodeVersion?: string;
|
|
36
|
-
/**
|
|
37
|
-
* Override process.platform for tests.
|
|
38
|
-
*/
|
|
39
|
-
platform?: NodeJS.Platform;
|
|
40
|
-
/**
|
|
41
|
-
* Target agent. When set to `claude-code` the preflight probes that
|
|
42
|
-
* `~/.claude/` (or the skills directory underneath it) is writable, so
|
|
43
|
-
* the later symlink-skill step fails fast with a clear message.
|
|
44
|
-
* Unset (or `none`/`cursor`/`copilot`) skips the check.
|
|
45
|
-
*/
|
|
46
|
-
agent?: 'claude-code' | 'cursor' | 'copilot' | 'none';
|
|
47
|
-
/**
|
|
48
|
-
* Whether this install run will actually attempt to create the Claude
|
|
49
|
-
* skill link. When false, the agent-skills-dir check is skipped even if
|
|
50
|
-
* agent is `claude-code` (e.g. recipe-only installs without --skill-path).
|
|
51
|
-
*
|
|
52
|
-
* Defaults to true for backward compatibility when `agent=claude-code`.
|
|
53
|
-
*/
|
|
54
|
-
expectSkillLink?: boolean;
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Run every pre-flight check and return a combined result. Safe to
|
|
58
|
-
* call multiple times; no state is cached.
|
|
59
|
-
*/
|
|
60
|
-
export declare function runPreflight(options?: PreflightOptions): Promise<PreflightResult>;
|
|
@@ -1,213 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Install-orchestrator pre-flight (Phase 3A · F5).
|
|
3
|
-
*
|
|
4
|
-
* Pure library — no CLI entry. Consumers (e.g. a future
|
|
5
|
-
* `openclaw plugins install` command) call `runPreflight()` and decide
|
|
6
|
-
* whether to proceed based on the returned result. Nothing here mutates
|
|
7
|
-
* user state: every check is read-only.
|
|
8
|
-
*
|
|
9
|
-
* The check list mirrors `docs/design/phase3-install.md` step 1 minus
|
|
10
|
-
* the bits that require external services (npm registry / SwitchBot API
|
|
11
|
-
* reachability are left for the installer itself to probe when it has
|
|
12
|
-
* a plan to retry, since they are the flakiest of the lot).
|
|
13
|
-
*/
|
|
14
|
-
import fs from 'node:fs';
|
|
15
|
-
import path from 'node:path';
|
|
16
|
-
import os from 'node:os';
|
|
17
|
-
import { resolvePolicyPath, loadPolicyFile, PolicyFileNotFoundError } from '../policy/load.js';
|
|
18
|
-
import { validateLoadedPolicy } from '../policy/validate.js';
|
|
19
|
-
import { selectCredentialStore } from '../credentials/keychain.js';
|
|
20
|
-
function parseMajor(version) {
|
|
21
|
-
const m = /^v?(\d+)\./.exec(version);
|
|
22
|
-
if (!m)
|
|
23
|
-
return null;
|
|
24
|
-
const n = Number(m[1]);
|
|
25
|
-
return Number.isFinite(n) ? n : null;
|
|
26
|
-
}
|
|
27
|
-
function checkNodeVersion(opts) {
|
|
28
|
-
const required = opts.minNodeMajor ?? 18;
|
|
29
|
-
const version = opts.nodeVersion ?? process.version;
|
|
30
|
-
const major = parseMajor(version);
|
|
31
|
-
if (major === null) {
|
|
32
|
-
return {
|
|
33
|
-
name: 'node',
|
|
34
|
-
status: 'fail',
|
|
35
|
-
message: `unrecognised Node.js version string: ${version}`,
|
|
36
|
-
hint: 'reinstall Node.js from https://nodejs.org',
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
if (major < required) {
|
|
40
|
-
return {
|
|
41
|
-
name: 'node',
|
|
42
|
-
status: 'fail',
|
|
43
|
-
message: `Node.js ${version} < required v${required}`,
|
|
44
|
-
hint: `upgrade Node.js to v${required} or later`,
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
return { name: 'node', status: 'ok', message: `Node.js ${version}` };
|
|
48
|
-
}
|
|
49
|
-
function checkPolicy() {
|
|
50
|
-
const policyPath = resolvePolicyPath();
|
|
51
|
-
try {
|
|
52
|
-
const loaded = loadPolicyFile(policyPath);
|
|
53
|
-
const result = validateLoadedPolicy(loaded);
|
|
54
|
-
if (result.valid) {
|
|
55
|
-
return {
|
|
56
|
-
name: 'policy',
|
|
57
|
-
status: 'ok',
|
|
58
|
-
message: `policy at ${policyPath} validates (v${result.schemaVersion ?? '?'})`,
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
return {
|
|
62
|
-
name: 'policy',
|
|
63
|
-
status: 'warn',
|
|
64
|
-
message: `policy at ${policyPath} has ${result.errors.length} validation error(s)`,
|
|
65
|
-
hint: 'run "switchbot policy validate" to see details before installing',
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
catch (err) {
|
|
69
|
-
if (err instanceof PolicyFileNotFoundError) {
|
|
70
|
-
return {
|
|
71
|
-
name: 'policy',
|
|
72
|
-
status: 'ok',
|
|
73
|
-
message: `no policy at ${policyPath} (installer will scaffold one)`,
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
return {
|
|
77
|
-
name: 'policy',
|
|
78
|
-
status: 'warn',
|
|
79
|
-
message: `policy at ${policyPath} is unreadable: ${err instanceof Error ? err.message : String(err)}`,
|
|
80
|
-
hint: 'move the file aside, then re-run — the installer will scaffold a fresh copy',
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
async function checkKeychain() {
|
|
85
|
-
try {
|
|
86
|
-
const store = await selectCredentialStore();
|
|
87
|
-
const desc = store.describe();
|
|
88
|
-
if (desc.writable) {
|
|
89
|
-
return {
|
|
90
|
-
name: 'keychain',
|
|
91
|
-
status: 'ok',
|
|
92
|
-
message: `credential backend: ${desc.backend}`,
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
return {
|
|
96
|
-
name: 'keychain',
|
|
97
|
-
status: 'warn',
|
|
98
|
-
message: `credential backend ${desc.backend} is not writable — will fall back to file`,
|
|
99
|
-
hint: desc.notes ?? 'install the OS keychain helper to get native credential storage',
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
catch (err) {
|
|
103
|
-
return {
|
|
104
|
-
name: 'keychain',
|
|
105
|
-
status: 'warn',
|
|
106
|
-
message: `keychain probe failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
107
|
-
hint: 'the installer will fall back to the file backend',
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
function checkHomeDirWritable() {
|
|
112
|
-
const home = os.homedir();
|
|
113
|
-
const switchbotDir = path.join(home, '.switchbot');
|
|
114
|
-
try {
|
|
115
|
-
const homeStat = fs.statSync(home);
|
|
116
|
-
if (!homeStat.isDirectory()) {
|
|
117
|
-
return {
|
|
118
|
-
name: 'home',
|
|
119
|
-
status: 'fail',
|
|
120
|
-
message: `home path is not a directory: ${home}`,
|
|
121
|
-
hint: 'check your HOME/USERPROFILE environment configuration',
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
if (fs.existsSync(switchbotDir)) {
|
|
125
|
-
const sbStat = fs.statSync(switchbotDir);
|
|
126
|
-
if (!sbStat.isDirectory()) {
|
|
127
|
-
return {
|
|
128
|
-
name: 'home',
|
|
129
|
-
status: 'fail',
|
|
130
|
-
message: `${switchbotDir} exists but is not a directory`,
|
|
131
|
-
hint: 'move the file aside and re-run install',
|
|
132
|
-
};
|
|
133
|
-
}
|
|
134
|
-
fs.accessSync(switchbotDir, fs.constants.W_OK);
|
|
135
|
-
return { name: 'home', status: 'ok', message: `writable: ${switchbotDir}` };
|
|
136
|
-
}
|
|
137
|
-
fs.accessSync(home, fs.constants.W_OK);
|
|
138
|
-
return { name: 'home', status: 'ok', message: `writable: ${home}` };
|
|
139
|
-
}
|
|
140
|
-
catch (err) {
|
|
141
|
-
return {
|
|
142
|
-
name: 'home',
|
|
143
|
-
status: 'fail',
|
|
144
|
-
message: `cannot write under ${home}: ${err instanceof Error ? err.message : String(err)}`,
|
|
145
|
-
hint: 'check ownership and permissions on your home directory',
|
|
146
|
-
};
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
function nearestExistingPath(target) {
|
|
150
|
-
let cur = target;
|
|
151
|
-
while (true) {
|
|
152
|
-
if (fs.existsSync(cur))
|
|
153
|
-
return cur;
|
|
154
|
-
const parent = path.dirname(cur);
|
|
155
|
-
if (parent === cur)
|
|
156
|
-
return null;
|
|
157
|
-
cur = parent;
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
function checkAgentSkillDirWritable(opts) {
|
|
161
|
-
const shouldCheck = opts.agent === 'claude-code' && (opts.expectSkillLink ?? true);
|
|
162
|
-
if (!shouldCheck)
|
|
163
|
-
return null;
|
|
164
|
-
const home = os.homedir();
|
|
165
|
-
const target = path.join(home, '.claude', 'skills');
|
|
166
|
-
try {
|
|
167
|
-
const existing = nearestExistingPath(target);
|
|
168
|
-
if (!existing) {
|
|
169
|
-
return {
|
|
170
|
-
name: 'agent-skills-dir',
|
|
171
|
-
status: 'fail',
|
|
172
|
-
message: `cannot resolve an existing parent for ${target}`,
|
|
173
|
-
hint: 'check your home directory path and permissions',
|
|
174
|
-
};
|
|
175
|
-
}
|
|
176
|
-
const stat = fs.statSync(existing);
|
|
177
|
-
if (!stat.isDirectory()) {
|
|
178
|
-
return {
|
|
179
|
-
name: 'agent-skills-dir',
|
|
180
|
-
status: 'fail',
|
|
181
|
-
message: `path component is not a directory: ${existing}`,
|
|
182
|
-
hint: 'move the blocking file aside and re-run install',
|
|
183
|
-
};
|
|
184
|
-
}
|
|
185
|
-
fs.accessSync(existing, fs.constants.W_OK);
|
|
186
|
-
return { name: 'agent-skills-dir', status: 'ok', message: `writable: ${target}` };
|
|
187
|
-
}
|
|
188
|
-
catch (err) {
|
|
189
|
-
return {
|
|
190
|
-
name: 'agent-skills-dir',
|
|
191
|
-
status: 'fail',
|
|
192
|
-
message: `cannot write to ${target}: ${err instanceof Error ? err.message : String(err)}`,
|
|
193
|
-
hint: 'open Claude Code once (it will create ~/.claude) or create the directory manually',
|
|
194
|
-
};
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
/**
|
|
198
|
-
* Run every pre-flight check and return a combined result. Safe to
|
|
199
|
-
* call multiple times; no state is cached.
|
|
200
|
-
*/
|
|
201
|
-
export async function runPreflight(options = {}) {
|
|
202
|
-
const checks = [];
|
|
203
|
-
checks.push(checkNodeVersion(options));
|
|
204
|
-
checks.push(checkPolicy());
|
|
205
|
-
checks.push(await checkKeychain());
|
|
206
|
-
checks.push(checkHomeDirWritable());
|
|
207
|
-
const agentCheck = checkAgentSkillDirWritable(options);
|
|
208
|
-
if (agentCheck)
|
|
209
|
-
checks.push(agentCheck);
|
|
210
|
-
const ok = checks.every((c) => c.status !== 'fail');
|
|
211
|
-
return { checks, ok };
|
|
212
|
-
}
|
|
213
|
-
//# sourceMappingURL=preflight.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../src/install/preflight.ts"],"names":[],"mappings":"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"}
|
package/dist/install/steps.d.ts
DELETED
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Install-orchestrator step runner (Phase 3A · F5).
|
|
3
|
-
*
|
|
4
|
-
* Each step has a deterministic `execute` and a matching `undo`. The
|
|
5
|
-
* runner executes steps in order; on any failure it walks the
|
|
6
|
-
* already-completed steps in reverse and invokes their `undo`. If an
|
|
7
|
-
* `undo` itself fails, the error is captured and surfaced — the
|
|
8
|
-
* runner does NOT abort the rollback. The caller gets a full report
|
|
9
|
-
* and can decide how to surface partial cleanup failures.
|
|
10
|
-
*
|
|
11
|
-
* The module is intentionally agnostic of what steps do; consumers
|
|
12
|
-
* (future `openclaw plugins install`) plug in concrete steps like
|
|
13
|
-
* "npm i -g the CLI" or "write the credential to the keychain".
|
|
14
|
-
*/
|
|
15
|
-
export interface InstallStep<Ctx = unknown> {
|
|
16
|
-
name: string;
|
|
17
|
-
description?: string;
|
|
18
|
-
execute: (ctx: Ctx) => Promise<void> | void;
|
|
19
|
-
undo: (ctx: Ctx) => Promise<void> | void;
|
|
20
|
-
}
|
|
21
|
-
export type StepOutcome = {
|
|
22
|
-
step: string;
|
|
23
|
-
status: 'succeeded';
|
|
24
|
-
} | {
|
|
25
|
-
step: string;
|
|
26
|
-
status: 'failed';
|
|
27
|
-
error: string;
|
|
28
|
-
} | {
|
|
29
|
-
step: string;
|
|
30
|
-
status: 'rolled-back';
|
|
31
|
-
} | {
|
|
32
|
-
step: string;
|
|
33
|
-
status: 'rollback-failed';
|
|
34
|
-
error: string;
|
|
35
|
-
} | {
|
|
36
|
-
step: string;
|
|
37
|
-
status: 'skipped';
|
|
38
|
-
};
|
|
39
|
-
export interface InstallReport {
|
|
40
|
-
ok: boolean;
|
|
41
|
-
/** Outcome entries in execution order (execution first, then rollback). */
|
|
42
|
-
outcomes: StepOutcome[];
|
|
43
|
-
/** Name of the step that caused the rollback, if any. */
|
|
44
|
-
failedAt?: string;
|
|
45
|
-
}
|
|
46
|
-
export interface RunInstallOptions<Ctx> {
|
|
47
|
-
/** Context object passed to every step. Defaults to `{}`. */
|
|
48
|
-
context?: Ctx;
|
|
49
|
-
/**
|
|
50
|
-
* When set, the runner stops immediately after executing this step
|
|
51
|
-
* (even on success). Useful for tests that want to exercise partial
|
|
52
|
-
* state without needing every step to succeed.
|
|
53
|
-
*/
|
|
54
|
-
stopAfter?: string;
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Run the given steps in order. On the first failure, the runner
|
|
58
|
-
* walks already-executed steps in reverse and invokes each step's
|
|
59
|
-
* undo. Returns a report describing every step's fate.
|
|
60
|
-
*/
|
|
61
|
-
export declare function runInstall<Ctx = Record<string, unknown>>(steps: InstallStep<Ctx>[], options?: RunInstallOptions<Ctx>): Promise<InstallReport>;
|
package/dist/install/steps.js
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Install-orchestrator step runner (Phase 3A · F5).
|
|
3
|
-
*
|
|
4
|
-
* Each step has a deterministic `execute` and a matching `undo`. The
|
|
5
|
-
* runner executes steps in order; on any failure it walks the
|
|
6
|
-
* already-completed steps in reverse and invokes their `undo`. If an
|
|
7
|
-
* `undo` itself fails, the error is captured and surfaced — the
|
|
8
|
-
* runner does NOT abort the rollback. The caller gets a full report
|
|
9
|
-
* and can decide how to surface partial cleanup failures.
|
|
10
|
-
*
|
|
11
|
-
* The module is intentionally agnostic of what steps do; consumers
|
|
12
|
-
* (future `openclaw plugins install`) plug in concrete steps like
|
|
13
|
-
* "npm i -g the CLI" or "write the credential to the keychain".
|
|
14
|
-
*/
|
|
15
|
-
/**
|
|
16
|
-
* Run the given steps in order. On the first failure, the runner
|
|
17
|
-
* walks already-executed steps in reverse and invokes each step's
|
|
18
|
-
* undo. Returns a report describing every step's fate.
|
|
19
|
-
*/
|
|
20
|
-
export async function runInstall(steps, options = {}) {
|
|
21
|
-
const ctx = (options.context ?? {});
|
|
22
|
-
const outcomes = [];
|
|
23
|
-
const executed = [];
|
|
24
|
-
let failedAt;
|
|
25
|
-
for (const step of steps) {
|
|
26
|
-
try {
|
|
27
|
-
await step.execute(ctx);
|
|
28
|
-
outcomes.push({ step: step.name, status: 'succeeded' });
|
|
29
|
-
executed.push(step);
|
|
30
|
-
}
|
|
31
|
-
catch (err) {
|
|
32
|
-
outcomes.push({
|
|
33
|
-
step: step.name,
|
|
34
|
-
status: 'failed',
|
|
35
|
-
error: err instanceof Error ? err.message : String(err),
|
|
36
|
-
});
|
|
37
|
-
failedAt = step.name;
|
|
38
|
-
break;
|
|
39
|
-
}
|
|
40
|
-
if (options.stopAfter === step.name)
|
|
41
|
-
break;
|
|
42
|
-
}
|
|
43
|
-
if (failedAt !== undefined) {
|
|
44
|
-
// Roll back completed steps in reverse. Undo failures are captured
|
|
45
|
-
// but do not abort further rollback attempts — the goal is to
|
|
46
|
-
// leave as little residue as possible.
|
|
47
|
-
for (let i = executed.length - 1; i >= 0; i--) {
|
|
48
|
-
const step = executed[i];
|
|
49
|
-
try {
|
|
50
|
-
await step.undo(ctx);
|
|
51
|
-
outcomes.push({ step: step.name, status: 'rolled-back' });
|
|
52
|
-
}
|
|
53
|
-
catch (err) {
|
|
54
|
-
outcomes.push({
|
|
55
|
-
step: step.name,
|
|
56
|
-
status: 'rollback-failed',
|
|
57
|
-
error: err instanceof Error ? err.message : String(err),
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
return {
|
|
63
|
-
ok: failedAt === undefined,
|
|
64
|
-
outcomes,
|
|
65
|
-
...(failedAt !== undefined ? { failedAt } : {}),
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
//# sourceMappingURL=steps.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"steps.js","sourceRoot":"","sources":["../../src/install/steps.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAmCH;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,KAAyB,EACzB,UAAkC,EAAE;IAEpC,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,IAAK,EAAU,CAAQ,CAAC;IACpD,MAAM,QAAQ,GAAkB,EAAE,CAAC;IACnC,MAAM,QAAQ,GAAuB,EAAE,CAAC;IAExC,IAAI,QAA4B,CAAC;IAEjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;YACxD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,MAAM,EAAE,QAAQ;gBAChB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACxD,CAAC,CAAC;YACH,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC;YACrB,MAAM;QACR,CAAC;QACD,IAAI,OAAO,CAAC,SAAS,KAAK,IAAI,CAAC,IAAI;YAAE,MAAM;IAC7C,CAAC;IAED,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,mEAAmE;QACnE,8DAA8D;QAC9D,uCAAuC;QACvC,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9C,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YACzB,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;YAC5D,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,MAAM,EAAE,iBAAiB;oBACzB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBACxD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,EAAE,EAAE,QAAQ,KAAK,SAAS;QAC1B,QAAQ;QACR,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChD,CAAC;AACJ,CAAC"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
export const COMMAND_KEYWORDS = [
|
|
2
|
-
{ pattern: /\boff\b|\bturn.?off\b|\bstop\b/i, command: 'turnOff' },
|
|
3
|
-
{ pattern: /\bon\b|\bturn.?on\b|\bstart\b/i, command: 'turnOn' },
|
|
4
|
-
{ pattern: /\bpress\b|\bclick\b|\btap\b/i, command: 'press' },
|
|
5
|
-
{ pattern: /\block\b/i, command: 'lock' },
|
|
6
|
-
{ pattern: /\bunlock\b/i, command: 'unlock' },
|
|
7
|
-
{ pattern: /\bopen\b|\braise\b|\bup\b/i, command: 'open' },
|
|
8
|
-
{ pattern: /\bclose\b|\blower\b|\bdown\b/i, command: 'close' },
|
|
9
|
-
{ pattern: /\bpause\b/i, command: 'pause' },
|
|
10
|
-
];
|
|
11
|
-
export function inferCommandFromIntent(intent) {
|
|
12
|
-
for (const k of COMMAND_KEYWORDS) {
|
|
13
|
-
if (k.pattern.test(intent))
|
|
14
|
-
return k.command;
|
|
15
|
-
}
|
|
16
|
-
return undefined;
|
|
17
|
-
}
|
|
18
|
-
//# sourceMappingURL=command-keywords.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"command-keywords.js","sourceRoot":"","sources":["../../src/lib/command-keywords.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAgD;IAC3E,EAAE,OAAO,EAAE,iCAAiC,EAAE,OAAO,EAAE,SAAS,EAAE;IAClE,EAAE,OAAO,EAAE,gCAAgC,EAAE,OAAO,EAAE,QAAQ,EAAE;IAChE,EAAE,OAAO,EAAE,8BAA8B,EAAE,OAAO,EAAE,OAAO,EAAE;IAC7D,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE;IACzC,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE;IAC7C,EAAE,OAAO,EAAE,4BAA4B,EAAE,OAAO,EAAE,MAAM,EAAE;IAC1D,EAAE,OAAO,EAAE,+BAA+B,EAAE,OAAO,EAAE,OAAO,EAAE;IAC9D,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE;CAC5C,CAAC;AAEF,MAAM,UAAU,sBAAsB,CAAC,MAAc;IACnD,KAAK,MAAM,CAAC,IAAI,gBAAgB,EAAE,CAAC;QACjC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;YAAE,OAAO,CAAC,CAAC,OAAO,CAAC;IAC/C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
export declare const DAEMON_PID_FILE: string;
|
|
2
|
-
export declare const DAEMON_LOG_FILE: string;
|
|
3
|
-
export declare const DAEMON_STATE_FILE: string;
|
|
4
|
-
export declare const HEALTHZ_PID_FILE: string;
|
|
5
|
-
export interface DaemonState {
|
|
6
|
-
status: 'starting' | 'running' | 'stopped' | 'failed';
|
|
7
|
-
pid: number | null;
|
|
8
|
-
startedAt?: string;
|
|
9
|
-
stoppedAt?: string;
|
|
10
|
-
failedAt?: string;
|
|
11
|
-
failureReason?: string;
|
|
12
|
-
logFile: string;
|
|
13
|
-
pidFile: string;
|
|
14
|
-
stateFile: string;
|
|
15
|
-
healthzPid?: number | null;
|
|
16
|
-
healthzPort?: number | null;
|
|
17
|
-
healthzPidFile?: string;
|
|
18
|
-
lastReloadAt?: string;
|
|
19
|
-
lastReloadStatus?: 'ok' | 'failed';
|
|
20
|
-
lastReloadMessage?: string;
|
|
21
|
-
}
|
|
22
|
-
export declare function writeDaemonState(state: DaemonState): void;
|
|
23
|
-
export declare function readDaemonState(): DaemonState | null;
|
|
24
|
-
export declare function removeDaemonState(): void;
|
package/dist/lib/daemon-state.js
DELETED
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import fs from 'node:fs';
|
|
2
|
-
import os from 'node:os';
|
|
3
|
-
import path from 'node:path';
|
|
4
|
-
function getStateDir() {
|
|
5
|
-
return path.join(os.homedir(), '.switchbot');
|
|
6
|
-
}
|
|
7
|
-
function getDaemonPidFile() {
|
|
8
|
-
return path.join(getStateDir(), 'daemon.pid');
|
|
9
|
-
}
|
|
10
|
-
function getDaemonLogFile() {
|
|
11
|
-
return path.join(getStateDir(), 'daemon.log');
|
|
12
|
-
}
|
|
13
|
-
function getDaemonStateFile() {
|
|
14
|
-
return path.join(getStateDir(), 'daemon.state.json');
|
|
15
|
-
}
|
|
16
|
-
function getHealthzPidFile() {
|
|
17
|
-
return path.join(getStateDir(), 'healthz.pid');
|
|
18
|
-
}
|
|
19
|
-
export const DAEMON_PID_FILE = getDaemonPidFile();
|
|
20
|
-
export const DAEMON_LOG_FILE = getDaemonLogFile();
|
|
21
|
-
export const DAEMON_STATE_FILE = getDaemonStateFile();
|
|
22
|
-
export const HEALTHZ_PID_FILE = getHealthzPidFile();
|
|
23
|
-
function ensureStateDir() {
|
|
24
|
-
fs.mkdirSync(getStateDir(), { recursive: true, mode: 0o700 });
|
|
25
|
-
}
|
|
26
|
-
export function writeDaemonState(state) {
|
|
27
|
-
ensureStateDir();
|
|
28
|
-
fs.writeFileSync(getDaemonStateFile(), JSON.stringify(state, null, 2), { mode: 0o600 });
|
|
29
|
-
}
|
|
30
|
-
export function readDaemonState() {
|
|
31
|
-
try {
|
|
32
|
-
const raw = fs.readFileSync(getDaemonStateFile(), 'utf-8');
|
|
33
|
-
return JSON.parse(raw);
|
|
34
|
-
}
|
|
35
|
-
catch {
|
|
36
|
-
return null;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
export function removeDaemonState() {
|
|
40
|
-
try {
|
|
41
|
-
fs.unlinkSync(getDaemonStateFile());
|
|
42
|
-
}
|
|
43
|
-
catch {
|
|
44
|
-
// best effort
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
//# sourceMappingURL=daemon-state.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"daemon-state.js","sourceRoot":"","sources":["../../src/lib/daemon-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,SAAS,WAAW;IAClB,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,gBAAgB;IACvB,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,YAAY,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,gBAAgB;IACvB,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,YAAY,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,kBAAkB;IACzB,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,mBAAmB,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,iBAAiB;IACxB,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,aAAa,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,gBAAgB,EAAE,CAAC;AAClD,MAAM,CAAC,MAAM,eAAe,GAAG,gBAAgB,EAAE,CAAC;AAClD,MAAM,CAAC,MAAM,iBAAiB,GAAG,kBAAkB,EAAE,CAAC;AACtD,MAAM,CAAC,MAAM,gBAAgB,GAAG,iBAAiB,EAAE,CAAC;AAoBpD,SAAS,cAAc;IACrB,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAkB;IACjD,cAAc,EAAE,CAAC;IACjB,EAAE,CAAC,aAAa,CAAC,kBAAkB,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAC1F,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,kBAAkB,EAAE,EAAE,OAAO,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgB,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,IAAI,CAAC;QACH,EAAE,CAAC,UAAU,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,cAAc;IAChB,CAAC;AACH,CAAC"}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { getActiveProfile } from './request-context.js';
|
|
2
|
-
const DIRECT_DESTRUCTIVE_PROFILES = new Set(['dev', 'development']);
|
|
3
|
-
export function allowsDirectDestructiveExecution(profile = getActiveProfile()) {
|
|
4
|
-
if (process.env.SWITCHBOT_ALLOW_DIRECT_DESTRUCTIVE === '1')
|
|
5
|
-
return true;
|
|
6
|
-
if (!profile)
|
|
7
|
-
return false;
|
|
8
|
-
return DIRECT_DESTRUCTIVE_PROFILES.has(profile.toLowerCase());
|
|
9
|
-
}
|
|
10
|
-
export function destructiveExecutionHint() {
|
|
11
|
-
return "Use 'switchbot plan save <file>' -> 'switchbot plan review <planId>' -> 'switchbot plan approve <planId>' -> 'switchbot plan execute <planId>' instead.";
|
|
12
|
-
}
|
|
13
|
-
//# sourceMappingURL=destructive-mode.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"destructive-mode.js","sourceRoot":"","sources":["../../src/lib/destructive-mode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,MAAM,2BAA2B,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC;AAEpE,MAAM,UAAU,gCAAgC,CAAC,OAAO,GAAG,gBAAgB,EAAE;IAC3E,IAAI,OAAO,CAAC,GAAG,CAAC,kCAAkC,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IACxE,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC3B,OAAO,2BAA2B,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,wBAAwB;IACtC,OAAO,yJAAyJ,CAAC;AACnK,CAAC"}
|