@mdsnai/sdk 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 (125) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +67 -0
  3. package/dist/cli/args.d.ts +8 -0
  4. package/dist/cli/args.js +63 -0
  5. package/dist/cli/commands/build.d.ts +5 -0
  6. package/dist/cli/commands/build.js +19 -0
  7. package/dist/cli/commands/create.d.ts +2 -0
  8. package/dist/cli/commands/create.js +39 -0
  9. package/dist/cli/commands/dev.d.ts +10 -0
  10. package/dist/cli/commands/dev.js +13 -0
  11. package/dist/cli/commands/start.d.ts +9 -0
  12. package/dist/cli/commands/start.js +13 -0
  13. package/dist/cli/entry.d.ts +2 -0
  14. package/dist/cli/entry.js +8 -0
  15. package/dist/cli/index.d.ts +9 -0
  16. package/dist/cli/index.js +58 -0
  17. package/dist/core/action/execution.d.ts +4 -0
  18. package/dist/core/action/execution.js +57 -0
  19. package/dist/core/action/index.d.ts +2 -0
  20. package/dist/core/action/index.js +7 -0
  21. package/dist/core/action/types.d.ts +19 -0
  22. package/dist/core/action/types.js +2 -0
  23. package/dist/core/document/frontmatter.d.ts +5 -0
  24. package/dist/core/document/frontmatter.js +41 -0
  25. package/dist/core/document/markdown.d.ts +5 -0
  26. package/dist/core/document/markdown.js +83 -0
  27. package/dist/core/document/page-definition.d.ts +2 -0
  28. package/dist/core/document/page-definition.js +24 -0
  29. package/dist/core/index.d.ts +3 -0
  30. package/dist/core/index.js +5 -0
  31. package/dist/core/model/block.d.ts +30 -0
  32. package/dist/core/model/block.js +2 -0
  33. package/dist/core/model/document.d.ts +13 -0
  34. package/dist/core/model/document.js +2 -0
  35. package/dist/core/model/fragment.d.ts +4 -0
  36. package/dist/core/model/fragment.js +2 -0
  37. package/dist/core/model/index.d.ts +5 -0
  38. package/dist/core/model/index.js +2 -0
  39. package/dist/core/model/input.d.ts +11 -0
  40. package/dist/core/model/input.js +2 -0
  41. package/dist/core/model/schema.d.ts +4 -0
  42. package/dist/core/model/schema.js +2 -0
  43. package/dist/core/protocol/mdsn.d.ts +6 -0
  44. package/dist/core/protocol/mdsn.js +80 -0
  45. package/dist/core/protocol/statements.d.ts +12 -0
  46. package/dist/core/protocol/statements.js +140 -0
  47. package/dist/core/protocol/validation.d.ts +4 -0
  48. package/dist/core/protocol/validation.js +60 -0
  49. package/dist/framework/create-framework-app.d.ts +12 -0
  50. package/dist/framework/create-framework-app.js +11 -0
  51. package/dist/framework/hosted-app.d.ts +13 -0
  52. package/dist/framework/hosted-app.js +133 -0
  53. package/dist/framework/index.d.ts +4 -0
  54. package/dist/framework/index.js +7 -0
  55. package/dist/framework/site-app.d.ts +12 -0
  56. package/dist/framework/site-app.js +146 -0
  57. package/dist/index.d.ts +8 -0
  58. package/dist/index.js +18 -0
  59. package/dist/server/action-host.d.ts +3 -0
  60. package/dist/server/action-host.js +8 -0
  61. package/dist/server/action-runtime.d.ts +8 -0
  62. package/dist/server/action-runtime.js +81 -0
  63. package/dist/server/action.d.ts +41 -0
  64. package/dist/server/action.js +97 -0
  65. package/dist/server/build.d.ts +10 -0
  66. package/dist/server/build.js +166 -0
  67. package/dist/server/config.d.ts +56 -0
  68. package/dist/server/config.js +42 -0
  69. package/dist/server/dev.d.ts +48 -0
  70. package/dist/server/dev.js +90 -0
  71. package/dist/server/index.d.ts +8 -0
  72. package/dist/server/index.js +16 -0
  73. package/dist/server/init.d.ts +1 -0
  74. package/dist/server/init.js +176 -0
  75. package/dist/server/layout.d.ts +17 -0
  76. package/dist/server/layout.js +40 -0
  77. package/dist/server/markdown.d.ts +53 -0
  78. package/dist/server/markdown.js +76 -0
  79. package/dist/server/module-loader.d.ts +4 -0
  80. package/dist/server/module-loader.js +71 -0
  81. package/dist/server/negotiate.d.ts +3 -0
  82. package/dist/server/negotiate.js +55 -0
  83. package/dist/server/page-host.d.ts +21 -0
  84. package/dist/server/page-host.js +66 -0
  85. package/dist/server/page-links.d.ts +10 -0
  86. package/dist/server/page-links.js +80 -0
  87. package/dist/server/route-matcher.d.ts +6 -0
  88. package/dist/server/route-matcher.js +73 -0
  89. package/dist/server/routes.d.ts +6 -0
  90. package/dist/server/routes.js +73 -0
  91. package/dist/server/server.d.ts +27 -0
  92. package/dist/server/server.js +152 -0
  93. package/dist/server/site.d.ts +11 -0
  94. package/dist/server/site.js +59 -0
  95. package/dist/server/targets.d.ts +7 -0
  96. package/dist/server/targets.js +21 -0
  97. package/dist/web/block-runtime.d.ts +2 -0
  98. package/dist/web/block-runtime.js +27 -0
  99. package/dist/web/fragment-render.d.ts +10 -0
  100. package/dist/web/fragment-render.js +59 -0
  101. package/dist/web/headless.d.ts +95 -0
  102. package/dist/web/headless.js +370 -0
  103. package/dist/web/i18n.d.ts +31 -0
  104. package/dist/web/i18n.js +69 -0
  105. package/dist/web/index.d.ts +11 -0
  106. package/dist/web/index.js +22 -0
  107. package/dist/web/navigation.d.ts +3 -0
  108. package/dist/web/navigation.js +32 -0
  109. package/dist/web/page-bootstrap.d.ts +6 -0
  110. package/dist/web/page-bootstrap.js +29 -0
  111. package/dist/web/page-client-runtime.d.ts +15 -0
  112. package/dist/web/page-client-runtime.js +22 -0
  113. package/dist/web/page-client-script.d.ts +2 -0
  114. package/dist/web/page-client-script.js +567 -0
  115. package/dist/web/page-html.d.ts +8 -0
  116. package/dist/web/page-html.js +49 -0
  117. package/dist/web/page-render.d.ts +20 -0
  118. package/dist/web/page-render.js +92 -0
  119. package/dist/web/public-client-runtime.d.ts +1 -0
  120. package/dist/web/public-client-runtime.js +5 -0
  121. package/dist/web/public-render.d.ts +12 -0
  122. package/dist/web/public-render.js +18 -0
  123. package/dist/web/target-path.d.ts +1 -0
  124. package/dist/web/target-path.js +35 -0
  125. package/package.json +91 -0
@@ -0,0 +1,92 @@
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.renderBlockPanelHtml = renderBlockPanelHtml;
7
+ exports.createPageRenderModel = createPageRenderModel;
8
+ const markdown_it_1 = __importDefault(require("markdown-it"));
9
+ const page_bootstrap_1 = require("./page-bootstrap");
10
+ const block_runtime_1 = require("./block-runtime");
11
+ const headless_1 = require("./headless");
12
+ function escapeHtml(value) {
13
+ return value
14
+ .replace(/&/g, "&")
15
+ .replace(/</g, "&lt;")
16
+ .replace(/>/g, "&gt;")
17
+ .replace(/"/g, "&quot;")
18
+ .replace(/'/g, "&#39;");
19
+ }
20
+ function createMarkdownRenderer(options) {
21
+ return new markdown_it_1.default({
22
+ html: true,
23
+ linkify: options?.linkify ?? true,
24
+ typographer: options?.typographer ?? false,
25
+ });
26
+ }
27
+ function renderInput(block) {
28
+ if (block.inputs.length === 0)
29
+ return "";
30
+ const items = block.inputs.map((input) => {
31
+ const required = input.required ? " required" : "";
32
+ const requiredFlag = input.required ? ' data-required="true"' : "";
33
+ const secretFlag = input.secret ? ' data-secret="true"' : "";
34
+ const inputType = input.type === "boolean"
35
+ ? "checkbox"
36
+ : input.secret
37
+ ? "password"
38
+ : input.type === "number"
39
+ ? "number"
40
+ : input.type === "file"
41
+ ? "file"
42
+ : "text";
43
+ if (input.type === "choice") {
44
+ const options = (input.options ?? [])
45
+ .map((option) => `<option value="${escapeHtml(option)}">${escapeHtml(option)}</option>`)
46
+ .join("");
47
+ return `<label>${escapeHtml(input.name)}<select id="${escapeHtml(input.id)}" data-mdsn-input="${escapeHtml(input.id)}" data-input-name="${escapeHtml(input.name)}" data-input-type="${escapeHtml(input.type)}"${requiredFlag}${secretFlag}${required}><option value=""></option>${options}</select></label>`;
48
+ }
49
+ if (input.type === "json") {
50
+ return `<label>${escapeHtml(input.name)}<textarea id="${escapeHtml(input.id)}" data-mdsn-input="${escapeHtml(input.id)}" data-input-name="${escapeHtml(input.name)}" data-input-type="${escapeHtml(input.type)}"${requiredFlag}${secretFlag}${required} rows="8" spellcheck="false"></textarea></label>`;
51
+ }
52
+ return `<label>${escapeHtml(input.name)}<input id="${escapeHtml(input.id)}" type="${inputType}" data-mdsn-input="${escapeHtml(input.id)}" data-input-name="${escapeHtml(input.name)}" data-input-type="${escapeHtml(input.type)}"${requiredFlag}${secretFlag}${required} /></label>`;
53
+ }).join("");
54
+ return `<div class="mdsn-block-inputs">${items}</div>`;
55
+ }
56
+ function renderActions(block, options) {
57
+ const readButtons = block.reads.map((read) => `<button type="button" data-mdsn-read="${escapeHtml(read.id)}" data-target="${escapeHtml(options?.mapActionTarget?.(read.target) ?? read.target)}">${escapeHtml(read.name)}</button>`);
58
+ const writeButtons = block.writes.map((write) => `<button type="button" data-mdsn-write="${escapeHtml(write.id)}" data-target="${escapeHtml(options?.mapActionTarget?.(write.target) ?? write.target)}">${escapeHtml(write.name)}</button>`);
59
+ const redirectButtons = block.redirects.map((redirect) => `<button type="button" data-mdsn-redirect="${escapeHtml(redirect.id)}" data-target="${escapeHtml(options?.mapActionTarget?.(redirect.target) ?? redirect.target)}">${escapeHtml(`redirect ${redirect.target}`)}</button>`);
60
+ const buttons = [...readButtons, ...writeButtons, ...redirectButtons].join("");
61
+ return buttons.length > 0 ? `<div class="mdsn-block-actions">${buttons}</div>` : "";
62
+ }
63
+ function renderBlockPanelContent(block, options) {
64
+ return `<section class="mdsn-block-panel" data-mdsn-block-panel="${escapeHtml(block.name)}"><header><strong>${escapeHtml(block.name)}</strong></header>${renderInput(block)}${renderActions(block, options)}</section>`;
65
+ }
66
+ function renderBlockPanelHtml(block, options, mode = "region") {
67
+ const content = renderBlockPanelContent(block, options);
68
+ return mode === "plain" ? content : (0, block_runtime_1.createBlockRegionMarkup)(block.name, content);
69
+ }
70
+ function renderMarkdownContainer(container, renderer) {
71
+ return renderer.render(container.markdown);
72
+ }
73
+ function renderParsedPage(page, options) {
74
+ const renderer = createMarkdownRenderer(options?.markdown);
75
+ const blockByName = new Map(page.blocks.map((block) => [block.name, block]));
76
+ return page.segments.map((segment) => {
77
+ if (segment.type === "container") {
78
+ return renderMarkdownContainer(segment.container, renderer);
79
+ }
80
+ const block = blockByName.get(segment.anchor.name);
81
+ return block ? renderBlockPanelHtml(block, options, "region") : "";
82
+ }).join("");
83
+ }
84
+ function createPageRenderModel(document, options) {
85
+ const page = (0, headless_1.createParsedPage)(document);
86
+ return {
87
+ markdownHtml: renderParsedPage(page, options),
88
+ bootstrap: (0, page_bootstrap_1.createPageBootstrap)(document),
89
+ document,
90
+ page,
91
+ };
92
+ }
@@ -0,0 +1 @@
1
+ export { getPageClientRuntimeScript as getClientRuntimeScript } from "./page-client-script";
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getClientRuntimeScript = void 0;
4
+ var page_client_script_1 = require("./page-client-script");
5
+ Object.defineProperty(exports, "getClientRuntimeScript", { enumerable: true, get: function () { return page_client_script_1.getPageClientRuntimeScript; } });
@@ -0,0 +1,12 @@
1
+ import type { DocumentDefinition } from "../core/model/document";
2
+ import { type PageRenderModel } from "./page-render";
3
+ export interface CreateRenderModelOptions {
4
+ mapTarget?: (target: string) => string;
5
+ }
6
+ export type RenderModel = PageRenderModel;
7
+ export declare function createRenderModel(document: DocumentDefinition, options?: CreateRenderModelOptions): RenderModel;
8
+ export declare function renderDefaultHtmlDocument(model: RenderModel, options?: {
9
+ title?: string;
10
+ lang?: string;
11
+ }): string;
12
+ export declare function renderPageHtml(document: DocumentDefinition, options?: CreateRenderModelOptions): string;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createRenderModel = createRenderModel;
4
+ exports.renderDefaultHtmlDocument = renderDefaultHtmlDocument;
5
+ exports.renderPageHtml = renderPageHtml;
6
+ const page_html_1 = require("./page-html");
7
+ const page_render_1 = require("./page-render");
8
+ function createRenderModel(document, options) {
9
+ return (0, page_render_1.createPageRenderModel)(document, {
10
+ mapActionTarget: options?.mapTarget,
11
+ });
12
+ }
13
+ function renderDefaultHtmlDocument(model, options) {
14
+ return (0, page_html_1.renderPageHtmlDocument)(model, options);
15
+ }
16
+ function renderPageHtml(document, options) {
17
+ return renderDefaultHtmlDocument(createRenderModel(document, options));
18
+ }
@@ -0,0 +1 @@
1
+ export declare function mapTargetToHttpPath(target: string): string;
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mapTargetToHttpPath = mapTargetToHttpPath;
4
+ function normalizeRoutePath(routePath) {
5
+ if (!routePath || routePath === "/") {
6
+ return "/";
7
+ }
8
+ return routePath.startsWith("/")
9
+ ? (routePath.replace(/\/+$/, "") || "/")
10
+ : (`/${routePath}`.replace(/\/+$/, "") || "/");
11
+ }
12
+ function markdownPathToRoutePath(pathname) {
13
+ if (!pathname || !pathname.toLowerCase().endsWith(".md")) {
14
+ return null;
15
+ }
16
+ const normalized = normalizeRoutePath(pathname);
17
+ if (normalized === "/index.md") {
18
+ return "/";
19
+ }
20
+ const stripped = normalized.slice(0, -3);
21
+ if (stripped.endsWith("/index")) {
22
+ return stripped.slice(0, -6) || "/";
23
+ }
24
+ return stripped.length > 0 ? stripped : "/";
25
+ }
26
+ function mapTargetToHttpPath(target) {
27
+ if (/^https?:\/\//i.test(target)) {
28
+ return target;
29
+ }
30
+ const markdownRoutePath = markdownPathToRoutePath(target);
31
+ if (markdownRoutePath) {
32
+ return markdownRoutePath;
33
+ }
34
+ return target;
35
+ }
package/package.json ADDED
@@ -0,0 +1,91 @@
1
+ {
2
+ "name": "@mdsnai/sdk",
3
+ "version": "0.1.0",
4
+ "private": false,
5
+ "description": "SDK, framework host, parser, renderer, and CLI for building MDSN sites.",
6
+ "license": "MIT",
7
+ "homepage": "https://docs.mdsn.ai",
8
+ "bugs": {
9
+ "url": "https://github.com/mdsn-ai/mdsn/issues"
10
+ },
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "https://github.com/mdsn-ai/mdsn.git"
14
+ },
15
+ "keywords": [
16
+ "mdsn",
17
+ "markdown",
18
+ "sdk",
19
+ "ai",
20
+ "agent",
21
+ "agentic",
22
+ "workflow",
23
+ "interactive-documents",
24
+ "skills-app",
25
+ "agent-app",
26
+ "framework",
27
+ "cli"
28
+ ],
29
+ "main": "./dist/index.js",
30
+ "types": "./dist/index.d.ts",
31
+ "bin": {
32
+ "mdsn": "./dist/cli/entry.js"
33
+ },
34
+ "files": [
35
+ "dist",
36
+ "README.md",
37
+ "LICENSE"
38
+ ],
39
+ "exports": {
40
+ ".": {
41
+ "types": "./dist/index.d.ts",
42
+ "import": "./dist/index.js",
43
+ "require": "./dist/index.js",
44
+ "default": "./dist/index.js"
45
+ },
46
+ "./core": {
47
+ "types": "./dist/core/index.d.ts",
48
+ "import": "./dist/core/index.js",
49
+ "require": "./dist/core/index.js",
50
+ "default": "./dist/core/index.js"
51
+ },
52
+ "./web": {
53
+ "types": "./dist/web/index.d.ts",
54
+ "import": "./dist/web/index.js",
55
+ "require": "./dist/web/index.js",
56
+ "default": "./dist/web/index.js"
57
+ },
58
+ "./server": {
59
+ "types": "./dist/server/index.d.ts",
60
+ "import": "./dist/server/index.js",
61
+ "require": "./dist/server/index.js",
62
+ "default": "./dist/server/index.js"
63
+ },
64
+ "./framework": {
65
+ "types": "./dist/framework/index.d.ts",
66
+ "import": "./dist/framework/index.js",
67
+ "require": "./dist/framework/index.js",
68
+ "default": "./dist/framework/index.js"
69
+ },
70
+ "./cli": {
71
+ "types": "./dist/cli/index.d.ts",
72
+ "import": "./dist/cli/index.js",
73
+ "require": "./dist/cli/index.js",
74
+ "default": "./dist/cli/index.js"
75
+ },
76
+ "./package.json": "./package.json"
77
+ },
78
+ "scripts": {
79
+ "build": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.build.json",
80
+ "framework:dev": "tsx src/cli/entry.ts dev",
81
+ "framework:start": "tsx src/cli/entry.ts start",
82
+ "framework:build": "tsx src/cli/entry.ts build",
83
+ "framework:create": "tsx src/cli/entry.ts create",
84
+ "typecheck": "tsc --noEmit -p tsconfig.json",
85
+ "test": "npm run build && cd .. && vitest run --exclude='.worktrees/**'"
86
+ },
87
+ "dependencies": {
88
+ "express": "^4.21.2",
89
+ "markdown-it": "^14.1.0"
90
+ }
91
+ }