diff --git a/src/components/BackendSwitcher.vue b/src/components/BackendSwitcher.vue index 96ce86df..fd703d61 100644 --- a/src/components/BackendSwitcher.vue +++ b/src/components/BackendSwitcher.vue @@ -75,9 +75,14 @@ const isLoading = ref(false); const protocolList = location.protocol === "https:" ? ["wss"] : ["wss", "ws"]; const newUrl = computed(() => { - const host = parseHost(newHost.value); - if (!host) return ""; - return `${newProtocol.value}//${host}${newPathname.value}`; + if (!newHost.value) return ""; + try { + const host = parseHost(newHost.value); + if (!host) return ""; + return `${newProtocol.value}//${host}${newPathname.value}`; + } catch { + return ""; + } }); /** diff --git a/src/components/agents/ShowAgentCommandDialog.vue b/src/components/agents/ShowAgentCommandDialog.vue new file mode 100644 index 00000000..0fd962f2 --- /dev/null +++ b/src/components/agents/ShowAgentCommandDialog.vue @@ -0,0 +1,209 @@ + + + diff --git a/src/components/agents/generateToken.ts b/src/components/agents/generateToken.ts index 4e5168c1..d7663a8b 100644 --- a/src/components/agents/generateToken.ts +++ b/src/components/agents/generateToken.ts @@ -42,3 +42,25 @@ export async function preGenerateToken( console.error("Token pre-generation failed:", e); } } + +export async function reGenerateToken( + nodeUuid: string, + backend = currentBackend, +) { + if (!backend.value) return; + try { + try { + await getWsConnection(backend.value.url).call<{ + key?: string; + secret?: string; + }>("token_delete", { + token: backend.value.token, + target_token: `[agent]:${nodeUuid}`, + }); + } catch {} + + return preGenerateToken(nodeUuid, backend); + } catch (e) { + console.error("Token re-generation failed:", e); + } +} diff --git a/src/components/extensions/ExtensionDetail.vue b/src/components/extensions/ExtensionDetail.vue index 7bece3cc..67367272 100644 --- a/src/components/extensions/ExtensionDetail.vue +++ b/src/components/extensions/ExtensionDetail.vue @@ -173,6 +173,8 @@ const saveFile = async () => { props.extension.id, selectedFile.value, encoded.buffer as ArrayBuffer, + undefined, + props.extension.storage, ); fileContent.value = editedContent.value; toast.success("已保存"); @@ -195,6 +197,7 @@ const handleFileUpload = async (e: Event) => { selectedFile.value, content, file.type || undefined, + props.extension.storage, ); fileContent.value = await new Response(content).text(); toast.success("已上传"); @@ -353,7 +356,7 @@ const loadFileContent = async (path: string) => { fileLoading.value = true; try { - const url = getStaticUrl(props.extension.id, path); + const url = getStaticUrl(props.extension.id, path, props.extension.storage); const resp = await fetch(url); if (!resp.ok) throw new Error(`${resp.status} ${resp.statusText}`); fileContent.value = await resp.text(); diff --git a/src/components/node-manage/NodeManageTabAgents.vue b/src/components/node-manage/NodeManageTabAgents.vue index a031cf9f..e2c3df83 100644 --- a/src/components/node-manage/NodeManageTabAgents.vue +++ b/src/components/node-manage/NodeManageTabAgents.vue @@ -16,6 +16,8 @@ import { CloudDownload, Info, Router, + LifeBuoy, + LifeBuoyIcon, } from "lucide-vue-next"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; @@ -50,8 +52,10 @@ import codeCopy from "@/components/node-manage/codeCopy.vue"; import { useBackendStore } from "@/composables/useBackendStore"; import { getWsConnection } from "@/composables/useWsConnection"; import AddAgentDialog from "@/components/agents/AddAgentDialog.vue"; +import ShowAgentCommandDialog from "@/components/agents/ShowAgentCommandDialog.vue"; import { useAgentInfo } from "@/composables/useAgentInfo"; import VersionDialog from "@/components/node-manage/VersionDialog.vue"; +import { PopConfirm } from "@/components/ui/pop-confirm"; import { compareVersions } from "compare-versions"; import { useTask } from "@/composables/useTask"; @@ -72,6 +76,8 @@ const { agents, loading, fetchAgents, fetchAgentVersion } = currentAgentInfo; const searchQuery = ref(""); const selectedUuids = ref>(new Set()); const addAgentOpen = ref(false); +const showAgentCommandOpen = ref(false); +const showCommandAgentUuid = ref(""); const sortable = ref(false); const changeVersionOpen = ref(false); @@ -558,6 +564,25 @@ refresh(); > + + +