mulmoclaude 1.22.0 → 1.24.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 +2 -1
- package/client/assets/{index-BSzYDJUo.js → index-BuYeBJxJ.js} +348 -348
- package/client/assets/{marp-DG5YQ_M9.js → marp-DTxd0eN4.js} +1 -1
- package/client/index.html +1 -1
- package/package.json +6 -6
- package/server/agent/authFailure.ts +21 -0
- package/server/agent/backend/claude-code.ts +26 -1
- package/server/agent/stream.ts +19 -0
- package/server/api/routes/agent.ts +72 -30
- package/server/api/routes/attachment.ts +3 -2
- package/server/api/routes/image.ts +2 -1
- package/server/api/routes/sessions.ts +14 -2
- package/server/api/routes/snapshotRunState.ts +12 -0
- package/server/build/mcp-server.mjs +488 -486
- package/server/events/session-store/index.ts +9 -0
- package/server/system/logs/aaa +737 -0
- package/server/system/logs/bb +446 -0
- package/server/utils/files/attachment-mime.ts +107 -0
- package/server/utils/files/attachment-store.ts +14 -87
- package/src/App.vue +24 -4
- package/src/components/ChatAttachmentPreview.vue +7 -1
- package/src/components/ChatInput.vue +6 -30
- package/src/composables/useSessionLifecycle.ts +24 -8
- package/src/composables/useSessionSync.ts +13 -8
- package/src/lang/de.ts +2 -1
- package/src/lang/en.ts +2 -1
- package/src/lang/es.ts +2 -1
- package/src/lang/fr.ts +2 -1
- package/src/lang/ja.ts +2 -1
- package/src/lang/ko.ts +2 -1
- package/src/lang/pt-BR.ts +2 -1
- package/src/lang/zh.ts +2 -1
- package/src/plugins/editImages/index.ts +3 -3
- package/src/plugins/generateImage/index.ts +2 -3
- package/src/plugins/imageRouteResult.ts +62 -0
- package/src/types/session.ts +12 -0
- package/src/utils/attachment/readableTypes.ts +36 -0
- package/src/utils/session/adoptTranscript.ts +159 -0
- package/src/utils/session/applySessionSummary.ts +17 -0
- package/src/utils/session/catchUpGuard.ts +74 -0
- package/src/utils/session/sessionEntries.ts +4 -1
- package/src/utils/session/sessionHelpers.ts +2 -10
- package/src/utils/tools/result.ts +13 -0
package/README.md
CHANGED
|
@@ -151,13 +151,14 @@ Recommended: ≥ 32 characters of random data (shorter values trigger a startup
|
|
|
151
151
|
## Optional features
|
|
152
152
|
|
|
153
153
|
- **Gemini API key** — enables AI image generation (`generateImage`), audio / video. Free tier suffices for everyday use; get one from [Google AI Studio](https://aistudio.google.com/). Paste it into **Settings → Gemini**: it takes effect immediately, with no restart and no file to find, and it wins over anything in the shell or a `.env`. The older routes still work — `GEMINI_API_KEY` exported in the shell, or in a `.env` — but which `.env` gets read depends on how you started the app (from the icon there is no launch directory, so it reads `~/.env`), which is why the Settings tab names the exact path this launch is reading.
|
|
154
|
+
- **Attach any file to a chat** — paste, drop or pick it. Images, PDF, Office documents and text are read by the model; any other type (a `.mpp`, a CAD file, an archive) is saved to `data/attachments/` and handed to the agent by path, so a tool or skill you add can process it.
|
|
154
155
|
- **Download any workspace file** — the Files view previews text and renders known media; anything else (and any file too large to preview) offers a direct download of the bytes. This replaces relying on "Open in OS", which spawns a handler on the *server's* desktop — under Docker, WSL2 or a remote host there is none, so those files used to be unreachable from the UI.
|
|
155
156
|
- **Local voice input** (macOS only, opt-in) — `whisper.cpp` for dictating chat messages without sending audio to a cloud API.
|
|
156
157
|
- **Marp slides** — `marp: true` frontmatter on any markdown file renders a slide deck in the canvas with PDF export. Custom themes via `config/marp-themes/<name>.css`.
|
|
157
158
|
- **Auto memory** — the agent maintains a typed memory layout (`conversations/memory/<type>/<topic>.md`) and reads it ambient-style.
|
|
158
159
|
- **Web Push on task finish** — enable in Settings → Notifications to get a push on your phone when the answer to a question you asked is ready, even with the browser closed. Requires the RemoteHost connection + a registered device (see [`docs/remote-host.md`](https://github.com/receptron/mulmoclaude/blob/main/docs/remote-host.md#web-push-on-task-finish-2086)).
|
|
159
160
|
- **Google (Calendar / Tasks / Drive)** — link your Google account in Settings → Plugins → Google and consent in the browser; no Google Cloud setup needed. The agent then gets a `google` tool covering the full round trip — list, create, edit and delete calendar events and tasks (including putting a completed task back on the list), plus the Drive files it creates — and the phone remote can trigger the same commands. Events can be timed or **all-day**: ask for a whole day and you get one, rather than a midnight appointment.
|
|
160
|
-
- **Google Calendar ↔ collection sync** — a collection can mirror one of your calendars and keep itself current: the first sync starts as soon as you ask for the collection, an hourly pass follows, and a Sync button forces one. It calls the Calendar API directly rather than routing the events through the agent, so keeping it fresh costs no tokens. A **Push to Google** button beside it sends the other way, creating events for records you added and updating ones you edited — it skips anything edited on both sides rather than picking a winner. It does not delete unless you ask it to: a collection can opt in so that removing a record removes the event, and even then it refuses any event with attendees rather than withdrawing it from their calendars. Ask for **two-way sync** and the collection pushes on the same schedule it pulls on, as one cycle, so there is no button to forget; a record the push could not send is then left alone by the pull instead of being overwritten. Without it the pull is automatic and the push is a button, so push before you sync — a pull overwrites a locally edited record as soon as Google reports a change to that event. Event **notes and location** travel in both directions alongside the title, times and colour, and the mirror can also carry read-only details — your own RSVP, the meeting link, and which recurring series an occurrence came from. **The refresh token stays on your machine** (`~/.config/mulmo/`) — the sign-in service applies the OAuth client secret Google requires and keeps nothing. Prefer your own OAuth client? Drop a *desktop-app* client JSON in `~/.secrets/` and the whole flow stays local (see [`docs/remote-host.md`](https://github.com/receptron/mulmoclaude/blob/main/docs/remote-host.md)).
|
|
161
|
+
- **Google Calendar ↔ collection sync** — a collection can mirror one of your calendars and keep itself current: the first sync starts as soon as you ask for the collection, an hourly pass follows, and a Sync button forces one. It calls the Calendar API directly rather than routing the events through the agent, so keeping it fresh costs no tokens. A **Push to Google** button beside it sends the other way, creating events for records you added and updating ones you edited — it skips anything edited on both sides rather than picking a winner. It does not delete unless you ask it to: a collection can opt in so that removing a record removes the event, and even then it refuses any event with attendees rather than withdrawing it from their calendars. Ask for **two-way sync** and the collection pushes on the same schedule it pulls on, as one cycle, so there is no button to forget; a record the push could not send is then left alone by the pull instead of being overwritten. Without it the pull is automatic and the push is a button, so push before you sync — a pull overwrites a locally edited record as soon as Google reports a change to that event. A record you add can be an **all-day** event: write just the date (`2026-09-28`) in its start and end. Event **notes and location** travel in both directions alongside the title, times and colour, and the mirror can also carry read-only details — your own RSVP, the meeting link, and which recurring series an occurrence came from. **The refresh token stays on your machine** (`~/.config/mulmo/`) — the sign-in service applies the OAuth client secret Google requires and keeps nothing. Prefer your own OAuth client? Drop a *desktop-app* client JSON in `~/.secrets/` and the whole flow stays local (see [`docs/remote-host.md`](https://github.com/receptron/mulmoclaude/blob/main/docs/remote-host.md)).
|
|
161
162
|
|
|
162
163
|
## Plugin authoring (`--dev-plugin`)
|
|
163
164
|
|