Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,21 @@ All notable changes to MeMesh are documented here.

### Fixed

- **The isolated release suite now owns its npm cache.** The release runner
no longer inherits a maintainer's `~/.npm` cache when nested tests execute
`npm pack`, so local ownership damage cannot turn an otherwise isolated
release check into an `EPERM` failure. A source contract pins the private
cache wiring. See
`docs/postmortems/2026-09-13-isolated-suite-npm-cache.md`.
- **Dashboard auto-repair permission failures now explain the next action.**
Config and plugin-cache repairs that cannot create their required local
files return a stable `operation.permission-denied` error with fixed,
path-free guidance. The Dashboard translates it in every supported locale
and tells the user to restart `memesh serve` from their own terminal and
retry, instead of replacing the cause with “unexpected server error.” The
regression gate covers direct filesystem errors, the plugin upgrade-lock
failure, unrelated failures, path redaction, and retry availability. See
`docs/postmortems/2026-09-13-dashboard-auto-repair-permission.md`.
- **A later Stop in the same session updates its session insights instead of
freezing them (#322).** `session-summary.js` runs on `Stop`, which fires at
the end of every turn, not once per session; a guard added for #240 froze a
Expand Down
8 changes: 4 additions & 4 deletions dashboard/dist/index.html

Large diffs are not rendered by default.

11 changes: 11 additions & 0 deletions dashboard/src/lib/i18n.ts
Original file line number Diff line number Diff line change
Expand Up @@ -461,6 +461,7 @@ const translations: Record<Locale, Record<string, string>> = {
'httpError.operation.failed': 'The server could not complete this action.',
'httpError.rate.limited': 'Too many requests in a short time. Wait a moment and try again.',
'httpError.server.internal': 'The server hit an unexpected error.',
'httpError.operation.permission-denied': 'MeMesh cannot modify the files needed for this repair. Close this dashboard, run `memesh serve` in your own Terminal, and try again. If it still fails, run `memesh doctor`.',
'time.justNow': 'Just now',
'time.hoursAgo': '{count}h ago',
'time.today': 'Today',
Expand Down Expand Up @@ -1105,6 +1106,7 @@ const translations: Record<Locale, Record<string, string>> = {
'httpError.operation.failed': '伺服器無法完成這個動作。',
'httpError.rate.limited': '短時間內送出太多請求。請稍候片刻再試一次。',
'httpError.server.internal': '伺服器發生預期外的錯誤。',
'httpError.operation.permission-denied': 'MeMesh 沒有權限修改這次修復需要的檔案。請關閉此儀表板,在你自己的終端機執行 `memesh serve`,再重試。若仍失敗,請執行 `memesh doctor`。',
'time.justNow': '剛剛',
'time.hoursAgo': '{count} 小時前',
'time.today': '今天',
Expand Down Expand Up @@ -1748,6 +1750,7 @@ const translations: Record<Locale, Record<string, string>> = {
'httpError.operation.failed': '服务器无法完成此操作。',
'httpError.rate.limited': '短时间内发送的请求过多。请稍候片刻再试一次。',
'httpError.server.internal': '服务器发生意外错误。',
'httpError.operation.permission-denied': 'MeMesh 没有权限修改这次修复所需的文件。请关闭此仪表板,在你自己的终端中运行 `memesh serve`,然后重试。如果仍然失败,请运行 `memesh doctor`。',
'time.justNow': '刚刚',
'time.hoursAgo': '{count} 小时前',
'time.today': '今天',
Expand Down Expand Up @@ -2391,6 +2394,7 @@ const translations: Record<Locale, Record<string, string>> = {
'httpError.operation.failed': 'サーバーはこの操作を完了できませんでした。',
'httpError.rate.limited': '短時間にリクエストが多すぎます。少し待ってからもう一度お試しください。',
'httpError.server.internal': 'サーバーで予期しないエラーが発生しました。',
'httpError.operation.permission-denied': 'この修復に必要なファイルを MeMesh が変更する権限がありません。このダッシュボードを閉じ、自分のターミナルで `memesh serve` を実行してから再試行してください。それでも失敗する場合は `memesh doctor` を実行してください。',
'time.justNow': 'たった今',
'time.hoursAgo': '{count} 時間前',
'time.today': '今日',
Expand Down Expand Up @@ -3034,6 +3038,7 @@ const translations: Record<Locale, Record<string, string>> = {
'httpError.operation.failed': '서버가 이 작업을 완료하지 못했습니다.',
'httpError.rate.limited': '짧은 시간에 요청이 너무 많습니다. 잠시 후 다시 시도하세요.',
'httpError.server.internal': '서버에서 예기치 않은 오류가 발생했습니다.',
'httpError.operation.permission-denied': 'MeMesh에 이 복구에 필요한 파일을 수정할 권한이 없습니다. 이 대시보드를 닫고 본인의 터미널에서 `memesh serve`를 실행한 뒤 다시 시도하세요. 계속 실패하면 `memesh doctor`를 실행하세요.',
'time.justNow': '방금',
'time.hoursAgo': '{count}시간 전',
'time.today': '오늘',
Expand Down Expand Up @@ -3677,6 +3682,7 @@ const translations: Record<Locale, Record<string, string>> = {
'httpError.operation.failed': 'O servidor não conseguiu concluir esta ação.',
'httpError.rate.limited': 'Muitas solicitações em pouco tempo. Aguarde um momento e tente novamente.',
'httpError.server.internal': 'O servidor encontrou um erro inesperado.',
'httpError.operation.permission-denied': 'O MeMesh não tem permissão para modificar os arquivos necessários para este reparo. Feche este painel, execute `memesh serve` no seu próprio Terminal e tente novamente. Se ainda falhar, execute `memesh doctor`.',
'time.justNow': 'Agora',
'time.hoursAgo': 'Há {count}h',
'time.today': 'Hoje',
Expand Down Expand Up @@ -4320,6 +4326,7 @@ const translations: Record<Locale, Record<string, string>> = {
'httpError.operation.failed': 'Le serveur n’a pas pu terminer cette action.',
'httpError.rate.limited': 'Trop de requêtes en peu de temps. Patientez un instant et réessayez.',
'httpError.server.internal': 'Le serveur a rencontré une erreur inattendue.',
'httpError.operation.permission-denied': 'MeMesh n’a pas l’autorisation de modifier les fichiers nécessaires à cette réparation. Fermez ce tableau de bord, exécutez `memesh serve` dans votre propre terminal, puis réessayez. Si l’échec persiste, exécutez `memesh doctor`.',
'time.justNow': 'À l\'instant',
'time.hoursAgo': 'Il y a {count}h',
'time.today': 'Aujourd\'hui',
Expand Down Expand Up @@ -4963,6 +4970,7 @@ const translations: Record<Locale, Record<string, string>> = {
'httpError.operation.failed': 'Der Server konnte diese Aktion nicht abschließen.',
'httpError.rate.limited': 'Zu viele Anfragen in kurzer Zeit. Warten Sie einen Moment und versuchen Sie es erneut.',
'httpError.server.internal': 'Auf dem Server ist ein unerwarteter Fehler aufgetreten.',
'httpError.operation.permission-denied': 'MeMesh darf die für diese Reparatur benötigten Dateien nicht ändern. Schließen Sie dieses Dashboard, führen Sie `memesh serve` in Ihrem eigenen Terminal aus und versuchen Sie es erneut. Falls es weiterhin fehlschlägt, führen Sie `memesh doctor` aus.',
'time.justNow': 'Gerade eben',
'time.hoursAgo': 'Vor {count} Std',
'time.today': 'Heute',
Expand Down Expand Up @@ -5606,6 +5614,7 @@ const translations: Record<Locale, Record<string, string>> = {
'httpError.operation.failed': 'Máy chủ không thể hoàn tất thao tác này.',
'httpError.rate.limited': 'Quá nhiều yêu cầu trong thời gian ngắn. Vui lòng đợi một lát rồi thử lại.',
'httpError.server.internal': 'Máy chủ gặp lỗi không mong muốn.',
'httpError.operation.permission-denied': 'MeMesh không có quyền sửa các tệp cần thiết cho lần khắc phục này. Hãy đóng bảng điều khiển, chạy `memesh serve` trong Terminal của bạn rồi thử lại. Nếu vẫn lỗi, hãy chạy `memesh doctor`.',
'time.justNow': 'Vừa xong',
'time.hoursAgo': '{count} giờ trước',
'time.today': 'Hôm nay',
Expand Down Expand Up @@ -6249,6 +6258,7 @@ const translations: Record<Locale, Record<string, string>> = {
'httpError.operation.failed': 'El servidor no pudo completar esta acción.',
'httpError.rate.limited': 'Demasiadas solicitudes en poco tiempo. Espera un momento e inténtalo de nuevo.',
'httpError.server.internal': 'El servidor encontró un error inesperado.',
'httpError.operation.permission-denied': 'MeMesh no tiene permiso para modificar los archivos necesarios para esta reparación. Cierra este panel, ejecuta `memesh serve` en tu propio terminal y vuelve a intentarlo. Si sigue fallando, ejecuta `memesh doctor`.',
'time.justNow': 'Ahora',
'time.hoursAgo': 'Hace {count}h',
'time.today': 'Hoy',
Expand Down Expand Up @@ -6892,6 +6902,7 @@ const translations: Record<Locale, Record<string, string>> = {
'httpError.operation.failed': 'เซิร์ฟเวอร์ไม่สามารถทำงานนี้ให้เสร็จได้',
'httpError.rate.limited': 'มีคำขอมากเกินไปในช่วงเวลาสั้น ๆ กรุณารอสักครู่แล้วลองใหม่อีกครั้ง',
'httpError.server.internal': 'เซิร์ฟเวอร์เกิดข้อผิดพลาดที่ไม่คาดคิด',
'httpError.operation.permission-denied': 'MeMesh ไม่มีสิทธิ์แก้ไขไฟล์ที่จำเป็นสำหรับการซ่อมแซมนี้ ปิดแดชบอร์ดนี้ เรียกใช้ `memesh serve` ใน Terminal ของคุณ แล้วลองอีกครั้ง หากยังล้มเหลว ให้เรียกใช้ `memesh doctor`',
'time.justNow': 'เมื่อสักครู่',
'time.hoursAgo': '{count} ชั่วโมงที่แล้ว',
'time.today': 'วันนี้',
Expand Down
1 change: 1 addition & 0 deletions dist/core/doctor-fixes.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ export interface PluginRefreshResult {
output: string;
restartRequired: true;
}
export declare function isDoctorFixPermissionError(error: unknown): boolean;
export declare function pluginHostFromDoctorCheck(check: {
params?: Record<string, string | number>;
}): 'claude-code' | 'codex';
Expand Down
2 changes: 1 addition & 1 deletion dist/core/doctor-fixes.d.ts.map

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

21 changes: 21 additions & 0 deletions dist/core/doctor-fixes.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading