@aotter/mantle-admin 0.1.0-alpha.9 → 0.1.2-alpha.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.
@@ -0,0 +1,104 @@
1
+ /** Minimal functional OAuth fallback for deployments without Admin assets. */
2
+ /** Detect consent UI locale from Accept-Language header. */
3
+ export function detectOAuthFallbackLocale(acceptLanguage) {
4
+ if (!acceptLanguage)
5
+ return "en";
6
+ const lower = acceptLanguage.toLowerCase();
7
+ if (lower.includes("zh-tw") || lower.includes("zh_tw"))
8
+ return "zh-TW";
9
+ return "en";
10
+ }
11
+ const STRINGS = {
12
+ en: {
13
+ title: "Authorize · mantle",
14
+ eyebrow: "Connect an MCP client",
15
+ heading: (client) => `Connect ${client}?`,
16
+ body: (client) => `${client} will be able to use this site's management tools through MCP. What it can view or change is still limited by your account permissions.`,
17
+ approve: "Connect",
18
+ deny: "Cancel",
19
+ invalidTitle: "Invalid authorization request",
20
+ invalidBody: "Missing or malformed consent payload. Return to your MCP client and try again.",
21
+ appsTitle: "MCP connections · mantle",
22
+ appsEyebrow: "Your account",
23
+ appsHeading: "MCP connections",
24
+ appsBody: "These MCP clients can use the site's management tools. Every action is still checked against your current account permissions.",
25
+ appsEmpty: "No MCP clients are connected.",
26
+ revoke: "Disconnect",
27
+ back: "Back to admin",
28
+ },
29
+ "zh-TW": {
30
+ title: "授權 · mantle",
31
+ eyebrow: "連結 MCP 客戶端",
32
+ heading: (client) => `要連結 ${client} 嗎?`,
33
+ body: (client) => `${client} 將能透過 MCP 使用這個網站提供的管理工具;它能查看或變更哪些內容,仍會依照你的帳號權限決定。`,
34
+ approve: "連結",
35
+ deny: "取消",
36
+ invalidTitle: "無效的授權請求",
37
+ invalidBody: "缺少或格式錯誤的授權資訊,請返回 MCP 客戶端重試。",
38
+ appsTitle: "MCP 連線 · mantle",
39
+ appsEyebrow: "你的帳號",
40
+ appsHeading: "MCP 連線",
41
+ appsBody: "這些 MCP 客戶端可以使用網站提供的管理工具;每次操作仍會依照你當下的帳號權限檢查。",
42
+ appsEmpty: "目前沒有已連結的 MCP 客戶端。",
43
+ revoke: "中斷連線",
44
+ back: "返回管理後台",
45
+ },
46
+ };
47
+ function escapeHtml(s) {
48
+ return s
49
+ .replace(/&/g, "&")
50
+ .replace(/</g, "&lt;")
51
+ .replace(/>/g, "&gt;")
52
+ .replace(/"/g, "&quot;")
53
+ .replace(/'/g, "&#39;");
54
+ }
55
+ const CSS = `
56
+ :root{color-scheme:light dark;font:1rem/1.5 system-ui,sans-serif}
57
+ body{margin:0;padding:2rem 1rem}
58
+ main{max-width:32rem;margin:10vh auto}
59
+ h1{font-size:1.5rem}
60
+ code{overflow-wrap:anywhere}
61
+ button{font:inherit;padding:.5rem 1rem;cursor:pointer}
62
+ button:focus-visible,a:focus-visible{outline:2px solid currentColor;outline-offset:3px}
63
+ .actions{display:flex;flex-wrap:wrap;gap:.75rem}
64
+ .app{padding:1rem 0;border-bottom:1px solid GrayText}
65
+ .apps{margin-bottom:2rem}
66
+ `.trim();
67
+ export function renderConsentFallbackHtml(locale, model) {
68
+ const t = STRINGS[locale];
69
+ const lang = locale === "zh-TW" ? "zh-Hant-TW" : "en";
70
+ const head = `<!doctype html><html lang="${lang}"><head><meta charset="utf-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/><title>${t.title}</title><style>${CSS}</style></head><body><main class="card">`;
71
+ const tail = `</main></body></html>`;
72
+ if (!model) {
73
+ return `${head}<p class="eyebrow">${t.eyebrow}</p><h1>${t.invalidTitle}</h1><p class="muted">${t.invalidBody}</p>${tail}`;
74
+ }
75
+ return (`${head}` +
76
+ `<p class="eyebrow">${t.eyebrow}</p>` +
77
+ `<h1>${t.heading(escapeHtml(model.clientName))}</h1>` +
78
+ `<p class="muted">${t.body(escapeHtml(model.clientName))}</p>` +
79
+ `<form class="actions" method="post" action="/oauth/consent">` +
80
+ `<input type="hidden" name="oauth_query" value="${escapeHtml(model.oauthQuery)}"/>` +
81
+ `<button type="submit" name="decision" value="approve">${t.approve}</button>` +
82
+ `<button type="submit" name="decision" value="deny">${t.deny}</button>` +
83
+ `</form>` +
84
+ `${tail}`);
85
+ }
86
+ export function renderConnectedAppsFallbackHtml(locale, consents) {
87
+ const t = STRINGS[locale];
88
+ const lang = locale === "zh-TW" ? "zh-Hant-TW" : "en";
89
+ const apps = consents.length === 0
90
+ ? `<p class="muted">${t.appsEmpty}</p>`
91
+ : `<div class="apps">${consents.map((consent) => (`<section class="app"><h2>${escapeHtml(consent.clientName)}</h2>` +
92
+ `<code>${escapeHtml(consent.clientId)}</code>` +
93
+ `<form method="post" action="/oauth/consents/revoke">` +
94
+ `<input type="hidden" name="consent_id" value="${escapeHtml(consent.id)}"/>` +
95
+ `<button type="submit">${t.revoke}</button>` +
96
+ `</form></section>`)).join("")}</div>`;
97
+ return (`<!doctype html><html lang="${lang}"><head><meta charset="utf-8"/>` +
98
+ `<meta name="viewport" content="width=device-width,initial-scale=1"/>` +
99
+ `<title>${t.appsTitle}</title><style>${CSS}</style></head><body><main class="card">` +
100
+ `<p class="eyebrow">${t.appsEyebrow}</p><h1>${t.appsHeading}</h1>` +
101
+ `<p class="muted">${t.appsBody}</p>${apps}<a class="back" href="/admin">${t.back}</a>` +
102
+ `</main></body></html>`);
103
+ }
104
+ //# sourceMappingURL=oauthFallbackHtml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauthFallbackHtml.js","sourceRoot":"","sources":["../src/oauthFallbackHtml.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function rejectCrossOriginMutation(request: Request): Response | null;
2
+ //# sourceMappingURL=rejectCrossOriginMutation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rejectCrossOriginMutation.d.ts","sourceRoot":"","sources":["../src/rejectCrossOriginMutation.ts"],"names":[],"mappings":"AAAA,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,GAAG,IAAI,CAa3E"}
@@ -0,0 +1,15 @@
1
+ export function rejectCrossOriginMutation(request) {
2
+ if (request.method === "GET" || request.method === "HEAD" || request.method === "OPTIONS") {
3
+ return null;
4
+ }
5
+ const site = request.headers.get("sec-fetch-site");
6
+ if (site && site !== "same-origin" && site !== "none") {
7
+ return new Response("cross-origin session mutation rejected", { status: 403 });
8
+ }
9
+ const origin = request.headers.get("origin");
10
+ if (origin && origin !== new URL(request.url).origin) {
11
+ return new Response("origin mismatch", { status: 403 });
12
+ }
13
+ return null;
14
+ }
15
+ //# sourceMappingURL=rejectCrossOriginMutation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rejectCrossOriginMutation.js","sourceRoot":"","sources":["../src/rejectCrossOriginMutation.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,yBAAyB,CAAC,OAAgB;IACxD,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC1F,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACnD,IAAI,IAAI,IAAI,IAAI,KAAK,aAAa,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACtD,OAAO,IAAI,QAAQ,CAAC,wCAAwC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACjF,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC7C,IAAI,MAAM,IAAI,MAAM,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;QACrD,OAAO,IAAI,QAAQ,CAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { McpJsonRpcDispatcher, type McpToolDefinition, type MantleRuntime, type RuntimePlan } from "@aotter/mantle-runtime";
2
+ /** Same catalog and dispatcher as staff MCP; the caller supplies verified session context. */
3
+ export declare function staffMcp(runtime: MantleRuntime, plan: RuntimePlan): Promise<{
4
+ tools: readonly McpToolDefinition[];
5
+ routes: Record<string, {
6
+ path: string;
7
+ entry?: boolean;
8
+ }>;
9
+ dispatcher: McpJsonRpcDispatcher;
10
+ }>;
11
+ //# sourceMappingURL=staffMcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"staffMcp.d.ts","sourceRoot":"","sources":["../src/staffMcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,oBAAoB,EAA+B,KAAK,iBAAiB,EAAE,KAAK,aAAa,EAAE,KAAK,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAG9K,8FAA8F;AAC9F,wBAAsB,QAAQ,CAAC,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAAC,UAAU,EAAE,oBAAoB,CAAA;CAAE,CAAC,CAwCvN"}
@@ -0,0 +1,47 @@
1
+ import { buildMcpToolCatalog, McpJsonRpcDispatcher, projectCallableCapabilities } from "@aotter/mantle-runtime";
2
+ import { mcpToolNameSegment } from "@aotter/mantle-spec";
3
+ /** Same catalog and dispatcher as staff MCP; the caller supplies verified session context. */
4
+ export async function staffMcp(runtime, plan) {
5
+ const site = await runtime.siteConfig?.load();
6
+ const purposes = runtime.media ? site?.media.purposes ?? [] : [];
7
+ const capabilities = projectCallableCapabilities(plan, { surface: "staff" });
8
+ const schemas = [...runtime.schemas.values()];
9
+ const media = runtime.media && purposes.length ? { ...runtime.media, purposes } : undefined;
10
+ const options = { surface: "staff", capabilities };
11
+ const tools = buildMcpToolCatalog(schemas, { ...options, mediaEnabled: !!media, mediaPurposes: purposes });
12
+ const routes = {};
13
+ for (const schema of schemas) {
14
+ for (const prefix of ["create_draft_", "update_draft_", "create_record_", "update_record_"]) {
15
+ routes[prefix + mcpToolNameSegment(schema.metadata.name)] = {
16
+ path: `/admin/c/${encodeURIComponent(schema.metadata.name)}`, entry: true,
17
+ };
18
+ }
19
+ }
20
+ for (const capability of capabilities) {
21
+ if (capability.kind === "view") {
22
+ routes[capability.name] = { path: `/admin/views/${encodeURIComponent(capability.ownerName)}` };
23
+ }
24
+ else {
25
+ const handler = capability.manifest.spec.handler;
26
+ if (handler.kind === "builtin")
27
+ routes[capability.name] = {
28
+ path: `/admin/c/${encodeURIComponent(handler.schema)}`,
29
+ entry: handler.op !== "delete",
30
+ };
31
+ }
32
+ }
33
+ routes.commit_media_upload = { path: "/admin/media" };
34
+ return {
35
+ tools, routes,
36
+ dispatcher: new McpJsonRpcDispatcher({
37
+ getEntry: runtime.getEntry,
38
+ createDraft: runtime.createDraft, updateDraft: runtime.updateDraft,
39
+ requestPublish: runtime.requestPublish, unpublish: runtime.unpublish,
40
+ archive: runtime.archive, deleteEntry: runtime.deleteEntry,
41
+ executeView: { execute: request => runtime.executeView({ ...request, view: request.view.metadata.name }) },
42
+ invokeTrigger: { execute: request => runtime.invokeTrigger(request) },
43
+ media,
44
+ }, schemas, options),
45
+ };
46
+ }
47
+ //# sourceMappingURL=staffMcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"staffMcp.js","sourceRoot":"","sources":["../src/staffMcp.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aotter/mantle-admin",
3
- "version": "0.1.0-alpha.9",
3
+ "version": "0.1.2-alpha.1",
4
4
  "description": "Optional Mantle Admin API, auth, and static-asset composition.",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://mantle.tools/",
@@ -29,17 +29,17 @@
29
29
  "README.md"
30
30
  ],
31
31
  "dependencies": {
32
- "@aotter/mantle-runtime": "0.1.0-alpha.9",
33
- "@aotter/mantle-spec": "0.1.0-alpha.9"
32
+ "@aotter/mantle-runtime": "0.1.2-alpha.1",
33
+ "@aotter/mantle-spec": "0.1.2-alpha.1"
34
34
  },
35
35
  "peerDependencies": {
36
36
  "hono": "^4.12.0"
37
37
  },
38
38
  "devDependencies": {
39
39
  "@types/node": "^26",
40
- "hono": "^4.12.34",
40
+ "hono": "^4.13.3",
41
41
  "typescript": "^6.0.3",
42
- "vitest": "^4.1.10"
42
+ "vitest": "^4.1.11"
43
43
  },
44
44
  "scripts": {
45
45
  "prebuild": "rm -rf dist .tsbuildinfo",