@josharsh/demon-cli 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.
Files changed (172) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +130 -0
  3. package/dist/actions/base.d.ts +4 -0
  4. package/dist/actions/base.d.ts.map +1 -0
  5. package/dist/actions/base.js +32 -0
  6. package/dist/actions/base.js.map +1 -0
  7. package/dist/actions/file.d.ts +7 -0
  8. package/dist/actions/file.d.ts.map +1 -0
  9. package/dist/actions/file.js +35 -0
  10. package/dist/actions/file.js.map +1 -0
  11. package/dist/actions/github.d.ts +7 -0
  12. package/dist/actions/github.d.ts.map +1 -0
  13. package/dist/actions/github.js +125 -0
  14. package/dist/actions/github.js.map +1 -0
  15. package/dist/actions/index.d.ts +5 -0
  16. package/dist/actions/index.d.ts.map +1 -0
  17. package/dist/actions/index.js +22 -0
  18. package/dist/actions/index.js.map +1 -0
  19. package/dist/actions/log.d.ts +7 -0
  20. package/dist/actions/log.d.ts.map +1 -0
  21. package/dist/actions/log.js +30 -0
  22. package/dist/actions/log.js.map +1 -0
  23. package/dist/actions/notify.d.ts +11 -0
  24. package/dist/actions/notify.d.ts.map +1 -0
  25. package/dist/actions/notify.js +34 -0
  26. package/dist/actions/notify.js.map +1 -0
  27. package/dist/actions/script.d.ts +7 -0
  28. package/dist/actions/script.d.ts.map +1 -0
  29. package/dist/actions/script.js +46 -0
  30. package/dist/actions/script.js.map +1 -0
  31. package/dist/actions/slack.d.ts +7 -0
  32. package/dist/actions/slack.d.ts.map +1 -0
  33. package/dist/actions/slack.js +47 -0
  34. package/dist/actions/slack.js.map +1 -0
  35. package/dist/actions/webhook.d.ts +7 -0
  36. package/dist/actions/webhook.d.ts.map +1 -0
  37. package/dist/actions/webhook.js +41 -0
  38. package/dist/actions/webhook.js.map +1 -0
  39. package/dist/adapters/clock.d.ts +3 -0
  40. package/dist/adapters/clock.d.ts.map +1 -0
  41. package/dist/adapters/clock.js +8 -0
  42. package/dist/adapters/clock.js.map +1 -0
  43. package/dist/adapters/fs-kv.d.ts +3 -0
  44. package/dist/adapters/fs-kv.d.ts.map +1 -0
  45. package/dist/adapters/fs-kv.js +34 -0
  46. package/dist/adapters/fs-kv.js.map +1 -0
  47. package/dist/adapters/keys.d.ts +3 -0
  48. package/dist/adapters/keys.d.ts.map +1 -0
  49. package/dist/adapters/keys.js +17 -0
  50. package/dist/adapters/keys.js.map +1 -0
  51. package/dist/commands/ensure-provider.d.ts +7 -0
  52. package/dist/commands/ensure-provider.d.ts.map +1 -0
  53. package/dist/commands/ensure-provider.js +121 -0
  54. package/dist/commands/ensure-provider.js.map +1 -0
  55. package/dist/commands/init.d.ts +2 -0
  56. package/dist/commands/init.d.ts.map +1 -0
  57. package/dist/commands/init.js +196 -0
  58. package/dist/commands/init.js.map +1 -0
  59. package/dist/commands/inspect.d.ts +7 -0
  60. package/dist/commands/inspect.d.ts.map +1 -0
  61. package/dist/commands/inspect.js +97 -0
  62. package/dist/commands/inspect.js.map +1 -0
  63. package/dist/commands/install.d.ts +3 -0
  64. package/dist/commands/install.d.ts.map +1 -0
  65. package/dist/commands/install.js +192 -0
  66. package/dist/commands/install.js.map +1 -0
  67. package/dist/commands/logs.d.ts +8 -0
  68. package/dist/commands/logs.d.ts.map +1 -0
  69. package/dist/commands/logs.js +103 -0
  70. package/dist/commands/logs.js.map +1 -0
  71. package/dist/commands/providers.d.ts +5 -0
  72. package/dist/commands/providers.d.ts.map +1 -0
  73. package/dist/commands/providers.js +251 -0
  74. package/dist/commands/providers.js.map +1 -0
  75. package/dist/commands/ps.d.ts +2 -0
  76. package/dist/commands/ps.d.ts.map +1 -0
  77. package/dist/commands/ps.js +87 -0
  78. package/dist/commands/ps.js.map +1 -0
  79. package/dist/commands/secrets.d.ts +9 -0
  80. package/dist/commands/secrets.d.ts.map +1 -0
  81. package/dist/commands/secrets.js +97 -0
  82. package/dist/commands/secrets.js.map +1 -0
  83. package/dist/commands/start.d.ts +10 -0
  84. package/dist/commands/start.d.ts.map +1 -0
  85. package/dist/commands/start.js +238 -0
  86. package/dist/commands/start.js.map +1 -0
  87. package/dist/commands/status.d.ts +2 -0
  88. package/dist/commands/status.d.ts.map +1 -0
  89. package/dist/commands/status.js +69 -0
  90. package/dist/commands/status.js.map +1 -0
  91. package/dist/commands/stop.d.ts +6 -0
  92. package/dist/commands/stop.d.ts.map +1 -0
  93. package/dist/commands/stop.js +43 -0
  94. package/dist/commands/stop.js.map +1 -0
  95. package/dist/index.d.ts +3 -0
  96. package/dist/index.d.ts.map +1 -0
  97. package/dist/index.js +253 -0
  98. package/dist/index.js.map +1 -0
  99. package/dist/providers/config.d.ts +8 -0
  100. package/dist/providers/config.d.ts.map +1 -0
  101. package/dist/providers/config.js +31 -0
  102. package/dist/providers/config.js.map +1 -0
  103. package/dist/providers/credentials.d.ts +5 -0
  104. package/dist/providers/credentials.d.ts.map +1 -0
  105. package/dist/providers/credentials.js +69 -0
  106. package/dist/providers/credentials.js.map +1 -0
  107. package/dist/providers/registry.d.ts +12 -0
  108. package/dist/providers/registry.d.ts.map +1 -0
  109. package/dist/providers/registry.js +58 -0
  110. package/dist/providers/registry.js.map +1 -0
  111. package/dist/providers/secrets.d.ts +9 -0
  112. package/dist/providers/secrets.d.ts.map +1 -0
  113. package/dist/providers/secrets.js +44 -0
  114. package/dist/providers/secrets.js.map +1 -0
  115. package/dist/providers/system-auth.d.ts +8 -0
  116. package/dist/providers/system-auth.d.ts.map +1 -0
  117. package/dist/providers/system-auth.js +168 -0
  118. package/dist/providers/system-auth.js.map +1 -0
  119. package/dist/runtime/daemon.d.ts +10 -0
  120. package/dist/runtime/daemon.d.ts.map +1 -0
  121. package/dist/runtime/daemon.js +264 -0
  122. package/dist/runtime/daemon.js.map +1 -0
  123. package/dist/runtime/supervisor.d.ts +6 -0
  124. package/dist/runtime/supervisor.d.ts.map +1 -0
  125. package/dist/runtime/supervisor.js +45 -0
  126. package/dist/runtime/supervisor.js.map +1 -0
  127. package/dist/types.d.ts +27 -0
  128. package/dist/types.d.ts.map +1 -0
  129. package/dist/types.js +7 -0
  130. package/dist/types.js.map +1 -0
  131. package/dist/utils/logger.d.ts +4 -0
  132. package/dist/utils/logger.d.ts.map +1 -0
  133. package/dist/utils/logger.js +44 -0
  134. package/dist/utils/logger.js.map +1 -0
  135. package/dist/utils/manifest.d.ts +5 -0
  136. package/dist/utils/manifest.d.ts.map +1 -0
  137. package/dist/utils/manifest.js +276 -0
  138. package/dist/utils/manifest.js.map +1 -0
  139. package/dist/utils/paths.d.ts +13 -0
  140. package/dist/utils/paths.d.ts.map +1 -0
  141. package/dist/utils/paths.js +52 -0
  142. package/dist/utils/paths.js.map +1 -0
  143. package/dist/utils/time.d.ts +11 -0
  144. package/dist/utils/time.d.ts.map +1 -0
  145. package/dist/utils/time.js +40 -0
  146. package/dist/utils/time.js.map +1 -0
  147. package/dist/watchers/base.d.ts +3 -0
  148. package/dist/watchers/base.d.ts.map +1 -0
  149. package/dist/watchers/base.js +20 -0
  150. package/dist/watchers/base.js.map +1 -0
  151. package/dist/watchers/filesystem.d.ts +12 -0
  152. package/dist/watchers/filesystem.d.ts.map +1 -0
  153. package/dist/watchers/filesystem.js +211 -0
  154. package/dist/watchers/filesystem.js.map +1 -0
  155. package/dist/watchers/github.d.ts +3 -0
  156. package/dist/watchers/github.d.ts.map +1 -0
  157. package/dist/watchers/github.js +322 -0
  158. package/dist/watchers/github.js.map +1 -0
  159. package/dist/watchers/http.d.ts +13 -0
  160. package/dist/watchers/http.d.ts.map +1 -0
  161. package/dist/watchers/http.js +149 -0
  162. package/dist/watchers/http.js.map +1 -0
  163. package/dist/watchers/index.d.ts +8 -0
  164. package/dist/watchers/index.d.ts.map +1 -0
  165. package/dist/watchers/index.js +25 -0
  166. package/dist/watchers/index.js.map +1 -0
  167. package/examples/README.md +9 -0
  168. package/examples/codebase-guardian.yaml +22 -0
  169. package/examples/competitor-watch.yaml +18 -0
  170. package/examples/founder-sentinel.md +126 -0
  171. package/examples/founder-sentinel.yaml +27 -0
  172. package/package.json +62 -0
@@ -0,0 +1,97 @@
1
+ import chalk from 'chalk';
2
+ import fs from 'fs-extra';
3
+ import { statePath, memoryPath } from '../utils/paths.js';
4
+ export async function inspectCommand(name, options) {
5
+ const stateFile = statePath(name);
6
+ if (!(await fs.pathExists(stateFile))) {
7
+ console.error(chalk.red(`\n No demon named "${name}" found.\n`));
8
+ process.exit(1);
9
+ }
10
+ const state = await fs.readJson(stateFile);
11
+ const memFile = memoryPath(name);
12
+ const lastN = parseInt(options.last ?? '10', 10);
13
+ let entries = [];
14
+ if (await fs.pathExists(memFile)) {
15
+ entries = await readLastNJsonlLines(memFile, lastN);
16
+ }
17
+ if (options.json) {
18
+ console.log(JSON.stringify({ state, entries }, null, 2));
19
+ return;
20
+ }
21
+ // Pretty view
22
+ const effectiveStatus = (() => {
23
+ if (state.status === 'running' && !isProcessAlive(state.pid))
24
+ return 'stopped (stale)';
25
+ return state.status;
26
+ })();
27
+ console.log();
28
+ console.log(chalk.bold.magenta(` inspect: ${state.name}`));
29
+ console.log(chalk.dim(' ' + '─'.repeat(50)));
30
+ row('Status', chalk.green(effectiveStatus));
31
+ row('PID', String(state.pid));
32
+ row('Model', state.model);
33
+ row('Action Mode', state.actionMode);
34
+ row('Started', new Date(state.startedAt).toLocaleString());
35
+ row('Cycles', String(state.cycles));
36
+ row('Actions Fired', String(state.actionsCount));
37
+ row('Last Check', state.lastCheck ? new Date(state.lastCheck).toLocaleString() : 'Never');
38
+ row('Manifest', state.manifestPath);
39
+ console.log();
40
+ if (entries.length === 0) {
41
+ console.log(chalk.dim(' No reasoning history yet.\n'));
42
+ return;
43
+ }
44
+ console.log(chalk.bold(` Last ${entries.length} reasoning cycles:`));
45
+ console.log(chalk.dim(' ' + '─'.repeat(50)));
46
+ for (const entry of entries) {
47
+ const decisionColor = entry.decision.decision === 'act' ? chalk.green : chalk.yellow;
48
+ const ts = new Date(entry.timestamp).toLocaleString();
49
+ console.log();
50
+ console.log(` ${chalk.bold(`Cycle #${entry.cycleNumber}`)} ${chalk.dim(ts)}`);
51
+ console.log(` Decision: ${decisionColor(entry.decision.decision.toUpperCase())} ` +
52
+ chalk.dim(entry.decision.reasoning.slice(0, 120) + (entry.decision.reasoning.length > 120 ? '...' : '')));
53
+ if (entry.observations.length > 0) {
54
+ console.log(` Observations (${entry.observations.length}):`);
55
+ for (const obs of entry.observations) {
56
+ console.log(` ${chalk.cyan(obs.watcherType)} ${chalk.dim(obs.summary.slice(0, 100))}`);
57
+ }
58
+ }
59
+ if (entry.actionFired) {
60
+ const a = entry.actionFired;
61
+ const resultStr = a.error
62
+ ? chalk.red(`ERROR: ${a.error}`)
63
+ : chalk.green('OK');
64
+ const dryStr = a.dryRun ? chalk.yellow(' [DRY RUN]') : '';
65
+ console.log(` Action: ${chalk.bold(a.provider + '.' + a.action)}${dryStr} ${resultStr}`);
66
+ }
67
+ }
68
+ console.log();
69
+ }
70
+ function row(label, value) {
71
+ console.log(` ${chalk.dim(label.padEnd(18))} ${value}`);
72
+ }
73
+ function isProcessAlive(pid) {
74
+ try {
75
+ process.kill(pid, 0);
76
+ return true;
77
+ }
78
+ catch {
79
+ return false;
80
+ }
81
+ }
82
+ async function readLastNJsonlLines(filePath, n) {
83
+ const content = await fs.readFile(filePath, 'utf-8');
84
+ const lines = content.trim().split('\n').filter(Boolean);
85
+ const slice = lines.slice(-n);
86
+ const entries = [];
87
+ for (const line of slice) {
88
+ try {
89
+ entries.push(JSON.parse(line));
90
+ }
91
+ catch {
92
+ // skip malformed lines
93
+ }
94
+ }
95
+ return entries;
96
+ }
97
+ //# sourceMappingURL=inspect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../src/commands/inspect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function installCommand(name: string): Promise<void>;
2
+ export declare function uninstallCommand(name: string): Promise<void>;
3
+ //# sourceMappingURL=install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAmMA,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAUhE;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CASlE"}
@@ -0,0 +1,192 @@
1
+ import chalk from 'chalk';
2
+ import fs from 'fs-extra';
3
+ import { join, dirname } from 'path';
4
+ import { fileURLToPath } from 'url';
5
+ import { homedir, userInfo } from 'os';
6
+ import { execSync } from 'child_process';
7
+ import { statePath, logPath, manifestsDir } from '../utils/paths.js';
8
+ const __filename = fileURLToPath(import.meta.url);
9
+ const __dirname = dirname(__filename);
10
+ // Path to the compiled daemon entry point (relative to this file's dist location)
11
+ function daemonScriptPath() {
12
+ return join(__dirname, '../runtime/daemon.js');
13
+ }
14
+ // ─── macOS launchd ────────────────────────────────────────────
15
+ function launchAgentsDir() {
16
+ return join(homedir(), 'Library', 'LaunchAgents');
17
+ }
18
+ function plistPath(name) {
19
+ return join(launchAgentsDir(), `com.demon.ai.${name}.plist`);
20
+ }
21
+ function buildPlist(name, manifestJsonPath, stateFilePath, logFilePath) {
22
+ const username = userInfo().username;
23
+ const nodePath = process.execPath;
24
+ const daemonScript = daemonScriptPath();
25
+ return `<?xml version="1.0" encoding="UTF-8"?>
26
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
27
+ <plist version="1.0">
28
+ <dict>
29
+ <key>Label</key>
30
+ <string>com.demon.ai.${name}</string>
31
+ <key>ProgramArguments</key>
32
+ <array>
33
+ <string>${nodePath}</string>
34
+ <string>${daemonScript}</string>
35
+ <string>${manifestJsonPath}</string>
36
+ <string>${stateFilePath}</string>
37
+ </array>
38
+ <key>RunAtLoad</key>
39
+ <true/>
40
+ <key>KeepAlive</key>
41
+ <true/>
42
+ <key>StandardOutPath</key>
43
+ <string>${logFilePath}</string>
44
+ <key>StandardErrorPath</key>
45
+ <string>${logFilePath}</string>
46
+ <key>EnvironmentVariables</key>
47
+ <dict>
48
+ <key>HOME</key>
49
+ <string>/Users/${username}</string>
50
+ </dict>
51
+ </dict>
52
+ </plist>
53
+ `;
54
+ }
55
+ async function installMacos(name) {
56
+ const manifestJsonPath = join(manifestsDir(), `${name}.json`);
57
+ if (!(await fs.pathExists(manifestJsonPath))) {
58
+ console.error(chalk.red(` Demon "${name}" has no manifest at ${manifestJsonPath}.`));
59
+ console.error(chalk.dim(' Run `demon start <manifest>` first to register the demon.'));
60
+ process.exit(1);
61
+ }
62
+ const stateFilePath = statePath(name);
63
+ const logFilePath = logPath(name);
64
+ const plist = buildPlist(name, manifestJsonPath, stateFilePath, logFilePath);
65
+ await fs.ensureDir(launchAgentsDir());
66
+ const pFile = plistPath(name);
67
+ await fs.writeFile(pFile, plist, 'utf-8');
68
+ try {
69
+ execSync(`launchctl load "${pFile}"`, { stdio: 'pipe' });
70
+ }
71
+ catch (err) {
72
+ console.warn(chalk.yellow(` Warning: launchctl load failed — ${err.message}`));
73
+ console.warn(chalk.dim(` Plist written to ${pFile}. You can load it manually with:`));
74
+ console.warn(chalk.dim(` launchctl load "${pFile}"`));
75
+ return;
76
+ }
77
+ console.log(chalk.green(` ✓ Demon ${name} registered with launchd — will auto-start on reboot`));
78
+ console.log(chalk.dim(` Plist: ${pFile}`));
79
+ }
80
+ async function uninstallMacos(name) {
81
+ const pFile = plistPath(name);
82
+ if (!(await fs.pathExists(pFile))) {
83
+ console.log(chalk.yellow(` Demon "${name}" is not registered with launchd (no plist found).`));
84
+ return;
85
+ }
86
+ try {
87
+ execSync(`launchctl unload "${pFile}"`, { stdio: 'pipe' });
88
+ }
89
+ catch (err) {
90
+ console.warn(chalk.yellow(` Warning: launchctl unload failed — ${err.message}`));
91
+ }
92
+ await fs.remove(pFile);
93
+ console.log(chalk.green(` ✓ Demon ${name} unregistered from launchd`));
94
+ }
95
+ // ─── Linux systemd ────────────────────────────────────────────
96
+ function systemdUserDir() {
97
+ return join(homedir(), '.config', 'systemd', 'user');
98
+ }
99
+ function servicePath(name) {
100
+ return join(systemdUserDir(), `demon-${name}.service`);
101
+ }
102
+ function buildServiceUnit(name, purpose, manifestJsonPath, stateFilePath) {
103
+ const nodePath = process.execPath;
104
+ const daemonScript = daemonScriptPath();
105
+ return `[Unit]
106
+ Description=Demon: ${name} — ${purpose}
107
+ After=network.target
108
+
109
+ [Service]
110
+ Type=simple
111
+ ExecStart=${nodePath} ${daemonScript} ${manifestJsonPath} ${stateFilePath}
112
+ Restart=on-failure
113
+ RestartSec=10
114
+
115
+ [Install]
116
+ WantedBy=default.target
117
+ `;
118
+ }
119
+ async function installLinux(name) {
120
+ const manifestJsonPath = join(manifestsDir(), `${name}.json`);
121
+ if (!(await fs.pathExists(manifestJsonPath))) {
122
+ console.error(chalk.red(` Demon "${name}" has no manifest at ${manifestJsonPath}.`));
123
+ console.error(chalk.dim(' Run `demon start <manifest>` first to register the demon.'));
124
+ process.exit(1);
125
+ }
126
+ // Read purpose from manifest
127
+ let purpose = name;
128
+ try {
129
+ const manifest = await fs.readJson(manifestJsonPath);
130
+ if (manifest.purpose)
131
+ purpose = manifest.purpose;
132
+ }
133
+ catch { }
134
+ const stateFilePath = statePath(name);
135
+ const unit = buildServiceUnit(name, purpose, manifestJsonPath, stateFilePath);
136
+ await fs.ensureDir(systemdUserDir());
137
+ const sFile = servicePath(name);
138
+ await fs.writeFile(sFile, unit, 'utf-8');
139
+ try {
140
+ execSync(`systemctl --user enable demon-${name} && systemctl --user start demon-${name}`, { stdio: 'pipe' });
141
+ }
142
+ catch (err) {
143
+ console.warn(chalk.yellow(` Warning: systemctl failed — ${err.message}`));
144
+ console.warn(chalk.dim(` Unit written to ${sFile}. Enable manually with:`));
145
+ console.warn(chalk.dim(` systemctl --user enable demon-${name} && systemctl --user start demon-${name}`));
146
+ return;
147
+ }
148
+ console.log(chalk.green(` ✓ Demon ${name} registered with systemd`));
149
+ console.log(chalk.dim(` Unit: ${sFile}`));
150
+ }
151
+ async function uninstallLinux(name) {
152
+ const sFile = servicePath(name);
153
+ if (!(await fs.pathExists(sFile))) {
154
+ console.log(chalk.yellow(` Demon "${name}" is not registered with systemd (no unit file found).`));
155
+ return;
156
+ }
157
+ try {
158
+ execSync(`systemctl --user stop demon-${name} && systemctl --user disable demon-${name}`, { stdio: 'pipe' });
159
+ }
160
+ catch (err) {
161
+ console.warn(chalk.yellow(` Warning: systemctl stop/disable failed — ${err.message}`));
162
+ }
163
+ await fs.remove(sFile);
164
+ console.log(chalk.green(` ✓ Demon ${name} unregistered from systemd`));
165
+ }
166
+ // ─── Exported commands ────────────────────────────────────────
167
+ export async function installCommand(name) {
168
+ if (process.platform === 'darwin') {
169
+ await installMacos(name);
170
+ }
171
+ else if (process.platform === 'linux') {
172
+ await installLinux(name);
173
+ }
174
+ else {
175
+ console.error(chalk.red(` OS-level daemon registration is not supported on ${process.platform}.`));
176
+ console.error(chalk.dim(' Supported platforms: macOS (launchd), Linux (systemd).'));
177
+ process.exit(1);
178
+ }
179
+ }
180
+ export async function uninstallCommand(name) {
181
+ if (process.platform === 'darwin') {
182
+ await uninstallMacos(name);
183
+ }
184
+ else if (process.platform === 'linux') {
185
+ await uninstallLinux(name);
186
+ }
187
+ else {
188
+ console.error(chalk.red(` OS-level daemon registration is not supported on ${process.platform}.`));
189
+ process.exit(1);
190
+ }
191
+ }
192
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ interface LogsOptions {
2
+ follow?: boolean;
3
+ lines?: string;
4
+ raw?: boolean;
5
+ }
6
+ export declare function logsCommand(name: string, options: LogsOptions): Promise<void>;
7
+ export {};
8
+ //# sourceMappingURL=logs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AAIA,UAAU,WAAW;IACnB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,GAAG,CAAC,EAAE,OAAO,CAAA;CACd;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBnF"}
@@ -0,0 +1,103 @@
1
+ import chalk from 'chalk';
2
+ import fs from 'fs-extra';
3
+ import { logPath } from '../utils/paths.js';
4
+ export async function logsCommand(name, options) {
5
+ const filePath = logPath(name);
6
+ if (!(await fs.pathExists(filePath))) {
7
+ console.error(chalk.red(`\n No logs found for demon "${name}".\n`));
8
+ console.log(chalk.dim(' Make sure the demon has been started at least once.'));
9
+ process.exit(1);
10
+ }
11
+ const tailLines = parseInt(options.lines ?? '50', 10);
12
+ if (options.follow) {
13
+ // Stream mode: print existing tail, then watch for new content
14
+ await printLastLines(filePath, tailLines, options.raw ?? false);
15
+ await followFile(filePath, options.raw ?? false);
16
+ }
17
+ else {
18
+ await printLastLines(filePath, tailLines, options.raw ?? false);
19
+ }
20
+ }
21
+ async function printLastLines(filePath, count, raw) {
22
+ const content = await fs.readFile(filePath, 'utf-8');
23
+ const lines = content.trim().split('\n').filter(Boolean);
24
+ const slice = lines.slice(-count);
25
+ for (const line of slice) {
26
+ printLogLine(line, raw);
27
+ }
28
+ }
29
+ async function followFile(filePath, raw) {
30
+ console.log(chalk.dim('\n Following logs (Ctrl+C to stop)...\n'));
31
+ const { stat, open } = await import('fs/promises');
32
+ const initialStat = await stat(filePath);
33
+ let position = initialStat.size;
34
+ // Poll for new content every 500ms
35
+ const poll = async () => {
36
+ try {
37
+ const currentStat = await stat(filePath);
38
+ if (currentStat.size > position) {
39
+ const buf = Buffer.alloc(currentStat.size - position);
40
+ const fd = await open(filePath, 'r');
41
+ await fd.read(buf, 0, buf.length, position);
42
+ await fd.close();
43
+ position = currentStat.size;
44
+ const newContent = buf.toString('utf-8');
45
+ const lines = newContent.split('\n').filter(Boolean);
46
+ for (const line of lines) {
47
+ printLogLine(line, raw);
48
+ }
49
+ }
50
+ }
51
+ catch {
52
+ // File may have been rotated — reset position
53
+ try {
54
+ const s = await stat(filePath);
55
+ position = 0;
56
+ }
57
+ catch {
58
+ // File gone, stop polling
59
+ process.exit(0);
60
+ }
61
+ }
62
+ };
63
+ const interval = setInterval(poll, 500);
64
+ process.on('SIGINT', () => {
65
+ clearInterval(interval);
66
+ console.log(chalk.dim('\n Stopped following.'));
67
+ process.exit(0);
68
+ });
69
+ // Keep alive
70
+ await new Promise(() => { });
71
+ }
72
+ function printLogLine(line, raw) {
73
+ if (raw) {
74
+ console.log(line);
75
+ return;
76
+ }
77
+ try {
78
+ const entry = JSON.parse(line);
79
+ const ts = typeof entry.timestamp === 'string'
80
+ ? new Date(entry.timestamp).toLocaleTimeString()
81
+ : '';
82
+ const level = String(entry.level ?? 'info').toUpperCase().padEnd(5);
83
+ const message = String(entry.message ?? '');
84
+ const meta = { ...entry };
85
+ delete meta.timestamp;
86
+ delete meta.level;
87
+ delete meta.message;
88
+ delete meta.demonName;
89
+ const levelColor = {
90
+ ERROR: chalk.red,
91
+ WARN: chalk.yellow,
92
+ INFO: chalk.cyan,
93
+ DEBUG: chalk.gray,
94
+ }[level.trim()] ?? chalk.white;
95
+ const metaStr = Object.keys(meta).length > 0 ? chalk.gray(' ' + JSON.stringify(meta)) : '';
96
+ console.log(`${chalk.dim(ts)} ${levelColor(level)} ${message}${metaStr}`);
97
+ }
98
+ catch {
99
+ // Not JSON — print raw
100
+ console.log(line);
101
+ }
102
+ }
103
+ //# sourceMappingURL=logs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,MAAM,UAAU,CAAA;AACzB,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAQ3C,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,OAAoB;IAClE,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAE9B,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QACrC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,gCAAgC,IAAI,MAAM,CAAC,CAAC,CAAA;QACpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC,CAAA;QAC/E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI,EAAE,EAAE,CAAC,CAAA;IAErD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,+DAA+D;QAC/D,MAAM,cAAc,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,GAAG,IAAI,KAAK,CAAC,CAAA;QAC/D,MAAM,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,IAAI,KAAK,CAAC,CAAA;IAClD,CAAC;SAAM,CAAC;QACN,MAAM,cAAc,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,GAAG,IAAI,KAAK,CAAC,CAAA;IACjE,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,QAAgB,EAChB,KAAa,EACb,GAAY;IAEZ,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IACpD,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACxD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAA;IAEjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IACzB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,QAAgB,EAAE,GAAY;IACtD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC,CAAA;IAElE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAA;IAClD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAA;IACxC,IAAI,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAA;IAE/B,mCAAmC;IACnC,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;QACtB,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAA;YACxC,IAAI,WAAW,CAAC,IAAI,GAAG,QAAQ,EAAE,CAAC;gBAChC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,GAAG,QAAQ,CAAC,CAAA;gBACrD,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;gBACpC,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;gBAC3C,MAAM,EAAE,CAAC,KAAK,EAAE,CAAA;gBAChB,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAA;gBAE3B,MAAM,UAAU,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;gBACxC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;gBACpD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;gBACzB,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,8CAA8C;YAC9C,IAAI,CAAC;gBACH,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAA;gBAC9B,QAAQ,GAAG,CAAC,CAAA;YACd,CAAC;YAAC,MAAM,CAAC;gBACP,0BAA0B;gBAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACjB,CAAC;QACH,CAAC;IACH,CAAC,CAAA;IAED,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IAEvC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACxB,aAAa,CAAC,QAAQ,CAAC,CAAA;QACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAA;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC,CAAC,CAAA;IAEF,aAAa;IACb,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,GAAyB,CAAC,CAAC,CAAA;AACpD,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAE,GAAY;IAC9C,IAAI,GAAG,EAAE,CAAC;QACR,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACjB,OAAM;IACR,CAAC;IAED,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA4B,CAAA;QACzD,MAAM,EAAE,GAAG,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;YAC5C,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,kBAAkB,EAAE;YAChD,CAAC,CAAC,EAAE,CAAA;QACN,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QACnE,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAA;QAC3C,MAAM,IAAI,GAAG,EAAE,GAAG,KAAK,EAAE,CAAA;QACzB,OAAO,IAAI,CAAC,SAAS,CAAA;QACrB,OAAO,IAAI,CAAC,KAAK,CAAA;QACjB,OAAO,IAAI,CAAC,OAAO,CAAA;QACnB,OAAO,IAAI,CAAC,SAAS,CAAA;QAErB,MAAM,UAAU,GAAG;YACjB,KAAK,EAAE,KAAK,CAAC,GAAG;YAChB,IAAI,EAAG,KAAK,CAAC,MAAM;YACnB,IAAI,EAAG,KAAK,CAAC,IAAI;YACjB,KAAK,EAAE,KAAK,CAAC,IAAI;SAClB,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,CAAC,KAAK,CAAA;QAE9B,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QAC1F,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,OAAO,GAAG,OAAO,EAAE,CAAC,CAAA;IAC3E,CAAC;IAAC,MAAM,CAAC;QACP,uBAAuB;QACvB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACnB,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function providersAddCommand(providerName?: string): Promise<void>;
2
+ export declare function providersListCommand(): Promise<void>;
3
+ export declare function providersRemoveCommand(name: string): Promise<void>;
4
+ export declare function loadProviderCredentials(name: string): Promise<Record<string, string>>;
5
+ //# sourceMappingURL=providers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../src/commands/providers.ts"],"names":[],"mappings":"AA4CA,wBAAsB,mBAAmB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA2I9E;AAED,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAqD1D;AAED,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBxE;AAED,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAWjC"}