musonda 1.0.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 (196) hide show
  1. package/IMPLEMENTATION.md +432 -0
  2. package/README.md +119 -0
  3. package/dist/agent/harness.d.ts +25 -0
  4. package/dist/agent/harness.js +215 -0
  5. package/dist/agent/harness.js.map +1 -0
  6. package/dist/agent/openaiResponsesClient.d.ts +35 -0
  7. package/dist/agent/openaiResponsesClient.js +250 -0
  8. package/dist/agent/openaiResponsesClient.js.map +1 -0
  9. package/dist/agent/systemPrompt.d.ts +9 -0
  10. package/dist/agent/systemPrompt.js +100 -0
  11. package/dist/agent/systemPrompt.js.map +1 -0
  12. package/dist/agent/types.d.ts +53 -0
  13. package/dist/agent/types.js +2 -0
  14. package/dist/agent/types.js.map +1 -0
  15. package/dist/cli/commands/chat.d.ts +6 -0
  16. package/dist/cli/commands/chat.js +8 -0
  17. package/dist/cli/commands/chat.js.map +1 -0
  18. package/dist/cli/commands/doctor.d.ts +4 -0
  19. package/dist/cli/commands/doctor.js +336 -0
  20. package/dist/cli/commands/doctor.js.map +1 -0
  21. package/dist/cli/commands/gateway.d.ts +20 -0
  22. package/dist/cli/commands/gateway.js +135 -0
  23. package/dist/cli/commands/gateway.js.map +1 -0
  24. package/dist/cli/commands/help.d.ts +4 -0
  25. package/dist/cli/commands/help.js +159 -0
  26. package/dist/cli/commands/help.js.map +1 -0
  27. package/dist/cli/commands/plugins.d.ts +18 -0
  28. package/dist/cli/commands/plugins.js +250 -0
  29. package/dist/cli/commands/plugins.js.map +1 -0
  30. package/dist/cli/commands/service.d.ts +16 -0
  31. package/dist/cli/commands/service.js +136 -0
  32. package/dist/cli/commands/service.js.map +1 -0
  33. package/dist/cli/commands/setup.d.ts +4 -0
  34. package/dist/cli/commands/setup.js +8 -0
  35. package/dist/cli/commands/setup.js.map +1 -0
  36. package/dist/cli/commands/status.d.ts +4 -0
  37. package/dist/cli/commands/status.js +73 -0
  38. package/dist/cli/commands/status.js.map +1 -0
  39. package/dist/cli/commands/update.d.ts +22 -0
  40. package/dist/cli/commands/update.js +226 -0
  41. package/dist/cli/commands/update.js.map +1 -0
  42. package/dist/cli/daemon.d.ts +33 -0
  43. package/dist/cli/daemon.js +208 -0
  44. package/dist/cli/daemon.js.map +1 -0
  45. package/dist/cli/interactiveMenu.d.ts +5 -0
  46. package/dist/cli/interactiveMenu.js +225 -0
  47. package/dist/cli/interactiveMenu.js.map +1 -0
  48. package/dist/cli/musondaCli.d.ts +30 -0
  49. package/dist/cli/musondaCli.js +269 -0
  50. package/dist/cli/musondaCli.js.map +1 -0
  51. package/dist/cli/ui.d.ts +49 -0
  52. package/dist/cli/ui.js +90 -0
  53. package/dist/cli/ui.js.map +1 -0
  54. package/dist/cli.d.ts +9 -0
  55. package/dist/cli.js +315 -0
  56. package/dist/cli.js.map +1 -0
  57. package/dist/config/loader.d.ts +12 -0
  58. package/dist/config/loader.js +217 -0
  59. package/dist/config/loader.js.map +1 -0
  60. package/dist/config/paths.d.ts +11 -0
  61. package/dist/config/paths.js +18 -0
  62. package/dist/config/paths.js.map +1 -0
  63. package/dist/config/types.d.ts +246 -0
  64. package/dist/config/types.js +155 -0
  65. package/dist/config/types.js.map +1 -0
  66. package/dist/gateway/channels/cli.d.ts +37 -0
  67. package/dist/gateway/channels/cli.js +298 -0
  68. package/dist/gateway/channels/cli.js.map +1 -0
  69. package/dist/gateway/channels/discord.d.ts +18 -0
  70. package/dist/gateway/channels/discord.js +419 -0
  71. package/dist/gateway/channels/discord.js.map +1 -0
  72. package/dist/gateway/channels/slack.d.ts +26 -0
  73. package/dist/gateway/channels/slack.js +470 -0
  74. package/dist/gateway/channels/slack.js.map +1 -0
  75. package/dist/gateway/channels/webhook.d.ts +18 -0
  76. package/dist/gateway/channels/webhook.js +49 -0
  77. package/dist/gateway/channels/webhook.js.map +1 -0
  78. package/dist/gateway/http.d.ts +33 -0
  79. package/dist/gateway/http.js +605 -0
  80. package/dist/gateway/http.js.map +1 -0
  81. package/dist/gateway/server.d.ts +38 -0
  82. package/dist/gateway/server.js +233 -0
  83. package/dist/gateway/server.js.map +1 -0
  84. package/dist/gateway/types.d.ts +28 -0
  85. package/dist/gateway/types.js +2 -0
  86. package/dist/gateway/types.js.map +1 -0
  87. package/dist/index.d.ts +17 -0
  88. package/dist/index.js +32 -0
  89. package/dist/index.js.map +1 -0
  90. package/dist/memory/memoryManager.d.ts +22 -0
  91. package/dist/memory/memoryManager.js +200 -0
  92. package/dist/memory/memoryManager.js.map +1 -0
  93. package/dist/memory/storage.d.ts +24 -0
  94. package/dist/memory/storage.js +187 -0
  95. package/dist/memory/storage.js.map +1 -0
  96. package/dist/memory/types.d.ts +43 -0
  97. package/dist/memory/types.js +2 -0
  98. package/dist/memory/types.js.map +1 -0
  99. package/dist/plugins/manifest.d.ts +23 -0
  100. package/dist/plugins/manifest.js +185 -0
  101. package/dist/plugins/manifest.js.map +1 -0
  102. package/dist/plugins/mcp/mcpBridge.d.ts +31 -0
  103. package/dist/plugins/mcp/mcpBridge.js +115 -0
  104. package/dist/plugins/mcp/mcpBridge.js.map +1 -0
  105. package/dist/plugins/mcp/mcpClient.d.ts +43 -0
  106. package/dist/plugins/mcp/mcpClient.js +309 -0
  107. package/dist/plugins/mcp/mcpClient.js.map +1 -0
  108. package/dist/plugins/mcp/mcpConfig.d.ts +34 -0
  109. package/dist/plugins/mcp/mcpConfig.js +326 -0
  110. package/dist/plugins/mcp/mcpConfig.js.map +1 -0
  111. package/dist/plugins/mcp/types.d.ts +48 -0
  112. package/dist/plugins/mcp/types.js +2 -0
  113. package/dist/plugins/mcp/types.js.map +1 -0
  114. package/dist/plugins/pluginManager.d.ts +164 -0
  115. package/dist/plugins/pluginManager.js +1016 -0
  116. package/dist/plugins/pluginManager.js.map +1 -0
  117. package/dist/plugins/skills/frontmatterParser.d.ts +28 -0
  118. package/dist/plugins/skills/frontmatterParser.js +189 -0
  119. package/dist/plugins/skills/frontmatterParser.js.map +1 -0
  120. package/dist/plugins/skills/skillDiscovery.d.ts +15 -0
  121. package/dist/plugins/skills/skillDiscovery.js +148 -0
  122. package/dist/plugins/skills/skillDiscovery.js.map +1 -0
  123. package/dist/plugins/skills/skillTools.d.ts +8 -0
  124. package/dist/plugins/skills/skillTools.js +195 -0
  125. package/dist/plugins/skills/skillTools.js.map +1 -0
  126. package/dist/plugins/skills/types.d.ts +25 -0
  127. package/dist/plugins/skills/types.js +2 -0
  128. package/dist/plugins/skills/types.js.map +1 -0
  129. package/dist/plugins/types.d.ts +30 -0
  130. package/dist/plugins/types.js +2 -0
  131. package/dist/plugins/types.js.map +1 -0
  132. package/dist/scheduler/scheduler.d.ts +25 -0
  133. package/dist/scheduler/scheduler.js +239 -0
  134. package/dist/scheduler/scheduler.js.map +1 -0
  135. package/dist/scheduler/types.d.ts +39 -0
  136. package/dist/scheduler/types.js +2 -0
  137. package/dist/scheduler/types.js.map +1 -0
  138. package/dist/security/childProcessEnv.d.ts +5 -0
  139. package/dist/security/childProcessEnv.js +42 -0
  140. package/dist/security/childProcessEnv.js.map +1 -0
  141. package/dist/security/fileSandbox.d.ts +153 -0
  142. package/dist/security/fileSandbox.js +779 -0
  143. package/dist/security/fileSandbox.js.map +1 -0
  144. package/dist/service/index.d.ts +30 -0
  145. package/dist/service/index.js +41 -0
  146. package/dist/service/index.js.map +1 -0
  147. package/dist/service/systemd.d.ts +36 -0
  148. package/dist/service/systemd.js +409 -0
  149. package/dist/service/systemd.js.map +1 -0
  150. package/dist/service/types.d.ts +118 -0
  151. package/dist/service/types.js +6 -0
  152. package/dist/service/types.js.map +1 -0
  153. package/dist/tools/builtin/calcTools.d.ts +2 -0
  154. package/dist/tools/builtin/calcTools.js +51 -0
  155. package/dist/tools/builtin/calcTools.js.map +1 -0
  156. package/dist/tools/builtin/fileTools.d.ts +11 -0
  157. package/dist/tools/builtin/fileTools.js +352 -0
  158. package/dist/tools/builtin/fileTools.js.map +1 -0
  159. package/dist/tools/builtin/memoryTools.d.ts +4 -0
  160. package/dist/tools/builtin/memoryTools.js +123 -0
  161. package/dist/tools/builtin/memoryTools.js.map +1 -0
  162. package/dist/tools/builtin/noteTools.d.ts +4 -0
  163. package/dist/tools/builtin/noteTools.js +91 -0
  164. package/dist/tools/builtin/noteTools.js.map +1 -0
  165. package/dist/tools/builtin/pluginTools.d.ts +29 -0
  166. package/dist/tools/builtin/pluginTools.js +406 -0
  167. package/dist/tools/builtin/pluginTools.js.map +1 -0
  168. package/dist/tools/builtin/scheduleTools.d.ts +4 -0
  169. package/dist/tools/builtin/scheduleTools.js +156 -0
  170. package/dist/tools/builtin/scheduleTools.js.map +1 -0
  171. package/dist/tools/builtin/timeTools.d.ts +2 -0
  172. package/dist/tools/builtin/timeTools.js +41 -0
  173. package/dist/tools/builtin/timeTools.js.map +1 -0
  174. package/dist/tools/builtin/webTools.d.ts +12 -0
  175. package/dist/tools/builtin/webTools.js +325 -0
  176. package/dist/tools/builtin/webTools.js.map +1 -0
  177. package/dist/tools/registry.d.ts +15 -0
  178. package/dist/tools/registry.js +111 -0
  179. package/dist/tools/registry.js.map +1 -0
  180. package/dist/tools/types.d.ts +41 -0
  181. package/dist/tools/types.js +2 -0
  182. package/dist/tools/types.js.map +1 -0
  183. package/dist/utils/logger.d.ts +29 -0
  184. package/dist/utils/logger.js +124 -0
  185. package/dist/utils/logger.js.map +1 -0
  186. package/dist/wizard/onboarding.d.ts +3 -0
  187. package/dist/wizard/onboarding.js +408 -0
  188. package/dist/wizard/onboarding.js.map +1 -0
  189. package/package.json +69 -0
  190. package/plugins/example-calc/mcp.json +11 -0
  191. package/plugins/example-calc/plugin.json +12 -0
  192. package/plugins/example-calc/server.mjs +92 -0
  193. package/plugins/example-calc/skills/math-assistant/SKILL.md +15 -0
  194. package/plugins/plugin-builder/plugin.json +12 -0
  195. package/plugins/plugin-builder/skills/create-plugin/SKILL.md +149 -0
  196. package/plugins/plugin-builder/skills/manage-plugins/SKILL.md +157 -0
@@ -0,0 +1,605 @@
1
+ import http from 'node:http';
2
+ import crypto from 'node:crypto';
3
+ import fs from 'node:fs';
4
+ import path from 'node:path';
5
+ import { logger } from '../utils/logger.js';
6
+ export class HttpGatewayServer {
7
+ server = null;
8
+ port;
9
+ host;
10
+ startTime = Date.now();
11
+ harness;
12
+ webhookAdapter;
13
+ discordAdapter;
14
+ slackAdapter;
15
+ cliAdapter;
16
+ scheduler;
17
+ config;
18
+ rateLimits = new Map();
19
+ cleanupInterval = null;
20
+ constructor(config, harness, webhookAdapter, discordAdapter, slackAdapter, scheduler, cliAdapter) {
21
+ this.config = config;
22
+ this.port = config.gateway.port || 4141;
23
+ this.host = config.gateway.host || '127.0.0.1';
24
+ this.harness = harness;
25
+ this.webhookAdapter = webhookAdapter;
26
+ this.discordAdapter = discordAdapter;
27
+ this.slackAdapter = slackAdapter;
28
+ this.scheduler = scheduler;
29
+ this.cliAdapter = cliAdapter;
30
+ }
31
+ async start() {
32
+ return new Promise((resolve, reject) => {
33
+ this.server = http.createServer(async (req, res) => {
34
+ try {
35
+ await this.handleRequest(req, res);
36
+ }
37
+ catch (err) {
38
+ logger.error('HTTP request handling error:', err);
39
+ if (!res.headersSent) {
40
+ res.writeHead(500, { 'Content-Type': 'application/json' });
41
+ res.end(JSON.stringify({ error: err.message || 'Internal Server Error' }));
42
+ }
43
+ }
44
+ });
45
+ this.server.on('error', (err) => {
46
+ logger.error('HTTP Gateway Server failed to bind:', err);
47
+ reject(err);
48
+ });
49
+ // Cleanup stale rate limit buckets every 60 seconds
50
+ this.cleanupInterval = setInterval(() => {
51
+ const now = Date.now();
52
+ for (const [ip, entry] of this.rateLimits.entries()) {
53
+ if (now > entry.resetTime) {
54
+ this.rateLimits.delete(ip);
55
+ }
56
+ }
57
+ }, 60000);
58
+ this.server.listen(this.port, this.host, () => {
59
+ logger.info(`Musonda Gateway HTTP server listening at http://${this.host}:${this.port}`);
60
+ resolve();
61
+ });
62
+ });
63
+ }
64
+ async stop() {
65
+ if (this.cleanupInterval) {
66
+ clearInterval(this.cleanupInterval);
67
+ this.cleanupInterval = null;
68
+ }
69
+ if (this.server) {
70
+ return new Promise((resolve) => {
71
+ this.server.close(() => {
72
+ logger.info('HTTP Gateway Server stopped.');
73
+ resolve();
74
+ });
75
+ });
76
+ }
77
+ }
78
+ async parseJsonBody(req) {
79
+ return new Promise((resolve, reject) => {
80
+ let body = '';
81
+ req.on('data', (chunk) => {
82
+ body += chunk;
83
+ if (body.length > 1e6) {
84
+ req.destroy();
85
+ reject(new Error('Payload too large'));
86
+ }
87
+ });
88
+ req.on('end', () => {
89
+ if (!body.trim()) {
90
+ resolve({});
91
+ return;
92
+ }
93
+ try {
94
+ resolve(JSON.parse(body));
95
+ }
96
+ catch (e) {
97
+ reject(new Error('Malformed JSON: ' + e.message));
98
+ }
99
+ });
100
+ });
101
+ }
102
+ isOriginAllowed(origin) {
103
+ const allowed = this.config.gateway.corsAllowedOrigins || [];
104
+ if (allowed.includes('*'))
105
+ return true;
106
+ if (!origin)
107
+ return true; // Direct non-browser requests (e.g. curl, terminal, server-to-server)
108
+ return allowed.includes(origin);
109
+ }
110
+ isAuthenticated(req) {
111
+ const configuredKey = this.config.gateway.apiKey?.trim();
112
+ if (!configuredKey) {
113
+ // In production mode, authentication fails closed - an API key is mandatory
114
+ if (process.env.NODE_ENV === 'production') {
115
+ return false;
116
+ }
117
+ // For local development / testing without a configured key, allow access
118
+ return true;
119
+ }
120
+ let candidateToken;
121
+ // 1. Authorization header: Bearer <key>
122
+ const authHeader = req.headers.authorization;
123
+ if (authHeader) {
124
+ const match = authHeader.match(/^Bearer\s+(.+)$/i);
125
+ if (match) {
126
+ candidateToken = match[1].trim();
127
+ }
128
+ }
129
+ // 2. X-API-Key header
130
+ if (!candidateToken) {
131
+ const xApiKey = req.headers['x-api-key'];
132
+ if (typeof xApiKey === 'string') {
133
+ candidateToken = xApiKey.trim();
134
+ }
135
+ }
136
+ if (!candidateToken) {
137
+ return false;
138
+ }
139
+ return this.timingSafeEqual(candidateToken, configuredKey);
140
+ }
141
+ timingSafeEqual(a, b) {
142
+ const bufA = Buffer.from(a, 'utf-8');
143
+ const bufB = Buffer.from(b, 'utf-8');
144
+ if (bufA.length !== bufB.length) {
145
+ return false;
146
+ }
147
+ return crypto.timingSafeEqual(bufA, bufB);
148
+ }
149
+ checkRateLimit(req, res) {
150
+ const limit = this.config.gateway.rateLimitPerMinute ?? 120;
151
+ if (limit <= 0)
152
+ return true; // Disabled
153
+ const forwardedFor = req.headers['x-forwarded-for'];
154
+ const trustedForwardedIp = typeof forwardedFor === 'string'
155
+ ? forwardedFor.split(',')[0].trim()
156
+ : Array.isArray(forwardedFor)
157
+ ? forwardedFor[0]?.split(',')[0].trim()
158
+ : undefined;
159
+ const clientIp = (this.config.gateway.trustProxy ? trustedForwardedIp : undefined)
160
+ || req.socket.remoteAddress
161
+ || 'unknown-ip';
162
+ const now = Date.now();
163
+ const windowMs = 60 * 1000;
164
+ const entry = this.rateLimits.get(clientIp);
165
+ if (!entry || now > entry.resetTime) {
166
+ const maxClients = this.config.gateway.rateLimitMaxClients ?? 10000;
167
+ if (!entry && this.rateLimits.size >= maxClients) {
168
+ // Reclaim expired buckets before rejecting a previously unseen client.
169
+ for (const [ip, bucket] of this.rateLimits) {
170
+ if (now > bucket.resetTime)
171
+ this.rateLimits.delete(ip);
172
+ }
173
+ }
174
+ if (!entry && this.rateLimits.size >= maxClients) {
175
+ res.writeHead(429, { 'Content-Type': 'application/json', 'Retry-After': '60' });
176
+ res.end(JSON.stringify({ error: 'Rate limiter capacity exceeded. Please try again later.' }));
177
+ return false;
178
+ }
179
+ this.rateLimits.set(clientIp, { count: 1, resetTime: now + windowMs });
180
+ return true;
181
+ }
182
+ entry.count++;
183
+ if (entry.count > limit) {
184
+ const retryAfter = Math.ceil((entry.resetTime - now) / 1000);
185
+ res.writeHead(429, {
186
+ 'Content-Type': 'application/json',
187
+ 'Retry-After': String(retryAfter),
188
+ });
189
+ res.end(JSON.stringify({
190
+ error: 'Rate limit exceeded: Too many requests. Please try again later.',
191
+ retryAfterSeconds: retryAfter,
192
+ }));
193
+ return false;
194
+ }
195
+ return true;
196
+ }
197
+ checkStorageReadiness() {
198
+ try {
199
+ const storageDir = path.resolve(this.config.memory.storageDir);
200
+ if (!fs.existsSync(storageDir))
201
+ fs.mkdirSync(storageDir, { recursive: true });
202
+ const probeFile = path.join(storageDir, `.ready_probe_${process.pid}.tmp`);
203
+ fs.writeFileSync(probeFile, 'ok', { encoding: 'utf-8', flag: 'wx' });
204
+ fs.unlinkSync(probeFile);
205
+ return true;
206
+ }
207
+ catch {
208
+ return false;
209
+ }
210
+ }
211
+ async getReadiness() {
212
+ const storageReady = this.checkStorageReadiness();
213
+ const production = process.env.NODE_ENV === 'production';
214
+ const gatewayKey = this.config.gateway.apiKey?.trim() || '';
215
+ const gatewayAuthReady = !production || Boolean(gatewayKey.length >= 24
216
+ && gatewayKey !== 'your_secret_gateway_api_key_here'
217
+ && !gatewayKey.startsWith('your_'));
218
+ const rawApiKey = this.config.model.apiKey?.trim() || '';
219
+ const credentialsConfigured = Boolean(rawApiKey
220
+ && rawApiKey !== 'placeholder-key'
221
+ && rawApiKey !== 'your_openai_api_key_here'
222
+ && !rawApiKey.startsWith('your_'));
223
+ let aiReady = credentialsConfigured;
224
+ let aiStatus = credentialsConfigured ? 'configured' : 'missing_or_placeholder';
225
+ if (production && gatewayAuthReady && credentialsConfigured) {
226
+ const provider = await this.harness.getClient().checkReadiness();
227
+ aiReady = provider.ready;
228
+ aiStatus = provider.ready ? 'verified' : provider.reason || 'unavailable';
229
+ }
230
+ return {
231
+ ready: storageReady && gatewayAuthReady && aiReady,
232
+ checks: {
233
+ storage: storageReady ? 'ok' : 'unwritable',
234
+ gatewayAuth: gatewayAuthReady ? 'configured' : 'missing_or_weak',
235
+ aiProvider: aiStatus,
236
+ },
237
+ };
238
+ }
239
+ async handleRequest(req, res) {
240
+ const parsedUrl = new URL(req.url || '/', `http://${req.headers.host || 'localhost'}`);
241
+ const pathname = parsedUrl.pathname;
242
+ const method = req.method?.toUpperCase();
243
+ const origin = req.headers.origin;
244
+ res.setHeader('X-Content-Type-Options', 'nosniff');
245
+ res.setHeader('Referrer-Policy', 'no-referrer');
246
+ res.setHeader('Cache-Control', 'no-store');
247
+ // CORS policy enforcement
248
+ const allowed = this.config.gateway.corsAllowedOrigins || [];
249
+ if (allowed.includes('*')) {
250
+ res.setHeader('Access-Control-Allow-Origin', '*');
251
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
252
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization, X-API-Key');
253
+ }
254
+ else if (origin && allowed.includes(origin)) {
255
+ res.setHeader('Access-Control-Allow-Origin', origin);
256
+ res.setHeader('Vary', 'Origin');
257
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
258
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization, X-API-Key');
259
+ }
260
+ if (method === 'OPTIONS') {
261
+ if (origin && !this.isOriginAllowed(origin)) {
262
+ res.writeHead(403, { 'Content-Type': 'application/json' });
263
+ res.end(JSON.stringify({ error: 'CORS policy violation: Origin not allowed' }));
264
+ return;
265
+ }
266
+ res.writeHead(204);
267
+ res.end();
268
+ return;
269
+ }
270
+ // Rate limiting check
271
+ if (!this.checkRateLimit(req, res)) {
272
+ return;
273
+ }
274
+ const authenticated = this.isAuthenticated(req);
275
+ // Downstream readiness endpoint for Kubernetes / Docker Compose health checks
276
+ if ((pathname === '/ready' || pathname === '/readyz') && method === 'GET') {
277
+ const readiness = await this.getReadiness();
278
+ res.writeHead(readiness.ready ? 200 : 503, { 'Content-Type': 'application/json' });
279
+ res.end(JSON.stringify({
280
+ ready: readiness.ready,
281
+ status: readiness.ready ? 'ready' : 'not_ready',
282
+ checks: readiness.checks,
283
+ uptimeSeconds: Math.floor((Date.now() - this.startTime) / 1000),
284
+ }, null, 2));
285
+ return;
286
+ }
287
+ // Health & Status
288
+ if ((pathname === '/' || pathname === '/health' || pathname === '/status') && method === 'GET') {
289
+ // If unauthenticated and an API key is required, return sanitized minimal health
290
+ if (!authenticated) {
291
+ res.writeHead(200, { 'Content-Type': 'application/json' });
292
+ res.end(JSON.stringify({
293
+ status: 'online',
294
+ uptimeSeconds: Math.floor((Date.now() - this.startTime) / 1000),
295
+ gateway: {
296
+ port: this.port,
297
+ authenticated: false,
298
+ },
299
+ readinessEndpoint: '/ready',
300
+ }));
301
+ return;
302
+ }
303
+ const memoryManager = this.harness.getMemoryManager();
304
+ const memories = memoryManager.getAllMemories();
305
+ const profile = memoryManager.getProfile();
306
+ const assistantName = profile.assistantCustomName || this.config.assistant.customName || this.config.assistant.name || 'Musonda';
307
+ const allJobs = this.scheduler.listJobs();
308
+ const activeJobs = allJobs.filter((j) => j.status === 'active');
309
+ res.writeHead(200, { 'Content-Type': 'application/json' });
310
+ res.end(JSON.stringify({
311
+ status: 'online',
312
+ readinessEndpoint: '/ready',
313
+ assistant: {
314
+ name: assistantName,
315
+ title: this.config.assistant.title,
316
+ },
317
+ model: {
318
+ name: this.config.model.model,
319
+ provider: this.config.model.provider,
320
+ },
321
+ process: {
322
+ pid: process.pid,
323
+ nodeVersion: process.version,
324
+ memoryUsageMb: {
325
+ rss: Math.round(process.memoryUsage().rss / (1024 * 1024)),
326
+ heapUsed: Math.round(process.memoryUsage().heapUsed / (1024 * 1024)),
327
+ heapTotal: Math.round(process.memoryUsage().heapTotal / (1024 * 1024)),
328
+ },
329
+ },
330
+ gateway: {
331
+ uptimeSeconds: Math.floor((Date.now() - this.startTime) / 1000),
332
+ port: this.port,
333
+ channels: {
334
+ discord: {
335
+ enabled: this.config.channels.discord.enabled,
336
+ connected: this.discordAdapter.isConnected(),
337
+ },
338
+ slack: {
339
+ enabled: this.config.channels.slack.enabled,
340
+ connected: this.slackAdapter.isConnected(),
341
+ },
342
+ webhook: {
343
+ connected: this.webhookAdapter.isConnected(),
344
+ },
345
+ cli: {
346
+ enabled: this.config.channels.cli?.enabled ?? false,
347
+ connected: this.cliAdapter ? this.cliAdapter.isConnected() : false,
348
+ },
349
+ },
350
+ schedules: {
351
+ total: allJobs.length,
352
+ active: activeJobs.length,
353
+ },
354
+ },
355
+ user: {
356
+ name: profile.name,
357
+ timezone: profile.timezone,
358
+ },
359
+ memoryStats: {
360
+ totalMemories: memories.length,
361
+ },
362
+ }, null, 2));
363
+ return;
364
+ }
365
+ // Require authentication for all /api/* endpoints
366
+ if (pathname.startsWith('/api/') && !authenticated) {
367
+ const isMissingProdKey = process.env.NODE_ENV === 'production' && !this.config.gateway.apiKey?.trim();
368
+ const errorMessage = isMissingProdKey
369
+ ? 'Unauthorized: GATEWAY_API_KEY must be configured and provided in production mode.'
370
+ : 'Unauthorized: A valid API key is required.';
371
+ res.writeHead(401, { 'Content-Type': 'application/json' });
372
+ res.end(JSON.stringify({ error: errorMessage }));
373
+ return;
374
+ }
375
+ // Profile inspection
376
+ if (pathname === '/api/profile' && method === 'GET') {
377
+ const profile = this.harness.getMemoryManager().getProfile();
378
+ res.writeHead(200, { 'Content-Type': 'application/json' });
379
+ res.end(JSON.stringify(profile, null, 2));
380
+ return;
381
+ }
382
+ // Memories inspection
383
+ if (pathname === '/api/memories' && method === 'GET') {
384
+ const memories = this.harness.getMemoryManager().getAllMemories();
385
+ res.writeHead(200, { 'Content-Type': 'application/json' });
386
+ res.end(JSON.stringify(memories, null, 2));
387
+ return;
388
+ }
389
+ // Plugins inspection
390
+ if (pathname === '/api/plugins' && method === 'GET') {
391
+ const pm = this.harness.getPluginManager();
392
+ if (!pm) {
393
+ res.writeHead(200, { 'Content-Type': 'application/json' });
394
+ res.end(JSON.stringify({ plugins: [], totalPlugins: 0 }));
395
+ return;
396
+ }
397
+ const plugins = pm.getAllPlugins();
398
+ const skills = pm.getAllSkills();
399
+ const mcpServers = pm.getMcpBridge().getActiveServers();
400
+ res.writeHead(200, { 'Content-Type': 'application/json' });
401
+ res.end(JSON.stringify({
402
+ totalPlugins: plugins.length,
403
+ totalSkills: skills.length,
404
+ totalMcpServers: mcpServers.length,
405
+ plugins: plugins.map((p) => ({
406
+ name: p.name,
407
+ version: p.manifest.version || '1.0.0',
408
+ description: p.manifest.description || '',
409
+ rootDir: p.rootDir,
410
+ skills: skills.filter((s) => s.pluginName === p.name).map((s) => s.name),
411
+ mcpServers: mcpServers
412
+ .filter((s) => s.server.pluginName === p.name)
413
+ .map((s) => s.server.name),
414
+ })),
415
+ }, null, 2));
416
+ return;
417
+ }
418
+ // Install / Add Plugin dynamically into live runtime
419
+ if (pathname === '/api/plugins/install' && method === 'POST') {
420
+ const body = await this.parseJsonBody(req);
421
+ const pm = this.harness.getPluginManager();
422
+ if (!pm) {
423
+ res.writeHead(500, { 'Content-Type': 'application/json' });
424
+ res.end(JSON.stringify({ success: false, error: 'Plugin subsystem is not available.' }));
425
+ return;
426
+ }
427
+ try {
428
+ const result = await pm.installPlugin(body, this.harness.getToolRegistry());
429
+ res.writeHead(result.success ? 200 : 400, { 'Content-Type': 'application/json' });
430
+ res.end(JSON.stringify(result, null, 2));
431
+ }
432
+ catch (err) {
433
+ res.writeHead(500, { 'Content-Type': 'application/json' });
434
+ res.end(JSON.stringify({ success: false, error: err.message || 'Error installing plugin.' }));
435
+ }
436
+ return;
437
+ }
438
+ // Remove / Uninstall Plugin from live runtime
439
+ if (pathname === '/api/plugins/remove' && method === 'POST') {
440
+ const body = await this.parseJsonBody(req);
441
+ const pm = this.harness.getPluginManager();
442
+ if (!pm) {
443
+ res.writeHead(500, { 'Content-Type': 'application/json' });
444
+ res.end(JSON.stringify({ success: false, error: 'Plugin subsystem is not available.' }));
445
+ return;
446
+ }
447
+ try {
448
+ const result = await pm.removePlugin(body, this.harness.getToolRegistry());
449
+ res.writeHead(result.success ? 200 : 400, { 'Content-Type': 'application/json' });
450
+ res.end(JSON.stringify(result, null, 2));
451
+ }
452
+ catch (err) {
453
+ res.writeHead(500, { 'Content-Type': 'application/json' });
454
+ res.end(JSON.stringify({ success: false, error: err.message || 'Error removing plugin.' }));
455
+ }
456
+ return;
457
+ }
458
+ // Discover Plugins across local disk and ecosystem
459
+ if (pathname === '/api/plugins/find' && method === 'GET') {
460
+ const query = parsedUrl.searchParams.get('query') || undefined;
461
+ const source = parsedUrl.searchParams.get('source') || 'all';
462
+ const pm = this.harness.getPluginManager();
463
+ if (!pm) {
464
+ res.writeHead(200, { 'Content-Type': 'application/json' });
465
+ res.end(JSON.stringify({ totalFound: 0, local: [], remote: [] }));
466
+ return;
467
+ }
468
+ const results = await pm.findPlugins({ query, source });
469
+ res.writeHead(200, { 'Content-Type': 'application/json' });
470
+ res.end(JSON.stringify(results, null, 2));
471
+ return;
472
+ }
473
+ // Detailed Plugin Inspection
474
+ if (pathname === '/api/plugins/info' && method === 'GET') {
475
+ const name = parsedUrl.searchParams.get('name') || parsedUrl.searchParams.get('plugin') || '';
476
+ const pm = this.harness.getPluginManager();
477
+ if (!pm) {
478
+ res.writeHead(404, { 'Content-Type': 'application/json' });
479
+ res.end(JSON.stringify({ found: false, error: 'Plugin subsystem is not available.' }));
480
+ return;
481
+ }
482
+ const info = pm.getPluginInfo(name);
483
+ res.writeHead(info.found ? 200 : 404, { 'Content-Type': 'application/json' });
484
+ res.end(JSON.stringify(info, null, 2));
485
+ return;
486
+ }
487
+ // Schedules endpoints
488
+ if (pathname === '/api/schedules' && method === 'GET') {
489
+ const jobs = this.scheduler.listJobs();
490
+ res.writeHead(200, { 'Content-Type': 'application/json' });
491
+ res.end(JSON.stringify(jobs, null, 2));
492
+ return;
493
+ }
494
+ if (pathname === '/api/schedules' && method === 'POST') {
495
+ const body = await this.parseJsonBody(req);
496
+ if (!body.title || !body.pattern || !body.action) {
497
+ res.writeHead(400, { 'Content-Type': 'application/json' });
498
+ res.end(JSON.stringify({ error: 'Missing required fields: title, pattern, action' }));
499
+ return;
500
+ }
501
+ try {
502
+ const job = this.scheduler.createJob({
503
+ title: body.title,
504
+ type: body.type,
505
+ pattern: body.pattern,
506
+ timezone: body.timezone,
507
+ target: body.target || {
508
+ channel: 'webhook',
509
+ channelId: 'api',
510
+ userId: 'api-user',
511
+ },
512
+ action: body.action,
513
+ maxRuns: body.maxRuns,
514
+ });
515
+ res.writeHead(201, { 'Content-Type': 'application/json' });
516
+ res.end(JSON.stringify(job, null, 2));
517
+ }
518
+ catch (err) {
519
+ res.writeHead(400, { 'Content-Type': 'application/json' });
520
+ res.end(JSON.stringify({ error: err.message }));
521
+ }
522
+ return;
523
+ }
524
+ if (pathname === '/api/schedules/cancel' && method === 'POST') {
525
+ const body = await this.parseJsonBody(req);
526
+ if (!body.id) {
527
+ res.writeHead(400, { 'Content-Type': 'application/json' });
528
+ res.end(JSON.stringify({ error: 'Missing required field "id"' }));
529
+ return;
530
+ }
531
+ const success = this.scheduler.cancelJob(body.id);
532
+ res.writeHead(200, { 'Content-Type': 'application/json' });
533
+ res.end(JSON.stringify({ success, id: body.id }));
534
+ return;
535
+ }
536
+ // Chat endpoint
537
+ if (pathname === '/api/chat' && method === 'POST') {
538
+ const body = await this.parseJsonBody(req);
539
+ if (!body.message || typeof body.message !== 'string') {
540
+ res.writeHead(400, { 'Content-Type': 'application/json' });
541
+ res.end(JSON.stringify({ error: 'Missing required string field "message"' }));
542
+ return;
543
+ }
544
+ const wantsStream = body.stream === true || req.headers.accept?.includes('text/event-stream');
545
+ if (wantsStream) {
546
+ res.writeHead(200, {
547
+ 'Content-Type': 'text/event-stream',
548
+ 'Cache-Control': 'no-cache',
549
+ 'Connection': 'keep-alive',
550
+ });
551
+ try {
552
+ const reply = await this.webhookAdapter.dispatchDirect(body.message, {
553
+ userId: body.userId || 'http-client',
554
+ userName: body.userName || 'HTTP User',
555
+ channelId: body.sessionId || 'http-session',
556
+ onEvent: async (event) => {
557
+ if (event.type !== 'output.delta') {
558
+ res.write(`data: ${JSON.stringify(event)}\n\n`);
559
+ }
560
+ },
561
+ onDelta: async (delta) => {
562
+ res.write(`data: ${JSON.stringify({ delta })}\n\n`);
563
+ },
564
+ });
565
+ res.write(`data: ${JSON.stringify({ reply, done: true })}\n\n`);
566
+ res.write('data: [DONE]\n\n');
567
+ res.end();
568
+ }
569
+ catch (err) {
570
+ res.write(`data: ${JSON.stringify({ error: err.message || 'Chat processing error' })}\n\n`);
571
+ res.end();
572
+ }
573
+ return;
574
+ }
575
+ try {
576
+ const reply = await this.webhookAdapter.dispatchDirect(body.message, {
577
+ userId: body.userId || 'http-client',
578
+ userName: body.userName || 'HTTP User',
579
+ channelId: body.sessionId || 'http-session',
580
+ });
581
+ res.writeHead(200, { 'Content-Type': 'application/json' });
582
+ res.end(JSON.stringify({ reply }));
583
+ }
584
+ catch (err) {
585
+ res.writeHead(500, { 'Content-Type': 'application/json' });
586
+ res.end(JSON.stringify({ error: err.message || 'Chat processing error' }));
587
+ }
588
+ return;
589
+ }
590
+ // Gateway Stop / Shutdown endpoint
591
+ if (pathname === '/api/gateway/stop' && method === 'POST') {
592
+ res.writeHead(200, { 'Content-Type': 'application/json' });
593
+ res.end(JSON.stringify({ status: 'stopping', message: 'Musonda Gateway shutdown initiated.' }));
594
+ setTimeout(() => {
595
+ logger.info('HTTP shutdown requested. Emitting SIGTERM...');
596
+ process.emit('SIGTERM');
597
+ }, 150);
598
+ return;
599
+ }
600
+ // 404 Fallback
601
+ res.writeHead(404, { 'Content-Type': 'application/json' });
602
+ res.end(JSON.stringify({ error: `Not found: ${method} ${pathname}` }));
603
+ }
604
+ }
605
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/gateway/http.ts"],"names":[],"mappings":"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"}