mach6-core 1.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 +454 -0
- package/dist/agent/context-monitor.d.ts +40 -0
- package/dist/agent/context-monitor.d.ts.map +1 -0
- package/dist/agent/context-monitor.js +138 -0
- package/dist/agent/context-monitor.js.map +1 -0
- package/dist/agent/context.d.ts +8 -0
- package/dist/agent/context.d.ts.map +1 -0
- package/dist/agent/context.js +197 -0
- package/dist/agent/context.js.map +1 -0
- package/dist/agent/runner.d.ts +42 -0
- package/dist/agent/runner.d.ts.map +1 -0
- package/dist/agent/runner.js +168 -0
- package/dist/agent/runner.js.map +1 -0
- package/dist/agent/system-prompt.d.ts +10 -0
- package/dist/agent/system-prompt.d.ts.map +1 -0
- package/dist/agent/system-prompt.js +120 -0
- package/dist/agent/system-prompt.js.map +1 -0
- package/dist/boot/sequence.d.ts +34 -0
- package/dist/boot/sequence.d.ts.map +1 -0
- package/dist/boot/sequence.js +103 -0
- package/dist/boot/sequence.js.map +1 -0
- package/dist/channels/__test__/integration.test.d.ts +8 -0
- package/dist/channels/__test__/integration.test.d.ts.map +1 -0
- package/dist/channels/__test__/integration.test.js +221 -0
- package/dist/channels/__test__/integration.test.js.map +1 -0
- package/dist/channels/adapter.d.ts +53 -0
- package/dist/channels/adapter.d.ts.map +1 -0
- package/dist/channels/adapter.js +164 -0
- package/dist/channels/adapter.js.map +1 -0
- package/dist/channels/adapters/discord.d.ts +49 -0
- package/dist/channels/adapters/discord.d.ts.map +1 -0
- package/dist/channels/adapters/discord.js +382 -0
- package/dist/channels/adapters/discord.js.map +1 -0
- package/dist/channels/adapters/whatsapp.d.ts +59 -0
- package/dist/channels/adapters/whatsapp.d.ts.map +1 -0
- package/dist/channels/adapters/whatsapp.js +503 -0
- package/dist/channels/adapters/whatsapp.js.map +1 -0
- package/dist/channels/bus.d.ts +55 -0
- package/dist/channels/bus.d.ts.map +1 -0
- package/dist/channels/bus.js +307 -0
- package/dist/channels/bus.js.map +1 -0
- package/dist/channels/formatter.d.ts +16 -0
- package/dist/channels/formatter.d.ts.map +1 -0
- package/dist/channels/formatter.js +226 -0
- package/dist/channels/formatter.js.map +1 -0
- package/dist/channels/presence.d.ts +67 -0
- package/dist/channels/presence.d.ts.map +1 -0
- package/dist/channels/presence.js +209 -0
- package/dist/channels/presence.js.map +1 -0
- package/dist/channels/registry.d.ts +57 -0
- package/dist/channels/registry.d.ts.map +1 -0
- package/dist/channels/registry.js +159 -0
- package/dist/channels/registry.js.map +1 -0
- package/dist/channels/router.d.ts +49 -0
- package/dist/channels/router.d.ts.map +1 -0
- package/dist/channels/router.js +244 -0
- package/dist/channels/router.js.map +1 -0
- package/dist/channels/types.d.ts +279 -0
- package/dist/channels/types.d.ts.map +1 -0
- package/dist/channels/types.js +67 -0
- package/dist/channels/types.js.map +1 -0
- package/dist/cli/brand.d.ts +71 -0
- package/dist/cli/brand.d.ts.map +1 -0
- package/dist/cli/brand.js +194 -0
- package/dist/cli/brand.js.map +1 -0
- package/dist/cli/wizard.d.ts +8 -0
- package/dist/cli/wizard.d.ts.map +1 -0
- package/dist/cli/wizard.js +520 -0
- package/dist/cli/wizard.js.map +1 -0
- package/dist/config/config.d.ts +47 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +63 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/validator.d.ts +18 -0
- package/dist/config/validator.d.ts.map +1 -0
- package/dist/config/validator.js +92 -0
- package/dist/config/validator.js.map +1 -0
- package/dist/cron/budget.d.ts +39 -0
- package/dist/cron/budget.d.ts.map +1 -0
- package/dist/cron/budget.js +98 -0
- package/dist/cron/budget.js.map +1 -0
- package/dist/formatters/markdown.d.ts +6 -0
- package/dist/formatters/markdown.d.ts.map +1 -0
- package/dist/formatters/markdown.js +85 -0
- package/dist/formatters/markdown.js.map +1 -0
- package/dist/gateway/daemon.d.ts +97 -0
- package/dist/gateway/daemon.d.ts.map +1 -0
- package/dist/gateway/daemon.js +772 -0
- package/dist/gateway/daemon.js.map +1 -0
- package/dist/heartbeat/scheduler.d.ts +45 -0
- package/dist/heartbeat/scheduler.d.ts.map +1 -0
- package/dist/heartbeat/scheduler.js +102 -0
- package/dist/heartbeat/scheduler.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +305 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/integrity.d.ts +37 -0
- package/dist/memory/integrity.d.ts.map +1 -0
- package/dist/memory/integrity.js +108 -0
- package/dist/memory/integrity.js.map +1 -0
- package/dist/providers/anthropic.d.ts +3 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +232 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/diagnostics.d.ts +18 -0
- package/dist/providers/diagnostics.d.ts.map +1 -0
- package/dist/providers/diagnostics.js +87 -0
- package/dist/providers/diagnostics.js.map +1 -0
- package/dist/providers/github-copilot.d.ts +3 -0
- package/dist/providers/github-copilot.d.ts.map +1 -0
- package/dist/providers/github-copilot.js +145 -0
- package/dist/providers/github-copilot.js.map +1 -0
- package/dist/providers/gladius.d.ts +3 -0
- package/dist/providers/gladius.d.ts.map +1 -0
- package/dist/providers/gladius.js +16 -0
- package/dist/providers/gladius.js.map +1 -0
- package/dist/providers/openai.d.ts +3 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +161 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/retry.d.ts +2 -0
- package/dist/providers/retry.d.ts.map +1 -0
- package/dist/providers/retry.js +50 -0
- package/dist/providers/retry.js.map +1 -0
- package/dist/providers/types.d.ts +78 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +3 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/security/sanitizer.d.ts +26 -0
- package/dist/security/sanitizer.d.ts.map +1 -0
- package/dist/security/sanitizer.js +115 -0
- package/dist/security/sanitizer.js.map +1 -0
- package/dist/sessions/manager.d.ts +40 -0
- package/dist/sessions/manager.d.ts.map +1 -0
- package/dist/sessions/manager.js +255 -0
- package/dist/sessions/manager.js.map +1 -0
- package/dist/sessions/queue.d.ts +41 -0
- package/dist/sessions/queue.d.ts.map +1 -0
- package/dist/sessions/queue.js +93 -0
- package/dist/sessions/queue.js.map +1 -0
- package/dist/sessions/store.d.ts +12 -0
- package/dist/sessions/store.d.ts.map +1 -0
- package/dist/sessions/store.js +74 -0
- package/dist/sessions/store.js.map +1 -0
- package/dist/sessions/sub-agent.d.ts +18 -0
- package/dist/sessions/sub-agent.d.ts.map +1 -0
- package/dist/sessions/sub-agent.js +117 -0
- package/dist/sessions/sub-agent.js.map +1 -0
- package/dist/sessions/types.d.ts +48 -0
- package/dist/sessions/types.d.ts.map +1 -0
- package/dist/sessions/types.js +3 -0
- package/dist/sessions/types.js.map +1 -0
- package/dist/test/channel-integration.d.ts +10 -0
- package/dist/test/channel-integration.d.ts.map +1 -0
- package/dist/test/channel-integration.js +226 -0
- package/dist/test/channel-integration.js.map +1 -0
- package/dist/test/prompt-test.d.ts +2 -0
- package/dist/test/prompt-test.d.ts.map +1 -0
- package/dist/test/prompt-test.js +33 -0
- package/dist/test/prompt-test.js.map +1 -0
- package/dist/test/smoke.d.ts +8 -0
- package/dist/test/smoke.d.ts.map +1 -0
- package/dist/test/smoke.js +134 -0
- package/dist/test/smoke.js.map +1 -0
- package/dist/tools/builtin/comb.d.ts +4 -0
- package/dist/tools/builtin/comb.d.ts.map +1 -0
- package/dist/tools/builtin/comb.js +50 -0
- package/dist/tools/builtin/comb.js.map +1 -0
- package/dist/tools/builtin/edit.d.ts +3 -0
- package/dist/tools/builtin/edit.d.ts.map +1 -0
- package/dist/tools/builtin/edit.js +42 -0
- package/dist/tools/builtin/edit.js.map +1 -0
- package/dist/tools/builtin/exec.d.ts +3 -0
- package/dist/tools/builtin/exec.d.ts.map +1 -0
- package/dist/tools/builtin/exec.js +75 -0
- package/dist/tools/builtin/exec.js.map +1 -0
- package/dist/tools/builtin/image.d.ts +3 -0
- package/dist/tools/builtin/image.d.ts.map +1 -0
- package/dist/tools/builtin/image.js +208 -0
- package/dist/tools/builtin/image.js.map +1 -0
- package/dist/tools/builtin/memory.d.ts +3 -0
- package/dist/tools/builtin/memory.d.ts.map +1 -0
- package/dist/tools/builtin/memory.js +36 -0
- package/dist/tools/builtin/memory.js.map +1 -0
- package/dist/tools/builtin/message.d.ts +13 -0
- package/dist/tools/builtin/message.d.ts.map +1 -0
- package/dist/tools/builtin/message.js +330 -0
- package/dist/tools/builtin/message.js.map +1 -0
- package/dist/tools/builtin/process.d.ts +43 -0
- package/dist/tools/builtin/process.d.ts.map +1 -0
- package/dist/tools/builtin/process.js +178 -0
- package/dist/tools/builtin/process.js.map +1 -0
- package/dist/tools/builtin/read.d.ts +3 -0
- package/dist/tools/builtin/read.d.ts.map +1 -0
- package/dist/tools/builtin/read.js +36 -0
- package/dist/tools/builtin/read.js.map +1 -0
- package/dist/tools/builtin/spawn.d.ts +8 -0
- package/dist/tools/builtin/spawn.d.ts.map +1 -0
- package/dist/tools/builtin/spawn.js +90 -0
- package/dist/tools/builtin/spawn.js.map +1 -0
- package/dist/tools/builtin/tts.d.ts +3 -0
- package/dist/tools/builtin/tts.d.ts.map +1 -0
- package/dist/tools/builtin/tts.js +77 -0
- package/dist/tools/builtin/tts.js.map +1 -0
- package/dist/tools/builtin/web-fetch.d.ts +3 -0
- package/dist/tools/builtin/web-fetch.d.ts.map +1 -0
- package/dist/tools/builtin/web-fetch.js +46 -0
- package/dist/tools/builtin/web-fetch.js.map +1 -0
- package/dist/tools/builtin/write.d.ts +3 -0
- package/dist/tools/builtin/write.d.ts.map +1 -0
- package/dist/tools/builtin/write.js +31 -0
- package/dist/tools/builtin/write.js.map +1 -0
- package/dist/tools/mcp-bridge.d.ts +42 -0
- package/dist/tools/mcp-bridge.d.ts.map +1 -0
- package/dist/tools/mcp-bridge.js +198 -0
- package/dist/tools/mcp-bridge.js.map +1 -0
- package/dist/tools/policy.d.ts +57 -0
- package/dist/tools/policy.d.ts.map +1 -0
- package/dist/tools/policy.js +106 -0
- package/dist/tools/policy.js.map +1 -0
- package/dist/tools/registry.d.ts +15 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +41 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/sandbox.d.ts +91 -0
- package/dist/tools/sandbox.d.ts.map +1 -0
- package/dist/tools/sandbox.js +279 -0
- package/dist/tools/sandbox.js.map +1 -0
- package/dist/tools/types.d.ts +23 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +3 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/web/http-api.d.ts +61 -0
- package/dist/web/http-api.d.ts.map +1 -0
- package/dist/web/http-api.js +200 -0
- package/dist/web/http-api.js.map +1 -0
- package/dist/web/server.d.ts +7 -0
- package/dist/web/server.d.ts.map +1 -0
- package/dist/web/server.js +396 -0
- package/dist/web/server.js.map +1 -0
- package/mach6.example.json +50 -0
- package/package.json +58 -0
- package/web/index.html +1370 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
// Mach6 — Config loading
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
const DEFAULT_CONFIG = {
|
|
6
|
+
providers: {},
|
|
7
|
+
defaultProvider: 'github-copilot',
|
|
8
|
+
defaultModel: 'claude-sonnet-4',
|
|
9
|
+
maxTokens: 8192,
|
|
10
|
+
temperature: 0.7,
|
|
11
|
+
maxIterations: 50,
|
|
12
|
+
workspace: process.cwd(),
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Recursively resolve ${ENV_VAR} references in string values.
|
|
16
|
+
*/
|
|
17
|
+
function resolveEnvVars(obj) {
|
|
18
|
+
if (typeof obj === 'string') {
|
|
19
|
+
return obj.replace(/\$\{(\w+)\}/g, (_, key) => process.env[key] ?? '');
|
|
20
|
+
}
|
|
21
|
+
if (Array.isArray(obj))
|
|
22
|
+
return obj.map(resolveEnvVars);
|
|
23
|
+
if (obj && typeof obj === 'object') {
|
|
24
|
+
const result = {};
|
|
25
|
+
for (const [k, v] of Object.entries(obj))
|
|
26
|
+
result[k] = resolveEnvVars(v);
|
|
27
|
+
return result;
|
|
28
|
+
}
|
|
29
|
+
return obj;
|
|
30
|
+
}
|
|
31
|
+
function resolveEnvKeys(config) {
|
|
32
|
+
// Resolve ${VAR} patterns throughout config
|
|
33
|
+
config = resolveEnvVars(config);
|
|
34
|
+
// Inject API keys from environment if not in config
|
|
35
|
+
if (!config.providers.anthropic?.apiKey && process.env.ANTHROPIC_API_KEY) {
|
|
36
|
+
config.providers.anthropic = { ...config.providers.anthropic, apiKey: process.env.ANTHROPIC_API_KEY };
|
|
37
|
+
}
|
|
38
|
+
// OpenAI direct API removed — we route through GitHub Copilot
|
|
39
|
+
return config;
|
|
40
|
+
}
|
|
41
|
+
export function loadConfig(configPath) {
|
|
42
|
+
const tryPaths = configPath
|
|
43
|
+
? [configPath]
|
|
44
|
+
: [
|
|
45
|
+
path.join(process.cwd(), 'mach6.json'),
|
|
46
|
+
path.join(os.homedir(), '.mach6', 'config.json'),
|
|
47
|
+
];
|
|
48
|
+
for (const p of tryPaths) {
|
|
49
|
+
try {
|
|
50
|
+
const raw = fs.readFileSync(p, 'utf-8');
|
|
51
|
+
// Strip comments but preserve // inside strings (e.g. "http://...")
|
|
52
|
+
// Strategy: match strings first (preserve), then strip line/block comments
|
|
53
|
+
const stripped = raw.replace(/"(?:[^"\\]|\\.)*"|\/\/.*$|\/\*[\s\S]*?\*\//gm, (match) => match.startsWith('"') ? match : '');
|
|
54
|
+
const parsed = JSON.parse(stripped);
|
|
55
|
+
return resolveEnvKeys({ ...DEFAULT_CONFIG, ...parsed });
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return resolveEnvKeys({ ...DEFAULT_CONFIG });
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Mach6Config } from './config.js';
|
|
2
|
+
export interface ValidationError {
|
|
3
|
+
field: string;
|
|
4
|
+
message: string;
|
|
5
|
+
suggestion?: string;
|
|
6
|
+
severity: 'error' | 'warning';
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Validate config and return all issues found.
|
|
10
|
+
* Errors = fatal (must fix). Warnings = suspicious but allowed.
|
|
11
|
+
*/
|
|
12
|
+
export declare function validateConfig(config: Mach6Config): ValidationError[];
|
|
13
|
+
/**
|
|
14
|
+
* Run validation and handle results. Returns true if config is usable.
|
|
15
|
+
* On fatal errors: prints them and returns false (caller should exit).
|
|
16
|
+
*/
|
|
17
|
+
export declare function validateAndReport(config: Mach6Config): boolean;
|
|
18
|
+
//# sourceMappingURL=validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/config/validator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/B;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,eAAe,EAAE,CA2ErE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAmB9D"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
// Mach6 — Config Validation (fixes Pain #1, #9)
|
|
2
|
+
// Validates config BEFORE anything starts. Never crash-loop.
|
|
3
|
+
/**
|
|
4
|
+
* Validate config and return all issues found.
|
|
5
|
+
* Errors = fatal (must fix). Warnings = suspicious but allowed.
|
|
6
|
+
*/
|
|
7
|
+
export function validateConfig(config) {
|
|
8
|
+
const issues = [];
|
|
9
|
+
// Check provider config
|
|
10
|
+
if (!config.defaultProvider) {
|
|
11
|
+
issues.push({ field: 'defaultProvider', message: 'No default provider set', severity: 'error', suggestion: 'Set defaultProvider to one of: github-copilot, gladius' });
|
|
12
|
+
}
|
|
13
|
+
if (!config.defaultModel) {
|
|
14
|
+
issues.push({ field: 'defaultModel', message: 'No default model set', severity: 'error', suggestion: 'Set defaultModel (e.g. "claude-sonnet-4", "gpt-4o")' });
|
|
15
|
+
}
|
|
16
|
+
// Check for contradictory settings
|
|
17
|
+
if (config.providers.anthropic?.apiKey && config.providers.anthropic.apiKey.length < 10) {
|
|
18
|
+
issues.push({ field: 'providers.anthropic.apiKey', message: 'API key looks too short', severity: 'warning', suggestion: 'Anthropic keys start with "sk-ant-" and are ~100+ chars' });
|
|
19
|
+
}
|
|
20
|
+
// Validate temperature
|
|
21
|
+
if (config.temperature < 0 || config.temperature > 2) {
|
|
22
|
+
issues.push({ field: 'temperature', message: `Temperature ${config.temperature} is out of range`, severity: 'error', suggestion: 'Use 0.0–2.0 (recommended: 0.3–0.8)' });
|
|
23
|
+
}
|
|
24
|
+
// Validate maxTokens
|
|
25
|
+
if (config.maxTokens < 1 || config.maxTokens > 1_000_000) {
|
|
26
|
+
issues.push({ field: 'maxTokens', message: `maxTokens ${config.maxTokens} seems wrong`, severity: 'warning', suggestion: 'Typical values: 4096–16384' });
|
|
27
|
+
}
|
|
28
|
+
// Heartbeat validation
|
|
29
|
+
if (config.heartbeat) {
|
|
30
|
+
const hb = config.heartbeat;
|
|
31
|
+
if (hb.quietHoursStart !== undefined && hb.quietHoursEnd !== undefined) {
|
|
32
|
+
if (hb.quietHoursStart < 0 || hb.quietHoursStart > 23 || hb.quietHoursEnd < 0 || hb.quietHoursEnd > 23) {
|
|
33
|
+
issues.push({ field: 'heartbeat.quietHours', message: 'Quiet hours must be 0–23', severity: 'error' });
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
if (hb.activeIntervalMin !== undefined && hb.activeIntervalMin < 5) {
|
|
37
|
+
issues.push({ field: 'heartbeat.activeIntervalMin', message: 'Active heartbeat interval < 5min is excessive', severity: 'warning', suggestion: 'Minimum recommended: 15 minutes' });
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
// Timeout validation
|
|
41
|
+
if (config.timeouts) {
|
|
42
|
+
for (const [key, val] of Object.entries(config.timeouts)) {
|
|
43
|
+
if (typeof val === 'number' && val < 1000) {
|
|
44
|
+
issues.push({ field: `timeouts.${key}`, message: `Timeout ${val}ms is very low`, severity: 'warning', suggestion: 'Timeouts are in milliseconds. Did you mean seconds?' });
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// Channel account key validation (phone numbers)
|
|
49
|
+
if (config.channels) {
|
|
50
|
+
for (const [name, ch] of Object.entries(config.channels)) {
|
|
51
|
+
if (ch.accountKey && /^\d{10}$/.test(ch.accountKey)) {
|
|
52
|
+
issues.push({
|
|
53
|
+
field: `channels.${name}.accountKey`,
|
|
54
|
+
message: `Account key "${ch.accountKey}" looks like a phone number without country code`,
|
|
55
|
+
severity: 'warning',
|
|
56
|
+
suggestion: `Did you mean "${ch.countryCode ?? '1'}${ch.accountKey}"? Include the country code.`,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// Budget validation
|
|
62
|
+
if (config.budgets) {
|
|
63
|
+
for (const [resource, budget] of Object.entries(config.budgets)) {
|
|
64
|
+
if (budget.dailyLimit !== undefined && budget.dailyLimit < 1) {
|
|
65
|
+
issues.push({ field: `budgets.${resource}.dailyLimit`, message: 'Daily limit must be >= 1', severity: 'error' });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return issues;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Run validation and handle results. Returns true if config is usable.
|
|
73
|
+
* On fatal errors: prints them and returns false (caller should exit).
|
|
74
|
+
*/
|
|
75
|
+
export function validateAndReport(config) {
|
|
76
|
+
const issues = validateConfig(config);
|
|
77
|
+
const errors = issues.filter(i => i.severity === 'error');
|
|
78
|
+
const warnings = issues.filter(i => i.severity === 'warning');
|
|
79
|
+
for (const w of warnings) {
|
|
80
|
+
console.warn(`⚠️ Config warning [${w.field}]: ${w.message}${w.suggestion ? `\n → ${w.suggestion}` : ''}`);
|
|
81
|
+
}
|
|
82
|
+
if (errors.length > 0) {
|
|
83
|
+
console.error('\n❌ Config validation failed:\n');
|
|
84
|
+
for (const e of errors) {
|
|
85
|
+
console.error(` [${e.field}]: ${e.message}${e.suggestion ? `\n → ${e.suggestion}` : ''}`);
|
|
86
|
+
}
|
|
87
|
+
console.error(`\n${errors.length} error(s) found. Fix config and retry.\n`);
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/config/validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export interface ResourceDeclaration {
|
|
2
|
+
resource: string;
|
|
3
|
+
perRun: number;
|
|
4
|
+
dailyLimit: number;
|
|
5
|
+
}
|
|
6
|
+
export interface CronJob {
|
|
7
|
+
id: string;
|
|
8
|
+
name: string;
|
|
9
|
+
resources: ResourceDeclaration[];
|
|
10
|
+
execute: () => Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
export declare class CronBudgetManager {
|
|
13
|
+
private trackers;
|
|
14
|
+
private jobs;
|
|
15
|
+
/** Register a cron job with its resource declarations */
|
|
16
|
+
registerJob(job: CronJob): void;
|
|
17
|
+
/** Check if a job can run within budget. Returns reason if not. */
|
|
18
|
+
canRun(jobId: string): {
|
|
19
|
+
allowed: boolean;
|
|
20
|
+
reason?: string;
|
|
21
|
+
};
|
|
22
|
+
/** Run a job if budget allows. Deducts resource usage on success. */
|
|
23
|
+
executeJob(jobId: string): Promise<{
|
|
24
|
+
ran: boolean;
|
|
25
|
+
reason?: string;
|
|
26
|
+
}>;
|
|
27
|
+
/** Get budget status for all resources */
|
|
28
|
+
status(): {
|
|
29
|
+
resource: string;
|
|
30
|
+
used: number;
|
|
31
|
+
dailyLimit: number;
|
|
32
|
+
remaining: number;
|
|
33
|
+
pct: number;
|
|
34
|
+
}[];
|
|
35
|
+
private getTracker;
|
|
36
|
+
private maybeReset;
|
|
37
|
+
private today;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=budget.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"budget.d.ts","sourceRoot":"","sources":["../../src/cron/budget.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,mBAAmB,EAAE,CAAC;IACjC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AASD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAsC;IACtD,OAAO,CAAC,IAAI,CAA8B;IAE1C,yDAAyD;IACzD,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;IAc/B,mEAAmE;IACnE,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;IAmB5D,qEAAqE;IAC/D,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IA+B3E,0CAA0C;IAC1C,MAAM,IAAI;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE;IAalG,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,KAAK;CAGd"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
// Mach6 — Cron Resource Budgets (fixes Pain #14)
|
|
2
|
+
// Jobs declare resource usage. Scheduler enforces budgets. No overlap burns.
|
|
3
|
+
export class CronBudgetManager {
|
|
4
|
+
trackers = new Map();
|
|
5
|
+
jobs = new Map();
|
|
6
|
+
/** Register a cron job with its resource declarations */
|
|
7
|
+
registerJob(job) {
|
|
8
|
+
this.jobs.set(job.id, job);
|
|
9
|
+
for (const r of job.resources) {
|
|
10
|
+
if (!this.trackers.has(r.resource)) {
|
|
11
|
+
this.trackers.set(r.resource, {
|
|
12
|
+
resource: r.resource,
|
|
13
|
+
dailyLimit: r.dailyLimit,
|
|
14
|
+
used: 0,
|
|
15
|
+
resetDate: this.today(),
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/** Check if a job can run within budget. Returns reason if not. */
|
|
21
|
+
canRun(jobId) {
|
|
22
|
+
const job = this.jobs.get(jobId);
|
|
23
|
+
if (!job)
|
|
24
|
+
return { allowed: false, reason: `Unknown job: ${jobId}` };
|
|
25
|
+
for (const r of job.resources) {
|
|
26
|
+
const tracker = this.getTracker(r.resource, r.dailyLimit);
|
|
27
|
+
const remaining = tracker.dailyLimit - tracker.used;
|
|
28
|
+
if (r.perRun > remaining) {
|
|
29
|
+
return {
|
|
30
|
+
allowed: false,
|
|
31
|
+
reason: `Resource "${r.resource}" budget exhausted: ${tracker.used}/${tracker.dailyLimit} used, need ${r.perRun}, only ${remaining} remaining`,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return { allowed: true };
|
|
36
|
+
}
|
|
37
|
+
/** Run a job if budget allows. Deducts resource usage on success. */
|
|
38
|
+
async executeJob(jobId) {
|
|
39
|
+
const check = this.canRun(jobId);
|
|
40
|
+
if (!check.allowed) {
|
|
41
|
+
console.warn(`⛔ Job "${jobId}" blocked: ${check.reason}`);
|
|
42
|
+
return { ran: false, reason: check.reason };
|
|
43
|
+
}
|
|
44
|
+
const job = this.jobs.get(jobId);
|
|
45
|
+
// Reserve budget before running
|
|
46
|
+
for (const r of job.resources) {
|
|
47
|
+
const tracker = this.getTracker(r.resource, r.dailyLimit);
|
|
48
|
+
tracker.used += r.perRun;
|
|
49
|
+
// Warn at 80%
|
|
50
|
+
const pct = tracker.used / tracker.dailyLimit;
|
|
51
|
+
if (pct >= 0.8) {
|
|
52
|
+
console.warn(`⚠️ Resource "${r.resource}" at ${Math.round(pct * 100)}% (${tracker.used}/${tracker.dailyLimit})`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
try {
|
|
56
|
+
await job.execute();
|
|
57
|
+
return { ran: true };
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
console.error(`Job "${jobId}" failed:`, err);
|
|
61
|
+
// Budget is still consumed — the attempt was made
|
|
62
|
+
return { ran: true, reason: `Execution error: ${err instanceof Error ? err.message : String(err)}` };
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/** Get budget status for all resources */
|
|
66
|
+
status() {
|
|
67
|
+
return [...this.trackers.values()].map(t => {
|
|
68
|
+
this.maybeReset(t);
|
|
69
|
+
return {
|
|
70
|
+
resource: t.resource,
|
|
71
|
+
used: t.used,
|
|
72
|
+
dailyLimit: t.dailyLimit,
|
|
73
|
+
remaining: t.dailyLimit - t.used,
|
|
74
|
+
pct: Math.round((t.used / t.dailyLimit) * 100),
|
|
75
|
+
};
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
getTracker(resource, dailyLimit) {
|
|
79
|
+
let tracker = this.trackers.get(resource);
|
|
80
|
+
if (!tracker) {
|
|
81
|
+
tracker = { resource, dailyLimit, used: 0, resetDate: this.today() };
|
|
82
|
+
this.trackers.set(resource, tracker);
|
|
83
|
+
}
|
|
84
|
+
this.maybeReset(tracker);
|
|
85
|
+
return tracker;
|
|
86
|
+
}
|
|
87
|
+
maybeReset(tracker) {
|
|
88
|
+
const today = this.today();
|
|
89
|
+
if (tracker.resetDate !== today) {
|
|
90
|
+
tracker.used = 0;
|
|
91
|
+
tracker.resetDate = today;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
today() {
|
|
95
|
+
return new Date().toISOString().slice(0, 10);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=budget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"budget.js","sourceRoot":"","sources":["../../src/cron/budget.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/formatters/markdown.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,CAAC;AAEzE;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM,CAO9E"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
// Mach6 — Per-Channel Markdown Formatter (fixes Pain #17)
|
|
2
|
+
// Convert markdown to channel-safe formats
|
|
3
|
+
/**
|
|
4
|
+
* Format markdown content for a specific channel.
|
|
5
|
+
*/
|
|
6
|
+
export function formatForChannel(content, format) {
|
|
7
|
+
switch (format) {
|
|
8
|
+
case 'whatsapp': return toWhatsApp(content);
|
|
9
|
+
case 'discord': return toDiscord(content);
|
|
10
|
+
case 'plain': return toPlain(content);
|
|
11
|
+
case 'markdown': return content;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/** WhatsApp: no tables, no headers, limited markdown */
|
|
15
|
+
function toWhatsApp(md) {
|
|
16
|
+
let text = md;
|
|
17
|
+
// Headers → bold
|
|
18
|
+
text = text.replace(/^#{1,6}\s+(.+)$/gm, '*$1*');
|
|
19
|
+
// Tables → bullet lists
|
|
20
|
+
text = convertTablesToBullets(text);
|
|
21
|
+
// Code blocks: keep backticks (WhatsApp supports ```)
|
|
22
|
+
// Horizontal rules → blank line
|
|
23
|
+
text = text.replace(/^---+$/gm, '');
|
|
24
|
+
// Links: [text](url) → text (url)
|
|
25
|
+
text = text.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '$1 ($2)');
|
|
26
|
+
// Images:  → [Image: alt]
|
|
27
|
+
text = text.replace(/!\[([^\]]*)\]\([^)]+\)/g, '[Image: $1]');
|
|
28
|
+
return text.trim();
|
|
29
|
+
}
|
|
30
|
+
/** Discord: tables → code blocks, mostly fine */
|
|
31
|
+
function toDiscord(md) {
|
|
32
|
+
let text = md;
|
|
33
|
+
// Tables → code blocks
|
|
34
|
+
text = convertTablesToCodeBlocks(text);
|
|
35
|
+
// Suppress link embeds for multiple URLs
|
|
36
|
+
text = text.replace(/(https?:\/\/\S+)/g, '<$1>');
|
|
37
|
+
return text.trim();
|
|
38
|
+
}
|
|
39
|
+
/** Plain: strip all markdown */
|
|
40
|
+
function toPlain(md) {
|
|
41
|
+
let text = md;
|
|
42
|
+
// Headers
|
|
43
|
+
text = text.replace(/^#{1,6}\s+/gm, '');
|
|
44
|
+
// Bold/italic
|
|
45
|
+
text = text.replace(/\*\*(.+?)\*\*/g, '$1');
|
|
46
|
+
text = text.replace(/\*(.+?)\*/g, '$1');
|
|
47
|
+
text = text.replace(/__(.+?)__/g, '$1');
|
|
48
|
+
text = text.replace(/_(.+?)_/g, '$1');
|
|
49
|
+
// Code
|
|
50
|
+
text = text.replace(/```[\s\S]*?```/g, (m) => m.replace(/```\w*\n?/g, '').replace(/```/g, ''));
|
|
51
|
+
text = text.replace(/`(.+?)`/g, '$1');
|
|
52
|
+
// Links
|
|
53
|
+
text = text.replace(/\[([^\]]+)\]\([^)]+\)/g, '$1');
|
|
54
|
+
// Images
|
|
55
|
+
text = text.replace(/!\[([^\]]*)\]\([^)]+\)/g, '$1');
|
|
56
|
+
// Tables
|
|
57
|
+
text = convertTablesToBullets(text);
|
|
58
|
+
// HRs
|
|
59
|
+
text = text.replace(/^---+$/gm, '');
|
|
60
|
+
// Blockquotes
|
|
61
|
+
text = text.replace(/^>\s?/gm, '');
|
|
62
|
+
return text.trim();
|
|
63
|
+
}
|
|
64
|
+
/** Convert markdown tables to bullet lists */
|
|
65
|
+
function convertTablesToBullets(text) {
|
|
66
|
+
return text.replace(/(?:^\|.+\|$\n?)+/gm, (table) => {
|
|
67
|
+
const rows = table.trim().split('\n').filter(r => !r.match(/^\|[\s\-:|]+\|$/));
|
|
68
|
+
if (rows.length === 0)
|
|
69
|
+
return table;
|
|
70
|
+
const headers = rows[0].split('|').map(c => c.trim()).filter(Boolean);
|
|
71
|
+
const dataRows = rows.slice(1);
|
|
72
|
+
return dataRows.map(row => {
|
|
73
|
+
const cells = row.split('|').map(c => c.trim()).filter(Boolean);
|
|
74
|
+
const parts = cells.map((cell, i) => headers[i] ? `${headers[i]}: ${cell}` : cell);
|
|
75
|
+
return `• ${parts.join(' | ')}`;
|
|
76
|
+
}).join('\n') + '\n';
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
/** Convert markdown tables to code blocks (for Discord) */
|
|
80
|
+
function convertTablesToCodeBlocks(text) {
|
|
81
|
+
return text.replace(/(?:^\|.+\|$\n?)+/gm, (table) => {
|
|
82
|
+
return '```\n' + table.trim() + '\n```\n';
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/formatters/markdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mach6 — Gateway Daemon
|
|
3
|
+
*
|
|
4
|
+
* The persistent process. Manages channel lifecycle, agent sessions,
|
|
5
|
+
* signal handling, graceful shutdown, and hot-reload.
|
|
6
|
+
*
|
|
7
|
+
* Mach6 AI Gateway — sovereign engine.
|
|
8
|
+
*/
|
|
9
|
+
import type { ChannelPolicy } from '../channels/types.js';
|
|
10
|
+
interface GatewayConfig {
|
|
11
|
+
/** Path to mach6.json */
|
|
12
|
+
configPath?: string;
|
|
13
|
+
/** Channels to enable */
|
|
14
|
+
channels?: {
|
|
15
|
+
discord?: {
|
|
16
|
+
enabled: boolean;
|
|
17
|
+
token: string;
|
|
18
|
+
botId?: string;
|
|
19
|
+
/** Other bot IDs to suppress responses to (prevents cross-bot echo) */
|
|
20
|
+
siblingBotIds?: string[];
|
|
21
|
+
policy?: Partial<ChannelPolicy>;
|
|
22
|
+
};
|
|
23
|
+
whatsapp?: {
|
|
24
|
+
enabled: boolean;
|
|
25
|
+
authDir: string;
|
|
26
|
+
phoneNumber?: string;
|
|
27
|
+
autoRead?: boolean;
|
|
28
|
+
policy?: Partial<ChannelPolicy>;
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
/** Owner IDs across all channels */
|
|
32
|
+
ownerIds?: string[];
|
|
33
|
+
/** HTTP API port */
|
|
34
|
+
apiPort?: number;
|
|
35
|
+
}
|
|
36
|
+
export declare class Mach6Gateway {
|
|
37
|
+
private config;
|
|
38
|
+
private gatewayConfig;
|
|
39
|
+
private channelRegistry;
|
|
40
|
+
private toolRegistry;
|
|
41
|
+
private sessionManager;
|
|
42
|
+
private activeTurns;
|
|
43
|
+
private provider;
|
|
44
|
+
private providerName;
|
|
45
|
+
private model;
|
|
46
|
+
private systemPrompt;
|
|
47
|
+
private shutdownRequested;
|
|
48
|
+
private heartbeat;
|
|
49
|
+
private subAgentManager;
|
|
50
|
+
private startTime;
|
|
51
|
+
private httpApi;
|
|
52
|
+
private mcpBridges;
|
|
53
|
+
constructor(gatewayConfig: GatewayConfig);
|
|
54
|
+
start(): Promise<void>;
|
|
55
|
+
private connectMcpServers;
|
|
56
|
+
private startChannels;
|
|
57
|
+
private startHttpApi;
|
|
58
|
+
/**
|
|
59
|
+
* Handle an HTTP API chat request by running it through the full agent pipeline.
|
|
60
|
+
* Creates a synthetic BusEnvelope and processes it like any other channel message.
|
|
61
|
+
*/
|
|
62
|
+
private handleHttpChat;
|
|
63
|
+
/**
|
|
64
|
+
* The core message loop. Polls the bus for new messages and dispatches
|
|
65
|
+
* agent turns. Each session gets at most one concurrent agent turn.
|
|
66
|
+
*
|
|
67
|
+
* When a new message arrives during an active turn, the bus handles it:
|
|
68
|
+
* - interrupt priority → cancels current turn
|
|
69
|
+
* - high priority → queued, injected at next iteration
|
|
70
|
+
* - normal/low → queued for after current turn
|
|
71
|
+
*/
|
|
72
|
+
private startMessageLoop;
|
|
73
|
+
private pendingEnvelopes;
|
|
74
|
+
private handleEnvelope;
|
|
75
|
+
private handleInterrupt;
|
|
76
|
+
private runAgentTurn;
|
|
77
|
+
private buildUserContent;
|
|
78
|
+
private setupSignals;
|
|
79
|
+
status(): {
|
|
80
|
+
uptime: number;
|
|
81
|
+
provider: string;
|
|
82
|
+
channels: {
|
|
83
|
+
id: string;
|
|
84
|
+
channelType: string;
|
|
85
|
+
status: string;
|
|
86
|
+
health: import("../channels/types.js").AdapterHealth;
|
|
87
|
+
startedAt?: number;
|
|
88
|
+
error?: string;
|
|
89
|
+
}[];
|
|
90
|
+
activeTurns: number;
|
|
91
|
+
sessions: number;
|
|
92
|
+
tools: number;
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
export declare function startGateway(configPath?: string): Promise<Mach6Gateway>;
|
|
96
|
+
export {};
|
|
97
|
+
//# sourceMappingURL=daemon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/gateway/daemon.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA4CH,OAAO,KAAK,EAAe,aAAa,EAAmB,MAAM,sBAAsB,CAAC;AAQxF,UAAU,aAAa;IACrB,yBAAyB;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yBAAyB;IACzB,QAAQ,CAAC,EAAE;QACT,OAAO,CAAC,EAAE;YACR,OAAO,EAAE,OAAO,CAAC;YACjB,KAAK,EAAE,MAAM,CAAC;YACd,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,uEAAuE;YACvE,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;YACzB,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;SACjC,CAAC;QACF,QAAQ,CAAC,EAAE;YACT,OAAO,EAAE,OAAO,CAAC;YACjB,OAAO,EAAE,MAAM,CAAC;YAChB,WAAW,CAAC,EAAE,MAAM,CAAC;YACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;YACnB,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;SACjC,CAAC;KACH,CAAC;IACF,oCAAoC;IACpC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,oBAAoB;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAsBD,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,WAAW,CAAiC;IACpD,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,UAAU,CAAmB;gBAEzB,aAAa,EAAE,aAAa;IAuFlC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAuCd,iBAAiB;YAuDjB,aAAa;YAqEb,YAAY;IAiC1B;;;OAGG;IACH,OAAO,CAAC,cAAc;IAiGtB;;;;;;;;OAQG;IACH,OAAO,CAAC,gBAAgB;IA0BxB,OAAO,CAAC,gBAAgB,CAAoC;YAE9C,cAAc;IAiB5B,OAAO,CAAC,eAAe;YAWT,YAAY;IAyM1B,OAAO,CAAC,gBAAgB;IAoCxB,OAAO,CAAC,YAAY;IAwDpB,MAAM;;;;;;;;;;;;;;;CAUP;AAID,wBAAsB,YAAY,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CA8B7E"}
|