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/main.ts CHANGED
@@ -5,6 +5,13 @@ import { installGuards } from "./router/guards";
5
5
  import i18n from "./lib/vue-i18n";
6
6
  import { setAuthToken } from "./utils/api";
7
7
  import { readAuthTokenFromMeta } from "./utils/dom/authTokenMeta";
8
+ import { loadRuntimePlugins } from "./tools/runtimeLoader";
9
+ import { startDevPluginReloadListener } from "./composables/useDevPluginReload";
10
+ import { installHostContext, type EndpointRegistry } from "./plugins/api";
11
+ import { API_ROUTES } from "./config/apiRoutes";
12
+ import { BUILTIN_ROLE_IDS } from "./config/roles";
13
+ import { PAGE_ROUTES } from "./router";
14
+ import { getAllPluginNames } from "./tools";
8
15
  import "./index.css";
9
16
  import "material-icons/iconfont/material-icons.css";
10
17
  import "material-symbols/outlined.css";
@@ -20,6 +27,84 @@ import.meta.glob(["../node_modules/@gui-chat-plugin/*/dist/style.css", "../node_
20
27
  // server isn't running.
21
28
  setAuthToken(readAuthTokenFromMeta());
22
29
 
30
+ // Plugin DI: wire the host's URL map / role IDs / page-name
31
+ // constants / plugin registry into the plugin-side resolver BEFORE
32
+ // app.mount(). Plugin code reads from this registry via the
33
+ // `pluginEndpoints` / `pluginBuiltinRoleIds` / `pluginPageRoute` /
34
+ // `pluginAllPluginNames` helpers in `./plugins/api`. Plugin source
35
+ // has zero direct dependency on `./config/*` — host wires them in
36
+ // here, which is the only place that knows both ends.
37
+ //
38
+ // The endpoint registry is built explicitly per-plugin so each
39
+ // plugin's scope name is stable regardless of where the host
40
+ // happens to nest the URLs in the apiRoutes tree. Plugin-owned
41
+ // scopes (#1141) match the META's `apiNamespace`; host-shared
42
+ // scopes (`files`, `imageStore`, `mcpTools`, …) carry plain string
43
+ // URLs the host owns directly.
44
+ const pluginEndpointRegistry: EndpointRegistry = {
45
+ // Plugin-owned top-level groups. Each value is a `Record<string,
46
+ // ResolvedRoute>` produced by the host aggregator from the
47
+ // plugin's META `{ apiNamespace, apiRoutes }`.
48
+ // todos: removed (#1145) — runtime plugin uses
49
+ // `/api/plugins/runtime/<pkg>/dispatch` directly via
50
+ // `runtime.dispatch`, so no entry in the endpoint registry.
51
+ scheduler: API_ROUTES.scheduler,
52
+ mulmoScript: API_ROUTES.mulmoScript,
53
+ skills: API_ROUTES.skills,
54
+ sources: API_ROUTES.sources,
55
+ html: API_ROUTES.html,
56
+ chart: API_ROUTES.chart,
57
+ accounting: API_ROUTES.accounting,
58
+ canvas: API_ROUTES.canvas,
59
+ form: API_ROUTES.form,
60
+ markdown: API_ROUTES.markdown,
61
+ spreadsheet: API_ROUTES.spreadsheet,
62
+ // Host-owned groups. `wiki` / `roles` live in `HOST_API_ROUTES`
63
+ // as plain string URLs; `image` is a host-shared image store
64
+ // with both a `generate`/`edit` plugin route and an `update`
65
+ // endpoint shared with canvas. Plugins read these as
66
+ // `Record<string, string>` via `pluginEndpoints<HostShape>`.
67
+ wiki: API_ROUTES.wiki,
68
+ roles: API_ROUTES.roles,
69
+ image: API_ROUTES.image,
70
+ // Cross-cutting host-shared services that plugins reach for
71
+ // (read workspace files, look up MCP tools, save canvas image
72
+ // back to disk). Exposed as their own scopes so plugins don't
73
+ // import `API_ROUTES.files` / `image.update` / `mcpTools` directly.
74
+ files: API_ROUTES.files,
75
+ imageStore: { update: API_ROUTES.image.update },
76
+ mcpTools: { list: API_ROUTES.mcpTools.list },
77
+ };
78
+
79
+ installHostContext({
80
+ endpoints: pluginEndpointRegistry,
81
+ builtinRoleIds: BUILTIN_ROLE_IDS,
82
+ pageRoutes: PAGE_ROUTES,
83
+ getAllPluginNames,
84
+ });
85
+
86
+ // Runtime-loaded plugins (#1043 C-2). Fire-and-forget: kick off the
87
+ // list fetch + dynamic imports immediately but do NOT block mount.
88
+ // Static plugins are bundled and ready synchronously; runtime
89
+ // plugins fill in over the next ~100ms while the app is rendering
90
+ // its first paint. By the time the LLM actually calls a runtime
91
+ // tool (which requires at least one user message round-trip), the
92
+ // registry is fully populated.
93
+ //
94
+ // Awaiting here would delay first paint even when there are no
95
+ // runtime plugins installed (every workspace today), and it shifted
96
+ // the timing of `page.goto("/chat")` enough to break the
97
+ // today-journal-button E2E spec, which captured the URL before
98
+ // app mount completed.
99
+ loadRuntimePlugins().catch((err: unknown) => {
100
+ console.warn("[runtime-plugin] boot loader threw", err);
101
+ });
102
+
103
+ // PR3 of #1159: when `--dev-plugin` is in use and the watched dist/
104
+ // changes, this listener reloads the page. No-ops in production
105
+ // because the server only publishes when a dev plugin is loaded.
106
+ startDevPluginReloadListener();
107
+
23
108
  installGuards(router);
24
109
 
25
110
  const app = createApp(App);
@@ -0,0 +1,58 @@
1
+ // Manual extras the codegen can't auto-discover. These are the
2
+ // registrations and server bindings that don't fit the standard
3
+ // shape (one plugin dir → one META with apiNamespace+mcpDispatch).
4
+ //
5
+ // Two reasons something lives here:
6
+ //
7
+ // 1. **Cross-namespace endpoint** — editImages and generateImage
8
+ // share the host-owned `/api/image/*` routes (so their META
9
+ // is toolName-only). The codegen omits them from
10
+ // `_generated/server-bindings.ts`; we wire the bindings here
11
+ // against the host record directly.
12
+ // 2. **External npm-distributed plugin** — mindmap, quiz, present3d
13
+ // live in node_modules; they don't have a `src/plugins/<name>/`
14
+ // directory the codegen can scan, so the registration AND the
15
+ // binding both come from this file.
16
+ //
17
+ // New built-in plugins shouldn't land here — keep the standard shape
18
+ // (one dir, one META with apiNamespace+mcpDispatch). The extras list
19
+ // is meant to be small and stable.
20
+
21
+ import type { PluginRegistration } from "../tools/types";
22
+ import type { ServerPluginBinding } from "./server-bindings-types";
23
+ import { TOOL_NAMES } from "../config/toolNames";
24
+ import { API_ROUTES } from "../config/apiRoutes";
25
+
26
+ import { TOOL_DEFINITION as createMindMapDef } from "@gui-chat-plugin/mindmap";
27
+ import { TOOL_DEFINITION as putQuestionsDef } from "@mulmochat-plugin/quiz";
28
+ import { TOOL_DEFINITION as present3DDef } from "@gui-chat-plugin/present3d";
29
+
30
+ import generateImageDef from "./generateImage/definition";
31
+ import editImagesDef from "./editImages/definition";
32
+
33
+ import MindMapPlugin from "@gui-chat-plugin/mindmap/vue";
34
+ import QuizPlugin from "@mulmochat-plugin/quiz/vue";
35
+ import Present3DPlugin from "@gui-chat-plugin/present3d/vue";
36
+
37
+ /** Externally-distributed plugin registrations. The codegen barrel
38
+ * in `_generated/registrations.ts` only knows about plugins with a
39
+ * local directory under `src/plugins/`; these npm packages need
40
+ * hand-wired entries. */
41
+ export const EXTERNAL_PLUGIN_REGISTRATIONS: readonly PluginRegistration[] = [
42
+ { toolName: TOOL_NAMES.createMindMap, entry: MindMapPlugin.plugin },
43
+ { toolName: TOOL_NAMES.putQuestions, entry: QuizPlugin.plugin },
44
+ { toolName: TOOL_NAMES.present3D, entry: Present3DPlugin.plugin },
45
+ ];
46
+
47
+ /** MCP bindings that don't follow the standard
48
+ * `mcpEndpoint(meta)` resolution: image plugins reach into the
49
+ * host-owned `/api/image/*` routes; external npm plugins use
50
+ * legacy `/api/plugins/{mindmap,quiz,present3d}` paths from
51
+ * `HOST_API_ROUTES.plugins`. */
52
+ export const EXTRA_SERVER_BINDINGS: readonly ServerPluginBinding[] = [
53
+ { def: generateImageDef, endpoint: API_ROUTES.image.generate },
54
+ { def: editImagesDef, endpoint: API_ROUTES.image.edit },
55
+ { def: createMindMapDef, endpoint: API_ROUTES.plugins.mindmap },
56
+ { def: putQuestionsDef, endpoint: API_ROUTES.plugins.quiz },
57
+ { def: present3DDef, endpoint: API_ROUTES.plugins.present3d },
58
+ ];
@@ -0,0 +1,42 @@
1
+ // AUTO-GENERATED by `scripts/codegen-plugin-barrels.ts`. DO NOT EDIT.
2
+ // Run `yarn plugins:codegen` after adding/removing/renaming a plugin.
3
+
4
+ import type { PluginMeta } from "../meta-types";
5
+
6
+ import { META as accountingMeta } from "../accounting/meta";
7
+ import { META as canvasMeta } from "../canvas/meta";
8
+ import { META as chartMeta } from "../chart/meta";
9
+ import { META as editImagesMeta } from "../editImages/meta";
10
+ import { META as generateImageMeta } from "../generateImage/meta";
11
+ import { META as manageSkillsMeta } from "../manageSkills/meta";
12
+ import { META as manageSourceMeta } from "../manageSource/meta";
13
+ import { META as markdownMeta } from "../markdown/meta";
14
+ import { META as presentFormMeta } from "../presentForm/meta";
15
+ import { META as presentHtmlMeta } from "../presentHtml/meta";
16
+ import { META as presentMulmoScriptMeta } from "../presentMulmoScript/meta";
17
+ import { META as schedulerAutomationsMeta } from "../scheduler/automationsMeta";
18
+ import { META as schedulerCalendarMeta } from "../scheduler/calendarMeta";
19
+ import { META as spreadsheetMeta } from "../spreadsheet/meta";
20
+ import { META as wikiMeta } from "../wiki/meta";
21
+
22
+ /** All plugin METAs the codegen discovered under `src/plugins/<name>/{meta,*Meta}.ts`.
23
+ * Combined with `_extras` (if any) inside `src/plugins/metas.ts`. */
24
+ export const GENERATED_PLUGIN_METAS = [
25
+ accountingMeta,
26
+ canvasMeta,
27
+ chartMeta,
28
+ editImagesMeta,
29
+ generateImageMeta,
30
+ manageSkillsMeta,
31
+ manageSourceMeta,
32
+ markdownMeta,
33
+ presentFormMeta,
34
+ presentHtmlMeta,
35
+ presentMulmoScriptMeta,
36
+ schedulerAutomationsMeta,
37
+ schedulerCalendarMeta,
38
+ spreadsheetMeta,
39
+ wikiMeta,
40
+ ] as const satisfies readonly PluginMeta[];
41
+
42
+ export type GeneratedPluginMetas = typeof GENERATED_PLUGIN_METAS;
@@ -0,0 +1,44 @@
1
+ // AUTO-GENERATED by `scripts/codegen-plugin-barrels.ts`. DO NOT EDIT.
2
+ // Run `yarn plugins:codegen` after adding/removing/renaming a plugin.
3
+
4
+ import type { PluginRegistration } from "../../tools/types";
5
+
6
+ import { REGISTRATION as accountingRegistration } from "../accounting";
7
+ import { REGISTRATION as canvasRegistration } from "../canvas";
8
+ import { REGISTRATION as chartRegistration } from "../chart";
9
+ import { REGISTRATION as editImagesRegistration } from "../editImages";
10
+ import { REGISTRATION as generateImageRegistration } from "../generateImage";
11
+ import { REGISTRATION as manageSkillsRegistration } from "../manageSkills";
12
+ import { REGISTRATION as manageSourceRegistration } from "../manageSource";
13
+ import { REGISTRATION as markdownRegistration } from "../markdown";
14
+ import { REGISTRATION as presentFormRegistration } from "../presentForm";
15
+ import { REGISTRATION as presentHtmlRegistration } from "../presentHtml";
16
+ import { REGISTRATION as presentMulmoScriptRegistration } from "../presentMulmoScript";
17
+ import { REGISTRATIONS as schedulerRegistrations } from "../scheduler";
18
+ import { REGISTRATION as skillRegistration } from "../skill";
19
+ import { REGISTRATION as spreadsheetRegistration } from "../spreadsheet";
20
+ import { REGISTRATION as textResponseRegistration } from "../textResponse";
21
+ import { REGISTRATION as wikiRegistration } from "../wiki";
22
+
23
+ /** All plugin registrations the codegen discovered under `src/plugins/<name>/index.ts`.
24
+ * Single-entry plugins export `REGISTRATION`; multi-entry plugins (scheduler)
25
+ * export `REGISTRATIONS` and are spread. Combined with `_extras` inside
26
+ * `src/plugins/index.ts`. */
27
+ export const GENERATED_PLUGIN_REGISTRATIONS: readonly PluginRegistration[] = [
28
+ accountingRegistration,
29
+ canvasRegistration,
30
+ chartRegistration,
31
+ editImagesRegistration,
32
+ generateImageRegistration,
33
+ manageSkillsRegistration,
34
+ manageSourceRegistration,
35
+ markdownRegistration,
36
+ presentFormRegistration,
37
+ presentHtmlRegistration,
38
+ presentMulmoScriptRegistration,
39
+ ...schedulerRegistrations,
40
+ skillRegistration,
41
+ spreadsheetRegistration,
42
+ textResponseRegistration,
43
+ wikiRegistration,
44
+ ];
@@ -0,0 +1,47 @@
1
+ // AUTO-GENERATED by `scripts/codegen-plugin-barrels.ts`. DO NOT EDIT.
2
+ // Run `yarn plugins:codegen` after adding/removing/renaming a plugin.
3
+
4
+ import type { ServerPluginBinding } from "../server-bindings-types";
5
+ import { mcpEndpoint } from "../server-bindings-types";
6
+
7
+ import accountingDef from "../accounting/definition";
8
+ import canvasDef from "../canvas/definition";
9
+ import chartDef from "../chart/definition";
10
+ import manageSkillsDef from "../manageSkills/definition";
11
+ import manageSourceDef from "../manageSource/definition";
12
+ import markdownDef from "../markdown/definition";
13
+ import presentFormDef from "../presentForm/definition";
14
+ import presentHtmlDef from "../presentHtml/definition";
15
+ import presentMulmoScriptDef from "../presentMulmoScript/definition";
16
+ import schedulerAutomationsDef from "../scheduler/automationsDefinition";
17
+ import schedulerCalendarDef from "../scheduler/calendarDefinition";
18
+ import spreadsheetDef from "../spreadsheet/definition";
19
+ import { META as accountingMeta } from "../accounting/meta";
20
+ import { META as canvasMeta } from "../canvas/meta";
21
+ import { META as chartMeta } from "../chart/meta";
22
+ import { META as manageSkillsMeta } from "../manageSkills/meta";
23
+ import { META as manageSourceMeta } from "../manageSource/meta";
24
+ import { META as markdownMeta } from "../markdown/meta";
25
+ import { META as presentFormMeta } from "../presentForm/meta";
26
+ import { META as presentHtmlMeta } from "../presentHtml/meta";
27
+ import { META as presentMulmoScriptMeta } from "../presentMulmoScript/meta";
28
+ import { META as schedulerCalendarMeta } from "../scheduler/calendarMeta";
29
+ import { META as spreadsheetMeta } from "../spreadsheet/meta";
30
+
31
+ /** All plugin MCP bindings the codegen discovered for plugins whose META declares
32
+ * both `apiNamespace` and `mcpDispatch`. Plugins without those fields (image plugins,
33
+ * external npm plugins) live in `_extras.ts`. Combined inside `src/plugins/server.ts`. */
34
+ export const GENERATED_SERVER_BINDINGS: readonly ServerPluginBinding[] = [
35
+ { def: accountingDef, endpoint: mcpEndpoint(accountingMeta) },
36
+ { def: canvasDef, endpoint: mcpEndpoint(canvasMeta) },
37
+ { def: chartDef, endpoint: mcpEndpoint(chartMeta) },
38
+ { def: manageSkillsDef, endpoint: mcpEndpoint(manageSkillsMeta) },
39
+ { def: manageSourceDef, endpoint: mcpEndpoint(manageSourceMeta) },
40
+ { def: markdownDef, endpoint: mcpEndpoint(markdownMeta) },
41
+ { def: presentFormDef, endpoint: mcpEndpoint(presentFormMeta) },
42
+ { def: presentHtmlDef, endpoint: mcpEndpoint(presentHtmlMeta) },
43
+ { def: presentMulmoScriptDef, endpoint: mcpEndpoint(presentMulmoScriptMeta) },
44
+ { def: schedulerAutomationsDef, endpoint: mcpEndpoint(schedulerCalendarMeta) },
45
+ { def: schedulerCalendarDef, endpoint: mcpEndpoint(schedulerCalendarMeta) },
46
+ { def: spreadsheetDef, endpoint: mcpEndpoint(spreadsheetMeta) },
47
+ ];
@@ -0,0 +1,106 @@
1
+ <template>
2
+ <!-- Compact inline summary for non-openBook tool results. The
3
+ openBook envelope routes to View.vue (full app) instead of
4
+ this component; everything that lands here is a
5
+ compact-result action (addEntries, getReport, …). -->
6
+ <div class="text-sm text-gray-700" data-testid="accounting-preview">
7
+ <span class="material-icons text-base align-middle mr-1">account_balance</span>
8
+ <span>{{ summary }}</span>
9
+ </div>
10
+ </template>
11
+
12
+ <script setup lang="ts">
13
+ import { computed } from "vue";
14
+ import { useI18n } from "vue-i18n";
15
+
16
+ const { t } = useI18n();
17
+
18
+ const props = defineProps<{ data?: unknown; jsonData?: Record<string, unknown> }>();
19
+
20
+ interface BalanceSheetSection {
21
+ type: string;
22
+ total?: number;
23
+ }
24
+ interface BalanceSheetLike {
25
+ balanceSheet?: { asOf?: string; sections?: BalanceSheetSection[]; imbalance?: number };
26
+ }
27
+ interface ProfitLossLike {
28
+ profitLoss?: { from?: string; to?: string; netIncome?: number };
29
+ }
30
+ interface EntriesLike {
31
+ entries?: { id?: string; date?: string }[];
32
+ }
33
+ interface BookLike {
34
+ book?: { id?: string; name?: string };
35
+ }
36
+
37
+ function formatAmount(value: number): string {
38
+ return value.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 });
39
+ }
40
+
41
+ // Each summarise* helper returns null when its branch doesn't apply,
42
+ // keeping the dispatch in `summary` linear (no nested if-trees).
43
+
44
+ function summariseError(json: Record<string, unknown>): string | null {
45
+ const { error } = json as { error?: unknown };
46
+ if (typeof error !== "string") return null;
47
+ return t("pluginAccounting.previewError", { error });
48
+ }
49
+
50
+ function summariseEntry(json: Record<string, unknown>): string | null {
51
+ // addEntries returns `{ entries: [...] }`. The compact preview
52
+ // card shows one date — use the first entry's so single-entry
53
+ // batches (the common case from the manual UI) read naturally
54
+ // and multi-entry batches still anchor to a meaningful date.
55
+ const { entries } = json as EntriesLike;
56
+ if (!Array.isArray(entries) || entries.length === 0) return null;
57
+ const [first] = entries;
58
+ if (!first?.id || !first?.date) return null;
59
+ return t("pluginAccounting.preview.entry", { date: first.date });
60
+ }
61
+
62
+ function summarisePl(json: Record<string, unknown>): string | null {
63
+ const { profitLoss } = json as ProfitLossLike;
64
+ if (!profitLoss || typeof profitLoss.netIncome !== "number") return null;
65
+ return t("pluginAccounting.preview.pl", {
66
+ from: profitLoss.from ?? "?",
67
+ to: profitLoss.to ?? "?",
68
+ net: formatAmount(profitLoss.netIncome),
69
+ });
70
+ }
71
+
72
+ function summariseBs(json: Record<string, unknown>): string | null {
73
+ const { balanceSheet } = json as BalanceSheetLike;
74
+ if (!balanceSheet?.asOf || !balanceSheet.sections) return null;
75
+ const assets = balanceSheet.sections.find((section) => section.type === "asset");
76
+ return t("pluginAccounting.preview.bs", {
77
+ date: balanceSheet.asOf,
78
+ assets: assets ? formatAmount(assets.total ?? 0) : "?",
79
+ });
80
+ }
81
+
82
+ function summariseBook(json: Record<string, unknown>): string | null {
83
+ const { book } = json as BookLike;
84
+ if (!book?.id || !book?.name) return null;
85
+ return t("pluginAccounting.preview.bookCreated", { name: book.name, id: book.id });
86
+ }
87
+
88
+ function summariseFallback(json: Record<string, unknown>): string {
89
+ const { bookId } = json as { bookId?: unknown };
90
+ if (typeof bookId === "string") return t("pluginAccounting.previewSummary", { bookId });
91
+ return t("pluginAccounting.previewGeneric");
92
+ }
93
+
94
+ function asObject(value: unknown): Record<string, unknown> {
95
+ // Some renderers pass the structured payload via `data`, others
96
+ // via `jsonData`. Accept either so a tool-result like
97
+ // `{ entry: ... }` resolves to the right summariser regardless
98
+ // of which prop the host harness picks.
99
+ return value && typeof value === "object" ? (value as Record<string, unknown>) : {};
100
+ }
101
+
102
+ const summary = computed<string>(() => {
103
+ const json = { ...asObject(props.data), ...asObject(props.jsonData) };
104
+ return summariseError(json) ?? summariseEntry(json) ?? summarisePl(json) ?? summariseBs(json) ?? summariseBook(json) ?? summariseFallback(json);
105
+ });
106
+ </script>