mulmoclaude 0.9.3 → 0.9.4

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 (45) hide show
  1. package/client/assets/{index-40ErrJ4a.js → index-B3NxFcEH.js} +36 -36
  2. package/client/assets/{marp-Dh7C24F1.js → marp-C9QDHFAJ.js} +1 -1
  3. package/client/index.html +1 -1
  4. package/package.json +6 -6
  5. package/server/api/routes/agent.ts +5 -1
  6. package/server/api/routes/collections.ts +16 -1
  7. package/server/api/routes/config.ts +12 -0
  8. package/server/remoteHost/firebase.ts +6 -0
  9. package/server/remoteHost/handlers/index.ts +4 -0
  10. package/server/remoteHost/handlers/ingestAttachments.ts +88 -0
  11. package/server/remoteHost/handlers/listAccountingBooks.ts +31 -0
  12. package/server/remoteHost/handlers/listCollections.ts +6 -1
  13. package/server/remoteHost/handlers/listSkills.ts +39 -0
  14. package/server/remoteHost/handlers/startChat.ts +103 -39
  15. package/server/system/config.ts +101 -4
  16. package/server/system/logs/aaa +737 -0
  17. package/server/system/logs/bb +446 -0
  18. package/server/workspace/chat-index/index.ts +21 -2
  19. package/server/workspace/chat-index/indexer.ts +57 -14
  20. package/server/workspace/chat-index/summarizer.ts +18 -10
  21. package/server/workspace/collections/index.ts +1 -1
  22. package/server/workspace/journal/archivist-cli.ts +17 -3
  23. package/server/workspace/journal/dailyPass.ts +52 -2
  24. package/server/workspace/journal/index.ts +20 -4
  25. package/src/App.vue +5 -0
  26. package/src/components/FileTree.vue +21 -1
  27. package/src/components/FileTreePane.vue +41 -25
  28. package/src/components/FilesView.vue +4 -0
  29. package/src/components/RemoteHostControl.vue +18 -0
  30. package/src/components/SessionHistoryPanel.vue +24 -11
  31. package/src/components/SettingsChatIndexTab.vue +119 -0
  32. package/src/components/SettingsJournalTab.vue +117 -0
  33. package/src/components/SettingsModal.vue +12 -2
  34. package/src/composables/collections/useDynamicShortcutIcons.ts +93 -0
  35. package/src/composables/useShowHiddenSystemFiles.ts +23 -0
  36. package/src/config/visibleWorkspaceDirs.ts +21 -0
  37. package/src/lang/de.ts +45 -0
  38. package/src/lang/en.ts +43 -0
  39. package/src/lang/es.ts +44 -0
  40. package/src/lang/fr.ts +45 -0
  41. package/src/lang/ja.ts +44 -0
  42. package/src/lang/ko.ts +43 -0
  43. package/src/lang/pt-BR.ts +44 -0
  44. package/src/lang/zh.ts +43 -0
  45. package/src/utils/session/sessionPreview.ts +29 -0
package/src/lang/fr.ts CHANGED
@@ -134,6 +134,9 @@ const frMessages = {
134
134
  disconnectFailed: "Échec de la déconnexion",
135
135
  signInFailed: "Échec de la connexion Google",
136
136
  statusFailed: "Échec du chargement de l'état",
137
+ description: "L'accès distant permet à un appareil mobile de se connecter aux collections et aux flux de ce MulmoClaude.",
138
+ howTo: "Sur votre téléphone, ouvrez {url} et connectez-vous avec le même compte Google.",
139
+ customViewHint: "Pour une vue adaptée au mobile, demandez à Claude de créer une {keyword} (pas une custom view classique).",
137
140
  },
138
141
  sidebarHeader: {
139
142
  home: "Aller à la dernière conversation",
@@ -178,6 +181,9 @@ const frMessages = {
178
181
  // "RO" = Read-Only. Abréviation anglaise conservée volontairement
179
182
  // pour tenir dans un badge compact à côté du libellé Référence.
180
183
  readOnlyBadge: "RO",
184
+ showSystemFiles: "Afficher les fichiers système",
185
+ showSystemFilesTitle:
186
+ "Affiche les répertoires racine internes de l'agent (conversations/, feeds/, etc.) en plus des contenus utilisateur (data/, artifacts/, config/).",
181
187
  },
182
188
  fileTree: {
183
189
  workspace: "(espace de travail)",
@@ -229,6 +235,8 @@ const frMessages = {
229
235
  photos: "Photos",
230
236
  model: "Modèle",
231
237
  voice: "Voix",
238
+ chatIndex: "Index du chat",
239
+ journal: "Journal",
232
240
  skills: "Skills",
233
241
  roles: "Rôles",
234
242
  },
@@ -289,6 +297,43 @@ const frMessages = {
289
297
  loadError: "Échec du chargement des paramètres",
290
298
  saveError: "Échec de l'enregistrement",
291
299
  },
300
+ chatIndexTab: {
301
+ description:
302
+ "Titres et résumés générés par IA pour l'historique du chat. Désactivé par défaut — les sessions d'automatisation (scheduler / workers système) sont toujours ignorées même quand c'est activé ; les sessions humaines ne paient qu'un appel au résumeur à la fin de chaque tour.",
303
+ modeLabel: "Modèle de l'index de chat",
304
+ helperText: "Haiku est moins cher ; Sonnet donne des titres plus précis pour de longues sessions changeant de sujet.",
305
+ mode: {
306
+ off: "Désactivé",
307
+ haiku: "Haiku",
308
+ sonnet: "Sonnet",
309
+ },
310
+ status: {
311
+ off: "Indexation DÉSACTIVÉE",
312
+ haiku: "Indexation avec Haiku",
313
+ sonnet: "Indexation avec Sonnet",
314
+ },
315
+ loadError: "Échec du chargement des paramètres",
316
+ saveError: "Échec de l'enregistrement",
317
+ },
318
+ journalTab: {
319
+ description:
320
+ "Journal quotidien automatisé — résume les sessions de chat récentes dans journal/*.md et extrait des notes de mémoire persistante. Désactivé par défaut. Les sessions d'automatisation (scheduler / workers système) sont toujours exclues, quel que soit ce réglage.",
321
+ modeLabel: "Modèle du journal",
322
+ helperText:
323
+ "Haiku est moins cher ; Sonnet produit des résumés quotidiens et thématiques plus riches. Le passage horaire ne s'exécute que lorsque c'est activé.",
324
+ mode: {
325
+ off: "Désactivé",
326
+ haiku: "Haiku",
327
+ sonnet: "Sonnet",
328
+ },
329
+ status: {
330
+ off: "Journal DÉSACTIVÉ",
331
+ haiku: "Journal en cours avec Haiku",
332
+ sonnet: "Journal en cours avec Sonnet",
333
+ },
334
+ loadError: "Échec du chargement des paramètres",
335
+ saveError: "Échec de l'enregistrement",
336
+ },
292
337
  // Slots `<i18n-t>` — les noms `envKey` / `envFile` sont rendus sous
293
338
  // forme de `<code>` inline dans SettingsModal.vue ; les littéraux
294
339
  // (nom de variable et nom de fichier) restent donc non traduits.
package/src/lang/ja.ts CHANGED
@@ -139,6 +139,9 @@ const jaMessages = {
139
139
  disconnectFailed: "切断に失敗しました",
140
140
  signInFailed: "Google サインインに失敗しました",
141
141
  statusFailed: "状態の取得に失敗しました",
142
+ description: "リモートアクセスを有効にすると、モバイルデバイスからこの MulmoClaude のコレクションとフィードに接続できます。",
143
+ howTo: "モバイルから {url} を開き、同じ Google アカウントでサインインしてください。",
144
+ customViewHint: "モバイル向けのビューが必要な場合は、通常の custom view ではなく {keyword} を作るように Claude に依頼してください。",
142
145
  },
143
146
  sidebarHeader: {
144
147
  home: "最新のチャットに移動",
@@ -181,6 +184,9 @@ const jaMessages = {
181
184
  recent: "最近",
182
185
  reference: "参照",
183
186
  readOnlyBadge: "RO",
187
+ showSystemFiles: "システムファイルを表示",
188
+ showSystemFilesTitle:
189
+ "エージェント内部の top-level ディレクトリ (conversations/ や feeds/ など) をユーザーデータ (data/ artifacts/ config/) と合わせて表示します。",
184
190
  },
185
191
  fileTree: {
186
192
  workspace: "(ワークスペース)",
@@ -232,6 +238,8 @@ const jaMessages = {
232
238
  photos: "写真",
233
239
  model: "モデル",
234
240
  voice: "音声",
241
+ chatIndex: "チャットインデックス",
242
+ journal: "ジャーナル",
235
243
  skills: "スキル",
236
244
  roles: "ロール",
237
245
  },
@@ -292,6 +300,42 @@ const jaMessages = {
292
300
  loadError: "設定の読み込みに失敗しました",
293
301
  saveError: "保存に失敗しました",
294
302
  },
303
+ chatIndexTab: {
304
+ description:
305
+ "チャット履歴の AI タイトル/サマリー自動生成の設定です。デフォルトは off で、自動化系のセッション(scheduler / system worker)は on にしても常に除外されます。人間のセッションのみターン終了時に 1 回要約が走ります。",
306
+ modeLabel: "チャットインデックスのモデル",
307
+ helperText: "Haiku は安価。Sonnet は長く話題が移るセッションでタイトル品質が高くなります。",
308
+ mode: {
309
+ off: "オフ",
310
+ haiku: "Haiku",
311
+ sonnet: "Sonnet",
312
+ },
313
+ status: {
314
+ off: "インデックス作成: オフ",
315
+ haiku: "Haiku でインデックス作成中",
316
+ sonnet: "Sonnet でインデックス作成中",
317
+ },
318
+ loadError: "設定の読み込みに失敗しました",
319
+ saveError: "保存に失敗しました",
320
+ },
321
+ journalTab: {
322
+ description:
323
+ "ジャーナル日次パスの設定です。最近のチャットセッションを journal/*.md に要約し、恒久メモリ(memory.md)を抽出します。デフォルトは off。自動化系セッション(scheduler / system worker)はこの設定に関わらず常に除外されます。",
324
+ modeLabel: "ジャーナルのモデル",
325
+ helperText: "Haiku は安価。Sonnet は日次/トピックまとめの質が高くなります。毎時のパスはここが on の時のみ実行されます。",
326
+ mode: {
327
+ off: "オフ",
328
+ haiku: "Haiku",
329
+ sonnet: "Sonnet",
330
+ },
331
+ status: {
332
+ off: "ジャーナル: オフ",
333
+ haiku: "Haiku でジャーナル実行中",
334
+ sonnet: "Sonnet でジャーナル実行中",
335
+ },
336
+ loadError: "設定の読み込みに失敗しました",
337
+ saveError: "保存に失敗しました",
338
+ },
295
339
  // `<i18n-t>` スロット — `envKey` / `envFile` は SettingsModal.vue で
296
340
  // インラインの `<code>` として描画されるため、変数名とファイル名は
297
341
  // 翻訳せずそのまま残します。
package/src/lang/ko.ts CHANGED
@@ -141,6 +141,9 @@ const koMessages = {
141
141
  disconnectFailed: "연결 해제 실패",
142
142
  signInFailed: "Google 로그인 실패",
143
143
  statusFailed: "상태를 불러오지 못했습니다",
144
+ description: "원격 액세스를 사용하면 모바일 기기에서 이 MulmoClaude의 컬렉션과 피드에 연결할 수 있습니다.",
145
+ howTo: "휴대폰에서 {url} 을(를) 열고 같은 Google 계정으로 로그인하세요.",
146
+ customViewHint: "모바일에 최적화된 뷰가 필요하다면, 일반 custom view가 아닌 {keyword} 를(을) 만들어 달라고 Claude에게 요청하세요.",
144
147
  },
145
148
  sidebarHeader: {
146
149
  home: "최신 채팅으로 이동",
@@ -184,6 +187,8 @@ const koMessages = {
184
187
  reference: "참조",
185
188
  // "RO" = Read-Only. 간결한 배지로 표시하기 위해 영문 약어 유지.
186
189
  readOnlyBadge: "RO",
190
+ showSystemFiles: "시스템 파일 표시",
191
+ showSystemFilesTitle: "사용자 콘텐츠(data/, artifacts/, config/)에 더해 에이전트 내부 최상위 디렉터리(conversations/, feeds/ 등)까지 표시합니다.",
187
192
  },
188
193
  fileTree: {
189
194
  workspace: "(워크스페이스)",
@@ -235,6 +240,8 @@ const koMessages = {
235
240
  photos: "사진",
236
241
  model: "모델",
237
242
  voice: "음성",
243
+ chatIndex: "채팅 인덱스",
244
+ journal: "저널",
238
245
  skills: "스킬",
239
246
  roles: "역할",
240
247
  },
@@ -292,6 +299,42 @@ const koMessages = {
292
299
  loadError: "설정을 불러오지 못했습니다",
293
300
  saveError: "저장에 실패했습니다",
294
301
  },
302
+ chatIndexTab: {
303
+ description:
304
+ "채팅 기록의 AI 제목/요약 자동 생성을 설정합니다. 기본값은 off 이며, 자동화 계열 세션(scheduler / 시스템 워커)은 on 상태여도 항상 제외됩니다. 사람 세션만 턴 종료 시 요약이 한 번 실행됩니다.",
305
+ modeLabel: "채팅 인덱스 모델",
306
+ helperText: "Haiku 가 더 저렴하고, Sonnet 은 길고 주제가 바뀌는 세션에서 더 정확한 제목을 만듭니다.",
307
+ mode: {
308
+ off: "꺼짐",
309
+ haiku: "Haiku",
310
+ sonnet: "Sonnet",
311
+ },
312
+ status: {
313
+ off: "인덱싱: 꺼짐",
314
+ haiku: "Haiku 로 인덱싱 중",
315
+ sonnet: "Sonnet 으로 인덱싱 중",
316
+ },
317
+ loadError: "설정을 불러오지 못했습니다",
318
+ saveError: "저장에 실패했습니다",
319
+ },
320
+ journalTab: {
321
+ description:
322
+ "일일 저널 자동 생성 설정입니다. 최근 채팅 세션을 journal/*.md 로 요약하고 지속 메모(memory.md)를 추출합니다. 기본값은 off. 자동화 세션(scheduler / 시스템 워커)은 이 설정과 무관하게 항상 제외됩니다.",
323
+ modeLabel: "저널 모델",
324
+ helperText: "Haiku 가 더 저렴하고, Sonnet 은 일일/주제 요약 품질이 더 좋습니다. 매시 실행은 이 설정이 켜져 있을 때만 동작합니다.",
325
+ mode: {
326
+ off: "꺼짐",
327
+ haiku: "Haiku",
328
+ sonnet: "Sonnet",
329
+ },
330
+ status: {
331
+ off: "저널: 꺼짐",
332
+ haiku: "Haiku 로 저널 실행 중",
333
+ sonnet: "Sonnet 으로 저널 실행 중",
334
+ },
335
+ loadError: "설정을 불러오지 못했습니다",
336
+ saveError: "저장에 실패했습니다",
337
+ },
295
338
  // `<i18n-t>` 슬롯 — `envKey` / `envFile` 은 SettingsModal.vue 에서
296
339
  // 인라인 `<code>` 로 렌더링되므로 변수명·파일명은 번역하지 않고
297
340
  // 남깁니다.
package/src/lang/pt-BR.ts CHANGED
@@ -134,6 +134,9 @@ const ptBRMessages = {
134
134
  disconnectFailed: "Falha ao desconectar",
135
135
  signInFailed: "Falha ao entrar com o Google",
136
136
  statusFailed: "Falha ao carregar o status",
137
+ description: "O acesso remoto permite que um dispositivo móvel se conecte às coleções e feeds deste MulmoClaude.",
138
+ howTo: "No seu telefone, abra {url} e entre com a mesma conta do Google.",
139
+ customViewHint: "Para uma visualização adaptada ao celular, peça ao Claude para criar uma {keyword} (não uma custom view comum).",
137
140
  },
138
141
  sidebarHeader: {
139
142
  home: "Ir para o chat mais recente",
@@ -178,6 +181,9 @@ const ptBRMessages = {
178
181
  // "RO" = Read-Only. Abreviação em inglês mantida para caber como
179
182
  // badge compacto ao lado do rótulo Referência.
180
183
  readOnlyBadge: "RO",
184
+ showSystemFiles: "Exibir arquivos do sistema",
185
+ showSystemFilesTitle:
186
+ "Mostra os diretórios raiz internos do agente (conversations/, feeds/ etc.) além do conteúdo do usuário (data/, artifacts/, config/).",
181
187
  },
182
188
  fileTree: {
183
189
  workspace: "(workspace)",
@@ -229,6 +235,8 @@ const ptBRMessages = {
229
235
  photos: "Fotos",
230
236
  model: "Modelo",
231
237
  voice: "Voz",
238
+ chatIndex: "Índice de chat",
239
+ journal: "Diário",
232
240
  skills: "Skills",
233
241
  roles: "Papéis",
234
242
  },
@@ -288,6 +296,42 @@ const ptBRMessages = {
288
296
  loadError: "Falha ao carregar as configurações",
289
297
  saveError: "Falha ao salvar",
290
298
  },
299
+ chatIndexTab: {
300
+ description:
301
+ "Títulos e resumos gerados por IA para o histórico do chat. Sai desativado por padrão — sessões de automação (scheduler / workers do sistema) sempre são ignoradas mesmo quando ativado; sessões humanas pagam apenas uma chamada ao sumarizador ao terminar cada turno.",
302
+ modeLabel: "Modelo do índice de chat",
303
+ helperText: "Haiku é mais barato; Sonnet dá títulos mais precisos em sessões longas que mudam de assunto.",
304
+ mode: {
305
+ off: "Desativado",
306
+ haiku: "Haiku",
307
+ sonnet: "Sonnet",
308
+ },
309
+ status: {
310
+ off: "Indexação DESATIVADA",
311
+ haiku: "Indexando com Haiku",
312
+ sonnet: "Indexando com Sonnet",
313
+ },
314
+ loadError: "Falha ao carregar as configurações",
315
+ saveError: "Falha ao salvar",
316
+ },
317
+ journalTab: {
318
+ description:
319
+ "Diário diário automatizado — resume sessões recentes de chat em journal/*.md e extrai notas de memória duradoura. Sai desativado por padrão. Sessões de automação (scheduler / workers do sistema) são sempre excluídas, independentemente desta configuração.",
320
+ modeLabel: "Modelo do diário",
321
+ helperText: "Haiku é mais barato; Sonnet produz resumos diários / por tópico mais ricos. A passagem horária só é executada quando isto está ativado.",
322
+ mode: {
323
+ off: "Desativado",
324
+ haiku: "Haiku",
325
+ sonnet: "Sonnet",
326
+ },
327
+ status: {
328
+ off: "Diário DESATIVADO",
329
+ haiku: "Diário em execução com Haiku",
330
+ sonnet: "Diário em execução com Sonnet",
331
+ },
332
+ loadError: "Falha ao carregar as configurações",
333
+ saveError: "Falha ao salvar",
334
+ },
291
335
  // Slots `<i18n-t>` — os nomes `envKey` / `envFile` renderizam como
292
336
  // `<code>` inline no SettingsModal.vue, então os literais de
293
337
  // variável e nome de arquivo permanecem não traduzidos.
package/src/lang/zh.ts CHANGED
@@ -136,6 +136,9 @@ const zhMessages = {
136
136
  disconnectFailed: "断开连接失败",
137
137
  signInFailed: "Google 登录失败",
138
138
  statusFailed: "加载状态失败",
139
+ description: "远程访问允许移动设备连接到此 MulmoClaude 的收藏与消息流。",
140
+ howTo: "在手机上打开 {url},用同一个 Google 账号登录。",
141
+ customViewHint: "如需移动端优化的视图,请让 Claude 创建 {keyword}(而不是普通的 custom view)。",
139
142
  },
140
143
  sidebarHeader: {
141
144
  home: "前往最新对话",
@@ -179,6 +182,8 @@ const zhMessages = {
179
182
  reference: "引用",
180
183
  // "RO" = Read-Only. 保留英文缩写作为紧凑徽章。
181
184
  readOnlyBadge: "RO",
185
+ showSystemFiles: "显示系统文件",
186
+ showSystemFilesTitle: "在用户内容(data/、artifacts/、config/)之外同时显示代理内部的顶层目录(conversations/、feeds/ 等)。",
182
187
  },
183
188
  fileTree: {
184
189
  workspace: "(工作区)",
@@ -230,6 +235,8 @@ const zhMessages = {
230
235
  photos: "照片",
231
236
  model: "模型",
232
237
  voice: "语音",
238
+ chatIndex: "聊天索引",
239
+ journal: "日志",
233
240
  skills: "技能",
234
241
  roles: "角色",
235
242
  },
@@ -286,6 +293,42 @@ const zhMessages = {
286
293
  loadError: "加载设置失败",
287
294
  saveError: "保存失败",
288
295
  },
296
+ chatIndexTab: {
297
+ description:
298
+ "为聊天历史自动生成 AI 标题/摘要。默认关闭。开启后自动化会话(scheduler / 系统 worker)仍会始终跳过;只有人类会话在每次轮次结束时才会调用一次摘要。",
299
+ modeLabel: "聊天索引模型",
300
+ helperText: "Haiku 更便宜;Sonnet 在长且话题多变的会话中标题更精准。",
301
+ mode: {
302
+ off: "关闭",
303
+ haiku: "Haiku",
304
+ sonnet: "Sonnet",
305
+ },
306
+ status: {
307
+ off: "索引已关闭",
308
+ haiku: "使用 Haiku 建立索引中",
309
+ sonnet: "使用 Sonnet 建立索引中",
310
+ },
311
+ loadError: "加载设置失败",
312
+ saveError: "保存失败",
313
+ },
314
+ journalTab: {
315
+ description:
316
+ "自动化每日日志 — 将近期聊天会话摘要为 journal/*.md,并抽取持久化记忆笔记。默认关闭。自动化会话(scheduler / 系统 worker)无论此设置如何都会始终排除。",
317
+ modeLabel: "日志模型",
318
+ helperText: "Haiku 更便宜;Sonnet 生成的每日/主题摘要更丰富。仅在此设置开启时每小时的轮次才会运行。",
319
+ mode: {
320
+ off: "关闭",
321
+ haiku: "Haiku",
322
+ sonnet: "Sonnet",
323
+ },
324
+ status: {
325
+ off: "日志已关闭",
326
+ haiku: "使用 Haiku 运行日志中",
327
+ sonnet: "使用 Sonnet 运行日志中",
328
+ },
329
+ loadError: "加载设置失败",
330
+ saveError: "保存失败",
331
+ },
289
332
  // `<i18n-t>` 插槽 — 命名为 `envKey` / `envFile`,在 SettingsModal.vue
290
333
  // 中作为行内 `<code>` 渲染,因此字面的变量名和文件名保持不翻译。
291
334
  geminiRequired: "图像生成需要 {envKey}。请将它加入 {envFile} 并重启应用。",
@@ -0,0 +1,29 @@
1
+ // Selection helpers for the session-history sidebar row.
2
+ //
3
+ // The AI summary (chat indexer) is preferred over the raw first user
4
+ // message when it's meaningful. "Meaningful" excludes undefined / empty
5
+ // / whitespace-only strings — otherwise a summarizer that returns " "
6
+ // would blank out the row (no visible text, no tooltip, no aria label).
7
+
8
+ export interface SessionPreviewInput {
9
+ summary?: string;
10
+ preview: string;
11
+ }
12
+
13
+ export function resolveSessionSummary(summary: string | undefined): string | null {
14
+ const trimmed = summary?.trim();
15
+ return trimmed || null;
16
+ }
17
+
18
+ // `null` means "nothing to show" — the template turns that into the
19
+ // localised `noMessages` placeholder. Not baked in here to keep this
20
+ // pure (no i18n dependency).
21
+ export function resolveSessionPrimaryText(session: SessionPreviewInput): string | null {
22
+ const summary = resolveSessionSummary(session.summary);
23
+ if (summary) return summary;
24
+ return session.preview || null;
25
+ }
26
+
27
+ export function sessionHasVisibleSummary(session: SessionPreviewInput): boolean {
28
+ return resolveSessionSummary(session.summary) !== null;
29
+ }