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,408 @@
1
+ import readline from 'node:readline/promises';
2
+ import { stdin as input, stdout as output } from 'node:process';
3
+ import { configLoader } from '../config/loader.js';
4
+ import { MemoryManager } from '../memory/memoryManager.js';
5
+ import { logger } from '../utils/logger.js';
6
+ import { installSystemdService } from '../service/index.js';
7
+ export const BANNER = `
8
+ \x1b[36m
9
+ ███╗ ███╗██╗ ██╗███████╗ ██████╗ ███╗ ██╗██████╗ █████╗
10
+ ████╗ ████║██║ ██║██╔════╝██╔═══██╗████╗ ██║██╔══██╗██╔══██╗
11
+ ██╔████╔██║██║ ██║███████╗██║ ██║██╔██╗ ██║██║ ██║███████║
12
+ ██║╚██╔╝██║██║ ██║╚════██║██║ ██║██║╚██╗██║██║ ██║██╔══██║
13
+ ██║ ╚═╝ ██║╚██████╔╝███████║╚██████╔╝██║ ╚████║██████╔╝██║ ██║
14
+ ╚═╝ ╚═╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═╝ ╚═══╝╚═════╝ ╚═╝ ╚═╝
15
+ \x1b[0m
16
+ \x1b[1m\x1b[35m=== Musonda Personal AI Assistant & Gateway Harness ===\x1b[0m
17
+ \x1b[2mRunning OpenAI Responses API with gpt-5.6-luna\x1b[0m
18
+ `;
19
+ export async function runOnboardingWizard() {
20
+ console.log(BANNER);
21
+ console.log(`Welcome! This onboarding wizard will configure your personal AI assistant,
22
+ set up persistent memory, customize its name, and connect your channels (like Discord).\n`);
23
+ const rl = readline.createInterface({ input, output });
24
+ try {
25
+ const existingConfig = configLoader.load();
26
+ // ----------------------------------------------------
27
+ // Step 1: Assistant Identity & Custom Name
28
+ // ----------------------------------------------------
29
+ console.log(`\x1b[33m[Step 1/5] Assistant Persona & Identity\x1b[0m`);
30
+ const customNameInput = await rl.question(`Give a custom name to your assistant [default: Musonda]: `);
31
+ const assistantName = customNameInput.trim() || 'Musonda';
32
+ const titleInput = await rl.question(`What role or title should ${assistantName} have? [default: Personal Autonomous AI Companion]: `);
33
+ const assistantTitle = titleInput.trim() || 'Personal Autonomous AI Companion';
34
+ const toneInput = await rl.question(`What personality tone should ${assistantName} express? [default: Empathetic, intelligent, proactive, practical]: `);
35
+ const assistantTone = toneInput.trim() || 'Empathetic, intelligent, proactive, practical';
36
+ console.log(`\x1b[32m✔ Configured assistant: ${assistantName} (${assistantTitle})\x1b[0m\n`);
37
+ // ----------------------------------------------------
38
+ // Step 2: About the User
39
+ // ----------------------------------------------------
40
+ console.log(`\x1b[33m[Step 2/5] Tell ${assistantName} About Yourself\x1b[0m`);
41
+ const userNameInput = await rl.question(`What is your name / how should ${assistantName} address you? [default: Friend]: `);
42
+ const userName = userNameInput.trim() || 'Friend';
43
+ const userBioInput = await rl.question(`Tell ${assistantName} about yourself (profession, interests, projects, goals):\n> `);
44
+ const userBio = userBioInput.trim();
45
+ const detectedTz = Intl.DateTimeFormat().resolvedOptions().timeZone || 'UTC';
46
+ const userTzInput = await rl.question(`What is your timezone? [default: ${detectedTz}]: `);
47
+ const userTimezone = userTzInput.trim() || detectedTz;
48
+ console.log(`Choose communication style:
49
+ 1) Friendly & conversational (Default)
50
+ 2) Concise & direct
51
+ 3) In-depth & detailed
52
+ 4) Highly technical`);
53
+ const styleChoice = await rl.question(`Select style (1-4) [default: 1]: `);
54
+ let communicationStyle = 'friendly';
55
+ if (styleChoice.trim() === '2')
56
+ communicationStyle = 'concise';
57
+ else if (styleChoice.trim() === '3')
58
+ communicationStyle = 'detailed';
59
+ else if (styleChoice.trim() === '4')
60
+ communicationStyle = 'technical';
61
+ const userNotesInput = await rl.question(`Any special instructions or preferences ${assistantName} should always keep in mind? (optional): `);
62
+ const userNotes = userNotesInput.trim();
63
+ console.log(`\x1b[32m✔ User profile set for: ${userName} (${userTimezone}, ${communicationStyle})\x1b[0m\n`);
64
+ // ----------------------------------------------------
65
+ // Step 3: Model Configuration (gpt-5.6-luna)
66
+ // ----------------------------------------------------
67
+ console.log(`\x1b[33m[Step 3/5] AI Model & OpenAI Responses API\x1b[0m`);
68
+ console.log(`Using OpenAI Responses API with model: \x1b[36mgpt-5.6-luna\x1b[0m`);
69
+ const currentKey = process.env.OPENAI_API_KEY || existingConfig.model.apiKey || '';
70
+ const keyPrompt = currentKey
71
+ ? `Enter OpenAI API Key [press Enter to keep existing key: ...${currentKey.slice(-4)}]: `
72
+ : `Enter your OpenAI API Key: `;
73
+ const apiKeyInput = await rl.question(keyPrompt);
74
+ const apiKey = apiKeyInput.trim() || currentKey;
75
+ if (!apiKey) {
76
+ console.log(`\x1b[31m⚠ Warning: No OpenAI API key entered. You will need to provide one in .env or musonda.config.json before running.\x1b[0m`);
77
+ }
78
+ const baseUrlInput = await rl.question(`Custom OpenAI Base URL (optional, press Enter for default OpenAI): `);
79
+ const baseUrl = baseUrlInput.trim() || undefined;
80
+ console.log(`\x1b[32m✔ Model configured: gpt-5.6-luna\x1b[0m\n`);
81
+ // ----------------------------------------------------
82
+ // Step 4: Channels (Discord & Slack Integrations)
83
+ // ----------------------------------------------------
84
+ console.log(`\x1b[33m[Step 4/5] Gateway Channels (Discord & Slack Integrations)\x1b[0m`);
85
+ // Discord Configuration
86
+ const enableDiscordInput = await rl.question(`Enable Discord channel integration? (y/N) [default: ${existingConfig.channels.discord.enabled ? 'Y' : 'N'}]: `);
87
+ const enableDiscord = enableDiscordInput.trim().toLowerCase() === 'y' ||
88
+ (enableDiscordInput.trim() === '' && existingConfig.channels.discord.enabled);
89
+ let discordToken = existingConfig.channels.discord.token || '';
90
+ let allowedDiscordUsers = existingConfig.channels.discord.allowedUsers || [];
91
+ let allowedDiscordChannels = existingConfig.channels.discord.allowedChannels || [];
92
+ let requireDiscordMention = existingConfig.channels.discord.requireMentionInGuild;
93
+ if (enableDiscord) {
94
+ const tokenInput = await rl.question(discordToken
95
+ ? `Enter Discord Bot Token [press Enter to keep existing]: `
96
+ : `Enter Discord Bot Token: `);
97
+ if (tokenInput.trim())
98
+ discordToken = tokenInput.trim();
99
+ const userWhitelistInput = await rl.question(`Enter your Discord User ID for exclusive access (optional, leave empty for all users): `);
100
+ if (userWhitelistInput.trim()) {
101
+ allowedDiscordUsers = userWhitelistInput.split(',').map((s) => s.trim());
102
+ }
103
+ const channelWhitelistInput = await rl.question(`Enter specific Discord Channel IDs to listen to (optional, comma-separated, leave blank for all): `);
104
+ if (channelWhitelistInput.trim()) {
105
+ allowedDiscordChannels = channelWhitelistInput.split(',').map((s) => s.trim());
106
+ }
107
+ const mentionInput = await rl.question(`Require @mention in public Discord channels? (Y/n) [default: Y]: `);
108
+ requireDiscordMention = mentionInput.trim().toLowerCase() !== 'n';
109
+ console.log(`\x1b[32m✔ Discord channel configured!\x1b[0m\n`);
110
+ }
111
+ else {
112
+ console.log(`\x1b[2mDiscord channel disabled for now.\x1b[0m\n`);
113
+ }
114
+ // Slack Configuration
115
+ const enableSlackInput = await rl.question(`Enable Slack channel integration? (y/N) [default: ${existingConfig.channels.slack?.enabled ? 'Y' : 'N'}]: `);
116
+ const enableSlack = enableSlackInput.trim().toLowerCase() === 'y' ||
117
+ (enableSlackInput.trim() === '' && (existingConfig.channels.slack?.enabled ?? false));
118
+ let slackBotToken = existingConfig.channels.slack?.botToken || '';
119
+ let slackAppToken = existingConfig.channels.slack?.appToken || '';
120
+ let slackReplyInThread = existingConfig.channels.slack?.replyInThread ?? true;
121
+ if (enableSlack) {
122
+ const botTokenInput = await rl.question(slackBotToken
123
+ ? `Enter Slack Bot Token (xoxb-...) [press Enter to keep existing]: `
124
+ : `Enter Slack Bot Token (xoxb-...): `);
125
+ if (botTokenInput.trim())
126
+ slackBotToken = botTokenInput.trim();
127
+ const appTokenInput = await rl.question(slackAppToken
128
+ ? `Enter Slack App-Level Token for Socket Mode (xapp-...) [press Enter to keep existing]: `
129
+ : `Enter Slack App-Level Token for Socket Mode (xapp-...): `);
130
+ if (appTokenInput.trim())
131
+ slackAppToken = appTokenInput.trim();
132
+ const threadInput = await rl.question(`Reply in thread for channel messages? (Y/n) [default: Y]: `);
133
+ slackReplyInThread = threadInput.trim().toLowerCase() !== 'n';
134
+ console.log(`\x1b[32m✔ Slack channel configured!\x1b[0m\n`);
135
+ }
136
+ else {
137
+ console.log(`\x1b[2mSlack channel disabled for now.\x1b[0m\n`);
138
+ }
139
+ // ----------------------------------------------------
140
+ // Step 5: Gateway Persistence & Background Service (.service)
141
+ // ----------------------------------------------------
142
+ console.log(`\x1b[33m[Step 5/5] Gateway Persistence & Background Service (.service)\x1b[0m`);
143
+ console.log(`Configure Musonda Gateway as an auto-restarting background service so it stays alive 24/7.\n`);
144
+ let serviceInstalled = false;
145
+ let servicePathInstalled = '';
146
+ let serviceStarted = false;
147
+ let serviceNameChosen = 'musonda';
148
+ let serviceTypeChosen = 'user';
149
+ if (process.platform === 'linux') {
150
+ const createServiceInput = await rl.question(`Create systemd .service file so Gateway runs continuously in the background? (Y/n) [default: Y]: `);
151
+ const shouldCreate = createServiceInput.trim().toLowerCase() !== 'n';
152
+ if (shouldCreate) {
153
+ console.log(`Choose systemd service target:
154
+ 1) User service (~/.config/systemd/user/musonda.service) [Recommended - no root required]
155
+ 2) System service (/etc/systemd/system/musonda.service) [Requires root/sudo]
156
+ 3) Export .service file to current directory (./musonda.service)`);
157
+ const targetChoice = await rl.question(`Select target (1-3) [default: 1]: `);
158
+ if (targetChoice.trim() === '2')
159
+ serviceTypeChosen = 'system';
160
+ else if (targetChoice.trim() === '3')
161
+ serviceTypeChosen = 'file';
162
+ const nameInput = await rl.question(`Service name [default: musonda]: `);
163
+ serviceNameChosen = nameInput.trim() || 'musonda';
164
+ let autoStart = false;
165
+ if (serviceTypeChosen !== 'file') {
166
+ const autoStartInput = await rl.question(`Enable and start the service immediately with systemctl? (Y/n) [default: Y]: `);
167
+ autoStart = autoStartInput.trim().toLowerCase() !== 'n';
168
+ }
169
+ const installResult = await installSystemdService({
170
+ serviceName: serviceNameChosen,
171
+ serviceType: serviceTypeChosen,
172
+ port: 4141,
173
+ host: '127.0.0.1',
174
+ }, autoStart);
175
+ if (installResult.success) {
176
+ serviceInstalled = true;
177
+ servicePathInstalled = installResult.servicePath;
178
+ serviceStarted = Boolean(installResult.started);
179
+ console.log(`\x1b[32m✔ Created systemd service: ${installResult.servicePath}\x1b[0m`);
180
+ if (installResult.enabled && installResult.started) {
181
+ console.log(`\x1b[32m✔ Service "${serviceNameChosen}" enabled and started via systemctl!\x1b[0m`);
182
+ }
183
+ else if (installResult.warning) {
184
+ console.log(`\x1b[33m⚠ ${installResult.warning}\x1b[0m`);
185
+ }
186
+ console.log(`\x1b[36mManagement commands:\x1b[0m`);
187
+ console.log(` Status: ${installResult.commands.status}`);
188
+ console.log(` Logs: ${installResult.commands.logs}`);
189
+ console.log(` Restart: ${installResult.commands.restart}`);
190
+ if (serviceTypeChosen === 'user') {
191
+ console.log(`\x1b[33m💡 Tip: Run "loginctl enable-linger ${process.env.USER || '$USER'}" so your service stays active after logout.\x1b[0m\n`);
192
+ }
193
+ else {
194
+ console.log();
195
+ }
196
+ }
197
+ else {
198
+ console.log(`\x1b[31m⚠ Failed to create service file: ${installResult.error}\x1b[0m\n`);
199
+ }
200
+ }
201
+ else {
202
+ console.log(`\x1b[2mBackground service creation skipped.\x1b[0m\n`);
203
+ }
204
+ }
205
+ else {
206
+ console.log(`Detected OS: \x1b[36m${process.platform}\x1b[0m`);
207
+ console.log(`\x1b[2mNote: Linux systemd setup is supported. (Windows native service support is coming soon!)\x1b[0m`);
208
+ const genLinuxInput = await rl.question(`Generate a Linux systemd .service file now (e.g. for VPS or Linux server deployment)? (y/N) [default: N]: `);
209
+ const shouldGen = genLinuxInput.trim().toLowerCase() === 'y';
210
+ if (shouldGen) {
211
+ const outPathInput = await rl.question(`Enter output path for .service file [default: ./musonda.service]: `);
212
+ const outPath = outPathInput.trim() || './musonda.service';
213
+ const nameInput = await rl.question(`Service name [default: musonda]: `);
214
+ serviceNameChosen = nameInput.trim() || 'musonda';
215
+ const linuxWorkDirInput = await rl.question(`Remote working directory on Linux (optional, press Enter for current directory): `);
216
+ const linuxWorkDir = linuxWorkDirInput.trim() || undefined;
217
+ const installResult = await installSystemdService({
218
+ serviceName: serviceNameChosen,
219
+ serviceType: 'file',
220
+ outputPath: outPath,
221
+ workingDirectory: linuxWorkDir,
222
+ port: 4141,
223
+ host: '127.0.0.1',
224
+ }, false);
225
+ if (installResult.success) {
226
+ serviceInstalled = true;
227
+ servicePathInstalled = installResult.servicePath;
228
+ serviceTypeChosen = 'file';
229
+ console.log(`\x1b[32m✔ Linux systemd service file generated at: ${installResult.servicePath}\x1b[0m`);
230
+ console.log(`To install on your Linux host:`);
231
+ console.log(` 1. Copy to: ~/.config/systemd/user/${serviceNameChosen}.service`);
232
+ console.log(` 2. Run: systemctl --user daemon-reload`);
233
+ console.log(` 3. Run: systemctl --user enable --now ${serviceNameChosen}.service\n`);
234
+ }
235
+ }
236
+ else {
237
+ console.log(`\x1b[2mBackground service creation skipped. (Windows service setup will be added soon).\x1b[0m\n`);
238
+ }
239
+ }
240
+ // ----------------------------------------------------
241
+ // Save Configuration & Initialize Memory
242
+ // ----------------------------------------------------
243
+ const newConfig = {
244
+ version: '1.0.0',
245
+ isOnboarded: true,
246
+ assistant: {
247
+ name: 'Musonda',
248
+ customName: assistantName,
249
+ title: assistantTitle,
250
+ tone: assistantTone,
251
+ },
252
+ user: {
253
+ name: userName,
254
+ bio: userBio,
255
+ interests: userBio ? [userBio] : [],
256
+ timezone: userTimezone,
257
+ communicationStyle,
258
+ notes: userNotes,
259
+ },
260
+ model: {
261
+ provider: 'openai',
262
+ model: 'gpt-5.6-luna',
263
+ apiKey: apiKey || 'placeholder-key',
264
+ baseUrl,
265
+ maxOutputTokens: 4096,
266
+ },
267
+ gateway: {
268
+ host: '127.0.0.1',
269
+ port: 4141,
270
+ enableHttp: true,
271
+ corsAllowedOrigins: [],
272
+ rateLimitPerMinute: 120,
273
+ trustProxy: false,
274
+ rateLimitMaxClients: 10000,
275
+ },
276
+ channels: {
277
+ discord: {
278
+ enabled: enableDiscord,
279
+ token: discordToken,
280
+ allowedGuilds: [],
281
+ allowedUsers: allowedDiscordUsers,
282
+ allowedChannels: allowedDiscordChannels,
283
+ allowPublic: false,
284
+ requireMentionInGuild: requireDiscordMention,
285
+ statusMessage: `${assistantName} | gpt-5.6-luna`,
286
+ },
287
+ slack: {
288
+ enabled: enableSlack,
289
+ botToken: slackBotToken,
290
+ appToken: slackAppToken,
291
+ signingSecret: '',
292
+ socketMode: true,
293
+ allowedChannels: [],
294
+ allowedUsers: [],
295
+ allowPublic: false,
296
+ replyInThread: slackReplyInThread,
297
+ },
298
+ cli: existingConfig.channels?.cli || {
299
+ enabled: false,
300
+ prompt: '> ',
301
+ showBanner: true,
302
+ showThinking: true,
303
+ userId: 'cli-user',
304
+ },
305
+ },
306
+ memory: {
307
+ storageDir: './data/memory',
308
+ sessionsDir: './data/sessions',
309
+ maxShortTermHistory: 30,
310
+ autoRecallTopK: 6,
311
+ },
312
+ fileSandbox: existingConfig.fileSandbox || {
313
+ enabled: true,
314
+ allowedRoots: ['./data/workspace'],
315
+ blockedPatterns: [
316
+ '*.env',
317
+ '*.env.*',
318
+ '**/.env',
319
+ '**/.env.*',
320
+ '**/id_rsa*',
321
+ '**/id_ed25519*',
322
+ '**/*.pem',
323
+ '**/*.key',
324
+ '**/.git/**',
325
+ '**/.git',
326
+ '**/node_modules/**',
327
+ '**/node_modules',
328
+ '**/musonda.config.json',
329
+ ],
330
+ maxReadSizeBytes: 10 * 1024 * 1024,
331
+ maxWriteSizeBytes: 25 * 1024 * 1024,
332
+ maxListEntries: 500,
333
+ allowDelete: true,
334
+ requireDeleteConfirmation: true,
335
+ },
336
+ plugins: existingConfig.plugins || {
337
+ enabled: true,
338
+ directories: ['./data/plugins', './plugins'],
339
+ dataDir: './data/plugin_data',
340
+ disabledPlugins: [],
341
+ },
342
+ service: serviceInstalled
343
+ ? {
344
+ serviceName: serviceNameChosen,
345
+ type: serviceTypeChosen,
346
+ enabled: serviceStarted,
347
+ installedPath: servicePathInstalled,
348
+ }
349
+ : existingConfig.service,
350
+ };
351
+ configLoader.save(newConfig);
352
+ // Initialize Memory Profile
353
+ const memory = new MemoryManager(newConfig);
354
+ memory.updateProfile({
355
+ name: userName,
356
+ assistantCustomName: assistantName,
357
+ bio: userBio,
358
+ timezone: userTimezone,
359
+ communicationStyle,
360
+ notes: userNotes,
361
+ });
362
+ // Save an initial memory fact from onboarding
363
+ if (userBio) {
364
+ memory.addMemory(`User ${userName} provided background: ${userBio}`, 'fact', ['onboarding', 'profile', 'bio']);
365
+ }
366
+ if (userNotes) {
367
+ memory.addMemory(`User preference: ${userNotes}`, 'preference', ['preference', 'instruction']);
368
+ }
369
+ console.log(`\x1b[1m\x1b[32m🎉 Onboarding Complete!\x1b[0m`);
370
+ console.log(`=======================================================`);
371
+ console.log(`Assistant Name: \x1b[35m${assistantName}\x1b[0m`);
372
+ console.log(`Model: \x1b[36mgpt-5.6-luna\x1b[0m (OpenAI Responses API)`);
373
+ console.log(`Gateway: \x1b[33mhttp://127.0.0.1:4141\x1b[0m`);
374
+ console.log(`Discord: ${enableDiscord ? '\x1b[32mEnabled\x1b[0m' : '\x1b[2mDisabled\x1b[0m'}`);
375
+ console.log(`Slack: ${enableSlack ? '\x1b[32mEnabled\x1b[0m' : '\x1b[2mDisabled\x1b[0m'}`);
376
+ console.log(`Memory Store: \x1b[34m./data/memory/\x1b[0m`);
377
+ console.log(`Service (.service): ${serviceInstalled ? `\x1b[32m${servicePathInstalled}\x1b[0m` : '\x1b[2mNot configured (use "musonda service install")\x1b[0m'}`);
378
+ console.log(`=======================================================`);
379
+ if (serviceStarted) {
380
+ console.log(`\n\x1b[32m✔ Gateway is actively running in background via systemd service "${serviceNameChosen}".\x1b[0m`);
381
+ console.log(`View live logs with: \x1b[1m\x1b[36mjournalctl --user -u ${serviceNameChosen} -f\x1b[0m\n`);
382
+ }
383
+ else {
384
+ console.log(`\nTo start the Musonda Gateway daemon, run:`);
385
+ console.log(`\x1b[1m\x1b[36m npm start\x1b[0m`);
386
+ if (serviceInstalled) {
387
+ console.log(`Or start via systemd: \x1b[1m\x1b[36msystemctl --user start ${serviceNameChosen}\x1b[0m\n`);
388
+ }
389
+ else {
390
+ console.log();
391
+ }
392
+ }
393
+ return newConfig;
394
+ }
395
+ finally {
396
+ rl.close();
397
+ }
398
+ }
399
+ // Run immediately if called directly
400
+ const isDirectRun = process.argv[1] && (process.argv[1].endsWith('onboarding.ts') ||
401
+ process.argv[1].endsWith('onboarding.js'));
402
+ if (isDirectRun) {
403
+ runOnboardingWizard().catch((err) => {
404
+ logger.error('Onboarding wizard failed:', err);
405
+ process.exit(1);
406
+ });
407
+ }
408
+ //# sourceMappingURL=onboarding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboarding.js","sourceRoot":"","sources":["../../src/wizard/onboarding.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,69 @@
1
+ {
2
+ "name": "musonda",
3
+ "version": "1.0.0",
4
+ "description": "Musonda - Personal AI Assistant & Agent Harness running on an extensible Gateway with Discord channels, memory, tools, and OpenAI Responses API (gpt-5.6-luna)",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "bin": {
8
+ "musonda": "dist/index.js",
9
+ "musonda-cli": "dist/cli.js"
10
+ },
11
+ "files": [
12
+ "dist",
13
+ "plugins",
14
+ "README.md",
15
+ "IMPLEMENTATION.md"
16
+ ],
17
+ "type": "module",
18
+ "scripts": {
19
+ "start": "node dist/index.js start gateway",
20
+ "start:dev": "tsx src/index.ts start gateway",
21
+ "cli": "tsx src/index.ts cli",
22
+ "musonda": "tsx src/index.ts",
23
+ "doctor": "node dist/index.js doctor",
24
+ "status": "node dist/index.js status",
25
+ "update": "node dist/index.js update",
26
+ "dev": "tsx watch src/index.ts start gateway",
27
+ "onboard": "tsx src/index.ts setup",
28
+ "build": "tsc",
29
+ "test": "tsx test/harness.test.ts && tsx test/agentEvents.test.ts && tsx test/gateway.test.ts && tsx test/scheduler.test.ts && tsx test/fileSandbox.test.ts && tsx test/cliChannel.test.ts && tsx test/securityAndProduction.test.ts && tsx test/plugins.test.ts && tsx test/dynamicPlugins.test.ts && tsx test/pluginManagement.test.ts && tsx test/musondaCli.test.ts && tsx test/service.test.ts",
30
+ "release:check": "node scripts/release.mjs check",
31
+ "release": "node scripts/release.mjs publish",
32
+ "release:patch": "node scripts/release.mjs patch",
33
+ "release:minor": "node scripts/release.mjs minor",
34
+ "release:major": "node scripts/release.mjs major",
35
+ "prepublishOnly": "npm run release:check",
36
+ "docker:smoke": "node scripts/docker-smoke.mjs"
37
+ },
38
+ "engines": {
39
+ "node": ">=20.0.0"
40
+ },
41
+ "keywords": [
42
+ "ai",
43
+ "agent",
44
+ "assistant",
45
+ "hermes",
46
+ "openclaw",
47
+ "gateway",
48
+ "discord",
49
+ "memory",
50
+ "tools",
51
+ "gpt-5.6-luna",
52
+ "responses-api"
53
+ ],
54
+ "author": "",
55
+ "license": "MIT",
56
+ "dependencies": {
57
+ "@slack/bolt": "^5.1.0",
58
+ "croner": "^10.0.1",
59
+ "discord.js": "^14.27.0",
60
+ "dotenv": "^17.4.2",
61
+ "openai": "^7.9.0",
62
+ "zod": "^4.5.4"
63
+ },
64
+ "devDependencies": {
65
+ "@types/node": "^26.4.1",
66
+ "tsx": "^4.23.13",
67
+ "typescript": "^7.0.2"
68
+ }
69
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "$schema": "https://agent-plugins.org/schemas/1.0.0/mcp.schema.json",
3
+ "mcpServers": {
4
+ "math-service": {
5
+ "type": "stdio",
6
+ "command": "node",
7
+ "args": ["./server.mjs"],
8
+ "cwd": "${PLUGIN_ROOT}"
9
+ }
10
+ }
11
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
3
+ "name": "example-calc",
4
+ "version": "1.0.0",
5
+ "description": "Example Agent Plugin demonstrating Agent Skills and MCP server tools in Musonda.",
6
+ "author": {
7
+ "name": "Musonda Team",
8
+ "email": "support@musonda.ai"
9
+ },
10
+ "license": "MIT",
11
+ "keywords": ["calculator", "math", "example", "agent-plugins"]
12
+ }
@@ -0,0 +1,92 @@
1
+ import readline from 'node:readline';
2
+
3
+ const rl = readline.createInterface({
4
+ input: process.stdin,
5
+ output: process.stdout,
6
+ terminal: false,
7
+ });
8
+
9
+ rl.on('line', (line) => {
10
+ const trimmed = line.trim();
11
+ if (!trimmed) return;
12
+
13
+ try {
14
+ const req = JSON.parse(trimmed);
15
+
16
+ if (req.method === 'initialize') {
17
+ process.stdout.write(
18
+ JSON.stringify({
19
+ jsonrpc: '2.0',
20
+ id: req.id,
21
+ result: {
22
+ protocolVersion: '2024-11-05',
23
+ capabilities: { tools: {} },
24
+ serverInfo: { name: 'math-service', version: '1.0.0' },
25
+ },
26
+ }) + '\n'
27
+ );
28
+ } else if (req.method === 'notifications/initialized') {
29
+ // client initialized ack
30
+ } else if (req.method === 'tools/list') {
31
+ process.stdout.write(
32
+ JSON.stringify({
33
+ jsonrpc: '2.0',
34
+ id: req.id,
35
+ result: {
36
+ tools: [
37
+ {
38
+ name: 'add',
39
+ description: 'Adds two numbers together.',
40
+ inputSchema: {
41
+ type: 'object',
42
+ properties: {
43
+ a: { type: 'number', description: 'First number' },
44
+ b: { type: 'number', description: 'Second number' },
45
+ },
46
+ required: ['a', 'b'],
47
+ },
48
+ },
49
+ {
50
+ name: 'multiply',
51
+ description: 'Multiplies two numbers together.',
52
+ inputSchema: {
53
+ type: 'object',
54
+ properties: {
55
+ a: { type: 'number', description: 'First number' },
56
+ b: { type: 'number', description: 'Second number' },
57
+ },
58
+ required: ['a', 'b'],
59
+ },
60
+ },
61
+ ],
62
+ },
63
+ }) + '\n'
64
+ );
65
+ } else if (req.method === 'tools/call') {
66
+ const { name, arguments: args } = req.params;
67
+ const a = Number(args?.a || 0);
68
+ const b = Number(args?.b || 0);
69
+
70
+ let textResult = '';
71
+ if (name === 'add') {
72
+ textResult = `Calculation result: ${a + b}`;
73
+ } else if (name === 'multiply') {
74
+ textResult = `Calculation result: ${a * b}`;
75
+ } else {
76
+ textResult = `Unknown tool: ${name}`;
77
+ }
78
+
79
+ process.stdout.write(
80
+ JSON.stringify({
81
+ jsonrpc: '2.0',
82
+ id: req.id,
83
+ result: {
84
+ content: [{ type: 'text', text: textResult }],
85
+ },
86
+ }) + '\n'
87
+ );
88
+ }
89
+ } catch (err) {
90
+ // Ignore invalid JSON lines
91
+ }
92
+ });
@@ -0,0 +1,15 @@
1
+ ---
2
+ name: math-assistant
3
+ description: Provides guidelines for performing mathematical evaluations and calculations using connected MCP tools.
4
+ license: MIT
5
+ metadata:
6
+ author: Musonda
7
+ version: "1.0.0"
8
+ ---
9
+
10
+ # Math Assistant Skill Instructions
11
+
12
+ When a user asks for calculations, arithmetic, or mathematical problem solving:
13
+ 1. Always prefer using the connected MCP calculator tools (`mcp_example-calc_math-service_add`, `mcp_example-calc_math-service_multiply`, etc.).
14
+ 2. Break complex calculations down into sequential steps.
15
+ 3. Show the final calculated values clearly to the user.
@@ -0,0 +1,12 @@
1
+ {
2
+ "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
3
+ "name": "plugin-builder",
4
+ "version": "1.0.0",
5
+ "description": "Meta-plugin providing guidelines, schemas, and skills for authoring, scaffolding, and dynamically registering Agent Plugins and Skills in Musonda.",
6
+ "author": {
7
+ "name": "Musonda Team",
8
+ "email": "support@musonda.ai"
9
+ },
10
+ "license": "MIT",
11
+ "keywords": ["plugins", "skills", "mcp", "developer-tools", "builder", "authoring"]
12
+ }