mulmoclaude 0.1.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/README.md +44 -0
- package/bin/mulmoclaude.js +202 -0
- package/bin/prepare-dist.js +93 -0
- package/client/assets/chunk-vKJrgz-R-C_I3GbVV.js +1 -0
- package/client/assets/html2canvas-Cx501zZr-BF5dYYkY.js +5 -0
- package/client/assets/index-D8rhwXLq.js +4906 -0
- package/client/assets/index-KNLBjwuh.css +1 -0
- package/client/assets/index.es-D4YyL_Dg-BfRHLTZV.js +5 -0
- package/client/assets/material-icons-Dr0goTwe.woff +0 -0
- package/client/assets/material-icons-kAwBdRge.woff2 +0 -0
- package/client/assets/material-icons-outlined-BpWbwl2n.woff +0 -0
- package/client/assets/material-icons-outlined-DZhiGvEA.woff2 +0 -0
- package/client/assets/material-icons-round-BDlwx-sv.woff +0 -0
- package/client/assets/material-icons-round-DrirKXBx.woff2 +0 -0
- package/client/assets/material-icons-sharp-CH1KkVu7.woff +0 -0
- package/client/assets/material-icons-sharp-gidztirS.woff2 +0 -0
- package/client/assets/material-icons-two-tone-B7wz7mED.woff +0 -0
- package/client/assets/material-icons-two-tone-DuNIpaEj.woff2 +0 -0
- package/client/assets/mulmo_bw-ERmkSv0a.png +0 -0
- package/client/assets/purify.es-Fx1Nqyry-PeS5RUhs.js +2 -0
- package/client/assets/typeof-DBp4T-Ny-BC0P-2DM.js +1 -0
- package/client/index.html +28 -0
- package/package.json +66 -0
- package/server/agent/attachmentConverter.ts +270 -0
- package/server/agent/config.ts +414 -0
- package/server/agent/index.ts +260 -0
- package/server/agent/mcp-server.ts +412 -0
- package/server/agent/mcp-tools/index.ts +63 -0
- package/server/agent/mcp-tools/x.ts +188 -0
- package/server/agent/plugin-names.ts +75 -0
- package/server/agent/prompt.ts +349 -0
- package/server/agent/resumeFailover.ts +129 -0
- package/server/agent/sandboxMounts.ts +329 -0
- package/server/agent/stream.ts +194 -0
- package/server/api/auth/bearerAuth.ts +61 -0
- package/server/api/auth/token.ts +98 -0
- package/server/api/csrfGuard.ts +85 -0
- package/server/api/routes/agent.ts +478 -0
- package/server/api/routes/chart.ts +98 -0
- package/server/api/routes/chat-index.ts +46 -0
- package/server/api/routes/config.ts +258 -0
- package/server/api/routes/dispatchResponse.ts +79 -0
- package/server/api/routes/files.ts +812 -0
- package/server/api/routes/html.ts +101 -0
- package/server/api/routes/image.ts +169 -0
- package/server/api/routes/mulmo-script.ts +712 -0
- package/server/api/routes/mulmoScriptValidate.ts +101 -0
- package/server/api/routes/notifications.ts +69 -0
- package/server/api/routes/pdf.ts +163 -0
- package/server/api/routes/plugins.ts +276 -0
- package/server/api/routes/presentHtml.ts +48 -0
- package/server/api/routes/roles.ts +125 -0
- package/server/api/routes/scheduler.ts +153 -0
- package/server/api/routes/schedulerHandlers.ts +151 -0
- package/server/api/routes/schedulerTasks.ts +163 -0
- package/server/api/routes/sessions.ts +294 -0
- package/server/api/routes/sessionsCursor.ts +59 -0
- package/server/api/routes/skills.ts +195 -0
- package/server/api/routes/sources.ts +540 -0
- package/server/api/routes/todos.ts +263 -0
- package/server/api/routes/todosColumnsHandlers.ts +347 -0
- package/server/api/routes/todosHandlers.ts +274 -0
- package/server/api/routes/todosItemsHandlers.ts +386 -0
- package/server/api/routes/wiki/pageIndex.ts +53 -0
- package/server/api/routes/wiki.ts +363 -0
- package/server/api/sandboxStatus.ts +64 -0
- package/server/events/notifications.ts +160 -0
- package/server/events/pub-sub/index.ts +45 -0
- package/server/events/relay-client.ts +288 -0
- package/server/events/scheduler-adapter.ts +302 -0
- package/server/events/session-store/index.ts +492 -0
- package/server/events/task-manager/index.ts +181 -0
- package/server/index.ts +572 -0
- package/server/system/config.ts +243 -0
- package/server/system/credentials.ts +220 -0
- package/server/system/docker.ts +97 -0
- package/server/system/env.ts +109 -0
- package/server/system/logger/config.ts +112 -0
- package/server/system/logger/formatters.ts +40 -0
- package/server/system/logger/index.ts +53 -0
- package/server/system/logger/rotation.ts +37 -0
- package/server/system/logger/sinks.ts +101 -0
- package/server/system/logger/types.ts +29 -0
- package/server/utils/date.ts +57 -0
- package/server/utils/errors.ts +7 -0
- package/server/utils/fetch.ts +27 -0
- package/server/utils/files/atomic.ts +125 -0
- package/server/utils/files/html-io.ts +20 -0
- package/server/utils/files/image-store.ts +66 -0
- package/server/utils/files/index.ts +45 -0
- package/server/utils/files/journal-io.ts +213 -0
- package/server/utils/files/json.ts +69 -0
- package/server/utils/files/markdown-store.ts +33 -0
- package/server/utils/files/naming.ts +50 -0
- package/server/utils/files/reference-dirs-io.ts +45 -0
- package/server/utils/files/roles-io.ts +45 -0
- package/server/utils/files/safe.ts +106 -0
- package/server/utils/files/scheduler-io.ts +20 -0
- package/server/utils/files/scheduler-overrides-io.ts +64 -0
- package/server/utils/files/session-io.ts +136 -0
- package/server/utils/files/spreadsheet-store.ts +63 -0
- package/server/utils/files/todos-io.ts +29 -0
- package/server/utils/files/user-tasks-io.ts +25 -0
- package/server/utils/files/workspace-io.ts +221 -0
- package/server/utils/gemini.ts +59 -0
- package/server/utils/gitignore.ts +69 -0
- package/server/utils/http.ts +15 -0
- package/server/utils/httpError.ts +61 -0
- package/server/utils/id.ts +16 -0
- package/server/utils/json.ts +83 -0
- package/server/utils/logBackgroundError.ts +22 -0
- package/server/utils/markdown.ts +82 -0
- package/server/utils/request.ts +29 -0
- package/server/utils/slug.ts +50 -0
- package/server/utils/spawn.ts +62 -0
- package/server/utils/time.ts +34 -0
- package/server/utils/types.ts +47 -0
- package/server/workspace/chat-index/index.ts +153 -0
- package/server/workspace/chat-index/indexer.ts +209 -0
- package/server/workspace/chat-index/paths.ts +34 -0
- package/server/workspace/chat-index/summarizer.ts +247 -0
- package/server/workspace/chat-index/types.ts +38 -0
- package/server/workspace/custom-dirs.ts +220 -0
- package/server/workspace/helps/business.md +104 -0
- package/server/workspace/helps/github.md +23 -0
- package/server/workspace/helps/index.md +60 -0
- package/server/workspace/helps/mulmoscript.md +249 -0
- package/server/workspace/helps/sandbox.md +90 -0
- package/server/workspace/helps/spreadsheet.md +43 -0
- package/server/workspace/helps/telegram.md +135 -0
- package/server/workspace/helps/wiki.md +131 -0
- package/server/workspace/journal/archivist.ts +386 -0
- package/server/workspace/journal/dailyPass.ts +743 -0
- package/server/workspace/journal/diff.ts +71 -0
- package/server/workspace/journal/index.ts +185 -0
- package/server/workspace/journal/indexFile.ts +136 -0
- package/server/workspace/journal/linkRewrite.ts +4 -0
- package/server/workspace/journal/memoryExtractor.ts +130 -0
- package/server/workspace/journal/optimizationPass.ts +160 -0
- package/server/workspace/journal/paths.ts +76 -0
- package/server/workspace/journal/state.ts +125 -0
- package/server/workspace/paths.ts +158 -0
- package/server/workspace/reference-dirs.ts +252 -0
- package/server/workspace/roles.ts +37 -0
- package/server/workspace/skills/discovery.ts +125 -0
- package/server/workspace/skills/index.ts +10 -0
- package/server/workspace/skills/parser.ts +144 -0
- package/server/workspace/skills/paths.ts +41 -0
- package/server/workspace/skills/scheduler.ts +149 -0
- package/server/workspace/skills/types.ts +30 -0
- package/server/workspace/skills/user-tasks.ts +257 -0
- package/server/workspace/skills/writer.ts +189 -0
- package/server/workspace/sources/arxivDiscovery.ts +182 -0
- package/server/workspace/sources/classifier.ts +268 -0
- package/server/workspace/sources/fetchers/arxiv.ts +170 -0
- package/server/workspace/sources/fetchers/github.ts +106 -0
- package/server/workspace/sources/fetchers/githubIssues.ts +208 -0
- package/server/workspace/sources/fetchers/githubReleases.ts +186 -0
- package/server/workspace/sources/fetchers/index.ts +71 -0
- package/server/workspace/sources/fetchers/registerAll.ts +15 -0
- package/server/workspace/sources/fetchers/rss.ts +141 -0
- package/server/workspace/sources/fetchers/rssParser.ts +295 -0
- package/server/workspace/sources/httpFetcher.ts +230 -0
- package/server/workspace/sources/interests.ts +120 -0
- package/server/workspace/sources/paths.ts +110 -0
- package/server/workspace/sources/pipeline/dedup.ts +60 -0
- package/server/workspace/sources/pipeline/fetch.ts +136 -0
- package/server/workspace/sources/pipeline/index.ts +249 -0
- package/server/workspace/sources/pipeline/notify.ts +72 -0
- package/server/workspace/sources/pipeline/plan.ts +66 -0
- package/server/workspace/sources/pipeline/summarize.ts +189 -0
- package/server/workspace/sources/pipeline/write.ts +185 -0
- package/server/workspace/sources/rateLimiter.ts +148 -0
- package/server/workspace/sources/registry.ts +326 -0
- package/server/workspace/sources/robots.ts +271 -0
- package/server/workspace/sources/sourceState.ts +135 -0
- package/server/workspace/sources/taxonomy.ts +74 -0
- package/server/workspace/sources/types.ts +144 -0
- package/server/workspace/sources/urls.ts +112 -0
- package/server/workspace/tool-trace/classify.ts +114 -0
- package/server/workspace/tool-trace/index.ts +250 -0
- package/server/workspace/tool-trace/writeSearch.ts +98 -0
- package/server/workspace/wiki-backlinks/index.ts +107 -0
- package/server/workspace/wiki-backlinks/sessionBacklinks.ts +144 -0
- package/server/workspace/workspace.ts +66 -0
- package/src/App.vue +720 -0
- package/src/assets/mulmo_bw.png +0 -0
- package/src/components/CanvasViewToggle.vue +27 -0
- package/src/components/ChatAttachmentPreview.vue +45 -0
- package/src/components/ChatImagePreview.vue +17 -0
- package/src/components/ChatInput.vue +208 -0
- package/src/components/FileContentHeader.vue +49 -0
- package/src/components/FileContentRenderer.vue +162 -0
- package/src/components/FileTree.vue +115 -0
- package/src/components/FileTreePane.vue +85 -0
- package/src/components/FilesView.vue +206 -0
- package/src/components/LockStatusPopup.vue +111 -0
- package/src/components/NotificationBell.vue +131 -0
- package/src/components/NotificationToast.vue +72 -0
- package/src/components/PluginLauncher.vue +138 -0
- package/src/components/RightSidebar.vue +113 -0
- package/src/components/RoleSelector.vue +64 -0
- package/src/components/SessionHistoryPanel.vue +176 -0
- package/src/components/SessionTabBar.vue +81 -0
- package/src/components/SettingsMcpTab.vue +350 -0
- package/src/components/SettingsModal.vue +275 -0
- package/src/components/SettingsReferenceDirsTab.vue +173 -0
- package/src/components/SettingsWorkspaceDirsTab.vue +174 -0
- package/src/components/SidebarHeader.vue +69 -0
- package/src/components/StackView.vue +360 -0
- package/src/components/SuggestionsPanel.vue +65 -0
- package/src/components/TodoExplorer.vue +358 -0
- package/src/components/ToolResultsPanel.vue +77 -0
- package/src/components/todo/TodoAddDialog.vue +131 -0
- package/src/components/todo/TodoEditDialog.vue +47 -0
- package/src/components/todo/TodoEditPanel.vue +113 -0
- package/src/components/todo/TodoKanbanView.vue +249 -0
- package/src/components/todo/TodoListView.vue +79 -0
- package/src/components/todo/TodoTableView.vue +177 -0
- package/src/composables/useActiveSession.ts +40 -0
- package/src/composables/useAppApi.ts +45 -0
- package/src/composables/useCanvasViewMode.ts +121 -0
- package/src/composables/useChatScroll.ts +47 -0
- package/src/composables/useClickOutside.ts +26 -0
- package/src/composables/useClipboardCopy.ts +44 -0
- package/src/composables/useContentDisplay.ts +52 -0
- package/src/composables/useDebugBeat.ts +23 -0
- package/src/composables/useDynamicFavicon.ts +115 -0
- package/src/composables/useEventListeners.ts +42 -0
- package/src/composables/useExpandedDirs.ts +64 -0
- package/src/composables/useFaviconState.ts +30 -0
- package/src/composables/useFileSelection.ts +115 -0
- package/src/composables/useFileSortMode.ts +24 -0
- package/src/composables/useFileTree.ts +85 -0
- package/src/composables/useFreshPluginData.ts +89 -0
- package/src/composables/useHealth.ts +38 -0
- package/src/composables/useImeAwareEnter.ts +57 -0
- package/src/composables/useKeyNavigation.ts +60 -0
- package/src/composables/useMarkdownLinkHandler.ts +46 -0
- package/src/composables/useMarkdownMode.ts +17 -0
- package/src/composables/useMcpTools.ts +71 -0
- package/src/composables/useMergedSessions.ts +27 -0
- package/src/composables/useNotifications.ts +90 -0
- package/src/composables/usePdfDownload.ts +60 -0
- package/src/composables/usePendingCalls.ts +77 -0
- package/src/composables/usePubSub.ts +85 -0
- package/src/composables/useRightSidebar.ts +23 -0
- package/src/composables/useRoles.ts +34 -0
- package/src/composables/useSandboxStatus.ts +67 -0
- package/src/composables/useSelectedResult.ts +49 -0
- package/src/composables/useSessionDerived.ts +51 -0
- package/src/composables/useSessionHistory.ts +81 -0
- package/src/composables/useSessionSync.ts +57 -0
- package/src/composables/useViewLayout.ts +55 -0
- package/src/config/apiRoutes.ts +173 -0
- package/src/config/pubsubChannels.ts +45 -0
- package/src/config/roles.ts +335 -0
- package/src/config/schedulerActions.ts +25 -0
- package/src/config/toolNames.ts +71 -0
- package/src/config/workspacePaths.ts +24 -0
- package/src/index.css +107 -0
- package/src/main.ts +25 -0
- package/src/plugins/canvas/Preview.vue +13 -0
- package/src/plugins/canvas/View.vue +333 -0
- package/src/plugins/canvas/definition.ts +38 -0
- package/src/plugins/canvas/index.ts +36 -0
- package/src/plugins/chart/Preview.vue +49 -0
- package/src/plugins/chart/View.vue +143 -0
- package/src/plugins/chart/definition.ts +58 -0
- package/src/plugins/chart/index.ts +52 -0
- package/src/plugins/editImage/Preview.vue +13 -0
- package/src/plugins/editImage/View.vue +13 -0
- package/src/plugins/editImage/definition.ts +27 -0
- package/src/plugins/editImage/index.ts +36 -0
- package/src/plugins/generateImage/Preview.vue +13 -0
- package/src/plugins/generateImage/View.vue +33 -0
- package/src/plugins/generateImage/definition.ts +32 -0
- package/src/plugins/generateImage/index.ts +56 -0
- package/src/plugins/manageRoles/Preview.vue +49 -0
- package/src/plugins/manageRoles/View.vue +525 -0
- package/src/plugins/manageRoles/definition.ts +43 -0
- package/src/plugins/manageRoles/index.ts +47 -0
- package/src/plugins/manageSkills/Preview.vue +21 -0
- package/src/plugins/manageSkills/View.vue +321 -0
- package/src/plugins/manageSkills/definition.ts +49 -0
- package/src/plugins/manageSkills/index.ts +49 -0
- package/src/plugins/manageSource/Preview.vue +33 -0
- package/src/plugins/manageSource/View.vue +697 -0
- package/src/plugins/manageSource/definition.ts +63 -0
- package/src/plugins/manageSource/index.ts +66 -0
- package/src/plugins/markdown/Preview.vue +77 -0
- package/src/plugins/markdown/View.vue +476 -0
- package/src/plugins/markdown/definition.ts +50 -0
- package/src/plugins/markdown/index.ts +36 -0
- package/src/plugins/presentHtml/Preview.vue +25 -0
- package/src/plugins/presentHtml/View.vue +52 -0
- package/src/plugins/presentHtml/definition.ts +27 -0
- package/src/plugins/presentHtml/helpers.ts +72 -0
- package/src/plugins/presentHtml/index.ts +41 -0
- package/src/plugins/presentMulmoScript/Preview.vue +23 -0
- package/src/plugins/presentMulmoScript/View.vue +1166 -0
- package/src/plugins/presentMulmoScript/definition.ts +95 -0
- package/src/plugins/presentMulmoScript/helpers.ts +162 -0
- package/src/plugins/presentMulmoScript/index.ts +40 -0
- package/src/plugins/scheduler/Preview.vue +67 -0
- package/src/plugins/scheduler/TasksTab.vue +205 -0
- package/src/plugins/scheduler/View.vue +565 -0
- package/src/plugins/scheduler/definition.ts +57 -0
- package/src/plugins/scheduler/index.ts +45 -0
- package/src/plugins/scheduler/viewModes.ts +26 -0
- package/src/plugins/spreadsheet/Preview.vue +29 -0
- package/src/plugins/spreadsheet/View.vue +997 -0
- package/src/plugins/spreadsheet/cellHighlights.ts +79 -0
- package/src/plugins/spreadsheet/definition.ts +121 -0
- package/src/plugins/spreadsheet/engine/calculator.ts +459 -0
- package/src/plugins/spreadsheet/engine/cellBuilder.ts +81 -0
- package/src/plugins/spreadsheet/engine/date-parser.ts +220 -0
- package/src/plugins/spreadsheet/engine/date-utils.ts +56 -0
- package/src/plugins/spreadsheet/engine/engine.ts +176 -0
- package/src/plugins/spreadsheet/engine/evaluator.ts +390 -0
- package/src/plugins/spreadsheet/engine/formatter.ts +172 -0
- package/src/plugins/spreadsheet/engine/formulaRefs.ts +101 -0
- package/src/plugins/spreadsheet/engine/functions/date.ts +299 -0
- package/src/plugins/spreadsheet/engine/functions/financial.ts +387 -0
- package/src/plugins/spreadsheet/engine/functions/index.ts +16 -0
- package/src/plugins/spreadsheet/engine/functions/logical.ts +262 -0
- package/src/plugins/spreadsheet/engine/functions/lookup.ts +400 -0
- package/src/plugins/spreadsheet/engine/functions/mathematical.ts +297 -0
- package/src/plugins/spreadsheet/engine/functions/statistical.ts +338 -0
- package/src/plugins/spreadsheet/engine/functions/text.ts +389 -0
- package/src/plugins/spreadsheet/engine/index.ts +27 -0
- package/src/plugins/spreadsheet/engine/jsonCellLocator.ts +111 -0
- package/src/plugins/spreadsheet/engine/parser.ts +143 -0
- package/src/plugins/spreadsheet/engine/registry.ts +150 -0
- package/src/plugins/spreadsheet/engine/responseDecoder.ts +67 -0
- package/src/plugins/spreadsheet/engine/types.ts +64 -0
- package/src/plugins/spreadsheet/index.ts +36 -0
- package/src/plugins/textResponse/Preview.vue +94 -0
- package/src/plugins/textResponse/View.vue +503 -0
- package/src/plugins/textResponse/definition.ts +34 -0
- package/src/plugins/textResponse/index.ts +27 -0
- package/src/plugins/textResponse/plugin.ts +29 -0
- package/src/plugins/textResponse/samples.ts +97 -0
- package/src/plugins/textResponse/types.ts +11 -0
- package/src/plugins/todo/Preview.vue +63 -0
- package/src/plugins/todo/View.vue +364 -0
- package/src/plugins/todo/composables/useTodos.ts +177 -0
- package/src/plugins/todo/definition.ts +45 -0
- package/src/plugins/todo/index.ts +61 -0
- package/src/plugins/todo/labels.ts +163 -0
- package/src/plugins/todo/priority.ts +98 -0
- package/src/plugins/todo/viewModes.ts +19 -0
- package/src/plugins/ui-image/ImagePreview.vue +23 -0
- package/src/plugins/ui-image/ImageView.vue +34 -0
- package/src/plugins/ui-image/index.ts +3 -0
- package/src/plugins/ui-image/types.ts +4 -0
- package/src/plugins/wiki/Preview.vue +65 -0
- package/src/plugins/wiki/View.vue +342 -0
- package/src/plugins/wiki/definition.ts +25 -0
- package/src/plugins/wiki/helpers.ts +59 -0
- package/src/plugins/wiki/index.ts +52 -0
- package/src/router/guards.ts +61 -0
- package/src/router/index.ts +50 -0
- package/src/tools/index.ts +52 -0
- package/src/tools/types.ts +27 -0
- package/src/types/events.ts +16 -0
- package/src/types/fileTree.ts +13 -0
- package/src/types/notification.ts +67 -0
- package/src/types/session.ts +116 -0
- package/src/types/sse.ts +90 -0
- package/src/types/toolCallHistory.ts +13 -0
- package/src/utils/agent/eventDispatch.ts +74 -0
- package/src/utils/agent/request.ts +55 -0
- package/src/utils/agent/toolCalls.ts +62 -0
- package/src/utils/api.ts +218 -0
- package/src/utils/canvas/viewMode.ts +46 -0
- package/src/utils/dom/authTokenMeta.ts +20 -0
- package/src/utils/dom/clickOutside.ts +11 -0
- package/src/utils/dom/externalLink.ts +57 -0
- package/src/utils/dom/scrollable.ts +24 -0
- package/src/utils/errors.ts +11 -0
- package/src/utils/files/expandedDirs.ts +25 -0
- package/src/utils/files/filename.ts +12 -0
- package/src/utils/files/sortChildren.ts +20 -0
- package/src/utils/filesPreview/schedulerPreview.ts +38 -0
- package/src/utils/filesPreview/todoPreview.ts +40 -0
- package/src/utils/format/date.ts +85 -0
- package/src/utils/format/frontmatter.ts +80 -0
- package/src/utils/format/jsonSyntax.ts +109 -0
- package/src/utils/html/previewCsp.ts +65 -0
- package/src/utils/image/resolve.ts +8 -0
- package/src/utils/image/rewriteMarkdownImageRefs.ts +182 -0
- package/src/utils/markdown/extractFirstH1.ts +39 -0
- package/src/utils/notification/dispatch.ts +22 -0
- package/src/utils/path/relativeLink.ts +130 -0
- package/src/utils/role/icon.ts +20 -0
- package/src/utils/role/merge.ts +10 -0
- package/src/utils/role/plugins.ts +12 -0
- package/src/utils/session/mergeSessions.ts +103 -0
- package/src/utils/session/seedRoleDefault.ts +35 -0
- package/src/utils/session/sessionEntries.ts +121 -0
- package/src/utils/session/sessionFactory.ts +22 -0
- package/src/utils/session/sessionHelpers.ts +99 -0
- package/src/utils/tools/dedup.ts +17 -0
- package/src/utils/tools/mcp.ts +33 -0
- package/src/utils/tools/pendingCalls.ts +16 -0
- package/src/utils/tools/result.ts +40 -0
- package/src/utils/types.ts +44 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { ToolDefinition } from "gui-chat-protocol";
|
|
2
|
+
|
|
3
|
+
export const TOOL_NAME = "presentDocument";
|
|
4
|
+
|
|
5
|
+
export interface MarkdownToolData {
|
|
6
|
+
markdown: string;
|
|
7
|
+
pdfPath?: string;
|
|
8
|
+
filenamePrefix?: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/** True when the `markdown` field is a workspace-relative file path
|
|
12
|
+
* rather than inline content. Covers both the post-#284 canonical
|
|
13
|
+
* path (`artifacts/documents/*.md`) and the legacy `markdowns/*.md`
|
|
14
|
+
* prefix for sessions whose jsonl hasn't been migrated yet. */
|
|
15
|
+
export function isFilePath(value: string): boolean {
|
|
16
|
+
if (!value.endsWith(".md")) return false;
|
|
17
|
+
return value.startsWith("artifacts/documents/") || value.startsWith("markdowns/");
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const toolDefinition: ToolDefinition = {
|
|
21
|
+
type: "function",
|
|
22
|
+
name: TOOL_NAME,
|
|
23
|
+
description: "Display a document in markdown format.",
|
|
24
|
+
prompt:
|
|
25
|
+
`Use the ${TOOL_NAME} tool when the user asks for a document that combines text with embedded images — guides, reports, tutorials, articles, or any structured content with visuals. ` +
|
|
26
|
+
`Prefer this over standalone image generation when the user wants informational content with supporting visuals.\n\n` +
|
|
27
|
+
"Format embedded images as: ",
|
|
28
|
+
parameters: {
|
|
29
|
+
type: "object",
|
|
30
|
+
properties: {
|
|
31
|
+
title: {
|
|
32
|
+
type: "string",
|
|
33
|
+
description: "Title for the document",
|
|
34
|
+
},
|
|
35
|
+
markdown: {
|
|
36
|
+
type: "string",
|
|
37
|
+
description:
|
|
38
|
+
"The markdown content to display. Describe embedded images in the following format: . IMPORTANT: For embedded images, you MUST use the EXACT placeholder path '__too_be_replaced_image_path__'.",
|
|
39
|
+
},
|
|
40
|
+
filenamePrefix: {
|
|
41
|
+
type: "string",
|
|
42
|
+
description:
|
|
43
|
+
"Short English filename prefix (without extension). Use lowercase with hyphens, e.g. 'project-summary'. The server sanitizes the value and appends a random id to prevent collisions.",
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
required: ["title", "markdown", "filenamePrefix"],
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
export default toolDefinition;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { ToolPlugin } from "../../tools/types";
|
|
2
|
+
import type { ToolResult } from "gui-chat-protocol";
|
|
3
|
+
import toolDefinition, { TOOL_NAME } from "./definition";
|
|
4
|
+
import type { MarkdownToolData } from "./definition";
|
|
5
|
+
import View from "./View.vue";
|
|
6
|
+
import Preview from "./Preview.vue";
|
|
7
|
+
import { apiPost } from "../../utils/api";
|
|
8
|
+
import { API_ROUTES } from "../../config/apiRoutes";
|
|
9
|
+
|
|
10
|
+
const markdownPlugin: ToolPlugin<MarkdownToolData> = {
|
|
11
|
+
toolDefinition,
|
|
12
|
+
|
|
13
|
+
async execute(_context, args) {
|
|
14
|
+
const result = await apiPost<ToolResult<MarkdownToolData>>(API_ROUTES.plugins.presentDocument, args);
|
|
15
|
+
if (!result.ok) {
|
|
16
|
+
return {
|
|
17
|
+
toolName: TOOL_NAME,
|
|
18
|
+
uuid: crypto.randomUUID(),
|
|
19
|
+
message: result.error,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
return {
|
|
23
|
+
...result.data,
|
|
24
|
+
toolName: TOOL_NAME,
|
|
25
|
+
uuid: crypto.randomUUID(),
|
|
26
|
+
};
|
|
27
|
+
},
|
|
28
|
+
|
|
29
|
+
isEnabled: () => true,
|
|
30
|
+
generatingMessage: "Creating document...",
|
|
31
|
+
viewComponent: View,
|
|
32
|
+
previewComponent: Preview,
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
export default markdownPlugin;
|
|
36
|
+
export { TOOL_NAME };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="text-sm">
|
|
3
|
+
<div class="font-medium text-gray-700 truncate mb-1">
|
|
4
|
+
{{ title }}
|
|
5
|
+
</div>
|
|
6
|
+
<div v-if="hint" class="text-xs text-gray-500 leading-relaxed truncate">
|
|
7
|
+
{{ hint }}
|
|
8
|
+
</div>
|
|
9
|
+
</div>
|
|
10
|
+
</template>
|
|
11
|
+
|
|
12
|
+
<script setup lang="ts">
|
|
13
|
+
import { computed } from "vue";
|
|
14
|
+
import type { ToolResultComplete } from "gui-chat-protocol/vue";
|
|
15
|
+
import type { PresentHtmlData } from "./index";
|
|
16
|
+
import { stripHtmlToPreview } from "./helpers";
|
|
17
|
+
|
|
18
|
+
const HINT_MAX_LENGTH = 60;
|
|
19
|
+
|
|
20
|
+
const props = defineProps<{ result: ToolResultComplete<PresentHtmlData> }>();
|
|
21
|
+
|
|
22
|
+
const data = computed(() => props.result.data);
|
|
23
|
+
const title = computed(() => data.value?.title ?? "HTML Page");
|
|
24
|
+
const hint = computed(() => stripHtmlToPreview(data.value?.html ?? "", HINT_MAX_LENGTH));
|
|
25
|
+
</script>
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="h-full flex flex-col overflow-hidden">
|
|
3
|
+
<div class="px-4 py-2 border-b border-gray-100 shrink-0 flex items-center justify-between">
|
|
4
|
+
<span class="text-sm font-medium text-gray-700 truncate">{{ title ?? "HTML Page" }}</span>
|
|
5
|
+
<div class="flex items-center gap-2">
|
|
6
|
+
<button
|
|
7
|
+
class="px-2 py-1 text-xs rounded border border-gray-300 text-gray-500 hover:bg-gray-50 shrink-0"
|
|
8
|
+
title="Save as PDF (opens print dialog)"
|
|
9
|
+
@click="printToPdf"
|
|
10
|
+
>
|
|
11
|
+
<span class="material-icons text-sm align-middle">picture_as_pdf</span>
|
|
12
|
+
PDF
|
|
13
|
+
</button>
|
|
14
|
+
<button class="px-2 py-1 text-xs rounded border border-gray-300 text-gray-500 hover:bg-gray-50 shrink-0" @click="sourceOpen = !sourceOpen">
|
|
15
|
+
{{ sourceOpen ? "Hide Source <>" : "Show Source <>" }}
|
|
16
|
+
</button>
|
|
17
|
+
</div>
|
|
18
|
+
</div>
|
|
19
|
+
<div v-if="sourceOpen" class="border-b border-gray-100 shrink-0">
|
|
20
|
+
<textarea :value="html" readonly class="w-full text-xs text-gray-600 bg-gray-50 p-3 font-mono resize-none outline-none" rows="16" />
|
|
21
|
+
</div>
|
|
22
|
+
<iframe ref="iframeRef" :srcdoc="html" sandbox="allow-scripts allow-same-origin allow-modals" class="flex-1 w-full border-0" />
|
|
23
|
+
</div>
|
|
24
|
+
</template>
|
|
25
|
+
|
|
26
|
+
<script setup lang="ts">
|
|
27
|
+
import { computed, ref } from "vue";
|
|
28
|
+
import type { ToolResultComplete } from "gui-chat-protocol/vue";
|
|
29
|
+
import type { PresentHtmlData } from "./index";
|
|
30
|
+
|
|
31
|
+
const props = defineProps<{
|
|
32
|
+
selectedResult: ToolResultComplete<PresentHtmlData>;
|
|
33
|
+
}>();
|
|
34
|
+
|
|
35
|
+
const PRINT_STYLE = `<style>@media print {
|
|
36
|
+
* { -webkit-print-color-adjust: exact !important; print-color-adjust: exact !important; }
|
|
37
|
+
body { width: 100% !important; margin: 0 !important; padding: 8px !important; }
|
|
38
|
+
@page { margin: 10mm; }
|
|
39
|
+
}</style>`;
|
|
40
|
+
|
|
41
|
+
const data = computed(() => props.selectedResult.data);
|
|
42
|
+
const rawHtml = computed(() => data.value?.html ?? "");
|
|
43
|
+
const html = computed(() => (rawHtml.value.includes("</head>") ? rawHtml.value.replace("</head>", `${PRINT_STYLE}</head>`) : `${PRINT_STYLE}${rawHtml.value}`));
|
|
44
|
+
const title = computed(() => data.value?.title);
|
|
45
|
+
|
|
46
|
+
const sourceOpen = ref(false);
|
|
47
|
+
const iframeRef = ref<HTMLIFrameElement | null>(null);
|
|
48
|
+
|
|
49
|
+
function printToPdf() {
|
|
50
|
+
iframeRef.value?.contentWindow?.print();
|
|
51
|
+
}
|
|
52
|
+
</script>
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { ToolDefinition } from "gui-chat-protocol";
|
|
2
|
+
|
|
3
|
+
export const TOOL_NAME = "presentHtml";
|
|
4
|
+
|
|
5
|
+
const toolDefinition: ToolDefinition = {
|
|
6
|
+
type: "function",
|
|
7
|
+
name: TOOL_NAME,
|
|
8
|
+
description:
|
|
9
|
+
"Save and present a complete, self-contained HTML page in the canvas. Claude generates the HTML and calls this tool to display it. Use for rich interactive output, dashboards, custom layouts, or any content best expressed as HTML.",
|
|
10
|
+
parameters: {
|
|
11
|
+
type: "object",
|
|
12
|
+
properties: {
|
|
13
|
+
html: {
|
|
14
|
+
type: "string",
|
|
15
|
+
description:
|
|
16
|
+
"Complete, self-contained HTML string. All CSS and JavaScript must be inline or loaded via CDN. Must be a full document (include <!DOCTYPE html> and <html>/<body> tags).",
|
|
17
|
+
},
|
|
18
|
+
title: {
|
|
19
|
+
type: "string",
|
|
20
|
+
description: "Short label shown in the preview sidebar.",
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
required: ["html"],
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export default toolDefinition;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// Pure helpers for presentHtml/Preview.vue. Replaces the former
|
|
2
|
+
// `/<[^>]*>/g` + `/\s+/g` regex pair — both flagged by
|
|
3
|
+
// `sonarjs/slow-regex` for backtracking risk — with a single
|
|
4
|
+
// linear walker that produces the exact same output.
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Produce a short plain-text preview from an HTML fragment:
|
|
8
|
+
*
|
|
9
|
+
* - every `<...>` span (a `<` with a later `>`) is replaced by a
|
|
10
|
+
* single space
|
|
11
|
+
* - a bare `<` with no matching `>` is kept as a literal character
|
|
12
|
+
* (matches the old regex, which required both brackets to match)
|
|
13
|
+
* - runs of whitespace are collapsed to one space
|
|
14
|
+
* - the result is trimmed and truncated to `maxLength` characters
|
|
15
|
+
*
|
|
16
|
+
* The walker is O(n) in the input length and does no regex
|
|
17
|
+
* backtracking.
|
|
18
|
+
*/
|
|
19
|
+
export function stripHtmlToPreview(html: string, maxLength: number): string {
|
|
20
|
+
const state: WalkerState = {
|
|
21
|
+
out: [],
|
|
22
|
+
// Start as if we just emitted a space so leading whitespace
|
|
23
|
+
// and a leading tag both get trimmed without a separate pass.
|
|
24
|
+
lastWasSpace: true,
|
|
25
|
+
};
|
|
26
|
+
let i = 0;
|
|
27
|
+
while (i < html.length) {
|
|
28
|
+
const c = html[i];
|
|
29
|
+
if (c === "<") {
|
|
30
|
+
const close = html.indexOf(">", i + 1);
|
|
31
|
+
if (close !== -1) {
|
|
32
|
+
// Real tag span `<...>` — skip it, emit a separator.
|
|
33
|
+
emitSeparator(state);
|
|
34
|
+
i = close + 1;
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
// No closing `>` anywhere after — treat as literal.
|
|
38
|
+
}
|
|
39
|
+
emitChar(state, c);
|
|
40
|
+
i++;
|
|
41
|
+
}
|
|
42
|
+
trimTrailingSpace(state.out);
|
|
43
|
+
return state.out.join("").slice(0, maxLength);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
interface WalkerState {
|
|
47
|
+
out: string[];
|
|
48
|
+
lastWasSpace: boolean;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function emitChar(state: WalkerState, c: string): void {
|
|
52
|
+
if (isWhitespace(c)) {
|
|
53
|
+
emitSeparator(state);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
state.out.push(c);
|
|
57
|
+
state.lastWasSpace = false;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function emitSeparator(state: WalkerState): void {
|
|
61
|
+
if (state.lastWasSpace) return;
|
|
62
|
+
state.out.push(" ");
|
|
63
|
+
state.lastWasSpace = true;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function trimTrailingSpace(out: string[]): void {
|
|
67
|
+
if (out.length > 0 && out[out.length - 1] === " ") out.pop();
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function isWhitespace(c: string): boolean {
|
|
71
|
+
return c === " " || c === "\t" || c === "\n" || c === "\r" || c === "\v" || c === "\f";
|
|
72
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { ToolPlugin } from "../../tools/types";
|
|
2
|
+
import type { ToolResult } from "gui-chat-protocol";
|
|
3
|
+
import toolDefinition, { TOOL_NAME } from "./definition";
|
|
4
|
+
import View from "./View.vue";
|
|
5
|
+
import Preview from "./Preview.vue";
|
|
6
|
+
import { apiPost } from "../../utils/api";
|
|
7
|
+
import { API_ROUTES } from "../../config/apiRoutes";
|
|
8
|
+
|
|
9
|
+
export interface PresentHtmlData {
|
|
10
|
+
html: string;
|
|
11
|
+
title?: string;
|
|
12
|
+
filePath: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const presentHtmlPlugin: ToolPlugin<PresentHtmlData> = {
|
|
16
|
+
toolDefinition,
|
|
17
|
+
|
|
18
|
+
async execute(_context, args) {
|
|
19
|
+
const result = await apiPost<ToolResult<PresentHtmlData>>(API_ROUTES.html.present, args);
|
|
20
|
+
if (!result.ok) {
|
|
21
|
+
return {
|
|
22
|
+
toolName: TOOL_NAME,
|
|
23
|
+
uuid: crypto.randomUUID(),
|
|
24
|
+
message: result.error,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
...result.data,
|
|
29
|
+
toolName: TOOL_NAME,
|
|
30
|
+
uuid: crypto.randomUUID(),
|
|
31
|
+
};
|
|
32
|
+
},
|
|
33
|
+
|
|
34
|
+
isEnabled: () => true,
|
|
35
|
+
generatingMessage: "Presenting HTML page…",
|
|
36
|
+
viewComponent: View,
|
|
37
|
+
previewComponent: Preview,
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
export default presentHtmlPlugin;
|
|
41
|
+
export { TOOL_NAME };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="text-sm">
|
|
3
|
+
<div class="font-medium text-gray-700 truncate mb-1">
|
|
4
|
+
{{ title }}
|
|
5
|
+
</div>
|
|
6
|
+
<div v-if="description" class="text-xs text-gray-500 leading-relaxed">
|
|
7
|
+
{{ description }}
|
|
8
|
+
</div>
|
|
9
|
+
</div>
|
|
10
|
+
</template>
|
|
11
|
+
|
|
12
|
+
<script setup lang="ts">
|
|
13
|
+
import { computed } from "vue";
|
|
14
|
+
import type { ToolResultComplete } from "gui-chat-protocol/vue";
|
|
15
|
+
import type { MulmoScriptData } from "./index";
|
|
16
|
+
|
|
17
|
+
const props = defineProps<{ result: ToolResultComplete<MulmoScriptData> }>();
|
|
18
|
+
|
|
19
|
+
const data = computed(() => props.result.data);
|
|
20
|
+
const script = computed(() => data.value?.script);
|
|
21
|
+
const title = computed(() => script.value?.title || data.value?.filePath?.split("/").pop() || "MulmoScript");
|
|
22
|
+
const description = computed(() => script.value?.description);
|
|
23
|
+
</script>
|