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,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Musonda CLI Help Command
|
|
3
|
+
*/
|
|
4
|
+
import { c, CLI_BANNER } from '../ui.js';
|
|
5
|
+
export function handleHelpCommand(topic) {
|
|
6
|
+
const t = topic?.trim().toLowerCase();
|
|
7
|
+
if (t === 'gateway' || t === 'start' || t === 'stop') {
|
|
8
|
+
console.log(`
|
|
9
|
+
${c.bold}${c.cyan}Musonda Gateway Management:${c.reset}
|
|
10
|
+
The Gateway is the autonomous server hosting HTTP, Discord, Slack,
|
|
11
|
+
scheduler triggers, and active Agent Plugins & MCP tools.
|
|
12
|
+
|
|
13
|
+
${c.bold}Usage:${c.reset}
|
|
14
|
+
musonda start gateway [options] Start the gateway daemon or foreground server
|
|
15
|
+
musonda stop gateway [options] Stop the running gateway daemon
|
|
16
|
+
musonda restart gateway [options] Restart the gateway daemon
|
|
17
|
+
|
|
18
|
+
${c.bold}Options:${c.reset}
|
|
19
|
+
-d, --daemon Run in background mode detached from terminal
|
|
20
|
+
-p, --port <num> Override default HTTP port (default: 4141)
|
|
21
|
+
-h, --host <ip> Override binding host (default: 127.0.0.1)
|
|
22
|
+
-v, --verbose Enable detailed verbose logging
|
|
23
|
+
|
|
24
|
+
${c.bold}Examples:${c.reset}
|
|
25
|
+
musonda start gateway
|
|
26
|
+
musonda start gateway --daemon
|
|
27
|
+
musonda start gateway --port 8080
|
|
28
|
+
musonda stop gateway
|
|
29
|
+
`);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
if (t === 'plugin' || t === 'plugins' || t === 'add') {
|
|
33
|
+
console.log(`
|
|
34
|
+
${c.bold}${c.cyan}Musonda Agent Plugins & Tools Management:${c.reset}
|
|
35
|
+
Musonda supports the universal Agent Plugins specification (https://agent-plugins.org),
|
|
36
|
+
Agent Skills (progressive disclosure), and Model Context Protocol (MCP) servers.
|
|
37
|
+
|
|
38
|
+
${c.bold}Usage:${c.reset}
|
|
39
|
+
musonda add plugin <name|path|repo> Install and activate an Agent Plugin
|
|
40
|
+
musonda remove plugin <name> Uninstall and remove an Agent Plugin
|
|
41
|
+
musonda list plugins List all installed plugins, skills, and MCP tools
|
|
42
|
+
musonda find plugins [query] Search the Agent Plugins ecosystem & local catalog
|
|
43
|
+
|
|
44
|
+
${c.bold}Add Plugin Sources:${c.reset}
|
|
45
|
+
- Curated ecosystem name: musonda add plugin example-calc
|
|
46
|
+
- Curated builder plugin: musonda add plugin plugin-builder
|
|
47
|
+
- GitHub repo shorthand: musonda add plugin agentplugins/agent-plugins-example
|
|
48
|
+
- Git repository URL: musonda add plugin https://github.com/agentplugins/agent-plugins-example.git
|
|
49
|
+
- Local directory path: musonda add plugin ./my-plugin
|
|
50
|
+
|
|
51
|
+
${c.bold}Options:${c.reset}
|
|
52
|
+
--no-deps Skip running 'npm install' for plugin dependencies
|
|
53
|
+
--purge-data (For remove) Also delete persistent data directory in ./data/plugin_data
|
|
54
|
+
`);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
if (t === 'update') {
|
|
58
|
+
console.log(`
|
|
59
|
+
${c.bold}${c.cyan}Musonda Agent & Plugins Update Manager:${c.reset}
|
|
60
|
+
Manages updates for the core Musonda assistant harness, CLI, and installed Agent Plugins.
|
|
61
|
+
|
|
62
|
+
${c.bold}Usage:${c.reset}
|
|
63
|
+
musonda update Check and apply updates to both agent and plugins
|
|
64
|
+
musonda update agent Update only the core Musonda agent package
|
|
65
|
+
musonda update plugins Update all installed Agent Plugins
|
|
66
|
+
musonda update plugin <name> Update a specific installed Agent Plugin
|
|
67
|
+
|
|
68
|
+
${c.bold}Options:${c.reset}
|
|
69
|
+
-y, --yes Automatically confirm and apply updates without prompting
|
|
70
|
+
--check-only Check for updates and report status without applying changes
|
|
71
|
+
`);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if (t === 'service' || t === 'systemd' || t === 'daemon') {
|
|
75
|
+
console.log(`
|
|
76
|
+
${c.bold}${c.cyan}Musonda Background Service Management (.service):${c.reset}
|
|
77
|
+
Generates and manages systemd service units to keep Musonda Gateway alive 24/7.
|
|
78
|
+
Automatically starts on system boot and restarts on unexpected exits.
|
|
79
|
+
|
|
80
|
+
${c.bold}Usage:${c.reset}
|
|
81
|
+
musonda service [status] Check background service installation and state
|
|
82
|
+
musonda service install [options] Create and install systemd .service unit
|
|
83
|
+
musonda service generate [path] Export .service file to specified path (or ./musonda.service)
|
|
84
|
+
musonda service uninstall Stop, disable, and remove systemd service
|
|
85
|
+
|
|
86
|
+
${c.bold}Options:${c.reset}
|
|
87
|
+
--user Install as user-level service (~/.config/systemd/user/) [Default]
|
|
88
|
+
--system Install as system-level service (/etc/systemd/system/) [Requires sudo]
|
|
89
|
+
--file Export .service file to local directory without systemctl commands
|
|
90
|
+
--name <name> Override service name (default: musonda)
|
|
91
|
+
--path <path> Custom target filepath for the .service unit
|
|
92
|
+
--port <num> Override gateway port in ExecStart
|
|
93
|
+
--host <ip> Override gateway host in ExecStart
|
|
94
|
+
--no-enable Do not automatically enable/start with systemctl
|
|
95
|
+
|
|
96
|
+
${c.bold}Examples:${c.reset}
|
|
97
|
+
musonda service
|
|
98
|
+
musonda service install
|
|
99
|
+
musonda service install --system
|
|
100
|
+
musonda service generate ./musonda.service
|
|
101
|
+
musonda service uninstall
|
|
102
|
+
`);
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
// Full General Help Guide
|
|
106
|
+
console.log(CLI_BANNER);
|
|
107
|
+
console.log(`
|
|
108
|
+
${c.bold}Usage:${c.reset}
|
|
109
|
+
musonda Open interactive dashboard & menu
|
|
110
|
+
musonda <command> [subcommand] Run command directly
|
|
111
|
+
|
|
112
|
+
${c.bold}${c.yellow}Core Commands:${c.reset}
|
|
113
|
+
${c.green}start gateway${c.reset} Start the Musonda Gateway daemon/server
|
|
114
|
+
${c.green}stop [gateway]${c.reset} Stop the running Musonda Gateway
|
|
115
|
+
${c.green}restart [gateway]${c.reset} Restart the Musonda Gateway
|
|
116
|
+
${c.green}service [action]${c.reset} Manage persistent systemd background service (.service)
|
|
117
|
+
${c.green}cli${c.reset} Launch interactive chat with Musonda AI assistant
|
|
118
|
+
${c.green}status${c.reset} Display live gateway, model, persona & channels status
|
|
119
|
+
${c.green}doctor${c.reset} Diagnose environment, configs, keys, and dependencies
|
|
120
|
+
${c.green}setup${c.reset} Run the interactive onboarding & setup wizard
|
|
121
|
+
${c.green}version${c.reset} Display version and runtime information
|
|
122
|
+
${c.green}help [command]${c.reset} Display help documentation
|
|
123
|
+
|
|
124
|
+
${c.bold}${c.yellow}Plugin Management Commands:${c.reset}
|
|
125
|
+
${c.green}add plugin <source>${c.reset} Install & activate a plugin (local, git, or curated)
|
|
126
|
+
${c.green}remove plugin <name>${c.reset} Uninstall & remove an installed plugin
|
|
127
|
+
${c.green}list plugins${c.reset} List all installed plugins, skills & tools
|
|
128
|
+
${c.green}find plugins [query]${c.reset} Search plugins across local catalog and ecosystem
|
|
129
|
+
|
|
130
|
+
${c.bold}${c.yellow}Agent Update Commands:${c.reset}
|
|
131
|
+
${c.green}update${c.reset} Check & update core Musonda agent and plugins
|
|
132
|
+
${c.green}update agent${c.reset} Update Musonda package (npm or git)
|
|
133
|
+
${c.green}update plugins${c.reset} Update all installed plugins
|
|
134
|
+
${c.green}update plugin <name>${c.reset} Update a specific plugin
|
|
135
|
+
|
|
136
|
+
${c.bold}${c.yellow}Examples:${c.reset}
|
|
137
|
+
${c.dim}# Start interactive dashboard${c.reset}
|
|
138
|
+
musonda
|
|
139
|
+
|
|
140
|
+
${c.dim}# Start the Gateway in background daemon mode${c.reset}
|
|
141
|
+
musonda start gateway --daemon
|
|
142
|
+
|
|
143
|
+
${c.dim}# Talk to your AI assistant with real-time streaming${c.reset}
|
|
144
|
+
musonda cli
|
|
145
|
+
|
|
146
|
+
${c.dim}# Install a calculator plugin with MCP tools${c.reset}
|
|
147
|
+
musonda add plugin example-calc
|
|
148
|
+
|
|
149
|
+
${c.dim}# Install an Agent Plugin from GitHub${c.reset}
|
|
150
|
+
musonda add plugin agentplugins/agent-plugins-example
|
|
151
|
+
|
|
152
|
+
${c.dim}# Check for Musonda updates${c.reset}
|
|
153
|
+
musonda update
|
|
154
|
+
|
|
155
|
+
${c.dim}# Verify system diagnostics & keys${c.reset}
|
|
156
|
+
musonda doctor
|
|
157
|
+
`);
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=help.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../../src/cli/commands/help.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Musonda Plugins CLI Command Handlers (add, remove, list, find)
|
|
3
|
+
*/
|
|
4
|
+
export declare function resolvePluginSource(rawSource: string): string;
|
|
5
|
+
export declare function handleAddPlugin(source: string, options?: {
|
|
6
|
+
name?: string;
|
|
7
|
+
noDeps?: boolean;
|
|
8
|
+
}): Promise<void>;
|
|
9
|
+
export declare function handleRemovePlugin(pluginName: string, options?: {
|
|
10
|
+
deleteFiles?: boolean;
|
|
11
|
+
purgeData?: boolean;
|
|
12
|
+
}): Promise<void>;
|
|
13
|
+
export declare function handleListPlugins(options?: {
|
|
14
|
+
verbose?: boolean;
|
|
15
|
+
}): Promise<void>;
|
|
16
|
+
export declare function handleFindPlugins(query?: string, options?: {
|
|
17
|
+
source?: 'all' | 'local' | 'remote';
|
|
18
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Musonda Plugins CLI Command Handlers (add, remove, list, find)
|
|
3
|
+
*/
|
|
4
|
+
import fs from 'node:fs';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import { c, symbols, formatTable, printSectionHeader } from '../ui.js';
|
|
7
|
+
import { configLoader } from '../../config/loader.js';
|
|
8
|
+
import { PluginManager } from '../../plugins/pluginManager.js';
|
|
9
|
+
import { ToolRegistry } from '../../tools/registry.js';
|
|
10
|
+
import { checkGatewayHealth } from '../daemon.js';
|
|
11
|
+
export function resolvePluginSource(rawSource) {
|
|
12
|
+
const trimmed = rawSource.trim();
|
|
13
|
+
// Check if it's already a local path that exists
|
|
14
|
+
if (fs.existsSync(path.resolve(trimmed))) {
|
|
15
|
+
return path.resolve(trimmed);
|
|
16
|
+
}
|
|
17
|
+
// Check if it exists in ./plugins/<name>
|
|
18
|
+
const localInPlugins = path.resolve('./plugins', trimmed);
|
|
19
|
+
if (fs.existsSync(localInPlugins)) {
|
|
20
|
+
return localInPlugins;
|
|
21
|
+
}
|
|
22
|
+
// Curated ecosystem names mapping
|
|
23
|
+
const CURATED_SOURCES = {
|
|
24
|
+
'example-calc': 'https://github.com/agentplugins/agent-plugins-example.git',
|
|
25
|
+
'plugin-builder': 'https://github.com/agentplugins/agent-plugins-spec.git',
|
|
26
|
+
'agent-plugins-example': 'https://github.com/agentplugins/agent-plugins-example.git',
|
|
27
|
+
'agent-plugins-spec': 'https://github.com/agentplugins/agent-plugins-spec.git',
|
|
28
|
+
};
|
|
29
|
+
if (CURATED_SOURCES[trimmed.toLowerCase()]) {
|
|
30
|
+
// If local directory exists, prefer local
|
|
31
|
+
if (fs.existsSync(localInPlugins)) {
|
|
32
|
+
return localInPlugins;
|
|
33
|
+
}
|
|
34
|
+
return CURATED_SOURCES[trimmed.toLowerCase()];
|
|
35
|
+
}
|
|
36
|
+
// GitHub shorthand (owner/repo or github:owner/repo)
|
|
37
|
+
if (trimmed.startsWith('github:')) {
|
|
38
|
+
return `https://github.com/${trimmed.slice(7)}.git`;
|
|
39
|
+
}
|
|
40
|
+
if (/^[a-zA-Z0-9_-]+\/[a-zA-Z0-9_.-]+$/.test(trimmed)) {
|
|
41
|
+
return `https://github.com/${trimmed}.git`;
|
|
42
|
+
}
|
|
43
|
+
return trimmed;
|
|
44
|
+
}
|
|
45
|
+
export async function handleAddPlugin(source, options = {}) {
|
|
46
|
+
if (!source || !source.trim()) {
|
|
47
|
+
console.log(`\n${symbols.error} ${c.red}Missing required plugin name or source.${c.reset}`);
|
|
48
|
+
console.log(` Usage: ${c.bold}musonda add plugin <name|path|repo>${c.reset}\n`);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
const resolvedSource = resolvePluginSource(source);
|
|
52
|
+
const config = configLoader.load();
|
|
53
|
+
const host = config.gateway?.host || '127.0.0.1';
|
|
54
|
+
const port = config.gateway?.port || 4141;
|
|
55
|
+
console.log(`\n${symbols.plugin} Installing Agent Plugin from "${resolvedSource}"...`);
|
|
56
|
+
// Check if gateway is running
|
|
57
|
+
const runningGateway = await checkGatewayHealth(host, port);
|
|
58
|
+
if (runningGateway) {
|
|
59
|
+
// Install dynamically via Gateway HTTP API
|
|
60
|
+
try {
|
|
61
|
+
const res = await fetch(`http://${host}:${port}/api/plugins/install`, {
|
|
62
|
+
method: 'POST',
|
|
63
|
+
headers: {
|
|
64
|
+
'Content-Type': 'application/json',
|
|
65
|
+
...(config.gateway?.apiKey ? { Authorization: `Bearer ${config.gateway.apiKey}` } : {}),
|
|
66
|
+
},
|
|
67
|
+
body: JSON.stringify({
|
|
68
|
+
source: resolvedSource,
|
|
69
|
+
name: options.name,
|
|
70
|
+
installDependencies: !options.noDeps,
|
|
71
|
+
}),
|
|
72
|
+
});
|
|
73
|
+
const data = await res.json();
|
|
74
|
+
if (!res.ok || !data.success) {
|
|
75
|
+
console.log(`\n${symbols.error} ${c.red}Failed to install plugin: ${data.error || res.statusText}${c.reset}\n`);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
console.log(`\n${symbols.success} ${c.bold}${c.green}Agent Plugin installed and activated in live Gateway!${c.reset}`);
|
|
79
|
+
console.log(` ${c.cyan}Plugin Name:${c.reset} ${data.plugin?.manifest?.name || data.plugin?.name || source}`);
|
|
80
|
+
console.log(` ${c.cyan}Version:${c.reset} ${data.plugin?.manifest?.version || '1.0.0'}`);
|
|
81
|
+
console.log(` ${c.cyan}Installed At:${c.reset} ${data.installedPath}`);
|
|
82
|
+
console.log(` ${c.cyan}Skills Discovered:${c.reset} ${data.skillsLoaded}`);
|
|
83
|
+
console.log(` ${c.cyan}MCP Tools Mounted:${c.reset} ${data.toolsRegistered?.length ? data.toolsRegistered.join(', ') : '(none)'}`);
|
|
84
|
+
console.log(` ${c.dim}Plugin is ready to use in CLI chat and across connected channels!${c.reset}\n`);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
console.log(`${symbols.warning} Could not reach running Gateway API directly (${err.message}). Falling back to local installation.`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Gateway is offline: install directly into plugins directory
|
|
92
|
+
const toolRegistry = new ToolRegistry();
|
|
93
|
+
const pm = new PluginManager(config);
|
|
94
|
+
const result = await pm.installPlugin({
|
|
95
|
+
source: resolvedSource,
|
|
96
|
+
name: options.name,
|
|
97
|
+
installDependencies: !options.noDeps,
|
|
98
|
+
}, toolRegistry);
|
|
99
|
+
if (!result.success) {
|
|
100
|
+
console.log(`\n${symbols.error} ${c.red}Failed to install plugin: ${result.error}${c.reset}\n`);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
console.log(`\n${symbols.success} ${c.bold}${c.green}Agent Plugin installed successfully!${c.reset}`);
|
|
104
|
+
console.log(` ${c.cyan}Plugin Name:${c.reset} ${result.plugin?.manifest.name || source}`);
|
|
105
|
+
console.log(` ${c.cyan}Version:${c.reset} ${result.plugin?.manifest.version || '1.0.0'}`);
|
|
106
|
+
console.log(` ${c.cyan}Directory:${c.reset} ${result.installedPath}`);
|
|
107
|
+
console.log(` ${c.cyan}Skills Discovered:${c.reset} ${result.skillsLoaded}`);
|
|
108
|
+
console.log(` ${c.cyan}MCP Tools Ready:${c.reset} ${result.toolsRegistered?.length ? result.toolsRegistered.join(', ') : '(none)'}`);
|
|
109
|
+
console.log(` ${c.dim}Note: Gateway is offline. This plugin will load automatically when Gateway starts.${c.reset}\n`);
|
|
110
|
+
}
|
|
111
|
+
export async function handleRemovePlugin(pluginName, options = {}) {
|
|
112
|
+
const trimmed = pluginName?.trim();
|
|
113
|
+
if (!trimmed) {
|
|
114
|
+
console.log(`\n${symbols.error} ${c.red}Missing required plugin name.${c.reset}`);
|
|
115
|
+
console.log(` Usage: ${c.bold}musonda remove plugin <name>${c.reset}\n`);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
const config = configLoader.load();
|
|
119
|
+
const host = config.gateway?.host || '127.0.0.1';
|
|
120
|
+
const port = config.gateway?.port || 4141;
|
|
121
|
+
console.log(`\n${symbols.plugin} Removing Agent Plugin "${trimmed}"...`);
|
|
122
|
+
// Check if gateway is running
|
|
123
|
+
const runningGateway = await checkGatewayHealth(host, port);
|
|
124
|
+
if (runningGateway) {
|
|
125
|
+
try {
|
|
126
|
+
const res = await fetch(`http://${host}:${port}/api/plugins/remove`, {
|
|
127
|
+
method: 'POST',
|
|
128
|
+
headers: {
|
|
129
|
+
'Content-Type': 'application/json',
|
|
130
|
+
...(config.gateway?.apiKey ? { Authorization: `Bearer ${config.gateway.apiKey}` } : {}),
|
|
131
|
+
},
|
|
132
|
+
body: JSON.stringify({
|
|
133
|
+
pluginName: trimmed,
|
|
134
|
+
deleteFiles: options.deleteFiles ?? true,
|
|
135
|
+
purgeData: options.purgeData ?? false,
|
|
136
|
+
}),
|
|
137
|
+
});
|
|
138
|
+
const data = await res.json();
|
|
139
|
+
if (!res.ok || !data.success) {
|
|
140
|
+
console.log(`\n${symbols.error} ${c.red}Failed to remove plugin: ${data.error || res.statusText}${c.reset}\n`);
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
console.log(`\n${symbols.success} ${c.bold}${c.green}Plugin "${trimmed}" successfully removed from Gateway!${c.reset}`);
|
|
144
|
+
if (data.skillsRemoved?.length) {
|
|
145
|
+
console.log(` ${c.cyan}Skills Removed:${c.reset} ${data.skillsRemoved.join(', ')}`);
|
|
146
|
+
}
|
|
147
|
+
if (data.toolsUnregistered?.length) {
|
|
148
|
+
console.log(` ${c.cyan}Tools Unregistered:${c.reset} ${data.toolsUnregistered.join(', ')}`);
|
|
149
|
+
}
|
|
150
|
+
console.log();
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
catch { }
|
|
154
|
+
}
|
|
155
|
+
// Offline removal
|
|
156
|
+
const toolRegistry = new ToolRegistry();
|
|
157
|
+
const pm = new PluginManager(config);
|
|
158
|
+
const result = await pm.removePlugin({
|
|
159
|
+
pluginName: trimmed,
|
|
160
|
+
deleteFiles: options.deleteFiles ?? true,
|
|
161
|
+
purgeData: options.purgeData ?? false,
|
|
162
|
+
}, toolRegistry);
|
|
163
|
+
if (!result.success) {
|
|
164
|
+
console.log(`\n${symbols.error} ${c.red}Failed to remove plugin: ${result.error}${c.reset}\n`);
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
console.log(`\n${symbols.success} ${c.bold}${c.green}Plugin "${trimmed}" uninstalled successfully!${c.reset}\n`);
|
|
168
|
+
}
|
|
169
|
+
export async function handleListPlugins(options = {}) {
|
|
170
|
+
const config = configLoader.load();
|
|
171
|
+
const host = config.gateway?.host || '127.0.0.1';
|
|
172
|
+
const port = config.gateway?.port || 4141;
|
|
173
|
+
printSectionHeader('Installed Agent Plugins', 'Skills, progressive disclosure packages & MCP servers');
|
|
174
|
+
// If gateway is running, fetch live status
|
|
175
|
+
const runningGateway = await checkGatewayHealth(host, port);
|
|
176
|
+
if (runningGateway) {
|
|
177
|
+
try {
|
|
178
|
+
const res = await fetch(`http://${host}:${port}/api/plugins`, {
|
|
179
|
+
headers: {
|
|
180
|
+
...(config.gateway?.apiKey ? { Authorization: `Bearer ${config.gateway.apiKey}` } : {}),
|
|
181
|
+
},
|
|
182
|
+
});
|
|
183
|
+
if (res.ok) {
|
|
184
|
+
const data = await res.json();
|
|
185
|
+
if (data.plugins && data.plugins.length > 0) {
|
|
186
|
+
const rows = data.plugins.map((p) => [
|
|
187
|
+
p.name,
|
|
188
|
+
p.version || '1.0.0',
|
|
189
|
+
p.skills?.length ? p.skills.join(', ') : '(none)',
|
|
190
|
+
p.mcpServers?.length ? p.mcpServers.join(', ') : '(none)',
|
|
191
|
+
p.description || '',
|
|
192
|
+
]);
|
|
193
|
+
console.log(formatTable(['Plugin', 'Version', 'Skills', 'MCP Servers', 'Description'], rows));
|
|
194
|
+
console.log(`\n${c.dim}Total: ${data.totalPlugins} plugin(s), ${data.totalSkills} skill(s), ${data.totalMcpServers} active MCP server(s)${c.reset}\n`);
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
catch { }
|
|
200
|
+
}
|
|
201
|
+
// Fallback to disk scan
|
|
202
|
+
const pm = new PluginManager(config);
|
|
203
|
+
const found = await pm.findPlugins({ source: 'local' });
|
|
204
|
+
if (found.local.length === 0) {
|
|
205
|
+
console.log(` ${c.dim}No plugins installed yet.${c.reset}`);
|
|
206
|
+
console.log(` To install a plugin: ${c.bold}musonda add plugin <name>${c.reset}\n`);
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
const rows = found.local.map((p) => [
|
|
210
|
+
p.name,
|
|
211
|
+
p.version || '1.0.0',
|
|
212
|
+
p.skills?.length ? p.skills.join(', ') : '(none)',
|
|
213
|
+
p.mcpServers?.length ? p.mcpServers.join(', ') : '(none)',
|
|
214
|
+
p.description || '',
|
|
215
|
+
]);
|
|
216
|
+
console.log(formatTable(['Plugin', 'Version', 'Skills', 'MCP Servers', 'Description'], rows));
|
|
217
|
+
console.log(`\n${c.dim}Total: ${found.local.length} plugin(s) found on disk${c.reset}\n`);
|
|
218
|
+
}
|
|
219
|
+
export async function handleFindPlugins(query = '', options = {}) {
|
|
220
|
+
const config = configLoader.load();
|
|
221
|
+
const pm = new PluginManager(config);
|
|
222
|
+
console.log(`\n${symbols.plugin} Searching Agent Plugins ecosystem${query ? ` for "${query}"` : ''}...`);
|
|
223
|
+
const results = await pm.findPlugins({ query, source: options.source || 'all' });
|
|
224
|
+
if (results.totalFound === 0) {
|
|
225
|
+
console.log(` ${c.dim}No matching plugins found.${c.reset}\n`);
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
if (results.local.length > 0) {
|
|
229
|
+
console.log(`\n${c.bold}${c.green}Installed Locally:${c.reset}`);
|
|
230
|
+
const localRows = results.local.map((p) => [
|
|
231
|
+
p.name,
|
|
232
|
+
p.version || '1.0.0',
|
|
233
|
+
p.skills.join(', ') || '(none)',
|
|
234
|
+
p.description || '',
|
|
235
|
+
]);
|
|
236
|
+
console.log(formatTable(['Plugin', 'Version', 'Skills', 'Description'], localRows));
|
|
237
|
+
}
|
|
238
|
+
if (results.remote.length > 0) {
|
|
239
|
+
console.log(`\n${c.bold}${c.cyan}Available in Ecosystem / Remote:${c.reset}`);
|
|
240
|
+
const remoteRows = results.remote.map((p) => [
|
|
241
|
+
p.name + (p.official ? ' (official)' : ''),
|
|
242
|
+
p.isInstalled ? `${c.green}Installed${c.reset}` : `${c.yellow}Available${c.reset}`,
|
|
243
|
+
p.author || '',
|
|
244
|
+
p.description || '',
|
|
245
|
+
]);
|
|
246
|
+
console.log(formatTable(['Plugin', 'Status', 'Author', 'Description'], remoteRows));
|
|
247
|
+
console.log(`\n${c.dim}Install any plugin with: ${c.bold}musonda add plugin <name>${c.reset}\n`);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=plugins.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugins.js","sourceRoot":"","sources":["../../../src/cli/commands/plugins.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Musonda Service CLI Command Handler
|
|
3
|
+
* Manages background service installation, status, uninstallation, and .service generation.
|
|
4
|
+
*/
|
|
5
|
+
export interface ServiceCommandFlags {
|
|
6
|
+
user?: boolean;
|
|
7
|
+
system?: boolean;
|
|
8
|
+
file?: boolean;
|
|
9
|
+
name?: string;
|
|
10
|
+
path?: string;
|
|
11
|
+
enable?: boolean;
|
|
12
|
+
port?: number;
|
|
13
|
+
host?: string;
|
|
14
|
+
verbose?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare function handleServiceCommand(subcommand?: string, args?: string[], flags?: ServiceCommandFlags): Promise<void>;
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Musonda Service CLI Command Handler
|
|
3
|
+
* Manages background service installation, status, uninstallation, and .service generation.
|
|
4
|
+
*/
|
|
5
|
+
import { c, symbols, printSectionHeader } from '../ui.js';
|
|
6
|
+
import { configLoader } from '../../config/loader.js';
|
|
7
|
+
import { installSystemdService, checkSystemdServiceStatus, uninstallSystemdService, writeSystemdServiceFile, getDefaultSystemdPath, getWindowsServiceNotice, } from '../../service/index.js';
|
|
8
|
+
export async function handleServiceCommand(subcommand, args = [], flags = {}) {
|
|
9
|
+
const sub = (subcommand || args[0] || 'status').toLowerCase();
|
|
10
|
+
const config = configLoader.load();
|
|
11
|
+
let serviceType = 'user';
|
|
12
|
+
if (flags.system)
|
|
13
|
+
serviceType = 'system';
|
|
14
|
+
else if (flags.file)
|
|
15
|
+
serviceType = 'file';
|
|
16
|
+
const serviceName = flags.name || args[1] || config.service?.serviceName || 'musonda';
|
|
17
|
+
// 1. Status
|
|
18
|
+
if (sub === 'status' || sub === 'check') {
|
|
19
|
+
printSectionHeader('Musonda Background Service Status', 'Systemd unit configuration & state');
|
|
20
|
+
const status = checkSystemdServiceStatus(serviceName, serviceType, flags.path);
|
|
21
|
+
console.log(` ${c.bold}Platform:${c.reset} ${process.platform} (${process.arch})`);
|
|
22
|
+
console.log(` ${c.bold}Service Name:${c.reset} ${serviceName}.service`);
|
|
23
|
+
console.log(` ${c.bold}Scope:${c.reset} ${serviceType.toUpperCase()} service`);
|
|
24
|
+
console.log(` ${c.bold}Unit File:${c.reset} ${status.servicePath || getDefaultSystemdPath(serviceType, serviceName)}`);
|
|
25
|
+
console.log(` ${c.bold}Installed:${c.reset} ${status.installed ? c.green + 'Yes' : c.red + 'No'}${c.reset}`);
|
|
26
|
+
if (process.platform === 'linux') {
|
|
27
|
+
console.log(` ${c.bold}Active State:${c.reset} ${status.active ? c.green + '● Running' : c.red + '○ Inactive'}${c.reset}`);
|
|
28
|
+
console.log(` ${c.bold}Enabled Boot:${c.reset} ${status.enabled ? c.green + 'Yes' : c.yellow + 'No'}${c.reset}`);
|
|
29
|
+
if (status.detail) {
|
|
30
|
+
console.log(`\n ${c.bold}Recent Systemd Output:${c.reset}`);
|
|
31
|
+
console.log(` ${c.dim}${status.detail.split('\n').slice(0, 8).join('\n ')}${c.reset}`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
console.log(` ${c.yellow}Note: Current platform is ${process.platform}. Direct systemctl state is only queryable on Linux.${c.reset}`);
|
|
36
|
+
if (process.platform === 'win32') {
|
|
37
|
+
console.log(` ${c.dim}${getWindowsServiceNotice()}${c.reset}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
console.log(`\n ${c.bold}Management Commands:${c.reset}`);
|
|
41
|
+
console.log(` Status: ${c.cyan}${status.commands.status}${c.reset}`);
|
|
42
|
+
console.log(` Logs: ${c.cyan}${status.commands.logs}${c.reset}`);
|
|
43
|
+
console.log(` Start: ${c.cyan}${status.commands.start}${c.reset}`);
|
|
44
|
+
console.log(` Stop: ${c.cyan}${status.commands.stop}${c.reset}`);
|
|
45
|
+
console.log(` Restart: ${c.cyan}${status.commands.restart}${c.reset}\n`);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
// 2. Install
|
|
49
|
+
if (sub === 'install' || sub === 'setup' || sub === 'create') {
|
|
50
|
+
printSectionHeader('Install Musonda Background Service', 'Creating systemd .service unit so gateway lives');
|
|
51
|
+
const enableAndStart = flags.enable !== false;
|
|
52
|
+
const port = flags.port || config.gateway?.port || 4141;
|
|
53
|
+
const host = flags.host || config.gateway?.host || '127.0.0.1';
|
|
54
|
+
console.log(` ${symbols.gear} Configuring systemd service unit: ${c.bold}${serviceName}.service${c.reset}`);
|
|
55
|
+
console.log(` Target: ${serviceType === 'system' ? 'System daemon (/etc/systemd/system/)' : serviceType === 'file' ? 'Local file export' : 'User daemon (~/.config/systemd/user/)'}`);
|
|
56
|
+
const result = await installSystemdService({
|
|
57
|
+
serviceName,
|
|
58
|
+
serviceType,
|
|
59
|
+
outputPath: flags.path,
|
|
60
|
+
port,
|
|
61
|
+
host,
|
|
62
|
+
}, enableAndStart);
|
|
63
|
+
if (result.success) {
|
|
64
|
+
console.log(`\n ${symbols.success} ${c.bold}${c.green}Service unit created successfully!${c.reset}`);
|
|
65
|
+
console.log(` ${c.cyan}Path:${c.reset} ${result.servicePath}`);
|
|
66
|
+
if (result.enabled && result.started) {
|
|
67
|
+
console.log(` ${symbols.rocket} ${c.green}Service enabled and started via systemctl!${c.reset}`);
|
|
68
|
+
}
|
|
69
|
+
else if (result.warning) {
|
|
70
|
+
console.log(` ${symbols.warning} ${c.yellow}${result.warning}${c.reset}`);
|
|
71
|
+
}
|
|
72
|
+
console.log(`\n ${c.bold}Commands to control your service:${c.reset}`);
|
|
73
|
+
console.log(` Check status: ${c.bold}${result.commands.status}${c.reset}`);
|
|
74
|
+
console.log(` Follow logs: ${c.bold}${result.commands.logs}${c.reset}`);
|
|
75
|
+
console.log(` Start: ${c.bold}${result.commands.start}${c.reset}`);
|
|
76
|
+
console.log(` Stop: ${c.bold}${result.commands.stop}${c.reset}`);
|
|
77
|
+
console.log(` Restart: ${c.bold}${result.commands.restart}${c.reset}`);
|
|
78
|
+
if (serviceType === 'user' && process.platform === 'linux') {
|
|
79
|
+
console.log(`\n ${c.yellow}Tip:${c.reset} Run ${c.bold}loginctl enable-linger ${process.env.USER || '$USER'}${c.reset} so your service stays running even when you log out.\n`);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
console.log();
|
|
83
|
+
}
|
|
84
|
+
// Update config if installed
|
|
85
|
+
config.service = {
|
|
86
|
+
serviceName,
|
|
87
|
+
type: serviceType,
|
|
88
|
+
enabled: Boolean(result.enabled),
|
|
89
|
+
installedPath: result.servicePath,
|
|
90
|
+
};
|
|
91
|
+
configLoader.save(config);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
console.error(`\n ${symbols.error} ${c.red}Failed to install service: ${result.error}${c.reset}\n`);
|
|
95
|
+
}
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
// 3. Generate (standalone file export)
|
|
99
|
+
if (sub === 'generate' || sub === 'export') {
|
|
100
|
+
const targetFile = flags.path || args[1] || './musonda.service';
|
|
101
|
+
console.log(`\n ${symbols.gear} Generating Linux systemd unit file at: ${c.bold}${targetFile}${c.reset}`);
|
|
102
|
+
const result = writeSystemdServiceFile({
|
|
103
|
+
serviceName,
|
|
104
|
+
serviceType: 'file',
|
|
105
|
+
outputPath: targetFile,
|
|
106
|
+
port: flags.port || config.gateway?.port || 4141,
|
|
107
|
+
host: flags.host || config.gateway?.host || '127.0.0.1',
|
|
108
|
+
});
|
|
109
|
+
console.log(` ${symbols.success} ${c.green}Generated: ${result.servicePath}${c.reset}`);
|
|
110
|
+
console.log(`\n ${c.bold}To install on a Linux host:${c.reset}`);
|
|
111
|
+
console.log(` 1. Copy to: ~/.config/systemd/user/${serviceName}.service`);
|
|
112
|
+
console.log(` 2. Run: systemctl --user daemon-reload`);
|
|
113
|
+
console.log(` 3. Run: systemctl --user enable --now ${serviceName}.service\n`);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
// 4. Uninstall
|
|
117
|
+
if (sub === 'uninstall' || sub === 'remove' || sub === 'delete') {
|
|
118
|
+
printSectionHeader('Uninstall Musonda Background Service', `Stopping and removing ${serviceName}.service`);
|
|
119
|
+
const result = await uninstallSystemdService(serviceName, serviceType, flags.path);
|
|
120
|
+
if (result.success) {
|
|
121
|
+
console.log(` ${symbols.success} ${c.green}${result.message}${c.reset}\n`);
|
|
122
|
+
if (config.service) {
|
|
123
|
+
config.service.enabled = false;
|
|
124
|
+
configLoader.save(config);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
console.error(` ${symbols.error} ${c.red}${result.message}${c.reset}\n`);
|
|
129
|
+
}
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
// Unknown subcommand
|
|
133
|
+
console.log(`\n${symbols.error} ${c.red}Unknown service action: "${sub}"${c.reset}`);
|
|
134
|
+
console.log(` Available actions: ${c.bold}status${c.reset}, ${c.bold}install${c.reset}, ${c.bold}generate${c.reset}, ${c.bold}uninstall${c.reset}\n`);
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/cli/commands/service.ts"],"names":[],"mappings":"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"}
|