mirror of
https://github.com/sune-org/store.git
synced 2026-01-13 16:17:58 +00:00
1 line
19 KiB
JSON
1 line
19 KiB
JSON
[{"id":"1nfiyrh","name":"Agent","pinned":false,"avatar":"data:image/webp;base64,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","url":"gh://sune-org/store/agents/agent-base.sune","updatedAt":1757529280777,"settings":{"model":"","temperature":"","top_p":"","top_k":"","frequency_penalty":"","repetition_penalty":"","min_p":"","top_a":"","verbosity":"","reasoning_effort":"default","system_prompt":"This is the base agent. Not meant to be used directly.","html":"<div class=\"p-3 sm:p-4\">\n<div id=\"agent-panel-root\" class=\"mx-auto w-full max-w-3xl rounded-xl border border-gray-200 bg-white p-3 shadow-sm\">\n<div class=\"flex items-center justify-between gap-3\">\n<div class=\"flex items-center gap-2\">\n<i data-lucide=\"brain-circuit\" class=\"h-5 w-5 text-gray-600\"></i>\n<span class=\"text-sm font-medium text-gray-800\">Agent Control</span>\n</div>\n<span id=\"agent-panel-version\" class=\"text-xs text-gray-400\"></span>\n</div>\n\n<div class=\"mt-3 flex items-center justify-between rounded-lg bg-gray-100 p-2\">\n <label id=\"agent-panel-status\" class=\"cursor-pointer text-sm text-gray-700\"></label>\n <button type=\"button\" role=\"switch\" aria-checked=\"false\" id=\"agent-panel-toggle\" class=\"relative inline-flex h-6 w-11 flex-shrink-0 cursor-pointer rounded-full border-2 border-transparent bg-gray-300 transition-colors duration-200 ease-in-out focus:outline-none\">\n <span id=\"agent-panel-toggle-handle\" class=\"pointer-events-none inline-block h-5 w-5 transform translate-x-0 rounded-full bg-white shadow ring-0 transition duration-200 ease-in-out\"></span>\n </button>\n</div>\n\n<div class=\"mt-2 border-t border-gray-200 pt-2\">\n <button id=\"agent-panel-console-toggle\" class=\"flex w-full items-center justify-between text-left text-sm font-medium text-gray-600 hover:text-black\">\n <span>Console</span>\n <i id=\"agent-panel-console-chevron\" data-lucide=\"chevron-down\" class=\"h-4 w-4 transition-transform\"></i>\n </button>\n\n <div id=\"agent-panel-console-container\" class=\"mt-2 hidden\">\n <pre id=\"agent-panel-console\" class=\"max-h-56 overflow-y-auto rounded-md bg-gray-900 p-2 text-xs font-mono leading-relaxed text-white\"></pre>\n <div class=\"mt-2 grid grid-cols-3 gap-2\">\n <button id=\"agent-panel-clear-logs\" class=\"flex items-center justify-center gap-2 rounded-md bg-gray-100 px-3 py-1.5 text-xs text-gray-600 hover:bg-gray-200\">\n <i data-lucide=\"trash-2\" class=\"h-3 w-3\"></i> Clear\n </button>\n <button id=\"agent-panel-clear-exec\" class=\"flex items-center justify-center gap-2 rounded-md bg-gray-100 px-3 py-1.5 text-xs text-gray-600 hover:bg-gray-200\">\n <i data-lucide=\"rotate-ccw\" class=\"h-3 w-3\"></i> Forget\n </button>\n <button id=\"agent-panel-clear-canvas\" class=\"flex items-center justify-center gap-2 rounded-md bg-gray-100 px-3 py-1.5 text-xs text-gray-600 hover:bg-gray-200\">\n <i data-lucide=\"eraser\" class=\"h-3 w-3\"></i> Erase\n </button>\n </div>\n </div>\n</div>\n\n</div>\n\n<script>\n(function() {\n if (window.SuneAgentPanel && typeof window.SuneAgentPanel.reAttach === 'function') {\n window.SuneAgentPanel.reAttach();\n return;\n }\n\n const AgentPanel = {\n // --- State ---\n isActive: false, isConsoleOpen: true, version: 'v0.8.0',\n logs: [], processed: new Set(), currentSuneId: '', idPoll: null,\n handlers: { ui: {}, composer: {} },\n\n // --- Config ---\n mountId: 'agent-runtime',\n storageKey: '', logStorageKey: '', processedKey: '',\n \n // --- DOM Elements ---\n el: {},\n \n // --- Methods ---\n init() {\n this.startSuneWatcher();\n this.reAttach();\n },\n\n reAttach() {\n this.unbindUIEvents();\n this.el = {};\n const sel = (id) => document.querySelector(id);\n this.el.root = sel('#agent-panel-root');\n if (!this.el.root) return;\n \n this.el = {\n root: this.el.root,\n version: sel('#agent-panel-version'), status: sel('#agent-panel-status'),\n toggle: sel('#agent-panel-toggle'), toggleHandle: sel('#agent-panel-toggle-handle'),\n consoleToggle: sel('#agent-panel-console-toggle'), consoleChevron: sel('#agent-panel-console-chevron'),\n consoleContainer: sel('#agent-panel-console-container'), console: sel('#agent-panel-console'),\n clearLogsBtn: sel('#agent-panel-clear-logs'), clearExecBtn: sel('#agent-panel-clear-exec'),\n clearCanvasBtn: sel('#agent-panel-clear-canvas')\n };\n \n this.bindUIEvents();\n\n const newSuneId = window.SUNE?.id;\n if (newSuneId && newSuneId !== this.currentSuneId) {\n this.onSuneChanged(newSuneId);\n } else {\n this.updateUI();\n }\n window.lucide?.createIcons?.();\n },\n\n bindUIEvents() {\n this.handlers.ui = {\n toggle: () => { this.isActive = !this.isActive; localStorage.setItem(this.storageKey, this.isActive); this.log('SYS', this.isActive ? 'Agent Activated' : 'Agent Deactivated'); this.updateUI(); },\n consoleToggle: () => { this.isConsoleOpen = !this.isConsoleOpen; this.updateUI(); },\n clearLogs: this.clearLogs.bind(this),\n clearExec: this.clearExecHistory.bind(this),\n clearCanvas: this.clearCanvas.bind(this)\n };\n for (const [elKey, handler] of [['toggle', 'toggle'], ['consoleToggle', 'consoleToggle'], ['clearLogsBtn', 'clearLogs'], ['clearExecBtn', 'clearExec'], ['clearCanvasBtn', 'clearCanvas']]) {\n this.el[elKey]?.addEventListener('click', this.handlers.ui[handler]);\n }\n },\n \n unbindUIEvents() {\n if (!this.el.root || !this.handlers.ui) return;\n for (const [elKey, handler] of [['toggle', 'toggle'], ['consoleToggle', 'consoleToggle'], ['clearLogsBtn', 'clearLogs'], ['clearExecBtn', 'clearExec'], ['clearCanvasBtn', 'clearCanvas']]) {\n this.el[elKey]?.removeEventListener('click', this.handlers.ui[handler]);\n }\n this.handlers.ui = {};\n },\n\n updateUI() {\n if (!this.el.root) return;\n this.el.version.textContent = this.version;\n this.el.status.textContent = this.isActive ? 'Status: Active' : 'Status: Inactive';\n this.el.toggle.setAttribute('aria-checked', this.isActive);\n this.el.toggle.classList.toggle('bg-black', this.isActive);\n this.el.toggle.classList.toggle('bg-gray-300', !this.isActive);\n this.el.toggleHandle.classList.toggle('translate-x-5', this.isActive);\n \n this.el.consoleContainer.classList.toggle('hidden', !this.isConsoleOpen);\n this.el.consoleChevron.classList.toggle('rotate-180', this.isConsoleOpen);\n \n this.el.console.textContent = this.logs.join('\\n') || 'Console is empty.';\n this.el.console.scrollTop = this.el.console.scrollHeight;\n },\n\n restoreState() {\n this.isActive = localStorage.getItem(this.storageKey) === 'true';\n this.logs = JSON.parse(localStorage.getItem(this.logStorageKey) || '[]') || [];\n this.processed = new Set(JSON.parse(localStorage.getItem(this.processedKey) || '[]'));\n },\n\n updateKeysFor(id) {\n this.currentSuneId = id;\n this.storageKey = `sune_agent_active_${id}`;\n this.logStorageKey = `sune_agent_logs_${id}`;\n this.processedKey = `sune_agent_processed_${id}`;\n },\n \n unbindComposer() {\n const c = document.getElementById('composer');\n if (!c || !this.handlers.composer) return;\n if (this.handlers.composer.suneResponse) c.removeEventListener('sune:newSuneResponse', this.handlers.composer.suneResponse);\n if (this.handlers.composer.submit) c.removeEventListener('submit', this.handlers.composer.submit);\n },\n \n bindComposer() {\n this.unbindComposer();\n const c = document.getElementById('composer');\n if (!c) return;\n this.handlers.composer = {\n suneResponse: this.onSuneResponse.bind(this),\n submit: this.injectContext.bind(this)\n };\n c.addEventListener('sune:newSuneResponse', this.handlers.composer.suneResponse);\n c.addEventListener('submit', this.handlers.composer.submit);\n },\n\n startSuneWatcher() {\n clearInterval(this.idPoll);\n this.idPoll = setInterval(() => {\n const id = window.SUNE?.id;\n if (id && id !== this.currentSuneId) this.onSuneChanged(id);\n }, 333);\n },\n\n onSuneChanged(newId) {\n if (!newId) return;\n const prev = this.currentSuneId;\n this.updateKeysFor(newId);\n this.restoreState();\n this.clearCanvas();\n this.bindComposer();\n if(prev) this.log('SYS', `Switched Sune ${prev} -> ${newId}`);\n else this.log('SYS', `Agent ready on ${newId}`);\n this.updateUI();\n },\n \n saveLogs() { localStorage.setItem(this.logStorageKey, JSON.stringify(this.logs.slice(-200))) },\n saveProcessed() { localStorage.setItem(this.processedKey, JSON.stringify([...this.processed].slice(-200))) },\n markProcessed(k) { this.processed.add(k); this.saveProcessed() },\n hasProcessed(k) { return this.processed.has(k) },\n hash(s) { let h = 0; for (let i = 0; i < s.length; i++) h = ((h << 5) - h) + s.charCodeAt(i) | 0; return 'h' + (h >>> 0).toString(16) },\n uid() { return Date.now().toString(36) + Math.random().toString(36).slice(2, 6) },\n \n log(t, m) {\n const ts = new Date().toLocaleTimeString(); this.logs.push(`[${ts} ${t}] ${m}`); if (this.logs.length > 200) this.logs.shift();\n this.saveLogs(); this.updateUI();\n },\n \n ensureMount() {\n const host = document.getElementById('suneHtml'); if (!host) { this.log('WARN', '#suneHtml not found'); return null }\n host.classList.remove('hidden'); let mount = host.querySelector('#' + this.mountId);\n if (!mount) { mount = document.createElement('div'); mount.id = this.mountId; mount.className = 'agent-runtime space-y-2 p-2'; host.appendChild(mount) } return mount;\n },\n\n injectHTMLBlock(html) {\n const mount = this.ensureMount(); if (!mount) return; const wrap = document.createElement('div'); wrap.setAttribute('data-agent-block', this.uid()); wrap.className = 'rounded-lg border border-gray-200 bg-white/50 p-2'; wrap.innerHTML = html; mount.appendChild(wrap);\n [...wrap.querySelectorAll('script')].forEach(old => { const s = document.createElement('script');[...old.attributes].forEach(a => s.setAttribute(a.name, a.value)); s.textContent = old.textContent || ''; old.parentNode?.replaceChild(s, old) });\n window.lucide?.createIcons?.(); this.log('HTML', 'Injected HTML block');\n },\n \n executeJSBlock(code) {\n this.log('EXEC', 'Running JS block'); try { (new Function(code)).call(window); this.log('DONE', 'JS executed') } catch (err) { console.error('[Sune Agent] JS Error:', err); this.log('ERROR', err?.message || 'Exec fail'); window.SUNE?.log?.('Agent Error: ' + (err?.message || 'Exec fail')) }\n },\n \n async autoAskNext(msgId) {\n const key = `auto:${msgId || this.uid()}`; if (this.hasProcessed(key)) return this.log('SKIP', 'Auto-send processed for ' + msgId);\n this.log('AUTO', '<3 detected, queueing auto-send...');\n await new Promise(r => setTimeout(r, 8000));\n if (window.state?.busy) return this.log('FAIL', 'Auto-send aborted, app busy.');\n try {\n document.getElementById('input').value = \"Automated reply: continue until you reach a result without asking me questions. You are being automated and I am away. Don't forget to include '<3' to stay alive (unless handing off)\";\n const composer = document.getElementById('composer'), sendBtn = document.getElementById('sendBtn');\n if (sendBtn?.getAttribute('type') === 'submit') sendBtn.click();\n else composer?.requestSubmit ? composer.requestSubmit() : composer?.dispatchEvent(new Event('submit', { cancelable: true, bubbles: true }));\n this.markProcessed(key); this.log('AUTO', 'Sent \"What’s next?\"');\n } catch (e) { this.log('ERROR', 'Auto-send failed: ' + (e?.message || e)) }\n },\n \n onSuneResponse(e) {\n if (!this.isActive) return;\n const msg = e?.detail?.message; if (!msg || msg.role !== 'assistant' || !Array.isArray(msg.content)) return;\n const txt = window.partsToText(msg.content || []) || ''; if (!txt.trim()) return;\n const msgKey = msg.id || this.hash(txt);\n if (!this.hasProcessed(msgKey)) {\n let any = false, m;\n const reJS = /```(?:javascript|js)\\n([\\s\\S]*?)\\n```/gi, reHTML = /```(?:html|htm)\\n([\\s\\S]*?)\\n```/gi;\n while ((m = reJS.exec(txt)) !== null) { if ((m[1] || '').trim()) { any = true; this.executeJSBlock((m[1] || '').trim()) } }\n while ((m = reHTML.exec(txt)) !== null) { if ((m[1] || '').trim()) { any = true; this.injectHTMLBlock((m[1] || '').trim()) } }\n if (any) { this.markProcessed(msgKey); this.log('PROC', 'Executed blocks for ' + msgKey) }\n }\n if (/<3/.test(txt)) { this.log('MATCH', 'Found <3, triggering auto-send'); this.autoAskNext(msg.id || msgKey) }\n },\n \n injectContext() {\n if (!this.isActive || !this.logs.length) return; const input = document.getElementById('input'), cur = input.value || ''; if (!cur.trim()) return; input.value = `[AGENT LOGS]\\n${this.logs.slice(-15).join('\\n')}\\n[/AGENT LOGS]\\n\\n` + cur;\n this.log('INFO', 'Injected logs into context');\n },\n \n clearLogs() { this.logs = []; this.saveLogs(); this.log('SYS', 'Console cleared'); this.updateUI() },\n clearExecHistory() { this.processed.clear(); this.saveProcessed(); this.log('SYS', 'Execution history cleared') },\n clearCanvas() { const m = document.querySelector('#' + this.mountId); if (m) { m.innerHTML = ''; this.log('SYS', 'Cleared injected HTML canvas') } }\n };\n\n window.SuneAgentPanel = AgentPanel;\n window.SuneAgentPanel.init();\n})();\n</script>\n</div>\n","extension_html":"<sune src='https://raw.githubusercontent.com/sune-org/store/refs/heads/main/sync.sune' private></sune>","hide_composer":false},"storage":{}}] |