@batalabs/virlow-mcp-core 3.101.0 → 3.102.1

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.
@@ -0,0 +1,263 @@
1
+ /**
2
+ * To-do: the stored format, shared with the iOS app.
3
+ *
4
+ * A task is a note of type `todo`: its text is the encrypted title, its
5
+ * details are the JSON below as the encrypted content, and the note's
6
+ * `archived` flag means done. A list is a note of type `todolist`: its name
7
+ * is the encrypted title and `{v, color, emoji}` the encrypted content. The
8
+ * API lists neither with notes, so apps that predate them never show them.
9
+ *
10
+ * Missing keys read as their defaults (the first iOS build stored tasks with
11
+ * empty content), and keys this version does not know are kept on write, so
12
+ * a newer app's additions survive an older app's edit.
13
+ */
14
+ export const TODO_NOTE_TYPE = 'todo';
15
+ export const TODO_LIST_NOTE_TYPE = 'todolist';
16
+ export const REPEATS = ['daily', 'weekdays', 'weekly', 'monthly', 'yearly'];
17
+ export const DEFAULT_LIST_COLOR = '#5c7fb5';
18
+ const DAY = /^\d{4}-\d{2}-\d{2}$/;
19
+ function str(value) {
20
+ return typeof value === 'string' && value.length > 0 ? value : null;
21
+ }
22
+ function day(value) {
23
+ return typeof value === 'string' && DAY.test(value) ? value : null;
24
+ }
25
+ function parseObject(raw) {
26
+ if (!raw || !raw.trim())
27
+ return {};
28
+ try {
29
+ const parsed = JSON.parse(raw);
30
+ return parsed && typeof parsed === 'object' && !Array.isArray(parsed)
31
+ ? parsed
32
+ : {};
33
+ }
34
+ catch {
35
+ return {};
36
+ }
37
+ }
38
+ export function parseDetails(raw) {
39
+ const o = parseObject(raw);
40
+ const steps = Array.isArray(o.steps)
41
+ ? o.steps.flatMap((s) => {
42
+ if (!s || typeof s !== 'object')
43
+ return [];
44
+ const step = s;
45
+ if (typeof step.text !== 'string')
46
+ return [];
47
+ return [
48
+ {
49
+ id: typeof step.id === 'string' && step.id ? step.id : newId(),
50
+ text: step.text,
51
+ done: step.done === true,
52
+ },
53
+ ];
54
+ })
55
+ : [];
56
+ return {
57
+ ...o,
58
+ v: 1,
59
+ list: str(o.list),
60
+ important: o.important === true,
61
+ myDay: day(o.myDay),
62
+ due: day(o.due),
63
+ remindAt: str(o.remindAt),
64
+ repeat: REPEATS.includes(o.repeat) ? o.repeat : null,
65
+ steps,
66
+ note: typeof o.note === 'string' ? o.note : '',
67
+ completedAt: str(o.completedAt),
68
+ };
69
+ }
70
+ export function serializeDetails(details) {
71
+ return JSON.stringify({ ...details, v: 1 });
72
+ }
73
+ export function parseListMeta(raw) {
74
+ const o = parseObject(raw);
75
+ return {
76
+ ...o,
77
+ v: 1,
78
+ color: typeof o.color === 'string' && /^#[0-9a-f]{6}$/i.test(o.color) ? o.color : DEFAULT_LIST_COLOR,
79
+ emoji: str(o.emoji),
80
+ };
81
+ }
82
+ export function serializeListMeta(meta) {
83
+ return JSON.stringify({ ...meta, v: 1 });
84
+ }
85
+ export function newId() {
86
+ return typeof crypto !== 'undefined' && 'randomUUID' in crypto
87
+ ? crypto.randomUUID()
88
+ : `${Date.now().toString(36)}${Math.random().toString(36).slice(2, 10)}`;
89
+ }
90
+ // MARK: Days
91
+ /** A local day as YYYY-MM-DD. */
92
+ export function dayKey(date) {
93
+ const y = date.getFullYear();
94
+ const m = String(date.getMonth() + 1).padStart(2, '0');
95
+ const d = String(date.getDate()).padStart(2, '0');
96
+ return `${y}-${m}-${d}`;
97
+ }
98
+ /** Local midnight of a YYYY-MM-DD day. */
99
+ export function fromDayKey(key) {
100
+ const [y = 1970, m = 1, d = 1] = key.split('-').map(Number);
101
+ return new Date(y, m - 1, d);
102
+ }
103
+ export function addDays(key, days) {
104
+ const date = fromDayKey(key);
105
+ date.setDate(date.getDate() + days);
106
+ return dayKey(date);
107
+ }
108
+ /** Whole days from a to b (b later is positive), by local calendar. */
109
+ export function daysBetween(a, b) {
110
+ return Math.round((fromDayKey(b).getTime() - fromDayKey(a).getTime()) / 86_400_000);
111
+ }
112
+ /**
113
+ * The next day a repeating task is due, after `from`. Month and year steps
114
+ * keep the day of the month where it exists and use the month's last day
115
+ * where it does not (Jan 31 → Feb 28).
116
+ */
117
+ export function nextOccurrence(repeat, from) {
118
+ const date = fromDayKey(from);
119
+ switch (repeat) {
120
+ case 'daily':
121
+ return addDays(from, 1);
122
+ case 'weekdays': {
123
+ let next = addDays(from, 1);
124
+ while ([0, 6].includes(fromDayKey(next).getDay()))
125
+ next = addDays(next, 1);
126
+ return next;
127
+ }
128
+ case 'weekly':
129
+ return addDays(from, 7);
130
+ case 'monthly':
131
+ case 'yearly': {
132
+ const months = repeat === 'monthly' ? 1 : 12;
133
+ const target = new Date(date.getFullYear(), date.getMonth() + months, 1);
134
+ const last = new Date(target.getFullYear(), target.getMonth() + 1, 0).getDate();
135
+ target.setDate(Math.min(date.getDate(), last));
136
+ return dayKey(target);
137
+ }
138
+ }
139
+ }
140
+ export const SMART_LISTS = [
141
+ { id: 'myday', label: 'My Day' },
142
+ { id: 'important', label: 'Important' },
143
+ { id: 'planned', label: 'Planned' },
144
+ { id: 'tasks', label: 'Tasks' },
145
+ ];
146
+ export function listKey(listId) {
147
+ return `list:${listId}`;
148
+ }
149
+ export function listIdOf(key) {
150
+ return key.startsWith('list:') ? key.slice(5) : null;
151
+ }
152
+ export function inList(task, key, today) {
153
+ const d = task.details;
154
+ switch (key) {
155
+ case 'myday':
156
+ return d.myDay === today;
157
+ case 'important':
158
+ return d.important;
159
+ case 'planned':
160
+ return d.due !== null;
161
+ case 'tasks':
162
+ return d.list === null;
163
+ default:
164
+ return d.list === listIdOf(key);
165
+ }
166
+ }
167
+ /** Open tasks oldest first, the order they were written in. */
168
+ export function openTasks(tasks, key, today) {
169
+ return tasks
170
+ .filter((t) => !t.done && inList(t, key, today))
171
+ .sort((a, b) => a.createdAt.localeCompare(b.createdAt));
172
+ }
173
+ /** Done tasks, most recently finished first. */
174
+ export function completedTasks(tasks, key, today) {
175
+ return tasks
176
+ .filter((t) => t.done && inList(t, key, today))
177
+ .sort((a, b) => (b.details.completedAt ?? b.updatedAt).localeCompare(a.details.completedAt ?? a.updatedAt));
178
+ }
179
+ /** Planned's open tasks in groups, each by due day then age. Empty groups are left out. */
180
+ export function plannedGroups(tasks, today) {
181
+ const open = openTasks(tasks, 'planned', today).sort((a, b) => a.details.due.localeCompare(b.details.due) || a.createdAt.localeCompare(b.createdAt));
182
+ const tomorrow = addDays(today, 1);
183
+ const groupOf = (due) => due < today ? 'Overdue' : due === today ? 'Today' : due === tomorrow ? 'Tomorrow' : 'Later';
184
+ const order = ['Overdue', 'Today', 'Tomorrow', 'Later'];
185
+ return order
186
+ .map((group) => ({ group, tasks: open.filter((t) => groupOf(t.details.due) === group) }))
187
+ .filter((g) => g.tasks.length > 0);
188
+ }
189
+ /** What a task added to this list starts with. */
190
+ export function detailsForNewTask(key, today) {
191
+ const details = parseDetails('');
192
+ if (key === 'myday')
193
+ details.myDay = today;
194
+ else if (key === 'important')
195
+ details.important = true;
196
+ else if (key === 'planned')
197
+ details.due = today;
198
+ else {
199
+ const id = listIdOf(key);
200
+ if (id)
201
+ details.list = id;
202
+ }
203
+ return details;
204
+ }
205
+ /**
206
+ * The task that follows a repeating one when it is done: the same text, list,
207
+ * importance, repeat, note and steps (all open again), due on the next
208
+ * occurrence after its due day, or after today when it had none. A reminder
209
+ * moves by the same number of days.
210
+ */
211
+ export function nextRepeat(task, today) {
212
+ const d = task.details;
213
+ if (!d.repeat)
214
+ return null;
215
+ const base = d.due ?? today;
216
+ const due = nextOccurrence(d.repeat, base);
217
+ const shift = daysBetween(base, due);
218
+ let remindAt = null;
219
+ if (d.remindAt) {
220
+ const at = new Date(d.remindAt);
221
+ if (!Number.isNaN(at.getTime())) {
222
+ at.setDate(at.getDate() + shift);
223
+ remindAt = at.toISOString();
224
+ }
225
+ }
226
+ return {
227
+ ...d,
228
+ due,
229
+ remindAt,
230
+ myDay: null,
231
+ completedAt: null,
232
+ steps: d.steps.map((s) => ({ ...s, id: newId(), done: false })),
233
+ };
234
+ }
235
+ const REPEAT_LABELS = {
236
+ daily: 'Daily',
237
+ weekdays: 'Weekdays',
238
+ weekly: 'Weekly',
239
+ monthly: 'Monthly',
240
+ yearly: 'Yearly',
241
+ };
242
+ export function repeatLabel(repeat) {
243
+ return REPEAT_LABELS[repeat];
244
+ }
245
+ /** "Today", "Tomorrow", "Yesterday", "Mon, Oct 20", or with the year when not this year. */
246
+ export function dueLabel(due, today) {
247
+ const diff = daysBetween(today, due);
248
+ if (diff === 0)
249
+ return 'Today';
250
+ if (diff === 1)
251
+ return 'Tomorrow';
252
+ if (diff === -1)
253
+ return 'Yesterday';
254
+ const date = fromDayKey(due);
255
+ const sameYear = date.getFullYear() === fromDayKey(today).getFullYear();
256
+ return date.toLocaleDateString('en-US', {
257
+ weekday: 'short',
258
+ month: 'short',
259
+ day: 'numeric',
260
+ ...(sameYear ? {} : { year: 'numeric' }),
261
+ });
262
+ }
263
+ //# sourceMappingURL=todo-format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"todo-format.js","sourceRoot":"","sources":["../src/todo-format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ import type { VirlowApi } from './api.js';
2
+ import { type Repeat, type Task, type TodoList } from './todo-format.js';
3
+ import type { Vault } from './vault.js';
4
+ export interface ListTodosArgs {
5
+ list?: string;
6
+ include_completed?: boolean;
7
+ query?: string;
8
+ }
9
+ export interface AddTodoArgs {
10
+ text: string;
11
+ list?: string;
12
+ due?: string;
13
+ my_day?: boolean;
14
+ important?: boolean;
15
+ note?: string;
16
+ steps?: string[];
17
+ repeat?: Repeat;
18
+ remind_at?: string;
19
+ }
20
+ export interface UpdateTodoArgs {
21
+ id: string;
22
+ text?: string;
23
+ done?: boolean;
24
+ due?: string | null;
25
+ my_day?: boolean;
26
+ important?: boolean;
27
+ note?: string;
28
+ add_steps?: string[];
29
+ complete_steps?: string[];
30
+ list?: string | null;
31
+ repeat?: Repeat | null;
32
+ remind_at?: string | null;
33
+ }
34
+ export interface CreateTodoListArgs {
35
+ name: string;
36
+ emoji?: string;
37
+ color?: string;
38
+ }
39
+ interface Loaded {
40
+ tasks: Task[];
41
+ lists: TodoList[];
42
+ }
43
+ export declare class TodoService {
44
+ private readonly api;
45
+ private readonly vault;
46
+ /** The clock, for "today" and reminder checks. Tests pass a fixed one. */
47
+ private readonly now;
48
+ constructor(api: VirlowApi, vault: Vault,
49
+ /** The clock, for "today" and reminder checks. Tests pass a fixed one. */
50
+ now?: () => Date);
51
+ private today;
52
+ /** The key, or the vault's own "ask the user to unlock" error. */
53
+ private key;
54
+ private fetchAll;
55
+ private decrypt;
56
+ load(): Promise<Loaded>;
57
+ /** A list by id or name (case-insensitive). Never guesses between two
58
+ * lists with one name, and never makes one up. */
59
+ private resolveList;
60
+ private scopeOf;
61
+ private listName;
62
+ private describe;
63
+ listTodos(args: ListTodosArgs): Promise<string>;
64
+ private scopeName;
65
+ listLists(): Promise<string>;
66
+ private validDay;
67
+ private validRemind;
68
+ private encrypted;
69
+ private createTask;
70
+ private channels;
71
+ /** Cancels the task's pending reminders. */
72
+ private clearReminders;
73
+ /** No label: the email only says there is a reminder, since the text is encrypted. */
74
+ private createReminder;
75
+ addTodo(args: AddTodoArgs): Promise<string>;
76
+ updateTodo(args: UpdateTodoArgs): Promise<string>;
77
+ createList(args: CreateTodoListArgs): Promise<string>;
78
+ }
79
+ export {};
80
+ //# sourceMappingURL=todos.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"todos.d.ts","sourceRoot":"","sources":["../src/todos.ts"],"names":[],"mappings":"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"}