amaran-light-cli 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +374 -0
  3. package/dist/__tests__/autoCct.test.d.ts +2 -0
  4. package/dist/__tests__/autoCct.test.d.ts.map +1 -0
  5. package/dist/__tests__/autoCct.test.js +65 -0
  6. package/dist/__tests__/autoCct.test.js.map +1 -0
  7. package/dist/__tests__/cctUtil.test.d.ts +2 -0
  8. package/dist/__tests__/cctUtil.test.d.ts.map +1 -0
  9. package/dist/__tests__/cctUtil.test.js +195 -0
  10. package/dist/__tests__/cctUtil.test.js.map +1 -0
  11. package/dist/__tests__/cli.smoke.test.d.ts +2 -0
  12. package/dist/__tests__/cli.smoke.test.d.ts.map +1 -0
  13. package/dist/__tests__/cli.smoke.test.js +18 -0
  14. package/dist/__tests__/cli.smoke.test.js.map +1 -0
  15. package/dist/__tests__/intensityApi.test.d.ts +2 -0
  16. package/dist/__tests__/intensityApi.test.d.ts.map +1 -0
  17. package/dist/__tests__/intensityApi.test.js +105 -0
  18. package/dist/__tests__/intensityApi.test.js.map +1 -0
  19. package/dist/__tests__/lightControl.test.d.ts +2 -0
  20. package/dist/__tests__/lightControl.test.d.ts.map +1 -0
  21. package/dist/__tests__/lightControl.test.js +185 -0
  22. package/dist/__tests__/lightControl.test.js.map +1 -0
  23. package/dist/cctUtil.d.ts +26 -0
  24. package/dist/cctUtil.d.ts.map +1 -0
  25. package/dist/cctUtil.js +93 -0
  26. package/dist/cctUtil.js.map +1 -0
  27. package/dist/cli.d.ts +10 -0
  28. package/dist/cli.d.ts.map +1 -0
  29. package/dist/cli.js +274 -0
  30. package/dist/cli.js.map +1 -0
  31. package/dist/commands/autoCct.d.ts +5 -0
  32. package/dist/commands/autoCct.d.ts.map +1 -0
  33. package/dist/commands/autoCct.js +270 -0
  34. package/dist/commands/autoCct.js.map +1 -0
  35. package/dist/commands/cct.d.ts +5 -0
  36. package/dist/commands/cct.d.ts.map +1 -0
  37. package/dist/commands/cct.js +68 -0
  38. package/dist/commands/cct.js.map +1 -0
  39. package/dist/commands/color.d.ts +5 -0
  40. package/dist/commands/color.d.ts.map +1 -0
  41. package/dist/commands/color.js +63 -0
  42. package/dist/commands/color.js.map +1 -0
  43. package/dist/commands/discover.d.ts +5 -0
  44. package/dist/commands/discover.d.ts.map +1 -0
  45. package/dist/commands/discover.js +30 -0
  46. package/dist/commands/discover.js.map +1 -0
  47. package/dist/commands/hsi.d.ts +5 -0
  48. package/dist/commands/hsi.d.ts.map +1 -0
  49. package/dist/commands/hsi.js +65 -0
  50. package/dist/commands/hsi.js.map +1 -0
  51. package/dist/commands/intensity.d.ts +5 -0
  52. package/dist/commands/intensity.d.ts.map +1 -0
  53. package/dist/commands/intensity.js +56 -0
  54. package/dist/commands/intensity.js.map +1 -0
  55. package/dist/commands/list.d.ts +5 -0
  56. package/dist/commands/list.d.ts.map +1 -0
  57. package/dist/commands/list.js +36 -0
  58. package/dist/commands/list.js.map +1 -0
  59. package/dist/commands/power.d.ts +5 -0
  60. package/dist/commands/power.d.ts.map +1 -0
  61. package/dist/commands/power.js +126 -0
  62. package/dist/commands/power.js.map +1 -0
  63. package/dist/commands/schedule.d.ts +5 -0
  64. package/dist/commands/schedule.d.ts.map +1 -0
  65. package/dist/commands/schedule.js +188 -0
  66. package/dist/commands/schedule.js.map +1 -0
  67. package/dist/commands/service.d.ts +5 -0
  68. package/dist/commands/service.d.ts.map +1 -0
  69. package/dist/commands/service.js +350 -0
  70. package/dist/commands/service.js.map +1 -0
  71. package/dist/commands/status.d.ts +5 -0
  72. package/dist/commands/status.d.ts.map +1 -0
  73. package/dist/commands/status.js +54 -0
  74. package/dist/commands/status.js.map +1 -0
  75. package/dist/commands.d.ts +5 -0
  76. package/dist/commands.d.ts.map +1 -0
  77. package/dist/commands.js +31 -0
  78. package/dist/commands.js.map +1 -0
  79. package/dist/discovery.d.ts +13 -0
  80. package/dist/discovery.d.ts.map +1 -0
  81. package/dist/discovery.js +130 -0
  82. package/dist/discovery.js.map +1 -0
  83. package/dist/geoipUtil.d.ts +8 -0
  84. package/dist/geoipUtil.d.ts.map +1 -0
  85. package/dist/geoipUtil.js +26 -0
  86. package/dist/geoipUtil.js.map +1 -0
  87. package/dist/lightControl.d.ts +114 -0
  88. package/dist/lightControl.d.ts.map +1 -0
  89. package/dist/lightControl.js +385 -0
  90. package/dist/lightControl.js.map +1 -0
  91. package/dist/types.d.ts +37 -0
  92. package/dist/types.d.ts.map +1 -0
  93. package/dist/types.js +3 -0
  94. package/dist/types.js.map +1 -0
  95. package/package.json +75 -0
  96. package/scripts/create-launchd-service.sh +114 -0
  97. package/scripts/run-auto-cct.sh +43 -0
@@ -0,0 +1,188 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.registerSchedule = registerSchedule;
40
+ const chalk_1 = __importDefault(require("chalk"));
41
+ function registerSchedule(program, deps) {
42
+ const { asyncCommand, loadConfig } = deps;
43
+ program
44
+ .command('schedule')
45
+ .description('Preview auto-cct schedule from sunrise to sunset')
46
+ .option('--lat <latitude>', 'Manual latitude (-90 to 90)')
47
+ .option('--lon <longitude>', 'Manual longitude (-180 to 180)')
48
+ .option('--date <date>', 'Date to preview (ISO format, e.g., 2025-10-26)')
49
+ .option('--interval <minutes>', 'Minutes between schedule entries (default: 30)', '30')
50
+ .action(asyncCommand(async (options) => {
51
+ const { getLocationFromIP } = await Promise.resolve().then(() => __importStar(require('../geoipUtil')));
52
+ const { calculateCCT } = await Promise.resolve().then(() => __importStar(require('../cctUtil')));
53
+ const { getTimes } = await Promise.resolve().then(() => __importStar(require('suncalc')));
54
+ let lat;
55
+ let lon;
56
+ let date = new Date();
57
+ let source = '';
58
+ if (options.date) {
59
+ date = new Date(options.date);
60
+ if (Number.isNaN(date.getTime())) {
61
+ console.error(chalk_1.default.red('Invalid date format. Use ISO format (e.g., 2025-10-26)'));
62
+ process.exit(1);
63
+ }
64
+ }
65
+ if (options.lat !== undefined && options.lon !== undefined) {
66
+ lat = parseFloat(options.lat);
67
+ lon = parseFloat(options.lon);
68
+ if (Number.isNaN(lat) || lat < -90 || lat > 90) {
69
+ console.error(chalk_1.default.red('Latitude must be between -90 and 90'));
70
+ process.exit(1);
71
+ }
72
+ if (Number.isNaN(lon) || lon < -180 || lon > 180) {
73
+ console.error(chalk_1.default.red('Longitude must be between -180 and 180'));
74
+ process.exit(1);
75
+ }
76
+ source = 'manual';
77
+ }
78
+ else if (loadConfig) {
79
+ const config = loadConfig();
80
+ if (config &&
81
+ typeof config.latitude === 'number' &&
82
+ typeof config.longitude === 'number') {
83
+ lat = config.latitude;
84
+ lon = config.longitude;
85
+ source = 'config';
86
+ }
87
+ }
88
+ if (lat === undefined || lon === undefined) {
89
+ try {
90
+ const res = await fetch('https://api.ipify.org?format=json');
91
+ const data = await res.json();
92
+ const location = getLocationFromIP(data.ip);
93
+ if (!location || !location.ll) {
94
+ console.error(chalk_1.default.red('Could not determine location. Use --lat and --lon to specify manually.'));
95
+ process.exit(1);
96
+ }
97
+ [lat, lon] = location.ll;
98
+ source = `geoip (${data.ip})`;
99
+ }
100
+ catch (_err) {
101
+ console.error(chalk_1.default.red('Could not determine location. Use --lat and --lon to specify manually.'));
102
+ process.exit(1);
103
+ }
104
+ }
105
+ const interval = parseInt(options.interval ?? '30', 10);
106
+ if (Number.isNaN(interval) || interval < 1) {
107
+ console.error(chalk_1.default.red('Interval must be a positive number of minutes'));
108
+ process.exit(1);
109
+ }
110
+ const times = getTimes(date, lat, lon);
111
+ const sunrise = times.sunrise;
112
+ const sunset = times.sunset;
113
+ const solarNoon = times.solarNoon;
114
+ if (!sunrise ||
115
+ !sunset ||
116
+ Number.isNaN(sunrise.getTime()) ||
117
+ Number.isNaN(sunset.getTime())) {
118
+ console.error(chalk_1.default.red('Could not calculate sunrise/sunset for this location and date'));
119
+ process.exit(1);
120
+ }
121
+ console.log(chalk_1.default.blue.bold('\n═══════════════════════════════════════════════════════════'));
122
+ console.log(chalk_1.default.blue.bold(' Auto-CCT Schedule Preview'));
123
+ console.log(chalk_1.default.blue.bold('═══════════════════════════════════════════════════════════\n'));
124
+ console.log(chalk_1.default.cyan(`Location: ${lat.toFixed(4)}°, ${lon.toFixed(4)}° (${source})`));
125
+ console.log(chalk_1.default.cyan(`Date: ${date.toLocaleDateString(undefined, { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' })}`));
126
+ console.log(chalk_1.default.cyan(`Interval: Every ${interval} minute${interval !== 1 ? 's' : ''}\n`));
127
+ console.log(chalk_1.default.gray(`Sunrise: ${sunrise.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' })}`));
128
+ console.log(chalk_1.default.gray(`Solar Noon: ${solarNoon.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' })}`));
129
+ console.log(chalk_1.default.gray(`Sunset: ${sunset.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' })}`));
130
+ console.log(chalk_1.default.blue('\n───────────────────────────────────────────────────────────'));
131
+ console.log(chalk_1.default.bold('Time CCT Intensity'));
132
+ console.log(chalk_1.default.blue('───────────────────────────────────────────────────────────'));
133
+ const startTime = new Date(sunrise.getTime() - 30 * 60 * 1000);
134
+ const endTime = new Date(sunset.getTime() + 30 * 60 * 1000);
135
+ const intervalMs = interval * 60 * 1000;
136
+ const highlightThreshold = intervalMs / 2;
137
+ let currentTime = new Date(startTime);
138
+ // Respect user-configured bounds if provided
139
+ const cfg = typeof loadConfig === 'function' ? (loadConfig() ?? {}) : {};
140
+ const cctMinRaw = cfg.cctMin;
141
+ const cctMaxRaw = cfg.cctMax;
142
+ const iMinRaw = cfg.intensityMin;
143
+ const iMaxRaw = cfg.intensityMax;
144
+ const hasCctBounds = typeof cctMinRaw === 'number' || typeof cctMaxRaw === 'number';
145
+ const hasIntensityBounds = typeof iMinRaw === 'number' || typeof iMaxRaw === 'number';
146
+ while (currentTime <= endTime) {
147
+ const result = hasCctBounds || hasIntensityBounds
148
+ ? calculateCCT(lat, lon, currentTime, {
149
+ cctMinK: typeof cctMinRaw === 'number' ? cctMinRaw : undefined,
150
+ cctMaxK: typeof cctMaxRaw === 'number' ? cctMaxRaw : undefined,
151
+ intensityMinPct: typeof iMinRaw === 'number' ? iMinRaw : undefined,
152
+ intensityMaxPct: typeof iMaxRaw === 'number' ? iMaxRaw : undefined,
153
+ })
154
+ : calculateCCT(lat, lon, currentTime);
155
+ const timeStr = currentTime.toLocaleTimeString(undefined, {
156
+ hour: '2-digit',
157
+ minute: '2-digit',
158
+ });
159
+ const cctStr = `${result.cct}K`.padEnd(10);
160
+ const intensityStr = `${(result.intensity / 10).toFixed(0)}%`;
161
+ let color = chalk_1.default.white;
162
+ const timeDiffSunrise = Math.abs(currentTime.getTime() - sunrise.getTime());
163
+ const timeDiffNoon = Math.abs(currentTime.getTime() - solarNoon.getTime());
164
+ const timeDiffSunset = Math.abs(currentTime.getTime() - sunset.getTime());
165
+ if (timeDiffSunrise < highlightThreshold) {
166
+ color = chalk_1.default.yellow;
167
+ }
168
+ else if (timeDiffNoon < highlightThreshold) {
169
+ color = chalk_1.default.green.bold;
170
+ }
171
+ else if (timeDiffSunset < highlightThreshold) {
172
+ color = chalk_1.default.magenta;
173
+ }
174
+ console.log(color(`${timeStr} ${cctStr} ${intensityStr}`));
175
+ currentTime = new Date(currentTime.getTime() + intervalMs);
176
+ }
177
+ console.log(chalk_1.default.blue('───────────────────────────────────────────────────────────\n'));
178
+ console.log(chalk_1.default.gray('Legend: ') +
179
+ chalk_1.default.yellow('Sunrise') +
180
+ chalk_1.default.gray(' | ') +
181
+ chalk_1.default.green.bold('Solar Noon') +
182
+ chalk_1.default.gray(' | ') +
183
+ chalk_1.default.magenta('Sunset'));
184
+ console.log();
185
+ }));
186
+ }
187
+ exports.default = registerSchedule;
188
+ //# sourceMappingURL=schedule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedule.js","sourceRoot":"","sources":["../../src/commands/schedule.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,4CAkMC;AAtMD,kDAA0B;AAI1B,SAAgB,gBAAgB,CAAC,OAAgB,EAAE,IAAiB;IAClE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;IAE1C,OAAO;SACJ,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,kDAAkD,CAAC;SAC/D,MAAM,CAAC,kBAAkB,EAAE,6BAA6B,CAAC;SACzD,MAAM,CAAC,mBAAmB,EAAE,gCAAgC,CAAC;SAC7D,MAAM,CAAC,eAAe,EAAE,gDAAgD,CAAC;SACzE,MAAM,CAAC,sBAAsB,EAAE,gDAAgD,EAAE,IAAI,CAAC;SACtF,MAAM,CACL,YAAY,CAAC,KAAK,EAAE,OAAuB,EAAE,EAAE;QAC7C,MAAM,EAAE,iBAAiB,EAAE,GAAG,wDAAa,cAAc,GAAC,CAAC;QAC3D,MAAM,EAAE,YAAY,EAAE,GAAG,wDAAa,YAAY,GAAC,CAAC;QACpD,MAAM,EAAE,QAAQ,EAAE,GAAG,wDAAa,SAAS,GAAC,CAAC;QAE7C,IAAI,GAAuB,CAAC;QAC5B,IAAI,GAAuB,CAAC;QAC5B,IAAI,IAAI,GAAS,IAAI,IAAI,EAAE,CAAC;QAC5B,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,IAAI,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC9B,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;gBACjC,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC,CAAC;gBACnF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,IAAI,OAAO,CAAC,GAAG,KAAK,SAAS,IAAI,OAAO,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YAC3D,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC9B,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,EAAE,IAAI,GAAG,GAAG,EAAE,EAAE,CAAC;gBAC/C,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC,CAAC;gBAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;gBACjD,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC,CAAC;gBACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM,GAAG,QAAQ,CAAC;QACpB,CAAC;aAAM,IAAI,UAAU,EAAE,CAAC;YACtB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;YAC5B,IACE,MAAM;gBACN,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ;gBACnC,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,EACpC,CAAC;gBACD,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC;gBACtB,GAAG,GAAG,MAAM,CAAC,SAAS,CAAC;gBACvB,MAAM,GAAG,QAAQ,CAAC;YACpB,CAAC;QACH,CAAC;QAED,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YAC3C,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,mCAAmC,CAAC,CAAC;gBAC7D,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;gBAC9B,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC5C,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;oBAC9B,OAAO,CAAC,KAAK,CACX,eAAK,CAAC,GAAG,CAAC,wEAAwE,CAAC,CACpF,CAAC;oBACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBACD,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC;gBACzB,MAAM,GAAG,UAAU,IAAI,CAAC,EAAE,GAAG,CAAC;YAChC,CAAC;YAAC,OAAO,IAAI,EAAE,CAAC;gBACd,OAAO,CAAC,KAAK,CACX,eAAK,CAAC,GAAG,CAAC,wEAAwE,CAAC,CACpF,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;QACxD,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YAC3C,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC,CAAC;YAC1E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC9B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC5B,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;QAElC,IACE,CAAC,OAAO;YACR,CAAC,MAAM;YACP,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YAC/B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,EAC9B,CAAC;YACD,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC,CAAC;YAC1F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,+DAA+D,CAAC,CACjF,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,+DAA+D,CAAC,CACjF,CAAC;QAEF,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,aAAa,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC;QACxF,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,IAAI,CACR,SAAS,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,CACnH,CACF,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,mBAAmB,QAAQ,UAAU,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QAE5F,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,IAAI,CACR,gBAAgB,OAAO,CAAC,kBAAkB,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,CAChG,CACF,CAAC;QACF,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,IAAI,CACR,gBAAgB,SAAS,CAAC,kBAAkB,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,CAClG,CACF,CAAC;QACF,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,IAAI,CACR,gBAAgB,MAAM,CAAC,kBAAkB,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,CAC/F,CACF,CAAC;QAEF,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC,CAAC;QACzF,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC,CAAC;QAEvF,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAC/D,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAC5D,MAAM,UAAU,GAAG,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC;QACxC,MAAM,kBAAkB,GAAG,UAAU,GAAG,CAAC,CAAC;QAE1C,IAAI,WAAW,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;QACtC,6CAA6C;QAC7C,MAAM,GAAG,GACP,OAAO,UAAU,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC;QAC7B,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC;QAC7B,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,CAAC;QACjC,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,CAAC;QACjC,MAAM,YAAY,GAAG,OAAO,SAAS,KAAK,QAAQ,IAAI,OAAO,SAAS,KAAK,QAAQ,CAAC;QACpF,MAAM,kBAAkB,GAAG,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,OAAO,KAAK,QAAQ,CAAC;QAEtF,OAAO,WAAW,IAAI,OAAO,EAAE,CAAC;YAC9B,MAAM,MAAM,GACV,YAAY,IAAI,kBAAkB;gBAChC,CAAC,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,EAAE;oBAClC,OAAO,EAAE,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;oBAC9D,OAAO,EAAE,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;oBAC9D,eAAe,EAAE,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;oBAClE,eAAe,EAAE,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;iBACnE,CAAC;gBACJ,CAAC,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;YAC1C,MAAM,OAAO,GAAG,WAAW,CAAC,kBAAkB,CAAC,SAAS,EAAE;gBACxD,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,SAAS;aAClB,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC3C,MAAM,YAAY,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;YAE9D,IAAI,KAAK,GAAG,eAAK,CAAC,KAAK,CAAC;YACxB,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;YAC5E,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;YAC3E,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;YAE1E,IAAI,eAAe,GAAG,kBAAkB,EAAE,CAAC;gBACzC,KAAK,GAAG,eAAK,CAAC,MAAM,CAAC;YACvB,CAAC;iBAAM,IAAI,YAAY,GAAG,kBAAkB,EAAE,CAAC;gBAC7C,KAAK,GAAG,eAAK,CAAC,KAAK,CAAC,IAAI,CAAC;YAC3B,CAAC;iBAAM,IAAI,cAAc,GAAG,kBAAkB,EAAE,CAAC;gBAC/C,KAAK,GAAG,eAAK,CAAC,OAAO,CAAC;YACxB,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,OAAO,OAAO,MAAM,KAAK,YAAY,EAAE,CAAC,CAAC,CAAC;YAC/D,WAAW,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,UAAU,CAAC,CAAC;QAC7D,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC,CAAC;QACzF,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,IAAI,CAAC,UAAU,CAAC;YACpB,eAAK,CAAC,MAAM,CAAC,SAAS,CAAC;YACvB,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC;YACjB,eAAK,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC;YAC9B,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC;YACjB,eAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAC1B,CAAC;QACF,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC,CAAC,CACH,CAAC;AACN,CAAC;AAED,kBAAe,gBAAgB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { Command } from 'commander';
2
+ import type { CommandDeps } from '../types';
3
+ export declare function registerService(program: Command, deps: CommandDeps): void;
4
+ export default registerService;
5
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/commands/service.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,UAAU,CAAC;AAE5D,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,QAoTlE;AA8CD,eAAe,eAAe,CAAC"}
@@ -0,0 +1,350 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.registerService = registerService;
40
+ const node_child_process_1 = require("node:child_process");
41
+ const fs = __importStar(require("node:fs"));
42
+ const path = __importStar(require("node:path"));
43
+ const chalk_1 = __importDefault(require("chalk"));
44
+ function registerService(program, deps) {
45
+ const { asyncCommand } = deps;
46
+ const serviceCommand = program
47
+ .command('circadian-service')
48
+ .alias('service')
49
+ .description('Manage auto-cct circadian lighting background service');
50
+ // Install service
51
+ serviceCommand
52
+ .command('install')
53
+ .description('Install auto-cct as a circadian lighting background service (runs every minute)')
54
+ .option('--interval <seconds>', 'Interval in seconds (default: 60)', '60')
55
+ .action(asyncCommand(async (options) => {
56
+ const interval = parseInt(options.interval ?? '60', 10);
57
+ if (Number.isNaN(interval) || interval < 10) {
58
+ console.error(chalk_1.default.red('Interval must be at least 10 seconds'));
59
+ process.exit(1);
60
+ }
61
+ // Determine CLI path - check if globally installed or local
62
+ let cliPath;
63
+ let isGlobal = false;
64
+ // Check if running from global installation
65
+ try {
66
+ const { stdout } = await runCommand('which', ['amaran-cli']);
67
+ const globalPath = stdout.trim();
68
+ if (globalPath && fs.existsSync(globalPath)) {
69
+ cliPath = globalPath;
70
+ isGlobal = true;
71
+ console.log(chalk_1.default.blue(`✓ Detected global installation: ${cliPath}`));
72
+ }
73
+ else {
74
+ throw new Error('Not found in PATH');
75
+ }
76
+ }
77
+ catch {
78
+ // Fall back to local development path
79
+ const projectDir = path.resolve(__dirname, '..');
80
+ cliPath = path.join(projectDir, 'dist', 'cli.js');
81
+ // Check if CLI is built locally
82
+ if (!fs.existsSync(cliPath)) {
83
+ console.error(chalk_1.default.red('CLI not found. Please either:'));
84
+ console.error(chalk_1.default.red(' 1. Install globally: npm install -g .'));
85
+ console.error(chalk_1.default.red(' 2. Or build locally: npm run build'));
86
+ process.exit(1);
87
+ }
88
+ console.log(chalk_1.default.blue(`✓ Using local development build: ${cliPath}`));
89
+ }
90
+ const homeDir = process.env.HOME;
91
+ if (!homeDir) {
92
+ console.error(chalk_1.default.red('HOME environment variable not set'));
93
+ process.exit(1);
94
+ }
95
+ const plistName = 'com.hmmfn.amaran.circadian-service';
96
+ const plistPath = path.join(homeDir, 'Library', 'LaunchAgents', `${plistName}.plist`);
97
+ const logDir = path.join(homeDir, 'Library', 'Logs');
98
+ const nodePath = process.execPath;
99
+ // Ensure log directory exists
100
+ if (!fs.existsSync(logDir)) {
101
+ fs.mkdirSync(logDir, { recursive: true });
102
+ }
103
+ const plistContent = `<?xml version="1.0" encoding="UTF-8"?>
104
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
105
+ <plist version="1.0">
106
+ <dict>
107
+ <key>Label</key>
108
+ <string>${plistName}</string>
109
+ <key>ProgramArguments</key>
110
+ <array>
111
+ <string>${nodePath}</string>
112
+ <string>${cliPath}</string>
113
+ <string>auto-cct</string>
114
+ </array>
115
+ <key>StartInterval</key>
116
+ <integer>${interval}</integer>
117
+ <key>RunAtLoad</key>
118
+ <true/>
119
+ <key>KeepAlive</key>
120
+ <false/>
121
+ <key>StandardOutPath</key>
122
+ <string>${path.join(logDir, 'amaran-circadian-service.log')}</string>
123
+ <key>StandardErrorPath</key>
124
+ <string>${path.join(logDir, 'amaran-circadian-service-error.log')}</string>
125
+ ${!isGlobal
126
+ ? `<key>WorkingDirectory</key>
127
+ <string>${path.dirname(path.dirname(cliPath))}</string>`
128
+ : ''}
129
+ </dict>
130
+ </plist>`;
131
+ try {
132
+ // Write plist file
133
+ fs.writeFileSync(plistPath, plistContent);
134
+ console.log(chalk_1.default.green(`✓ Created service file: ${plistPath}`));
135
+ // Load the service
136
+ await runCommand('launchctl', ['load', plistPath]);
137
+ console.log(chalk_1.default.green(`✓ Circadian lighting service installed and started`));
138
+ console.log(chalk_1.default.blue(` Installation type: ${isGlobal ? 'Global' : 'Local development'}`));
139
+ console.log(chalk_1.default.blue(` CLI path: ${cliPath}`));
140
+ console.log(chalk_1.default.blue(` Running auto-cct every ${interval} seconds`));
141
+ console.log(chalk_1.default.gray(` Logs: ${path.join(logDir, 'amaran-circadian-service.log')}`));
142
+ console.log(chalk_1.default.gray(` Errors: ${path.join(logDir, 'amaran-circadian-service-error.log')}`));
143
+ appendServiceLog(`Service installed (${isGlobal ? 'global' : 'local'}) interval=${interval}s`);
144
+ }
145
+ catch (error) {
146
+ const err = error;
147
+ console.error(chalk_1.default.red('Failed to install circadian lighting service:'), err.message);
148
+ process.exit(1);
149
+ }
150
+ }));
151
+ // Uninstall service
152
+ serviceCommand
153
+ .command('uninstall')
154
+ .description('Uninstall circadian lighting background service')
155
+ .action(asyncCommand(async () => {
156
+ const homeDir = process.env.HOME;
157
+ if (!homeDir) {
158
+ console.error(chalk_1.default.red('HOME environment variable not set'));
159
+ process.exit(1);
160
+ }
161
+ const plistName = 'com.hmmfn.amaran.circadian-service';
162
+ const plistPath = path.join(homeDir, 'Library', 'LaunchAgents', `${plistName}.plist`);
163
+ try {
164
+ if (fs.existsSync(plistPath)) {
165
+ // Unload the service
166
+ await runCommand('launchctl', ['unload', plistPath]);
167
+ // Remove the plist file
168
+ fs.unlinkSync(plistPath);
169
+ console.log(chalk_1.default.green('✓ Circadian lighting service uninstalled successfully'));
170
+ appendServiceLog('Service uninstalled');
171
+ }
172
+ else {
173
+ console.log(chalk_1.default.yellow('Circadian lighting service not found (already uninstalled)'));
174
+ }
175
+ }
176
+ catch (error) {
177
+ const err = error;
178
+ console.error(chalk_1.default.red('Failed to uninstall circadian lighting service:'), err.message);
179
+ process.exit(1);
180
+ }
181
+ }));
182
+ // Status command
183
+ serviceCommand
184
+ .command('status')
185
+ .description('Check circadian lighting service status')
186
+ .action(asyncCommand(async () => {
187
+ const homeDir = process.env.HOME;
188
+ if (!homeDir) {
189
+ console.error(chalk_1.default.red('HOME environment variable not set'));
190
+ process.exit(1);
191
+ }
192
+ const plistName = 'com.hmmfn.amaran.circadian-service';
193
+ const plistPath = path.join(homeDir, 'Library', 'LaunchAgents', `${plistName}.plist`);
194
+ const logPath = path.join(homeDir, 'Library', 'Logs', 'amaran-circadian-service.log');
195
+ const errorLogPath = path.join(homeDir, 'Library', 'Logs', 'amaran-circadian-service-error.log');
196
+ try {
197
+ if (!fs.existsSync(plistPath)) {
198
+ console.log(chalk_1.default.yellow('Circadian lighting service not installed'));
199
+ return;
200
+ }
201
+ // Check if service is loaded
202
+ const { stdout } = await runCommand('launchctl', ['list']);
203
+ const isLoaded = stdout.includes(plistName);
204
+ console.log(chalk_1.default.blue('Circadian Lighting Service Status:'));
205
+ console.log(` Installed: ${chalk_1.default.green('✓')}`);
206
+ console.log(` Running: ${isLoaded ? chalk_1.default.green('✓') : chalk_1.default.red('✗')}`);
207
+ console.log(` Config: ${plistPath}`);
208
+ if (fs.existsSync(logPath)) {
209
+ const logStats = fs.statSync(logPath);
210
+ console.log(` Last run: ${logStats.mtime.toLocaleString()}`);
211
+ // Show last few lines of log
212
+ const logContent = fs.readFileSync(logPath, 'utf8');
213
+ const lastLines = logContent.trim().split('\n').slice(-3);
214
+ if (lastLines.length > 0 && lastLines[0]) {
215
+ console.log(chalk_1.default.gray(' Recent output:'));
216
+ for (const line of lastLines) {
217
+ console.log(chalk_1.default.gray(` ${line}`));
218
+ }
219
+ }
220
+ }
221
+ if (fs.existsSync(errorLogPath)) {
222
+ const errorContent = fs.readFileSync(errorLogPath, 'utf8').trim();
223
+ if (errorContent) {
224
+ console.log(chalk_1.default.red(' Recent errors:'));
225
+ errorContent
226
+ .split('\n')
227
+ .slice(-3)
228
+ .forEach((line) => {
229
+ if (line.trim())
230
+ console.log(chalk_1.default.red(` ${line}`));
231
+ });
232
+ }
233
+ }
234
+ }
235
+ catch (error) {
236
+ const err = error;
237
+ console.error(chalk_1.default.red('Failed to check circadian lighting service status:'), err.message);
238
+ }
239
+ }));
240
+ // Start service
241
+ serviceCommand
242
+ .command('start')
243
+ .description('Start circadian lighting service')
244
+ .action(asyncCommand(async () => {
245
+ const plistName = 'com.hmmfn.amaran.circadian-service';
246
+ try {
247
+ await runCommand('launchctl', ['start', plistName]);
248
+ console.log(chalk_1.default.green('✓ Circadian lighting service started'));
249
+ appendServiceLog('Service start requested');
250
+ }
251
+ catch (error) {
252
+ const err = error;
253
+ console.error(chalk_1.default.red('Failed to start circadian lighting service:'), err.message);
254
+ }
255
+ }));
256
+ // Stop service
257
+ serviceCommand
258
+ .command('stop')
259
+ .description('Stop circadian lighting service')
260
+ .action(asyncCommand(async () => {
261
+ const plistName = 'com.hmmfn.amaran.circadian-service';
262
+ try {
263
+ await runCommand('launchctl', ['stop', plistName]);
264
+ console.log(chalk_1.default.green('✓ Circadian lighting service stopped'));
265
+ appendServiceLog('Service stop requested');
266
+ }
267
+ catch (error) {
268
+ const err = error;
269
+ console.error(chalk_1.default.red('Failed to stop circadian lighting service:'), err.message);
270
+ }
271
+ }));
272
+ // Logs command
273
+ serviceCommand
274
+ .command('logs')
275
+ .description('Show circadian lighting service logs')
276
+ .option('-f, --follow', 'Follow log output')
277
+ .option('-e, --errors', 'Show error logs instead')
278
+ .action(asyncCommand(async (options) => {
279
+ const homeDir = process.env.HOME;
280
+ if (!homeDir) {
281
+ console.error(chalk_1.default.red('HOME environment variable not set'));
282
+ process.exit(1);
283
+ }
284
+ const logFile = options.errors
285
+ ? 'amaran-circadian-service-error.log'
286
+ : 'amaran-circadian-service.log';
287
+ const logPath = path.join(homeDir, 'Library', 'Logs', logFile);
288
+ if (!fs.existsSync(logPath)) {
289
+ console.log(chalk_1.default.yellow(`No ${options.errors ? 'error ' : ''}logs found`));
290
+ return;
291
+ }
292
+ try {
293
+ if (options.follow) {
294
+ console.log(chalk_1.default.blue(`Following ${logFile}... (Ctrl+C to stop)`));
295
+ (0, node_child_process_1.spawn)('tail', ['-f', logPath], { stdio: 'inherit' });
296
+ }
297
+ else {
298
+ const content = fs.readFileSync(logPath, 'utf8');
299
+ console.log(content);
300
+ }
301
+ }
302
+ catch (error) {
303
+ const err = error;
304
+ console.error(chalk_1.default.red('Failed to read logs:'), err.message);
305
+ }
306
+ }));
307
+ }
308
+ function appendServiceLog(message) {
309
+ const homeDir = process.env.HOME;
310
+ if (!homeDir) {
311
+ return;
312
+ }
313
+ const logDir = path.join(homeDir, 'Library', 'Logs');
314
+ const logPath = path.join(logDir, 'amaran-circadian-service.log');
315
+ try {
316
+ if (!fs.existsSync(logDir)) {
317
+ fs.mkdirSync(logDir, { recursive: true });
318
+ }
319
+ const timestamp = new Date().toISOString();
320
+ fs.appendFileSync(logPath, `[${timestamp}] ${message}\n`);
321
+ }
322
+ catch (error) {
323
+ const err = error;
324
+ console.error(chalk_1.default.red('Failed to write to service log:'), err.message);
325
+ }
326
+ }
327
+ // Helper function to run shell commands
328
+ function runCommand(command, args) {
329
+ return new Promise((resolve, reject) => {
330
+ const child = (0, node_child_process_1.spawn)(command, args, { stdio: 'pipe' });
331
+ let stdout = '';
332
+ let stderr = '';
333
+ child.stdout.on('data', (data) => {
334
+ stdout += data.toString();
335
+ });
336
+ child.stderr.on('data', (data) => {
337
+ stderr += data.toString();
338
+ });
339
+ child.on('close', (code) => {
340
+ if (code === 0) {
341
+ resolve({ stdout, stderr });
342
+ }
343
+ else {
344
+ reject(new Error(`Command failed with code ${code}: ${stderr}`));
345
+ }
346
+ });
347
+ });
348
+ }
349
+ exports.default = registerService;
350
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/commands/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { Command } from 'commander';
2
+ import type { CommandDeps } from '../types';
3
+ export declare function registerStatus(program: Command, deps: CommandDeps): void;
4
+ export default registerStatus;
5
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,UAAU,CAAC;AAE5D,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,QA2DjE;AAED,eAAe,cAAc,CAAC"}
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.registerStatus = registerStatus;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ function registerStatus(program, deps) {
9
+ const { createController, findDevice, asyncCommand } = deps;
10
+ program
11
+ .command('status <device>')
12
+ .description('Get the current status of a light')
13
+ .option('-u, --url <url>', 'WebSocket URL')
14
+ .option('-c, --client-id <id>', 'Client ID')
15
+ .option('-d, --debug', 'Enable debug mode')
16
+ .action(asyncCommand(async (deviceQuery, options) => {
17
+ const controller = await createController(options.url, options.clientId, options.debug);
18
+ const device = findDevice(controller, deviceQuery);
19
+ if (!device) {
20
+ console.error(chalk_1.default.red(`Device "${deviceQuery}" not found`));
21
+ process.exit(1);
22
+ }
23
+ if (!device.node_id) {
24
+ console.error(chalk_1.default.red(`Device "${deviceQuery}" has no node_id`));
25
+ process.exit(1);
26
+ }
27
+ const nodeId = device.node_id;
28
+ controller.getLightSleepStatus(nodeId, (success, message, data) => {
29
+ if (success) {
30
+ const nodeConfig = controller.getNode(nodeId);
31
+ const displayName = device.device_name || device.name || device.id || device.node_id || 'Unknown';
32
+ console.log(chalk_1.default.blue(`Status for ${displayName}:`));
33
+ console.log(` State: ${data?.sleep ? chalk_1.default.red('Off') : chalk_1.default.green('On')}`);
34
+ if (nodeConfig) {
35
+ if (nodeConfig.intensity !== undefined) {
36
+ console.log(` Intensity: ${nodeConfig.intensity}%`);
37
+ }
38
+ if (nodeConfig.cct !== undefined) {
39
+ console.log(` Temperature: ${nodeConfig.cct}K`);
40
+ }
41
+ if (nodeConfig.hue !== undefined && nodeConfig.sat !== undefined) {
42
+ console.log(` HSI: H:${nodeConfig.hue} S:${nodeConfig.sat} I:${nodeConfig.intensity}`);
43
+ }
44
+ }
45
+ }
46
+ else {
47
+ console.error(chalk_1.default.red(`✗ Failed to get status: ${message}`));
48
+ }
49
+ controller.disconnect();
50
+ });
51
+ }));
52
+ }
53
+ exports.default = registerStatus;
54
+ //# sourceMappingURL=status.js.map