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.
Files changed (245) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +454 -0
  3. package/dist/agent/context-monitor.d.ts +40 -0
  4. package/dist/agent/context-monitor.d.ts.map +1 -0
  5. package/dist/agent/context-monitor.js +138 -0
  6. package/dist/agent/context-monitor.js.map +1 -0
  7. package/dist/agent/context.d.ts +8 -0
  8. package/dist/agent/context.d.ts.map +1 -0
  9. package/dist/agent/context.js +197 -0
  10. package/dist/agent/context.js.map +1 -0
  11. package/dist/agent/runner.d.ts +42 -0
  12. package/dist/agent/runner.d.ts.map +1 -0
  13. package/dist/agent/runner.js +168 -0
  14. package/dist/agent/runner.js.map +1 -0
  15. package/dist/agent/system-prompt.d.ts +10 -0
  16. package/dist/agent/system-prompt.d.ts.map +1 -0
  17. package/dist/agent/system-prompt.js +120 -0
  18. package/dist/agent/system-prompt.js.map +1 -0
  19. package/dist/boot/sequence.d.ts +34 -0
  20. package/dist/boot/sequence.d.ts.map +1 -0
  21. package/dist/boot/sequence.js +103 -0
  22. package/dist/boot/sequence.js.map +1 -0
  23. package/dist/channels/__test__/integration.test.d.ts +8 -0
  24. package/dist/channels/__test__/integration.test.d.ts.map +1 -0
  25. package/dist/channels/__test__/integration.test.js +221 -0
  26. package/dist/channels/__test__/integration.test.js.map +1 -0
  27. package/dist/channels/adapter.d.ts +53 -0
  28. package/dist/channels/adapter.d.ts.map +1 -0
  29. package/dist/channels/adapter.js +164 -0
  30. package/dist/channels/adapter.js.map +1 -0
  31. package/dist/channels/adapters/discord.d.ts +49 -0
  32. package/dist/channels/adapters/discord.d.ts.map +1 -0
  33. package/dist/channels/adapters/discord.js +382 -0
  34. package/dist/channels/adapters/discord.js.map +1 -0
  35. package/dist/channels/adapters/whatsapp.d.ts +59 -0
  36. package/dist/channels/adapters/whatsapp.d.ts.map +1 -0
  37. package/dist/channels/adapters/whatsapp.js +503 -0
  38. package/dist/channels/adapters/whatsapp.js.map +1 -0
  39. package/dist/channels/bus.d.ts +55 -0
  40. package/dist/channels/bus.d.ts.map +1 -0
  41. package/dist/channels/bus.js +307 -0
  42. package/dist/channels/bus.js.map +1 -0
  43. package/dist/channels/formatter.d.ts +16 -0
  44. package/dist/channels/formatter.d.ts.map +1 -0
  45. package/dist/channels/formatter.js +226 -0
  46. package/dist/channels/formatter.js.map +1 -0
  47. package/dist/channels/presence.d.ts +67 -0
  48. package/dist/channels/presence.d.ts.map +1 -0
  49. package/dist/channels/presence.js +209 -0
  50. package/dist/channels/presence.js.map +1 -0
  51. package/dist/channels/registry.d.ts +57 -0
  52. package/dist/channels/registry.d.ts.map +1 -0
  53. package/dist/channels/registry.js +159 -0
  54. package/dist/channels/registry.js.map +1 -0
  55. package/dist/channels/router.d.ts +49 -0
  56. package/dist/channels/router.d.ts.map +1 -0
  57. package/dist/channels/router.js +244 -0
  58. package/dist/channels/router.js.map +1 -0
  59. package/dist/channels/types.d.ts +279 -0
  60. package/dist/channels/types.d.ts.map +1 -0
  61. package/dist/channels/types.js +67 -0
  62. package/dist/channels/types.js.map +1 -0
  63. package/dist/cli/brand.d.ts +71 -0
  64. package/dist/cli/brand.d.ts.map +1 -0
  65. package/dist/cli/brand.js +194 -0
  66. package/dist/cli/brand.js.map +1 -0
  67. package/dist/cli/wizard.d.ts +8 -0
  68. package/dist/cli/wizard.d.ts.map +1 -0
  69. package/dist/cli/wizard.js +520 -0
  70. package/dist/cli/wizard.js.map +1 -0
  71. package/dist/config/config.d.ts +47 -0
  72. package/dist/config/config.d.ts.map +1 -0
  73. package/dist/config/config.js +63 -0
  74. package/dist/config/config.js.map +1 -0
  75. package/dist/config/validator.d.ts +18 -0
  76. package/dist/config/validator.d.ts.map +1 -0
  77. package/dist/config/validator.js +92 -0
  78. package/dist/config/validator.js.map +1 -0
  79. package/dist/cron/budget.d.ts +39 -0
  80. package/dist/cron/budget.d.ts.map +1 -0
  81. package/dist/cron/budget.js +98 -0
  82. package/dist/cron/budget.js.map +1 -0
  83. package/dist/formatters/markdown.d.ts +6 -0
  84. package/dist/formatters/markdown.d.ts.map +1 -0
  85. package/dist/formatters/markdown.js +85 -0
  86. package/dist/formatters/markdown.js.map +1 -0
  87. package/dist/gateway/daemon.d.ts +97 -0
  88. package/dist/gateway/daemon.d.ts.map +1 -0
  89. package/dist/gateway/daemon.js +772 -0
  90. package/dist/gateway/daemon.js.map +1 -0
  91. package/dist/heartbeat/scheduler.d.ts +45 -0
  92. package/dist/heartbeat/scheduler.d.ts.map +1 -0
  93. package/dist/heartbeat/scheduler.js +102 -0
  94. package/dist/heartbeat/scheduler.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 +305 -0
  98. package/dist/index.js.map +1 -0
  99. package/dist/memory/integrity.d.ts +37 -0
  100. package/dist/memory/integrity.d.ts.map +1 -0
  101. package/dist/memory/integrity.js +108 -0
  102. package/dist/memory/integrity.js.map +1 -0
  103. package/dist/providers/anthropic.d.ts +3 -0
  104. package/dist/providers/anthropic.d.ts.map +1 -0
  105. package/dist/providers/anthropic.js +232 -0
  106. package/dist/providers/anthropic.js.map +1 -0
  107. package/dist/providers/diagnostics.d.ts +18 -0
  108. package/dist/providers/diagnostics.d.ts.map +1 -0
  109. package/dist/providers/diagnostics.js +87 -0
  110. package/dist/providers/diagnostics.js.map +1 -0
  111. package/dist/providers/github-copilot.d.ts +3 -0
  112. package/dist/providers/github-copilot.d.ts.map +1 -0
  113. package/dist/providers/github-copilot.js +145 -0
  114. package/dist/providers/github-copilot.js.map +1 -0
  115. package/dist/providers/gladius.d.ts +3 -0
  116. package/dist/providers/gladius.d.ts.map +1 -0
  117. package/dist/providers/gladius.js +16 -0
  118. package/dist/providers/gladius.js.map +1 -0
  119. package/dist/providers/openai.d.ts +3 -0
  120. package/dist/providers/openai.d.ts.map +1 -0
  121. package/dist/providers/openai.js +161 -0
  122. package/dist/providers/openai.js.map +1 -0
  123. package/dist/providers/retry.d.ts +2 -0
  124. package/dist/providers/retry.d.ts.map +1 -0
  125. package/dist/providers/retry.js +50 -0
  126. package/dist/providers/retry.js.map +1 -0
  127. package/dist/providers/types.d.ts +78 -0
  128. package/dist/providers/types.d.ts.map +1 -0
  129. package/dist/providers/types.js +3 -0
  130. package/dist/providers/types.js.map +1 -0
  131. package/dist/security/sanitizer.d.ts +26 -0
  132. package/dist/security/sanitizer.d.ts.map +1 -0
  133. package/dist/security/sanitizer.js +115 -0
  134. package/dist/security/sanitizer.js.map +1 -0
  135. package/dist/sessions/manager.d.ts +40 -0
  136. package/dist/sessions/manager.d.ts.map +1 -0
  137. package/dist/sessions/manager.js +255 -0
  138. package/dist/sessions/manager.js.map +1 -0
  139. package/dist/sessions/queue.d.ts +41 -0
  140. package/dist/sessions/queue.d.ts.map +1 -0
  141. package/dist/sessions/queue.js +93 -0
  142. package/dist/sessions/queue.js.map +1 -0
  143. package/dist/sessions/store.d.ts +12 -0
  144. package/dist/sessions/store.d.ts.map +1 -0
  145. package/dist/sessions/store.js +74 -0
  146. package/dist/sessions/store.js.map +1 -0
  147. package/dist/sessions/sub-agent.d.ts +18 -0
  148. package/dist/sessions/sub-agent.d.ts.map +1 -0
  149. package/dist/sessions/sub-agent.js +117 -0
  150. package/dist/sessions/sub-agent.js.map +1 -0
  151. package/dist/sessions/types.d.ts +48 -0
  152. package/dist/sessions/types.d.ts.map +1 -0
  153. package/dist/sessions/types.js +3 -0
  154. package/dist/sessions/types.js.map +1 -0
  155. package/dist/test/channel-integration.d.ts +10 -0
  156. package/dist/test/channel-integration.d.ts.map +1 -0
  157. package/dist/test/channel-integration.js +226 -0
  158. package/dist/test/channel-integration.js.map +1 -0
  159. package/dist/test/prompt-test.d.ts +2 -0
  160. package/dist/test/prompt-test.d.ts.map +1 -0
  161. package/dist/test/prompt-test.js +33 -0
  162. package/dist/test/prompt-test.js.map +1 -0
  163. package/dist/test/smoke.d.ts +8 -0
  164. package/dist/test/smoke.d.ts.map +1 -0
  165. package/dist/test/smoke.js +134 -0
  166. package/dist/test/smoke.js.map +1 -0
  167. package/dist/tools/builtin/comb.d.ts +4 -0
  168. package/dist/tools/builtin/comb.d.ts.map +1 -0
  169. package/dist/tools/builtin/comb.js +50 -0
  170. package/dist/tools/builtin/comb.js.map +1 -0
  171. package/dist/tools/builtin/edit.d.ts +3 -0
  172. package/dist/tools/builtin/edit.d.ts.map +1 -0
  173. package/dist/tools/builtin/edit.js +42 -0
  174. package/dist/tools/builtin/edit.js.map +1 -0
  175. package/dist/tools/builtin/exec.d.ts +3 -0
  176. package/dist/tools/builtin/exec.d.ts.map +1 -0
  177. package/dist/tools/builtin/exec.js +75 -0
  178. package/dist/tools/builtin/exec.js.map +1 -0
  179. package/dist/tools/builtin/image.d.ts +3 -0
  180. package/dist/tools/builtin/image.d.ts.map +1 -0
  181. package/dist/tools/builtin/image.js +208 -0
  182. package/dist/tools/builtin/image.js.map +1 -0
  183. package/dist/tools/builtin/memory.d.ts +3 -0
  184. package/dist/tools/builtin/memory.d.ts.map +1 -0
  185. package/dist/tools/builtin/memory.js +36 -0
  186. package/dist/tools/builtin/memory.js.map +1 -0
  187. package/dist/tools/builtin/message.d.ts +13 -0
  188. package/dist/tools/builtin/message.d.ts.map +1 -0
  189. package/dist/tools/builtin/message.js +330 -0
  190. package/dist/tools/builtin/message.js.map +1 -0
  191. package/dist/tools/builtin/process.d.ts +43 -0
  192. package/dist/tools/builtin/process.d.ts.map +1 -0
  193. package/dist/tools/builtin/process.js +178 -0
  194. package/dist/tools/builtin/process.js.map +1 -0
  195. package/dist/tools/builtin/read.d.ts +3 -0
  196. package/dist/tools/builtin/read.d.ts.map +1 -0
  197. package/dist/tools/builtin/read.js +36 -0
  198. package/dist/tools/builtin/read.js.map +1 -0
  199. package/dist/tools/builtin/spawn.d.ts +8 -0
  200. package/dist/tools/builtin/spawn.d.ts.map +1 -0
  201. package/dist/tools/builtin/spawn.js +90 -0
  202. package/dist/tools/builtin/spawn.js.map +1 -0
  203. package/dist/tools/builtin/tts.d.ts +3 -0
  204. package/dist/tools/builtin/tts.d.ts.map +1 -0
  205. package/dist/tools/builtin/tts.js +77 -0
  206. package/dist/tools/builtin/tts.js.map +1 -0
  207. package/dist/tools/builtin/web-fetch.d.ts +3 -0
  208. package/dist/tools/builtin/web-fetch.d.ts.map +1 -0
  209. package/dist/tools/builtin/web-fetch.js +46 -0
  210. package/dist/tools/builtin/web-fetch.js.map +1 -0
  211. package/dist/tools/builtin/write.d.ts +3 -0
  212. package/dist/tools/builtin/write.d.ts.map +1 -0
  213. package/dist/tools/builtin/write.js +31 -0
  214. package/dist/tools/builtin/write.js.map +1 -0
  215. package/dist/tools/mcp-bridge.d.ts +42 -0
  216. package/dist/tools/mcp-bridge.d.ts.map +1 -0
  217. package/dist/tools/mcp-bridge.js +198 -0
  218. package/dist/tools/mcp-bridge.js.map +1 -0
  219. package/dist/tools/policy.d.ts +57 -0
  220. package/dist/tools/policy.d.ts.map +1 -0
  221. package/dist/tools/policy.js +106 -0
  222. package/dist/tools/policy.js.map +1 -0
  223. package/dist/tools/registry.d.ts +15 -0
  224. package/dist/tools/registry.d.ts.map +1 -0
  225. package/dist/tools/registry.js +41 -0
  226. package/dist/tools/registry.js.map +1 -0
  227. package/dist/tools/sandbox.d.ts +91 -0
  228. package/dist/tools/sandbox.d.ts.map +1 -0
  229. package/dist/tools/sandbox.js +279 -0
  230. package/dist/tools/sandbox.js.map +1 -0
  231. package/dist/tools/types.d.ts +23 -0
  232. package/dist/tools/types.d.ts.map +1 -0
  233. package/dist/tools/types.js +3 -0
  234. package/dist/tools/types.js.map +1 -0
  235. package/dist/web/http-api.d.ts +61 -0
  236. package/dist/web/http-api.d.ts.map +1 -0
  237. package/dist/web/http-api.js +200 -0
  238. package/dist/web/http-api.js.map +1 -0
  239. package/dist/web/server.d.ts +7 -0
  240. package/dist/web/server.d.ts.map +1 -0
  241. package/dist/web/server.js +396 -0
  242. package/dist/web/server.js.map +1 -0
  243. package/mach6.example.json +50 -0
  244. package/package.json +58 -0
  245. 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,6 @@
1
+ export type OutputFormat = 'whatsapp' | 'discord' | 'plain' | 'markdown';
2
+ /**
3
+ * Format markdown content for a specific channel.
4
+ */
5
+ export declare function formatForChannel(content: string, format: OutputFormat): string;
6
+ //# sourceMappingURL=markdown.d.ts.map
@@ -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: ![alt](url) → [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"}