Merge remote-tracking branch 'origin/main' into feature/rtl_ui

This commit is contained in:
Elian Doran 2025-10-09 17:46:26 +03:00
commit 9d7c513fb7
No known key found for this signature in database
61 changed files with 1662 additions and 670 deletions

View File

@ -12,7 +12,7 @@ jobs:
steps:
- name: Check if PRs have conflicts
uses: eps1lon/actions-label-merge-conflict@v3
if: github.repository == ${{ vars.REPO_MAIN }}
if: github.repository == ${{ vars.REPO_MAIN }} && ${{secrets.MERGE_CONFLICT_LABEL_PAT}}
with:
dirtyLabel: "merge-conflicts"
repoToken: "${{ secrets.MERGE_CONFLICT_LABEL_PAT }}"

View File

@ -67,7 +67,7 @@ jobs:
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v3
uses: github/codeql-action/init@v4
with:
languages: ${{ matrix.language }}
build-mode: ${{ matrix.build-mode }}
@ -95,6 +95,6 @@ jobs:
exit 1
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3
uses: github/codeql-action/analyze@v4
with:
category: "/language:${{matrix.language}}"

View File

@ -55,7 +55,7 @@ jobs:
- name: Setup Python
uses: actions/setup-python@v6
with:
python-version: '3.13'
python-version: '3.14'
cache: 'pip'
cache-dependency-path: 'requirements-docs.txt'
@ -118,6 +118,7 @@ jobs:
- name: Deploy
uses: ./.github/actions/deploy-to-cloudflare-pages
if: github.repository == ${{ vars.REPO_MAIN }} && ${{secrets.CLOUDFLARE_API_TOKEN}}
with:
project_name: "trilium-docs"
comment_body: "📚 Documentation preview is ready"

View File

@ -77,7 +77,7 @@ jobs:
GPG_SIGNING_KEY: ${{ secrets.GPG_SIGN_KEY }}
- name: Publish release
uses: softprops/action-gh-release@v2.3.4
uses: softprops/action-gh-release@v2.4.0
if: ${{ github.event_name != 'pull_request' }}
with:
make_latest: false
@ -118,7 +118,7 @@ jobs:
arch: ${{ matrix.arch }}
- name: Publish release
uses: softprops/action-gh-release@v2.3.4
uses: softprops/action-gh-release@v2.4.0
if: ${{ github.event_name != 'pull_request' }}
with:
make_latest: false

View File

@ -127,7 +127,7 @@ jobs:
path: upload
- name: Publish stable release
uses: softprops/action-gh-release@v2.3.4
uses: softprops/action-gh-release@v2.4.0
with:
draft: false
body_path: docs/Release Notes/Release Notes/${{ github.ref_name }}.md

View File

@ -44,7 +44,7 @@
"eslint": "9.37.0",
"eslint-plugin-simple-import-sort": "12.1.1",
"esm": "3.2.25",
"jsdoc": "4.0.4",
"jsdoc": "4.0.5",
"lorem-ipsum": "2.0.8",
"rcedit": "4.0.1",
"rimraf": "6.0.1",

View File

@ -51,9 +51,9 @@
"leaflet": "1.9.4",
"leaflet-gpx": "2.2.0",
"mark.js": "8.11.1",
"marked": "16.3.0",
"marked": "16.4.0",
"mermaid": "11.12.0",
"mind-elixir": "5.1.1",
"mind-elixir": "5.3.2",
"normalize.css": "8.0.1",
"panzoom": "9.4.3",
"preact": "10.27.2",

View File

@ -6,7 +6,8 @@
"sync_version": "اصدار المزامنه:",
"build_date": "تاريخ الانشاء:",
"build_revision": "مراجعة الاصدار:",
"data_directory": "مجلد البيانات:"
"data_directory": "مجلد البيانات:",
"db_version": "اصدار قاعدة البيانات:"
},
"toast": {
"critical-error": {
@ -26,6 +27,369 @@
"save": "حفظ"
},
"bulk_actions": {
"bulk_actions": "اجراءات جماعية"
"bulk_actions": "اجراءات جماعية",
"available_actions": "الاجراءات المتاحة",
"chosen_actions": "الأجراءات المختارة",
"execute_bulk_actions": "تنفيذ الأجراءات الجماعية",
"bulk_actions_executed": "تم تنفيذ الاجراءات الجماعية بنجاح،",
"none_yet": "لايوجد أجراء بعد... اضف اجراء بالنقر على احد الأجراءات المتاحة اعلاه.",
"relations": "العلاقات",
"notes": "الملاحظات",
"other": "أخرى",
"affected_notes": "الملاحظات المتأثرة"
},
"upload_attachments": {
"options": "خيارات",
"upload": "تحميل"
},
"attribute_detail": {
"name": "الاسم",
"value": "قيمة",
"promoted": "تمت ترقيته",
"promoted_alias": "اسم مستعار",
"label_type": "نوع",
"text": "نص",
"date": "تاريخ",
"time": "وقت",
"precision": "دفة",
"digits": "رقم",
"delete": "حذف",
"color_type": "لون",
"multiplicity": "تعددية",
"number": "عدد",
"boolean": "منطقي",
"url": "عنوان الويب",
"inheritable": "قابل للوراثة"
},
"rename_label": {
"to": "الى"
},
"move_note": {
"to": "الى"
},
"add_relation": {
"to": "الى"
},
"rename_relation": {
"to": "الى"
},
"update_relation_target": {
"to": "الى"
},
"attachments_actions": {
"download": "تنزيل"
},
"calendar": {
"week": "أسبوع",
"month": "شهر",
"year": "سنة",
"list": "قائمة",
"today": "اليوم",
"mon": "الأثنين",
"tue": "الثلاثاء",
"wed": "الأربعاء",
"thu": "الخميس",
"fri": "الجمعة",
"sat": "السبت",
"sun": "الأحد",
"january": "يناير",
"march": "مارس",
"april": "ابريل",
"may": "مايو",
"june": "يونيو",
"july": "يوليو",
"august": "أغسطس",
"september": "سبتمبر",
"october": "اكتوبر",
"november": "نوفمبر",
"december": "ديسمبر"
},
"global_menu": {
"menu": "القائمة",
"options": "خيارات",
"advanced": "متقدمة",
"logout": "تسجيل خروج",
"zoom": "تكبير/تصغير"
},
"zpetne_odkazy": {
"relation": "العلاقة"
},
"note_icon": {
"category": "الفئة:",
"search": "بحث:"
},
"basic_properties": {
"language": "اللغة",
"editable": "قابل للتعديل"
},
"book_properties": {
"list": "قائمة",
"expand": "توسيع",
"calendar": "التقويم",
"table": "جدول",
"board": "لوحة",
"grid": "خطوط شبكة",
"collapse": "طي"
},
"file_properties": {
"download": "تنزيل",
"open": "فتح",
"title": "ملف"
},
"image_properties": {
"download": "تنزيل",
"open": "فتح",
"title": "صورة"
},
"note_info_widget": {
"created": "انشاء",
"type": "نوع",
"modified": "معدل",
"calculate": "حساب"
},
"note_paths": {
"search": "بحث",
"archived": "مؤرشف"
},
"script_executor": {
"query": "استعلام",
"script": "برنامج نصي"
},
"search_definition": {
"ancestor": "السلف",
"limit": "الحد الاقصى",
"action": "أجراء",
"search_button": "بحث",
"debug": "تصحيح الاخطاء"
},
"ancestor": {
"label": "السلف",
"depth_label": "العمق"
},
"limit": {
"limit": "الحد الاقصى"
},
"debug": {
"debug": "تصحيح الاخطاء"
},
"order_by": {
"title": "عنوان",
"desc": "تنازلي"
},
"search_string": {
"search_prefix": "بحث:"
},
"sync": {
"title": "مزامنة"
},
"fonts": {
"fonts": "خطوط",
"size": "حجم",
"serif": "خط ومزخرف",
"monospace": "خط بعرض ثابت"
},
"confirm": {
"confirmation": "تأكيد",
"cancel": "الغاء",
"ok": "نعم"
},
"delete_notes": {
"close": "غلق",
"cancel": "الغاء",
"ok": "نعم"
},
"export": {
"close": "غلق",
"export": "تصدير",
"export_note_title": "تصدير الملاحظة",
"export_status": "حالة التصدير"
},
"help": {
"troubleshooting": "أستكشاف الاخطاء واصلاحها",
"other": "أخرى",
"title": "ورقة المراجعة السريعة",
"noteNavigation": "التنقل بين الملاحظات",
"collapseExpand": "طي/توسيع العقدة",
"notSet": "غير محدد",
"collapseSubTree": "طي الشجرة الفرعية",
"tabShortcuts": "أختصارات التبويب",
"creatingNotes": "انشاء الملاحظات",
"selectNote": "تحديد الملاحظة"
},
"import": {
"options": "خيارات",
"import": "استيراد"
},
"include_note": {
"label_note": "ملاحظة"
},
"info": {
"closeButton": "أغلاق",
"okButton": "نعم"
},
"markdown_import": {
"import_button": "أستيراد"
},
"note_type_chooser": {
"templates": "قوالب"
},
"prompt": {
"title": "ترقية",
"ok": "نعم",
"defaultTitle": "ترقية"
},
"protected_session_password": {
"close_label": "أغلاق"
},
"revisions": {
"delete_button": "حذف",
"download_button": "تنزيل",
"restore_button": "أستعادة",
"preview": "معاينة:"
},
"sort_child_notes": {
"title": "عنوان",
"ascending": "تصاعدي",
"descending": "تنازلي",
"folders": "مجلدات",
"sort": "فرز"
},
"recent_changes": {
"undelete_link": "الغاء الحذف"
},
"edited_notes": {
"deleted": "(حذف)"
},
"note_properties": {
"info": "معلومات"
},
"backend_log": {
"refresh": "تحديث"
},
"max_content_width": {
"max_width_unit": "بكسل"
},
"native_title_bar": {
"enabled": "مفعل",
"disabled": "معطل"
},
"theme": {
"theme_label": "السمة",
"layout": "تخطيط",
"layout-vertical-title": "عمودي",
"layout-horizontal-title": "أفقي"
},
"ui-performance": {
"title": "أداء"
},
"ai_llm": {
"progress": "تقدم",
"openai_tab": "OpenAI",
"actions": "أجراءات",
"retry": "أعد المحاولة",
"reprocessing_index": "جار اعادة البناء...",
"never": "ابدٱ",
"agent": {
"processing": "جار المعالجة...",
"thinking": "جار التفكير...",
"loading": "جار التحميل...",
"generating": "جار الانشاء..."
},
"name": "الذكاء الأصطناعي",
"openai": "OpenAI",
"sources": "مصادر"
},
"code_auto_read_only_size": {
"unit": "حروف"
},
"code-editor-options": {
"title": "محرر"
},
"images": {
"images_section_title": "صور",
"max_image_dimensions_unit": "بكسل"
},
"revisions_snapshot_limit": {
"snapshot_number_limit_unit": "لقطات"
},
"search_engine": {
"bing": "Bing",
"duckduckgo": "DuckDuckGo",
"google": "جوجل",
"save_button": "حفظ"
},
"heading_style": {
"plain": "بسيط"
},
"text_auto_read_only_size": {
"unit": "حروف"
},
"i18n": {
"language": "لغة",
"sunday": "الأحد",
"monday": "الأثنين"
},
"backup": {
"path": "مسار"
},
"etapi": {
"wiki": "ويكي",
"created": "تم الأنشاء",
"actions": "أجراءات"
},
"password": {
"heading": "كلمة السر",
"wiki": "ويكي"
},
"shortcuts": {
"shortcuts": "أختصارات",
"description": "الوصف"
},
"sync_2": {
"timeout_unit": "ميلي ثانية",
"note": "ملاحظة",
"save": "حفظ",
"help": "المساعدة"
},
"api_log": {
"close": "أغلاق"
},
"bookmark_switch": {
"bookmark": "علامة مرجعية"
},
"editability_select": {
"auto": "تلقائي",
"read_only": "قراءة-فقط"
},
"tab_row": {
"close": "اغلاق"
},
"toc": {
"options": "خيارات"
},
"tasks": {
"due": {
"yesterday": "أمس"
}
},
"code_theme": {
"title": "المظهر"
},
"table_view": {
"sort-column-ascending": "تصاعدي",
"sort-column-descending": "تنازلي",
"new-column-relation": "العلاقة"
},
"modal": {
"close": "اغلاق"
},
"call_to_action": {
"dismiss": "تجاهل"
},
"units": {
"percentage": "%"
},
"clone_to": {
"prefix_optional": "بادئة (اختياري)"
}
}

View File

@ -0,0 +1,8 @@
{
"about": {
"title": "Tentang Trilium Notes",
"homepage": "Halaman utama:",
"app_version": "Versi Aplikasi:",
"db_version": "Versi DB:"
}
}

View File

@ -67,7 +67,8 @@
"switch_to_mobile_version": "モバイル版に切り替え",
"switch_to_desktop_version": "デスクトップ版に切り替え",
"configure_launchbar": "ランチャーバーの設定",
"show_shared_notes_subtree": "共有ノートのサブツリーを表示"
"show_shared_notes_subtree": "共有ノートのサブツリーを表示",
"update_available": "バージョン {{latestVersion}} が利用可能です。クリックしてダウンロードしてください。"
},
"left_pane_toggle": {
"show_panel": "パネルを表示",
@ -1290,7 +1291,7 @@
"cut": "カット",
"copy": "コピー",
"copy-link": "リンクをコピー",
"paste": "ペースト",
"paste": "貼り付け",
"paste-as-plain-text": "プレーンテキストで貼り付け",
"search_online": "{{searchEngine}} で \"{{term}}\" を検索"
},

View File

@ -34,15 +34,15 @@
"@triliumnext/commons": "workspace:*",
"@triliumnext/server": "workspace:*",
"copy-webpack-plugin": "13.0.1",
"electron": "38.2.1",
"@electron-forge/cli": "7.9.0",
"@electron-forge/maker-deb": "7.9.0",
"@electron-forge/maker-dmg": "7.9.0",
"@electron-forge/maker-flatpak": "7.9.0",
"@electron-forge/maker-rpm": "7.9.0",
"@electron-forge/maker-squirrel": "7.9.0",
"@electron-forge/maker-zip": "7.9.0",
"@electron-forge/plugin-auto-unpack-natives": "7.9.0",
"electron": "38.2.2",
"@electron-forge/cli": "7.10.0",
"@electron-forge/maker-deb": "7.10.0",
"@electron-forge/maker-dmg": "7.10.0",
"@electron-forge/maker-flatpak": "7.10.0",
"@electron-forge/maker-rpm": "7.10.0",
"@electron-forge/maker-squirrel": "7.10.0",
"@electron-forge/maker-zip": "7.10.0",
"@electron-forge/plugin-auto-unpack-natives": "7.10.0",
"prebuild-install": "7.1.3"
}
}

View File

@ -12,7 +12,7 @@
"@triliumnext/desktop": "workspace:*",
"@types/fs-extra": "11.0.4",
"copy-webpack-plugin": "13.0.1",
"electron": "38.2.1",
"electron": "38.2.2",
"fs-extra": "11.3.2"
},
"scripts": {

View File

@ -81,7 +81,7 @@
"debounce": "2.2.0",
"debug": "4.4.3",
"ejs": "3.1.10",
"electron": "38.2.1",
"electron": "38.2.2",
"electron-debug": "4.1.0",
"electron-window-state": "5.0.3",
"escape-html": "1.0.3",
@ -105,7 +105,7 @@
"is-svg": "6.1.0",
"jimp": "1.6.0",
"js-yaml": "4.1.0",
"marked": "16.3.0",
"marked": "16.4.0",
"mime-types": "3.0.1",
"multer": "2.0.2",
"normalize-strings": "1.1.1",

View File

@ -18,6 +18,134 @@
"copy-notes-to-clipboard": "نسخ الملاحظات المحددة الى الحافظة",
"paste-notes-from-clipboard": "لصق الملاحظا من الحافظة الى الملاحظة الحالية",
"cut-notes-to-clipboard": "قص الملاحظات المحددة الى الحافظة",
"select-all-notes-in-parent": "تحديد جميع الملاحظات من مستوى الملاحظة الحالي"
"select-all-notes-in-parent": "تحديد جميع الملاحظات من مستوى الملاحظة الحالي",
"back-in-note-history": "الانتقال الى الملاحظة السابقة في السجل",
"forward-in-note-history": "الانتقال الى الملاحظة التالية في السجل",
"scroll-to-active-note": "تمرير شجرة الملاحظات الى الملاحظة النشطة",
"search-in-subtree": "البحث عن الملاحظات في الشجرة الفرعية للملاحظة النشطة",
"expand-subtree": "توسيع الشجرة الفرعية للملاحظة الحالية",
"create-note-into-inbox": "انشاء ملاحظة في صندوق الوارد (اذا كان معرفا) او في ملاحظة اليوم",
"move-note-up-in-hierarchy": "نقل الملاحظة للاعلى في التسلسل الهرمي",
"move-note-down-in-hierarchy": "نقل الملاحظة للاسفل في التسلسل الهرمي",
"edit-note-title": "الانتقال من شجرة الملاحظات إلى تفاصيل الملاحظة وتحرير العنوان",
"edit-branch-prefix": "عرض مربع حوار \"تعديل بادئة الفرع\"",
"add-note-above-to-the-selection": "اضافة ملاحظة فوق الملاحظة المحددة",
"add-note-below-to-selection": "اضافة ملاحظة اسفل الملاحظة المحددة",
"duplicate-subtree": "استنساخ الشجرة الفرعية",
"tabs-and-windows": "التبويبات والنوافذ",
"open-new-tab": "فتح تبويب جديد",
"close-active-tab": "غلق التبويب النشط",
"reopen-last-tab": "اعادة فتح اخر تبويب مغلق",
"activate-next-tab": "تنشيط التبويب الموجود على اليمين",
"activate-previous-tab": "تنشيط التبويب الموجود على اليسار",
"open-new-window": "فتح نافذة جديدة فارغة",
"first-tab": "تنشيط التبويب الاول في القائمة",
"second-tab": "تنشيط التبويب الثاني في القائمة",
"third-tab": "تنشيط التبويب الثالث في الثائمة",
"fourth-tab": "تنشيط التبويب الرابع في القائمة",
"fifth-tab": "تنشيط التبويب الخامس في القائمة",
"sixth-tab": "تنشيط التبويب السادس في القائمة",
"seventh-tab": "تنشيط التبويب السابع في القائمة",
"eight-tab": "تنشيط التبويب الثامن في القائمة",
"ninth-tab": "تنشيط التبويب التاسع في القائمة",
"last-tab": "تنشيط التبويب الاخير في القائمة",
"other": "أخرى",
"dialogs": "مربعات الحوار"
},
"setup_sync-from-server": {
"note": "ملاحظة:",
"password": "كلمة السر",
"password-placeholder": "كلمة السر",
"back": "رجوع",
"server-host-placeholder": "https://<hostname>:<port>",
"proxy-server-placeholder": "https://<hostname>:<port>"
},
"weekdays": {
"monday": "الأثنين",
"tuesday": "الثلاثاء",
"wednesday": "الاربعاء",
"thursday": "الخميس",
"friday": "الجمعة",
"saturday": "السبت",
"sunday": "الأحد"
},
"months": {
"january": "يناير",
"february": "فبراير",
"march": "مارس",
"april": "ابريل",
"may": "مايو",
"june": "يونيو",
"july": "يوليو",
"august": "أغسطس",
"september": "سبتمبر",
"october": "أكتوبر",
"november": "نوفمبر",
"december": "ديسمبر"
},
"special_notes": {
"search_prefix": "بحث:"
},
"hidden-subtree": {
"calendar-title": "تقويم",
"bookmarks-title": "العلامات المرجعية",
"settings-title": "أعدادات",
"options-title": "خيارات",
"appearance-title": "المظهر",
"shortcuts-title": "أختصارات",
"images-title": "صور",
"password-title": "كلمة السر",
"backup-title": "نسخة أحتياطية",
"sync-title": "مزامنة",
"other": "أخرى",
"advanced-title": "متقدم",
"inbox-title": "صندوق الوارد",
"spacer-title": "فاصل",
"spellcheck-title": "التدقيق الاملائي",
"multi-factor-authentication-title": "المصادقة متعددة العوامل"
},
"tray": {
"bookmarks": "العلامات المرجعية"
},
"modals": {
"error_title": "خطأ"
},
"share_theme": {
"search_placeholder": "بحث...",
"subpages": "الصفحات الفرعية:",
"expand": "توسيع"
},
"hidden_subtree_templates": {
"description": "الوصف",
"calendar": "التقويم",
"table": "جدول",
"geolocation": "الموقع الجغرافي",
"board": "لوحة",
"status": "الحالة",
"board_status_done": "تمت"
},
"login": {
"title": "تسجيل الدخول",
"password": "كلمة السر",
"button": "تسجيل الدخول"
},
"set_password": {
"password": "كلمة السر"
},
"setup": {
"next": "التالي",
"title": "تثبيت"
},
"setup_sync-from-desktop": {
"step6-here": "هنا"
},
"setup_sync-in-progress": {
"outstanding-items-default": "غير متوفر"
},
"share_page": {
"parent": "الأصل:"
},
"notes": {
"duplicate-note-suffix": "(مكرر)"
}
}

View File

@ -0,0 +1,8 @@
{
"keyboard_actions": {
"back-in-note-history": "Navigasi ke catatan sebelumnya di history",
"forward-in-note-history": "Navigasi ke catatan selanjutnya di history",
"open-jump-to-note-dialog": "Buka dialog \"Menuju ke catatan\"",
"open-command-palette": "Buka palet perintah"
}
}

View File

@ -1,4 +1,5 @@
import { BNote } from "../../services/backend_script_entrypoint";
import cls from "../../services/cls";
import { buildNote } from "../../test/becca_easy_mocking";
import { processContent } from "./clipper";
@ -6,7 +7,9 @@ let note!: BNote;
describe("processContent", () => {
beforeAll(() => {
note = buildNote({});
note = buildNote({
content: "Hi there"
});
note.saveAttachment = () => {};
vi.mock("../../services/image.js", () => ({
default: {
@ -21,29 +24,29 @@ describe("processContent", () => {
});
it("processes basic note", () => {
const processed = processContent([], note, "<p>Hello world.</p>");
const processed = cls.init(() => processContent([], note, "<p>Hello world.</p>"));
expect(processed).toStrictEqual("<p>Hello world.</p>")
});
it("processes plain text", () => {
const processed = processContent([], note, "Hello world.");
const processed = cls.init(() => processContent([], note, "Hello world."));
expect(processed).toStrictEqual("<p>Hello world.</p>")
});
it("replaces images", () => {
const processed = processContent(
const processed = cls.init(() => processContent(
[{"imageId":"OKZxZA3MonZJkwFcEhId","src":"inline.png","dataUrl":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAQCAYAAADESFVDAAAAF0lEQVQoU2P8DwQMBADjqKLRIGAgKggAzHs/0SoYCGwAAAAASUVORK5CYII="}],
note, `<img src="OKZxZA3MonZJkwFcEhId">`
);
));
expect(processed).toStrictEqual(`<img src="api/attachments/foo/image/encodedTitle" >`);
});
it("skips over non-data images", () => {
for (const url of [ "foo", "" ]) {
const processed = processContent(
const processed = cls.init(() => processContent(
[{"imageId":"OKZxZA3MonZJkwFcEhId","src":"inline.png","dataUrl": url}],
note, `<img src="OKZxZA3MonZJkwFcEhId">`
);
));
expect(processed).toStrictEqual(`<img src="OKZxZA3MonZJkwFcEhId" >`);
}
});

View File

@ -3,7 +3,7 @@ import { beforeAll, describe, expect, it, vi, beforeEach, afterEach } from "vite
import supertest from "supertest";
import config from "../../services/config.js";
import { refreshAuth } from "../../services/auth.js";
import type { WebSocket } from 'ws';
import { sleepFor } from "@triliumnext/commons";
// Mock the CSRF protection middleware to allow tests to pass
vi.mock("../csrf_protection.js", () => ({
@ -72,7 +72,11 @@ vi.mock("../../services/options.js", () => ({
getOptionMap: vi.fn(() => new Map()),
createOption: vi.fn(),
getOption: vi.fn(() => '0'),
getOptionOrNull: vi.fn(() => null)
getOptionOrNull: vi.fn(() => null),
getOptionInt: vi.fn(name => {
if (name === "protectedSessionTimeout") return Number.MAX_SAFE_INTEGER;
return 0;
})
}
}));
@ -499,6 +503,7 @@ describe("LLM API Tests", () => {
const ws = (await import("../../services/ws.js")).default;
// Verify thinking message was sent
await sleepFor(1_000);
expect(ws.sendMessageToAllClients).toHaveBeenCalledWith({
type: 'llm-stream',
chatNoteId: testChatId,

View File

@ -12,7 +12,11 @@ import type { AIService, ChatCompletionOptions, Message } from './ai_interface.j
vi.mock('../options.js', () => ({
default: {
getOption: vi.fn(),
getOptionBool: vi.fn()
getOptionBool: vi.fn(),
getOptionInt: vi.fn(name => {
if (name === "protectedSessionTimeout") return Number.MAX_SAFE_INTEGER;
return 0;
})
}
}));

View File

@ -15,7 +15,11 @@ vi.mock('../../log.js', () => ({
vi.mock('../../options.js', () => ({
default: {
getOption: vi.fn(),
getOptionBool: vi.fn()
getOptionBool: vi.fn(),
getOptionInt: vi.fn(name => {
if (name === "protectedSessionTimeout") return Number.MAX_SAFE_INTEGER;
return 0;
})
}
}));

View File

@ -18,7 +18,11 @@ vi.mock('./configuration_manager.js', () => ({
vi.mock('../../options.js', () => ({
default: {
getOption: vi.fn(),
getOptionBool: vi.fn()
getOptionBool: vi.fn(),
getOptionInt: vi.fn(name => {
if (name === "protectedSessionTimeout") return Number.MAX_SAFE_INTEGER;
return 0;
})
}
}));

View File

@ -10,7 +10,11 @@ import { PROVIDER_CONSTANTS } from '../constants/provider_constants.js';
vi.mock('../../options.js', () => ({
default: {
getOption: vi.fn(),
getOptionBool: vi.fn()
getOptionBool: vi.fn(),
getOptionInt: vi.fn(name => {
if (name === "protectedSessionTimeout") return Number.MAX_SAFE_INTEGER;
return 0;
})
}
}));

View File

@ -10,7 +10,11 @@ import options from '../../options.js';
vi.mock('../../options.js', () => ({
default: {
getOption: vi.fn(),
getOptionBool: vi.fn()
getOptionBool: vi.fn(),
getOptionInt: vi.fn(name => {
if (name === "protectedSessionTimeout") return Number.MAX_SAFE_INTEGER;
return 0;
})
}
}));

View File

@ -9,7 +9,11 @@ import { Ollama } from 'ollama';
vi.mock('../../options.js', () => ({
default: {
getOption: vi.fn(),
getOptionBool: vi.fn()
getOptionBool: vi.fn(),
getOptionInt: vi.fn(name => {
if (name === "protectedSessionTimeout") return Number.MAX_SAFE_INTEGER;
return 0;
})
}
}));

View File

@ -2,13 +2,17 @@ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
import { OpenAIService } from './openai_service.js';
import options from '../../options.js';
import * as providers from './providers.js';
import type { ChatCompletionOptions, Message } from '../ai_interface.js';
import type { Message } from '../ai_interface.js';
// Mock dependencies
vi.mock('../../options.js', () => ({
default: {
getOption: vi.fn(),
getOptionBool: vi.fn()
getOptionBool: vi.fn(),
getOptionInt: vi.fn(name => {
if (name === "protectedSessionTimeout") return Number.MAX_SAFE_INTEGER;
return 0;
})
}
}));

View File

@ -1,9 +1,6 @@
"use strict";
import log from "./log.js";
import dataEncryptionService from "./encryption/data_encryption.js";
import options from "./options.js";
import ws from "./ws.js";
let dataKey: Buffer | null = null;
@ -15,11 +12,11 @@ function getDataKey() {
return dataKey;
}
function resetDataKey() {
export function resetDataKey() {
dataKey = null;
}
function isProtectedSessionAvailable() {
export function isProtectedSessionAvailable() {
return !!dataKey;
}
@ -57,15 +54,8 @@ function touchProtectedSession() {
}
}
function checkProtectedSessionExpiration() {
const protectedSessionTimeout = options.getOptionInt("protectedSessionTimeout");
if (isProtectedSessionAvailable() && lastProtectedSessionOperationDate && Date.now() - lastProtectedSessionOperationDate > protectedSessionTimeout * 1000) {
resetDataKey();
log.info("Expiring protected session");
ws.reloadFrontend("leaving protected session");
}
export function getLastProtectedSessionOperationDate() {
return lastProtectedSessionOperationDate;
}
export default {
@ -75,6 +65,5 @@ export default {
encrypt,
decrypt,
decryptString,
touchProtectedSession,
checkProtectedSessionExpiration
touchProtectedSession
};

View File

@ -4,9 +4,11 @@ import sqlInit from "./sql_init.js";
import config from "./config.js";
import log from "./log.js";
import attributeService from "../services/attributes.js";
import protectedSessionService from "../services/protected_session.js";
import hiddenSubtreeService from "./hidden_subtree.js";
import type BNote from "../becca/entities/bnote.js";
import options from "./options.js";
import { getLastProtectedSessionOperationDate, isProtectedSessionAvailable, resetDataKey } from "./protected_session.js";
import ws from "./ws.js";
function getRunAtHours(note: BNote): number[] {
try {
@ -64,5 +66,15 @@ sqlInit.dbReady.then(() => {
);
}
setInterval(() => protectedSessionService.checkProtectedSessionExpiration(), 30000);
setInterval(() => checkProtectedSessionExpiration(), 1);
});
function checkProtectedSessionExpiration() {
const protectedSessionTimeout = options.getOptionInt("protectedSessionTimeout");
const lastProtectedSessionOperationDate = getLastProtectedSessionOperationDate();
if (isProtectedSessionAvailable() && lastProtectedSessionOperationDate && Date.now() - lastProtectedSessionOperationDate > protectedSessionTimeout * 1000) {
resetDataKey();
log.info("Expiring protected session");
ws.reloadFrontend("leaving protected session");
}
}

View File

@ -211,7 +211,8 @@ described in the "Discuss with us" section above.
* [zadam](https://github.com/zadam) for the original concept and implementation
of the application.
* [Larsa](https://github.com/LarsaSara) for designing the application icon.
* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the
application icon.
* [nriver](https://github.com/nriver) for his work on internationalization.
* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas.
* [antoniotejada](https://github.com/nriver) for the original syntax highlight

View File

@ -202,7 +202,8 @@ pnpm run --filter desktop electron-forge:make --arch=x64 --platform=win32
* [zadam](https://github.com/zadam) for the original concept and implementation
of the application.
* [Larsa](https://github.com/LarsaSara) for designing the application icon.
* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the
application icon.
* [nriver](https://github.com/nriver) for his work on internationalization.
* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas.
* [antoniotejada](https://github.com/nriver) for the original syntax highlight

17
docs/README-ar.md vendored
View File

@ -135,7 +135,7 @@ compatible with the latest zadam/trilium version of
versions of TriliumNext/Trilium have their sync versions incremented which
prevents direct migration.
## تحدث معنا
## 💬تحدث معنا
Feel free to join our official conversations. We would love to hear what
features, suggestions, or issues you may have!
@ -157,7 +157,7 @@ Download the binary release for your platform from the [latest release
page](https://github.com/TriliumNext/Trilium/releases/latest), unzip the package
and run the `trilium` executable.
### Linux
### لينكس
If your distribution is listed in the table below, use your distribution's
package.
@ -179,7 +179,7 @@ interface (which is almost identical to the desktop app).
Currently only the latest versions of Chrome & Firefox are supported (and
tested).
### Mobile
### هاتف المحمول
To use TriliumNext on a mobile device, you can use a mobile web browser to
access the mobile interface of a server installation (see below).
@ -194,7 +194,7 @@ repository](https://github.com/FliegendeWurst/TriliumDroid). Note: It is best to
disable automatic updates on your server installation (see below) when using
TriliumDroid since the sync version must match between Trilium and TriliumDroid.
### Server
### الخادم
To install TriliumNext on your own server (including via Docker from
[Dockerhub](https://hub.docker.com/r/triliumnext/trilium)) follow [the server
@ -203,7 +203,7 @@ installation docs](https://triliumnext.github.io/Docs/Wiki/server-installation).
## 💻 Contribute
### Translations
### ترجمات
If you are a native speaker, help us translate Trilium by heading over to our
[Weblate page](https://hosted.weblate.org/engage/trilium/).
@ -213,7 +213,7 @@ Here's the language coverage we have so far:
[![Translation
status](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/)
### Code
### كود
Download the repository, install dependencies using `pnpm` and then run the
server (available at http://localhost:8080):
@ -224,7 +224,7 @@ pnpm install
pnpm run server:start
```
### Documentation
### التوثيق
Download the repository, install dependencies using `pnpm` and then run the
environment required to edit the documentation:
@ -259,7 +259,8 @@ described in the "Discuss with us" section above.
* [zadam](https://github.com/zadam) for the original concept and implementation
of the application.
* [Larsa](https://github.com/LarsaSara) for designing the application icon.
* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the
application icon.
* [nriver](https://github.com/nriver) for his work on internationalization.
* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas.
* [antoniotejada](https://github.com/nriver) for the original syntax highlight

3
docs/README-ca.md vendored
View File

@ -259,7 +259,8 @@ described in the "Discuss with us" section above.
* [zadam](https://github.com/zadam) for the original concept and implementation
of the application.
* [Larsa](https://github.com/LarsaSara) for designing the application icon.
* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the
application icon.
* [nriver](https://github.com/nriver) for his work on internationalization.
* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas.
* [antoniotejada](https://github.com/nriver) for the original syntax highlight

3
docs/README-cs.md vendored
View File

@ -259,7 +259,8 @@ described in the "Discuss with us" section above.
* [zadam](https://github.com/zadam) for the original concept and implementation
of the application.
* [Larsa](https://github.com/LarsaSara) for designing the application icon.
* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the
application icon.
* [nriver](https://github.com/nriver) for his work on internationalization.
* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas.
* [antoniotejada](https://github.com/nriver) for the original syntax highlight

3
docs/README-de.md vendored
View File

@ -259,7 +259,8 @@ described in the "Discuss with us" section above.
* [zadam](https://github.com/zadam) for the original concept and implementation
of the application.
* [Larsa](https://github.com/LarsaSara) for designing the application icon.
* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the
application icon.
* [nriver](https://github.com/nriver) for his work on internationalization.
* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas.
* [antoniotejada](https://github.com/nriver) for the original syntax highlight

3
docs/README-el.md vendored
View File

@ -259,7 +259,8 @@ described in the "Discuss with us" section above.
* [zadam](https://github.com/zadam) for the original concept and implementation
of the application.
* [Larsa](https://github.com/LarsaSara) for designing the application icon.
* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the
application icon.
* [nriver](https://github.com/nriver) for his work on internationalization.
* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas.
* [antoniotejada](https://github.com/nriver) for the original syntax highlight

3
docs/README-es.md vendored
View File

@ -259,7 +259,8 @@ described in the "Discuss with us" section above.
* [zadam](https://github.com/zadam) for the original concept and implementation
of the application.
* [Larsa](https://github.com/LarsaSara) for designing the application icon.
* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the
application icon.
* [nriver](https://github.com/nriver) for his work on internationalization.
* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas.
* [antoniotejada](https://github.com/nriver) for the original syntax highlight

3
docs/README-fa.md vendored
View File

@ -259,7 +259,8 @@ described in the "Discuss with us" section above.
* [zadam](https://github.com/zadam) for the original concept and implementation
of the application.
* [Larsa](https://github.com/LarsaSara) for designing the application icon.
* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the
application icon.
* [nriver](https://github.com/nriver) for his work on internationalization.
* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas.
* [antoniotejada](https://github.com/nriver) for the original syntax highlight

3
docs/README-fi.md vendored
View File

@ -259,7 +259,8 @@ described in the "Discuss with us" section above.
* [zadam](https://github.com/zadam) for the original concept and implementation
of the application.
* [Larsa](https://github.com/LarsaSara) for designing the application icon.
* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the
application icon.
* [nriver](https://github.com/nriver) for his work on internationalization.
* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas.
* [antoniotejada](https://github.com/nriver) for the original syntax highlight

3
docs/README-fr.md vendored
View File

@ -259,7 +259,8 @@ described in the "Discuss with us" section above.
* [zadam](https://github.com/zadam) for the original concept and implementation
of the application.
* [Larsa](https://github.com/LarsaSara) for designing the application icon.
* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the
application icon.
* [nriver](https://github.com/nriver) for his work on internationalization.
* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas.
* [antoniotejada](https://github.com/nriver) for the original syntax highlight

3
docs/README-hr.md vendored
View File

@ -259,7 +259,8 @@ described in the "Discuss with us" section above.
* [zadam](https://github.com/zadam) for the original concept and implementation
of the application.
* [Larsa](https://github.com/LarsaSara) for designing the application icon.
* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the
application icon.
* [nriver](https://github.com/nriver) for his work on internationalization.
* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas.
* [antoniotejada](https://github.com/nriver) for the original syntax highlight

3
docs/README-hu.md vendored
View File

@ -259,7 +259,8 @@ described in the "Discuss with us" section above.
* [zadam](https://github.com/zadam) for the original concept and implementation
of the application.
* [Larsa](https://github.com/LarsaSara) for designing the application icon.
* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the
application icon.
* [nriver](https://github.com/nriver) for his work on internationalization.
* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas.
* [antoniotejada](https://github.com/nriver) for the original syntax highlight

315
docs/README-id.md vendored Normal file
View File

@ -0,0 +1,315 @@
# Trilium Notes
![GitHub Sponsors](https://img.shields.io/github/sponsors/eliandoran)
![LiberaPay patrons](https://img.shields.io/liberapay/patrons/ElianDoran)\
![Docker Pulls](https://img.shields.io/docker/pulls/triliumnext/trilium)
![Unduhan GitHub (semua aset, semua
rilis)](https://img.shields.io/github/downloads/triliumnext/trilium/total)\
[![RelativeCI](https://badges.relative-ci.com/badges/Di5q7dz9daNDZ9UXi0Bp?branch=develop)](https://app.relative-ci.com/projects/Di5q7dz9daNDZ9UXi0Bp)
[![Status
terjemahan](https://hosted.weblate.org/widget/trilium/svg-badge.svg)](https://hosted.weblate.org/engage/trilium/)
[English](./README.md) | [Chinese (Simplified)](./docs/README-ZH_CN.md) |
[Chinese (Traditional)](./docs/README-ZH_TW.md) | [Russian](./docs/README-ru.md)
| [Japanese](./docs/README-ja.md) | [Italian](./docs/README-it.md) |
[Spanish](./docs/README-es.md)
Trilium Notes adalah aplikasi pencatatan hierarkis lintas platform yang gratis
dan sumber terbuka dengan fokus untuk mengembangkan pengetahuan pribadi yang
luas.
See [screenshots](https://triliumnext.github.io/Docs/Wiki/screenshot-tour) for
quick overview:
<a href="https://triliumnext.github.io/Docs/Wiki/screenshot-tour"><img src="./docs/app.png" alt="Trilium Screenshot" width="1000"></a>
## 📚 Dokumentasi
**Kunjungi dokumentasi lengkap kami di
[docs.triliumnotes.org](https://docs.triliumnotes.org/)**
Dokumentasi kami tersedia dalam berbagai format:
- **Dokumentasi Online**: Telusuri dokumentasi lengkap di
[docs.triliumnotes.org](https://docs.triliumnotes.org/)
- **Bantuan Dalam Aplikasi**: Tekan `F1` di dalam Trilium untuk mengakses
dokumentasi yang sama langsung di aplikasi
- **GitHub**: Navigasi melalui [Panduan
Pengguna](./docs/User%20Guide/User%20Guide/) di repositori ini
### Tautan Cepat
- [Panduan Memulai](https://docs.triliumnotes.org/)
- [Petunjuk
Instalasi](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation.md)
- [Pengaturan
Docker](./docs/User%20Guide/User%20Guide/Installation%20&%20Setup/Server%20Installation/1.%20Installing%20the%20server/Using%20Docker.md)
- [Upgrading
TriliumNext](./docs/User%20Guide/User%20Guide/Installation%20%26%20Setup/Upgrading%20TriliumNext.md)
- [Basic Concepts and
Features](./docs/User%20Guide/User%20Guide/Basic%20Concepts%20and%20Features/Notes.md)
- [Patterns of Personal Knowledge
Base](https://triliumnext.github.io/Docs/Wiki/patterns-of-personal-knowledge)
## 🎁 Features
* Notes can be arranged into arbitrarily deep tree. Single note can be placed
into multiple places in the tree (see
[cloning](https://triliumnext.github.io/Docs/Wiki/cloning-notes))
* Rich WYSIWYG note editor including e.g. tables, images and
[math](https://triliumnext.github.io/Docs/Wiki/text-notes) with markdown
[autoformat](https://triliumnext.github.io/Docs/Wiki/text-notes#autoformat)
* Support for editing [notes with source
code](https://triliumnext.github.io/Docs/Wiki/code-notes), including syntax
highlighting
* Fast and easy [navigation between
notes](https://triliumnext.github.io/Docs/Wiki/note-navigation), full text
search and [note
hoisting](https://triliumnext.github.io/Docs/Wiki/note-hoisting)
* Seamless [note
versioning](https://triliumnext.github.io/Docs/Wiki/note-revisions)
* Note [attributes](https://triliumnext.github.io/Docs/Wiki/attributes) can be
used for note organization, querying and advanced
[scripting](https://triliumnext.github.io/Docs/Wiki/scripts)
* UI available in English, German, Spanish, French, Romanian, and Chinese
(simplified and traditional)
* Direct [OpenID and TOTP
integration](./docs/User%20Guide/User%20Guide/Installation%20%26%20Setup/Server%20Installation/Multi-Factor%20Authentication.md)
for more secure login
* [Synchronization](https://triliumnext.github.io/Docs/Wiki/synchronization)
with self-hosted sync server
* there's a [3rd party service for hosting synchronisation
server](https://trilium.cc/paid-hosting)
* [Sharing](https://triliumnext.github.io/Docs/Wiki/sharing) (publishing) notes
to public internet
* Strong [note
encryption](https://triliumnext.github.io/Docs/Wiki/protected-notes) with
per-note granularity
* Sketching diagrams, based on [Excalidraw](https://excalidraw.com/) (note type
"canvas")
* [Relation maps](https://triliumnext.github.io/Docs/Wiki/relation-map) and
[link maps](https://triliumnext.github.io/Docs/Wiki/link-map) for visualizing
notes and their relations
* Mind maps, based on [Mind Elixir](https://docs.mind-elixir.com/)
* [Geo maps](./docs/User%20Guide/User%20Guide/Note%20Types/Geo%20Map.md) with
location pins and GPX tracks
* [Scripting](https://triliumnext.github.io/Docs/Wiki/scripts) - see [Advanced
showcases](https://triliumnext.github.io/Docs/Wiki/advanced-showcases)
* [REST API](https://triliumnext.github.io/Docs/Wiki/etapi) for automation
* Scales well in both usability and performance upwards of 100 000 notes
* Touch optimized [mobile
frontend](https://triliumnext.github.io/Docs/Wiki/mobile-frontend) for
smartphones and tablets
* Built-in [dark theme](https://triliumnext.github.io/Docs/Wiki/themes), support
for user themes
* [Evernote](https://triliumnext.github.io/Docs/Wiki/evernote-import) and
[Markdown import & export](https://triliumnext.github.io/Docs/Wiki/markdown)
* [Web Clipper](https://triliumnext.github.io/Docs/Wiki/web-clipper) for easy
saving of web content
* Customizable UI (sidebar buttons, user-defined widgets, ...)
* [Metrics](./docs/User%20Guide/User%20Guide/Advanced%20Usage/Metrics.md), along
with a [Grafana
Dashboard](./docs/User%20Guide/User%20Guide/Advanced%20Usage/Metrics/grafana-dashboard.json)
✨ Check out the following third-party resources/communities for more TriliumNext
related goodies:
- [awesome-trilium](https://github.com/Nriver/awesome-trilium) for 3rd party
themes, scripts, plugins and more.
- [TriliumRocks!](https://trilium.rocks/) for tutorials, guides, and much more.
## ❓Why TriliumNext?
The original Trilium developer ([Zadam](https://github.com/zadam)) has
graciously given the Trilium repository to the community project which resides
at https://github.com/TriliumNext
### ⬆Migrating from Zadam/Trilium?
There are no special migration steps to migrate from a zadam/Trilium instance to
a TriliumNext/Trilium instance. Simply [install
TriliumNext/Trilium](#-installation) as usual and it will use your existing
database.
Versions up to and including
[v0.90.4](https://github.com/TriliumNext/Trilium/releases/tag/v0.90.4) are
compatible with the latest zadam/trilium version of
[v0.63.7](https://github.com/zadam/trilium/releases/tag/v0.63.7). Any later
versions of TriliumNext/Trilium have their sync versions incremented which
prevents direct migration.
## 💬 Discuss with us
Feel free to join our official conversations. We would love to hear what
features, suggestions, or issues you may have!
- [Matrix](https://matrix.to/#/#triliumnext:matrix.org) (For synchronous
discussions.)
- The `General` Matrix room is also bridged to
[XMPP](xmpp:discuss@trilium.thisgreat.party?join)
- [Github Discussions](https://github.com/TriliumNext/Trilium/discussions) (For
asynchronous discussions.)
- [Github Issues](https://github.com/TriliumNext/Trilium/issues) (For bug
reports and feature requests.)
## 🏗 Installation
### Windows / MacOS
Download the binary release for your platform from the [latest release
page](https://github.com/TriliumNext/Trilium/releases/latest), unzip the package
and run the `trilium` executable.
### Linux
If your distribution is listed in the table below, use your distribution's
package.
[![Packaging
status](https://repology.org/badge/vertical-allrepos/triliumnext.svg)](https://repology.org/project/triliumnext/versions)
You may also download the binary release for your platform from the [latest
release page](https://github.com/TriliumNext/Trilium/releases/latest), unzip the
package and run the `trilium` executable.
TriliumNext is also provided as a Flatpak, but not yet published on FlatHub.
### Browser (any OS)
If you use a server installation (see below), you can directly access the web
interface (which is almost identical to the desktop app).
Currently only the latest versions of Chrome & Firefox are supported (and
tested).
### Mobile
To use TriliumNext on a mobile device, you can use a mobile web browser to
access the mobile interface of a server installation (see below).
See issue https://github.com/TriliumNext/Trilium/issues/4962 for more
information on mobile app support.
If you prefer a native Android app, you can use
[TriliumDroid](https://apt.izzysoft.de/fdroid/index/apk/eu.fliegendewurst.triliumdroid).
Report bugs and missing features at [their
repository](https://github.com/FliegendeWurst/TriliumDroid). Note: It is best to
disable automatic updates on your server installation (see below) when using
TriliumDroid since the sync version must match between Trilium and TriliumDroid.
### Server
To install TriliumNext on your own server (including via Docker from
[Dockerhub](https://hub.docker.com/r/triliumnext/trilium)) follow [the server
installation docs](https://triliumnext.github.io/Docs/Wiki/server-installation).
## 💻 Contribute
### Translations
If you are a native speaker, help us translate Trilium by heading over to our
[Weblate page](https://hosted.weblate.org/engage/trilium/).
Here's the language coverage we have so far:
[![Translation
status](https://hosted.weblate.org/widget/trilium/multi-auto.svg)](https://hosted.weblate.org/engage/trilium/)
### Code
Download the repository, install dependencies using `pnpm` and then run the
server (available at http://localhost:8080):
```shell
git clone https://github.com/TriliumNext/Trilium.git
cd Trilium
pnpm install
pnpm run server:start
```
### Documentation
Download the repository, install dependencies using `pnpm` and then run the
environment required to edit the documentation:
```shell
git clone https://github.com/TriliumNext/Trilium.git
cd Trilium
pnpm install
pnpm edit-docs:edit-docs
```
### Building the Executable
Download the repository, install dependencies using `pnpm` and then build the
desktop app for Windows:
```shell
git clone https://github.com/TriliumNext/Trilium.git
cd Trilium
pnpm install
pnpm run --filter desktop electron-forge:make --arch=x64 --platform=win32
```
For more details, see the [development
docs](https://github.com/TriliumNext/Trilium/tree/main/docs/Developer%20Guide/Developer%20Guide).
### Developer Documentation
Please view the [documentation
guide](https://github.com/TriliumNext/Trilium/blob/main/docs/Developer%20Guide/Developer%20Guide/Environment%20Setup.md)
for details. If you have more questions, feel free to reach out via the links
described in the "Discuss with us" section above.
## 👏 Shoutouts
* [zadam](https://github.com/zadam) for the original concept and implementation
of the application.
* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the
application icon.
* [nriver](https://github.com/nriver) for his work on internationalization.
* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas.
* [antoniotejada](https://github.com/nriver) for the original syntax highlight
widget.
* [Dosu](https://dosu.dev/) for providing us with the automated responses to
GitHub issues and discussions.
* [Tabler Icons](https://tabler.io/icons) for the system tray icons.
Trilium would not be possible without the technologies behind it:
* [CKEditor 5](https://github.com/ckeditor/ckeditor5) - the visual editor behind
text notes. We are grateful for being offered a set of the premium features.
* [CodeMirror](https://github.com/codemirror/CodeMirror) - code editor with
support for huge amount of languages.
* [Excalidraw](https://github.com/excalidraw/excalidraw) - the infinite
whiteboard used in Canvas notes.
* [Mind Elixir](https://github.com/SSShooter/mind-elixir-core) - providing the
mind map functionality.
* [Leaflet](https://github.com/Leaflet/Leaflet) - for rendering geographical
maps.
* [Tabulator](https://github.com/olifolkerd/tabulator) - for the interactive
table used in collections.
* [FancyTree](https://github.com/mar10/fancytree) - feature-rich tree library
without real competition.
* [jsPlumb](https://github.com/jsplumb/jsplumb) - visual connectivity library.
Used in [relation
maps](https://triliumnext.github.io/Docs/Wiki/relation-map.html) and [link
maps](https://triliumnext.github.io/Docs/Wiki/note-map.html#link-map)
## 🤝 Support
Trilium is built and maintained with [hundreds of hours of
work](https://github.com/TriliumNext/Trilium/graphs/commit-activity). Your
support keeps it open-source, improves features, and covers costs such as
hosting.
Consider supporting the main developer
([eliandoran](https://github.com/eliandoran)) of the application via:
- [GitHub Sponsors](https://github.com/sponsors/eliandoran)
- [PayPal](https://paypal.me/eliandoran)
- [Buy Me a Coffee](https://buymeacoffee.com/eliandoran)
## 🔑 License
Copyright 2017-2025 zadam, Elian Doran, and other contributors
This program is free software: you can redistribute it and/or modify it under
the terms of the GNU Affero General Public License as published by the Free
Software Foundation, either version 3 of the License, or (at your option) any
later version.

3
docs/README-it.md vendored
View File

@ -260,7 +260,8 @@ described in the "Discuss with us" section above.
* [zadam](https://github.com/zadam) for the original concept and implementation
of the application.
* [Larsa](https://github.com/LarsaSara) for designing the application icon.
* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the
application icon.
* [nriver](https://github.com/nriver) for his work on internationalization.
* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas.
* [antoniotejada](https://github.com/nriver) for the original syntax highlight

2
docs/README-ja.md vendored
View File

@ -215,7 +215,7 @@ pnpm run --filter desktop electron-forge:make --arch=x64 --platform=win32
## 👏 シャウトアウト
* [zadam](https://github.com/zadam) アプリケーションのオリジナルのコンセプトと実装に対して感謝します。
* [Larsa](https://github.com/LarsaSara) アプリケーションアイコンをデザイン。
* [Sarah Hussein](https://github.com/Sarah-Hussein) アプリケーションアイコンをデザイン。
* [nriver](https://github.com/nriver) 国際化への取り組み。
* [Thomas Frei](https://github.com/thfrei) Canvasへのオリジナルな取り組み。
* [antoniotejada](https://github.com/nriver) オリジナルの構文ハイライトウィジェット。

3
docs/README-ko.md vendored
View File

@ -259,7 +259,8 @@ described in the "Discuss with us" section above.
* [zadam](https://github.com/zadam) for the original concept and implementation
of the application.
* [Larsa](https://github.com/LarsaSara) for designing the application icon.
* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the
application icon.
* [nriver](https://github.com/nriver) for his work on internationalization.
* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas.
* [antoniotejada](https://github.com/nriver) for the original syntax highlight

3
docs/README-md.md vendored
View File

@ -259,7 +259,8 @@ described in the "Discuss with us" section above.
* [zadam](https://github.com/zadam) for the original concept and implementation
of the application.
* [Larsa](https://github.com/LarsaSara) for designing the application icon.
* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the
application icon.
* [nriver](https://github.com/nriver) for his work on internationalization.
* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas.
* [antoniotejada](https://github.com/nriver) for the original syntax highlight

View File

@ -259,7 +259,8 @@ described in the "Discuss with us" section above.
* [zadam](https://github.com/zadam) for the original concept and implementation
of the application.
* [Larsa](https://github.com/LarsaSara) for designing the application icon.
* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the
application icon.
* [nriver](https://github.com/nriver) for his work on internationalization.
* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas.
* [antoniotejada](https://github.com/nriver) for the original syntax highlight

3
docs/README-nl.md vendored
View File

@ -259,7 +259,8 @@ described in the "Discuss with us" section above.
* [zadam](https://github.com/zadam) for the original concept and implementation
of the application.
* [Larsa](https://github.com/LarsaSara) for designing the application icon.
* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the
application icon.
* [nriver](https://github.com/nriver) for his work on internationalization.
* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas.
* [antoniotejada](https://github.com/nriver) for the original syntax highlight

3
docs/README-pl.md vendored
View File

@ -259,7 +259,8 @@ described in the "Discuss with us" section above.
* [zadam](https://github.com/zadam) for the original concept and implementation
of the application.
* [Larsa](https://github.com/LarsaSara) for designing the application icon.
* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the
application icon.
* [nriver](https://github.com/nriver) for his work on internationalization.
* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas.
* [antoniotejada](https://github.com/nriver) for the original syntax highlight

3
docs/README-pt.md vendored
View File

@ -259,7 +259,8 @@ described in the "Discuss with us" section above.
* [zadam](https://github.com/zadam) for the original concept and implementation
of the application.
* [Larsa](https://github.com/LarsaSara) for designing the application icon.
* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the
application icon.
* [nriver](https://github.com/nriver) for his work on internationalization.
* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas.
* [antoniotejada](https://github.com/nriver) for the original syntax highlight

View File

@ -259,7 +259,8 @@ described in the "Discuss with us" section above.
* [zadam](https://github.com/zadam) for the original concept and implementation
of the application.
* [Larsa](https://github.com/LarsaSara) for designing the application icon.
* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the
application icon.
* [nriver](https://github.com/nriver) for his work on internationalization.
* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas.
* [antoniotejada](https://github.com/nriver) for the original syntax highlight

3
docs/README-ro.md vendored
View File

@ -263,7 +263,8 @@ legăturile descrise în secțiunea „Discutați cu noi” de mai sus.
* [zadam](https://github.com/zadam) pentru conceptul și implementarea originală
a aplicației.
* [Larsa](https://github.com/LarsaSara) pentru pictograma aplicației.
* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the
application icon.
* [nriver](https://github.com/nriver) pentru sistemul de internaționalizare.
* [Thomas Frei](https://github.com/thfrei) pentru munca sa originală pentru
notițele de tip schiță.

5
docs/README-ru.md vendored
View File

@ -261,7 +261,8 @@ described in the "Discuss with us" section above.
* [zadam](https://github.com/zadam) for the original concept and implementation
of the application.
* [Larsa](https://github.com/LarsaSara) for designing the application icon.
* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the
application icon.
* [nriver](https://github.com/nriver) for his work on internationalization.
* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas.
* [antoniotejada](https://github.com/nriver) for the original syntax highlight
@ -307,7 +308,7 @@ Consider supporting the main developer
## 🔑 Лицензия
Copyright 2017-2025 zadam, Elian Doran, and other contributors
Copyright 2017-2025 zadam, Elian Doran и другие авторы
Эта программа является бесплатным программным обеспечением: вы можете
распространять и/или изменять ее в соответствии с условиями GNU Affero General

3
docs/README-sl.md vendored
View File

@ -259,7 +259,8 @@ described in the "Discuss with us" section above.
* [zadam](https://github.com/zadam) for the original concept and implementation
of the application.
* [Larsa](https://github.com/LarsaSara) for designing the application icon.
* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the
application icon.
* [nriver](https://github.com/nriver) for his work on internationalization.
* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas.
* [antoniotejada](https://github.com/nriver) for the original syntax highlight

3
docs/README-sr.md vendored
View File

@ -259,7 +259,8 @@ described in the "Discuss with us" section above.
* [zadam](https://github.com/zadam) for the original concept and implementation
of the application.
* [Larsa](https://github.com/LarsaSara) for designing the application icon.
* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the
application icon.
* [nriver](https://github.com/nriver) for his work on internationalization.
* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas.
* [antoniotejada](https://github.com/nriver) for the original syntax highlight

3
docs/README-tr.md vendored
View File

@ -259,7 +259,8 @@ described in the "Discuss with us" section above.
* [zadam](https://github.com/zadam) for the original concept and implementation
of the application.
* [Larsa](https://github.com/LarsaSara) for designing the application icon.
* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the
application icon.
* [nriver](https://github.com/nriver) for his work on internationalization.
* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas.
* [antoniotejada](https://github.com/nriver) for the original syntax highlight

3
docs/README-uk.md vendored
View File

@ -259,7 +259,8 @@ described in the "Discuss with us" section above.
* [zadam](https://github.com/zadam) for the original concept and implementation
of the application.
* [Larsa](https://github.com/LarsaSara) for designing the application icon.
* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the
application icon.
* [nriver](https://github.com/nriver) for his work on internationalization.
* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas.
* [antoniotejada](https://github.com/nriver) for the original syntax highlight

3
docs/README-vi.md vendored
View File

@ -259,7 +259,8 @@ described in the "Discuss with us" section above.
* [zadam](https://github.com/zadam) for the original concept and implementation
of the application.
* [Larsa](https://github.com/LarsaSara) for designing the application icon.
* [Sarah Hussein](https://github.com/Sarah-Hussein) for designing the
application icon.
* [nriver](https://github.com/nriver) for his work on internationalization.
* [Thomas Frei](https://github.com/thfrei) for his original work on the Canvas.
* [antoniotejada](https://github.com/nriver) for the original syntax highlight

View File

@ -50,12 +50,12 @@
"eslint": "9.37.0",
"eslint-config-prettier": "10.1.8",
"eslint-plugin-playwright": "2.2.2",
"eslint-plugin-react-hooks": "6.1.1",
"eslint-plugin-react-hooks": "7.0.0",
"happy-dom": "~19.0.0",
"jiti": "2.6.1",
"jsonc-eslint-parser": "2.4.1",
"react-refresh": "0.18.0",
"rollup-plugin-webpack-stats": "2.1.5",
"rollup-plugin-webpack-stats": "2.1.6",
"tslib": "2.8.1",
"tsx": "4.20.6",
"typescript": "~5.9.0",

View File

@ -15,7 +15,7 @@
"ckeditor5-premium-features": "47.0.0"
},
"devDependencies": {
"@smithy/middleware-retry": "4.4.0",
"@smithy/middleware-retry": "4.4.1",
"@types/jquery": "3.5.33"
}
}

View File

@ -16,7 +16,7 @@
"@codemirror/lang-xml": "6.1.0",
"@codemirror/legacy-modes": "6.5.2",
"@codemirror/search": "6.5.11",
"@codemirror/view": "6.38.4",
"@codemirror/view": "6.38.5",
"@fsegurai/codemirror-theme-abcdef": "6.2.2",
"@fsegurai/codemirror-theme-abyss": "6.2.2",
"@fsegurai/codemirror-theme-android-studio": "6.2.2",

View File

@ -54,3 +54,11 @@ export function trimIndentation(strings: TemplateStringsArray, ...values: any[])
}
return output.join("\n");
}
export function flushPromises() {
return new Promise(setImmediate);
}
export function sleepFor(duration: number) {
return new Promise(resolve => setTimeout(resolve, duration));
}

664
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff