mulmoclaude 0.3.0 → 0.4.0

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.
Files changed (185) hide show
  1. package/bin/mulmoclaude.js +7 -24
  2. package/client/assets/html2canvas-Cx501zZr-Cv5snK9D.js +5 -0
  3. package/client/assets/index-CubzmCVK.css +2 -0
  4. package/client/assets/{index-eHWB79u5.js → index-DtcyExH9.js} +80 -61
  5. package/client/assets/{index.es-D4YyL_Dg-BfRHLTZV.js → index.es-D4YyL_Dg-DnizuhIY.js} +5 -5
  6. package/client/index.html +2 -4
  7. package/package.json +13 -13
  8. package/server/agent/attachmentConverter.ts +2 -2
  9. package/server/agent/index.ts +9 -3
  10. package/server/agent/mcp-tools/index.ts +6 -6
  11. package/server/agent/mcp-tools/x.ts +2 -1
  12. package/server/agent/prompt.ts +187 -26
  13. package/server/agent/resumeFailover.ts +5 -5
  14. package/server/agent/sandboxMounts.ts +3 -3
  15. package/server/api/auth/bearerAuth.ts +3 -3
  16. package/server/api/auth/token.ts +2 -2
  17. package/server/api/routes/agent.ts +21 -3
  18. package/server/api/routes/config.ts +1 -1
  19. package/server/api/routes/files.ts +13 -12
  20. package/server/api/routes/html.ts +2 -2
  21. package/server/api/routes/image.ts +7 -7
  22. package/server/api/routes/mulmo-script.ts +33 -31
  23. package/server/api/routes/pdf.ts +2 -2
  24. package/server/api/routes/plugins.ts +16 -6
  25. package/server/api/routes/roles.ts +2 -2
  26. package/server/api/routes/scheduler.ts +8 -6
  27. package/server/api/routes/schedulerTasks.ts +5 -3
  28. package/server/api/routes/sessions.ts +2 -2
  29. package/server/api/routes/sessionsCursor.ts +4 -4
  30. package/server/api/routes/skills.ts +5 -5
  31. package/server/api/routes/sources.ts +3 -3
  32. package/server/api/routes/todosHandlers.ts +1 -1
  33. package/server/api/routes/todosItemsHandlers.ts +14 -14
  34. package/server/api/routes/wiki.ts +22 -8
  35. package/server/api/sandboxStatus.ts +1 -1
  36. package/server/events/notifications.ts +6 -6
  37. package/server/events/pub-sub/index.ts +3 -3
  38. package/server/events/relay-client.ts +17 -16
  39. package/server/index.ts +40 -46
  40. package/server/system/config.ts +5 -5
  41. package/server/system/credentials.ts +7 -5
  42. package/server/system/env.ts +5 -5
  43. package/server/utils/files/atomic.ts +11 -11
  44. package/server/utils/files/image-store.ts +17 -6
  45. package/server/utils/files/journal-io.ts +2 -2
  46. package/server/utils/files/json.ts +5 -5
  47. package/server/utils/files/markdown-store.ts +4 -4
  48. package/server/utils/files/reference-dirs-io.ts +3 -3
  49. package/server/utils/files/roles-io.ts +4 -4
  50. package/server/utils/files/safe.ts +14 -14
  51. package/server/utils/files/scheduler-overrides-io.ts +2 -2
  52. package/server/utils/files/spreadsheet-store.ts +5 -5
  53. package/server/utils/files/workspace-io.ts +12 -12
  54. package/server/utils/gemini.ts +2 -2
  55. package/server/utils/gitignore.ts +9 -9
  56. package/server/utils/json.ts +5 -5
  57. package/server/utils/logBackgroundError.ts +12 -3
  58. package/server/utils/markdown.ts +5 -5
  59. package/server/utils/port.d.mts +6 -0
  60. package/server/utils/port.mjs +48 -0
  61. package/server/utils/request.ts +12 -6
  62. package/server/utils/spawn.ts +1 -1
  63. package/server/utils/types.ts +2 -2
  64. package/server/workspace/chat-index/summarizer.ts +4 -4
  65. package/server/workspace/custom-dirs.ts +5 -5
  66. package/server/workspace/journal/diff.ts +2 -2
  67. package/server/workspace/journal/index.ts +4 -4
  68. package/server/workspace/journal/optimizationPass.ts +2 -2
  69. package/server/workspace/journal/state.ts +6 -6
  70. package/server/workspace/paths.ts +3 -3
  71. package/server/workspace/reference-dirs.ts +3 -3
  72. package/server/workspace/skills/parser.ts +6 -6
  73. package/server/workspace/skills/scheduler.ts +3 -3
  74. package/server/workspace/skills/writer.ts +3 -3
  75. package/server/workspace/sources/arxivDiscovery.ts +2 -2
  76. package/server/workspace/sources/fetchers/rss.ts +5 -5
  77. package/server/workspace/sources/fetchers/rssParser.ts +4 -4
  78. package/server/workspace/sources/interests.ts +3 -3
  79. package/server/workspace/sources/paths.ts +6 -6
  80. package/server/workspace/sources/pipeline/fetch.ts +36 -13
  81. package/server/workspace/sources/pipeline/index.ts +2 -7
  82. package/server/workspace/sources/pipeline/notify.ts +3 -3
  83. package/server/workspace/sources/pipeline/plan.ts +11 -9
  84. package/server/workspace/sources/pipeline/write.ts +5 -5
  85. package/server/workspace/sources/rateLimiter.ts +1 -1
  86. package/server/workspace/sources/sourceState.ts +9 -4
  87. package/server/workspace/sources/types.ts +9 -0
  88. package/server/workspace/sources/urls.ts +1 -1
  89. package/server/workspace/tool-trace/classify.ts +4 -4
  90. package/server/workspace/workspace.ts +7 -7
  91. package/src/App.vue +286 -112
  92. package/src/components/CanvasViewToggle.vue +10 -7
  93. package/src/components/ChatInput.vue +60 -26
  94. package/src/components/FileContentHeader.vue +7 -4
  95. package/src/components/FileContentRenderer.vue +20 -6
  96. package/src/components/FileTree.vue +6 -3
  97. package/src/components/FileTreePane.vue +11 -8
  98. package/src/components/FilesView.vue +5 -3
  99. package/src/components/LockStatusPopup.vue +15 -12
  100. package/src/components/NotificationBell.vue +14 -5
  101. package/src/components/NotificationToast.vue +4 -1
  102. package/src/components/PluginLauncher.vue +19 -56
  103. package/src/components/RightSidebar.vue +13 -10
  104. package/src/components/SessionHistoryPanel.vue +33 -29
  105. package/src/components/SessionTabBar.vue +8 -10
  106. package/src/components/SettingsMcpTab.vue +43 -30
  107. package/src/components/SettingsModal.vue +21 -19
  108. package/src/components/SettingsReferenceDirsTab.vue +29 -24
  109. package/src/components/SettingsWorkspaceDirsTab.vue +32 -22
  110. package/src/components/SidebarHeader.vue +25 -4
  111. package/src/components/StackView.vue +4 -1
  112. package/src/components/SuggestionsPanel.vue +5 -2
  113. package/src/components/TodoExplorer.vue +26 -15
  114. package/src/components/ToolResultsPanel.vue +27 -13
  115. package/src/components/todo/TodoAddDialog.vue +17 -12
  116. package/src/components/todo/TodoEditDialog.vue +7 -2
  117. package/src/components/todo/TodoEditPanel.vue +15 -10
  118. package/src/components/todo/TodoKanbanView.vue +10 -5
  119. package/src/components/todo/TodoListView.vue +5 -2
  120. package/src/components/todo/TodoTableView.vue +5 -2
  121. package/src/composables/useAppApi.ts +9 -0
  122. package/src/composables/useDynamicFavicon.ts +172 -37
  123. package/src/composables/useEventListeners.ts +7 -8
  124. package/src/composables/useFaviconState.ts +13 -2
  125. package/src/composables/useFileSelection.ts +24 -6
  126. package/src/composables/useLayoutMode.ts +32 -0
  127. package/src/composables/useSessionHistory.ts +7 -17
  128. package/src/composables/useViewLayout.ts +20 -34
  129. package/src/lang/de.ts +536 -0
  130. package/src/lang/en.ts +558 -0
  131. package/src/lang/es.ts +543 -0
  132. package/src/lang/fr.ts +536 -0
  133. package/src/lang/ja.ts +536 -0
  134. package/src/lang/ko.ts +540 -0
  135. package/src/lang/pt-BR.ts +534 -0
  136. package/src/lang/zh.ts +537 -0
  137. package/src/lib/vue-i18n.ts +97 -0
  138. package/src/main.ts +2 -0
  139. package/src/plugins/canvas/View.vue +102 -186
  140. package/src/plugins/canvas/definition.ts +0 -8
  141. package/src/plugins/chart/Preview.vue +1 -1
  142. package/src/plugins/chart/View.vue +9 -4
  143. package/src/plugins/manageRoles/Preview.vue +4 -1
  144. package/src/plugins/manageRoles/View.vue +59 -43
  145. package/src/plugins/manageSkills/Preview.vue +8 -3
  146. package/src/plugins/manageSkills/View.vue +26 -22
  147. package/src/plugins/manageSource/Preview.vue +1 -1
  148. package/src/plugins/manageSource/View.vue +73 -52
  149. package/src/plugins/markdown/Preview.vue +1 -1
  150. package/src/plugins/markdown/View.vue +24 -34
  151. package/src/plugins/presentHtml/Preview.vue +1 -1
  152. package/src/plugins/presentHtml/View.vue +7 -4
  153. package/src/plugins/presentMulmoScript/Preview.vue +1 -1
  154. package/src/plugins/presentMulmoScript/View.vue +36 -26
  155. package/src/plugins/scheduler/Preview.vue +7 -4
  156. package/src/plugins/scheduler/TasksTab.vue +53 -24
  157. package/src/plugins/scheduler/View.vue +28 -19
  158. package/src/plugins/scheduler/formatSchedule.ts +93 -0
  159. package/src/plugins/spreadsheet/Preview.vue +8 -3
  160. package/src/plugins/spreadsheet/View.vue +21 -12
  161. package/src/plugins/textResponse/Preview.vue +15 -58
  162. package/src/plugins/textResponse/View.vue +27 -7
  163. package/src/plugins/todo/Preview.vue +11 -6
  164. package/src/plugins/todo/View.vue +27 -13
  165. package/src/plugins/ui-image/ImagePreview.vue +6 -3
  166. package/src/plugins/ui-image/ImageView.vue +7 -4
  167. package/src/plugins/wiki/Preview.vue +5 -2
  168. package/src/plugins/wiki/View.vue +202 -81
  169. package/src/plugins/wiki/route.ts +112 -0
  170. package/src/router/guards.ts +42 -24
  171. package/src/router/index.ts +41 -26
  172. package/src/types/vue-i18n.d.ts +20 -0
  173. package/src/utils/agent/request.ts +19 -0
  174. package/src/utils/canvas/layoutMode.ts +26 -0
  175. package/src/utils/image/cacheBust.ts +16 -0
  176. package/src/utils/image/resolve.ts +16 -0
  177. package/src/utils/path/workspaceLinkRouter.ts +81 -0
  178. package/src/vite-env.d.ts +9 -0
  179. package/client/assets/chunk-vKJrgz-R-C_I3GbVV.js +0 -1
  180. package/client/assets/html2canvas-Cx501zZr-BF5dYYkY.js +0 -5
  181. package/client/assets/index-Bm70FDU2.css +0 -1
  182. package/client/assets/typeof-DBp4T-Ny-BC0P-2DM.js +0 -1
  183. package/src/composables/useCanvasViewMode.ts +0 -121
  184. package/src/utils/canvas/viewMode.ts +0 -46
  185. /package/client/assets/{purify.es-Fx1Nqyry-PeS5RUhs.js → purify.es-Fx1Nqyry-BwJECkqS.js} +0 -0
package/src/lang/es.ts ADDED
@@ -0,0 +1,543 @@
1
+ // Spanish dictionary. Mirror the shape of src/lang/en.ts —
2
+ // missing keys fall back to English per createI18n's fallbackLocale.
3
+ //
4
+ // ⚠️ Las cadenas que contienen ángulos (p.ej. `<name>`) activan la
5
+ // heurística XSS de vue-i18n y generan el aviso
6
+ // "Detected HTML in '…' message". Usa siempre la **forma función**
7
+ // en esos casos. Ver la cabecera de en.ts para más detalle.
8
+
9
+ const esMessages = {
10
+ common: {
11
+ save: "Guardar",
12
+ cancel: "Cancelar",
13
+ loading: "Cargando...",
14
+ close: "Cerrar",
15
+ dismiss: "Descartar",
16
+ add: "Añadir",
17
+ remove: "Quitar",
18
+ saving: "Guardando...",
19
+ saved: "Guardado",
20
+ noResultsYet: "Aún no hay resultados",
21
+ noImageYet: "Aún no hay imagen",
22
+ },
23
+ sessionTabBar: {
24
+ newSession: "Nueva sesión",
25
+ sessionHistory: "Historial de sesiones",
26
+ activeSessions: "{count} sesión activa (agente en ejecución) | {count} sesiones activas (agente en ejecución)",
27
+ unreadReplies: "{count} respuesta sin leer | {count} respuestas sin leer",
28
+ },
29
+ chatInput: {
30
+ placeholder: "Escribe una tarea, o arrastra / pega / adjunta un archivo…",
31
+ expandEditor: "Ampliar el editor",
32
+ composeMessage: "Redactar mensaje",
33
+ sendHint: "Cmd+Enter para enviar",
34
+ send: "Enviar",
35
+ attachFile: "Adjuntar archivo",
36
+ fileTooLarge: "El archivo es demasiado grande ({sizeMB} MB). El máximo es 30 MB.",
37
+ unsupportedFileType: "Tipo de archivo no admitido. Se aceptan: imágenes, PDF, DOCX, XLSX, PPTX y archivos de texto.",
38
+ },
39
+ sessionHistoryPanel: {
40
+ filters: {
41
+ all: "Todas",
42
+ unread: "No leídas",
43
+ human: "Persona",
44
+ scheduler: "Programador",
45
+ skill: "Skill",
46
+ bridge: "Bridge",
47
+ },
48
+ failedToRefresh: "⚠ Error al actualizar: {error}",
49
+ showingLastKnown: " — mostrando la última lista conocida.",
50
+ noSessions: "Aún no hay sesiones.",
51
+ noMatching: "No hay sesiones coincidentes.",
52
+ running: "En ejecución",
53
+ unread: "Sin leer",
54
+ noMessages: "(sin mensajes)",
55
+ },
56
+ notificationBell: {
57
+ notifications: "Notificaciones",
58
+ markAllRead: "Marcar todo como leído",
59
+ noNotifications: "No hay notificaciones",
60
+ dismiss: "Descartar",
61
+ },
62
+ sidebarHeader: {
63
+ home: "Ir al chat más reciente",
64
+ toolCallHistory: "Historial de llamadas a herramientas",
65
+ settings: "Ajustes",
66
+ },
67
+ rightSidebar: {
68
+ toggleSystemPrompt: "Alternar system prompt",
69
+ systemPrompt: "System Prompt",
70
+ availableTools: "Herramientas disponibles",
71
+ toggleToolDescription: "Alternar descripción de la herramienta",
72
+ toolCallHistory: "Historial de llamadas a herramientas",
73
+ noToolCalls: "Aún no hay llamadas a herramientas",
74
+ arguments: "Argumentos",
75
+ error: "Error",
76
+ result: "Resultado",
77
+ running: "Ejecutando...",
78
+ },
79
+ fileTreePane: {
80
+ sort: "Orden:",
81
+ sortByName: "Ordenar por nombre",
82
+ name: "Nombre",
83
+ sortByRecent: "Ordenar por fecha de modificación (más recientes primero)",
84
+ recent: "Reciente",
85
+ reference: "Referencia",
86
+ // "RO" = Read-Only. Se mantiene la abreviatura en inglés para
87
+ // renderizarse como una insignia compacta junto al label Referencia.
88
+ readOnlyBadge: "RO",
89
+ },
90
+ fileTree: {
91
+ workspace: "(área de trabajo)",
92
+ recentlyChanged: "Modificados recientemente",
93
+ },
94
+ lockStatusPopup: {
95
+ sandboxEnabledTooltip: "Sandbox activado (Docker)",
96
+ noSandboxTooltip: "Sin sandbox (Docker no encontrado)",
97
+ sandboxEnabledLabel: "Sandbox activado:",
98
+ sandboxEnabledBody: "Docker está en ejecución. El acceso al sistema de archivos está aislado.",
99
+ noSandboxLabel: "Sin sandbox:",
100
+ noSandboxBodyPrefix: "Claude puede acceder a todos los archivos del equipo. Instala",
101
+ noSandboxBodySuffix: "para activar el aislamiento del sistema de archivos.",
102
+ dockerDesktop: "Docker Desktop",
103
+ hostCredentials: "Credenciales del host adjuntas:",
104
+ credsLoading: "cargando…",
105
+ sshAgent: "Agente SSH:",
106
+ forwarded: "reenviado",
107
+ notForwarded: "no reenviado",
108
+ mountedConfigs: "Configuraciones montadas:",
109
+ none: "ninguna",
110
+ testIsolation: "Probar el aislamiento del sandbox:",
111
+ },
112
+ settingsModal: {
113
+ title: "Ajustes",
114
+ tabs: {
115
+ tools: "Herramientas permitidas",
116
+ mcp: "Servidores MCP",
117
+ dirs: "Directorios",
118
+ refs: "Directorios de referencia",
119
+ },
120
+ toolNamesLabel: "Nombres de herramientas",
121
+ invalidToolNamesPrefix: "Estas parecen no estándar (prefijo esperado",
122
+ invalidToolNamesSuffix: "):",
123
+ mcpToolsError: "⚠ No se pudo obtener el estado de las herramientas MCP: {error}. Mostrando todas las herramientas sin importar si están habilitadas.",
124
+ changesHint: "Los cambios se aplican en el siguiente mensaje. No hace falta reiniciar.",
125
+ cannotSaveTooltip: "No se puede guardar hasta que los ajustes se carguen correctamente",
126
+ saving: "Guardando…",
127
+ loadingLabel: "Cargando…",
128
+ },
129
+ canvasViewToggle: {
130
+ stackViewTooltip: "Vista apilada · haz clic para cambiar a vista única (⌘1)",
131
+ singleViewTooltip: "Vista única · haz clic para cambiar a vista apilada (⌘2)",
132
+ switchToSingle: "Cambiar a vista única",
133
+ switchToStack: "Cambiar a vista apilada",
134
+ },
135
+ settingsWorkspaceDirs: {
136
+ explanation:
137
+ "Directorios personalizados para organizar archivos dentro de {dataDir} y {artifactsDir}. Claude los utiliza para decidir dónde guardar los archivos.",
138
+ noEntries: "No hay directorios personalizados configurados.",
139
+ addDirTitle: "Añadir directorio",
140
+ pathPlaceholder: "data/clientes o artifacts/informes",
141
+ descPlaceholder: "Descripción (qué va en esta carpeta)",
142
+ errPathRequired: "La ruta es obligatoria",
143
+ errMustStartWith: "Debe comenzar con data/ o artifacts/",
144
+ errAlreadyExists: "Ya existe",
145
+ },
146
+ settingsReferenceDirs: {
147
+ explanation:
148
+ "Directorios externos que Claude puede leer pero no modificar. En modo Docker se montan como solo lectura. Útiles para consultar bóvedas de Obsidian, código de proyectos o carpetas de documentos.",
149
+ noEntries: "No hay directorios de referencia configurados.",
150
+ addDirTitle: "Añadir directorio de referencia",
151
+ pathPlaceholder: "/Users/yo/ObsidianVault o ~/Documentos/notas",
152
+ labelPlaceholder: "Etiqueta (opcional — por defecto el nombre de la carpeta)",
153
+ readOnlyBadge: "solo lectura",
154
+ errPathRequired: "La ruta es obligatoria",
155
+ errMustBeAbsolute: "Debe ser una ruta absoluta o comenzar con ~/",
156
+ errAlreadyExists: "Ya existe",
157
+ errLabelConflict: 'La etiqueta "{label}" ya existe',
158
+ },
159
+ pluginLauncher: {
160
+ todos: { label: "Tareas", title: "Abrir tareas (⌘4)" },
161
+ scheduler: { label: "Agenda", title: "Abrir agenda (⌘5)" },
162
+ wiki: { label: "Wiki", title: "Abrir wiki (⌘6)" },
163
+ skills: { label: "Skills", title: "Abrir skills (⌘7)" },
164
+ roles: { label: "Roles", title: "Abrir roles (⌘8)" },
165
+ files: { label: "Archivos", title: "Abrir archivos del área de trabajo (⌘3)" },
166
+ },
167
+ fileContentHeader: {
168
+ showRendered: "Mostrar Markdown renderizado",
169
+ showRaw: "Mostrar código fuente",
170
+ rendered: "Renderizado",
171
+ raw: "Fuente",
172
+ closeFile: "Cerrar archivo",
173
+ },
174
+ fileContentRenderer: {
175
+ selectFile: "Selecciona un archivo",
176
+ htmlPreview: "Vista previa HTML",
177
+ pdfPreview: "Vista previa PDF",
178
+ parseError: "error al analizar",
179
+ },
180
+ settingsMcpTab: {
181
+ explanation:
182
+ "Añade servidores MCP externos. Los servidores HTTP funcionan en todos los modos. Los servidores Stdio usan el {npx} / {node} / {tsx} de la imagen del sandbox; cuando Docker está activo las rutas deben estar dentro del área de trabajo.",
183
+ localhostRewrite: "En modo Docker {localhost} se reescribe como {hostDockerInternal}.",
184
+ noServers: "Aún no hay servidores MCP configurados.",
185
+ enabled: "activado",
186
+ urlLabel: "URL:",
187
+ commandLabel: "Comando:",
188
+ dockerNonWorkspaceWarning: "⚠ Contiene rutas fuera del área de trabajo — no se resolverán dentro de Docker.",
189
+ addServerButton: "+ Añadir servidor MCP",
190
+ nameLabel: "Nombre",
191
+ namePlaceholder: "mi-servidor",
192
+ typeHttp: "HTTP",
193
+ typeStdio: "Stdio (comando)",
194
+ urlFieldLabel: "URL",
195
+ urlPlaceholder: "https://example.com/mcp",
196
+ commandFieldLabel: "Comando",
197
+ argsLabel: "Argumentos (uno por línea)",
198
+ // Forma de función de mensaje — evita el compilador de mensajes de
199
+ // vue-i18n para que `@` literal no se interprete como referencia a
200
+ // un mensaje enlazado.
201
+ argsPlaceholder: () => "-y\n@modelcontextprotocol/server-filesystem\n/workspace/path",
202
+ errNoName: "Indica un Nombre, o introduce una URL / argumentos de los que podamos deducirlo.",
203
+ errBadName: "El nombre debe comenzar con una letra minúscula y contener solo [a-z0-9_-].",
204
+ errIdExists: 'El id de servidor "{id}" ya existe.',
205
+ errBadHttpUrl: "La URL HTTP debe comenzar con http:// o https://",
206
+ },
207
+ pluginScheduler: {
208
+ prev: "Anterior",
209
+ today: "Hoy",
210
+ goToday: "Ir a hoy",
211
+ next: "Siguiente",
212
+ deleteItem: "Eliminar elemento",
213
+ closeEditor: "Cerrar editor",
214
+ apiError: "⚠ Error al actualizar el programador: {error}",
215
+ tabCalendar: "Calendario",
216
+ tabTasks: "Tareas",
217
+ heading: "Programador",
218
+ itemCount: "{count} elemento | {count} elementos",
219
+ noScheduled: "No hay elementos programados",
220
+ unscheduled: "Sin programar",
221
+ editItem: "Editar elemento",
222
+ update: "Actualizar",
223
+ editSource: "Editar fuente",
224
+ applyChanges: "Aplicar cambios",
225
+ propLabel: "{key}:",
226
+ moreCount: "+{count} más",
227
+ previewIcon: "📅",
228
+ previewUpcoming: "{count} próximos",
229
+ previewMore: "+ {count} más…",
230
+ },
231
+ pluginSchedulerTasks: {
232
+ recommendedFrequencies: "Frecuencias recomendadas",
233
+ tableTaskType: "Tipo de tarea",
234
+ tableSuggestedSchedule: "Programación sugerida",
235
+ noTasks: "No hay tareas programadas",
236
+ runNow: "Ejecutar ahora",
237
+ enable: "Activar",
238
+ disable: "Desactivar",
239
+ delete: "Eliminar",
240
+ nextRun: "Próxima: {time}",
241
+ originSystem: "Sistema",
242
+ originUser: "Usuario",
243
+ originSkill: "Skill",
244
+ runFailed: "Error al ejecutar: {error}",
245
+ toggleFailed: "Error al alternar: {error}",
246
+ deleteFailed: "Error al eliminar: {error}",
247
+ },
248
+ pluginCanvas: {
249
+ undo: "Deshacer",
250
+ redo: "Rehacer",
251
+ clear: "Limpiar",
252
+ styleLabel: "Estilo:",
253
+ },
254
+ pluginChart: {
255
+ untitled: "Gráfico",
256
+ chartCount: "{count} gráfico | {count} gráficos",
257
+ chartTitle: "Gráfico {num}",
258
+ png: "PNG",
259
+ },
260
+ pluginTodo: {
261
+ clearFilters: "Borrar todos los filtros",
262
+ deleteItem: "Eliminar elemento",
263
+ apiError: "⚠ Error al actualizar las tareas: {error}",
264
+ heading: "Lista de tareas",
265
+ completedRatio: "{done}/{total} completadas",
266
+ filter: "Filtro:",
267
+ noItems: "Aún no hay tareas",
268
+ noMatchingFilter: "Ningún elemento coincide con el filtro activo",
269
+ update: "Actualizar",
270
+ clearCompleted: "Borrar completadas",
271
+ clearButton: "Borrar ✕",
272
+ deleteSymbol: "✕",
273
+ },
274
+ todoExplorer: {
275
+ heading: "Tareas",
276
+ doneRatio: "{done}/{total} hechas",
277
+ addButton: "+ Añadir",
278
+ addColumnButton: "+ Columna",
279
+ labels: "Etiquetas:",
280
+ searchPlaceholder: "Buscar...",
281
+ clearButton: "Borrar ✕",
282
+ clearFiltersTitle: "Borrar filtros de etiqueta",
283
+ emptyHint: 'Aún no hay tareas. Haz clic en "+ Añadir" para crear una.',
284
+ addColumn: "Añadir columna",
285
+ newColumnLabelField: "Etiqueta",
286
+ newColumnPlaceholder: "Revisar",
287
+ noMatchingFilter: "Ningún elemento coincide con el filtro actual",
288
+ },
289
+ todoPreview: {
290
+ completedRatio: "{done}/{total} completadas",
291
+ moreItems: "+ {count} más…",
292
+ headerIcon: "☑",
293
+ doneIcon: "✓",
294
+ pendingIcon: "○",
295
+ moreLabels: "+{count}",
296
+ },
297
+ todoDialogs: {
298
+ addTitle: "Añadir tarea",
299
+ editTitle: "Editar tarea",
300
+ deleteButton: "Eliminar",
301
+ deleteTitle: "Eliminar este elemento",
302
+ noneOption: "— Ninguno —",
303
+ fieldText: "Texto",
304
+ fieldNote: "Nota",
305
+ fieldStatus: "Estado",
306
+ fieldPriority: "Prioridad",
307
+ fieldDueDate: "Fecha límite",
308
+ fieldLabels: "Etiquetas",
309
+ fieldLabelsCommaSeparated: "Etiquetas (separadas por comas)",
310
+ textPlaceholder: "¿Qué hay que hacer?",
311
+ labelsPlaceholder: "trabajo, urgente",
312
+ },
313
+ todoKanban: {
314
+ rename: "Cambiar nombre",
315
+ alreadyDoneColumn: "Columna ya marcada como hecha",
316
+ markAsDoneColumn: "Marcar como columna de hechas",
317
+ deleteColumn: "Eliminar columna",
318
+ columnActions: "Acciones de columna",
319
+ addCard: "+ Añadir tarjeta",
320
+ },
321
+ todoTableList: {
322
+ noMatchingFilter: "Ningún elemento coincide con el filtro actual",
323
+ },
324
+ pluginWiki: {
325
+ backToIndex: "Volver al índice",
326
+ pdf: "PDF",
327
+ pdfFailed: "⚠ Error de PDF",
328
+ tabIndex: "Índice",
329
+ tabLog: "Registro",
330
+ tabLint: "Lint",
331
+ empty: "El wiki está vacío. Pide al Wiki Manager que ingiera una fuente.",
332
+ previewMore: "+ {count} más…",
333
+ chatPlaceholder: "Pregunta sobre esta página…",
334
+ chatSend: "Iniciar un chat nuevo sobre esta página",
335
+ },
336
+ pluginPresentHtml: {
337
+ saveAsPdf: "Guardar como PDF (abre el diálogo de impresión)",
338
+ pdf: "PDF",
339
+ untitled: "Página HTML",
340
+ hideSource: "Ocultar código <>",
341
+ showSource: "Mostrar código <>",
342
+ },
343
+ pluginManageSource: {
344
+ titlePlaceholder: "Título (opcional)",
345
+ heading: "Fuentes de información",
346
+ sourceCount: "{count} fuente | {count} fuentes",
347
+ addButton: "Añadir",
348
+ rebuildNow: "Reconstruir ahora",
349
+ rebuilding: "Reconstruyendo…",
350
+ typeField: "Tipo",
351
+ addingLabel: "Añadiendo…",
352
+ addAndRebuild: "Añadir + Reconstruir",
353
+ emptyPickPack: "Aún no hay fuentes registradas. Elige un paquete de inicio abajo, pulsa {addBold} arriba, o pide a Claude que registre una.",
354
+ emptyAddStrong: "+ Añadir",
355
+ registering: "Registrando + obteniendo…",
356
+ removeLabel: "Quitar",
357
+ removingLabel: "Quitando…",
358
+ todaysBrief: "Resumen de hoy",
359
+ todaysBriefLoading: "Cargando el resumen de hoy…",
360
+ briefNone: "Aún no se ha escrito un resumen para esta fecha. Pulsa Reconstruir ahora.",
361
+ briefEmpty: "El resumen de hoy está vacío.",
362
+ briefLoadFailed: "Error al cargar el resumen",
363
+ lastRebuildSummary: "Última reconstrucción ({date}): {itemCount} elementos de {planned} fuentes, {duplicates} duplicados descartados.",
364
+ archiveErrorsSuffix: "({count} errores de archivado)",
365
+ kindRss: "RSS",
366
+ kindGithubRel: "Releases de GitHub",
367
+ kindGithubIss: "Issues de GitHub",
368
+ kindArxiv: "arXiv",
369
+ kindGithubReleases: "Releases de GitHub",
370
+ kindGithubIssues: "Issues de GitHub",
371
+ briefDateLabel: "({date})",
372
+ primaryRssPlaceholder: "https://news.ycombinator.com/rss",
373
+ primaryGithubPlaceholder: "https://github.com/owner/repo (u owner/repo)",
374
+ primaryArxivPlaceholder: "cat:cs.CL",
375
+ primaryRssHint: "URL del feed (RSS 2.0 / Atom / RDF)",
376
+ primaryGithubRelHint: "URL del repo de GitHub u owner/repo — obtiene releases",
377
+ primaryGithubIssHint: "URL del repo de GitHub u owner/repo — obtiene issues",
378
+ primaryArxivHint: "Consulta de búsqueda de arXiv (ej. cat:cs.CL o au:hinton)",
379
+ confirmRemove: '¿Quitar la fuente "{slug}"?',
380
+ flashRegistered: "Registrada. Obteniendo elementos nuevos…",
381
+ flashRebuildReady: "Listo: {itemCount} elementos de {planned} fuente.|Listo: {itemCount} elementos de {planned} fuentes.",
382
+ flashRebuildComplete: "Reconstrucción completa: {itemCount} elementos de {planned} fuentes.",
383
+ flashRebuildFailed: "Error en la reconstrucción: {error}",
384
+ flashRegisterFailed: "Error al registrar la fuente",
385
+ flashRegisterSucceededRebuildFailed: "Registro correcto pero fallo al reconstruir: {error}",
386
+ flashRemoved: 'Quitada "{slug}".',
387
+ flashRemoveFailed: "Error al quitar: {error}",
388
+ flashRefreshListFailed: "Error al actualizar las fuentes: {error}",
389
+ flashPresetAlreadyRegistered: 'Todas las fuentes de "{label}" ya están registradas.',
390
+ flashPresetRegistered: 'Registrada {count} fuente de "{label}". Obteniendo…|Registradas {count} fuentes de "{label}". Obteniendo…',
391
+ flashPresetPartial: "Registradas {ok}/{total}. Errores: {errors}",
392
+ },
393
+ pluginManageSkills: {
394
+ deleteProjectSkill: "Eliminar esta skill de proyecto",
395
+ heading: "Skills",
396
+ previewCount: "{count} skill | {count} skills",
397
+ previewMore: "+{count} más",
398
+ // La forma función evita el compilador de mensajes de vue-i18n,
399
+ // que de lo contrario marca el literal `<name>` como fragmento
400
+ // HTML y avisa "Detected HTML in '…' message" en cada montaje.
401
+ subheading: ({ named }: { named: (key: string) => unknown }) => `${named("count")} disponibles · haz clic para ver · "Run" la invoca como /<name>`,
402
+ emptyWithPath: "No se encontraron skills. Añade carpetas de skills en {path}.",
403
+ emptySkillPath: "~/.claude/skills/",
404
+ selectHint: "Selecciona una skill a la izquierda para ver su SKILL.md.",
405
+ loading: "Cargando…",
406
+ fieldDescription: "Descripción",
407
+ fieldBody: "Cuerpo (Markdown)",
408
+ emptyBody: "(cuerpo vacío)",
409
+ btnEdit: "Editar",
410
+ btnDelete: "Eliminar",
411
+ btnRun: "Ejecutar",
412
+ errListFailed: "Error al cargar las skills: {error}",
413
+ errDetailFailed: "Error al cargar la skill: {error}",
414
+ errSaveFailed: "Error al guardar: {error}",
415
+ errDeleteFailed: "Error al eliminar",
416
+ confirmDelete: '¿Eliminar la skill "{name}"? Esto borrará ~/mulmoclaude/.claude/skills/{name}/SKILL.md.',
417
+ },
418
+ pluginManageRoles: {
419
+ heading: "Roles personalizados",
420
+ roleCount: "{count} rol | {count} roles",
421
+ previewCount: "{count} rol personalizado | {count} roles personalizados",
422
+ addButton: "+ Añadir",
423
+ createPanel: "Crear nuevo rol",
424
+ fieldId: "ID",
425
+ fieldName: "Nombre",
426
+ fieldIcon: "Icono",
427
+ fieldPrompt: "Prompt",
428
+ fieldPlugins: "Plugins",
429
+ fieldStarterQueries: "Preguntas iniciales",
430
+ onePerLine: "(una por línea)",
431
+ helpLink: "?",
432
+ idFormatted: "({id})",
433
+ missingEnv: "(falta {env})",
434
+ requiresEnv: "Requiere {env} en .env",
435
+ collapse: "Contraer",
436
+ expand: "Expandir",
437
+ idPlaceholder: "id-unico",
438
+ creating: "Creando…",
439
+ create: "Crear",
440
+ updating: "Actualizando…",
441
+ update: "Actualizar",
442
+ cancel: "Cancelar",
443
+ delete: "Eliminar",
444
+ emptyHint: 'Aún no hay roles personalizados. Haz clic en "+ Añadir" o pide a Claude que cree uno.',
445
+ errIdRequired: "El ID es obligatorio.",
446
+ errIdInvalid: "El ID solo puede contener letras, números, '-' y '_'.",
447
+ errNameRequired: "El nombre es obligatorio.",
448
+ errIdDuplicate: "Ya existe un rol con el ID '{id}'.",
449
+ errCreateFailed: "Error al crear",
450
+ errSaveFailed: "Error al guardar",
451
+ errDeleteFailed: "Error al eliminar",
452
+ errNetworkError: "Error de red",
453
+ errServerError: "Error del servidor: {status}",
454
+ },
455
+ pluginUiImage: {
456
+ promptLabel: "{label}:",
457
+ },
458
+ pluginMulmoScript: {
459
+ beatCount: "{count} beat | {count} beats",
460
+ movie: "Vídeo",
461
+ generating: "Generando…",
462
+ rendering: "Renderizando…",
463
+ saving: "Guardando…",
464
+ update: "Actualizar",
465
+ characters: "Personajes",
466
+ drop: "Soltar",
467
+ gen: "Generar",
468
+ play: "▶ Reproducir",
469
+ stop: "■ Detener",
470
+ errPrefix: "⚠ Error",
471
+ noBeats: "No se encontraron beats en el script",
472
+ editSource: "Editar fuente del script",
473
+ applyChanges: "Aplicar cambios",
474
+ generateAll: "Generar todo",
475
+ orDropImage: "o arrastra una imagen",
476
+ generate: "Generar",
477
+ generateAudio: "♪ Generar",
478
+ saveErrorInvalidJson: "⚠ JSON no válido: {error}",
479
+ saveErrorSaveFailed: "⚠ Error al guardar: {error}",
480
+ },
481
+ pluginMarkdown: {
482
+ loading: "Cargando documento...",
483
+ loadFailed: "⚠ Error al cargar el documento: {error}",
484
+ refreshFailed: "⚠ Error al actualizar el documento: {error} — mostrando el último contenido cargado con éxito.",
485
+ noContent: "No hay contenido Markdown disponible",
486
+ pdf: "PDF",
487
+ pdfFailedShort: "⚠ Error de PDF",
488
+ editSource: "Editar fuente Markdown",
489
+ saving: "Guardando...",
490
+ applyChanges: "Aplicar cambios",
491
+ cancel: "Cancelar",
492
+ saveFailed: "Error al guardar: {error}",
493
+ saveError: "⚠ Error al guardar: {error}",
494
+ copyLabel: "Copiar",
495
+ copiedLabel: "¡Copiado!",
496
+ },
497
+ pluginTextResponse: {
498
+ pdf: "PDF",
499
+ pdfFailed: "⚠ Error de PDF",
500
+ editContent: "Editar contenido de texto",
501
+ applyChanges: "Aplicar cambios",
502
+ copyLabel: "Copiar",
503
+ copiedLabel: "¡Copiado!",
504
+ cancel: "Cancelar",
505
+ },
506
+ pluginSpreadsheet: {
507
+ previewLabel: "📊 Hoja de cálculo",
508
+ previewUntitled: "Hoja de cálculo",
509
+ previewSheets: "{count} hoja | {count} hojas",
510
+ untitled: "Hoja de cálculo",
511
+ excel: "Excel",
512
+ valuePlaceholder: "Valor",
513
+ valueOrFormulaPlaceholder: "Valor o Fórmula (ej. 100 o SUM(B2:B11))",
514
+ formatPlaceholder: "Formato (ej. $#,##0.00)",
515
+ loading: "Cargando la hoja de cálculo...",
516
+ noData: "No hay datos de hoja de cálculo disponibles",
517
+ editData: "Editar datos de la hoja de cálculo",
518
+ applyChanges: "Aplicar cambios",
519
+ update: "Actualizar",
520
+ stringType: "Texto",
521
+ formulaType: "Fórmula",
522
+ },
523
+ app: {
524
+ // Slots `<i18n-t>` — los nombres `envKey` / `envFile` se renderizan
525
+ // como `<code>` en línea en App.vue, por lo que los literales de
526
+ // variable y nombre de archivo se mantienen sin traducir.
527
+ geminiRequired: "La generación de imágenes requiere {envKey}. Añádelo a {envFile} y reinicia la app.",
528
+ startConversation: "Inicia una conversación",
529
+ },
530
+ suggestionsPanel: {
531
+ suggestions: "Sugerencias",
532
+ sendEditHint: "clic para enviar · shift+clic para editar",
533
+ },
534
+ settingsToolsTab: {
535
+ // Renderizado vía <i18n-t> con slots nombrados `allowedTools` y
536
+ // `claudeMcp` para que las etiquetas `<code>` en línea conserven
537
+ // su estilo mientras el texto se traduce.
538
+ explanation:
539
+ "Nombres adicionales de herramientas que pasar a Claude mediante {allowedTools}. Uno por línea. Útil para servidores MCP integrados en Claude Code como Gmail / Google Calendar tras autenticarte mediante {claudeMcp}.",
540
+ },
541
+ };
542
+
543
+ export default esMessages;