mirror of
https://github.com/sune-org/store.git
synced 2026-01-13 16:17:58 +00:00
1 line
8.7 KiB
JSON
1 line
8.7 KiB
JSON
[{"id":"bthcn7s","name":"Log","pinned":false,"avatar":"data:image/webp;base64,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","url":"gh://sune-org/store/log.sune","updatedAt":1757462697767,"settings":{"model":"openai/gpt-5-chat","temperature":"","top_p":"","top_k":"","frequency_penalty":"","repetition_penalty":"","min_p":"","top_a":"","verbosity":"","reasoning_effort":"default","system_prompt":"","html":"<div \n x-data=\"{\n state: {\n open: JSON.parse(localStorage.getItem(window.SUNE.id + '_logbox_open') || 'false'),\n copied: false\n },\n toggle() {\n this.state.open = !this.state.open;\n localStorage.setItem(window.SUNE.id + '_logbox_open', this.state.open);\n },\n copyLogs() {\n if (!this.$refs.logbox.innerText.trim()) return;\n navigator.clipboard.writeText(this.$refs.logbox.innerText).then(() => {\n this.state.copied = true;\n setTimeout(() => { this.state.copied = false }, 2000);\n }).catch(err => console.error('Sune Logbox: Failed to copy', err));\n }\n }\"\n x-init=\"lucide.createIcons()\"\n class=\"m-2 text-sm border rounded-lg bg-white shadow-lg dark:bg-gray-800 dark:border-gray-700\"\n>\n <div @click=\"toggle()\" class=\"flex items-center justify-between p-2 cursor-pointer border-b select-none dark:border-gray-700\">\n <div class=\"flex items-center gap-2 font-medium dark:text-gray-200\">\n <i data-lucide=\"terminal\" class=\"h-4 w-4\"></i>\n <span>Sune Console</span>\n </div>\n <div class=\"flex items-center gap-2\">\n <span class=\"text-xs text-gray-400\">v1.3.0</span>\n <button @click.stop=\"copyLogs()\" class=\"p-1 rounded hover:bg-gray-100 dark:hover:bg-gray-700\" title=\"Copy logs\">\n <i x-show=\"!state.copied\" data-lucide=\"copy\" class=\"h-4 w-4 text-gray-600 dark:text-gray-400\"></i>\n <i x-show=\"state.copied\" data-lucide=\"check\" class=\"h-4 w-4 text-green-500\"></i>\n </button>\n <button @click.stop=\"$refs.logbox.innerHTML=''\" class=\"p-1 rounded hover:bg-gray-100 dark:hover:bg-gray-700\" title=\"Clear logs\">\n <i data-lucide=\"trash-2\" class=\"h-4 w-4 text-gray-600 dark:text-gray-400\"></i>\n </button>\n <button @click.stop=\"toggle()\" class=\"p-1 rounded hover:bg-gray-100 dark:hover:bg-gray-700\" :aria-expanded=\"state.open\">\n <i x-show=\"!state.open\" data-lucide=\"chevron-down\" class=\"h-4 w-4 text-gray-600 dark:text-gray-400\"></i>\n <i x-show=\"state.open\" data-lucide=\"chevron-up\" class=\"h-4 w-4 text-gray-600 dark:text-gray-400\"></i>\n </button>\n </div>\n </div>\n <div x-show=\"state.open\" x-ref=\"logboxWrapper\" x-transition class=\"bg-gray-900 text-white font-mono text-xs p-2 max-h-80 overflow-y-auto rounded-b-lg\">\n <div x-ref=\"logbox\" class=\"whitespace-pre-wrap break-words\"></div>\n </div>\n</div>\n<script>\n(() => {\n const suneEl = document.currentScript.parentElement;\n const logbox = suneEl.querySelector('[x-ref=\"logbox\"]');\n if (!logbox) { console.error('Sune Logbox: Target element not found.'); return; }\n\n const oldConsole = { ...console };\n const esc = s => s.replace(/[&<>'\"]/g, c => ({'&':'&','<':'<','>':'>','\\'':''','\\\"':'"'}[c]));\n const formatArg = a => {\n if (typeof a === 'string') return esc(a);\n if (a instanceof Error) return esc(a.stack || a.message);\n try { return esc(JSON.stringify(a, null, 2)); } catch { return '[Unserializable]'; }\n };\n\n const print = (level, ...args) => {\n const c = { log:'text-gray-300', info:'text-blue-400', warn:'text-yellow-400', error:'text-red-400', debug:'text-purple-400' };\n const i = { log:'»', info:'ℹ', warn:'⚠', error:'✖', debug:'⚬' };\n const time = new Date().toLocaleTimeString([], { hour12: false });\n const content = args.map(formatArg).join(' ');\n const logHTML = `<div class=\"flex gap-2 items-start ${c[level] || c.log}\"><span class=\"opacity-50\">${time}</span><span class=\"font-bold\">${i[level] || ''}</span><span class=\"flex-1\">${content}</span></div>`;\n \n logbox.insertAdjacentHTML('beforeend', logHTML);\n logbox.parentElement.scrollTop = logbox.parentElement.scrollHeight;\n };\n\n const hook = level => { console[level] = (...a) => { oldConsole[level](...a); print(level, ...a); }; };\n ['log', 'warn', 'error', 'info', 'debug'].forEach(hook);\n\n const errHandler = e => print('error', e.error || e.reason || e.message || 'Unknown error');\n const rejectHandler = e => print('error', 'Unhandled Promise Rejection:', e.reason);\n window.addEventListener('error', errHandler);\n window.addEventListener('unhandledrejection', rejectHandler);\n\n const cleanup = () => {\n Object.assign(console, oldConsole);\n window.removeEventListener('error', errHandler);\n window.removeEventListener('unhandledrejection', rejectHandler);\n };\n \n suneEl.closest('#suneHtml')?.addEventListener('sune:unmount', cleanup, { once: true });\n print('info', 'Log catcher initialized.');\n})();\n</script>\n","extension_html":"<sune src='https://raw.githubusercontent.com/sune-org/store/refs/heads/main/sync.sune' private></sune>","hide_composer":false},"storage":{}}] |