@powerhousedao/reactor-mcp 6.0.2-staging.9 → 6.1.0-dev.1

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/dist/cli.mjs CHANGED
@@ -62,7 +62,7 @@ var VitePackageLoader = class {
62
62
  async load() {
63
63
  const vite = await this.initVite();
64
64
  await access(this.fullPath);
65
- this.logger.verbose("Loading document models from", this.fullPath);
65
+ this.logger.verbose("Loading document models from @path", this.fullPath);
66
66
  try {
67
67
  const localDMs = await vite.ssrLoadModule(this.fullPath);
68
68
  const exports = Object.values(localDMs);
package/dist/cli.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.mjs","names":["createServer"],"sources":["../src/feature-flags.ts","../src/stdio/loader.ts","../src/stdio/index.ts","../src/cli.ts"],"sourcesContent":["import { EnvVarProvider } from \"@openfeature/env-var-provider\";\nimport { OpenFeature } from \"@openfeature/server-sdk\";\n\nexport async function initFeatureFlags() {\n // for now, we're only using env vars for feature flags\n const provider = new EnvVarProvider();\n\n await OpenFeature.setProviderAndWait(provider);\n\n return OpenFeature.getClient();\n}\n","import type { DocumentModelModule } from \"@powerhousedao/shared/document-model\";\nimport { childLogger } from \"document-model\";\nimport { access } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { ViteDevServer } from \"vite\";\nimport { createServer } from \"vite\";\n\ninterface IPackageLoader {\n load(): Promise<DocumentModelModule[]>;\n onDocumentModelsChange(\n callback: (models: DocumentModelModule[]) => void,\n ): Promise<() => void>;\n}\n\nfunction debounce<T extends (...args: any[]) => void>(\n func: T,\n delay = 100,\n): (...args: Parameters<T>) => void {\n let timeoutId: ReturnType<typeof setTimeout>;\n return (...args: Parameters<T>): void => {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => func(...args), delay);\n };\n}\n\nfunction isSubpath(parent: string, dir: string) {\n const relative = path.relative(parent, dir);\n return relative && !relative.startsWith(\"..\") && !path.isAbsolute(relative);\n}\n\nexport class VitePackageLoader implements IPackageLoader {\n private readonly logger = childLogger([\"reactor-mcp\", \"vite-loader\"]);\n\n private readonly root: string;\n private readonly documentModelsDir: string;\n\n private vite: ViteDevServer | undefined;\n\n readonly name = \"VitePackageLoader\";\n\n constructor(root: string, documentModelsDir: string) {\n this.root = root;\n this.documentModelsDir = documentModelsDir;\n }\n\n private get fullPath(): string {\n return path.join(this.root, this.documentModelsDir);\n }\n\n private async initVite() {\n if (this.vite) {\n return this.vite;\n }\n\n this.vite = await createServer({\n root: this.root,\n logLevel: \"info\",\n server: {\n hmr: false,\n middlewareMode: true,\n warmup: {\n ssrFiles: [this.fullPath],\n },\n fs: {\n allow: [this.fullPath],\n },\n },\n optimizeDeps: {\n // It's recommended to disable deps optimization\n noDiscovery: true,\n include: [],\n },\n });\n\n return this.vite;\n }\n\n async load(): Promise<DocumentModelModule[]> {\n const vite = await this.initVite();\n\n await access(this.fullPath);\n this.logger.verbose(\"Loading document models from\", this.fullPath);\n\n try {\n const localDMs = (await vite.ssrLoadModule(this.fullPath)) as Record<\n string,\n DocumentModelModule\n >;\n\n const exports = Object.values(localDMs);\n\n // duck type\n const documentModels: DocumentModelModule[] = [];\n for (const dm of exports) {\n if (dm.documentModel) {\n documentModels.push(dm);\n }\n }\n\n this.logger.verbose(\n ` ➜ Loaded ${documentModels.length} Document Models from: ${this.fullPath}`,\n );\n\n return documentModels;\n } catch (e) {\n this.logger.verbose(\n ` ➜ No Document Models found for: ${this.fullPath}${e ? `\\n${JSON.stringify(e)}` : \"\"}`,\n );\n }\n\n return [];\n }\n\n async onDocumentModelsChange(\n callback: (models: DocumentModelModule[]) => void,\n ) {\n const vite = await this.initVite();\n const listener = debounce(async (changedPath: string) => {\n if (isSubpath(this.fullPath, changedPath)) {\n const documentModels = await this.load();\n callback(documentModels);\n }\n }, 100);\n vite.watcher.on(\"change\", listener);\n\n return () => {\n vite.watcher.off(\"change\", listener);\n };\n }\n}\n","import { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { ReactorBuilder, ReactorClientBuilder } from \"@powerhousedao/reactor\";\nimport { reactorDriveDocumentModelModule } from \"@powerhousedao/reactor-drive\";\nimport { driveDocumentModelModule } from \"@powerhousedao/shared/document-drive\";\nimport type { DocumentModelModule } from \"@powerhousedao/shared/document-model\";\nimport { documentModelDocumentModelModule } from \"document-model\";\nimport { initFeatureFlags } from \"../feature-flags.js\";\nimport { logger } from \"../logger.js\";\nimport { createServer } from \"../server.js\";\nimport { VitePackageLoader } from \"./loader.js\";\n\nexport interface IMcpOptions {\n remoteDrive?: string;\n root?: string;\n documentModelsDir?: string;\n}\n\nconst baseDocumentModels: DocumentModelModule<any>[] = [\n documentModelDocumentModelModule,\n driveDocumentModelModule,\n reactorDriveDocumentModelModule,\n];\n\nasync function createReactorClient(documentModels: DocumentModelModule[]) {\n const reactorBuilder = new ReactorBuilder().withDocumentModels(\n baseDocumentModels.concat(documentModels),\n );\n\n const module = await new ReactorClientBuilder()\n .withReactorBuilder(reactorBuilder)\n .buildModule();\n\n return module;\n}\n\nexport async function initStdioMcpServer(options?: IMcpOptions) {\n const {\n remoteDrive,\n root,\n documentModelsDir = \"./document-models\",\n } = options ?? {};\n\n // initialize feature flags\n await initFeatureFlags();\n\n // if root of project is passed then loads local document models\n let documentModelsLoader: VitePackageLoader | undefined;\n const documentModels: DocumentModelModule[] = [];\n\n if (root) {\n documentModelsLoader = new VitePackageLoader(root, documentModelsDir);\n try {\n const loadedModels = await documentModelsLoader.load();\n documentModels.push(...loadedModels);\n logger.info(\n \"Loaded document models: @models\",\n loadedModels.map((m) => m.documentModel.global.name).join(\", \"),\n );\n } catch (e) {\n logger.error(\"@error\", e);\n }\n }\n\n // initializes reactor client with loaded document models\n const reactorModule = await createReactorClient(documentModels);\n const { client, reactor, reactorModule: rModule } = reactorModule;\n\n // listens for changes in the local document models to update the reactor\n if (documentModelsLoader && rModule?.documentModelRegistry) {\n const unsubscribe = await documentModelsLoader.onDocumentModelsChange(\n (models) => {\n const results = rModule.documentModelRegistry.registerModules(\n ...baseDocumentModels.concat(models),\n );\n for (const result of results) {\n if (result.status === \"error\") {\n logger.error(\n \"Failed to register document model: @error\",\n result.error,\n );\n }\n }\n },\n );\n\n process.on(\"exit\", () => {\n unsubscribe();\n reactor.kill();\n });\n }\n\n // if a remote drive is passed, log a warning since remote drives\n // are now handled at a different level (SyncManager)\n if (remoteDrive) {\n logger.warn(\n \"Remote drive configuration via MCP is not supported in the new reactor. \" +\n \"Remote drives should be configured at the server level.\",\n );\n }\n\n // starts the server\n // Note: syncManager is not available in stdio mode currently\n const server = await createServer({ client });\n\n // starts Stdio transport\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n","import { logger } from \"./logger.js\";\nimport { initStdioMcpServer } from \"./stdio/index.js\";\n\ninitStdioMcpServer({\n remoteDrive: process.argv.at(2),\n root: process.cwd(),\n}).catch((error: unknown) => {\n logger.error(\"@error\", error);\n process.exit(1);\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"cli.mjs","names":["createServer"],"sources":["../src/feature-flags.ts","../src/stdio/loader.ts","../src/stdio/index.ts","../src/cli.ts"],"sourcesContent":["import { EnvVarProvider } from \"@openfeature/env-var-provider\";\nimport { OpenFeature } from \"@openfeature/server-sdk\";\n\nexport async function initFeatureFlags() {\n // for now, we're only using env vars for feature flags\n const provider = new EnvVarProvider();\n\n await OpenFeature.setProviderAndWait(provider);\n\n return OpenFeature.getClient();\n}\n","import type { DocumentModelModule } from \"@powerhousedao/shared/document-model\";\nimport { childLogger } from \"document-model\";\nimport { access } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { ViteDevServer } from \"vite\";\nimport { createServer } from \"vite\";\n\ninterface IPackageLoader {\n load(): Promise<DocumentModelModule[]>;\n onDocumentModelsChange(\n callback: (models: DocumentModelModule[]) => void,\n ): Promise<() => void>;\n}\n\nfunction debounce<T extends (...args: any[]) => void>(\n func: T,\n delay = 100,\n): (...args: Parameters<T>) => void {\n let timeoutId: ReturnType<typeof setTimeout>;\n return (...args: Parameters<T>): void => {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => func(...args), delay);\n };\n}\n\nfunction isSubpath(parent: string, dir: string) {\n const relative = path.relative(parent, dir);\n return relative && !relative.startsWith(\"..\") && !path.isAbsolute(relative);\n}\n\nexport class VitePackageLoader implements IPackageLoader {\n private readonly logger = childLogger([\"reactor-mcp\", \"vite-loader\"]);\n\n private readonly root: string;\n private readonly documentModelsDir: string;\n\n private vite: ViteDevServer | undefined;\n\n readonly name = \"VitePackageLoader\";\n\n constructor(root: string, documentModelsDir: string) {\n this.root = root;\n this.documentModelsDir = documentModelsDir;\n }\n\n private get fullPath(): string {\n return path.join(this.root, this.documentModelsDir);\n }\n\n private async initVite() {\n if (this.vite) {\n return this.vite;\n }\n\n this.vite = await createServer({\n root: this.root,\n logLevel: \"info\",\n server: {\n hmr: false,\n middlewareMode: true,\n warmup: {\n ssrFiles: [this.fullPath],\n },\n fs: {\n allow: [this.fullPath],\n },\n },\n optimizeDeps: {\n // It's recommended to disable deps optimization\n noDiscovery: true,\n include: [],\n },\n });\n\n return this.vite;\n }\n\n async load(): Promise<DocumentModelModule[]> {\n const vite = await this.initVite();\n\n await access(this.fullPath);\n this.logger.verbose(\"Loading document models from @path\", this.fullPath);\n\n try {\n const localDMs = (await vite.ssrLoadModule(this.fullPath)) as Record<\n string,\n DocumentModelModule\n >;\n\n const exports = Object.values(localDMs);\n\n // duck type\n const documentModels: DocumentModelModule[] = [];\n for (const dm of exports) {\n if (dm.documentModel) {\n documentModels.push(dm);\n }\n }\n\n this.logger.verbose(\n ` ➜ Loaded ${documentModels.length} Document Models from: ${this.fullPath}`,\n );\n\n return documentModels;\n } catch (e) {\n this.logger.verbose(\n ` ➜ No Document Models found for: ${this.fullPath}${e ? `\\n${JSON.stringify(e)}` : \"\"}`,\n );\n }\n\n return [];\n }\n\n async onDocumentModelsChange(\n callback: (models: DocumentModelModule[]) => void,\n ) {\n const vite = await this.initVite();\n const listener = debounce(async (changedPath: string) => {\n if (isSubpath(this.fullPath, changedPath)) {\n const documentModels = await this.load();\n callback(documentModels);\n }\n }, 100);\n vite.watcher.on(\"change\", listener);\n\n return () => {\n vite.watcher.off(\"change\", listener);\n };\n }\n}\n","import { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { ReactorBuilder, ReactorClientBuilder } from \"@powerhousedao/reactor\";\nimport { reactorDriveDocumentModelModule } from \"@powerhousedao/reactor-drive\";\nimport { driveDocumentModelModule } from \"@powerhousedao/shared/document-drive\";\nimport type { DocumentModelModule } from \"@powerhousedao/shared/document-model\";\nimport { documentModelDocumentModelModule } from \"document-model\";\nimport { initFeatureFlags } from \"../feature-flags.js\";\nimport { logger } from \"../logger.js\";\nimport { createServer } from \"../server.js\";\nimport { VitePackageLoader } from \"./loader.js\";\n\nexport interface IMcpOptions {\n remoteDrive?: string;\n root?: string;\n documentModelsDir?: string;\n}\n\nconst baseDocumentModels: DocumentModelModule<any>[] = [\n documentModelDocumentModelModule,\n driveDocumentModelModule,\n reactorDriveDocumentModelModule,\n];\n\nasync function createReactorClient(documentModels: DocumentModelModule[]) {\n const reactorBuilder = new ReactorBuilder().withDocumentModels(\n baseDocumentModels.concat(documentModels),\n );\n\n const module = await new ReactorClientBuilder()\n .withReactorBuilder(reactorBuilder)\n .buildModule();\n\n return module;\n}\n\nexport async function initStdioMcpServer(options?: IMcpOptions) {\n const {\n remoteDrive,\n root,\n documentModelsDir = \"./document-models\",\n } = options ?? {};\n\n // initialize feature flags\n await initFeatureFlags();\n\n // if root of project is passed then loads local document models\n let documentModelsLoader: VitePackageLoader | undefined;\n const documentModels: DocumentModelModule[] = [];\n\n if (root) {\n documentModelsLoader = new VitePackageLoader(root, documentModelsDir);\n try {\n const loadedModels = await documentModelsLoader.load();\n documentModels.push(...loadedModels);\n logger.info(\n \"Loaded document models: @models\",\n loadedModels.map((m) => m.documentModel.global.name).join(\", \"),\n );\n } catch (e) {\n logger.error(\"@error\", e);\n }\n }\n\n // initializes reactor client with loaded document models\n const reactorModule = await createReactorClient(documentModels);\n const { client, reactor, reactorModule: rModule } = reactorModule;\n\n // listens for changes in the local document models to update the reactor\n if (documentModelsLoader && rModule?.documentModelRegistry) {\n const unsubscribe = await documentModelsLoader.onDocumentModelsChange(\n (models) => {\n const results = rModule.documentModelRegistry.registerModules(\n ...baseDocumentModels.concat(models),\n );\n for (const result of results) {\n if (result.status === \"error\") {\n logger.error(\n \"Failed to register document model: @error\",\n result.error,\n );\n }\n }\n },\n );\n\n process.on(\"exit\", () => {\n unsubscribe();\n reactor.kill();\n });\n }\n\n // if a remote drive is passed, log a warning since remote drives\n // are now handled at a different level (SyncManager)\n if (remoteDrive) {\n logger.warn(\n \"Remote drive configuration via MCP is not supported in the new reactor. \" +\n \"Remote drives should be configured at the server level.\",\n );\n }\n\n // starts the server\n // Note: syncManager is not available in stdio mode currently\n const server = await createServer({ client });\n\n // starts Stdio transport\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n","import { logger } from \"./logger.js\";\nimport { initStdioMcpServer } from \"./stdio/index.js\";\n\ninitStdioMcpServer({\n remoteDrive: process.argv.at(2),\n root: process.cwd(),\n}).catch((error: unknown) => {\n logger.error(\"@error\", error);\n process.exit(1);\n});\n"],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -29,7 +29,7 @@ async function setupMcpServer(options, httpAdapter, createTransport = (opts) =>
29
29
  await server.connect(transport);
30
30
  await transport.handleRequest(req, res, body);
31
31
  } catch (error) {
32
- logger.error("Error handling MCP request:", error);
32
+ logger.error("Error handling MCP request: @error", error);
33
33
  if (!res.headersSent) res.writeHead(500, { "Content-Type": "application/json" }).end(INTERNAL_SERVER_ERROR);
34
34
  }
35
35
  });
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/mcp-routes.ts"],"sourcesContent":["import { StreamableHTTPServerTransport } from \"@modelcontextprotocol/sdk/server/streamableHttp.js\";\nimport type { IReactorClient, ISyncManager } from \"@powerhousedao/reactor\";\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\n\n/** Minimal interface for an HTTP adapter that supports Node.js-style route handlers. */\ninterface NodeRouteAdapter {\n mountNodeRoute(\n method: \"DELETE\" | \"GET\" | \"POST\",\n path: string,\n handler: (\n req: IncomingMessage,\n res: ServerResponse,\n body?: unknown,\n ) => void | Promise<void>,\n ): void;\n}\nimport { logger } from \"./logger.js\";\nimport { createServer } from \"./server.js\";\n\nexport interface SetupMcpServerOptions {\n client: IReactorClient;\n syncManager?: ISyncManager;\n}\n\nconst METHOD_NOT_ALLOWED = JSON.stringify({\n jsonrpc: \"2.0\",\n error: { code: -32000, message: \"Method not allowed.\" },\n id: null,\n});\n\nconst INTERNAL_SERVER_ERROR = JSON.stringify({\n jsonrpc: \"2.0\",\n error: { code: -32603, message: \"Internal server error\" },\n id: null,\n});\n\n/** @internal Injected in tests to avoid relying on constructor mock semantics. */\ntype TransportFactory = (opts: {\n sessionIdGenerator: undefined;\n}) => InstanceType<typeof StreamableHTTPServerTransport>;\n\nexport async function setupMcpServer(\n options: SetupMcpServerOptions,\n httpAdapter: NodeRouteAdapter,\n // Allow tests to inject a factory function instead of relying on `new vi.fn()`\n // constructor semantics, which differ between macOS and Linux environments.\n createTransport: TransportFactory = (opts) =>\n new StreamableHTTPServerTransport(opts),\n): Promise<void> {\n httpAdapter.mountNodeRoute(\n \"POST\",\n \"/mcp\",\n async (req: IncomingMessage, res: ServerResponse, body?: unknown) => {\n // Stateless mode: every request owns its McpServer + transport so\n // concurrent or slow handlers cannot collide on a shared Protocol\n // instance (which throws \"Already connected to a transport\").\n try {\n const server = await createServer(options);\n const transport = createTransport({ sessionIdGenerator: undefined });\n res.on(\"close\", () => {\n void transport.close();\n void server.close();\n });\n await server.connect(transport);\n await transport.handleRequest(req, res, body);\n } catch (error) {\n logger.error(\"Error handling MCP request:\", error);\n if (!res.headersSent) {\n res\n .writeHead(500, { \"Content-Type\": \"application/json\" })\n .end(INTERNAL_SERVER_ERROR);\n }\n }\n },\n );\n\n // SSE notifications not supported in stateless mode\n httpAdapter.mountNodeRoute(\n \"GET\",\n \"/mcp\",\n (_req: IncomingMessage, res: ServerResponse) => {\n res.writeHead(405).end(METHOD_NOT_ALLOWED);\n },\n );\n\n // Session termination not needed in stateless mode\n httpAdapter.mountNodeRoute(\n \"DELETE\",\n \"/mcp\",\n (_req: IncomingMessage, res: ServerResponse) => {\n res.writeHead(405).end(METHOD_NOT_ALLOWED);\n },\n );\n}\n"],"mappings":";;;AAwBA,MAAM,qBAAqB,KAAK,UAAU;CACxC,SAAS;CACT,OAAO;EAAE,MAAM;EAAQ,SAAS;EAAuB;CACvD,IAAI;CACL,CAAC;AAEF,MAAM,wBAAwB,KAAK,UAAU;CAC3C,SAAS;CACT,OAAO;EAAE,MAAM;EAAQ,SAAS;EAAyB;CACzD,IAAI;CACL,CAAC;AAOF,eAAsB,eACpB,SACA,aAGA,mBAAqC,SACnC,IAAI,8BAA8B,KAAK,EAC1B;AACf,aAAY,eACV,QACA,QACA,OAAO,KAAsB,KAAqB,SAAmB;AAInE,MAAI;GACF,MAAM,SAAS,MAAM,aAAa,QAAQ;GAC1C,MAAM,YAAY,gBAAgB,EAAE,oBAAoB,KAAA,GAAW,CAAC;AACpE,OAAI,GAAG,eAAe;AACf,cAAU,OAAO;AACjB,WAAO,OAAO;KACnB;AACF,SAAM,OAAO,QAAQ,UAAU;AAC/B,SAAM,UAAU,cAAc,KAAK,KAAK,KAAK;WACtC,OAAO;AACd,UAAO,MAAM,+BAA+B,MAAM;AAClD,OAAI,CAAC,IAAI,YACP,KACG,UAAU,KAAK,EAAE,gBAAgB,oBAAoB,CAAC,CACtD,IAAI,sBAAsB;;GAIpC;AAGD,aAAY,eACV,OACA,SACC,MAAuB,QAAwB;AAC9C,MAAI,UAAU,IAAI,CAAC,IAAI,mBAAmB;GAE7C;AAGD,aAAY,eACV,UACA,SACC,MAAuB,QAAwB;AAC9C,MAAI,UAAU,IAAI,CAAC,IAAI,mBAAmB;GAE7C"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/mcp-routes.ts"],"sourcesContent":["import { StreamableHTTPServerTransport } from \"@modelcontextprotocol/sdk/server/streamableHttp.js\";\nimport type { IReactorClient, ISyncManager } from \"@powerhousedao/reactor\";\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\n\n/** Minimal interface for an HTTP adapter that supports Node.js-style route handlers. */\ninterface NodeRouteAdapter {\n mountNodeRoute(\n method: \"DELETE\" | \"GET\" | \"POST\",\n path: string,\n handler: (\n req: IncomingMessage,\n res: ServerResponse,\n body?: unknown,\n ) => void | Promise<void>,\n ): void;\n}\nimport { logger } from \"./logger.js\";\nimport { createServer } from \"./server.js\";\n\nexport interface SetupMcpServerOptions {\n client: IReactorClient;\n syncManager?: ISyncManager;\n}\n\nconst METHOD_NOT_ALLOWED = JSON.stringify({\n jsonrpc: \"2.0\",\n error: { code: -32000, message: \"Method not allowed.\" },\n id: null,\n});\n\nconst INTERNAL_SERVER_ERROR = JSON.stringify({\n jsonrpc: \"2.0\",\n error: { code: -32603, message: \"Internal server error\" },\n id: null,\n});\n\n/** @internal Injected in tests to avoid relying on constructor mock semantics. */\ntype TransportFactory = (opts: {\n sessionIdGenerator: undefined;\n}) => InstanceType<typeof StreamableHTTPServerTransport>;\n\nexport async function setupMcpServer(\n options: SetupMcpServerOptions,\n httpAdapter: NodeRouteAdapter,\n // Allow tests to inject a factory function instead of relying on `new vi.fn()`\n // constructor semantics, which differ between macOS and Linux environments.\n createTransport: TransportFactory = (opts) =>\n new StreamableHTTPServerTransport(opts),\n): Promise<void> {\n httpAdapter.mountNodeRoute(\n \"POST\",\n \"/mcp\",\n async (req: IncomingMessage, res: ServerResponse, body?: unknown) => {\n // Stateless mode: every request owns its McpServer + transport so\n // concurrent or slow handlers cannot collide on a shared Protocol\n // instance (which throws \"Already connected to a transport\").\n try {\n const server = await createServer(options);\n const transport = createTransport({ sessionIdGenerator: undefined });\n res.on(\"close\", () => {\n void transport.close();\n void server.close();\n });\n await server.connect(transport);\n await transport.handleRequest(req, res, body);\n } catch (error) {\n logger.error(\"Error handling MCP request: @error\", error);\n if (!res.headersSent) {\n res\n .writeHead(500, { \"Content-Type\": \"application/json\" })\n .end(INTERNAL_SERVER_ERROR);\n }\n }\n },\n );\n\n // SSE notifications not supported in stateless mode\n httpAdapter.mountNodeRoute(\n \"GET\",\n \"/mcp\",\n (_req: IncomingMessage, res: ServerResponse) => {\n res.writeHead(405).end(METHOD_NOT_ALLOWED);\n },\n );\n\n // Session termination not needed in stateless mode\n httpAdapter.mountNodeRoute(\n \"DELETE\",\n \"/mcp\",\n (_req: IncomingMessage, res: ServerResponse) => {\n res.writeHead(405).end(METHOD_NOT_ALLOWED);\n },\n );\n}\n"],"mappings":";;;AAwBA,MAAM,qBAAqB,KAAK,UAAU;CACxC,SAAS;CACT,OAAO;EAAE,MAAM;EAAQ,SAAS;EAAuB;CACvD,IAAI;CACL,CAAC;AAEF,MAAM,wBAAwB,KAAK,UAAU;CAC3C,SAAS;CACT,OAAO;EAAE,MAAM;EAAQ,SAAS;EAAyB;CACzD,IAAI;CACL,CAAC;AAOF,eAAsB,eACpB,SACA,aAGA,mBAAqC,SACnC,IAAI,8BAA8B,KAAK,EAC1B;AACf,aAAY,eACV,QACA,QACA,OAAO,KAAsB,KAAqB,SAAmB;AAInE,MAAI;GACF,MAAM,SAAS,MAAM,aAAa,QAAQ;GAC1C,MAAM,YAAY,gBAAgB,EAAE,oBAAoB,KAAA,GAAW,CAAC;AACpE,OAAI,GAAG,eAAe;AACf,cAAU,OAAO;AACjB,WAAO,OAAO;KACnB;AACF,SAAM,OAAO,QAAQ,UAAU;AAC/B,SAAM,UAAU,cAAc,KAAK,KAAK,KAAK;WACtC,OAAO;AACd,UAAO,MAAM,sCAAsC,MAAM;AACzD,OAAI,CAAC,IAAI,YACP,KACG,UAAU,KAAK,EAAE,gBAAgB,oBAAoB,CAAC,CACtD,IAAI,sBAAsB;;GAIpC;AAGD,aAAY,eACV,OACA,SACC,MAAuB,QAAwB;AAC9C,MAAI,UAAU,IAAI,CAAC,IAAI,mBAAmB;GAE7C;AAGD,aAAY,eACV,UACA,SACC,MAAuB,QAAwB;AAC9C,MAAI,UAAU,IAAI,CAAC,IAAI,mBAAmB;GAE7C"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@powerhousedao/reactor-mcp",
3
- "version": "6.0.2-staging.9",
3
+ "version": "6.1.0-dev.1",
4
4
  "description": "MCP server for document model operations in the Powerhouse ecosystem. For document model creation tasks, consider using the document-model-creator agent which provides a more guided experience.",
5
5
  "type": "module",
6
6
  "repository": {
@@ -35,10 +35,10 @@
35
35
  "change-case": "5.4.4",
36
36
  "vite": "8.0.8",
37
37
  "zod": "4.3.6",
38
- "@powerhousedao/reactor-drive": "6.0.2-staging.9",
39
- "@powerhousedao/shared": "6.0.2-staging.9",
40
- "document-model": "6.0.2-staging.9",
41
- "@powerhousedao/reactor": "6.0.2-staging.9"
38
+ "@powerhousedao/reactor": "6.1.0-dev.1",
39
+ "@powerhousedao/reactor-drive": "6.1.0-dev.1",
40
+ "@powerhousedao/shared": "6.1.0-dev.1",
41
+ "document-model": "6.1.0-dev.1"
42
42
  },
43
43
  "devDependencies": {
44
44
  "@openfeature/core": "1.9.1",