mup-mcp-server 0.1.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/README.md ADDED
@@ -0,0 +1,63 @@
1
+ # mup-mcp-server
2
+
3
+ MCP server that turns HTML [MUP](https://github.com/Ricky610329/mup) panels into interactive tools for LLMs — render UI, call functions, and pipe data between panels.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install -g mup-mcp-server
9
+ ```
10
+
11
+ Or use directly:
12
+
13
+ ```bash
14
+ npx mup-mcp-server --mups-dir ./my-mups
15
+ ```
16
+
17
+ ## Usage with Claude Code
18
+
19
+ ```bash
20
+ claude mcp add --transport stdio --scope user mup -- npx mup-mcp-server --mups-dir /path/to/mups
21
+ ```
22
+
23
+ ## Usage with Claude Desktop
24
+
25
+ Add to `claude_desktop_config.json`:
26
+
27
+ ```json
28
+ {
29
+ "mcpServers": {
30
+ "mup": {
31
+ "command": "npx",
32
+ "args": ["mup-mcp-server", "--mups-dir", "/path/to/mups"]
33
+ }
34
+ }
35
+ }
36
+ ```
37
+
38
+ ## Options
39
+
40
+ ```
41
+ --mups-dir <dir> Load all .html MUP files from a directory
42
+ --port <port> UI panel port (default: 3200)
43
+ --no-open Don't auto-open the browser
44
+ ```
45
+
46
+ ## What is MUP?
47
+
48
+ A **MUP** is an interactive UI component that lives inside an LLM chat. It's a single `.html` file with a manifest and callable functions — no build step, no framework.
49
+
50
+ The user operates it by clicking buttons; the LLM operates it through function calls. Both sides see each other's actions in real time.
51
+
52
+ 20+ built-in examples included in the [main repo](https://github.com/Ricky610329/mup): pixel art, chess, music toolkit, kanban, slides, and more.
53
+
54
+ ## Links
55
+
56
+ - [GitHub](https://github.com/Ricky610329/mup)
57
+ - [Spec](https://github.com/Ricky610329/mup/blob/main/spec/MUP-Spec.md)
58
+ - [Examples](https://github.com/Ricky610329/mup/tree/main/examples)
59
+ - [Demo Videos](https://github.com/Ricky610329/mup#demos)
60
+
61
+ ## License
62
+
63
+ MIT
@@ -0,0 +1,27 @@
1
+ import { EventEmitter } from "node:events";
2
+ import type { MupManager } from "./manager.js";
3
+ import type { FunctionResult, ServerMessage, BridgeEvents, CatalogSummary, FolderTreeNode } from "./types.js";
4
+ export type { FunctionResult };
5
+ export declare class UiBridge extends EventEmitter {
6
+ private httpServer;
7
+ private wss;
8
+ private ws;
9
+ private pendingCalls;
10
+ private callIdCounter;
11
+ private port;
12
+ private manager;
13
+ folderTree: FolderTreeNode[];
14
+ folderPath: string;
15
+ constructor(manager: MupManager, port: number);
16
+ typedOn<K extends keyof BridgeEvents>(event: K, listener: BridgeEvents[K]): this;
17
+ typedOnce<K extends keyof BridgeEvents>(event: K, listener: BridgeEvents[K]): this;
18
+ typedEmit<K extends keyof BridgeEvents>(event: K, ...args: Parameters<BridgeEvents[K]>): boolean;
19
+ start(): Promise<void>;
20
+ isConnected(): boolean;
21
+ sendRaw(msg: ServerMessage): void;
22
+ callFunction(mupId: string, functionName: string, args: Record<string, unknown>): Promise<FunctionResult>;
23
+ getPort(): number;
24
+ buildCatalogSummary(): CatalogSummary[];
25
+ private handleBrowserMessage;
26
+ private handleHttp;
27
+ }
package/dist/bridge.js ADDED
@@ -0,0 +1,211 @@
1
+ import * as http from "node:http";
2
+ import * as fs from "node:fs";
3
+ import * as path from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { WebSocketServer, WebSocket } from "ws";
6
+ import { EventEmitter } from "node:events";
7
+ import { CONFIG } from "./config.js";
8
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
9
+ // ---- Typed Event Emitter ----
10
+ export class UiBridge extends EventEmitter {
11
+ httpServer;
12
+ wss;
13
+ ws = null;
14
+ pendingCalls = new Map();
15
+ callIdCounter = 0;
16
+ port;
17
+ manager;
18
+ folderTree = [];
19
+ folderPath = "";
20
+ constructor(manager, port) {
21
+ super();
22
+ this.manager = manager;
23
+ this.port = port;
24
+ this.httpServer = http.createServer((req, res) => this.handleHttp(req, res));
25
+ this.wss = new WebSocketServer({ server: this.httpServer });
26
+ this.wss.on("connection", (ws) => {
27
+ if (this.ws && this.ws.readyState === WebSocket.OPEN) {
28
+ ws.close(4000, "Another panel is already connected");
29
+ return;
30
+ }
31
+ this.ws = ws;
32
+ console.error("[mup-mcp] Browser panel connected");
33
+ this.typedEmit("browser-connected");
34
+ ws.on("message", (data) => {
35
+ try {
36
+ const msg = JSON.parse(data.toString());
37
+ this.handleBrowserMessage(msg);
38
+ }
39
+ catch (e) {
40
+ console.error("[mup-mcp] Invalid message from browser:", e);
41
+ }
42
+ });
43
+ ws.on("close", () => {
44
+ console.error("[mup-mcp] Browser panel disconnected");
45
+ this.ws = null;
46
+ for (const [id, pending] of this.pendingCalls) {
47
+ clearTimeout(pending.timer);
48
+ pending.resolve({ content: [{ type: "text", text: "Browser disconnected" }], isError: true });
49
+ this.pendingCalls.delete(id);
50
+ }
51
+ this.typedEmit("browser-disconnected");
52
+ });
53
+ // Send catalog + folder tree on connect
54
+ this.sendRaw({ type: "mup-catalog", catalog: this.buildCatalogSummary() });
55
+ if (this.folderTree.length > 0) {
56
+ this.sendRaw({ type: "folder-tree", tree: this.folderTree, path: this.folderPath });
57
+ }
58
+ // Send already-active MUPs with saved state
59
+ for (const mup of this.manager.getAll()) {
60
+ this.sendRaw({
61
+ type: "load-mup",
62
+ mupId: mup.manifest.id,
63
+ html: mup.html,
64
+ manifest: mup.manifest,
65
+ savedState: mup.stateData,
66
+ });
67
+ }
68
+ });
69
+ }
70
+ // ---- Typed Event Helpers ----
71
+ typedOn(event, listener) {
72
+ return super.on(event, listener);
73
+ }
74
+ typedOnce(event, listener) {
75
+ return super.once(event, listener);
76
+ }
77
+ typedEmit(event, ...args) {
78
+ return super.emit(event, ...args);
79
+ }
80
+ // ---- Lifecycle ----
81
+ async start() {
82
+ return new Promise((resolve) => {
83
+ this.httpServer.listen(this.port, () => {
84
+ console.error(`[mup-mcp] UI panel: http://localhost:${this.port}`);
85
+ resolve();
86
+ });
87
+ });
88
+ }
89
+ isConnected() {
90
+ return this.ws !== null && this.ws.readyState === WebSocket.OPEN;
91
+ }
92
+ // ---- Communication ----
93
+ sendRaw(msg) {
94
+ if (this.isConnected()) {
95
+ this.ws.send(JSON.stringify(msg));
96
+ }
97
+ }
98
+ async callFunction(mupId, functionName, args) {
99
+ if (!this.isConnected()) {
100
+ return {
101
+ content: [{ type: "text", text: `MUP UI panel is not connected. Ask the user to open http://localhost:${this.port} in their browser.` }],
102
+ isError: true,
103
+ };
104
+ }
105
+ const callId = `c${++this.callIdCounter}`;
106
+ return new Promise((resolve) => {
107
+ const timer = setTimeout(() => {
108
+ this.pendingCalls.delete(callId);
109
+ this.sendRaw({ type: "error", message: `${functionName} timed out (30s) on ${mupId}` });
110
+ resolve({ content: [{ type: "text", text: "Function call timed out (30s)" }], isError: true });
111
+ }, CONFIG.functionCallTimeoutMs);
112
+ this.pendingCalls.set(callId, { resolve, timer });
113
+ this.sendRaw({ type: "call", callId, mupId, fn: functionName, args });
114
+ });
115
+ }
116
+ getPort() {
117
+ return this.port;
118
+ }
119
+ // ---- Helpers ----
120
+ buildCatalogSummary() {
121
+ return this.manager.getCatalog().map((e) => ({
122
+ id: e.manifest.id,
123
+ name: e.manifest.name,
124
+ description: e.manifest.description,
125
+ functions: e.manifest.functions.length,
126
+ active: e.active,
127
+ grid: e.manifest.grid,
128
+ multiInstance: e.manifest.multiInstance || false,
129
+ }));
130
+ }
131
+ // ---- Message Dispatch ----
132
+ handleBrowserMessage(msg) {
133
+ switch (msg.type) {
134
+ case "ready":
135
+ console.error("[mup-mcp] Browser panel ready");
136
+ break;
137
+ case "mup-loaded":
138
+ console.error(`[mup-mcp] MUP initialized: ${msg.mupId}`);
139
+ break;
140
+ case "result": {
141
+ const pending = this.pendingCalls.get(msg.callId);
142
+ if (pending) {
143
+ clearTimeout(pending.timer);
144
+ this.pendingCalls.delete(msg.callId);
145
+ pending.resolve(msg.result);
146
+ }
147
+ break;
148
+ }
149
+ case "state":
150
+ this.manager.updateState(msg.mupId, msg.summary, msg.data);
151
+ this.typedEmit("state-update", msg.mupId, msg.summary, msg.data);
152
+ break;
153
+ case "interaction":
154
+ this.manager.addEvent(msg.mupId, msg.action, msg.summary, msg.data);
155
+ this.typedEmit("interaction", msg.mupId, msg.action, msg.summary);
156
+ break;
157
+ case "activate-mup":
158
+ this.typedEmit("activate-mup", msg.mupId);
159
+ break;
160
+ case "deactivate-mup":
161
+ this.typedEmit("deactivate-mup", msg.mupId);
162
+ break;
163
+ case "register-and-activate":
164
+ this.typedEmit("register-and-activate", msg.mupId, msg.html, msg.fileName);
165
+ break;
166
+ case "new-instance":
167
+ this.typedEmit("new-instance", msg.mupId, msg.customName);
168
+ break;
169
+ case "list-workspaces":
170
+ this.typedEmit("list-workspaces");
171
+ break;
172
+ case "save-workspace":
173
+ this.typedEmit("save-workspace", msg.name, msg.description);
174
+ break;
175
+ case "load-workspace":
176
+ this.typedEmit("load-workspace", msg.name);
177
+ break;
178
+ case "delete-workspace":
179
+ this.typedEmit("delete-workspace", msg.name, msg.isCurrent);
180
+ break;
181
+ case "save-grid-layout":
182
+ this.typedEmit("save-grid-layout", msg.layout);
183
+ break;
184
+ case "rename-mup":
185
+ this.typedEmit("rename-mup", msg.mupId, msg.customName);
186
+ break;
187
+ }
188
+ }
189
+ // ---- HTTP ----
190
+ handleHttp(req, res) {
191
+ if (req.url === "/" || req.url === "/index.html") {
192
+ const uiPath = path.join(__dirname, "..", "ui", "index.html");
193
+ try {
194
+ let content = fs.readFileSync(uiPath, "utf-8");
195
+ content = content.replace(/__WS_PORT__/g, String(this.port));
196
+ res.writeHead(200, { "Content-Type": "text/html; charset=utf-8", "Cache-Control": "no-cache" });
197
+ res.end(content);
198
+ }
199
+ catch (err) {
200
+ console.error("[mup-mcp] UI file not found:", uiPath, err);
201
+ res.writeHead(500);
202
+ res.end("UI file not found. Check installation.");
203
+ }
204
+ }
205
+ else {
206
+ res.writeHead(404);
207
+ res.end("Not found");
208
+ }
209
+ }
210
+ }
211
+ //# sourceMappingURL=bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge.js","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ export declare const CONFIG: {
2
+ /** Default HTTP/WebSocket port */
3
+ readonly defaultPort: 3200;
4
+ /** Number of ports to scan when default is taken */
5
+ readonly portScanRange: 20;
6
+ /** Auto-save debounce interval (ms) */
7
+ readonly autoSaveDebounceMs: 2000;
8
+ /** Periodic auto-save interval (ms) */
9
+ readonly autoSaveIntervalMs: 30000;
10
+ /** Max time to wait for a function call response (ms) */
11
+ readonly functionCallTimeoutMs: 30000;
12
+ /** Max length of a tool response text before truncation */
13
+ readonly maxResponseLength: 2000;
14
+ /** Delay before auto-opening browser (ms) */
15
+ readonly browserOpenDelayMs: 3000;
16
+ /** Wait for MUP initialization before first call (ms) */
17
+ readonly mupInitWaitMs: 500;
18
+ /** Max pending interaction events per MUP */
19
+ readonly maxPendingEvents: 50;
20
+ /** Max call history entries per MUP */
21
+ readonly maxCallHistory: 30;
22
+ /** Number of recent history entries shown in detail */
23
+ readonly recentHistoryCount: 5;
24
+ /** Max result string length stored in call history */
25
+ readonly maxHistoryResultLength: 200;
26
+ };
package/dist/config.js ADDED
@@ -0,0 +1,28 @@
1
+ // ---- Centralized Configuration ----
2
+ export const CONFIG = {
3
+ /** Default HTTP/WebSocket port */
4
+ defaultPort: 3200,
5
+ /** Number of ports to scan when default is taken */
6
+ portScanRange: 20,
7
+ /** Auto-save debounce interval (ms) */
8
+ autoSaveDebounceMs: 2000,
9
+ /** Periodic auto-save interval (ms) */
10
+ autoSaveIntervalMs: 30_000,
11
+ /** Max time to wait for a function call response (ms) */
12
+ functionCallTimeoutMs: 30_000,
13
+ /** Max length of a tool response text before truncation */
14
+ maxResponseLength: 2000,
15
+ /** Delay before auto-opening browser (ms) */
16
+ browserOpenDelayMs: 3000,
17
+ /** Wait for MUP initialization before first call (ms) */
18
+ mupInitWaitMs: 500,
19
+ /** Max pending interaction events per MUP */
20
+ maxPendingEvents: 50,
21
+ /** Max call history entries per MUP */
22
+ maxCallHistory: 30,
23
+ /** Number of recent history entries shown in detail */
24
+ recentHistoryCount: 5,
25
+ /** Max result string length stored in call history */
26
+ maxHistoryResultLength: 200,
27
+ };
28
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,kCAAkC;IAClC,WAAW,EAAE,IAAI;IACjB,oDAAoD;IACpD,aAAa,EAAE,EAAE;IACjB,uCAAuC;IACvC,kBAAkB,EAAE,IAAI;IACxB,uCAAuC;IACvC,kBAAkB,EAAE,MAAM;IAC1B,yDAAyD;IACzD,qBAAqB,EAAE,MAAM;IAC7B,2DAA2D;IAC3D,iBAAiB,EAAE,IAAI;IACvB,6CAA6C;IAC7C,kBAAkB,EAAE,IAAI;IACxB,yDAAyD;IACzD,aAAa,EAAE,GAAG;IAClB,6CAA6C;IAC7C,gBAAgB,EAAE,EAAE;IACpB,uCAAuC;IACvC,cAAc,EAAE,EAAE;IAClB,uDAAuD;IACvD,kBAAkB,EAAE,CAAC;IACrB,sDAAsD;IACtD,sBAAsB,EAAE,GAAG;CACnB,CAAC"}
@@ -0,0 +1,83 @@
1
+ import type { MupManager } from "./manager.js";
2
+ import type { WorkspaceManager } from "./workspace.js";
3
+ import type { UiBridge } from "./bridge.js";
4
+ import type { PipelineManager } from "./pipeline.js";
5
+ import type { SendLoadMupFn } from "./types.js";
6
+ export declare const text: (t: string) => {
7
+ type: "text";
8
+ text: string;
9
+ };
10
+ export declare function buildMupDetail(manifest: {
11
+ name: string;
12
+ id: string;
13
+ description: string;
14
+ functions: Array<{
15
+ name: string;
16
+ description: string;
17
+ inputSchema: Record<string, unknown>;
18
+ }>;
19
+ }): string;
20
+ export declare function buildToolDescription(manager: MupManager, port: number): string;
21
+ export declare function handleWorkspaces(ws: WorkspaceManager): {
22
+ content: {
23
+ type: "text";
24
+ text: string;
25
+ }[];
26
+ };
27
+ export declare function handleSave(ws: WorkspaceManager, manager: MupManager, args: Record<string, unknown>): {
28
+ content: {
29
+ type: "text";
30
+ text: string;
31
+ }[];
32
+ isError: boolean;
33
+ } | {
34
+ content: {
35
+ type: "text";
36
+ text: string;
37
+ }[];
38
+ isError?: undefined;
39
+ };
40
+ export declare function handleLoad(ws: WorkspaceManager, manager: MupManager, bridge: UiBridge, sendLoadMup: SendLoadMupFn, args: Record<string, unknown>): {
41
+ content: {
42
+ type: "text";
43
+ text: string;
44
+ }[];
45
+ isError: boolean;
46
+ } | {
47
+ content: {
48
+ type: "text";
49
+ text: string;
50
+ }[];
51
+ isError?: undefined;
52
+ };
53
+ export declare function handleList(manager: MupManager): {
54
+ content: {
55
+ type: "text";
56
+ text: string;
57
+ }[];
58
+ };
59
+ export declare function handleCheckInteractions(manager: MupManager, args: Record<string, unknown>): {
60
+ content: {
61
+ type: "text";
62
+ text: string;
63
+ }[];
64
+ };
65
+ export declare function handleHistory(ws: WorkspaceManager, manager: MupManager, args: Record<string, unknown>): {
66
+ content: {
67
+ type: "text";
68
+ text: string;
69
+ }[];
70
+ };
71
+ export declare function handlePipe(pipeline: PipelineManager, args: Record<string, unknown>): {
72
+ content: {
73
+ type: "text";
74
+ text: string;
75
+ }[];
76
+ isError: boolean;
77
+ } | {
78
+ content: {
79
+ type: "text";
80
+ text: string;
81
+ }[];
82
+ isError?: undefined;
83
+ };
@@ -0,0 +1,178 @@
1
+ import { CONFIG } from "./config.js";
2
+ // ---- Helpers ----
3
+ export const text = (t) => ({ type: "text", text: t });
4
+ export function buildMupDetail(manifest) {
5
+ const lines = [`${manifest.name} (${manifest.id}): ${manifest.description}`];
6
+ for (const fn of manifest.functions) {
7
+ const props = (fn.inputSchema.properties || {});
8
+ const required = (fn.inputSchema.required || []);
9
+ const params = Object.entries(props).map(([k, v]) => `${k}${required.includes(k) ? "" : "?"}: ${v.type || "any"}`);
10
+ lines.push(` - ${fn.name}(${params.join(", ")}) — ${fn.description}`);
11
+ }
12
+ return lines.join("\n");
13
+ }
14
+ export function buildToolDescription(manager, port) {
15
+ const catalog = manager.getCatalog();
16
+ const active = catalog.filter((e) => e.active);
17
+ const inactive = catalog.filter((e) => !e.active);
18
+ const lines = [
19
+ `MUP — Interactive UI panels in browser at http://localhost:${port}. Auto-activated on first use.`,
20
+ ``, `Call: { "mupId": "...", "functionName": "...", "functionArgs": { ... } }`,
21
+ `Actions: checkInteractions, save, load, workspaces, list, history, pipe`,
22
+ ];
23
+ if (active.length > 0) {
24
+ lines.push(``, `Active MUPs:`);
25
+ for (const e of active)
26
+ lines.push(` ${e.manifest.id} — ${e.manifest.name}. Functions: ${e.manifest.functions.map((f) => f.name).join(", ")}`);
27
+ }
28
+ if (inactive.length > 0) {
29
+ lines.push(``, `Available: ${inactive.map((e) => e.manifest.id).join(", ")}`);
30
+ }
31
+ return lines.join("\n");
32
+ }
33
+ // ---- Action Handlers ----
34
+ export function handleWorkspaces(ws) {
35
+ const workspaces = ws.list();
36
+ if (workspaces.length === 0)
37
+ return { content: [text('No saved workspaces. Use { "action": "save", "name": "..." } to save.')] };
38
+ const lines = workspaces.map((w) => {
39
+ const time = new Date(w.savedAt).toLocaleString();
40
+ const desc = w.description ? ` — ${w.description}` : "";
41
+ return `- ${w.displayName}${desc} (saved ${time}, MUPs: ${w.activeMups.join(", ")})`;
42
+ });
43
+ return { content: [text("Saved workspaces:\n" + lines.join("\n"))] };
44
+ }
45
+ export function handleSave(ws, manager, args) {
46
+ const name = args.name;
47
+ if (!name)
48
+ return { content: [text('Provide "name" for the workspace.')], isError: true };
49
+ const desc = args.description;
50
+ ws.save(name, desc);
51
+ const active = manager.getAll().map((m) => ws.customNames[m.manifest.id] || m.manifest.name);
52
+ return { content: [text(`Workspace "${name}" saved.${desc ? ` Description: ${desc}` : ""}\nActive MUPs: ${active.join(", ") || "none"}.`)] };
53
+ }
54
+ export function handleLoad(ws, manager, bridge, sendLoadMup, args) {
55
+ const name = args.name;
56
+ if (!name)
57
+ return { content: [text('Provide "name" of the workspace to load.')], isError: true };
58
+ if (!ws.load(name))
59
+ return { content: [text(`Workspace "${name}" not found.`)], isError: true };
60
+ const restored = ws.restore(bridge, sendLoadMup, name);
61
+ const desc = ws.description ? `\nDescription: ${ws.description}` : "";
62
+ return { content: [text(`Workspace "${name}" loaded.${desc}\nActive MUPs: ${restored.join(", ") || "none"}.`)] };
63
+ }
64
+ export function handleList(manager) {
65
+ const sections = manager.getCatalog().map((e) => `${e.active ? "[ACTIVE]" : "[available]"} ${buildMupDetail(e.manifest)}`);
66
+ return { content: [text(sections.join("\n\n"))] };
67
+ }
68
+ export function handleCheckInteractions(manager, args) {
69
+ const since = typeof args.since === "number" ? args.since : undefined;
70
+ const events = manager.drainEvents(since);
71
+ const states = manager.getAll().filter((m) => m.stateSummary).map((m) => `[${m.manifest.name}] ${m.stateSummary}`);
72
+ const parts = [];
73
+ if (events.length > 0) {
74
+ const groups = new Map();
75
+ for (const e of events) {
76
+ const key = `${e.mupName}|${e.action}`;
77
+ const g = groups.get(key);
78
+ if (g) {
79
+ g.count++;
80
+ g.lastSummary = e.summary;
81
+ }
82
+ else
83
+ groups.set(key, { mupName: e.mupName, action: e.action, count: 1, lastSummary: e.summary });
84
+ }
85
+ const lines = Array.from(groups.values()).map((g) => g.count === 1 ? ` [${g.mupName}] ${g.action}: ${g.lastSummary}` : ` [${g.mupName}] ${g.action} (${g.count}x, latest: ${g.lastSummary})`);
86
+ parts.push("User interactions:\n" + lines.join("\n"));
87
+ }
88
+ if (states.length > 0)
89
+ parts.push("Current states:\n" + states.map((s) => ` ${s}`).join("\n"));
90
+ return { content: [text(parts.length > 0 ? parts.join("\n\n") : "No interactions or state changes.")] };
91
+ }
92
+ export function handleHistory(ws, manager, args) {
93
+ const mupId = args.mupId;
94
+ function formatHistory(history, limit) {
95
+ const lines = [];
96
+ if (history.length > limit) {
97
+ const older = history.slice(0, -limit);
98
+ const fnCounts = new Map();
99
+ for (const h of older)
100
+ fnCounts.set(h.functionName, (fnCounts.get(h.functionName) || 0) + 1);
101
+ lines.push(` ... ${older.length} earlier calls: ${Array.from(fnCounts.entries()).map(([fn, c]) => `${fn}(${c}x)`).join(", ")}`);
102
+ }
103
+ for (const h of history.slice(-limit)) {
104
+ const time = new Date(h.timestamp).toLocaleTimeString();
105
+ const argStr = JSON.stringify(h.args);
106
+ lines.push(` [${time}] ${h.functionName}(${argStr.length > 80 ? argStr.slice(0, 80) + "..." : argStr}) → ${h.result}`);
107
+ }
108
+ return lines;
109
+ }
110
+ if (!mupId) {
111
+ const parts = [];
112
+ for (const mup of manager.getAll()) {
113
+ const history = ws.callHistory[mup.manifest.id];
114
+ if (history && history.length > 0) {
115
+ parts.push(`## ${mup.manifest.name} (${mup.manifest.id})`);
116
+ if (mup.stateSummary)
117
+ parts.push(`State: ${mup.stateSummary}`);
118
+ parts.push(`${history.length} calls:`, ...formatHistory(history, CONFIG.recentHistoryCount));
119
+ }
120
+ }
121
+ return { content: [text(parts.length > 0 ? parts.join("\n") : "No call history yet.")] };
122
+ }
123
+ const history = ws.callHistory[mupId];
124
+ const mup = manager.get(mupId);
125
+ const parts = [];
126
+ if (mup?.stateSummary)
127
+ parts.push(`State: ${mup.stateSummary}`);
128
+ if (!history || history.length === 0)
129
+ parts.push("No call history for this MUP.");
130
+ else {
131
+ parts.push(`${history.length} calls:`, ...formatHistory(history, CONFIG.recentHistoryCount));
132
+ }
133
+ return { content: [text(parts.join("\n"))] };
134
+ }
135
+ // ---- Pipe Handlers ----
136
+ export function handlePipe(pipeline, args) {
137
+ const sub = args.subAction;
138
+ if (sub === "create") {
139
+ if (!args.sourceMupId || !args.targetMupId || !args.targetFunction || !args.transform) {
140
+ return { content: [text('Pipe create requires: sourceMupId, targetMupId, targetFunction, transform.')], isError: true };
141
+ }
142
+ const result = pipeline.addPipe({
143
+ sourceMupId: args.sourceMupId,
144
+ sourceFunction: args.sourceFunction,
145
+ targetMupId: args.targetMupId,
146
+ targetFunction: args.targetFunction,
147
+ transform: args.transform,
148
+ debounceMs: args.debounceMs,
149
+ });
150
+ if ("error" in result)
151
+ return { content: [text(result.error)], isError: true };
152
+ return { content: [text(`Pipe created: ${result.id} (${args.sourceMupId} → ${args.targetMupId}.${args.targetFunction})`)] };
153
+ }
154
+ if (sub === "list") {
155
+ const pipes = pipeline.listPipes();
156
+ if (pipes.length === 0)
157
+ return { content: [text("No pipes defined.")] };
158
+ const lines = pipes.map(p => `${p.id}: ${p.sourceMupId}${p.sourceFunction ? `.${p.sourceFunction}` : ""} → ${p.targetMupId}.${p.targetFunction} [${p.enabled ? "active" : "disabled"}] (${p.debounceMs}ms)`);
159
+ return { content: [text(lines.join("\n"))] };
160
+ }
161
+ if (sub === "delete") {
162
+ if (!args.pipeId)
163
+ return { content: [text('Provide "pipeId".')], isError: true };
164
+ return { content: [text(pipeline.removePipe(args.pipeId) ? `Deleted ${args.pipeId}` : `Pipe not found: ${args.pipeId}`)] };
165
+ }
166
+ if (sub === "enable") {
167
+ if (!args.pipeId)
168
+ return { content: [text('Provide "pipeId".')], isError: true };
169
+ return { content: [text(pipeline.enablePipe(args.pipeId) ? `Enabled ${args.pipeId}` : `Pipe not found: ${args.pipeId}`)] };
170
+ }
171
+ if (sub === "disable") {
172
+ if (!args.pipeId)
173
+ return { content: [text('Provide "pipeId".')], isError: true };
174
+ return { content: [text(pipeline.disablePipe(args.pipeId) ? `Disabled ${args.pipeId}` : `Pipe not found: ${args.pipeId}`)] };
175
+ }
176
+ return { content: [text('Pipe subAction must be: create, list, delete, enable, disable.')], isError: true };
177
+ }
178
+ //# sourceMappingURL=handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlers.js","sourceRoot":"","sources":["../src/handlers.ts"],"names":[],"mappings":"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"}