@gravity-platform/miro-bridge 0.1.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/MiroBridge/node/executor.d.ts +19 -0
- package/dist/MiroBridge/node/executor.d.ts.map +1 -0
- package/dist/MiroBridge/node/executor.js +143 -0
- package/dist/MiroBridge/node/executor.js.map +1 -0
- package/dist/MiroBridge/node/index.d.ts +10 -0
- package/dist/MiroBridge/node/index.d.ts.map +1 -0
- package/dist/MiroBridge/node/index.js +87 -0
- package/dist/MiroBridge/node/index.js.map +1 -0
- package/dist/MiroBridge/service/boardStore.d.ts +15 -0
- package/dist/MiroBridge/service/boardStore.d.ts.map +1 -0
- package/dist/MiroBridge/service/boardStore.js +151 -0
- package/dist/MiroBridge/service/boardStore.js.map +1 -0
- package/dist/MiroBridge/service/diagramLayout.d.ts +13 -0
- package/dist/MiroBridge/service/diagramLayout.d.ts.map +1 -0
- package/dist/MiroBridge/service/diagramLayout.js +241 -0
- package/dist/MiroBridge/service/diagramLayout.js.map +1 -0
- package/dist/MiroBridge/service/mcpHandlers.d.ts +18 -0
- package/dist/MiroBridge/service/mcpHandlers.d.ts.map +1 -0
- package/dist/MiroBridge/service/mcpHandlers.js +307 -0
- package/dist/MiroBridge/service/mcpHandlers.js.map +1 -0
- package/dist/MiroBridge/service/mcpSchema.d.ts +490 -0
- package/dist/MiroBridge/service/mcpSchema.d.ts.map +1 -0
- package/dist/MiroBridge/service/mcpSchema.js +262 -0
- package/dist/MiroBridge/service/mcpSchema.js.map +1 -0
- package/dist/MiroBridge/service/miroApi.d.ts +32 -0
- package/dist/MiroBridge/service/miroApi.d.ts.map +1 -0
- package/dist/MiroBridge/service/miroApi.js +262 -0
- package/dist/MiroBridge/service/miroApi.js.map +1 -0
- package/dist/MiroBridge/service/normalise.d.ts +2 -0
- package/dist/MiroBridge/service/normalise.d.ts.map +1 -0
- package/dist/MiroBridge/service/normalise.js +52 -0
- package/dist/MiroBridge/service/normalise.js.map +1 -0
- package/dist/MiroBridge/util/types.d.ts +78 -0
- package/dist/MiroBridge/util/types.d.ts.map +1 -0
- package/dist/MiroBridge/util/types.js +3 -0
- package/dist/MiroBridge/util/types.js.map +1 -0
- package/dist/credentials/index.d.ts +23 -0
- package/dist/credentials/index.d.ts.map +1 -0
- package/dist/credentials/index.js +28 -0
- package/dist/credentials/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +55 -0
- package/dist/index.js.map +1 -0
- package/package.json +25 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type NodeExecutionContext } from "@gravity-platform/plugin-base";
|
|
2
|
+
import type { MiroBridgeConfig, MiroBridgeOutput } from "../util/types";
|
|
3
|
+
declare const PromiseNode: any;
|
|
4
|
+
export default class MiroBridgeExecutor extends PromiseNode<MiroBridgeConfig> {
|
|
5
|
+
constructor();
|
|
6
|
+
/**
|
|
7
|
+
* Workflow channel: fires on graph trigger.
|
|
8
|
+
* Returns whatever board state is cached in Redis (or empty if not yet fetched).
|
|
9
|
+
* The LLM should call get_board_state via MCP to get the live snapshot.
|
|
10
|
+
*/
|
|
11
|
+
protected executeNode(_inputs: Record<string, any>, config: MiroBridgeConfig, context: NodeExecutionContext): Promise<MiroBridgeOutput>;
|
|
12
|
+
/**
|
|
13
|
+
* MCP channel: called by connected LLM nodes.
|
|
14
|
+
* Reads wait for the browser. Writes update Redis and fire-and-forget to the browser.
|
|
15
|
+
*/
|
|
16
|
+
handleServiceCall(method: string, params: any, config: MiroBridgeConfig, context: NodeExecutionContext): Promise<any>;
|
|
17
|
+
}
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../../src/MiroBridge/node/executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAqBxE,QAAA,MAAQ,WAAW,KAAsD,CAAC;AAkC1E,MAAM,CAAC,OAAO,OAAO,kBAAmB,SAAQ,WAAW,CAAC,gBAAgB,CAAC;;IAK3E;;;;OAIG;cACa,WAAW,CACzB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC5B,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,gBAAgB,CAAC;IAY5B;;;OAGG;IACG,iBAAiB,CACrB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,GAAG,EACX,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,GAAG,CAAC;CAuDhB"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const plugin_base_1 = require("@gravity-platform/plugin-base");
|
|
4
|
+
const mcpSchema_1 = require("../service/mcpSchema");
|
|
5
|
+
const mcpHandlers_1 = require("../service/mcpHandlers");
|
|
6
|
+
const boardStore_1 = require("../service/boardStore");
|
|
7
|
+
const normalise_1 = require("../service/normalise");
|
|
8
|
+
const { PromiseNode, executeNodeWithRouting } = (0, plugin_base_1.getPlatformDependencies)();
|
|
9
|
+
const NODE_TYPE = "MiroBridge";
|
|
10
|
+
// Read operations — do NOT re-emit NODE_OUTPUT after these.
|
|
11
|
+
const READ_ONLY_METHODS = new Set(["get_board_state", "get_selection"]);
|
|
12
|
+
const KNOWN_METHODS = new Set([
|
|
13
|
+
"getSchema",
|
|
14
|
+
"get_board_state",
|
|
15
|
+
"get_selection",
|
|
16
|
+
"create_sticky",
|
|
17
|
+
"create_text",
|
|
18
|
+
"create_frame",
|
|
19
|
+
"create_card",
|
|
20
|
+
"create_app_card",
|
|
21
|
+
"create_image",
|
|
22
|
+
"update_item",
|
|
23
|
+
"delete_item",
|
|
24
|
+
"create_connector",
|
|
25
|
+
"add_tag",
|
|
26
|
+
"zoom_to",
|
|
27
|
+
"create_diagram",
|
|
28
|
+
]);
|
|
29
|
+
function resolveKey(context) {
|
|
30
|
+
const chatId = context.publishingContext?.chatId ??
|
|
31
|
+
context.chatId ??
|
|
32
|
+
null;
|
|
33
|
+
if (!chatId)
|
|
34
|
+
return null;
|
|
35
|
+
return (0, boardStore_1.keyFor)(chatId, context.nodeId);
|
|
36
|
+
}
|
|
37
|
+
class MiroBridgeExecutor extends PromiseNode {
|
|
38
|
+
constructor() {
|
|
39
|
+
super(NODE_TYPE);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Workflow channel: fires on graph trigger.
|
|
43
|
+
* Returns whatever board state is cached in Redis (or empty if not yet fetched).
|
|
44
|
+
* The LLM should call get_board_state via MCP to get the live snapshot.
|
|
45
|
+
*/
|
|
46
|
+
async executeNode(_inputs, config, context) {
|
|
47
|
+
const api = context.api;
|
|
48
|
+
const key = resolveKey(context);
|
|
49
|
+
const cached = key ? await (0, boardStore_1.getBoard)(api, key) : null;
|
|
50
|
+
return {
|
|
51
|
+
__outputs: {
|
|
52
|
+
boardState: cached ?? { items: [], connectors: [], tags: [], version: 0, updatedAt: new Date().toISOString() },
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* MCP channel: called by connected LLM nodes.
|
|
58
|
+
* Reads wait for the browser. Writes update Redis and fire-and-forget to the browser.
|
|
59
|
+
*/
|
|
60
|
+
async handleServiceCall(method, params, config, context) {
|
|
61
|
+
if (method === "getSchema")
|
|
62
|
+
return mcpSchema_1.MiroBridgeMCPSchema;
|
|
63
|
+
if (!KNOWN_METHODS.has(method)) {
|
|
64
|
+
return {
|
|
65
|
+
ok: false,
|
|
66
|
+
error: "UNKNOWN_METHOD",
|
|
67
|
+
hint: `Unknown method '${method}'. Available: ${Array.from(KNOWN_METHODS).filter((m) => m !== "getSchema").join(", ")}.`,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
const api = context.api;
|
|
71
|
+
const credentialContext = this.getExecutionContext(context);
|
|
72
|
+
const normalisedParams = (0, normalise_1.normaliseParams)(params ?? {});
|
|
73
|
+
let mcpResult;
|
|
74
|
+
try {
|
|
75
|
+
switch (method) {
|
|
76
|
+
case "get_board_state":
|
|
77
|
+
mcpResult = await (0, mcpHandlers_1.handleGetBoardState)(normalisedParams, config, context, api, credentialContext);
|
|
78
|
+
break;
|
|
79
|
+
case "get_selection":
|
|
80
|
+
mcpResult = await (0, mcpHandlers_1.handleGetSelection)(normalisedParams, config, context, api, credentialContext);
|
|
81
|
+
break;
|
|
82
|
+
case "create_sticky":
|
|
83
|
+
mcpResult = await (0, mcpHandlers_1.handleCreateSticky)(normalisedParams, config, context, api, credentialContext);
|
|
84
|
+
break;
|
|
85
|
+
case "create_text":
|
|
86
|
+
mcpResult = await (0, mcpHandlers_1.handleCreateText)(normalisedParams, config, context, api, credentialContext);
|
|
87
|
+
break;
|
|
88
|
+
case "create_frame":
|
|
89
|
+
mcpResult = await (0, mcpHandlers_1.handleCreateFrame)(normalisedParams, config, context, api, credentialContext);
|
|
90
|
+
break;
|
|
91
|
+
case "create_card":
|
|
92
|
+
mcpResult = await (0, mcpHandlers_1.handleCreateCard)(normalisedParams, config, context, api, credentialContext);
|
|
93
|
+
break;
|
|
94
|
+
case "create_app_card":
|
|
95
|
+
mcpResult = await (0, mcpHandlers_1.handleCreateAppCard)(normalisedParams, config, context, api, credentialContext);
|
|
96
|
+
break;
|
|
97
|
+
case "create_image":
|
|
98
|
+
mcpResult = await (0, mcpHandlers_1.handleCreateImage)(normalisedParams, config, context, api, credentialContext);
|
|
99
|
+
break;
|
|
100
|
+
case "update_item":
|
|
101
|
+
mcpResult = await (0, mcpHandlers_1.handleUpdateItem)(normalisedParams, config, context, api, credentialContext);
|
|
102
|
+
break;
|
|
103
|
+
case "delete_item":
|
|
104
|
+
mcpResult = await (0, mcpHandlers_1.handleDeleteItem)(normalisedParams, config, context, api, credentialContext);
|
|
105
|
+
break;
|
|
106
|
+
case "create_connector":
|
|
107
|
+
mcpResult = await (0, mcpHandlers_1.handleCreateConnector)(normalisedParams, config, context, api, credentialContext);
|
|
108
|
+
break;
|
|
109
|
+
case "add_tag":
|
|
110
|
+
mcpResult = await (0, mcpHandlers_1.handleAddTag)(normalisedParams, config, context, api, credentialContext);
|
|
111
|
+
break;
|
|
112
|
+
case "zoom_to":
|
|
113
|
+
mcpResult = await (0, mcpHandlers_1.handleZoomTo)(normalisedParams, config, context, api, credentialContext);
|
|
114
|
+
break;
|
|
115
|
+
case "create_diagram":
|
|
116
|
+
mcpResult = await (0, mcpHandlers_1.handleCreateDiagram)(normalisedParams, config, context, api, credentialContext);
|
|
117
|
+
break;
|
|
118
|
+
default: return { ok: false, error: "UNKNOWN_METHOD", hint: `Unknown method '${method}'.` };
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
return {
|
|
123
|
+
ok: false,
|
|
124
|
+
error: "EXECUTION_ERROR",
|
|
125
|
+
hint: err?.message ?? "Unknown error",
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
// Re-emit updated board state to the workflow after every write.
|
|
129
|
+
if (!READ_ONLY_METHODS.has(method)) {
|
|
130
|
+
try {
|
|
131
|
+
if (typeof executeNodeWithRouting === "function") {
|
|
132
|
+
await executeNodeWithRouting(this.executeNode.bind(this), {}, config, context);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
catch (err) {
|
|
136
|
+
this.logger.error(`[MiroBridge] executeNodeWithRouting failed: ${err?.message}`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return mcpResult;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
exports.default = MiroBridgeExecutor;
|
|
143
|
+
//# sourceMappingURL=executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../../src/MiroBridge/node/executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type EnhancedNodeDefinition } from "@gravity-platform/plugin-base";
|
|
2
|
+
import MiroBridgeExecutor from "./executor";
|
|
3
|
+
export declare const NODE_TYPE = "MiroBridge";
|
|
4
|
+
declare function createNodeDefinition(): EnhancedNodeDefinition;
|
|
5
|
+
export declare const MiroBridgeNode: {
|
|
6
|
+
definition: any;
|
|
7
|
+
executor: typeof MiroBridgeExecutor;
|
|
8
|
+
};
|
|
9
|
+
export { createNodeDefinition };
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/MiroBridge/node/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,sBAAsB,EAC5B,MAAM,+BAA+B,CAAC;AACvC,OAAO,kBAAkB,MAAM,YAAY,CAAC;AAE5C,eAAO,MAAM,SAAS,eAAe,CAAC;AAEtC,iBAAS,oBAAoB,IAAI,sBAAsB,CAyEtD;AAID,eAAO,MAAM,cAAc;;;CAG1B,CAAC;AAEF,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.MiroBridgeNode = exports.NODE_TYPE = void 0;
|
|
7
|
+
exports.createNodeDefinition = createNodeDefinition;
|
|
8
|
+
const plugin_base_1 = require("@gravity-platform/plugin-base");
|
|
9
|
+
const executor_1 = __importDefault(require("./executor"));
|
|
10
|
+
exports.NODE_TYPE = "MiroBridge";
|
|
11
|
+
function createNodeDefinition() {
|
|
12
|
+
const { NodeInputType } = (0, plugin_base_1.getPlatformDependencies)();
|
|
13
|
+
return {
|
|
14
|
+
packageVersion: "0.1.0",
|
|
15
|
+
type: exports.NODE_TYPE,
|
|
16
|
+
name: "Miro Bridge",
|
|
17
|
+
description: "Connects an LLM to a live Miro board via 10 MCP tools. Commands run in the Miro iframe via the MiroBridge component.",
|
|
18
|
+
category: "Agent Tools",
|
|
19
|
+
color: "#ffdd00",
|
|
20
|
+
template: "service",
|
|
21
|
+
logoUrl: "https://res.cloudinary.com/sonik/image/upload/v1751366180/gravity/icons/gravityIcon.png",
|
|
22
|
+
inputs: [],
|
|
23
|
+
outputs: [
|
|
24
|
+
{
|
|
25
|
+
name: "boardState",
|
|
26
|
+
type: NodeInputType.OBJECT,
|
|
27
|
+
description: "Current board state snapshot: { items[], timestamp }",
|
|
28
|
+
},
|
|
29
|
+
],
|
|
30
|
+
serviceConnectors: [
|
|
31
|
+
{
|
|
32
|
+
name: "mcpService",
|
|
33
|
+
description: "MCP tools for an LLM agent to read and write the Miro board in real time",
|
|
34
|
+
serviceType: "mcp",
|
|
35
|
+
methods: [
|
|
36
|
+
"get_board_state",
|
|
37
|
+
"get_selection",
|
|
38
|
+
"create_sticky",
|
|
39
|
+
"create_text",
|
|
40
|
+
"create_frame",
|
|
41
|
+
"create_shape",
|
|
42
|
+
"create_card",
|
|
43
|
+
"create_app_card",
|
|
44
|
+
"create_image",
|
|
45
|
+
"update_item",
|
|
46
|
+
"delete_item",
|
|
47
|
+
"create_connector",
|
|
48
|
+
"add_tag",
|
|
49
|
+
"zoom_to",
|
|
50
|
+
],
|
|
51
|
+
isService: true,
|
|
52
|
+
},
|
|
53
|
+
],
|
|
54
|
+
configSchema: {
|
|
55
|
+
type: "object",
|
|
56
|
+
properties: {
|
|
57
|
+
defaultX: {
|
|
58
|
+
type: "number",
|
|
59
|
+
title: "Default X position",
|
|
60
|
+
description: "Canvas X coordinate used when a create tool is called without an explicit x. Default 0 (board centre).",
|
|
61
|
+
default: 0,
|
|
62
|
+
},
|
|
63
|
+
defaultY: {
|
|
64
|
+
type: "number",
|
|
65
|
+
title: "Default Y position",
|
|
66
|
+
description: "Canvas Y coordinate used when a create tool is called without an explicit y. Default 0 (board centre).",
|
|
67
|
+
default: 0,
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
required: [],
|
|
71
|
+
},
|
|
72
|
+
credentials: [
|
|
73
|
+
{
|
|
74
|
+
name: "miroCredential",
|
|
75
|
+
type: "miroCredential",
|
|
76
|
+
required: true,
|
|
77
|
+
},
|
|
78
|
+
],
|
|
79
|
+
capabilities: { isTrigger: false },
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
const definition = createNodeDefinition();
|
|
83
|
+
exports.MiroBridgeNode = {
|
|
84
|
+
definition,
|
|
85
|
+
executor: executor_1.default,
|
|
86
|
+
};
|
|
87
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/MiroBridge/node/index.ts"],"names":[],"mappings":";;;;;;AA0FS,oDAAoB;AA1F7B,+DAGuC;AACvC,0DAA4C;AAE/B,QAAA,SAAS,GAAG,YAAY,CAAC;AAEtC,SAAS,oBAAoB;IAC3B,MAAM,EAAE,aAAa,EAAE,GAAG,IAAA,qCAAuB,GAAE,CAAC;IAEpD,OAAO;QACL,cAAc,EAAE,OAAO;QACvB,IAAI,EAAE,iBAAS;QACf,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,sHAAsH;QACnI,QAAQ,EAAE,aAAa;QACvB,KAAK,EAAE,SAAS;QAChB,QAAQ,EAAE,SAAS;QACnB,OAAO,EACL,yFAAyF;QAC3F,MAAM,EAAE,EAAE;QACV,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,YAAY;gBAClB,IAAI,EAAE,aAAa,CAAC,MAAM;gBAC1B,WAAW,EAAE,sDAAsD;aACpE;SACF;QACD,iBAAiB,EAAE;YACjB;gBACE,IAAI,EAAE,YAAY;gBAClB,WAAW,EACT,0EAA0E;gBAC5E,WAAW,EAAE,KAAK;gBAClB,OAAO,EAAE;oBACP,iBAAiB;oBACjB,eAAe;oBACf,eAAe;oBACf,aAAa;oBACb,cAAc;oBACd,cAAc;oBACd,aAAa;oBACb,iBAAiB;oBACjB,cAAc;oBACd,aAAa;oBACb,aAAa;oBACb,kBAAkB;oBAClB,SAAS;oBACT,SAAS;iBACV;gBACD,SAAS,EAAE,IAAI;aAChB;SACF;QACD,YAAY,EAAE;YACZ,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,KAAK,EAAE,oBAAoB;oBAC3B,WAAW,EAAE,wGAAwG;oBACrH,OAAO,EAAE,CAAC;iBACX;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,KAAK,EAAE,oBAAoB;oBAC3B,WAAW,EAAE,wGAAwG;oBACrH,OAAO,EAAE,CAAC;iBACX;aACF;YACD,QAAQ,EAAE,EAAE;SACb;QACD,WAAW,EAAE;YACX;gBACE,IAAI,EAAE,gBAAgB;gBACtB,IAAI,EAAE,gBAAgB;gBACtB,QAAQ,EAAE,IAAI;aACf;SACF;QACD,YAAY,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;KACnC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,GAAG,oBAAoB,EAAE,CAAC;AAE7B,QAAA,cAAc,GAAG;IAC5B,UAAU;IACV,QAAQ,EAAE,kBAAkB;CAC7B,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { BoardState, BoardItem, BoardConnector, BoardTag } from "../util/types";
|
|
2
|
+
export declare function nextItemSlot(_api: any, key: string, parentId: string): number;
|
|
3
|
+
export declare function nextTextSlot(_api: any, key: string, parentId: string): number;
|
|
4
|
+
export declare function nextFrameSlot(_api: any, key: string): number;
|
|
5
|
+
export declare function seedCountersFromBoard(key: string, state: BoardState): void;
|
|
6
|
+
export declare function nextFrameX(api: any, key: string, frameWidth: number): Promise<number>;
|
|
7
|
+
export declare function keyFor(chatId: string, nodeId: string): string;
|
|
8
|
+
export declare function getBoard(api: any, key: string): Promise<BoardState | null>;
|
|
9
|
+
export declare function saveBoard(api: any, key: string, state: BoardState): Promise<void>;
|
|
10
|
+
export declare function applyCreate(api: any, key: string, item: BoardItem): Promise<BoardState>;
|
|
11
|
+
export declare function applyCreateConnector(api: any, key: string, connector: BoardConnector): Promise<BoardState>;
|
|
12
|
+
export declare function applyCreateTag(api: any, key: string, tag: BoardTag): Promise<BoardState>;
|
|
13
|
+
export declare function applyUpdate(api: any, key: string, id: string, changes: Partial<BoardItem>): Promise<BoardState | null>;
|
|
14
|
+
export declare function applyDelete(api: any, key: string, id: string): Promise<BoardState | null>;
|
|
15
|
+
//# sourceMappingURL=boardStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boardStore.d.ts","sourceRoot":"","sources":["../../../src/MiroBridge/service/boardStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAQrF,wBAAgB,YAAY,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAK7E;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAK7E;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAI5D;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI,CAS1E;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAM3F;AAED,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAE7D;AAMD,wBAAsB,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAgBhF;AAED,wBAAsB,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAMvF;AAED,wBAAsB,WAAW,CAC/B,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,SAAS,GACd,OAAO,CAAC,UAAU,CAAC,CAUrB;AAED,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,cAAc,GACxB,OAAO,CAAC,UAAU,CAAC,CAUrB;AAED,wBAAsB,cAAc,CAClC,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,QAAQ,GACZ,OAAO,CAAC,UAAU,CAAC,CAcrB;AAED,wBAAsB,WAAW,CAC/B,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,MAAM,EACX,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,GAC1B,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAS5B;AAED,wBAAsB,WAAW,CAC/B,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,MAAM,EACX,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAa5B"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.nextItemSlot = nextItemSlot;
|
|
4
|
+
exports.nextTextSlot = nextTextSlot;
|
|
5
|
+
exports.nextFrameSlot = nextFrameSlot;
|
|
6
|
+
exports.seedCountersFromBoard = seedCountersFromBoard;
|
|
7
|
+
exports.nextFrameX = nextFrameX;
|
|
8
|
+
exports.keyFor = keyFor;
|
|
9
|
+
exports.getBoard = getBoard;
|
|
10
|
+
exports.saveBoard = saveBoard;
|
|
11
|
+
exports.applyCreate = applyCreate;
|
|
12
|
+
exports.applyCreateConnector = applyCreateConnector;
|
|
13
|
+
exports.applyCreateTag = applyCreateTag;
|
|
14
|
+
exports.applyUpdate = applyUpdate;
|
|
15
|
+
exports.applyDelete = applyDelete;
|
|
16
|
+
const BOARD_TTL = 60 * 60 * 24; // 24h
|
|
17
|
+
const itemSlotCounters = new Map();
|
|
18
|
+
const textSlotCounters = new Map();
|
|
19
|
+
const frameSlotCounters = new Map();
|
|
20
|
+
function nextItemSlot(_api, key, parentId) {
|
|
21
|
+
const counterKey = `${key}:${parentId}`;
|
|
22
|
+
const slot = itemSlotCounters.get(counterKey) ?? 0;
|
|
23
|
+
itemSlotCounters.set(counterKey, slot + 1);
|
|
24
|
+
return slot;
|
|
25
|
+
}
|
|
26
|
+
function nextTextSlot(_api, key, parentId) {
|
|
27
|
+
const counterKey = `${key}:text:${parentId}`;
|
|
28
|
+
const slot = textSlotCounters.get(counterKey) ?? 0;
|
|
29
|
+
textSlotCounters.set(counterKey, slot + 1);
|
|
30
|
+
return slot;
|
|
31
|
+
}
|
|
32
|
+
function nextFrameSlot(_api, key) {
|
|
33
|
+
const slot = frameSlotCounters.get(key) ?? 0;
|
|
34
|
+
frameSlotCounters.set(key, slot + 1);
|
|
35
|
+
return slot;
|
|
36
|
+
}
|
|
37
|
+
function seedCountersFromBoard(key, state) {
|
|
38
|
+
const frames = state.items.filter((i) => i.type === "frame");
|
|
39
|
+
frameSlotCounters.set(key, frames.length);
|
|
40
|
+
for (const frame of frames) {
|
|
41
|
+
const children = state.items.filter((i) => i.parentId === frame.id && i.type !== "frame" && i.type !== "text");
|
|
42
|
+
itemSlotCounters.set(`${key}:${frame.id}`, children.length);
|
|
43
|
+
const texts = state.items.filter((i) => i.parentId === frame.id && i.type === "text");
|
|
44
|
+
textSlotCounters.set(`${key}:text:${frame.id}`, texts.length);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async function nextFrameX(api, key, frameWidth) {
|
|
48
|
+
const board = await getBoard(api, key);
|
|
49
|
+
if (!board)
|
|
50
|
+
return 0;
|
|
51
|
+
const frames = board.items.filter((i) => i.type === "frame");
|
|
52
|
+
if (frames.length === 0)
|
|
53
|
+
return 0;
|
|
54
|
+
return frames.reduce((acc, f) => acc + (f.width ?? 1600) + 200, 0);
|
|
55
|
+
}
|
|
56
|
+
function keyFor(chatId, nodeId) {
|
|
57
|
+
return `miro:${chatId}:${nodeId}`;
|
|
58
|
+
}
|
|
59
|
+
function emptyBoard() {
|
|
60
|
+
return { items: [], connectors: [], tags: [], version: 0, updatedAt: new Date().toISOString() };
|
|
61
|
+
}
|
|
62
|
+
async function getBoard(api, key) {
|
|
63
|
+
try {
|
|
64
|
+
const raw = await api.redis?.get(key);
|
|
65
|
+
if (!raw)
|
|
66
|
+
return null;
|
|
67
|
+
const parsed = JSON.parse(raw);
|
|
68
|
+
// backfill missing fields for boards saved before connectors/tags were added
|
|
69
|
+
return {
|
|
70
|
+
items: parsed.items ?? [],
|
|
71
|
+
connectors: parsed.connectors ?? [],
|
|
72
|
+
tags: parsed.tags ?? [],
|
|
73
|
+
version: parsed.version ?? 0,
|
|
74
|
+
updatedAt: parsed.updatedAt ?? new Date().toISOString(),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
async function saveBoard(api, key, state) {
|
|
82
|
+
try {
|
|
83
|
+
await api.redis?.set(key, JSON.stringify(state), "EX", BOARD_TTL);
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
// best-effort
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
async function applyCreate(api, key, item) {
|
|
90
|
+
const board = (await getBoard(api, key)) ?? emptyBoard();
|
|
91
|
+
const next = {
|
|
92
|
+
...board,
|
|
93
|
+
items: [...board.items, item],
|
|
94
|
+
version: board.version + 1,
|
|
95
|
+
updatedAt: new Date().toISOString(),
|
|
96
|
+
};
|
|
97
|
+
await saveBoard(api, key, next);
|
|
98
|
+
return next;
|
|
99
|
+
}
|
|
100
|
+
async function applyCreateConnector(api, key, connector) {
|
|
101
|
+
const board = (await getBoard(api, key)) ?? emptyBoard();
|
|
102
|
+
const next = {
|
|
103
|
+
...board,
|
|
104
|
+
connectors: [...board.connectors, connector],
|
|
105
|
+
version: board.version + 1,
|
|
106
|
+
updatedAt: new Date().toISOString(),
|
|
107
|
+
};
|
|
108
|
+
await saveBoard(api, key, next);
|
|
109
|
+
return next;
|
|
110
|
+
}
|
|
111
|
+
async function applyCreateTag(api, key, tag) {
|
|
112
|
+
const board = (await getBoard(api, key)) ?? emptyBoard();
|
|
113
|
+
// If tag with same title already exists, merge item IDs onto it
|
|
114
|
+
const existing = board.tags.find((t) => t.title === tag.title && t.color === tag.color);
|
|
115
|
+
const tags = existing
|
|
116
|
+
? board.tags.map((t) => t === existing
|
|
117
|
+
? { ...t, itemIds: [...new Set([...t.itemIds, ...tag.itemIds])] }
|
|
118
|
+
: t)
|
|
119
|
+
: [...board.tags, tag];
|
|
120
|
+
const next = { ...board, tags, version: board.version + 1, updatedAt: new Date().toISOString() };
|
|
121
|
+
await saveBoard(api, key, next);
|
|
122
|
+
return next;
|
|
123
|
+
}
|
|
124
|
+
async function applyUpdate(api, key, id, changes) {
|
|
125
|
+
const board = await getBoard(api, key);
|
|
126
|
+
if (!board)
|
|
127
|
+
return null;
|
|
128
|
+
const idx = board.items.findIndex((i) => i.id === id);
|
|
129
|
+
if (idx === -1)
|
|
130
|
+
return null;
|
|
131
|
+
const items = board.items.map((item, i) => i === idx ? { ...item, ...changes } : item);
|
|
132
|
+
const next = { ...board, items, version: board.version + 1, updatedAt: new Date().toISOString() };
|
|
133
|
+
await saveBoard(api, key, next);
|
|
134
|
+
return next;
|
|
135
|
+
}
|
|
136
|
+
async function applyDelete(api, key, id) {
|
|
137
|
+
const board = await getBoard(api, key);
|
|
138
|
+
if (!board)
|
|
139
|
+
return null;
|
|
140
|
+
const next = {
|
|
141
|
+
...board,
|
|
142
|
+
items: board.items.filter((i) => i.id !== id),
|
|
143
|
+
connectors: board.connectors.filter((c) => c.startItemId !== id && c.endItemId !== id),
|
|
144
|
+
tags: board.tags.map((t) => ({ ...t, itemIds: t.itemIds.filter((iid) => iid !== id) })),
|
|
145
|
+
version: board.version + 1,
|
|
146
|
+
updatedAt: new Date().toISOString(),
|
|
147
|
+
};
|
|
148
|
+
await saveBoard(api, key, next);
|
|
149
|
+
return next;
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=boardStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boardStore.js","sourceRoot":"","sources":["../../../src/MiroBridge/service/boardStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { DiagramNode, DiagramEdge, DiagramLayout, DiagramNodeShape, MiroShapeType } from "../util/types";
|
|
2
|
+
declare const NODE_WIDTH = 180;
|
|
3
|
+
declare const NODE_HEIGHT = 120;
|
|
4
|
+
export declare function parseMermaid(dsl: string): {
|
|
5
|
+
nodes: DiagramNode[];
|
|
6
|
+
edges: DiagramEdge[];
|
|
7
|
+
direction: "TB" | "LR";
|
|
8
|
+
};
|
|
9
|
+
export declare function computeLayout(nodes: DiagramNode[], edges: DiagramEdge[], direction: "TB" | "LR"): DiagramLayout;
|
|
10
|
+
export declare function miroShapeFor(nodeShape: DiagramNodeShape): MiroShapeType;
|
|
11
|
+
export declare function fillColorFor(nodeShape: DiagramNodeShape): string;
|
|
12
|
+
export { NODE_WIDTH, NODE_HEIGHT };
|
|
13
|
+
//# sourceMappingURL=diagramLayout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagramLayout.d.ts","sourceRoot":"","sources":["../../../src/MiroBridge/service/diagramLayout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,gBAAgB,EAAE,aAAa,EAAkB,MAAM,eAAe,CAAC;AAE9H,QAAA,MAAM,UAAU,MAAM,CAAC;AACvB,QAAA,MAAM,WAAW,MAAM,CAAC;AA4BxB,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,WAAW,EAAE,CAAC;IAAC,KAAK,EAAE,WAAW,EAAE,CAAC;IAAC,SAAS,EAAE,IAAI,GAAG,IAAI,CAAA;CAAE,CAgEhH;AAID,wBAAgB,aAAa,CAC3B,KAAK,EAAE,WAAW,EAAE,EACpB,KAAK,EAAE,WAAW,EAAE,EACpB,SAAS,EAAE,IAAI,GAAG,IAAI,GACrB,aAAa,CAsHf;AASD,wBAAgB,YAAY,CAAC,SAAS,EAAE,gBAAgB,GAAG,aAAa,CASvE;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,gBAAgB,GAAG,MAAM,CAQhE;AAED,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC"}
|