Files
store/log.sune
2025-09-09 17:04:56 -07:00

1 line
8.7 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
[{"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 => ({'&':'&amp;','<':'&lt;','>':'&gt;','\\'':'&#39;','\\\"':'&quot;'}[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":{}}]