alexa-mcp 0.1.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/dist/cli.js ADDED
@@ -0,0 +1,434 @@
1
+ #!/usr/bin/env node
2
+ import { readFileSync } from "node:fs";
3
+ import { dirname, join } from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { Command } from "commander";
6
+ import { AlexaClient } from "./client.js";
7
+ import { loadConfig, saveConfig, deleteConfig, getConfigPath, } from "./config-store.js";
8
+ import { runBrowserAuth } from "./auth-flow.js";
9
+ const program = new Command();
10
+ const __dirname = dirname(fileURLToPath(import.meta.url));
11
+ const pkg = JSON.parse(readFileSync(join(__dirname, "..", "package.json"), "utf-8"));
12
+ function getAuthConfig() {
13
+ const cfg = loadConfig();
14
+ if (!cfg?.refreshToken)
15
+ return null;
16
+ return {
17
+ refreshToken: cfg.refreshToken,
18
+ domain: cfg.domain,
19
+ };
20
+ }
21
+ program
22
+ .name("alexa-mcp")
23
+ .description("Alexa device and smart home control CLI")
24
+ .version(pkg.version ?? "0.1.0");
25
+ const authCmd = program
26
+ .command("auth")
27
+ .description("Authenticate with Amazon Alexa (opens browser or tunnel URL)");
28
+ authCmd
29
+ .option("-t, --token <token>", "Use this refresh token (headless)")
30
+ .option("-f, --token-file <path>", "Read token from file")
31
+ .option("-d, --domain <domain>", "Amazon domain (amazon.com, amazon.co.uk, amazon.de)", "amazon.co.uk")
32
+ .option("--no-save", "Validate token only; don't save to config")
33
+ .action(async (opts) => {
34
+ let token = opts.token;
35
+ if (opts.tokenFile) {
36
+ const fs = await import("node:fs");
37
+ token = fs.readFileSync(opts.tokenFile, "utf-8").trim();
38
+ }
39
+ const domain = (opts.domain || "amazon.co.uk");
40
+ if (token) {
41
+ const client = new AlexaClient({ refreshToken: token, domain });
42
+ const devices = await client.getDevices();
43
+ console.error(`Valid. Found ${devices.length} devices.`);
44
+ if (opts.save) {
45
+ saveConfig({ refreshToken: token, domain });
46
+ console.error(`Saved to ${getConfigPath()}`);
47
+ }
48
+ return;
49
+ }
50
+ const result = await runBrowserAuth(domain);
51
+ const client = new AlexaClient({
52
+ refreshToken: result.refreshToken,
53
+ domain: result.domain,
54
+ });
55
+ const devices = await client.getDevices();
56
+ if (opts.save) {
57
+ saveConfig({
58
+ refreshToken: result.refreshToken,
59
+ domain: result.domain,
60
+ });
61
+ console.error(`Saved to ${getConfigPath()}`);
62
+ }
63
+ console.error(`Authenticated. Found ${devices.length} devices.`);
64
+ });
65
+ authCmd
66
+ .command("status")
67
+ .description("Show authentication status")
68
+ .option("-v, --verify", "Verify token by calling API")
69
+ .action(async (opts) => {
70
+ const cfg = loadConfig();
71
+ if (!cfg) {
72
+ console.log("Not configured. Run 'alexa-mcp auth' to authenticate.");
73
+ return;
74
+ }
75
+ const masked = cfg.refreshToken.length > 8 ? cfg.refreshToken.slice(0, 8) + "..." : cfg.refreshToken;
76
+ console.log(`Domain: ${cfg.domain}`);
77
+ console.log(`Token: ${masked}`);
78
+ if (opts.verify) {
79
+ try {
80
+ const client = new AlexaClient({ refreshToken: cfg.refreshToken, domain: cfg.domain });
81
+ const devices = await client.getDevices();
82
+ console.log(`Status: valid (${devices.length} devices)`);
83
+ const ownerIds = [...new Set(devices.map((d) => d.deviceOwnerCustomerId).filter(Boolean))];
84
+ if (ownerIds.length > 0) {
85
+ console.log(`Account (deviceOwnerCustomerId): ${ownerIds.join(", ")}`);
86
+ console.log("Use this same account for smart home control. Compare with device/appliance owner IDs.");
87
+ }
88
+ }
89
+ catch (e) {
90
+ console.log(`Status: invalid (${e})`);
91
+ process.exit(1);
92
+ }
93
+ }
94
+ console.log(`Config: ${getConfigPath()}`);
95
+ });
96
+ authCmd
97
+ .command("logout")
98
+ .description("Remove stored credentials")
99
+ .action(() => {
100
+ if (deleteConfig()) {
101
+ console.log("Credentials removed.");
102
+ }
103
+ else {
104
+ console.log("No credentials found.");
105
+ }
106
+ });
107
+ program
108
+ .command("devices")
109
+ .description("List Echo devices")
110
+ .option("-o, --owners", "Show only device names and owner customer IDs (for profile matching)")
111
+ .action(async (opts) => {
112
+ const cfg = getAuthConfig();
113
+ if (!cfg) {
114
+ console.error("No refresh token. Set ALEXA_REFRESH_TOKEN or run 'alexa-mcp auth'.");
115
+ process.exit(1);
116
+ }
117
+ const client = new AlexaClient({ refreshToken: cfg.refreshToken, domain: cfg.domain });
118
+ const devices = await client.getDevices();
119
+ if (opts.owners) {
120
+ for (const d of devices) {
121
+ console.log(`${d.accountName}\t${d.deviceOwnerCustomerId}`);
122
+ }
123
+ console.log("\nMatch deviceOwnerCustomerId with the account you use for 'alexa-mcp auth'.");
124
+ return;
125
+ }
126
+ console.log(JSON.stringify(devices, null, 2));
127
+ });
128
+ program
129
+ .command("speak <text>")
130
+ .description("Speak text on a device")
131
+ .option("-d, --device <name>", "Device name or serial (required)", "")
132
+ .action(async (text, opts) => {
133
+ if (!opts.device) {
134
+ console.error("--device is required");
135
+ process.exit(1);
136
+ }
137
+ const cfg = getAuthConfig();
138
+ if (!cfg) {
139
+ console.error("No refresh token.");
140
+ process.exit(1);
141
+ }
142
+ const client = new AlexaClient({ refreshToken: cfg.refreshToken, domain: cfg.domain });
143
+ const d = await client.resolveDevice(opts.device);
144
+ if (!d) {
145
+ console.error(`Device not found: ${opts.device}`);
146
+ process.exit(1);
147
+ }
148
+ await client.speak(d.serialNumber, d.deviceType, d.deviceOwnerCustomerId, text);
149
+ console.log(`Spoke on ${d.accountName}`);
150
+ });
151
+ program
152
+ .command("announce <text>")
153
+ .description("Announce to all devices")
154
+ .action(async (text) => {
155
+ const cfg = getAuthConfig();
156
+ if (!cfg) {
157
+ console.error("No refresh token.");
158
+ process.exit(1);
159
+ }
160
+ const client = new AlexaClient({ refreshToken: cfg.refreshToken, domain: cfg.domain });
161
+ const devices = await client.getDevices();
162
+ if (devices.length === 0) {
163
+ console.error("No devices found");
164
+ process.exit(1);
165
+ }
166
+ await client.announce(devices[0].deviceOwnerCustomerId, text);
167
+ console.log("Announcement sent");
168
+ });
169
+ program
170
+ .command("command <text>")
171
+ .description("Send voice command to a device")
172
+ .option("-d, --device <name>", "Device name or serial (required)", "")
173
+ .action(async (text, opts) => {
174
+ if (!opts.device) {
175
+ console.error("--device is required");
176
+ process.exit(1);
177
+ }
178
+ const cfg = getAuthConfig();
179
+ if (!cfg) {
180
+ console.error("No refresh token.");
181
+ process.exit(1);
182
+ }
183
+ const client = new AlexaClient({ refreshToken: cfg.refreshToken, domain: cfg.domain });
184
+ const d = await client.resolveDevice(opts.device);
185
+ if (!d) {
186
+ console.error(`Device not found: ${opts.device}`);
187
+ process.exit(1);
188
+ }
189
+ await client.command(d.serialNumber, d.deviceType, d.deviceOwnerCustomerId, text);
190
+ console.log(`Command sent to ${d.accountName}`);
191
+ });
192
+ program
193
+ .command("switch-group <group> <state>")
194
+ .description("Turn on/off all lights in a room group (e.g. Kitchen, Living room). Uses group membership from Alexa app.")
195
+ .option("--all", "Control all appliances in group, not just lights", false)
196
+ .action(async (group, state, opts) => {
197
+ const s = state.toLowerCase();
198
+ if (s !== "on" && s !== "off") {
199
+ console.error("State must be 'on' or 'off'");
200
+ process.exit(1);
201
+ }
202
+ const cfg = getAuthConfig();
203
+ if (!cfg) {
204
+ console.error("No refresh token.");
205
+ process.exit(1);
206
+ }
207
+ const client = new AlexaClient({ refreshToken: cfg.refreshToken, domain: cfg.domain });
208
+ const action = s === "on" ? "turnOn" : "turnOff";
209
+ try {
210
+ const { controlled, errors } = await client.controlAppliancesByGroup(group, action, {
211
+ lightsOnly: !opts.all,
212
+ });
213
+ if (controlled.length > 0) {
214
+ console.log(`${action}: ${controlled.join(", ")}`);
215
+ }
216
+ if (errors.length > 0) {
217
+ console.error(errors.join("\n"));
218
+ }
219
+ if (controlled.length === 0 && errors.length === 0) {
220
+ console.error(`No lights in group "${group}". Try 'alexa-mcp groups' to see groups.`);
221
+ process.exit(1);
222
+ }
223
+ }
224
+ catch (e) {
225
+ console.error(String(e));
226
+ process.exit(1);
227
+ }
228
+ });
229
+ program
230
+ .command("switch-room <pattern> <state>")
231
+ .description("Turn on/off all smart home devices matching a pattern (e.g. 'kitchen lights', 'living room'). Uses direct control—avoids profile issues.")
232
+ .action(async (pattern, state) => {
233
+ const s = state.toLowerCase();
234
+ if (s !== "on" && s !== "off") {
235
+ console.error("State must be 'on' or 'off'");
236
+ process.exit(1);
237
+ }
238
+ const cfg = getAuthConfig();
239
+ if (!cfg) {
240
+ console.error("No refresh token.");
241
+ process.exit(1);
242
+ }
243
+ const client = new AlexaClient({ refreshToken: cfg.refreshToken, domain: cfg.domain });
244
+ const action = s === "on" ? "turnOn" : "turnOff";
245
+ const { controlled, errors } = await client.controlAppliancesByPattern(pattern, action);
246
+ if (controlled.length > 0) {
247
+ console.log(`${action}: ${controlled.join(", ")}`);
248
+ }
249
+ if (errors.length > 0) {
250
+ console.error(errors.join("\n"));
251
+ }
252
+ if (controlled.length === 0 && errors.length === 0) {
253
+ console.error(`No devices matched "${pattern}". Try 'alexa-mcp appliances' to see names.`);
254
+ process.exit(1);
255
+ }
256
+ });
257
+ program
258
+ .command("switch <name> <state>")
259
+ .description("Turn single smart home device on/off by name. For room/pattern (e.g. 'kitchen lights'), use switch-room instead.")
260
+ .option("-d, --device <echo>", "Echo for voice fallback when direct control fails", "")
261
+ .action(async (name, state, opts) => {
262
+ const s = state.toLowerCase();
263
+ if (s !== "on" && s !== "off") {
264
+ console.error("State must be 'on' or 'off'");
265
+ process.exit(1);
266
+ }
267
+ const cfg = getAuthConfig();
268
+ if (!cfg) {
269
+ console.error("No refresh token.");
270
+ process.exit(1);
271
+ }
272
+ const client = new AlexaClient({ refreshToken: cfg.refreshToken, domain: cfg.domain });
273
+ const action = s === "on" ? "turnOn" : "turnOff";
274
+ const app = await client.resolveApplianceByName(name);
275
+ if (app?.endpointId) {
276
+ await client.controlAppliance(app.endpointId, action);
277
+ console.log(`Done: ${action} ${app.friendlyName} (direct control)`);
278
+ return;
279
+ }
280
+ if (!opts.device) {
281
+ console.error(`Could not resolve "${name}". Try 'alexa-mcp appliances' to see names. Use -d <Echo> for voice fallback.`);
282
+ process.exit(1);
283
+ }
284
+ const d = await client.resolveDevice(opts.device);
285
+ if (!d) {
286
+ console.error(`Device not found: ${opts.device}`);
287
+ process.exit(1);
288
+ }
289
+ const text = s === "on" ? `turn on ${name}` : `turn off ${name}`;
290
+ await client.command(d.serialNumber, d.deviceType, d.deviceOwnerCustomerId, text);
291
+ console.log(`Sent "${text}" via ${d.accountName} (voice fallback)`);
292
+ });
293
+ program
294
+ .command("groups")
295
+ .description("List room/space groups (Kitchen, Living room, etc.)")
296
+ .action(async () => {
297
+ const cfg = getAuthConfig();
298
+ if (!cfg) {
299
+ console.error("No refresh token.");
300
+ process.exit(1);
301
+ }
302
+ const client = new AlexaClient({ refreshToken: cfg.refreshToken, domain: cfg.domain });
303
+ const groups = await client.listDeviceGroups();
304
+ console.log(JSON.stringify(groups, null, 2));
305
+ });
306
+ program
307
+ .command("appliances")
308
+ .description("List smart home devices")
309
+ .action(async () => {
310
+ const cfg = getAuthConfig();
311
+ if (!cfg) {
312
+ console.error("No refresh token.");
313
+ process.exit(1);
314
+ }
315
+ const client = new AlexaClient({ refreshToken: cfg.refreshToken, domain: cfg.domain });
316
+ const appliances = await client.listAppliances();
317
+ console.log(JSON.stringify(appliances, null, 2));
318
+ });
319
+ program
320
+ .command("control <entityId> <action>")
321
+ .description("Control smart home device (turnOn, turnOff, setBrightness)")
322
+ .option("-b, --brightness <0-100>", "Brightness for setBrightness", (v) => parseInt(v, 10))
323
+ .action(async (entityId, action, opts) => {
324
+ const cfg = getAuthConfig();
325
+ if (!cfg) {
326
+ console.error("No refresh token.");
327
+ process.exit(1);
328
+ }
329
+ const validActions = ["turnOn", "turnOff", "setBrightness"];
330
+ if (!validActions.includes(action)) {
331
+ console.error(`Action must be one of: ${validActions.join(", ")}`);
332
+ process.exit(1);
333
+ }
334
+ if (action === "setBrightness" && opts.brightness === undefined) {
335
+ console.error("--brightness required for setBrightness");
336
+ process.exit(1);
337
+ }
338
+ const client = new AlexaClient({ refreshToken: cfg.refreshToken, domain: cfg.domain });
339
+ await client.controlAppliance(entityId, action, opts.brightness);
340
+ console.log(`Done: ${action} ${entityId}`);
341
+ });
342
+ program
343
+ .command("routines")
344
+ .description("List routines")
345
+ .action(async () => {
346
+ const cfg = getAuthConfig();
347
+ if (!cfg) {
348
+ console.error("No refresh token.");
349
+ process.exit(1);
350
+ }
351
+ const client = new AlexaClient({ refreshToken: cfg.refreshToken, domain: cfg.domain });
352
+ const routines = await client.listRoutines();
353
+ console.log(JSON.stringify(routines, null, 2));
354
+ });
355
+ program
356
+ .command("run <automationId>")
357
+ .description("Run a routine by automation ID")
358
+ .action(async (automationId) => {
359
+ const cfg = getAuthConfig();
360
+ if (!cfg) {
361
+ console.error("No refresh token.");
362
+ process.exit(1);
363
+ }
364
+ const client = new AlexaClient({ refreshToken: cfg.refreshToken, domain: cfg.domain });
365
+ const routines = await client.listRoutines();
366
+ const r = routines.find((x) => x.automationId === automationId);
367
+ if (!r) {
368
+ console.error(`Routine not found: ${automationId}`);
369
+ process.exit(1);
370
+ }
371
+ const sequenceJson = r.sequence != null ? JSON.stringify(r.sequence) : undefined;
372
+ await client.runRoutine(r.automationId, sequenceJson);
373
+ console.log(`Ran routine: ${r.name}`);
374
+ });
375
+ program
376
+ .command("now-playing")
377
+ .description("Show now-playing state for a device (EU/UK)")
378
+ .option("-d, --device <name>", "Device name or serial (required)", "")
379
+ .action(async (opts) => {
380
+ if (!opts.device) {
381
+ console.error("--device is required");
382
+ process.exit(1);
383
+ }
384
+ const cfg = getAuthConfig();
385
+ if (!cfg) {
386
+ console.error("No refresh token.");
387
+ process.exit(1);
388
+ }
389
+ const client = new AlexaClient({ refreshToken: cfg.refreshToken, domain: cfg.domain });
390
+ const d = await client.resolveDevice(opts.device);
391
+ if (!d) {
392
+ console.error(`Device not found: ${opts.device}`);
393
+ process.exit(1);
394
+ }
395
+ const state = await client.getNowPlaying(d.serialNumber, d.deviceType);
396
+ console.log(JSON.stringify({ device: d.accountName, ...state }, null, 2));
397
+ });
398
+ const mediaCmd = program
399
+ .command("media <command>")
400
+ .description("Transport control: play, pause, resume, stop, next, previous (EU/UK)")
401
+ .option("-d, --device <name>", "Device name or serial (required)", "");
402
+ const mediaCommands = ["play", "pause", "resume", "stop", "next", "previous"];
403
+ mediaCmd.action(async (command, opts) => {
404
+ if (!opts.device) {
405
+ console.error("--device is required");
406
+ process.exit(1);
407
+ }
408
+ const c = command.toLowerCase();
409
+ if (!mediaCommands.includes(c)) {
410
+ console.error(`Command must be one of: ${mediaCommands.join(", ")}`);
411
+ process.exit(1);
412
+ }
413
+ const cfg = getAuthConfig();
414
+ if (!cfg) {
415
+ console.error("No refresh token.");
416
+ process.exit(1);
417
+ }
418
+ const client = new AlexaClient({ refreshToken: cfg.refreshToken, domain: cfg.domain });
419
+ const d = await client.resolveDevice(opts.device);
420
+ if (!d) {
421
+ console.error(`Device not found: ${opts.device}`);
422
+ process.exit(1);
423
+ }
424
+ const state = await client.getNowPlaying(d.serialNumber, d.deviceType);
425
+ const taskSessionId = state?.taskSessionId;
426
+ if (!taskSessionId) {
427
+ console.error(`No active playback on ${d.accountName}. Start something first (e.g. "Alexa, play jazz").`);
428
+ process.exit(1);
429
+ }
430
+ await client.controlMediaSession(d, taskSessionId, c);
431
+ console.log(`${command} sent to ${d.accountName}`);
432
+ });
433
+ program.parse();
434
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,156 @@
1
+ import { type Domain } from "./config.js";
2
+ export interface Device {
3
+ accountName: string;
4
+ serialNumber: string;
5
+ deviceType: string;
6
+ deviceFamily: string;
7
+ deviceOwnerCustomerId: string;
8
+ online: boolean;
9
+ capabilities?: string[];
10
+ }
11
+ export interface Appliance {
12
+ entityId: string;
13
+ /** GraphQL endpoint ID (amzn1.alexa.endpoint.*) when available from layout; used for eu-api control */
14
+ endpointId?: string;
15
+ applianceId: string;
16
+ friendlyName: string;
17
+ friendlyDescription?: string;
18
+ applianceTypes: string[];
19
+ isReachable: boolean;
20
+ /** Amazon customer ID of the account that owns this device (for profile matching) */
21
+ deviceOwnerCustomerId?: string;
22
+ }
23
+ export interface Routine {
24
+ automationId: string;
25
+ name: string;
26
+ sequence: unknown;
27
+ status?: string;
28
+ type?: string;
29
+ }
30
+ export interface DeviceGroup {
31
+ name: string;
32
+ groupId: string;
33
+ type: string;
34
+ applianceCount: number;
35
+ }
36
+ export interface DeviceGroupWithAppliances extends DeviceGroup {
37
+ /** Chr entity IDs (UUIDs) for direct control; use as amzn1.alexa.endpoint.{id} for GraphQL. */
38
+ chrEntityIds: string[];
39
+ }
40
+ export interface AudioGroup {
41
+ id: string;
42
+ name: string;
43
+ members: Array<{
44
+ deviceType: string;
45
+ dsn: string;
46
+ speakerChannel: string;
47
+ }>;
48
+ }
49
+ export interface ClientOptions {
50
+ refreshToken: string;
51
+ domain?: Domain;
52
+ }
53
+ export declare class AlexaClient {
54
+ private creds;
55
+ private readonly refreshToken;
56
+ private readonly domain;
57
+ constructor(options: ClientOptions);
58
+ private ensureAuth;
59
+ /** Low-level app API request (eu-api / na-api). */
60
+ private request;
61
+ /** GET from app API. Returns {} on failure (non-throwing). */
62
+ private getFromAppApi;
63
+ /** GET app endpoint. Throws on failure. */
64
+ private getApp;
65
+ /** POST app endpoint. Throws on failure. */
66
+ private postApp;
67
+ /** PUT app endpoint. Throws on failure. */
68
+ private putApp;
69
+ /** POST to app API (e.g. control-media-session). Throws on failure. */
70
+ private postFromAppApi;
71
+ /**
72
+ * GET /api/smarthome/v1/presentation/devices/control — layout IDs to capabilities.
73
+ * Returns layout keys (endpoint IDs like amzn1.alexa.endpoint.*) when available.
74
+ */
75
+ private fetchLayouts;
76
+ /**
77
+ * POST /nexus/v1/graphql (eu-api) — power/brightness control. Uses endpointId (amzn1.alexa.endpoint.*).
78
+ * Uses setEndpointFeatures mutation (matches Alexa mobile app); updatePowerFeatureForEndpoints can fail silently.
79
+ */
80
+ private graphqlControl;
81
+ /** POST to nexus/v1/graphql with app-like headers (matches Alexa mobile app). */
82
+ private postGraphql;
83
+ /** Batch GraphQL requests (array of operations); used for fetching friendly names. */
84
+ private postGraphqlBatch;
85
+ private graphqlHeaders;
86
+ /** GraphQL ControlPageBanner query returns friendlyNameObject.value.text. */
87
+ private static readonly FRIENDLY_NAME_QUERY;
88
+ /** Batch-fetch friendly names for endpoint IDs. Returns map endpointId -> friendlyName. */
89
+ private fetchFriendlyNames;
90
+ /**
91
+ * POST /api/smarthome/v2/endpoints — used by the Alexa app for device list.
92
+ * Returns endpoints array; names may be encrypted (we use serialNumber as display when missing).
93
+ */
94
+ private fetchSmarthomeV2Endpoints;
95
+ getDevices(): Promise<Device[]>;
96
+ resolveDevice(deviceQuery: string): Promise<Device | null>;
97
+ speak(deviceSerial: string, deviceType: string, customerId: string, text: string): Promise<void>;
98
+ announce(customerId: string, text: string): Promise<void>;
99
+ command(deviceSerial: string, deviceType: string, customerId: string, text: string): Promise<void>;
100
+ listAppliances(): Promise<Appliance[]>;
101
+ /** Resolve smart home device by friendly name (case-insensitive partial match). Prefer direct GraphQL control. */
102
+ resolveApplianceByName(name: string): Promise<Appliance | null>;
103
+ /**
104
+ * Resolve smart home devices by pattern (e.g. "kitchen lights").
105
+ * Matches appliances whose friendlyName contains all space-separated words (case-insensitive).
106
+ * "lights" also matches "light" and vice versa. Returns all matches for room/group control.
107
+ */
108
+ resolveAppliancesByPattern(pattern: string): Promise<Appliance[]>;
109
+ /**
110
+ * Control all appliances matching a pattern (e.g. "kitchen lights").
111
+ * Uses direct GraphQL/phoenix control—avoids profile/account issues from voice commands.
112
+ * Returns names of controlled devices and any errors.
113
+ */
114
+ controlAppliancesByPattern(pattern: string, action: "turnOn" | "turnOff"): Promise<{
115
+ controlled: string[];
116
+ errors: string[];
117
+ }>;
118
+ controlAppliance(entityId: string, action: "turnOn" | "turnOff" | "setBrightness", brightness?: number): Promise<void>;
119
+ setBrightness(entityId: string, brightness: number): Promise<void>;
120
+ /** Get full automation (includes sequence) from app API. Used for run. */
121
+ getAutomation(automationId: string): Promise<{
122
+ automationId: string;
123
+ name?: string;
124
+ sequence?: unknown;
125
+ sequenceJson?: string;
126
+ } | null>;
127
+ /** GET /api/phoenix/group — room/space groups (Living room, Kitchen, etc.) with appliance membership. */
128
+ listDeviceGroups(): Promise<DeviceGroup[]>;
129
+ /** Like listDeviceGroups but includes chrEntityIds for each group (from chrEndpoints). */
130
+ listDeviceGroupsWithAppliances(): Promise<DeviceGroupWithAppliances[]>;
131
+ /**
132
+ * Control appliances in a room/space group by name (e.g. "Kitchen").
133
+ * Uses chrEntityIds from phoenix group → amzn1.alexa.endpoint.{id} for GraphQL.
134
+ * lightsOnly (default true) filters to devices with light/lamp/bulb in friendlyName when available.
135
+ */
136
+ controlAppliancesByGroup(groupName: string, action: "turnOn" | "turnOff", options?: {
137
+ lightsOnly?: boolean;
138
+ }): Promise<{
139
+ controlled: string[];
140
+ errors: string[];
141
+ }>;
142
+ /** GET /api/wholeHomeAudio/v1/groups — multi-room audio speaker groups (Downstairs, Everywhere, etc.). */
143
+ listAudioGroups(): Promise<AudioGroup[]>;
144
+ listRoutines(): Promise<Routine[]>;
145
+ runRoutine(automationId: string, sequenceJson?: string): Promise<void>;
146
+ /** Media: now-playing state for a device. Returns taskSessionId when something is playing. */
147
+ getNowPlaying(deviceSerialNumber: string, deviceType: string): Promise<{
148
+ taskSessionId?: string;
149
+ [key: string]: unknown;
150
+ }>;
151
+ /** Media: list active media sessions. */
152
+ listMediaSessions(): Promise<unknown>;
153
+ /** Media: transport control (play, pause, resume, stop, next, previous). */
154
+ controlMediaSession(device: Device, taskSessionId: string, command: "play" | "pause" | "resume" | "stop" | "next" | "previous"): Promise<void>;
155
+ }
156
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}