@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,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":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAA;AACzB,OAAO,IAAI,MAAM,SAAS,CAAA;AAG1B,MAAM,mBAAmB,GAAkB;IACzC,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,EAAE,YAAY;CAClE,CAAA;AAED,MAAM,kBAAkB,GAAiB,CAAC,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,CAAA;AAExE,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,QAAgB;IACtD,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC;QACvC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;QAC/C,CAAC,CAAC,QAAQ,CAAA;IAEZ,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,EAAE,CAAC,CAAA;IACzD,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IAChD,IAAI,MAAe,CAAA;IAEnB,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAC1B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,kCAAmC,GAAa,CAAC,OAAO,EAAE,CAAC,CAAA;QAC7E,CAAC;IACH,CAAC;SAAM,CAAC;QACN,gDAAgD;QAChD,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACzB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,kCAAmC,GAAa,CAAC,OAAO,EAAE,CAAC,CAAA;QAC7E,CAAC;IACH,CAAC;IAED,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAA;AACjC,CAAC;AAED,yFAAyF;AACzF,6EAA6E;AAC7E,MAAM,eAAe,GAA4B;IAC/C,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,qCAAqC,EAAE;QAC5E,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,mDAAmD,EAAE;QAC7F,KAAK,EAAE;YACL,IAAI,EAAE,OAAO;YACb,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,gBAAgB,CAAC,EAAE;oBACnG,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8BAA8B,EAAE;oBACrE,GAAG,EAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,wBAAwB,EAAE;oBAC/D,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,iDAAiD,EAAE;iBACzF;gBACD,QAAQ,EAAE,CAAC,MAAM,CAAC;aACnB;SACF;QACD,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,+BAA+B,EAAE;QAC1E,OAAO,EAAE;YACP,IAAI,EAAE,OAAO;YACb,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE;oBAC7F,MAAM,EAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,0FAA0F,EAAE;iBACtI;gBACD,QAAQ,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC;aACjC;SACF;QACD,KAAK,EAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC/B,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE;KACvE;IACD,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,CAAC;IACrF,oBAAoB,EAAE,KAAK;CAC5B,CAAA;AAED,MAAM,eAAe,GAAG,CAAC,MAAc,EAAE,EAAE,CAAC,+CAA+C,MAAM;;;;;;;;;6BASpE,CAAA;AAE7B,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAc,EACd,WAAwB;IAExB,MAAM,WAAW,GAAG,CAAC,CAAA;IACrB,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,CAAA;IACtC,MAAM,QAAQ,GAA2D;QACvE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE;KAClC,CAAA;IAED,IAAI,SAAS,GAAU,IAAI,KAAK,CAAC,eAAe,CAAC,CAAA;IAEjD,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;QACxD,IAAI,MAAe,CAAA;QAEnB,IAAI,CAAC;YACH,oEAAoE;YACpE,IAAI,WAAW,CAAC,cAAc,EAAE,CAAC;gBAC/B,MAAM,GAAG,MAAM,WAAW,CAAC,cAAc,CAAC,eAAe,EAAE,uBAAuB,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;YAC5H,CAAC;iBAAM,CAAC;gBACN,8CAA8C;gBAC9C,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,IAAI,CAChC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,EACzD,oEAAoE,CACrE,CAAA;gBACD,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;gBACnF,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;gBACtC,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;gBACxC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC,CAAA;YAC5D,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,SAAS,GAAG,GAAY,CAAA;YACxB,IAAI,OAAO,GAAG,WAAW,EAAE,CAAC;gBAC1B,QAAQ,CAAC,IAAI,CACX,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,EAC3C,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAW,GAAa,CAAC,OAAO,uCAAuC,EAAE,CACnG,CAAA;gBACD,SAAQ;YACV,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,yCAAyC,WAAW,cAAc,SAAS,CAAC,OAAO,EAAE,CAAC,CAAA;QACxG,CAAC;QAED,qBAAqB;QACrB,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAA;QAC7B,IAAI,CAAC;YACH,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAA;QACjC,CAAC;QAAC,OAAO,QAAQ,EAAE,CAAC;YAClB,SAAS,GAAG,QAAiB,CAAA;YAC7B,IAAI,OAAO,GAAG,WAAW,EAAE,CAAC;gBAC1B,wEAAwE;gBACxE,QAAQ,CAAC,IAAI,CACX,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EACtD,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,6BAA6B,SAAS,CAAC,OAAO,iDAAiD,EAAE,CAC3H,CAAA;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,oCAAoC,WAAW,cAAc,SAAS,CAAC,OAAO,EAAE,CAAC,CAAA;AACnG,CAAC;AAED,MAAM,eAAe,GAA2B;IAC9C,MAAM,EAAG,MAAM;IACf,GAAG,EAAM,MAAM;IACf,KAAK,EAAI,cAAc;IACvB,MAAM,EAAG,cAAc;IACvB,OAAO,EAAE,MAAM;IACf,MAAM,EAAG,KAAK;IACd,IAAI,EAAK,OAAO;CACjB,CAAA;AAED,qDAAqD;AACrD,MAAM,gBAAgB,GAAgC;IACpD,sBAAsB;IACtB,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY;IAC/E,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,EAAE,YAAY;IACnF,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY;IACnE,eAAe,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY;IACpF,gBAAgB;IAChB,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAC5D,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;IACxD,kBAAkB;IAClB,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY;IAC7E,aAAa,EAAE,YAAY,EAAE,mBAAmB,EAAE,YAAY;IAC9D,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW;IAC/E,eAAe,EAAE,WAAW,EAAE,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW;IACnE,cAAc,EAAE,gBAAgB,EAAE,aAAa,EAAE,gBAAgB;IACjE,WAAW,EAAE,gBAAgB,EAAE,OAAO,EAAE,gBAAgB;CACzD,CAAA;AAED,SAAS,YAAY,CAAC,GAAY;IAChC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAA;IAC7E,MAAM,CAAC,GAAG,GAA8B,CAAA;IAExC,+EAA+E;IAC/E,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpD,sEAAsE;QACtE,0EAA0E;QAC1E,CAAC,CAAC,KAAK,GAAG,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM,EAAE,CAAC,CAAA;IACtE,CAAC;IAED,CAAC,CAAC,KAAK,GAAI,CAAC,CAAC,KAAmB,CAAC,GAAG,CAAC,CAAC,CAAU,EAAE,EAAE;QAClD,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;YAAE,OAAO,CAAC,CAAA;QACjD,MAAM,OAAO,GAAG,CAA4B,CAAA;QAC5C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QAC3E,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAA;QAC3C,IAAI,SAAS;YAAE,OAAO,CAAC,IAAI,GAAG,SAAS,CAAA;QAEvC,8CAA8C;QAC9C,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YACnD,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,MAAM,CAAA;QAC3C,CAAC;QACD,OAAO,OAAO,CAAA;IAChB,CAAC,CAAC,CAAA;IAEF,+EAA+E;IAC/E,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxD,CAAC,CAAC,OAAO,GAAG,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;IACnD,CAAC;IAED,CAAC,CAAC,OAAO,GAAI,CAAC,CAAC,OAAqB,CAAC,GAAG,CAAC,CAAC,CAAU,EAAE,EAAE;QACtD,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;YAAE,OAAO,CAAC,CAAA;QACjD,MAAM,MAAM,GAAG,CAA4B,CAAA;QAC3C,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;QAE5D,mCAAmC;QACnC,MAAM,WAAW,GAA2B;YAC1C,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ;YAC/E,kBAAkB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ;YACvE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ;SACnC,CAAA;QACD,IAAI,WAAW,CAAC,QAAQ,CAAC;YAAE,MAAM,CAAC,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAA;QAElE,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;QAC5D,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC1D,MAAM,CAAC,MAAM,GAAG,eAAe,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAA;QACrD,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC,CAAC,CAAA;IAEF,+EAA+E;IAC/E,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAyB,CAAC;QAAE,CAAC,CAAC,WAAW,GAAG,MAAM,CAAA;IACrF,IAAI,CAAC,CAAC,CAAC,KAAK;QAAE,CAAC,CAAC,KAAK,GAAG,mBAAmB,CAAA;IAC3C,IAAI,CAAC,CAAC,CAAC,QAAQ;QAAE,CAAC,CAAC,QAAQ,GAAG,KAAK,CAAA;IAEnC,OAAO,CAAC,CAAA;AACV,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,QAAiB;IAChD,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjF,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;IACvD,CAAC;IAED,MAAM,CAAC,GAAG,QAAmC,CAAA;IAE7C,yBAAyB;IACzB,KAAK,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC;QAC7D,IAAI,OAAO,CAAC,CAAC,KAAK,CAAC,KAAK,QAAQ,IAAK,CAAC,CAAC,KAAK,CAAY,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACvE,MAAM,IAAI,KAAK,CAAC,mBAAmB,KAAK,8BAA8B,CAAC,CAAA;QACzE,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,MAAM,IAAI,GAAI,CAAC,CAAC,IAAe,CAAC,IAAI,EAAE,CAAA;IACtC,IAAI,CAAC,yCAAyC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,4EAA4E,IAAI,GAAG,CAAC,CAAA;IACtG,CAAC;IAED,cAAc;IACd,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAyB,CAAC,EAAE,CAAC;QAC9D,MAAM,IAAI,KAAK,CACb,0CAA0C,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,WAAW,GAAG,CACnG,CAAA;IACH,CAAC;IAED,cAAc;IACd,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAA;IAClF,CAAC;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAA4B,CAAA;QAC/C,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAmB,CAAC,EAAE,CAAC;YACzD,MAAM,IAAI,KAAK,CACb,SAAS,CAAC,0BAA0B,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,GAAG,CACvF,CAAA;QACH,CAAC;QACD,IACE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,IAAI,KAAK,gBAAgB,CAAC;YAClF,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,EAC1B,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,IAAI,+CAA+C,CAAC,CAAA;QAChG,CAAC;QACD,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;YACnD,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,yCAAyC,CAAC,CAAA;QACtE,CAAC;QACD,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC1D,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,gDAAgD,CAAC,CAAA;QAC7E,CAAC;IACH,CAAC;IAED,gBAAgB;IAChB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAA;IACnF,CAAC;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAA4B,CAAA;QACjD,IAAI,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;YAClD,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,uCAAuC,CAAC,CAAA;QACtE,CAAC;QACD,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,qCAAqC,CAAC,CAAA;QACpE,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI;QACJ,OAAO,EAAG,CAAC,CAAC,OAAkB,CAAC,IAAI,EAAE;QACrC,KAAK,EAAE,CAAC,CAAC,KAA+B;QACxC,QAAQ,EAAG,CAAC,CAAC,QAAmB,CAAC,IAAI,EAAE;QACvC,OAAO,EAAE,CAAC,CAAC,OAAmC;QAC9C,KAAK,EAAG,CAAC,CAAC,KAAgB,CAAC,IAAI,EAAE;QACjC,WAAW,EAAE,CAAC,CAAC,WAAyB;QACxC,WAAW,EAAE,OAAO,CAAC,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;KAC3E,CAAA;AACH,CAAC"}
@@ -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,3 @@
1
+ import { Watcher, WatcherConfig } from '../types.js';
2
+ export declare function createWatcher(config: WatcherConfig, credentials: Record<string, string>): Watcher;
3
+ //# sourceMappingURL=base.d.ts.map
@@ -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"}