@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.
Files changed (332) hide show
  1. package/README.md +3 -1
  2. package/dist/index.js +57419 -170
  3. package/package.json +9 -5
  4. package/dist/api/client.d.ts +0 -31
  5. package/dist/api/client.js +0 -236
  6. package/dist/api/client.js.map +0 -1
  7. package/dist/auth.d.ts +0 -1
  8. package/dist/auth.js +0 -21
  9. package/dist/auth.js.map +0 -1
  10. package/dist/commands/agent-bootstrap.d.ts +0 -10
  11. package/dist/commands/agent-bootstrap.js +0 -200
  12. package/dist/commands/agent-bootstrap.js.map +0 -1
  13. package/dist/commands/auth.d.ts +0 -18
  14. package/dist/commands/auth.js +0 -355
  15. package/dist/commands/auth.js.map +0 -1
  16. package/dist/commands/batch.d.ts +0 -2
  17. package/dist/commands/batch.js +0 -414
  18. package/dist/commands/batch.js.map +0 -1
  19. package/dist/commands/cache.d.ts +0 -2
  20. package/dist/commands/cache.js +0 -127
  21. package/dist/commands/cache.js.map +0 -1
  22. package/dist/commands/capabilities.d.ts +0 -31
  23. package/dist/commands/capabilities.js +0 -383
  24. package/dist/commands/capabilities.js.map +0 -1
  25. package/dist/commands/catalog.d.ts +0 -2
  26. package/dist/commands/catalog.js +0 -360
  27. package/dist/commands/catalog.js.map +0 -1
  28. package/dist/commands/completion.d.ts +0 -2
  29. package/dist/commands/completion.js +0 -386
  30. package/dist/commands/completion.js.map +0 -1
  31. package/dist/commands/config.d.ts +0 -21
  32. package/dist/commands/config.js +0 -377
  33. package/dist/commands/config.js.map +0 -1
  34. package/dist/commands/daemon.d.ts +0 -2
  35. package/dist/commands/daemon.js +0 -411
  36. package/dist/commands/daemon.js.map +0 -1
  37. package/dist/commands/device-meta.d.ts +0 -2
  38. package/dist/commands/device-meta.js +0 -160
  39. package/dist/commands/device-meta.js.map +0 -1
  40. package/dist/commands/devices.d.ts +0 -2
  41. package/dist/commands/devices.js +0 -949
  42. package/dist/commands/devices.js.map +0 -1
  43. package/dist/commands/doctor.d.ts +0 -3
  44. package/dist/commands/doctor.js +0 -1016
  45. package/dist/commands/doctor.js.map +0 -1
  46. package/dist/commands/events.d.ts +0 -31
  47. package/dist/commands/events.js +0 -564
  48. package/dist/commands/events.js.map +0 -1
  49. package/dist/commands/expand.d.ts +0 -2
  50. package/dist/commands/expand.js +0 -131
  51. package/dist/commands/expand.js.map +0 -1
  52. package/dist/commands/explain.d.ts +0 -2
  53. package/dist/commands/explain.js +0 -140
  54. package/dist/commands/explain.js.map +0 -1
  55. package/dist/commands/health.d.ts +0 -8
  56. package/dist/commands/health.js +0 -114
  57. package/dist/commands/health.js.map +0 -1
  58. package/dist/commands/history.d.ts +0 -2
  59. package/dist/commands/history.js +0 -321
  60. package/dist/commands/history.js.map +0 -1
  61. package/dist/commands/identity.d.ts +0 -45
  62. package/dist/commands/identity.js +0 -60
  63. package/dist/commands/identity.js.map +0 -1
  64. package/dist/commands/install.d.ts +0 -20
  65. package/dist/commands/install.js +0 -247
  66. package/dist/commands/install.js.map +0 -1
  67. package/dist/commands/mcp.d.ts +0 -14
  68. package/dist/commands/mcp.js +0 -2018
  69. package/dist/commands/mcp.js.map +0 -1
  70. package/dist/commands/plan.d.ts +0 -51
  71. package/dist/commands/plan.js +0 -654
  72. package/dist/commands/plan.js.map +0 -1
  73. package/dist/commands/policy.d.ts +0 -24
  74. package/dist/commands/policy.js +0 -587
  75. package/dist/commands/policy.js.map +0 -1
  76. package/dist/commands/quota.d.ts +0 -2
  77. package/dist/commands/quota.js +0 -79
  78. package/dist/commands/quota.js.map +0 -1
  79. package/dist/commands/rules.d.ts +0 -2
  80. package/dist/commands/rules.js +0 -876
  81. package/dist/commands/rules.js.map +0 -1
  82. package/dist/commands/scenes.d.ts +0 -2
  83. package/dist/commands/scenes.js +0 -265
  84. package/dist/commands/scenes.js.map +0 -1
  85. package/dist/commands/schema.d.ts +0 -2
  86. package/dist/commands/schema.js +0 -185
  87. package/dist/commands/schema.js.map +0 -1
  88. package/dist/commands/status-sync.d.ts +0 -2
  89. package/dist/commands/status-sync.js +0 -132
  90. package/dist/commands/status-sync.js.map +0 -1
  91. package/dist/commands/uninstall.d.ts +0 -20
  92. package/dist/commands/uninstall.js +0 -238
  93. package/dist/commands/uninstall.js.map +0 -1
  94. package/dist/commands/upgrade-check.d.ts +0 -2
  95. package/dist/commands/upgrade-check.js +0 -107
  96. package/dist/commands/upgrade-check.js.map +0 -1
  97. package/dist/commands/watch.d.ts +0 -2
  98. package/dist/commands/watch.js +0 -195
  99. package/dist/commands/watch.js.map +0 -1
  100. package/dist/commands/webhook.d.ts +0 -2
  101. package/dist/commands/webhook.js +0 -183
  102. package/dist/commands/webhook.js.map +0 -1
  103. package/dist/config.d.ts +0 -57
  104. package/dist/config.js +0 -259
  105. package/dist/config.js.map +0 -1
  106. package/dist/credentials/backends/file.d.ts +0 -18
  107. package/dist/credentials/backends/file.js +0 -102
  108. package/dist/credentials/backends/file.js.map +0 -1
  109. package/dist/credentials/backends/linux.d.ts +0 -16
  110. package/dist/credentials/backends/linux.js +0 -130
  111. package/dist/credentials/backends/linux.js.map +0 -1
  112. package/dist/credentials/backends/macos.d.ts +0 -18
  113. package/dist/credentials/backends/macos.js +0 -130
  114. package/dist/credentials/backends/macos.js.map +0 -1
  115. package/dist/credentials/backends/windows.d.ts +0 -23
  116. package/dist/credentials/backends/windows.js +0 -216
  117. package/dist/credentials/backends/windows.js.map +0 -1
  118. package/dist/credentials/keychain.d.ts +0 -83
  119. package/dist/credentials/keychain.js +0 -89
  120. package/dist/credentials/keychain.js.map +0 -1
  121. package/dist/credentials/prime.d.ts +0 -32
  122. package/dist/credentials/prime.js +0 -53
  123. package/dist/credentials/prime.js.map +0 -1
  124. package/dist/devices/cache.d.ts +0 -79
  125. package/dist/devices/cache.js +0 -294
  126. package/dist/devices/cache.js.map +0 -1
  127. package/dist/devices/catalog.d.ts +0 -138
  128. package/dist/devices/catalog.js +0 -768
  129. package/dist/devices/catalog.js.map +0 -1
  130. package/dist/devices/device-meta.d.ts +0 -15
  131. package/dist/devices/device-meta.js +0 -57
  132. package/dist/devices/device-meta.js.map +0 -1
  133. package/dist/devices/history-agg.d.ts +0 -37
  134. package/dist/devices/history-agg.js +0 -139
  135. package/dist/devices/history-agg.js.map +0 -1
  136. package/dist/devices/history-query.d.ts +0 -45
  137. package/dist/devices/history-query.js +0 -182
  138. package/dist/devices/history-query.js.map +0 -1
  139. package/dist/devices/param-validator.d.ts +0 -40
  140. package/dist/devices/param-validator.js +0 -434
  141. package/dist/devices/param-validator.js.map +0 -1
  142. package/dist/devices/resources.d.ts +0 -74
  143. package/dist/devices/resources.js +0 -271
  144. package/dist/devices/resources.js.map +0 -1
  145. package/dist/index.d.ts +0 -1
  146. package/dist/index.js.map +0 -1
  147. package/dist/install/default-steps.d.ts +0 -66
  148. package/dist/install/default-steps.js +0 -258
  149. package/dist/install/default-steps.js.map +0 -1
  150. package/dist/install/preflight.d.ts +0 -60
  151. package/dist/install/preflight.js +0 -213
  152. package/dist/install/preflight.js.map +0 -1
  153. package/dist/install/steps.d.ts +0 -61
  154. package/dist/install/steps.js +0 -68
  155. package/dist/install/steps.js.map +0 -1
  156. package/dist/lib/command-keywords.d.ts +0 -5
  157. package/dist/lib/command-keywords.js +0 -18
  158. package/dist/lib/command-keywords.js.map +0 -1
  159. package/dist/lib/daemon-state.d.ts +0 -24
  160. package/dist/lib/daemon-state.js +0 -47
  161. package/dist/lib/daemon-state.js.map +0 -1
  162. package/dist/lib/destructive-mode.d.ts +0 -2
  163. package/dist/lib/destructive-mode.js +0 -13
  164. package/dist/lib/destructive-mode.js.map +0 -1
  165. package/dist/lib/devices.d.ts +0 -151
  166. package/dist/lib/devices.js +0 -383
  167. package/dist/lib/devices.js.map +0 -1
  168. package/dist/lib/idempotency.d.ts +0 -46
  169. package/dist/lib/idempotency.js +0 -107
  170. package/dist/lib/idempotency.js.map +0 -1
  171. package/dist/lib/plan-store.d.ts +0 -19
  172. package/dist/lib/plan-store.js +0 -69
  173. package/dist/lib/plan-store.js.map +0 -1
  174. package/dist/lib/request-context.d.ts +0 -7
  175. package/dist/lib/request-context.js +0 -13
  176. package/dist/lib/request-context.js.map +0 -1
  177. package/dist/lib/scenes.d.ts +0 -7
  178. package/dist/lib/scenes.js +0 -11
  179. package/dist/lib/scenes.js.map +0 -1
  180. package/dist/logger.d.ts +0 -4
  181. package/dist/logger.js +0 -17
  182. package/dist/logger.js.map +0 -1
  183. package/dist/mcp/device-history.d.ts +0 -36
  184. package/dist/mcp/device-history.js +0 -146
  185. package/dist/mcp/device-history.js.map +0 -1
  186. package/dist/mcp/events-subscription.d.ts +0 -45
  187. package/dist/mcp/events-subscription.js +0 -214
  188. package/dist/mcp/events-subscription.js.map +0 -1
  189. package/dist/mqtt/client.d.ts +0 -25
  190. package/dist/mqtt/client.js +0 -181
  191. package/dist/mqtt/client.js.map +0 -1
  192. package/dist/mqtt/credential.d.ts +0 -16
  193. package/dist/mqtt/credential.js +0 -31
  194. package/dist/mqtt/credential.js.map +0 -1
  195. package/dist/policy/add-rule.d.ts +0 -21
  196. package/dist/policy/add-rule.js +0 -125
  197. package/dist/policy/add-rule.js.map +0 -1
  198. package/dist/policy/diff.d.ts +0 -21
  199. package/dist/policy/diff.js +0 -92
  200. package/dist/policy/diff.js.map +0 -1
  201. package/dist/policy/format.d.ts +0 -6
  202. package/dist/policy/format.js +0 -58
  203. package/dist/policy/format.js.map +0 -1
  204. package/dist/policy/load.d.ts +0 -32
  205. package/dist/policy/load.js +0 -62
  206. package/dist/policy/load.js.map +0 -1
  207. package/dist/policy/migrate.d.ts +0 -21
  208. package/dist/policy/migrate.js +0 -68
  209. package/dist/policy/migrate.js.map +0 -1
  210. package/dist/policy/schema.d.ts +0 -5
  211. package/dist/policy/schema.js +0 -19
  212. package/dist/policy/schema.js.map +0 -1
  213. package/dist/policy/validate.d.ts +0 -19
  214. package/dist/policy/validate.js +0 -263
  215. package/dist/policy/validate.js.map +0 -1
  216. package/dist/rules/action.d.ts +0 -65
  217. package/dist/rules/action.js +0 -217
  218. package/dist/rules/action.js.map +0 -1
  219. package/dist/rules/audit-query.d.ts +0 -51
  220. package/dist/rules/audit-query.js +0 -90
  221. package/dist/rules/audit-query.js.map +0 -1
  222. package/dist/rules/conflict-analyzer.d.ts +0 -57
  223. package/dist/rules/conflict-analyzer.js +0 -215
  224. package/dist/rules/conflict-analyzer.js.map +0 -1
  225. package/dist/rules/cron-scheduler.d.ts +0 -62
  226. package/dist/rules/cron-scheduler.js +0 -187
  227. package/dist/rules/cron-scheduler.js.map +0 -1
  228. package/dist/rules/destructive.d.ts +0 -20
  229. package/dist/rules/destructive.js +0 -53
  230. package/dist/rules/destructive.js.map +0 -1
  231. package/dist/rules/engine.d.ts +0 -193
  232. package/dist/rules/engine.js +0 -758
  233. package/dist/rules/engine.js.map +0 -1
  234. package/dist/rules/matcher.d.ts +0 -56
  235. package/dist/rules/matcher.js +0 -231
  236. package/dist/rules/matcher.js.map +0 -1
  237. package/dist/rules/pid-file.d.ts +0 -43
  238. package/dist/rules/pid-file.js +0 -96
  239. package/dist/rules/pid-file.js.map +0 -1
  240. package/dist/rules/quiet-hours.d.ts +0 -26
  241. package/dist/rules/quiet-hours.js +0 -46
  242. package/dist/rules/quiet-hours.js.map +0 -1
  243. package/dist/rules/suggest.d.ts +0 -20
  244. package/dist/rules/suggest.js +0 -96
  245. package/dist/rules/suggest.js.map +0 -1
  246. package/dist/rules/throttle.d.ts +0 -61
  247. package/dist/rules/throttle.js +0 -117
  248. package/dist/rules/throttle.js.map +0 -1
  249. package/dist/rules/types.d.ts +0 -117
  250. package/dist/rules/types.js +0 -35
  251. package/dist/rules/types.js.map +0 -1
  252. package/dist/rules/webhook-listener.d.ts +0 -63
  253. package/dist/rules/webhook-listener.js +0 -224
  254. package/dist/rules/webhook-listener.js.map +0 -1
  255. package/dist/rules/webhook-token.d.ts +0 -50
  256. package/dist/rules/webhook-token.js +0 -91
  257. package/dist/rules/webhook-token.js.map +0 -1
  258. package/dist/schema/field-aliases.d.ts +0 -34
  259. package/dist/schema/field-aliases.js +0 -132
  260. package/dist/schema/field-aliases.js.map +0 -1
  261. package/dist/sinks/dispatcher.d.ts +0 -7
  262. package/dist/sinks/dispatcher.js +0 -13
  263. package/dist/sinks/dispatcher.js.map +0 -1
  264. package/dist/sinks/file.d.ts +0 -6
  265. package/dist/sinks/file.js +0 -20
  266. package/dist/sinks/file.js.map +0 -1
  267. package/dist/sinks/format.d.ts +0 -20
  268. package/dist/sinks/format.js +0 -57
  269. package/dist/sinks/format.js.map +0 -1
  270. package/dist/sinks/homeassistant.d.ts +0 -18
  271. package/dist/sinks/homeassistant.js +0 -45
  272. package/dist/sinks/homeassistant.js.map +0 -1
  273. package/dist/sinks/openclaw.d.ts +0 -13
  274. package/dist/sinks/openclaw.js +0 -34
  275. package/dist/sinks/openclaw.js.map +0 -1
  276. package/dist/sinks/stdout.d.ts +0 -4
  277. package/dist/sinks/stdout.js +0 -6
  278. package/dist/sinks/stdout.js.map +0 -1
  279. package/dist/sinks/telegram.d.ts +0 -11
  280. package/dist/sinks/telegram.js +0 -29
  281. package/dist/sinks/telegram.js.map +0 -1
  282. package/dist/sinks/types.d.ts +0 -13
  283. package/dist/sinks/types.js +0 -2
  284. package/dist/sinks/types.js.map +0 -1
  285. package/dist/sinks/webhook.d.ts +0 -6
  286. package/dist/sinks/webhook.js +0 -23
  287. package/dist/sinks/webhook.js.map +0 -1
  288. package/dist/status-sync/manager.d.ts +0 -48
  289. package/dist/status-sync/manager.js +0 -269
  290. package/dist/status-sync/manager.js.map +0 -1
  291. package/dist/utils/arg-parsers.d.ts +0 -16
  292. package/dist/utils/arg-parsers.js +0 -67
  293. package/dist/utils/arg-parsers.js.map +0 -1
  294. package/dist/utils/audit.d.ts +0 -69
  295. package/dist/utils/audit.js +0 -122
  296. package/dist/utils/audit.js.map +0 -1
  297. package/dist/utils/filter.d.ts +0 -81
  298. package/dist/utils/filter.js +0 -190
  299. package/dist/utils/filter.js.map +0 -1
  300. package/dist/utils/flags.d.ts +0 -72
  301. package/dist/utils/flags.js +0 -187
  302. package/dist/utils/flags.js.map +0 -1
  303. package/dist/utils/format.d.ts +0 -9
  304. package/dist/utils/format.js +0 -118
  305. package/dist/utils/format.js.map +0 -1
  306. package/dist/utils/health.d.ts +0 -48
  307. package/dist/utils/health.js +0 -102
  308. package/dist/utils/health.js.map +0 -1
  309. package/dist/utils/help-json.d.ts +0 -39
  310. package/dist/utils/help-json.js +0 -55
  311. package/dist/utils/help-json.js.map +0 -1
  312. package/dist/utils/name-resolver.d.ts +0 -26
  313. package/dist/utils/name-resolver.js +0 -138
  314. package/dist/utils/name-resolver.js.map +0 -1
  315. package/dist/utils/output.d.ts +0 -73
  316. package/dist/utils/output.js +0 -405
  317. package/dist/utils/output.js.map +0 -1
  318. package/dist/utils/quota.d.ts +0 -61
  319. package/dist/utils/quota.js +0 -228
  320. package/dist/utils/quota.js.map +0 -1
  321. package/dist/utils/redact.d.ts +0 -23
  322. package/dist/utils/redact.js +0 -69
  323. package/dist/utils/redact.js.map +0 -1
  324. package/dist/utils/retry.d.ts +0 -72
  325. package/dist/utils/retry.js +0 -141
  326. package/dist/utils/retry.js.map +0 -1
  327. package/dist/utils/string.d.ts +0 -2
  328. package/dist/utils/string.js +0 -23
  329. package/dist/utils/string.js.map +0 -1
  330. package/dist/version.d.ts +0 -2
  331. package/dist/version.js +0 -5
  332. package/dist/version.js.map +0 -1
@@ -1,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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"}
@@ -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>;
@@ -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,5 +0,0 @@
1
- export declare const COMMAND_KEYWORDS: Array<{
2
- pattern: RegExp;
3
- command: string;
4
- }>;
5
- export declare function inferCommandFromIntent(intent: string): string | undefined;
@@ -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;
@@ -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,2 +0,0 @@
1
- export declare function allowsDirectDestructiveExecution(profile?: string | undefined): boolean;
2
- export declare function destructiveExecutionHint(): string;
@@ -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"}