@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.
Files changed (57) hide show
  1. package/dist/change-observer.d.ts +15 -0
  2. package/dist/change-observer.d.ts.map +1 -0
  3. package/dist/change-observer.js +64 -0
  4. package/dist/change-observer.js.map +1 -0
  5. package/dist/habits.d.ts +6 -0
  6. package/dist/habits.d.ts.map +1 -0
  7. package/dist/habits.js +397 -0
  8. package/dist/habits.js.map +1 -0
  9. package/dist/index.d.ts +25 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +104 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/labels.d.ts +5 -0
  14. package/dist/labels.d.ts.map +1 -0
  15. package/dist/labels.js +113 -0
  16. package/dist/labels.js.map +1 -0
  17. package/dist/notes.d.ts +5 -0
  18. package/dist/notes.d.ts.map +1 -0
  19. package/dist/notes.js +163 -0
  20. package/dist/notes.js.map +1 -0
  21. package/dist/projects.d.ts +5 -0
  22. package/dist/projects.d.ts.map +1 -0
  23. package/dist/projects.js +117 -0
  24. package/dist/projects.js.map +1 -0
  25. package/dist/recurring.d.ts +23 -0
  26. package/dist/recurring.d.ts.map +1 -0
  27. package/dist/recurring.js +372 -0
  28. package/dist/recurring.js.map +1 -0
  29. package/dist/schedule.d.ts +38 -0
  30. package/dist/schedule.d.ts.map +1 -0
  31. package/dist/schedule.js +330 -0
  32. package/dist/schedule.js.map +1 -0
  33. package/dist/scheduling.d.ts +62 -0
  34. package/dist/scheduling.d.ts.map +1 -0
  35. package/dist/scheduling.js +58 -0
  36. package/dist/scheduling.js.map +1 -0
  37. package/dist/storage.d.ts +34 -0
  38. package/dist/storage.d.ts.map +1 -0
  39. package/dist/storage.js +204 -0
  40. package/dist/storage.js.map +1 -0
  41. package/dist/sync-client.d.ts +16 -0
  42. package/dist/sync-client.d.ts.map +1 -0
  43. package/dist/sync-client.js +54 -0
  44. package/dist/sync-client.js.map +1 -0
  45. package/dist/sync-server.d.ts +12 -0
  46. package/dist/sync-server.d.ts.map +1 -0
  47. package/dist/sync-server.js +21 -0
  48. package/dist/sync-server.js.map +1 -0
  49. package/dist/tasks.d.ts +18 -0
  50. package/dist/tasks.d.ts.map +1 -0
  51. package/dist/tasks.js +396 -0
  52. package/dist/tasks.js.map +1 -0
  53. package/dist/todu.d.ts +115 -0
  54. package/dist/todu.d.ts.map +1 -0
  55. package/dist/todu.js +76 -0
  56. package/dist/todu.js.map +1 -0
  57. 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
@@ -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"}