@webx-ui/module-auth 0.13.0 → 0.14.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.
@@ -1 +0,0 @@
1
- {"version":3,"file":"ConnectPage-CGGeG8--.js","sources":["../src/ContentRulesCard.vue","../src/ConnectPage.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, onMounted, ref } from 'vue'\nimport { useAdmin, useErrorText, useTranslate, WxScreen } from '@webx-ui/module-admin'\nimport { toast, WxButton, WxCard, WxHeading, WxSkeleton, WxText } from '@webx-ui/core'\nimport { useAuthMessages } from './i18n'\n\n/** The values as the screen holds them, keyed by field name. */\ntype Values = Record<string, unknown>\n\n/**\n * The site's house rules for content — tone, what it never says, notes — beside the place\n * agents are connected, since agents are who reads them (`settings://content-rules`).\n *\n * They are `module-settings`' values on its own screen; this card shows only when that module is\n * installed and says which screen it is, and only to whoever may see the settings. Saving needs\n * the right to change them; without it the card is read-only. The card is this component's, not\n * the screen's — its root is a plain column — so «Save» sits in the card's own footer.\n */\nconst admin = useAdmin()\nuseAuthMessages()\n\nconst t = useTranslate('webx-auth')\nconst panel = useTranslate('webx-admin')\nconst message = useErrorText()\n\nconst screen = computed<string | null>(() => {\n const meta = admin.state.manifest?.modules.find((module) => module.id === 'settings')?.meta\n const name = meta?.content_screen\n\n return typeof name === 'string' ? name : null\n})\n\nconst canSee = admin.can('settings.view') || admin.can('settings.manage')\nconst canManage = admin.can('settings.manage')\n\nconst values = ref<Values>({})\nconst errors = ref<Record<string, string[]>>({})\nconst loading = ref(true)\nconst saving = ref(false)\n\nconst endpoint = `${admin.apiPath}/settings/content`\n\nonMounted(async () => {\n if (!screen.value || !canSee) return\n\n try {\n const body = await admin.http.get<{ data: { values: Values } }>(endpoint)\n\n values.value = body.data.values\n } catch (error) {\n toast.danger(message(error))\n } finally {\n loading.value = false\n }\n})\n\nasync function save(): Promise<void> {\n saving.value = true\n errors.value = {}\n\n try {\n const body = await admin.http.put<{ data: { values: Values } }>(endpoint, {\n values: values.value,\n })\n\n values.value = body.data.values\n toast.success(panel('editor.saved'))\n } catch (error) {\n const answer = (error as { body?: { errors?: Record<string, string[]> } }).body\n\n if (answer?.errors) errors.value = answer.errors\n\n toast.danger(message(error))\n } finally {\n saving.value = false\n }\n}\n</script>\n\n<template>\n <section v-if=\"screen && canSee\" class=\"wx-content-rules\">\n <wx-heading :level=\"2\" size=\"sm\">{{ t('connect.rules') }}</wx-heading>\n\n <wx-card>\n <wx-skeleton v-if=\"loading\" :rows=\"4\" />\n <wx-screen v-else v-model=\"values\" :name=\"screen\" :errors=\"errors\" :disabled=\"!canManage\" />\n\n <template v-if=\"!loading\" #footer>\n <div class=\"wx-content-rules__foot\">\n <wx-text size=\"sm\" tone=\"muted\">{{ t('connect.rules-hint') }}</wx-text>\n <wx-button v-if=\"canManage\" type=\"primary\" :loading=\"saving\" @click=\"save\">{{\n panel('editor.save')\n }}</wx-button>\n </div>\n </template>\n </wx-card>\n </section>\n</template>\n\n<style scoped>\n/* A section of the page like the others: its heading above, the card under it. */\n.wx-content-rules {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-12);\n min-width: 0;\n}\n\n.wx-content-rules__foot {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: var(--wx-space-12);\n}\n</style>\n","<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport { useAdmin, useTranslate, WxListScreen } from '@webx-ui/module-admin'\nimport {\n toast,\n WxAlert,\n WxButton,\n WxCard,\n WxHeading,\n WxIcon,\n WxTab,\n WxTabs,\n WxText,\n} from '@webx-ui/core'\nimport { copyText } from './clipboard'\nimport ConnectionList from './ConnectionList.vue'\nimport ContentRulesCard from './ContentRulesCard.vue'\nimport { useAuthMessages } from './i18n'\n\n/**\n * How a person connects their own agent, on one page.\n *\n * It exists because the alternative is explaining it — over a call, to somebody who has never\n * heard of MCP and has no reason to. So the page is written for that call: the address large\n * enough to read out, a button that copies it, and three steps for each client, in the order\n * they appear on that client's screen.\n *\n * The address carries no secret, which is the whole point of the OAuth path (§2.3 of the\n * spec): it can be printed in a letter, read aloud, or left on this page for anybody signed\n * in. What a person has to do themselves is sign in, and that happens on our own screen.\n *\n * Then the rules agents read before they write, when the site keeps them. Under them are their\n * own connections, because the first thing somebody does after connecting\n * is look for proof that it worked — and the second, weeks later, is come back to end it.\n */\nconst admin = useAdmin()\nuseAuthMessages()\n\nconst t = useTranslate('webx-auth')\n\nconst copied = ref(false)\nlet copiedTimer: ReturnType<typeof setTimeout> | undefined\n\n/**\n * The address agents connect to, as the server printed it — absolute, because it is pasted\n * into a program on another machine.\n */\nconst url = computed<string>(() => {\n const meta = admin.state.manifest?.modules.find((module) => module.id === 'connect')?.meta\n\n return typeof meta?.url === 'string' ? meta.url : ''\n})\n\n/**\n * What the server is called in the client's own list of servers.\n *\n * The site's own name, taken off the address: somebody with three sites connected reads this\n * word and nothing else, and \"webx\" three times over would be three servers they cannot tell\n * apart.\n */\nconst name = computed<string>(() => {\n try {\n return new URL(url.value).hostname.split('.')[0] || 'webx'\n } catch {\n return 'webx'\n }\n})\n\nconst command = computed(() => `claude mcp add --transport http ${name.value} ${url.value}`)\n\nconst toml = computed(() => `[mcp_servers.${name.value}]\\nurl = \"${url.value}\"`)\n\n/**\n * The links Cursor and VS Code take a whole server from. Both are documented shapes, and both\n * carry only the address — there is nothing secret to leak into a link.\n */\nconst cursorLink = computed(() => {\n const config = encode(JSON.stringify({ url: url.value }))\n\n return `cursor://anysphere.cursor-deeplink/mcp/install?name=${encodeURIComponent(name.value)}&config=${config}`\n})\n\nconst vscodeLink = computed(() => {\n const config = JSON.stringify({ name: name.value, type: 'http', url: url.value })\n\n return `vscode:mcp/install?${encodeURIComponent(config)}`\n})\n\n/** Base64 of a UTF-8 string: `btoa` alone throws on anything above ASCII. */\nfunction encode(value: string): string {\n const bytes = new TextEncoder().encode(value)\n let binary = ''\n\n for (const byte of bytes) binary += String.fromCharCode(byte)\n\n return encodeURIComponent(btoa(binary))\n}\n\n/** Copying the address — the one thing the person came here for — and saying so either way. */\nasync function copy(value: string): Promise<void> {\n if (!(await copyText(value))) {\n toast.danger(t('connect.copy-failed'))\n\n return\n }\n\n copied.value = true\n clearTimeout(copiedTimer)\n copiedTimer = setTimeout(() => (copied.value = false), 2000)\n}\n</script>\n\n<template>\n <wx-list-screen :title=\"t('connect.title')\" :card=\"false\">\n <div class=\"wx-connect\">\n <wx-text class=\"wx-connect__lead\">{{ t('connect.lead') }}</wx-text>\n\n <!-- The address, large. Everything else on this page is about what to do with it. Its\n heading is the page's section heading, as every other part of the page has. -->\n <section class=\"wx-connect__section\">\n <wx-heading :level=\"2\" size=\"sm\">{{ t('connect.address') }}</wx-heading>\n\n <wx-card bordered>\n <div class=\"wx-connect__row\">\n <code class=\"wx-connect__url\">{{ url }}</code>\n\n <wx-button type=\"primary\" :disabled=\"url === ''\" @click=\"copy(url)\">\n <template #icon><wx-icon :name=\"copied ? 'check' : 'copy'\" /></template>\n {{ copied ? t('connect.copied') : t('connect.copy') }}\n </wx-button>\n </div>\n </wx-card>\n </section>\n\n <section class=\"wx-connect__section\">\n <wx-heading :level=\"2\" size=\"sm\">{{ t('connect.how') }}</wx-heading>\n\n <wx-tabs variant=\"line\" :aria-label=\"t('connect.how')\">\n <wx-tab value=\"claude\" :label=\"t('connect.claude-title')\">\n <ol class=\"wx-connect__steps\">\n <li>{{ t('connect.claude-1') }}</li>\n <li>{{ t('connect.claude-2') }}</li>\n <li>{{ t('connect.claude-3') }}</li>\n </ol>\n </wx-tab>\n\n <wx-tab value=\"chatgpt\" :label=\"t('connect.chatgpt-title')\">\n <ol class=\"wx-connect__steps\">\n <li>{{ t('connect.chatgpt-1') }}</li>\n <li>{{ t('connect.chatgpt-2') }}</li>\n <li>{{ t('connect.chatgpt-3') }}</li>\n </ol>\n </wx-tab>\n\n <wx-tab value=\"claude-code\" :label=\"t('connect.claude-code-title')\">\n <wx-text size=\"sm\">{{ t('connect.claude-code-hint') }}</wx-text>\n\n <div class=\"wx-connect__snippet\">\n <pre>{{ command }}</pre>\n <wx-button variant=\"text\" size=\"sm\" @click=\"copy(command)\">\n <template #icon><wx-icon name=\"copy\" /></template>\n {{ t('connect.copy-line') }}\n </wx-button>\n </div>\n </wx-tab>\n\n <wx-tab value=\"codex\" :label=\"t('connect.codex-title')\">\n <wx-text size=\"sm\">{{ t('connect.codex-hint') }}</wx-text>\n\n <div class=\"wx-connect__snippet\">\n <pre>{{ toml }}</pre>\n <wx-button variant=\"text\" size=\"sm\" @click=\"copy(toml)\">\n <template #icon><wx-icon name=\"copy\" /></template>\n {{ t('connect.copy-line') }}\n </wx-button>\n </div>\n </wx-tab>\n </wx-tabs>\n </section>\n\n <section class=\"wx-connect__section\">\n <wx-heading :level=\"2\" size=\"sm\">{{ t('connect.one-click') }}</wx-heading>\n <wx-text size=\"sm\" tone=\"muted\">{{ t('connect.one-click-hint') }}</wx-text>\n\n <div class=\"wx-connect__links\">\n <wx-button\n :href=\"cursorLink\"\n variant=\"outline\"\n :disabled=\"url === ''\"\n class=\"wx-connect__link\"\n >\n <template #icon><wx-icon name=\"external-link\" /></template>\n {{ t('connect.install-in', { client: t('connect.cursor-title') }) }}\n </wx-button>\n\n <wx-button\n :href=\"vscodeLink\"\n variant=\"outline\"\n :disabled=\"url === ''\"\n class=\"wx-connect__link\"\n >\n <template #icon><wx-icon name=\"external-link\" /></template>\n {{ t('connect.install-in', { client: t('connect.vscode-title') }) }}\n </wx-button>\n </div>\n </section>\n\n <wx-alert type=\"info\" :title=\"t('connect.next')\">\n <ol class=\"wx-connect__steps\">\n <li>{{ t('connect.next-1') }}</li>\n <li>{{ t('connect.next-2') }}</li>\n <li>{{ t('connect.next-3') }}</li>\n </ol>\n </wx-alert>\n\n <content-rules-card />\n\n <section class=\"wx-connect__section\">\n <wx-heading :level=\"2\" size=\"sm\">{{ t('connect.mine') }}</wx-heading>\n\n <wx-card padding=\"none\">\n <connection-list scope=\"mine\" />\n </wx-card>\n </section>\n </div>\n </wx-list-screen>\n</template>\n\n<style scoped>\n.wx-connect {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-24);\n min-width: 0;\n}\n\n.wx-connect__lead {\n max-width: 68ch;\n}\n\n/* The address and its button on one line, and under each other as soon as they do not fit:\n the address is long, and shrinking it is what would make it unreadable. */\n.wx-connect__row {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--wx-space-12);\n}\n\n.wx-connect__url {\n flex: 1 1 260px;\n min-width: 0;\n padding: var(--wx-space-10) var(--wx-space-12);\n border-radius: var(--wx-radius-sm);\n background: var(--wx-bg-subtle);\n color: var(--wx-text-default);\n font-family: var(--wx-font-family-mono);\n font-size: var(--wx-font-size-md);\n /* Broken anywhere rather than pushed off the card: it is read, not clicked. */\n word-break: break-all;\n}\n\n.wx-connect__section {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-12);\n min-width: 0;\n}\n\n.wx-connect__steps {\n display: flex;\n flex-direction: column;\n gap: var(--wx-space-8);\n margin: 0;\n padding-left: var(--wx-space-24);\n color: var(--wx-text-default);\n font-size: var(--wx-font-size-sm);\n line-height: var(--wx-font-line-height-relaxed);\n}\n\n.wx-connect__snippet {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n justify-content: space-between;\n gap: var(--wx-space-8);\n padding: var(--wx-space-12);\n border-radius: var(--wx-radius-sm);\n background: var(--wx-bg-subtle);\n}\n\n.wx-connect__snippet pre {\n flex: 1 1 240px;\n margin: 0;\n min-width: 0;\n color: var(--wx-text-default);\n font-family: var(--wx-font-family-mono);\n font-size: var(--wx-font-size-xs);\n line-height: var(--wx-font-line-height-relaxed);\n white-space: pre-wrap;\n word-break: break-all;\n}\n\n.wx-connect__links {\n display: flex;\n flex-wrap: wrap;\n gap: var(--wx-space-12);\n}\n</style>\n"],"names":["admin","useAdmin","useAuthMessages","useTranslate","panel","message","useErrorText","screen","computed","name","module","canSee","canManage","values","ref","errors","loading","saving","endpoint","onMounted","body","error","toast","save","answer","_unref","_openBlock","_createElementBlock","_hoisted_1","_createVNode","WxHeading","WxCard","_createSlots","_createBlock","WxSkeleton","WxScreen","$event","_createElementVNode","_hoisted_2","WxText","WxButton","copied","copiedTimer","url","meta","command","toml","cursorLink","config","encode","vscodeLink","value","bytes","binary","byte","copy","copyText","WxListScreen","_hoisted_3","_hoisted_4","_toDisplayString","_cache","WxIcon","_createTextVNode","_hoisted_5","WxTabs","WxTab","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","WxAlert","_hoisted_12","ContentRulesCard","_hoisted_13","ConnectionList"],"mappings":"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"}