@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,276 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import yaml from 'js-yaml';
|
|
3
|
+
const VALID_WATCHER_TYPES = [
|
|
4
|
+
'github_prs', 'github_ci', 'github_commits', 'http', 'filesystem'
|
|
5
|
+
];
|
|
6
|
+
const VALID_ACTION_MODES = ['dry_run', 'cautious', 'auto'];
|
|
7
|
+
export async function parseManifestFile(filePath) {
|
|
8
|
+
const resolved = filePath.startsWith('~')
|
|
9
|
+
? filePath.replace('~', process.env.HOME ?? '')
|
|
10
|
+
: filePath;
|
|
11
|
+
if (!(await fs.pathExists(resolved))) {
|
|
12
|
+
throw new Error(`Manifest file not found: ${filePath}`);
|
|
13
|
+
}
|
|
14
|
+
const raw = await fs.readFile(resolved, 'utf-8');
|
|
15
|
+
let parsed;
|
|
16
|
+
if (resolved.endsWith('.json')) {
|
|
17
|
+
try {
|
|
18
|
+
parsed = JSON.parse(raw);
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
throw new Error(`Failed to parse JSON manifest: ${err.message}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
// Default to YAML (also handles .yaml and .yml)
|
|
26
|
+
try {
|
|
27
|
+
parsed = yaml.load(raw);
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
throw new Error(`Failed to parse YAML manifest: ${err.message}`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return validateManifest(parsed);
|
|
34
|
+
}
|
|
35
|
+
// JSON Schema for the manifest — used by both Anthropic tool use and OpenAI json_schema.
|
|
36
|
+
// Kept simple: no oneOf/anyOf so it works with strict:true on all providers.
|
|
37
|
+
const MANIFEST_SCHEMA = {
|
|
38
|
+
type: 'object',
|
|
39
|
+
properties: {
|
|
40
|
+
name: { type: 'string', description: 'slug-case name, e.g. "file-watcher"' },
|
|
41
|
+
purpose: { type: 'string', description: 'One sentence: what this demon watches for and why' },
|
|
42
|
+
watch: {
|
|
43
|
+
type: 'array',
|
|
44
|
+
items: {
|
|
45
|
+
type: 'object',
|
|
46
|
+
properties: {
|
|
47
|
+
type: { type: 'string', enum: ['filesystem', 'http', 'github_prs', 'github_ci', 'github_commits'] },
|
|
48
|
+
path: { type: 'string', description: 'Required for filesystem type' },
|
|
49
|
+
url: { type: 'string', description: 'Required for http type' },
|
|
50
|
+
repo: { type: 'string', description: 'Required for github_* types, format: owner/repo' },
|
|
51
|
+
},
|
|
52
|
+
required: ['type'],
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
interval: { type: 'string', description: 'e.g. "30s", "1m", "15m", "1h"' },
|
|
56
|
+
actions: {
|
|
57
|
+
type: 'array',
|
|
58
|
+
items: {
|
|
59
|
+
type: 'object',
|
|
60
|
+
properties: {
|
|
61
|
+
provider: { type: 'string', enum: ['notify', 'log', 'slack', 'github', 'webhook', 'script'] },
|
|
62
|
+
action: { type: 'string', description: 'notify→send, log→info, slack→send_message, github→post_comment, webhook→post, script→run' },
|
|
63
|
+
},
|
|
64
|
+
required: ['provider', 'action'],
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
model: { type: 'string' },
|
|
68
|
+
action_mode: { type: 'string', enum: ['dry_run', 'cautious', 'auto'] },
|
|
69
|
+
},
|
|
70
|
+
required: ['name', 'purpose', 'watch', 'interval', 'actions', 'model', 'action_mode'],
|
|
71
|
+
additionalProperties: false,
|
|
72
|
+
};
|
|
73
|
+
const MANIFEST_PROMPT = (intent) => `Generate a demon manifest for this intent: "${intent}"
|
|
74
|
+
|
|
75
|
+
Rules:
|
|
76
|
+
- notify/send for any "notify me", "remind me", "alert me" on Mac
|
|
77
|
+
- filesystem watcher for local path changes
|
|
78
|
+
- http watcher for URL polling
|
|
79
|
+
- github_* watchers for GitHub repos
|
|
80
|
+
- interval: "30s" for quick checks, "1m"-"15m" for monitoring, "1h" for infrequent
|
|
81
|
+
- action_mode: "auto" for alerts/reminders, "dry_run" for monitoring
|
|
82
|
+
- model: "claude-sonnet-4-6"`;
|
|
83
|
+
export async function parseManifestNL(intent, llmProvider) {
|
|
84
|
+
const MAX_RETRIES = 3;
|
|
85
|
+
const prompt = MANIFEST_PROMPT(intent);
|
|
86
|
+
const messages = [
|
|
87
|
+
{ role: 'user', content: prompt },
|
|
88
|
+
];
|
|
89
|
+
let lastError = new Error('Unknown error');
|
|
90
|
+
for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {
|
|
91
|
+
let parsed;
|
|
92
|
+
try {
|
|
93
|
+
// Prefer provider-native structured output (tool use / json_schema)
|
|
94
|
+
if (llmProvider.callStructured) {
|
|
95
|
+
parsed = await llmProvider.callStructured(MANIFEST_SCHEMA, 'create_demon_manifest', messages[messages.length - 1].content);
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
// Fallback: prompt-based with JSON extraction
|
|
99
|
+
const raw = await llmProvider.call(messages.map(m => ({ role: m.role, content: m.content })), 'You are a manifest generator. Return ONLY valid JSON, no markdown.');
|
|
100
|
+
const cleaned = raw.replace(/^```(?:json)?\n?/m, '').replace(/\n?```$/m, '').trim();
|
|
101
|
+
const jsonStart = cleaned.indexOf('{');
|
|
102
|
+
const jsonEnd = cleaned.lastIndexOf('}');
|
|
103
|
+
parsed = JSON.parse(cleaned.slice(jsonStart, jsonEnd + 1));
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
lastError = err;
|
|
108
|
+
if (attempt < MAX_RETRIES) {
|
|
109
|
+
messages.push({ role: 'assistant', content: String(err) }, { role: 'user', content: `Error: ${err.message}. Please try again with valid output.` });
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
throw new Error(`Failed to get structured output after ${MAX_RETRIES} attempts: ${lastError.message}`);
|
|
113
|
+
}
|
|
114
|
+
// Heal then validate
|
|
115
|
+
parsed = healManifest(parsed);
|
|
116
|
+
try {
|
|
117
|
+
return validateManifest(parsed);
|
|
118
|
+
}
|
|
119
|
+
catch (validErr) {
|
|
120
|
+
lastError = validErr;
|
|
121
|
+
if (attempt < MAX_RETRIES) {
|
|
122
|
+
// Feed the validation error back — this is the Instructor retry pattern
|
|
123
|
+
messages.push({ role: 'assistant', content: JSON.stringify(parsed) }, { role: 'user', content: `Schema validation failed: ${lastError.message}\n\nFix the manifest and return corrected JSON.` });
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
throw new Error(`Manifest validation failed after ${MAX_RETRIES} attempts: ${lastError.message}`);
|
|
128
|
+
}
|
|
129
|
+
const DEFAULT_ACTIONS = {
|
|
130
|
+
notify: 'send',
|
|
131
|
+
log: 'info',
|
|
132
|
+
slack: 'send_message',
|
|
133
|
+
github: 'post_comment',
|
|
134
|
+
webhook: 'post',
|
|
135
|
+
script: 'run',
|
|
136
|
+
file: 'write',
|
|
137
|
+
};
|
|
138
|
+
// Canonical watcher type from any common LLM variant
|
|
139
|
+
const WATCHER_TYPE_MAP = {
|
|
140
|
+
// filesystem variants
|
|
141
|
+
filesystem: 'filesystem', file_change: 'filesystem', file_changes: 'filesystem',
|
|
142
|
+
file: 'filesystem', files: 'filesystem', directory: 'filesystem', dir: 'filesystem',
|
|
143
|
+
folder: 'filesystem', local: 'filesystem', local_file: 'filesystem',
|
|
144
|
+
local_directory: 'filesystem', watch_files: 'filesystem', file_watcher: 'filesystem',
|
|
145
|
+
// http variants
|
|
146
|
+
http: 'http', url: 'http', url_poll: 'http', website: 'http',
|
|
147
|
+
endpoint: 'http', api: 'http', poll: 'http', web: 'http',
|
|
148
|
+
// github variants
|
|
149
|
+
github_prs: 'github_prs', github_pr: 'github_prs', pull_request: 'github_prs',
|
|
150
|
+
pull_requests: 'github_prs', github_pull_request: 'github_prs',
|
|
151
|
+
github_ci: 'github_ci', github_actions: 'github_ci', github_action: 'github_ci',
|
|
152
|
+
github_workflow: 'github_ci', ci: 'github_ci', actions: 'github_ci',
|
|
153
|
+
github_commits: 'github_commits', github_commit: 'github_commits',
|
|
154
|
+
git_commits: 'github_commits', commits: 'github_commits',
|
|
155
|
+
};
|
|
156
|
+
function healManifest(raw) {
|
|
157
|
+
if (typeof raw !== 'object' || raw === null || Array.isArray(raw))
|
|
158
|
+
return raw;
|
|
159
|
+
const m = raw;
|
|
160
|
+
// ── Heal watch array ────────────────────────────────────────────────────────
|
|
161
|
+
if (!Array.isArray(m.watch) || m.watch.length === 0) {
|
|
162
|
+
// LLM forgot watch — add a log-only placeholder so validation gives a
|
|
163
|
+
// better error downstream rather than a generic "must be non-empty" crash
|
|
164
|
+
m.watch = [{ type: 'filesystem', path: process.env.HOME ?? '/tmp' }];
|
|
165
|
+
}
|
|
166
|
+
m.watch = m.watch.map((w) => {
|
|
167
|
+
if (typeof w !== 'object' || w === null)
|
|
168
|
+
return w;
|
|
169
|
+
const watcher = w;
|
|
170
|
+
const rawType = String(watcher.type ?? '').toLowerCase().replace(/-/g, '_');
|
|
171
|
+
const canonical = WATCHER_TYPE_MAP[rawType];
|
|
172
|
+
if (canonical)
|
|
173
|
+
watcher.type = canonical;
|
|
174
|
+
// Fill required fields with sensible defaults
|
|
175
|
+
if (watcher.type === 'filesystem' && !watcher.path) {
|
|
176
|
+
watcher.path = process.env.HOME ?? '/tmp';
|
|
177
|
+
}
|
|
178
|
+
return watcher;
|
|
179
|
+
});
|
|
180
|
+
// ── Heal actions array ──────────────────────────────────────────────────────
|
|
181
|
+
if (!Array.isArray(m.actions) || m.actions.length === 0) {
|
|
182
|
+
m.actions = [{ provider: 'log', action: 'info' }];
|
|
183
|
+
}
|
|
184
|
+
m.actions = m.actions.map((a) => {
|
|
185
|
+
if (typeof a !== 'object' || a === null)
|
|
186
|
+
return a;
|
|
187
|
+
const action = a;
|
|
188
|
+
const provider = String(action.provider ?? '').toLowerCase();
|
|
189
|
+
// Normalise provider name variants
|
|
190
|
+
const providerMap = {
|
|
191
|
+
macos: 'notify', osx: 'notify', notification: 'notify', notifications: 'notify',
|
|
192
|
+
'mac-notification': 'notify', mac_notification: 'notify', mac: 'notify',
|
|
193
|
+
desktop: 'notify', alert: 'notify',
|
|
194
|
+
};
|
|
195
|
+
if (providerMap[provider])
|
|
196
|
+
action.provider = providerMap[provider];
|
|
197
|
+
const resolved = String(action.provider ?? '').toLowerCase();
|
|
198
|
+
if (!action.action || String(action.action).trim() === '') {
|
|
199
|
+
action.action = DEFAULT_ACTIONS[resolved] ?? 'send';
|
|
200
|
+
}
|
|
201
|
+
return action;
|
|
202
|
+
});
|
|
203
|
+
// ── Heal scalar fields ──────────────────────────────────────────────────────
|
|
204
|
+
if (!VALID_ACTION_MODES.includes(m.action_mode))
|
|
205
|
+
m.action_mode = 'auto';
|
|
206
|
+
if (!m.model)
|
|
207
|
+
m.model = 'claude-sonnet-4-6';
|
|
208
|
+
if (!m.interval)
|
|
209
|
+
m.interval = '15m';
|
|
210
|
+
return m;
|
|
211
|
+
}
|
|
212
|
+
export function validateManifest(manifest) {
|
|
213
|
+
if (typeof manifest !== 'object' || manifest === null || Array.isArray(manifest)) {
|
|
214
|
+
throw new Error('Manifest must be a non-null object');
|
|
215
|
+
}
|
|
216
|
+
const m = manifest;
|
|
217
|
+
// Required string fields
|
|
218
|
+
for (const field of ['name', 'purpose', 'interval', 'model']) {
|
|
219
|
+
if (typeof m[field] !== 'string' || m[field].trim() === '') {
|
|
220
|
+
throw new Error(`Manifest field "${field}" must be a non-empty string`);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
// name: slug format
|
|
224
|
+
const name = m.name.trim();
|
|
225
|
+
if (!/^[a-z0-9][a-z0-9-]*[a-z0-9]$|^[a-z0-9]$/.test(name)) {
|
|
226
|
+
throw new Error(`Manifest "name" must be slug-case (lowercase letters, digits, hyphens): "${name}"`);
|
|
227
|
+
}
|
|
228
|
+
// action_mode
|
|
229
|
+
if (!VALID_ACTION_MODES.includes(m.action_mode)) {
|
|
230
|
+
throw new Error(`Manifest "action_mode" must be one of: ${VALID_ACTION_MODES.join(', ')}. Got: "${m.action_mode}"`);
|
|
231
|
+
}
|
|
232
|
+
// watch array
|
|
233
|
+
if (!Array.isArray(m.watch) || m.watch.length === 0) {
|
|
234
|
+
throw new Error('Manifest "watch" must be a non-empty array of watcher configs');
|
|
235
|
+
}
|
|
236
|
+
for (let i = 0; i < m.watch.length; i++) {
|
|
237
|
+
const w = m.watch[i];
|
|
238
|
+
if (!VALID_WATCHER_TYPES.includes(w.type)) {
|
|
239
|
+
throw new Error(`watch[${i}].type must be one of: ${VALID_WATCHER_TYPES.join(', ')}. Got: "${w.type}"`);
|
|
240
|
+
}
|
|
241
|
+
if ((w.type === 'github_prs' || w.type === 'github_ci' || w.type === 'github_commits') &&
|
|
242
|
+
typeof w.repo !== 'string') {
|
|
243
|
+
throw new Error(`watch[${i}] of type "${w.type}" requires a "repo" field (e.g. "owner/repo")`);
|
|
244
|
+
}
|
|
245
|
+
if (w.type === 'http' && typeof w.url !== 'string') {
|
|
246
|
+
throw new Error(`watch[${i}] of type "http" requires a "url" field`);
|
|
247
|
+
}
|
|
248
|
+
if (w.type === 'filesystem' && typeof w.path !== 'string') {
|
|
249
|
+
throw new Error(`watch[${i}] of type "filesystem" requires a "path" field`);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
// actions array
|
|
253
|
+
if (!Array.isArray(m.actions) || m.actions.length === 0) {
|
|
254
|
+
throw new Error('Manifest "actions" must be a non-empty array of action configs');
|
|
255
|
+
}
|
|
256
|
+
for (let i = 0; i < m.actions.length; i++) {
|
|
257
|
+
const a = m.actions[i];
|
|
258
|
+
if (typeof a.provider !== 'string' || !a.provider) {
|
|
259
|
+
throw new Error(`actions[${i}].provider must be a non-empty string`);
|
|
260
|
+
}
|
|
261
|
+
if (typeof a.action !== 'string' || !a.action) {
|
|
262
|
+
throw new Error(`actions[${i}].action must be a non-empty string`);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
return {
|
|
266
|
+
name,
|
|
267
|
+
purpose: m.purpose.trim(),
|
|
268
|
+
watch: m.watch,
|
|
269
|
+
interval: m.interval.trim(),
|
|
270
|
+
actions: m.actions,
|
|
271
|
+
model: m.model.trim(),
|
|
272
|
+
action_mode: m.action_mode,
|
|
273
|
+
memory_path: typeof m.memory_path === 'string' ? m.memory_path : undefined,
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/utils/manifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare function demonDir(): string;
|
|
2
|
+
export declare function pidsDir(): string;
|
|
3
|
+
export declare function logsDir(): string;
|
|
4
|
+
export declare function memoryDir(): string;
|
|
5
|
+
export declare function providersDir(): string;
|
|
6
|
+
export declare function secretsDir(): string;
|
|
7
|
+
export declare function manifestsDir(): string;
|
|
8
|
+
export declare function statePath(name: string): string;
|
|
9
|
+
export declare function logPath(name: string): string;
|
|
10
|
+
export declare function memoryPath(name: string): string;
|
|
11
|
+
export declare function providerPath(name: string): string;
|
|
12
|
+
export declare function ensureAll(): Promise<void>;
|
|
13
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"AAIA,wBAAgB,QAAQ,IAAI,MAAM,CAEjC;AAED,wBAAgB,OAAO,IAAI,MAAM,CAEhC;AAED,wBAAgB,OAAO,IAAI,MAAM,CAEhC;AAED,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAc/C"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { homedir } from 'os';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import fs from 'fs-extra';
|
|
4
|
+
export function demonDir() {
|
|
5
|
+
return join(homedir(), '.demon');
|
|
6
|
+
}
|
|
7
|
+
export function pidsDir() {
|
|
8
|
+
return join(demonDir(), 'pids');
|
|
9
|
+
}
|
|
10
|
+
export function logsDir() {
|
|
11
|
+
return join(demonDir(), 'logs');
|
|
12
|
+
}
|
|
13
|
+
export function memoryDir() {
|
|
14
|
+
return join(demonDir(), 'memory');
|
|
15
|
+
}
|
|
16
|
+
export function providersDir() {
|
|
17
|
+
return join(demonDir(), 'providers');
|
|
18
|
+
}
|
|
19
|
+
export function secretsDir() {
|
|
20
|
+
return join(demonDir(), 'secrets');
|
|
21
|
+
}
|
|
22
|
+
export function manifestsDir() {
|
|
23
|
+
return join(demonDir(), 'manifests');
|
|
24
|
+
}
|
|
25
|
+
export function statePath(name) {
|
|
26
|
+
return join(pidsDir(), `${name}.json`);
|
|
27
|
+
}
|
|
28
|
+
export function logPath(name) {
|
|
29
|
+
return join(logsDir(), `${name}.log`);
|
|
30
|
+
}
|
|
31
|
+
export function memoryPath(name) {
|
|
32
|
+
return join(memoryDir(), name, 'decisions.jsonl');
|
|
33
|
+
}
|
|
34
|
+
export function providerPath(name) {
|
|
35
|
+
return join(providersDir(), `${name}.json`);
|
|
36
|
+
}
|
|
37
|
+
export async function ensureAll() {
|
|
38
|
+
const dirs = [
|
|
39
|
+
demonDir(),
|
|
40
|
+
pidsDir(),
|
|
41
|
+
logsDir(),
|
|
42
|
+
memoryDir(),
|
|
43
|
+
providersDir(),
|
|
44
|
+
secretsDir(),
|
|
45
|
+
manifestsDir(),
|
|
46
|
+
];
|
|
47
|
+
for (const dir of dirs) {
|
|
48
|
+
await fs.ensureDir(dir);
|
|
49
|
+
await fs.chmod(dir, 0o700);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAA;AAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,MAAM,UAAU,CAAA;AAEzB,MAAM,UAAU,QAAQ;IACtB,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAA;AAClC,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,OAAO,IAAI,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,CAAA;AACjC,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,OAAO,IAAI,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,CAAA;AACjC,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,IAAI,CAAC,QAAQ,EAAE,EAAE,QAAQ,CAAC,CAAA;AACnC,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,CAAC,QAAQ,EAAE,EAAE,WAAW,CAAC,CAAA;AACtC,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,CAAC,CAAA;AACpC,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,CAAC,QAAQ,EAAE,EAAE,WAAW,CAAC,CAAA;AACtC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,IAAI,OAAO,CAAC,CAAA;AACxC,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,IAAI,MAAM,CAAC,CAAA;AACvC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAA;AACnD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,IAAI,CAAC,YAAY,EAAE,EAAE,GAAG,IAAI,OAAO,CAAC,CAAA;AAC7C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,MAAM,IAAI,GAAG;QACX,QAAQ,EAAE;QACV,OAAO,EAAE;QACT,OAAO,EAAE;QACT,SAAS,EAAE;QACX,YAAY,EAAE;QACd,UAAU,EAAE;QACZ,YAAY,EAAE;KACf,CAAA;IACD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;QACvB,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IAC5B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse an interval string to milliseconds.
|
|
3
|
+
* Supports: s (seconds), m (minutes), h (hours), d (days)
|
|
4
|
+
* Examples: "30s" → 30000, "15m" → 900000, "1h" → 3600000, "2d" → 172800000
|
|
5
|
+
*/
|
|
6
|
+
export declare function parseInterval(interval: string): number;
|
|
7
|
+
/**
|
|
8
|
+
* Format milliseconds back to a human-readable interval string.
|
|
9
|
+
*/
|
|
10
|
+
export declare function formatInterval(ms: number): string;
|
|
11
|
+
//# sourceMappingURL=time.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../../src/utils/time.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAyBtD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAMjD"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse an interval string to milliseconds.
|
|
3
|
+
* Supports: s (seconds), m (minutes), h (hours), d (days)
|
|
4
|
+
* Examples: "30s" → 30000, "15m" → 900000, "1h" → 3600000, "2d" → 172800000
|
|
5
|
+
*/
|
|
6
|
+
export function parseInterval(interval) {
|
|
7
|
+
const trimmed = interval.trim().toLowerCase();
|
|
8
|
+
const match = trimmed.match(/^(\d+(?:\.\d+)?)(ms|s|m|h|d)$/);
|
|
9
|
+
if (!match) {
|
|
10
|
+
throw new Error(`Invalid interval format: "${interval}". Expected formats: "30s", "15m", "1h", "2d", "500ms"`);
|
|
11
|
+
}
|
|
12
|
+
const value = parseFloat(match[1]);
|
|
13
|
+
const unit = match[2];
|
|
14
|
+
if (value <= 0) {
|
|
15
|
+
throw new Error(`Interval value must be positive, got: ${value}`);
|
|
16
|
+
}
|
|
17
|
+
switch (unit) {
|
|
18
|
+
case 'ms': return Math.round(value);
|
|
19
|
+
case 's': return Math.round(value * 1_000);
|
|
20
|
+
case 'm': return Math.round(value * 60 * 1_000);
|
|
21
|
+
case 'h': return Math.round(value * 60 * 60 * 1_000);
|
|
22
|
+
case 'd': return Math.round(value * 24 * 60 * 60 * 1_000);
|
|
23
|
+
default: throw new Error(`Unknown unit: ${unit}`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Format milliseconds back to a human-readable interval string.
|
|
28
|
+
*/
|
|
29
|
+
export function formatInterval(ms) {
|
|
30
|
+
if (ms < 1_000)
|
|
31
|
+
return `${ms}ms`;
|
|
32
|
+
if (ms < 60_000)
|
|
33
|
+
return `${ms / 1_000}s`;
|
|
34
|
+
if (ms < 3_600_000)
|
|
35
|
+
return `${ms / 60_000}m`;
|
|
36
|
+
if (ms < 86_400_000)
|
|
37
|
+
return `${ms / 3_600_000}h`;
|
|
38
|
+
return `${ms / 86_400_000}d`;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=time.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time.js","sourceRoot":"","sources":["../../src/utils/time.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAA;IAE5D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACb,6BAA6B,QAAQ,wDAAwD,CAC9F,CAAA;IACH,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IAClC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;IAErB,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,yCAAyC,KAAK,EAAE,CAAC,CAAA;IACnE,CAAC;IAED,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QACnC,KAAK,GAAG,CAAC,CAAE,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAA;QAC3C,KAAK,GAAG,CAAC,CAAE,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,GAAG,KAAK,CAAC,CAAA;QAChD,KAAK,GAAG,CAAC,CAAE,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,CAAA;QACrD,KAAK,GAAG,CAAC,CAAE,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,CAAA;QAC1D,OAAO,CAAC,CAAG,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAA;IACrD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,EAAU;IACvC,IAAI,EAAE,GAAG,KAAK;QAAE,OAAO,GAAG,EAAE,IAAI,CAAA;IAChC,IAAI,EAAE,GAAG,MAAM;QAAE,OAAO,GAAG,EAAE,GAAG,KAAK,GAAG,CAAA;IACxC,IAAI,EAAE,GAAG,SAAS;QAAE,OAAO,GAAG,EAAE,GAAG,MAAM,GAAG,CAAA;IAC5C,IAAI,EAAE,GAAG,UAAU;QAAE,OAAO,GAAG,EAAE,GAAG,SAAS,GAAG,CAAA;IAChD,OAAO,GAAG,EAAE,GAAG,UAAU,GAAG,CAAA;AAC9B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/watchers/base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAKpD,wBAAgB,aAAa,CAC3B,MAAM,EAAE,aAAa,EACrB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAClC,OAAO,CAeT"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { buildGitHubWatcher } from './github.js';
|
|
2
|
+
import { HttpWatcher } from './http.js';
|
|
3
|
+
import { FilesystemWatcher } from './filesystem.js';
|
|
4
|
+
export function createWatcher(config, credentials) {
|
|
5
|
+
switch (config.type) {
|
|
6
|
+
case 'github_prs':
|
|
7
|
+
case 'github_ci':
|
|
8
|
+
case 'github_commits':
|
|
9
|
+
return buildGitHubWatcher(config, credentials);
|
|
10
|
+
case 'http':
|
|
11
|
+
return new HttpWatcher(config);
|
|
12
|
+
case 'filesystem':
|
|
13
|
+
return new FilesystemWatcher(config);
|
|
14
|
+
default: {
|
|
15
|
+
const _exhaustive = config.type;
|
|
16
|
+
throw new Error(`Unknown watcher type: ${String(_exhaustive)}`);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/watchers/base.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAEnD,MAAM,UAAU,aAAa,CAC3B,MAAqB,EACrB,WAAmC;IAEnC,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,YAAY,CAAC;QAClB,KAAK,WAAW,CAAC;QACjB,KAAK,gBAAgB;YACnB,OAAO,kBAAkB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;QAChD,KAAK,MAAM;YACT,OAAO,IAAI,WAAW,CAAC,MAAM,CAAC,CAAA;QAChC,KAAK,YAAY;YACf,OAAO,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAA;QACtC,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,WAAW,GAAU,MAAM,CAAC,IAAI,CAAA;YACtC,MAAM,IAAI,KAAK,CAAC,yBAAyB,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;QACjE,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Watcher, WatcherConfig, WatcherType, Observation } from '../types.js';
|
|
2
|
+
export declare class FilesystemWatcher implements Watcher {
|
|
3
|
+
readonly type: WatcherType;
|
|
4
|
+
readonly config: WatcherConfig;
|
|
5
|
+
private snapshot;
|
|
6
|
+
private initialized;
|
|
7
|
+
constructor(config: WatcherConfig);
|
|
8
|
+
collect(): Promise<Observation[]>;
|
|
9
|
+
private collectFile;
|
|
10
|
+
private collectDirectory;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=filesystem.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem.d.ts","sourceRoot":"","sources":["../../src/watchers/filesystem.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAQ9E,qBAAa,iBAAkB,YAAW,OAAO;IAC/C,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAe;IACzC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAA;IAE9B,OAAO,CAAC,QAAQ,CAAwC;IACxD,OAAO,CAAC,WAAW,CAAQ;gBAEf,MAAM,EAAE,aAAa;IAI3B,OAAO,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YAgCzB,WAAW;YA2CX,gBAAgB;CAqH/B"}
|