@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.
- package/LICENSE +21 -0
- package/README.md +130 -0
- package/dist/actions/base.d.ts +4 -0
- package/dist/actions/base.d.ts.map +1 -0
- package/dist/actions/base.js +32 -0
- package/dist/actions/base.js.map +1 -0
- package/dist/actions/file.d.ts +7 -0
- package/dist/actions/file.d.ts.map +1 -0
- package/dist/actions/file.js +35 -0
- package/dist/actions/file.js.map +1 -0
- package/dist/actions/github.d.ts +7 -0
- package/dist/actions/github.d.ts.map +1 -0
- package/dist/actions/github.js +125 -0
- package/dist/actions/github.js.map +1 -0
- package/dist/actions/index.d.ts +5 -0
- package/dist/actions/index.d.ts.map +1 -0
- package/dist/actions/index.js +22 -0
- package/dist/actions/index.js.map +1 -0
- package/dist/actions/log.d.ts +7 -0
- package/dist/actions/log.d.ts.map +1 -0
- package/dist/actions/log.js +30 -0
- package/dist/actions/log.js.map +1 -0
- package/dist/actions/notify.d.ts +11 -0
- package/dist/actions/notify.d.ts.map +1 -0
- package/dist/actions/notify.js +34 -0
- package/dist/actions/notify.js.map +1 -0
- package/dist/actions/script.d.ts +7 -0
- package/dist/actions/script.d.ts.map +1 -0
- package/dist/actions/script.js +46 -0
- package/dist/actions/script.js.map +1 -0
- package/dist/actions/slack.d.ts +7 -0
- package/dist/actions/slack.d.ts.map +1 -0
- package/dist/actions/slack.js +47 -0
- package/dist/actions/slack.js.map +1 -0
- package/dist/actions/webhook.d.ts +7 -0
- package/dist/actions/webhook.d.ts.map +1 -0
- package/dist/actions/webhook.js +41 -0
- package/dist/actions/webhook.js.map +1 -0
- package/dist/adapters/clock.d.ts +3 -0
- package/dist/adapters/clock.d.ts.map +1 -0
- package/dist/adapters/clock.js +8 -0
- package/dist/adapters/clock.js.map +1 -0
- package/dist/adapters/fs-kv.d.ts +3 -0
- package/dist/adapters/fs-kv.d.ts.map +1 -0
- package/dist/adapters/fs-kv.js +34 -0
- package/dist/adapters/fs-kv.js.map +1 -0
- package/dist/adapters/keys.d.ts +3 -0
- package/dist/adapters/keys.d.ts.map +1 -0
- package/dist/adapters/keys.js +17 -0
- package/dist/adapters/keys.js.map +1 -0
- package/dist/commands/ensure-provider.d.ts +7 -0
- package/dist/commands/ensure-provider.d.ts.map +1 -0
- package/dist/commands/ensure-provider.js +121 -0
- package/dist/commands/ensure-provider.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +196 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/inspect.d.ts +7 -0
- package/dist/commands/inspect.d.ts.map +1 -0
- package/dist/commands/inspect.js +97 -0
- package/dist/commands/inspect.js.map +1 -0
- package/dist/commands/install.d.ts +3 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +192 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/logs.d.ts +8 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +103 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/providers.d.ts +5 -0
- package/dist/commands/providers.d.ts.map +1 -0
- package/dist/commands/providers.js +251 -0
- package/dist/commands/providers.js.map +1 -0
- package/dist/commands/ps.d.ts +2 -0
- package/dist/commands/ps.d.ts.map +1 -0
- package/dist/commands/ps.js +87 -0
- package/dist/commands/ps.js.map +1 -0
- package/dist/commands/secrets.d.ts +9 -0
- package/dist/commands/secrets.d.ts.map +1 -0
- package/dist/commands/secrets.js +97 -0
- package/dist/commands/secrets.js.map +1 -0
- package/dist/commands/start.d.ts +10 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +238 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +69 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/stop.d.ts +6 -0
- package/dist/commands/stop.d.ts.map +1 -0
- package/dist/commands/stop.js +43 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +253 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/config.d.ts +8 -0
- package/dist/providers/config.d.ts.map +1 -0
- package/dist/providers/config.js +31 -0
- package/dist/providers/config.js.map +1 -0
- package/dist/providers/credentials.d.ts +5 -0
- package/dist/providers/credentials.d.ts.map +1 -0
- package/dist/providers/credentials.js +69 -0
- package/dist/providers/credentials.js.map +1 -0
- package/dist/providers/registry.d.ts +12 -0
- package/dist/providers/registry.d.ts.map +1 -0
- package/dist/providers/registry.js +58 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/providers/secrets.d.ts +9 -0
- package/dist/providers/secrets.d.ts.map +1 -0
- package/dist/providers/secrets.js +44 -0
- package/dist/providers/secrets.js.map +1 -0
- package/dist/providers/system-auth.d.ts +8 -0
- package/dist/providers/system-auth.d.ts.map +1 -0
- package/dist/providers/system-auth.js +168 -0
- package/dist/providers/system-auth.js.map +1 -0
- package/dist/runtime/daemon.d.ts +10 -0
- package/dist/runtime/daemon.d.ts.map +1 -0
- package/dist/runtime/daemon.js +264 -0
- package/dist/runtime/daemon.js.map +1 -0
- package/dist/runtime/supervisor.d.ts +6 -0
- package/dist/runtime/supervisor.d.ts.map +1 -0
- package/dist/runtime/supervisor.js +45 -0
- package/dist/runtime/supervisor.js.map +1 -0
- package/dist/types.d.ts +27 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/logger.d.ts +4 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +44 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/manifest.d.ts +5 -0
- package/dist/utils/manifest.d.ts.map +1 -0
- package/dist/utils/manifest.js +276 -0
- package/dist/utils/manifest.js.map +1 -0
- package/dist/utils/paths.d.ts +13 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +52 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/time.d.ts +11 -0
- package/dist/utils/time.d.ts.map +1 -0
- package/dist/utils/time.js +40 -0
- package/dist/utils/time.js.map +1 -0
- package/dist/watchers/base.d.ts +3 -0
- package/dist/watchers/base.d.ts.map +1 -0
- package/dist/watchers/base.js +20 -0
- package/dist/watchers/base.js.map +1 -0
- package/dist/watchers/filesystem.d.ts +12 -0
- package/dist/watchers/filesystem.d.ts.map +1 -0
- package/dist/watchers/filesystem.js +211 -0
- package/dist/watchers/filesystem.js.map +1 -0
- package/dist/watchers/github.d.ts +3 -0
- package/dist/watchers/github.d.ts.map +1 -0
- package/dist/watchers/github.js +322 -0
- package/dist/watchers/github.js.map +1 -0
- package/dist/watchers/http.d.ts +13 -0
- package/dist/watchers/http.d.ts.map +1 -0
- package/dist/watchers/http.js +149 -0
- package/dist/watchers/http.js.map +1 -0
- package/dist/watchers/index.d.ts +8 -0
- package/dist/watchers/index.d.ts.map +1 -0
- package/dist/watchers/index.js +25 -0
- package/dist/watchers/index.js.map +1 -0
- package/examples/README.md +9 -0
- package/examples/codebase-guardian.yaml +22 -0
- package/examples/competitor-watch.yaml +18 -0
- package/examples/founder-sentinel.md +126 -0
- package/examples/founder-sentinel.yaml +27 -0
- package/package.json +62 -0
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* daemon.ts — Entry point for the daemon child process.
|
|
3
|
+
*
|
|
4
|
+
* Invoked as:
|
|
5
|
+
* node dist/runtime/daemon.js <manifestPath> <stateFilePath>
|
|
6
|
+
*
|
|
7
|
+
* The CLI spawns this as a detached background process.
|
|
8
|
+
*/
|
|
9
|
+
import fs from 'fs-extra';
|
|
10
|
+
import { homedir } from 'os';
|
|
11
|
+
import { createLogger } from '../utils/logger.js';
|
|
12
|
+
import { ensureAll, memoryDir } from '../utils/paths.js';
|
|
13
|
+
import { buildWatcher } from '../watchers/index.js';
|
|
14
|
+
import { getActionProvider } from '../actions/index.js';
|
|
15
|
+
import { createLLMProvider, runLoop } from '@josharsh/demon';
|
|
16
|
+
import { createFsKV } from '../adapters/fs-kv.js';
|
|
17
|
+
import { createNodeClock } from '../adapters/clock.js';
|
|
18
|
+
import { resolveKeysFromEnv } from '../adapters/keys.js';
|
|
19
|
+
import { withSupervision } from './supervisor.js';
|
|
20
|
+
import { join } from 'path';
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
// Inject ~/.demon/secrets/*.json into process.env before any provider init.
|
|
23
|
+
// This is how `demon secrets set ANTHROPIC_API_KEY` reaches the LLM resolver.
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
async function injectSecretsIntoEnv() {
|
|
26
|
+
const dir = join(homedir(), '.demon', 'secrets');
|
|
27
|
+
if (!(await fs.pathExists(dir)))
|
|
28
|
+
return;
|
|
29
|
+
const files = await fs.readdir(dir).catch(() => []);
|
|
30
|
+
for (const file of files) {
|
|
31
|
+
if (!file.endsWith('.json'))
|
|
32
|
+
continue;
|
|
33
|
+
try {
|
|
34
|
+
const record = await fs.readJson(join(dir, file));
|
|
35
|
+
if (record.key && record.value && !process.env[record.key]) {
|
|
36
|
+
process.env[record.key] = record.value;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch { }
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
// Inline credential loader — avoids importing from commands/ (circular dep)
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
async function loadProviderCredentials(name) {
|
|
46
|
+
const file = join(homedir(), '.demon', 'providers', `${name}.json`);
|
|
47
|
+
if (!(await fs.pathExists(file)))
|
|
48
|
+
return {};
|
|
49
|
+
try {
|
|
50
|
+
const record = await fs.readJson(file);
|
|
51
|
+
return record.credentials ?? {};
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return {};
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
// Bootstrap
|
|
59
|
+
// ---------------------------------------------------------------------------
|
|
60
|
+
async function main() {
|
|
61
|
+
const manifestPath = process.argv[2];
|
|
62
|
+
const stateFilePath = process.argv[3];
|
|
63
|
+
if (!manifestPath || !stateFilePath) {
|
|
64
|
+
console.error('[daemon] Usage: daemon.js <manifestPath> <stateFilePath>');
|
|
65
|
+
process.exit(1);
|
|
66
|
+
}
|
|
67
|
+
// Ensure ~/.demon dirs exist
|
|
68
|
+
await ensureAll();
|
|
69
|
+
// Load secrets from ~/.demon/secrets/ into process.env so LLM/provider
|
|
70
|
+
// resolvers can find keys set via `demon secrets set <KEY>`
|
|
71
|
+
await injectSecretsIntoEnv();
|
|
72
|
+
// Read manifest
|
|
73
|
+
let manifest;
|
|
74
|
+
try {
|
|
75
|
+
manifest = await fs.readJson(manifestPath);
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
console.error(`[daemon] Failed to read manifest from ${manifestPath}: ${err.message}`);
|
|
79
|
+
process.exit(1);
|
|
80
|
+
}
|
|
81
|
+
// Read initial state
|
|
82
|
+
let state;
|
|
83
|
+
try {
|
|
84
|
+
state = await fs.readJson(stateFilePath);
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
console.error(`[daemon] Failed to read state from ${stateFilePath}: ${err.message}`);
|
|
88
|
+
process.exit(1);
|
|
89
|
+
}
|
|
90
|
+
// Set up logger
|
|
91
|
+
const logger = createLogger(manifest.name);
|
|
92
|
+
logger.info('Daemon process started', {
|
|
93
|
+
pid: process.pid,
|
|
94
|
+
manifestPath,
|
|
95
|
+
stateFilePath,
|
|
96
|
+
model: manifest.model,
|
|
97
|
+
actionMode: manifest.action_mode,
|
|
98
|
+
interval: manifest.interval,
|
|
99
|
+
});
|
|
100
|
+
// Ensure memory dir for this demon
|
|
101
|
+
await fs.ensureDir(join(memoryDir(), manifest.name));
|
|
102
|
+
// Write running state immediately so CLI can see us
|
|
103
|
+
state = { ...state, pid: process.pid, status: 'running' };
|
|
104
|
+
await writeState(stateFilePath, state, logger);
|
|
105
|
+
// ---------------------------------------------------------------------------
|
|
106
|
+
// Initialize LLM provider (core engine — keys resolved from process.env,
|
|
107
|
+
// which was populated from ~/.demon/secrets + providers at bootstrap)
|
|
108
|
+
// ---------------------------------------------------------------------------
|
|
109
|
+
let llm;
|
|
110
|
+
try {
|
|
111
|
+
llm = createLLMProvider(manifest.model, resolveKeysFromEnv());
|
|
112
|
+
logger.info(`LLM provider initialized: ${llm.name} / ${llm.model}`);
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
const errMsg = err.message;
|
|
116
|
+
logger.error('Failed to initialize LLM provider', { error: errMsg });
|
|
117
|
+
state = { ...state, status: 'error' };
|
|
118
|
+
await writeState(stateFilePath, state, logger);
|
|
119
|
+
process.exit(1);
|
|
120
|
+
}
|
|
121
|
+
// ---------------------------------------------------------------------------
|
|
122
|
+
// Initialize watchers
|
|
123
|
+
// ---------------------------------------------------------------------------
|
|
124
|
+
const watchers = manifest.watch.map(cfg => {
|
|
125
|
+
try {
|
|
126
|
+
return buildWatcher(cfg);
|
|
127
|
+
}
|
|
128
|
+
catch (err) {
|
|
129
|
+
logger.error(`Failed to build watcher of type "${cfg.type}"`, {
|
|
130
|
+
error: err.message,
|
|
131
|
+
config: cfg,
|
|
132
|
+
});
|
|
133
|
+
throw err;
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
logger.info(`${watchers.length} watcher(s) initialized`);
|
|
137
|
+
// ---------------------------------------------------------------------------
|
|
138
|
+
// Initialize action providers and pre-load credentials
|
|
139
|
+
// ---------------------------------------------------------------------------
|
|
140
|
+
const actions = new Map();
|
|
141
|
+
const credentials = new Map();
|
|
142
|
+
const providerNames = [...new Set(manifest.actions.map(a => a.provider))];
|
|
143
|
+
for (const providerName of providerNames) {
|
|
144
|
+
try {
|
|
145
|
+
actions.set(providerName, getActionProvider(providerName));
|
|
146
|
+
const creds = await loadProviderCredentials(providerName);
|
|
147
|
+
credentials.set(providerName, creds);
|
|
148
|
+
logger.debug(`Action provider ready: ${providerName}`);
|
|
149
|
+
}
|
|
150
|
+
catch (err) {
|
|
151
|
+
// Non-fatal: log and continue. Missing creds will be caught at execution time.
|
|
152
|
+
logger.warn(`Could not fully initialize provider "${providerName}"`, {
|
|
153
|
+
error: err.message,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// ---------------------------------------------------------------------------
|
|
158
|
+
// Shared mutable state helpers
|
|
159
|
+
// ---------------------------------------------------------------------------
|
|
160
|
+
// stateUpdater is called by the loop after each meaningful change.
|
|
161
|
+
// actionsCount: undefined is a sentinel meaning "increment by 1".
|
|
162
|
+
const stateUpdater = (updates) => {
|
|
163
|
+
const newActionsCount = updates.actionsCount === undefined && 'actionsCount' in updates
|
|
164
|
+
? state.actionsCount + 1 // increment sentinel
|
|
165
|
+
: updates.actionsCount !== undefined
|
|
166
|
+
? updates.actionsCount
|
|
167
|
+
: state.actionsCount;
|
|
168
|
+
state = {
|
|
169
|
+
...state,
|
|
170
|
+
...updates,
|
|
171
|
+
actionsCount: newActionsCount,
|
|
172
|
+
};
|
|
173
|
+
// Fire-and-forget state write — errors are logged, loop continues
|
|
174
|
+
writeState(stateFilePath, state, logger).catch(err => {
|
|
175
|
+
logger.error('Failed to write state', { error: err.message });
|
|
176
|
+
});
|
|
177
|
+
};
|
|
178
|
+
// ---------------------------------------------------------------------------
|
|
179
|
+
// SIGTERM handler — finish current cycle, then exit cleanly
|
|
180
|
+
// ---------------------------------------------------------------------------
|
|
181
|
+
let sigtermReceived = false;
|
|
182
|
+
process.on('SIGTERM', () => {
|
|
183
|
+
sigtermReceived = true;
|
|
184
|
+
logger.info('SIGTERM received — will exit after current cycle completes');
|
|
185
|
+
// Mark as stopped in state so CLI shows it correctly
|
|
186
|
+
state = { ...state, status: 'stopped' };
|
|
187
|
+
writeState(stateFilePath, state, logger).catch(() => { });
|
|
188
|
+
// Give the loop up to 30s to finish its current cycle, then force exit
|
|
189
|
+
setTimeout(() => {
|
|
190
|
+
logger.info('Graceful shutdown timeout reached, forcing exit');
|
|
191
|
+
process.exit(0);
|
|
192
|
+
}, 30_000).unref();
|
|
193
|
+
});
|
|
194
|
+
process.on('SIGINT', () => {
|
|
195
|
+
sigtermReceived = true;
|
|
196
|
+
logger.info('SIGINT received — shutting down');
|
|
197
|
+
state = { ...state, status: 'stopped' };
|
|
198
|
+
writeState(stateFilePath, state, logger).catch(() => { });
|
|
199
|
+
process.exit(0);
|
|
200
|
+
});
|
|
201
|
+
// ---------------------------------------------------------------------------
|
|
202
|
+
// Uncaught exception handler — log and attempt to continue (supervisor will restart)
|
|
203
|
+
// ---------------------------------------------------------------------------
|
|
204
|
+
process.on('uncaughtException', (err) => {
|
|
205
|
+
logger.error('Uncaught exception', {
|
|
206
|
+
error: err.message,
|
|
207
|
+
stack: err.stack,
|
|
208
|
+
});
|
|
209
|
+
// Do not exit — let the supervisor handle restarts
|
|
210
|
+
});
|
|
211
|
+
process.on('unhandledRejection', (reason) => {
|
|
212
|
+
const msg = reason instanceof Error ? reason.message : String(reason);
|
|
213
|
+
logger.error('Unhandled promise rejection', { error: msg });
|
|
214
|
+
// Do not exit — let the supervisor handle restarts
|
|
215
|
+
});
|
|
216
|
+
// ---------------------------------------------------------------------------
|
|
217
|
+
// Build loop config and enter the supervised observation loop
|
|
218
|
+
// ---------------------------------------------------------------------------
|
|
219
|
+
const loopConfig = {
|
|
220
|
+
manifest,
|
|
221
|
+
watchers,
|
|
222
|
+
llm,
|
|
223
|
+
actions,
|
|
224
|
+
credentials,
|
|
225
|
+
logger,
|
|
226
|
+
clock: createNodeClock(),
|
|
227
|
+
storage: createFsKV(manifest.name),
|
|
228
|
+
onState: stateUpdater,
|
|
229
|
+
startCycle: state.cycles,
|
|
230
|
+
};
|
|
231
|
+
logger.info('Entering supervised observation loop');
|
|
232
|
+
await withSupervision(async () => {
|
|
233
|
+
// If SIGTERM was received between restarts, exit cleanly
|
|
234
|
+
if (sigtermReceived) {
|
|
235
|
+
logger.info('Shutdown flag set — not restarting loop');
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
await runLoop(loopConfig);
|
|
239
|
+
}, 10);
|
|
240
|
+
// Loop exited (supervisor gave up or fn resolved) — update state and exit
|
|
241
|
+
state = { ...state, status: 'stopped' };
|
|
242
|
+
await writeState(stateFilePath, state, logger);
|
|
243
|
+
logger.info('Daemon exiting');
|
|
244
|
+
process.exit(0);
|
|
245
|
+
}
|
|
246
|
+
// ---------------------------------------------------------------------------
|
|
247
|
+
// Helpers
|
|
248
|
+
// ---------------------------------------------------------------------------
|
|
249
|
+
async function writeState(stateFilePath, state, logger) {
|
|
250
|
+
try {
|
|
251
|
+
await fs.writeJson(stateFilePath, state, { spaces: 2 });
|
|
252
|
+
}
|
|
253
|
+
catch (err) {
|
|
254
|
+
logger.error('writeState failed', { error: err.message });
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
// ---------------------------------------------------------------------------
|
|
258
|
+
// Run
|
|
259
|
+
// ---------------------------------------------------------------------------
|
|
260
|
+
main().catch(err => {
|
|
261
|
+
console.error('[daemon] Fatal startup error:', err);
|
|
262
|
+
process.exit(1);
|
|
263
|
+
});
|
|
264
|
+
//# sourceMappingURL=daemon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/runtime/daemon.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-process supervisor that keeps the observation loop alive.
|
|
3
|
+
* Retries with exponential backoff on failure up to maxRestarts times.
|
|
4
|
+
*/
|
|
5
|
+
export declare function withSupervision(fn: () => Promise<void>, maxRestarts?: number): Promise<void>;
|
|
6
|
+
//# sourceMappingURL=supervisor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supervisor.d.ts","sourceRoot":"","sources":["../../src/runtime/supervisor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAcH,wBAAsB,eAAe,CACnC,EAAE,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EACvB,WAAW,GAAE,MAAW,GACvB,OAAO,CAAC,IAAI,CAAC,CAqCf"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-process supervisor that keeps the observation loop alive.
|
|
3
|
+
* Retries with exponential backoff on failure up to maxRestarts times.
|
|
4
|
+
*/
|
|
5
|
+
const MIN_BACKOFF_MS = 1_000;
|
|
6
|
+
const MAX_BACKOFF_MS = 5 * 60 * 1_000; // 5 minutes
|
|
7
|
+
function sleep(ms) {
|
|
8
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
9
|
+
}
|
|
10
|
+
function backoffMs(attempt) {
|
|
11
|
+
const delay = MIN_BACKOFF_MS * Math.pow(2, attempt);
|
|
12
|
+
return Math.min(delay, MAX_BACKOFF_MS);
|
|
13
|
+
}
|
|
14
|
+
export async function withSupervision(fn, maxRestarts = 10) {
|
|
15
|
+
let restarts = 0;
|
|
16
|
+
while (true) {
|
|
17
|
+
try {
|
|
18
|
+
await fn();
|
|
19
|
+
// fn resolved normally (shouldn't happen for an infinite loop, but handle it)
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
catch (err) {
|
|
23
|
+
restarts++;
|
|
24
|
+
const errMsg = err instanceof Error ? err.message : String(err);
|
|
25
|
+
const errStack = err instanceof Error ? err.stack : undefined;
|
|
26
|
+
if (restarts > maxRestarts) {
|
|
27
|
+
console.error(`[supervisor] Fatal: loop failed ${restarts} time(s), ` +
|
|
28
|
+
`exceeded maxRestarts (${maxRestarts}). Giving up.`);
|
|
29
|
+
console.error(`[supervisor] Last error: ${errMsg}`);
|
|
30
|
+
if (errStack)
|
|
31
|
+
console.error(errStack);
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
const delay = backoffMs(restarts - 1);
|
|
35
|
+
const delaySeconds = (delay / 1000).toFixed(1);
|
|
36
|
+
console.error(`[supervisor] Loop crashed (restart ${restarts}/${maxRestarts}): ${errMsg}`);
|
|
37
|
+
if (errStack)
|
|
38
|
+
console.error(`[supervisor] Stack: ${errStack}`);
|
|
39
|
+
console.error(`[supervisor] Restarting in ${delaySeconds}s...`);
|
|
40
|
+
await sleep(delay);
|
|
41
|
+
console.error(`[supervisor] Restarting loop now (attempt ${restarts + 1})...`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=supervisor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../../src/runtime/supervisor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,cAAc,GAAG,KAAK,CAAA;AAC5B,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,GAAG,KAAK,CAAA,CAAC,YAAY;AAElD,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;AACxD,CAAC;AAED,SAAS,SAAS,CAAC,OAAe;IAChC,MAAM,KAAK,GAAG,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;IACnD,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,cAAc,CAAC,CAAA;AACxC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,EAAuB,EACvB,cAAsB,EAAE;IAExB,IAAI,QAAQ,GAAG,CAAC,CAAA;IAEhB,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,MAAM,EAAE,EAAE,CAAA;YACV,8EAA8E;YAC9E,OAAM;QACR,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,EAAE,CAAA;YACV,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YAC/D,MAAM,QAAQ,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;YAE7D,IAAI,QAAQ,GAAG,WAAW,EAAE,CAAC;gBAC3B,OAAO,CAAC,KAAK,CACX,mCAAmC,QAAQ,YAAY;oBACvD,yBAAyB,WAAW,eAAe,CACpD,CAAA;gBACD,OAAO,CAAC,KAAK,CAAC,4BAA4B,MAAM,EAAE,CAAC,CAAA;gBACnD,IAAI,QAAQ;oBAAE,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;gBACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACjB,CAAC;YAED,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAA;YACrC,MAAM,YAAY,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;YAE9C,OAAO,CAAC,KAAK,CACX,sCAAsC,QAAQ,IAAI,WAAW,MAAM,MAAM,EAAE,CAC5E,CAAA;YACD,IAAI,QAAQ;gBAAE,OAAO,CAAC,KAAK,CAAC,uBAAuB,QAAQ,EAAE,CAAC,CAAA;YAC9D,OAAO,CAAC,KAAK,CAAC,8BAA8B,YAAY,MAAM,CAAC,CAAA;YAE/D,MAAM,KAAK,CAAC,KAAK,CAAC,CAAA;YAElB,OAAO,CAAC,KAAK,CAAC,6CAA6C,QAAQ,GAAG,CAAC,MAAM,CAAC,CAAA;QAChF,CAAC;IACH,CAAC;AACH,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export * from '@josharsh/demon';
|
|
2
|
+
import type { DemonStatus, ActionMode } from '@josharsh/demon';
|
|
3
|
+
export interface DemonProcess {
|
|
4
|
+
pid: number;
|
|
5
|
+
name: string;
|
|
6
|
+
status: DemonStatus;
|
|
7
|
+
startedAt: Date;
|
|
8
|
+
cycles: number;
|
|
9
|
+
actionsCount: number;
|
|
10
|
+
lastCheck: Date | null;
|
|
11
|
+
nextCheck: Date | null;
|
|
12
|
+
manifestPath: string;
|
|
13
|
+
model: string;
|
|
14
|
+
actionMode: ActionMode;
|
|
15
|
+
}
|
|
16
|
+
export interface ProviderCredentials {
|
|
17
|
+
name: string;
|
|
18
|
+
type: 'api_key' | 'oauth_token' | 'webhook_url';
|
|
19
|
+
credentials: Record<string, string>;
|
|
20
|
+
addedAt: string;
|
|
21
|
+
}
|
|
22
|
+
export interface GlobalConfig {
|
|
23
|
+
defaultModel: string;
|
|
24
|
+
defaultProvider: string;
|
|
25
|
+
demonDir: string;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAMA,cAAc,iBAAiB,CAAA;AAE/B,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAI9D,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,WAAW,CAAA;IACnB,SAAS,EAAE,IAAI,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,IAAI,GAAG,IAAI,CAAA;IACtB,SAAS,EAAE,IAAI,GAAG,IAAI,CAAA;IACtB,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,UAAU,CAAA;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,SAAS,GAAG,aAAa,GAAG,aAAa,CAAA;IAC/C,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACnC,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAA;IACpB,eAAe,EAAE,MAAM,CAAA;IACvB,QAAQ,EAAE,MAAM,CAAA;CACjB"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// CLI types — the shared domain types now live in the core engine.
|
|
3
|
+
// Re-export them so existing `import { X } from '../types.js'` keeps working
|
|
4
|
+
// with a single source of truth, then add the CLI-only (Node host) types.
|
|
5
|
+
// ============================================================================
|
|
6
|
+
export * from '@josharsh/demon';
|
|
7
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,mEAAmE;AACnE,6EAA6E;AAC7E,0EAA0E;AAC1E,+EAA+E;AAE/E,cAAc,iBAAiB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAA;AA8B7B,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAwB9D;AAED,MAAM,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAA"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import winston from 'winston';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { logPath, ensureAll } from './paths.js';
|
|
4
|
+
const { createLogger: winstonCreateLogger, format, transports } = winston;
|
|
5
|
+
function colorize(level, message) {
|
|
6
|
+
switch (level) {
|
|
7
|
+
case 'error': return chalk.red(message);
|
|
8
|
+
case 'warn': return chalk.yellow(message);
|
|
9
|
+
case 'info': return chalk.cyan(message);
|
|
10
|
+
case 'debug': return chalk.gray(message);
|
|
11
|
+
default: return message;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
const consoleFormat = format.printf(({ level, message, timestamp, demonName, ...rest }) => {
|
|
15
|
+
const ts = typeof timestamp === 'string' ? new Date(timestamp).toLocaleTimeString() : '';
|
|
16
|
+
const prefix = demonName ? chalk.magenta(`[${demonName}]`) : '';
|
|
17
|
+
const lvl = colorize(level, level.toUpperCase().padEnd(5));
|
|
18
|
+
const msg = colorize(level, String(message));
|
|
19
|
+
const extra = Object.keys(rest).length > 0 ? chalk.gray(' ' + JSON.stringify(rest)) : '';
|
|
20
|
+
return `${chalk.dim(ts)} ${lvl} ${prefix} ${msg}${extra}`;
|
|
21
|
+
});
|
|
22
|
+
const fileFormat = format.combine(format.timestamp(), format.json());
|
|
23
|
+
export function createLogger(demonName) {
|
|
24
|
+
// Ensure dirs exist synchronously enough — fire and forget, logger construction is sync
|
|
25
|
+
ensureAll().catch(() => { });
|
|
26
|
+
return winstonCreateLogger({
|
|
27
|
+
level: process.env.DEMON_LOG_LEVEL ?? 'info',
|
|
28
|
+
defaultMeta: { demonName },
|
|
29
|
+
transports: [
|
|
30
|
+
new transports.File({
|
|
31
|
+
filename: logPath(demonName),
|
|
32
|
+
format: fileFormat,
|
|
33
|
+
maxsize: 10 * 1024 * 1024, // 10 MB
|
|
34
|
+
maxFiles: 3,
|
|
35
|
+
tailable: true,
|
|
36
|
+
}),
|
|
37
|
+
new transports.Console({
|
|
38
|
+
format: format.combine(format.timestamp(), consoleFormat),
|
|
39
|
+
stderrLevels: ['error'],
|
|
40
|
+
}),
|
|
41
|
+
],
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { DemonManifest, LLMProvider } from '../types.js';
|
|
2
|
+
export declare function parseManifestFile(filePath: string): Promise<DemonManifest>;
|
|
3
|
+
export declare function parseManifestNL(intent: string, llmProvider: LLMProvider): Promise<DemonManifest>;
|
|
4
|
+
export declare function validateManifest(manifest: unknown): DemonManifest;
|
|
5
|
+
//# sourceMappingURL=manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/utils/manifest.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,WAAW,EAA2B,MAAM,aAAa,CAAA;AAQjF,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CA4BhF;AAoDD,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC,aAAa,CAAC,CAwDxB;AAyFD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,OAAO,GAAG,aAAa,CA8EjE"}
|