@todu/engine 0.1.0
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.
- package/dist/change-observer.d.ts +15 -0
- package/dist/change-observer.d.ts.map +1 -0
- package/dist/change-observer.js +64 -0
- package/dist/change-observer.js.map +1 -0
- package/dist/habits.d.ts +6 -0
- package/dist/habits.d.ts.map +1 -0
- package/dist/habits.js +397 -0
- package/dist/habits.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +104 -0
- package/dist/index.js.map +1 -0
- package/dist/labels.d.ts +5 -0
- package/dist/labels.d.ts.map +1 -0
- package/dist/labels.js +113 -0
- package/dist/labels.js.map +1 -0
- package/dist/notes.d.ts +5 -0
- package/dist/notes.d.ts.map +1 -0
- package/dist/notes.js +163 -0
- package/dist/notes.js.map +1 -0
- package/dist/projects.d.ts +5 -0
- package/dist/projects.d.ts.map +1 -0
- package/dist/projects.js +117 -0
- package/dist/projects.js.map +1 -0
- package/dist/recurring.d.ts +23 -0
- package/dist/recurring.d.ts.map +1 -0
- package/dist/recurring.js +372 -0
- package/dist/recurring.js.map +1 -0
- package/dist/schedule.d.ts +38 -0
- package/dist/schedule.d.ts.map +1 -0
- package/dist/schedule.js +330 -0
- package/dist/schedule.js.map +1 -0
- package/dist/scheduling.d.ts +62 -0
- package/dist/scheduling.d.ts.map +1 -0
- package/dist/scheduling.js +58 -0
- package/dist/scheduling.js.map +1 -0
- package/dist/storage.d.ts +34 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +204 -0
- package/dist/storage.js.map +1 -0
- package/dist/sync-client.d.ts +16 -0
- package/dist/sync-client.d.ts.map +1 -0
- package/dist/sync-client.js +54 -0
- package/dist/sync-client.js.map +1 -0
- package/dist/sync-server.d.ts +12 -0
- package/dist/sync-server.d.ts.map +1 -0
- package/dist/sync-server.js +21 -0
- package/dist/sync-server.js.map +1 -0
- package/dist/tasks.d.ts +18 -0
- package/dist/tasks.d.ts.map +1 -0
- package/dist/tasks.js +396 -0
- package/dist/tasks.js.map +1 -0
- package/dist/todu.d.ts +115 -0
- package/dist/todu.d.ts.map +1 -0
- package/dist/todu.js +76 -0
- package/dist/todu.js.map +1 -0
- package/package.json +52 -0
package/dist/tasks.js
ADDED
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
import crypto from "node:crypto";
|
|
2
|
+
import { createTaskDetailDocument, createTaskId, createTaskListDocument, err, notFound, ok, validateCreateTaskInput, validateUpdateTaskInput, validationError, } from "@todu/core";
|
|
3
|
+
export function createTaskNamespace(catalog, repo) {
|
|
4
|
+
/**
|
|
5
|
+
* Get or create the TaskListDocument for a project.
|
|
6
|
+
* Stores the document ID in catalog.taskListDocIds.
|
|
7
|
+
*/
|
|
8
|
+
async function getOrCreateTaskListDoc(projectId) {
|
|
9
|
+
const catalogDoc = catalog.doc();
|
|
10
|
+
const existingDocId = catalogDoc?.taskListDocIds[projectId];
|
|
11
|
+
if (existingDocId) {
|
|
12
|
+
return await repo.find(existingDocId);
|
|
13
|
+
}
|
|
14
|
+
// Create new task list document
|
|
15
|
+
const handle = repo.create();
|
|
16
|
+
const template = createTaskListDocument(projectId);
|
|
17
|
+
handle.change((doc) => {
|
|
18
|
+
doc.projectId = template.projectId;
|
|
19
|
+
doc.tasks = template.tasks;
|
|
20
|
+
doc.detailDocIds = template.detailDocIds;
|
|
21
|
+
});
|
|
22
|
+
// Register in catalog
|
|
23
|
+
catalog.change((doc) => {
|
|
24
|
+
doc.taskListDocIds[projectId] = handle.documentId;
|
|
25
|
+
});
|
|
26
|
+
return handle;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Find a task across all task list documents.
|
|
30
|
+
* Returns the task, its index, and the task list handle.
|
|
31
|
+
*/
|
|
32
|
+
async function findTask(id) {
|
|
33
|
+
const catalogDoc = catalog.doc();
|
|
34
|
+
if (!catalogDoc)
|
|
35
|
+
return { found: false };
|
|
36
|
+
for (const docId of Object.values(catalogDoc.taskListDocIds)) {
|
|
37
|
+
const handle = await repo.find(docId);
|
|
38
|
+
const doc = handle.doc();
|
|
39
|
+
if (!doc)
|
|
40
|
+
continue;
|
|
41
|
+
const index = doc.tasks.findIndex((t) => t.id === id);
|
|
42
|
+
if (index !== -1) {
|
|
43
|
+
return { found: true, task: cloneTask(doc.tasks[index]), index, listHandle: handle };
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return { found: false };
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
async create(input, overrideTaskId, templateId) {
|
|
50
|
+
const validationErr = validateCreateTaskInput(input);
|
|
51
|
+
if (validationErr)
|
|
52
|
+
return err(validationErr);
|
|
53
|
+
// Verify project exists
|
|
54
|
+
const catalogDoc = catalog.doc();
|
|
55
|
+
if (!catalogDoc)
|
|
56
|
+
return err(notFound("project", input.projectId));
|
|
57
|
+
const project = catalogDoc.projects.find((p) => p.id === input.projectId);
|
|
58
|
+
if (!project)
|
|
59
|
+
return err(notFound("project", input.projectId));
|
|
60
|
+
const now = new Date().toISOString();
|
|
61
|
+
const id = overrideTaskId ?? createTaskId(`task-${crypto.randomUUID().slice(0, 8)}`);
|
|
62
|
+
const task = {
|
|
63
|
+
id,
|
|
64
|
+
title: input.title.trim(),
|
|
65
|
+
status: "active",
|
|
66
|
+
priority: input.priority ?? "medium",
|
|
67
|
+
projectId: input.projectId,
|
|
68
|
+
labels: input.labels ?? [],
|
|
69
|
+
createdAt: now,
|
|
70
|
+
updatedAt: now,
|
|
71
|
+
};
|
|
72
|
+
// Automerge doesn't allow undefined — only set optional fields if present
|
|
73
|
+
if (input.dueDate !== undefined)
|
|
74
|
+
task.dueDate = input.dueDate;
|
|
75
|
+
if (input.scheduledDate !== undefined)
|
|
76
|
+
task.scheduledDate = input.scheduledDate;
|
|
77
|
+
if (templateId !== undefined)
|
|
78
|
+
task.templateId = templateId;
|
|
79
|
+
// Add to task list document
|
|
80
|
+
const listHandle = await getOrCreateTaskListDoc(input.projectId);
|
|
81
|
+
listHandle.change((doc) => {
|
|
82
|
+
doc.tasks.push(task);
|
|
83
|
+
});
|
|
84
|
+
// Create detail document if description provided
|
|
85
|
+
const description = input.description?.trim();
|
|
86
|
+
if (description) {
|
|
87
|
+
const detailHandle = repo.create();
|
|
88
|
+
const template = createTaskDetailDocument(id, description);
|
|
89
|
+
detailHandle.change((doc) => {
|
|
90
|
+
doc.taskId = template.taskId;
|
|
91
|
+
doc.description = template.description;
|
|
92
|
+
});
|
|
93
|
+
listHandle.change((doc) => {
|
|
94
|
+
doc.detailDocIds[id] = detailHandle.documentId;
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
return ok({ ...task, description });
|
|
98
|
+
},
|
|
99
|
+
async list(filter, sort) {
|
|
100
|
+
const catalogDoc = catalog.doc();
|
|
101
|
+
if (!catalogDoc)
|
|
102
|
+
return ok([]);
|
|
103
|
+
const allTasks = [];
|
|
104
|
+
// If filtering by project, only load that project's task list
|
|
105
|
+
const docIds = filter?.projectId
|
|
106
|
+
? [catalogDoc.taskListDocIds[filter.projectId]].filter(Boolean)
|
|
107
|
+
: Object.values(catalogDoc.taskListDocIds);
|
|
108
|
+
for (const docId of docIds) {
|
|
109
|
+
const handle = await repo.find(docId);
|
|
110
|
+
const doc = handle.doc();
|
|
111
|
+
if (!doc)
|
|
112
|
+
continue;
|
|
113
|
+
for (const task of doc.tasks) {
|
|
114
|
+
allTasks.push(cloneTask(task));
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// Apply filters
|
|
118
|
+
let filtered = allTasks;
|
|
119
|
+
if (filter?.status) {
|
|
120
|
+
const statuses = Array.isArray(filter.status) ? filter.status : [filter.status];
|
|
121
|
+
filtered = filtered.filter((t) => statuses.includes(t.status));
|
|
122
|
+
}
|
|
123
|
+
if (filter?.priority) {
|
|
124
|
+
filtered = filtered.filter((t) => t.priority === filter.priority);
|
|
125
|
+
}
|
|
126
|
+
if (filter?.label) {
|
|
127
|
+
filtered = filtered.filter((t) => t.labels.includes(filter.label));
|
|
128
|
+
}
|
|
129
|
+
if (filter?.dueBefore) {
|
|
130
|
+
filtered = filtered.filter((t) => t.dueDate !== undefined && t.dueDate <= filter.dueBefore);
|
|
131
|
+
}
|
|
132
|
+
if (filter?.dueAfter) {
|
|
133
|
+
filtered = filtered.filter((t) => t.dueDate !== undefined && t.dueDate >= filter.dueAfter);
|
|
134
|
+
}
|
|
135
|
+
if (filter?.overdue) {
|
|
136
|
+
const today = new Date().toISOString().slice(0, 10);
|
|
137
|
+
filtered = filtered.filter((t) => t.dueDate !== undefined &&
|
|
138
|
+
t.dueDate < today &&
|
|
139
|
+
t.status !== "done" &&
|
|
140
|
+
t.status !== "canceled");
|
|
141
|
+
}
|
|
142
|
+
if (filter?.today) {
|
|
143
|
+
const today = new Date().toISOString().slice(0, 10);
|
|
144
|
+
filtered = filtered.filter((t) => t.dueDate?.startsWith(today) || t.scheduledDate?.startsWith(today));
|
|
145
|
+
}
|
|
146
|
+
// Sort
|
|
147
|
+
const priorityOrder = { high: 3, medium: 2, low: 1 };
|
|
148
|
+
if (sort) {
|
|
149
|
+
const dir = sort.direction === "asc" ? 1 : -1;
|
|
150
|
+
filtered.sort((a, b) => {
|
|
151
|
+
const av = getSortValue(a, sort.field, priorityOrder);
|
|
152
|
+
const bv = getSortValue(b, sort.field, priorityOrder);
|
|
153
|
+
// Sentinel values (\uffff) always sort last regardless of direction
|
|
154
|
+
const aSentinel = av === "\uffff";
|
|
155
|
+
const bSentinel = bv === "\uffff";
|
|
156
|
+
if (aSentinel && !bSentinel)
|
|
157
|
+
return 1;
|
|
158
|
+
if (!aSentinel && bSentinel)
|
|
159
|
+
return -1;
|
|
160
|
+
if (av < bv)
|
|
161
|
+
return -1 * dir;
|
|
162
|
+
if (av > bv)
|
|
163
|
+
return 1 * dir;
|
|
164
|
+
return 0;
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
// Default sort: priority desc, then createdAt desc
|
|
169
|
+
filtered.sort((a, b) => {
|
|
170
|
+
const pd = priorityOrder[b.priority] - priorityOrder[a.priority];
|
|
171
|
+
if (pd !== 0)
|
|
172
|
+
return pd;
|
|
173
|
+
return b.createdAt.localeCompare(a.createdAt);
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
return ok(filtered);
|
|
177
|
+
},
|
|
178
|
+
async get(id) {
|
|
179
|
+
const result = await findTask(id);
|
|
180
|
+
if (!result.found)
|
|
181
|
+
return err(notFound("task", id));
|
|
182
|
+
// Load detail document on demand
|
|
183
|
+
const listDoc = result.listHandle.doc();
|
|
184
|
+
const detailDocId = listDoc?.detailDocIds[id];
|
|
185
|
+
let description;
|
|
186
|
+
if (detailDocId) {
|
|
187
|
+
const detailHandle = await repo.find(detailDocId);
|
|
188
|
+
const detailDoc = detailHandle.doc();
|
|
189
|
+
if (detailDoc) {
|
|
190
|
+
description = detailDoc.description;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
return ok({ ...result.task, description });
|
|
194
|
+
},
|
|
195
|
+
async update(id, input) {
|
|
196
|
+
const result = await findTask(id);
|
|
197
|
+
if (!result.found)
|
|
198
|
+
return err(notFound("task", id));
|
|
199
|
+
const validationErr = validateUpdateTaskInput(input, result.task.status);
|
|
200
|
+
if (validationErr)
|
|
201
|
+
return err(validationErr);
|
|
202
|
+
const now = new Date().toISOString();
|
|
203
|
+
// Update metadata in task list document
|
|
204
|
+
result.listHandle.change((doc) => {
|
|
205
|
+
const task = doc.tasks[result.index];
|
|
206
|
+
if (input.title !== undefined)
|
|
207
|
+
task.title = input.title.trim();
|
|
208
|
+
if (input.status !== undefined)
|
|
209
|
+
task.status = input.status;
|
|
210
|
+
if (input.priority !== undefined)
|
|
211
|
+
task.priority = input.priority;
|
|
212
|
+
if (input.labels !== undefined) {
|
|
213
|
+
// Replace labels array entirely
|
|
214
|
+
task.labels.splice(0, task.labels.length, ...input.labels);
|
|
215
|
+
}
|
|
216
|
+
if (input.dueDate !== undefined)
|
|
217
|
+
task.dueDate = input.dueDate;
|
|
218
|
+
if (input.scheduledDate !== undefined)
|
|
219
|
+
task.scheduledDate = input.scheduledDate;
|
|
220
|
+
task.updatedAt = now;
|
|
221
|
+
});
|
|
222
|
+
// Update description in detail document if changed
|
|
223
|
+
let description;
|
|
224
|
+
if (input.description !== undefined) {
|
|
225
|
+
const listDoc = result.listHandle.doc();
|
|
226
|
+
const detailDocId = listDoc?.detailDocIds[id];
|
|
227
|
+
if (detailDocId) {
|
|
228
|
+
// Update existing detail doc
|
|
229
|
+
const detailHandle = await repo.find(detailDocId);
|
|
230
|
+
detailHandle.change((doc) => {
|
|
231
|
+
doc.description = input.description.trim();
|
|
232
|
+
});
|
|
233
|
+
description = input.description.trim();
|
|
234
|
+
}
|
|
235
|
+
else if (input.description.trim()) {
|
|
236
|
+
// Create new detail doc
|
|
237
|
+
const detailHandle = repo.create();
|
|
238
|
+
const template = createTaskDetailDocument(id, input.description.trim());
|
|
239
|
+
detailHandle.change((doc) => {
|
|
240
|
+
doc.taskId = template.taskId;
|
|
241
|
+
doc.description = template.description;
|
|
242
|
+
});
|
|
243
|
+
result.listHandle.change((doc) => {
|
|
244
|
+
doc.detailDocIds[id] = detailHandle.documentId;
|
|
245
|
+
});
|
|
246
|
+
description = input.description.trim();
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
// Load existing description
|
|
251
|
+
const listDoc = result.listHandle.doc();
|
|
252
|
+
const detailDocId = listDoc?.detailDocIds[id];
|
|
253
|
+
if (detailDocId) {
|
|
254
|
+
const detailHandle = await repo.find(detailDocId);
|
|
255
|
+
description = detailHandle.doc()?.description;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
// Read back updated task
|
|
259
|
+
const updated = result.listHandle.doc().tasks[result.index];
|
|
260
|
+
return ok({ ...cloneTask(updated), description });
|
|
261
|
+
},
|
|
262
|
+
async delete(id) {
|
|
263
|
+
const result = await findTask(id);
|
|
264
|
+
if (!result.found)
|
|
265
|
+
return err(notFound("task", id));
|
|
266
|
+
// If this task was generated from a recurring template,
|
|
267
|
+
// add its scheduled date to the template's skip list
|
|
268
|
+
// so it won't be regenerated by other devices
|
|
269
|
+
const task = result.task;
|
|
270
|
+
if (task.templateId && task.scheduledDate) {
|
|
271
|
+
const { addToSkipList } = await import("./recurring.js");
|
|
272
|
+
addToSkipList(catalog, task.templateId, task.scheduledDate);
|
|
273
|
+
}
|
|
274
|
+
// Remove from task list
|
|
275
|
+
result.listHandle.change((doc) => {
|
|
276
|
+
doc.tasks.splice(result.index, 1);
|
|
277
|
+
delete doc.detailDocIds[id];
|
|
278
|
+
});
|
|
279
|
+
// Detail and comments docs are orphaned — they'll be cleaned up
|
|
280
|
+
// by a future garbage collection pass. Automerge docs without
|
|
281
|
+
// references are harmless.
|
|
282
|
+
return ok(undefined);
|
|
283
|
+
},
|
|
284
|
+
async move(id, targetProjectId) {
|
|
285
|
+
// Verify target project exists
|
|
286
|
+
const catalogDoc = catalog.doc();
|
|
287
|
+
if (!catalogDoc)
|
|
288
|
+
return err(notFound("project", targetProjectId));
|
|
289
|
+
const targetProject = catalogDoc.projects.find((p) => p.id === targetProjectId);
|
|
290
|
+
if (!targetProject)
|
|
291
|
+
return err(notFound("project", targetProjectId));
|
|
292
|
+
// Find the task
|
|
293
|
+
const result = await findTask(id);
|
|
294
|
+
if (!result.found)
|
|
295
|
+
return err(notFound("task", id));
|
|
296
|
+
if (result.task.projectId === targetProjectId) {
|
|
297
|
+
return err(validationError("projectId", "Task is already in that project"));
|
|
298
|
+
}
|
|
299
|
+
const now = new Date().toISOString();
|
|
300
|
+
const taskData = { ...result.task };
|
|
301
|
+
// Capture detail doc ID before removing from source
|
|
302
|
+
const sourceListDoc = result.listHandle.doc();
|
|
303
|
+
const detailDocId = sourceListDoc?.detailDocIds[id];
|
|
304
|
+
// Remove from source task list
|
|
305
|
+
result.listHandle.change((doc) => {
|
|
306
|
+
doc.tasks.splice(result.index, 1);
|
|
307
|
+
delete doc.detailDocIds[id];
|
|
308
|
+
});
|
|
309
|
+
// Add to target task list
|
|
310
|
+
const targetListHandle = await getOrCreateTaskListDoc(targetProjectId);
|
|
311
|
+
taskData.projectId = targetProjectId;
|
|
312
|
+
taskData.updatedAt = now;
|
|
313
|
+
// Strip undefined fields — Automerge doesn't allow them
|
|
314
|
+
const cleanTask = stripUndefined(taskData);
|
|
315
|
+
targetListHandle.change((doc) => {
|
|
316
|
+
doc.tasks.push(cleanTask);
|
|
317
|
+
if (detailDocId) {
|
|
318
|
+
doc.detailDocIds[id] = detailDocId;
|
|
319
|
+
}
|
|
320
|
+
});
|
|
321
|
+
// Load description for return value
|
|
322
|
+
let description;
|
|
323
|
+
if (detailDocId) {
|
|
324
|
+
const detailHandle = await repo.find(detailDocId);
|
|
325
|
+
description = detailHandle.doc()?.description;
|
|
326
|
+
}
|
|
327
|
+
return ok({ ...taskData, description });
|
|
328
|
+
},
|
|
329
|
+
async search(query) {
|
|
330
|
+
const catalogDoc = catalog.doc();
|
|
331
|
+
if (!catalogDoc)
|
|
332
|
+
return ok([]);
|
|
333
|
+
const lowerQuery = query.toLowerCase();
|
|
334
|
+
const matches = [];
|
|
335
|
+
for (const docId of Object.values(catalogDoc.taskListDocIds)) {
|
|
336
|
+
const handle = await repo.find(docId);
|
|
337
|
+
const doc = handle.doc();
|
|
338
|
+
if (!doc)
|
|
339
|
+
continue;
|
|
340
|
+
for (const task of doc.tasks) {
|
|
341
|
+
if (task.title.toLowerCase().includes(lowerQuery)) {
|
|
342
|
+
matches.push(cloneTask(task));
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
return ok(matches);
|
|
347
|
+
},
|
|
348
|
+
_repo: repo,
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
/** Clone a task out of the Automerge proxy */
|
|
352
|
+
function cloneTask(t) {
|
|
353
|
+
return {
|
|
354
|
+
id: t.id,
|
|
355
|
+
title: t.title,
|
|
356
|
+
status: t.status,
|
|
357
|
+
priority: t.priority,
|
|
358
|
+
projectId: t.projectId,
|
|
359
|
+
labels: [...t.labels],
|
|
360
|
+
dueDate: t.dueDate,
|
|
361
|
+
scheduledDate: t.scheduledDate,
|
|
362
|
+
externalId: t.externalId,
|
|
363
|
+
sourceUrl: t.sourceUrl,
|
|
364
|
+
templateId: t.templateId,
|
|
365
|
+
createdAt: t.createdAt,
|
|
366
|
+
updatedAt: t.updatedAt,
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
/** Get a comparable value for sorting */
|
|
370
|
+
function getSortValue(task, field, priorityOrder) {
|
|
371
|
+
switch (field) {
|
|
372
|
+
case "priority":
|
|
373
|
+
return priorityOrder[task.priority] ?? 0;
|
|
374
|
+
case "dueDate":
|
|
375
|
+
return task.dueDate ?? "\uffff"; // missing dates sort last
|
|
376
|
+
case "createdAt":
|
|
377
|
+
return task.createdAt;
|
|
378
|
+
case "updatedAt":
|
|
379
|
+
return task.updatedAt;
|
|
380
|
+
case "title":
|
|
381
|
+
return task.title.toLowerCase();
|
|
382
|
+
default:
|
|
383
|
+
return task.createdAt;
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
/** Remove undefined values from an object — Automerge doesn't allow them */
|
|
387
|
+
function stripUndefined(obj) {
|
|
388
|
+
const result = {};
|
|
389
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
390
|
+
if (value !== undefined) {
|
|
391
|
+
result[key] = value;
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
return result;
|
|
395
|
+
}
|
|
396
|
+
//# sourceMappingURL=tasks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["../src/tasks.ts"],"names":[],"mappings":"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"}
|
package/dist/todu.d.ts
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import type { CreateHabitInput, CreateLabelInput, CreateNoteInput, CreateProjectInput, CreateRecurringInput, CreateTaskInput, Habit, HabitEntry, HabitFilter, HabitHistoryEntry, HabitId, HabitStreak, Label, LabelId, Note, NoteFilter, NoteId, Project, ProjectFilter, ProjectId, RecurringFilter, RecurringId, RecurringTemplate, Result, Task, TaskFilter, TaskId, TaskSortOptions, TaskWithDetail, UpdateHabitInput, UpdateLabelInput, UpdateNoteInput, UpdateProjectInput, UpdateRecurringInput, UpdateTaskInput } from "@todu/core";
|
|
2
|
+
import type { UpcomingOccurrence } from "./recurring.js";
|
|
3
|
+
export interface ToduConfig {
|
|
4
|
+
/** Path to data storage directory */
|
|
5
|
+
storagePath: string;
|
|
6
|
+
/** Start a local WebSocket sync server (used by Electron) */
|
|
7
|
+
syncServer?: boolean;
|
|
8
|
+
/** Port for sync server/client (default: 24377) */
|
|
9
|
+
syncPort?: number;
|
|
10
|
+
/** Try to connect to a running sync server (used by CLI) */
|
|
11
|
+
syncClient?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface ProjectNamespace {
|
|
14
|
+
create(input: CreateProjectInput): Promise<Result<Project>>;
|
|
15
|
+
list(filter?: ProjectFilter): Promise<Result<Project[]>>;
|
|
16
|
+
get(id: ProjectId): Promise<Result<Project>>;
|
|
17
|
+
update(id: ProjectId, input: UpdateProjectInput): Promise<Result<Project>>;
|
|
18
|
+
delete(id: ProjectId): Promise<Result<void>>;
|
|
19
|
+
}
|
|
20
|
+
export interface TaskNamespace {
|
|
21
|
+
create(input: CreateTaskInput): Promise<Result<TaskWithDetail>>;
|
|
22
|
+
list(filter?: TaskFilter, sort?: TaskSortOptions): Promise<Result<Task[]>>;
|
|
23
|
+
get(id: TaskId): Promise<Result<TaskWithDetail>>;
|
|
24
|
+
update(id: TaskId, input: UpdateTaskInput): Promise<Result<TaskWithDetail>>;
|
|
25
|
+
delete(id: TaskId): Promise<Result<void>>;
|
|
26
|
+
move(id: TaskId, projectId: ProjectId): Promise<Result<TaskWithDetail>>;
|
|
27
|
+
search(query: string): Promise<Result<Task[]>>;
|
|
28
|
+
}
|
|
29
|
+
export interface LabelNamespace {
|
|
30
|
+
create(input: CreateLabelInput): Promise<Result<Label>>;
|
|
31
|
+
list(): Promise<Result<Label[]>>;
|
|
32
|
+
update(id: LabelId, input: UpdateLabelInput): Promise<Result<Label>>;
|
|
33
|
+
delete(id: LabelId): Promise<Result<void>>;
|
|
34
|
+
}
|
|
35
|
+
export interface NoteNamespace {
|
|
36
|
+
create(input: CreateNoteInput): Promise<Result<Note>>;
|
|
37
|
+
list(filter?: NoteFilter): Promise<Result<Note[]>>;
|
|
38
|
+
update(id: NoteId, input: UpdateNoteInput): Promise<Result<Note>>;
|
|
39
|
+
delete(id: NoteId): Promise<Result<void>>;
|
|
40
|
+
}
|
|
41
|
+
export interface RecurringNamespace {
|
|
42
|
+
create(input: CreateRecurringInput): Promise<Result<RecurringTemplate>>;
|
|
43
|
+
list(filter?: RecurringFilter): Promise<Result<RecurringTemplate[]>>;
|
|
44
|
+
get(id: RecurringId): Promise<Result<RecurringTemplate>>;
|
|
45
|
+
update(id: RecurringId, input: UpdateRecurringInput): Promise<Result<RecurringTemplate>>;
|
|
46
|
+
delete(id: RecurringId): Promise<Result<void>>;
|
|
47
|
+
pause(id: RecurringId): Promise<Result<RecurringTemplate>>;
|
|
48
|
+
resume(id: RecurringId): Promise<Result<RecurringTemplate>>;
|
|
49
|
+
upcoming(options?: {
|
|
50
|
+
templateId?: RecurringId;
|
|
51
|
+
days?: number;
|
|
52
|
+
}): Promise<Result<UpcomingOccurrence[]>>;
|
|
53
|
+
generate(templateId: RecurringId, date: string): Promise<Result<Task>>;
|
|
54
|
+
process(): Promise<Result<Task[]>>;
|
|
55
|
+
}
|
|
56
|
+
export interface HabitNamespace {
|
|
57
|
+
create(input: CreateHabitInput): Promise<Result<Habit>>;
|
|
58
|
+
list(filter?: HabitFilter): Promise<Result<Habit[]>>;
|
|
59
|
+
get(id: HabitId): Promise<Result<Habit>>;
|
|
60
|
+
update(id: HabitId, input: UpdateHabitInput): Promise<Result<Habit>>;
|
|
61
|
+
delete(id: HabitId): Promise<Result<void>>;
|
|
62
|
+
pause(id: HabitId): Promise<Result<Habit>>;
|
|
63
|
+
resume(id: HabitId): Promise<Result<Habit>>;
|
|
64
|
+
check(id: HabitId): Promise<Result<HabitEntry>>;
|
|
65
|
+
uncheck(id: HabitId): Promise<Result<void>>;
|
|
66
|
+
streak(id: HabitId): Promise<Result<HabitStreak>>;
|
|
67
|
+
history(id: HabitId, days?: number): Promise<Result<HabitHistoryEntry[]>>;
|
|
68
|
+
}
|
|
69
|
+
/** How this instance coordinates with other local processes. */
|
|
70
|
+
export type LocalSyncMode = "standalone" | "ephemeral-client" | "sync-server";
|
|
71
|
+
/** Remote multi-device sync connection state. */
|
|
72
|
+
export type RemoteSyncState = "disconnected" | "connected" | "syncing";
|
|
73
|
+
export interface SyncStatus {
|
|
74
|
+
/** Local coordination mode with other processes on this machine. */
|
|
75
|
+
local: {
|
|
76
|
+
mode: LocalSyncMode;
|
|
77
|
+
};
|
|
78
|
+
/** Multi-device replication state (phase 3 — currently always disconnected). */
|
|
79
|
+
remote: {
|
|
80
|
+
state: RemoteSyncState;
|
|
81
|
+
/** Sync server URL if configured. */
|
|
82
|
+
server?: string;
|
|
83
|
+
/** ISO timestamp of last successful sync. */
|
|
84
|
+
lastSync?: string;
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
export interface SyncNamespace {
|
|
88
|
+
/** Start remote multi-device sync connection. */
|
|
89
|
+
start(): Promise<void>;
|
|
90
|
+
/** Stop remote multi-device sync connection. */
|
|
91
|
+
stop(): Promise<void>;
|
|
92
|
+
/** Get current sync status (local mode + remote state). */
|
|
93
|
+
status(): SyncStatus;
|
|
94
|
+
}
|
|
95
|
+
export interface ConfigNamespace {
|
|
96
|
+
get(): ToduConfig;
|
|
97
|
+
}
|
|
98
|
+
export interface Todu {
|
|
99
|
+
project: ProjectNamespace;
|
|
100
|
+
task: TaskNamespace;
|
|
101
|
+
label: LabelNamespace;
|
|
102
|
+
note: NoteNamespace;
|
|
103
|
+
recurring: RecurringNamespace;
|
|
104
|
+
habit: HabitNamespace;
|
|
105
|
+
sync: SyncNamespace;
|
|
106
|
+
config: ConfigNamespace;
|
|
107
|
+
/**
|
|
108
|
+
* Register a callback to be notified when data changes.
|
|
109
|
+
* Returns a cleanup function to unsubscribe.
|
|
110
|
+
*/
|
|
111
|
+
onChange(callback: () => void): () => void;
|
|
112
|
+
close(): Promise<void>;
|
|
113
|
+
}
|
|
114
|
+
export declare function createStubNamespaces(config: ToduConfig): Omit<Todu, "close" | "onChange">;
|
|
115
|
+
//# sourceMappingURL=todu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"todu.d.ts","sourceRoot":"","sources":["../src/todu.ts"],"names":[],"mappings":"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"}
|
package/dist/todu.js
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Stub factory — returns "not implemented" for all operations
|
|
3
|
+
// ============================================================================
|
|
4
|
+
function notImplemented() {
|
|
5
|
+
return Promise.reject(new Error("Not implemented"));
|
|
6
|
+
}
|
|
7
|
+
export function createStubNamespaces(config) {
|
|
8
|
+
const stub = () => notImplemented();
|
|
9
|
+
return {
|
|
10
|
+
project: {
|
|
11
|
+
create: stub,
|
|
12
|
+
list: stub,
|
|
13
|
+
get: stub,
|
|
14
|
+
update: stub,
|
|
15
|
+
delete: stub,
|
|
16
|
+
},
|
|
17
|
+
task: {
|
|
18
|
+
create: stub,
|
|
19
|
+
list: stub,
|
|
20
|
+
get: stub,
|
|
21
|
+
update: stub,
|
|
22
|
+
delete: stub,
|
|
23
|
+
move: stub,
|
|
24
|
+
search: stub,
|
|
25
|
+
},
|
|
26
|
+
label: {
|
|
27
|
+
create: stub,
|
|
28
|
+
list: stub,
|
|
29
|
+
update: stub,
|
|
30
|
+
delete: stub,
|
|
31
|
+
},
|
|
32
|
+
note: {
|
|
33
|
+
create: stub,
|
|
34
|
+
list: stub,
|
|
35
|
+
update: stub,
|
|
36
|
+
delete: stub,
|
|
37
|
+
},
|
|
38
|
+
recurring: {
|
|
39
|
+
create: stub,
|
|
40
|
+
list: stub,
|
|
41
|
+
get: stub,
|
|
42
|
+
update: stub,
|
|
43
|
+
delete: stub,
|
|
44
|
+
pause: stub,
|
|
45
|
+
resume: stub,
|
|
46
|
+
upcoming: stub,
|
|
47
|
+
generate: stub,
|
|
48
|
+
process: stub,
|
|
49
|
+
},
|
|
50
|
+
habit: {
|
|
51
|
+
create: stub,
|
|
52
|
+
list: stub,
|
|
53
|
+
get: stub,
|
|
54
|
+
update: stub,
|
|
55
|
+
delete: stub,
|
|
56
|
+
pause: stub,
|
|
57
|
+
resume: stub,
|
|
58
|
+
check: stub,
|
|
59
|
+
uncheck: stub,
|
|
60
|
+
streak: stub,
|
|
61
|
+
history: stub,
|
|
62
|
+
},
|
|
63
|
+
sync: {
|
|
64
|
+
start: () => Promise.resolve(),
|
|
65
|
+
stop: () => Promise.resolve(),
|
|
66
|
+
status: () => ({
|
|
67
|
+
local: { mode: "standalone" },
|
|
68
|
+
remote: { state: "disconnected" },
|
|
69
|
+
}),
|
|
70
|
+
},
|
|
71
|
+
config: {
|
|
72
|
+
get: () => config,
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=todu.js.map
|
package/dist/todu.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"todu.js","sourceRoot":"","sources":["../src/todu.ts"],"names":[],"mappings":"AAsLA,+EAA+E;AAC/E,gEAA8D;AAC9D,+EAA+E;AAE/E,SAAS,cAAc,GAAsC;IAC3D,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;AAAA,CACrD;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAkB,EAAoC;IACzF,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC;IAEpC,OAAO;QACL,OAAO,EAAE;YACP,MAAM,EAAE,IAAI;YACZ,IAAI,EAAE,IAAI;YACV,GAAG,EAAE,IAAI;YACT,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,IAAI;SACb;QACD,IAAI,EAAE;YACJ,MAAM,EAAE,IAAI;YACZ,IAAI,EAAE,IAAI;YACV,GAAG,EAAE,IAAI;YACT,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,IAAI;YACZ,IAAI,EAAE,IAAI;YACV,MAAM,EAAE,IAAI;SACb;QACD,KAAK,EAAE;YACL,MAAM,EAAE,IAAI;YACZ,IAAI,EAAE,IAAI;YACV,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,IAAI;SACb;QACD,IAAI,EAAE;YACJ,MAAM,EAAE,IAAI;YACZ,IAAI,EAAE,IAAI;YACV,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,IAAI;SACb;QACD,SAAS,EAAE;YACT,MAAM,EAAE,IAAI;YACZ,IAAI,EAAE,IAAI;YACV,GAAG,EAAE,IAAI;YACT,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,IAAI;YACZ,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,IAAI;YACd,OAAO,EAAE,IAAI;SACd;QACD,KAAK,EAAE;YACL,MAAM,EAAE,IAAI;YACZ,IAAI,EAAE,IAAI;YACV,GAAG,EAAE,IAAI;YACT,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,IAAI;YACZ,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,IAAI;YACZ,KAAK,EAAE,IAAI;YACX,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,IAAI;SACd;QACD,IAAI,EAAE;YACJ,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE;YAC9B,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE;YAC7B,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;gBACb,KAAK,EAAE,EAAE,IAAI,EAAE,YAA6B,EAAE;gBAC9C,MAAM,EAAE,EAAE,KAAK,EAAE,cAAiC,EAAE;aACrD,CAAC;SACH;QACD,MAAM,EAAE;YACN,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM;SAClB;KACF,CAAC;AAAA,CACH"}
|