mulmoclaude 0.5.2 → 0.6.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 (486) hide show
  1. package/Dockerfile.sandbox +100 -0
  2. package/README.md +17 -4
  3. package/bin/mulmoclaude.js +46 -15
  4. package/bin/prepare-dist.js +18 -2
  5. package/client/assets/chunk-CernVdwh.js +1 -0
  6. package/client/assets/chunk-D8eiyYIV-C1eAZMzz.js +1 -0
  7. package/client/assets/html2canvas-CDGcmOD3-BbPeutDg.js +5 -0
  8. package/client/assets/index-BbgSjFQ8.js +4968 -0
  9. package/client/assets/index-ECD0lgIv.css +2 -0
  10. package/client/assets/{index.es-D4YyL_Dg-BgT6a3Nd.js → index.es-DqtpmBm8-DJdTPdnc.js} +5 -5
  11. package/client/assets/material-symbols-outlined-BLDfUw-_.woff2 +0 -0
  12. package/client/assets/runtime-protocol-vue-6WYa8hAs.js +1 -0
  13. package/client/assets/runtime-vue-BVUzgYGA.js +1 -0
  14. package/client/assets/typeof-DBp4T-Ny-C2xoZtcz.js +1 -0
  15. package/client/assets/vue-1e_vz2LW.js +1 -0
  16. package/client/assets/vue.runtime.esm-bundler-DQ8Kjjui.js +4 -0
  17. package/client/index.html +33 -2
  18. package/package.json +20 -18
  19. package/sandbox-entrypoint.sh +106 -0
  20. package/server/accounting/accountNormalize.ts +32 -0
  21. package/server/accounting/defaultAccounts.ts +87 -0
  22. package/server/accounting/eventPublisher.ts +51 -0
  23. package/server/accounting/journal.ts +252 -0
  24. package/server/accounting/openingBalances.ts +114 -0
  25. package/server/accounting/report.ts +237 -0
  26. package/server/accounting/service.ts +718 -0
  27. package/server/accounting/snapshotCache.ts +333 -0
  28. package/server/accounting/timeSeries.ts +265 -0
  29. package/server/accounting/types.ts +148 -0
  30. package/server/agent/activeTools.ts +128 -0
  31. package/server/agent/attachmentConverter.ts +10 -5
  32. package/server/agent/backend/claude-code.ts +8 -2
  33. package/server/agent/backend/types.ts +1 -1
  34. package/server/agent/config.ts +101 -31
  35. package/server/agent/index.ts +45 -33
  36. package/server/agent/mcp-server.ts +146 -69
  37. package/server/agent/mcp-tools/index.ts +1 -5
  38. package/server/agent/mcp-tools/notify.ts +2 -22
  39. package/server/agent/mcp-tools/x.ts +0 -4
  40. package/server/agent/mcpHealth.ts +168 -0
  41. package/server/agent/plugin-names.ts +20 -77
  42. package/server/agent/prompt.ts +259 -51
  43. package/server/agent/resumeFailover.ts +1 -1
  44. package/server/agent/stream.ts +0 -1
  45. package/server/api/auth/bearerAuth.ts +5 -5
  46. package/server/api/csrfGuard.ts +1 -1
  47. package/server/api/routes/accounting.ts +366 -0
  48. package/server/api/routes/agent.ts +509 -46
  49. package/server/api/routes/attachment.ts +104 -0
  50. package/server/api/routes/chart.ts +2 -1
  51. package/server/api/routes/config.ts +12 -12
  52. package/server/api/routes/files.ts +105 -48
  53. package/server/api/routes/image.ts +70 -25
  54. package/server/api/routes/journal.ts +35 -0
  55. package/server/api/routes/mulmo-script.ts +358 -118
  56. package/server/api/routes/mulmoScriptValidate.ts +1 -1
  57. package/server/api/routes/news.ts +1 -1
  58. package/server/api/routes/notifications.ts +92 -22
  59. package/server/api/routes/notifier.ts +98 -0
  60. package/server/api/routes/pdf.ts +188 -48
  61. package/server/api/routes/plugins.ts +34 -14
  62. package/server/api/routes/presentHtml.ts +58 -3
  63. package/server/api/routes/roles.ts +1 -8
  64. package/server/api/routes/runtime-plugin.ts +224 -0
  65. package/server/api/routes/scheduler.ts +7 -5
  66. package/server/api/routes/schedulerHandlers.ts +1 -1
  67. package/server/api/routes/schedulerTasks.ts +8 -7
  68. package/server/api/routes/sessions.ts +234 -121
  69. package/server/api/routes/skills.ts +56 -51
  70. package/server/api/routes/sources.ts +52 -45
  71. package/server/api/routes/translation.ts +44 -0
  72. package/server/api/routes/wiki/frontmatter.ts +13 -65
  73. package/server/api/routes/wiki/history.ts +261 -0
  74. package/server/api/routes/wiki/pageIndex.ts +1 -1
  75. package/server/api/routes/wiki.ts +50 -26
  76. package/server/events/file-change.ts +83 -0
  77. package/server/events/notifications.ts +247 -91
  78. package/server/events/pub-sub/index.ts +1 -1
  79. package/server/events/relay-client.ts +5 -5
  80. package/server/events/scheduler-adapter.ts +2 -2
  81. package/server/events/session-store/index.ts +110 -22
  82. package/server/events/task-manager/index.ts +10 -9
  83. package/server/index.ts +509 -33
  84. package/server/notifier/engine.ts +419 -0
  85. package/server/notifier/legacy-adapters.ts +76 -0
  86. package/server/notifier/runtime-api.ts +74 -0
  87. package/server/notifier/store.ts +70 -0
  88. package/server/notifier/types.ts +121 -0
  89. package/server/plugins/dev-loader.ts +171 -0
  90. package/server/plugins/dev-watcher.ts +150 -0
  91. package/server/plugins/diagnostics.ts +188 -0
  92. package/server/plugins/preset-list.ts +52 -0
  93. package/server/plugins/preset-loader.ts +112 -0
  94. package/server/plugins/runtime-chat-api.ts +38 -0
  95. package/server/plugins/runtime-loader.ts +430 -0
  96. package/server/plugins/runtime-registry.ts +112 -0
  97. package/server/plugins/runtime-tasks-api.ts +50 -0
  98. package/server/plugins/runtime.ts +378 -0
  99. package/server/services/translation/cache.ts +72 -0
  100. package/server/services/translation/index.ts +106 -0
  101. package/server/services/translation/llm.ts +140 -0
  102. package/server/services/translation/types.ts +35 -0
  103. package/server/system/credentials.ts +13 -2
  104. package/server/system/env.ts +6 -1
  105. package/server/system/logger/formatters.ts +46 -4
  106. package/server/system/logger/index.ts +4 -4
  107. package/server/system/logger/sinks.ts +26 -5
  108. package/server/system/logger/types.ts +2 -2
  109. package/server/utils/dev-plugin-args.d.mts +11 -0
  110. package/server/utils/dev-plugin-args.mjs +43 -0
  111. package/server/utils/errors.ts +13 -4
  112. package/server/utils/files/accounting-io.ts +295 -0
  113. package/server/utils/files/atomic.ts +17 -49
  114. package/server/utils/files/attachment-store.ts +182 -0
  115. package/server/utils/files/html-io.ts +1 -7
  116. package/server/utils/files/html-store.ts +19 -0
  117. package/server/utils/files/image-store.ts +20 -22
  118. package/server/utils/files/index.ts +5 -15
  119. package/server/utils/files/journal-io.ts +7 -35
  120. package/server/utils/files/json.ts +2 -29
  121. package/server/utils/files/markdown-image-fill.ts +6 -37
  122. package/server/utils/files/markdown-store.ts +6 -21
  123. package/server/utils/files/naming.ts +3 -39
  124. package/server/utils/files/plugins-io.ts +100 -0
  125. package/server/utils/files/reference-dirs-io.ts +1 -9
  126. package/server/utils/files/roles-io.ts +2 -10
  127. package/server/utils/files/safe.ts +17 -19
  128. package/server/utils/files/scheduler-io.ts +1 -7
  129. package/server/utils/files/scheduler-overrides-io.ts +3 -12
  130. package/server/utils/files/session-io.ts +21 -30
  131. package/server/utils/files/spreadsheet-store.ts +9 -22
  132. package/server/utils/files/translation-io.ts +46 -0
  133. package/server/utils/files/user-tasks-io.ts +1 -7
  134. package/server/utils/files/workspace-io.ts +3 -79
  135. package/server/utils/gemini.ts +33 -11
  136. package/server/utils/html/htmlArtifactSplicer.ts +41 -0
  137. package/server/utils/markdown/frontmatter.ts +112 -0
  138. package/server/utils/regex.ts +56 -0
  139. package/server/utils/router.ts +41 -0
  140. package/server/utils/slug.ts +5 -3
  141. package/server/utils/time.ts +12 -0
  142. package/server/workspace/chat-index/indexer.ts +15 -2
  143. package/server/workspace/chat-index/summarizer.ts +1 -1
  144. package/server/workspace/custom-dirs.ts +1 -1
  145. package/server/workspace/helps/gemini.md +1 -1
  146. package/server/workspace/helps/guide.md +61 -0
  147. package/server/workspace/helps/index.md +4 -0
  148. package/server/workspace/helps/presenthtml.md +80 -0
  149. package/server/workspace/helps/sandbox.md +7 -0
  150. package/server/workspace/helps/storyteller.md +101 -0
  151. package/server/workspace/helps/telegram.md +1 -0
  152. package/server/workspace/helps/wiki.md +9 -7
  153. package/server/workspace/journal/archivist-cli.ts +7 -33
  154. package/server/workspace/journal/archivist-schemas.ts +5 -43
  155. package/server/workspace/journal/dailyPass.ts +34 -187
  156. package/server/workspace/journal/diff.ts +3 -28
  157. package/server/workspace/journal/index.ts +10 -81
  158. package/server/workspace/journal/indexFile.ts +3 -24
  159. package/server/workspace/journal/latestDaily.ts +51 -0
  160. package/server/workspace/journal/memoryExtractor.ts +4 -20
  161. package/server/workspace/journal/optimizationPass.ts +4 -21
  162. package/server/workspace/journal/paths.ts +4 -23
  163. package/server/workspace/journal/state.ts +6 -29
  164. package/server/workspace/memory/io.ts +213 -0
  165. package/server/workspace/memory/llm-classifier.ts +158 -0
  166. package/server/workspace/memory/migrate.ts +263 -0
  167. package/server/workspace/memory/run.ts +84 -0
  168. package/server/workspace/memory/topic-cluster.ts +218 -0
  169. package/server/workspace/memory/topic-detect.ts +67 -0
  170. package/server/workspace/memory/topic-index-hook.ts +128 -0
  171. package/server/workspace/memory/topic-io.ts +180 -0
  172. package/server/workspace/memory/topic-migrate.ts +248 -0
  173. package/server/workspace/memory/topic-run.ts +172 -0
  174. package/server/workspace/memory/topic-swap.ts +135 -0
  175. package/server/workspace/memory/topic-types.ts +142 -0
  176. package/server/workspace/memory/types.ts +83 -0
  177. package/server/workspace/news/reader.ts +4 -5
  178. package/server/workspace/paths.ts +124 -47
  179. package/server/workspace/roles.ts +2 -11
  180. package/server/workspace/skills/parser.ts +38 -55
  181. package/server/workspace/skills/user-tasks.ts +1 -2
  182. package/server/workspace/skills-preset/mc-library/SKILL.md +188 -0
  183. package/server/workspace/skills-preset.ts +196 -0
  184. package/server/workspace/sources/fetchers/githubIssues.ts +13 -11
  185. package/server/workspace/sources/fetchers/index.ts +1 -1
  186. package/server/workspace/sources/fetchers/rssParser.ts +1 -1
  187. package/server/workspace/sources/pipeline/index.ts +2 -2
  188. package/server/workspace/sources/pipeline/notify.ts +3 -3
  189. package/server/workspace/sources/pipeline/write.ts +2 -2
  190. package/server/workspace/sources/registry.ts +39 -61
  191. package/server/workspace/sources/robots.ts +1 -1
  192. package/server/workspace/tool-trace/classify.ts +2 -1
  193. package/server/workspace/tool-trace/index.ts +1 -1
  194. package/server/workspace/tool-trace/writeSearch.ts +6 -1
  195. package/server/workspace/wiki-backlinks/index.ts +19 -7
  196. package/server/workspace/wiki-backlinks/sessionBacklinks.ts +1 -0
  197. package/server/workspace/wiki-history/hook/snapshot.mjs +98 -0
  198. package/server/workspace/wiki-history/hook/snapshot.ts +135 -0
  199. package/server/workspace/wiki-history/provision.ts +181 -0
  200. package/server/workspace/wiki-pages/io.ts +217 -0
  201. package/server/workspace/wiki-pages/snapshot.ts +380 -0
  202. package/server/workspace/workspace.ts +75 -13
  203. package/src/App.vue +115 -40
  204. package/src/_runtime/protocol-vue.ts +21 -0
  205. package/src/_runtime/vue.ts +22 -0
  206. package/src/components/ChatInput.vue +14 -10
  207. package/src/components/CopyChatButton.vue +76 -0
  208. package/src/components/FileContentRenderer.vue +67 -14
  209. package/src/components/FileTree.vue +2 -2
  210. package/src/components/FilesView.vue +17 -1
  211. package/src/components/NewsView.vue +16 -2
  212. package/src/components/NotificationBell.vue +320 -93
  213. package/src/components/PageChatComposer.vue +5 -4
  214. package/src/components/PluginLauncher.vue +42 -6
  215. package/src/components/PluginScopedRoot.vue +87 -0
  216. package/src/components/RoleSelector.vue +12 -1
  217. package/src/components/RolesView.vue +562 -0
  218. package/src/components/SentAttachmentChip.vue +102 -0
  219. package/src/components/SessionHistoryPanel.vue +109 -20
  220. package/src/components/SessionRoleIcon.vue +7 -4
  221. package/src/components/SessionSidebar.vue +20 -7
  222. package/src/components/SessionTabBar.vue +1 -1
  223. package/src/components/SettingsMcpTab.vue +4 -4
  224. package/src/components/SettingsModal.vue +2 -0
  225. package/src/components/SidebarHeader.vue +16 -5
  226. package/src/components/SourcesManager.vue +23 -9
  227. package/src/components/SourcesView.vue +1 -1
  228. package/src/components/StackView.vue +102 -6
  229. package/src/components/SuggestionsPanel.vue +105 -16
  230. package/src/components/SystemFileBanner.vue +1 -1
  231. package/src/components/TodoExplorer.vue +4 -5
  232. package/src/components/todo/TodoAddDialog.vue +2 -3
  233. package/src/components/todo/TodoEditDialog.vue +1 -2
  234. package/src/components/todo/TodoEditPanel.vue +2 -3
  235. package/src/components/todo/TodoKanbanView.vue +8 -5
  236. package/src/components/todo/TodoListView.vue +3 -5
  237. package/src/components/todo/TodoTableView.vue +7 -5
  238. package/src/composables/useAccountingChannel.ts +58 -0
  239. package/src/composables/useActiveSession.ts +4 -25
  240. package/src/composables/useAppApi.ts +6 -44
  241. package/src/composables/useClipboardCopy.ts +3 -20
  242. package/src/composables/useContentDisplay.ts +33 -2
  243. package/src/composables/useDevPluginReload.ts +23 -0
  244. package/src/composables/useDynamicFavicon.ts +5 -31
  245. package/src/composables/useEventListeners.ts +0 -20
  246. package/src/composables/useExpandedDirs.ts +4 -15
  247. package/src/composables/useFaviconState.ts +12 -46
  248. package/src/composables/useFileChange.ts +53 -0
  249. package/src/composables/useFreshPluginData.ts +6 -43
  250. package/src/composables/useHealth.ts +14 -43
  251. package/src/composables/useImageErrorRepair.ts +104 -0
  252. package/src/composables/useLatestDaily.ts +40 -0
  253. package/src/composables/useMarkdownDoc.ts +39 -0
  254. package/src/composables/useMarkdownLinkHandler.ts +1 -1
  255. package/src/composables/useMcpTools.ts +3 -16
  256. package/src/composables/useNotifications.ts +138 -112
  257. package/src/composables/usePdfDownload.ts +17 -3
  258. package/src/composables/usePendingCalls.ts +8 -26
  259. package/src/composables/usePluginErrorBoundary.ts +68 -0
  260. package/src/composables/usePubSub.ts +9 -17
  261. package/src/composables/useRunElapsed.ts +5 -22
  262. package/src/composables/useSandboxStatus.ts +4 -20
  263. package/src/composables/useSessionDerived.ts +7 -15
  264. package/src/composables/useSessionHistory.ts +70 -29
  265. package/src/composables/useSessionSync.ts +25 -3
  266. package/src/composables/useSkillsList.ts +59 -0
  267. package/src/composables/useTranslatedQueries.ts +109 -0
  268. package/src/config/apiRoutes.ts +181 -80
  269. package/src/config/historyFilters.ts +5 -3
  270. package/src/config/hostEvents.ts +17 -0
  271. package/src/config/mcpCatalog.ts +277 -5
  272. package/src/config/pubsubChannels.ts +134 -12
  273. package/src/config/roles.ts +212 -147
  274. package/src/config/systemFileDescriptors.ts +5 -5
  275. package/src/config/toolNames.ts +52 -30
  276. package/src/config/workspacePaths.ts +26 -2
  277. package/src/lang/de.ts +483 -27
  278. package/src/lang/en.ts +448 -27
  279. package/src/lang/es.ts +474 -27
  280. package/src/lang/fr.ts +476 -27
  281. package/src/lang/ja.ts +465 -27
  282. package/src/lang/ko.ts +466 -27
  283. package/src/lang/pt-BR.ts +473 -27
  284. package/src/lang/zh.ts +463 -27
  285. package/src/lib/vue-i18n.ts +1 -1
  286. package/src/lib/wiki-page/slug.ts +66 -0
  287. package/src/main.ts +85 -0
  288. package/src/plugins/_extras.ts +58 -0
  289. package/src/plugins/_generated/metas.ts +42 -0
  290. package/src/plugins/_generated/registrations.ts +44 -0
  291. package/src/plugins/_generated/server-bindings.ts +47 -0
  292. package/src/plugins/accounting/Preview.vue +106 -0
  293. package/src/plugins/accounting/View.vue +632 -0
  294. package/src/plugins/accounting/actions.ts +34 -0
  295. package/src/plugins/accounting/api.ts +301 -0
  296. package/src/plugins/accounting/components/AccountEditor.vue +250 -0
  297. package/src/plugins/accounting/components/AccountRow.vue +50 -0
  298. package/src/plugins/accounting/components/AccountsList.vue +102 -0
  299. package/src/plugins/accounting/components/AccountsModal.vue +300 -0
  300. package/src/plugins/accounting/components/BalanceSheet.vue +186 -0
  301. package/src/plugins/accounting/components/BookSettings.vue +284 -0
  302. package/src/plugins/accounting/components/BookSwitcher.vue +78 -0
  303. package/src/plugins/accounting/components/DateRangePicker.vue +140 -0
  304. package/src/plugins/accounting/components/JournalEntryForm.vue +504 -0
  305. package/src/plugins/accounting/components/JournalList.vue +553 -0
  306. package/src/plugins/accounting/components/Ledger.vue +206 -0
  307. package/src/plugins/accounting/components/NewBookForm.vue +211 -0
  308. package/src/plugins/accounting/components/OpeningBalancesForm.vue +271 -0
  309. package/src/plugins/accounting/components/ProfitLoss.vue +160 -0
  310. package/src/plugins/accounting/components/accountDraft.ts +13 -0
  311. package/src/plugins/accounting/components/accountNumbering.ts +103 -0
  312. package/src/plugins/accounting/components/accountValidation.ts +75 -0
  313. package/src/plugins/accounting/components/useLatestRequest.ts +44 -0
  314. package/src/plugins/accounting/countries.ts +158 -0
  315. package/src/plugins/accounting/currencies.ts +64 -0
  316. package/src/plugins/accounting/dates.ts +51 -0
  317. package/src/plugins/accounting/definition.ts +199 -0
  318. package/src/plugins/accounting/fiscalYear.ts +136 -0
  319. package/src/plugins/accounting/index.ts +49 -0
  320. package/src/plugins/accounting/meta.ts +91 -0
  321. package/src/plugins/accounting/timeSeriesEnums.ts +16 -0
  322. package/src/plugins/api.ts +125 -0
  323. package/src/plugins/canvas/View.vue +38 -28
  324. package/src/plugins/canvas/definition.ts +10 -8
  325. package/src/plugins/canvas/index.ts +15 -8
  326. package/src/plugins/canvas/meta.ts +12 -0
  327. package/src/plugins/chart/Preview.vue +1 -1
  328. package/src/plugins/chart/View.vue +2 -2
  329. package/src/plugins/chart/definition.ts +12 -2
  330. package/src/plugins/chart/index.ts +15 -7
  331. package/src/plugins/chart/meta.ts +18 -0
  332. package/src/plugins/editImages/definition.ts +44 -0
  333. package/src/plugins/editImages/index.ts +43 -0
  334. package/src/plugins/editImages/meta.ts +5 -0
  335. package/src/plugins/generateImage/View.vue +3 -1
  336. package/src/plugins/generateImage/definition.ts +2 -0
  337. package/src/plugins/generateImage/index.ts +13 -5
  338. package/src/plugins/generateImage/meta.ts +5 -0
  339. package/src/plugins/index.ts +35 -0
  340. package/src/plugins/manageRoles/Preview.vue +7 -4
  341. package/src/plugins/manageRoles/View.vue +12 -8
  342. package/src/plugins/manageRoles/definition.ts +6 -0
  343. package/src/plugins/manageRoles/index.ts +7 -6
  344. package/src/plugins/manageSkills/View.vue +11 -7
  345. package/src/plugins/manageSkills/definition.ts +4 -1
  346. package/src/plugins/manageSkills/index.ts +14 -7
  347. package/src/plugins/manageSkills/meta.ts +21 -0
  348. package/src/plugins/manageSource/definition.ts +4 -1
  349. package/src/plugins/manageSource/index.ts +15 -7
  350. package/src/plugins/manageSource/meta.ts +21 -0
  351. package/src/plugins/markdown/Preview.vue +10 -8
  352. package/src/plugins/markdown/View.vue +84 -17
  353. package/src/plugins/markdown/definition.ts +7 -1
  354. package/src/plugins/markdown/index.ts +15 -8
  355. package/src/plugins/markdown/meta.ts +16 -0
  356. package/src/plugins/meta-types.ts +97 -0
  357. package/src/plugins/metas.ts +224 -0
  358. package/src/plugins/presentForm/Preview.vue +4 -15
  359. package/src/plugins/presentForm/View.vue +35 -78
  360. package/src/plugins/presentForm/definition.ts +7 -6
  361. package/src/plugins/presentForm/index.ts +12 -5
  362. package/src/plugins/presentForm/meta.ts +11 -0
  363. package/src/plugins/presentForm/plugin.ts +8 -9
  364. package/src/plugins/presentForm/types.ts +0 -24
  365. package/src/plugins/presentHtml/Preview.vue +1 -8
  366. package/src/plugins/presentHtml/View.vue +401 -30
  367. package/src/plugins/presentHtml/definition.ts +8 -5
  368. package/src/plugins/presentHtml/index.ts +15 -8
  369. package/src/plugins/presentHtml/meta.ts +14 -0
  370. package/src/plugins/presentMulmoScript/View.vue +327 -107
  371. package/src/plugins/presentMulmoScript/definition.ts +34 -7
  372. package/src/plugins/presentMulmoScript/helpers.ts +4 -5
  373. package/src/plugins/presentMulmoScript/index.ts +20 -7
  374. package/src/plugins/presentMulmoScript/meta.ts +52 -0
  375. package/src/plugins/scheduler/AutomationsPreview.vue +2 -8
  376. package/src/plugins/scheduler/Preview.vue +5 -2
  377. package/src/plugins/scheduler/TasksTab.vue +16 -36
  378. package/src/plugins/scheduler/View.vue +22 -54
  379. package/src/plugins/scheduler/automationsDefinition.ts +14 -9
  380. package/src/plugins/scheduler/automationsMeta.ts +5 -0
  381. package/src/plugins/scheduler/calendarDefinition.ts +4 -7
  382. package/src/plugins/scheduler/calendarMeta.ts +28 -0
  383. package/src/plugins/scheduler/formatSchedule.ts +6 -24
  384. package/src/plugins/scheduler/index.ts +26 -52
  385. package/src/plugins/scope.ts +57 -0
  386. package/src/plugins/server-bindings-types.ts +38 -0
  387. package/src/plugins/server.ts +32 -0
  388. package/src/plugins/skill/Preview.vue +25 -0
  389. package/src/plugins/skill/View.vue +125 -0
  390. package/src/plugins/skill/definition.ts +23 -0
  391. package/src/plugins/skill/index.ts +36 -0
  392. package/src/plugins/skill/plugin.ts +31 -0
  393. package/src/plugins/skill/types.ts +21 -0
  394. package/src/plugins/spreadsheet/Preview.vue +1 -3
  395. package/src/plugins/spreadsheet/View.vue +29 -49
  396. package/src/plugins/spreadsheet/cellHighlights.ts +2 -3
  397. package/src/plugins/spreadsheet/definition.ts +5 -2
  398. package/src/plugins/spreadsheet/index.ts +15 -8
  399. package/src/plugins/spreadsheet/keyboardNav.ts +38 -0
  400. package/src/plugins/spreadsheet/meta.ts +14 -0
  401. package/src/plugins/textResponse/Preview.vue +9 -1
  402. package/src/plugins/textResponse/View.vue +59 -8
  403. package/src/plugins/textResponse/index.ts +11 -3
  404. package/src/plugins/textResponse/plugin.ts +8 -10
  405. package/src/plugins/textResponse/types.ts +28 -0
  406. package/src/plugins/wiki/Preview.vue +6 -4
  407. package/src/plugins/wiki/View.vue +463 -254
  408. package/src/plugins/wiki/components/WikiPageBody.vue +159 -0
  409. package/src/plugins/wiki/helpers.ts +17 -0
  410. package/src/plugins/wiki/history/HistoryDetail.vue +325 -0
  411. package/src/plugins/wiki/history/HistoryTab.vue +167 -0
  412. package/src/plugins/wiki/history/RestoreConfirm.vue +63 -0
  413. package/src/plugins/wiki/history/api.ts +52 -0
  414. package/src/plugins/wiki/history/diff.ts +145 -0
  415. package/src/plugins/wiki/index.ts +42 -32
  416. package/src/plugins/wiki/meta.ts +10 -0
  417. package/src/plugins/wiki/pageEditLoader.ts +53 -0
  418. package/src/plugins/wiki/route.ts +8 -0
  419. package/src/router/guards.ts +2 -1
  420. package/src/router/index.ts +19 -0
  421. package/src/router/pageRoutes.ts +1 -0
  422. package/src/tools/index.ts +50 -51
  423. package/src/tools/runtimeLoader.ts +141 -0
  424. package/src/tools/types.ts +44 -1
  425. package/src/types/notification.ts +23 -0
  426. package/src/types/pastedFile.ts +10 -0
  427. package/src/types/session.ts +61 -3
  428. package/src/types/sse.ts +21 -6
  429. package/src/utils/agent/eventDispatch.ts +12 -9
  430. package/src/utils/agent/pastedAttachment.ts +35 -0
  431. package/src/utils/agent/request.ts +32 -3
  432. package/src/utils/agent/toolCalls.ts +7 -1
  433. package/src/utils/api.ts +1 -1
  434. package/src/utils/chat/exportMarkdown.ts +243 -0
  435. package/src/utils/errors.ts +10 -2
  436. package/src/utils/files/expandedDirs.ts +1 -1
  437. package/src/utils/filesPreview/todoPreview.ts +13 -2
  438. package/src/utils/format/date.ts +1 -3
  439. package/src/utils/format/jsonSyntax.ts +5 -0
  440. package/src/utils/html/iframeHeightReporterScript.ts +62 -0
  441. package/src/utils/html/previewCsp.ts +29 -2
  442. package/src/utils/image/htmlSrcAttrs.ts +122 -0
  443. package/src/utils/image/imageRepairInlineScript.ts +115 -0
  444. package/src/utils/image/resolve.ts +17 -3
  445. package/src/utils/image/rewriteMarkdownImageRefs.ts +62 -9
  446. package/src/utils/markdown/frontmatter.ts +125 -0
  447. package/src/utils/markdown/taskList.ts +7 -2
  448. package/src/utils/plugin/runtime.ts +132 -0
  449. package/src/utils/session/mergeSessions.ts +40 -37
  450. package/src/utils/session/sessionEntries.ts +74 -18
  451. package/src/utils/session/sessionHelpers.ts +54 -10
  452. package/src/utils/tools/result.ts +76 -14
  453. package/src/vite-env.d.ts +6 -0
  454. package/client/assets/html2canvas-Cx501zZr-Bug0qRNv.js +0 -5
  455. package/client/assets/index-CY-WpQUm.css +0 -2
  456. package/client/assets/index-DbTz2Mfs.js +0 -4911
  457. package/client/assets/material-symbols-outlined-NzYEeyps.woff2 +0 -0
  458. package/server/api/routes/html.ts +0 -114
  459. package/server/api/routes/todos.ts +0 -293
  460. package/server/api/routes/todosColumnsHandlers.ts +0 -333
  461. package/server/api/routes/todosHandlers.ts +0 -274
  462. package/server/api/routes/todosItemsHandlers.ts +0 -386
  463. package/server/utils/files/todos-io.ts +0 -29
  464. package/src/components/NotificationToast.vue +0 -75
  465. package/src/plugins/editImage/definition.ts +0 -27
  466. package/src/plugins/editImage/index.ts +0 -37
  467. package/src/plugins/presentHtml/helpers.ts +0 -72
  468. package/src/plugins/scheduler/LegacySchedulerView.vue +0 -32
  469. package/src/plugins/scheduler/legacyShape.ts +0 -34
  470. package/src/plugins/todo/Preview.vue +0 -68
  471. package/src/plugins/todo/View.vue +0 -378
  472. package/src/plugins/todo/composables/useTodos.ts +0 -179
  473. package/src/plugins/todo/definition.ts +0 -45
  474. package/src/plugins/todo/index.ts +0 -62
  475. package/src/plugins/todo/labels.ts +0 -163
  476. package/src/plugins/todo/priority.ts +0 -98
  477. package/src/plugins/todo/viewModes.ts +0 -19
  478. package/src/plugins/wiki/definition.ts +0 -25
  479. package/src/tools/legacyPluginNames.ts +0 -13
  480. package/src/utils/format/frontmatter.ts +0 -80
  481. package/src/utils/image/rewriteHtmlImageRefs.ts +0 -50
  482. package/src/utils/notification/dispatch.ts +0 -58
  483. /package/client/assets/{purify.es-Fx1Nqyry-BwJECkqS.js → purify.es-Fx1Nqyry-BSVNht6S.js} +0 -0
  484. /package/src/plugins/{editImage → editImages}/Preview.vue +0 -0
  485. /package/src/plugins/{editImage → editImages}/View.vue +0 -0
  486. /package/src/{config/schedulerActions.ts → plugins/scheduler/actions.ts} +0 -0
package/src/lang/es.ts CHANGED
@@ -38,11 +38,13 @@ const esMessages = {
38
38
  attachFile: "Adjuntar archivo",
39
39
  fileTooLarge: "El archivo es demasiado grande ({sizeMB} MB). El máximo es 30 MB.",
40
40
  unsupportedFileType: "Tipo de archivo no admitido. Se aceptan: imágenes, PDF, DOCX, XLSX, PPTX y archivos de texto.",
41
+ attachImageFailed: "No se pudo adjuntar la imagen: {error}",
41
42
  },
42
43
  sessionHistoryPanel: {
43
44
  filters: {
44
45
  all: "Todas",
45
46
  unread: "No leídas",
47
+ bookmarked: "Marcadas",
46
48
  human: "Persona",
47
49
  scheduler: "Programador",
48
50
  skill: "Skill",
@@ -55,18 +57,45 @@ const esMessages = {
55
57
  running: "En ejecución",
56
58
  noMessages: "(sin mensajes)",
57
59
  openRowAria: "Abrir sesión: {preview}",
60
+ rowMenuAria: "Acciones de sesión",
61
+ bookmark: "Marcar",
62
+ unbookmark: "Quitar marcador",
63
+ delete: "Eliminar",
64
+ deleteConfirm: "¿Eliminar esta sesión?\n\n{preview}\n\nEsta acción no se puede deshacer.",
58
65
  },
59
66
  notificationBell: {
60
67
  notifications: "Notificaciones",
61
- markAllRead: "Marcar todo como leído",
62
- noNotifications: "No hay notificaciones",
68
+ activeSection: "Activas",
69
+ historySection: "Historial",
70
+ noActive: "Sin notificaciones activas",
71
+ noHistory: "Sin actividad reciente",
72
+ clearAll: "Borrar",
63
73
  dismiss: "Descartar",
74
+ cancel: "Cancelar",
75
+ },
76
+ pluginDiagnostics: {
77
+ title: "Problema de configuración del plugin",
78
+ hostBody: 'El plugin "{plugin}" intentó registrar la clave {label} "{key}", pero está reservada por el host. La entrada del plugin se ha descartado.',
79
+ intraBody:
80
+ 'Los plugins "{first}" y "{second}" registran ambos el {dimension} "{key}". "{first}" lo reclamó primero, por lo que el registro de "{second}" se ignora.',
81
+ },
82
+ pluginErrorBoundary: {
83
+ title: "El plugin {pkg} se ha bloqueado",
84
+ subtitle: "El plugin no se pudo renderizar. El error se ha registrado en la consola.",
85
+ showDetails: "Mostrar detalles",
86
+ hideDetails: "Ocultar detalles",
87
+ retry: "Reintentar",
64
88
  },
65
89
  sidebarHeader: {
66
90
  home: "Ir al chat más reciente",
67
91
  toolCallHistory: "Historial de llamadas a herramientas",
68
92
  settings: "Ajustes",
69
93
  settingsGeminiMissing: "Ajustes — Falta la clave API de Gemini",
94
+ todayJournal: "Resumen de hoy",
95
+ todayJournalNotFound: "Aún no hay resumen — chatea un rato y el journal lo generará.",
96
+ todayJournalLoadFailed: "Error al cargar el journal (status {status}): {error}",
97
+ copyMarkdown: "Copiar la conversación como Markdown",
98
+ copiedMarkdown: "¡Copiado!",
70
99
  },
71
100
  rightSidebar: {
72
101
  toggleSystemPrompt: "Alternar system prompt",
@@ -208,6 +237,110 @@ const esMessages = {
208
237
  pdfPreview: "Vista previa PDF",
209
238
  parseError: "error al analizar",
210
239
  },
240
+ filesView: {
241
+ chatPlaceholder: "Pregunta sobre este archivo…",
242
+ },
243
+ systemFiles: {
244
+ schemaLabel: "Esquema",
245
+ showDetails: "Mostrar detalles",
246
+ hideDetails: "Ocultar detalles",
247
+ editPolicy: {
248
+ "agent-managed-but-hand-editable": "Gestionado por el agente (edición manual permitida)",
249
+ "user-editable": "Editable por el usuario",
250
+ "agent-managed": "Gestionado por el agente",
251
+ "fragile-format": "Formato frágil",
252
+ ephemeral: "Efímero",
253
+ },
254
+ interests: {
255
+ title: "Configuración de intereses",
256
+ summary: "Temas que la canalización de noticias / fuentes monitoriza y puntúa. Editable a mano; el agente también lo actualiza desde el chat.",
257
+ },
258
+ mcp: {
259
+ title: "Servidores MCP",
260
+ summary: "Servidores externos del Model Context Protocol conectados al agente. Añade servidores HTTP o stdio para ampliar las herramientas disponibles.",
261
+ },
262
+ settings: {
263
+ title: "Ajustes de la app",
264
+ summary: "Preferencias de comportamiento editables — clave API de Gemini, herramientas permitidas, configuración del sandbox, etc.",
265
+ },
266
+ schedulerTasks: {
267
+ title: "Tareas del programador",
268
+ summary:
269
+ "Automatizaciones recurrentes del agente que se disparan en un horario. Se gestionan desde la UI Automations; este archivo es la fuente en disco.",
270
+ },
271
+ schedulerOverrides: {
272
+ title: "Sobrescrituras del programador",
273
+ summary:
274
+ "Sobrescrituras de hora / intervalo por tarea aplicadas sobre el horario del sistema. El agente las edita cuando pides cambiar la franja de una tarea recurrente.",
275
+ },
276
+ newsReadState: {
277
+ title: "Estado de lectura de noticias",
278
+ summary: "Seguimiento local de qué noticias has visto. Efímero — puedes eliminarlo; se regenerará a medida que leas.",
279
+ },
280
+ schedulerItems: {
281
+ title: "Cola de elementos del programador",
282
+ summary: "Invocaciones programadas listas para dispararse. Gestionado por el agente; no edites a mano salvo que entiendas cada campo.",
283
+ },
284
+ todosItems: {
285
+ title: "Tareas pendientes",
286
+ summary: "Tus tareas en todas las columnas del tablero kanban. El agente escribe aquí cuando dices «añade una tarea»; también puedes editar a mano.",
287
+ },
288
+ todosColumns: {
289
+ title: "Columnas de pendientes",
290
+ summary: "Disposición de columnas del tablero kanban (títulos, orden, ids). Editable por el usuario — renombra o reordena libremente.",
291
+ },
292
+ wikiIndex: {
293
+ title: "Índice de la wiki",
294
+ summary: "Índice autogenerado de cada página de la wiki. Se refresca con cada edición — no edites a mano (tus cambios serán sobrescritos).",
295
+ },
296
+ wikiLog: {
297
+ title: "Registro de edición de la wiki",
298
+ summary: "Registro de actividades de creación y edición de páginas. Gestionado por el agente y solo añade — útil como feed de cambios recientes.",
299
+ },
300
+ wikiSummary: {
301
+ title: "Resumen de la wiki",
302
+ summary: "Visión general autogenerada de la wiki — clústeres temáticos, recuento de páginas, actividad reciente. Refrescado por el agente.",
303
+ },
304
+ wikiSchema: {
305
+ title: "Esquema de la wiki",
306
+ summary:
307
+ "Especificación de formato que el agente lee para mantener las páginas consistentes. Frágil — espera una estructura concreta; prefiere ediciones del agente.",
308
+ },
309
+ memory: {
310
+ title: "Memoria",
311
+ summary:
312
+ "Hechos destilados sobre ti, cargados siempre como contexto en conversaciones nuevas. El extractor del journal añade automáticamente; también puedes editar a mano.",
313
+ },
314
+ summariesIndex: {
315
+ title: "Índice de resúmenes",
316
+ summary: "Índice navegable que enlaza los resúmenes diarios y por tema generados por el journal. Gestionado por el agente; refrescado en cada pasada.",
317
+ },
318
+ rolesJson: {
319
+ title: "Definición del rol (JSON)",
320
+ summary: "Configuración del rol — elección de modelo, servidores MCP, plugins permitidos, sugerencias de consulta. Editable, sin reinicio.",
321
+ },
322
+ rolesMd: {
323
+ title: "Descripción del rol (Markdown)",
324
+ summary: "Persona y system prompt del rol, cargado como contexto cuando este rol está activo. Editable; los cambios aplican en el siguiente mensaje.",
325
+ },
326
+ sourceFeed: {
327
+ title: "Fuente suscrita",
328
+ summary: "Una fuente suscrita (RSS, releases / issues de GitHub, arXiv, etc.). Editable; la canalización de fuentes la consulta según horario.",
329
+ },
330
+ sourceState: {
331
+ title: "Estado de la fuente",
332
+ summary:
333
+ "Estado efímero de la canalización para una fuente — últimos ids vistos, ETags, errores de descarga. Puedes eliminarlo; se regenerará en la siguiente ejecución.",
334
+ },
335
+ journalDaily: {
336
+ title: "Resumen diario del journal",
337
+ summary: "Recapitulación autogenerada de tu actividad para un día natural, destilada por el journal a partir de las sesiones de chat.",
338
+ },
339
+ journalTopic: {
340
+ title: "Journal por tema",
341
+ summary: "Notas a largo plazo sobre un tema concreto, acumuladas y revisadas conforme sigues hablando de él. Gestionado por el agente.",
342
+ },
343
+ },
211
344
  settingsMcpTab: {
212
345
  explanation:
213
346
  "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.",
@@ -293,10 +426,81 @@ const esMessages = {
293
426
  },
294
427
  },
295
428
  },
429
+ appleNative: {
430
+ displayName: "Apps nativas de Apple (macOS)",
431
+ description: "Lee y escribe Recordatorios, Calendario, Notas, Mail y Mapas vía AppleScript. Solo macOS — sin credenciales.",
432
+ },
433
+ gmail: {
434
+ displayName: "Gmail",
435
+ description:
436
+ "Lee, envía y etiqueta tu Gmail. Usa un cliente OAuth de Google que tú mismo creas en tu propio proyecto de Google Cloud (sin verificación de app).",
437
+ field: {
438
+ credentials: {
439
+ label: "Ruta a credentials.json",
440
+ help: "Google Cloud Console → APIs & Services → Credentials → ID de cliente OAuth (Desktop app). Descarga credentials.json y pega su ruta absoluta.",
441
+ },
442
+ },
443
+ },
444
+ googleCalendar: {
445
+ displayName: "Google Calendar",
446
+ description: "Lee y crea eventos en Google Calendar. Mismo patrón BYO credentials.json que Gmail.",
447
+ field: {
448
+ credentials: {
449
+ label: "Ruta a credentials.json",
450
+ help: "Reutiliza el mismo cliente OAuth de Google Cloud que Gmail, o crea uno separado para Calendar.",
451
+ },
452
+ },
453
+ },
454
+ googleDrive: {
455
+ displayName: "Google Drive",
456
+ description: "Busca y lee archivos de Google Drive. BYO credenciales OAuth de Google — el token se guarda localmente junto al archivo.",
457
+ field: {
458
+ credentials: {
459
+ label: "Ruta a credentials.json",
460
+ help: "Google Cloud Console → APIs & Services → Credentials → ID de cliente OAuth (Desktop app). Habilita la API de Google Drive en el mismo proyecto.",
461
+ },
462
+ },
463
+ },
464
+ github: {
465
+ displayName: "GitHub",
466
+ description:
467
+ "Lee repos, issues, PRs y ejecuta búsquedas con un Personal Access Token. Limita el alcance del token — los permisos de escritura (`repo`) dejan al agente hacer push a cualquier repo accesible.",
468
+ field: {
469
+ token: {
470
+ label: "Personal Access Token",
471
+ help: "GitHub → Settings → Developer settings → Personal access tokens. Se recomienda usar fine-grained tokens limitados a los repos donde quieras que el agente actúe.",
472
+ },
473
+ },
474
+ },
475
+ linear: {
476
+ displayName: "Linear",
477
+ description: "Lee y actualiza issues, proyectos y ciclos de Linear con una clave API personal.",
478
+ field: {
479
+ apiKey: {
480
+ label: "Clave API de Linear",
481
+ help: "Linear → Settings → API → Personal API keys. Pulsa 🔑 para abrir la página y haz clic en Create key.",
482
+ },
483
+ },
484
+ },
296
485
  weatherOpenMeteo: {
297
486
  displayName: "Clima (Open-Meteo)",
298
487
  description: "Pronósticos meteorológicos gratuitos y condiciones actuales en todo el mundo — sin clave API.",
299
488
  },
489
+ spotify: {
490
+ displayName: "Spotify",
491
+ description:
492
+ "Busca canciones, gestiona playlists y controla la reproducción. BYO app de desarrollador de Spotify — solo Client ID (flujo PKCE, sin client secret).",
493
+ field: {
494
+ clientId: {
495
+ label: "Client ID",
496
+ help: "Spotify Developer Dashboard → Create app, configura la Redirect URI como http://127.0.0.1:8888/callback, copia el Client ID. Luego ejecuta una vez en la terminal `SPOTIFY_CLIENT_ID=<id> npx spotify-mcp@latest auth` para iniciar sesión (el refresh token se guarda en ~/.spotify-mcp/tokens.json).",
497
+ },
498
+ },
499
+ },
500
+ youtubeTranscript: {
501
+ displayName: "Transcripción de YouTube",
502
+ description: "Obtén los subtítulos de cualquier vídeo público de YouTube por URL. Sin credenciales.",
503
+ },
300
504
  },
301
505
  config: {
302
506
  howToGet: "Cómo obtenerlo",
@@ -358,6 +562,8 @@ const esMessages = {
358
562
  redo: "Rehacer",
359
563
  clear: "Limpiar",
360
564
  styleLabel: "Estilo:",
565
+ stylePromptWithPath: "Convierte la imagen en `{path}` en una imagen de estilo {style}.",
566
+ stylePromptNoPath: "Convierte mi dibujo en el lienzo en una imagen de estilo {style}.",
361
567
  },
362
568
  pluginChart: {
363
569
  untitled: "Gráfico",
@@ -365,20 +571,223 @@ const esMessages = {
365
571
  chartTitle: "Gráfico {num}",
366
572
  png: "PNG",
367
573
  },
368
- pluginTodo: {
369
- clearFilters: "Borrar todos los filtros",
370
- deleteItem: "Eliminar elemento",
371
- apiError: "⚠ Error al actualizar las tareas: {error}",
372
- loadFailed: "Error al cargar los Todos",
373
- heading: "Lista de tareas",
374
- completedRatio: "{done}/{total} completadas",
375
- filter: "Filtro:",
376
- noItems: "Aún no hay tareas",
377
- noMatchingFilter: "Ningún elemento coincide con el filtro activo",
378
- update: "Actualizar",
379
- clearCompleted: "Borrar completadas",
380
- clearButton: "Borrar ✕",
381
- deleteSymbol: "",
574
+ pluginAccounting: {
575
+ title: "Contabilidad",
576
+ noBook: 'Aún no hay libros — pulsa "+ Nuevo libro" arriba para crear el primero.',
577
+ common: {
578
+ cancel: "Cancelar",
579
+ loading: "Cargando…",
580
+ error: "Error: {error}",
581
+ empty: "Aún no hay entradas.",
582
+ },
583
+ tabs: {
584
+ journal: "Diario",
585
+ newEntry: "Nueva entrada",
586
+ opening: "Apertura",
587
+ accounts: "Cuentas",
588
+ ledger: "Mayor",
589
+ balanceSheet: "Balance",
590
+ profitLoss: "P&L",
591
+ settings: "Ajustes",
592
+ },
593
+ bookSwitcher: {
594
+ label: "Libro",
595
+ newBook: "Nuevo libro…",
596
+ create: "Crear",
597
+ nameLabel: "Nombre",
598
+ currencyLabel: "Moneda",
599
+ countryLabel: "País",
600
+ countryPlaceholder: "Selecciona un país…",
601
+ countryHint: "El país define la jurisdicción fiscal para que el asistente pueda dar consejos específicos (T-number en Japón, ID de IVA en la UE, etc.).",
602
+ fiscalYearEndLabel: "Cierre del ejercicio",
603
+ fiscalYearEndQ1: "31 de marzo (Q1)",
604
+ fiscalYearEndQ2: "30 de junio (Q2)",
605
+ fiscalYearEndQ3: "30 de septiembre (Q3)",
606
+ fiscalYearEndQ4: "31 de diciembre (Q4)",
607
+ fiscalYearEndHint: "Define el límite del ejercicio para los atajos de rango de fechas de este libro. Por defecto: 31 de diciembre (Q4 — año natural).",
608
+ placeholder: "Elige un libro…",
609
+ firstRunHint:
610
+ "Elige el nombre, la moneda, el país y el cierre de ejercicio de tu primer libro. La moneda se fija por libro y es difícil cambiarla una vez que empieces a registrar asientos.",
611
+ },
612
+ deletedNotice: {
613
+ title: "“{bookName}” se ha eliminado.",
614
+ body: "Elige otro libro en el desplegable de arriba o crea uno nuevo.",
615
+ },
616
+ journalList: {
617
+ fromLabel: "Desde",
618
+ toLabel: "Hasta",
619
+ accountLabel: "Cuenta",
620
+ allAccounts: "Todas",
621
+ void: "Anular",
622
+ edit: "Editar",
623
+ voidConfirm: "¿Anular esta entrada? La original permanece en el diario; se añade un par de reversión.",
624
+ voidReason: "Motivo (opcional):",
625
+ columns: {
626
+ date: "Fecha",
627
+ kind: "Tipo",
628
+ memo: "Memo",
629
+ lines: "Líneas",
630
+ },
631
+ kind: {
632
+ normal: "—",
633
+ opening: "Apertura",
634
+ void: "Reverso",
635
+ voidMarker: "Marcador de anulación",
636
+ },
637
+ },
638
+ entryForm: {
639
+ title: "Nueva entrada",
640
+ editTitle: "Editar entrada",
641
+ editBanner: "Al enviar, la entrada original será anulada y sustituida por esta.",
642
+ dateLabel: "Fecha",
643
+ memoLabel: "Memo",
644
+ accountLabel: "Cuenta",
645
+ debitLabel: "Debe",
646
+ creditLabel: "Haber",
647
+ taxRegistrationIdLabel: "ID fiscal",
648
+ taxRegistrationIdPlaceholder: "NIF / VAT ID / RFC…",
649
+ taxRegistrationIdMissingWarning: "Obligatorio",
650
+ addLine: "Añadir línea",
651
+ removeLine: "Quitar",
652
+ submit: "Asentar",
653
+ submitting: "Asentando…",
654
+ update: "Actualizar",
655
+ updating: "Actualizando…",
656
+ cancelEdit: "Cancelar",
657
+ success: "Entrada asentada.",
658
+ editSuccess: "Entrada actualizada.",
659
+ editVoidReason: "editado",
660
+ imbalance: "Descuadre: {amount}",
661
+ balanced: "Cuadrada ✓",
662
+ },
663
+ openingForm: {
664
+ title: "Saldos de apertura",
665
+ asOfLabel: "Al",
666
+ explainer: "Solo cuentas de balance (activo/pasivo/patrimonio). Σ debe = Σ haber; la diferencia va a Retained Earnings.",
667
+ emptyHint:
668
+ "Puedes guardar todo en blanco — luego puedes actualizar los saldos de apertura. Solo hace falta tener una apertura registrada para desbloquear las demás pestañas.",
669
+ explainer2: "Solo cuentas de balance.",
670
+ submit: "Guardar saldos de apertura",
671
+ replaceWarning: "Al guardar se reemplaza la apertura existente (la anterior se anula en el diario).",
672
+ none: "Aún no hay saldos de apertura.",
673
+ setBy: "Establecido al {date}",
674
+ success: "Saldos guardados.",
675
+ },
676
+ ledger: {
677
+ selectAccount: "Seleccionar cuenta",
678
+ closingBalance: "Saldo final",
679
+ columns: {
680
+ date: "Fecha",
681
+ memo: "Memo",
682
+ debit: "Debe",
683
+ credit: "Haber",
684
+ balance: "Saldo",
685
+ taxRegistrationId: "ID fiscal",
686
+ },
687
+ },
688
+ dateRange: {
689
+ shortcutLabel: "Rango",
690
+ currentQuarter: "Trimestre actual",
691
+ previousQuarter: "Último trimestre",
692
+ currentYear: "Año en curso",
693
+ previousYear: "Año anterior",
694
+ lifetime: "Desde la apertura",
695
+ all: "Todo",
696
+ fromLabel: "Desde",
697
+ toLabel: "Hasta",
698
+ },
699
+ balanceSheet: {
700
+ asOfLabel: "Período",
701
+ sections: {
702
+ asset: "Activo",
703
+ liability: "Pasivo",
704
+ equity: "Patrimonio",
705
+ },
706
+ total: "Total",
707
+ imbalance: "Descuadre: {amount}",
708
+ currentEarnings: "Resultado del período",
709
+ shortcutLabel: "Atajo",
710
+ thisMonth: "Este mes",
711
+ lastMonth: "Mes anterior",
712
+ lastQuarter: "Último trimestre",
713
+ lastYear: "Año anterior",
714
+ },
715
+ profitLoss: {
716
+ fromLabel: "Desde",
717
+ toLabel: "Hasta",
718
+ income: "Ingresos",
719
+ expense: "Gastos",
720
+ netIncome: "Resultado neto:",
721
+ },
722
+ accounts: {
723
+ listEmpty: "No hay cuentas en esta categoría.",
724
+ openLedgerAria: "Abrir mayor de {code} {name}",
725
+ manageButton: "Gestionar cuentas",
726
+ modalTitle: "Gestionar cuentas",
727
+ addAccount: "Añadir cuenta",
728
+ sectionTitle: {
729
+ asset: "Activos",
730
+ liability: "Pasivos",
731
+ equity: "Patrimonio",
732
+ income: "Ingresos",
733
+ expense: "Gastos",
734
+ },
735
+ columnCode: "Código",
736
+ columnName: "Nombre",
737
+ columnType: "Tipo",
738
+ columnNote: "Nota",
739
+ typeOption: {
740
+ asset: "Activo",
741
+ liability: "Pasivo",
742
+ equity: "Patrimonio",
743
+ income: "Ingreso",
744
+ expense: "Gasto",
745
+ },
746
+ edit: "Editar",
747
+ save: "Guardar",
748
+ cancel: "Cancelar",
749
+ saving: "Guardando…",
750
+ addToCategory: "Añadir cuenta de {type}",
751
+ deactivate: "Desactivar",
752
+ reactivate: "Activar",
753
+ deactivateConfirm: "¿Ocultar “{name}” de los desplegables de asientos / mayor? Los asientos existentes no se ven afectados.",
754
+ errorEmptyCode: "El código es obligatorio.",
755
+ errorReservedCode: "Los códigos que empiezan por “_” están reservados para filas del sistema.",
756
+ errorInvalidCodeFormat: "El código de cuenta debe tener exactamente 4 dígitos.",
757
+ errorCodeTypeMismatch: "El código debe coincidir con el tipo de cuenta: 1xxx activo, 2xxx pasivo, 3xxx patrimonio, 4xxx ingreso, 5xxx gasto.",
758
+ errorEmptyName: "El nombre es obligatorio.",
759
+ errorDuplicateCode: "Ya existe una cuenta con este código.",
760
+ errorDuplicateName: "Ya existe una cuenta con este nombre.",
761
+ success: "Cuenta guardada.",
762
+ codeReadOnlyHint: "El código no puede cambiarse una vez creada la cuenta.",
763
+ noteOptional: "(opcional)",
764
+ },
765
+ settings: {
766
+ bookInfo: "Información del libro",
767
+ bookInfoExplain:
768
+ "Edita el país para actualizar los consejos según la jurisdicción fiscal. La moneda no puede cambiarse una vez registrados los asientos.",
769
+ countryUnset: "(sin definir)",
770
+ fiscalYearEndExplain: "Solo cambia cómo se resuelven los atajos de rango de fechas en adelante; los asientos existentes no se mueven.",
771
+ saveChanges: "Guardar cambios",
772
+ updateOk: "Libro actualizado.",
773
+ rebuild: "Reconstruir snapshots",
774
+ rebuildExplain: "Borra todos los snapshots mensuales y los recalcula desde el diario. Útil tras editar el diario a mano.",
775
+ rebuildOk: "Reconstruidos {count} período(s).",
776
+ advanced: "Avanzado…",
777
+ deleteBook: "Eliminar libro",
778
+ deleteBookExplain: "Elimina permanentemente el directorio del libro. No se puede deshacer.",
779
+ deleteBookConfirm: 'Escribe "{bookName}" para confirmar:',
780
+ deleteBookButton: "Eliminar para siempre",
781
+ },
782
+ preview: {
783
+ entry: "Entrada asentada el {date}",
784
+ pl: "P&L {from} → {to}: neto {net}",
785
+ bs: "Balance al {date} · activos {assets}",
786
+ bookCreated: 'Libro "{name}" ({id}) creado',
787
+ },
788
+ previewSummary: "Contabilidad · {bookId}",
789
+ previewError: "Contabilidad: {error}",
790
+ previewGeneric: "Resultado de contabilidad",
382
791
  },
383
792
  todoExplorer: {
384
793
  heading: "Tareas",
@@ -395,14 +804,6 @@ const esMessages = {
395
804
  newColumnPlaceholder: "Revisar",
396
805
  noMatchingFilter: "Ningún elemento coincide con el filtro actual",
397
806
  },
398
- todoPreview: {
399
- completedRatio: "{done}/{total} completadas",
400
- moreItems: "+ {count} más…",
401
- headerIcon: "☑",
402
- doneIcon: "✓",
403
- pendingIcon: "○",
404
- moreLabels: "+{count}",
405
- },
406
807
  todoDialogs: {
407
808
  addTitle: "Añadir tarea",
408
809
  editTitle: "Editar tarea",
@@ -432,6 +833,7 @@ const esMessages = {
432
833
  noMatchingFilter: "Ningún elemento coincide con el filtro actual",
433
834
  sortColumnAria: "Ordenar por {column}",
434
835
  expandRowAria: "Expandir tarea: {task}",
836
+ deleteItem: "Eliminar elemento",
435
837
  },
436
838
  pluginWiki: {
437
839
  backToIndex: "Volver al índice",
@@ -451,6 +853,35 @@ const esMessages = {
451
853
  noMatches: "No hay páginas con la etiqueta #{tag}",
452
854
  lintChat: "Revisar mi wiki",
453
855
  taskCountMismatch: "La fuente del wiki y la salida renderizada difieren en el número de tareas. Se rechazó el cambio para evitar dañar el archivo.",
856
+ metadataCreated: "Creado",
857
+ metadataUpdated: "Actualizado",
858
+ metadataEditor: "Editor",
859
+ pageEditHeader: "Edición de wiki",
860
+ snapshotExpired: "Instantánea expirada — mostrando la página actual",
861
+ pageDeleted: "Página eliminada",
862
+ history: {
863
+ tabContent: "Contenido",
864
+ tabHistory: "Historial",
865
+ empty: "Aún no hay historial — edita esta página y la primera versión aparecerá aquí.",
866
+ loading: "Cargando historial…",
867
+ backToList: "Volver al historial",
868
+ restoreButton: "Restaurar esta versión",
869
+ restoreConfirmTitle: "¿Restaurar esta versión?",
870
+ restoreConfirmBody: "Restaurar la página a la versión del {ts} por {editor}. La página actual será reemplazada. El historial existente se conserva.",
871
+ restoreConfirmAction: "Restaurar",
872
+ restoreConfirmCancel: "Cancelar",
873
+ restoreSuccessToast: "Página restaurada.",
874
+ restoreFailureBanner: "Error al restaurar: {error}",
875
+ compareCurrent: "Comparar con la página actual",
876
+ comparePrevious: "Comparar con la versión anterior",
877
+ diffNoPrevious: "No hay versión anterior con la que comparar.",
878
+ diffNoChanges: "No hay diferencias de contenido entre esta versión y el objeto de comparación.",
879
+ editorBadgeUser: "Usuario",
880
+ editorBadgeLLM: "LLM",
881
+ editorBadgeSystem: "Sistema",
882
+ hiddenLines: "{count} líneas sin cambios ocultas",
883
+ expandHidden: "Mostrar",
884
+ },
454
885
  },
455
886
  pluginPresentForm: {
456
887
  fallbackTitle: "Formulario",
@@ -468,8 +899,13 @@ const esMessages = {
468
899
  saveAsPdf: "Guardar como PDF (abre el diálogo de impresión)",
469
900
  pdf: "PDF",
470
901
  untitled: "Página HTML",
471
- hideSource: "Ocultar código <>",
472
- showSource: "Mostrar código <>",
902
+ editSource: "Editar código HTML",
903
+ cancel: "Cancelar",
904
+ applyChanges: "Aplicar cambios",
905
+ saving: "Guardando...",
906
+ saveError: "⚠ Error al guardar: {error}",
907
+ loadingSource: "Cargando código…",
908
+ sourceError: "Error al cargar el código: {error}",
473
909
  },
474
910
  pluginNews: {
475
911
  title: "Noticias",
@@ -586,7 +1022,6 @@ const esMessages = {
586
1022
  pluginManageRoles: {
587
1023
  heading: "Roles personalizados",
588
1024
  roleCount: "{count} rol | {count} roles",
589
- previewCount: "{count} rol personalizado | {count} roles personalizados",
590
1025
  addButton: "+ Añadir",
591
1026
  createPanel: "Crear nuevo rol",
592
1027
  fieldId: "ID",
@@ -635,6 +1070,8 @@ const esMessages = {
635
1070
  gen: "Generar",
636
1071
  play: "▶ Reproducir",
637
1072
  stop: "■ Detener",
1073
+ playPresentation: "Reproducir presentación",
1074
+ regenerateMovie: "Regenerar vídeo",
638
1075
  errPrefix: "⚠ Error",
639
1076
  noBeats: "No se encontraron beats en el script",
640
1077
  editSource: "Editar fuente del script",
@@ -671,6 +1108,11 @@ const esMessages = {
671
1108
  copyLabel: "Copiar",
672
1109
  copiedLabel: "¡Copiado!",
673
1110
  cancel: "Cancelar",
1111
+ seededByPlugin: "desde {pkg}",
1112
+ seededByPluginTooltip: "Este mensaje fue generado por el plugin {pkg}, no enviado por ti.",
1113
+ },
1114
+ pluginSkill: {
1115
+ noDescription: "(sin descripción)",
674
1116
  },
675
1117
  pluginSpreadsheet: {
676
1118
  previewUntitled: "Hoja de cálculo",
@@ -698,6 +1140,11 @@ const esMessages = {
698
1140
  },
699
1141
  suggestionsPanel: {
700
1142
  suggestions: "Sugerencias",
1143
+ skills: "Habilidades",
1144
+ tooltip: "Sugerencias y habilidades",
1145
+ emptySuggestions: "No hay sugerencias.",
1146
+ emptySkills: "No hay habilidades instaladas.",
1147
+ skillsError: "Error al cargar las habilidades: {error}",
701
1148
  sendEditHint: "clic para enviar · shift+clic para editar",
702
1149
  },
703
1150
  settingsToolsTab: {