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
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
<button
|
|
5
5
|
class="h-8 px-2.5 flex items-center gap-1 rounded bg-green-600 hover:bg-green-700 text-white text-sm disabled:opacity-60 disabled:cursor-not-allowed transition-colors"
|
|
6
6
|
:disabled="pdfDownloading"
|
|
7
|
+
data-testid="text-response-pdf-button"
|
|
7
8
|
@click="downloadPdf"
|
|
8
9
|
>
|
|
9
10
|
<span class="material-icons text-base">{{ pdfDownloading ? "hourglass_empty" : "download" }}</span>
|
|
@@ -16,12 +17,35 @@
|
|
|
16
17
|
<div class="text-response-content-wrapper">
|
|
17
18
|
<div class="p-6">
|
|
18
19
|
<div class="max-w-3xl mx-auto space-y-4">
|
|
19
|
-
<div
|
|
20
|
+
<div
|
|
21
|
+
class="rounded-lg border border-gray-300 bg-white shadow-sm p-5"
|
|
22
|
+
:class="roleTheme"
|
|
23
|
+
:data-testid="seededByPlugin ? 'text-response-plugin-seeded' : undefined"
|
|
24
|
+
>
|
|
20
25
|
<div class="flex justify-between items-start mb-2 text-sm text-gray-500">
|
|
21
|
-
<span class="
|
|
26
|
+
<span class="flex items-center gap-2">
|
|
27
|
+
<span class="font-medium text-gray-700">{{ speakerLabel }}</span>
|
|
28
|
+
<span
|
|
29
|
+
v-if="seededByPlugin"
|
|
30
|
+
class="inline-flex items-center px-1.5 py-0.5 rounded text-[10px] uppercase font-medium bg-purple-100 text-purple-700 ring-1 ring-purple-200"
|
|
31
|
+
:title="t('pluginTextResponse.seededByPluginTooltip', { pkg: seededByPlugin })"
|
|
32
|
+
data-testid="text-response-seeded-by-plugin"
|
|
33
|
+
>
|
|
34
|
+
{{ t("pluginTextResponse.seededByPlugin", { pkg: seededByPlugin }) }}
|
|
35
|
+
</span>
|
|
36
|
+
</span>
|
|
22
37
|
<span v-if="transportKind" class="italic">{{ transportKind }}</span>
|
|
23
38
|
</div>
|
|
24
|
-
|
|
39
|
+
<!-- eslint-disable vue/no-v-html -- marked.parse output of app-owned assistant response text; trusted in-process render. Multi-line element so disable/enable pair (CLAUDE.md UI rule) instead of -next-line. -->
|
|
40
|
+
<div
|
|
41
|
+
class="markdown-content prose prose-slate max-w-none leading-relaxed text-gray-900"
|
|
42
|
+
:data-testid="isAssistant ? 'text-response-assistant-body' : undefined"
|
|
43
|
+
v-html="renderedHtml"
|
|
44
|
+
></div>
|
|
45
|
+
<!-- eslint-enable vue/no-v-html -->
|
|
46
|
+
<div v-if="messageAttachments.length > 0" class="space-y-3 mt-3" data-testid="text-response-attachments">
|
|
47
|
+
<SentAttachmentChip v-for="path in messageAttachments" :key="path" :path="path" variant="block" />
|
|
48
|
+
</div>
|
|
25
49
|
</div>
|
|
26
50
|
</div>
|
|
27
51
|
</div>
|
|
@@ -50,6 +74,7 @@ import { useI18n } from "vue-i18n";
|
|
|
50
74
|
import { marked } from "marked";
|
|
51
75
|
import type { ToolResult, ToolResultComplete } from "gui-chat-protocol/vue";
|
|
52
76
|
import type { TextResponseData } from "./types";
|
|
77
|
+
import SentAttachmentChip from "../../components/SentAttachmentChip.vue";
|
|
53
78
|
import { handleExternalLinkClick } from "../../utils/dom/externalLink";
|
|
54
79
|
import { classifyWorkspacePath } from "../../utils/path/workspaceLinkRouter";
|
|
55
80
|
import { useAppApi } from "../../composables/useAppApi";
|
|
@@ -95,6 +120,12 @@ watch(editorSource, (next) => {
|
|
|
95
120
|
|
|
96
121
|
const messageRole = computed(() => props.selectedResult.data?.role ?? "assistant");
|
|
97
122
|
const transportKind = computed(() => props.selectedResult.data?.transportKind ?? "");
|
|
123
|
+
const messageAttachments = computed<string[]>(() => props.selectedResult.data?.attachments ?? []);
|
|
124
|
+
// Pkg name when this user turn was seeded by `runtime.chat.start()`
|
|
125
|
+
// (Phase 1 of the Encore plan). Drives the "from <pkg>" chip and a
|
|
126
|
+
// muted background variant so the user can tell the message came
|
|
127
|
+
// from a plugin and not themselves.
|
|
128
|
+
const seededByPlugin = computed<string>(() => props.selectedResult.data?.seededByPlugin ?? "");
|
|
98
129
|
|
|
99
130
|
const renderedHtml = computed(() => {
|
|
100
131
|
if (!messageText.value) return "";
|
|
@@ -106,7 +137,7 @@ const renderedHtml = computed(() => {
|
|
|
106
137
|
if ((trimmedText.startsWith("{") && trimmedText.endsWith("}")) || (trimmedText.startsWith("[") && trimmedText.endsWith("]"))) {
|
|
107
138
|
try {
|
|
108
139
|
JSON.parse(trimmedText);
|
|
109
|
-
processedText =
|
|
140
|
+
processedText = `\`\`\`json\n${trimmedText}\n\`\`\``;
|
|
110
141
|
} catch {
|
|
111
142
|
// Not valid JSON, continue with original text
|
|
112
143
|
}
|
|
@@ -133,6 +164,13 @@ const speakerLabel = computed(() => {
|
|
|
133
164
|
});
|
|
134
165
|
|
|
135
166
|
const roleTheme = computed(() => {
|
|
167
|
+
// Plugin-seeded user turns get a muted gray background instead of
|
|
168
|
+
// the standard "user" green so the row reads as "this came from a
|
|
169
|
+
// plugin, not you." The chip beside the speaker label carries the
|
|
170
|
+
// pkg name; the background change is the at-a-glance signal.
|
|
171
|
+
if (seededByPlugin.value && messageRole.value === "user") {
|
|
172
|
+
return "bg-gray-50 border-gray-200";
|
|
173
|
+
}
|
|
136
174
|
switch (messageRole.value) {
|
|
137
175
|
case "system":
|
|
138
176
|
return "bg-blue-50 border-blue-200";
|
|
@@ -145,6 +183,11 @@ const roleTheme = computed(() => {
|
|
|
145
183
|
|
|
146
184
|
const hasChanges = computed(() => editedText.value !== editorSource.value);
|
|
147
185
|
|
|
186
|
+
// `<details>` element ref. Declared together with the editing state
|
|
187
|
+
// just below, but hoisted up here so `applyChanges` can close the
|
|
188
|
+
// panel after a save without TDZ ordering trouble.
|
|
189
|
+
const detailsEl = ref<HTMLDetailsElement>();
|
|
190
|
+
|
|
148
191
|
function applyChanges() {
|
|
149
192
|
if (!hasChanges.value) return;
|
|
150
193
|
|
|
@@ -189,7 +232,6 @@ function openLinksInNewTab(event: MouseEvent): void {
|
|
|
189
232
|
|
|
190
233
|
const { pdfDownloading, pdfError, downloadPdf: rawDownloadPdf } = usePdfDownload();
|
|
191
234
|
|
|
192
|
-
const detailsEl = ref<HTMLDetailsElement>();
|
|
193
235
|
const editing = ref(false);
|
|
194
236
|
|
|
195
237
|
function onDetailsToggle(event: Event) {
|
|
@@ -219,13 +261,22 @@ async function copyText() {
|
|
|
219
261
|
}
|
|
220
262
|
|
|
221
263
|
async function downloadPdf() {
|
|
222
|
-
const
|
|
264
|
+
const { data } = props.selectedResult;
|
|
265
|
+
// Display text and PDF source can diverge: Files Explorer's .md
|
|
266
|
+
// preview pre-rewrites image refs to `/api/files/raw?...` for
|
|
267
|
+
// browser display, but the server PDF inliner can't resolve those
|
|
268
|
+
// back to disk. Use the original source when the caller passes it.
|
|
269
|
+
const pdfText = data?.pdfSourceText ?? data?.text ?? "";
|
|
270
|
+
const displayText = data?.text ?? "";
|
|
223
271
|
const filename = buildPdfFilename({
|
|
224
|
-
name: extractTextResponseTitle(
|
|
272
|
+
name: extractTextResponseTitle(displayText),
|
|
225
273
|
fallback: "chat",
|
|
226
274
|
timestampMs: appApi.getResultTimestamp(props.selectedResult.uuid),
|
|
227
275
|
});
|
|
228
|
-
await rawDownloadPdf(
|
|
276
|
+
await rawDownloadPdf(pdfText, filename, {
|
|
277
|
+
baseDir: data?.pdfBaseDir,
|
|
278
|
+
stripFrontmatter: data?.pdfStripFrontmatter,
|
|
279
|
+
});
|
|
229
280
|
}
|
|
230
281
|
</script>
|
|
231
282
|
|
|
@@ -3,8 +3,9 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import type { ToolPlugin } from "gui-chat-protocol/vue";
|
|
6
|
+
import type { PluginRegistration } from "../../tools/types";
|
|
6
7
|
import type { TextResponseData, TextResponseArgs } from "./types";
|
|
7
|
-
import { pluginCore } from "./plugin";
|
|
8
|
+
import { pluginCore, TOOL_NAME } from "./plugin";
|
|
8
9
|
import { samples } from "./samples";
|
|
9
10
|
import View from "./View.vue";
|
|
10
11
|
import Preview from "./Preview.vue";
|
|
@@ -18,10 +19,17 @@ export const plugin: ToolPlugin<TextResponseData, unknown, TextResponseArgs> = {
|
|
|
18
19
|
|
|
19
20
|
export type { TextResponseData, TextResponseArgs } from "./types";
|
|
20
21
|
|
|
21
|
-
export {
|
|
22
|
+
export { TOOL_DEFINITION, SYSTEM_PROMPT, executeTextResponse, pluginCore } from "./plugin";
|
|
23
|
+
export { TOOL_NAME };
|
|
22
24
|
|
|
23
25
|
export { samples } from "./samples";
|
|
24
26
|
|
|
25
27
|
export { View, Preview };
|
|
26
28
|
|
|
27
|
-
|
|
29
|
+
const textResponsePlugin = { plugin };
|
|
30
|
+
export default textResponsePlugin;
|
|
31
|
+
|
|
32
|
+
export const REGISTRATION: PluginRegistration = {
|
|
33
|
+
toolName: TOOL_NAME,
|
|
34
|
+
entry: plugin,
|
|
35
|
+
};
|
|
@@ -8,16 +8,14 @@ import { TOOL_DEFINITION, SYSTEM_PROMPT } from "./definition";
|
|
|
8
8
|
|
|
9
9
|
export { TOOL_NAME, TOOL_DEFINITION, SYSTEM_PROMPT } from "./definition";
|
|
10
10
|
|
|
11
|
-
export const executeTextResponse = async (_context: ToolContext, args: TextResponseArgs): Promise<ToolResult<TextResponseData, unknown>> => {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
};
|
|
20
|
-
};
|
|
11
|
+
export const executeTextResponse = async (_context: ToolContext, args: TextResponseArgs): Promise<ToolResult<TextResponseData, unknown>> => ({
|
|
12
|
+
data: {
|
|
13
|
+
text: args.text,
|
|
14
|
+
role: args.role,
|
|
15
|
+
transportKind: args.transportKind,
|
|
16
|
+
},
|
|
17
|
+
message: args.text,
|
|
18
|
+
});
|
|
21
19
|
|
|
22
20
|
export const pluginCore: ToolPluginCore<TextResponseData, unknown, TextResponseArgs> = {
|
|
23
21
|
toolDefinition: TOOL_DEFINITION,
|
|
@@ -6,6 +6,34 @@ export interface TextResponseData {
|
|
|
6
6
|
text: string;
|
|
7
7
|
role?: "assistant" | "system" | "user";
|
|
8
8
|
transportKind?: string;
|
|
9
|
+
// Workspace-relative paths of files the user attached when sending
|
|
10
|
+
// this turn (paste/drop/file-picker). Persisted on the user message
|
|
11
|
+
// so the chat history can render an icon / thumbnail chip alongside
|
|
12
|
+
// the bubble. Empty / undefined for assistant and system turns.
|
|
13
|
+
attachments?: string[];
|
|
14
|
+
/** Original (un-rewritten) markdown source for PDF generation.
|
|
15
|
+
* When present, `downloadPdf` sends this to the server instead of
|
|
16
|
+
* the displayed `text` (which may have already been rewritten with
|
|
17
|
+
* `/api/files/raw?path=...` URLs that the PDF inliner can't
|
|
18
|
+
* resolve). Files Explorer's .md preview sets this; chat callers
|
|
19
|
+
* leave it undefined and fall back to `text`. */
|
|
20
|
+
pdfSourceText?: string;
|
|
21
|
+
/** Workspace-relative directory of the source file. Forwarded to
|
|
22
|
+
* `usePdfDownload({ baseDir })` so server-side image inlining
|
|
23
|
+
* resolves relative refs against the right base. */
|
|
24
|
+
pdfBaseDir?: string;
|
|
25
|
+
/** Strip a leading YAML frontmatter envelope before rendering the
|
|
26
|
+
* PDF. Set true for Wiki pages (frontmatter shouldn't appear on
|
|
27
|
+
* page 1 of the PDF); leave false for chat / generic markdown so
|
|
28
|
+
* documents that literally start with `---\n…\n---\n` survive. */
|
|
29
|
+
pdfStripFrontmatter?: boolean;
|
|
30
|
+
/** Pkg name of the plugin that seeded this user turn via
|
|
31
|
+
* `runtime.chat.start()` (Phase 1 of the Encore plan). Set on the
|
|
32
|
+
* first user message in a session whose origin is `plugin:<pkg>`,
|
|
33
|
+
* drives the "from <pkg>" chip + muted background in the chat
|
|
34
|
+
* view so the user can tell the message came from a plugin, not
|
|
35
|
+
* themselves. Undefined for human-sent and assistant turns. */
|
|
36
|
+
seededByPlugin?: string;
|
|
9
37
|
}
|
|
10
38
|
|
|
11
39
|
export type TextResponseArgs = TextResponseData;
|
|
@@ -15,11 +15,13 @@
|
|
|
15
15
|
import { computed, ref, watch } from "vue";
|
|
16
16
|
import { useI18n } from "vue-i18n";
|
|
17
17
|
import type { ToolResultComplete } from "gui-chat-protocol/vue";
|
|
18
|
+
import type { WikiData, WikiPageEntry, WikiEndpoints } from "./index";
|
|
19
|
+
import { useFreshPluginData } from "../../composables/useFreshPluginData";
|
|
20
|
+
import { pluginEndpoints } from "../api";
|
|
21
|
+
|
|
22
|
+
const wikiEndpoints = pluginEndpoints<WikiEndpoints>("wiki");
|
|
18
23
|
|
|
19
24
|
const { t } = useI18n();
|
|
20
|
-
import type { WikiData, WikiPageEntry } from "./index";
|
|
21
|
-
import { useFreshPluginData } from "../../composables/useFreshPluginData";
|
|
22
|
-
import { API_ROUTES } from "../../config/apiRoutes";
|
|
23
25
|
|
|
24
26
|
const props = defineProps<{ result: ToolResultComplete<WikiData> }>();
|
|
25
27
|
|
|
@@ -28,7 +30,7 @@ const title = ref(props.result.data?.title ?? "Wiki");
|
|
|
28
30
|
const pageEntries = ref<WikiPageEntry[]>(props.result.data?.pageEntries ?? []);
|
|
29
31
|
|
|
30
32
|
const { refresh } = useFreshPluginData<WikiData>({
|
|
31
|
-
endpoint: () =>
|
|
33
|
+
endpoint: () => wikiEndpoints.base,
|
|
32
34
|
extract: (json) => (json as { data?: WikiData }).data ?? null,
|
|
33
35
|
apply: (data) => {
|
|
34
36
|
// Bug fix (CodeRabbit V1 #6): /api/wiki (no slug) always
|