@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,107 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { extname, join, normalize, relative } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { coreSurface } from "../core/index.js";
5
+ import { CoreError } from "../core/index.js";
6
+ export const webSurface = {
7
+ name: "web",
8
+ coreFormat: coreSurface.graphFormat,
9
+ };
10
+ /** Client-side projection that consumes the same revisioned patches returned by Core. */
11
+ export class WebGraphModel {
12
+ current;
13
+ constructor(snapshot) {
14
+ this.current = structuredClone(snapshot);
15
+ }
16
+ get snapshot() {
17
+ return structuredClone(this.current);
18
+ }
19
+ applyPatch(patch) {
20
+ if (patch.fromRevision !== this.current.revision) {
21
+ throw new CoreError({
22
+ code: "PATCH_GAP",
23
+ message: `Web 视图需要 revision ${this.current.revision},收到 ${patch.fromRevision}。`,
24
+ details: { expectedRevision: this.current.revision, patchFrom: patch.fromRevision },
25
+ });
26
+ }
27
+ const objects = new Map(this.current.objects.map((object) => [object.id, structuredClone(object)]));
28
+ const relations = new Map(this.current.relations.map((relation) => [relation.id, structuredClone(relation)]));
29
+ for (const object of patch.objects.added)
30
+ objects.set(object.id, structuredClone(object));
31
+ for (const object of patch.objects.updated)
32
+ objects.set(object.id, structuredClone(object));
33
+ for (const id of patch.objects.deleted)
34
+ objects.delete(id);
35
+ for (const relation of patch.relations.added)
36
+ relations.set(relation.id, structuredClone(relation));
37
+ for (const relation of patch.relations.updated)
38
+ relations.set(relation.id, structuredClone(relation));
39
+ for (const id of patch.relations.deleted)
40
+ relations.delete(id);
41
+ this.current = {
42
+ manifest: patch.manifestChanged && patch.manifest ? structuredClone(patch.manifest) : this.current.manifest,
43
+ objects: [...objects.values()].sort(byId),
44
+ relations: [...relations.values()].sort(byId),
45
+ revision: patch.toRevision,
46
+ };
47
+ return this.snapshot;
48
+ }
49
+ }
50
+ /** One extension failing must leave the generic surface usable. */
51
+ export function withUiErrorBoundary(extension, fallback) {
52
+ try {
53
+ return { enabled: true, value: extension() };
54
+ }
55
+ catch (error) {
56
+ return { enabled: false, value: fallback(), error: error instanceof Error ? error.message : String(error) };
57
+ }
58
+ }
59
+ const PACKAGED_WEB_DIST = fileURLToPath(new URL("../web-assets/", import.meta.url));
60
+ const DEVELOPMENT_WEB_DIST = join(process.cwd(), "web-ui", "dist");
61
+ function defaultWebRoot() {
62
+ return existsSync(join(PACKAGED_WEB_DIST, "index.html")) ? PACKAGED_WEB_DIST : DEVELOPMENT_WEB_DIST;
63
+ }
64
+ const MIME_TYPES = {
65
+ ".css": "text/css; charset=utf-8",
66
+ ".html": "text/html; charset=utf-8",
67
+ ".js": "text/javascript; charset=utf-8",
68
+ ".json": "application/json; charset=utf-8",
69
+ ".svg": "image/svg+xml",
70
+ ".woff": "font/woff",
71
+ ".woff2": "font/woff2",
72
+ };
73
+ /** Reads a built Web UI asset without allowing paths outside web-ui/dist. */
74
+ export function readWebAsset(pathname, webRoot = defaultWebRoot()) {
75
+ let decoded;
76
+ try {
77
+ decoded = decodeURIComponent(pathname);
78
+ }
79
+ catch {
80
+ return undefined;
81
+ }
82
+ const assetPath = normalize(join(webRoot, decoded.replace(/^[/\\]+/, "")));
83
+ const rel = relative(webRoot, assetPath);
84
+ if (!rel || rel.startsWith("..") || rel.includes(`..${"/"}`) || rel.includes(`..${"\\"}`) || !existsSync(assetPath))
85
+ return undefined;
86
+ return { body: readFileSync(assetPath), contentType: MIME_TYPES[extname(assetPath).toLowerCase()] ?? "application/octet-stream" };
87
+ }
88
+ function byId(left, right) {
89
+ return left.id.localeCompare(right.id);
90
+ }
91
+ export function renderWebShell(webRoot = defaultWebRoot()) {
92
+ const builtIndex = join(webRoot, "index.html");
93
+ if (existsSync(builtIndex))
94
+ return readFileSync(builtIndex, "utf8");
95
+ return `<!doctype html>
96
+ <html lang="zh-CN"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
97
+ <title>TopoRealm</title><style>body{font:15px system-ui,sans-serif;max-width:960px;margin:2rem auto;padding:0 1rem}button{margin:.25rem;padding:.45rem .7rem}pre{background:#f5f5f5;padding:1rem;overflow:auto}</style></head>
98
+ <body><h1>TopoRealm</h1><p>最薄基座 Web 视图:读取图快照,并把编辑结果作为 revision patch 应用。</p>
99
+ <p><button id="refresh">刷新</button><button id="undo">撤销</button><button id="redo">重做</button></p><pre id="state">加载中…</pre>
100
+ <script>
101
+ const state=document.querySelector('#state');
102
+ async function get(){const r=await fetch('/graph'); const v=await r.json(); state.textContent=JSON.stringify(v,null,2);}
103
+ async function action(path){const r=await fetch(path,{method:'POST',headers:{'content-type':'application/json'},body:'{}'}); const v=await r.json(); state.textContent=JSON.stringify(v,null,2);}
104
+ document.querySelector('#refresh').onclick=get; document.querySelector('#undo').onclick=()=>action('/undo'); document.querySelector('#redo').onclick=()=>action('/redo'); get();
105
+ </script></body></html>`;
106
+ }
107
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/web/index.ts"],"names":[],"mappings":"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"}