()
| 32 | type ScriptOrSubscribe = Script | Subscribe; |
| 33 | |
| 34 | export function useInstallData() { |
| 35 | const [enable, setEnable] = useState<boolean>(false); |
| 36 | const [btnText, setBtnText] = useState<string>(""); |
| 37 | const [scriptCode, setScriptCode] = useState<string>(""); |
| 38 | const [scriptInfo, setScriptInfo] = useState<ScriptInfo>(); |
| 39 | const [upsertScript, setUpsertScript] = useState<ScriptOrSubscribe | undefined>(undefined); |
| 40 | const [diffCode, setDiffCode] = useState<string>(); |
| 41 | const [oldScriptVersion, setOldScriptVersion] = useState<string | null>(null); |
| 42 | const [isUpdate, setIsUpdate] = useState<boolean>(false); |
| 43 | const [localFileHandle, setLocalFileHandle] = useState<FileSystemFileHandle | null>(null); |
| 44 | const [showBackgroundPrompt, setShowBackgroundPrompt] = useState<boolean>(false); |
| 45 | const { t } = useTranslation(); |
| 46 | const [searchParams, setSearchParams] = useSearchParams(); |
| 47 | const [loaded, setLoaded] = useState<boolean>(false); |
| 48 | const [doBackwards, setDoBackwards] = useState<boolean>(false); |
| 49 | const [skillScriptMetadata, setSkillScriptMetadata] = useState<SkillScriptMetadata | null>(null); |
| 50 | const [watchFile, setWatchFile] = useState(false); |
| 51 | const closingWindowRef = useRef(false); |
| 52 | |
| 53 | // Skill 安装相关状态(agent 关闭时不识别 skill 入口) |
| 54 | const skillInstallUuid = EnableAgent ? searchParams.get("skill") : null; |
| 55 | const [skillPreview, setSkillPreview] = useState<{ |
| 56 | metadata: { name: string; description: string; version?: string }; |
| 57 | prompt: string; |
| 58 | scripts: Array<{ name: string; code: string }>; |
| 59 | references: Array<{ name: string; content: string }>; |
| 60 | isUpdate: boolean; |
| 61 | installUrl?: string; |
| 62 | } | null>(null); |
| 63 | |
| 64 | const installOrUpdateScript = async (newScript: Script, code: string) => { |
| 65 | if (newScript.ignoreVersion) newScript.ignoreVersion = ""; |
| 66 | await scriptClient.install({ script: newScript, code }); |
| 67 | const metadata = newScript.metadata; |
| 68 | setScriptInfo((prev) => (prev ? { ...prev, code, metadata } : prev)); |
| 69 | const scriptVersion = metadata.version?.[0]; |
| 70 | const oldScriptVersion = typeof scriptVersion === "string" ? scriptVersion : "N/A"; |
| 71 | setOldScriptVersion(oldScriptVersion); |
| 72 | setUpsertScript(newScript); |
| 73 | setDiffCode(code); |
| 74 | }; |
| 75 | |
| 76 | const getUpdatedNewScript = async (uuid: string, code: string) => { |
| 77 | const oldScript = await scriptClient.info(uuid); |
| 78 | if (!oldScript || oldScript.uuid !== uuid) { |
| 79 | throw new Error("uuid is mismatched"); |
| 80 | } |
| 81 | const { script } = await prepareScriptByCode(code, oldScript.origin || "", uuid); |
| 82 | script.origin = oldScript.origin || script.origin || ""; |
| 83 | if (!script.name) { |
| 84 | throw new Error(t("script_name_cannot_be_set_to_empty")); |
| 85 | } |
| 86 | return script; |
| 87 | }; |
| 88 | |
| 89 | const checkBackgroundPrompt = async (script: Script) => { |
| 90 | if (!script.metadata.background && !script.metadata.crontab) { |
| 91 | return false; |
no test coverage detected