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,187 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ export class JsonStorage {
4
+ filePath;
5
+ maxBackups = 10;
6
+ constructor(filePath) {
7
+ this.filePath = path.resolve(filePath);
8
+ this.ensureDirectory();
9
+ }
10
+ ensureDirectory() {
11
+ const dir = path.dirname(this.filePath);
12
+ if (!fs.existsSync(dir)) {
13
+ fs.mkdirSync(dir, { recursive: true });
14
+ }
15
+ }
16
+ acquireLock(timeoutMs = 5000) {
17
+ const lockPath = `${this.filePath}.lock`;
18
+ const start = Date.now();
19
+ while (Date.now() - start < timeoutMs) {
20
+ try {
21
+ const fd = fs.openSync(lockPath, 'wx');
22
+ fs.writeSync(fd, `${process.pid}\n${Date.now()}`);
23
+ fs.closeSync(fd);
24
+ return true;
25
+ }
26
+ catch (err) {
27
+ if (err.code === 'EEXIST') {
28
+ // Check for stale lock (> 10 seconds old)
29
+ try {
30
+ const stat = fs.statSync(lockPath);
31
+ if (Date.now() - stat.mtimeMs > 10000) {
32
+ fs.unlinkSync(lockPath);
33
+ continue;
34
+ }
35
+ }
36
+ catch { }
37
+ // Short backoff
38
+ const waitStart = Date.now();
39
+ while (Date.now() - waitStart < 25) {
40
+ // busy spin wait 25ms
41
+ }
42
+ }
43
+ else {
44
+ return false;
45
+ }
46
+ }
47
+ }
48
+ return false;
49
+ }
50
+ releaseLock() {
51
+ const lockPath = `${this.filePath}.lock`;
52
+ try {
53
+ if (fs.existsSync(lockPath)) {
54
+ fs.unlinkSync(lockPath);
55
+ }
56
+ }
57
+ catch { }
58
+ }
59
+ exists() {
60
+ return fs.existsSync(this.filePath);
61
+ }
62
+ read(defaultValue) {
63
+ if (!this.exists()) {
64
+ return defaultValue;
65
+ }
66
+ const raw = fs.readFileSync(this.filePath, 'utf-8');
67
+ if (!raw.trim()) {
68
+ return defaultValue;
69
+ }
70
+ try {
71
+ return JSON.parse(raw);
72
+ }
73
+ catch (err) {
74
+ const corruptBackupPath = `${this.filePath}.corrupt.${Date.now()}.bak`;
75
+ try {
76
+ fs.copyFileSync(this.filePath, corruptBackupPath);
77
+ console.error(`[STORAGE CRITICAL] Corrupted JSON detected in "${this.filePath}". Backed up original to "${corruptBackupPath}". Error: ${err.message}`);
78
+ }
79
+ catch (backupErr) {
80
+ console.error(`[STORAGE CRITICAL] Failed to create backup of corrupted file "${this.filePath}": ${backupErr.message}`);
81
+ }
82
+ return defaultValue;
83
+ }
84
+ }
85
+ write(data) {
86
+ this.ensureDirectory();
87
+ this.acquireLock();
88
+ const tempPath = `${this.filePath}.tmp.${Date.now()}`;
89
+ try {
90
+ const serialized = JSON.stringify(data, null, 2);
91
+ fs.writeFileSync(tempPath, serialized, 'utf-8');
92
+ // Keep latest pre-write backup if the file already exists
93
+ if (fs.existsSync(this.filePath)) {
94
+ try {
95
+ fs.copyFileSync(this.filePath, `${this.filePath}.bak`);
96
+ }
97
+ catch { }
98
+ }
99
+ fs.renameSync(tempPath, this.filePath);
100
+ }
101
+ catch (err) {
102
+ if (fs.existsSync(tempPath)) {
103
+ try {
104
+ fs.unlinkSync(tempPath);
105
+ }
106
+ catch { }
107
+ }
108
+ throw err;
109
+ }
110
+ finally {
111
+ this.releaseLock();
112
+ }
113
+ }
114
+ /**
115
+ * Creates an explicit snapshot backup of the current storage file in a .backups subdirectory.
116
+ * Automatically enforces rotation to retain the latest configured number of backups.
117
+ */
118
+ createBackup(tag) {
119
+ if (!this.exists())
120
+ return null;
121
+ const backupDir = path.join(path.dirname(this.filePath), '.backups');
122
+ if (!fs.existsSync(backupDir)) {
123
+ fs.mkdirSync(backupDir, { recursive: true });
124
+ }
125
+ const baseName = path.basename(this.filePath, '.json');
126
+ const timestamp = Date.now();
127
+ const backupFileName = `${baseName}.${tag || timestamp}.bak.json`;
128
+ const destination = path.join(backupDir, backupFileName);
129
+ try {
130
+ fs.copyFileSync(this.filePath, destination);
131
+ // Rotate older backups
132
+ const files = fs
133
+ .readdirSync(backupDir)
134
+ .filter((f) => f.startsWith(`${baseName}.`) && f.endsWith('.bak.json'))
135
+ .map((f) => ({
136
+ name: f,
137
+ path: path.join(backupDir, f),
138
+ time: fs.statSync(path.join(backupDir, f)).mtimeMs,
139
+ }))
140
+ .sort((a, b) => b.time - a.time);
141
+ if (files.length > this.maxBackups) {
142
+ for (const file of files.slice(this.maxBackups)) {
143
+ try {
144
+ fs.unlinkSync(file.path);
145
+ }
146
+ catch { }
147
+ }
148
+ }
149
+ return destination;
150
+ }
151
+ catch (err) {
152
+ console.error(`[STORAGE] Failed to create backup for "${this.filePath}": ${err.message}`);
153
+ return null;
154
+ }
155
+ }
156
+ /**
157
+ * Lists all existing backups for this storage instance, newest first.
158
+ */
159
+ listBackups() {
160
+ const backupDir = path.join(path.dirname(this.filePath), '.backups');
161
+ if (!fs.existsSync(backupDir))
162
+ return [];
163
+ const baseName = path.basename(this.filePath, '.json');
164
+ return fs
165
+ .readdirSync(backupDir)
166
+ .filter((f) => f.startsWith(`${baseName}.`) && f.endsWith('.bak.json'))
167
+ .map((f) => path.join(backupDir, f))
168
+ .sort((a, b) => fs.statSync(b).mtimeMs - fs.statSync(a).mtimeMs);
169
+ }
170
+ /**
171
+ * Restores data from the specified backup or the latest backup available.
172
+ */
173
+ restoreBackup(backupPath) {
174
+ const target = backupPath || this.listBackups()[0];
175
+ if (!target || !fs.existsSync(target))
176
+ return false;
177
+ try {
178
+ this.ensureDirectory();
179
+ fs.copyFileSync(target, this.filePath);
180
+ return true;
181
+ }
182
+ catch {
183
+ return false;
184
+ }
185
+ }
186
+ }
187
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/memory/storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,OAAO,WAAW;IACd,QAAQ,CAAS;IACjB,UAAU,GAAW,EAAE,CAAC;IAEhC,YAAY,QAAgB;QAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACvC,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAEO,eAAe;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAEO,WAAW,CAAC,SAAS,GAAW,IAAI;QAC1C,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,QAAQ,OAAO,CAAC;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,SAAS,EAAE,CAAC;YACtC,IAAI,CAAC;gBACH,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;gBACvC,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAClD,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;gBACjB,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC1B,0CAA0C;oBAC1C,IAAI,CAAC;wBACH,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;wBACnC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,GAAG,KAAK,EAAE,CAAC;4BACtC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;4BACxB,SAAS;wBACX,CAAC;oBACH,CAAC;oBAAC,MAAM,CAAC,CAAA,CAAC;oBACV,gBAAgB;oBAChB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;oBAC7B,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,EAAE,EAAE,CAAC;wBACnC,sBAAsB;oBACxB,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,OAAO,KAAK,CAAC;gBACf,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,WAAW;QACjB,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,QAAQ,OAAO,CAAC;QACzC,IAAI,CAAC;YACH,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC5B,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IAEM,MAAM;QACX,OAAO,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;IAEM,IAAI,CAAC,YAAe;QACzB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;YACnB,OAAO,YAAY,CAAC;QACtB,CAAC;QACD,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACpD,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;YAChB,OAAO,YAAY,CAAC;QACtB,CAAC;QACD,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAM,CAAC;QAC9B,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,MAAM,iBAAiB,GAAG,GAAG,IAAI,CAAC,QAAQ,YAAY,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC;YACvE,IAAI,CAAC;gBACH,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;gBAClD,OAAO,CAAC,KAAK,CACX,kDAAkD,IAAI,CAAC,QAAQ,6BAA6B,iBAAiB,aAAa,GAAG,CAAC,OAAO,EAAE,CACxI,CAAC;YACJ,CAAC;YAAC,OAAO,SAAc,EAAE,CAAC;gBACxB,OAAO,CAAC,KAAK,CACX,iEAAiE,IAAI,CAAC,QAAQ,MAAM,SAAS,CAAC,OAAO,EAAE,CACxG,CAAC;YACJ,CAAC;YACD,OAAO,YAAY,CAAC;QACtB,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,IAAO;QAClB,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,QAAQ,QAAQ,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QACtD,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACjD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;YAEhD,0DAA0D;YAC1D,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACjC,IAAI,CAAC;oBACH,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,QAAQ,MAAM,CAAC,CAAC;gBACzD,CAAC;gBAAC,MAAM,CAAC,CAAA,CAAC;YACZ,CAAC;YAED,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC5B,IAAI,CAAC;oBACH,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;gBAC1B,CAAC;gBAAC,MAAM,CAAC,CAAA,CAAC;YACZ,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,CAAC;IACH,CAAC;IAED;;;OAGG;IACI,YAAY,CAAC,GAAY;QAC9B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAAE,OAAO,IAAI,CAAC;QAChC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC,CAAC;QACrE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACvD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,cAAc,GAAG,GAAG,QAAQ,IAAI,GAAG,IAAI,SAAS,WAAW,CAAC;QAClE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;QAEzD,IAAI,CAAC;YACH,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;YAE5C,uBAAuB;YACvB,MAAM,KAAK,GAAG,EAAE;iBACb,WAAW,CAAC,SAAS,CAAC;iBACtB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,QAAQ,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;iBACtE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACX,IAAI,EAAE,CAAC;gBACP,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;gBAC7B,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO;aACnD,CAAC,CAAC;iBACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;YAEnC,IAAI,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;gBACnC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;oBAChD,IAAI,CAAC;wBACH,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC3B,CAAC;oBAAC,MAAM,CAAC,CAAA,CAAC;gBACZ,CAAC;YACH,CAAC;YAED,OAAO,WAAW,CAAC;QACrB,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,0CAA0C,IAAI,CAAC,QAAQ,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC1F,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACI,WAAW;QAChB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC,CAAC;QACrE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,EAAE,CAAC;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACvD,OAAO,EAAE;aACN,WAAW,CAAC,SAAS,CAAC;aACtB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,QAAQ,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;aACtE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;aACnC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACrE,CAAC;IAED;;OAEG;IACI,aAAa,CAAC,UAAmB;QACtC,MAAM,MAAM,GAAG,UAAU,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;QACnD,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,OAAO,KAAK,CAAC;QACpD,IAAI,CAAC;YACH,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,43 @@
1
+ export type MemoryCategory = 'fact' | 'preference' | 'project' | 'goal' | 'note' | 'general';
2
+ export interface MemoryItem {
3
+ id: string;
4
+ category: MemoryCategory;
5
+ content: string;
6
+ tags: string[];
7
+ createdAt: string;
8
+ updatedAt: string;
9
+ accessCount: number;
10
+ }
11
+ export interface UserMemoryProfile {
12
+ name: string;
13
+ assistantCustomName: string;
14
+ bio: string;
15
+ interests: string[];
16
+ timezone: string;
17
+ communicationStyle: 'concise' | 'detailed' | 'friendly' | 'technical';
18
+ notes: string;
19
+ customInstructions: string;
20
+ updatedAt: string;
21
+ }
22
+ export interface SessionMessage {
23
+ id: string;
24
+ role: 'user' | 'assistant' | 'system' | 'tool';
25
+ content: string;
26
+ toolCalls?: Array<{
27
+ id: string;
28
+ name: string;
29
+ arguments: string;
30
+ }>;
31
+ toolCallId?: string;
32
+ name?: string;
33
+ timestamp: string;
34
+ }
35
+ export interface SessionRecord {
36
+ sessionId: string;
37
+ channel: string;
38
+ userId: string;
39
+ userName?: string;
40
+ createdAt: string;
41
+ updatedAt: string;
42
+ messages: SessionMessage[];
43
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/memory/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,23 @@
1
+ import { ManifestValidationResult } from './types.js';
2
+ export declare const AGENT_PLUGINS_SCHEMA_V1 = "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json";
3
+ export declare class ManifestValidator {
4
+ /**
5
+ * Validates a plugin name according to Agent Plugins 1.0.0 Section 5.5:
6
+ * - 1 to 64 characters
7
+ * - Lowercase alphanumeric characters, hyphens, and periods only
8
+ * - First and last characters must be alphanumeric
9
+ * - No consecutive hyphens (--) and no consecutive periods (..)
10
+ */
11
+ static validatePluginName(name: string): {
12
+ valid: boolean;
13
+ error?: string;
14
+ };
15
+ /**
16
+ * Validates an in-memory manifest object against Agent Plugins 1.0.0 specification.
17
+ */
18
+ static validate(data: unknown): ManifestValidationResult;
19
+ /**
20
+ * Loads and validates a plugin manifest from a given plugin root directory.
21
+ */
22
+ static loadFromDirectory(pluginDir: string): ManifestValidationResult;
23
+ }
@@ -0,0 +1,185 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ export const AGENT_PLUGINS_SCHEMA_V1 = 'https://agent-plugins.org/schemas/1.0.0/plugin.schema.json';
4
+ const PERMITTED_TOP_LEVEL_FIELDS = new Set([
5
+ '$schema',
6
+ 'name',
7
+ 'version',
8
+ 'description',
9
+ 'author',
10
+ 'homepage',
11
+ 'repository',
12
+ 'license',
13
+ 'keywords',
14
+ 'extensions',
15
+ ]);
16
+ export class ManifestValidator {
17
+ /**
18
+ * Validates a plugin name according to Agent Plugins 1.0.0 Section 5.5:
19
+ * - 1 to 64 characters
20
+ * - Lowercase alphanumeric characters, hyphens, and periods only
21
+ * - First and last characters must be alphanumeric
22
+ * - No consecutive hyphens (--) and no consecutive periods (..)
23
+ */
24
+ static validatePluginName(name) {
25
+ if (typeof name !== 'string') {
26
+ return { valid: false, error: 'Plugin name must be a string.' };
27
+ }
28
+ if (name.length < 1 || name.length > 64) {
29
+ return { valid: false, error: `Plugin name must be 1-64 characters (got ${name.length}).` };
30
+ }
31
+ if (name.includes('--')) {
32
+ return { valid: false, error: 'Plugin name must not contain consecutive hyphens ("--").' };
33
+ }
34
+ if (name.includes('..')) {
35
+ return { valid: false, error: 'Plugin name must not contain consecutive periods ("..").' };
36
+ }
37
+ // Check characters and start/end alphanumeric
38
+ const nameRegex = /^[a-z0-9](?:[a-z0-9.-]*[a-z0-9])?$/;
39
+ if (!nameRegex.test(name)) {
40
+ return {
41
+ valid: false,
42
+ error: 'Plugin name must contain only lowercase alphanumeric characters, hyphens, and periods, and start/end with an alphanumeric character.',
43
+ };
44
+ }
45
+ return { valid: true };
46
+ }
47
+ /**
48
+ * Validates an in-memory manifest object against Agent Plugins 1.0.0 specification.
49
+ */
50
+ static validate(data) {
51
+ const errors = [];
52
+ const warnings = [];
53
+ if (!data || typeof data !== 'object' || Array.isArray(data)) {
54
+ return {
55
+ valid: false,
56
+ errors: ['plugin.json must be a JSON object.'],
57
+ warnings,
58
+ };
59
+ }
60
+ const obj = data;
61
+ // 1. Required $schema field
62
+ if (!obj.$schema || typeof obj.$schema !== 'string') {
63
+ errors.push('Manifest missing required string field "$schema".');
64
+ }
65
+ else if (obj.$schema !== AGENT_PLUGINS_SCHEMA_V1) {
66
+ errors.push(`Unsupported or invalid $schema: "${obj.$schema}". Musonda supports "${AGENT_PLUGINS_SCHEMA_V1}".`);
67
+ }
68
+ // 2. Required name field
69
+ if (obj.name === undefined || obj.name === null) {
70
+ errors.push('Manifest missing required string field "name".');
71
+ }
72
+ else {
73
+ const nameCheck = this.validatePluginName(obj.name);
74
+ if (!nameCheck.valid) {
75
+ errors.push(nameCheck.error);
76
+ }
77
+ }
78
+ // 3. Metadata fields
79
+ if (obj.version !== undefined && typeof obj.version !== 'string') {
80
+ errors.push('"version" field must be a string.');
81
+ }
82
+ if (obj.description !== undefined && typeof obj.description !== 'string') {
83
+ errors.push('"description" field must be a string.');
84
+ }
85
+ if (obj.homepage !== undefined && typeof obj.homepage !== 'string') {
86
+ errors.push('"homepage" field must be a string.');
87
+ }
88
+ if (obj.repository !== undefined && typeof obj.repository !== 'string') {
89
+ errors.push('"repository" field must be a string.');
90
+ }
91
+ if (obj.license !== undefined && typeof obj.license !== 'string') {
92
+ errors.push('"license" field must be a string.');
93
+ }
94
+ if (obj.keywords !== undefined) {
95
+ if (!Array.isArray(obj.keywords) || obj.keywords.some((k) => typeof k !== 'string')) {
96
+ errors.push('"keywords" field must be an array of strings.');
97
+ }
98
+ }
99
+ // Author field: may only contain 'name', 'email', 'url' string fields
100
+ if (obj.author !== undefined) {
101
+ if (typeof obj.author !== 'object' || obj.author === null || Array.isArray(obj.author)) {
102
+ errors.push('"author" field must be an object.');
103
+ }
104
+ else {
105
+ const allowedAuthorFields = new Set(['name', 'email', 'url']);
106
+ for (const [key, val] of Object.entries(obj.author)) {
107
+ if (!allowedAuthorFields.has(key)) {
108
+ errors.push(`"author" object contains forbidden property "${key}". Only name, email, url are allowed.`);
109
+ }
110
+ else if (typeof val !== 'string') {
111
+ errors.push(`"author.${key}" must be a string.`);
112
+ }
113
+ }
114
+ }
115
+ }
116
+ // Non-fatal: check unknown top-level fields
117
+ for (const key of Object.keys(obj)) {
118
+ if (!PERMITTED_TOP_LEVEL_FIELDS.has(key)) {
119
+ warnings.push(`Unknown top-level field "${key}" in plugin.json is ignored per specification.`);
120
+ }
121
+ }
122
+ // Non-fatal: check extensions
123
+ if (obj.extensions !== undefined) {
124
+ if (typeof obj.extensions !== 'object' || obj.extensions === null || Array.isArray(obj.extensions)) {
125
+ warnings.push('Field "extensions" is not an object; ignoring extensions per specification.');
126
+ }
127
+ }
128
+ if (errors.length > 0) {
129
+ return { valid: false, errors, warnings };
130
+ }
131
+ return {
132
+ valid: true,
133
+ manifest: obj,
134
+ errors: [],
135
+ warnings,
136
+ };
137
+ }
138
+ /**
139
+ * Loads and validates a plugin manifest from a given plugin root directory.
140
+ */
141
+ static loadFromDirectory(pluginDir) {
142
+ const resolvedRoot = path.resolve(pluginDir);
143
+ const manifestPath = path.join(resolvedRoot, 'plugin.json');
144
+ // Enforce filesystem containment
145
+ const resolvedManifestPath = path.resolve(manifestPath);
146
+ if (!resolvedManifestPath.startsWith(resolvedRoot)) {
147
+ return {
148
+ valid: false,
149
+ errors: [`plugin.json path escapes plugin root: "${manifestPath}"`],
150
+ warnings: [],
151
+ };
152
+ }
153
+ if (!fs.existsSync(resolvedManifestPath)) {
154
+ return {
155
+ valid: false,
156
+ errors: [`No plugin.json found in plugin root: "${resolvedRoot}"`],
157
+ warnings: [],
158
+ };
159
+ }
160
+ let fileContent;
161
+ try {
162
+ fileContent = fs.readFileSync(resolvedManifestPath, 'utf8');
163
+ }
164
+ catch (err) {
165
+ return {
166
+ valid: false,
167
+ errors: [`Failed to read plugin.json: ${err.message}`],
168
+ warnings: [],
169
+ };
170
+ }
171
+ let parsed;
172
+ try {
173
+ parsed = JSON.parse(fileContent);
174
+ }
175
+ catch (err) {
176
+ return {
177
+ valid: false,
178
+ errors: [`plugin.json is not valid JSON: ${err.message}`],
179
+ warnings: [],
180
+ };
181
+ }
182
+ return this.validate(parsed);
183
+ }
184
+ }
185
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/plugins/manifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { ToolDefinition } from '../../tools/types.js';
2
+ import { ToolRegistry } from '../../tools/registry.js';
3
+ import { ResolvedMcpServer } from './types.js';
4
+ import { McpClientInterface } from './mcpClient.js';
5
+ export interface ActiveMcpServer {
6
+ server: ResolvedMcpServer;
7
+ client: McpClientInterface;
8
+ tools: ToolDefinition[];
9
+ }
10
+ export declare class McpBridge {
11
+ private activeServers;
12
+ /**
13
+ * Sanitizes names into valid OpenAI function tool names:
14
+ * 1-64 characters matching ^[a-zA-Z0-9_-]+$
15
+ */
16
+ static sanitizeToolName(name: string): string;
17
+ /**
18
+ * Connects to a resolved MCP server, lists its tools, and registers them in Musonda's ToolRegistry.
19
+ * If the server fails to connect or list tools, logs warning and skips it without failing other components.
20
+ */
21
+ registerServer(server: ResolvedMcpServer, registry: ToolRegistry): Promise<boolean>;
22
+ getActiveServers(): ActiveMcpServer[];
23
+ /**
24
+ * Gracefully disconnects and unregisters all MCP servers and their bridged tools for a given plugin.
25
+ */
26
+ unregisterServersForPlugin(pluginName: string, registry?: ToolRegistry): Promise<void>;
27
+ /**
28
+ * Gracefully shuts down all active MCP servers (terminates stdio subprocesses).
29
+ */
30
+ shutdown(): Promise<void>;
31
+ }
@@ -0,0 +1,115 @@
1
+ import { McpStdioClient, McpHttpClient } from './mcpClient.js';
2
+ import { logger } from '../../utils/logger.js';
3
+ export class McpBridge {
4
+ activeServers = [];
5
+ /**
6
+ * Sanitizes names into valid OpenAI function tool names:
7
+ * 1-64 characters matching ^[a-zA-Z0-9_-]+$
8
+ */
9
+ static sanitizeToolName(name) {
10
+ const sanitized = name.replace(/[^a-zA-Z0-9_-]/g, '_');
11
+ return sanitized.substring(0, 64);
12
+ }
13
+ /**
14
+ * Connects to a resolved MCP server, lists its tools, and registers them in Musonda's ToolRegistry.
15
+ * If the server fails to connect or list tools, logs warning and skips it without failing other components.
16
+ */
17
+ async registerServer(server, registry) {
18
+ logger.info(`[MCP Bridge] Connecting to server "${server.name}" (plugin: "${server.pluginName}", type: "${server.config.type}")...`);
19
+ let client;
20
+ if (server.config.type === 'stdio') {
21
+ client = new McpStdioClient(server);
22
+ }
23
+ else {
24
+ client = new McpHttpClient(server);
25
+ }
26
+ try {
27
+ await client.connect();
28
+ }
29
+ catch (err) {
30
+ logger.warn(`[MCP Bridge] Failed to connect to server "${server.name}" in plugin "${server.pluginName}": ${err.message}. Skipping server.`);
31
+ return false;
32
+ }
33
+ let mcpTools = [];
34
+ try {
35
+ mcpTools = await client.listTools();
36
+ }
37
+ catch (err) {
38
+ logger.warn(`[MCP Bridge] Failed to list tools from server "${server.name}": ${err.message}. Skipping server.`);
39
+ await client.close();
40
+ return false;
41
+ }
42
+ const registeredTools = [];
43
+ for (const tool of mcpTools) {
44
+ const bridgeToolName = McpBridge.sanitizeToolName(`mcp_${server.pluginName}_${server.name}_${tool.name}`);
45
+ // Normalize parameters schema
46
+ const paramsSchema = {
47
+ type: 'object',
48
+ properties: (tool.inputSchema && tool.inputSchema.properties) || {},
49
+ required: (tool.inputSchema && tool.inputSchema.required) || [],
50
+ };
51
+ const toolDef = {
52
+ name: bridgeToolName,
53
+ description: `[MCP Plugin: ${server.pluginName} / Server: ${server.name}] ${tool.description || tool.name}`,
54
+ parameters: paramsSchema,
55
+ execute: async (args) => {
56
+ logger.tool(bridgeToolName, JSON.stringify(args).substring(0, 100));
57
+ const result = await client.callTool(tool.name, args);
58
+ if (result.isError) {
59
+ return { error: result.output || 'MCP tool execution reported an error.' };
60
+ }
61
+ return result.output;
62
+ },
63
+ };
64
+ registry.register(toolDef);
65
+ registeredTools.push(toolDef);
66
+ logger.info(`[MCP Bridge] Registered bridged tool: "${bridgeToolName}"`);
67
+ }
68
+ this.activeServers.push({
69
+ server,
70
+ client,
71
+ tools: registeredTools,
72
+ });
73
+ return true;
74
+ }
75
+ getActiveServers() {
76
+ return this.activeServers;
77
+ }
78
+ /**
79
+ * Gracefully disconnects and unregisters all MCP servers and their bridged tools for a given plugin.
80
+ */
81
+ async unregisterServersForPlugin(pluginName, registry) {
82
+ const serversToClose = this.activeServers.filter((s) => s.server.pluginName === pluginName);
83
+ this.activeServers = this.activeServers.filter((s) => s.server.pluginName !== pluginName);
84
+ for (const active of serversToClose) {
85
+ if (registry) {
86
+ for (const tool of active.tools) {
87
+ registry.unregister(tool.name);
88
+ logger.info(`[MCP Bridge] Unregistered bridged tool: "${tool.name}"`);
89
+ }
90
+ }
91
+ try {
92
+ await active.client.close();
93
+ }
94
+ catch (err) {
95
+ logger.warn(`Error closing MCP server "${active.server.name}": ${err.message}`);
96
+ }
97
+ }
98
+ }
99
+ /**
100
+ * Gracefully shuts down all active MCP servers (terminates stdio subprocesses).
101
+ */
102
+ async shutdown() {
103
+ logger.info(`[MCP Bridge] Shutting down ${this.activeServers.length} active MCP server(s)...`);
104
+ for (const active of this.activeServers) {
105
+ try {
106
+ await active.client.close();
107
+ }
108
+ catch (err) {
109
+ logger.warn(`Error closing MCP server "${active.server.name}": ${err.message}`);
110
+ }
111
+ }
112
+ this.activeServers = [];
113
+ }
114
+ }
115
+ //# sourceMappingURL=mcpBridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcpBridge.js","sourceRoot":"","sources":["../../../src/plugins/mcp/mcpBridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import { ResolvedMcpServer, McpToolSchema } from './types.js';
2
+ export interface McpClientInterface {
3
+ connect(): Promise<void>;
4
+ listTools(): Promise<McpToolSchema[]>;
5
+ callTool(name: string, args: Record<string, any>): Promise<{
6
+ output: string;
7
+ isError?: boolean;
8
+ }>;
9
+ close(): Promise<void>;
10
+ }
11
+ export declare class McpStdioClient implements McpClientInterface {
12
+ private server;
13
+ private child;
14
+ private pendingRequests;
15
+ private nextRequestId;
16
+ private isConnected;
17
+ constructor(server: ResolvedMcpServer);
18
+ connect(): Promise<void>;
19
+ private handleMessage;
20
+ sendRequest(method: string, params?: any, timeoutMs?: number): Promise<any>;
21
+ sendNotification(method: string, params?: any): void;
22
+ listTools(): Promise<McpToolSchema[]>;
23
+ callTool(name: string, args: Record<string, any>): Promise<{
24
+ output: string;
25
+ isError?: boolean;
26
+ }>;
27
+ close(): Promise<void>;
28
+ }
29
+ export declare class McpHttpClient implements McpClientInterface {
30
+ private server;
31
+ private url;
32
+ private headers;
33
+ private nextRequestId;
34
+ constructor(server: ResolvedMcpServer);
35
+ connect(): Promise<void>;
36
+ private sendRequest;
37
+ listTools(): Promise<McpToolSchema[]>;
38
+ callTool(name: string, args: Record<string, any>): Promise<{
39
+ output: string;
40
+ isError?: boolean;
41
+ }>;
42
+ close(): Promise<void>;
43
+ }