@todu/core 0.1.1 → 0.2.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/browser.d.ts CHANGED
@@ -10,5 +10,6 @@
10
10
  */
11
11
  export * from "./constants.js";
12
12
  export * from "./schema.js";
13
+ export * from "./sync-provider.js";
13
14
  export * from "./types.js";
14
15
  //# sourceMappingURL=browser.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC"}
package/dist/browser.js CHANGED
@@ -10,5 +10,6 @@
10
10
  */
11
11
  export * from "./constants.js";
12
12
  export * from "./schema.js";
13
+ export * from "./sync-provider.js";
13
14
  export * from "./types.js";
14
15
  //# sourceMappingURL=browser.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC"}
package/dist/config.d.ts CHANGED
@@ -4,28 +4,68 @@ export declare const DEFAULT_DATA_DIR: string;
4
4
  export interface ToduFileConfig {
5
5
  /** Path to data directory (absolute or relative to config file) */
6
6
  data_dir?: string;
7
+ /** Remote multi-device sync configuration */
8
+ sync?: {
9
+ remote?: {
10
+ /** WebSocket URL of the remote sync server (e.g. "wss://sync.todu.sh") */
11
+ server?: string;
12
+ /** Whether remote sync is enabled (default: false) */
13
+ enabled?: boolean;
14
+ };
15
+ };
16
+ /** Daemon-specific configuration */
17
+ daemon?: {
18
+ workers?: {
19
+ /** Worker types statically assigned to this daemon */
20
+ assigned?: string[];
21
+ };
22
+ plugins?: {
23
+ /** Local plugin module entrypoints for daemon startup loading */
24
+ paths?: string[];
25
+ /** Arbitrary plugin settings keyed by plugin name */
26
+ config?: Record<string, Record<string, unknown>>;
27
+ };
28
+ };
7
29
  }
30
+ /** Resolved remote sync config — only present when server is set and enabled. */
31
+ export interface RemoteSyncConfig {
32
+ /** WebSocket URL of the remote sync server */
33
+ server: string;
34
+ }
35
+ /**
36
+ * Resolve remote sync configuration from file config and env var overrides.
37
+ *
38
+ * Priority:
39
+ * 1. TODUAI_SYNC_SERVER / TODUAI_SYNC_ENABLED env vars
40
+ * 2. sync.remote fields from config file
41
+ *
42
+ * Returns null when remote sync is disabled or not configured.
43
+ *
44
+ * IMPORTANT: Never use wss://sync.todu.sh in development or tests.
45
+ * Use the local dev sync server (ws://localhost:3030) via `make dev`.
46
+ */
47
+ export declare function resolveRemoteSyncConfig(config: ToduFileConfig): RemoteSyncConfig | null;
8
48
  /**
9
49
  * Resolve config file path.
10
50
  *
11
51
  * Priority:
12
52
  * 1. Explicit override (e.g. --config flag)
13
- * 2. TODU_CONFIG env var
14
- * 3. Default: ~/.config/todu/config.yaml
53
+ * 2. TODUAI_CONFIG env var
54
+ * 3. Default: ~/.config/toduai/config.yaml
15
55
  */
16
56
  export declare function resolveConfigPath(override?: string): string;
17
57
  /**
18
58
  * Resolve the data directory path.
19
59
  *
20
60
  * Priority:
21
- * 1. TODU_DATA_DIR env var (for tests / backward compat)
61
+ * 1. TODUAI_DATA_DIR env var
22
62
  * 2. data_dir from config file (resolved relative to config file location)
23
- * 3. Default: ~/.config/todu/data
63
+ * 3. Default: ~/.config/toduai/data
24
64
  */
25
65
  export declare function resolveDataDir(configPath: string, config: ToduFileConfig): string;
26
66
  /**
27
67
  * Describe where each resolved value came from.
28
- * Useful for `todu config show` and debugging.
68
+ * Useful for `toduai config show` and debugging.
29
69
  */
30
70
  export declare function resolveConfigSources(configOverride?: string, config?: ToduFileConfig): {
31
71
  configPath: string;
@@ -37,7 +77,7 @@ export declare function resolveConfigSources(configOverride?: string, config?: T
37
77
  * Resolve storage path using env vars and defaults.
38
78
  *
39
79
  * For clients that don't parse config files (e.g. Electron).
40
- * Checks TODU_DATA_DIR env var, then falls back to default.
80
+ * Checks TODUAI_DATA_DIR env var, then falls back to default.
41
81
  * If a config file with data_dir is needed, use resolveDataDir instead.
42
82
  */
43
83
  export declare function resolveStoragePath(): string;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,kBAAkB,QAA6C,CAAC;AAC7E,eAAO,MAAM,mBAAmB,QAA+C,CAAC;AAChF,eAAO,MAAM,gBAAgB,QAAwC,CAAC;AAEtE,MAAM,WAAW,cAAc;IAC7B,mEAAmE;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAI3D;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,MAAM,CAcjF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,cAAc,CAAC,EAAE,MAAM,EACvB,MAAM,CAAC,EAAE,cAAc,GACtB;IACD,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;CACvB,CAwBA;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAK3C"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,kBAAkB,QAA+C,CAAC;AAC/E,eAAO,MAAM,mBAAmB,QAA+C,CAAC;AAChF,eAAO,MAAM,gBAAgB,QAAwC,CAAC;AAEtE,MAAM,WAAW,cAAc;IAC7B,mEAAmE;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6CAA6C;IAC7C,IAAI,CAAC,EAAE;QACL,MAAM,CAAC,EAAE;YACP,0EAA0E;YAC1E,MAAM,CAAC,EAAE,MAAM,CAAC;YAChB,sDAAsD;YACtD,OAAO,CAAC,EAAE,OAAO,CAAC;SACnB,CAAC;KACH,CAAC;IACF,oCAAoC;IACpC,MAAM,CAAC,EAAE;QACP,OAAO,CAAC,EAAE;YACR,sDAAsD;YACtD,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;SACrB,CAAC;QACF,OAAO,CAAC,EAAE;YACR,iEAAiE;YACjE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;YACjB,qDAAqD;YACrD,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;SAClD,CAAC;KACH,CAAC;CACH;AAED,mFAAiF;AACjF,MAAM,WAAW,gBAAgB;IAC/B,8CAA8C;IAC9C,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,cAAc,GAAG,gBAAgB,GAAG,IAAI,CAgBvF;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAI3D;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,MAAM,CAcjF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,cAAc,CAAC,EAAE,MAAM,EACvB,MAAM,CAAC,EAAE,cAAc,GACtB;IACD,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;CACvB,CAwBA;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAK3C"}
package/dist/config.js CHANGED
@@ -9,36 +9,61 @@ import path from "node:path";
9
9
  // This module handles path resolution only. Config file parsing (YAML)
10
10
  // stays in the CLI package which has the yaml dependency.
11
11
  // ============================================================================
12
- export const DEFAULT_CONFIG_DIR = path.join(os.homedir(), ".config", "todu");
12
+ export const DEFAULT_CONFIG_DIR = path.join(os.homedir(), ".config", "toduai");
13
13
  export const DEFAULT_CONFIG_FILE = path.join(DEFAULT_CONFIG_DIR, "config.yaml");
14
14
  export const DEFAULT_DATA_DIR = path.join(DEFAULT_CONFIG_DIR, "data");
15
+ /**
16
+ * Resolve remote sync configuration from file config and env var overrides.
17
+ *
18
+ * Priority:
19
+ * 1. TODUAI_SYNC_SERVER / TODUAI_SYNC_ENABLED env vars
20
+ * 2. sync.remote fields from config file
21
+ *
22
+ * Returns null when remote sync is disabled or not configured.
23
+ *
24
+ * IMPORTANT: Never use wss://sync.todu.sh in development or tests.
25
+ * Use the local dev sync server (ws://localhost:3030) via `make dev`.
26
+ */
27
+ export function resolveRemoteSyncConfig(config) {
28
+ const serverEnv = process.env.TODUAI_SYNC_SERVER;
29
+ const enabledEnv = process.env.TODUAI_SYNC_ENABLED;
30
+ const server = serverEnv ?? config.sync?.remote?.server;
31
+ // Default enabled to true when a server is configured — if someone
32
+ // sets a sync server URL, they obviously want sync enabled.
33
+ const enabled = enabledEnv !== undefined
34
+ ? enabledEnv === "true" || enabledEnv === "1"
35
+ : (config.sync?.remote?.enabled ?? true);
36
+ if (!server || !enabled)
37
+ return null;
38
+ return { server };
39
+ }
15
40
  /**
16
41
  * Resolve config file path.
17
42
  *
18
43
  * Priority:
19
44
  * 1. Explicit override (e.g. --config flag)
20
- * 2. TODU_CONFIG env var
21
- * 3. Default: ~/.config/todu/config.yaml
45
+ * 2. TODUAI_CONFIG env var
46
+ * 3. Default: ~/.config/toduai/config.yaml
22
47
  */
23
48
  export function resolveConfigPath(override) {
24
49
  if (override)
25
50
  return path.resolve(override);
26
- if (process.env.TODU_CONFIG)
27
- return path.resolve(process.env.TODU_CONFIG);
51
+ if (process.env.TODUAI_CONFIG)
52
+ return path.resolve(process.env.TODUAI_CONFIG);
28
53
  return DEFAULT_CONFIG_FILE;
29
54
  }
30
55
  /**
31
56
  * Resolve the data directory path.
32
57
  *
33
58
  * Priority:
34
- * 1. TODU_DATA_DIR env var (for tests / backward compat)
59
+ * 1. TODUAI_DATA_DIR env var
35
60
  * 2. data_dir from config file (resolved relative to config file location)
36
- * 3. Default: ~/.config/todu/data
61
+ * 3. Default: ~/.config/toduai/data
37
62
  */
38
63
  export function resolveDataDir(configPath, config) {
39
- // Env var takes precedence (backward compat, tests)
40
- if (process.env.TODU_DATA_DIR) {
41
- return path.resolve(process.env.TODU_DATA_DIR);
64
+ // Env var takes precedence (tests, explicit override)
65
+ if (process.env.TODUAI_DATA_DIR) {
66
+ return path.resolve(process.env.TODUAI_DATA_DIR);
42
67
  }
43
68
  // Config file data_dir
44
69
  if (config.data_dir) {
@@ -50,7 +75,7 @@ export function resolveDataDir(configPath, config) {
50
75
  }
51
76
  /**
52
77
  * Describe where each resolved value came from.
53
- * Useful for `todu config show` and debugging.
78
+ * Useful for `toduai config show` and debugging.
54
79
  */
55
80
  export function resolveConfigSources(configOverride, config) {
56
81
  const configPath = resolveConfigPath(configOverride);
@@ -58,8 +83,8 @@ export function resolveConfigSources(configOverride, config) {
58
83
  if (configOverride) {
59
84
  configSource = "--config flag";
60
85
  }
61
- else if (process.env.TODU_CONFIG) {
62
- configSource = "TODU_CONFIG env var";
86
+ else if (process.env.TODUAI_CONFIG) {
87
+ configSource = "TODUAI_CONFIG env var";
63
88
  }
64
89
  else {
65
90
  configSource = "default";
@@ -67,8 +92,8 @@ export function resolveConfigSources(configOverride, config) {
67
92
  const resolvedConfig = config ?? {};
68
93
  const dataDir = resolveDataDir(configPath, resolvedConfig);
69
94
  let dataDirSource;
70
- if (process.env.TODU_DATA_DIR) {
71
- dataDirSource = "TODU_DATA_DIR env var";
95
+ if (process.env.TODUAI_DATA_DIR) {
96
+ dataDirSource = "TODUAI_DATA_DIR env var";
72
97
  }
73
98
  else if (resolvedConfig.data_dir) {
74
99
  dataDirSource = `config file (${configPath})`;
@@ -82,12 +107,12 @@ export function resolveConfigSources(configOverride, config) {
82
107
  * Resolve storage path using env vars and defaults.
83
108
  *
84
109
  * For clients that don't parse config files (e.g. Electron).
85
- * Checks TODU_DATA_DIR env var, then falls back to default.
110
+ * Checks TODUAI_DATA_DIR env var, then falls back to default.
86
111
  * If a config file with data_dir is needed, use resolveDataDir instead.
87
112
  */
88
113
  export function resolveStoragePath() {
89
- if (process.env.TODU_DATA_DIR) {
90
- return path.resolve(process.env.TODU_DATA_DIR);
114
+ if (process.env.TODUAI_DATA_DIR) {
115
+ return path.resolve(process.env.TODUAI_DATA_DIR);
91
116
  }
92
117
  return DEFAULT_DATA_DIR;
93
118
  }
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -2,6 +2,8 @@ export * from "./config.js";
2
2
  export * from "./constants.js";
3
3
  export * from "./schedule.js";
4
4
  export * from "./schema.js";
5
+ export * from "./sync-provider.js";
5
6
  export * from "./types.js";
6
7
  export * from "./validation.js";
8
+ export * from "./worker-plugin.js";
7
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC"}
package/dist/index.js CHANGED
@@ -2,6 +2,8 @@ export * from "./config.js";
2
2
  export * from "./constants.js";
3
3
  export * from "./schedule.js";
4
4
  export * from "./schema.js";
5
+ export * from "./sync-provider.js";
5
6
  export * from "./types.js";
6
7
  export * from "./validation.js";
8
+ export * from "./worker-plugin.js";
7
9
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC"}
package/dist/schema.d.ts CHANGED
@@ -16,8 +16,12 @@ export interface CatalogDocument {
16
16
  * Populated when the first task is created in a project.
17
17
  */
18
18
  taskListDocIds: Record<string, string>;
19
- /** Automerge document ID for the notes document */
19
+ /** Legacy Automerge document ID for the old single notes document model */
20
20
  notesDocId?: string;
21
+ /** Map of notes partition key → Automerge document ID */
22
+ notesBucketDocIds: Record<string, string>;
23
+ /** Map of note ID → notes partition key */
24
+ noteBucketByNoteId: Record<string, string>;
21
25
  /** Recurring task templates */
22
26
  recurringTemplates: RecurringTemplate[];
23
27
  /** Habit definitions */
@@ -55,12 +59,11 @@ export interface TaskDetailDocument {
55
59
  description: string;
56
60
  }
57
61
  /**
58
- * Notes document (one global).
59
- * Contains all notes standalone journal entries and entity-attached notes.
60
- * Each note is ~200B, so thousands fit comfortably.
62
+ * Notes document (partition bucket).
63
+ * Each bucket stores a subset of notes to reduce write contention and history growth.
61
64
  */
62
65
  export interface NotesDocument {
63
- /** All notes */
66
+ /** Notes for this bucket */
64
67
  notes: Note[];
65
68
  }
66
69
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,KAAK,EACL,UAAU,EACV,OAAO,EACP,KAAK,EACL,IAAI,EACJ,OAAO,EACP,SAAS,EACT,iBAAiB,EACjB,QAAQ,EACR,IAAI,EACL,MAAM,YAAY,CAAC;AAMpB;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;IAEhB,mBAAmB;IACnB,QAAQ,EAAE,OAAO,EAAE,CAAC;IAEpB,iBAAiB;IACjB,MAAM,EAAE,KAAK,EAAE,CAAC;IAEhB;;;OAGG;IACH,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEvC,mDAAmD;IACnD,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,+BAA+B;IAC/B,kBAAkB,EAAE,iBAAiB,EAAE,CAAC;IAExC,wBAAwB;IACxB,MAAM,EAAE,KAAK,EAAE,CAAC;IAEhB,oEAAkE;IAClE,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEvC,2BAA2B;IAC3B,QAAQ,EAAE,QAAQ,CAAC;CAIpB;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,wCAAwC;IACxC,SAAS,EAAE,SAAS,CAAC;IAErB,4BAA4B;IAC5B,KAAK,EAAE,IAAI,EAAE,CAAC;IAEd;;;OAGG;IACH,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC;AAED;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,sCAAsC;IACtC,MAAM,EAAE,MAAM,CAAC;IAEf,uCAAuC;IACvC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,gBAAgB;IAChB,KAAK,EAAE,IAAI,EAAE,CAAC;CACf;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,sCAAsC;IACtC,OAAO,EAAE,MAAM,CAAC;IAEhB,kDAAkD;IAClD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CACrC;AAMD,eAAO,MAAM,cAAc,IAAI,CAAC;AAMhC,wBAAgB,kBAAkB,IAAI,eAAe,CAapD;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,SAAS,GAAG,gBAAgB,CAM7E;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,kBAAkB,CAKhG;AAED,wBAAgB,mBAAmB,IAAI,aAAa,CAInD;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,gBAAgB,CAKzE"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,KAAK,EACL,UAAU,EACV,OAAO,EACP,KAAK,EACL,IAAI,EACJ,OAAO,EACP,SAAS,EACT,iBAAiB,EACjB,QAAQ,EACR,IAAI,EACL,MAAM,YAAY,CAAC;AAMpB;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;IAEhB,mBAAmB;IACnB,QAAQ,EAAE,OAAO,EAAE,CAAC;IAEpB,iBAAiB;IACjB,MAAM,EAAE,KAAK,EAAE,CAAC;IAEhB;;;OAGG;IACH,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEvC,2EAA2E;IAC3E,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,2DAAyD;IACzD,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE1C,6CAA2C;IAC3C,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE3C,+BAA+B;IAC/B,kBAAkB,EAAE,iBAAiB,EAAE,CAAC;IAExC,wBAAwB;IACxB,MAAM,EAAE,KAAK,EAAE,CAAC;IAEhB,oEAAkE;IAClE,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEvC,2BAA2B;IAC3B,QAAQ,EAAE,QAAQ,CAAC;CAIpB;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,wCAAwC;IACxC,SAAS,EAAE,SAAS,CAAC;IAErB,4BAA4B;IAC5B,KAAK,EAAE,IAAI,EAAE,CAAC;IAEd;;;OAGG;IACH,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC;AAED;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,sCAAsC;IACtC,MAAM,EAAE,MAAM,CAAC;IAEf,uCAAuC;IACvC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,4BAA4B;IAC5B,KAAK,EAAE,IAAI,EAAE,CAAC;CACf;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,sCAAsC;IACtC,OAAO,EAAE,MAAM,CAAC;IAEhB,kDAAkD;IAClD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CACrC;AAMD,eAAO,MAAM,cAAc,IAAI,CAAC;AAMhC,wBAAgB,kBAAkB,IAAI,eAAe,CAepD;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,SAAS,GAAG,gBAAgB,CAM7E;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,kBAAkB,CAKhG;AAED,wBAAgB,mBAAmB,IAAI,aAAa,CAInD;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,gBAAgB,CAKzE"}
package/dist/schema.js CHANGED
@@ -11,6 +11,8 @@ export function createEmptyCatalog() {
11
11
  projects: [],
12
12
  labels: [],
13
13
  taskListDocIds: {},
14
+ notesBucketDocIds: {},
15
+ noteBucketByNoteId: {},
14
16
  recurringTemplates: [],
15
17
  habits: [],
16
18
  habitLogDocIds: {},
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AA+GA,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC;AAEhC,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E,MAAM,UAAU,kBAAkB,GAAoB;IACpD,OAAO;QACL,OAAO,EAAE,cAAc;QACvB,QAAQ,EAAE,EAAE;QACZ,MAAM,EAAE,EAAE;QACV,cAAc,EAAE,EAAE;QAClB,kBAAkB,EAAE,EAAE;QACtB,MAAM,EAAE,EAAE;QACV,cAAc,EAAE,EAAE;QAClB,QAAQ,EAAE;YACR,aAAa,EAAE,cAAc;SAC9B;KACF,CAAC;AAAA,CACH;AAED,MAAM,UAAU,sBAAsB,CAAC,SAAoB,EAAoB;IAC7E,OAAO;QACL,SAAS;QACT,KAAK,EAAE,EAAE;QACT,YAAY,EAAE,EAAE;KACjB,CAAC;AAAA,CACH;AAED,MAAM,UAAU,wBAAwB,CAAC,MAAc,EAAE,WAAmB,EAAsB;IAChG,OAAO;QACL,MAAM;QACN,WAAW;KACZ,CAAC;AAAA,CACH;AAED,MAAM,UAAU,mBAAmB,GAAkB;IACnD,OAAO;QACL,KAAK,EAAE,EAAE;KACV,CAAC;AAAA,CACH;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAgB,EAAoB;IACzE,OAAO;QACL,OAAO;QACP,OAAO,EAAE,EAAE;KACZ,CAAC;AAAA,CACH"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAoHA,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC;AAEhC,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E,MAAM,UAAU,kBAAkB,GAAoB;IACpD,OAAO;QACL,OAAO,EAAE,cAAc;QACvB,QAAQ,EAAE,EAAE;QACZ,MAAM,EAAE,EAAE;QACV,cAAc,EAAE,EAAE;QAClB,iBAAiB,EAAE,EAAE;QACrB,kBAAkB,EAAE,EAAE;QACtB,kBAAkB,EAAE,EAAE;QACtB,MAAM,EAAE,EAAE;QACV,cAAc,EAAE,EAAE;QAClB,QAAQ,EAAE;YACR,aAAa,EAAE,cAAc;SAC9B;KACF,CAAC;AAAA,CACH;AAED,MAAM,UAAU,sBAAsB,CAAC,SAAoB,EAAoB;IAC7E,OAAO;QACL,SAAS;QACT,KAAK,EAAE,EAAE;QACT,YAAY,EAAE,EAAE;KACjB,CAAC;AAAA,CACH;AAED,MAAM,UAAU,wBAAwB,CAAC,MAAc,EAAE,WAAmB,EAAsB;IAChG,OAAO;QACL,MAAM;QACN,WAAW;KACZ,CAAC;AAAA,CACH;AAED,MAAM,UAAU,mBAAmB,GAAkB;IACnD,OAAO;QACL,KAAK,EAAE,EAAE;KACV,CAAC;AAAA,CACH;AAED,MAAM,UAAU,sBAAsB,CAAC,OAAgB,EAAoB;IACzE,OAAO;QACL,OAAO;QACP,OAAO,EAAE,EAAE;KACZ,CAAC;AAAA,CACH"}
@@ -0,0 +1,66 @@
1
+ import { type Project, type Result, type SyncStrategy, type Task } from "./types.js";
2
+ export declare const SYNC_PROVIDER_API_VERSION: 1;
3
+ export declare const SYNC_CONFLICT_RESOLUTION_POLICIES: readonly ["last-write-wins"];
4
+ export type SyncConflictResolutionPolicy = (typeof SYNC_CONFLICT_RESOLUTION_POLICIES)[number];
5
+ export interface SyncProviderManifest {
6
+ name: string;
7
+ version: string;
8
+ apiVersion: number;
9
+ }
10
+ export interface ExternalTask {
11
+ externalId: string;
12
+ title: string;
13
+ description?: string;
14
+ status?: string;
15
+ priority?: string;
16
+ labels?: string[];
17
+ sourceUrl?: string;
18
+ createdAt?: string;
19
+ updatedAt?: string;
20
+ raw?: unknown;
21
+ }
22
+ export interface ExternalComment {
23
+ externalId: string;
24
+ externalTaskId: string;
25
+ body: string;
26
+ author?: string;
27
+ createdAt: string;
28
+ updatedAt?: string;
29
+ raw?: unknown;
30
+ }
31
+ export interface SyncProviderConfig {
32
+ projectId: string;
33
+ strategy: SyncStrategy;
34
+ settings: Record<string, unknown>;
35
+ }
36
+ export interface SyncProviderPullResult {
37
+ tasks: ExternalTask[];
38
+ comments?: ExternalComment[];
39
+ }
40
+ export interface SyncProvider {
41
+ readonly name: string;
42
+ readonly version: string;
43
+ initialize(config: SyncProviderConfig): Promise<void>;
44
+ shutdown(): Promise<void>;
45
+ pull(project: Project): Promise<SyncProviderPullResult>;
46
+ push(tasks: Task[], project: Project): Promise<void>;
47
+ mapToTask(external: ExternalTask, project: Project): Task;
48
+ mapFromTask(task: Task, project: Project): ExternalTask;
49
+ }
50
+ export interface SyncProviderRegistration {
51
+ manifest: SyncProviderManifest;
52
+ provider: SyncProvider;
53
+ }
54
+ export declare const SYNC_PROVIDER_VALIDATION_ERROR_CODES: readonly ["INVALID_MANIFEST", "INVALID_PROVIDER", "API_VERSION_MISMATCH", "IDENTITY_MISMATCH"];
55
+ export type SyncProviderValidationErrorCode = (typeof SYNC_PROVIDER_VALIDATION_ERROR_CODES)[number];
56
+ export interface SyncProviderValidationError {
57
+ code: SyncProviderValidationErrorCode;
58
+ message: string;
59
+ details?: Record<string, unknown>;
60
+ }
61
+ export interface ValidateSyncProviderRegistrationOptions {
62
+ supportedApiVersion?: number;
63
+ }
64
+ export declare function isSyncProviderApiVersionCompatible(providerApiVersion: number, supportedApiVersion?: number): boolean;
65
+ export declare function validateSyncProviderRegistration(registration: SyncProviderRegistration, options?: ValidateSyncProviderRegistrationOptions): Result<SyncProviderRegistration, SyncProviderValidationError>;
66
+ //# sourceMappingURL=sync-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-provider.d.ts","sourceRoot":"","sources":["../src/sync-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,125 @@
1
+ import { err, ok } from "./types.js";
2
+ export const SYNC_PROVIDER_API_VERSION = 1;
3
+ export const SYNC_CONFLICT_RESOLUTION_POLICIES = ["last-write-wins"];
4
+ export const SYNC_PROVIDER_VALIDATION_ERROR_CODES = [
5
+ "INVALID_MANIFEST",
6
+ "INVALID_PROVIDER",
7
+ "API_VERSION_MISMATCH",
8
+ "IDENTITY_MISMATCH",
9
+ ];
10
+ const REQUIRED_SYNC_PROVIDER_METHODS = [
11
+ "initialize",
12
+ "shutdown",
13
+ "pull",
14
+ "push",
15
+ "mapToTask",
16
+ "mapFromTask",
17
+ ];
18
+ export function isSyncProviderApiVersionCompatible(providerApiVersion, supportedApiVersion = SYNC_PROVIDER_API_VERSION) {
19
+ return Number.isInteger(providerApiVersion) && providerApiVersion === supportedApiVersion;
20
+ }
21
+ export function validateSyncProviderRegistration(registration, options = {}) {
22
+ const supportedApiVersion = options.supportedApiVersion ?? SYNC_PROVIDER_API_VERSION;
23
+ const manifestCandidate = registration.manifest;
24
+ if (!manifestCandidate || typeof manifestCandidate !== "object") {
25
+ return err(createSyncProviderValidationError("INVALID_MANIFEST", "Sync provider manifest is required", {
26
+ field: "manifest",
27
+ }));
28
+ }
29
+ const manifestRecord = manifestCandidate;
30
+ const manifestName = normalizeNonEmptyString(manifestRecord.name);
31
+ if (!manifestName) {
32
+ return err(createSyncProviderValidationError("INVALID_MANIFEST", "Sync provider manifest requires non-empty name", {
33
+ field: "name",
34
+ }));
35
+ }
36
+ const manifestVersion = normalizeNonEmptyString(manifestRecord.version);
37
+ if (!manifestVersion) {
38
+ return err(createSyncProviderValidationError("INVALID_MANIFEST", "Sync provider manifest requires non-empty version", {
39
+ field: "version",
40
+ }));
41
+ }
42
+ const manifestApiVersion = normalizePositiveInteger(manifestRecord.apiVersion);
43
+ if (manifestApiVersion === null) {
44
+ return err(createSyncProviderValidationError("INVALID_MANIFEST", "Sync provider manifest requires positive integer apiVersion", {
45
+ field: "apiVersion",
46
+ apiVersion: manifestRecord.apiVersion,
47
+ }));
48
+ }
49
+ if (!isSyncProviderApiVersionCompatible(manifestApiVersion, supportedApiVersion)) {
50
+ return err(createSyncProviderValidationError("API_VERSION_MISMATCH", `Sync provider API version mismatch: provider=${manifestApiVersion} host=${supportedApiVersion}`, {
51
+ providerApiVersion: manifestApiVersion,
52
+ supportedApiVersion,
53
+ }));
54
+ }
55
+ const providerCandidate = registration.provider;
56
+ if (!providerCandidate || typeof providerCandidate !== "object") {
57
+ return err(createSyncProviderValidationError("INVALID_PROVIDER", "Sync provider instance is required"));
58
+ }
59
+ const providerRecord = providerCandidate;
60
+ const providerName = normalizeNonEmptyString(providerRecord.name);
61
+ if (!providerName) {
62
+ return err(createSyncProviderValidationError("INVALID_PROVIDER", "Sync provider requires non-empty name", {
63
+ field: "provider.name",
64
+ }));
65
+ }
66
+ const providerVersion = normalizeNonEmptyString(providerRecord.version);
67
+ if (!providerVersion) {
68
+ return err(createSyncProviderValidationError("INVALID_PROVIDER", "Sync provider requires non-empty version", {
69
+ field: "provider.version",
70
+ }));
71
+ }
72
+ if (providerName !== manifestName || providerVersion !== manifestVersion) {
73
+ return err(createSyncProviderValidationError("IDENTITY_MISMATCH", "Sync provider identity does not match manifest", {
74
+ manifestName,
75
+ manifestVersion,
76
+ providerName,
77
+ providerVersion,
78
+ }));
79
+ }
80
+ for (const method of REQUIRED_SYNC_PROVIDER_METHODS) {
81
+ if (typeof providerRecord[method] !== "function") {
82
+ return err(createSyncProviderValidationError("INVALID_PROVIDER", `Sync provider is missing required method: ${method}`, {
83
+ method,
84
+ }));
85
+ }
86
+ }
87
+ return ok({
88
+ manifest: {
89
+ name: manifestName,
90
+ version: manifestVersion,
91
+ apiVersion: manifestApiVersion,
92
+ },
93
+ provider: registration.provider,
94
+ });
95
+ }
96
+ function normalizeNonEmptyString(value) {
97
+ if (typeof value !== "string") {
98
+ return null;
99
+ }
100
+ const normalizedValue = value.trim();
101
+ if (!normalizedValue) {
102
+ return null;
103
+ }
104
+ return normalizedValue;
105
+ }
106
+ function normalizePositiveInteger(value) {
107
+ if (typeof value !== "number" || !Number.isInteger(value) || value < 1) {
108
+ return null;
109
+ }
110
+ return value;
111
+ }
112
+ function createSyncProviderValidationError(code, message, details) {
113
+ if (!details) {
114
+ return {
115
+ code,
116
+ message,
117
+ };
118
+ }
119
+ return {
120
+ code,
121
+ message,
122
+ details,
123
+ };
124
+ }
125
+ //# sourceMappingURL=sync-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-provider.js","sourceRoot":"","sources":["../src/sync-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,EAAE,EAA2D,MAAM,YAAY,CAAC;AAE9F,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAU,CAAC;AAEpD,MAAM,CAAC,MAAM,iCAAiC,GAAG,CAAC,iBAAiB,CAAU,CAAC;AA2D9E,MAAM,CAAC,MAAM,oCAAoC,GAAG;IAClD,kBAAkB;IAClB,kBAAkB;IAClB,sBAAsB;IACtB,mBAAmB;CACX,CAAC;AAcX,MAAM,8BAA8B,GAAG;IACrC,YAAY;IACZ,UAAU;IACV,MAAM;IACN,MAAM;IACN,WAAW;IACX,aAAa;CACL,CAAC;AAEX,MAAM,UAAU,kCAAkC,CAChD,kBAA0B,EAC1B,mBAAmB,GAAW,yBAAyB,EAC9C;IACT,OAAO,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,IAAI,kBAAkB,KAAK,mBAAmB,CAAC;AAAA,CAC3F;AAED,MAAM,UAAU,gCAAgC,CAC9C,YAAsC,EACtC,OAAO,GAA4C,EAAE,EACU;IAC/D,MAAM,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,IAAI,yBAAyB,CAAC;IAErF,MAAM,iBAAiB,GAAG,YAAY,CAAC,QAAmB,CAAC;IAC3D,IAAI,CAAC,iBAAiB,IAAI,OAAO,iBAAiB,KAAK,QAAQ,EAAE,CAAC;QAChE,OAAO,GAAG,CACR,iCAAiC,CAAC,kBAAkB,EAAE,oCAAoC,EAAE;YAC1F,KAAK,EAAE,UAAU;SAClB,CAAC,CACH,CAAC;IACJ,CAAC;IAED,MAAM,cAAc,GAAG,iBAA4C,CAAC;IAEpE,MAAM,YAAY,GAAG,uBAAuB,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAClE,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,GAAG,CACR,iCAAiC,CAC/B,kBAAkB,EAClB,gDAAgD,EAChD;YACE,KAAK,EAAE,MAAM;SACd,CACF,CACF,CAAC;IACJ,CAAC;IAED,MAAM,eAAe,GAAG,uBAAuB,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IACxE,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO,GAAG,CACR,iCAAiC,CAC/B,kBAAkB,EAClB,mDAAmD,EACnD;YACE,KAAK,EAAE,SAAS;SACjB,CACF,CACF,CAAC;IACJ,CAAC;IAED,MAAM,kBAAkB,GAAG,wBAAwB,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;IAC/E,IAAI,kBAAkB,KAAK,IAAI,EAAE,CAAC;QAChC,OAAO,GAAG,CACR,iCAAiC,CAC/B,kBAAkB,EAClB,6DAA6D,EAC7D;YACE,KAAK,EAAE,YAAY;YACnB,UAAU,EAAE,cAAc,CAAC,UAAU;SACtC,CACF,CACF,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,kCAAkC,CAAC,kBAAkB,EAAE,mBAAmB,CAAC,EAAE,CAAC;QACjF,OAAO,GAAG,CACR,iCAAiC,CAC/B,sBAAsB,EACtB,gDAAgD,kBAAkB,SAAS,mBAAmB,EAAE,EAChG;YACE,kBAAkB,EAAE,kBAAkB;YACtC,mBAAmB;SACpB,CACF,CACF,CAAC;IACJ,CAAC;IAED,MAAM,iBAAiB,GAAG,YAAY,CAAC,QAAmB,CAAC;IAC3D,IAAI,CAAC,iBAAiB,IAAI,OAAO,iBAAiB,KAAK,QAAQ,EAAE,CAAC;QAChE,OAAO,GAAG,CACR,iCAAiC,CAAC,kBAAkB,EAAE,oCAAoC,CAAC,CAC5F,CAAC;IACJ,CAAC;IAED,MAAM,cAAc,GAAG,iBAA4C,CAAC;IAEpE,MAAM,YAAY,GAAG,uBAAuB,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAClE,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,GAAG,CACR,iCAAiC,CAC/B,kBAAkB,EAClB,uCAAuC,EACvC;YACE,KAAK,EAAE,eAAe;SACvB,CACF,CACF,CAAC;IACJ,CAAC;IAED,MAAM,eAAe,GAAG,uBAAuB,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IACxE,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO,GAAG,CACR,iCAAiC,CAC/B,kBAAkB,EAClB,0CAA0C,EAC1C;YACE,KAAK,EAAE,kBAAkB;SAC1B,CACF,CACF,CAAC;IACJ,CAAC;IAED,IAAI,YAAY,KAAK,YAAY,IAAI,eAAe,KAAK,eAAe,EAAE,CAAC;QACzE,OAAO,GAAG,CACR,iCAAiC,CAC/B,mBAAmB,EACnB,gDAAgD,EAChD;YACE,YAAY;YACZ,eAAe;YACf,YAAY;YACZ,eAAe;SAChB,CACF,CACF,CAAC;IACJ,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,8BAA8B,EAAE,CAAC;QACpD,IAAI,OAAO,cAAc,CAAC,MAAM,CAAC,KAAK,UAAU,EAAE,CAAC;YACjD,OAAO,GAAG,CACR,iCAAiC,CAC/B,kBAAkB,EAClB,6CAA6C,MAAM,EAAE,EACrD;gBACE,MAAM;aACP,CACF,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,EAAE,CAAC;QACR,QAAQ,EAAE;YACR,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,eAAe;YACxB,UAAU,EAAE,kBAAkB;SAC/B;QACD,QAAQ,EAAE,YAAY,CAAC,QAAQ;KAChC,CAAC,CAAC;AAAA,CACJ;AAED,SAAS,uBAAuB,CAAC,KAAc,EAAiB;IAC9D,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IACrC,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,eAAe,CAAC;AAAA,CACxB;AAED,SAAS,wBAAwB,CAAC,KAAc,EAAiB;IAC/D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACvE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC;AAAA,CACd;AAED,SAAS,iCAAiC,CACxC,IAAqC,EACrC,OAAe,EACf,OAAiC,EACJ;IAC7B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;YACL,IAAI;YACJ,OAAO;SACR,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI;QACJ,OAAO;QACP,OAAO;KACR,CAAC;AAAA,CACH"}
package/dist/types.js CHANGED
@@ -54,7 +54,7 @@ export function storageError(message) {
54
54
  return { type: "storage", message };
55
55
  }
56
56
  // ============================================================================
57
- // Note entity — stored in NotesDocument
57
+ // Note entity — stored in partitioned NotesDocument buckets
58
58
  // ============================================================================
59
59
  export const NOTE_ENTITY_TYPES = ["task", "project", "habit"];
60
60
  export function isNoteEntityType(value) {
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import { type Result } from "./types.js";
2
+ export declare const WORKER_PLUGIN_DOMAIN_CAPABILITIES: readonly ["project", "task", "label", "note", "recurring", "habit", "sync"];
3
+ export declare const WORKER_PLUGIN_ROLE_HINTS: readonly ["node", "authority"];
4
+ export type WorkerPluginDomainCapability = (typeof WORKER_PLUGIN_DOMAIN_CAPABILITIES)[number];
5
+ export type WorkerPluginRoleHint = (typeof WORKER_PLUGIN_ROLE_HINTS)[number];
6
+ export interface WorkerPluginManifest {
7
+ name: string;
8
+ version: string;
9
+ worker: {
10
+ type: string;
11
+ requiredDomains: WorkerPluginDomainCapability[];
12
+ optionalDomains?: WorkerPluginDomainCapability[];
13
+ roleHints?: WorkerPluginRoleHint[];
14
+ };
15
+ }
16
+ export interface WorkerPluginRuntimeHandle {
17
+ stop(): void;
18
+ }
19
+ export interface WorkerPluginRuntime {
20
+ start(): WorkerPluginRuntimeHandle;
21
+ }
22
+ export interface WorkerPluginHostLogger {
23
+ debug(message: string, context?: Record<string, unknown>): void;
24
+ info(message: string, context?: Record<string, unknown>): void;
25
+ warn(message: string, context?: Record<string, unknown>): void;
26
+ error(message: string, context?: Record<string, unknown>): void;
27
+ }
28
+ export interface WorkerPluginHostContext {
29
+ getTodu: () => unknown | null;
30
+ logger: WorkerPluginHostLogger;
31
+ config: Record<string, unknown>;
32
+ }
33
+ export interface WorkerPluginRegistration {
34
+ manifest: WorkerPluginManifest;
35
+ createRuntime(context: WorkerPluginHostContext): WorkerPluginRuntime;
36
+ }
37
+ export declare const WORKER_PLUGIN_VALIDATION_ERROR_CODES: readonly ["INVALID_MANIFEST", "INVALID_RUNTIME"];
38
+ export type WorkerPluginValidationErrorCode = (typeof WORKER_PLUGIN_VALIDATION_ERROR_CODES)[number];
39
+ export interface WorkerPluginValidationError {
40
+ code: WorkerPluginValidationErrorCode;
41
+ message: string;
42
+ details?: Record<string, unknown>;
43
+ }
44
+ export declare function validateWorkerPluginRegistration(registration: WorkerPluginRegistration): Result<WorkerPluginRegistration, WorkerPluginValidationError>;
45
+ //# sourceMappingURL=worker-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-plugin.d.ts","sourceRoot":"","sources":["../src/worker-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAElD,eAAO,MAAM,iCAAiC,6EAQpC,CAAC;AAEX,eAAO,MAAM,wBAAwB,gCAAiC,CAAC;AAEvE,MAAM,MAAM,4BAA4B,GAAG,CAAC,OAAO,iCAAiC,CAAC,CAAC,MAAM,CAAC,CAAC;AAC9F,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,wBAAwB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7E,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,eAAe,EAAE,4BAA4B,EAAE,CAAC;QAChD,eAAe,CAAC,EAAE,4BAA4B,EAAE,CAAC;QACjD,SAAS,CAAC,EAAE,oBAAoB,EAAE,CAAC;KACpC,CAAC;CACH;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,IAAI,IAAI,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,IAAI,yBAAyB,CAAC;CACpC;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAChE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC/D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC/D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CACjE;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,OAAO,GAAG,IAAI,CAAC;IAC9B,MAAM,EAAE,sBAAsB,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,aAAa,CAAC,OAAO,EAAE,uBAAuB,GAAG,mBAAmB,CAAC;CACtE;AAED,eAAO,MAAM,oCAAoC,kDAGvC,CAAC;AAEX,MAAM,MAAM,+BAA+B,GAAG,CAAC,OAAO,oCAAoC,CAAC,CAAC,MAAM,CAAC,CAAC;AAEpG,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,+BAA+B,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,wBAAgB,gCAAgC,CAC9C,YAAY,EAAE,wBAAwB,GACrC,MAAM,CAAC,wBAAwB,EAAE,2BAA2B,CAAC,CAuH/D"}
@@ -0,0 +1,166 @@
1
+ import { err, ok } from "./types.js";
2
+ export const WORKER_PLUGIN_DOMAIN_CAPABILITIES = [
3
+ "project",
4
+ "task",
5
+ "label",
6
+ "note",
7
+ "recurring",
8
+ "habit",
9
+ "sync",
10
+ ];
11
+ export const WORKER_PLUGIN_ROLE_HINTS = ["node", "authority"];
12
+ export const WORKER_PLUGIN_VALIDATION_ERROR_CODES = [
13
+ "INVALID_MANIFEST",
14
+ "INVALID_RUNTIME",
15
+ ];
16
+ export function validateWorkerPluginRegistration(registration) {
17
+ const manifest = registration.manifest;
18
+ if (!isRecord(manifest)) {
19
+ return err(createValidationError("INVALID_MANIFEST", "Worker plugin manifest is required"));
20
+ }
21
+ const manifestName = normalizeNonEmptyString(manifest.name);
22
+ if (!manifestName) {
23
+ return err(createValidationError("INVALID_MANIFEST", "Worker plugin manifest requires non-empty name", {
24
+ field: "name",
25
+ }));
26
+ }
27
+ const manifestVersion = normalizeNonEmptyString(manifest.version);
28
+ if (!manifestVersion) {
29
+ return err(createValidationError("INVALID_MANIFEST", "Worker plugin manifest requires non-empty version", {
30
+ field: "version",
31
+ }));
32
+ }
33
+ const workerManifest = manifest.worker;
34
+ if (!isRecord(workerManifest)) {
35
+ return err(createValidationError("INVALID_MANIFEST", "Worker plugin manifest requires worker object", {
36
+ field: "worker",
37
+ }));
38
+ }
39
+ const workerType = normalizeNonEmptyString(workerManifest.type);
40
+ if (!workerType) {
41
+ return err(createValidationError("INVALID_MANIFEST", "Worker plugin worker.type must be non-empty", {
42
+ field: "worker.type",
43
+ }));
44
+ }
45
+ if (!Array.isArray(workerManifest.requiredDomains)) {
46
+ return err(createValidationError("INVALID_MANIFEST", "Worker plugin worker.requiredDomains must be an array", {
47
+ field: "worker.requiredDomains",
48
+ }));
49
+ }
50
+ const requiredDomainsResult = normalizeDomainList(workerManifest.requiredDomains, "requiredDomains");
51
+ if (!requiredDomainsResult.ok) {
52
+ return requiredDomainsResult;
53
+ }
54
+ const optionalDomainsInput = workerManifest.optionalDomains ?? [];
55
+ if (!Array.isArray(optionalDomainsInput)) {
56
+ return err(createValidationError("INVALID_MANIFEST", "Worker plugin worker.optionalDomains must be an array when provided", {
57
+ field: "worker.optionalDomains",
58
+ }));
59
+ }
60
+ const optionalDomainsResult = normalizeDomainList(optionalDomainsInput, "optionalDomains");
61
+ if (!optionalDomainsResult.ok) {
62
+ return optionalDomainsResult;
63
+ }
64
+ const roleHintsInput = workerManifest.roleHints ?? [];
65
+ if (!Array.isArray(roleHintsInput)) {
66
+ return err(createValidationError("INVALID_MANIFEST", "Worker plugin worker.roleHints must be an array", {
67
+ field: "worker.roleHints",
68
+ }));
69
+ }
70
+ const roleHintsResult = normalizeRoleHints(roleHintsInput);
71
+ if (!roleHintsResult.ok) {
72
+ return roleHintsResult;
73
+ }
74
+ if (typeof registration.createRuntime !== "function") {
75
+ return err(createValidationError("INVALID_RUNTIME", "Worker plugin must define createRuntime(context)", {
76
+ field: "createRuntime",
77
+ }));
78
+ }
79
+ return ok({
80
+ manifest: {
81
+ name: manifestName,
82
+ version: manifestVersion,
83
+ worker: {
84
+ type: workerType,
85
+ requiredDomains: requiredDomainsResult.value,
86
+ optionalDomains: optionalDomainsResult.value,
87
+ roleHints: roleHintsResult.value,
88
+ },
89
+ },
90
+ createRuntime: registration.createRuntime,
91
+ });
92
+ }
93
+ function normalizeDomainList(values, field) {
94
+ const normalized = [];
95
+ for (const rawValue of values) {
96
+ if (typeof rawValue !== "string") {
97
+ return err(createValidationError("INVALID_MANIFEST", `Worker plugin ${field} entries must be strings`, {
98
+ field: `worker.${field}`,
99
+ value: rawValue,
100
+ }));
101
+ }
102
+ const normalizedValue = rawValue.trim().toLowerCase();
103
+ if (!isWorkerPluginDomainCapability(normalizedValue)) {
104
+ return err(createValidationError("INVALID_MANIFEST", `Worker plugin ${field} contains unsupported capability: ${rawValue}`, {
105
+ field: `worker.${field}`,
106
+ value: rawValue,
107
+ }));
108
+ }
109
+ if (!normalized.includes(normalizedValue)) {
110
+ normalized.push(normalizedValue);
111
+ }
112
+ }
113
+ return ok(normalized);
114
+ }
115
+ function normalizeRoleHints(values) {
116
+ const normalized = [];
117
+ for (const rawValue of values) {
118
+ if (typeof rawValue !== "string") {
119
+ return err(createValidationError("INVALID_MANIFEST", "Worker plugin roleHints entries must be strings", {
120
+ field: "worker.roleHints",
121
+ value: rawValue,
122
+ }));
123
+ }
124
+ const normalizedValue = rawValue.trim().toLowerCase();
125
+ if (!isWorkerPluginRoleHint(normalizedValue)) {
126
+ return err(createValidationError("INVALID_MANIFEST", `Worker plugin roleHints contains unsupported role hint: ${rawValue}`, {
127
+ field: "worker.roleHints",
128
+ value: rawValue,
129
+ }));
130
+ }
131
+ if (!normalized.includes(normalizedValue)) {
132
+ normalized.push(normalizedValue);
133
+ }
134
+ }
135
+ return ok(normalized);
136
+ }
137
+ function createValidationError(code, message, details) {
138
+ if (!details) {
139
+ return { code, message };
140
+ }
141
+ return {
142
+ code,
143
+ message,
144
+ details,
145
+ };
146
+ }
147
+ function normalizeNonEmptyString(value) {
148
+ if (typeof value !== "string") {
149
+ return null;
150
+ }
151
+ const normalizedValue = value.trim();
152
+ if (!normalizedValue) {
153
+ return null;
154
+ }
155
+ return normalizedValue;
156
+ }
157
+ function isWorkerPluginDomainCapability(value) {
158
+ return WORKER_PLUGIN_DOMAIN_CAPABILITIES.includes(value);
159
+ }
160
+ function isWorkerPluginRoleHint(value) {
161
+ return WORKER_PLUGIN_ROLE_HINTS.includes(value);
162
+ }
163
+ function isRecord(value) {
164
+ return typeof value === "object" && value !== null && !Array.isArray(value);
165
+ }
166
+ //# sourceMappingURL=worker-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-plugin.js","sourceRoot":"","sources":["../src/worker-plugin.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@todu/core",
3
- "version": "0.1.1",
3
+ "version": "0.2.0",
4
4
  "description": "Core types, validation, and schemas for todu task management",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",