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,106 @@
1
+ // Mach6 — Tool Policy Engine (fixes Pain #6, #12)
2
+ // Clean allow/deny, no phantom queues, dynamic iteration limits, resource budgets
3
+ const DEFAULT_LIMITS = {
4
+ simple: 10,
5
+ complex: 50,
6
+ };
7
+ const DEFAULT_TOOL_POLICY = 'allow';
8
+ export class PolicyEngine {
9
+ sessionPolicies = new Map();
10
+ globalDeny = new Set(); // tools denied for everyone
11
+ budgets = new Map();
12
+ /** Set global deny list */
13
+ setGlobalDeny(tools) {
14
+ this.globalDeny = new Set(tools);
15
+ }
16
+ /** Configure policy for a session */
17
+ setSessionPolicy(policy) {
18
+ this.sessionPolicies.set(policy.sessionId, policy);
19
+ }
20
+ /** Check if a tool is allowed for a session. No phantom queues — immediate answer. */
21
+ check(sessionId, toolName) {
22
+ // Global deny takes precedence
23
+ if (this.globalDeny.has(toolName)) {
24
+ return { allowed: false, reason: `Tool "${toolName}" is globally denied` };
25
+ }
26
+ const sp = this.sessionPolicies.get(sessionId);
27
+ if (sp?.tools[toolName] === 'deny') {
28
+ return { allowed: false, reason: `Tool "${toolName}" denied for session ${sessionId}` };
29
+ }
30
+ if (sp?.tools[toolName] === 'allow') {
31
+ return { allowed: true };
32
+ }
33
+ // Default policy
34
+ return { allowed: DEFAULT_TOOL_POLICY === 'allow' };
35
+ }
36
+ /** Get iteration limit for a session */
37
+ getIterationLimit(sessionId) {
38
+ const sp = this.sessionPolicies.get(sessionId);
39
+ if (sp?.maxIterations)
40
+ return sp.maxIterations;
41
+ const complexity = sp?.complexity ?? 'complex';
42
+ return DEFAULT_LIMITS[complexity] ?? 25;
43
+ }
44
+ /**
45
+ * Check iteration progress. Returns warning message if approaching limit.
46
+ */
47
+ checkIteration(sessionId, current) {
48
+ const limit = this.getIterationLimit(sessionId);
49
+ const ratio = current / limit;
50
+ if (ratio >= 1) {
51
+ return { ok: false, warning: `Iteration limit reached (${current}/${limit}). Stopping.` };
52
+ }
53
+ if (ratio >= 0.8) {
54
+ return { ok: true, warning: `Approaching iteration limit: ${current}/${limit} (${Math.round(ratio * 100)}%)` };
55
+ }
56
+ return { ok: true };
57
+ }
58
+ // ── Resource Budgets ──
59
+ /** Register a resource budget */
60
+ registerBudget(resource, dailyLimit, perRun) {
61
+ const now = Date.now();
62
+ const resetAt = this.nextMidnight(now);
63
+ this.budgets.set(resource, { resource, dailyLimit, perRun, used: 0, resetAt });
64
+ }
65
+ /** Try to consume resource. Returns true if allowed. */
66
+ consumeResource(resource, amount) {
67
+ const budget = this.budgets.get(resource);
68
+ if (!budget)
69
+ return { allowed: true, remaining: Infinity }; // no budget = unlimited
70
+ // Reset if past midnight
71
+ if (Date.now() >= budget.resetAt) {
72
+ budget.used = 0;
73
+ budget.resetAt = this.nextMidnight(Date.now());
74
+ }
75
+ // Check per-run limit
76
+ if (budget.perRun !== undefined && amount > budget.perRun) {
77
+ return { allowed: false, remaining: budget.dailyLimit - budget.used, reason: `Exceeds per-run limit (${amount} > ${budget.perRun})` };
78
+ }
79
+ // Check daily limit
80
+ if (budget.used + amount > budget.dailyLimit) {
81
+ return { allowed: false, remaining: budget.dailyLimit - budget.used, reason: `Daily budget exhausted (${budget.used}/${budget.dailyLimit})` };
82
+ }
83
+ budget.used += amount;
84
+ const remaining = budget.dailyLimit - budget.used;
85
+ // Warn at 80%
86
+ if (budget.used / budget.dailyLimit >= 0.8) {
87
+ console.warn(`⚠️ Resource "${resource}" at ${Math.round((budget.used / budget.dailyLimit) * 100)}% of daily budget (${budget.used}/${budget.dailyLimit})`);
88
+ }
89
+ return { allowed: true, remaining };
90
+ }
91
+ /** Get budget status for a resource */
92
+ getBudgetStatus(resource) {
93
+ const budget = this.budgets.get(resource);
94
+ if (budget && Date.now() >= budget.resetAt) {
95
+ budget.used = 0;
96
+ budget.resetAt = this.nextMidnight(Date.now());
97
+ }
98
+ return budget;
99
+ }
100
+ nextMidnight(now) {
101
+ const d = new Date(now);
102
+ d.setHours(24, 0, 0, 0);
103
+ return d.getTime();
104
+ }
105
+ }
106
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/tools/policy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { ToolDef } from '../providers/types.js';
2
+ import type { ToolDefinition } from './types.js';
3
+ export declare class ToolRegistry {
4
+ private tools;
5
+ register(tool: ToolDefinition): void;
6
+ get(name: string): ToolDefinition | undefined;
7
+ list(): ToolDefinition[];
8
+ /** Convert all registered tools to provider-format ToolDefs */
9
+ toProviderFormat(): ToolDef[];
10
+ /** Execute a tool by name */
11
+ execute(name: string, input: Record<string, unknown>): Promise<string>;
12
+ }
13
+ /** Create a registry with all builtin tools pre-registered */
14
+ export declare function createDefaultRegistry(): ToolRegistry;
15
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAqC;IAElD,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAIpC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAI7C,IAAI,IAAI,cAAc,EAAE;IAIxB,+DAA+D;IAC/D,gBAAgB,IAAI,OAAO,EAAE;IAQ7B,6BAA6B;IACvB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;CAU7E;AAED,8DAA8D;AAC9D,wBAAgB,qBAAqB,IAAI,YAAY,CAIpD"}
@@ -0,0 +1,41 @@
1
+ // Mach6 — Tool registry: register, lookup, dispatch, convert to provider format
2
+ export class ToolRegistry {
3
+ tools = new Map();
4
+ register(tool) {
5
+ this.tools.set(tool.name, tool);
6
+ }
7
+ get(name) {
8
+ return this.tools.get(name);
9
+ }
10
+ list() {
11
+ return [...this.tools.values()];
12
+ }
13
+ /** Convert all registered tools to provider-format ToolDefs */
14
+ toProviderFormat() {
15
+ return this.list().map(t => ({
16
+ name: t.name,
17
+ description: t.description,
18
+ parameters: t.parameters,
19
+ }));
20
+ }
21
+ /** Execute a tool by name */
22
+ async execute(name, input) {
23
+ const tool = this.tools.get(name);
24
+ if (!tool)
25
+ return JSON.stringify({ error: `Unknown tool: ${name}` });
26
+ try {
27
+ return await tool.execute(input);
28
+ }
29
+ catch (err) {
30
+ const msg = err instanceof Error ? err.message : String(err);
31
+ return JSON.stringify({ error: msg });
32
+ }
33
+ }
34
+ }
35
+ /** Create a registry with all builtin tools pre-registered */
36
+ export function createDefaultRegistry() {
37
+ const registry = new ToolRegistry();
38
+ // Lazy import to avoid circular deps — tools register themselves
39
+ return registry;
40
+ }
41
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAKhF,MAAM,OAAO,YAAY;IACf,KAAK,GAAG,IAAI,GAAG,EAA0B,CAAC;IAElD,QAAQ,CAAC,IAAoB;QAC3B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,+DAA+D;IAC/D,gBAAgB;QACd,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC3B,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,UAAU,EAAE,CAAC,CAAC,UAAU;SACzB,CAAC,CAAC,CAAC;IACN,CAAC;IAED,6BAA6B;IAC7B,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,KAA8B;QACxD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,iBAAiB,IAAI,EAAE,EAAE,CAAC,CAAC;QACrE,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;CACF;AAED,8DAA8D;AAC9D,MAAM,UAAU,qBAAqB;IACnC,MAAM,QAAQ,GAAG,IAAI,YAAY,EAAE,CAAC;IACpC,iEAAiE;IACjE,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Mach6 — Tool Sandbox
3
+ *
4
+ * Enforces per-session security boundaries on tool execution.
5
+ * This is the ONLY place where tool access control happens.
6
+ *
7
+ * Architecture:
8
+ * - Every agent session gets a SandboxedToolRegistry wrapping the real ToolRegistry
9
+ * - The sandbox intercepts execute() calls and enforces rules BEFORE the tool runs
10
+ * - Rules are based on session context (channel, sender, adapter) not string matching
11
+ * - The real tools never see the sandbox — it's transparent wrapping
12
+ *
13
+ * Security model:
14
+ * - ADMIN sessions (owner DM on primary adapters) get full access
15
+ * - STANDARD sessions get restricted access (no infrastructure modification)
16
+ * - Rules are declarative and audited — every denial is logged
17
+ */
18
+ import type { ToolExecutor } from '../agent/runner.js';
19
+ export type SessionTier = 'admin' | 'standard' | 'restricted';
20
+ export interface SessionContext {
21
+ sessionId: string;
22
+ adapterId: string;
23
+ channelType: string;
24
+ chatType: 'direct' | 'group';
25
+ senderId: string;
26
+ isOwner: boolean;
27
+ }
28
+ export interface SandboxRule {
29
+ /** Human-readable name for logging */
30
+ name: string;
31
+ /** Which tools this rule applies to. '*' = all tools. */
32
+ tools: string[] | '*';
33
+ /** The check function. Return null to allow, or a string reason to deny. */
34
+ check: (tool: string, input: Record<string, unknown>, ctx: SessionContext) => string | null;
35
+ }
36
+ export interface SandboxDenial {
37
+ timestamp: number;
38
+ sessionId: string;
39
+ tier: SessionTier;
40
+ tool: string;
41
+ rule: string;
42
+ reason: string;
43
+ input: Record<string, unknown>;
44
+ }
45
+ export declare function classifySession(ctx: SessionContext): SessionTier;
46
+ export declare function getAuditLog(): SandboxDenial[];
47
+ /**
48
+ * A ToolRegistry wrapper that enforces sandbox rules per-session.
49
+ *
50
+ * Usage in daemon.ts:
51
+ * const sandboxed = createSandboxedRegistry(this.toolRegistry, sessionContext);
52
+ * // Pass sandboxed to runAgent instead of this.toolRegistry
53
+ */
54
+ export declare class SandboxedToolRegistry {
55
+ private inner;
56
+ private ctx;
57
+ private tier;
58
+ private rules;
59
+ private customRules;
60
+ constructor(inner: ToolExecutor, ctx: SessionContext, extraRules?: SandboxRule[]);
61
+ /** Proxy: get tool definition */
62
+ get(name: string): {
63
+ name: string;
64
+ description: string;
65
+ parameters: any;
66
+ } | undefined;
67
+ /** Proxy: list all tools (but may filter for restricted sessions) */
68
+ list(): Array<{
69
+ name: string;
70
+ description: string;
71
+ parameters: any;
72
+ }>;
73
+ /** Proxy: convert to provider format (respects tool visibility) */
74
+ toProviderFormat(): {
75
+ name: string;
76
+ description: string;
77
+ parameters: any;
78
+ }[];
79
+ /** Execute with sandbox enforcement */
80
+ execute(name: string, input: Record<string, unknown>): Promise<string>;
81
+ /** Sanitize input for audit log (remove large content, sensitive values) */
82
+ private sanitizeInput;
83
+ /** Get session tier */
84
+ getTier(): SessionTier;
85
+ }
86
+ /**
87
+ * Create a sandboxed tool registry for a specific session.
88
+ * This is the primary API — call it in daemon.ts before each agent turn.
89
+ */
90
+ export declare function createSandboxedRegistry(inner: ToolExecutor, ctx: SessionContext, extraRules?: SandboxRule[]): SandboxedToolRegistry;
91
+ //# sourceMappingURL=sandbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../../src/tools/sandbox.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAOH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIvD,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,UAAU,GAAG,YAAY,CAAC;AAE9D,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,KAAK,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;IACtB,4EAA4E;IAC5E,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,cAAc,KAAK,MAAM,GAAG,IAAI,CAAC;CAC7F;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAMD,wBAAgB,eAAe,CAAC,GAAG,EAAE,cAAc,GAAG,WAAW,CAWhE;AA8KD,wBAAgB,WAAW,IAAI,aAAa,EAAE,CAE7C;AAID;;;;;;GAMG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,GAAG,CAAiB;IAC5B,OAAO,CAAC,IAAI,CAAc;IAC1B,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,WAAW,CAAqB;gBAE5B,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,cAAc,EAAE,UAAU,CAAC,EAAE,WAAW,EAAE;IAShF,iCAAiC;IACjC,GAAG,CAAC,IAAI,EAAE,MAAM;cAKM,MAAM;qBAAe,MAAM;oBAAc,GAAG;;IADlE,qEAAqE;IACrE,IAAI,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,GAAG,CAAA;KAAE,CAAC;IAYrE,mEAAmE;IACnE,gBAAgB;;;;;IAQhB,uCAAuC;IACjC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAyB5E,4EAA4E;IAC5E,OAAO,CAAC,aAAa;IAYrB,uBAAuB;IACvB,OAAO,IAAI,WAAW;CAGvB;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,YAAY,EACnB,GAAG,EAAE,cAAc,EACnB,UAAU,CAAC,EAAE,WAAW,EAAE,GACzB,qBAAqB,CAEvB"}
@@ -0,0 +1,279 @@
1
+ /**
2
+ * Mach6 — Tool Sandbox
3
+ *
4
+ * Enforces per-session security boundaries on tool execution.
5
+ * This is the ONLY place where tool access control happens.
6
+ *
7
+ * Architecture:
8
+ * - Every agent session gets a SandboxedToolRegistry wrapping the real ToolRegistry
9
+ * - The sandbox intercepts execute() calls and enforces rules BEFORE the tool runs
10
+ * - Rules are based on session context (channel, sender, adapter) not string matching
11
+ * - The real tools never see the sandbox — it's transparent wrapping
12
+ *
13
+ * Security model:
14
+ * - ADMIN sessions (owner DM on primary adapters) get full access
15
+ * - STANDARD sessions get restricted access (no infrastructure modification)
16
+ * - Rules are declarative and audited — every denial is logged
17
+ */
18
+ import * as path from 'node:path';
19
+ import { fileURLToPath } from 'node:url';
20
+ // ─── Tier Classification ───────────────────────────────────────────────────
21
+ const PRIMARY_ADAPTERS = new Set(['discord-main', 'whatsapp-main']);
22
+ export function classifySession(ctx) {
23
+ // Admin: owner DM on any adapter (if the owner is talking to us directly, they're admin)
24
+ if (ctx.isOwner && ctx.chatType === 'direct') {
25
+ return 'admin';
26
+ }
27
+ // Standard: owner in group chats
28
+ if (ctx.isOwner) {
29
+ return 'standard';
30
+ }
31
+ // Restricted: non-owner
32
+ return 'restricted';
33
+ }
34
+ // ─── Built-in Rules ────────────────────────────────────────────────────────
35
+ function resolvePath(p) {
36
+ return path.resolve(p);
37
+ }
38
+ /** Mach6 engine directory (absolute) */
39
+ const __filename_esm = fileURLToPath(import.meta.url);
40
+ const __dirname_esm = path.dirname(__filename_esm);
41
+ const MACH6_ROOT = path.resolve(__dirname_esm, '..', '..');
42
+ /**
43
+ * Rule: No modifying Mach6 engine files (src/, dist/, config, package.json)
44
+ * Applies to: edit, write tools for non-admin sessions
45
+ */
46
+ const noEngineModification = {
47
+ name: 'no-engine-modification',
48
+ tools: ['edit', 'write'],
49
+ check: (tool, input, ctx) => {
50
+ // Admin gets full access
51
+ if (classifySession(ctx) === 'admin')
52
+ return null;
53
+ const filePath = resolvePath(String(input.path ?? ''));
54
+ if (filePath.startsWith(MACH6_ROOT)) {
55
+ return `Cannot modify Mach6 engine files (${path.relative(MACH6_ROOT, filePath)}). Only admin sessions can edit engine code.`;
56
+ }
57
+ return null;
58
+ },
59
+ };
60
+ /**
61
+ * Rule: No dangerous shell commands for non-admin sessions
62
+ * Blocks: systemctl restart, kill, rm -rf on system dirs, etc.
63
+ */
64
+ const noDangerousCommands = {
65
+ name: 'no-dangerous-commands',
66
+ tools: ['exec', 'process_start'],
67
+ check: (tool, input, ctx) => {
68
+ if (classifySession(ctx) === 'admin')
69
+ return null;
70
+ const command = String(input.command ?? '');
71
+ // Patterns that are NEVER allowed for non-admin sessions
72
+ const dangerousPatterns = [
73
+ // Process/service control
74
+ [/systemctl\s+.*(restart|stop|start|kill|daemon-reload).*mach6/i, 'Cannot control Mach6 service'],
75
+ [/kill\s+(-9\s+)?(\d+|%|\$)/i, 'Cannot kill processes'],
76
+ [/pkill|killall/i, 'Cannot kill processes'],
77
+ // Engine file modification via shell
78
+ [/(?:cat|echo|tee|sed|awk)\s+.*>.*mach6-core/i, 'Cannot modify Mach6 files via shell'],
79
+ [/(?:cp|mv|ln)\s+.*mach6-core\/(src|dist)/i, 'Cannot modify Mach6 files via shell'],
80
+ [/rm\s+.*mach6-core/i, 'Cannot delete Mach6 files'],
81
+ // System-level destruction
82
+ [/rm\s+-rf?\s+\/(usr|etc|var|home|boot|sys|proc)/i, 'Cannot delete system directories'],
83
+ [/mkfs|dd\s+.*of=\/dev/i, 'Cannot modify block devices'],
84
+ [/chmod\s+.*777\s+\//i, 'Cannot change root permissions'],
85
+ // Code execution that bypasses the sandbox
86
+ [/node\s+-e\s+.*child_process/i, 'Cannot spawn child processes via eval'],
87
+ [/python3?\s+-c\s+.*subprocess/i, 'Cannot spawn subprocesses via eval'],
88
+ // Network exfiltration
89
+ [/curl\s+.*-d\s+.*@/i, 'Cannot exfiltrate files via curl'],
90
+ [/scp\s+/i, 'Cannot use scp'],
91
+ [/rsync\s+.*:/i, 'Cannot use rsync to remote'],
92
+ // Credential access
93
+ [/cat\s+.*\.env\b/i, 'Cannot read environment files'],
94
+ [/cat\s+.*credentials/i, 'Cannot read credential files'],
95
+ [/cat\s+.*\.ava-private\/credentials/i, 'Cannot read credentials'],
96
+ ];
97
+ for (const [pattern, reason] of dangerousPatterns) {
98
+ if (pattern.test(command)) {
99
+ return reason;
100
+ }
101
+ }
102
+ return null;
103
+ },
104
+ };
105
+ /**
106
+ * Rule: No reading sensitive files for non-admin sessions
107
+ */
108
+ const noSensitiveReads = {
109
+ name: 'no-sensitive-reads',
110
+ tools: ['read'],
111
+ check: (tool, input, ctx) => {
112
+ if (classifySession(ctx) === 'admin')
113
+ return null;
114
+ const filePath = resolvePath(String(input.path ?? ''));
115
+ const sensitivePatterns = [
116
+ /\.env$/,
117
+ /credentials\.(json|md|txt)$/,
118
+ /\.ava-private\/credentials/,
119
+ /\.ssh\//,
120
+ /\.gnupg\//,
121
+ ];
122
+ for (const pattern of sensitivePatterns) {
123
+ if (pattern.test(filePath)) {
124
+ return `Cannot read sensitive file: ${path.basename(filePath)}`;
125
+ }
126
+ }
127
+ return null;
128
+ },
129
+ };
130
+ /**
131
+ * Rule: Restricted sessions get read-only + limited exec
132
+ */
133
+ const restrictedLimitations = {
134
+ name: 'restricted-limitations',
135
+ tools: ['write', 'edit', 'exec', 'process_start', 'spawn'],
136
+ check: (tool, input, ctx) => {
137
+ if (classifySession(ctx) !== 'restricted')
138
+ return null;
139
+ // Restricted sessions can only read, search, fetch
140
+ if (['write', 'edit'].includes(tool)) {
141
+ return 'Write access not available in this session';
142
+ }
143
+ if (['exec', 'process_start'].includes(tool)) {
144
+ return 'Shell access not available in this session';
145
+ }
146
+ if (tool === 'spawn') {
147
+ return 'Sub-agent spawning not available in this session';
148
+ }
149
+ return null;
150
+ },
151
+ };
152
+ /**
153
+ * Rule: No cross-channel messaging to owner's private chats for non-admin
154
+ */
155
+ const noCrossChannelToOwner = {
156
+ name: 'no-cross-channel-to-owner',
157
+ tools: ['message'],
158
+ check: (tool, input, ctx) => {
159
+ if (classifySession(ctx) === 'admin')
160
+ return null;
161
+ // Non-admin sessions can't send messages to other channels
162
+ // (they can only respond through the gateway's normal response path)
163
+ return 'Cross-channel messaging is only available in admin sessions';
164
+ },
165
+ };
166
+ /** All built-in rules */
167
+ const BUILTIN_RULES = [
168
+ noEngineModification,
169
+ noDangerousCommands,
170
+ noSensitiveReads,
171
+ restrictedLimitations,
172
+ noCrossChannelToOwner,
173
+ ];
174
+ // ─── Audit Log ─────────────────────────────────────────────────────────────
175
+ const MAX_AUDIT_LOG = 1000;
176
+ const auditLog = [];
177
+ function logDenial(denial) {
178
+ auditLog.push(denial);
179
+ if (auditLog.length > MAX_AUDIT_LOG)
180
+ auditLog.shift();
181
+ console.warn(`[sandbox] DENIED: session=${denial.sessionId} tier=${denial.tier} ` +
182
+ `tool=${denial.tool} rule=${denial.rule} reason="${denial.reason}"`);
183
+ }
184
+ export function getAuditLog() {
185
+ return [...auditLog];
186
+ }
187
+ // ─── Sandboxed Tool Registry ───────────────────────────────────────────────
188
+ /**
189
+ * A ToolRegistry wrapper that enforces sandbox rules per-session.
190
+ *
191
+ * Usage in daemon.ts:
192
+ * const sandboxed = createSandboxedRegistry(this.toolRegistry, sessionContext);
193
+ * // Pass sandboxed to runAgent instead of this.toolRegistry
194
+ */
195
+ export class SandboxedToolRegistry {
196
+ inner;
197
+ ctx;
198
+ tier;
199
+ rules;
200
+ customRules = [];
201
+ constructor(inner, ctx, extraRules) {
202
+ this.inner = inner;
203
+ this.ctx = ctx;
204
+ this.tier = classifySession(ctx);
205
+ this.rules = [...BUILTIN_RULES, ...(extraRules ?? [])];
206
+ console.log(`[sandbox] Session ${ctx.sessionId} classified as ${this.tier} (adapter=${ctx.adapterId}, owner=${ctx.isOwner}, chat=${ctx.chatType})`);
207
+ }
208
+ /** Proxy: get tool definition */
209
+ get(name) {
210
+ return this.list().find(t => t.name === name);
211
+ }
212
+ /** Proxy: list all tools (but may filter for restricted sessions) */
213
+ list() {
214
+ const all = this.inner.list();
215
+ if (this.tier === 'restricted') {
216
+ // Restricted sessions don't even see dangerous tools
217
+ const hiddenTools = new Set(['exec', 'process_start', 'process_kill', 'write', 'edit', 'spawn', 'message', 'delete_message']);
218
+ return all.filter(t => !hiddenTools.has(t.name));
219
+ }
220
+ return all;
221
+ }
222
+ /** Proxy: convert to provider format (respects tool visibility) */
223
+ toProviderFormat() {
224
+ return this.list().map(t => ({
225
+ name: t.name,
226
+ description: t.description,
227
+ parameters: t.parameters,
228
+ }));
229
+ }
230
+ /** Execute with sandbox enforcement */
231
+ async execute(name, input) {
232
+ // Check all applicable rules
233
+ for (const rule of this.rules) {
234
+ if (rule.tools === '*' || rule.tools.includes(name)) {
235
+ const denial = rule.check(name, input, this.ctx);
236
+ if (denial) {
237
+ const record = {
238
+ timestamp: Date.now(),
239
+ sessionId: this.ctx.sessionId,
240
+ tier: this.tier,
241
+ tool: name,
242
+ rule: rule.name,
243
+ reason: denial,
244
+ input: this.sanitizeInput(input),
245
+ };
246
+ logDenial(record);
247
+ return JSON.stringify({ error: denial, sandbox: true });
248
+ }
249
+ }
250
+ }
251
+ // All rules passed — execute
252
+ return this.inner.execute(name, input);
253
+ }
254
+ /** Sanitize input for audit log (remove large content, sensitive values) */
255
+ sanitizeInput(input) {
256
+ const clean = {};
257
+ for (const [key, value] of Object.entries(input)) {
258
+ if (typeof value === 'string' && value.length > 200) {
259
+ clean[key] = value.slice(0, 200) + '...[truncated]';
260
+ }
261
+ else {
262
+ clean[key] = value;
263
+ }
264
+ }
265
+ return clean;
266
+ }
267
+ /** Get session tier */
268
+ getTier() {
269
+ return this.tier;
270
+ }
271
+ }
272
+ /**
273
+ * Create a sandboxed tool registry for a specific session.
274
+ * This is the primary API — call it in daemon.ts before each agent turn.
275
+ */
276
+ export function createSandboxedRegistry(inner, ctx, extraRules) {
277
+ return new SandboxedToolRegistry(inner, ctx, extraRules);
278
+ }
279
+ //# sourceMappingURL=sandbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../src/tools/sandbox.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ export interface ToolParameter {
2
+ type: string;
3
+ description?: string;
4
+ required?: boolean;
5
+ enum?: string[];
6
+ items?: Record<string, unknown>;
7
+ properties?: Record<string, ToolParameter>;
8
+ }
9
+ export interface ToolDefinition {
10
+ name: string;
11
+ description: string;
12
+ parameters: {
13
+ type: 'object';
14
+ properties: Record<string, ToolParameter>;
15
+ required?: string[];
16
+ };
17
+ execute: (input: Record<string, unknown>, opts?: ToolExecuteOptions) => Promise<string>;
18
+ }
19
+ export interface ToolExecuteOptions {
20
+ sessionId?: string;
21
+ onProgress?: (chunk: string) => void;
22
+ }
23
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QAC1C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;IACF,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,EAAE,kBAAkB,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACzF;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC"}
@@ -0,0 +1,3 @@
1
+ // Mach6 — Tool type definitions
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"AAAA,gCAAgC"}