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.
Files changed (408) hide show
  1. package/README.md +44 -0
  2. package/bin/mulmoclaude.js +202 -0
  3. package/bin/prepare-dist.js +93 -0
  4. package/client/assets/chunk-vKJrgz-R-C_I3GbVV.js +1 -0
  5. package/client/assets/html2canvas-Cx501zZr-BF5dYYkY.js +5 -0
  6. package/client/assets/index-D8rhwXLq.js +4906 -0
  7. package/client/assets/index-KNLBjwuh.css +1 -0
  8. package/client/assets/index.es-D4YyL_Dg-BfRHLTZV.js +5 -0
  9. package/client/assets/material-icons-Dr0goTwe.woff +0 -0
  10. package/client/assets/material-icons-kAwBdRge.woff2 +0 -0
  11. package/client/assets/material-icons-outlined-BpWbwl2n.woff +0 -0
  12. package/client/assets/material-icons-outlined-DZhiGvEA.woff2 +0 -0
  13. package/client/assets/material-icons-round-BDlwx-sv.woff +0 -0
  14. package/client/assets/material-icons-round-DrirKXBx.woff2 +0 -0
  15. package/client/assets/material-icons-sharp-CH1KkVu7.woff +0 -0
  16. package/client/assets/material-icons-sharp-gidztirS.woff2 +0 -0
  17. package/client/assets/material-icons-two-tone-B7wz7mED.woff +0 -0
  18. package/client/assets/material-icons-two-tone-DuNIpaEj.woff2 +0 -0
  19. package/client/assets/mulmo_bw-ERmkSv0a.png +0 -0
  20. package/client/assets/purify.es-Fx1Nqyry-PeS5RUhs.js +2 -0
  21. package/client/assets/typeof-DBp4T-Ny-BC0P-2DM.js +1 -0
  22. package/client/index.html +28 -0
  23. package/package.json +66 -0
  24. package/server/agent/attachmentConverter.ts +270 -0
  25. package/server/agent/config.ts +414 -0
  26. package/server/agent/index.ts +260 -0
  27. package/server/agent/mcp-server.ts +412 -0
  28. package/server/agent/mcp-tools/index.ts +63 -0
  29. package/server/agent/mcp-tools/x.ts +188 -0
  30. package/server/agent/plugin-names.ts +75 -0
  31. package/server/agent/prompt.ts +349 -0
  32. package/server/agent/resumeFailover.ts +129 -0
  33. package/server/agent/sandboxMounts.ts +329 -0
  34. package/server/agent/stream.ts +194 -0
  35. package/server/api/auth/bearerAuth.ts +61 -0
  36. package/server/api/auth/token.ts +98 -0
  37. package/server/api/csrfGuard.ts +85 -0
  38. package/server/api/routes/agent.ts +478 -0
  39. package/server/api/routes/chart.ts +98 -0
  40. package/server/api/routes/chat-index.ts +46 -0
  41. package/server/api/routes/config.ts +258 -0
  42. package/server/api/routes/dispatchResponse.ts +79 -0
  43. package/server/api/routes/files.ts +812 -0
  44. package/server/api/routes/html.ts +101 -0
  45. package/server/api/routes/image.ts +169 -0
  46. package/server/api/routes/mulmo-script.ts +712 -0
  47. package/server/api/routes/mulmoScriptValidate.ts +101 -0
  48. package/server/api/routes/notifications.ts +69 -0
  49. package/server/api/routes/pdf.ts +163 -0
  50. package/server/api/routes/plugins.ts +276 -0
  51. package/server/api/routes/presentHtml.ts +48 -0
  52. package/server/api/routes/roles.ts +125 -0
  53. package/server/api/routes/scheduler.ts +153 -0
  54. package/server/api/routes/schedulerHandlers.ts +151 -0
  55. package/server/api/routes/schedulerTasks.ts +163 -0
  56. package/server/api/routes/sessions.ts +294 -0
  57. package/server/api/routes/sessionsCursor.ts +59 -0
  58. package/server/api/routes/skills.ts +195 -0
  59. package/server/api/routes/sources.ts +540 -0
  60. package/server/api/routes/todos.ts +263 -0
  61. package/server/api/routes/todosColumnsHandlers.ts +347 -0
  62. package/server/api/routes/todosHandlers.ts +274 -0
  63. package/server/api/routes/todosItemsHandlers.ts +386 -0
  64. package/server/api/routes/wiki/pageIndex.ts +53 -0
  65. package/server/api/routes/wiki.ts +363 -0
  66. package/server/api/sandboxStatus.ts +64 -0
  67. package/server/events/notifications.ts +160 -0
  68. package/server/events/pub-sub/index.ts +45 -0
  69. package/server/events/relay-client.ts +288 -0
  70. package/server/events/scheduler-adapter.ts +302 -0
  71. package/server/events/session-store/index.ts +492 -0
  72. package/server/events/task-manager/index.ts +181 -0
  73. package/server/index.ts +572 -0
  74. package/server/system/config.ts +243 -0
  75. package/server/system/credentials.ts +220 -0
  76. package/server/system/docker.ts +97 -0
  77. package/server/system/env.ts +109 -0
  78. package/server/system/logger/config.ts +112 -0
  79. package/server/system/logger/formatters.ts +40 -0
  80. package/server/system/logger/index.ts +53 -0
  81. package/server/system/logger/rotation.ts +37 -0
  82. package/server/system/logger/sinks.ts +101 -0
  83. package/server/system/logger/types.ts +29 -0
  84. package/server/utils/date.ts +57 -0
  85. package/server/utils/errors.ts +7 -0
  86. package/server/utils/fetch.ts +27 -0
  87. package/server/utils/files/atomic.ts +125 -0
  88. package/server/utils/files/html-io.ts +20 -0
  89. package/server/utils/files/image-store.ts +66 -0
  90. package/server/utils/files/index.ts +45 -0
  91. package/server/utils/files/journal-io.ts +213 -0
  92. package/server/utils/files/json.ts +69 -0
  93. package/server/utils/files/markdown-store.ts +33 -0
  94. package/server/utils/files/naming.ts +50 -0
  95. package/server/utils/files/reference-dirs-io.ts +45 -0
  96. package/server/utils/files/roles-io.ts +45 -0
  97. package/server/utils/files/safe.ts +106 -0
  98. package/server/utils/files/scheduler-io.ts +20 -0
  99. package/server/utils/files/scheduler-overrides-io.ts +64 -0
  100. package/server/utils/files/session-io.ts +136 -0
  101. package/server/utils/files/spreadsheet-store.ts +63 -0
  102. package/server/utils/files/todos-io.ts +29 -0
  103. package/server/utils/files/user-tasks-io.ts +25 -0
  104. package/server/utils/files/workspace-io.ts +221 -0
  105. package/server/utils/gemini.ts +59 -0
  106. package/server/utils/gitignore.ts +69 -0
  107. package/server/utils/http.ts +15 -0
  108. package/server/utils/httpError.ts +61 -0
  109. package/server/utils/id.ts +16 -0
  110. package/server/utils/json.ts +83 -0
  111. package/server/utils/logBackgroundError.ts +22 -0
  112. package/server/utils/markdown.ts +82 -0
  113. package/server/utils/request.ts +29 -0
  114. package/server/utils/slug.ts +50 -0
  115. package/server/utils/spawn.ts +62 -0
  116. package/server/utils/time.ts +34 -0
  117. package/server/utils/types.ts +47 -0
  118. package/server/workspace/chat-index/index.ts +153 -0
  119. package/server/workspace/chat-index/indexer.ts +209 -0
  120. package/server/workspace/chat-index/paths.ts +34 -0
  121. package/server/workspace/chat-index/summarizer.ts +247 -0
  122. package/server/workspace/chat-index/types.ts +38 -0
  123. package/server/workspace/custom-dirs.ts +220 -0
  124. package/server/workspace/helps/business.md +104 -0
  125. package/server/workspace/helps/github.md +23 -0
  126. package/server/workspace/helps/index.md +60 -0
  127. package/server/workspace/helps/mulmoscript.md +249 -0
  128. package/server/workspace/helps/sandbox.md +90 -0
  129. package/server/workspace/helps/spreadsheet.md +43 -0
  130. package/server/workspace/helps/telegram.md +135 -0
  131. package/server/workspace/helps/wiki.md +131 -0
  132. package/server/workspace/journal/archivist.ts +386 -0
  133. package/server/workspace/journal/dailyPass.ts +743 -0
  134. package/server/workspace/journal/diff.ts +71 -0
  135. package/server/workspace/journal/index.ts +185 -0
  136. package/server/workspace/journal/indexFile.ts +136 -0
  137. package/server/workspace/journal/linkRewrite.ts +4 -0
  138. package/server/workspace/journal/memoryExtractor.ts +130 -0
  139. package/server/workspace/journal/optimizationPass.ts +160 -0
  140. package/server/workspace/journal/paths.ts +76 -0
  141. package/server/workspace/journal/state.ts +125 -0
  142. package/server/workspace/paths.ts +158 -0
  143. package/server/workspace/reference-dirs.ts +252 -0
  144. package/server/workspace/roles.ts +37 -0
  145. package/server/workspace/skills/discovery.ts +125 -0
  146. package/server/workspace/skills/index.ts +10 -0
  147. package/server/workspace/skills/parser.ts +144 -0
  148. package/server/workspace/skills/paths.ts +41 -0
  149. package/server/workspace/skills/scheduler.ts +149 -0
  150. package/server/workspace/skills/types.ts +30 -0
  151. package/server/workspace/skills/user-tasks.ts +257 -0
  152. package/server/workspace/skills/writer.ts +189 -0
  153. package/server/workspace/sources/arxivDiscovery.ts +182 -0
  154. package/server/workspace/sources/classifier.ts +268 -0
  155. package/server/workspace/sources/fetchers/arxiv.ts +170 -0
  156. package/server/workspace/sources/fetchers/github.ts +106 -0
  157. package/server/workspace/sources/fetchers/githubIssues.ts +208 -0
  158. package/server/workspace/sources/fetchers/githubReleases.ts +186 -0
  159. package/server/workspace/sources/fetchers/index.ts +71 -0
  160. package/server/workspace/sources/fetchers/registerAll.ts +15 -0
  161. package/server/workspace/sources/fetchers/rss.ts +141 -0
  162. package/server/workspace/sources/fetchers/rssParser.ts +295 -0
  163. package/server/workspace/sources/httpFetcher.ts +230 -0
  164. package/server/workspace/sources/interests.ts +120 -0
  165. package/server/workspace/sources/paths.ts +110 -0
  166. package/server/workspace/sources/pipeline/dedup.ts +60 -0
  167. package/server/workspace/sources/pipeline/fetch.ts +136 -0
  168. package/server/workspace/sources/pipeline/index.ts +249 -0
  169. package/server/workspace/sources/pipeline/notify.ts +72 -0
  170. package/server/workspace/sources/pipeline/plan.ts +66 -0
  171. package/server/workspace/sources/pipeline/summarize.ts +189 -0
  172. package/server/workspace/sources/pipeline/write.ts +185 -0
  173. package/server/workspace/sources/rateLimiter.ts +148 -0
  174. package/server/workspace/sources/registry.ts +326 -0
  175. package/server/workspace/sources/robots.ts +271 -0
  176. package/server/workspace/sources/sourceState.ts +135 -0
  177. package/server/workspace/sources/taxonomy.ts +74 -0
  178. package/server/workspace/sources/types.ts +144 -0
  179. package/server/workspace/sources/urls.ts +112 -0
  180. package/server/workspace/tool-trace/classify.ts +114 -0
  181. package/server/workspace/tool-trace/index.ts +250 -0
  182. package/server/workspace/tool-trace/writeSearch.ts +98 -0
  183. package/server/workspace/wiki-backlinks/index.ts +107 -0
  184. package/server/workspace/wiki-backlinks/sessionBacklinks.ts +144 -0
  185. package/server/workspace/workspace.ts +66 -0
  186. package/src/App.vue +720 -0
  187. package/src/assets/mulmo_bw.png +0 -0
  188. package/src/components/CanvasViewToggle.vue +27 -0
  189. package/src/components/ChatAttachmentPreview.vue +45 -0
  190. package/src/components/ChatImagePreview.vue +17 -0
  191. package/src/components/ChatInput.vue +208 -0
  192. package/src/components/FileContentHeader.vue +49 -0
  193. package/src/components/FileContentRenderer.vue +162 -0
  194. package/src/components/FileTree.vue +115 -0
  195. package/src/components/FileTreePane.vue +85 -0
  196. package/src/components/FilesView.vue +206 -0
  197. package/src/components/LockStatusPopup.vue +111 -0
  198. package/src/components/NotificationBell.vue +131 -0
  199. package/src/components/NotificationToast.vue +72 -0
  200. package/src/components/PluginLauncher.vue +138 -0
  201. package/src/components/RightSidebar.vue +113 -0
  202. package/src/components/RoleSelector.vue +64 -0
  203. package/src/components/SessionHistoryPanel.vue +176 -0
  204. package/src/components/SessionTabBar.vue +81 -0
  205. package/src/components/SettingsMcpTab.vue +350 -0
  206. package/src/components/SettingsModal.vue +275 -0
  207. package/src/components/SettingsReferenceDirsTab.vue +173 -0
  208. package/src/components/SettingsWorkspaceDirsTab.vue +174 -0
  209. package/src/components/SidebarHeader.vue +69 -0
  210. package/src/components/StackView.vue +360 -0
  211. package/src/components/SuggestionsPanel.vue +65 -0
  212. package/src/components/TodoExplorer.vue +358 -0
  213. package/src/components/ToolResultsPanel.vue +77 -0
  214. package/src/components/todo/TodoAddDialog.vue +131 -0
  215. package/src/components/todo/TodoEditDialog.vue +47 -0
  216. package/src/components/todo/TodoEditPanel.vue +113 -0
  217. package/src/components/todo/TodoKanbanView.vue +249 -0
  218. package/src/components/todo/TodoListView.vue +79 -0
  219. package/src/components/todo/TodoTableView.vue +177 -0
  220. package/src/composables/useActiveSession.ts +40 -0
  221. package/src/composables/useAppApi.ts +45 -0
  222. package/src/composables/useCanvasViewMode.ts +121 -0
  223. package/src/composables/useChatScroll.ts +47 -0
  224. package/src/composables/useClickOutside.ts +26 -0
  225. package/src/composables/useClipboardCopy.ts +44 -0
  226. package/src/composables/useContentDisplay.ts +52 -0
  227. package/src/composables/useDebugBeat.ts +23 -0
  228. package/src/composables/useDynamicFavicon.ts +115 -0
  229. package/src/composables/useEventListeners.ts +42 -0
  230. package/src/composables/useExpandedDirs.ts +64 -0
  231. package/src/composables/useFaviconState.ts +30 -0
  232. package/src/composables/useFileSelection.ts +115 -0
  233. package/src/composables/useFileSortMode.ts +24 -0
  234. package/src/composables/useFileTree.ts +85 -0
  235. package/src/composables/useFreshPluginData.ts +89 -0
  236. package/src/composables/useHealth.ts +38 -0
  237. package/src/composables/useImeAwareEnter.ts +57 -0
  238. package/src/composables/useKeyNavigation.ts +60 -0
  239. package/src/composables/useMarkdownLinkHandler.ts +46 -0
  240. package/src/composables/useMarkdownMode.ts +17 -0
  241. package/src/composables/useMcpTools.ts +71 -0
  242. package/src/composables/useMergedSessions.ts +27 -0
  243. package/src/composables/useNotifications.ts +90 -0
  244. package/src/composables/usePdfDownload.ts +60 -0
  245. package/src/composables/usePendingCalls.ts +77 -0
  246. package/src/composables/usePubSub.ts +85 -0
  247. package/src/composables/useRightSidebar.ts +23 -0
  248. package/src/composables/useRoles.ts +34 -0
  249. package/src/composables/useSandboxStatus.ts +67 -0
  250. package/src/composables/useSelectedResult.ts +49 -0
  251. package/src/composables/useSessionDerived.ts +51 -0
  252. package/src/composables/useSessionHistory.ts +81 -0
  253. package/src/composables/useSessionSync.ts +57 -0
  254. package/src/composables/useViewLayout.ts +55 -0
  255. package/src/config/apiRoutes.ts +173 -0
  256. package/src/config/pubsubChannels.ts +45 -0
  257. package/src/config/roles.ts +335 -0
  258. package/src/config/schedulerActions.ts +25 -0
  259. package/src/config/toolNames.ts +71 -0
  260. package/src/config/workspacePaths.ts +24 -0
  261. package/src/index.css +107 -0
  262. package/src/main.ts +25 -0
  263. package/src/plugins/canvas/Preview.vue +13 -0
  264. package/src/plugins/canvas/View.vue +333 -0
  265. package/src/plugins/canvas/definition.ts +38 -0
  266. package/src/plugins/canvas/index.ts +36 -0
  267. package/src/plugins/chart/Preview.vue +49 -0
  268. package/src/plugins/chart/View.vue +143 -0
  269. package/src/plugins/chart/definition.ts +58 -0
  270. package/src/plugins/chart/index.ts +52 -0
  271. package/src/plugins/editImage/Preview.vue +13 -0
  272. package/src/plugins/editImage/View.vue +13 -0
  273. package/src/plugins/editImage/definition.ts +27 -0
  274. package/src/plugins/editImage/index.ts +36 -0
  275. package/src/plugins/generateImage/Preview.vue +13 -0
  276. package/src/plugins/generateImage/View.vue +33 -0
  277. package/src/plugins/generateImage/definition.ts +32 -0
  278. package/src/plugins/generateImage/index.ts +56 -0
  279. package/src/plugins/manageRoles/Preview.vue +49 -0
  280. package/src/plugins/manageRoles/View.vue +525 -0
  281. package/src/plugins/manageRoles/definition.ts +43 -0
  282. package/src/plugins/manageRoles/index.ts +47 -0
  283. package/src/plugins/manageSkills/Preview.vue +21 -0
  284. package/src/plugins/manageSkills/View.vue +321 -0
  285. package/src/plugins/manageSkills/definition.ts +49 -0
  286. package/src/plugins/manageSkills/index.ts +49 -0
  287. package/src/plugins/manageSource/Preview.vue +33 -0
  288. package/src/plugins/manageSource/View.vue +697 -0
  289. package/src/plugins/manageSource/definition.ts +63 -0
  290. package/src/plugins/manageSource/index.ts +66 -0
  291. package/src/plugins/markdown/Preview.vue +77 -0
  292. package/src/plugins/markdown/View.vue +476 -0
  293. package/src/plugins/markdown/definition.ts +50 -0
  294. package/src/plugins/markdown/index.ts +36 -0
  295. package/src/plugins/presentHtml/Preview.vue +25 -0
  296. package/src/plugins/presentHtml/View.vue +52 -0
  297. package/src/plugins/presentHtml/definition.ts +27 -0
  298. package/src/plugins/presentHtml/helpers.ts +72 -0
  299. package/src/plugins/presentHtml/index.ts +41 -0
  300. package/src/plugins/presentMulmoScript/Preview.vue +23 -0
  301. package/src/plugins/presentMulmoScript/View.vue +1166 -0
  302. package/src/plugins/presentMulmoScript/definition.ts +95 -0
  303. package/src/plugins/presentMulmoScript/helpers.ts +162 -0
  304. package/src/plugins/presentMulmoScript/index.ts +40 -0
  305. package/src/plugins/scheduler/Preview.vue +67 -0
  306. package/src/plugins/scheduler/TasksTab.vue +205 -0
  307. package/src/plugins/scheduler/View.vue +565 -0
  308. package/src/plugins/scheduler/definition.ts +57 -0
  309. package/src/plugins/scheduler/index.ts +45 -0
  310. package/src/plugins/scheduler/viewModes.ts +26 -0
  311. package/src/plugins/spreadsheet/Preview.vue +29 -0
  312. package/src/plugins/spreadsheet/View.vue +997 -0
  313. package/src/plugins/spreadsheet/cellHighlights.ts +79 -0
  314. package/src/plugins/spreadsheet/definition.ts +121 -0
  315. package/src/plugins/spreadsheet/engine/calculator.ts +459 -0
  316. package/src/plugins/spreadsheet/engine/cellBuilder.ts +81 -0
  317. package/src/plugins/spreadsheet/engine/date-parser.ts +220 -0
  318. package/src/plugins/spreadsheet/engine/date-utils.ts +56 -0
  319. package/src/plugins/spreadsheet/engine/engine.ts +176 -0
  320. package/src/plugins/spreadsheet/engine/evaluator.ts +390 -0
  321. package/src/plugins/spreadsheet/engine/formatter.ts +172 -0
  322. package/src/plugins/spreadsheet/engine/formulaRefs.ts +101 -0
  323. package/src/plugins/spreadsheet/engine/functions/date.ts +299 -0
  324. package/src/plugins/spreadsheet/engine/functions/financial.ts +387 -0
  325. package/src/plugins/spreadsheet/engine/functions/index.ts +16 -0
  326. package/src/plugins/spreadsheet/engine/functions/logical.ts +262 -0
  327. package/src/plugins/spreadsheet/engine/functions/lookup.ts +400 -0
  328. package/src/plugins/spreadsheet/engine/functions/mathematical.ts +297 -0
  329. package/src/plugins/spreadsheet/engine/functions/statistical.ts +338 -0
  330. package/src/plugins/spreadsheet/engine/functions/text.ts +389 -0
  331. package/src/plugins/spreadsheet/engine/index.ts +27 -0
  332. package/src/plugins/spreadsheet/engine/jsonCellLocator.ts +111 -0
  333. package/src/plugins/spreadsheet/engine/parser.ts +143 -0
  334. package/src/plugins/spreadsheet/engine/registry.ts +150 -0
  335. package/src/plugins/spreadsheet/engine/responseDecoder.ts +67 -0
  336. package/src/plugins/spreadsheet/engine/types.ts +64 -0
  337. package/src/plugins/spreadsheet/index.ts +36 -0
  338. package/src/plugins/textResponse/Preview.vue +94 -0
  339. package/src/plugins/textResponse/View.vue +503 -0
  340. package/src/plugins/textResponse/definition.ts +34 -0
  341. package/src/plugins/textResponse/index.ts +27 -0
  342. package/src/plugins/textResponse/plugin.ts +29 -0
  343. package/src/plugins/textResponse/samples.ts +97 -0
  344. package/src/plugins/textResponse/types.ts +11 -0
  345. package/src/plugins/todo/Preview.vue +63 -0
  346. package/src/plugins/todo/View.vue +364 -0
  347. package/src/plugins/todo/composables/useTodos.ts +177 -0
  348. package/src/plugins/todo/definition.ts +45 -0
  349. package/src/plugins/todo/index.ts +61 -0
  350. package/src/plugins/todo/labels.ts +163 -0
  351. package/src/plugins/todo/priority.ts +98 -0
  352. package/src/plugins/todo/viewModes.ts +19 -0
  353. package/src/plugins/ui-image/ImagePreview.vue +23 -0
  354. package/src/plugins/ui-image/ImageView.vue +34 -0
  355. package/src/plugins/ui-image/index.ts +3 -0
  356. package/src/plugins/ui-image/types.ts +4 -0
  357. package/src/plugins/wiki/Preview.vue +65 -0
  358. package/src/plugins/wiki/View.vue +342 -0
  359. package/src/plugins/wiki/definition.ts +25 -0
  360. package/src/plugins/wiki/helpers.ts +59 -0
  361. package/src/plugins/wiki/index.ts +52 -0
  362. package/src/router/guards.ts +61 -0
  363. package/src/router/index.ts +50 -0
  364. package/src/tools/index.ts +52 -0
  365. package/src/tools/types.ts +27 -0
  366. package/src/types/events.ts +16 -0
  367. package/src/types/fileTree.ts +13 -0
  368. package/src/types/notification.ts +67 -0
  369. package/src/types/session.ts +116 -0
  370. package/src/types/sse.ts +90 -0
  371. package/src/types/toolCallHistory.ts +13 -0
  372. package/src/utils/agent/eventDispatch.ts +74 -0
  373. package/src/utils/agent/request.ts +55 -0
  374. package/src/utils/agent/toolCalls.ts +62 -0
  375. package/src/utils/api.ts +218 -0
  376. package/src/utils/canvas/viewMode.ts +46 -0
  377. package/src/utils/dom/authTokenMeta.ts +20 -0
  378. package/src/utils/dom/clickOutside.ts +11 -0
  379. package/src/utils/dom/externalLink.ts +57 -0
  380. package/src/utils/dom/scrollable.ts +24 -0
  381. package/src/utils/errors.ts +11 -0
  382. package/src/utils/files/expandedDirs.ts +25 -0
  383. package/src/utils/files/filename.ts +12 -0
  384. package/src/utils/files/sortChildren.ts +20 -0
  385. package/src/utils/filesPreview/schedulerPreview.ts +38 -0
  386. package/src/utils/filesPreview/todoPreview.ts +40 -0
  387. package/src/utils/format/date.ts +85 -0
  388. package/src/utils/format/frontmatter.ts +80 -0
  389. package/src/utils/format/jsonSyntax.ts +109 -0
  390. package/src/utils/html/previewCsp.ts +65 -0
  391. package/src/utils/image/resolve.ts +8 -0
  392. package/src/utils/image/rewriteMarkdownImageRefs.ts +182 -0
  393. package/src/utils/markdown/extractFirstH1.ts +39 -0
  394. package/src/utils/notification/dispatch.ts +22 -0
  395. package/src/utils/path/relativeLink.ts +130 -0
  396. package/src/utils/role/icon.ts +20 -0
  397. package/src/utils/role/merge.ts +10 -0
  398. package/src/utils/role/plugins.ts +12 -0
  399. package/src/utils/session/mergeSessions.ts +103 -0
  400. package/src/utils/session/seedRoleDefault.ts +35 -0
  401. package/src/utils/session/sessionEntries.ts +121 -0
  402. package/src/utils/session/sessionFactory.ts +22 -0
  403. package/src/utils/session/sessionHelpers.ts +99 -0
  404. package/src/utils/tools/dedup.ts +17 -0
  405. package/src/utils/tools/mcp.ts +33 -0
  406. package/src/utils/tools/pendingCalls.ts +16 -0
  407. package/src/utils/tools/result.ts +40 -0
  408. package/src/utils/types.ts +44 -0
package/README.md ADDED
@@ -0,0 +1,44 @@
1
+ # MulmoClaude
2
+
3
+ Experience GUI-chat with Claude Code — and long-term memory!
4
+
5
+ ## Quick Start
6
+
7
+ ```bash
8
+ # Prerequisites: Node.js 20+, Claude Code CLI
9
+ npm install -g @anthropic-ai/claude-code
10
+ claude auth login
11
+
12
+ # Launch MulmoClaude
13
+ npx mulmoclaude
14
+ ```
15
+
16
+ Your browser opens to `http://localhost:3001`. That's it.
17
+
18
+ ## Options
19
+
20
+ ```
21
+ npx mulmoclaude # Default (port 3001, opens browser)
22
+ npx mulmoclaude --port 8080 # Custom port
23
+ npx mulmoclaude --no-open # Don't open browser
24
+ npx mulmoclaude --version # Show version
25
+ ```
26
+
27
+ ## How it works
28
+
29
+ The npm package ships with the pre-built client (Vite) and the server
30
+ source — TypeScript, executed directly via `tsx`. No cloning, no
31
+ build step for end users: `npx` downloads the package and starts the
32
+ Express server.
33
+
34
+ Your data lives in `~/mulmoclaude/` (created on first run).
35
+
36
+ ## For developers
37
+
38
+ Publish flow and the full local-test recipe (prepare-dist,
39
+ direct launch, curl checks, tarball simulation) live in the
40
+ header comment of `bin/prepare-dist.js`.
41
+
42
+ ## License
43
+
44
+ MIT
@@ -0,0 +1,202 @@
1
+ #!/usr/bin/env node
2
+
3
+ // MulmoClaude launcher — `npx mulmoclaude` entry point.
4
+ //
5
+ // Ships with server source (TypeScript) + pre-built client (Vite).
6
+ // Runs the server via tsx (TypeScript executor).
7
+
8
+ import { execSync, spawn } from "child_process";
9
+ import { existsSync } from "fs";
10
+ import { get as httpGet } from "http";
11
+ import { createRequire } from "module";
12
+ import { join, dirname } from "path";
13
+ import { fileURLToPath } from "url";
14
+
15
+ const require = createRequire(import.meta.url);
16
+
17
+ const __dirname = dirname(fileURLToPath(import.meta.url));
18
+ const PKG_DIR = join(__dirname, "..");
19
+ const SERVER_ENTRY = join(PKG_DIR, "server", "index.ts");
20
+ const DEFAULT_PORT = 3001;
21
+
22
+ // ── Helpers ─────────────────────────────────────────────────
23
+
24
+ function log(msg) {
25
+ console.log(`\x1b[36m[mulmoclaude]\x1b[0m ${msg}`);
26
+ }
27
+
28
+ function error(msg) {
29
+ console.error(`\x1b[31m[mulmoclaude]\x1b[0m ${msg}`);
30
+ }
31
+
32
+ function checkClaude() {
33
+ try {
34
+ execSync("claude --version", { stdio: "pipe" });
35
+ return true;
36
+ } catch {
37
+ return false;
38
+ }
39
+ }
40
+
41
+ function pickOpenCommand() {
42
+ if (process.platform === "darwin") return "open";
43
+ if (process.platform === "win32") return "start";
44
+ return "xdg-open";
45
+ }
46
+
47
+ // Poll the server until it answers an HTTP request, then call `onReady`.
48
+ // Gives up after ~15s so the launcher doesn't hang forever on a crash loop.
49
+ function waitUntilReady(portNum, onReady) {
50
+ const startedAt = Date.now();
51
+ const timeoutMs = 15000;
52
+ const intervalMs = 300;
53
+
54
+ const attempt = () => {
55
+ const req = httpGet({ host: "127.0.0.1", port: portNum, path: "/", timeout: 1000 }, (res) => {
56
+ res.resume();
57
+ onReady();
58
+ });
59
+ req.on("error", retry);
60
+ req.on("timeout", () => {
61
+ req.destroy();
62
+ retry();
63
+ });
64
+ };
65
+
66
+ const retry = () => {
67
+ if (Date.now() - startedAt > timeoutMs) return;
68
+ setTimeout(attempt, intervalMs);
69
+ };
70
+
71
+ attempt();
72
+ }
73
+
74
+ function printReadyBanner(url) {
75
+ const bar = "─".repeat(50);
76
+ console.log("");
77
+ console.log(`\x1b[32m${bar}\x1b[0m`);
78
+ console.log(`\x1b[32m ✓ MulmoClaude is ready\x1b[0m`);
79
+ console.log(`\x1b[32m → ${url}\x1b[0m`);
80
+ console.log(`\x1b[32m Press Ctrl+C to stop.\x1b[0m`);
81
+ console.log(`\x1b[32m${bar}\x1b[0m`);
82
+ console.log("");
83
+ }
84
+
85
+ // ── Parse args ──────────────────────────────────────────────
86
+
87
+ const args = process.argv.slice(2);
88
+ if (args.includes("--help") || args.includes("-h")) {
89
+ console.log(`
90
+ Usage: npx mulmoclaude [options]
91
+
92
+ Options:
93
+ --port <number> Server port (default: ${DEFAULT_PORT})
94
+ --no-open Don't open browser automatically
95
+ --version Show version
96
+ --help Show this help
97
+ `);
98
+ process.exit(0);
99
+ }
100
+
101
+ if (args.includes("--version")) {
102
+ console.log("mulmoclaude 0.1.0");
103
+ process.exit(0);
104
+ }
105
+
106
+ const port = resolvePort();
107
+ const noOpen = args.includes("--no-open");
108
+
109
+ function resolvePort() {
110
+ const idx = args.indexOf("--port");
111
+ if (idx === -1) return DEFAULT_PORT;
112
+ const raw = args[idx + 1];
113
+ if (raw === undefined) {
114
+ error("--port requires a value (integer 1..65535)");
115
+ process.exit(1);
116
+ }
117
+ const parsed = Number.parseInt(raw, 10);
118
+ if (!Number.isInteger(parsed) || String(parsed) !== raw || parsed < 1 || parsed > 65535) {
119
+ error(`Invalid --port value: "${raw}" (expected integer 1..65535)`);
120
+ process.exit(1);
121
+ }
122
+ return parsed;
123
+ }
124
+
125
+ // ── Pre-flight checks ───────────────────────────────────────
126
+
127
+ if (!checkClaude()) {
128
+ error("Claude Code CLI not found.");
129
+ error("");
130
+ error("Install it first:");
131
+ error(" npm install -g @anthropic-ai/claude-code");
132
+ error(" claude auth login");
133
+ error("");
134
+ error("Then try again: npx mulmoclaude");
135
+ process.exit(1);
136
+ }
137
+
138
+ log("Claude Code CLI ✓");
139
+
140
+ if (!existsSync(SERVER_ENTRY)) {
141
+ error(`Server source not found at ${SERVER_ENTRY}`);
142
+ process.exit(1);
143
+ }
144
+
145
+ // ── Start server ────────────────────────────────────────────
146
+
147
+ log(`Starting MulmoClaude on port ${port}...`);
148
+
149
+ // Resolve tsx's CLI entry via Node's module resolution so this works
150
+ // whether tsx is nested (`npx`/local install) or hoisted (`npm i -g`).
151
+ // tsx doesn't export `./cli`, so locate via its package.json + `bin`.
152
+ let tsxCli;
153
+ try {
154
+ const tsxPkgJson = require.resolve("tsx/package.json");
155
+ const tsxPkg = require(tsxPkgJson);
156
+ tsxCli = join(dirname(tsxPkgJson), tsxPkg.bin);
157
+ } catch {
158
+ error("Failed to locate 'tsx' — the package may be installed incorrectly.");
159
+ process.exit(1);
160
+ }
161
+
162
+ const server = spawn(process.execPath, [tsxCli, SERVER_ENTRY], {
163
+ cwd: PKG_DIR,
164
+ env: {
165
+ ...process.env,
166
+ NODE_ENV: "production",
167
+ PORT: String(port),
168
+ },
169
+ stdio: "inherit",
170
+ });
171
+
172
+ // Print a ready banner + optionally open the browser once the server
173
+ // actually responds — not a fixed-delay timer, so the banner appears
174
+ // right when the UI is reachable.
175
+ const url = `http://localhost:${port}`;
176
+ waitUntilReady(port, () => {
177
+ printReadyBanner(url);
178
+ if (noOpen) return;
179
+ const openCmd = pickOpenCommand();
180
+ try {
181
+ // openCmd is a hard-coded literal; url is http://localhost:<numeric-port>.
182
+ // eslint-disable-next-line sonarjs/os-command
183
+ execSync(`${openCmd} ${url}`, { stdio: "pipe" });
184
+ } catch {
185
+ log(`Open your browser: ${url}`);
186
+ }
187
+ });
188
+
189
+ // Graceful shutdown
190
+ process.on("SIGINT", () => {
191
+ server.kill("SIGTERM");
192
+ process.exit(0);
193
+ });
194
+
195
+ process.on("SIGTERM", () => {
196
+ server.kill("SIGTERM");
197
+ process.exit(0);
198
+ });
199
+
200
+ server.on("exit", (code) => {
201
+ process.exit(code ?? 1);
202
+ });
@@ -0,0 +1,93 @@
1
+ #!/usr/bin/env node
2
+
3
+ // Copies server source + client build + shared config into this
4
+ // package so `npm publish` includes everything needed to run.
5
+ //
6
+ // ── Local test flow (before publishing) ───────────────────────
7
+ // From the repo root:
8
+ //
9
+ // yarn build # 1. Vite build → dist/client/
10
+ // yarn install # 2. brings in tsx (runtime)
11
+ // node packages/mulmoclaude/bin/prepare-dist.js # 3. copy into this pkg
12
+ // node packages/mulmoclaude/bin/mulmoclaude.js --no-open --port 3099
13
+ //
14
+ // Expected: the launcher prints `[server] listening port=3099`.
15
+ // Sanity-check from another shell:
16
+ //
17
+ // curl -s -o /dev/null -w "%{http_code}\n" http://localhost:3099/
18
+ // → 200 (index.html served with bearer token substituted)
19
+ // curl -s -o /dev/null -w "%{http_code}\n" http://localhost:3099/api/config
20
+ // → 401 (protected API, expected without token)
21
+ //
22
+ // Stop: Ctrl+C, or `kill "$(lsof -ti:3099)"`.
23
+ //
24
+ // To test the exact published artifact end-to-end:
25
+ //
26
+ // cd packages/mulmoclaude && npm pack # → mulmoclaude-<ver>.tgz
27
+ // mkdir /tmp/mc-test && cd /tmp/mc-test
28
+ // npm init -y && npm install /abs/path/to/mulmoclaude-<ver>.tgz
29
+ // ./node_modules/.bin/mulmoclaude --no-open --port 3099
30
+ //
31
+ // ── Publish ───────────────────────────────────────────────────
32
+ // cd packages/mulmoclaude && npm publish --access public
33
+
34
+ import { cpSync, existsSync, rmSync } from "fs";
35
+ import { join, dirname } from "path";
36
+ import { fileURLToPath } from "url";
37
+
38
+ const __dirname = dirname(fileURLToPath(import.meta.url));
39
+ const pkgDir = join(__dirname, "..");
40
+ const rootDir = join(pkgDir, "..", "..");
41
+
42
+ // ── Clean ───────────────────────────────────────────────────
43
+
44
+ // Include `dist` so leftovers from the older pre-built-JS layout are
45
+ // wiped on re-run.
46
+ for (const dir of ["dist", "client", "server", "src"]) {
47
+ const target = join(pkgDir, dir);
48
+ if (existsSync(target)) rmSync(target, { recursive: true });
49
+ }
50
+
51
+ // ── Client dist (Vite build output) ─────────────────────────
52
+ // Copied to `client/` (not `dist/client/`) so the server's
53
+ // `path.join(__dirname, "../client")` resolves correctly when
54
+ // tsx runs `server/index.ts` directly from this package.
55
+
56
+ const clientDist = join(rootDir, "dist", "client");
57
+ if (!existsSync(clientDist)) {
58
+ console.error("dist/client/ not found. Run `yarn build` first.");
59
+ process.exit(1);
60
+ }
61
+ cpSync(clientDist, join(pkgDir, "client"), { recursive: true });
62
+ console.log("✓ client");
63
+
64
+ // ── Server source (TypeScript — run via tsx) ────────────────
65
+
66
+ cpSync(join(rootDir, "server"), join(pkgDir, "server"), {
67
+ recursive: true,
68
+ filter: (src) => {
69
+ if (src.includes("node_modules")) return false;
70
+ if (src.endsWith(".map")) return false;
71
+ if (src.endsWith(".log")) return false;
72
+ // Skip dev-only files: local logs dir, tsconfig used by repo's
73
+ // own `tsc -p server/tsconfig.json` (end users don't compile).
74
+ const tail = src.split("/").slice(-2).join("/");
75
+ if (tail === "server/logs" || src.endsWith("/server/logs")) return false;
76
+ if (src.endsWith("/tsconfig.json")) return false;
77
+ return true;
78
+ },
79
+ });
80
+ console.log("✓ server source");
81
+
82
+ // ── Shared src/ (server imports from src/config, src/types,
83
+ // src/plugins, src/utils). Copy the whole tree — Vue files are
84
+ // ignored at runtime since the server never imports them.
85
+
86
+ cpSync(join(rootDir, "src"), join(pkgDir, "src"), {
87
+ recursive: true,
88
+ filter: (src) => !src.endsWith(".map"),
89
+ });
90
+ console.log("✓ shared src/");
91
+
92
+ console.log("\nReady to publish. Run:");
93
+ console.log(" cd packages/mulmoclaude && npm publish --access public");
@@ -0,0 +1 @@
1
+ var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(e&&(t=e(e=0)),t),s=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),c=(e,n)=>{let r={};for(var i in e)t(r,i,{get:e[i],enumerable:!0});return n||t(r,Symbol.toStringTag,{value:`Module`}),r},l=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},u=(n,r,a)=>(a=n==null?{}:e(i(n)),l(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n)),d=e=>a.call(e,`module.exports`)?e[`module.exports`]:l(t({},`__esModule`,{value:!0}),e),f=Object.create,p=Object.defineProperty,m=Object.getOwnPropertyDescriptor,h=Object.getOwnPropertyNames,g=Object.getPrototypeOf,_=Object.prototype.hasOwnProperty,v=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),y=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=h(t),a=0,o=i.length,s;a<o;a++)s=i[a],!_.call(e,s)&&s!==n&&p(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=m(t,s))||r.enumerable});return e},b=(e,t,n)=>(n=e==null?{}:f(g(e)),y(t||!e||!e.__esModule?p(n,`default`,{value:e,enumerable:!0}):n,e));export{c as a,o as i,v as n,d as o,s as r,u as s,b as t};