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.
- package/Dockerfile.sandbox +100 -0
- package/README.md +17 -4
- package/bin/mulmoclaude.js +46 -15
- package/bin/prepare-dist.js +18 -2
- package/client/assets/chunk-CernVdwh.js +1 -0
- package/client/assets/chunk-D8eiyYIV-C1eAZMzz.js +1 -0
- package/client/assets/html2canvas-CDGcmOD3-BbPeutDg.js +5 -0
- package/client/assets/index-BbgSjFQ8.js +4968 -0
- package/client/assets/index-ECD0lgIv.css +2 -0
- package/client/assets/{index.es-D4YyL_Dg-BgT6a3Nd.js → index.es-DqtpmBm8-DJdTPdnc.js} +5 -5
- package/client/assets/material-symbols-outlined-BLDfUw-_.woff2 +0 -0
- package/client/assets/runtime-protocol-vue-6WYa8hAs.js +1 -0
- package/client/assets/runtime-vue-BVUzgYGA.js +1 -0
- package/client/assets/typeof-DBp4T-Ny-C2xoZtcz.js +1 -0
- package/client/assets/vue-1e_vz2LW.js +1 -0
- package/client/assets/vue.runtime.esm-bundler-DQ8Kjjui.js +4 -0
- package/client/index.html +33 -2
- package/package.json +20 -18
- package/sandbox-entrypoint.sh +106 -0
- package/server/accounting/accountNormalize.ts +32 -0
- package/server/accounting/defaultAccounts.ts +87 -0
- package/server/accounting/eventPublisher.ts +51 -0
- package/server/accounting/journal.ts +252 -0
- package/server/accounting/openingBalances.ts +114 -0
- package/server/accounting/report.ts +237 -0
- package/server/accounting/service.ts +718 -0
- package/server/accounting/snapshotCache.ts +333 -0
- package/server/accounting/timeSeries.ts +265 -0
- package/server/accounting/types.ts +148 -0
- package/server/agent/activeTools.ts +128 -0
- package/server/agent/attachmentConverter.ts +10 -5
- package/server/agent/backend/claude-code.ts +8 -2
- package/server/agent/backend/types.ts +1 -1
- package/server/agent/config.ts +101 -31
- package/server/agent/index.ts +45 -33
- package/server/agent/mcp-server.ts +146 -69
- package/server/agent/mcp-tools/index.ts +1 -5
- package/server/agent/mcp-tools/notify.ts +2 -22
- package/server/agent/mcp-tools/x.ts +0 -4
- package/server/agent/mcpHealth.ts +168 -0
- package/server/agent/plugin-names.ts +20 -77
- package/server/agent/prompt.ts +259 -51
- package/server/agent/resumeFailover.ts +1 -1
- package/server/agent/stream.ts +0 -1
- package/server/api/auth/bearerAuth.ts +5 -5
- package/server/api/csrfGuard.ts +1 -1
- package/server/api/routes/accounting.ts +366 -0
- package/server/api/routes/agent.ts +509 -46
- package/server/api/routes/attachment.ts +104 -0
- package/server/api/routes/chart.ts +2 -1
- package/server/api/routes/config.ts +12 -12
- package/server/api/routes/files.ts +105 -48
- package/server/api/routes/image.ts +70 -25
- package/server/api/routes/journal.ts +35 -0
- package/server/api/routes/mulmo-script.ts +358 -118
- package/server/api/routes/mulmoScriptValidate.ts +1 -1
- package/server/api/routes/news.ts +1 -1
- package/server/api/routes/notifications.ts +92 -22
- package/server/api/routes/notifier.ts +98 -0
- package/server/api/routes/pdf.ts +188 -48
- package/server/api/routes/plugins.ts +34 -14
- package/server/api/routes/presentHtml.ts +58 -3
- package/server/api/routes/roles.ts +1 -8
- package/server/api/routes/runtime-plugin.ts +224 -0
- package/server/api/routes/scheduler.ts +7 -5
- package/server/api/routes/schedulerHandlers.ts +1 -1
- package/server/api/routes/schedulerTasks.ts +8 -7
- package/server/api/routes/sessions.ts +234 -121
- package/server/api/routes/skills.ts +56 -51
- package/server/api/routes/sources.ts +52 -45
- package/server/api/routes/translation.ts +44 -0
- package/server/api/routes/wiki/frontmatter.ts +13 -65
- package/server/api/routes/wiki/history.ts +261 -0
- package/server/api/routes/wiki/pageIndex.ts +1 -1
- package/server/api/routes/wiki.ts +50 -26
- package/server/events/file-change.ts +83 -0
- package/server/events/notifications.ts +247 -91
- package/server/events/pub-sub/index.ts +1 -1
- package/server/events/relay-client.ts +5 -5
- package/server/events/scheduler-adapter.ts +2 -2
- package/server/events/session-store/index.ts +110 -22
- package/server/events/task-manager/index.ts +10 -9
- package/server/index.ts +509 -33
- package/server/notifier/engine.ts +419 -0
- package/server/notifier/legacy-adapters.ts +76 -0
- package/server/notifier/runtime-api.ts +74 -0
- package/server/notifier/store.ts +70 -0
- package/server/notifier/types.ts +121 -0
- package/server/plugins/dev-loader.ts +171 -0
- package/server/plugins/dev-watcher.ts +150 -0
- package/server/plugins/diagnostics.ts +188 -0
- package/server/plugins/preset-list.ts +52 -0
- package/server/plugins/preset-loader.ts +112 -0
- package/server/plugins/runtime-chat-api.ts +38 -0
- package/server/plugins/runtime-loader.ts +430 -0
- package/server/plugins/runtime-registry.ts +112 -0
- package/server/plugins/runtime-tasks-api.ts +50 -0
- package/server/plugins/runtime.ts +378 -0
- package/server/services/translation/cache.ts +72 -0
- package/server/services/translation/index.ts +106 -0
- package/server/services/translation/llm.ts +140 -0
- package/server/services/translation/types.ts +35 -0
- package/server/system/credentials.ts +13 -2
- package/server/system/env.ts +6 -1
- package/server/system/logger/formatters.ts +46 -4
- package/server/system/logger/index.ts +4 -4
- package/server/system/logger/sinks.ts +26 -5
- package/server/system/logger/types.ts +2 -2
- package/server/utils/dev-plugin-args.d.mts +11 -0
- package/server/utils/dev-plugin-args.mjs +43 -0
- package/server/utils/errors.ts +13 -4
- package/server/utils/files/accounting-io.ts +295 -0
- package/server/utils/files/atomic.ts +17 -49
- package/server/utils/files/attachment-store.ts +182 -0
- package/server/utils/files/html-io.ts +1 -7
- package/server/utils/files/html-store.ts +19 -0
- package/server/utils/files/image-store.ts +20 -22
- package/server/utils/files/index.ts +5 -15
- package/server/utils/files/journal-io.ts +7 -35
- package/server/utils/files/json.ts +2 -29
- package/server/utils/files/markdown-image-fill.ts +6 -37
- package/server/utils/files/markdown-store.ts +6 -21
- package/server/utils/files/naming.ts +3 -39
- package/server/utils/files/plugins-io.ts +100 -0
- package/server/utils/files/reference-dirs-io.ts +1 -9
- package/server/utils/files/roles-io.ts +2 -10
- package/server/utils/files/safe.ts +17 -19
- package/server/utils/files/scheduler-io.ts +1 -7
- package/server/utils/files/scheduler-overrides-io.ts +3 -12
- package/server/utils/files/session-io.ts +21 -30
- package/server/utils/files/spreadsheet-store.ts +9 -22
- package/server/utils/files/translation-io.ts +46 -0
- package/server/utils/files/user-tasks-io.ts +1 -7
- package/server/utils/files/workspace-io.ts +3 -79
- package/server/utils/gemini.ts +33 -11
- package/server/utils/html/htmlArtifactSplicer.ts +41 -0
- package/server/utils/markdown/frontmatter.ts +112 -0
- package/server/utils/regex.ts +56 -0
- package/server/utils/router.ts +41 -0
- package/server/utils/slug.ts +5 -3
- package/server/utils/time.ts +12 -0
- package/server/workspace/chat-index/indexer.ts +15 -2
- package/server/workspace/chat-index/summarizer.ts +1 -1
- package/server/workspace/custom-dirs.ts +1 -1
- package/server/workspace/helps/gemini.md +1 -1
- package/server/workspace/helps/guide.md +61 -0
- package/server/workspace/helps/index.md +4 -0
- package/server/workspace/helps/presenthtml.md +80 -0
- package/server/workspace/helps/sandbox.md +7 -0
- package/server/workspace/helps/storyteller.md +101 -0
- package/server/workspace/helps/telegram.md +1 -0
- package/server/workspace/helps/wiki.md +9 -7
- package/server/workspace/journal/archivist-cli.ts +7 -33
- package/server/workspace/journal/archivist-schemas.ts +5 -43
- package/server/workspace/journal/dailyPass.ts +34 -187
- package/server/workspace/journal/diff.ts +3 -28
- package/server/workspace/journal/index.ts +10 -81
- package/server/workspace/journal/indexFile.ts +3 -24
- package/server/workspace/journal/latestDaily.ts +51 -0
- package/server/workspace/journal/memoryExtractor.ts +4 -20
- package/server/workspace/journal/optimizationPass.ts +4 -21
- package/server/workspace/journal/paths.ts +4 -23
- package/server/workspace/journal/state.ts +6 -29
- package/server/workspace/memory/io.ts +213 -0
- package/server/workspace/memory/llm-classifier.ts +158 -0
- package/server/workspace/memory/migrate.ts +263 -0
- package/server/workspace/memory/run.ts +84 -0
- package/server/workspace/memory/topic-cluster.ts +218 -0
- package/server/workspace/memory/topic-detect.ts +67 -0
- package/server/workspace/memory/topic-index-hook.ts +128 -0
- package/server/workspace/memory/topic-io.ts +180 -0
- package/server/workspace/memory/topic-migrate.ts +248 -0
- package/server/workspace/memory/topic-run.ts +172 -0
- package/server/workspace/memory/topic-swap.ts +135 -0
- package/server/workspace/memory/topic-types.ts +142 -0
- package/server/workspace/memory/types.ts +83 -0
- package/server/workspace/news/reader.ts +4 -5
- package/server/workspace/paths.ts +124 -47
- package/server/workspace/roles.ts +2 -11
- package/server/workspace/skills/parser.ts +38 -55
- package/server/workspace/skills/user-tasks.ts +1 -2
- package/server/workspace/skills-preset/mc-library/SKILL.md +188 -0
- package/server/workspace/skills-preset.ts +196 -0
- package/server/workspace/sources/fetchers/githubIssues.ts +13 -11
- package/server/workspace/sources/fetchers/index.ts +1 -1
- package/server/workspace/sources/fetchers/rssParser.ts +1 -1
- package/server/workspace/sources/pipeline/index.ts +2 -2
- package/server/workspace/sources/pipeline/notify.ts +3 -3
- package/server/workspace/sources/pipeline/write.ts +2 -2
- package/server/workspace/sources/registry.ts +39 -61
- package/server/workspace/sources/robots.ts +1 -1
- package/server/workspace/tool-trace/classify.ts +2 -1
- package/server/workspace/tool-trace/index.ts +1 -1
- package/server/workspace/tool-trace/writeSearch.ts +6 -1
- package/server/workspace/wiki-backlinks/index.ts +19 -7
- package/server/workspace/wiki-backlinks/sessionBacklinks.ts +1 -0
- package/server/workspace/wiki-history/hook/snapshot.mjs +98 -0
- package/server/workspace/wiki-history/hook/snapshot.ts +135 -0
- package/server/workspace/wiki-history/provision.ts +181 -0
- package/server/workspace/wiki-pages/io.ts +217 -0
- package/server/workspace/wiki-pages/snapshot.ts +380 -0
- package/server/workspace/workspace.ts +75 -13
- package/src/App.vue +115 -40
- package/src/_runtime/protocol-vue.ts +21 -0
- package/src/_runtime/vue.ts +22 -0
- package/src/components/ChatInput.vue +14 -10
- package/src/components/CopyChatButton.vue +76 -0
- package/src/components/FileContentRenderer.vue +67 -14
- package/src/components/FileTree.vue +2 -2
- package/src/components/FilesView.vue +17 -1
- package/src/components/NewsView.vue +16 -2
- package/src/components/NotificationBell.vue +320 -93
- package/src/components/PageChatComposer.vue +5 -4
- package/src/components/PluginLauncher.vue +42 -6
- package/src/components/PluginScopedRoot.vue +87 -0
- package/src/components/RoleSelector.vue +12 -1
- package/src/components/RolesView.vue +562 -0
- package/src/components/SentAttachmentChip.vue +102 -0
- package/src/components/SessionHistoryPanel.vue +109 -20
- package/src/components/SessionRoleIcon.vue +7 -4
- package/src/components/SessionSidebar.vue +20 -7
- package/src/components/SessionTabBar.vue +1 -1
- package/src/components/SettingsMcpTab.vue +4 -4
- package/src/components/SettingsModal.vue +2 -0
- package/src/components/SidebarHeader.vue +16 -5
- package/src/components/SourcesManager.vue +23 -9
- package/src/components/SourcesView.vue +1 -1
- package/src/components/StackView.vue +102 -6
- package/src/components/SuggestionsPanel.vue +105 -16
- package/src/components/SystemFileBanner.vue +1 -1
- package/src/components/TodoExplorer.vue +4 -5
- package/src/components/todo/TodoAddDialog.vue +2 -3
- package/src/components/todo/TodoEditDialog.vue +1 -2
- package/src/components/todo/TodoEditPanel.vue +2 -3
- package/src/components/todo/TodoKanbanView.vue +8 -5
- package/src/components/todo/TodoListView.vue +3 -5
- package/src/components/todo/TodoTableView.vue +7 -5
- package/src/composables/useAccountingChannel.ts +58 -0
- package/src/composables/useActiveSession.ts +4 -25
- package/src/composables/useAppApi.ts +6 -44
- package/src/composables/useClipboardCopy.ts +3 -20
- package/src/composables/useContentDisplay.ts +33 -2
- package/src/composables/useDevPluginReload.ts +23 -0
- package/src/composables/useDynamicFavicon.ts +5 -31
- package/src/composables/useEventListeners.ts +0 -20
- package/src/composables/useExpandedDirs.ts +4 -15
- package/src/composables/useFaviconState.ts +12 -46
- package/src/composables/useFileChange.ts +53 -0
- package/src/composables/useFreshPluginData.ts +6 -43
- package/src/composables/useHealth.ts +14 -43
- package/src/composables/useImageErrorRepair.ts +104 -0
- package/src/composables/useLatestDaily.ts +40 -0
- package/src/composables/useMarkdownDoc.ts +39 -0
- package/src/composables/useMarkdownLinkHandler.ts +1 -1
- package/src/composables/useMcpTools.ts +3 -16
- package/src/composables/useNotifications.ts +138 -112
- package/src/composables/usePdfDownload.ts +17 -3
- package/src/composables/usePendingCalls.ts +8 -26
- package/src/composables/usePluginErrorBoundary.ts +68 -0
- package/src/composables/usePubSub.ts +9 -17
- package/src/composables/useRunElapsed.ts +5 -22
- package/src/composables/useSandboxStatus.ts +4 -20
- package/src/composables/useSessionDerived.ts +7 -15
- package/src/composables/useSessionHistory.ts +70 -29
- package/src/composables/useSessionSync.ts +25 -3
- package/src/composables/useSkillsList.ts +59 -0
- package/src/composables/useTranslatedQueries.ts +109 -0
- package/src/config/apiRoutes.ts +181 -80
- package/src/config/historyFilters.ts +5 -3
- package/src/config/hostEvents.ts +17 -0
- package/src/config/mcpCatalog.ts +277 -5
- package/src/config/pubsubChannels.ts +134 -12
- package/src/config/roles.ts +212 -147
- package/src/config/systemFileDescriptors.ts +5 -5
- package/src/config/toolNames.ts +52 -30
- package/src/config/workspacePaths.ts +26 -2
- package/src/lang/de.ts +483 -27
- package/src/lang/en.ts +448 -27
- package/src/lang/es.ts +474 -27
- package/src/lang/fr.ts +476 -27
- package/src/lang/ja.ts +465 -27
- package/src/lang/ko.ts +466 -27
- package/src/lang/pt-BR.ts +473 -27
- package/src/lang/zh.ts +463 -27
- package/src/lib/vue-i18n.ts +1 -1
- package/src/lib/wiki-page/slug.ts +66 -0
- package/src/main.ts +85 -0
- package/src/plugins/_extras.ts +58 -0
- package/src/plugins/_generated/metas.ts +42 -0
- package/src/plugins/_generated/registrations.ts +44 -0
- package/src/plugins/_generated/server-bindings.ts +47 -0
- package/src/plugins/accounting/Preview.vue +106 -0
- package/src/plugins/accounting/View.vue +632 -0
- package/src/plugins/accounting/actions.ts +34 -0
- package/src/plugins/accounting/api.ts +301 -0
- package/src/plugins/accounting/components/AccountEditor.vue +250 -0
- package/src/plugins/accounting/components/AccountRow.vue +50 -0
- package/src/plugins/accounting/components/AccountsList.vue +102 -0
- package/src/plugins/accounting/components/AccountsModal.vue +300 -0
- package/src/plugins/accounting/components/BalanceSheet.vue +186 -0
- package/src/plugins/accounting/components/BookSettings.vue +284 -0
- package/src/plugins/accounting/components/BookSwitcher.vue +78 -0
- package/src/plugins/accounting/components/DateRangePicker.vue +140 -0
- package/src/plugins/accounting/components/JournalEntryForm.vue +504 -0
- package/src/plugins/accounting/components/JournalList.vue +553 -0
- package/src/plugins/accounting/components/Ledger.vue +206 -0
- package/src/plugins/accounting/components/NewBookForm.vue +211 -0
- package/src/plugins/accounting/components/OpeningBalancesForm.vue +271 -0
- package/src/plugins/accounting/components/ProfitLoss.vue +160 -0
- package/src/plugins/accounting/components/accountDraft.ts +13 -0
- package/src/plugins/accounting/components/accountNumbering.ts +103 -0
- package/src/plugins/accounting/components/accountValidation.ts +75 -0
- package/src/plugins/accounting/components/useLatestRequest.ts +44 -0
- package/src/plugins/accounting/countries.ts +158 -0
- package/src/plugins/accounting/currencies.ts +64 -0
- package/src/plugins/accounting/dates.ts +51 -0
- package/src/plugins/accounting/definition.ts +199 -0
- package/src/plugins/accounting/fiscalYear.ts +136 -0
- package/src/plugins/accounting/index.ts +49 -0
- package/src/plugins/accounting/meta.ts +91 -0
- package/src/plugins/accounting/timeSeriesEnums.ts +16 -0
- package/src/plugins/api.ts +125 -0
- package/src/plugins/canvas/View.vue +38 -28
- package/src/plugins/canvas/definition.ts +10 -8
- package/src/plugins/canvas/index.ts +15 -8
- package/src/plugins/canvas/meta.ts +12 -0
- package/src/plugins/chart/Preview.vue +1 -1
- package/src/plugins/chart/View.vue +2 -2
- package/src/plugins/chart/definition.ts +12 -2
- package/src/plugins/chart/index.ts +15 -7
- package/src/plugins/chart/meta.ts +18 -0
- package/src/plugins/editImages/definition.ts +44 -0
- package/src/plugins/editImages/index.ts +43 -0
- package/src/plugins/editImages/meta.ts +5 -0
- package/src/plugins/generateImage/View.vue +3 -1
- package/src/plugins/generateImage/definition.ts +2 -0
- package/src/plugins/generateImage/index.ts +13 -5
- package/src/plugins/generateImage/meta.ts +5 -0
- package/src/plugins/index.ts +35 -0
- package/src/plugins/manageRoles/Preview.vue +7 -4
- package/src/plugins/manageRoles/View.vue +12 -8
- package/src/plugins/manageRoles/definition.ts +6 -0
- package/src/plugins/manageRoles/index.ts +7 -6
- package/src/plugins/manageSkills/View.vue +11 -7
- package/src/plugins/manageSkills/definition.ts +4 -1
- package/src/plugins/manageSkills/index.ts +14 -7
- package/src/plugins/manageSkills/meta.ts +21 -0
- package/src/plugins/manageSource/definition.ts +4 -1
- package/src/plugins/manageSource/index.ts +15 -7
- package/src/plugins/manageSource/meta.ts +21 -0
- package/src/plugins/markdown/Preview.vue +10 -8
- package/src/plugins/markdown/View.vue +84 -17
- package/src/plugins/markdown/definition.ts +7 -1
- package/src/plugins/markdown/index.ts +15 -8
- package/src/plugins/markdown/meta.ts +16 -0
- package/src/plugins/meta-types.ts +97 -0
- package/src/plugins/metas.ts +224 -0
- package/src/plugins/presentForm/Preview.vue +4 -15
- package/src/plugins/presentForm/View.vue +35 -78
- package/src/plugins/presentForm/definition.ts +7 -6
- package/src/plugins/presentForm/index.ts +12 -5
- package/src/plugins/presentForm/meta.ts +11 -0
- package/src/plugins/presentForm/plugin.ts +8 -9
- package/src/plugins/presentForm/types.ts +0 -24
- package/src/plugins/presentHtml/Preview.vue +1 -8
- package/src/plugins/presentHtml/View.vue +401 -30
- package/src/plugins/presentHtml/definition.ts +8 -5
- package/src/plugins/presentHtml/index.ts +15 -8
- package/src/plugins/presentHtml/meta.ts +14 -0
- package/src/plugins/presentMulmoScript/View.vue +327 -107
- package/src/plugins/presentMulmoScript/definition.ts +34 -7
- package/src/plugins/presentMulmoScript/helpers.ts +4 -5
- package/src/plugins/presentMulmoScript/index.ts +20 -7
- package/src/plugins/presentMulmoScript/meta.ts +52 -0
- package/src/plugins/scheduler/AutomationsPreview.vue +2 -8
- package/src/plugins/scheduler/Preview.vue +5 -2
- package/src/plugins/scheduler/TasksTab.vue +16 -36
- package/src/plugins/scheduler/View.vue +22 -54
- package/src/plugins/scheduler/automationsDefinition.ts +14 -9
- package/src/plugins/scheduler/automationsMeta.ts +5 -0
- package/src/plugins/scheduler/calendarDefinition.ts +4 -7
- package/src/plugins/scheduler/calendarMeta.ts +28 -0
- package/src/plugins/scheduler/formatSchedule.ts +6 -24
- package/src/plugins/scheduler/index.ts +26 -52
- package/src/plugins/scope.ts +57 -0
- package/src/plugins/server-bindings-types.ts +38 -0
- package/src/plugins/server.ts +32 -0
- package/src/plugins/skill/Preview.vue +25 -0
- package/src/plugins/skill/View.vue +125 -0
- package/src/plugins/skill/definition.ts +23 -0
- package/src/plugins/skill/index.ts +36 -0
- package/src/plugins/skill/plugin.ts +31 -0
- package/src/plugins/skill/types.ts +21 -0
- package/src/plugins/spreadsheet/Preview.vue +1 -3
- package/src/plugins/spreadsheet/View.vue +29 -49
- package/src/plugins/spreadsheet/cellHighlights.ts +2 -3
- package/src/plugins/spreadsheet/definition.ts +5 -2
- package/src/plugins/spreadsheet/index.ts +15 -8
- package/src/plugins/spreadsheet/keyboardNav.ts +38 -0
- package/src/plugins/spreadsheet/meta.ts +14 -0
- package/src/plugins/textResponse/Preview.vue +9 -1
- package/src/plugins/textResponse/View.vue +59 -8
- package/src/plugins/textResponse/index.ts +11 -3
- package/src/plugins/textResponse/plugin.ts +8 -10
- package/src/plugins/textResponse/types.ts +28 -0
- package/src/plugins/wiki/Preview.vue +6 -4
- package/src/plugins/wiki/View.vue +463 -254
- package/src/plugins/wiki/components/WikiPageBody.vue +159 -0
- package/src/plugins/wiki/helpers.ts +17 -0
- package/src/plugins/wiki/history/HistoryDetail.vue +325 -0
- package/src/plugins/wiki/history/HistoryTab.vue +167 -0
- package/src/plugins/wiki/history/RestoreConfirm.vue +63 -0
- package/src/plugins/wiki/history/api.ts +52 -0
- package/src/plugins/wiki/history/diff.ts +145 -0
- package/src/plugins/wiki/index.ts +42 -32
- package/src/plugins/wiki/meta.ts +10 -0
- package/src/plugins/wiki/pageEditLoader.ts +53 -0
- package/src/plugins/wiki/route.ts +8 -0
- package/src/router/guards.ts +2 -1
- package/src/router/index.ts +19 -0
- package/src/router/pageRoutes.ts +1 -0
- package/src/tools/index.ts +50 -51
- package/src/tools/runtimeLoader.ts +141 -0
- package/src/tools/types.ts +44 -1
- package/src/types/notification.ts +23 -0
- package/src/types/pastedFile.ts +10 -0
- package/src/types/session.ts +61 -3
- package/src/types/sse.ts +21 -6
- package/src/utils/agent/eventDispatch.ts +12 -9
- package/src/utils/agent/pastedAttachment.ts +35 -0
- package/src/utils/agent/request.ts +32 -3
- package/src/utils/agent/toolCalls.ts +7 -1
- package/src/utils/api.ts +1 -1
- package/src/utils/chat/exportMarkdown.ts +243 -0
- package/src/utils/errors.ts +10 -2
- package/src/utils/files/expandedDirs.ts +1 -1
- package/src/utils/filesPreview/todoPreview.ts +13 -2
- package/src/utils/format/date.ts +1 -3
- package/src/utils/format/jsonSyntax.ts +5 -0
- package/src/utils/html/iframeHeightReporterScript.ts +62 -0
- package/src/utils/html/previewCsp.ts +29 -2
- package/src/utils/image/htmlSrcAttrs.ts +122 -0
- package/src/utils/image/imageRepairInlineScript.ts +115 -0
- package/src/utils/image/resolve.ts +17 -3
- package/src/utils/image/rewriteMarkdownImageRefs.ts +62 -9
- package/src/utils/markdown/frontmatter.ts +125 -0
- package/src/utils/markdown/taskList.ts +7 -2
- package/src/utils/plugin/runtime.ts +132 -0
- package/src/utils/session/mergeSessions.ts +40 -37
- package/src/utils/session/sessionEntries.ts +74 -18
- package/src/utils/session/sessionHelpers.ts +54 -10
- package/src/utils/tools/result.ts +76 -14
- package/src/vite-env.d.ts +6 -0
- package/client/assets/html2canvas-Cx501zZr-Bug0qRNv.js +0 -5
- package/client/assets/index-CY-WpQUm.css +0 -2
- package/client/assets/index-DbTz2Mfs.js +0 -4911
- package/client/assets/material-symbols-outlined-NzYEeyps.woff2 +0 -0
- package/server/api/routes/html.ts +0 -114
- package/server/api/routes/todos.ts +0 -293
- package/server/api/routes/todosColumnsHandlers.ts +0 -333
- package/server/api/routes/todosHandlers.ts +0 -274
- package/server/api/routes/todosItemsHandlers.ts +0 -386
- package/server/utils/files/todos-io.ts +0 -29
- package/src/components/NotificationToast.vue +0 -75
- package/src/plugins/editImage/definition.ts +0 -27
- package/src/plugins/editImage/index.ts +0 -37
- package/src/plugins/presentHtml/helpers.ts +0 -72
- package/src/plugins/scheduler/LegacySchedulerView.vue +0 -32
- package/src/plugins/scheduler/legacyShape.ts +0 -34
- package/src/plugins/todo/Preview.vue +0 -68
- package/src/plugins/todo/View.vue +0 -378
- package/src/plugins/todo/composables/useTodos.ts +0 -179
- package/src/plugins/todo/definition.ts +0 -45
- package/src/plugins/todo/index.ts +0 -62
- package/src/plugins/todo/labels.ts +0 -163
- package/src/plugins/todo/priority.ts +0 -98
- package/src/plugins/todo/viewModes.ts +0 -19
- package/src/plugins/wiki/definition.ts +0 -25
- package/src/tools/legacyPluginNames.ts +0 -13
- package/src/utils/format/frontmatter.ts +0 -80
- package/src/utils/image/rewriteHtmlImageRefs.ts +0 -50
- package/src/utils/notification/dispatch.ts +0 -58
- /package/client/assets/{purify.es-Fx1Nqyry-BwJECkqS.js → purify.es-Fx1Nqyry-BSVNht6S.js} +0 -0
- /package/src/plugins/{editImage → editImages}/Preview.vue +0 -0
- /package/src/plugins/{editImage → editImages}/View.vue +0 -0
- /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>
|