@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 +1 -0
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +1 -0
- package/dist/browser.js.map +1 -1
- package/dist/config.d.ts +46 -6
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +43 -18
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/schema.d.ts +8 -5
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +2 -0
- package/dist/schema.js.map +1 -1
- package/dist/sync-provider.d.ts +66 -0
- package/dist/sync-provider.d.ts.map +1 -0
- package/dist/sync-provider.js +125 -0
- package/dist/sync-provider.js.map +1 -0
- package/dist/types.js +1 -1
- package/dist/types.js.map +1 -1
- package/dist/worker-plugin.d.ts +45 -0
- package/dist/worker-plugin.d.ts.map +1 -0
- package/dist/worker-plugin.js +166 -0
- package/dist/worker-plugin.js.map +1 -0
- package/package.json +1 -1
package/dist/browser.d.ts
CHANGED
package/dist/browser.d.ts.map
CHANGED
|
@@ -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
package/dist/browser.js.map
CHANGED
|
@@ -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.
|
|
14
|
-
* 3. Default: ~/.config/
|
|
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.
|
|
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/
|
|
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 `
|
|
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
|
|
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;
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,kBAAkB,
|
|
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", "
|
|
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.
|
|
21
|
-
* 3. Default: ~/.config/
|
|
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.
|
|
27
|
-
return path.resolve(process.env.
|
|
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.
|
|
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/
|
|
61
|
+
* 3. Default: ~/.config/toduai/data
|
|
37
62
|
*/
|
|
38
63
|
export function resolveDataDir(configPath, config) {
|
|
39
|
-
// Env var takes precedence (
|
|
40
|
-
if (process.env.
|
|
41
|
-
return path.resolve(process.env.
|
|
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 `
|
|
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.
|
|
62
|
-
configSource = "
|
|
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.
|
|
71
|
-
dataDirSource = "
|
|
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
|
|
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.
|
|
90
|
-
return path.resolve(process.env.
|
|
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
|
}
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,+EAA+E;AAC/E,kCAAkC;AAClC,EAAE;AACF,8DAA8D;AAC9D,gDAAgD;AAChD,EAAE;AACF,uEAAuE;AACvE,0DAA0D;AAC1D,+EAA+E;AAE/E,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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 (
|
|
59
|
-
*
|
|
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
|
-
/**
|
|
66
|
+
/** Notes for this bucket */
|
|
64
67
|
notes: Note[];
|
|
65
68
|
}
|
|
66
69
|
/**
|
package/dist/schema.d.ts.map
CHANGED
|
@@ -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,
|
|
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
package/dist/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"
|
|
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":"AAAA,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAS/E,MAAM,UAAU,YAAY,CAAC,EAAU,EAAU;IAC/C,OAAO,EAAY,CAAC;AAAA,CACrB;AAED,MAAM,UAAU,eAAe,CAAC,EAAU,EAAa;IACrD,OAAO,EAAe,CAAC;AAAA,CACxB;AAED,MAAM,UAAU,aAAa,CAAC,EAAU,EAAW;IACjD,OAAO,EAAa,CAAC;AAAA,CACtB;AAED,MAAM,UAAU,YAAY,CAAC,EAAU,EAAU;IAC/C,OAAO,EAAY,CAAC;AAAA,CACrB;AAED,MAAM,UAAU,aAAa,CAAC,EAAU,EAAW;IACjD,OAAO,EAAa,CAAC;AAAA,CACtB;AAED,MAAM,UAAU,iBAAiB,CAAC,EAAU,EAAe;IACzD,OAAO,EAAiB,CAAC;AAAA,CAC1B;AAED,+EAA+E;AAC/E,wBAAwB;AACxB,+EAA+E;AAE/E,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,CAAU,CAAC;AAG9F,MAAM,UAAU,YAAY,CAAC,KAAa,EAAuB;IAC/D,OAAQ,aAAmC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAAA,CAC7D;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAU,CAAC;AAGlE,MAAM,UAAU,cAAc,CAAC,KAAa,EAAyB;IACnE,OAAQ,eAAqC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAAA,CAC/D;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAU,CAAC;AAGxE,MAAM,UAAU,eAAe,CAAC,KAAa,EAA0B;IACrE,OAAQ,gBAAsC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAAA,CAChE;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAU,CAAC;AAGlF,MAAM,UAAU,cAAc,CAAC,KAAa,EAAyB;IACnE,OAAQ,eAAqC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAAA,CAC/D;AAQD,MAAM,UAAU,EAAE,CAAI,KAAQ,EAAoB;IAChD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAAA,CAC5B;AAED,MAAM,UAAU,GAAG,CAAI,KAAQ,EAAoB;IACjD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAAA,CAC7B;AAyBD,MAAM,UAAU,QAAQ,CAAC,MAAc,EAAE,EAAU,EAAiB;IAClE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AAAA,CAC1C;AAED,MAAM,UAAU,eAAe,CAAC,KAAa,EAAE,OAAe,EAAmB;IAC/E,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAAA,CAC/C;AAED,MAAM,UAAU,YAAY,CAAC,OAAe,EAAgB;IAC1D,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;AAAA,CACrC;AA6DD,+EAA+E;AAC/E,
|
|
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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"}
|