mindwtr-mcp 1.1.5 → 1.1.6

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 (2) hide show
  1. package/dist/index.js +670 -75
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -12171,6 +12171,7 @@ var init_vi = __esm(() => {
12171
12171
  "bulk.keepStatus": "Giữ trạng thái",
12172
12172
  "bulk.keepProject": "Giữ dự án",
12173
12173
  "bulk.keepArea": "Giữ khu vực",
12174
+ "bulk.keepSection": "Giữ phần",
12174
12175
  "bulk.waitingPersonRequired": "Chọn người mà các mục này đang chờ.",
12175
12176
  "bulk.deleting": "Đang xóa các nhiệm vụ đã chọn...",
12176
12177
  "taskEdit.aiAssistant": "Trợ lý AI",
@@ -12189,6 +12190,9 @@ var init_vi = __esm(() => {
12189
12190
  "nav.main": "Chính",
12190
12191
  "nav.inbox": "Hộp thư đến",
12191
12192
  "nav.board": "Bảng Kanban",
12193
+ "nav.timeline": "Dòng thời gian",
12194
+ "timeline.empty": "Chưa có gì được lên lịch",
12195
+ "timeline.emptyHint": "Các công việc có ngày bắt đầu hoặc ngày đến hạn sẽ hiển thị ở đây dưới dạng thanh.",
12192
12196
  "nav.projects": "Dự án",
12193
12197
  "nav.contexts": "Ngữ cảnh",
12194
12198
  "nav.next": "Hành động tiếp theo",
@@ -12267,6 +12271,7 @@ var init_vi = __esm(() => {
12267
12271
  "keybindings.goReference": "Đến Tham khảo",
12268
12272
  "keybindings.goCalendar": "Đến Lịch",
12269
12273
  "keybindings.goBoard": "Đến Bảng Kanban",
12274
+ "keybindings.goTimeline": "Đến Dòng thời gian",
12270
12275
  "keybindings.goDone": "Đến Hoàn thành",
12271
12276
  "keybindings.goArchived": "Đến Lưu trữ",
12272
12277
  "keybindings.switchArea": "Chuyển sang Khu vực 1-9",
@@ -12427,6 +12432,7 @@ var init_vi = __esm(() => {
12427
12432
  "attachments.obsidianLinkPlaceholder": "obsidian://open?vault=Vault&file=Note",
12428
12433
  "attachments.obsidianLinkInputHint": 'Dán liên kết ghi chú obsidian:// hoặc dùng "Tiêu đề | obsidian://...".',
12429
12434
  "attachments.fileNotSupported": "Tệp đính kèm chỉ được hỗ trợ trên ứng dụng máy tính.",
12435
+ "attachments.webUnavailable": "Tệp đính kèm này không khả dụng trong ứng dụng web.",
12430
12436
  "attachments.fileTooLarge": "Tệp quá lớn để tải lên.",
12431
12437
  "attachments.fileNotReadable": "Không thể đọc tệp này nên tệp chưa được đính kèm. Hãy chuyển tệp sang thư mục khác và thử lại.",
12432
12438
  "attachments.linkToFile": "Liên kết tới tệp…",
@@ -13348,6 +13354,10 @@ var init_vi = __esm(() => {
13348
13354
  "settings.featureTimeEstimatesDesc": "Thêm ước tính thời lượng nhanh để chặn thời gian.",
13349
13355
  "settings.featurePomodoro": "Hẹn giờ Pomodoro",
13350
13356
  "settings.featurePomodoroDesc": "Bật bảng Pomodoro tùy chọn trong chế độ Tập trung.",
13357
+ "settings.featureTimeline": "Chế độ xem Dòng thời gian",
13358
+ "settings.featureTimelineDesc": "Hiển thị dòng thời gian chỉ đọc của các công việc có ngày trong thanh bên.",
13359
+ "settings.sidebarViews": "Chế độ xem trên thanh bên",
13360
+ "settings.sidebarViewsDesc": "Chọn chế độ xem nào hiển thị trên thanh bên. Chế độ xem bị ẩn vẫn mở được qua tìm kiếm.",
13351
13361
  "settings.pomodoroCustomPreset": "Cài đặt sẵn tùy chỉnh",
13352
13362
  "settings.pomodoroCustomPresetDesc": "Thêm một cài đặt sẵn tập trung/nghỉ thêm. Khớp với cài đặt sẵn tích hợp chỉ giữ các chip tích hợp.",
13353
13363
  "settings.pomodoroFocusMinutes": "Phút tập trung",
@@ -14463,6 +14473,7 @@ var init_zh_Hans = __esm(() => {
14463
14473
  "bulk.keepStatus": "保留状态",
14464
14474
  "bulk.keepProject": "保留项目",
14465
14475
  "bulk.keepArea": "保留领域",
14476
+ "bulk.keepSection": "保留分区",
14466
14477
  "bulk.waitingPersonRequired": "选择这些事项在等待谁。",
14467
14478
  "bulk.deleting": "正在删除所选任务…",
14468
14479
  "taskEdit.aiAssistant": "AI 助手",
@@ -14480,6 +14491,9 @@ var init_zh_Hans = __esm(() => {
14480
14491
  "nav.main": "主页",
14481
14492
  "nav.inbox": "收集箱",
14482
14493
  "nav.board": "看板",
14494
+ "nav.timeline": "时间线",
14495
+ "timeline.empty": "还没有排期的任务",
14496
+ "timeline.emptyHint": "设置了开始日期或截止日期的任务会在这里显示为色条。",
14483
14497
  "nav.projects": "项目",
14484
14498
  "nav.contexts": "情境",
14485
14499
  "nav.next": "下一步行动",
@@ -14557,6 +14571,7 @@ var init_zh_Hans = __esm(() => {
14557
14571
  "keybindings.goReference": "前往参考",
14558
14572
  "keybindings.goCalendar": "前往日历",
14559
14573
  "keybindings.goBoard": "前往看板",
14574
+ "keybindings.goTimeline": "前往时间线",
14560
14575
  "keybindings.goDone": "前往已完成",
14561
14576
  "keybindings.goArchived": "前往归档",
14562
14577
  "keybindings.list.nextPrev": "上下移动选中项",
@@ -14711,6 +14726,7 @@ var init_zh_Hans = __esm(() => {
14711
14726
  "attachments.obsidianLinkPlaceholder": "obsidian://open?vault=Vault&file=Note",
14712
14727
  "attachments.obsidianLinkInputHint": "粘贴 obsidian:// 笔记链接,或使用“标题 | obsidian://...”。",
14713
14728
  "attachments.fileNotSupported": "文件附件仅在桌面应用中支持。",
14729
+ "attachments.webUnavailable": "此附件在网页版中无法使用。",
14714
14730
  "attachments.fileTooLarge": "文件过大,无法上传。",
14715
14731
  "attachments.fileNotReadable": "无法读取此文件,因此未添加附件。请将文件移动到其他文件夹后重试。",
14716
14732
  "attachments.linkToFile": "链接到文件…",
@@ -15055,7 +15071,7 @@ var init_zh_Hans = __esm(() => {
15055
15071
  "projects.sectionPlaceholder": "分区标题",
15056
15072
  "projects.noSection": "无分区",
15057
15073
  "projects.sectionEmpty": "暂无任务",
15058
- "projects.deleteSectionConfirm": "确定要删除此分区吗?",
15074
+ "projects.deleteSectionConfirm": "删除此分区?其中的任务不会被删除,会移到“无分区”。",
15059
15075
  "projects.areaFilter": "领域筛选",
15060
15076
  "projects.allAreas": "所有领域",
15061
15077
  "projects.noArea": "无领域",
@@ -15082,6 +15098,8 @@ var init_zh_Hans = __esm(() => {
15082
15098
  "projects.complete": "完成",
15083
15099
  "projects.archive": "归档",
15084
15100
  "projects.reactivate": "重新激活",
15101
+ "projects.archivedTaskInspectionHint": "双击查看此任务。重新激活项目后才能编辑。",
15102
+ "projects.archivedReadOnlyHint": "项目已归档。重新激活后才能编辑此任务。",
15085
15103
  "projects.actionsLabel": "操作",
15086
15104
  "projects.archiveHelp": "归档项目会将其和剩余任务标记为完成,可随时重新激活。",
15087
15105
  "projects.completeConfirm": "将此项目标记为完成并结束其所有任务?",
@@ -15364,6 +15382,7 @@ var init_zh_Hans = __esm(() => {
15364
15382
  "settings.material3ThemeDesc": "在 Android 上使用 Material 3 配色",
15365
15383
  "settings.selectLang": "选择您的首选语言",
15366
15384
  "settings.languagePartlyTranslated": "部分翻译",
15385
+ "settings.videoTutorials": "视频教程",
15367
15386
  "settings.privacy": "隐私",
15368
15387
  "settings.mobile.appLock": "应用锁",
15369
15388
  "settings.mobile.appLockDesc": "打开 Mindwtr 或返回应用时需要设备锁验证。它保护应用界面,不加密设备上的数据库。",
@@ -15680,6 +15699,10 @@ var init_zh_Hans = __esm(() => {
15680
15699
  "settings.featureTimeEstimatesDesc": "为时间管理添加时长估计。",
15681
15700
  "settings.featurePomodoro": "番茄钟",
15682
15701
  "settings.featurePomodoroDesc": "在聚焦视图中启用可选的番茄钟面板。",
15702
+ "settings.featureTimeline": "时间线视图",
15703
+ "settings.featureTimelineDesc": "在侧边栏显示有日期任务的只读时间线。",
15704
+ "settings.sidebarViews": "侧边栏视图",
15705
+ "settings.sidebarViewsDesc": "选择侧边栏中显示哪些视图。隐藏的视图仍可通过搜索打开。",
15683
15706
  "settings.pomodoroCustomPreset": "自定义预设",
15684
15707
  "settings.pomodoroCustomPresetDesc": "添加一个额外的专注/休息预设。若与内置预设相同,将继续只显示内置选项。",
15685
15708
  "settings.pomodoroFocusMinutes": "专注分钟",
@@ -15743,6 +15766,7 @@ var init_zh_Hans = __esm(() => {
15743
15766
  "tags.title": "标签",
15744
15767
  "areas.edit": "编辑领域",
15745
15768
  "common.edit": "编辑",
15769
+ "common.view": "查看",
15746
15770
  "common.add": "添加",
15747
15771
  "common.open": "打开",
15748
15772
  "common.ok": "确定",
@@ -16942,6 +16966,7 @@ var init_zh_Hant = __esm(() => {
16942
16966
  "bulk.keepStatus": "保留狀態",
16943
16967
  "bulk.keepProject": "保留項目",
16944
16968
  "bulk.keepArea": "保留領域",
16969
+ "bulk.keepSection": "保留分區",
16945
16970
  "bulk.waitingPersonRequired": "選擇這些事項在等待誰。",
16946
16971
  "bulk.deleting": "正在刪除所選任務…",
16947
16972
  "taskEdit.aiAssistant": "AI 助手",
@@ -16959,6 +16984,9 @@ var init_zh_Hant = __esm(() => {
16959
16984
  "nav.main": "主頁",
16960
16985
  "nav.inbox": "收集箱",
16961
16986
  "nav.board": "看板",
16987
+ "nav.timeline": "時間軸",
16988
+ "timeline.empty": "還沒有排期的任務",
16989
+ "timeline.emptyHint": "設定了開始日期或截止日期的任務會在這裡顯示為色條。",
16962
16990
  "nav.projects": "項目",
16963
16991
  "nav.contexts": "情境",
16964
16992
  "nav.next": "下一步行動",
@@ -17036,6 +17064,7 @@ var init_zh_Hant = __esm(() => {
17036
17064
  "keybindings.goReference": "前往參考",
17037
17065
  "keybindings.goCalendar": "前往日曆",
17038
17066
  "keybindings.goBoard": "前往看板",
17067
+ "keybindings.goTimeline": "前往時間軸",
17039
17068
  "keybindings.goDone": "前往已完成",
17040
17069
  "keybindings.goArchived": "前往歸檔",
17041
17070
  "keybindings.list.nextPrev": "上下移動選中項",
@@ -17190,6 +17219,7 @@ var init_zh_Hant = __esm(() => {
17190
17219
  "attachments.obsidianLinkPlaceholder": "obsidian://open?vault=Vault&file=Note",
17191
17220
  "attachments.obsidianLinkInputHint": "貼上 obsidian:// 筆記連結,或使用「標題 | obsidian://...」。",
17192
17221
  "attachments.fileNotSupported": "文件附件僅在桌面應用中支持。",
17222
+ "attachments.webUnavailable": "此附件在網頁版中無法使用。",
17193
17223
  "attachments.fileTooLarge": "文件過大,無法上傳。",
17194
17224
  "attachments.fileNotReadable": "無法讀取此文件,因此未加入附件。請將文件移至其他資料夾後再試一次。",
17195
17225
  "attachments.linkToFile": "連結到文件…",
@@ -17534,7 +17564,7 @@ var init_zh_Hant = __esm(() => {
17534
17564
  "projects.sectionPlaceholder": "分區標題",
17535
17565
  "projects.noSection": "無分區",
17536
17566
  "projects.sectionEmpty": "尚無任務",
17537
- "projects.deleteSectionConfirm": "確定要刪除此分區嗎?",
17567
+ "projects.deleteSectionConfirm": "刪除此分區?其中的任務不會被刪除,會移到「無分區」。",
17538
17568
  "projects.areaFilter": "領域篩選",
17539
17569
  "projects.allAreas": "所有領域",
17540
17570
  "projects.noArea": "無領域",
@@ -17561,6 +17591,8 @@ var init_zh_Hant = __esm(() => {
17561
17591
  "projects.complete": "完成",
17562
17592
  "projects.archive": "歸檔",
17563
17593
  "projects.reactivate": "重新激活",
17594
+ "projects.archivedTaskInspectionHint": "點兩下檢視此任務。重新激活專案後才能編輯。",
17595
+ "projects.archivedReadOnlyHint": "專案已歸檔。重新激活後才能編輯此任務。",
17564
17596
  "projects.actionsLabel": "操作",
17565
17597
  "projects.archiveHelp": "歸檔項目會將其和剩餘任務標記為完成,可隨時重新激活。",
17566
17598
  "projects.completeConfirm": "將此項目標記爲完成並結束其所有任務?",
@@ -17843,6 +17875,7 @@ var init_zh_Hant = __esm(() => {
17843
17875
  "settings.material3ThemeDesc": "在 Android 上使用 Material 3 配色",
17844
17876
  "settings.selectLang": "選擇您的首選語言",
17845
17877
  "settings.languagePartlyTranslated": "部分翻譯",
17878
+ "settings.videoTutorials": "影片教學",
17846
17879
  "settings.privacy": "隱私",
17847
17880
  "settings.mobile.appLock": "應用鎖",
17848
17881
  "settings.mobile.appLockDesc": "打開 Mindwtr 或返回應用時需要設備鎖驗證。它保護應用界面,不加密設備上的資料庫。",
@@ -18159,6 +18192,10 @@ var init_zh_Hant = __esm(() => {
18159
18192
  "settings.featureTimeEstimatesDesc": "爲時間管理添加時長估計。",
18160
18193
  "settings.featurePomodoro": "番茄鐘",
18161
18194
  "settings.featurePomodoroDesc": "在聚焦視圖中啓用可選的番茄鐘面板。",
18195
+ "settings.featureTimeline": "時間軸視圖",
18196
+ "settings.featureTimelineDesc": "在側邊欄顯示有日期任務的唯讀時間軸。",
18197
+ "settings.sidebarViews": "側邊欄視圖",
18198
+ "settings.sidebarViewsDesc": "選擇側邊欄中顯示哪些視圖。隱藏的視圖仍可透過搜尋開啟。",
18162
18199
  "settings.pomodoroCustomPreset": "自定義預設",
18163
18200
  "settings.pomodoroCustomPresetDesc": "添加一個額外的專注/休息預設。若與內建預設相同,將繼續只顯示內建選項。",
18164
18201
  "settings.pomodoroFocusMinutes": "專注分鐘",
@@ -18222,6 +18259,7 @@ var init_zh_Hant = __esm(() => {
18222
18259
  "tags.title": "標籤",
18223
18260
  "areas.edit": "編輯領域",
18224
18261
  "common.edit": "編輯",
18262
+ "common.view": "檢視",
18225
18263
  "common.add": "添加",
18226
18264
  "common.open": "打開",
18227
18265
  "common.ok": "確定",
@@ -26844,6 +26882,9 @@ var init_ja = __esm(() => {
26844
26882
  "nav.main": "メイン",
26845
26883
  "nav.inbox": "インボックス",
26846
26884
  "nav.board": "ボードビュー",
26885
+ "nav.timeline": "タイムライン",
26886
+ "timeline.empty": "予定されたタスクはまだありません",
26887
+ "timeline.emptyHint": "開始日または期限日のあるタスクがバーとして表示されます。",
26847
26888
  "nav.projects": "プロジェクト",
26848
26889
  "nav.contexts": "コンテキスト",
26849
26890
  "nav.next": "次のアクション",
@@ -26930,6 +26971,7 @@ var init_ja = __esm(() => {
26930
26971
  "keybindings.goReference": "資料へ移動",
26931
26972
  "keybindings.goCalendar": "カレンダーへ移動",
26932
26973
  "keybindings.goBoard": "ボードへ移動",
26974
+ "keybindings.goTimeline": "タイムラインへ移動",
26933
26975
  "keybindings.goDone": "完了へ移動",
26934
26976
  "keybindings.goArchived": "アーカイブへ移動",
26935
26977
  "keybindings.switchArea": "エリア 1〜9 に切り替え",
@@ -27107,6 +27149,7 @@ var init_ja = __esm(() => {
27107
27149
  "attachments.obsidianLinkPlaceholder": "obsidian://open?vault=Vault&file=Note",
27108
27150
  "attachments.obsidianLinkInputHint": "obsidian:// のノートリンクを貼り付けるか、「タイトル | obsidian://…」の形式で入力してください。",
27109
27151
  "attachments.fileNotSupported": "ファイルの添付はデスクトップ版でのみ利用できます。",
27152
+ "attachments.webUnavailable": "この添付ファイルはウェブ版では利用できません。",
27110
27153
  "attachments.fileTooLarge": "ファイルが大きすぎてアップロードできません。",
27111
27154
  "attachments.fileNotReadable": "このファイルを読み取れなかったため添付できませんでした。別のフォルダに移してからもう一度お試しください。",
27112
27155
  "attachments.linkToFile": "ファイルへのリンク…",
@@ -27477,7 +27520,7 @@ var init_ja = __esm(() => {
27477
27520
  "projects.sectionPlaceholder": "セクション名",
27478
27521
  "projects.noSection": "セクションなし",
27479
27522
  "projects.sectionEmpty": "タスクなし",
27480
- "projects.deleteSectionConfirm": "このセクションを削除してもよろしいですか?",
27523
+ "projects.deleteSectionConfirm": "このセクションを削除しますか?中のタスクは削除されず、「セクションなし」に移動します。",
27481
27524
  "projects.areaFilter": "エリアで絞り込む",
27482
27525
  "projects.allAreas": "すべてのエリア",
27483
27526
  "projects.noArea": "エリアなし",
@@ -27510,6 +27553,8 @@ var init_ja = __esm(() => {
27510
27553
  "projects.complete": "完了にする",
27511
27554
  "projects.archive": "アーカイブ",
27512
27555
  "projects.reactivate": "再開する",
27556
+ "projects.archivedTaskInspectionHint": "ダブルタップでこのタスクを確認できます。編集するにはプロジェクトを再開してください。",
27557
+ "projects.archivedReadOnlyHint": "アーカイブ済みのプロジェクトです。このタスクを編集するには再開してください。",
27513
27558
  "projects.actionsLabel": "操作",
27514
27559
  "projects.archiveHelp": "アーカイブすると、プロジェクトと残っているタスクがまとめて完了になります。あとからいつでも再開できます。",
27515
27560
  "projects.completeConfirm": "このプロジェクトを完了にして、含まれるタスクもすべて終わらせますか?",
@@ -27815,6 +27860,7 @@ var init_ja = __esm(() => {
27815
27860
  "settings.material3ThemeDesc": "Android で Material 3 の配色を使います",
27816
27861
  "settings.selectLang": "使用する言語を選んでください",
27817
27862
  "settings.languagePartlyTranslated": "一部のみ翻訳",
27863
+ "settings.videoTutorials": "動画チュートリアル",
27818
27864
  "settings.privacy": "プライバシー",
27819
27865
  "settings.mobile.appLock": "アプリロック",
27820
27866
  "settings.mobile.appLockDesc": "Mindwtr を開くとき、またはアプリに戻るときに端末のロック解除を求めます。保護されるのは画面の表示だけで、端末内のデータベースそのものは保護の対象ではありません。",
@@ -28147,6 +28193,10 @@ var init_ja = __esm(() => {
28147
28193
  "settings.featureTimeEstimatesDesc": "時間を確保して計画を立てるための、簡単な所要時間の見積もりを追加します。",
28148
28194
  "settings.featurePomodoro": "ポモドーロタイマー",
28149
28195
  "settings.featurePomodoroDesc": "フォーカス画面にポモドーロのパネルを表示します。",
28196
+ "settings.featureTimeline": "タイムラインビュー",
28197
+ "settings.featureTimelineDesc": "日付のあるタスクの読み取り専用タイムラインをサイドバーに表示します。",
28198
+ "settings.sidebarViews": "サイドバーの表示項目",
28199
+ "settings.sidebarViewsDesc": "サイドバーに表示するビューを選択します。非表示のビューも検索から開けます。",
28150
28200
  "settings.pomodoroCustomPreset": "カスタムのプリセット",
28151
28201
  "settings.pomodoroCustomPresetDesc": "集中・休憩の組み合わせを1つだけ追加できます。既定のプリセットと同じ値にした場合は、既定のものだけが表示されます。",
28152
28202
  "settings.pomodoroFocusMinutes": "集中する時間(分)",
@@ -28233,6 +28283,7 @@ var init_ja = __esm(() => {
28233
28283
  "tags.title": "タグ",
28234
28284
  "areas.edit": "エリアを編集",
28235
28285
  "common.edit": "編集",
28286
+ "common.view": "表示",
28236
28287
  "common.add": "追加",
28237
28288
  "common.open": "開く",
28238
28289
  "common.ok": "OK",
@@ -28300,6 +28351,7 @@ var init_ja = __esm(() => {
28300
28351
  "bulk.keepStatus": "ステータスは変えない",
28301
28352
  "bulk.keepProject": "プロジェクトは変えない",
28302
28353
  "bulk.keepArea": "エリアは変えない",
28354
+ "bulk.keepSection": "セクションは変えない",
28303
28355
  "bulk.waitingPersonRequired": "待っている相手を選んでください。",
28304
28356
  "bulk.deleting": "選択したタスクを削除しています…",
28305
28357
  "sort.label": "並び順",
@@ -42864,6 +42916,9 @@ var init_fa = __esm(() => {
42864
42916
  "nav.main": "اصلی",
42865
42917
  "nav.inbox": "صندوق ورودی",
42866
42918
  "nav.board": "نمای تابلو",
42919
+ "nav.timeline": "خط زمانی",
42920
+ "timeline.empty": "هنوز چیزی زمان‌بندی نشده است",
42921
+ "timeline.emptyHint": "کارهایی که تاریخ شروع یا تاریخ سررسید دارند اینجا به صورت نوار نمایش داده می‌شوند.",
42867
42922
  "nav.projects": "پروژه‌ها",
42868
42923
  "nav.contexts": "زمینه‌ها",
42869
42924
  "nav.next": "اقدامات بعدی",
@@ -42950,6 +43005,7 @@ var init_fa = __esm(() => {
42950
43005
  "keybindings.goReference": "رفتن به مرجع",
42951
43006
  "keybindings.goCalendar": "رفتن به تقویم",
42952
43007
  "keybindings.goBoard": "رفتن به تابلو",
43008
+ "keybindings.goTimeline": "رفتن به خط زمانی",
42953
43009
  "keybindings.goDone": "رفتن به انجام‌شده",
42954
43010
  "keybindings.goArchived": "رفتن به بایگانی‌شده",
42955
43011
  "keybindings.switchArea": "تعویض حوزه ۱ تا ۹",
@@ -43128,6 +43184,7 @@ var init_fa = __esm(() => {
43128
43184
  "attachments.obsidianLinkPlaceholder": "obsidian://open?vault=Vault&file=Note",
43129
43185
  "attachments.obsidianLinkInputHint": "یک پیوند obsidian:// را بچسبانید یا از «عنوان | obsidian://...» استفاده کنید.",
43130
43186
  "attachments.fileNotSupported": "پیوست فایل فقط در برنامه دسکتاپ پشتیبانی می‌شود.",
43187
+ "attachments.webUnavailable": "این پیوست در نسخه وب در دسترس نیست.",
43131
43188
  "attachments.fileTooLarge": "حجم فایل برای بارگذاری زیاد است.",
43132
43189
  "attachments.fileNotReadable": "این فایل خوانده نشد، بنابراین پیوست نگردید. آن را به پوشه دیگری منتقل کرده و دوباره امتحان کنید.",
43133
43190
  "attachments.linkToFile": "پیوند به فایل…",
@@ -43497,7 +43554,7 @@ var init_fa = __esm(() => {
43497
43554
  "projects.sectionPlaceholder": "عنوان بخش",
43498
43555
  "projects.noSection": "بدون بخش",
43499
43556
  "projects.sectionEmpty": "بدون وظیفه",
43500
- "projects.deleteSectionConfirm": "آیا مطمئنید می‌خواهید این بخش را حذف کنید؟",
43557
+ "projects.deleteSectionConfirm": "این بخش حذف شود؟ کارهای داخل آن حذف نمی‌شوند و به «بدون بخش» منتقل می‌شوند.",
43501
43558
  "projects.areaFilter": "فیلتر حوزه",
43502
43559
  "projects.allAreas": "همه حوزه‌ها",
43503
43560
  "projects.noArea": "بدون حوزه",
@@ -43530,6 +43587,8 @@ var init_fa = __esm(() => {
43530
43587
  "projects.complete": "تکمیل",
43531
43588
  "projects.archive": "بایگانی",
43532
43589
  "projects.reactivate": "فعال‌سازی مجدد",
43590
+ "projects.archivedTaskInspectionHint": "برای بررسی این کار دو بار ضربه بزنید. برای ویرایش، پروژه را دوباره فعال کنید.",
43591
+ "projects.archivedReadOnlyHint": "پروژه بایگانی شده است. برای ویرایش این کار، آن را دوباره فعال کنید.",
43533
43592
  "projects.actionsLabel": "اقدامات",
43534
43593
  "projects.archiveHelp": "بایگانی یک پروژه، آن و کارهای باقی‌مانده‌اش را تکمیل می‌کند — هر زمان می‌توانید دوباره فعالش کنید.",
43535
43594
  "projects.completeConfirm": "این پروژه تکمیل‌شده علامت‌گذاری و همه کارهایش پایان یابند؟",
@@ -43835,6 +43894,7 @@ var init_fa = __esm(() => {
43835
43894
  "settings.material3ThemeDesc": "استفاده از رنگ‌های متریال ۳ در اندروید",
43836
43895
  "settings.selectLang": "زبان دلخواه خود را انتخاب کنید",
43837
43896
  "settings.languagePartlyTranslated": "ترجمهٔ ناقص",
43897
+ "settings.videoTutorials": "آموزش‌های ویدیویی",
43838
43898
  "settings.privacy": "حریم خصوصی",
43839
43899
  "settings.mobile.appLock": "قفل برنامه",
43840
43900
  "settings.mobile.appLockDesc": "هنگام باز کردن Mindwtr یا بازگشت به برنامه، قفل دستگاه را الزامی کنید. این فقط نمای برنامه را محافظت می‌کند، نه پایگاه‌داده روی دستگاه.",
@@ -44167,6 +44227,10 @@ var init_fa = __esm(() => {
44167
44227
  "settings.featureTimeEstimatesDesc": "افزودن برآورد سریع مدت زمان برای بلوک‌بندی زمانی.",
44168
44228
  "settings.featurePomodoro": "تایمر پومودورو",
44169
44229
  "settings.featurePomodoroDesc": "فعال‌سازی پنل اختیاری پومودورو در نمای تمرکز.",
44230
+ "settings.featureTimeline": "نمای خط زمانی",
44231
+ "settings.featureTimelineDesc": "نمایش خط زمانی فقط‌خواندنی کارهای تاریخ‌دار در نوار کناری.",
44232
+ "settings.sidebarViews": "نماهای نوار کناری",
44233
+ "settings.sidebarViewsDesc": "انتخاب کنید کدام نماها در نوار کناری نمایش داده شوند. نماهای پنهان از طریق جستجو در دسترس می‌مانند.",
44170
44234
  "settings.pomodoroCustomPreset": "پیش‌تنظیم سفارشی",
44171
44235
  "settings.pomodoroCustomPresetDesc": "یک پیش‌تنظیم اضافی تمرکز/استراحت اضافه کنید. تطبیق با یک پیش‌تنظیم داخلی فقط تراشه‌های داخلی را نگه می‌دارد.",
44172
44236
  "settings.pomodoroFocusMinutes": "دقایق تمرکز",
@@ -44253,6 +44317,7 @@ var init_fa = __esm(() => {
44253
44317
  "tags.title": "برچسب‌ها",
44254
44318
  "areas.edit": "ویرایش حوزه",
44255
44319
  "common.edit": "ویرایش",
44320
+ "common.view": "مشاهده",
44256
44321
  "common.add": "افزودن",
44257
44322
  "common.open": "باز کردن",
44258
44323
  "common.ok": "تأیید",
@@ -44320,6 +44385,7 @@ var init_fa = __esm(() => {
44320
44385
  "bulk.keepStatus": "نگه‌داشتن وضعیت",
44321
44386
  "bulk.keepProject": "نگه‌داشتن پروژه",
44322
44387
  "bulk.keepArea": "نگه‌داشتن حوزه",
44388
+ "bulk.keepSection": "نگه‌داشتن بخش",
44323
44389
  "bulk.waitingPersonRequired": "انتخاب کنید این موارد منتظر چه کسی هستند.",
44324
44390
  "bulk.deleting": "در حال حذف کارهای انتخاب‌شده...",
44325
44391
  "sort.label": "مرتب‌سازی",
@@ -45343,6 +45409,9 @@ var init_sv = __esm(() => {
45343
45409
  "nav.main": "Huvud",
45344
45410
  "nav.inbox": "Inkorg",
45345
45411
  "nav.board": "Tavelvy",
45412
+ "nav.timeline": "Tidslinje",
45413
+ "timeline.empty": "Inget schemalagt än",
45414
+ "timeline.emptyHint": "Uppgifter med start- eller förfallodatum visas här som staplar.",
45346
45415
  "nav.projects": "Projekt",
45347
45416
  "nav.contexts": "Kontexter",
45348
45417
  "nav.next": "Nästa steg",
@@ -45429,6 +45498,7 @@ var init_sv = __esm(() => {
45429
45498
  "keybindings.goReference": "Gå till Referens",
45430
45499
  "keybindings.goCalendar": "Gå till Kalender",
45431
45500
  "keybindings.goBoard": "Gå till Tavla",
45501
+ "keybindings.goTimeline": "Gå till Tidslinje",
45432
45502
  "keybindings.goDone": "Gå till Klart",
45433
45503
  "keybindings.goArchived": "Gå till Arkiverat",
45434
45504
  "keybindings.switchArea": "Byt till område 1–9",
@@ -45607,6 +45677,7 @@ var init_sv = __esm(() => {
45607
45677
  "attachments.obsidianLinkPlaceholder": "obsidian://open?vault=Vault&file=Note",
45608
45678
  "attachments.obsidianLinkInputHint": 'Klistra in en obsidian://-anteckningslänk, eller använd "Titel | obsidian://...".',
45609
45679
  "attachments.fileNotSupported": "Filbilagor stöds endast i skrivbordsappen.",
45680
+ "attachments.webUnavailable": "Den här bilagan är inte tillgänglig i webbappen.",
45610
45681
  "attachments.fileTooLarge": "Filen är för stor för att laddas upp.",
45611
45682
  "attachments.fileNotReadable": "Kunde inte läsa filen, så den bifogades inte. Flytta den till en annan mapp och försök igen.",
45612
45683
  "attachments.linkToFile": "Länk till fil…",
@@ -45976,7 +46047,7 @@ var init_sv = __esm(() => {
45976
46047
  "projects.sectionPlaceholder": "Sektionens titel",
45977
46048
  "projects.noSection": "Ingen sektion",
45978
46049
  "projects.sectionEmpty": "Inga uppgifter",
45979
- "projects.deleteSectionConfirm": "Är du säker att du vill ta bort den här sektionen?",
46050
+ "projects.deleteSectionConfirm": "Ta bort denna sektion? Uppgifterna i den tas inte bort utan flyttas till Ingen sektion.",
45980
46051
  "projects.areaFilter": "Områdesfilter",
45981
46052
  "projects.allAreas": "Alla områden",
45982
46053
  "projects.noArea": "Inget område",
@@ -46009,6 +46080,8 @@ var init_sv = __esm(() => {
46009
46080
  "projects.complete": "Slutför",
46010
46081
  "projects.archive": "Arkivera",
46011
46082
  "projects.reactivate": "Återaktivera",
46083
+ "projects.archivedTaskInspectionHint": "Dubbeltryck för att granska uppgiften. Återaktivera projektet för att redigera den.",
46084
+ "projects.archivedReadOnlyHint": "Arkiverat projekt. Återaktivera det för att redigera uppgiften.",
46012
46085
  "projects.actionsLabel": "Åtgärder",
46013
46086
  "projects.archiveHelp": "Att arkivera ett projekt slutför det och dess kvarvarande uppgifter — återaktivera det när som helst.",
46014
46087
  "projects.completeConfirm": "Markera det här projektet som slutfört och avsluta alla dess uppgifter?",
@@ -46314,6 +46387,7 @@ var init_sv = __esm(() => {
46314
46387
  "settings.material3ThemeDesc": "Använd Material 3-färgtoken på Android",
46315
46388
  "settings.selectLang": "Välj ditt önskade språk",
46316
46389
  "settings.languagePartlyTranslated": "Delvis översatt",
46390
+ "settings.videoTutorials": "Videohandledningar",
46317
46391
  "settings.privacy": "Integritet",
46318
46392
  "settings.mobile.appLock": "Applås",
46319
46393
  "settings.mobile.appLockDesc": "Kräv enhetens lås när du öppnar Mindwtr eller återgår till appen. Det här skyddar appvyn, inte databasen på enheten.",
@@ -46646,6 +46720,10 @@ var init_sv = __esm(() => {
46646
46720
  "settings.featureTimeEstimatesDesc": "Lägg till snabba tidsuppskattningar för tidsblockering.",
46647
46721
  "settings.featurePomodoro": "Pomodoro-timer",
46648
46722
  "settings.featurePomodoroDesc": "Aktivera den valfria Pomodoro-panelen i Fokus-vyn.",
46723
+ "settings.featureTimeline": "Tidslinjevy",
46724
+ "settings.featureTimelineDesc": "Visa en skrivskyddad tidslinje över daterade uppgifter i sidofältet.",
46725
+ "settings.sidebarViews": "Vyer i sidofältet",
46726
+ "settings.sidebarViewsDesc": "Välj vilka vyer som visas i sidofältet. Dolda vyer nås fortfarande via sök.",
46649
46727
  "settings.pomodoroCustomPreset": "Anpassad förinställning",
46650
46728
  "settings.pomodoroCustomPresetDesc": "Lägg till en extra fokus-/pausförinställning. Matchar den en inbyggd förinställning behålls bara de inbyggda alternativen.",
46651
46729
  "settings.pomodoroFocusMinutes": "Fokusminuter",
@@ -46732,6 +46810,7 @@ var init_sv = __esm(() => {
46732
46810
  "tags.title": "Taggar",
46733
46811
  "areas.edit": "Redigera område",
46734
46812
  "common.edit": "Redigera",
46813
+ "common.view": "Visa",
46735
46814
  "common.add": "Lägg till",
46736
46815
  "common.open": "Öppna",
46737
46816
  "common.ok": "OK",
@@ -46799,6 +46878,7 @@ var init_sv = __esm(() => {
46799
46878
  "bulk.keepStatus": "Behåll status",
46800
46879
  "bulk.keepProject": "Behåll projekt",
46801
46880
  "bulk.keepArea": "Behåll område",
46881
+ "bulk.keepSection": "Behåll sektion",
46802
46882
  "bulk.waitingPersonRequired": "Välj vem de här posterna väntar på.",
46803
46883
  "bulk.deleting": "Tar bort markerade uppgifter...",
46804
46884
  "sort.label": "Sortera",
@@ -47820,7 +47900,7 @@ var init_i18n_locales = __esm(() => {
47820
47900
  mode: "overrides",
47821
47901
  native: "Tiếng Việt",
47822
47902
  nonLatin: false,
47823
- translatedKeyFloor: 2213
47903
+ translatedKeyFloor: 2280
47824
47904
  },
47825
47905
  zh: {
47826
47906
  loadSync: () => (init_zh_Hans(), __toCommonJS(exports_zh_Hans)),
@@ -48211,7 +48291,8 @@ var init_settings_options = __esm(() => {
48211
48291
  GTD_SYNCED_FEATURE_FIELD_KEYS = [
48212
48292
  "priorities",
48213
48293
  "timeEstimates",
48214
- "pomodoro"
48294
+ "pomodoro",
48295
+ "timeline"
48215
48296
  ];
48216
48297
  });
48217
48298
 
@@ -48282,7 +48363,8 @@ function resolveFeatureFlags(settings) {
48282
48363
  return {
48283
48364
  priorities: settings?.features?.priorities !== false,
48284
48365
  timeEstimates: settings?.features?.timeEstimates !== false,
48285
- pomodoro: settings?.features?.pomodoro === true
48366
+ pomodoro: settings?.features?.pomodoro === true,
48367
+ timeline: settings?.features?.timeline === true
48286
48368
  };
48287
48369
  }
48288
48370
 
@@ -48311,6 +48393,15 @@ function buildBulkOrganizeTaskUpdate(task, input) {
48311
48393
  updates.projectId = undefined;
48312
48394
  }
48313
48395
  }
48396
+ if (hasOwn(input, "sectionId")) {
48397
+ const sectionId = normalizedOptionalString(input.sectionId);
48398
+ const effectiveProjectId = hasOwn(updates, "projectId") ? updates.projectId : normalizedOptionalString(task.projectId);
48399
+ if (!sectionId) {
48400
+ updates.sectionId = undefined;
48401
+ } else if (effectiveProjectId && effectiveProjectId === normalizedOptionalString(input.sectionProjectId)) {
48402
+ updates.sectionId = sectionId;
48403
+ }
48404
+ }
48314
48405
  const contexts = mergeTokens(task.contexts, input.contexts);
48315
48406
  if (contexts)
48316
48407
  updates.contexts = contexts;
@@ -70549,6 +70640,28 @@ function buildRRuleString(rule, byDay, interval3, options = {}) {
70549
70640
  }
70550
70641
  return parts.join(";");
70551
70642
  }
70643
+ function editRRuleString(existingRRule, rule, overrides = {}) {
70644
+ const parsed = parseRRuleString(existingRRule);
70645
+ const byDay = hasRRuleEditOverride(overrides, "byDay") ? overrides.byDay : parsed.byDay;
70646
+ const interval3 = hasRRuleEditOverride(overrides, "interval") ? overrides.interval : parsed.interval;
70647
+ const byMonthDay = hasRRuleEditOverride(overrides, "byMonthDay") ? overrides.byMonthDay : parsed.byMonthDay;
70648
+ const count = hasRRuleEditOverride(overrides, "count") ? overrides.count : parsed.count;
70649
+ const weekStart = hasRRuleEditOverride(overrides, "weekStart") ? overrides.weekStart : parsed.weekStart;
70650
+ const until = hasRRuleEditOverride(overrides, "until") ? overrides.until : parsed.until;
70651
+ const edited = buildRRuleString(rule, byDay, interval3, {
70652
+ byMonthDay,
70653
+ count,
70654
+ weekStart,
70655
+ until
70656
+ });
70657
+ const opaqueTokens = existingRRule.split(";").map((part) => part.trim()).filter((part) => {
70658
+ const separator = part.indexOf("=");
70659
+ if (separator <= 0 || separator === part.length - 1)
70660
+ return false;
70661
+ return !EDITABLE_RRULE_TOKEN_KEYS.has(part.slice(0, separator).trim().toUpperCase());
70662
+ });
70663
+ return opaqueTokens.length > 0 ? `${edited};${opaqueTokens.join(";")}` : edited;
70664
+ }
70552
70665
  function getRecurrenceRRuleValue(value) {
70553
70666
  if (!value || typeof value === "string" || !value.rule)
70554
70667
  return "";
@@ -70557,16 +70670,25 @@ function getRecurrenceRRuleValue(value) {
70557
70670
  const count = getRecurrenceCountValue(value);
70558
70671
  const until = getRecurrenceUntilValue(value);
70559
70672
  if (value.byDay?.length) {
70560
- return buildRRuleString(value.rule, value.byDay, undefined, { count, until });
70673
+ return buildRRuleString(value.rule, value.byDay, undefined, {
70674
+ count,
70675
+ weekStart: value.weekStart,
70676
+ until
70677
+ });
70561
70678
  }
70562
70679
  if (value.byMonthDay?.length) {
70563
70680
  return buildRRuleString(value.rule, undefined, undefined, {
70564
70681
  byMonthDay: value.byMonthDay,
70565
70682
  count,
70683
+ weekStart: value.weekStart,
70566
70684
  until
70567
70685
  });
70568
70686
  }
70569
- return buildRRuleString(value.rule, undefined, undefined, { count, until });
70687
+ return buildRRuleString(value.rule, undefined, undefined, {
70688
+ count,
70689
+ weekStart: value.weekStart,
70690
+ until
70691
+ });
70570
70692
  }
70571
70693
  function hasRecurrenceRule(value) {
70572
70694
  return getRecurrenceRule(value) !== null;
@@ -71444,7 +71566,7 @@ var RECURRENCE_RULES, RECURRENCE_INTERVAL_MAX = 999, RRULE_SERIES_ID_KEY = "X-MI
71444
71566
  return;
71445
71567
  const weekly = normalized.filter((day) => WEEKDAY_ORDER.includes(day));
71446
71568
  return weekly.length > 0 ? Array.from(new Set(weekly)) : undefined;
71447
- }, getDateDay = (value) => {
71569
+ }, EDITABLE_RRULE_TOKEN_KEYS, hasRRuleEditOverride = (overrides, key) => Object.prototype.hasOwnProperty.call(overrides, key), getDateDay = (value) => {
71448
71570
  const parsed = safeParseDate(value);
71449
71571
  return parsed ? parsed.getDate() : undefined;
71450
71572
  }, getRecurrenceScheduleAnchorField = (dates) => ["dueDate", "startTime", "reviewAt"].find((field) => Boolean(dates[field])) ?? null, weekdayIndex = (weekday) => WEEKDAY_ORDER.indexOf(weekday), getLastDayOfMonth = (year, month) => {
@@ -71534,6 +71656,15 @@ var init_recurrence = __esm(() => {
71534
71656
  MONTHLY: "monthly",
71535
71657
  YEARLY: "yearly"
71536
71658
  };
71659
+ EDITABLE_RRULE_TOKEN_KEYS = new Set([
71660
+ "FREQ",
71661
+ "INTERVAL",
71662
+ "BYDAY",
71663
+ "BYMONTHDAY",
71664
+ "COUNT",
71665
+ "WKST",
71666
+ "UNTIL"
71667
+ ]);
71537
71668
  });
71538
71669
 
71539
71670
  // ../../packages/core/src/task-date-coherence.ts
@@ -71584,6 +71715,9 @@ var init_en = __esm(() => {
71584
71715
  "nav.main": "Main",
71585
71716
  "nav.inbox": "Inbox",
71586
71717
  "nav.board": "Board View",
71718
+ "nav.timeline": "Timeline",
71719
+ "timeline.empty": "Nothing scheduled yet",
71720
+ "timeline.emptyHint": "Tasks with a start or due date appear here as bars.",
71587
71721
  "nav.projects": "Projects",
71588
71722
  "nav.contexts": "Contexts",
71589
71723
  "nav.next": "Next Actions",
@@ -71670,6 +71804,7 @@ var init_en = __esm(() => {
71670
71804
  "keybindings.goReference": "Go to Reference",
71671
71805
  "keybindings.goCalendar": "Go to Calendar",
71672
71806
  "keybindings.goBoard": "Go to Board",
71807
+ "keybindings.goTimeline": "Go to Timeline",
71673
71808
  "keybindings.goDone": "Go to Done",
71674
71809
  "keybindings.goArchived": "Go to Archived",
71675
71810
  "keybindings.switchArea": "Switch to Area 1-9",
@@ -71847,6 +71982,7 @@ var init_en = __esm(() => {
71847
71982
  "attachments.obsidianLinkPlaceholder": "obsidian://open?vault=Vault&file=Note",
71848
71983
  "attachments.obsidianLinkInputHint": 'Paste an obsidian:// note link, or use "Title | obsidian://...".',
71849
71984
  "attachments.fileNotSupported": "File attachments are only supported in the desktop app.",
71985
+ "attachments.webUnavailable": "This attachment is not available in the web app.",
71850
71986
  "attachments.fileTooLarge": "File is too large to upload.",
71851
71987
  "attachments.fileNotReadable": "Couldn't read this file, so it was not attached. Move it to a different folder and try again.",
71852
71988
  "attachments.linkToFile": "Link to file…",
@@ -72217,7 +72353,7 @@ var init_en = __esm(() => {
72217
72353
  "projects.sectionPlaceholder": "Section title",
72218
72354
  "projects.noSection": "No Section",
72219
72355
  "projects.sectionEmpty": "No tasks",
72220
- "projects.deleteSectionConfirm": "Are you sure you want to delete this section?",
72356
+ "projects.deleteSectionConfirm": "Delete this section? Its tasks are not deleted; they move to No Section.",
72221
72357
  "projects.areaFilter": "Area filter",
72222
72358
  "projects.allAreas": "All areas",
72223
72359
  "projects.noArea": "No area",
@@ -72250,6 +72386,8 @@ var init_en = __esm(() => {
72250
72386
  "projects.complete": "Complete",
72251
72387
  "projects.archive": "Archive",
72252
72388
  "projects.reactivate": "Reactivate",
72389
+ "projects.archivedTaskInspectionHint": "Double-tap to inspect this task. Reactivate the project to edit it.",
72390
+ "projects.archivedReadOnlyHint": "Archived project. Reactivate it to edit this task.",
72253
72391
  "projects.actionsLabel": "Actions",
72254
72392
  "projects.archiveHelp": "Archiving a project completes it and its remaining tasks — reactivate it anytime.",
72255
72393
  "projects.completeConfirm": "Mark this project completed and finish all its tasks?",
@@ -72555,6 +72693,7 @@ var init_en = __esm(() => {
72555
72693
  "settings.material3ThemeDesc": "Use Material 3 color tokens on Android",
72556
72694
  "settings.selectLang": "Select your preferred language",
72557
72695
  "settings.languagePartlyTranslated": "Partly translated",
72696
+ "settings.videoTutorials": "Video tutorials",
72558
72697
  "settings.privacy": "Privacy",
72559
72698
  "settings.mobile.appLock": "App lock",
72560
72699
  "settings.mobile.appLockDesc": "Require your device lock when opening Mindwtr or returning to the app. This protects the app view, not the on-device database.",
@@ -72887,6 +73026,10 @@ var init_en = __esm(() => {
72887
73026
  "settings.featureTimeEstimatesDesc": "Add quick duration estimates for time blocking.",
72888
73027
  "settings.featurePomodoro": "Pomodoro timer",
72889
73028
  "settings.featurePomodoroDesc": "Enable the optional Pomodoro panel in Focus view.",
73029
+ "settings.featureTimeline": "Timeline view",
73030
+ "settings.featureTimelineDesc": "Show a read-only timeline of dated tasks in the sidebar.",
73031
+ "settings.sidebarViews": "Sidebar views",
73032
+ "settings.sidebarViewsDesc": "Choose which views appear in the sidebar. Hidden views stay available from search.",
72890
73033
  "settings.pomodoroCustomPreset": "Custom preset",
72891
73034
  "settings.pomodoroCustomPresetDesc": "Add one extra focus/break preset. Matching a built-in preset keeps the built-in chips only.",
72892
73035
  "settings.pomodoroFocusMinutes": "Focus minutes",
@@ -72973,6 +73116,7 @@ var init_en = __esm(() => {
72973
73116
  "tags.title": "Tags",
72974
73117
  "areas.edit": "Edit area",
72975
73118
  "common.edit": "Edit",
73119
+ "common.view": "View",
72976
73120
  "common.add": "Add",
72977
73121
  "common.open": "Open",
72978
73122
  "common.ok": "OK",
@@ -73040,6 +73184,7 @@ var init_en = __esm(() => {
73040
73184
  "bulk.keepStatus": "Keep status",
73041
73185
  "bulk.keepProject": "Keep project",
73042
73186
  "bulk.keepArea": "Keep area",
73187
+ "bulk.keepSection": "Keep section",
73043
73188
  "bulk.waitingPersonRequired": "Choose who these items are waiting for.",
73044
73189
  "bulk.deleting": "Deleting selected tasks...",
73045
73190
  "sort.label": "Sort",
@@ -84536,7 +84681,8 @@ function buildQuickAddParseOptions(settings, source = {}) {
84536
84681
  knownPeople: getPersonOptionNames(source.people, tasks),
84537
84682
  defaultScheduleTime: normalizeClockTimeInput(settings?.gtd?.defaultScheduleTime) || undefined,
84538
84683
  preserveText: settings?.quickAddAutoClean !== true,
84539
- naturalLanguageDates: isNaturalLanguageDatesEnabled(settings)
84684
+ naturalLanguageDates: isNaturalLanguageDatesEnabled(settings),
84685
+ parsePriority: resolveFeatureFlags(settings).priorities
84540
84686
  };
84541
84687
  }
84542
84688
  function getQuickAddProjectInitialProps(props, fallbackAreaId) {
@@ -85040,7 +85186,7 @@ function parseQuickAdd(input, projects, now2 = new Date, areas, options = {}) {
85040
85186
  }
85041
85187
  }
85042
85188
  let priority;
85043
- const priorityMatch = working.match(/(?:^|\s)\/priority:([^\s/]+)/i);
85189
+ const priorityMatch = options.parsePriority === false ? null : working.match(/(?:^|\s)\/priority:([^\s/]+)/i);
85044
85190
  if (priorityMatch) {
85045
85191
  const token = restoreEscapes(priorityMatch[1] ?? "").trim().toLowerCase();
85046
85192
  priority = PRIORITY_TOKENS[token];
@@ -85213,7 +85359,12 @@ function parseQuickAdd(input, projects, now2 = new Date, areas, options = {}) {
85213
85359
  detectedDate
85214
85360
  };
85215
85361
  }
85216
- var STATUS_TOKENS, ENERGY_TOKENS, PRIORITY_TOKENS, ESCAPE_SENTINEL = "__MW_ESC__", QUICK_ADD_ESCAPE_CHARS, QUICK_ADD_FOCUS_COMMAND_PATTERN, QUICK_ADD_COMMAND_START, QUICK_ADD_COMMAND_BOUNDARY, QUICK_ADD_INLINE_CONTROL_BOUNDARY, SIMPLE_TASK_TOKEN_RE, RICH_TASK_TOKEN_RE, NATURAL_TIME_HINT_RE, PURE_TIME_ONLY_RE, BARE_MONTH_RE, TRAILING_DATE_SUFFIX_RE, TRAILING_DATE_SEPARATOR_RE, dotDateParser, quickAddChrono, quickAddChronoDayFirst, getQuickAddChrono = () => isActiveDateFormatDayFirst() ? quickAddChronoDayFirst : quickAddChrono, LOCALE_CHRONO_FACTORY, localeChronoCache, TRAILING_DATE_INTRO_WORDS, localizedMonthNamesCache, CONTAINS_LETTER_RE;
85362
+ function formatQuickAddHelp(help, flags) {
85363
+ if (flags.priorities)
85364
+ return help;
85365
+ return help.replace(QUICK_ADD_PRIORITY_HELP_TOKEN, "");
85366
+ }
85367
+ var STATUS_TOKENS, ENERGY_TOKENS, PRIORITY_TOKENS, ESCAPE_SENTINEL = "__MW_ESC__", QUICK_ADD_ESCAPE_CHARS, QUICK_ADD_FOCUS_COMMAND_PATTERN, QUICK_ADD_COMMAND_START, QUICK_ADD_COMMAND_BOUNDARY, QUICK_ADD_INLINE_CONTROL_BOUNDARY, SIMPLE_TASK_TOKEN_RE, RICH_TASK_TOKEN_RE, NATURAL_TIME_HINT_RE, PURE_TIME_ONLY_RE, BARE_MONTH_RE, TRAILING_DATE_SUFFIX_RE, TRAILING_DATE_SEPARATOR_RE, dotDateParser, quickAddChrono, quickAddChronoDayFirst, getQuickAddChrono = () => isActiveDateFormatDayFirst() ? quickAddChronoDayFirst : quickAddChrono, LOCALE_CHRONO_FACTORY, localeChronoCache, TRAILING_DATE_INTRO_WORDS, localizedMonthNamesCache, CONTAINS_LETTER_RE, QUICK_ADD_PRIORITY_HELP_TOKEN;
85217
85368
  var init_quick_add = __esm(() => {
85218
85369
  init_esm();
85219
85370
  init_date_fns();
@@ -85298,6 +85449,7 @@ var init_quick_add = __esm(() => {
85298
85449
  };
85299
85450
  localizedMonthNamesCache = new Map;
85300
85451
  CONTAINS_LETTER_RE = /\p{L}/u;
85452
+ QUICK_ADD_PRIORITY_HELP_TOKEN = /\/priority:<[^>]*>(?:\s*[,،、]\s*|\s+)?/u;
85301
85453
  });
85302
85454
 
85303
85455
  // ../../packages/core/src/project-utils.ts
@@ -85312,6 +85464,19 @@ function normalizeProjectTaskSortBy(value) {
85312
85464
  }
85313
85465
  return;
85314
85466
  }
85467
+ function getProjectSectionsForView(project, visibleSections, allSections = visibleSections) {
85468
+ if (!project)
85469
+ return [];
85470
+ const archivedHistory = project.status === "archived";
85471
+ const source = archivedHistory ? allSections : visibleSections;
85472
+ return source.filter((section) => {
85473
+ if (section.projectId !== project.id)
85474
+ return false;
85475
+ if (!section.deletedAt)
85476
+ return true;
85477
+ return archivedHistory && section.projectArchivedAt === section.deletedAt && section.deletedAtBeforeProjectArchive === null;
85478
+ }).sort(compareProjectSections);
85479
+ }
85315
85480
  function getSequentialProjectTaskCues(project, tasks, options = {}) {
85316
85481
  const cues = new Map;
85317
85482
  if (!project?.isSequential)
@@ -85443,7 +85608,13 @@ function getProjectChoiceState(browseProjects, query, searchProjects = browsePro
85443
85608
  canCreate: !exactMatch
85444
85609
  };
85445
85610
  }
85446
- var TASK_SORT_BY_VALUES, TASK_SORT_BY_VALUE_SET, PROJECT_TASK_SORT_BY_VALUES, getTaskProjectOrder = (task) => {
85611
+ var TASK_SORT_BY_VALUES, TASK_SORT_BY_VALUE_SET, PROJECT_TASK_SORT_BY_VALUES, compareProjectSections = (a, b) => {
85612
+ const aOrder = Number.isFinite(a.order) ? a.order : 0;
85613
+ const bOrder = Number.isFinite(b.order) ? b.order : 0;
85614
+ if (aOrder !== bOrder)
85615
+ return aOrder - bOrder;
85616
+ return a.title.localeCompare(b.title);
85617
+ }, getTaskProjectOrder = (task) => {
85447
85618
  if (Number.isFinite(task.order))
85448
85619
  return task.order;
85449
85620
  if (Number.isFinite(task.orderNum))
@@ -86368,6 +86539,36 @@ function buildTrashTimeline(tasks, projects) {
86368
86539
  ];
86369
86540
  return items.sort((left, right) => compareDeletedAtDesc(getTrashTimelineEntity(left), getTrashTimelineEntity(right)));
86370
86541
  }
86542
+ function resolveTaskSortByForFeatures(sortBy, settings) {
86543
+ const flags = resolveFeatureFlags(settings);
86544
+ if (sortBy === "timeEstimate" && !flags.timeEstimates)
86545
+ return "default";
86546
+ if (sortBy === "priority" && !flags.priorities)
86547
+ return "default";
86548
+ return sortBy;
86549
+ }
86550
+ function resolveTaskGroupByForFeatures(groupBy, settings) {
86551
+ if (groupBy === "priority" && !resolveFeatureFlags(settings).priorities)
86552
+ return "none";
86553
+ return groupBy;
86554
+ }
86555
+ function resolveTaskPerspectiveForFeatures({
86556
+ sortBy,
86557
+ groupBy,
86558
+ settings,
86559
+ hasActiveFilters,
86560
+ hasCurrentCriteria,
86561
+ activeSavedFilterId
86562
+ }) {
86563
+ const effectiveSortBy = resolveTaskSortByForFeatures(sortBy, settings);
86564
+ const effectiveGroupBy = resolveTaskGroupByForFeatures(groupBy, settings);
86565
+ return {
86566
+ effectiveSortBy,
86567
+ effectiveGroupBy,
86568
+ isDefaultPerspective: !hasActiveFilters && activeSavedFilterId === null && effectiveSortBy === "default",
86569
+ canSavePerspective: activeSavedFilterId === null && (hasCurrentCriteria || effectiveSortBy !== "default" || effectiveGroupBy !== "none")
86570
+ };
86571
+ }
86371
86572
  function sortTasksBy(tasks, sortBy = "default") {
86372
86573
  if (!sortBy || sortBy === "default") {
86373
86574
  return sortTasks(tasks);
@@ -86517,7 +86718,7 @@ function sortTasksBySavedPreference(tasks, sortBy, options = {}) {
86517
86718
  case "created-desc":
86518
86719
  return withFallbacks(byCreatedDesc);
86519
86720
  case "priority":
86520
- return withFallbacks(byPriority, byDue, byStart, byCreatedAsc);
86721
+ return options.prioritizeByPriority ? withFallbacks(byPriority, byDue, byStart, byCreatedAsc) : withFallbacks(byDue, byStart, byCreatedAsc);
86521
86722
  case "energy":
86522
86723
  return withFallbacks(byEnergy, byDue, byStart, byCreatedAsc);
86523
86724
  case "timeEstimate":
@@ -87658,7 +87859,18 @@ var init_tombstone_compaction = __esm(() => {
87658
87859
  function filterNotDeleted(items) {
87659
87860
  return items.filter((item) => !item.deletedAt);
87660
87861
  }
87661
- var MISSING_ATTACHMENT_TIMESTAMP_SENTINEL = "1970-01-01T00:00:00.000Z", normalizeWebdavUrl = (rawUrl) => {
87862
+ var MISSING_ATTACHMENT_TIMESTAMP_SENTINEL = "1970-01-01T00:00:00.000Z", MISSING_SETTINGS_SYNC_TIMESTAMP_SENTINEL = "1970-01-01T00:00:00.000Z", advanceLatestSyncTimestamp = (...values) => {
87863
+ let latestTime = Date.parse(MISSING_SETTINGS_SYNC_TIMESTAMP_SENTINEL);
87864
+ for (const value of values) {
87865
+ const parsed = Date.parse(value ?? "");
87866
+ if (Number.isFinite(parsed) && parsed > latestTime)
87867
+ latestTime = parsed;
87868
+ }
87869
+ if (!Number.isFinite(latestTime))
87870
+ return;
87871
+ const advanced = new Date(latestTime + 1);
87872
+ return Number.isFinite(advanced.getTime()) ? advanced.toISOString() : undefined;
87873
+ }, normalizeWebdavUrl = (rawUrl) => {
87662
87874
  const splitIndex = rawUrl.search(/[?#]/);
87663
87875
  const pathEnd = splitIndex >= 0 ? splitIndex : rawUrl.length;
87664
87876
  const path = rawUrl.slice(0, pathEnd).replace(/\/+$/, "");
@@ -87749,9 +87961,20 @@ var MISSING_ATTACHMENT_TIMESTAMP_SENTINEL = "1970-01-01T00:00:00.000Z", normaliz
87749
87961
  assertNoPendingUploadList(findPendingAttachmentUploads(data).filter((item) => item.reason === "content-replacement"));
87750
87962
  }, hasPendingSyncSideEffects = (data) => Boolean(data.settings.pendingRemoteWriteAt) || findPendingAttachmentUploads(data).length > 0 || Boolean(data.settings.attachments?.pendingRemoteDeletes?.length), sanitizeSettingsForRemote = (settings) => {
87751
87963
  const prefs = settings.syncPreferences ?? {};
87964
+ const remotePrefs = { ...prefs };
87965
+ let remotePrefsUpdatedAt = settings.syncPreferencesUpdatedAt ? { ...settings.syncPreferencesUpdatedAt } : undefined;
87966
+ if (isSettingsSyncGroupEnabled(prefs, "gtd")) {
87967
+ remotePrefs.gtd = true;
87968
+ if (prefs.gtd === undefined) {
87969
+ const materializedAt = advanceLatestSyncTimestamp(remotePrefsUpdatedAt?.preferences, remotePrefsUpdatedAt?.gtd);
87970
+ if (materializedAt) {
87971
+ remotePrefsUpdatedAt = { ...remotePrefsUpdatedAt, preferences: materializedAt };
87972
+ }
87973
+ }
87974
+ }
87752
87975
  const next = {
87753
- syncPreferences: { ...prefs },
87754
- syncPreferencesUpdatedAt: settings.syncPreferencesUpdatedAt ? { ...settings.syncPreferencesUpdatedAt } : undefined
87976
+ syncPreferences: remotePrefs,
87977
+ syncPreferencesUpdatedAt: remotePrefsUpdatedAt
87755
87978
  };
87756
87979
  if (prefs.appearance === true) {
87757
87980
  next.theme = settings.theme;
@@ -88723,6 +88946,34 @@ async function runAttachmentTransferLifecycle(options) {
88723
88946
  }
88724
88947
  }
88725
88948
  };
88949
+ const provePendingUploadIdentity = async (attachment, localPath) => {
88950
+ if (!options.createUploadSnapshot)
88951
+ return false;
88952
+ if (options.getLocalFileStat) {
88953
+ const candidateStat = await options.getLocalFileStat(localPath, attachment).catch(() => null);
88954
+ if (candidateStat)
88955
+ assertUploadStatAllowed(candidateStat);
88956
+ }
88957
+ const snapshot = await options.createUploadSnapshot(localPath, attachment);
88958
+ if (!snapshot)
88959
+ return false;
88960
+ try {
88961
+ const snapshotHash = snapshot.fileHash.trim().toLowerCase();
88962
+ if (!isSha256Hex(snapshotHash)) {
88963
+ options.onLocalEditRace?.(attachment);
88964
+ return false;
88965
+ }
88966
+ assertUploadStatAllowed(snapshot.stat);
88967
+ applyAttachmentContentStat(attachment, snapshot.stat, snapshotHash);
88968
+ return true;
88969
+ } finally {
88970
+ try {
88971
+ await snapshot.dispose();
88972
+ } catch (error2) {
88973
+ options.onUploadError(attachment, error2);
88974
+ }
88975
+ }
88976
+ };
88726
88977
  for (const original of options.attachmentsById.values()) {
88727
88978
  await options.beforeEachAttachment?.();
88728
88979
  if (original.kind !== "file")
@@ -88752,6 +89003,17 @@ async function runAttachmentTransferLifecycle(options) {
88752
89003
  itemMutated = true;
88753
89004
  }
88754
89005
  const mayReadForSync = existsLocally && (options.canUploadFrom?.(localPath, attachment) ?? true);
89006
+ if (hasPendingContentUpload && options.deferUploads && mayReadForSync && !isSha256Hex(attachment.fileHash)) {
89007
+ try {
89008
+ if (await provePendingUploadIdentity(attachment, localPath)) {
89009
+ itemMutated = true;
89010
+ }
89011
+ } catch (error2) {
89012
+ if (options.isFatalError?.(error2))
89013
+ throw error2;
89014
+ options.onUploadError(attachment, error2);
89015
+ }
89016
+ }
88755
89017
  if (hasPendingContentUpload && !options.deferUploads) {
88756
89018
  const expectedPendingHash = attachment.fileHash?.trim().toLowerCase();
88757
89019
  if (!isSha256Hex(expectedPendingHash)) {
@@ -92233,11 +92495,12 @@ function mergeAppDataWithStats(local, incoming, options = {}) {
92233
92495
  const localRev = localAttachment.contentRev ?? 0;
92234
92496
  const incomingRev = incomingAttachment.contentRev ?? 0;
92235
92497
  const contentSource = localRev === incomingRev ? winner : localRev > incomingRev ? localAttachment : incomingAttachment;
92236
- const fileHash = contentSource.fileHash || localAttachment.fileHash || incomingAttachment.fileHash;
92237
92498
  const contentRev = contentSource.contentRev;
92499
+ const localPendingCandidateWon = localAttachment.pendingContentUpload === true && contentSource === localAttachment;
92500
+ const fileHash = localPendingCandidateWon ? localAttachment.fileHash : contentSource.fileHash || localAttachment.fileHash || incomingAttachment.fileHash;
92238
92501
  const normalizedLocalFileHash = localAttachment.fileHash?.trim().toLowerCase();
92239
92502
  const normalizedResolvedFileHash = fileHash?.trim().toLowerCase();
92240
- const localIdentitySurvived = (contentRev ?? 0) === localRev && Boolean(normalizedLocalFileHash) && normalizedResolvedFileHash === normalizedLocalFileHash;
92503
+ const localIdentitySurvived = (contentRev ?? 0) === localRev && (Boolean(normalizedLocalFileHash) && normalizedResolvedFileHash === normalizedLocalFileHash || localPendingCandidateWon && !normalizedLocalFileHash && !normalizedResolvedFileHash);
92241
92504
  const localPendingIdentitySurvived = localAttachment.pendingContentUpload === true && localIdentitySurvived;
92242
92505
  const statSource = localIdentitySurvived ? localAttachment : contentSource;
92243
92506
  return {
@@ -92299,7 +92562,7 @@ function mergeAppDataWithStats(local, incoming, options = {}) {
92299
92562
  ...attachment,
92300
92563
  uri: safeUri ?? "",
92301
92564
  cloudKey: resolveCloudKey(attachment, localFile, incomingFile),
92302
- fileHash: attachment.deletedAt ? attachment.fileHash : attachment.fileHash || localFile?.fileHash || incomingFile?.fileHash,
92565
+ fileHash: attachment.deletedAt ? attachment.fileHash : attachment.pendingContentUpload === true ? attachment.fileHash : attachment.fileHash || localFile?.fileHash || incomingFile?.fileHash,
92303
92566
  localStatus: attachment.deletedAt ? attachment.localStatus : uriAvailable ? attachment.localStatus ?? "available" : normalizeMissingFileStatus(attachment.localStatus, attachment.deletedAt)
92304
92567
  };
92305
92568
  });
@@ -96777,35 +97040,109 @@ var SLOW_TASK_UPDATE_LOG_THRESHOLD_MS = 500, collectAttachmentCloudKeysForTasks
96777
97040
  return missingTask ? actionFail2("Task not found") : actionOk2({ id: duplicatedTaskId });
96778
97041
  },
96779
97042
  convertTaskToSection: async (id2) => {
96780
- const sourceTask = get()._tasksById.get(id2);
96781
- if (!sourceTask || sourceTask.deletedAt)
96782
- return actionFail2("Task not found");
96783
- const projectId = sourceTask.projectId;
96784
- if (!projectId)
96785
- return actionFail2("Task is not in a project");
96786
- const description = typeof sourceTask.description === "string" ? sourceTask.description.trim() : "";
96787
- const section = await get().addSection(projectId, sourceTask.title, description ? { description } : undefined);
96788
- if (!section)
96789
- return actionFail2("Section could not be created");
97043
+ const changeAt = Date.now();
96790
97044
  const now3 = new Date().toISOString();
96791
- const checklistTasks = (sourceTask.checklist || []).filter((item) => typeof item.title === "string" && item.title.trim().length > 0).map((item) => ({
96792
- title: item.title,
96793
- initialProps: {
97045
+ let errorMessage;
97046
+ let convertedSectionId;
97047
+ set5((state) => {
97048
+ const sourceTask = state._tasksById.get(id2);
97049
+ if (!sourceTask || sourceTask.deletedAt) {
97050
+ errorMessage = "Task not found";
97051
+ return state;
97052
+ }
97053
+ const projectId = normalizeOptionalContainerId(sourceTask.projectId);
97054
+ if (!projectId) {
97055
+ errorMessage = "Task is not in a project";
97056
+ return state;
97057
+ }
97058
+ const projectExists = state._allProjects.some((project) => project.id === projectId && !project.deletedAt);
97059
+ const sectionTitle = typeof sourceTask.title === "string" ? sourceTask.title.trim() : "";
97060
+ if (!projectExists || !sectionTitle) {
97061
+ errorMessage = "Section could not be created";
97062
+ return state;
97063
+ }
97064
+ const deviceState = ensureDeviceId(state.settings);
97065
+ const sectionOrder = state._allSections.filter((section2) => section2.projectId === projectId && !section2.deletedAt).reduce((max3, section2) => Math.max(max3, Number.isFinite(section2.order) ? section2.order : -1), -1) + 1;
97066
+ const description = typeof sourceTask.description === "string" ? sourceTask.description.trim() : "";
97067
+ const section = {
97068
+ id: generateUUID(),
96794
97069
  projectId,
96795
- sectionId: section.id,
96796
- status: item.isCompleted ? "done" : "next",
96797
- ...item.isCompleted ? { completedAt: now3 } : {}
97070
+ title: sectionTitle,
97071
+ ...description ? { description } : {},
97072
+ order: sectionOrder,
97073
+ isCollapsed: false,
97074
+ rev: 1,
97075
+ revBy: deviceState.deviceId,
97076
+ createdAt: now3,
97077
+ updatedAt: now3
97078
+ };
97079
+ const nextAllSections = [...state._allSections, section];
97080
+ const projectOrderReserver = createProjectOrderReserver(state._allTasks);
97081
+ const checklistTasks = [];
97082
+ for (const item of sourceTask.checklist || []) {
97083
+ const title = typeof item.title === "string" ? item.title.trim() : "";
97084
+ if (!title)
97085
+ continue;
97086
+ const containerResolution = resolveTaskContainerAssignment({
97087
+ projectId,
97088
+ sectionId: section.id,
97089
+ areaId: undefined,
97090
+ allProjects: state._allProjects,
97091
+ allSections: nextAllSections,
97092
+ allAreas: state._allAreas
97093
+ });
97094
+ if (!containerResolution.ok) {
97095
+ errorMessage = containerResolution.error;
97096
+ return state;
97097
+ }
97098
+ const order = projectOrderReserver(containerResolution.projectId);
97099
+ checklistTasks.push({
97100
+ id: generateUUID(),
97101
+ title,
97102
+ status: item.isCompleted ? "done" : "next",
97103
+ taskMode: "task",
97104
+ tags: [],
97105
+ contexts: [],
97106
+ pushCount: 0,
97107
+ projectId: containerResolution.projectId,
97108
+ sectionId: containerResolution.sectionId,
97109
+ areaId: containerResolution.areaId,
97110
+ ...item.isCompleted ? { completedAt: now3 } : {},
97111
+ order,
97112
+ orderNum: order,
97113
+ rev: 1,
97114
+ revBy: deviceState.deviceId,
97115
+ createdAt: now3,
97116
+ updatedAt: now3
97117
+ });
96798
97118
  }
96799
- }));
96800
- if (checklistTasks.length > 0) {
96801
- const added = await get().addTasks(checklistTasks);
96802
- if (!added.success)
96803
- return added;
96804
- }
96805
- const deleted = await get().deleteTask(id2);
96806
- if (!deleted.success)
96807
- return deleted;
96808
- return actionOk2({ id: section.id });
97119
+ const deletedSource = {
97120
+ ...sourceTask,
97121
+ deletedAt: now3,
97122
+ updatedAt: now3,
97123
+ rev: nextRevision(sourceTask.rev),
97124
+ revBy: deviceState.deviceId
97125
+ };
97126
+ const nextAllTasks = [
97127
+ ...replaceEntityInArray(state._allTasks, deletedSource.id, deletedSource),
97128
+ ...checklistTasks
97129
+ ];
97130
+ convertedSectionId = section.id;
97131
+ persist(set5, debouncedSave, state, {
97132
+ tasks: nextAllTasks,
97133
+ sections: nextAllSections,
97134
+ ...deviceState.updated ? { settings: deviceState.settings } : {}
97135
+ });
97136
+ return {
97137
+ _allTasks: nextAllTasks,
97138
+ _allSections: nextAllSections,
97139
+ lastDataChangeAt: getNextDataChangeAt(state.lastDataChangeAt, changeAt),
97140
+ ...deviceState.updated ? { settings: deviceState.settings } : {}
97141
+ };
97142
+ });
97143
+ if (errorMessage)
97144
+ return actionFail2(errorMessage);
97145
+ return convertedSectionId ? actionOk2({ id: convertedSectionId }) : actionFail2("Task not found");
96809
97146
  },
96810
97147
  promoteTaskToProject: async (id2, options) => {
96811
97148
  const changeAt = Date.now();
@@ -101557,8 +101894,17 @@ async function webdavGetFileVersionedWithServerTime(url, options = {}) {
101557
101894
  error2.status = res.status;
101558
101895
  throw error2;
101559
101896
  }
101897
+ let body;
101898
+ try {
101899
+ body = await readResponseBody(res, options.onProgress, options.maxBytes ?? MAX_DOWNLOAD_BYTES, signal);
101900
+ } catch (error2) {
101901
+ if (options.treatOversizeAsAbsent && error2 instanceof ResponseTooLargeError) {
101902
+ return { bytes: null, version: null, serverNowMs };
101903
+ }
101904
+ throw error2;
101905
+ }
101560
101906
  return {
101561
- bytes: new Uint8Array(await readResponseBody(res, options.onProgress, options.maxBytes ?? MAX_DOWNLOAD_BYTES, signal)),
101907
+ bytes: new Uint8Array(body),
101562
101908
  version: normalizeStrongWebdavEtag(res.headers.get("etag")),
101563
101909
  serverNowMs
101564
101910
  };
@@ -101593,7 +101939,14 @@ async function probeWebdavSyncCompatibility(documentUrl, options = {}, policy =
101593
101939
  }
101594
101940
  return "legacy-plaintext";
101595
101941
  }
101596
- await assertWebdavConditionalWriteSupport(documentUrl, documentOptions);
101942
+ try {
101943
+ await assertWebdavConditionalWriteSupport(documentUrl, documentOptions);
101944
+ } catch (error2) {
101945
+ if (!policy.requireStrongEtag && error2 instanceof SyncEncryptionRemoteVersionUnavailableError) {
101946
+ return "legacy-plaintext";
101947
+ }
101948
+ throw error2;
101949
+ }
101597
101950
  return "strong-etag";
101598
101951
  }
101599
101952
  async function assertWebdavStrongEtagSupport(documentUrl, options = {}) {
@@ -102865,7 +103218,7 @@ class SharedSyncRunMachine {
102865
103218
  }
102866
103219
  async prepareRemoteWriteData(data) {
102867
103220
  if (this.options.activationProbe) {
102868
- const activationSnapshot = prepareActivationAttachmentSnapshot(data, this.state.remoteDataForCompare);
103221
+ const activationSnapshot = prepareActivationAttachmentSnapshot(data, this.state.remoteDataForCompare, this.state.localDataCache?.data ?? null);
102869
103222
  if (activationSnapshot.count === 0)
102870
103223
  return data;
102871
103224
  const io2 = this.requireIo();
@@ -102878,15 +103231,25 @@ class SharedSyncRunMachine {
102878
103231
  await this.ensureNetwork();
102879
103232
  }
102880
103233
  await this.ensureRemoteMutationFence();
102881
- const result2 = await io2.syncAttachments(activationSnapshot.data, this.attachmentHelpers("post-merge"));
103234
+ let result2 = await io2.syncAttachments(activationSnapshot.data, this.attachmentHelpers("post-merge"));
102882
103235
  await this.assertRemoteMutationFenceHeld();
102883
- const provenData = result2 && typeof result2 === "object" ? result2 : activationSnapshot.data;
102884
- assertActivationAttachmentsProven(provenData, activationSnapshot.count);
103236
+ let provenData = result2 && typeof result2 === "object" ? result2 : activationSnapshot.data;
103237
+ this.ensureLocalSnapshotFresh();
103238
+ const fallbackRetry = prepareActivationFallbackRetry(provenData, activationSnapshot.localFallbacks);
103239
+ if (fallbackRetry.count > 0) {
103240
+ result2 = await io2.syncAttachments(fallbackRetry.data, this.attachmentHelpers("post-merge"));
103241
+ await this.assertRemoteMutationFenceHeld();
103242
+ provenData = result2 && typeof result2 === "object" ? result2 : fallbackRetry.data;
103243
+ }
103244
+ assertActivationAttachmentsProven(provenData, activationSnapshot.expectedIds);
102885
103245
  this.ensureLocalSnapshotFresh();
102886
103246
  this.notifier.onDiagnostic?.({
102887
103247
  event: "attachments-prepare-complete",
102888
103248
  data: provenData,
102889
- extra: { mutated: String(result2 === true || Boolean(result2 && typeof result2 === "object")) }
103249
+ extra: {
103250
+ mutated: String(result2 === true || Boolean(result2 && typeof result2 === "object")),
103251
+ fallbackRetries: String(fallbackRetry.count)
103252
+ }
102890
103253
  });
102891
103254
  return provenData;
102892
103255
  }
@@ -103296,17 +103659,52 @@ var normalizeRemoteWriteResult = (source, result) => {
103296
103659
  if (!merged.fileHash || !candidate.fileHash)
103297
103660
  return false;
103298
103661
  return merged.fileHash.toLowerCase() !== candidate.fileHash.toLowerCase();
103299
- }, prepareActivationAttachmentSnapshot = (data, candidateRemoteData) => {
103662
+ }, normalizeAttachmentHash = (value) => value?.trim().toLowerCase() ?? "", buildExactLocalActivationFallback = (merged, local, candidate) => {
103663
+ if (!local || !candidate?.cloudKey)
103664
+ return null;
103665
+ const localUri = local.uri?.trim();
103666
+ const localHash = normalizeAttachmentHash(local.fileHash);
103667
+ const mergedHash = normalizeAttachmentHash(merged.fileHash);
103668
+ const candidateHash = normalizeAttachmentHash(candidate.fileHash);
103669
+ if (!localUri || local.localStatus === "missing" || !localHash || localHash !== mergedHash || localHash !== candidateHash || (local.contentRev ?? 0) !== (merged.contentRev ?? 0) || (local.contentRev ?? 0) !== (candidate.contentRev ?? 0)) {
103670
+ return null;
103671
+ }
103672
+ return {
103673
+ ...merged,
103674
+ uri: local.uri,
103675
+ cloudKey: undefined,
103676
+ fileHash: merged.fileHash,
103677
+ contentMtimeMs: local.contentMtimeMs,
103678
+ contentSize: local.contentSize,
103679
+ localStatus: "available",
103680
+ pendingContentUpload: true,
103681
+ deletedAt: undefined
103682
+ };
103683
+ }, prepareActivationAttachmentSnapshot = (data, candidateRemoteData, localData) => {
103300
103684
  const candidateAttachments = new Map;
103301
103685
  if (candidateRemoteData) {
103302
103686
  visitLiveFileAttachments(candidateRemoteData, (attachment) => {
103303
103687
  candidateAttachments.set(attachment.id, attachment);
103304
103688
  });
103305
103689
  }
103690
+ const localAttachments = new Map;
103691
+ if (localData) {
103692
+ visitLiveFileAttachments(localData, (attachment) => {
103693
+ localAttachments.set(attachment.id, attachment);
103694
+ });
103695
+ }
103306
103696
  const candidate = cloneAppData(data);
103697
+ const expectedIds = new Set;
103698
+ const localFallbacks = new Map;
103307
103699
  const count = visitLiveFileAttachments(candidate, (attachment) => {
103700
+ expectedIds.add(attachment.id);
103308
103701
  const candidateAttachment = candidateAttachments.get(attachment.id);
103309
103702
  const mustReplaceCandidateBlob = Boolean(candidateAttachment?.cloudKey && mergedContentMustReplaceCandidateBlob(attachment, candidateAttachment));
103703
+ if (!mustReplaceCandidateBlob) {
103704
+ const fallback = buildExactLocalActivationFallback(attachment, localAttachments.get(attachment.id), candidateAttachment);
103705
+ if (fallback)
103706
+ localFallbacks.set(attachment.id, fallback);
103707
+ }
103310
103708
  attachment.cloudKey = candidateAttachment?.cloudKey;
103311
103709
  attachment.pendingContentUpload = mustReplaceCandidateBlob ? true : undefined;
103312
103710
  if (candidateAttachment?.cloudKey && !mustReplaceCandidateBlob) {
@@ -103314,17 +103712,47 @@ var normalizeRemoteWriteResult = (source, result) => {
103314
103712
  }
103315
103713
  attachment.localStatus = "missing";
103316
103714
  });
103317
- return { data: candidate, count };
103318
- }, assertActivationAttachmentsProven = (data, expectedCount) => {
103319
- let provenCount = 0;
103320
- visitLiveFileAttachments(data, (attachment) => {
103321
- if (!attachment.cloudKey || attachment.localStatus !== "available" || attachment.pendingContentUpload === true) {
103322
- throw new Error(`Candidate attachment proof failed for ${attachment.id}`);
103323
- }
103324
- provenCount += 1;
103325
- });
103326
- if (provenCount !== expectedCount) {
103327
- throw new Error(`Candidate attachment proof incomplete: expected ${expectedCount}, proved ${provenCount}`);
103715
+ return { data: candidate, count, expectedIds, localFallbacks };
103716
+ }, prepareActivationFallbackRetry = (data, localFallbacks) => {
103717
+ if (localFallbacks.size === 0)
103718
+ return { data, count: 0 };
103719
+ const retryData = cloneAppData(data);
103720
+ let count = 0;
103721
+ for (const owner of [...retryData.tasks, ...retryData.projects]) {
103722
+ if (owner.deletedAt)
103723
+ continue;
103724
+ for (const attachment of owner.attachments ?? []) {
103725
+ if (attachment.kind !== "file" || !attachment.deletedAt)
103726
+ continue;
103727
+ const fallback = localFallbacks.get(attachment.id);
103728
+ if (!fallback)
103729
+ continue;
103730
+ Object.assign(attachment, fallback);
103731
+ count += 1;
103732
+ }
103733
+ }
103734
+ return count > 0 ? { data: retryData, count } : { data, count: 0 };
103735
+ }, assertActivationAttachmentsProven = (data, expectedIds) => {
103736
+ const resolved = new Set;
103737
+ for (const owner of [...data.tasks, ...data.projects]) {
103738
+ for (const attachment of owner.attachments ?? []) {
103739
+ if (attachment.kind !== "file")
103740
+ continue;
103741
+ if (owner.deletedAt || attachment.deletedAt) {
103742
+ if (expectedIds.has(attachment.id)) {
103743
+ throw new Error(`Candidate attachment proof failed for ${attachment.id}`);
103744
+ }
103745
+ continue;
103746
+ }
103747
+ if (!attachment.cloudKey || attachment.localStatus !== "available" || attachment.pendingContentUpload === true) {
103748
+ throw new Error(`Candidate attachment proof failed for ${attachment.id}`);
103749
+ }
103750
+ if (expectedIds.has(attachment.id))
103751
+ resolved.add(attachment.id);
103752
+ }
103753
+ }
103754
+ if (resolved.size !== expectedIds.size) {
103755
+ throw new Error(`Candidate attachment proof incomplete: expected ${expectedIds.size}, proved ${resolved.size}`);
103328
103756
  }
103329
103757
  }, runSharedSyncCycle = async (ports) => {
103330
103758
  return new SharedSyncRunMachine(ports).run();
@@ -104286,7 +104714,7 @@ var FENCE_MAX_BYTES = 4096, webdavMutationFenceUrl = (documentUrl) => {
104286
104714
  return parsed.toString();
104287
104715
  }, createWebdavSyncRemoteMutationFencePort = (documentUrl, options = {}) => {
104288
104716
  const url = webdavMutationFenceUrl(documentUrl);
104289
- const readOptions = { ...options, maxBytes: FENCE_MAX_BYTES };
104717
+ const readOptions = { ...options, maxBytes: FENCE_MAX_BYTES, treatOversizeAsAbsent: true };
104290
104718
  return {
104291
104719
  read: () => webdavGetFileVersionedWithServerTime(url, readOptions),
104292
104720
  write: (bytes, expectedVersion) => webdavPutFileVersioned(url, bytes, "application/json", expectedVersion, options),
@@ -105928,6 +106356,15 @@ function taskDraftToUpdatePatch(draft, task, options = {}) {
105928
106356
  return null;
105929
106357
  const resolvedProjectId = draft.projectId || undefined;
105930
106358
  const recurrenceValue = draft.recurrence ? { rule: draft.recurrence, strategy: draft.recurrenceStrategy } : undefined;
106359
+ const storedRecurrence = task.recurrence && typeof task.recurrence === "object" ? task.recurrence : undefined;
106360
+ if (recurrenceValue && storedRecurrence?.rule === recurrenceValue.rule) {
106361
+ for (const field of RECURRENCE_ANCHOR_FIELDS) {
106362
+ const value = storedRecurrence[field];
106363
+ if (typeof value === "number") {
106364
+ recurrenceValue[field] = value;
106365
+ }
106366
+ }
106367
+ }
105931
106368
  if (recurrenceValue && draft.recurrenceRRule) {
105932
106369
  const parsed = parseRRuleString(draft.recurrenceRRule);
105933
106370
  if (parsed.byDay && parsed.byDay.length > 0) {
@@ -105936,6 +106373,9 @@ function taskDraftToUpdatePatch(draft, task, options = {}) {
105936
106373
  if (parsed.byMonthDay && parsed.byMonthDay.length > 0) {
105937
106374
  recurrenceValue.byMonthDay = parsed.byMonthDay;
105938
106375
  }
106376
+ if (parsed.weekStart) {
106377
+ recurrenceValue.weekStart = parsed.weekStart;
106378
+ }
105939
106379
  if (parsed.count) {
105940
106380
  recurrenceValue.count = parsed.count;
105941
106381
  }
@@ -105979,8 +106419,32 @@ function taskDraftToUpdatePatch(draft, task, options = {}) {
105979
106419
  ...attachmentsPatch
105980
106420
  };
105981
106421
  }
106422
+ function taskDraftToChangedUpdatePatch(draft, baselineTask, options = {}) {
106423
+ const patch = taskDraftToUpdatePatch(draft, baselineTask, options);
106424
+ if (!patch)
106425
+ return null;
106426
+ const baseline = taskDraftToUpdatePatch(createTaskDraft(baselineTask), baselineTask, {
106427
+ attachments: baselineTask.attachments
106428
+ }) ?? {};
106429
+ const narrowed = { ...patch };
106430
+ for (const key of Object.keys(narrowed)) {
106431
+ const baselineValue = RAW_CONTAINER_TASK_FIELDS.has(key) ? baselineTask[key] : baseline[key];
106432
+ if (areSerializedTaskFieldValuesEqual(narrowed[key], baselineValue)) {
106433
+ delete narrowed[key];
106434
+ }
106435
+ }
106436
+ return narrowed;
106437
+ }
105982
106438
  var trimmedDiffers = (draftValue, taskValue) => draftValue.trim() !== taskValue.trim(), getTaskDraftRecurrenceRRuleValue, TASK_DRAFT_FIELDS, TASK_DRAFT_FIELD_KEYS, attachmentFingerprint = (attachments) => (attachments ?? []).map((attachment) => `${attachment.id}\x00${attachment.uri ?? ""}\x00${attachment.title ?? ""}\x00${attachment.deletedAt ?? ""}`).join(`
105983
- `);
106439
+ `), RECURRENCE_ANCHOR_FIELDS, RAW_CONTAINER_TASK_FIELDS, areSerializedTaskFieldValuesEqual = (left, right) => {
106440
+ if (left === "" && right == null || right === "" && left == null) {
106441
+ return true;
106442
+ }
106443
+ if (Array.isArray(left) || Array.isArray(right) || typeof left === "object" && left !== null || typeof right === "object" && right !== null) {
106444
+ return JSON.stringify(left ?? null) === JSON.stringify(right ?? null);
106445
+ }
106446
+ return (left ?? null) === (right ?? null);
106447
+ };
105984
106448
  var init_task_draft = __esm(() => {
105985
106449
  init_bulk_task_tokens();
105986
106450
  init_date();
@@ -106051,6 +106515,13 @@ var init_task_draft = __esm(() => {
106051
106515
  }
106052
106516
  };
106053
106517
  TASK_DRAFT_FIELD_KEYS = Object.keys(TASK_DRAFT_FIELDS);
106518
+ RECURRENCE_ANCHOR_FIELDS = [
106519
+ "anchorDay",
106520
+ "startAnchorDay",
106521
+ "dueAnchorDay",
106522
+ "reviewAnchorDay"
106523
+ ];
106524
+ RAW_CONTAINER_TASK_FIELDS = new Set(["projectId", "sectionId", "areaId"]);
106054
106525
  });
106055
106526
 
106056
106527
  // ../../packages/core/src/contexts.ts
@@ -113232,7 +113703,37 @@ var BACKUP_FILE_PREFIX = "mindwtr-backup-", MAX_BACKUP_SOURCE_BYTES, MAX_BACKUP_
113232
113703
  delete nextSettings.security;
113233
113704
  }
113234
113705
  return nextSettings;
113235
- }, sanitizeRestoredAttachments = (item) => item.attachments ? { ...item, attachments: normalizeAttachmentsForSyncMerge(item.attachments) } : item, prepareRestoredBackupDataForSync = (data, options = {}) => {
113706
+ }, sanitizeRestoredAttachments = (item) => item.attachments ? { ...item, attachments: normalizeAttachmentsForSyncMerge(item.attachments) } : item, prepareRestoredAttachmentsForSync = (item, restoredAt, previous) => {
113707
+ const restoredAttachments = normalizeAttachmentsForSyncMerge(item.attachments) ?? [];
113708
+ const previousAttachments = normalizeAttachmentsForSyncMerge(previous?.attachments) ?? [];
113709
+ if (restoredAttachments.length === 0 && previousAttachments.length === 0) {
113710
+ return sanitizeRestoredAttachments(item);
113711
+ }
113712
+ const restoredIds = new Set(restoredAttachments.map((attachment) => attachment.id));
113713
+ const previousAttachmentsById = new Map(previousAttachments.map((attachment) => [attachment.id, attachment]));
113714
+ const refreshed = restoredAttachments.map((attachment) => {
113715
+ const previousAttachment = previousAttachmentsById.get(attachment.id);
113716
+ const shouldPublishRestoredBytes = attachment.kind === "file" && !item.deletedAt && !attachment.deletedAt;
113717
+ return {
113718
+ ...attachment,
113719
+ ...attachment.kind === "file" ? {
113720
+ contentRev: nextRevision(Math.max(normalizeRevision(attachment.contentRev), normalizeRevision(previousAttachment?.contentRev)))
113721
+ } : {},
113722
+ ...shouldPublishRestoredBytes ? { pendingContentUpload: true } : {},
113723
+ ...attachment.deletedAt ? { deletedAt: restoredAt } : {},
113724
+ updatedAt: restoredAt
113725
+ };
113726
+ });
113727
+ const carriedTombstones = previousAttachments.filter((attachment) => !restoredIds.has(attachment.id)).map((attachment) => ({
113728
+ ...attachment,
113729
+ deletedAt: restoredAt,
113730
+ updatedAt: restoredAt
113731
+ }));
113732
+ return {
113733
+ ...item,
113734
+ attachments: [...refreshed, ...carriedTombstones]
113735
+ };
113736
+ }, prepareRestoredBackupDataForSync = (data, options = {}) => {
113236
113737
  const restoredAt = toIsoString(options.restoredAt) ?? new Date().toISOString();
113237
113738
  const restoredSettings = stripDeviceLocalRestoreSettings(data.settings);
113238
113739
  const previous = options.previousData ?? null;
@@ -113245,11 +113746,11 @@ var BACKUP_FILE_PREFIX = "mindwtr-backup-", MAX_BACKUP_SOURCE_BYTES, MAX_BACKUP_
113245
113746
  const tasks = prepare(data.tasks, previous?.tasks).map((task) => task.purgedAt ? compactPurgedTaskForLocalStorage({
113246
113747
  ...task,
113247
113748
  attachments: previousTasksById.get(task.id)?.attachments
113248
- }) : sanitizeRestoredAttachments(task));
113749
+ }) : prepareRestoredAttachmentsForSync(task, restoredAt, previousTasksById.get(task.id)));
113249
113750
  const projects = prepare(data.projects, previous?.projects).map((project) => project.purgedAt ? compactPurgedProjectForLocalStorage({
113250
113751
  ...project,
113251
113752
  attachments: previousProjectsById.get(project.id)?.attachments
113252
- }) : sanitizeRestoredAttachments(project));
113753
+ }) : prepareRestoredAttachmentsForSync(project, restoredAt, previousProjectsById.get(project.id)));
113253
113754
  const sections = compactSectionsForPurgedProjects(prepare(data.sections, previous?.sections), projects);
113254
113755
  return {
113255
113756
  ...data,
@@ -118527,6 +119028,42 @@ var init_capture = __esm(() => {
118527
119028
  init_color_constants();
118528
119029
  });
118529
119030
 
119031
+ // ../../packages/core/src/capture-session.ts
119032
+ class CaptureSessionCoordinator {
119033
+ currentSession = 0;
119034
+ submittingSession = null;
119035
+ beginSession() {
119036
+ this.currentSession += 1;
119037
+ this.submittingSession = null;
119038
+ return this.currentSession;
119039
+ }
119040
+ invalidateSession(session) {
119041
+ if (!this.isCurrent(session))
119042
+ return;
119043
+ this.currentSession += 1;
119044
+ this.submittingSession = null;
119045
+ }
119046
+ isCurrent(session) {
119047
+ return session === this.currentSession;
119048
+ }
119049
+ isSubmitting(session) {
119050
+ return this.isCurrent(session) && this.submittingSession === session;
119051
+ }
119052
+ tryBeginSubmission(session) {
119053
+ if (!this.isCurrent(session) || this.submittingSession !== null)
119054
+ return false;
119055
+ this.submittingSession = session;
119056
+ return true;
119057
+ }
119058
+ finishSubmission(session) {
119059
+ if (!this.isCurrent(session))
119060
+ return false;
119061
+ if (this.submittingSession === session)
119062
+ this.submittingSession = null;
119063
+ return true;
119064
+ }
119065
+ }
119066
+
118530
119067
  // ../../packages/core/src/session-restore.ts
118531
119068
  function shouldRestoreLastView(savedAtMs, nowMs = Date.now()) {
118532
119069
  if (typeof savedAtMs !== "number" || !Number.isFinite(savedAtMs))
@@ -118770,6 +119307,39 @@ var init_import_runner = __esm(() => {
118770
119307
  });
118771
119308
 
118772
119309
  // ../../packages/core/src/global-search-filter.ts
119310
+ function getGlobalSearchFilterPresentation(t) {
119311
+ const translated = (key, fallback) => {
119312
+ const value = t(key);
119313
+ return value && value !== key ? value : fallback;
119314
+ };
119315
+ const scope = {
119316
+ all: translated("search.scope.all", "All"),
119317
+ projects: translated("search.scope.projects", "Projects only"),
119318
+ tasks: translated("search.scope.tasks", "Tasks only"),
119319
+ project_tasks: translated("search.scope.projectTasks", "Tasks in projects")
119320
+ };
119321
+ const due = {
119322
+ any: translated("search.due.any", "Any"),
119323
+ overdue: translated("search.due.overdue", "Overdue"),
119324
+ today: translated("search.due.today", "Today"),
119325
+ tomorrow: translated("search.due.tomorrow", "Tomorrow"),
119326
+ this_week: translated("search.due.thisWeek", "This week"),
119327
+ next_week: translated("search.due.nextWeek", "Next week"),
119328
+ none: translated("search.due.none", "No due date")
119329
+ };
119330
+ return {
119331
+ sections: {
119332
+ status: translated("taskEdit.statusLabel", "Status"),
119333
+ scope: translated("search.scope.label", "Scope"),
119334
+ area: translated("taskEdit.areaLabel", "Area"),
119335
+ due: translated("search.due.label", "Due date"),
119336
+ tokens: translated("filters.contexts", "Contexts & tags")
119337
+ },
119338
+ scope,
119339
+ due,
119340
+ clear: translated("filters.clear", "Clear")
119341
+ };
119342
+ }
118773
119343
  var buildDueMatcher = (duePreset, weekStart) => {
118774
119344
  const now3 = new Date;
118775
119345
  const startOfToday3 = new Date(now3.getFullYear(), now3.getMonth(), now3.getDate());
@@ -119581,6 +120151,7 @@ var init_settings_search_keys = __esm(() => {
119581
120151
  { key: "density", section: "lookAndFeel" },
119582
120152
  { key: "textSize", section: "lookAndFeel" },
119583
120153
  { key: "showTaskAge", section: "lookAndFeel" },
120154
+ { key: "sidebarViews", section: "lookAndFeel" },
119584
120155
  { key: "language", section: "localization" },
119585
120156
  { key: "weekStart", section: "localization" },
119586
120157
  { key: "dateFormat", section: "localization" },
@@ -119601,6 +120172,7 @@ var init_settings_search_keys = __esm(() => {
119601
120172
  "focusTaskLimit",
119602
120173
  "defaultProjectFlowMode",
119603
120174
  "features",
120175
+ { key: "featureTimeline", section: "features" },
119604
120176
  { key: "featurePomodoro", section: "features" },
119605
120177
  { key: "pomodoroCustomPreset", section: "features" },
119606
120178
  { key: "pomodoroLinkTask", section: "features" },
@@ -119736,6 +120308,7 @@ var init_settings_search_keys = __esm(() => {
119736
120308
  "checkForUpdates",
119737
120309
  "feedback",
119738
120310
  "documentation",
120311
+ "videoTutorials",
119739
120312
  "privacy",
119740
120313
  "github",
119741
120314
  "sponsorProject",
@@ -119898,6 +120471,7 @@ __export(exports_src, {
119898
120471
  taskMatchesAreaFilterSelection: () => taskMatchesAreaFilterSelection,
119899
120472
  taskFromSqliteRow: () => taskFromSqliteRow,
119900
120473
  taskDraftToUpdatePatch: () => taskDraftToUpdatePatch,
120474
+ taskDraftToChangedUpdatePatch: () => taskDraftToChangedUpdatePatch,
119901
120475
  tFallback: () => tFallback,
119902
120476
  syncPlaintextArtifactName: () => syncPlaintextArtifactName,
119903
120477
  syncEncryptedArtifactName: () => syncEncryptedArtifactName,
@@ -120022,6 +120596,9 @@ __export(exports_src, {
120022
120596
  resolveTextDirection: () => resolveTextDirection,
120023
120597
  resolveTaskViewSection: () => resolveTaskViewSection,
120024
120598
  resolveTaskTextDirection: () => resolveTaskTextDirection,
120599
+ resolveTaskSortByForFeatures: () => resolveTaskSortByForFeatures,
120600
+ resolveTaskPerspectiveForFeatures: () => resolveTaskPerspectiveForFeatures,
120601
+ resolveTaskGroupByForFeatures: () => resolveTaskGroupByForFeatures,
120025
120602
  resolveSyncFailureCooldownMs: () => resolveSyncFailureCooldownMs,
120026
120603
  resolveSyncBackend: () => resolveSyncBackend,
120027
120604
  resolveSettingsSearchI18nKey: () => resolveSettingsSearchI18nKey,
@@ -120381,6 +120958,7 @@ __export(exports_src, {
120381
120958
  getProjectsByArea: () => getProjectsByArea,
120382
120959
  getProjectedRecurringTaskId: () => getProjectedRecurringTaskId,
120383
120960
  getProjectedRecurringTaskCalendarDate: () => getProjectedRecurringTaskCalendarDate,
120961
+ getProjectSectionsForView: () => getProjectSectionsForView,
120384
120962
  getProjectReviewReminderIntent: () => getProjectReviewReminderIntent,
120385
120963
  getProjectNextActionState: () => getProjectNextActionState,
120386
120964
  getProjectNextActionPromptData: () => getProjectNextActionPromptData,
@@ -120412,6 +120990,7 @@ __export(exports_src, {
120412
120990
  getInMemorySyncChangeFingerprint: () => getInMemorySyncChangeFingerprint,
120413
120991
  getInMemoryAppDataSnapshot: () => getInMemoryAppDataSnapshot,
120414
120992
  getI18nKeyForEnglishText: () => getI18nKeyForEnglishText,
120993
+ getGlobalSearchFilterPresentation: () => getGlobalSearchFilterPresentation,
120415
120994
  getFrequentTaskTokensFromUsage: () => getFrequentTaskTokensFromUsage,
120416
120995
  getFrequentTaskTokens: () => getFrequentTaskTokens,
120417
120996
  getFocusStarBlockedText: () => getFocusStarBlockedText,
@@ -120463,6 +121042,7 @@ __export(exports_src, {
120463
121042
  formatSettingsSearchPath: () => formatSettingsSearchPath,
120464
121043
  formatRecurrenceLabel: () => formatRecurrenceLabel,
120465
121044
  formatRecurrenceCountLabel: () => formatRecurrenceCountLabel,
121045
+ formatQuickAddHelp: () => formatQuickAddHelp,
120466
121046
  formatPomodoroClock: () => formatPomodoroClock,
120467
121047
  formatOpenAIExtraBodyParams: () => formatOpenAIExtraBodyParams,
120468
121048
  formatLocalDateTime: () => formatLocalDateTime2,
@@ -120510,6 +121090,7 @@ __export(exports_src, {
120510
121090
  ensureDeviceId: () => ensureDeviceId,
120511
121091
  endOfCalendarMonth: () => endOfCalendarMonth,
120512
121092
  encryptSyncArtifact: () => encryptSyncArtifact,
121093
+ editRRuleString: () => editRRuleString,
120513
121094
  downloadDropboxFileVersionedWithServerTime: () => downloadDropboxFileVersionedWithServerTime,
120514
121095
  downloadDropboxFileVersioned: () => downloadDropboxFileVersioned,
120515
121096
  downloadDropboxFile: () => downloadDropboxFile,
@@ -120915,6 +121496,7 @@ __export(exports_src, {
120915
121496
  DEFAULT_AREA_COLOR: () => DEFAULT_AREA_COLOR,
120916
121497
  DEFAULT_ANTHROPIC_THINKING_BUDGET: () => DEFAULT_ANTHROPIC_THINKING_BUDGET,
120917
121498
  CloudHttpError: () => CloudHttpError,
121499
+ CaptureSessionCoordinator: () => CaptureSessionCoordinator,
120918
121500
  CUSTOM_TIME_ESTIMATE_PREFIX: () => CUSTOM_TIME_ESTIMATE_PREFIX,
120919
121501
  COPILOT_REASONING_EFFORT: () => COPILOT_REASONING_EFFORT,
120920
121502
  COMPLETION_DATE_GROUPS: () => COMPLETION_DATE_GROUPS,
@@ -137433,6 +138015,18 @@ var ensureCoreReady = async (options) => {
137433
138015
  const runWriteTransaction = coreReadonly ? runDirectly : (operation) => withMcpWriteLock(resolvedPath, operation);
137434
138016
  coreService = {
137435
138017
  ...createCorePersistenceService(core2, runWriteTransaction),
138018
+ getQuickAddSnapshot: async () => runWriteTransaction(async () => {
138019
+ const state = core2.useTaskStore.getState();
138020
+ await state.fetchData();
138021
+ const current = core2.useTaskStore.getState();
138022
+ return {
138023
+ tasks: current.tasks,
138024
+ projects: current.projects,
138025
+ areas: current.areas,
138026
+ people: current.people,
138027
+ settings: current.settings
138028
+ };
138029
+ }),
137436
138030
  addProject: async ({ title, color, props }) => runWriteTransaction(async () => {
137437
138031
  const state = core2.useTaskStore.getState();
137438
138032
  await state.fetchData();
@@ -137824,8 +138418,9 @@ var createService = (options, deps = defaultServiceDeps) => {
137824
138418
  const recurrence2 = normalizeOptionalTaskRecurrence(normalizedInput.recurrence);
137825
138419
  return await runCoreWriteWithRetries(options, deps, async (core2) => {
137826
138420
  if (normalizedInput.quickAdd) {
137827
- const projects = await withDb((db) => deps.listProjects(db));
137828
- const quick = deps.parseQuickAdd(normalizedInput.quickAdd, projects);
138421
+ const snapshot = await core2.getQuickAddSnapshot();
138422
+ const { projects, areas, tasks, people: people2, settings } = snapshot;
138423
+ const quick = deps.parseQuickAdd(normalizedInput.quickAdd, projects, undefined, areas, buildQuickAddParseOptions(settings, { tasks, people: people2 }));
137829
138424
  let createdTask;
137830
138425
  const capture2 = await executeCaptureTransaction({
137831
138426
  parsed: {