@particle-academy/agent-integrations 0.23.0 → 0.25.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.
@@ -1,10 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var fancySlides = require('@particle-academy/fancy-slides');
4
3
  var fancyAutoCommon = require('@particle-academy/fancy-auto-common');
5
4
 
6
- // src/bridges/slides.ts
7
-
8
5
  // src/mcp/server.ts
9
6
  function textResult(text, structured) {
10
7
  return {
@@ -176,7 +173,7 @@ function registerSlidesBridge(host, options) {
176
173
  ["title"],
177
174
  (args) => {
178
175
  const title = str(args.title);
179
- adapter.apply({ kind: "deck_set_title", title });
176
+ adapter.apply({ op: "deck.setTitle", title });
180
177
  return textResult(`Title set to "${title}"`, { title });
181
178
  },
182
179
  true,
@@ -197,7 +194,7 @@ function registerSlidesBridge(host, options) {
197
194
  } else {
198
195
  return errorResult("theme must be a string name or an object with a `name` field.");
199
196
  }
200
- adapter.apply({ kind: "deck_apply_theme", theme });
197
+ adapter.apply({ op: "deck.setTheme", theme });
201
198
  return textResult(`Applied theme: ${theme.name}`, { theme });
202
199
  },
203
200
  true,
@@ -208,18 +205,19 @@ function registerSlidesBridge(host, options) {
208
205
  "Replace the entire deck atomically \u2014 stream a full presentation in. Pass a complete Deck object ({ id, title, theme, slides }). Validated + migrated before it lands; the prior deck is the undo snapshot.",
209
206
  { deck: { description: "A complete Deck object." } },
210
207
  ["deck"],
211
- (args) => {
208
+ async (args) => {
212
209
  const incoming = args.deck;
213
210
  if (!incoming || typeof incoming !== "object") {
214
211
  return errorResult("deck must be a complete Deck object ({ id, title, theme, slides }).");
215
212
  }
213
+ const { parseDeck } = await import('@particle-academy/fancy-slides');
216
214
  let deck;
217
215
  try {
218
- deck = fancySlides.parseDeck(incoming);
216
+ deck = parseDeck(incoming);
219
217
  } catch (e) {
220
218
  return errorResult(e instanceof Error ? e.message : String(e));
221
219
  }
222
- adapter.apply({ kind: "deck_set", deck });
220
+ adapter.apply({ op: "deck.replace", deck });
223
221
  return textResult(`Loaded deck "${deck.title}" (${deck.slides.length} slides)`, { id: deck.id, slides: deck.slides.length });
224
222
  },
225
223
  true,
@@ -233,11 +231,12 @@ function registerSlidesBridge(host, options) {
233
231
  slide: { description: "Partial slide payload \u2014 id is auto-generated when absent." }
234
232
  },
235
233
  [],
236
- (args) => {
234
+ async (args) => {
237
235
  const deck = adapter.getDeck();
238
236
  const incoming = args.slide && typeof args.slide === "object" ? args.slide : {};
237
+ const { slideId: newSlideId } = await import('@particle-academy/fancy-slides');
239
238
  const slide = {
240
- id: incoming.id ?? fancySlides.slideId(),
239
+ id: incoming.id ?? newSlideId(),
241
240
  layout: incoming.layout ?? "blank",
242
241
  elements: incoming.elements ?? [],
243
242
  background: incoming.background,
@@ -246,7 +245,7 @@ function registerSlidesBridge(host, options) {
246
245
  metadata: incoming.metadata
247
246
  };
248
247
  const index = clamp(num(args.index, deck.slides.length), 0, deck.slides.length);
249
- adapter.apply({ kind: "slide_add", index, slide });
248
+ adapter.apply({ op: "slide.add", index, slide });
250
249
  return textResult(`Added slide ${slide.id} at index ${index}`, { id: slide.id, index });
251
250
  },
252
251
  true,
@@ -259,7 +258,7 @@ function registerSlidesBridge(host, options) {
259
258
  ["id"],
260
259
  (args) => {
261
260
  const id = str(args.id);
262
- adapter.apply({ kind: "slide_remove", id });
261
+ adapter.apply({ op: "slide.remove", slideId: id });
263
262
  return textResult(`Removed slide ${id}`, { id });
264
263
  },
265
264
  true,
@@ -273,7 +272,7 @@ function registerSlidesBridge(host, options) {
273
272
  (args) => {
274
273
  const id = str(args.id);
275
274
  const toIndex = num(args.toIndex, 0);
276
- adapter.apply({ kind: "slide_reorder", id, toIndex });
275
+ adapter.apply({ op: "slide.reorder", slideId: id, toIndex });
277
276
  return textResult(`Moved slide ${id} \u2192 ${toIndex}`, { id, toIndex });
278
277
  },
279
278
  true,
@@ -287,7 +286,7 @@ function registerSlidesBridge(host, options) {
287
286
  (args) => {
288
287
  const id = str(args.id);
289
288
  const layout = str(args.layout);
290
- adapter.apply({ kind: "slide_set_layout", id, layout: layout ?? "blank" });
289
+ adapter.apply({ op: "slide.setLayout", slideId: id, layout: layout ?? "blank" });
291
290
  return textResult(`Slide ${id} layout \u2192 ${layout}`, { id, layout });
292
291
  },
293
292
  true,
@@ -301,7 +300,7 @@ function registerSlidesBridge(host, options) {
301
300
  (args) => {
302
301
  const id = str(args.id);
303
302
  const notes = str(args.notes);
304
- adapter.apply({ kind: "slide_set_notes", id, notes });
303
+ adapter.apply({ op: "slide.setNotes", slideId: id, notes });
305
304
  return textResult(`Notes updated on slide ${id}`, { id });
306
305
  },
307
306
  true,
@@ -318,7 +317,7 @@ function registerSlidesBridge(host, options) {
318
317
  (args) => {
319
318
  const id = str(args.id);
320
319
  const bg = args.background && typeof args.background === "object" ? args.background : void 0;
321
- adapter.apply({ kind: "slide_set_background", id, background: bg });
320
+ adapter.apply({ op: "slide.setBackground", slideId: id, background: bg });
322
321
  return textResult(`Background set on slide ${id}`, { id });
323
322
  },
324
323
  true,
@@ -337,7 +336,7 @@ function registerSlidesBridge(host, options) {
337
336
  (args) => {
338
337
  const id = str(args.id);
339
338
  const transition = args.transition && typeof args.transition === "object" ? args.transition : void 0;
340
- adapter.apply({ kind: "slide_set_transition", id, transition });
339
+ adapter.apply({ op: "slide.setTransition", slideId: id, transition });
341
340
  return textResult(`Transition set on slide ${id}`, { id });
342
341
  },
343
342
  true,
@@ -351,15 +350,16 @@ function registerSlidesBridge(host, options) {
351
350
  element: { description: "Partial element \u2014 type/x/y/w/h required, id auto-generated when absent." }
352
351
  },
353
352
  ["slideId", "element"],
354
- (args) => {
353
+ async (args) => {
355
354
  const slideId = str(args.slideId);
356
355
  const incoming = args.element && typeof args.element === "object" ? args.element : {};
357
356
  if (!incoming.type) return errorResult("element.type is required.");
357
+ const { elementId: newElementId } = await import('@particle-academy/fancy-slides');
358
358
  const element = {
359
- id: incoming.id ?? fancySlides.elementId(),
359
+ id: incoming.id ?? newElementId(),
360
360
  ...incoming
361
361
  };
362
- adapter.apply({ kind: "element_add", slideId, element });
362
+ adapter.apply({ op: "element.add", slideId, element });
363
363
  return textResult(`Added ${element.type} element ${element.id} on ${slideId}`, { id: element.id, slideId });
364
364
  },
365
365
  true,
@@ -373,7 +373,7 @@ function registerSlidesBridge(host, options) {
373
373
  (args) => {
374
374
  const slideId = str(args.slideId);
375
375
  const elementId = str(args.elementId);
376
- adapter.apply({ kind: "element_remove", slideId, elementId });
376
+ adapter.apply({ op: "element.remove", slideId, elementId });
377
377
  return textResult(`Removed element ${elementId} from ${slideId}`, { slideId, elementId });
378
378
  },
379
379
  true,
@@ -392,7 +392,7 @@ function registerSlidesBridge(host, options) {
392
392
  const slideId = str(args.slideId);
393
393
  const elementId = str(args.elementId);
394
394
  const patch = args.patch && typeof args.patch === "object" ? args.patch : {};
395
- adapter.apply({ kind: "element_update", slideId, elementId, patch });
395
+ adapter.apply({ op: "element.update", slideId, elementId, patch });
396
396
  return textResult(`Patched element ${elementId}`, { keys: Object.keys(patch) });
397
397
  },
398
398
  true,
@@ -413,7 +413,7 @@ function registerSlidesBridge(host, options) {
413
413
  const elementId = str(args.elementId);
414
414
  const x = clamp(num(args.x, 0), 0, 1);
415
415
  const y = clamp(num(args.y, 0), 0, 1);
416
- adapter.apply({ kind: "element_move", slideId, elementId, x, y });
416
+ adapter.apply({ op: "element.move", slideId, elementId, x, y });
417
417
  return textResult(`Moved element ${elementId} \u2192 (${x}, ${y})`, { x, y });
418
418
  },
419
419
  true,
@@ -434,7 +434,7 @@ function registerSlidesBridge(host, options) {
434
434
  const elementId = str(args.elementId);
435
435
  const w = clamp(num(args.w, 0), 0, 1);
436
436
  const h = clamp(num(args.h, 0), 0, 1);
437
- adapter.apply({ kind: "element_resize", slideId, elementId, w, h });
437
+ adapter.apply({ op: "element.resize", slideId, elementId, w, h });
438
438
  return textResult(`Resized element ${elementId} \u2192 (${w}, ${h})`, { w, h });
439
439
  },
440
440
  true,
@@ -455,7 +455,7 @@ function registerSlidesBridge(host, options) {
455
455
  const slideId = str(args.slideId);
456
456
  const elementId = str(args.elementId);
457
457
  const animation = args.animation && typeof args.animation === "object" ? args.animation : void 0;
458
- adapter.apply({ kind: "element_set_animation", slideId, elementId, animation });
458
+ adapter.apply({ op: "element.setAnimation", slideId, elementId, animation });
459
459
  return textResult(`Animation ${animation ? "set on" : "cleared from"} element ${elementId}`, { elementId });
460
460
  },
461
461
  true,
@@ -488,10 +488,6 @@ function firstTextContent(slide) {
488
488
  return void 0;
489
489
  }
490
490
 
491
- Object.defineProperty(exports, "reduceDeck", {
492
- enumerable: true,
493
- get: function () { return fancySlides.reduceDeck; }
494
- });
495
491
  exports.registerSlidesBridge = registerSlidesBridge;
496
492
  //# sourceMappingURL=bridges-slides.cjs.map
497
493
  //# sourceMappingURL=bridges-slides.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/mcp/server.ts","../src/presence/wrap-tool-with-activity.ts","../src/bridges/slides.ts"],"names":["emitActivity","parseDeck","newSlideId","newElementId"],"mappings":"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","file":"bridges-slides.cjs","sourcesContent":["import {\n type CallToolResult,\n type JsonObject,\n type JsonRpcMessage,\n type JsonRpcRequest,\n type JsonRpcId,\n type RegisteredTool,\n type ServerCapabilities,\n type ServerInfo,\n type ToolDefinition,\n type ToolHandler,\n JSONRPC_INTERNAL_ERROR,\n JSONRPC_INVALID_PARAMS,\n JSONRPC_METHOD_NOT_FOUND,\n MCP_PROTOCOL_VERSION,\n} from \"./types\";\nimport { ToolRegistry } from \"./tool-host\";\n\nexport type McpServerOptions = {\n info: ServerInfo;\n /** Defaults to { tools: { listChanged: true } } */\n capabilities?: ServerCapabilities;\n /** Free-text instructions surfaced to clients during initialize. */\n instructions?: string;\n};\n\nexport type Transport = {\n /** Called by the server when it has a message to deliver to the client. */\n send: (message: JsonRpcMessage) => void;\n /** Called by the server when it's torn down so the transport can clean up. */\n close?: () => void;\n};\n\n/**\n * MicroMcpServer — protocol-level MCP server, transport-agnostic.\n *\n * Use it like:\n *\n * const server = new MicroMcpServer({ info: { name: \"session\", version: \"0.1\" } });\n * server.registerTool({ name: \"...\", inputSchema: { type: \"object\" } }, async (args) => ({...}));\n * const transport = new InProcessTransport();\n * server.attach(transport);\n * transport.deliver({ ... }); // client → server frames\n *\n * The same server can serve multiple transports (e.g. an in-process agent\n * AND a relayed external client) by attaching each one.\n */\nexport class MicroMcpServer extends ToolRegistry {\n private transports = new Set<Transport>();\n private notifyListChangedScheduled = false;\n\n readonly info: ServerInfo;\n readonly capabilities: ServerCapabilities;\n readonly instructions?: string;\n\n constructor(options: McpServerOptions) {\n super();\n this.info = options.info;\n this.capabilities = options.capabilities ?? { tools: { listChanged: true } };\n this.instructions = options.instructions;\n }\n\n attach(transport: Transport): () => void {\n this.transports.add(transport);\n return () => this.detach(transport);\n }\n\n detach(transport: Transport): void {\n if (this.transports.delete(transport)) {\n transport.close?.();\n }\n }\n\n unregisterTool(name: string): void {\n if (this.tools.delete(name)) {\n this.scheduleListChangedNotification();\n }\n }\n\n protected onToolsChanged(): void {\n this.scheduleListChangedNotification();\n }\n\n /**\n * Receive a JSON-RPC frame from a client (called by the transport).\n * The transport is responsible for sending the response back.\n */\n async receive(transport: Transport, message: JsonRpcMessage): Promise<void> {\n if (!(\"method\" in message)) return; // It's a response, not a request — ignore.\n\n const isNotification = !(\"id\" in message);\n if (isNotification) {\n // Notifications are fire-and-forget. We ignore unknown methods.\n return;\n }\n\n const request = message as JsonRpcRequest;\n try {\n const result = await this.handle(request);\n transport.send({ jsonrpc: \"2.0\", id: request.id, result });\n } catch (err) {\n transport.send({\n jsonrpc: \"2.0\",\n id: request.id,\n error: this.toRpcError(err),\n });\n }\n }\n\n private async handle(request: JsonRpcRequest): Promise<any> {\n const { method, params } = request;\n switch (method) {\n case \"initialize\":\n return {\n protocolVersion: MCP_PROTOCOL_VERSION,\n capabilities: this.capabilities,\n serverInfo: this.info,\n ...(this.instructions ? { instructions: this.instructions } : {}),\n };\n\n case \"tools/list\":\n return { tools: this.listTools() };\n\n case \"tools/call\": {\n const name = params?.name;\n const args = (params?.arguments ?? {}) as JsonObject;\n if (typeof name !== \"string\") {\n throw rpcError(JSONRPC_INVALID_PARAMS, \"tools/call requires `name`\");\n }\n const tool = this.tools.get(name);\n if (!tool) {\n throw rpcError(JSONRPC_METHOD_NOT_FOUND, `Unknown tool: ${name}`);\n }\n const result = await tool.handler(args);\n return result satisfies CallToolResult;\n }\n\n case \"ping\":\n return {};\n\n default:\n throw rpcError(JSONRPC_METHOD_NOT_FOUND, `Unsupported method: ${method}`);\n }\n }\n\n private scheduleListChangedNotification(): void {\n if (this.notifyListChangedScheduled) return;\n this.notifyListChangedScheduled = true;\n queueMicrotask(() => {\n this.notifyListChangedScheduled = false;\n this.broadcast({ jsonrpc: \"2.0\", method: \"notifications/tools/list_changed\" });\n });\n }\n\n private broadcast(message: JsonRpcMessage): void {\n for (const t of this.transports) t.send(message);\n }\n\n private toRpcError(err: unknown): { code: number; message: string; data?: any } {\n if (err && typeof err === \"object\" && \"code\" in err && \"message\" in err) {\n return err as any;\n }\n return {\n code: JSONRPC_INTERNAL_ERROR,\n message: err instanceof Error ? err.message : String(err),\n };\n }\n}\n\nexport function rpcError(code: number, message: string, data?: any) {\n return { code, message, ...(data !== undefined ? { data } : {}) };\n}\n\n/**\n * Helper to build a CallToolResult from a string or structured value.\n */\nexport function textResult(text: string, structured?: any): CallToolResult {\n return {\n content: [{ type: \"text\", text }],\n ...(structured !== undefined ? { structuredContent: structured } : {}),\n };\n}\n\nexport function errorResult(text: string): CallToolResult {\n return { content: [{ type: \"text\", text }], isError: true };\n}\n\n// Internal helper so the JsonRpcId import isn't dropped by tsup\ntype _KeepIdImport = JsonRpcId;\n","import type { CallToolResult } from \"../mcp/types\";\nimport { emitActivity } from \"./registry\";\nimport type { AgentTarget } from \"./types\";\n\nexport type ActivityAgent = { id: string; name?: string; color?: string };\n\nexport type ActivityResolverContext<TArgs = Record<string, unknown>> = {\n /** Tool name as registered. */\n toolName: string;\n /** Arguments the tool was called with. */\n args: TArgs;\n /** The CallToolResult the underlying handler produced. */\n result: CallToolResult;\n};\n\n/**\n * Resolves an `AgentTarget` for an executed tool. Bridges declare one of\n * these per registration so the wrapper knows which surface / element /\n * screen the activity belongs to.\n *\n * The resolver runs AFTER the tool handler so it can inspect the result\n * (e.g. read a newly-created item id from `structuredContent`).\n */\nexport type ActivityTargetResolver<TArgs = Record<string, unknown>> = (\n ctx: ActivityResolverContext<TArgs>,\n) => AgentTarget | null;\n\nexport type ToolHandler<TArgs = Record<string, unknown>> = (\n args: TArgs,\n) => Promise<CallToolResult> | CallToolResult;\n\n/**\n * wrapToolWithActivity — decorate a bridge tool handler so every successful\n * call emits an `AgentActivityEvent`. Returns a new handler with the same shape.\n *\n * Usage in a bridge:\n *\n * server.registerTool(\n * definition,\n * wrapToolWithActivity(\n * handler,\n * { agent, kind: \"whiteboard\", resolveTarget: ({ args }) => ({\n * kind: \"whiteboard\", elementId: args.id as string,\n * }) },\n * ),\n * );\n */\nexport function wrapToolWithActivity<TArgs = Record<string, unknown>>(\n handler: ToolHandler<TArgs>,\n options: {\n toolName: string;\n agent: ActivityAgent;\n /** Optional fancy-screens screen id this bridge is scoped to. */\n screenId?: string;\n /** Default target kind if the resolver returns one without `kind`. */\n kind: AgentTarget[\"kind\"];\n /** Per-call resolver. Return `null` to skip emitting (e.g. for read-only tools). */\n resolveTarget?: ActivityTargetResolver<TArgs>;\n /** Optional ttl override. */\n ttlMs?: number;\n },\n): ToolHandler<TArgs> {\n return async (args) => {\n const result = await handler(args);\n if (result.isError) return result;\n\n let target: AgentTarget | null;\n if (options.resolveTarget) {\n target = options.resolveTarget({ toolName: options.toolName, args, result });\n } else {\n target = { kind: options.kind, screenId: options.screenId };\n }\n if (!target) return result;\n\n emitActivity({\n agentId: options.agent.id,\n agentName: options.agent.name,\n agentColor: options.agent.color,\n target: { ...target, kind: target.kind ?? options.kind, screenId: target.screenId ?? options.screenId },\n action: options.toolName,\n timestamp: Date.now(),\n meta: extractMeta(result),\n ttlMs: options.ttlMs,\n });\n return result;\n };\n}\n\nfunction extractMeta(result: CallToolResult): Record<string, unknown> | undefined {\n const sc = result.structuredContent;\n if (sc && typeof sc === \"object\" && !Array.isArray(sc)) {\n return sc as Record<string, unknown>;\n }\n return undefined;\n}\n","// `Slide` is a React component in @particle-academy/fancy-slides; the slide\n// *data* type is exported as `SlideData`. Same naming convention applies to\n// other element data shapes.\nimport type { Deck, DeckOp, ElementAnimation, SlideData, SlideElement, Theme } from \"@particle-academy/fancy-slides\";\nimport { reduceDeck, parseDeck, slideId as newSlideId, elementId as newElementId } from \"@particle-academy/fancy-slides\";\nimport { textResult, errorResult } from \"../mcp/server\";\nimport type { ToolHost } from \"../mcp/tool-host\";\nimport type { JsonObject } from \"../mcp/types\";\nimport type { Bridge } from \"./types\";\nimport { wrapToolWithActivity } from \"../presence/wrap-tool-with-activity\";\nimport type { AgentTarget } from \"../presence/types\";\n\n/**\n * Adapter — the bridge calls into these to read or change deck state. The\n * host owns the deck (it's a controlled prop on `DeckEditor` / `SlideViewer`).\n * Every mutation funnels through `apply(op)`, which the host typically\n * implements as `setDeck(deck => reduceDeck(deck, op))`.\n */\nexport type SlidesBridgeAdapter = {\n /** Read the current deck. */\n getDeck: () => Deck;\n /**\n * Apply a typed DeckOp. The same operations the editor + agent use,\n * so the host's reducer + undo stack handle both code paths identically.\n */\n apply: (op: DeckOp) => void;\n /** Optional screen id for cross-screen presence highlighting. */\n screenId?: string;\n};\n\nexport type SlidesBridgeOptions = {\n adapter: SlidesBridgeAdapter;\n /** Identity stamped on activity / op metadata. */\n agent?: { id: string; name?: string; color?: string };\n};\n\nconst DEFAULT_AGENT = { id: \"agent\", name: \"Agent\", color: \"#a855f7\" };\n\n/**\n * registerSlidesBridge — wires the full slide-editor MCP surface against\n * a fancy-slides Deck. Tools map 1:1 to `DeckOp` cases (plus read-only\n * helpers); humans and agents take identical paths through the reducer.\n *\n * deck_describe read-only deck summary\n * deck_get full deck JSON\n * deck_set replace the whole deck (stream a presentation in)\n * deck_set_title rename\n * deck_apply_theme swap theme\n * slide_list ordered list of slide ids + titles\n * slide_get full slide JSON\n * slide_add insert a slide\n * slide_remove delete a slide\n * slide_reorder move a slide\n * slide_set_layout change layout preset\n * slide_set_notes update speaker notes\n * slide_set_background background color / image / gradient\n * slide_set_transition entrance transition (fade / slide / zoom)\n * element_add insert an element onto a slide\n * element_remove delete an element\n * element_update patch an element's fields\n * element_move set element x/y\n * element_resize set element w/h\n * element_set_animation set/clear an element's entrance build (fade/fly-in/zoom/wipe)\n */\nexport function registerSlidesBridge(host: ToolHost, options: SlidesBridgeOptions): Bridge {\n const { adapter } = options;\n const agent = { ...DEFAULT_AGENT, ...(options.agent ?? {}) };\n const disposers: Array<() => void> = [];\n\n const deckTarget = (): AgentTarget => ({\n kind: \"deck\",\n screenId: adapter.screenId,\n elementId: adapter.getDeck().id,\n label: adapter.getDeck().title,\n });\n\n const slideTarget = (slideId: string): AgentTarget => ({\n kind: \"slide\",\n screenId: adapter.screenId,\n elementId: slideId,\n label: `slide:${slideId}`,\n });\n\n const elementTarget = (slideId: string, elementId: string): AgentTarget => ({\n kind: \"slide-element\",\n screenId: adapter.screenId,\n elementId,\n label: `${slideId}/${elementId}`,\n });\n\n const reg = (\n name: string,\n description: string,\n properties: Record<string, unknown>,\n required: string[],\n handler: (args: JsonObject) => Promise<unknown> | unknown,\n isMutation: boolean,\n resolveTarget?: (args: JsonObject) => AgentTarget,\n ) => {\n const wrapped = (async (args: JsonObject) => {\n try {\n return await handler(args);\n } catch (e) {\n return errorResult(e instanceof Error ? e.message : String(e));\n }\n }) as never;\n const final = isMutation && resolveTarget\n ? wrapToolWithActivity(wrapped, {\n toolName: name,\n agent,\n kind: \"deck\",\n screenId: adapter.screenId,\n resolveTarget: (ctx) => resolveTarget(ctx.args as JsonObject),\n })\n : wrapped;\n disposers.push(\n host.registerTool(\n {\n name,\n description,\n inputSchema: {\n type: \"object\",\n properties: properties as Record<string, never>,\n required,\n additionalProperties: false,\n },\n },\n final as never,\n ),\n );\n };\n\n // ─── Read-only ─────────────────────────────────────────────────────────\n\n reg(\n \"deck_describe\",\n \"Summary of the active deck — title, slide count, theme name, element-type counts.\",\n {},\n [],\n () => {\n const deck = adapter.getDeck();\n const elementCounts: Record<string, number> = {};\n for (const s of deck.slides) {\n for (const e of s.elements) {\n elementCounts[e.type] = (elementCounts[e.type] ?? 0) + 1;\n }\n }\n const summary = {\n id: deck.id,\n title: deck.title,\n slides: deck.slides.length,\n theme: deck.theme?.name,\n elementCounts,\n };\n return textResult(JSON.stringify(summary, null, 2), summary);\n },\n false,\n );\n\n reg(\n \"deck_get\",\n \"Read the full deck JSON.\",\n {},\n [],\n () => {\n const deck = adapter.getDeck();\n return textResult(JSON.stringify(deck, null, 2), deck);\n },\n false,\n );\n\n reg(\n \"slide_list\",\n \"List slides in order — `{ id, layout, elementCount, title? }`.\",\n {},\n [],\n () => {\n const deck = adapter.getDeck();\n const list = deck.slides.map((s) => ({\n id: s.id,\n layout: s.layout,\n elementCount: s.elements.length,\n title: (s.metadata?.title as string | undefined) ?? firstTextContent(s),\n }));\n return textResult(JSON.stringify(list, null, 2), list);\n },\n false,\n );\n\n reg(\n \"slide_get\",\n \"Read a single slide's JSON by id.\",\n { id: { type: \"string\" } },\n [\"id\"],\n (args) => {\n const id = str(args.id);\n const slide = adapter.getDeck().slides.find((s) => s.id === id);\n if (!slide) return errorResult(`Slide not found: ${id}`);\n return textResult(JSON.stringify(slide, null, 2), slide);\n },\n false,\n );\n\n // ─── Deck-level mutations ──────────────────────────────────────────────\n\n reg(\n \"deck_set_title\",\n \"Rename the deck.\",\n { title: { type: \"string\" } },\n [\"title\"],\n (args) => {\n const title = str(args.title);\n adapter.apply({ kind: \"deck_set_title\", title });\n return textResult(`Title set to \"${title}\"`, { title });\n },\n true,\n deckTarget,\n );\n\n reg(\n \"deck_apply_theme\",\n \"Apply a Theme to the deck. Pass either a built-in name (default / dark / vivid) or a full Theme object.\",\n { theme: { description: \"Theme name string or Theme object.\" } },\n [\"theme\"],\n (args) => {\n const t = args.theme;\n let theme: Theme;\n if (typeof t === \"string\") {\n theme = { name: t };\n } else if (t && typeof t === \"object\" && \"name\" in (t as Record<string, unknown>)) {\n theme = t as unknown as Theme;\n } else {\n return errorResult(\"theme must be a string name or an object with a `name` field.\");\n }\n adapter.apply({ kind: \"deck_apply_theme\", theme });\n return textResult(`Applied theme: ${theme.name}`, { theme });\n },\n true,\n deckTarget,\n );\n\n reg(\n \"deck_set\",\n \"Replace the entire deck atomically — stream a full presentation in. Pass a complete Deck object ({ id, title, theme, slides }). Validated + migrated before it lands; the prior deck is the undo snapshot.\",\n { deck: { description: \"A complete Deck object.\" } },\n [\"deck\"],\n (args) => {\n const incoming = args.deck;\n if (!incoming || typeof incoming !== \"object\") {\n return errorResult(\"deck must be a complete Deck object ({ id, title, theme, slides }).\");\n }\n let deck: Deck;\n try {\n // parseDeck validates structure + migrates forward; throws on bad input.\n deck = parseDeck(incoming as unknown);\n } catch (e) {\n return errorResult(e instanceof Error ? e.message : String(e));\n }\n adapter.apply({ kind: \"deck_set\", deck });\n return textResult(`Loaded deck \"${deck.title}\" (${deck.slides.length} slides)`, { id: deck.id, slides: deck.slides.length });\n },\n true,\n deckTarget,\n );\n\n // ─── Slide-level mutations ─────────────────────────────────────────────\n\n reg(\n \"slide_add\",\n \"Insert a slide at `index` (defaults to end). Returns the new slide's id. Accepts a partial slide payload.\",\n {\n index: { type: \"number\" },\n slide: { description: \"Partial slide payload — id is auto-generated when absent.\" },\n },\n [],\n (args) => {\n const deck = adapter.getDeck();\n const incoming = (args.slide && typeof args.slide === \"object\" ? args.slide : {}) as Partial<SlideData>;\n const slide: SlideData = {\n id: incoming.id ?? newSlideId(),\n layout: incoming.layout ?? \"blank\",\n elements: incoming.elements ?? [],\n background: incoming.background,\n transition: incoming.transition,\n notes: incoming.notes,\n metadata: incoming.metadata,\n };\n const index = clamp(num(args.index, deck.slides.length), 0, deck.slides.length);\n adapter.apply({ kind: \"slide_add\", index, slide });\n return textResult(`Added slide ${slide.id} at index ${index}`, { id: slide.id, index });\n },\n true,\n () => deckTarget(),\n );\n\n reg(\n \"slide_remove\",\n \"Delete a slide by id.\",\n { id: { type: \"string\" } },\n [\"id\"],\n (args) => {\n const id = str(args.id);\n adapter.apply({ kind: \"slide_remove\", id });\n return textResult(`Removed slide ${id}`, { id });\n },\n true,\n (args) => slideTarget(str(args?.id)),\n );\n\n reg(\n \"slide_reorder\",\n \"Move a slide to a new index.\",\n { id: { type: \"string\" }, toIndex: { type: \"number\" } },\n [\"id\", \"toIndex\"],\n (args) => {\n const id = str(args.id);\n const toIndex = num(args.toIndex, 0);\n adapter.apply({ kind: \"slide_reorder\", id, toIndex });\n return textResult(`Moved slide ${id} → ${toIndex}`, { id, toIndex });\n },\n true,\n (args) => slideTarget(str(args?.id)),\n );\n\n reg(\n \"slide_set_layout\",\n \"Change a slide's layout preset.\",\n { id: { type: \"string\" }, layout: { type: \"string\" } },\n [\"id\", \"layout\"],\n (args) => {\n const id = str(args.id);\n const layout = str(args.layout) as SlideData[\"layout\"];\n adapter.apply({ kind: \"slide_set_layout\", id, layout: layout ?? \"blank\" });\n return textResult(`Slide ${id} layout → ${layout}`, { id, layout });\n },\n true,\n (args) => slideTarget(str(args?.id)),\n );\n\n reg(\n \"slide_set_notes\",\n \"Set a slide's speaker notes.\",\n { id: { type: \"string\" }, notes: { type: \"string\" } },\n [\"id\", \"notes\"],\n (args) => {\n const id = str(args.id);\n const notes = str(args.notes);\n adapter.apply({ kind: \"slide_set_notes\", id, notes });\n return textResult(`Notes updated on slide ${id}`, { id });\n },\n true,\n (args) => slideTarget(str(args?.id)),\n );\n\n reg(\n \"slide_set_background\",\n \"Set or clear a slide's background.\",\n {\n id: { type: \"string\" },\n background: { description: \"Background object `{ color?, image?, gradient? }` — pass null to clear.\" },\n },\n [\"id\"],\n (args) => {\n const id = str(args.id);\n const bg = (args.background && typeof args.background === \"object\" ? args.background : undefined) as SlideData[\"background\"];\n adapter.apply({ kind: \"slide_set_background\", id, background: bg });\n return textResult(`Background set on slide ${id}`, { id });\n },\n true,\n (args) => slideTarget(str(args?.id)),\n );\n\n reg(\n \"slide_set_transition\",\n \"Set or clear a slide's entrance transition.\",\n {\n id: { type: \"string\" },\n transition: {\n description:\n \"Transition object `{ kind: 'none'|'fade'|'slide'|'zoom', duration?: number(ms), direction?: 'left'|'right'|'up'|'down' }` — pass null to clear.\",\n },\n },\n [\"id\"],\n (args) => {\n const id = str(args.id);\n const transition = (args.transition && typeof args.transition === \"object\" ? args.transition : undefined) as SlideData[\"transition\"];\n adapter.apply({ kind: \"slide_set_transition\", id, transition });\n return textResult(`Transition set on slide ${id}`, { id });\n },\n true,\n (args) => slideTarget(str(args?.id)),\n );\n\n // ─── Element-level mutations ───────────────────────────────────────────\n\n reg(\n \"element_add\",\n \"Insert an element on a slide. Returns the new element id.\",\n {\n slideId: { type: \"string\" },\n element: { description: \"Partial element — type/x/y/w/h required, id auto-generated when absent.\" },\n },\n [\"slideId\", \"element\"],\n (args) => {\n const slideId = str(args.slideId);\n const incoming = (args.element && typeof args.element === \"object\" ? args.element : {}) as Partial<SlideElement>;\n if (!incoming.type) return errorResult(\"element.type is required.\");\n const element = {\n id: incoming.id ?? newElementId(),\n ...incoming,\n } as SlideElement;\n adapter.apply({ kind: \"element_add\", slideId, element });\n return textResult(`Added ${element.type} element ${element.id} on ${slideId}`, { id: element.id, slideId });\n },\n true,\n (args) => slideTarget(str(args?.slideId)),\n );\n\n reg(\n \"element_remove\",\n \"Delete an element by id.\",\n { slideId: { type: \"string\" }, elementId: { type: \"string\" } },\n [\"slideId\", \"elementId\"],\n (args) => {\n const slideId = str(args.slideId);\n const elementId = str(args.elementId);\n adapter.apply({ kind: \"element_remove\", slideId, elementId });\n return textResult(`Removed element ${elementId} from ${slideId}`, { slideId, elementId });\n },\n true,\n (args) => elementTarget(str(args?.slideId), str(args?.elementId)),\n );\n\n reg(\n \"element_update\",\n \"Patch arbitrary fields on an element. Only the keys in `patch` change.\",\n {\n slideId: { type: \"string\" },\n elementId: { type: \"string\" },\n patch: { type: \"object\" },\n },\n [\"slideId\", \"elementId\", \"patch\"],\n (args) => {\n const slideId = str(args.slideId);\n const elementId = str(args.elementId);\n const patch = (args.patch && typeof args.patch === \"object\" ? args.patch : {}) as Partial<SlideElement>;\n adapter.apply({ kind: \"element_update\", slideId, elementId, patch });\n return textResult(`Patched element ${elementId}`, { keys: Object.keys(patch) });\n },\n true,\n (args) => elementTarget(str(args?.slideId), str(args?.elementId)),\n );\n\n reg(\n \"element_move\",\n \"Set element x/y (slide-relative, 0..1).\",\n {\n slideId: { type: \"string\" },\n elementId: { type: \"string\" },\n x: { type: \"number\" },\n y: { type: \"number\" },\n },\n [\"slideId\", \"elementId\", \"x\", \"y\"],\n (args) => {\n const slideId = str(args.slideId);\n const elementId = str(args.elementId);\n const x = clamp(num(args.x, 0), 0, 1);\n const y = clamp(num(args.y, 0), 0, 1);\n adapter.apply({ kind: \"element_move\", slideId, elementId, x, y });\n return textResult(`Moved element ${elementId} → (${x}, ${y})`, { x, y });\n },\n true,\n (args) => elementTarget(str(args?.slideId), str(args?.elementId)),\n );\n\n reg(\n \"element_resize\",\n \"Set element width/height (slide-relative, 0..1).\",\n {\n slideId: { type: \"string\" },\n elementId: { type: \"string\" },\n w: { type: \"number\" },\n h: { type: \"number\" },\n },\n [\"slideId\", \"elementId\", \"w\", \"h\"],\n (args) => {\n const slideId = str(args.slideId);\n const elementId = str(args.elementId);\n const w = clamp(num(args.w, 0), 0, 1);\n const h = clamp(num(args.h, 0), 0, 1);\n adapter.apply({ kind: \"element_resize\", slideId, elementId, w, h });\n return textResult(`Resized element ${elementId} → (${w}, ${h})`, { w, h });\n },\n true,\n (args) => elementTarget(str(args?.slideId), str(args?.elementId)),\n );\n\n reg(\n \"element_set_animation\",\n \"Set or clear an element's entrance animation (build step).\",\n {\n slideId: { type: \"string\" },\n elementId: { type: \"string\" },\n animation: {\n description:\n \"Animation `{ effect: 'fade'|'fly-in'|'zoom'|'wipe', trigger?: 'on-click'|'with-prev'|'after-prev', direction?: 'left'|'right'|'up'|'down', duration?: ms, delay?: ms, order?: number }` — pass null to clear.\",\n },\n },\n [\"slideId\", \"elementId\"],\n (args) => {\n const slideId = str(args.slideId);\n const elementId = str(args.elementId);\n const animation = (args.animation && typeof args.animation === \"object\" ? args.animation : undefined) as ElementAnimation | undefined;\n adapter.apply({ kind: \"element_set_animation\", slideId, elementId, animation });\n return textResult(`Animation ${animation ? \"set on\" : \"cleared from\"} element ${elementId}`, { elementId });\n },\n true,\n (args) => elementTarget(str(args?.slideId), str(args?.elementId)),\n );\n\n return {\n id: \"slides\",\n title: \"Slides\",\n dispose: () => {\n for (const d of disposers.splice(0)) d();\n },\n };\n}\n\n// ─── helpers ───────────────────────────────────────────────────────────────\n\nfunction num(v: unknown, fallback = 0): number {\n return typeof v === \"number\" && Number.isFinite(v) ? v : fallback;\n}\n\nfunction str(v: unknown, fallback = \"\"): string {\n return typeof v === \"string\" ? v : fallback;\n}\n\nfunction clamp(v: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, v));\n}\n\nfunction firstTextContent(slide: SlideData): string | undefined {\n for (const e of slide.elements) {\n if (e.type === \"text\") {\n const t = (e as { content?: string }).content;\n if (typeof t === \"string\") return t.split(\"\\n\")[0]?.slice(0, 60);\n }\n }\n return undefined;\n}\n\n// Re-export the reducer so consumers writing their own adapter can apply\n// the same op-shape locally (e.g. for optimistic updates).\nexport { reduceDeck };\n"]}
1
+ {"version":3,"sources":["../src/mcp/server.ts","../src/presence/wrap-tool-with-activity.ts","../src/bridges/slides.ts"],"names":["emitActivity"],"mappings":"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","file":"bridges-slides.cjs","sourcesContent":["import {\n type CallToolResult,\n type JsonObject,\n type JsonRpcMessage,\n type JsonRpcRequest,\n type JsonRpcId,\n type RegisteredTool,\n type ServerCapabilities,\n type ServerInfo,\n type ToolDefinition,\n type ToolHandler,\n JSONRPC_INTERNAL_ERROR,\n JSONRPC_INVALID_PARAMS,\n JSONRPC_METHOD_NOT_FOUND,\n MCP_PROTOCOL_VERSION,\n} from \"./types\";\nimport { ToolRegistry } from \"./tool-host\";\n\nexport type McpServerOptions = {\n info: ServerInfo;\n /** Defaults to { tools: { listChanged: true } } */\n capabilities?: ServerCapabilities;\n /** Free-text instructions surfaced to clients during initialize. */\n instructions?: string;\n};\n\nexport type Transport = {\n /** Called by the server when it has a message to deliver to the client. */\n send: (message: JsonRpcMessage) => void;\n /** Called by the server when it's torn down so the transport can clean up. */\n close?: () => void;\n};\n\n/**\n * MicroMcpServer — protocol-level MCP server, transport-agnostic.\n *\n * Use it like:\n *\n * const server = new MicroMcpServer({ info: { name: \"session\", version: \"0.1\" } });\n * server.registerTool({ name: \"...\", inputSchema: { type: \"object\" } }, async (args) => ({...}));\n * const transport = new InProcessTransport();\n * server.attach(transport);\n * transport.deliver({ ... }); // client → server frames\n *\n * The same server can serve multiple transports (e.g. an in-process agent\n * AND a relayed external client) by attaching each one.\n */\nexport class MicroMcpServer extends ToolRegistry {\n private transports = new Set<Transport>();\n private notifyListChangedScheduled = false;\n\n readonly info: ServerInfo;\n readonly capabilities: ServerCapabilities;\n readonly instructions?: string;\n\n constructor(options: McpServerOptions) {\n super();\n this.info = options.info;\n this.capabilities = options.capabilities ?? { tools: { listChanged: true } };\n this.instructions = options.instructions;\n }\n\n attach(transport: Transport): () => void {\n this.transports.add(transport);\n return () => this.detach(transport);\n }\n\n detach(transport: Transport): void {\n if (this.transports.delete(transport)) {\n transport.close?.();\n }\n }\n\n unregisterTool(name: string): void {\n if (this.tools.delete(name)) {\n this.scheduleListChangedNotification();\n }\n }\n\n protected onToolsChanged(): void {\n this.scheduleListChangedNotification();\n }\n\n /**\n * Receive a JSON-RPC frame from a client (called by the transport).\n * The transport is responsible for sending the response back.\n */\n async receive(transport: Transport, message: JsonRpcMessage): Promise<void> {\n if (!(\"method\" in message)) return; // It's a response, not a request — ignore.\n\n const isNotification = !(\"id\" in message);\n if (isNotification) {\n // Notifications are fire-and-forget. We ignore unknown methods.\n return;\n }\n\n const request = message as JsonRpcRequest;\n try {\n const result = await this.handle(request);\n transport.send({ jsonrpc: \"2.0\", id: request.id, result });\n } catch (err) {\n transport.send({\n jsonrpc: \"2.0\",\n id: request.id,\n error: this.toRpcError(err),\n });\n }\n }\n\n private async handle(request: JsonRpcRequest): Promise<any> {\n const { method, params } = request;\n switch (method) {\n case \"initialize\":\n return {\n protocolVersion: MCP_PROTOCOL_VERSION,\n capabilities: this.capabilities,\n serverInfo: this.info,\n ...(this.instructions ? { instructions: this.instructions } : {}),\n };\n\n case \"tools/list\":\n return { tools: this.listTools() };\n\n case \"tools/call\": {\n const name = params?.name;\n const args = (params?.arguments ?? {}) as JsonObject;\n if (typeof name !== \"string\") {\n throw rpcError(JSONRPC_INVALID_PARAMS, \"tools/call requires `name`\");\n }\n const tool = this.tools.get(name);\n if (!tool) {\n throw rpcError(JSONRPC_METHOD_NOT_FOUND, `Unknown tool: ${name}`);\n }\n const result = await tool.handler(args);\n return result satisfies CallToolResult;\n }\n\n case \"ping\":\n return {};\n\n default:\n throw rpcError(JSONRPC_METHOD_NOT_FOUND, `Unsupported method: ${method}`);\n }\n }\n\n private scheduleListChangedNotification(): void {\n if (this.notifyListChangedScheduled) return;\n this.notifyListChangedScheduled = true;\n queueMicrotask(() => {\n this.notifyListChangedScheduled = false;\n this.broadcast({ jsonrpc: \"2.0\", method: \"notifications/tools/list_changed\" });\n });\n }\n\n private broadcast(message: JsonRpcMessage): void {\n for (const t of this.transports) t.send(message);\n }\n\n private toRpcError(err: unknown): { code: number; message: string; data?: any } {\n if (err && typeof err === \"object\" && \"code\" in err && \"message\" in err) {\n return err as any;\n }\n return {\n code: JSONRPC_INTERNAL_ERROR,\n message: err instanceof Error ? err.message : String(err),\n };\n }\n}\n\nexport function rpcError(code: number, message: string, data?: any) {\n return { code, message, ...(data !== undefined ? { data } : {}) };\n}\n\n/**\n * Helper to build a CallToolResult from a string or structured value.\n */\nexport function textResult(text: string, structured?: any): CallToolResult {\n return {\n content: [{ type: \"text\", text }],\n ...(structured !== undefined ? { structuredContent: structured } : {}),\n };\n}\n\nexport function errorResult(text: string): CallToolResult {\n return { content: [{ type: \"text\", text }], isError: true };\n}\n\n// Internal helper so the JsonRpcId import isn't dropped by tsup\ntype _KeepIdImport = JsonRpcId;\n","import type { CallToolResult } from \"../mcp/types\";\nimport { emitActivity } from \"./registry\";\nimport type { AgentTarget } from \"./types\";\n\nexport type ActivityAgent = { id: string; name?: string; color?: string };\n\nexport type ActivityResolverContext<TArgs = Record<string, unknown>> = {\n /** Tool name as registered. */\n toolName: string;\n /** Arguments the tool was called with. */\n args: TArgs;\n /** The CallToolResult the underlying handler produced. */\n result: CallToolResult;\n};\n\n/**\n * Resolves an `AgentTarget` for an executed tool. Bridges declare one of\n * these per registration so the wrapper knows which surface / element /\n * screen the activity belongs to.\n *\n * The resolver runs AFTER the tool handler so it can inspect the result\n * (e.g. read a newly-created item id from `structuredContent`).\n */\nexport type ActivityTargetResolver<TArgs = Record<string, unknown>> = (\n ctx: ActivityResolverContext<TArgs>,\n) => AgentTarget | null;\n\nexport type ToolHandler<TArgs = Record<string, unknown>> = (\n args: TArgs,\n) => Promise<CallToolResult> | CallToolResult;\n\n/**\n * wrapToolWithActivity — decorate a bridge tool handler so every successful\n * call emits an `AgentActivityEvent`. Returns a new handler with the same shape.\n *\n * Usage in a bridge:\n *\n * server.registerTool(\n * definition,\n * wrapToolWithActivity(\n * handler,\n * { agent, kind: \"whiteboard\", resolveTarget: ({ args }) => ({\n * kind: \"whiteboard\", elementId: args.id as string,\n * }) },\n * ),\n * );\n */\nexport function wrapToolWithActivity<TArgs = Record<string, unknown>>(\n handler: ToolHandler<TArgs>,\n options: {\n toolName: string;\n agent: ActivityAgent;\n /** Optional fancy-screens screen id this bridge is scoped to. */\n screenId?: string;\n /** Default target kind if the resolver returns one without `kind`. */\n kind: AgentTarget[\"kind\"];\n /** Per-call resolver. Return `null` to skip emitting (e.g. for read-only tools). */\n resolveTarget?: ActivityTargetResolver<TArgs>;\n /** Optional ttl override. */\n ttlMs?: number;\n },\n): ToolHandler<TArgs> {\n return async (args) => {\n const result = await handler(args);\n if (result.isError) return result;\n\n let target: AgentTarget | null;\n if (options.resolveTarget) {\n target = options.resolveTarget({ toolName: options.toolName, args, result });\n } else {\n target = { kind: options.kind, screenId: options.screenId };\n }\n if (!target) return result;\n\n emitActivity({\n agentId: options.agent.id,\n agentName: options.agent.name,\n agentColor: options.agent.color,\n target: { ...target, kind: target.kind ?? options.kind, screenId: target.screenId ?? options.screenId },\n action: options.toolName,\n timestamp: Date.now(),\n meta: extractMeta(result),\n ttlMs: options.ttlMs,\n });\n return result;\n };\n}\n\nfunction extractMeta(result: CallToolResult): Record<string, unknown> | undefined {\n const sc = result.structuredContent;\n if (sc && typeof sc === \"object\" && !Array.isArray(sc)) {\n return sc as Record<string, unknown>;\n }\n return undefined;\n}\n","// `Slide` is a React component in @particle-academy/fancy-slides; the slide\n// *data* type is exported as `SlideData`. Same naming convention applies to\n// other element data shapes.\n// Types are import-type-only (erased at build); the fancy-slides VALUES\n// (parseDeck / slideId / elementId) are lazy-imported inside the handlers so the\n// package barrel never statically pulls this optional peer (see issue #3).\nimport type { Deck, DeckOp, ElementAnimation, SlideData, SlideElement, Theme } from \"@particle-academy/fancy-slides\";\nimport { textResult, errorResult } from \"../mcp/server\";\nimport type { ToolHost } from \"../mcp/tool-host\";\nimport type { JsonObject } from \"../mcp/types\";\nimport type { Bridge } from \"./types\";\nimport { wrapToolWithActivity } from \"../presence/wrap-tool-with-activity\";\nimport type { AgentTarget } from \"../presence/types\";\n\n/**\n * Adapter — the bridge calls into these to read or change deck state. The\n * host owns the deck (it's a controlled prop on `DeckEditor` / `SlideViewer`).\n * Every mutation funnels through `apply(op)`, which the host typically\n * implements as `setDeck(deck => reduceDeck(deck, op))`.\n */\nexport type SlidesBridgeAdapter = {\n /** Read the current deck. */\n getDeck: () => Deck;\n /**\n * Apply a typed DeckOp. The same operations the editor + agent use,\n * so the host's reducer + undo stack handle both code paths identically.\n */\n apply: (op: DeckOp) => void;\n /** Optional screen id for cross-screen presence highlighting. */\n screenId?: string;\n};\n\nexport type SlidesBridgeOptions = {\n adapter: SlidesBridgeAdapter;\n /** Identity stamped on activity / op metadata. */\n agent?: { id: string; name?: string; color?: string };\n};\n\nconst DEFAULT_AGENT = { id: \"agent\", name: \"Agent\", color: \"#a855f7\" };\n\n/**\n * registerSlidesBridge — wires the full slide-editor MCP surface against\n * a fancy-slides Deck. Tools map 1:1 to `DeckOp` cases (plus read-only\n * helpers); humans and agents take identical paths through the reducer.\n *\n * deck_describe read-only deck summary\n * deck_get full deck JSON\n * deck_set replace the whole deck (stream a presentation in)\n * deck_set_title rename\n * deck_apply_theme swap theme\n * slide_list ordered list of slide ids + titles\n * slide_get full slide JSON\n * slide_add insert a slide\n * slide_remove delete a slide\n * slide_reorder move a slide\n * slide_set_layout change layout preset\n * slide_set_notes update speaker notes\n * slide_set_background background color / image / gradient\n * slide_set_transition entrance transition (fade / slide / zoom)\n * element_add insert an element onto a slide\n * element_remove delete an element\n * element_update patch an element's fields\n * element_move set element x/y\n * element_resize set element w/h\n * element_set_animation set/clear an element's entrance build (fade/fly-in/zoom/wipe)\n */\nexport function registerSlidesBridge(host: ToolHost, options: SlidesBridgeOptions): Bridge {\n const { adapter } = options;\n const agent = { ...DEFAULT_AGENT, ...(options.agent ?? {}) };\n const disposers: Array<() => void> = [];\n\n const deckTarget = (): AgentTarget => ({\n kind: \"deck\",\n screenId: adapter.screenId,\n elementId: adapter.getDeck().id,\n label: adapter.getDeck().title,\n });\n\n const slideTarget = (slideId: string): AgentTarget => ({\n kind: \"slide\",\n screenId: adapter.screenId,\n elementId: slideId,\n label: `slide:${slideId}`,\n });\n\n const elementTarget = (slideId: string, elementId: string): AgentTarget => ({\n kind: \"slide-element\",\n screenId: adapter.screenId,\n elementId,\n label: `${slideId}/${elementId}`,\n });\n\n const reg = (\n name: string,\n description: string,\n properties: Record<string, unknown>,\n required: string[],\n handler: (args: JsonObject) => Promise<unknown> | unknown,\n isMutation: boolean,\n resolveTarget?: (args: JsonObject) => AgentTarget,\n ) => {\n const wrapped = (async (args: JsonObject) => {\n try {\n return await handler(args);\n } catch (e) {\n return errorResult(e instanceof Error ? e.message : String(e));\n }\n }) as never;\n const final = isMutation && resolveTarget\n ? wrapToolWithActivity(wrapped, {\n toolName: name,\n agent,\n kind: \"deck\",\n screenId: adapter.screenId,\n resolveTarget: (ctx) => resolveTarget(ctx.args as JsonObject),\n })\n : wrapped;\n disposers.push(\n host.registerTool(\n {\n name,\n description,\n inputSchema: {\n type: \"object\",\n properties: properties as Record<string, never>,\n required,\n additionalProperties: false,\n },\n },\n final as never,\n ),\n );\n };\n\n // ─── Read-only ─────────────────────────────────────────────────────────\n\n reg(\n \"deck_describe\",\n \"Summary of the active deck — title, slide count, theme name, element-type counts.\",\n {},\n [],\n () => {\n const deck = adapter.getDeck();\n const elementCounts: Record<string, number> = {};\n for (const s of deck.slides) {\n for (const e of s.elements) {\n elementCounts[e.type] = (elementCounts[e.type] ?? 0) + 1;\n }\n }\n const summary = {\n id: deck.id,\n title: deck.title,\n slides: deck.slides.length,\n theme: deck.theme?.name,\n elementCounts,\n };\n return textResult(JSON.stringify(summary, null, 2), summary);\n },\n false,\n );\n\n reg(\n \"deck_get\",\n \"Read the full deck JSON.\",\n {},\n [],\n () => {\n const deck = adapter.getDeck();\n return textResult(JSON.stringify(deck, null, 2), deck);\n },\n false,\n );\n\n reg(\n \"slide_list\",\n \"List slides in order — `{ id, layout, elementCount, title? }`.\",\n {},\n [],\n () => {\n const deck = adapter.getDeck();\n const list = deck.slides.map((s) => ({\n id: s.id,\n layout: s.layout,\n elementCount: s.elements.length,\n title: (s.metadata?.title as string | undefined) ?? firstTextContent(s),\n }));\n return textResult(JSON.stringify(list, null, 2), list);\n },\n false,\n );\n\n reg(\n \"slide_get\",\n \"Read a single slide's JSON by id.\",\n { id: { type: \"string\" } },\n [\"id\"],\n (args) => {\n const id = str(args.id);\n const slide = adapter.getDeck().slides.find((s) => s.id === id);\n if (!slide) return errorResult(`Slide not found: ${id}`);\n return textResult(JSON.stringify(slide, null, 2), slide);\n },\n false,\n );\n\n // ─── Deck-level mutations ──────────────────────────────────────────────\n\n reg(\n \"deck_set_title\",\n \"Rename the deck.\",\n { title: { type: \"string\" } },\n [\"title\"],\n (args) => {\n const title = str(args.title);\n adapter.apply({ op: \"deck.setTitle\", title });\n return textResult(`Title set to \"${title}\"`, { title });\n },\n true,\n deckTarget,\n );\n\n reg(\n \"deck_apply_theme\",\n \"Apply a Theme to the deck. Pass either a built-in name (default / dark / vivid) or a full Theme object.\",\n { theme: { description: \"Theme name string or Theme object.\" } },\n [\"theme\"],\n (args) => {\n const t = args.theme;\n let theme: Theme;\n if (typeof t === \"string\") {\n theme = { name: t };\n } else if (t && typeof t === \"object\" && \"name\" in (t as Record<string, unknown>)) {\n theme = t as unknown as Theme;\n } else {\n return errorResult(\"theme must be a string name or an object with a `name` field.\");\n }\n adapter.apply({ op: \"deck.setTheme\", theme });\n return textResult(`Applied theme: ${theme.name}`, { theme });\n },\n true,\n deckTarget,\n );\n\n reg(\n \"deck_set\",\n \"Replace the entire deck atomically — stream a full presentation in. Pass a complete Deck object ({ id, title, theme, slides }). Validated + migrated before it lands; the prior deck is the undo snapshot.\",\n { deck: { description: \"A complete Deck object.\" } },\n [\"deck\"],\n async (args) => {\n const incoming = args.deck;\n if (!incoming || typeof incoming !== \"object\") {\n return errorResult(\"deck must be a complete Deck object ({ id, title, theme, slides }).\");\n }\n const { parseDeck } = await import(\"@particle-academy/fancy-slides\");\n let deck: Deck;\n try {\n // parseDeck validates structure + migrates forward; throws on bad input.\n deck = parseDeck(incoming as unknown);\n } catch (e) {\n return errorResult(e instanceof Error ? e.message : String(e));\n }\n adapter.apply({ op: \"deck.replace\", deck });\n return textResult(`Loaded deck \"${deck.title}\" (${deck.slides.length} slides)`, { id: deck.id, slides: deck.slides.length });\n },\n true,\n deckTarget,\n );\n\n // ─── Slide-level mutations ─────────────────────────────────────────────\n\n reg(\n \"slide_add\",\n \"Insert a slide at `index` (defaults to end). Returns the new slide's id. Accepts a partial slide payload.\",\n {\n index: { type: \"number\" },\n slide: { description: \"Partial slide payload — id is auto-generated when absent.\" },\n },\n [],\n async (args) => {\n const deck = adapter.getDeck();\n const incoming = (args.slide && typeof args.slide === \"object\" ? args.slide : {}) as Partial<SlideData>;\n const { slideId: newSlideId } = await import(\"@particle-academy/fancy-slides\");\n const slide: SlideData = {\n id: incoming.id ?? newSlideId(),\n layout: incoming.layout ?? \"blank\",\n elements: incoming.elements ?? [],\n background: incoming.background,\n transition: incoming.transition,\n notes: incoming.notes,\n metadata: incoming.metadata,\n };\n const index = clamp(num(args.index, deck.slides.length), 0, deck.slides.length);\n adapter.apply({ op: \"slide.add\", index, slide });\n return textResult(`Added slide ${slide.id} at index ${index}`, { id: slide.id, index });\n },\n true,\n () => deckTarget(),\n );\n\n reg(\n \"slide_remove\",\n \"Delete a slide by id.\",\n { id: { type: \"string\" } },\n [\"id\"],\n (args) => {\n const id = str(args.id);\n adapter.apply({ op: \"slide.remove\", slideId: id });\n return textResult(`Removed slide ${id}`, { id });\n },\n true,\n (args) => slideTarget(str(args?.id)),\n );\n\n reg(\n \"slide_reorder\",\n \"Move a slide to a new index.\",\n { id: { type: \"string\" }, toIndex: { type: \"number\" } },\n [\"id\", \"toIndex\"],\n (args) => {\n const id = str(args.id);\n const toIndex = num(args.toIndex, 0);\n adapter.apply({ op: \"slide.reorder\", slideId: id, toIndex });\n return textResult(`Moved slide ${id} → ${toIndex}`, { id, toIndex });\n },\n true,\n (args) => slideTarget(str(args?.id)),\n );\n\n reg(\n \"slide_set_layout\",\n \"Change a slide's layout preset.\",\n { id: { type: \"string\" }, layout: { type: \"string\" } },\n [\"id\", \"layout\"],\n (args) => {\n const id = str(args.id);\n const layout = str(args.layout) as SlideData[\"layout\"];\n adapter.apply({ op: \"slide.setLayout\", slideId: id, layout: layout ?? \"blank\" });\n return textResult(`Slide ${id} layout → ${layout}`, { id, layout });\n },\n true,\n (args) => slideTarget(str(args?.id)),\n );\n\n reg(\n \"slide_set_notes\",\n \"Set a slide's speaker notes.\",\n { id: { type: \"string\" }, notes: { type: \"string\" } },\n [\"id\", \"notes\"],\n (args) => {\n const id = str(args.id);\n const notes = str(args.notes);\n adapter.apply({ op: \"slide.setNotes\", slideId: id, notes });\n return textResult(`Notes updated on slide ${id}`, { id });\n },\n true,\n (args) => slideTarget(str(args?.id)),\n );\n\n reg(\n \"slide_set_background\",\n \"Set or clear a slide's background.\",\n {\n id: { type: \"string\" },\n background: { description: \"Background object `{ color?, image?, gradient? }` — pass null to clear.\" },\n },\n [\"id\"],\n (args) => {\n const id = str(args.id);\n const bg = (args.background && typeof args.background === \"object\" ? args.background : undefined) as SlideData[\"background\"];\n adapter.apply({ op: \"slide.setBackground\", slideId: id, background: bg });\n return textResult(`Background set on slide ${id}`, { id });\n },\n true,\n (args) => slideTarget(str(args?.id)),\n );\n\n reg(\n \"slide_set_transition\",\n \"Set or clear a slide's entrance transition.\",\n {\n id: { type: \"string\" },\n transition: {\n description:\n \"Transition object `{ kind: 'none'|'fade'|'slide'|'zoom', duration?: number(ms), direction?: 'left'|'right'|'up'|'down' }` — pass null to clear.\",\n },\n },\n [\"id\"],\n (args) => {\n const id = str(args.id);\n const transition = (args.transition && typeof args.transition === \"object\" ? args.transition : undefined) as SlideData[\"transition\"];\n adapter.apply({ op: \"slide.setTransition\", slideId: id, transition });\n return textResult(`Transition set on slide ${id}`, { id });\n },\n true,\n (args) => slideTarget(str(args?.id)),\n );\n\n // ─── Element-level mutations ───────────────────────────────────────────\n\n reg(\n \"element_add\",\n \"Insert an element on a slide. Returns the new element id.\",\n {\n slideId: { type: \"string\" },\n element: { description: \"Partial element — type/x/y/w/h required, id auto-generated when absent.\" },\n },\n [\"slideId\", \"element\"],\n async (args) => {\n const slideId = str(args.slideId);\n const incoming = (args.element && typeof args.element === \"object\" ? args.element : {}) as Partial<SlideElement>;\n if (!incoming.type) return errorResult(\"element.type is required.\");\n const { elementId: newElementId } = await import(\"@particle-academy/fancy-slides\");\n const element = {\n id: incoming.id ?? newElementId(),\n ...incoming,\n } as SlideElement;\n adapter.apply({ op: \"element.add\", slideId, element });\n return textResult(`Added ${element.type} element ${element.id} on ${slideId}`, { id: element.id, slideId });\n },\n true,\n (args) => slideTarget(str(args?.slideId)),\n );\n\n reg(\n \"element_remove\",\n \"Delete an element by id.\",\n { slideId: { type: \"string\" }, elementId: { type: \"string\" } },\n [\"slideId\", \"elementId\"],\n (args) => {\n const slideId = str(args.slideId);\n const elementId = str(args.elementId);\n adapter.apply({ op: \"element.remove\", slideId, elementId });\n return textResult(`Removed element ${elementId} from ${slideId}`, { slideId, elementId });\n },\n true,\n (args) => elementTarget(str(args?.slideId), str(args?.elementId)),\n );\n\n reg(\n \"element_update\",\n \"Patch arbitrary fields on an element. Only the keys in `patch` change.\",\n {\n slideId: { type: \"string\" },\n elementId: { type: \"string\" },\n patch: { type: \"object\" },\n },\n [\"slideId\", \"elementId\", \"patch\"],\n (args) => {\n const slideId = str(args.slideId);\n const elementId = str(args.elementId);\n const patch = (args.patch && typeof args.patch === \"object\" ? args.patch : {}) as Partial<SlideElement>;\n adapter.apply({ op: \"element.update\", slideId, elementId, patch });\n return textResult(`Patched element ${elementId}`, { keys: Object.keys(patch) });\n },\n true,\n (args) => elementTarget(str(args?.slideId), str(args?.elementId)),\n );\n\n reg(\n \"element_move\",\n \"Set element x/y (slide-relative, 0..1).\",\n {\n slideId: { type: \"string\" },\n elementId: { type: \"string\" },\n x: { type: \"number\" },\n y: { type: \"number\" },\n },\n [\"slideId\", \"elementId\", \"x\", \"y\"],\n (args) => {\n const slideId = str(args.slideId);\n const elementId = str(args.elementId);\n const x = clamp(num(args.x, 0), 0, 1);\n const y = clamp(num(args.y, 0), 0, 1);\n adapter.apply({ op: \"element.move\", slideId, elementId, x, y });\n return textResult(`Moved element ${elementId} → (${x}, ${y})`, { x, y });\n },\n true,\n (args) => elementTarget(str(args?.slideId), str(args?.elementId)),\n );\n\n reg(\n \"element_resize\",\n \"Set element width/height (slide-relative, 0..1).\",\n {\n slideId: { type: \"string\" },\n elementId: { type: \"string\" },\n w: { type: \"number\" },\n h: { type: \"number\" },\n },\n [\"slideId\", \"elementId\", \"w\", \"h\"],\n (args) => {\n const slideId = str(args.slideId);\n const elementId = str(args.elementId);\n const w = clamp(num(args.w, 0), 0, 1);\n const h = clamp(num(args.h, 0), 0, 1);\n adapter.apply({ op: \"element.resize\", slideId, elementId, w, h });\n return textResult(`Resized element ${elementId} → (${w}, ${h})`, { w, h });\n },\n true,\n (args) => elementTarget(str(args?.slideId), str(args?.elementId)),\n );\n\n reg(\n \"element_set_animation\",\n \"Set or clear an element's entrance animation (build step).\",\n {\n slideId: { type: \"string\" },\n elementId: { type: \"string\" },\n animation: {\n description:\n \"Animation `{ effect: 'fade'|'fly-in'|'zoom'|'wipe', trigger?: 'on-click'|'with-prev'|'after-prev', direction?: 'left'|'right'|'up'|'down', duration?: ms, delay?: ms, order?: number }` — pass null to clear.\",\n },\n },\n [\"slideId\", \"elementId\"],\n (args) => {\n const slideId = str(args.slideId);\n const elementId = str(args.elementId);\n const animation = (args.animation && typeof args.animation === \"object\" ? args.animation : undefined) as ElementAnimation | undefined;\n adapter.apply({ op: \"element.setAnimation\", slideId, elementId, animation });\n return textResult(`Animation ${animation ? \"set on\" : \"cleared from\"} element ${elementId}`, { elementId });\n },\n true,\n (args) => elementTarget(str(args?.slideId), str(args?.elementId)),\n );\n\n return {\n id: \"slides\",\n title: \"Slides\",\n dispose: () => {\n for (const d of disposers.splice(0)) d();\n },\n };\n}\n\n// ─── helpers ───────────────────────────────────────────────────────────────\n\nfunction num(v: unknown, fallback = 0): number {\n return typeof v === \"number\" && Number.isFinite(v) ? v : fallback;\n}\n\nfunction str(v: unknown, fallback = \"\"): string {\n return typeof v === \"string\" ? v : fallback;\n}\n\nfunction clamp(v: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, v));\n}\n\nfunction firstTextContent(slide: SlideData): string | undefined {\n for (const e of slide.elements) {\n if (e.type === \"text\") {\n const t = (e as { content?: string }).content;\n if (typeof t === \"string\") return t.split(\"\\n\")[0]?.slice(0, 60);\n }\n }\n return undefined;\n}\n\n// NOTE: `reduceDeck` is intentionally NOT re-exported — a static re-export forces\n// the barrel to statically import the optional peer @particle-academy/fancy-slides\n// (issue #3). Consumers writing their own adapter import it from fancy-slides\n// directly: `import { reduceDeck } from \"@particle-academy/fancy-slides\"`.\n"]}
@@ -1,4 +1,4 @@
1
- export { reduceDeck, registerSlidesBridge } from './chunk-R5OA26MJ.js';
1
+ export { registerSlidesBridge } from './chunk-DR7X4TWE.js';
2
2
  import './chunk-ULJL53DL.js';
3
3
  import './chunk-C3TYI5TJ.js';
4
4
  import './chunk-4KAIV6OD.js';