@hasna/todos 0.11.75 → 0.11.81
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/README.md +8 -0
- package/dist/cli/cloud-router.d.ts +71 -0
- package/dist/cli/cloud-router.d.ts.map +1 -0
- package/dist/cli/commands/project-commands.d.ts.map +1 -1
- package/dist/cli/commands/storage-commands.d.ts.map +1 -1
- package/dist/cli/commands/task-commands.d.ts.map +1 -1
- package/dist/cli/helpers.d.ts +22 -0
- package/dist/cli/helpers.d.ts.map +1 -1
- package/dist/cli/index.js +72374 -62374
- package/dist/contracts.js +314 -14
- package/dist/db/database.d.ts.map +1 -1
- package/dist/index.js +1158 -236
- package/dist/lib/shadow-status.d.ts +38 -0
- package/dist/lib/shadow-status.d.ts.map +1 -0
- package/dist/mcp/index.js +10249 -340
- package/dist/mcp/tools/task-adv-tools.d.ts.map +1 -1
- package/dist/mcp/tools/task-crud.d.ts.map +1 -1
- package/dist/mcp/tools/task-project-tools.d.ts.map +1 -1
- package/dist/mcp/tools/task-workflow-tools.d.ts.map +1 -1
- package/dist/registry.js +314 -14
- package/dist/release-provenance.json +3 -3
- package/dist/sdk/index.d.ts +2 -0
- package/dist/sdk/index.d.ts.map +1 -1
- package/dist/sdk/index.js +135 -0
- package/dist/sdk/v1.generated.d.ts +124 -0
- package/dist/sdk/v1.generated.d.ts.map +1 -0
- package/dist/server/cloud.d.ts +50 -0
- package/dist/server/cloud.d.ts.map +1 -0
- package/dist/server/index.js +11944 -2012
- package/dist/server/openapi.d.ts +628 -0
- package/dist/server/openapi.d.ts.map +1 -0
- package/dist/server/serve.d.ts.map +1 -1
- package/dist/server/v1.d.ts +19 -0
- package/dist/server/v1.d.ts.map +1 -0
- package/dist/storage/cloud-client.d.ts +30 -0
- package/dist/storage/cloud-client.d.ts.map +1 -0
- package/dist/storage/config.d.ts +12 -0
- package/dist/storage/config.d.ts.map +1 -1
- package/dist/storage/factory.d.ts +2 -0
- package/dist/storage/factory.d.ts.map +1 -1
- package/dist/storage/index.d.ts +8 -1
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/postgres-adapter.d.ts.map +1 -1
- package/dist/storage/postgres-sync.d.ts.map +1 -1
- package/dist/storage/shadow-outbox-schema.d.ts +21 -0
- package/dist/storage/shadow-outbox-schema.d.ts.map +1 -0
- package/dist/storage/shadow-outbox.d.ts +125 -0
- package/dist/storage/shadow-outbox.d.ts.map +1 -0
- package/dist/storage/shadow-runtime.d.ts +29 -0
- package/dist/storage/shadow-runtime.d.ts.map +1 -0
- package/dist/storage/shadow.d.ts +118 -0
- package/dist/storage/shadow.d.ts.map +1 -0
- package/dist/storage.d.ts +2 -1
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +1157 -220
- package/package.json +6 -2
- package/vendor/hasna-contracts-0.5.1.tgz +0 -0
package/dist/storage/config.d.ts
CHANGED
|
@@ -30,6 +30,7 @@ export interface TodosStorageConfig {
|
|
|
30
30
|
}
|
|
31
31
|
export declare const TODOS_STORAGE_ENV: {
|
|
32
32
|
readonly mode: "HASNA_TODOS_STORAGE_MODE";
|
|
33
|
+
readonly shadow: "HASNA_TODOS_SHADOW";
|
|
33
34
|
readonly databaseUrl: "HASNA_TODOS_DATABASE_URL";
|
|
34
35
|
readonly databaseSsl: "HASNA_TODOS_DATABASE_SSL";
|
|
35
36
|
readonly databaseSchema: "HASNA_TODOS_DATABASE_SCHEMA";
|
|
@@ -46,6 +47,7 @@ export declare const TODOS_STORAGE_ENV: {
|
|
|
46
47
|
};
|
|
47
48
|
export declare const TODOS_STORAGE_FALLBACK_ENV: {
|
|
48
49
|
readonly mode: "TODOS_STORAGE_MODE";
|
|
50
|
+
readonly shadow: "TODOS_SHADOW";
|
|
49
51
|
readonly databaseUrl: "TODOS_DATABASE_URL";
|
|
50
52
|
readonly databaseSsl: "TODOS_DATABASE_SSL";
|
|
51
53
|
readonly databaseSchema: "TODOS_DATABASE_SCHEMA";
|
|
@@ -78,6 +80,16 @@ export declare function assertTodosRemoteStorageConfig(config: TodosStorageConfi
|
|
|
78
80
|
export declare function parseStorageMode(value: string | undefined): TodosStorageMode;
|
|
79
81
|
export declare function getTodosStorageMode(env?: TodosStorageEnv): TodosStorageMode;
|
|
80
82
|
export declare function getStorageMode(env?: TodosStorageEnv): TodosStorageMode;
|
|
83
|
+
/**
|
|
84
|
+
* Dual-write shadow mode. When enabled, local SQLite stays the sole source of
|
|
85
|
+
* truth for reads AND writes; every successful local write is asynchronously
|
|
86
|
+
* mirrored to the remote Postgres sync tables (fire-and-forget with retries).
|
|
87
|
+
* NOTHING is ever read from the remote store while shadow mode is active — it
|
|
88
|
+
* is a pure pre-cutover mirror for validating divergence, per Amendment A1.
|
|
89
|
+
*/
|
|
90
|
+
export declare function isTodosShadowEnabled(env?: TodosStorageEnv): boolean;
|
|
91
|
+
export declare function getTodosStorageShadowEnvName(env?: TodosStorageEnv): string;
|
|
92
|
+
export declare function assertTodosShadowConfig(config: TodosStorageConfig, env?: TodosStorageEnv): void;
|
|
81
93
|
export declare function getTodosStorageDatabaseEnv(env?: TodosStorageEnv): string;
|
|
82
94
|
export declare function getStorageDatabaseEnv(env?: TodosStorageEnv): string;
|
|
83
95
|
export declare function getTodosStorageDatabaseUrl(env?: TodosStorageEnv): string | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/storage/config.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE7D,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAEjE,eAAO,MAAM,oBAAoB,uDAGvB,CAAC;AAEX,eAAO,MAAM,cAAc,uDAAuB,CAAC;AAEnD,MAAM,MAAM,iBAAiB,GAAG,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC;AAEpE,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,UAAU,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,IAAI,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,gBAAgB,CAAC;IACvB,QAAQ,CAAC,EAAE,0BAA0B,CAAC;IACtC,aAAa,CAAC,EAAE,oBAAoB,CAAC;IACrC,IAAI,EAAE,eAAe,CAAC;CACvB;AAED,eAAO,MAAM,iBAAiB
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/storage/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import type { TodosStorageAdapter } from "./interfaces.js";
|
|
|
2
2
|
import { type CreateLocalSqliteTodosStorageAdapterOptions } from "./local-sqlite.js";
|
|
3
3
|
import { type CreateHybridTodosStorageAdapterOptions } from "./hybrid.js";
|
|
4
4
|
import type { PostgresTodosSyncStore, TodosPostgresQueryClient } from "./postgres-sync.js";
|
|
5
|
+
import { type CreateShadowTodosStorageAdapterOptions } from "./shadow.js";
|
|
5
6
|
import { type TodosStorageConfig, type TodosStorageEnv } from "./config.js";
|
|
6
7
|
export interface CreateTodosStorageAdapterOptions {
|
|
7
8
|
config?: TodosStorageConfig;
|
|
@@ -12,6 +13,7 @@ export interface CreateTodosStorageAdapterOptions {
|
|
|
12
13
|
postgresClient?: TodosPostgresQueryClient;
|
|
13
14
|
postgresSyncStore?: PostgresTodosSyncStore;
|
|
14
15
|
hybrid?: Omit<CreateHybridTodosStorageAdapterOptions, "local" | "postgresClient" | "syncStore">;
|
|
16
|
+
shadow?: Omit<CreateShadowTodosStorageAdapterOptions, "local" | "localAdapter" | "postgresClient" | "syncStore">;
|
|
15
17
|
}
|
|
16
18
|
export declare function createTodosStorageAdapter(options?: CreateTodosStorageAdapterOptions): TodosStorageAdapter;
|
|
17
19
|
//# sourceMappingURL=factory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/storage/factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAwC,KAAK,2CAA2C,EAAE,MAAM,mBAAmB,CAAC;AAC3H,OAAO,EAEL,KAAK,sCAAsC,EAC5C,MAAM,aAAa,CAAC;AAErB,OAAO,KAAK,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC3F,OAAO,
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/storage/factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAwC,KAAK,2CAA2C,EAAE,MAAM,mBAAmB,CAAC;AAC3H,OAAO,EAEL,KAAK,sCAAsC,EAC5C,MAAM,aAAa,CAAC;AAErB,OAAO,KAAK,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC3F,OAAO,EAEL,KAAK,sCAAsC,EAC5C,MAAM,aAAa,CAAC;AAErB,OAAO,EAKL,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACrB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,gCAAgC;IAC/C,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,GAAG,CAAC,EAAE,eAAe,CAAC;IACtB,KAAK,CAAC,EAAE,2CAA2C,CAAC;IACpD,aAAa,CAAC,EAAE,mBAAmB,CAAC;IACpC,aAAa,CAAC,EAAE,mBAAmB,CAAC;IACpC,cAAc,CAAC,EAAE,wBAAwB,CAAC;IAC1C,iBAAiB,CAAC,EAAE,sBAAsB,CAAC;IAC3C,MAAM,CAAC,EAAE,IAAI,CAAC,sCAAsC,EAAE,OAAO,GAAG,gBAAgB,GAAG,WAAW,CAAC,CAAC;IAChG,MAAM,CAAC,EAAE,IAAI,CAAC,sCAAsC,EAAE,OAAO,GAAG,cAAc,GAAG,gBAAgB,GAAG,WAAW,CAAC,CAAC;CAClH;AAED,wBAAgB,yBAAyB,CAAC,OAAO,GAAE,gCAAqC,GAAG,mBAAmB,CAqB7G"}
|
package/dist/storage/index.d.ts
CHANGED
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
export type { MaybePromise, ActiveWorkItem, TodosActiveWorkFilter, TodosAgentUpdateInput, TodosAgentStore, TodosAuditStore, TodosPlanStore, TodosProjectStore, TodosStorageAdapter, TodosStorageCapabilities, TodosStorageContext, TodosStorageImportResult, TodosStorageKind, TodosStorageSnapshot, TodosSyncStore, TodosTaskClaimFilter, TodosTaskCompletionOptions, TodosTaskFailureOptions, TodosTaskFailureResult, TodosTaskListStore, TodosTaskStore, TodosTemplateStore, UpdateTemplateInput, } from "./interfaces.js";
|
|
2
|
-
export { CANONICAL_TODOS_RDS_CLUSTER, CANONICAL_TODOS_RDS_DATABASE, CANONICAL_TODOS_RDS_RUNTIME_PATH, STORAGE_TABLES, TODOS_STORAGE_ENV, TODOS_STORAGE_FALLBACK_ENV, TODOS_STORAGE_TABLES, assertTodosRemoteStorageConfig, getCanonicalTodosRdsConfig, getStorageDatabaseEnv, getStorageDatabaseUrl, getStorageMode, getTodosStorageDatabaseEnv, getTodosStorageDatabaseUrl, getTodosStorageEnvName, getTodosStorageMode, isTodosRemoteStorageEnabled, loadStorageConfig, loadTodosStorageConfig, parseStorageMode, } from "./config.js";
|
|
2
|
+
export { CANONICAL_TODOS_RDS_CLUSTER, CANONICAL_TODOS_RDS_DATABASE, CANONICAL_TODOS_RDS_RUNTIME_PATH, STORAGE_TABLES, TODOS_STORAGE_ENV, TODOS_STORAGE_FALLBACK_ENV, TODOS_STORAGE_TABLES, assertTodosRemoteStorageConfig, assertTodosShadowConfig, getCanonicalTodosRdsConfig, getTodosStorageShadowEnvName, isTodosShadowEnabled, getStorageDatabaseEnv, getStorageDatabaseUrl, getStorageMode, getTodosStorageDatabaseEnv, getTodosStorageDatabaseUrl, getTodosStorageEnvName, getTodosStorageMode, isTodosRemoteStorageEnabled, loadStorageConfig, loadTodosStorageConfig, parseStorageMode, } from "./config.js";
|
|
3
3
|
export type { CanonicalTodosRdsConfig, TodosPostgresStorageConfig, TodosS3StorageConfig, TodosStorageConfig, TodosStorageEnv, TodosStorageMode, TodosStorageTable, TodosSyncConfig, } from "./config.js";
|
|
4
4
|
export { createTodosStorageAdapter } from "./factory.js";
|
|
5
5
|
export type { CreateTodosStorageAdapterOptions } from "./factory.js";
|
|
6
|
+
export { TodosShadowMirror, createShadowTodosStorageAdapter, } from "./shadow.js";
|
|
7
|
+
export type { CreateShadowTodosStorageAdapterOptions, ShadowTodosStorageAdapter, TodosShadowMirrorEvent, TodosShadowMirrorMetrics, } from "./shadow.js";
|
|
8
|
+
export { TodosShadowOutbox, createTodosShadowOutbox, installShadowOutboxSchema, SHADOW_TRIGGER_TABLES, } from "./shadow-outbox.js";
|
|
9
|
+
export type { CreateTodosShadowOutboxOptions, TodosShadowOutboxEvent, TodosShadowOutboxStats, } from "./shadow-outbox.js";
|
|
10
|
+
export { maybeInstallShadowCapture, getRuntimeShadowOutbox, startRuntimeShadowDrain, registerShadowExitFlush, closeRuntimeShadowCloud, } from "./shadow-runtime.js";
|
|
11
|
+
export { createTodosCloudQueryClient, createTodosCloudQueryClientFromEnv, } from "./cloud-client.js";
|
|
12
|
+
export type { CreateTodosCloudQueryClientOptions, TodosCloudQueryClient, } from "./cloud-client.js";
|
|
6
13
|
export { createHybridTodosStorageAdapter } from "./hybrid.js";
|
|
7
14
|
export type { CreateHybridTodosStorageAdapterOptions, HybridTodosRemoteSync, HybridTodosStorageAdapter, HybridTodosStorageSyncResult, } from "./hybrid.js";
|
|
8
15
|
export { createLocalSqliteTodosStorageAdapter } from "./local-sqlite.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,YAAY,EACZ,cAAc,EACd,qBAAqB,EACrB,qBAAqB,EACrB,eAAe,EACf,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,wBAAwB,EACxB,mBAAmB,EACnB,wBAAwB,EACxB,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,EACd,oBAAoB,EACpB,0BAA0B,EAC1B,uBAAuB,EACvB,sBAAsB,EACtB,kBAAkB,EAClB,cAAc,EACd,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,2BAA2B,EAC3B,4BAA4B,EAC5B,gCAAgC,EAChC,cAAc,EACd,iBAAiB,EACjB,0BAA0B,EAC1B,oBAAoB,EACpB,8BAA8B,EAC9B,0BAA0B,EAC1B,qBAAqB,EACrB,qBAAqB,EACrB,cAAc,EACd,0BAA0B,EAC1B,0BAA0B,EAC1B,sBAAsB,EACtB,mBAAmB,EACnB,2BAA2B,EAC3B,iBAAiB,EACjB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,uBAAuB,EACvB,0BAA0B,EAC1B,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,GAChB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACzD,YAAY,EAAE,gCAAgC,EAAE,MAAM,cAAc,CAAC;AACrE,OAAO,EAAE,+BAA+B,EAAE,MAAM,aAAa,CAAC;AAC9D,YAAY,EACV,sCAAsC,EACtC,qBAAqB,EACrB,yBAAyB,EACzB,4BAA4B,GAC7B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,oCAAoC,EAAE,MAAM,mBAAmB,CAAC;AACzE,YAAY,EAAE,2CAA2C,EAAE,MAAM,mBAAmB,CAAC;AACrF,OAAO,EACL,gCAAgC,EAChC,gCAAgC,GACjC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,mCAAmC,EACnC,iCAAiC,EACjC,sBAAsB,EACtB,4BAA4B,EAC5B,0BAA0B,GAC3B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,iCAAiC,EAAE,MAAM,uBAAuB,CAAC;AAC1E,YAAY,EAAE,wCAAwC,EAAE,MAAM,uBAAuB,CAAC;AACtF,YAAY,EACV,mCAAmC,EACnC,2BAA2B,EAC3B,gCAAgC,EAChC,wBAAwB,EACxB,wBAAwB,EACxB,0BAA0B,EAC1B,2BAA2B,GAC5B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,0BAA0B,EAC1B,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,2BAA2B,EAC3B,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,0BAA0B,EAC1B,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,iCAAiC,EACjC,6BAA6B,EAC7B,yBAAyB,EACzB,0BAA0B,EAC1B,wBAAwB,EACxB,0BAA0B,EAC1B,6BAA6B,GAC9B,MAAM,uBAAuB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgres-adapter.d.ts","sourceRoot":"","sources":["../../src/storage/postgres-adapter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"postgres-adapter.d.ts","sourceRoot":"","sources":["../../src/storage/postgres-adapter.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAIV,mBAAmB,EAUpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAIL,KAAK,wBAAwB,EAE9B,MAAM,oBAAoB,CAAC;AAI5B,MAAM,WAAW,wCAAwC;IACvD,MAAM,EAAE,wBAAwB,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAuBD,wBAAgB,iCAAiC,CAC/C,OAAO,EAAE,wCAAwC,GAChD,mBAAmB,CA6FrB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgres-sync.d.ts","sourceRoot":"","sources":["../../src/storage/postgres-sync.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,MAAM,2BAA2B,GACnC,OAAO,GACP,UAAU,GACV,uBAAuB,GACvB,OAAO,GACP,QAAQ,GACR,YAAY,GACZ,WAAW,GACX,eAAe,CAAC;AAEpB,MAAM,WAAW,wBAAwB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACnE,IAAI,EAAE,CAAC,EAAE,CAAC;CACX;AAED,MAAM,WAAW,wBAAwB;IACvC,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,SAAS,OAAO,EAAE,GAC1B,OAAO,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,mCAAmC;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,gCAAgC;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,2BAA2B,EAAE,CAAC;CAC7C;AAED,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,2BAA2B,EAAE,MAAM,CAAC,CAAC,CAAC;CACnE;AAED,MAAM,WAAW,0BAA0B;IACzC,WAAW,EAAE,2BAA2B,CAAC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IAClC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,eAAO,MAAM,iCAAiC,uBAAuB,CAAC;AACtE,eAAO,MAAM,mCAAmC,uBAAuB,CAAC;AAExE,wBAAgB,0BAA0B,CACxC,SAAS,SAAoC,EAC7C,eAAe,SAAsC,GACpD,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"postgres-sync.d.ts","sourceRoot":"","sources":["../../src/storage/postgres-sync.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,MAAM,2BAA2B,GACnC,OAAO,GACP,UAAU,GACV,uBAAuB,GACvB,OAAO,GACP,QAAQ,GACR,YAAY,GACZ,WAAW,GACX,eAAe,CAAC;AAEpB,MAAM,WAAW,wBAAwB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACnE,IAAI,EAAE,CAAC,EAAE,CAAC;CACX;AAED,MAAM,WAAW,wBAAwB;IACvC,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,SAAS,OAAO,EAAE,GAC1B,OAAO,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,mCAAmC;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,gCAAgC;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,2BAA2B,EAAE,CAAC;CAC7C;AAED,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,2BAA2B,EAAE,MAAM,CAAC,CAAC,CAAC;CACnE;AAED,MAAM,WAAW,0BAA0B;IACzC,WAAW,EAAE,2BAA2B,CAAC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IAClC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,eAAO,MAAM,iCAAiC,uBAAuB,CAAC;AACtE,eAAO,MAAM,mCAAmC,uBAAuB,CAAC;AAExE,wBAAgB,0BAA0B,CACxC,SAAS,SAAoC,EAC7C,eAAe,SAAsC,GACpD,MAAM,EAAE,CAgCV;AAED,qBAAa,sBAAsB;IAO/B,OAAO,CAAC,QAAQ,CAAC,MAAM;IANzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;gBAGtB,MAAM,EAAE,wBAAwB,EACjD,OAAO,GAAE,mCAAwC;IAU7C,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAM7B,YAAY,CAChB,QAAQ,EAAE,oBAAoB,EAC9B,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,2BAA2B,CAAC;IAsCjC,YAAY,CAAC,OAAO,GAAE,gCAAqC,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAsB3F,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAQ/C,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAU5D;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,wBAAwB,EAChC,OAAO,GAAE,mCAAwC,GAChD,sBAAsB,CAExB"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Database } from "bun:sqlite";
|
|
2
|
+
import type { TodosPostgresSyncRecordType } from "./postgres-sync.js";
|
|
3
|
+
/**
|
|
4
|
+
* Leaf module (imports only `bun:sqlite` + a type): the durable outbox DDL and
|
|
5
|
+
* capture triggers. Kept dependency-free so `getDatabase()` can install capture
|
|
6
|
+
* synchronously on the hot path without dragging in the storage-adapter chain
|
|
7
|
+
* (which would create an import cycle through `local-sqlite`).
|
|
8
|
+
*/
|
|
9
|
+
/** SQLite tables that carry shadow-mirrored domain objects. */
|
|
10
|
+
export declare const SHADOW_TRIGGER_TABLES: Array<{
|
|
11
|
+
table: string;
|
|
12
|
+
objectType: TodosPostgresSyncRecordType;
|
|
13
|
+
deletes: boolean;
|
|
14
|
+
}>;
|
|
15
|
+
/**
|
|
16
|
+
* Install the durable outbox table + capture triggers. Pure SQLite, no network,
|
|
17
|
+
* no cloud client required — this is the piece that makes the shadow capture
|
|
18
|
+
* EVERY local write path, and it is safe to run on every `getDatabase()` call.
|
|
19
|
+
*/
|
|
20
|
+
export declare function installShadowOutboxSchema(db: Database): void;
|
|
21
|
+
//# sourceMappingURL=shadow-outbox-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shadow-outbox-schema.d.ts","sourceRoot":"","sources":["../../src/storage/shadow-outbox-schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AAEtE;;;;;GAKG;AAEH,+DAA+D;AAC/D,eAAO,MAAM,qBAAqB,EAAE,KAAK,CAAC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,2BAA2B,CAAC;IACxC,OAAO,EAAE,OAAO,CAAC;CAClB,CASA,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI,CA4C5D"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import type { Database } from "bun:sqlite";
|
|
2
|
+
import { type PostgresTodosSyncStore, type TodosPostgresQueryClient } from "./postgres-sync.js";
|
|
3
|
+
import type { TodosStorageAdapter } from "./interfaces.js";
|
|
4
|
+
/**
|
|
5
|
+
* Durable, write-only dual-write shadow outbox.
|
|
6
|
+
*
|
|
7
|
+
* Unlike the in-memory {@link TodosShadowMirror}, this outbox persists pending
|
|
8
|
+
* mirror operations in a local SQLite table (`shadow_outbox`) and captures
|
|
9
|
+
* EVERY local write via SQLite AFTER INSERT/UPDATE/DELETE triggers — no matter
|
|
10
|
+
* which code path performed it (CLI, MCP, HTTP serve, or raw `src/db/*` SQL).
|
|
11
|
+
* That makes the shadow "real" for all write paths without refactoring the
|
|
12
|
+
* hundreds of direct-SQL call sites onto the storage adapter.
|
|
13
|
+
*
|
|
14
|
+
* Semantics (sanctioned Amendment A1 shadow exception):
|
|
15
|
+
* - One-way, write-only. Reads are always served from local SQLite.
|
|
16
|
+
* - The remote store is never read on the runtime path.
|
|
17
|
+
* - Unreachable cloud DEFERS (rows stay pending with exponential backoff)
|
|
18
|
+
* instead of dropping — durability survives process kill/restart because the
|
|
19
|
+
* queue lives in the same SQLite file as the data it mirrors.
|
|
20
|
+
*
|
|
21
|
+
* This is NOT a sync engine: it never pulls, never reconciles remote->local,
|
|
22
|
+
* and never mutates local state from the cloud.
|
|
23
|
+
*/
|
|
24
|
+
export { installShadowOutboxSchema, SHADOW_TRIGGER_TABLES } from "./shadow-outbox-schema.js";
|
|
25
|
+
export interface TodosShadowOutboxStats {
|
|
26
|
+
enabled: true;
|
|
27
|
+
durable: true;
|
|
28
|
+
/** Rows still awaiting a successful mirror push. */
|
|
29
|
+
pending: number;
|
|
30
|
+
/** Rows that exhausted retries and are parked (divergence source). */
|
|
31
|
+
failed: number;
|
|
32
|
+
/** Total outbox depth (pending + failed). */
|
|
33
|
+
depth: number;
|
|
34
|
+
/** Ops confirmed mirrored to the cloud since this process started. */
|
|
35
|
+
mirrored: number;
|
|
36
|
+
/** Individual push attempts that failed since this process started. */
|
|
37
|
+
retries: number;
|
|
38
|
+
/** ISO timestamp of the last successful mirror write. */
|
|
39
|
+
lastMirrorAt: string | null;
|
|
40
|
+
/** Milliseconds between enqueue and confirmed mirror for the last op. */
|
|
41
|
+
lastLagMs: number | null;
|
|
42
|
+
/** Last mirror error message (never a DSN — callers redact if needed). */
|
|
43
|
+
lastError: string | null;
|
|
44
|
+
/** Whether the background drain loop is running in this process. */
|
|
45
|
+
draining: boolean;
|
|
46
|
+
}
|
|
47
|
+
export interface CreateTodosShadowOutboxOptions {
|
|
48
|
+
db: Database;
|
|
49
|
+
/** Pre-built sync store, or provide `postgresClient` to build one. */
|
|
50
|
+
syncStore?: PostgresTodosSyncStore;
|
|
51
|
+
postgresClient?: TodosPostgresQueryClient;
|
|
52
|
+
sourceMachineId?: string;
|
|
53
|
+
/** Local adapter used to re-read the current row for upserts. */
|
|
54
|
+
localAdapter?: TodosStorageAdapter;
|
|
55
|
+
/** Retry attempts per op before it is parked as `failed`. Default 8. */
|
|
56
|
+
maxRetries?: number;
|
|
57
|
+
/** Base backoff in ms (exponential, capped at 5 min). Default 500ms. */
|
|
58
|
+
retryBaseMs?: number;
|
|
59
|
+
/** Rows processed per drain pass. Default 50. */
|
|
60
|
+
batchSize?: number;
|
|
61
|
+
/** Ensure the remote sync schema exists before the first push. Default true. */
|
|
62
|
+
ensureSchema?: boolean;
|
|
63
|
+
onEvent?: (event: TodosShadowOutboxEvent) => void;
|
|
64
|
+
}
|
|
65
|
+
export type TodosShadowOutboxEvent = {
|
|
66
|
+
type: "mirrored";
|
|
67
|
+
objectType: string;
|
|
68
|
+
id: string;
|
|
69
|
+
lagMs: number;
|
|
70
|
+
} | {
|
|
71
|
+
type: "retry";
|
|
72
|
+
objectType: string;
|
|
73
|
+
id: string;
|
|
74
|
+
attempt: number;
|
|
75
|
+
error: string;
|
|
76
|
+
} | {
|
|
77
|
+
type: "parked";
|
|
78
|
+
objectType: string;
|
|
79
|
+
id: string;
|
|
80
|
+
error: string;
|
|
81
|
+
};
|
|
82
|
+
export declare class TodosShadowOutbox {
|
|
83
|
+
private readonly db;
|
|
84
|
+
private readonly syncStore;
|
|
85
|
+
private readonly local;
|
|
86
|
+
private readonly maxRetries;
|
|
87
|
+
private readonly retryBaseMs;
|
|
88
|
+
private readonly batchSize;
|
|
89
|
+
private readonly onEvent?;
|
|
90
|
+
private schemaReady;
|
|
91
|
+
private loopTimer;
|
|
92
|
+
private draining;
|
|
93
|
+
private metrics;
|
|
94
|
+
constructor(options: CreateTodosShadowOutboxOptions);
|
|
95
|
+
/**
|
|
96
|
+
* Create the durable outbox table and install capture triggers. Idempotent —
|
|
97
|
+
* safe to call on every process start. Only touches SQLite (no network).
|
|
98
|
+
*/
|
|
99
|
+
install(): void;
|
|
100
|
+
getStats(): TodosShadowOutboxStats;
|
|
101
|
+
private countByStatus;
|
|
102
|
+
/** Start a background drain loop. Safe to call once per long-running process. */
|
|
103
|
+
startLoop(intervalMs?: number): void;
|
|
104
|
+
stopLoop(): void;
|
|
105
|
+
/**
|
|
106
|
+
* Drain the queue until it is empty (no due rows) or a deadline elapses. Used
|
|
107
|
+
* on CLI exit and by `todos storage shadow-drain`.
|
|
108
|
+
*/
|
|
109
|
+
flush(timeoutMs?: number): Promise<TodosShadowOutboxStats>;
|
|
110
|
+
/**
|
|
111
|
+
* Process one batch of due rows. Returns the number of rows attempted. Never
|
|
112
|
+
* throws — push failures defer the row with backoff.
|
|
113
|
+
*/
|
|
114
|
+
drainOnce(): Promise<number>;
|
|
115
|
+
private processRow;
|
|
116
|
+
private buildSnapshot;
|
|
117
|
+
private readCurrent;
|
|
118
|
+
private tombstone;
|
|
119
|
+
private ensureSchema;
|
|
120
|
+
}
|
|
121
|
+
export interface CreateTodosShadowOutboxResult {
|
|
122
|
+
outbox: TodosShadowOutbox;
|
|
123
|
+
}
|
|
124
|
+
export declare function createTodosShadowOutbox(options: CreateTodosShadowOutboxOptions): TodosShadowOutbox;
|
|
125
|
+
//# sourceMappingURL=shadow-outbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shadow-outbox.d.ts","sourceRoot":"","sources":["../../src/storage/shadow-outbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Database } from "bun:sqlite";
|
|
2
|
+
import { type TodosStorageEnv } from "./config.js";
|
|
3
|
+
import { TodosShadowOutbox } from "./shadow-outbox.js";
|
|
4
|
+
/**
|
|
5
|
+
* Install durable capture triggers if the shadow is enabled. Pure SQLite, never
|
|
6
|
+
* throws for cloud-config reasons, never keeps the process alive. Idempotent.
|
|
7
|
+
*/
|
|
8
|
+
export declare function maybeInstallShadowCapture(db: Database, env?: TodosStorageEnv): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Build (or reuse) the process-wide shadow outbox bound to `db`. Requires a
|
|
11
|
+
* cloud DSN — throws a clear error if the shadow is enabled without one, rather
|
|
12
|
+
* than silently no-oping. Capture (local durability) does NOT depend on this.
|
|
13
|
+
*/
|
|
14
|
+
export declare function getRuntimeShadowOutbox(db: Database, env?: TodosStorageEnv): TodosShadowOutbox;
|
|
15
|
+
/**
|
|
16
|
+
* Start the background drain loop for a long-running process (MCP / serve).
|
|
17
|
+
* Safe no-op when the shadow is disabled. Never throws — a missing DSN or an
|
|
18
|
+
* unreachable cloud simply leaves writes durably queued in the local outbox.
|
|
19
|
+
*/
|
|
20
|
+
export declare function startRuntimeShadowDrain(db: Database, env?: TodosStorageEnv): void;
|
|
21
|
+
/**
|
|
22
|
+
* Best-effort flush of the durable outbox on process exit (CLI one-shots).
|
|
23
|
+
* Registered idempotently; the local writes are already durable regardless.
|
|
24
|
+
*/
|
|
25
|
+
export declare function registerShadowExitFlush(db: Database, env?: TodosStorageEnv): void;
|
|
26
|
+
export declare function closeRuntimeShadowCloud(): Promise<void>;
|
|
27
|
+
/** Test-only reset of the module singletons. */
|
|
28
|
+
export declare function __resetRuntimeShadowForTests(): void;
|
|
29
|
+
//# sourceMappingURL=shadow-runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shadow-runtime.d.ts","sourceRoot":"","sources":["../../src/storage/shadow-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAkF,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnI,OAAO,EACL,iBAAiB,EAElB,MAAM,oBAAoB,CAAC;AAmB5B;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,GAAE,eAA6B,GAAG,OAAO,CAMnG;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,GAAE,eAA6B,GAAG,iBAAiB,CAkB1G;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,GAAE,eAA6B,GAAG,IAAI,CAc9F;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,GAAE,eAA6B,GAAG,IAAI,CAe9F;AAED,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC,CAM7D;AAED,gDAAgD;AAChD,wBAAgB,4BAA4B,IAAI,IAAI,CAMnD"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import type { Agent, Plan, Project, Task, TaskHistory, TaskList, TaskTemplate } from "../types/index.js";
|
|
2
|
+
import { type CreateLocalSqliteTodosStorageAdapterOptions } from "./local-sqlite.js";
|
|
3
|
+
import { type PostgresTodosSyncStore, type TodosPostgresQueryClient, type TodosPostgresSyncRecordType } from "./postgres-sync.js";
|
|
4
|
+
import type { TodosStorageAdapter, TodosStorageContext } from "./interfaces.js";
|
|
5
|
+
/**
|
|
6
|
+
* Object types the shadow mirror forwards. Comments are intentionally excluded:
|
|
7
|
+
* the sync snapshot has no comment channel, so they stay local-only during the
|
|
8
|
+
* shadow phase (documented gap; validated data is tasks/projects/plans/agents/
|
|
9
|
+
* task-lists/templates and audit history).
|
|
10
|
+
*/
|
|
11
|
+
type ShadowSnapshotKey = "tasks" | "projects" | "plans" | "agents" | "taskLists" | "templates" | "auditHistory";
|
|
12
|
+
export interface TodosShadowMirrorMetrics {
|
|
13
|
+
enabled: true;
|
|
14
|
+
/** Ops accepted into the mirror queue (one per successful local write). */
|
|
15
|
+
enqueued: number;
|
|
16
|
+
/** Ops successfully written to the remote sync tables. */
|
|
17
|
+
mirrored: number;
|
|
18
|
+
/** Individual push attempts that failed (includes retries). */
|
|
19
|
+
retries: number;
|
|
20
|
+
/** Ops permanently dropped after exhausting retries — the divergence source. */
|
|
21
|
+
failed: number;
|
|
22
|
+
/**
|
|
23
|
+
* Divergence counter: ops that were written locally but never confirmed in
|
|
24
|
+
* the cloud (currently == `failed`, plus anything still queued on shutdown).
|
|
25
|
+
*/
|
|
26
|
+
divergence: number;
|
|
27
|
+
/** Ops still waiting in the queue. */
|
|
28
|
+
pending: number;
|
|
29
|
+
/** Whether the mirror worker is actively draining. */
|
|
30
|
+
inFlight: boolean;
|
|
31
|
+
/** ISO timestamp of the last successful mirror write. */
|
|
32
|
+
lastMirrorAt: string | null;
|
|
33
|
+
/** Milliseconds between the local write and its confirmed mirror. */
|
|
34
|
+
lastLagMs: number | null;
|
|
35
|
+
/** Last mirror error message (redaction is the caller's responsibility). */
|
|
36
|
+
lastError: string | null;
|
|
37
|
+
}
|
|
38
|
+
export interface CreateShadowTodosStorageAdapterOptions {
|
|
39
|
+
localAdapter?: TodosStorageAdapter;
|
|
40
|
+
local?: CreateLocalSqliteTodosStorageAdapterOptions;
|
|
41
|
+
syncStore?: PostgresTodosSyncStore;
|
|
42
|
+
postgresClient?: TodosPostgresQueryClient;
|
|
43
|
+
sourceMachineId?: string;
|
|
44
|
+
/** Retry attempts per op before it is counted as divergence. Default 5. */
|
|
45
|
+
maxRetries?: number;
|
|
46
|
+
/** Base backoff in ms (exponential). Default 250ms. */
|
|
47
|
+
retryBaseMs?: number;
|
|
48
|
+
/** Ensure the remote sync schema exists before the first push. Default true. */
|
|
49
|
+
ensureSchema?: boolean;
|
|
50
|
+
/** Sink for mirror lifecycle diagnostics (defaults to silent). */
|
|
51
|
+
onEvent?: (event: TodosShadowMirrorEvent) => void;
|
|
52
|
+
}
|
|
53
|
+
export type TodosShadowMirrorEvent = {
|
|
54
|
+
type: "mirrored";
|
|
55
|
+
objectType: string;
|
|
56
|
+
id: string;
|
|
57
|
+
lagMs: number;
|
|
58
|
+
} | {
|
|
59
|
+
type: "retry";
|
|
60
|
+
objectType: string;
|
|
61
|
+
id: string;
|
|
62
|
+
attempt: number;
|
|
63
|
+
error: string;
|
|
64
|
+
} | {
|
|
65
|
+
type: "dropped";
|
|
66
|
+
objectType: string;
|
|
67
|
+
id: string;
|
|
68
|
+
error: string;
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Fire-and-forget mirror queue: single-flight worker, bounded retries, and a
|
|
72
|
+
* divergence counter for ops that never made it to the cloud. Enqueue calls
|
|
73
|
+
* never throw and never block the local write path.
|
|
74
|
+
*/
|
|
75
|
+
export declare class TodosShadowMirror {
|
|
76
|
+
private readonly queue;
|
|
77
|
+
private readonly syncStore;
|
|
78
|
+
private readonly maxRetries;
|
|
79
|
+
private readonly retryBaseMs;
|
|
80
|
+
private readonly onEvent?;
|
|
81
|
+
private schemaReady;
|
|
82
|
+
private pumping;
|
|
83
|
+
private scheduledRetries;
|
|
84
|
+
private idleResolvers;
|
|
85
|
+
private metrics;
|
|
86
|
+
constructor(options: CreateShadowTodosStorageAdapterOptions);
|
|
87
|
+
getMetrics(): TodosShadowMirrorMetrics;
|
|
88
|
+
enqueueUpsert(key: ShadowSnapshotKey, record: unknown, context?: TodosStorageContext): void;
|
|
89
|
+
enqueueDelete(objectType: TodosPostgresSyncRecordType, id: string, context?: TodosStorageContext): void;
|
|
90
|
+
/** Resolve once the queue and all scheduled retries are fully drained. */
|
|
91
|
+
flush(): Promise<void>;
|
|
92
|
+
private idle;
|
|
93
|
+
private notifyIdle;
|
|
94
|
+
private pump;
|
|
95
|
+
private drain;
|
|
96
|
+
private process;
|
|
97
|
+
private ensureSchema;
|
|
98
|
+
private push;
|
|
99
|
+
}
|
|
100
|
+
export interface ShadowTodosStorageAdapter extends TodosStorageAdapter {
|
|
101
|
+
readonly shadow: TodosShadowMirror;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Wrap a local SQLite adapter so that every successful local write is also
|
|
105
|
+
* mirrored (asynchronously, fire-and-forget) to the remote Postgres sync
|
|
106
|
+
* tables. Reads and writes are served entirely by local storage — the remote
|
|
107
|
+
* store is never read from in shadow mode.
|
|
108
|
+
*/
|
|
109
|
+
export declare function createShadowTodosStorageAdapter(options: CreateShadowTodosStorageAdapterOptions): ShadowTodosStorageAdapter;
|
|
110
|
+
export type ShadowMirroredTask = Task;
|
|
111
|
+
export type ShadowMirroredProject = Project;
|
|
112
|
+
export type ShadowMirroredPlan = Plan;
|
|
113
|
+
export type ShadowMirroredAgent = Agent;
|
|
114
|
+
export type ShadowMirroredTaskList = TaskList;
|
|
115
|
+
export type ShadowMirroredTemplate = TaskTemplate;
|
|
116
|
+
export type ShadowMirroredHistory = TaskHistory;
|
|
117
|
+
export {};
|
|
118
|
+
//# sourceMappingURL=shadow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shadow.d.ts","sourceRoot":"","sources":["../../src/storage/shadow.ts"],"names":[],"mappings":"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"}
|
package/dist/storage.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export type { MaybePromise, ActiveWorkItem, TodosActiveWorkFilter, TodosAgentUpdateInput, TodosAgentStore, TodosAuditStore, TodosPlanStore, TodosProjectStore, TodosStorageAdapter, TodosStorageCapabilities, TodosStorageContext, TodosStorageImportResult, TodosStorageKind, TodosStorageSnapshot, TodosSyncStore, TodosTaskClaimFilter, TodosTaskCompletionOptions, TodosTaskFailureOptions, TodosTaskFailureResult, TodosTaskListStore, TodosTaskStore, TodosTemplateStore, UpdateTemplateInput, } from "./storage/index.js";
|
|
2
|
-
export { CANONICAL_TODOS_RDS_CLUSTER, CANONICAL_TODOS_RDS_DATABASE, CANONICAL_TODOS_RDS_RUNTIME_PATH, STORAGE_TABLES, TODOS_STORAGE_ENV, TODOS_STORAGE_FALLBACK_ENV, TODOS_STORAGE_TABLES, assertTodosRemoteStorageConfig, createLocalSqliteTodosStorageAdapter, createHybridTodosStorageAdapter, createTodosStorageAdapter, exportSqliteTodosStorageSnapshot, importSqliteTodosStorageSnapshot, isTodosRemoteStorageEnabled, loadTodosStorageConfig, parseStorageMode, planRunArtifactsS3Sync, createPostgresTodosStorageAdapter, createPostgresTodosSyncStore, createTodosS3ArtifactStore, postgresTodosSyncSchemaSql, signAwsV4Request, uploadRunArtifactsToS3, downloadRunArtifactsFromS3, getCanonicalTodosRdsConfig, getStorageDatabaseEnv, getStorageDatabaseUrl, getStorageMode, getTodosStorageDatabaseEnv, getTodosStorageDatabaseUrl, getTodosStorageEnvName, getTodosStorageMode, buildS3ObjectKey, buildS3ObjectUrl, loadStorageConfig, } from "./storage/index.js";
|
|
2
|
+
export { CANONICAL_TODOS_RDS_CLUSTER, CANONICAL_TODOS_RDS_DATABASE, CANONICAL_TODOS_RDS_RUNTIME_PATH, STORAGE_TABLES, TODOS_STORAGE_ENV, TODOS_STORAGE_FALLBACK_ENV, TODOS_STORAGE_TABLES, assertTodosRemoteStorageConfig, assertTodosShadowConfig, isTodosShadowEnabled, getTodosStorageShadowEnvName, createLocalSqliteTodosStorageAdapter, createHybridTodosStorageAdapter, createShadowTodosStorageAdapter, TodosShadowOutbox, createTodosShadowOutbox, installShadowOutboxSchema, maybeInstallShadowCapture, getRuntimeShadowOutbox, startRuntimeShadowDrain, registerShadowExitFlush, closeRuntimeShadowCloud, createTodosCloudQueryClient, createTodosCloudQueryClientFromEnv, TodosShadowMirror, createTodosStorageAdapter, exportSqliteTodosStorageSnapshot, importSqliteTodosStorageSnapshot, isTodosRemoteStorageEnabled, loadTodosStorageConfig, parseStorageMode, planRunArtifactsS3Sync, createPostgresTodosStorageAdapter, createPostgresTodosSyncStore, createTodosS3ArtifactStore, postgresTodosSyncSchemaSql, signAwsV4Request, uploadRunArtifactsToS3, downloadRunArtifactsFromS3, getCanonicalTodosRdsConfig, getStorageDatabaseEnv, getStorageDatabaseUrl, getStorageMode, getTodosStorageDatabaseEnv, getTodosStorageDatabaseUrl, getTodosStorageEnvName, getTodosStorageMode, buildS3ObjectKey, buildS3ObjectUrl, loadStorageConfig, } from "./storage/index.js";
|
|
3
3
|
export type { CreateLocalSqliteTodosStorageAdapterOptions } from "./storage/index.js";
|
|
4
|
+
export type { CreateShadowTodosStorageAdapterOptions, ShadowTodosStorageAdapter, TodosShadowMirrorEvent, TodosShadowMirrorMetrics, CreateTodosShadowOutboxOptions, TodosShadowOutboxEvent, TodosShadowOutboxStats, CreateTodosCloudQueryClientOptions, TodosCloudQueryClient, } from "./storage/index.js";
|
|
4
5
|
export type { CanonicalTodosRdsConfig, CreateHybridTodosStorageAdapterOptions, CreatePostgresTodosStorageAdapterOptions, CreatePostgresTodosSyncStoreOptions, CreateTodosStorageAdapterOptions, DownloadRunArtifactsFromS3Options, HybridTodosRemoteSync, HybridTodosStorageAdapter, HybridTodosStorageSyncResult, PostgresTodosSyncPushResult, PlanRunArtifactsS3SyncOptions, PullPostgresTodosSnapshotOptions, PutTodosS3ObjectInput, SignAwsV4RequestInput, SignedAwsV4Request, TodosAwsCredentials, TodosPostgresQueryClient, TodosPostgresQueryResult, TodosPostgresSyncRecordRow, TodosPostgresSyncRecordType, TodosPostgresStorageConfig, TodosS3StorageConfig, TodosS3ArtifactStore, TodosS3ArtifactStoreOptions, TodosS3ObjectRef, TodosRunArtifactRemoteRef, TodosRunArtifactSyncFilter, TodosRunArtifactSyncPlan, TodosRunArtifactSyncResult, TodosStorageConfig, TodosStorageEnv, TodosStorageMode, TodosStorageTable, TodosSyncConfig, UploadRunArtifactsToS3Options, } from "./storage/index.js";
|
|
5
6
|
//# sourceMappingURL=storage.d.ts.map
|
package/dist/storage.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,YAAY,EACZ,cAAc,EACd,qBAAqB,EACrB,qBAAqB,EACrB,eAAe,EACf,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,wBAAwB,EACxB,mBAAmB,EACnB,wBAAwB,EACxB,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,EACd,oBAAoB,EACpB,0BAA0B,EAC1B,uBAAuB,EACvB,sBAAsB,EACtB,kBAAkB,EAClB,cAAc,EACd,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,2BAA2B,EAC3B,4BAA4B,EAC5B,gCAAgC,EAChC,cAAc,EACd,iBAAiB,EACjB,0BAA0B,EAC1B,oBAAoB,EACpB,8BAA8B,EAC9B,oCAAoC,EACpC,+BAA+B,EAC/B,yBAAyB,EACzB,gCAAgC,EAChC,gCAAgC,EAChC,2BAA2B,EAC3B,sBAAsB,EACtB,gBAAgB,EAChB,sBAAsB,EACtB,iCAAiC,EACjC,4BAA4B,EAC5B,0BAA0B,EAC1B,0BAA0B,EAC1B,gBAAgB,EAChB,sBAAsB,EACtB,0BAA0B,EAC1B,0BAA0B,EAC1B,qBAAqB,EACrB,qBAAqB,EACrB,cAAc,EACd,0BAA0B,EAC1B,0BAA0B,EAC1B,sBAAsB,EACtB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,2CAA2C,EAAE,MAAM,oBAAoB,CAAC;AACtF,YAAY,EACV,uBAAuB,EACvB,sCAAsC,EACtC,wCAAwC,EACxC,mCAAmC,EACnC,gCAAgC,EAChC,iCAAiC,EACjC,qBAAqB,EACrB,yBAAyB,EACzB,4BAA4B,EAC5B,2BAA2B,EAC3B,6BAA6B,EAC7B,gCAAgC,EAChC,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,wBAAwB,EACxB,wBAAwB,EACxB,0BAA0B,EAC1B,2BAA2B,EAC3B,0BAA0B,EAC1B,oBAAoB,EACpB,oBAAoB,EACpB,2BAA2B,EAC3B,gBAAgB,EAChB,yBAAyB,EACzB,0BAA0B,EAC1B,wBAAwB,EACxB,0BAA0B,EAC1B,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,6BAA6B,GAC9B,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,YAAY,EACZ,cAAc,EACd,qBAAqB,EACrB,qBAAqB,EACrB,eAAe,EACf,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,wBAAwB,EACxB,mBAAmB,EACnB,wBAAwB,EACxB,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,EACd,oBAAoB,EACpB,0BAA0B,EAC1B,uBAAuB,EACvB,sBAAsB,EACtB,kBAAkB,EAClB,cAAc,EACd,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,2BAA2B,EAC3B,4BAA4B,EAC5B,gCAAgC,EAChC,cAAc,EACd,iBAAiB,EACjB,0BAA0B,EAC1B,oBAAoB,EACpB,8BAA8B,EAC9B,uBAAuB,EACvB,oBAAoB,EACpB,4BAA4B,EAC5B,oCAAoC,EACpC,+BAA+B,EAC/B,+BAA+B,EAC/B,iBAAiB,EACjB,uBAAuB,EACvB,yBAAyB,EACzB,yBAAyB,EACzB,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,EACvB,uBAAuB,EACvB,2BAA2B,EAC3B,kCAAkC,EAClC,iBAAiB,EACjB,yBAAyB,EACzB,gCAAgC,EAChC,gCAAgC,EAChC,2BAA2B,EAC3B,sBAAsB,EACtB,gBAAgB,EAChB,sBAAsB,EACtB,iCAAiC,EACjC,4BAA4B,EAC5B,0BAA0B,EAC1B,0BAA0B,EAC1B,gBAAgB,EAChB,sBAAsB,EACtB,0BAA0B,EAC1B,0BAA0B,EAC1B,qBAAqB,EACrB,qBAAqB,EACrB,cAAc,EACd,0BAA0B,EAC1B,0BAA0B,EAC1B,sBAAsB,EACtB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,2CAA2C,EAAE,MAAM,oBAAoB,CAAC;AACtF,YAAY,EACV,sCAAsC,EACtC,yBAAyB,EACzB,sBAAsB,EACtB,wBAAwB,EACxB,8BAA8B,EAC9B,sBAAsB,EACtB,sBAAsB,EACtB,kCAAkC,EAClC,qBAAqB,GACtB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,uBAAuB,EACvB,sCAAsC,EACtC,wCAAwC,EACxC,mCAAmC,EACnC,gCAAgC,EAChC,iCAAiC,EACjC,qBAAqB,EACrB,yBAAyB,EACzB,4BAA4B,EAC5B,2BAA2B,EAC3B,6BAA6B,EAC7B,gCAAgC,EAChC,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,wBAAwB,EACxB,wBAAwB,EACxB,0BAA0B,EAC1B,2BAA2B,EAC3B,0BAA0B,EAC1B,oBAAoB,EACpB,oBAAoB,EACpB,2BAA2B,EAC3B,gBAAgB,EAChB,yBAAyB,EACzB,0BAA0B,EAC1B,wBAAwB,EACxB,0BAA0B,EAC1B,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,6BAA6B,GAC9B,MAAM,oBAAoB,CAAC"}
|