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.
- package/IMPLEMENTATION.md +432 -0
- package/README.md +119 -0
- package/dist/agent/harness.d.ts +25 -0
- package/dist/agent/harness.js +215 -0
- package/dist/agent/harness.js.map +1 -0
- package/dist/agent/openaiResponsesClient.d.ts +35 -0
- package/dist/agent/openaiResponsesClient.js +250 -0
- package/dist/agent/openaiResponsesClient.js.map +1 -0
- package/dist/agent/systemPrompt.d.ts +9 -0
- package/dist/agent/systemPrompt.js +100 -0
- package/dist/agent/systemPrompt.js.map +1 -0
- package/dist/agent/types.d.ts +53 -0
- package/dist/agent/types.js +2 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/cli/commands/chat.d.ts +6 -0
- package/dist/cli/commands/chat.js +8 -0
- package/dist/cli/commands/chat.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +4 -0
- package/dist/cli/commands/doctor.js +336 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/gateway.d.ts +20 -0
- package/dist/cli/commands/gateway.js +135 -0
- package/dist/cli/commands/gateway.js.map +1 -0
- package/dist/cli/commands/help.d.ts +4 -0
- package/dist/cli/commands/help.js +159 -0
- package/dist/cli/commands/help.js.map +1 -0
- package/dist/cli/commands/plugins.d.ts +18 -0
- package/dist/cli/commands/plugins.js +250 -0
- package/dist/cli/commands/plugins.js.map +1 -0
- package/dist/cli/commands/service.d.ts +16 -0
- package/dist/cli/commands/service.js +136 -0
- package/dist/cli/commands/service.js.map +1 -0
- package/dist/cli/commands/setup.d.ts +4 -0
- package/dist/cli/commands/setup.js +8 -0
- package/dist/cli/commands/setup.js.map +1 -0
- package/dist/cli/commands/status.d.ts +4 -0
- package/dist/cli/commands/status.js +73 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/update.d.ts +22 -0
- package/dist/cli/commands/update.js +226 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/daemon.d.ts +33 -0
- package/dist/cli/daemon.js +208 -0
- package/dist/cli/daemon.js.map +1 -0
- package/dist/cli/interactiveMenu.d.ts +5 -0
- package/dist/cli/interactiveMenu.js +225 -0
- package/dist/cli/interactiveMenu.js.map +1 -0
- package/dist/cli/musondaCli.d.ts +30 -0
- package/dist/cli/musondaCli.js +269 -0
- package/dist/cli/musondaCli.js.map +1 -0
- package/dist/cli/ui.d.ts +49 -0
- package/dist/cli/ui.js +90 -0
- package/dist/cli/ui.js.map +1 -0
- package/dist/cli.d.ts +9 -0
- package/dist/cli.js +315 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/loader.d.ts +12 -0
- package/dist/config/loader.js +217 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/paths.d.ts +11 -0
- package/dist/config/paths.js +18 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/config/types.d.ts +246 -0
- package/dist/config/types.js +155 -0
- package/dist/config/types.js.map +1 -0
- package/dist/gateway/channels/cli.d.ts +37 -0
- package/dist/gateway/channels/cli.js +298 -0
- package/dist/gateway/channels/cli.js.map +1 -0
- package/dist/gateway/channels/discord.d.ts +18 -0
- package/dist/gateway/channels/discord.js +419 -0
- package/dist/gateway/channels/discord.js.map +1 -0
- package/dist/gateway/channels/slack.d.ts +26 -0
- package/dist/gateway/channels/slack.js +470 -0
- package/dist/gateway/channels/slack.js.map +1 -0
- package/dist/gateway/channels/webhook.d.ts +18 -0
- package/dist/gateway/channels/webhook.js +49 -0
- package/dist/gateway/channels/webhook.js.map +1 -0
- package/dist/gateway/http.d.ts +33 -0
- package/dist/gateway/http.js +605 -0
- package/dist/gateway/http.js.map +1 -0
- package/dist/gateway/server.d.ts +38 -0
- package/dist/gateway/server.js +233 -0
- package/dist/gateway/server.js.map +1 -0
- package/dist/gateway/types.d.ts +28 -0
- package/dist/gateway/types.js +2 -0
- package/dist/gateway/types.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/memoryManager.d.ts +22 -0
- package/dist/memory/memoryManager.js +200 -0
- package/dist/memory/memoryManager.js.map +1 -0
- package/dist/memory/storage.d.ts +24 -0
- package/dist/memory/storage.js +187 -0
- package/dist/memory/storage.js.map +1 -0
- package/dist/memory/types.d.ts +43 -0
- package/dist/memory/types.js +2 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/plugins/manifest.d.ts +23 -0
- package/dist/plugins/manifest.js +185 -0
- package/dist/plugins/manifest.js.map +1 -0
- package/dist/plugins/mcp/mcpBridge.d.ts +31 -0
- package/dist/plugins/mcp/mcpBridge.js +115 -0
- package/dist/plugins/mcp/mcpBridge.js.map +1 -0
- package/dist/plugins/mcp/mcpClient.d.ts +43 -0
- package/dist/plugins/mcp/mcpClient.js +309 -0
- package/dist/plugins/mcp/mcpClient.js.map +1 -0
- package/dist/plugins/mcp/mcpConfig.d.ts +34 -0
- package/dist/plugins/mcp/mcpConfig.js +326 -0
- package/dist/plugins/mcp/mcpConfig.js.map +1 -0
- package/dist/plugins/mcp/types.d.ts +48 -0
- package/dist/plugins/mcp/types.js +2 -0
- package/dist/plugins/mcp/types.js.map +1 -0
- package/dist/plugins/pluginManager.d.ts +164 -0
- package/dist/plugins/pluginManager.js +1016 -0
- package/dist/plugins/pluginManager.js.map +1 -0
- package/dist/plugins/skills/frontmatterParser.d.ts +28 -0
- package/dist/plugins/skills/frontmatterParser.js +189 -0
- package/dist/plugins/skills/frontmatterParser.js.map +1 -0
- package/dist/plugins/skills/skillDiscovery.d.ts +15 -0
- package/dist/plugins/skills/skillDiscovery.js +148 -0
- package/dist/plugins/skills/skillDiscovery.js.map +1 -0
- package/dist/plugins/skills/skillTools.d.ts +8 -0
- package/dist/plugins/skills/skillTools.js +195 -0
- package/dist/plugins/skills/skillTools.js.map +1 -0
- package/dist/plugins/skills/types.d.ts +25 -0
- package/dist/plugins/skills/types.js +2 -0
- package/dist/plugins/skills/types.js.map +1 -0
- package/dist/plugins/types.d.ts +30 -0
- package/dist/plugins/types.js +2 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/scheduler/scheduler.d.ts +25 -0
- package/dist/scheduler/scheduler.js +239 -0
- package/dist/scheduler/scheduler.js.map +1 -0
- package/dist/scheduler/types.d.ts +39 -0
- package/dist/scheduler/types.js +2 -0
- package/dist/scheduler/types.js.map +1 -0
- package/dist/security/childProcessEnv.d.ts +5 -0
- package/dist/security/childProcessEnv.js +42 -0
- package/dist/security/childProcessEnv.js.map +1 -0
- package/dist/security/fileSandbox.d.ts +153 -0
- package/dist/security/fileSandbox.js +779 -0
- package/dist/security/fileSandbox.js.map +1 -0
- package/dist/service/index.d.ts +30 -0
- package/dist/service/index.js +41 -0
- package/dist/service/index.js.map +1 -0
- package/dist/service/systemd.d.ts +36 -0
- package/dist/service/systemd.js +409 -0
- package/dist/service/systemd.js.map +1 -0
- package/dist/service/types.d.ts +118 -0
- package/dist/service/types.js +6 -0
- package/dist/service/types.js.map +1 -0
- package/dist/tools/builtin/calcTools.d.ts +2 -0
- package/dist/tools/builtin/calcTools.js +51 -0
- package/dist/tools/builtin/calcTools.js.map +1 -0
- package/dist/tools/builtin/fileTools.d.ts +11 -0
- package/dist/tools/builtin/fileTools.js +352 -0
- package/dist/tools/builtin/fileTools.js.map +1 -0
- package/dist/tools/builtin/memoryTools.d.ts +4 -0
- package/dist/tools/builtin/memoryTools.js +123 -0
- package/dist/tools/builtin/memoryTools.js.map +1 -0
- package/dist/tools/builtin/noteTools.d.ts +4 -0
- package/dist/tools/builtin/noteTools.js +91 -0
- package/dist/tools/builtin/noteTools.js.map +1 -0
- package/dist/tools/builtin/pluginTools.d.ts +29 -0
- package/dist/tools/builtin/pluginTools.js +406 -0
- package/dist/tools/builtin/pluginTools.js.map +1 -0
- package/dist/tools/builtin/scheduleTools.d.ts +4 -0
- package/dist/tools/builtin/scheduleTools.js +156 -0
- package/dist/tools/builtin/scheduleTools.js.map +1 -0
- package/dist/tools/builtin/timeTools.d.ts +2 -0
- package/dist/tools/builtin/timeTools.js +41 -0
- package/dist/tools/builtin/timeTools.js.map +1 -0
- package/dist/tools/builtin/webTools.d.ts +12 -0
- package/dist/tools/builtin/webTools.js +325 -0
- package/dist/tools/builtin/webTools.js.map +1 -0
- package/dist/tools/registry.d.ts +15 -0
- package/dist/tools/registry.js +111 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/types.d.ts +41 -0
- package/dist/tools/types.js +2 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/utils/logger.d.ts +29 -0
- package/dist/utils/logger.js +124 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/wizard/onboarding.d.ts +3 -0
- package/dist/wizard/onboarding.js +408 -0
- package/dist/wizard/onboarding.js.map +1 -0
- package/package.json +69 -0
- package/plugins/example-calc/mcp.json +11 -0
- package/plugins/example-calc/plugin.json +12 -0
- package/plugins/example-calc/server.mjs +92 -0
- package/plugins/example-calc/skills/math-assistant/SKILL.md +15 -0
- package/plugins/plugin-builder/plugin.json +12 -0
- package/plugins/plugin-builder/skills/create-plugin/SKILL.md +149 -0
- package/plugins/plugin-builder/skills/manage-plugins/SKILL.md +157 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"systemPrompt.js","sourceRoot":"","sources":["../../src/agent/systemPrompt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
export interface AgentToolCall {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
arguments: string;
|
|
5
|
+
}
|
|
6
|
+
export interface AgentMessage {
|
|
7
|
+
role: 'user' | 'assistant' | 'system' | 'tool';
|
|
8
|
+
content: string;
|
|
9
|
+
toolCalls?: AgentToolCall[];
|
|
10
|
+
toolCallId?: string;
|
|
11
|
+
name?: string;
|
|
12
|
+
}
|
|
13
|
+
export type AgentEvent = {
|
|
14
|
+
type: 'run.started';
|
|
15
|
+
} | {
|
|
16
|
+
type: 'status';
|
|
17
|
+
text: string;
|
|
18
|
+
} | {
|
|
19
|
+
type: 'tool.started';
|
|
20
|
+
name: string;
|
|
21
|
+
} | {
|
|
22
|
+
type: 'tool.completed';
|
|
23
|
+
name: string;
|
|
24
|
+
} | {
|
|
25
|
+
type: 'output.delta';
|
|
26
|
+
text: string;
|
|
27
|
+
} | {
|
|
28
|
+
type: 'reasoning.summary.delta';
|
|
29
|
+
text: string;
|
|
30
|
+
} | {
|
|
31
|
+
type: 'run.completed';
|
|
32
|
+
text: string;
|
|
33
|
+
} | {
|
|
34
|
+
type: 'run.failed';
|
|
35
|
+
message: string;
|
|
36
|
+
};
|
|
37
|
+
export interface AgentRunInput {
|
|
38
|
+
sessionId: string;
|
|
39
|
+
channel: string;
|
|
40
|
+
channelId?: string;
|
|
41
|
+
userId: string;
|
|
42
|
+
userName?: string;
|
|
43
|
+
threadTs?: string;
|
|
44
|
+
messageText: string;
|
|
45
|
+
scheduler?: any;
|
|
46
|
+
onStreamDelta?: (delta: string) => void | Promise<void>;
|
|
47
|
+
onEvent?: (event: AgentEvent) => void | Promise<void>;
|
|
48
|
+
}
|
|
49
|
+
export interface AgentRunResult {
|
|
50
|
+
replyText: string;
|
|
51
|
+
toolCallsCount: number;
|
|
52
|
+
sessionId: string;
|
|
53
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/agent/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Musonda Chat CLI Command Handler
|
|
3
|
+
*/
|
|
4
|
+
import { startChatCliSession } from '../../cli.js';
|
|
5
|
+
export async function handleChatCommand(options = {}) {
|
|
6
|
+
await startChatCliSession({ standalone: options.standalone ?? true });
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=chat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../src/cli/commands/chat.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAO,GAA6B,EAAE;IAC5E,MAAM,mBAAmB,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC,CAAC;AACxE,CAAC"}
|
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Musonda Doctor - System, Runtime, Security & Configuration Diagnostics
|
|
3
|
+
*/
|
|
4
|
+
import fs from 'node:fs';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import net from 'node:net';
|
|
7
|
+
import { execSync } from 'node:child_process';
|
|
8
|
+
import { c, symbols, printSectionHeader } from '../ui.js';
|
|
9
|
+
import { configLoader } from '../../config/loader.js';
|
|
10
|
+
import { MusondaConfigSchema } from '../../config/types.js';
|
|
11
|
+
import { getDefaultConfigPath } from '../../config/paths.js';
|
|
12
|
+
import { checkGatewayHealth } from '../daemon.js';
|
|
13
|
+
export async function handleDoctorCommand() {
|
|
14
|
+
printSectionHeader('Musonda Doctor Diagnostic Suite', 'Verifying runtime, configuration, storage, and connectivity');
|
|
15
|
+
const results = [];
|
|
16
|
+
const addResult = (r) => results.push(r);
|
|
17
|
+
// 1. Node.js Runtime Check
|
|
18
|
+
const nodeVer = process.version;
|
|
19
|
+
const majorVer = parseInt(nodeVer.replace(/^v/, '').split('.')[0], 10);
|
|
20
|
+
if (majorVer >= 20) {
|
|
21
|
+
addResult({
|
|
22
|
+
category: 'Runtime',
|
|
23
|
+
check: 'Node.js Version',
|
|
24
|
+
status: 'pass',
|
|
25
|
+
message: `Node.js ${nodeVer} (Supported: >=20.0.0) [${process.platform} ${process.arch}]`,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
addResult({
|
|
30
|
+
category: 'Runtime',
|
|
31
|
+
check: 'Node.js Version',
|
|
32
|
+
status: 'fail',
|
|
33
|
+
message: `Node.js ${nodeVer} is unsupported. Musonda requires Node.js >=20.0.0.`,
|
|
34
|
+
fixHint: 'Upgrade Node.js to v20 or v22 LTS.',
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
// 2. Command Line Tools (git & npm)
|
|
38
|
+
try {
|
|
39
|
+
const gitVer = execSync('git --version', { stdio: 'pipe' }).toString().trim();
|
|
40
|
+
addResult({
|
|
41
|
+
category: 'Tools',
|
|
42
|
+
check: 'Git CLI',
|
|
43
|
+
status: 'pass',
|
|
44
|
+
message: `${gitVer} available for plugin installation and updates`,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
addResult({
|
|
49
|
+
category: 'Tools',
|
|
50
|
+
check: 'Git CLI',
|
|
51
|
+
status: 'warn',
|
|
52
|
+
message: 'Git CLI not found on PATH.',
|
|
53
|
+
fixHint: 'Install Git to enable installing Agent Plugins from GitHub repositories.',
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
const npmVer = execSync('npm --version', { stdio: 'pipe' }).toString().trim();
|
|
58
|
+
addResult({
|
|
59
|
+
category: 'Tools',
|
|
60
|
+
check: 'npm CLI',
|
|
61
|
+
status: 'pass',
|
|
62
|
+
message: `npm v${npmVer} available for dependency management`,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
addResult({
|
|
67
|
+
category: 'Tools',
|
|
68
|
+
check: 'npm CLI',
|
|
69
|
+
status: 'warn',
|
|
70
|
+
message: 'npm CLI not found on PATH.',
|
|
71
|
+
fixHint: 'Ensure npm is installed to manage plugin dependencies.',
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
// 3. Configuration & Security
|
|
75
|
+
const configPath = configLoader.resolveConfigFilePath() || getDefaultConfigPath();
|
|
76
|
+
const configExists = fs.existsSync(configPath);
|
|
77
|
+
if (configExists) {
|
|
78
|
+
try {
|
|
79
|
+
const raw = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
80
|
+
const validation = MusondaConfigSchema.safeParse(raw);
|
|
81
|
+
if (validation.success) {
|
|
82
|
+
addResult({
|
|
83
|
+
category: 'Config',
|
|
84
|
+
check: 'Config File',
|
|
85
|
+
status: 'pass',
|
|
86
|
+
message: `Configuration schema valid at "${configPath}"`,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
addResult({
|
|
91
|
+
category: 'Config',
|
|
92
|
+
check: 'Config File',
|
|
93
|
+
status: 'warn',
|
|
94
|
+
message: `Configuration has validation warnings: ${validation.error.issues[0]?.message}`,
|
|
95
|
+
fixHint: 'Run "musonda setup" to re-generate a clean configuration.',
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch (err) {
|
|
100
|
+
addResult({
|
|
101
|
+
category: 'Config',
|
|
102
|
+
check: 'Config File',
|
|
103
|
+
status: 'fail',
|
|
104
|
+
message: `Could not parse JSON in "${configPath}": ${err.message}`,
|
|
105
|
+
fixHint: 'Fix JSON syntax or run "musonda setup".',
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
addResult({
|
|
111
|
+
category: 'Config',
|
|
112
|
+
check: 'Config File',
|
|
113
|
+
status: 'warn',
|
|
114
|
+
message: `No saved config.json found at "${configPath}". Running on defaults.`,
|
|
115
|
+
fixHint: 'Run "musonda setup" to configure your assistant and save preferences.',
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
const activeConfig = configLoader.load();
|
|
119
|
+
// Onboarding status
|
|
120
|
+
if (activeConfig.isOnboarded) {
|
|
121
|
+
addResult({
|
|
122
|
+
category: 'Config',
|
|
123
|
+
check: 'Onboarding',
|
|
124
|
+
status: 'pass',
|
|
125
|
+
message: `Assistant configured as "${activeConfig.assistant?.customName || activeConfig.assistant?.name || 'Musonda'}" for user "${activeConfig.user?.name || 'Friend'}"`,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
addResult({
|
|
130
|
+
category: 'Config',
|
|
131
|
+
check: 'Onboarding',
|
|
132
|
+
status: 'warn',
|
|
133
|
+
message: 'Assistant has not completed onboarding setup.',
|
|
134
|
+
fixHint: 'Run "musonda setup" to personalize assistant persona and channels.',
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
// 4. OpenAI API Key & Model
|
|
138
|
+
const apiKey = activeConfig.model?.apiKey || process.env.OPENAI_API_KEY || '';
|
|
139
|
+
if (apiKey) {
|
|
140
|
+
const maskedKey = apiKey.slice(0, 6) + '...' + apiKey.slice(-4);
|
|
141
|
+
addResult({
|
|
142
|
+
category: 'AI Model',
|
|
143
|
+
check: 'API Credentials',
|
|
144
|
+
status: 'pass',
|
|
145
|
+
message: `OpenAI API key configured (${maskedKey}), Model: ${activeConfig.model?.model || 'gpt-5.6-luna'}`,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
addResult({
|
|
150
|
+
category: 'AI Model',
|
|
151
|
+
check: 'API Credentials',
|
|
152
|
+
status: 'warn',
|
|
153
|
+
message: 'OPENAI_API_KEY is not configured in config.json or environment.',
|
|
154
|
+
fixHint: 'Set OPENAI_API_KEY in .env or run "musonda setup".',
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
// 5. Data & Storage Directories
|
|
158
|
+
const storageDir = path.resolve(activeConfig.memory?.storageDir || './data');
|
|
159
|
+
try {
|
|
160
|
+
if (!fs.existsSync(storageDir)) {
|
|
161
|
+
fs.mkdirSync(storageDir, { recursive: true });
|
|
162
|
+
}
|
|
163
|
+
const testFile = path.join(storageDir, '.doctor_write_test');
|
|
164
|
+
fs.writeFileSync(testFile, 'ok');
|
|
165
|
+
fs.unlinkSync(testFile);
|
|
166
|
+
addResult({
|
|
167
|
+
category: 'Storage',
|
|
168
|
+
check: 'Memory Directory',
|
|
169
|
+
status: 'pass',
|
|
170
|
+
message: `Read/write permissions verified for "${storageDir}"`,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
catch (err) {
|
|
174
|
+
addResult({
|
|
175
|
+
category: 'Storage',
|
|
176
|
+
check: 'Memory Directory',
|
|
177
|
+
status: 'fail',
|
|
178
|
+
message: `Cannot write to storage directory "${storageDir}": ${err.message}`,
|
|
179
|
+
fixHint: 'Ensure directory exists and has write permissions.',
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
// 6. Gateway Port & Network Health
|
|
183
|
+
const host = activeConfig.gateway?.host || '127.0.0.1';
|
|
184
|
+
const port = activeConfig.gateway?.port || 4141;
|
|
185
|
+
const health = await checkGatewayHealth(host, port, 800);
|
|
186
|
+
if (health) {
|
|
187
|
+
addResult({
|
|
188
|
+
category: 'Gateway',
|
|
189
|
+
check: 'Network Endpoint',
|
|
190
|
+
status: 'pass',
|
|
191
|
+
message: `Gateway is active and healthy on http://${host}:${port} (uptime: ${health.gateway?.uptimeSeconds || 0}s)`,
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
// Check if port is free to bind
|
|
196
|
+
const isPortFree = await new Promise((resolve) => {
|
|
197
|
+
const srv = net.createServer();
|
|
198
|
+
srv.once('error', () => resolve(false));
|
|
199
|
+
srv.once('listening', () => {
|
|
200
|
+
srv.close();
|
|
201
|
+
resolve(true);
|
|
202
|
+
});
|
|
203
|
+
srv.listen(port, host);
|
|
204
|
+
});
|
|
205
|
+
if (isPortFree) {
|
|
206
|
+
addResult({
|
|
207
|
+
category: 'Gateway',
|
|
208
|
+
check: 'Network Endpoint',
|
|
209
|
+
status: 'pass',
|
|
210
|
+
message: `Port ${port} on ${host} is available (Gateway is currently offline)`,
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
addResult({
|
|
215
|
+
category: 'Gateway',
|
|
216
|
+
check: 'Network Endpoint',
|
|
217
|
+
status: 'warn',
|
|
218
|
+
message: `Port ${port} on ${host} is currently in use by another application.`,
|
|
219
|
+
fixHint: `Change port with "musonda start gateway --port <new-port>" or in config.`,
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
// 7. Plugin Subsystem & Directories
|
|
224
|
+
const pluginsDir = path.resolve('./plugins');
|
|
225
|
+
if (fs.existsSync(pluginsDir)) {
|
|
226
|
+
try {
|
|
227
|
+
const entries = fs.readdirSync(pluginsDir, { withFileTypes: true }).filter((e) => e.isDirectory());
|
|
228
|
+
addResult({
|
|
229
|
+
category: 'Plugins',
|
|
230
|
+
check: 'Plugin Directory',
|
|
231
|
+
status: 'pass',
|
|
232
|
+
message: `Base plugins directory verified with ${entries.length} installed plugin(s)`,
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
catch (err) {
|
|
236
|
+
addResult({
|
|
237
|
+
category: 'Plugins',
|
|
238
|
+
check: 'Plugin Directory',
|
|
239
|
+
status: 'warn',
|
|
240
|
+
message: `Could not read plugins directory: ${err.message}`,
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
else {
|
|
245
|
+
addResult({
|
|
246
|
+
category: 'Plugins',
|
|
247
|
+
check: 'Plugin Directory',
|
|
248
|
+
status: 'pass',
|
|
249
|
+
message: `Plugin directory ready for creation upon first plugin install`,
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
// 8. Background Service (.service)
|
|
253
|
+
const serviceName = activeConfig.service?.serviceName || 'musonda';
|
|
254
|
+
const userUnitPath = path.join(process.env.HOME || '', '.config', 'systemd', 'user', `${serviceName}.service`);
|
|
255
|
+
const sysUnitPath = `/etc/systemd/system/${serviceName}.service`;
|
|
256
|
+
const localUnitPath = path.resolve('./musonda.service');
|
|
257
|
+
if (process.platform === 'linux') {
|
|
258
|
+
if (fs.existsSync(userUnitPath)) {
|
|
259
|
+
addResult({
|
|
260
|
+
category: 'Service',
|
|
261
|
+
check: 'Systemd Service',
|
|
262
|
+
status: 'pass',
|
|
263
|
+
message: `User service unit active at "${userUnitPath}"`,
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
else if (fs.existsSync(sysUnitPath)) {
|
|
267
|
+
addResult({
|
|
268
|
+
category: 'Service',
|
|
269
|
+
check: 'Systemd Service',
|
|
270
|
+
status: 'pass',
|
|
271
|
+
message: `System service unit active at "${sysUnitPath}"`,
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
else {
|
|
275
|
+
addResult({
|
|
276
|
+
category: 'Service',
|
|
277
|
+
check: 'Systemd Service',
|
|
278
|
+
status: 'warn',
|
|
279
|
+
message: 'No systemd .service unit configured for Musonda Gateway.',
|
|
280
|
+
fixHint: 'Run "musonda service install" to keep Gateway running 24/7.',
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
else {
|
|
285
|
+
if (fs.existsSync(localUnitPath)) {
|
|
286
|
+
addResult({
|
|
287
|
+
category: 'Service',
|
|
288
|
+
check: 'Service File',
|
|
289
|
+
status: 'pass',
|
|
290
|
+
message: `Linux systemd service file prepared at "${localUnitPath}"`,
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
else {
|
|
294
|
+
addResult({
|
|
295
|
+
category: 'Service',
|
|
296
|
+
check: 'Service Support',
|
|
297
|
+
status: 'pass',
|
|
298
|
+
message: `${process.platform} host detected. Linux systemd service generation available via "musonda service generate".`,
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
// Print Results
|
|
303
|
+
let passCount = 0;
|
|
304
|
+
let warnCount = 0;
|
|
305
|
+
let failCount = 0;
|
|
306
|
+
for (const res of results) {
|
|
307
|
+
let icon = symbols.success;
|
|
308
|
+
if (res.status === 'warn') {
|
|
309
|
+
icon = symbols.warning;
|
|
310
|
+
warnCount++;
|
|
311
|
+
}
|
|
312
|
+
else if (res.status === 'fail') {
|
|
313
|
+
icon = symbols.error;
|
|
314
|
+
failCount++;
|
|
315
|
+
}
|
|
316
|
+
else {
|
|
317
|
+
passCount++;
|
|
318
|
+
}
|
|
319
|
+
console.log(` ${icon} ${c.bold}[${res.category}]${c.reset} ${res.check}: ${res.message}`);
|
|
320
|
+
if (res.fixHint) {
|
|
321
|
+
console.log(` ${c.yellow}↳ Fix:${c.reset} ${res.fixHint}`);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
console.log('\n' + '─'.repeat(55));
|
|
325
|
+
console.log(`Diagnostic Summary: ${c.green}${passCount} Passed${c.reset} | ${c.yellow}${warnCount} Warnings${c.reset} | ${c.red}${failCount} Failures${c.reset}`);
|
|
326
|
+
if (failCount === 0 && warnCount === 0) {
|
|
327
|
+
console.log(`${symbols.sparkle} ${c.green}${c.bold}Your Musonda system is fully operational and optimized!${c.reset}\n`);
|
|
328
|
+
}
|
|
329
|
+
else if (failCount === 0) {
|
|
330
|
+
console.log(`${c.yellow}Musonda is operational with minor recommendations above.${c.reset}\n`);
|
|
331
|
+
}
|
|
332
|
+
else {
|
|
333
|
+
console.log(`${c.red}Please address critical issues marked above before running Musonda.${c.reset}\n`);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Musonda Gateway CLI Command Handlers (start, stop, restart)
|
|
3
|
+
*/
|
|
4
|
+
export declare function handleStartGateway(options: {
|
|
5
|
+
daemon?: boolean;
|
|
6
|
+
port?: number;
|
|
7
|
+
host?: string;
|
|
8
|
+
verbose?: boolean;
|
|
9
|
+
foreground?: boolean;
|
|
10
|
+
}): Promise<void>;
|
|
11
|
+
export declare function handleStopGateway(options: {
|
|
12
|
+
host?: string;
|
|
13
|
+
port?: number;
|
|
14
|
+
}): Promise<void>;
|
|
15
|
+
export declare function handleRestartGateway(options: {
|
|
16
|
+
daemon?: boolean;
|
|
17
|
+
port?: number;
|
|
18
|
+
host?: string;
|
|
19
|
+
verbose?: boolean;
|
|
20
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Musonda Gateway CLI Command Handlers (start, stop, restart)
|
|
3
|
+
*/
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { c, symbols } from '../ui.js';
|
|
6
|
+
import { configLoader } from '../../config/loader.js';
|
|
7
|
+
import { runOnboardingWizard } from '../../wizard/onboarding.js';
|
|
8
|
+
import { MusondaGateway } from '../../gateway/server.js';
|
|
9
|
+
import { logger } from '../../utils/logger.js';
|
|
10
|
+
import { checkGatewayHealth, startDaemonProcess, stopDaemonProcess, readPid, savePid, clearPid, } from '../daemon.js';
|
|
11
|
+
export async function handleStartGateway(options) {
|
|
12
|
+
const config = configLoader.load();
|
|
13
|
+
const host = options.host || config.gateway?.host || '127.0.0.1';
|
|
14
|
+
const port = options.port || config.gateway?.port || 4141;
|
|
15
|
+
// Check if gateway is already active
|
|
16
|
+
const existing = await checkGatewayHealth(host, port);
|
|
17
|
+
if (existing) {
|
|
18
|
+
const existingPid = readPid()?.pid;
|
|
19
|
+
console.log(`\n${symbols.warning} ${c.yellow}Musonda Gateway is already active at http://${host}:${port}${c.reset}`);
|
|
20
|
+
if (existingPid) {
|
|
21
|
+
console.log(` ${c.dim}Process PID: ${existingPid}${c.reset}`);
|
|
22
|
+
}
|
|
23
|
+
console.log(` ${c.dim}To stop the running gateway, run: ${c.bold}musonda stop gateway${c.reset}\n`);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
// Daemon mode (background process)
|
|
27
|
+
if (options.daemon && !options.foreground) {
|
|
28
|
+
console.log(`\n${symbols.rocket} Starting Musonda Gateway daemon in background...`);
|
|
29
|
+
try {
|
|
30
|
+
const { pid, logFile } = startDaemonProcess({
|
|
31
|
+
host,
|
|
32
|
+
port,
|
|
33
|
+
verbose: options.verbose,
|
|
34
|
+
});
|
|
35
|
+
// Poll until online or timeout
|
|
36
|
+
let isOnline = false;
|
|
37
|
+
for (let i = 0; i < 15; i++) {
|
|
38
|
+
await new Promise((r) => setTimeout(r, 300));
|
|
39
|
+
const health = await checkGatewayHealth(host, port, 400);
|
|
40
|
+
if (health) {
|
|
41
|
+
isOnline = true;
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (isOnline) {
|
|
46
|
+
console.log(`\n${symbols.success} ${c.bold}${c.green}Musonda Gateway daemon started successfully!${c.reset}`);
|
|
47
|
+
console.log(` ${c.cyan}PID:${c.reset} ${pid}`);
|
|
48
|
+
console.log(` ${c.cyan}Endpoint:${c.reset} http://${host}:${port}`);
|
|
49
|
+
console.log(` ${c.cyan}Log File:${c.reset} ${logFile}`);
|
|
50
|
+
console.log(` ${c.cyan}Commands:${c.reset} ${c.bold}musonda status${c.reset} | ${c.bold}musonda stop gateway${c.reset}\n`);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
console.log(`\n${symbols.warning} ${c.yellow}Gateway daemon spawned (PID: ${pid}), but health probe timed out.${c.reset}`);
|
|
54
|
+
console.log(` Check logs at: ${logFile}\n`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
console.error(`\n${symbols.error} ${c.red}Failed to start gateway daemon: ${err.message}${c.reset}\n`);
|
|
59
|
+
process.exit(1);
|
|
60
|
+
}
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
// Foreground mode
|
|
64
|
+
if (options.verbose) {
|
|
65
|
+
logger.setConsoleEnabled(true);
|
|
66
|
+
}
|
|
67
|
+
let activeConfig = config;
|
|
68
|
+
if (options.port) {
|
|
69
|
+
activeConfig.gateway.port = options.port;
|
|
70
|
+
}
|
|
71
|
+
if (options.host) {
|
|
72
|
+
activeConfig.gateway.host = options.host;
|
|
73
|
+
}
|
|
74
|
+
// If Musonda has not completed onboarding and running interactively, prompt wizard
|
|
75
|
+
if (!activeConfig.isOnboarded && process.stdin.isTTY && !options.foreground) {
|
|
76
|
+
console.log(`\n${symbols.info} Musonda is not yet configured. Starting initial onboarding wizard...`);
|
|
77
|
+
activeConfig = await runOnboardingWizard();
|
|
78
|
+
}
|
|
79
|
+
const gateway = new MusondaGateway(activeConfig);
|
|
80
|
+
// Record PID file for foreground mode too so other CLI calls know PID
|
|
81
|
+
savePid({
|
|
82
|
+
pid: process.pid,
|
|
83
|
+
port,
|
|
84
|
+
host,
|
|
85
|
+
startedAt: Date.now(),
|
|
86
|
+
logFile: path.resolve(activeConfig.memory?.storageDir || './data', 'gateway.log'),
|
|
87
|
+
});
|
|
88
|
+
const cleanup = async (signal) => {
|
|
89
|
+
console.log(`\n${symbols.info} Received ${signal}. Shutting down Musonda Gateway...`);
|
|
90
|
+
clearPid();
|
|
91
|
+
try {
|
|
92
|
+
await gateway.stop();
|
|
93
|
+
process.exit(0);
|
|
94
|
+
}
|
|
95
|
+
catch (err) {
|
|
96
|
+
console.error(`${symbols.error} Error during shutdown: ${err.message}`);
|
|
97
|
+
process.exit(1);
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
process.on('SIGINT', () => cleanup('SIGINT'));
|
|
101
|
+
process.on('SIGTERM', () => cleanup('SIGTERM'));
|
|
102
|
+
try {
|
|
103
|
+
await gateway.start();
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
clearPid();
|
|
107
|
+
console.error(`\n${symbols.error} ${c.red}Fatal error during Musonda Gateway startup: ${err.message || err}${c.reset}\n`);
|
|
108
|
+
process.exit(1);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
export async function handleStopGateway(options) {
|
|
112
|
+
const config = configLoader.load();
|
|
113
|
+
const host = options.host || config.gateway?.host || '127.0.0.1';
|
|
114
|
+
const port = options.port || config.gateway?.port || 4141;
|
|
115
|
+
console.log(`\n${symbols.info} Stopping Musonda Gateway on http://${host}:${port}...`);
|
|
116
|
+
const result = await stopDaemonProcess({ host, port });
|
|
117
|
+
if (result.wasRunning) {
|
|
118
|
+
console.log(`${symbols.success} ${c.green}${result.message}${c.reset}\n`);
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
console.log(`${symbols.warning} ${c.yellow}${result.message}${c.reset}\n`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
export async function handleRestartGateway(options) {
|
|
125
|
+
console.log(`\n${symbols.refresh} Restarting Musonda Gateway...`);
|
|
126
|
+
await handleStopGateway(options);
|
|
127
|
+
await new Promise((r) => setTimeout(r, 600));
|
|
128
|
+
await handleStartGateway({
|
|
129
|
+
daemon: options.daemon !== false,
|
|
130
|
+
port: options.port,
|
|
131
|
+
host: options.host,
|
|
132
|
+
verbose: options.verbose,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=gateway.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway.js","sourceRoot":"","sources":["../../../src/cli/commands/gateway.ts"],"names":[],"mappings":"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"}
|