@lukawi/toporealm 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/LICENSE +21 -0
  2. package/README.en.md +113 -0
  3. package/README.md +115 -0
  4. package/dist/cli/index.d.ts +46 -0
  5. package/dist/cli/index.d.ts.map +1 -0
  6. package/dist/cli/index.js +276 -0
  7. package/dist/cli/index.js.map +1 -0
  8. package/dist/cli/main.d.ts +3 -0
  9. package/dist/cli/main.d.ts.map +1 -0
  10. package/dist/cli/main.js +48 -0
  11. package/dist/cli/main.js.map +1 -0
  12. package/dist/core/errors.d.ts +16 -0
  13. package/dist/core/errors.d.ts.map +1 -0
  14. package/dist/core/errors.js +40 -0
  15. package/dist/core/errors.js.map +1 -0
  16. package/dist/core/index.d.ts +9 -0
  17. package/dist/core/index.d.ts.map +1 -0
  18. package/dist/core/index.js +9 -0
  19. package/dist/core/index.js.map +1 -0
  20. package/dist/core/store.d.ts +27 -0
  21. package/dist/core/store.d.ts.map +1 -0
  22. package/dist/core/store.js +390 -0
  23. package/dist/core/store.js.map +1 -0
  24. package/dist/core/types.d.ts +108 -0
  25. package/dist/core/types.d.ts.map +1 -0
  26. package/dist/core/types.js +3 -0
  27. package/dist/core/types.js.map +1 -0
  28. package/dist/core/validate.d.ts +16 -0
  29. package/dist/core/validate.d.ts.map +1 -0
  30. package/dist/core/validate.js +32 -0
  31. package/dist/core/validate.js.map +1 -0
  32. package/dist/distribution/hosts.d.ts +12 -0
  33. package/dist/distribution/hosts.d.ts.map +1 -0
  34. package/dist/distribution/hosts.js +122 -0
  35. package/dist/distribution/hosts.js.map +1 -0
  36. package/dist/distribution/index.d.ts +4 -0
  37. package/dist/distribution/index.d.ts.map +1 -0
  38. package/dist/distribution/index.js +4 -0
  39. package/dist/distribution/index.js.map +1 -0
  40. package/dist/distribution/installer.d.ts +23 -0
  41. package/dist/distribution/installer.d.ts.map +1 -0
  42. package/dist/distribution/installer.js +179 -0
  43. package/dist/distribution/installer.js.map +1 -0
  44. package/dist/distribution/skills.d.ts +11 -0
  45. package/dist/distribution/skills.d.ts.map +1 -0
  46. package/dist/distribution/skills.js +20 -0
  47. package/dist/distribution/skills.js.map +1 -0
  48. package/dist/index.d.ts +8 -0
  49. package/dist/index.d.ts.map +1 -0
  50. package/dist/index.js +8 -0
  51. package/dist/index.js.map +1 -0
  52. package/dist/integrations/skills/toporealm/SKILL.md +19 -0
  53. package/dist/integrations/skills/toporealm/agents/openai.yaml +6 -0
  54. package/dist/integrations/skills/toporealm-design/SKILL.md +14 -0
  55. package/dist/integrations/skills/toporealm-design/agents/openai.yaml +6 -0
  56. package/dist/integrations/skills/toporealm-grilling/SKILL.md +26 -0
  57. package/dist/integrations/skills/toporealm-grilling/agents/openai.yaml +6 -0
  58. package/dist/integrations/skills/toporealm-join/SKILL.md +18 -0
  59. package/dist/integrations/skills/toporealm-join/agents/openai.yaml +6 -0
  60. package/dist/mcp/index.d.ts +31 -0
  61. package/dist/mcp/index.d.ts.map +1 -0
  62. package/dist/mcp/index.js +128 -0
  63. package/dist/mcp/index.js.map +1 -0
  64. package/dist/module-sdk/actions.d.ts +33 -0
  65. package/dist/module-sdk/actions.d.ts.map +1 -0
  66. package/dist/module-sdk/actions.js +56 -0
  67. package/dist/module-sdk/actions.js.map +1 -0
  68. package/dist/module-sdk/index.d.ts +47 -0
  69. package/dist/module-sdk/index.d.ts.map +1 -0
  70. package/dist/module-sdk/index.js +7 -0
  71. package/dist/module-sdk/index.js.map +1 -0
  72. package/dist/module-sdk/registry.d.ts +81 -0
  73. package/dist/module-sdk/registry.d.ts.map +1 -0
  74. package/dist/module-sdk/registry.js +294 -0
  75. package/dist/module-sdk/registry.js.map +1 -0
  76. package/dist/server/index.d.ts +14 -0
  77. package/dist/server/index.d.ts.map +1 -0
  78. package/dist/server/index.js +168 -0
  79. package/dist/server/index.js.map +1 -0
  80. package/dist/web/index.d.ts +26 -0
  81. package/dist/web/index.d.ts.map +1 -0
  82. package/dist/web/index.js +107 -0
  83. package/dist/web/index.js.map +1 -0
  84. package/dist/web-assets/assets/index-BUAvvLwY.js +35 -0
  85. package/dist/web-assets/assets/index-DtKFY9Hh.css +1 -0
  86. package/dist/web-assets/index.html +175 -0
  87. package/package.json +65 -0
@@ -0,0 +1,8 @@
1
+ export * from "./core/index.js";
2
+ export * from "./module-sdk/index.js";
3
+ export * from "./cli/index.js";
4
+ export * from "./mcp/index.js";
5
+ export * from "./server/index.js";
6
+ export * from "./web/index.js";
7
+ export * from "./distribution/index.js";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,yBAAyB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,8 @@
1
+ export * from "./core/index.js";
2
+ export * from "./module-sdk/index.js";
3
+ export * from "./cli/index.js";
4
+ export * from "./mcp/index.js";
5
+ export * from "./server/index.js";
6
+ export * from "./web/index.js";
7
+ export * from "./distribution/index.js";
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,yBAAyB,CAAC"}
@@ -0,0 +1,19 @@
1
+ ---
2
+ name: toporealm
3
+ description: 识别 TopoRealm 工作区中的用户意图,读取当前图与模块状态,并把请求路由到 Core 通用能力或当前图已启用的模块。用于用户要查看、编辑、校验或操作 TopoRealm 图时;不替代领域模块作领域决策。
4
+ ---
5
+
6
+ # TopoRealm
7
+
8
+ 先自行读取工作区、当前图、revision、基础校验和模块状态,不向用户询问工具能够确定的事实。
9
+
10
+ 按以下边界路由请求:
11
+
12
+ - 通用图发现、读取、对象/关系编辑、撤销重做与校验,使用 TopoRealm CLI 或 MCP。
13
+ - 模块动作先读取 `action_list`;只有当前图已启用且运行时可用时才调用 `action_execute`。
14
+ - 模块安装、卸载与宿主同步属于管理操作,只能在用户明确要求时使用 CLI;MCP 不提供这些入口。
15
+ - 缺少所需模块时保持未知数据无损可读,说明缺少哪项能力,不把领域字段猜进通用模型。
16
+
17
+ 所有图写入必须以 `MutationPlan` 交给 Core,并携带刚读取的 `expectedRevision`。模块可以实现领域操作,但没有图存储写权限;外部或 artifact 副作用必须按实际效果透明说明。
18
+
19
+ 请求明确时直接完成。若存在会改变产品边界或持久协议的关键未决选择,转入 `$toporealm-grilling` 对齐;普通参数缺省不触发拷问。
@@ -0,0 +1,6 @@
1
+ interface:
2
+ display_name: "TopoRealm"
3
+ short_description: "识别意图并路由通用图与模块能力"
4
+ default_prompt: "使用 $toporealm 读取当前图并完成这个请求。"
5
+ policy:
6
+ allow_implicit_invocation: true
@@ -0,0 +1,14 @@
1
+ ---
2
+ name: toporealm-design
3
+ description: 设计或修改领域无关的 TopoRealm 图结构,包括对象、关系、模块引用与布局意图,并在写入前给用户审核。用于把需求变成通用图设计;不负责领域模块内部规则或任务执行编排。
4
+ ---
5
+
6
+ # TopoRealm Design
7
+
8
+ 读取现有图、模块注册状态和相关上下文,区分通用图结构与模块拥有的领域语义。只设计当前需求需要的最小对象、关系和模块引用;未知模块数据原样保留。
9
+
10
+ 先以中文给出可审核的设计摘要,至少说明:目标图、对象与关系变化、所需模块、不可逆影响、验收方式。事实自行查询;只有会改变含义的决策才询问用户。关键选择未对齐时使用 `$toporealm-grilling`,达成共识前不提交图变更。
11
+
12
+ 用户审核后,把完整变更整理为一个或多个边界清晰的 `MutationPlan`,每次提交携带当前 `expectedRevision`。不要直接写图存储文件,也不要把某个领域的状态机、工作流字段或专属 UI 写进 Core。
13
+
14
+ 完成后重新读取图并执行适当校验;报告实际 revision 和仍缺失的模块能力。
@@ -0,0 +1,6 @@
1
+ interface:
2
+ display_name: "TopoRealm Design"
3
+ short_description: "设计并审核领域无关的图结构变更"
4
+ default_prompt: "使用 $toporealm-design 把这个需求设计成可审核的图变更。"
5
+ policy:
6
+ allow_implicit_invocation: true
@@ -0,0 +1,26 @@
1
+ ---
2
+ name: toporealm-grilling
3
+ description: 与用户逐问对齐 TopoRealm 产品边界、持久协议或图设计中的关键决策。用户明确要求 grill、拷问或深挖时使用;也仅在关键歧义会导致不同产品边界或不可兼容设计时自动触发,不用于普通明确请求和可自行查明的事实。
4
+ ---
5
+
6
+ # TopoRealm Grilling
7
+
8
+ 目标是在施工前把真实意图和关键取舍对齐成可执行共识。
9
+
10
+ ## 触发边界
11
+
12
+ - 显式优先:用户点名本 Skill,或要求拷问、深挖、压力测试方案时进入。
13
+ - 自动触发仅限关键歧义:不同答案会改变公开产品边界、持久数据协议、Core/模块职责、外部副作用或不可兼容的交付方向。
14
+ - 普通参数缺省、已有约定可推导的选择、工具可查事实和明确的小改动不触发;直接处理即可。
15
+
16
+ ## 对话协议
17
+
18
+ 1. 先查事实:读取相关图、模块状态、代码或文档。不要让用户回答可以自行验证的问题。
19
+ 2. 画出决策依赖,只选择前置条件已经明确的一个问题。
20
+ 3. 一次只问一个问题,并给出推荐答案及最关键的取舍理由;等待用户回答后再继续。
21
+ 4. 决策归用户。不要把推荐答案冒充已获批准,也不要在答案含糊时替用户决定产品方向。
22
+ 5. 每次回答后重算未决分支;已被前一决定消除的分支不再追问。
23
+ 6. 没有关键未决项时输出中文共识摘要,明确已决定、明确排除、验收边界和仍属事实核查的事项。
24
+ 7. 用户确认共识前,不提交 MutationPlan、不修改文件、不安装模块、不同步宿主、不执行外部副作用。
25
+
26
+ 共识确认后返回 `$toporealm` 或 `$toporealm-design` 施工。本 Skill 自身只负责意图对齐,不承担领域执行、复核或测试纪律。
@@ -0,0 +1,6 @@
1
+ interface:
2
+ display_name: "TopoRealm Grilling"
3
+ short_description: "逐问识别真实意图并闭合关键产品决策"
4
+ default_prompt: "使用 $toporealm-grilling 逐问拷问并对齐这个 TopoRealm 方案。"
5
+ policy:
6
+ allow_implicit_invocation: true
@@ -0,0 +1,18 @@
1
+ ---
2
+ name: toporealm-join
3
+ description: 只读加入一个已有 TopoRealm 工作区,识别工作区、当前图、revision、模块状态和可用动作,并给出下一步入口。用于新会话恢复上下文;不执行写入、安装模块或同步宿主。
4
+ ---
5
+
6
+ # TopoRealm Join
7
+
8
+ 保持只读。依次确认工作区与当前图,读取图状态、基础校验、模块状态和可发现动作;若用户指定 `--root` 或 `--graph`,非法目标直接报告,不静默回退。
9
+
10
+ 用中文给出紧凑入场摘要:
11
+
12
+ - 工作区、当前图与 revision;
13
+ - 对象/关系规模及校验状态;
14
+ - 已启用、不可用或缺失的模块;
15
+ - 当前可调用的通用能力与模块动作;
16
+ - 最合适的一个后续入口:直接处理、`$toporealm-design` 或 `$toporealm-grilling`。
17
+
18
+ 不得提交 `MutationPlan`、切换当前图、安装或卸载模块、执行模块动作、启动服务或同步宿主。用户随后明确要求执行时,再交给对应能力处理。
@@ -0,0 +1,6 @@
1
+ interface:
2
+ display_name: "TopoRealm Join"
3
+ short_description: "只读恢复图、模块与可用动作上下文"
4
+ default_prompt: "使用 $toporealm-join 只读加入当前工作区并告诉我下一步。"
5
+ policy:
6
+ allow_implicit_invocation: true
@@ -0,0 +1,31 @@
1
+ import { GraphStore } from "../core/index.js";
2
+ import type { MutationPlan } from "../core/index.js";
3
+ import { ActionExecutor, type ActionReference, type ModuleActionRuntime } from "../module-sdk/index.js";
4
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
+ export declare const mcpSurface: {
6
+ readonly name: "mcp";
7
+ readonly coreFormat: "toporealm.graph/v1";
8
+ };
9
+ /** MCP transport-neutral handlers. A real MCP adapter can expose these unchanged. */
10
+ export declare function createMcpHandlers(store: GraphStore, actions?: ActionExecutor): {
11
+ graph_read: () => import("../core/types.js").GraphSnapshot;
12
+ graph_apply: (plan: MutationPlan) => import("../core/types.js").MutationResult;
13
+ graph_undo: (expectedRevision?: number) => import("../core/types.js").MutationResult;
14
+ graph_redo: (expectedRevision?: number) => import("../core/types.js").MutationResult;
15
+ } | {
16
+ execute_action: (reference: ActionReference, input?: Record<string, unknown>) => Promise<import("../module-sdk/actions.js").ActionExecutionResult>;
17
+ graph_read: () => import("../core/types.js").GraphSnapshot;
18
+ graph_apply: (plan: MutationPlan) => import("../core/types.js").MutationResult;
19
+ graph_undo: (expectedRevision?: number) => import("../core/types.js").MutationResult;
20
+ graph_redo: (expectedRevision?: number) => import("../core/types.js").MutationResult;
21
+ };
22
+ export declare const MCP_TOOL_NAMES: readonly ["graph_list", "graph_read", "graph_create", "graph_select", "graph_validate", "graph_apply", "graph_undo", "graph_redo", "module_status", "action_list", "action_execute"];
23
+ export interface ToporealmMcpOptions {
24
+ workspaceRoot: string;
25
+ graphId: string;
26
+ runtimes?: Readonly<Record<string, ModuleActionRuntime>>;
27
+ }
28
+ /** Official MCP server adapter; all graph writes remain delegated to GraphStore or ActionExecutor. */
29
+ export declare function createToporealmMcpServer(options: ToporealmMcpOptions): McpServer;
30
+ export declare function startToporealmMcpStdio(options: ToporealmMcpOptions): Promise<void>;
31
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AACA,OAAO,EAA2B,UAAU,EAAiB,MAAM,kBAAkB,CAAC;AACtF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD,OAAO,EACL,cAAc,EAId,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACzB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMpE,eAAO,MAAM,UAAU;;;CAGb,CAAC;AAEX,qFAAqF;AACrF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,cAAc;;wBAGrD,YAAY;oCACA,MAAM;oCACN,MAAM;;gCAEuB,eAAe,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;wBAJzF,YAAY;oCACA,MAAM;oCACN,MAAM;EAIzC;AAED,eAAO,MAAM,cAAc,sLAYjB,CAAC;AAEX,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAC;CAC1D;AAsBD,sGAAsG;AACtG,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,mBAAmB,GAAG,SAAS,CA8ChF;AAED,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBxF"}
@@ -0,0 +1,128 @@
1
+ import { coreSurface } from "../core/index.js";
2
+ import { CoreError, GRAPH_FORMAT, GraphStore, validateGraph } from "../core/index.js";
3
+ import { listGraphs, selectGraph } from "../cli/index.js";
4
+ import { ActionExecutor, GraphActivator, WorkspaceModuleResolver, discoverActions, } from "../module-sdk/index.js";
5
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
6
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
7
+ import { pathToFileURL } from "node:url";
8
+ import { resolve } from "node:path";
9
+ import { z } from "zod";
10
+ export const mcpSurface = {
11
+ name: "mcp",
12
+ coreFormat: coreSurface.graphFormat,
13
+ };
14
+ /** MCP transport-neutral handlers. A real MCP adapter can expose these unchanged. */
15
+ export function createMcpHandlers(store, actions) {
16
+ const handlers = {
17
+ graph_read: () => store.read(),
18
+ graph_apply: (plan) => store.apply(plan),
19
+ graph_undo: (expectedRevision) => store.undo(expectedRevision),
20
+ graph_redo: (expectedRevision) => store.redo(expectedRevision),
21
+ };
22
+ if (actions)
23
+ return { ...handlers, execute_action: (reference, input) => actions.execute(reference, input) };
24
+ return handlers;
25
+ }
26
+ export const MCP_TOOL_NAMES = [
27
+ "graph_list",
28
+ "graph_read",
29
+ "graph_create",
30
+ "graph_select",
31
+ "graph_validate",
32
+ "graph_apply",
33
+ "graph_undo",
34
+ "graph_redo",
35
+ "module_status",
36
+ "action_list",
37
+ "action_execute",
38
+ ];
39
+ function toolResult(value) {
40
+ const structuredContent = value && typeof value === "object" && !Array.isArray(value)
41
+ ? value
42
+ : { result: value };
43
+ return { content: [{ type: "text", text: JSON.stringify(structuredContent) }], structuredContent };
44
+ }
45
+ function toolError(error) {
46
+ const code = error instanceof CoreError ? error.code : "INTERNAL_ERROR";
47
+ const message = error instanceof Error ? error.message : String(error);
48
+ const structuredContent = { error: { code, message } };
49
+ return { isError: true, content: [{ type: "text", text: JSON.stringify(structuredContent) }], structuredContent };
50
+ }
51
+ const mutationPlanSchema = z.object({
52
+ expectedRevision: z.number().int().nonnegative().optional(),
53
+ label: z.string().optional(),
54
+ mutations: z.array(z.record(z.string(), z.unknown())),
55
+ });
56
+ /** Official MCP server adapter; all graph writes remain delegated to GraphStore or ActionExecutor. */
57
+ export function createToporealmMcpServer(options) {
58
+ let graphId = options.graphId;
59
+ const runtimes = options.runtimes ?? {};
60
+ const store = () => GraphStore.fromWorkspace(options.workspaceRoot, graphId);
61
+ const registry = () => {
62
+ const snapshot = store().read();
63
+ return new GraphActivator(new WorkspaceModuleResolver(options.workspaceRoot)).activate(snapshot);
64
+ };
65
+ const server = new McpServer({ name: "toporealm", version: "0.1.0" }, { instructions: "先读取或发现图,再使用 expectedRevision 提交 MutationPlan。环境管理仅使用 TopoRealm CLI。" });
66
+ const register = (name, description, schema, action) => {
67
+ server.registerTool(name, { description, inputSchema: schema }, (async (input) => {
68
+ try {
69
+ return toolResult(await action(input));
70
+ }
71
+ catch (error) {
72
+ return toolError(error);
73
+ }
74
+ }));
75
+ };
76
+ register("graph_list", "列出工作区图与当前图。", z.object({}), () => ({ currentId: graphId, graphs: listGraphs(options.workspaceRoot) }));
77
+ register("graph_read", "读取当前图快照。", z.object({}), () => store().read());
78
+ register("graph_create", "创建领域无关的空图。", z.object({ id: z.string().min(1), label: z.string().optional(), select: z.boolean().optional() }), ({ id, label, select }) => {
79
+ const manifest = { format: GRAPH_FORMAT, id, sources: { objects: "objects/*.yaml", relations: "relations/*.yaml" }, ...(label === undefined ? {} : { label }) };
80
+ const snapshot = GraphStore.fromWorkspace(options.workspaceRoot, id).initialize(manifest);
81
+ if (select) {
82
+ graphId = id;
83
+ selectGraph(options.workspaceRoot, id);
84
+ }
85
+ return snapshot;
86
+ });
87
+ register("graph_select", "选择当前图。", z.object({ id: z.string().min(1) }), ({ id }) => {
88
+ selectGraph(options.workspaceRoot, id);
89
+ graphId = id;
90
+ return { currentId: graphId };
91
+ });
92
+ register("graph_validate", "执行基础或完整校验。", z.object({ mode: z.enum(["basic", "complete"]).optional() }), ({ mode }) => {
93
+ const snapshot = store().read();
94
+ return validateGraph(snapshot, mode === "complete" ? registry() : undefined);
95
+ });
96
+ register("graph_apply", "由 Core 原子提交 MutationPlan。", z.object({ plan: mutationPlanSchema }), ({ plan }) => store().apply(plan));
97
+ register("graph_undo", "撤销当前图的一次提交。", z.object({ expectedRevision: z.number().int().nonnegative().optional() }), ({ expectedRevision }) => store().undo(expectedRevision));
98
+ register("graph_redo", "重做当前图的一次提交。", z.object({ expectedRevision: z.number().int().nonnegative().optional() }), ({ expectedRevision }) => store().redo(expectedRevision));
99
+ register("module_status", "读取当前图模块注册状态。", z.object({}), () => registry());
100
+ register("action_list", "发现当前图模块动作引用。", z.object({ target: z.string().optional() }), ({ target }) => discoverActions(registry(), target));
101
+ register("action_execute", "调用模块领域操作;图变更只能由其返回 MutationPlan 后交给 Core 提交。", z.object({
102
+ reference: z.object({ operation: z.string(), registryRevision: z.number().int().nonnegative(), target: z.string().optional(), inputSchema: z.string().optional(), inputTemplate: z.unknown().optional() }),
103
+ input: z.record(z.string(), z.unknown()).optional(),
104
+ }), async ({ reference, input }) => new ActionExecutor(store(), registry(), runtimes).execute(reference, input));
105
+ return server;
106
+ }
107
+ export async function startToporealmMcpStdio(options) {
108
+ const snapshot = GraphStore.fromWorkspace(options.workspaceRoot, options.graphId).read();
109
+ const resolver = new WorkspaceModuleResolver(options.workspaceRoot);
110
+ const loaded = { ...(options.runtimes ?? {}) };
111
+ for (const ref of snapshot.manifest.modules ?? []) {
112
+ if (loaded[ref.id])
113
+ continue;
114
+ const module = resolver.resolve(ref.id);
115
+ if (module.status !== "available")
116
+ continue;
117
+ const entry = module.manifest.runtime?.entry;
118
+ if (!entry)
119
+ continue;
120
+ const imported = await import(pathToFileURL(resolve(module.root, entry)).href);
121
+ const runtime = imported.default ?? imported.runtime;
122
+ if (runtime && typeof runtime.execute === "function")
123
+ loaded[ref.id] = runtime;
124
+ }
125
+ const server = createToporealmMcpServer({ ...options, runtimes: loaded });
126
+ await server.connect(new StdioServerTransport());
127
+ }
128
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { GraphStore } from "../core/index.js";
2
+ import type { GraphSnapshot, MutationPlan, MutationResult } from "../core/index.js";
3
+ import type { ActionReference, GraphRegistrySnapshot } from "./registry.js";
4
+ export interface ActionContext {
5
+ snapshot: GraphSnapshot;
6
+ target?: string;
7
+ input: Record<string, unknown>;
8
+ }
9
+ export type ActionOutput = MutationPlan | {
10
+ result: unknown;
11
+ effects?: "none" | "artifact" | "external";
12
+ };
13
+ export interface ModuleActionRuntime {
14
+ execute(operation: string, context: ActionContext): ActionOutput | Promise<ActionOutput>;
15
+ }
16
+ export type ActionExecutionResult = {
17
+ kind: "mutation";
18
+ operation: string;
19
+ mutation: MutationResult;
20
+ } | {
21
+ kind: "result";
22
+ operation: string;
23
+ result: unknown;
24
+ effects: "none" | "artifact" | "external";
25
+ };
26
+ export declare class ActionExecutor {
27
+ private readonly store;
28
+ private readonly registry;
29
+ private readonly runtimes;
30
+ constructor(store: GraphStore, registry: GraphRegistrySnapshot, runtimes: Readonly<Record<string, ModuleActionRuntime>>);
31
+ execute(reference: ActionReference, input?: Record<string, unknown>): Promise<ActionExecutionResult>;
32
+ }
33
+ //# sourceMappingURL=actions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/module-sdk/actions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACpF,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAG5E,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,aAAa,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU,CAAA;CAAE,CAAC;AAE1G,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CAC1F;AAED,MAAM,MAAM,qBAAqB,GAC7B;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,cAAc,CAAA;CAAE,GACjE;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU,CAAA;CAAE,CAAC;AAMtG,qBAAa,cAAc;IAEvB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAFR,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,qBAAqB,EAC/B,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IAGpE,OAAO,CAAC,SAAS,EAAE,eAAe,EAAE,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;CAkC/G"}
@@ -0,0 +1,56 @@
1
+ import { CoreError } from "../core/index.js";
2
+ import { applyRegisteredPlan } from "./registry.js";
3
+ function isMutationPlan(value) {
4
+ return Boolean(value && typeof value === "object" && Array.isArray(value.mutations));
5
+ }
6
+ export class ActionExecutor {
7
+ store;
8
+ registry;
9
+ runtimes;
10
+ constructor(store, registry, runtimes) {
11
+ this.store = store;
12
+ this.registry = registry;
13
+ this.runtimes = runtimes;
14
+ }
15
+ async execute(reference, input = {}) {
16
+ if (reference.registryRevision !== this.registry.registryRevision) {
17
+ throw new CoreError({ code: "STALE_ACTION", message: "动作引用来自旧的模块注册快照,请重新发现动作。", details: { expectedRevision: this.registry.registryRevision, actionRevision: reference.registryRevision } });
18
+ }
19
+ if (!input || typeof input !== "object" || Array.isArray(input)) {
20
+ throw new CoreError({ code: "INVALID_INPUT", message: "动作输入必须是对象。" });
21
+ }
22
+ const operation = this.registry.operations.find((candidate) => candidate.fullId === reference.operation);
23
+ if (!operation)
24
+ throw new CoreError({ code: "ACTION_NOT_FOUND", message: `找不到动作:${reference.operation}` });
25
+ const module = this.registry.modules.find((candidate) => candidate.id === operation.moduleId);
26
+ if (!module || module.status !== "available")
27
+ throw new CoreError({ code: "MODULE_UNAVAILABLE", message: `动作所属模块不可用:${operation.moduleId}` });
28
+ if (reference.target !== undefined) {
29
+ const target = this.store.read().objects.find((object) => object.id === reference.target) ?? this.store.read().relations.find((relation) => relation.id === reference.target);
30
+ if (!target)
31
+ throw new CoreError({ code: "ACTION_NOT_APPLICABLE", message: `动作目标不存在:${reference.target}` });
32
+ const declaration = operation.declaration && typeof operation.declaration === "object" ? operation.declaration : {};
33
+ if (typeof declaration.applies_to === "string" && target.kind !== declaration.applies_to) {
34
+ throw new CoreError({ code: "ACTION_NOT_APPLICABLE", message: `动作 ${reference.operation} 不适用于 ${target.kind}。` });
35
+ }
36
+ }
37
+ const runtime = this.runtimes[operation.moduleId];
38
+ if (!runtime)
39
+ throw new CoreError({ code: "RUNTIME_FAILED", message: `模块 ${operation.moduleId} 没有可用运行时。` });
40
+ let output;
41
+ try {
42
+ const context = { snapshot: this.store.read(), input };
43
+ if (reference.target !== undefined)
44
+ context.target = reference.target;
45
+ output = await runtime.execute(operation.fullId, context);
46
+ }
47
+ catch (error) {
48
+ throw new CoreError({ code: "RUNTIME_FAILED", message: `动作 ${reference.operation} 执行失败。`, details: { cause: error instanceof Error ? error.message : String(error) } });
49
+ }
50
+ if (isMutationPlan(output)) {
51
+ return { kind: "mutation", operation: reference.operation, mutation: applyRegisteredPlan(this.store, this.registry, output) };
52
+ }
53
+ return { kind: "result", operation: reference.operation, result: output.result, effects: output.effects ?? "none" };
54
+ }
55
+ }
56
+ //# sourceMappingURL=actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/module-sdk/actions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import type { ModuleId, ModuleNamespace } from "../core/index.js";
2
+ export type ModuleFormat = "toporealm.module/v1";
3
+ export interface ContributionRef {
4
+ id: string;
5
+ schema?: string;
6
+ declaration?: string;
7
+ }
8
+ export interface ModuleDependency {
9
+ id: ModuleId;
10
+ version: string;
11
+ }
12
+ export interface ModuleManifest {
13
+ format: ModuleFormat;
14
+ id: ModuleId;
15
+ namespace: ModuleNamespace;
16
+ version: string;
17
+ supports: {
18
+ schemas: number[];
19
+ };
20
+ requires?: {
21
+ modules?: ModuleDependency[];
22
+ };
23
+ contributes?: {
24
+ object_kinds?: ContributionRef[];
25
+ relation_kinds?: ContributionRef[];
26
+ capabilities?: ContributionRef[];
27
+ validators?: ContributionRef[];
28
+ operations?: ContributionRef[];
29
+ };
30
+ runtime?: {
31
+ entry: string;
32
+ };
33
+ ui?: {
34
+ contribution: string;
35
+ };
36
+ skills?: {
37
+ directory: string;
38
+ };
39
+ }
40
+ export interface ModuleSurface {
41
+ readonly name: "module-sdk";
42
+ readonly manifestFormat: ModuleManifest["format"];
43
+ }
44
+ export declare const moduleSurface: ModuleSurface;
45
+ export * from "./registry.js";
46
+ export * from "./actions.js";
47
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/module-sdk/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAElE,MAAM,MAAM,YAAY,GAAG,qBAAqB,CAAC;AAEjD,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,QAAQ,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,YAAY,CAAC;IACrB,EAAE,EAAE,QAAQ,CAAC;IACb,SAAS,EAAE,eAAe,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE;QAAE,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAChC,QAAQ,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAA;KAAE,CAAC;IAC5C,WAAW,CAAC,EAAE;QACZ,YAAY,CAAC,EAAE,eAAe,EAAE,CAAC;QACjC,cAAc,CAAC,EAAE,eAAe,EAAE,CAAC;QACnC,YAAY,CAAC,EAAE,eAAe,EAAE,CAAC;QACjC,UAAU,CAAC,EAAE,eAAe,EAAE,CAAC;QAC/B,UAAU,CAAC,EAAE,eAAe,EAAE,CAAC;KAChC,CAAC;IACF,OAAO,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5B,EAAE,CAAC,EAAE;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9B,MAAM,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CAChC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;CACnD;AAED,eAAO,MAAM,aAAa,EAAE,aAG3B,CAAC;AAEF,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,7 @@
1
+ export const moduleSurface = {
2
+ name: "module-sdk",
3
+ manifestFormat: "toporealm.module/v1",
4
+ };
5
+ export * from "./registry.js";
6
+ export * from "./actions.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/module-sdk/index.ts"],"names":[],"mappings":"AAuCA,MAAM,CAAC,MAAM,aAAa,GAAkB;IAC1C,IAAI,EAAE,YAAY;IAClB,cAAc,EAAE,qBAAqB;CACtC,CAAC;AAEF,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,81 @@
1
+ import { GraphStore } from "../core/index.js";
2
+ import type { GraphSnapshot, MutationPlan } from "../core/index.js";
3
+ import type { ModuleManifest } from "./index.js";
4
+ export type ModuleSource = "global" | "workspace" | "path";
5
+ export interface ModuleBinding {
6
+ source: ModuleSource;
7
+ path?: string;
8
+ version?: string;
9
+ }
10
+ export interface ModuleBindingsFile {
11
+ bindings?: Record<string, ModuleBinding>;
12
+ }
13
+ export interface AvailableModule {
14
+ status: "available";
15
+ id: string;
16
+ source: ModuleSource;
17
+ root: string;
18
+ manifest: ModuleManifest;
19
+ }
20
+ export interface UnavailableModule {
21
+ status: "unavailable";
22
+ id: string;
23
+ source?: ModuleSource;
24
+ root?: string;
25
+ reason: string;
26
+ }
27
+ export type ResolvedModule = AvailableModule | UnavailableModule;
28
+ export interface WorkspaceModuleResolverOptions {
29
+ globalHome?: string;
30
+ }
31
+ export interface RegisteredContribution {
32
+ id: string;
33
+ fullId: string;
34
+ moduleId: string;
35
+ declaration?: unknown;
36
+ }
37
+ export interface ModuleStatus {
38
+ id: string;
39
+ namespace?: string;
40
+ status: "available" | "unavailable";
41
+ source?: ModuleSource;
42
+ version?: string;
43
+ reason?: string;
44
+ }
45
+ export interface GraphRegistrySnapshot {
46
+ registryRevision: number;
47
+ modules: readonly ModuleStatus[];
48
+ objectKinds: readonly RegisteredContribution[];
49
+ relationKinds: readonly RegisteredContribution[];
50
+ capabilities: readonly RegisteredContribution[];
51
+ validators: readonly RegisteredContribution[];
52
+ operations: readonly RegisteredContribution[];
53
+ ui: Readonly<Record<string, unknown>>;
54
+ }
55
+ export interface ActionReference {
56
+ operation: string;
57
+ registryRevision: number;
58
+ target?: string;
59
+ inputSchema?: string;
60
+ inputTemplate?: unknown;
61
+ }
62
+ export declare function satisfiesVersion(version: string, range: string): boolean;
63
+ export declare class WorkspaceModuleResolver {
64
+ readonly workspaceRoot: string;
65
+ readonly globalHome: string;
66
+ constructor(workspaceRoot: string, options?: WorkspaceModuleResolverOptions);
67
+ readBindings(): ModuleBindingsFile;
68
+ resolve(moduleId: string): ResolvedModule;
69
+ resolveMany(moduleIds: readonly string[]): readonly ResolvedModule[];
70
+ }
71
+ export declare class GraphActivator {
72
+ private readonly resolver;
73
+ constructor(resolver: WorkspaceModuleResolver);
74
+ activate(graph: GraphSnapshot): Readonly<GraphRegistrySnapshot>;
75
+ private readContributions;
76
+ private modulePath;
77
+ }
78
+ export declare function discoverActions(registry: GraphRegistrySnapshot, target?: string): readonly ActionReference[];
79
+ export declare function validateMutationPlan(registry: GraphRegistrySnapshot, plan: MutationPlan): void;
80
+ export declare function applyRegisteredPlan(store: GraphStore, registry: GraphRegistrySnapshot, plan: MutationPlan): import("../core/types.js").MutationResult;
81
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/module-sdk/registry.ts"],"names":[],"mappings":"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"}