@powerhousedao/reactor-mcp 4.1.0-dev.4 → 4.1.0-dev.7

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/src/cli.js CHANGED
@@ -1,5 +1,8 @@
1
1
  import { init } from "./index.js";
2
- init().catch((error) => {
2
+ init({
3
+ remoteDrive: process.argv.at(2),
4
+ root: process.cwd(),
5
+ }).catch((error) => {
3
6
  console.error(error);
4
7
  process.exit(1);
5
8
  });
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAElC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC9B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAElC,IAAI,CAAC;IACH,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/B,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE;CACpB,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC1B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -1,2 +1,7 @@
1
- export declare function init(): Promise<void>;
1
+ export interface IMcpOptions {
2
+ remoteDrive?: string;
3
+ root?: string;
4
+ documentModelsDir?: string;
5
+ }
6
+ export declare function init(options?: IMcpOptions): Promise<void>;
2
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAIA,wBAAsB,IAAI,kBAOzB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAkBD,wBAAsB,IAAI,CAAC,OAAO,CAAC,EAAE,WAAW,iBA2E/C"}
package/dist/src/index.js CHANGED
@@ -1,10 +1,78 @@
1
1
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
2
- import { initDocumentModelMcp } from "./reactor.js";
2
+ import { driveDocumentModelModule, ReactorBuilder } from "document-drive";
3
+ import { documentModelDocumentModelModule, generateId, } from "document-model";
4
+ import { VitePackageLoader } from "./loader.js";
3
5
  import { createServer } from "./server.js";
4
- export async function init() {
5
- const documentModelMcp = await initDocumentModelMcp();
6
- const server = createServer(documentModelMcp);
7
- // Start receiving messages on stdin and sending messages on stdout
6
+ const baseDocumentModels = [
7
+ documentModelDocumentModelModule,
8
+ driveDocumentModelModule,
9
+ ];
10
+ async function createReactor(documentModels = []) {
11
+ const builder = new ReactorBuilder(baseDocumentModels.concat(documentModels));
12
+ // .withStorage(
13
+ // new FilesystemStorage("./.ph/mcp/storage"),
14
+ // );
15
+ const reactor = builder.build();
16
+ await reactor.initialize();
17
+ return reactor;
18
+ }
19
+ export async function init(options) {
20
+ const { remoteDrive, root, documentModelsDir = "./document-models", } = options ?? {};
21
+ // if root of project is passed then loads local document models
22
+ let documentModelsLoader;
23
+ const documentModels = [];
24
+ if (root) {
25
+ documentModelsLoader = new VitePackageLoader(root, documentModelsDir);
26
+ try {
27
+ const loadedModels = await documentModelsLoader.load();
28
+ documentModels.push(...loadedModels);
29
+ console.log("Loaded document models:", loadedModels.map((m) => m.documentModel.name).join(", "));
30
+ }
31
+ catch (e) {
32
+ console.error(e);
33
+ }
34
+ }
35
+ // initializes reactor with loaded document models
36
+ const reactor = await createReactor(documentModels);
37
+ // listens for changes in the local document models to update the reactor
38
+ if (documentModelsLoader) {
39
+ const unsubscribe = await documentModelsLoader.onDocumentModelsChange((models) => {
40
+ reactor.setDocumentModelModules(baseDocumentModels.concat(models));
41
+ });
42
+ process.on("exit", () => {
43
+ unsubscribe();
44
+ });
45
+ }
46
+ // if a remote drive is passed then adds it to the reactor
47
+ if (remoteDrive) {
48
+ await reactor.addRemoteDrive(remoteDrive, {
49
+ sharingType: "PUBLIC",
50
+ availableOffline: true,
51
+ listeners: [
52
+ {
53
+ block: true,
54
+ callInfo: {
55
+ data: remoteDrive,
56
+ name: "switchboard-push",
57
+ transmitterType: "SwitchboardPush",
58
+ },
59
+ filter: {
60
+ branch: ["main"],
61
+ documentId: ["*"],
62
+ documentType: ["*"],
63
+ scope: ["global"],
64
+ },
65
+ label: "Switchboard Sync",
66
+ listenerId: generateId(),
67
+ system: true,
68
+ },
69
+ ],
70
+ triggers: [],
71
+ });
72
+ }
73
+ // starts the server
74
+ const server = await createServer(reactor);
75
+ // starts Stdio transport
8
76
  const transport = new StdioServerTransport();
9
77
  await server.connect(transport);
10
78
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,CAAC,KAAK,UAAU,IAAI;IACxB,MAAM,gBAAgB,GAAG,MAAM,oBAAoB,EAAE,CAAC;IACtD,MAAM,MAAM,GAAG,YAAY,CAAC,gBAAgB,CAAC,CAAC;IAE9C,mEAAmE;IACnE,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { type DocumentModelModule } from "document-model";
2
+ interface IPackageLoader {
3
+ load(): Promise<DocumentModelModule[]>;
4
+ onDocumentModelsChange(callback: (models: DocumentModelModule[]) => void): Promise<() => void>;
5
+ }
6
+ export declare class VitePackageLoader implements IPackageLoader {
7
+ private readonly logger;
8
+ private readonly root;
9
+ private readonly documentModelsDir;
10
+ private vite;
11
+ constructor(root: string, documentModelsDir: string);
12
+ private get fullPath();
13
+ private initVite;
14
+ load(): Promise<DocumentModelModule[]>;
15
+ onDocumentModelsChange(callback: (models: DocumentModelModule[]) => void): Promise<() => void>;
16
+ }
17
+ export {};
18
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/loader.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAK1D,UAAU,cAAc;IACtB,IAAI,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;IACvC,sBAAsB,CACpB,QAAQ,EAAE,CAAC,MAAM,EAAE,mBAAmB,EAAE,KAAK,IAAI,GAChD,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;CACxB;AAaD,qBAAa,iBAAkB,YAAW,cAAc;IACtD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiD;IAExE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAE3C,OAAO,CAAC,IAAI,CAA4B;gBAE5B,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM;IAKnD,OAAO,KAAK,QAAQ,GAEnB;YAEa,QAAQ;IA4BhB,IAAI,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAqCtC,sBAAsB,CAC1B,QAAQ,EAAE,CAAC,MAAM,EAAE,mBAAmB,EAAE,KAAK,IAAI;CAepD"}
@@ -0,0 +1,86 @@
1
+ import { childLogger } from "document-drive";
2
+ import { access } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { createServer } from "vite";
5
+ function debounce(func, delay = 100) {
6
+ let timeoutId;
7
+ return (...args) => {
8
+ clearTimeout(timeoutId);
9
+ timeoutId = setTimeout(() => func(...args), delay);
10
+ };
11
+ }
12
+ export class VitePackageLoader {
13
+ logger = childLogger(["reactor-local", "vite-loader"]);
14
+ root;
15
+ documentModelsDir;
16
+ vite;
17
+ constructor(root, documentModelsDir) {
18
+ this.root = root;
19
+ this.documentModelsDir = documentModelsDir;
20
+ }
21
+ get fullPath() {
22
+ return path.join(this.root, this.documentModelsDir);
23
+ }
24
+ async initVite() {
25
+ if (this.vite) {
26
+ return this.vite;
27
+ }
28
+ this.vite = await createServer({
29
+ root: this.root,
30
+ logLevel: "info",
31
+ server: {
32
+ hmr: false,
33
+ middlewareMode: true,
34
+ warmup: {
35
+ ssrFiles: [this.fullPath],
36
+ },
37
+ fs: {
38
+ allow: [this.fullPath],
39
+ },
40
+ },
41
+ optimizeDeps: {
42
+ // It's recommended to disable deps optimization
43
+ noDiscovery: true,
44
+ include: [],
45
+ },
46
+ });
47
+ return this.vite;
48
+ }
49
+ async load() {
50
+ const vite = await this.initVite();
51
+ await access(this.fullPath);
52
+ this.logger.verbose("Loading document models from", this.fullPath);
53
+ try {
54
+ const localDMs = (await vite.ssrLoadModule(this.fullPath));
55
+ const exports = Object.values(localDMs);
56
+ // duck type
57
+ const documentModels = [];
58
+ for (const dm of exports) {
59
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
60
+ if (dm.documentModel) {
61
+ documentModels.push(dm);
62
+ }
63
+ }
64
+ this.logger.verbose(` ➜ Loaded ${documentModels.length} Document Models from: ${this.fullPath}`);
65
+ return documentModels;
66
+ }
67
+ catch (e) {
68
+ this.logger.verbose(` ➜ No Document Models found for: ${this.fullPath}${e ? `\n${JSON.stringify(e)}` : ""}`);
69
+ }
70
+ return [];
71
+ }
72
+ async onDocumentModelsChange(callback) {
73
+ const vite = await this.initVite();
74
+ const listener = debounce(async (changedPath) => {
75
+ if (path.matchesGlob(changedPath, path.join(this.fullPath, "**"))) {
76
+ const documentModels = await this.load();
77
+ callback(documentModels);
78
+ }
79
+ }, 100);
80
+ vite.watcher.on("change", listener);
81
+ return () => {
82
+ vite.watcher.off("change", listener);
83
+ };
84
+ }
85
+ }
86
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/loader.ts"],"names":[],"mappings":"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"}