@decido/shell-vscode-core 4.0.2 → 4.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,51 @@
1
+ "use strict";var se=Object.create;var C=Object.defineProperty;var ce=Object.getOwnPropertyDescriptor;var le=Object.getOwnPropertyNames;var de=Object.getPrototypeOf,me=Object.prototype.hasOwnProperty;var Q=(i,e)=>{for(var t in e)C(i,t,{get:e[t],enumerable:!0})},Z=(i,e,t,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of le(e))!me.call(i,o)&&o!==t&&C(i,o,{get:()=>e[o],enumerable:!(a=ce(e,o))||a.enumerable});return i};var ee=(i,e,t)=>(t=i!=null?se(de(i)):{},Z(e||!i||!i.__esModule?C(t,"default",{value:i,enumerable:!0}):t,i)),ue=i=>Z(C({},"__esModule",{value:!0}),i);var Je={};Q(Je,{ApiService:()=>$,AuthService:()=>N,BaseService:()=>Y,CORE_HOOK_NAMES:()=>Ge,CORE_SLOT_NAMES:()=>Ue,CalendarService:()=>T,CommandService:()=>x,DebugService:()=>q,DecidoDB:()=>R,GamificationService:()=>I,HookService:()=>A,ModalService:()=>P,ModuleManager:()=>v,NotificationService:()=>w,RouterService:()=>O,ServiceContainer:()=>D,ShortcutService:()=>E,StorageService:()=>f,SyncService:()=>b,ThemeService:()=>y,apiService:()=>d,authService:()=>h,createEffect:()=>oe,createMemo:()=>he,createPlatformAPI:()=>ne,createSignal:()=>l,db:()=>u,formatDate:()=>pe,html:()=>g,initEventListeners:()=>Ve,makeDraggable:()=>ge,processModuleDefinitions:()=>qe,registerCoreCommands:()=>ze,routerService:()=>X,storageService:()=>fe,syncService:()=>_e,themeService:()=>Oe});module.exports=ue(Je);var D=class{services=new Map;register(e,t){this.services.has(e)&&console.warn(`[ServiceContainer] El servicio '${e}' ya est\xE1 registrado. Se sobrescribir\xE1.`),this.services.set(e,t)}get(e){let t=this.services.get(e);if(!t)throw new Error(`[ServiceContainer] No se encontr\xF3 servicio registrado con la clave: ${e}`);return t}};var H=ee(require("react")),v=class{api;container;modules=new Map;activatedModules=new Set;serviceProviderMap=new Map;constructor(e,t){this.api=e,this.container=t}async registerModules(e){for(let t of e){if(this.modules.has(t.id)){console.warn(`[ModuleManager] El m\xF3dulo '${t.id}' ya est\xE1 registrado. Omitiendo duplicado.`);continue}this.modules.set(t.id,t),console.log(`[Manifest] Registrando contribuciones para '${t.id}'`),this.registerStaticContributions(t.manifest)}}registerStaticContributions(e){let t=e.name;if(!t||!e.contributes)return;let a=e.contributes;e.provides?.forEach(o=>{this.serviceProviderMap.set(o,t)}),a.commands?.forEach(o=>{this.api.commands.register({...o,execute:(r,n)=>this.activateAndExecute(t,o.id,n)})}),a.sidebarViews?.forEach(o=>{if(this.api.layout.registerSidebarView){let r=this.createLazyModuleView(t,o.title);this.api.layout.registerSidebarView({...o,component:r})}else o.render&&this.api.layout.registerSidebarView({...o,render:r=>{r.innerHTML=`<div class="p-4 text-center text-muted-foreground">Cargando ${o.title}...</div>`,this.activateModule(t).then(()=>{this.api.layout.renderSidebar()})}})}),a.activityBar?.forEach(o=>{this.api.layout.registerActivityBarItem({...o})}),a.panelViews?.forEach(o=>{if(this.api.layout.registerPanelView&&this.createLazyModuleView){let r=this.createLazyModuleView(t,o.title);this.api.layout.registerPanelView({...o,component:r})}else o.render&&this.api.layout.registerPanelView({...o,render:r=>{r.innerHTML=`<div class="p-4 text-center text-muted-foreground">Cargando ${o.title}...</div>`,this.activateModule(t).then(()=>{this.api.layout.renderPanel()})}})}),a.topBarItems?.forEach(o=>{this.api.layout.registerTopBarItem(o)}),a.statusBarItems?.forEach(o=>{this.api.layout.registerStatusBarItem(o)})}async activateModule(e){if(this.activatedModules.has(e))return;let t=this.modules.get(e);if(!t)throw new Error(`Intento de activar un m\xF3dulo no registrado: ${e}`);console.log(`\u{1F680} Activando m\xF3dulo del n\xFAcleo '${e}'...`);try{let a=await t.importer();if(a.activate&&typeof a.activate=="function")await a.activate(this.api),this.activatedModules.add(e),console.log(`\u2705 M\xF3dulo '${e}' activado con \xE9xito.`);else throw new Error("El m\xF3dulo no tiene una funci\xF3n de exportaci\xF3n 'activate' v\xE1lida.")}catch(a){console.error(`\u274C Fallo al activar el m\xF3dulo '${e}':`,a),this.api.notifications.show("error",`Fallo al activar: ${e}`,a.message)}}async loadExternalModules(e){for(let t of e)if(!this.activatedModules.has(t.id)){console.log(`\u{1F50C} Cargando m\xF3dulo externo '${t.id}' desde '${t.path}'`);try{let o=await import(`${window.location.origin}${t.path}/index.js`);if(o.activate&&typeof o.activate=="function")await o.activate(this.api),this.activatedModules.add(t.id),console.log(`\u2705 M\xF3dulo externo '${t.id}' activado.`);else throw new Error("El m\xF3dulo externo no exporta una funci\xF3n 'activate'.")}catch(a){console.error(`\u274C Fallo al cargar el m\xF3dulo externo '${t.id}':`,a),this.api.notifications.show("error","Fallo de M\xF3dulo Externo",a.message)}}}getModuleIdForService(e){return this.serviceProviderMap.get(e)}async activateAndExecute(e,t,a){await this.activateModule(e),this.api.commands.execute(t,a)}createLazyModuleView(e,t){return()=>((0,H.useEffect)(()=>{this.activateModule(e).catch(a=>console.error("Lazy Load failed",a))},[]),H.default.createElement("div",{className:"flex items-center justify-center h-full text-muted-foreground"},`Cargando m\xF3dulo: ${t}...`))}};var S=class{events;spy=null;constructor(){this.events=new Map}on(e,t){this.events.has(e)||this.events.set(e,new Set),this.events.get(e).add(t)}off(e,t){let a=this.events.get(e);a&&a.delete(t)}emit(e,t){let a=this.events.get(e);a&&a.forEach(o=>o(t)),this.spy&&this.spy(e,t)}spyOn(e){this.spy=e}};var x=class{commands=new Map;api;spy=null;constructor(){}register(e){this.commands.has(e.id)&&console.warn(`[CommandService] El comando "${e.id}" ya est\xE1 registrado. Se sobrescribir\xE1.`),this.commands.set(e.id,e)}execute(e,t,a){let o=this.commands.get(e);if(o)try{let r=`svc:${o.id.split(".")[0]}Service`,n=performance.now();o.execute(this.api,t);let c=(performance.now()-n).toFixed(2);this.api.debug?.probe(r,"active",{sourceNodeId:a,command:e,duration:`${c} ms`}),this.api.events.emit(`command:${e}:executed`,{arg:t})}catch(r){console.error(`Error ejecutando el comando "${e}":`,r),this.api.notifications.show("error","Error de Comando",`No se pudo ejecutar "${o.title}".`)}else console.error(`[CommandService] Intento de ejecutar un comando no registrado: "${e}"`)}getAll(){return Array.from(this.commands.values())}spyOn(e){this.spy=e}};function pe(i){if(!i)return"Sin fecha";let e=new Date(i),t=e.getTimezoneOffset()*6e4;return new Date(e.getTime()+t).toLocaleDateString("es-ES",{year:"numeric",month:"short",day:"numeric"})}function g(i,...e){return String.raw({raw:i},...e)}function ge(i,e){}var w=class{container;constructor(){this.container=document.createElement("div"),this.container.id="notification-container",this.container.className="fixed top-5 right-5 z-10000 w-96 space-y-3",document.body.appendChild(this.container)}show(e,t,a,o=4e3){let r=`notif_${Date.now()}`,n=document.createElement("div");n.id=r;let c={info:{icon:"fas fa-info-circle",color:"border-secondary"},success:{icon:"fas fa-check-circle",color:"border-success"},warning:{icon:"fas fa-exclamation-triangle",color:"border-accent"},error:{icon:"fas fa-times-circle",color:"border-danger"},achievement:{icon:"fas fa-trophy",color:"border-accent"}}[e];n.innerHTML=g`
2
+ <div class="notification-item glass-card animate-slide-in-right border-l-4 ${c.color}">
3
+ <i class="notification-icon ${c.icon}"></i>
4
+ <div class="flex-grow">
5
+ <h4 class="notification-title">${t}</h4>
6
+ <p class="notification-message">${a}</p>
7
+ </div>
8
+ <button class="notification-close-btn" data-close-id="${r}">&times;</button>
9
+ </div>
10
+ `,n.querySelector(".notification-close-btn")?.addEventListener("click",()=>{n.remove()}),this.container.appendChild(n),setTimeout(()=>{document.getElementById(r)?.remove()},o)}};var P=class{container;constructor(){this.container=document.createElement("div"),this.container.id="modal-container",document.body.appendChild(this.container)}show(e){this.hide();let t=`modal_${Date.now()}`,a={sm:"max-w-md",md:"max-w-lg",lg:"max-w-2xl",xl:"max-w-4xl"},o=document.createElement("div");o.id=t,o.className="fixed inset-0 bg-darker/80 backdrop-blur-sm flex items-center justify-center z-50",o.innerHTML=g`
11
+ <div class="glass-premium p-8 rounded-2xl w-full ${a[e.size||"md"]} animate-scale-in">
12
+ <div class="flex justify-between items-center mb-6">
13
+ <h2 class="text-2xl font-bold text-white">${e.title}</h2>
14
+ <button class="text-muted-foreground hover:text-foreground text-2xl close-btn">&times;</button>
15
+ </div>
16
+ <div class="modal-body"></div>
17
+ ${e.actions&&e.actions.length>0?`
18
+ <div class="pt-6 border-t border-white/10 mt-6 text-right space-x-4 modal-footer">
19
+ </div>
20
+ `:""}
21
+ </div>
22
+ `;let r=()=>o.remove(),n=o.querySelector(".modal-body");typeof e.content=="string"?n.innerHTML=e.content:n.appendChild(e.content);let s=o.querySelector(".modal-footer");return s&&e.actions&&e.actions.forEach(c=>{let m=document.createElement("button");m.textContent=c.text,m.className=c.type==="primary"?"btn-premium":"btn-secondary",m.onclick=()=>c.onClick(r),s.appendChild(m)}),o.querySelector(".close-btn")?.addEventListener("click",r),o.addEventListener("click",c=>{c.target===o&&r()}),this.container.appendChild(o),{close:r}}hide(){let e=this.container.querySelector(".fixed");e&&e.remove()}};var I=class{api;levelFormula=e=>Math.floor(100*Math.pow(e,1.5));addXP(e,t="Acci\xF3n completada"){let{state:a,notifications:o}=this.api,r=a.gamification(),n=r.xp+e,s=r.level,c=s,m=!1,p=this.levelFormula(s);for(;n>=p;)c++,m=!0,p=this.levelFormula(c);a.setGamification({...r,xp:n,level:c}),o.show("success",`+${e} XP!`,t),m&&setTimeout(()=>{o.show("success","\xA1Subiste de Nivel!",`\u{1F680} \xA1Felicidades! Has alcanzado el Nivel ${c}.`)},500)}updateJournalStreak(){let{state:e}=this.api,t=e.gamification(),a=new Date,o=t.lastJournalDate?new Date(t.lastJournalDate):null,r=t.streak,n=(c,m)=>c.toDateString()===m.toDateString();if(o&&n(a,o))return;let s=new Date;if(s.setDate(a.getDate()-1),r=o&&n(s,o)?r+1:1,r>t.streak){let c=Math.min(r*5,50);this.addXP(c,`Racha de ${r} d\xEDas`)}e.setGamification({...e.gamification(),streak:r,lastJournalDate:a.toISOString().slice(0,10)})}checkAndUnlockAchievements(){let{state:e,notifications:t}=this.api,a=e.gamification(),o=0,r=[];if(a.achievements.forEach(n=>{if(a.unlockedAchievements.includes(n.id))return;let s=!1;switch(n.conditionType){case"journal_streak":a.streak>=n.conditionValue&&(s=!0);break;case"level":a.level>=n.conditionValue&&(s=!0);break}s&&(r.push(n.id),o+=n.reward_xp,t.show("success","\xA1Logro Desbloqueado!",`\u{1F3C6} ${n.title}`))}),r.length>0){this.addXP(o,`Recompensa por ${r.length} logros`);let n=e.gamification();e.setGamification({...n,unlockedAchievements:[...n.unlockedAchievements,...r]})}}};var T=class{api;createEvent(e){let t={...e,id:Date.now()};return this.api.notifications.show("success","Evento Creado",`Se a\xF1adi\xF3 "${t.title}" a tu calendario.`),t}getEventsForDay(e){}};var E=class{api;shortcuts=new Map;init(e){this.api=e,window.addEventListener("keydown",this.handleKeyDown.bind(this))}register(e){let t=e.keys.toLowerCase().split("+").sort().join("_");this.shortcuts.set(t,e)}handleKeyDown(e){let t=[];if(e.ctrlKey&&t.push("control"),e.metaKey&&t.push("meta"),e.shiftKey&&t.push("shift"),e.altKey&&t.push("alt"),["Control","Meta","Shift","Alt"].includes(e.key)||t.push(e.key.toLowerCase()),t.length>1){let a=t.sort().join("_"),o=this.shortcuts.get(a);o&&(e.preventDefault(),this.api.commands.execute(o.commandId,o.commandArg))}}};var $=class{id=Math.random().toString(36).substr(2,9);authService;init(e){console.log(`[ApiService:${this.id}] init called`),this.authService=e}async fetch(e,t={},a=!1){return console.log(`[ApiService Mock] Ignorando invocaci\xF3n de red a: ${e}`),{}}async login(e,t){return{}}async refresh(e){return{token:"dev"}}async register(e,t,a){return{}}logout(){}async getProfile(){return{id:1,name:"Local Dev"}}async updateProfile(e){return e}async getAIProjectPlan(e){return{}}async generateBlueprint(e){return""}async getAIGoalSuggestion(e){return{}}async getRefinedText(e,t){return e}async getModules(){return[]}async uploadModule(e){return{}}async generateTheme(e){return{}}},d=new $;var W={};Q(W,{activeCalendarId:()=>be,activeDashboardContext:()=>xe,activeGoalId:()=>Pe,activePaneId:()=>G,activeProjectId:()=>Te,calendar:()=>ke,editorPanes:()=>K,gamification:()=>U,getFullStateSnapshot:()=>ie,history:()=>B,initializeStateFromStorage:()=>je,isTimeTraveling:()=>z,restoreStateFromSnapshot:()=>re,setActiveCalendarId:()=>Se,setActiveDashboardContext:()=>we,setActiveGoalId:()=>Ie,setActivePaneId:()=>M,setActiveProjectId:()=>Ee,setCalendar:()=>Me,setEditorPanes:()=>k,setGamification:()=>F,setHistory:()=>L,setIsTimeTraveling:()=>Le,setSnapshotDates:()=>Re,setTimeTravelDate:()=>He,setTimeTravelState:()=>Ce,setViewData:()=>ye,snapshotDates:()=>$e,timeTravel:()=>Be,timeTravelDate:()=>De,timeTravelLocal:()=>Fe,timeTravelState:()=>Ae,updateState:()=>Ke,viewData:()=>ve});var te=ee(require("dexie")),R=class extends te.default{moduleData;syncQueue;dailySnapshots;projects;settings;constructor(){super("DecidoDB"),this.version(4).stores({moduleData:"id, entityId, [moduleId+entityType], userId, entityType",syncQueue:"++id, type, status",dailySnapshots:"date",projects:"id, name, updatedAt",settings:"key"})}},u=new R;var f=class{async getCollection(e){return(await u.moduleData.where({entityType:e}).toArray()).map(a=>a.data)}async saveEntity(e,t){let a={id:`${e}-${t.id}`,entityId:t.id,moduleId:e+"s",entityType:e,data:t};await u.moduleData.put(a)}async deleteEntity(e,t){await u.moduleData.delete(`${e}-${t}`)}async getValue(e){let t=await u.moduleData.get(`value-${e}`);return t?t.data:void 0}async saveValue(e,t){let a={id:`value-${e}`,entityId:e,moduleId:"values",entityType:"value",data:t};await u.moduleData.put(a)}async saveDailySnapshot(e,t){let a=e.toISOString().split("T")[0],o={date:a,data:t,timestamp:new Date};await u.dailySnapshots.put(o),console.log(`\u{1F4F8} Snapshot guardado para la fecha: ${a}`)}async getDailySnapshot(e){let t=e.toISOString().split("T")[0],a=await u.dailySnapshots.get(t);return a?a.data:void 0}async getAvailableSnapshotDates(){return await u.dailySnapshots.toCollection().keys()}async saveProject(e,t,a){await u.projects.put({id:e,name:t,data:a,updatedAt:Date.now()}),console.log(`\u{1F4BE} Proyecto ${e} guardado en IndexedDB`)}async getProject(e){return await u.projects.get(e)}async getAllProjectsMetadata(){return await u.projects.toArray()}async deleteProject(e){await u.projects.delete(e)}async setSetting(e,t){await u.settings.put({key:e,value:t})}async getSetting(e){return(await u.settings.get(e))?.value}},fe=new f;var j=[];function l(i,e){let t=new Set;return[()=>{let r=j[j.length-1];return r&&t.add(r),i},r=>{let n=typeof r=="function"?r(i):r;e?.equals!==!1&&(typeof e?.equals=="function"?e.equals(i,n):Object.is(i,n))||(i=n,[...t].forEach(c=>c()))}]}function oe(i){let e=()=>{j.push(e);try{i()}finally{j.pop()}};e()}function he(i){let[e,t]=l(void 0,{equals:!1});return oe(()=>{t(i())}),e}var[K,k]=l([]),[G,M]=l(null),[ve,ye]=l(null);var[U,F]=l({xp:0,level:1,streak:0,lastJournalDate:null,unlockedAchievements:[],achievements:[]});var[be,Se]=l("all"),[xe,we]=l({type:"global",id:null}),[Pe,Ie]=l(null),[Te,Ee]=l(null),[ke,Me]=l([]);var[z,Le]=l(!1),[Ae,Ce]=l(null),[De,He]=l(new Date),[$e,Re]=l([]),[B,L]=l([]);var J=!1,Lt=new f;async function je(i){console.log("\u{1F4BE} Cargando estado desde IndexedDB...");let e=[{key:"gamification",setter:F,isSingle:!0},{key:"editorPanes",setter:k,isSingle:!0},{key:"activePaneId",setter:M,isSingle:!0}];for(let t of e){let a=t.isSingle?await i.getValue(t.key):await i.getCollection(t.key);(a!=null&&Array.isArray(a)&&a.length>0||a!=null&&!Array.isArray(a))&&t.setter(a)}if(K().length===0){console.log("No se encontr\xF3 layout de editor, creando uno por defecto.");let t={id:"pane-main",tabs:[{id:"welcome",title:"Bienvenido",componentTag:"welcome-view",icon:"fas fa-hand-sparkles"}],activeTabId:"welcome"};k([t]),M(t.id)}console.log("\u2705 Estado cargado desde IndexedDB.")}var ae=!1;function Ke(i,e,t){if(z()){console.warn(`[STATE] Escritura bloqueada (${i}). La aplicaci\xF3n est\xE1 en modo de revisi\xF3n de solo lectura.`);return}if(!J){let a=ie();L(o=>[...o,{id:o.length,timestamp:new Date,action:i,snapshot:a}])}e(),t&&t().catch(a=>{console.error(`[STATE] Fallo de persistencia en la acci\xF3n '${i}':`,a)})}function ie(){return{gamification:U(),editorPanes:K(),activePaneId:G()}}function re(i){i&&(F(i.gamification||{xp:0,level:1,streak:0,lastJournalDate:null,unlockedAchievements:[],achievements:[]}),k(i.editorPanes||[]),M(i.activePaneId||null))}function Fe(i){let e=B();e[i]&&(J=!0,re(e[i].snapshot),L(e.slice(0,i+1)),J=!1)}function Be(i){let e=B();if(!e[i])return;let t=e[i].snapshot;ae=!0,console.log(`\u2708\uFE0F Viajando en el tiempo al estado ${i}`,t),L(e.slice(0,i+1)),ae=!1}var Ne={dark:{"--bg-main":"#070720","--bg-content":"#0F0F23","--bg-surface":"rgba(255, 255, 255, 0.03)","--text-primary":"#FFFFFF","--text-secondary":"#9CA3AF"},light:{"--bg-main":"#f8f9fa","--bg-content":"#FFFFFF","--bg-surface":"rgba(0, 0, 0, 0.03)","--text-primary":"#212529","--text-secondary":"#495057"}},y=class{activeTheme;constructor(){let e=localStorage.getItem("decido-theme")||"dark";this.activeTheme=l(e),this.applyTheme(e)}setTheme(e){this.activeTheme[1](e),this.applyTheme(e),localStorage.setItem("decido-theme",e)}applyTheme(e){let t=Ne[e];for(let[a,o]of Object.entries(t))document.documentElement.style.setProperty(a,o)}updateToken(e,t){document.documentElement.style.setProperty(e,t)}applyPalette(e){let t={primary:"--color-primary",secondary:"--color-secondary",accent:"--color-accent",bgMain:"--bg-main",bgContent:"--bg-content",textPrimary:"--text-primary",textSecondary:"--text-secondary"};for(let[a,o]of Object.entries(e)){let r=t[a];r&&this.updateToken(r,o)}}},Oe=new y;var N=class{apiService;session;constructor(){this.session=l({user:null,token:null,status:"loading"})}init(e){this.apiService=e}async checkSession(){let e={id:1,name:"Local Dev",email:"dev@local.host"};this.setSession({user:e,token:"local-dev-token",status:"authenticated"}),console.log("[Auth] CheckSession local - Auto autenticado.")}login=async(e,t)=>{let a={id:1,name:"Local Dev",email:e};this.setSession({user:a,token:"local-dev-token",status:"authenticated"});let o=document.getElementById("fullscreen-view-container");o&&(o.innerHTML="");let r=document.getElementById("app");return r&&(r.style.display="block"),a};async register(e,t,a){return{success:!0}}logout=()=>{this.setSession({user:null,token:null,status:"unauthenticated"})};refreshToken=async()=>"local-dev-token";listeners=new Set;subscribe(e){return this.listeners.add(e),e(this.session[0]()),()=>{this.listeners.delete(e)}}setSession(e){let[t,a]=this.session;a({...t(),...e});let o=t();this.listeners.forEach(r=>r(o))}},h=new N;var O=class{routes=[];api;init(e){this.api=e,window.addEventListener("hashchange",this.handleRouteChange)}registerRoute(e){this.routes.push(e)}navigate(e){window.location.hash=e}_getCurrentHash(){return window.location.hash.slice(1)||"/"}handleRouteChange=()=>{let e=this._getCurrentHash(),t=this.routes.find(r=>r.path===e),a=h.session[0]();if(!t){console.error(`Ruta no encontrada: ${e}`),this.api.layout.renderComponent("not-found-view");return}let o=a.status==="authenticated";if(t.auth==="protected"&&!o){this.navigate("/login");return}if(t.auth==="guestOnly"&&o){this.navigate("/dashboard");return}t.title&&(document.title=`Decido - ${t.title}`),this.api.layout.renderComponent(t.componentTag,{isFullscreen:t.isFullscreen})}},X=new O;var b=class{isSyncing=!1;startSyncLoop(){setInterval(()=>this.sync(),1e4),window.addEventListener("online",()=>this.sync())}async sync(){if(!(this.isSyncing||!navigator.onLine)){this.isSyncing=!0;try{let e=localStorage.getItem("active_project_id");if(e){let t=await u.projects.get(e);t&&(console.log("\u2601\uFE0F Sincronizando con la nube..."),await d.fetch(`/module-data/projects/${t.id}`,{method:"PUT",body:JSON.stringify({data:t.data,name:t.name})}))}}catch(e){console.error("Error de sincronizaci\xF3n",e)}finally{this.isSyncing=!1}}}},_e=new b;var A=class{hooks=new Map;on(e,t){return this.hooks.has(e)||this.hooks.set(e,[]),this.hooks.get(e).push(t),()=>this.off(e,t)}register(e,t){return this.on(e,t)}off(e,t){let a=this.hooks.get(e);if(!a)return;let o=a.filter(r=>r!==t);o.length>0?this.hooks.set(e,o):this.hooks.delete(e)}async trigger(e,t){let a=this.hooks.get(e);if(!(!a||a.length===0)){console.log(`\u{1FA9D} Disparando hook: ${e}`,t);for(let o of[...a])try{await Promise.resolve(o(t))}catch(r){console.error(`Error en un callback del hook '${e}':`,r)}}}};var _=class{api;status="disconnected";init(e){this.api=e,console.log("\u{1F50C} WebSocketService (Mock) inicializado en modo Offline.")}connect(){console.log("[WebSocket] Ignorado: Conectando local (Micro-IDE).")}disconnect(){}emit(e,t){console.log(`[WebSocket Mock] Env\xEDo evadido: ${e}`,t)}};function ne(i){let e=new S;h.init(d),d.init(h),i.register("events",new S),i.register("notifications",new w),i.register("modals",new P),i.register("commands",new x),i.register("shortcuts",new E),i.register("gamification",new I),i.register("calendar",new T),i.register("storage",new f),i.register("sync",new b),i.register("hooks",new A),i.register("theme",new y),i.register("websocket",new _);let t=()=>i.get("moduleManager"),a={debug:void 0,events:i.get("events"),state:W,commands:i.get("commands"),modals:i.get("modals"),notifications:i.get("notifications"),shortcuts:i.get("shortcuts"),gamification:i.get("gamification"),calendar:i.get("calendar"),theme:i.get("theme"),storage:i.get("storage"),sync:i.get("sync"),moduleManager:null,auth:h,router:X,hooks:i.get("hooks"),websocket:i.get("websocket"),modules:{getModules:()=>d.fetch("/marketplace/modules"),getInstalledModules:()=>d.fetch("/marketplace/user/modules"),installModule:o=>d.fetch(`/marketplace/install/${o}`,{method:"POST"}),uploadModule:o=>d.uploadModule(o),getProfile:d.getProfile.bind(d),updateProfile:d.updateProfile.bind(d),rateModule:(o,r,n)=>d.fetch(`/marketplace/rate/${o}`,{method:"POST",body:JSON.stringify({rating:r,review:n})}),getModuleById:o=>d.fetch(`/marketplace/module/${o}`),getCategories:()=>d.fetch("/marketplace/categories")},ai:{generateTheme:o=>d.fetch("/ai/generate-theme",{method:"POST",body:JSON.stringify({prompt:o})})},timetravel:{revertToDate:o=>d.fetch("/timetravel/revert",{method:"POST",body:JSON.stringify({date:o})}),getSnapshotDates:()=>d.fetch("/timetravel/snapshots/dates"),getPreviousActivityDate:o=>d.fetch(`/timetravel/previous-activity-date?currentDate=${o}`),getNextActivityDate:o=>d.fetch(`/timetravel/next-activity-date?currentDate=${o}`)},container:i,services:{register:(o,r)=>i.register(o,r),get:async o=>{try{return i.get(o)}catch{console.log(`[API] Servicio '${o}' no encontrado. Buscando proveedor...`);let n=t(),s=n.getModuleIdForService(o);if(s)return await n.activateModule(s),i.get(o);throw new Error(`[API] No se encontr\xF3 ning\xFAn m\xF3dulo que provea el servicio '${o}'.`)}}}};return i.register("moduleManager",new v(a,i)),a.websocket?.init(a),a}var q=class{api;graphState=l({nodes:[],links:[]});probeLog=l([]);playbackState=l({isPlaying:!1,currentIndex:-1});consoleLogs=l([]);statusTimeouts=new Map;constructor(e){this.api=e,this.setupInterceptors(),this.api.commands.spyOn(t=>{this.probe(`cmd:${t}`,"active")})}setupInterceptors(){this.interceptConsole()}interceptConsole(){let e={...window.console};["log","info","warn","error"].forEach(t=>{window.console[t]=(...a)=>{let o={id:`log_${Date.now()}`,type:t,timestamp:new Date,message:a,stack:t==="error"?new Error().stack:void 0};this.consoleLogs[1](r=>[...r,o]),e[t](...a)}})}clearLogs(e){e==="console"&&this.consoleLogs[1]([])}async loadArchitectureGraph(e){try{let a=await(await fetch(e)).json();a.nodes.forEach(o=>{o.status="idle"}),this.graphState[1](a),this.probeLog[1]([]),this.playbackState[1]({isPlaying:!1,currentIndex:-1}),console.log(`\u2705 Nuevo mapa de arquitectura cargado: ${e}`)}catch(t){console.error(`\u274C Error al cargar el mapa: ${e}`,t)}}probe(e,t,a){let o={timestamp:Date.now(),nodeId:e,status:t,metadata:a};this.probeLog[1](r=>[...r,o]),this.playbackState[0]().isPlaying||(this.applyProbeToGraph(o),this.playbackState[1](r=>({...r,currentIndex:this.probeLog[0]().length-1})))}applyProbeToGraph(e){let[t,a]=this.graphState,o=t(),r=o.nodes.find(n=>n.id===e.nodeId);if(r&&(r.status=e.status,r.metadata=e.metadata,a({...o}),e.status==="active")){this.statusTimeouts.has(e.nodeId)&&clearTimeout(this.statusTimeouts.get(e.nodeId));let n=window.setTimeout(()=>{let s=this.probeLog[0]().filter(c=>c.nodeId===e.nodeId).pop();this.applyProbeToGraph({...s,status:"loaded"})},1500);this.statusTimeouts.set(e.nodeId,n)}}goToLogIndex(e){let t=this.probeLog[0]();if(e<0||e>=t.length)return;this.playbackState[1](s=>({...s,currentIndex:e,isPlaying:!1}));let a=t.slice(0,e+1).reduce((s,c)=>(s[c.nodeId]=c,s),{}),[o,r]=this.graphState,n=o();n.nodes.forEach(s=>{a[s.id]?(s.status=a[s.id].status,s.metadata=a[s.id].metadata):s.status="idle"}),r({...n})}};function qe(i,e,t){let a=[];for(let o in i){let r=o.replace("index.ts","package.json"),n=e[r];!n||!n.name||(!t||t.has(n.name))&&a.push({id:n.name,manifest:n,importer:i[o]})}return a}var Y=class{storage;hooks;notifications;gamification;api;container;constructor(e){this.container=e,this.storage=e.get("storage"),this.hooks=e.get("hooks"),this.notifications=e.get("notifications"),this.gamification=e.get("gamification"),this.api=e.get("api")}executeUpdate(e,t,a){}};function Ve(i){let{commands:e}=i;document.body.addEventListener("click",a=>{let o=a.target.closest("[data-command]");if(!o||o.tagName==="FORM")return;a.preventDefault();let r=o.getAttribute("data-command"),n=o.getAttribute("data-command-arg"),s=o.closest("[data-component-id]")?.getAttribute("data-component-id")??void 0;r&&e.execute(r,n,s)}),document.body.addEventListener("submit",a=>{let o=a.target;o.dataset.command&&(a.preventDefault(),e.execute(o.dataset.command,new FormData(o)))});let t=null;document.body.addEventListener("dragstart",a=>{let o=a.target;o.classList.contains("task-card-premium")&&(t=Number(o.dataset.taskId),setTimeout(()=>o.classList.add("dragging"),0))}),document.body.addEventListener("dragover",a=>{let o=a.target.closest(".kanban-column");o&&(a.preventDefault(),document.querySelectorAll(".kanban-column").forEach(r=>r.classList.remove("drag-over")),o.classList.add("drag-over"))}),document.body.addEventListener("dragleave",a=>{a.target.closest(".kanban-column")?.classList.remove("drag-over")}),document.body.addEventListener("drop",a=>{a.preventDefault();let o=a.target.closest(".kanban-column");if(document.querySelectorAll(".kanban-column").forEach(r=>r.classList.remove("drag-over")),o&&t!==null){let r=o.dataset.status;i.commands.execute("kanban.moveTask",{taskId:t,newStatus:r})}document.querySelectorAll(".kanban-column").forEach(r=>r.classList.remove("drag-over")),t=null}),document.body.addEventListener("dragend",a=>{let o=a.target;o.classList.contains("task-card-premium")&&o.classList.remove("dragging"),t=null})}var Ge={APP_BEFORE_START:"app:beforeStart",APP_READY:"app:ready",APP_SHUTDOWN:"app:shutdown",WORKBENCH_BEFORE_START:"workbench:before-start",WORKBENCH_LAYOUT_READY:"workbench:layout-ready",WORKBENCH_USER_AUTHENTICATED:"workbench:user-authenticated",WORKBENCH_READY:"workbench:ready"},Ue={ACTIVITY_BAR:"ui:activityBar",STATUS_BAR_LEFT:"ui:statusBar.left",STATUS_BAR_RIGHT:"ui:statusBar.right"};var V=class{api;dom={};allCommands=[];filteredCommands=[];selectedIndex=0;constructor(e){this.api=e,this.init()}toggle(){this.dom.modal?.classList.contains("hidden")?this.show():this.hide()}show(){this.allCommands=this.api.commands.getAll(),this.filteredCommands=this.allCommands,this.selectedIndex=0,this.renderResults(),this.dom.modal?.classList.remove("hidden"),this.dom.input?.focus()}hide(){let e=this.dom.input;e&&(e.value=""),this.dom.modal?.classList.add("hidden")}init(){let e=document.createElement("div");e.id="command-palette-modal",e.className="fixed inset-0 bg-darker/80 backdrop-blur-sm flex items-start justify-center hidden pt-24",e.style.zIndex="10000",e.style.position="fixed",e.innerHTML=g`
23
+ <div class="glass-premium p-4 rounded-2xl w-full max-w-2xl animate-scale-in flex flex-col max-h-[70vh]">
24
+ <input id="palette-search-input" type="text" class="form-input-premium text-lg mb-2" placeholder="Escribe un comando...">
25
+ <div id="palette-results-list" class="overflow-y-auto"></div>
26
+ </div>
27
+ `,document.body.appendChild(e),this.dom.modal=e,this.dom.input=e.querySelector("#palette-search-input"),this.dom.results=e.querySelector("#palette-results-list"),this.attachEventListeners()}attachEventListeners(){this.dom.modal?.addEventListener("click",e=>{e.target===this.dom.modal&&this.hide()}),this.dom.input?.addEventListener("input",()=>{let e=this.dom.input.value.toLowerCase();this.filteredCommands=this.allCommands.filter(t=>t.title.toLowerCase().includes(e)||t.category?.toLowerCase().includes(e)),this.selectedIndex=0,this.renderResults()}),this.dom.input?.addEventListener("keydown",e=>{switch(e.key){case"ArrowDown":e.preventDefault(),this.selectedIndex=Math.min(this.selectedIndex+1,this.filteredCommands.length-1),this.renderResults();break;case"ArrowUp":e.preventDefault(),this.selectedIndex=Math.max(this.selectedIndex-1,0),this.renderResults();break;case"Enter":e.preventDefault(),this.executeSelected();break;case"Escape":this.hide();break}}),this.dom.results?.addEventListener("click",e=>{let t=e.target.closest(".command-palette-item");t?.dataset.commandId&&(this.api.commands.execute(t.dataset.commandId),this.hide())})}renderResults(){if(this.dom.results){if(this.filteredCommands.length===0){this.dom.results.innerHTML='<div class="p-4 text-center text-muted-foreground">No se encontraron comandos.</div>';return}this.dom.results.innerHTML=this.filteredCommands.map((e,t)=>g`
28
+ <div class="command-palette-item ${t===this.selectedIndex?"selected":""}" data-command-id="${e.id}">
29
+ <div class="flex items-center gap-3">
30
+ <i class="${e.icon||"fas fa-cogs"}"></i>
31
+ <span>${e.title}</span>
32
+ </div>
33
+ ${e.category?`<span class="category">${e.category}</span>`:""}
34
+ </div>
35
+ `).join(""),this.dom.results.querySelector(".selected")?.scrollIntoView({block:"nearest"})}}executeSelected(){let e=this.filteredCommands[this.selectedIndex];e&&(this.api.commands.execute(e.id),this.hide())}};function ze(i){let e=new V(i);i.commands.register({id:"palette.toggle",title:"Abrir Paleta de Comandos",execute:()=>e.toggle()}),i.shortcuts.register({id:"togglePalette",keys:"Control+K",commandId:"palette.toggle",description:"Abrir/Cerrar Paleta de Comandos"}),i.layout.registerTopBarItem({id:"right.toggle-left-sidebar",icon:"fas fa-arrow-right-from-bracket",title:"Panel Izquierdo",commandId:"layout.toggleSidebar",order:1}),i.layout.registerTopBarItem({id:"right.toggle-right-sidebar",icon:"fas fa-arrow-left",title:"Panel Derecho",commandId:"layout.toggleSidebarRight",order:2}),i.layout.registerTopBarItem({id:"right.toggle-bottom-panel",icon:"fas fa-panel-bottom",title:"Panel Inferior",commandId:"layout.togglePanel",order:3}),i.commands.register({id:"app.showInfo",title:"Mostrar Informaci\xF3n de la App",category:"Ayuda",execute:()=>{i.modals.show({title:"Acerca de Decido",content:g`<div class="text-center"><h2 class="text-2xl font-bold">Decido</h2><p class="text-lg">Tu sistema operativo para la vida.</p><p class="mt-4">Versión 0.3.1 - Estable</p></div>`})}}),i.commands.register({id:"auth.showLoginModal",title:"Iniciar Sesi\xF3n",category:"Usuario",execute:()=>{let t=document.createElement("div");t.innerHTML=g`
36
+ <form id="login-form" class="space-y-4">
37
+ <div><label for="email" class="journal-label">Email</label><input type="email" name="email" class="form-input-premium" required value="test@test.com"></div>
38
+ <div><label for="password" class="journal-label">Contraseña</label><input type="password" name="password" class="form-input-premium" required value="password"></div>
39
+ <div class="pt-4 text-right"><button type="submit" class="btn-premium">Entrar</button></div>
40
+ </form>
41
+ `;let a=i.modals.show({title:"Iniciar Sesi\xF3n",content:t,actions:[]});t.querySelector("#login-form")?.addEventListener("submit",async o=>{o.preventDefault();let r=o.target,n=r.elements.namedItem("email").value,s=r.elements.namedItem("password").value;try{await i.auth.login(n,s),a.close()}catch(c){let m=c instanceof Error?c.message:"Error desconocido";i.notifications.show("error","Error de Login",m)}})}}),i.commands.register({id:"auth.showRegisterModal",title:"Registrarse",category:"Usuario",execute:()=>{let t=document.createElement("div");t.innerHTML=g`
42
+ <form id="register-form" class="space-y-4">
43
+ <div><label for="username" class="journal-label">Nombre</label><input type="text" name="username" class="form-input-premium" required></div>
44
+ <div><label for="email" class="journal-label">Email</label><input type="email" name="email" class="form-input-premium" required></div>
45
+ <div><label for="password" class="journal-label">Contraseña</label><input type="password" name="password" class="form-input-premium" required></div>
46
+ <div class="pt-4 text-right"><button type="submit" class="btn-premium">Registrarse</button></div>
47
+ </form>
48
+ <div class="text-center mt-4">
49
+ <a href="#" class="text-sm text-accent hover:underline" data-command="auth.showLoginModal">¿Ya tienes cuenta? Inicia sesión</a>
50
+ </div>
51
+ `;let a=i.modals.show({title:"Crear Cuenta",content:t,actions:[]});t.querySelector("#register-form")?.addEventListener("submit",async o=>{o.preventDefault();let r=o.target,n=r.elements.namedItem("username").value,s=r.elements.namedItem("email").value,c=r.elements.namedItem("password").value;try{await i.auth.register(n,s,c),a.close(),i.notifications.show("success","Registro Exitoso","Ahora puedes iniciar sesi\xF3n."),i.commands.execute("auth.showLoginModal")}catch(m){let p=m instanceof Error?m.message:"Error desconocido";i.notifications.show("error","Error de Registro",p)}})}}),i.commands.register({id:"workbench.splitPane",title:"Dividir Editor",category:"Layout",execute:t=>{let a=t.state.editorPanes(),o=`pane-${Date.now()}`,r={id:o,tabs:[],activeTabId:null};t.state.setEditorPanes([...a,r]),t.state.setActivePaneId(o)}}),i.commands.register({id:"workbench.openTab",title:"Abrir Vista en Editor",category:"Layout",execute:(t,a)=>{let{state:o,layout:r}=t,n=o.editorPanes(),s=o.activePaneId();if(n.length===0){let p={id:`pane-${Date.now()}`,tabs:[],activeTabId:null};n=[p],s=p.id,o.setActivePaneId(s)}let c=n.find(p=>p.id===s);c.tabs.some(p=>p.id===a.id)||c.tabs.push(a),c.activeTabId=a.id,o.setEditorPanes([...n])}}),i.commands.register({id:"workbench.focusTab",title:"Enfocar Vista",execute:(t,{paneId:a,tabId:o})=>{let{state:r}=t,n=r.editorPanes(),s=n.find(c=>c.id===a);s&&(s.activeTabId=o,r.setActivePaneId(a),r.setEditorPanes([...n]))}}),i.commands.register({id:"workbench.closeTab",title:"Cerrar Vista",execute:(t,{paneId:a,tabId:o})=>{let{state:r}=t,n=r.editorPanes(),s=n.find(m=>m.id===a);if(!s)return;let c=s.tabs.filter(m=>m.id!==o);if(c.length===0&&n.length>1){n=n.filter(p=>p.id!==a);let m=n[n.length-1]?.id||null;r.setActivePaneId(m)}else s.tabs=c,s.activeTabId===o&&(s.activeTabId=c[c.length-1]?.id||null);r.setEditorPanes([...n])}})}0&&(module.exports={ApiService,AuthService,BaseService,CORE_HOOK_NAMES,CORE_SLOT_NAMES,CalendarService,CommandService,DebugService,DecidoDB,GamificationService,HookService,ModalService,ModuleManager,NotificationService,RouterService,ServiceContainer,ShortcutService,StorageService,SyncService,ThemeService,apiService,authService,createEffect,createMemo,createPlatformAPI,createSignal,db,formatDate,html,initEventListeners,makeDraggable,processModuleDefinitions,registerCoreCommands,routerService,storageService,syncService,themeService});
package/dist/index.mjs ADDED
@@ -0,0 +1,51 @@
1
+ var Z=Object.defineProperty;var ee=(i,e)=>{for(var t in e)Z(i,t,{get:e[t],enumerable:!0})};var K=class{services=new Map;register(e,t){this.services.has(e)&&console.warn(`[ServiceContainer] El servicio '${e}' ya est\xE1 registrado. Se sobrescribir\xE1.`),this.services.set(e,t)}get(e){let t=this.services.get(e);if(!t)throw new Error(`[ServiceContainer] No se encontr\xF3 servicio registrado con la clave: ${e}`);return t}};import te,{useEffect as oe}from"react";var v=class{api;container;modules=new Map;activatedModules=new Set;serviceProviderMap=new Map;constructor(e,t){this.api=e,this.container=t}async registerModules(e){for(let t of e){if(this.modules.has(t.id)){console.warn(`[ModuleManager] El m\xF3dulo '${t.id}' ya est\xE1 registrado. Omitiendo duplicado.`);continue}this.modules.set(t.id,t),console.log(`[Manifest] Registrando contribuciones para '${t.id}'`),this.registerStaticContributions(t.manifest)}}registerStaticContributions(e){let t=e.name;if(!t||!e.contributes)return;let a=e.contributes;e.provides?.forEach(o=>{this.serviceProviderMap.set(o,t)}),a.commands?.forEach(o=>{this.api.commands.register({...o,execute:(r,n)=>this.activateAndExecute(t,o.id,n)})}),a.sidebarViews?.forEach(o=>{if(this.api.layout.registerSidebarView){let r=this.createLazyModuleView(t,o.title);this.api.layout.registerSidebarView({...o,component:r})}else o.render&&this.api.layout.registerSidebarView({...o,render:r=>{r.innerHTML=`<div class="p-4 text-center text-muted-foreground">Cargando ${o.title}...</div>`,this.activateModule(t).then(()=>{this.api.layout.renderSidebar()})}})}),a.activityBar?.forEach(o=>{this.api.layout.registerActivityBarItem({...o})}),a.panelViews?.forEach(o=>{if(this.api.layout.registerPanelView&&this.createLazyModuleView){let r=this.createLazyModuleView(t,o.title);this.api.layout.registerPanelView({...o,component:r})}else o.render&&this.api.layout.registerPanelView({...o,render:r=>{r.innerHTML=`<div class="p-4 text-center text-muted-foreground">Cargando ${o.title}...</div>`,this.activateModule(t).then(()=>{this.api.layout.renderPanel()})}})}),a.topBarItems?.forEach(o=>{this.api.layout.registerTopBarItem(o)}),a.statusBarItems?.forEach(o=>{this.api.layout.registerStatusBarItem(o)})}async activateModule(e){if(this.activatedModules.has(e))return;let t=this.modules.get(e);if(!t)throw new Error(`Intento de activar un m\xF3dulo no registrado: ${e}`);console.log(`\u{1F680} Activando m\xF3dulo del n\xFAcleo '${e}'...`);try{let a=await t.importer();if(a.activate&&typeof a.activate=="function")await a.activate(this.api),this.activatedModules.add(e),console.log(`\u2705 M\xF3dulo '${e}' activado con \xE9xito.`);else throw new Error("El m\xF3dulo no tiene una funci\xF3n de exportaci\xF3n 'activate' v\xE1lida.")}catch(a){console.error(`\u274C Fallo al activar el m\xF3dulo '${e}':`,a),this.api.notifications.show("error",`Fallo al activar: ${e}`,a.message)}}async loadExternalModules(e){for(let t of e)if(!this.activatedModules.has(t.id)){console.log(`\u{1F50C} Cargando m\xF3dulo externo '${t.id}' desde '${t.path}'`);try{let o=await import(`${window.location.origin}${t.path}/index.js`);if(o.activate&&typeof o.activate=="function")await o.activate(this.api),this.activatedModules.add(t.id),console.log(`\u2705 M\xF3dulo externo '${t.id}' activado.`);else throw new Error("El m\xF3dulo externo no exporta una funci\xF3n 'activate'.")}catch(a){console.error(`\u274C Fallo al cargar el m\xF3dulo externo '${t.id}':`,a),this.api.notifications.show("error","Fallo de M\xF3dulo Externo",a.message)}}}getModuleIdForService(e){return this.serviceProviderMap.get(e)}async activateAndExecute(e,t,a){await this.activateModule(e),this.api.commands.execute(t,a)}createLazyModuleView(e,t){return()=>(oe(()=>{this.activateModule(e).catch(a=>console.error("Lazy Load failed",a))},[]),te.createElement("div",{className:"flex items-center justify-center h-full text-muted-foreground"},`Cargando m\xF3dulo: ${t}...`))}};var y=class{events;spy=null;constructor(){this.events=new Map}on(e,t){this.events.has(e)||this.events.set(e,new Set),this.events.get(e).add(t)}off(e,t){let a=this.events.get(e);a&&a.delete(t)}emit(e,t){let a=this.events.get(e);a&&a.forEach(o=>o(t)),this.spy&&this.spy(e,t)}spyOn(e){this.spy=e}};var I=class{commands=new Map;api;spy=null;constructor(){}register(e){this.commands.has(e.id)&&console.warn(`[CommandService] El comando "${e.id}" ya est\xE1 registrado. Se sobrescribir\xE1.`),this.commands.set(e.id,e)}execute(e,t,a){let o=this.commands.get(e);if(o)try{let r=`svc:${o.id.split(".")[0]}Service`,n=performance.now();o.execute(this.api,t);let c=(performance.now()-n).toFixed(2);this.api.debug?.probe(r,"active",{sourceNodeId:a,command:e,duration:`${c} ms`}),this.api.events.emit(`command:${e}:executed`,{arg:t})}catch(r){console.error(`Error ejecutando el comando "${e}":`,r),this.api.notifications.show("error","Error de Comando",`No se pudo ejecutar "${o.title}".`)}else console.error(`[CommandService] Intento de ejecutar un comando no registrado: "${e}"`)}getAll(){return Array.from(this.commands.values())}spyOn(e){this.spy=e}};function je(i){if(!i)return"Sin fecha";let e=new Date(i),t=e.getTimezoneOffset()*6e4;return new Date(e.getTime()+t).toLocaleDateString("es-ES",{year:"numeric",month:"short",day:"numeric"})}function g(i,...e){return String.raw({raw:i},...e)}function Ke(i,e){}var T=class{container;constructor(){this.container=document.createElement("div"),this.container.id="notification-container",this.container.className="fixed top-5 right-5 z-10000 w-96 space-y-3",document.body.appendChild(this.container)}show(e,t,a,o=4e3){let r=`notif_${Date.now()}`,n=document.createElement("div");n.id=r;let c={info:{icon:"fas fa-info-circle",color:"border-secondary"},success:{icon:"fas fa-check-circle",color:"border-success"},warning:{icon:"fas fa-exclamation-triangle",color:"border-accent"},error:{icon:"fas fa-times-circle",color:"border-danger"},achievement:{icon:"fas fa-trophy",color:"border-accent"}}[e];n.innerHTML=g`
2
+ <div class="notification-item glass-card animate-slide-in-right border-l-4 ${c.color}">
3
+ <i class="notification-icon ${c.icon}"></i>
4
+ <div class="flex-grow">
5
+ <h4 class="notification-title">${t}</h4>
6
+ <p class="notification-message">${a}</p>
7
+ </div>
8
+ <button class="notification-close-btn" data-close-id="${r}">&times;</button>
9
+ </div>
10
+ `,n.querySelector(".notification-close-btn")?.addEventListener("click",()=>{n.remove()}),this.container.appendChild(n),setTimeout(()=>{document.getElementById(r)?.remove()},o)}};var E=class{container;constructor(){this.container=document.createElement("div"),this.container.id="modal-container",document.body.appendChild(this.container)}show(e){this.hide();let t=`modal_${Date.now()}`,a={sm:"max-w-md",md:"max-w-lg",lg:"max-w-2xl",xl:"max-w-4xl"},o=document.createElement("div");o.id=t,o.className="fixed inset-0 bg-darker/80 backdrop-blur-sm flex items-center justify-center z-50",o.innerHTML=g`
11
+ <div class="glass-premium p-8 rounded-2xl w-full ${a[e.size||"md"]} animate-scale-in">
12
+ <div class="flex justify-between items-center mb-6">
13
+ <h2 class="text-2xl font-bold text-white">${e.title}</h2>
14
+ <button class="text-muted-foreground hover:text-foreground text-2xl close-btn">&times;</button>
15
+ </div>
16
+ <div class="modal-body"></div>
17
+ ${e.actions&&e.actions.length>0?`
18
+ <div class="pt-6 border-t border-white/10 mt-6 text-right space-x-4 modal-footer">
19
+ </div>
20
+ `:""}
21
+ </div>
22
+ `;let r=()=>o.remove(),n=o.querySelector(".modal-body");typeof e.content=="string"?n.innerHTML=e.content:n.appendChild(e.content);let s=o.querySelector(".modal-footer");return s&&e.actions&&e.actions.forEach(c=>{let d=document.createElement("button");d.textContent=c.text,d.className=c.type==="primary"?"btn-premium":"btn-secondary",d.onclick=()=>c.onClick(r),s.appendChild(d)}),o.querySelector(".close-btn")?.addEventListener("click",r),o.addEventListener("click",c=>{c.target===o&&r()}),this.container.appendChild(o),{close:r}}hide(){let e=this.container.querySelector(".fixed");e&&e.remove()}};var k=class{api;levelFormula=e=>Math.floor(100*Math.pow(e,1.5));addXP(e,t="Acci\xF3n completada"){let{state:a,notifications:o}=this.api,r=a.gamification(),n=r.xp+e,s=r.level,c=s,d=!1,p=this.levelFormula(s);for(;n>=p;)c++,d=!0,p=this.levelFormula(c);a.setGamification({...r,xp:n,level:c}),o.show("success",`+${e} XP!`,t),d&&setTimeout(()=>{o.show("success","\xA1Subiste de Nivel!",`\u{1F680} \xA1Felicidades! Has alcanzado el Nivel ${c}.`)},500)}updateJournalStreak(){let{state:e}=this.api,t=e.gamification(),a=new Date,o=t.lastJournalDate?new Date(t.lastJournalDate):null,r=t.streak,n=(c,d)=>c.toDateString()===d.toDateString();if(o&&n(a,o))return;let s=new Date;if(s.setDate(a.getDate()-1),r=o&&n(s,o)?r+1:1,r>t.streak){let c=Math.min(r*5,50);this.addXP(c,`Racha de ${r} d\xEDas`)}e.setGamification({...e.gamification(),streak:r,lastJournalDate:a.toISOString().slice(0,10)})}checkAndUnlockAchievements(){let{state:e,notifications:t}=this.api,a=e.gamification(),o=0,r=[];if(a.achievements.forEach(n=>{if(a.unlockedAchievements.includes(n.id))return;let s=!1;switch(n.conditionType){case"journal_streak":a.streak>=n.conditionValue&&(s=!0);break;case"level":a.level>=n.conditionValue&&(s=!0);break}s&&(r.push(n.id),o+=n.reward_xp,t.show("success","\xA1Logro Desbloqueado!",`\u{1F3C6} ${n.title}`))}),r.length>0){this.addXP(o,`Recompensa por ${r.length} logros`);let n=e.gamification();e.setGamification({...n,unlockedAchievements:[...n.unlockedAchievements,...r]})}}};var M=class{api;createEvent(e){let t={...e,id:Date.now()};return this.api.notifications.show("success","Evento Creado",`Se a\xF1adi\xF3 "${t.title}" a tu calendario.`),t}getEventsForDay(e){}};var L=class{api;shortcuts=new Map;init(e){this.api=e,window.addEventListener("keydown",this.handleKeyDown.bind(this))}register(e){let t=e.keys.toLowerCase().split("+").sort().join("_");this.shortcuts.set(t,e)}handleKeyDown(e){let t=[];if(e.ctrlKey&&t.push("control"),e.metaKey&&t.push("meta"),e.shiftKey&&t.push("shift"),e.altKey&&t.push("alt"),["Control","Meta","Shift","Alt"].includes(e.key)||t.push(e.key.toLowerCase()),t.length>1){let a=t.sort().join("_"),o=this.shortcuts.get(a);o&&(e.preventDefault(),this.api.commands.execute(o.commandId,o.commandArg))}}};var F=class{id=Math.random().toString(36).substr(2,9);authService;init(e){console.log(`[ApiService:${this.id}] init called`),this.authService=e}async fetch(e,t={},a=!1){return console.log(`[ApiService Mock] Ignorando invocaci\xF3n de red a: ${e}`),{}}async login(e,t){return{}}async refresh(e){return{token:"dev"}}async register(e,t,a){return{}}logout(){}async getProfile(){return{id:1,name:"Local Dev"}}async updateProfile(e){return e}async getAIProjectPlan(e){return{}}async generateBlueprint(e){return""}async getAIGoalSuggestion(e){return{}}async getRefinedText(e,t){return e}async getModules(){return[]}async uploadModule(e){return{}}async generateTheme(e){return{}}},m=new F;var V={};ee(V,{activeCalendarId:()=>se,activeDashboardContext:()=>le,activeGoalId:()=>me,activePaneId:()=>N,activeProjectId:()=>pe,calendar:()=>fe,editorPanes:()=>C,gamification:()=>O,getFullStateSnapshot:()=>W,history:()=>H,initializeStateFromStorage:()=>Ie,isTimeTraveling:()=>_,restoreStateFromSnapshot:()=>X,setActiveCalendarId:()=>ce,setActiveDashboardContext:()=>de,setActiveGoalId:()=>ue,setActivePaneId:()=>S,setActiveProjectId:()=>ge,setCalendar:()=>he,setEditorPanes:()=>b,setGamification:()=>D,setHistory:()=>x,setIsTimeTraveling:()=>ve,setSnapshotDates:()=>Pe,setTimeTravelDate:()=>xe,setTimeTravelState:()=>be,setViewData:()=>ne,snapshotDates:()=>we,timeTravel:()=>ke,timeTravelDate:()=>Se,timeTravelLocal:()=>Ee,timeTravelState:()=>ye,updateState:()=>Te,viewData:()=>re});import ae from"dexie";var B=class extends ae{moduleData;syncQueue;dailySnapshots;projects;settings;constructor(){super("DecidoDB"),this.version(4).stores({moduleData:"id, entityId, [moduleId+entityType], userId, entityType",syncQueue:"++id, type, status",dailySnapshots:"date",projects:"id, name, updatedAt",settings:"key"})}},u=new B;var f=class{async getCollection(e){return(await u.moduleData.where({entityType:e}).toArray()).map(a=>a.data)}async saveEntity(e,t){let a={id:`${e}-${t.id}`,entityId:t.id,moduleId:e+"s",entityType:e,data:t};await u.moduleData.put(a)}async deleteEntity(e,t){await u.moduleData.delete(`${e}-${t}`)}async getValue(e){let t=await u.moduleData.get(`value-${e}`);return t?t.data:void 0}async saveValue(e,t){let a={id:`value-${e}`,entityId:e,moduleId:"values",entityType:"value",data:t};await u.moduleData.put(a)}async saveDailySnapshot(e,t){let a=e.toISOString().split("T")[0],o={date:a,data:t,timestamp:new Date};await u.dailySnapshots.put(o),console.log(`\u{1F4F8} Snapshot guardado para la fecha: ${a}`)}async getDailySnapshot(e){let t=e.toISOString().split("T")[0],a=await u.dailySnapshots.get(t);return a?a.data:void 0}async getAvailableSnapshotDates(){return await u.dailySnapshots.toCollection().keys()}async saveProject(e,t,a){await u.projects.put({id:e,name:t,data:a,updatedAt:Date.now()}),console.log(`\u{1F4BE} Proyecto ${e} guardado en IndexedDB`)}async getProject(e){return await u.projects.get(e)}async getAllProjectsMetadata(){return await u.projects.toArray()}async deleteProject(e){await u.projects.delete(e)}async setSetting(e,t){await u.settings.put({key:e,value:t})}async getSetting(e){return(await u.settings.get(e))?.value}},et=new f;var A=[];function l(i,e){let t=new Set;return[()=>{let r=A[A.length-1];return r&&t.add(r),i},r=>{let n=typeof r=="function"?r(i):r;e?.equals!==!1&&(typeof e?.equals=="function"?e.equals(i,n):Object.is(i,n))||(i=n,[...t].forEach(c=>c()))}]}function ie(i){let e=()=>{A.push(e);try{i()}finally{A.pop()}};e()}function ot(i){let[e,t]=l(void 0,{equals:!1});return ie(()=>{t(i())}),e}var[C,b]=l([]),[N,S]=l(null),[re,ne]=l(null);var[O,D]=l({xp:0,level:1,streak:0,lastJournalDate:null,unlockedAchievements:[],achievements:[]});var[se,ce]=l("all"),[le,de]=l({type:"global",id:null}),[me,ue]=l(null),[pe,ge]=l(null),[fe,he]=l([]);var[_,ve]=l(!1),[ye,be]=l(null),[Se,xe]=l(new Date),[we,Pe]=l([]),[H,x]=l([]);var q=!1,ht=new f;async function Ie(i){console.log("\u{1F4BE} Cargando estado desde IndexedDB...");let e=[{key:"gamification",setter:D,isSingle:!0},{key:"editorPanes",setter:b,isSingle:!0},{key:"activePaneId",setter:S,isSingle:!0}];for(let t of e){let a=t.isSingle?await i.getValue(t.key):await i.getCollection(t.key);(a!=null&&Array.isArray(a)&&a.length>0||a!=null&&!Array.isArray(a))&&t.setter(a)}if(C().length===0){console.log("No se encontr\xF3 layout de editor, creando uno por defecto.");let t={id:"pane-main",tabs:[{id:"welcome",title:"Bienvenido",componentTag:"welcome-view",icon:"fas fa-hand-sparkles"}],activeTabId:"welcome"};b([t]),S(t.id)}console.log("\u2705 Estado cargado desde IndexedDB.")}var J=!1;function Te(i,e,t){if(_()){console.warn(`[STATE] Escritura bloqueada (${i}). La aplicaci\xF3n est\xE1 en modo de revisi\xF3n de solo lectura.`);return}if(!q){let a=W();x(o=>[...o,{id:o.length,timestamp:new Date,action:i,snapshot:a}])}e(),t&&t().catch(a=>{console.error(`[STATE] Fallo de persistencia en la acci\xF3n '${i}':`,a)})}function W(){return{gamification:O(),editorPanes:C(),activePaneId:N()}}function X(i){i&&(D(i.gamification||{xp:0,level:1,streak:0,lastJournalDate:null,unlockedAchievements:[],achievements:[]}),b(i.editorPanes||[]),S(i.activePaneId||null))}function Ee(i){let e=H();e[i]&&(q=!0,X(e[i].snapshot),x(e.slice(0,i+1)),q=!1)}function ke(i){let e=H();if(!e[i])return;let t=e[i].snapshot;J=!0,console.log(`\u2708\uFE0F Viajando en el tiempo al estado ${i}`,t),x(e.slice(0,i+1)),J=!1}var Me={dark:{"--bg-main":"#070720","--bg-content":"#0F0F23","--bg-surface":"rgba(255, 255, 255, 0.03)","--text-primary":"#FFFFFF","--text-secondary":"#9CA3AF"},light:{"--bg-main":"#f8f9fa","--bg-content":"#FFFFFF","--bg-surface":"rgba(0, 0, 0, 0.03)","--text-primary":"#212529","--text-secondary":"#495057"}},w=class{activeTheme;constructor(){let e=localStorage.getItem("decido-theme")||"dark";this.activeTheme=l(e),this.applyTheme(e)}setTheme(e){this.activeTheme[1](e),this.applyTheme(e),localStorage.setItem("decido-theme",e)}applyTheme(e){let t=Me[e];for(let[a,o]of Object.entries(t))document.documentElement.style.setProperty(a,o)}updateToken(e,t){document.documentElement.style.setProperty(e,t)}applyPalette(e){let t={primary:"--color-primary",secondary:"--color-secondary",accent:"--color-accent",bgMain:"--bg-main",bgContent:"--bg-content",textPrimary:"--text-primary",textSecondary:"--text-secondary"};for(let[a,o]of Object.entries(e)){let r=t[a];r&&this.updateToken(r,o)}}},wt=new w;var G=class{apiService;session;constructor(){this.session=l({user:null,token:null,status:"loading"})}init(e){this.apiService=e}async checkSession(){let e={id:1,name:"Local Dev",email:"dev@local.host"};this.setSession({user:e,token:"local-dev-token",status:"authenticated"}),console.log("[Auth] CheckSession local - Auto autenticado.")}login=async(e,t)=>{let a={id:1,name:"Local Dev",email:e};this.setSession({user:a,token:"local-dev-token",status:"authenticated"});let o=document.getElementById("fullscreen-view-container");o&&(o.innerHTML="");let r=document.getElementById("app");return r&&(r.style.display="block"),a};async register(e,t,a){return{success:!0}}logout=()=>{this.setSession({user:null,token:null,status:"unauthenticated"})};refreshToken=async()=>"local-dev-token";listeners=new Set;subscribe(e){return this.listeners.add(e),e(this.session[0]()),()=>{this.listeners.delete(e)}}setSession(e){let[t,a]=this.session;a({...t(),...e});let o=t();this.listeners.forEach(r=>r(o))}},h=new G;var U=class{routes=[];api;init(e){this.api=e,window.addEventListener("hashchange",this.handleRouteChange)}registerRoute(e){this.routes.push(e)}navigate(e){window.location.hash=e}_getCurrentHash(){return window.location.hash.slice(1)||"/"}handleRouteChange=()=>{let e=this._getCurrentHash(),t=this.routes.find(r=>r.path===e),a=h.session[0]();if(!t){console.error(`Ruta no encontrada: ${e}`),this.api.layout.renderComponent("not-found-view");return}let o=a.status==="authenticated";if(t.auth==="protected"&&!o){this.navigate("/login");return}if(t.auth==="guestOnly"&&o){this.navigate("/dashboard");return}t.title&&(document.title=`Decido - ${t.title}`),this.api.layout.renderComponent(t.componentTag,{isFullscreen:t.isFullscreen})}},Y=new U;var P=class{isSyncing=!1;startSyncLoop(){setInterval(()=>this.sync(),1e4),window.addEventListener("online",()=>this.sync())}async sync(){if(!(this.isSyncing||!navigator.onLine)){this.isSyncing=!0;try{let e=localStorage.getItem("active_project_id");if(e){let t=await u.projects.get(e);t&&(console.log("\u2601\uFE0F Sincronizando con la nube..."),await m.fetch(`/module-data/projects/${t.id}`,{method:"PUT",body:JSON.stringify({data:t.data,name:t.name})}))}}catch(e){console.error("Error de sincronizaci\xF3n",e)}finally{this.isSyncing=!1}}}},Ct=new P;var $=class{hooks=new Map;on(e,t){return this.hooks.has(e)||this.hooks.set(e,[]),this.hooks.get(e).push(t),()=>this.off(e,t)}register(e,t){return this.on(e,t)}off(e,t){let a=this.hooks.get(e);if(!a)return;let o=a.filter(r=>r!==t);o.length>0?this.hooks.set(e,o):this.hooks.delete(e)}async trigger(e,t){let a=this.hooks.get(e);if(!(!a||a.length===0)){console.log(`\u{1FA9D} Disparando hook: ${e}`,t);for(let o of[...a])try{await Promise.resolve(o(t))}catch(r){console.error(`Error en un callback del hook '${e}':`,r)}}}};var R=class{api;status="disconnected";init(e){this.api=e,console.log("\u{1F50C} WebSocketService (Mock) inicializado en modo Offline.")}connect(){console.log("[WebSocket] Ignorado: Conectando local (Micro-IDE).")}disconnect(){}emit(e,t){console.log(`[WebSocket Mock] Env\xEDo evadido: ${e}`,t)}};function Le(i){let e=new y;h.init(m),m.init(h),i.register("events",new y),i.register("notifications",new T),i.register("modals",new E),i.register("commands",new I),i.register("shortcuts",new L),i.register("gamification",new k),i.register("calendar",new M),i.register("storage",new f),i.register("sync",new P),i.register("hooks",new $),i.register("theme",new w),i.register("websocket",new R);let t=()=>i.get("moduleManager"),a={debug:void 0,events:i.get("events"),state:V,commands:i.get("commands"),modals:i.get("modals"),notifications:i.get("notifications"),shortcuts:i.get("shortcuts"),gamification:i.get("gamification"),calendar:i.get("calendar"),theme:i.get("theme"),storage:i.get("storage"),sync:i.get("sync"),moduleManager:null,auth:h,router:Y,hooks:i.get("hooks"),websocket:i.get("websocket"),modules:{getModules:()=>m.fetch("/marketplace/modules"),getInstalledModules:()=>m.fetch("/marketplace/user/modules"),installModule:o=>m.fetch(`/marketplace/install/${o}`,{method:"POST"}),uploadModule:o=>m.uploadModule(o),getProfile:m.getProfile.bind(m),updateProfile:m.updateProfile.bind(m),rateModule:(o,r,n)=>m.fetch(`/marketplace/rate/${o}`,{method:"POST",body:JSON.stringify({rating:r,review:n})}),getModuleById:o=>m.fetch(`/marketplace/module/${o}`),getCategories:()=>m.fetch("/marketplace/categories")},ai:{generateTheme:o=>m.fetch("/ai/generate-theme",{method:"POST",body:JSON.stringify({prompt:o})})},timetravel:{revertToDate:o=>m.fetch("/timetravel/revert",{method:"POST",body:JSON.stringify({date:o})}),getSnapshotDates:()=>m.fetch("/timetravel/snapshots/dates"),getPreviousActivityDate:o=>m.fetch(`/timetravel/previous-activity-date?currentDate=${o}`),getNextActivityDate:o=>m.fetch(`/timetravel/next-activity-date?currentDate=${o}`)},container:i,services:{register:(o,r)=>i.register(o,r),get:async o=>{try{return i.get(o)}catch{console.log(`[API] Servicio '${o}' no encontrado. Buscando proveedor...`);let n=t(),s=n.getModuleIdForService(o);if(s)return await n.activateModule(s),i.get(o);throw new Error(`[API] No se encontr\xF3 ning\xFAn m\xF3dulo que provea el servicio '${o}'.`)}}}};return i.register("moduleManager",new v(a,i)),a.websocket?.init(a),a}var z=class{api;graphState=l({nodes:[],links:[]});probeLog=l([]);playbackState=l({isPlaying:!1,currentIndex:-1});consoleLogs=l([]);statusTimeouts=new Map;constructor(e){this.api=e,this.setupInterceptors(),this.api.commands.spyOn(t=>{this.probe(`cmd:${t}`,"active")})}setupInterceptors(){this.interceptConsole()}interceptConsole(){let e={...window.console};["log","info","warn","error"].forEach(t=>{window.console[t]=(...a)=>{let o={id:`log_${Date.now()}`,type:t,timestamp:new Date,message:a,stack:t==="error"?new Error().stack:void 0};this.consoleLogs[1](r=>[...r,o]),e[t](...a)}})}clearLogs(e){e==="console"&&this.consoleLogs[1]([])}async loadArchitectureGraph(e){try{let a=await(await fetch(e)).json();a.nodes.forEach(o=>{o.status="idle"}),this.graphState[1](a),this.probeLog[1]([]),this.playbackState[1]({isPlaying:!1,currentIndex:-1}),console.log(`\u2705 Nuevo mapa de arquitectura cargado: ${e}`)}catch(t){console.error(`\u274C Error al cargar el mapa: ${e}`,t)}}probe(e,t,a){let o={timestamp:Date.now(),nodeId:e,status:t,metadata:a};this.probeLog[1](r=>[...r,o]),this.playbackState[0]().isPlaying||(this.applyProbeToGraph(o),this.playbackState[1](r=>({...r,currentIndex:this.probeLog[0]().length-1})))}applyProbeToGraph(e){let[t,a]=this.graphState,o=t(),r=o.nodes.find(n=>n.id===e.nodeId);if(r&&(r.status=e.status,r.metadata=e.metadata,a({...o}),e.status==="active")){this.statusTimeouts.has(e.nodeId)&&clearTimeout(this.statusTimeouts.get(e.nodeId));let n=window.setTimeout(()=>{let s=this.probeLog[0]().filter(c=>c.nodeId===e.nodeId).pop();this.applyProbeToGraph({...s,status:"loaded"})},1500);this.statusTimeouts.set(e.nodeId,n)}}goToLogIndex(e){let t=this.probeLog[0]();if(e<0||e>=t.length)return;this.playbackState[1](s=>({...s,currentIndex:e,isPlaying:!1}));let a=t.slice(0,e+1).reduce((s,c)=>(s[c.nodeId]=c,s),{}),[o,r]=this.graphState,n=o();n.nodes.forEach(s=>{a[s.id]?(s.status=a[s.id].status,s.metadata=a[s.id].metadata):s.status="idle"}),r({...n})}};function eo(i,e,t){let a=[];for(let o in i){let r=o.replace("index.ts","package.json"),n=e[r];!n||!n.name||(!t||t.has(n.name))&&a.push({id:n.name,manifest:n,importer:i[o]})}return a}var Q=class{storage;hooks;notifications;gamification;api;container;constructor(e){this.container=e,this.storage=e.get("storage"),this.hooks=e.get("hooks"),this.notifications=e.get("notifications"),this.gamification=e.get("gamification"),this.api=e.get("api")}executeUpdate(e,t,a){}};function ao(i){let{commands:e}=i;document.body.addEventListener("click",a=>{let o=a.target.closest("[data-command]");if(!o||o.tagName==="FORM")return;a.preventDefault();let r=o.getAttribute("data-command"),n=o.getAttribute("data-command-arg"),s=o.closest("[data-component-id]")?.getAttribute("data-component-id")??void 0;r&&e.execute(r,n,s)}),document.body.addEventListener("submit",a=>{let o=a.target;o.dataset.command&&(a.preventDefault(),e.execute(o.dataset.command,new FormData(o)))});let t=null;document.body.addEventListener("dragstart",a=>{let o=a.target;o.classList.contains("task-card-premium")&&(t=Number(o.dataset.taskId),setTimeout(()=>o.classList.add("dragging"),0))}),document.body.addEventListener("dragover",a=>{let o=a.target.closest(".kanban-column");o&&(a.preventDefault(),document.querySelectorAll(".kanban-column").forEach(r=>r.classList.remove("drag-over")),o.classList.add("drag-over"))}),document.body.addEventListener("dragleave",a=>{a.target.closest(".kanban-column")?.classList.remove("drag-over")}),document.body.addEventListener("drop",a=>{a.preventDefault();let o=a.target.closest(".kanban-column");if(document.querySelectorAll(".kanban-column").forEach(r=>r.classList.remove("drag-over")),o&&t!==null){let r=o.dataset.status;i.commands.execute("kanban.moveTask",{taskId:t,newStatus:r})}document.querySelectorAll(".kanban-column").forEach(r=>r.classList.remove("drag-over")),t=null}),document.body.addEventListener("dragend",a=>{let o=a.target;o.classList.contains("task-card-premium")&&o.classList.remove("dragging"),t=null})}var wo={APP_BEFORE_START:"app:beforeStart",APP_READY:"app:ready",APP_SHUTDOWN:"app:shutdown",WORKBENCH_BEFORE_START:"workbench:before-start",WORKBENCH_LAYOUT_READY:"workbench:layout-ready",WORKBENCH_USER_AUTHENTICATED:"workbench:user-authenticated",WORKBENCH_READY:"workbench:ready"},Po={ACTIVITY_BAR:"ui:activityBar",STATUS_BAR_LEFT:"ui:statusBar.left",STATUS_BAR_RIGHT:"ui:statusBar.right"};var j=class{api;dom={};allCommands=[];filteredCommands=[];selectedIndex=0;constructor(e){this.api=e,this.init()}toggle(){this.dom.modal?.classList.contains("hidden")?this.show():this.hide()}show(){this.allCommands=this.api.commands.getAll(),this.filteredCommands=this.allCommands,this.selectedIndex=0,this.renderResults(),this.dom.modal?.classList.remove("hidden"),this.dom.input?.focus()}hide(){let e=this.dom.input;e&&(e.value=""),this.dom.modal?.classList.add("hidden")}init(){let e=document.createElement("div");e.id="command-palette-modal",e.className="fixed inset-0 bg-darker/80 backdrop-blur-sm flex items-start justify-center hidden pt-24",e.style.zIndex="10000",e.style.position="fixed",e.innerHTML=g`
23
+ <div class="glass-premium p-4 rounded-2xl w-full max-w-2xl animate-scale-in flex flex-col max-h-[70vh]">
24
+ <input id="palette-search-input" type="text" class="form-input-premium text-lg mb-2" placeholder="Escribe un comando...">
25
+ <div id="palette-results-list" class="overflow-y-auto"></div>
26
+ </div>
27
+ `,document.body.appendChild(e),this.dom.modal=e,this.dom.input=e.querySelector("#palette-search-input"),this.dom.results=e.querySelector("#palette-results-list"),this.attachEventListeners()}attachEventListeners(){this.dom.modal?.addEventListener("click",e=>{e.target===this.dom.modal&&this.hide()}),this.dom.input?.addEventListener("input",()=>{let e=this.dom.input.value.toLowerCase();this.filteredCommands=this.allCommands.filter(t=>t.title.toLowerCase().includes(e)||t.category?.toLowerCase().includes(e)),this.selectedIndex=0,this.renderResults()}),this.dom.input?.addEventListener("keydown",e=>{switch(e.key){case"ArrowDown":e.preventDefault(),this.selectedIndex=Math.min(this.selectedIndex+1,this.filteredCommands.length-1),this.renderResults();break;case"ArrowUp":e.preventDefault(),this.selectedIndex=Math.max(this.selectedIndex-1,0),this.renderResults();break;case"Enter":e.preventDefault(),this.executeSelected();break;case"Escape":this.hide();break}}),this.dom.results?.addEventListener("click",e=>{let t=e.target.closest(".command-palette-item");t?.dataset.commandId&&(this.api.commands.execute(t.dataset.commandId),this.hide())})}renderResults(){if(this.dom.results){if(this.filteredCommands.length===0){this.dom.results.innerHTML='<div class="p-4 text-center text-muted-foreground">No se encontraron comandos.</div>';return}this.dom.results.innerHTML=this.filteredCommands.map((e,t)=>g`
28
+ <div class="command-palette-item ${t===this.selectedIndex?"selected":""}" data-command-id="${e.id}">
29
+ <div class="flex items-center gap-3">
30
+ <i class="${e.icon||"fas fa-cogs"}"></i>
31
+ <span>${e.title}</span>
32
+ </div>
33
+ ${e.category?`<span class="category">${e.category}</span>`:""}
34
+ </div>
35
+ `).join(""),this.dom.results.querySelector(".selected")?.scrollIntoView({block:"nearest"})}}executeSelected(){let e=this.filteredCommands[this.selectedIndex];e&&(this.api.commands.execute(e.id),this.hide())}};function $o(i){let e=new j(i);i.commands.register({id:"palette.toggle",title:"Abrir Paleta de Comandos",execute:()=>e.toggle()}),i.shortcuts.register({id:"togglePalette",keys:"Control+K",commandId:"palette.toggle",description:"Abrir/Cerrar Paleta de Comandos"}),i.layout.registerTopBarItem({id:"right.toggle-left-sidebar",icon:"fas fa-arrow-right-from-bracket",title:"Panel Izquierdo",commandId:"layout.toggleSidebar",order:1}),i.layout.registerTopBarItem({id:"right.toggle-right-sidebar",icon:"fas fa-arrow-left",title:"Panel Derecho",commandId:"layout.toggleSidebarRight",order:2}),i.layout.registerTopBarItem({id:"right.toggle-bottom-panel",icon:"fas fa-panel-bottom",title:"Panel Inferior",commandId:"layout.togglePanel",order:3}),i.commands.register({id:"app.showInfo",title:"Mostrar Informaci\xF3n de la App",category:"Ayuda",execute:()=>{i.modals.show({title:"Acerca de Decido",content:g`<div class="text-center"><h2 class="text-2xl font-bold">Decido</h2><p class="text-lg">Tu sistema operativo para la vida.</p><p class="mt-4">Versión 0.3.1 - Estable</p></div>`})}}),i.commands.register({id:"auth.showLoginModal",title:"Iniciar Sesi\xF3n",category:"Usuario",execute:()=>{let t=document.createElement("div");t.innerHTML=g`
36
+ <form id="login-form" class="space-y-4">
37
+ <div><label for="email" class="journal-label">Email</label><input type="email" name="email" class="form-input-premium" required value="test@test.com"></div>
38
+ <div><label for="password" class="journal-label">Contraseña</label><input type="password" name="password" class="form-input-premium" required value="password"></div>
39
+ <div class="pt-4 text-right"><button type="submit" class="btn-premium">Entrar</button></div>
40
+ </form>
41
+ `;let a=i.modals.show({title:"Iniciar Sesi\xF3n",content:t,actions:[]});t.querySelector("#login-form")?.addEventListener("submit",async o=>{o.preventDefault();let r=o.target,n=r.elements.namedItem("email").value,s=r.elements.namedItem("password").value;try{await i.auth.login(n,s),a.close()}catch(c){let d=c instanceof Error?c.message:"Error desconocido";i.notifications.show("error","Error de Login",d)}})}}),i.commands.register({id:"auth.showRegisterModal",title:"Registrarse",category:"Usuario",execute:()=>{let t=document.createElement("div");t.innerHTML=g`
42
+ <form id="register-form" class="space-y-4">
43
+ <div><label for="username" class="journal-label">Nombre</label><input type="text" name="username" class="form-input-premium" required></div>
44
+ <div><label for="email" class="journal-label">Email</label><input type="email" name="email" class="form-input-premium" required></div>
45
+ <div><label for="password" class="journal-label">Contraseña</label><input type="password" name="password" class="form-input-premium" required></div>
46
+ <div class="pt-4 text-right"><button type="submit" class="btn-premium">Registrarse</button></div>
47
+ </form>
48
+ <div class="text-center mt-4">
49
+ <a href="#" class="text-sm text-accent hover:underline" data-command="auth.showLoginModal">¿Ya tienes cuenta? Inicia sesión</a>
50
+ </div>
51
+ `;let a=i.modals.show({title:"Crear Cuenta",content:t,actions:[]});t.querySelector("#register-form")?.addEventListener("submit",async o=>{o.preventDefault();let r=o.target,n=r.elements.namedItem("username").value,s=r.elements.namedItem("email").value,c=r.elements.namedItem("password").value;try{await i.auth.register(n,s,c),a.close(),i.notifications.show("success","Registro Exitoso","Ahora puedes iniciar sesi\xF3n."),i.commands.execute("auth.showLoginModal")}catch(d){let p=d instanceof Error?d.message:"Error desconocido";i.notifications.show("error","Error de Registro",p)}})}}),i.commands.register({id:"workbench.splitPane",title:"Dividir Editor",category:"Layout",execute:t=>{let a=t.state.editorPanes(),o=`pane-${Date.now()}`,r={id:o,tabs:[],activeTabId:null};t.state.setEditorPanes([...a,r]),t.state.setActivePaneId(o)}}),i.commands.register({id:"workbench.openTab",title:"Abrir Vista en Editor",category:"Layout",execute:(t,a)=>{let{state:o,layout:r}=t,n=o.editorPanes(),s=o.activePaneId();if(n.length===0){let p={id:`pane-${Date.now()}`,tabs:[],activeTabId:null};n=[p],s=p.id,o.setActivePaneId(s)}let c=n.find(p=>p.id===s);c.tabs.some(p=>p.id===a.id)||c.tabs.push(a),c.activeTabId=a.id,o.setEditorPanes([...n])}}),i.commands.register({id:"workbench.focusTab",title:"Enfocar Vista",execute:(t,{paneId:a,tabId:o})=>{let{state:r}=t,n=r.editorPanes(),s=n.find(c=>c.id===a);s&&(s.activeTabId=o,r.setActivePaneId(a),r.setEditorPanes([...n]))}}),i.commands.register({id:"workbench.closeTab",title:"Cerrar Vista",execute:(t,{paneId:a,tabId:o})=>{let{state:r}=t,n=r.editorPanes(),s=n.find(d=>d.id===a);if(!s)return;let c=s.tabs.filter(d=>d.id!==o);if(c.length===0&&n.length>1){n=n.filter(p=>p.id!==a);let d=n[n.length-1]?.id||null;r.setActivePaneId(d)}else s.tabs=c,s.activeTabId===o&&(s.activeTabId=c[c.length-1]?.id||null);r.setEditorPanes([...n])}})}export{F as ApiService,G as AuthService,Q as BaseService,wo as CORE_HOOK_NAMES,Po as CORE_SLOT_NAMES,M as CalendarService,I as CommandService,z as DebugService,B as DecidoDB,k as GamificationService,$ as HookService,E as ModalService,v as ModuleManager,T as NotificationService,U as RouterService,K as ServiceContainer,L as ShortcutService,f as StorageService,P as SyncService,w as ThemeService,m as apiService,h as authService,ie as createEffect,ot as createMemo,Le as createPlatformAPI,l as createSignal,u as db,je as formatDate,g as html,ao as initEventListeners,Ke as makeDraggable,eo as processModuleDefinitions,$o as registerCoreCommands,Y as routerService,et as storageService,Ct as syncService,wt as themeService};
package/package.json CHANGED
@@ -1,10 +1,11 @@
1
1
  {
2
2
  "name": "@decido/shell-vscode-core",
3
- "version": "4.0.2",
3
+ "version": "4.0.4",
4
4
  "main": "./dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "exports": {
7
7
  ".": {
8
+ "development": "./src/index.ts",
8
9
  "types": "./dist/index.d.ts",
9
10
  "import": "./dist/index.mjs",
10
11
  "require": "./dist/index.js",
@@ -15,9 +16,8 @@
15
16
  "@types/react": "^19.2.7",
16
17
  "dexie": "^4.0.7",
17
18
  "lit-html": "^3.3.1",
18
- "react": "^18.3.1",
19
19
  "socket.io-client": "^4.8.1",
20
- "@decido/kernel-bridge": "4.0.2"
20
+ "@decido/kernel-bridge": "4.0.4"
21
21
  },
22
22
  "devDependencies": {
23
23
  "typescript": "^5.5.2"
@@ -30,8 +30,11 @@
30
30
  "dist"
31
31
  ],
32
32
  "module": "./dist/index.mjs",
33
+ "peerDependencies": {
34
+ "react": "^18.3.1"
35
+ },
33
36
  "scripts": {
34
- "build": "tsup src/index.ts --format esm,cjs",
37
+ "build": "tsup src/index.ts --format esm,cjs --minify --clean",
35
38
  "dev": "tsc -w",
36
39
  "clean": "rimraf node_modules"
37
40
  }