@hasna/cloud 0.1.34 → 0.1.35

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/LICENSE +1 -2
  2. package/README.md +27 -30
  3. package/archive/cli.js +4 -0
  4. package/archive/index.d.ts +9 -0
  5. package/archive/index.js +15 -0
  6. package/archive/mcp.js +4 -0
  7. package/package.json +15 -25
  8. package/dist/adapter.d.ts +0 -65
  9. package/dist/adapter.d.ts.map +0 -1
  10. package/dist/adapter.test.d.ts +0 -2
  11. package/dist/adapter.test.d.ts.map +0 -1
  12. package/dist/auto-sync.d.ts +0 -28
  13. package/dist/auto-sync.d.ts.map +0 -1
  14. package/dist/cli/cmd-doctor.d.ts +0 -3
  15. package/dist/cli/cmd-doctor.d.ts.map +0 -1
  16. package/dist/cli/cmd-feedback.d.ts +0 -3
  17. package/dist/cli/cmd-feedback.d.ts.map +0 -1
  18. package/dist/cli/cmd-migrate.d.ts +0 -3
  19. package/dist/cli/cmd-migrate.d.ts.map +0 -1
  20. package/dist/cli/cmd-setup.d.ts +0 -3
  21. package/dist/cli/cmd-setup.d.ts.map +0 -1
  22. package/dist/cli/cmd-sync.d.ts +0 -4
  23. package/dist/cli/cmd-sync.d.ts.map +0 -1
  24. package/dist/cli/index.d.ts +0 -3
  25. package/dist/cli/index.d.ts.map +0 -1
  26. package/dist/cli/index.js +0 -14661
  27. package/dist/cli-helpers.d.ts +0 -17
  28. package/dist/cli-helpers.d.ts.map +0 -1
  29. package/dist/config.d.ts +0 -220
  30. package/dist/config.d.ts.map +0 -1
  31. package/dist/daemon-sync.d.ts +0 -108
  32. package/dist/daemon-sync.d.ts.map +0 -1
  33. package/dist/dialect.d.ts +0 -17
  34. package/dist/dialect.d.ts.map +0 -1
  35. package/dist/dialect.test.d.ts +0 -2
  36. package/dist/dialect.test.d.ts.map +0 -1
  37. package/dist/discover.d.ts +0 -35
  38. package/dist/discover.d.ts.map +0 -1
  39. package/dist/discover.test.d.ts +0 -2
  40. package/dist/discover.test.d.ts.map +0 -1
  41. package/dist/dotfile.d.ts +0 -27
  42. package/dist/dotfile.d.ts.map +0 -1
  43. package/dist/feedback.d.ts +0 -32
  44. package/dist/feedback.d.ts.map +0 -1
  45. package/dist/index.d.ts +0 -19
  46. package/dist/index.d.ts.map +0 -1
  47. package/dist/index.js +0 -12223
  48. package/dist/machines.d.ts +0 -63
  49. package/dist/machines.d.ts.map +0 -1
  50. package/dist/mcp/bin.js +0 -2
  51. package/dist/mcp/http.d.ts +0 -28
  52. package/dist/mcp/http.d.ts.map +0 -1
  53. package/dist/mcp/index.d.ts +0 -4
  54. package/dist/mcp/index.d.ts.map +0 -1
  55. package/dist/mcp/index.js +0 -27795
  56. package/dist/mcp-helpers.d.ts +0 -22
  57. package/dist/mcp-helpers.d.ts.map +0 -1
  58. package/dist/pg-migrate.d.ts +0 -58
  59. package/dist/pg-migrate.d.ts.map +0 -1
  60. package/dist/scheduled-sync.d.ts +0 -24
  61. package/dist/scheduled-sync.d.ts.map +0 -1
  62. package/dist/scheduled-sync.js +0 -9517
  63. package/dist/sync-conflicts.d.ts +0 -76
  64. package/dist/sync-conflicts.d.ts.map +0 -1
  65. package/dist/sync-conflicts.test.d.ts +0 -2
  66. package/dist/sync-conflicts.test.d.ts.map +0 -1
  67. package/dist/sync-incremental.d.ts +0 -67
  68. package/dist/sync-incremental.d.ts.map +0 -1
  69. package/dist/sync-progress.d.ts +0 -68
  70. package/dist/sync-progress.d.ts.map +0 -1
  71. package/dist/sync-schedule.d.ts +0 -36
  72. package/dist/sync-schedule.d.ts.map +0 -1
  73. package/dist/sync-schedule.test.d.ts +0 -2
  74. package/dist/sync-schedule.test.d.ts.map +0 -1
  75. package/dist/sync.d.ts +0 -53
  76. package/dist/sync.d.ts.map +0 -1
  77. package/dist/sync.test.d.ts +0 -2
  78. package/dist/sync.test.d.ts.map +0 -1
@@ -1,17 +0,0 @@
1
- import type { Command } from "commander";
2
- /**
3
- * Register cloud-related subcommands onto an existing Commander program.
4
- * Services call this to embed cloud sync/feedback commands into their own CLI.
5
- *
6
- * @example
7
- * ```ts
8
- * import { Command } from "commander";
9
- * import { registerCloudCommands } from "@hasna/cloud";
10
- *
11
- * const program = new Command();
12
- * registerCloudCommands(program, "my-service");
13
- * program.parse();
14
- * ```
15
- */
16
- export declare function registerCloudCommands(program: Command, serviceName: string): void;
17
- //# sourceMappingURL=cli-helpers.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli-helpers.d.ts","sourceRoot":"","sources":["../src/cli-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWzC;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,MAAM,GAClB,IAAI,CAqHN"}
package/dist/config.d.ts DELETED
@@ -1,220 +0,0 @@
1
- import { z } from "zod";
2
- declare const DaemonConfigSchema: z.ZodDefault<z.ZodObject<{
3
- enabled: z.ZodDefault<z.ZodBoolean>;
4
- paused: z.ZodDefault<z.ZodBoolean>;
5
- watch_interval_seconds: z.ZodDefault<z.ZodNumber>;
6
- pull_interval_seconds: z.ZodDefault<z.ZodNumber>;
7
- push_debounce_seconds: z.ZodDefault<z.ZodNumber>;
8
- conflict_strategy: z.ZodDefault<z.ZodEnum<["newest-wins", "local-wins", "remote-wins"]>>;
9
- services: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
10
- table_intervals: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodNumber>>>;
11
- file_rules: z.ZodDefault<z.ZodArray<z.ZodObject<{
12
- path: z.ZodString;
13
- interval_seconds: z.ZodDefault<z.ZodNumber>;
14
- enabled: z.ZodDefault<z.ZodBoolean>;
15
- }, "strip", z.ZodTypeAny, {
16
- enabled: boolean;
17
- path: string;
18
- interval_seconds: number;
19
- }, {
20
- path: string;
21
- enabled?: boolean | undefined;
22
- interval_seconds?: number | undefined;
23
- }>, "many">>;
24
- }, "strip", z.ZodTypeAny, {
25
- enabled: boolean;
26
- paused: boolean;
27
- watch_interval_seconds: number;
28
- pull_interval_seconds: number;
29
- push_debounce_seconds: number;
30
- conflict_strategy: "newest-wins" | "local-wins" | "remote-wins";
31
- services: string[];
32
- table_intervals: Record<string, Record<string, number>>;
33
- file_rules: {
34
- enabled: boolean;
35
- path: string;
36
- interval_seconds: number;
37
- }[];
38
- }, {
39
- enabled?: boolean | undefined;
40
- paused?: boolean | undefined;
41
- watch_interval_seconds?: number | undefined;
42
- pull_interval_seconds?: number | undefined;
43
- push_debounce_seconds?: number | undefined;
44
- conflict_strategy?: "newest-wins" | "local-wins" | "remote-wins" | undefined;
45
- services?: string[] | undefined;
46
- table_intervals?: Record<string, Record<string, number>> | undefined;
47
- file_rules?: {
48
- path: string;
49
- enabled?: boolean | undefined;
50
- interval_seconds?: number | undefined;
51
- }[] | undefined;
52
- }>>;
53
- export declare const CloudConfigSchema: z.ZodObject<{
54
- rds: z.ZodDefault<z.ZodObject<{
55
- host: z.ZodDefault<z.ZodString>;
56
- port: z.ZodDefault<z.ZodNumber>;
57
- username: z.ZodDefault<z.ZodString>;
58
- password_env: z.ZodDefault<z.ZodString>;
59
- ssl: z.ZodDefault<z.ZodBoolean>;
60
- }, "strip", z.ZodTypeAny, {
61
- ssl: boolean;
62
- host: string;
63
- port: number;
64
- username: string;
65
- password_env: string;
66
- }, {
67
- ssl?: boolean | undefined;
68
- host?: string | undefined;
69
- port?: number | undefined;
70
- username?: string | undefined;
71
- password_env?: string | undefined;
72
- }>>;
73
- mode: z.ZodDefault<z.ZodEnum<["local", "cloud", "hybrid"]>>;
74
- auto_sync_interval_minutes: z.ZodDefault<z.ZodNumber>;
75
- feedback_endpoint: z.ZodDefault<z.ZodString>;
76
- sync: z.ZodDefault<z.ZodObject<{
77
- schedule_minutes: z.ZodDefault<z.ZodNumber>;
78
- }, "strip", z.ZodTypeAny, {
79
- schedule_minutes: number;
80
- }, {
81
- schedule_minutes?: number | undefined;
82
- }>>;
83
- daemon: z.ZodDefault<z.ZodObject<{
84
- enabled: z.ZodDefault<z.ZodBoolean>;
85
- paused: z.ZodDefault<z.ZodBoolean>;
86
- watch_interval_seconds: z.ZodDefault<z.ZodNumber>;
87
- pull_interval_seconds: z.ZodDefault<z.ZodNumber>;
88
- push_debounce_seconds: z.ZodDefault<z.ZodNumber>;
89
- conflict_strategy: z.ZodDefault<z.ZodEnum<["newest-wins", "local-wins", "remote-wins"]>>;
90
- services: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
91
- table_intervals: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodNumber>>>;
92
- file_rules: z.ZodDefault<z.ZodArray<z.ZodObject<{
93
- path: z.ZodString;
94
- interval_seconds: z.ZodDefault<z.ZodNumber>;
95
- enabled: z.ZodDefault<z.ZodBoolean>;
96
- }, "strip", z.ZodTypeAny, {
97
- enabled: boolean;
98
- path: string;
99
- interval_seconds: number;
100
- }, {
101
- path: string;
102
- enabled?: boolean | undefined;
103
- interval_seconds?: number | undefined;
104
- }>, "many">>;
105
- }, "strip", z.ZodTypeAny, {
106
- enabled: boolean;
107
- paused: boolean;
108
- watch_interval_seconds: number;
109
- pull_interval_seconds: number;
110
- push_debounce_seconds: number;
111
- conflict_strategy: "newest-wins" | "local-wins" | "remote-wins";
112
- services: string[];
113
- table_intervals: Record<string, Record<string, number>>;
114
- file_rules: {
115
- enabled: boolean;
116
- path: string;
117
- interval_seconds: number;
118
- }[];
119
- }, {
120
- enabled?: boolean | undefined;
121
- paused?: boolean | undefined;
122
- watch_interval_seconds?: number | undefined;
123
- pull_interval_seconds?: number | undefined;
124
- push_debounce_seconds?: number | undefined;
125
- conflict_strategy?: "newest-wins" | "local-wins" | "remote-wins" | undefined;
126
- services?: string[] | undefined;
127
- table_intervals?: Record<string, Record<string, number>> | undefined;
128
- file_rules?: {
129
- path: string;
130
- enabled?: boolean | undefined;
131
- interval_seconds?: number | undefined;
132
- }[] | undefined;
133
- }>>;
134
- }, "strip", z.ZodTypeAny, {
135
- rds: {
136
- ssl: boolean;
137
- host: string;
138
- port: number;
139
- username: string;
140
- password_env: string;
141
- };
142
- mode: "cloud" | "local" | "hybrid";
143
- auto_sync_interval_minutes: number;
144
- feedback_endpoint: string;
145
- sync: {
146
- schedule_minutes: number;
147
- };
148
- daemon: {
149
- enabled: boolean;
150
- paused: boolean;
151
- watch_interval_seconds: number;
152
- pull_interval_seconds: number;
153
- push_debounce_seconds: number;
154
- conflict_strategy: "newest-wins" | "local-wins" | "remote-wins";
155
- services: string[];
156
- table_intervals: Record<string, Record<string, number>>;
157
- file_rules: {
158
- enabled: boolean;
159
- path: string;
160
- interval_seconds: number;
161
- }[];
162
- };
163
- }, {
164
- rds?: {
165
- ssl?: boolean | undefined;
166
- host?: string | undefined;
167
- port?: number | undefined;
168
- username?: string | undefined;
169
- password_env?: string | undefined;
170
- } | undefined;
171
- mode?: "cloud" | "local" | "hybrid" | undefined;
172
- auto_sync_interval_minutes?: number | undefined;
173
- feedback_endpoint?: string | undefined;
174
- sync?: {
175
- schedule_minutes?: number | undefined;
176
- } | undefined;
177
- daemon?: {
178
- enabled?: boolean | undefined;
179
- paused?: boolean | undefined;
180
- watch_interval_seconds?: number | undefined;
181
- pull_interval_seconds?: number | undefined;
182
- push_debounce_seconds?: number | undefined;
183
- conflict_strategy?: "newest-wins" | "local-wins" | "remote-wins" | undefined;
184
- services?: string[] | undefined;
185
- table_intervals?: Record<string, Record<string, number>> | undefined;
186
- file_rules?: {
187
- path: string;
188
- enabled?: boolean | undefined;
189
- interval_seconds?: number | undefined;
190
- }[] | undefined;
191
- } | undefined;
192
- }>;
193
- export type CloudConfig = z.infer<typeof CloudConfigSchema>;
194
- export type CloudDaemonConfig = z.infer<typeof DaemonConfigSchema>;
195
- export declare function getConfigDir(): string;
196
- export declare function getConfigPath(): string;
197
- export declare function getCloudConfig(): CloudConfig;
198
- export declare function saveCloudConfig(config: CloudConfig): void;
199
- export declare function getConnectionString(dbName: string): string;
200
- import { type MachineAwareDbAdapter } from "./machines.js";
201
- export interface CreateDatabaseOptions {
202
- /** Service name — used to locate the SQLite file and PG database. */
203
- service: string;
204
- /** Override mode from config. */
205
- mode?: "local" | "cloud" | "hybrid";
206
- /** Override the SQLite file path. */
207
- sqlitePath?: string;
208
- /** Override the PG connection string. */
209
- pgConnectionString?: string;
210
- }
211
- /**
212
- * Create a database adapter based on the current configuration.
213
- *
214
- * - `local` mode → SqliteAdapter
215
- * - `cloud` mode → PgAdapter
216
- * - `hybrid` mode → SqliteAdapter (PG is used only for sync)
217
- */
218
- export declare function createDatabase(options: CreateDatabaseOptions): MachineAwareDbAdapter;
219
- export {};
220
- //# sourceMappingURL=config.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,QAAA,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwBV,CAAC;AAMf,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqB5B,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC5D,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AASnE,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAMD,wBAAgB,cAAc,IAAI,WAAW,CAU5C;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAGzD;AAMD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAoB1D;AAQD,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,eAAe,CAAC;AAEvB,MAAM,WAAW,qBAAqB;IACpC,qEAAqE;IACrE,OAAO,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;IACpC,qCAAqC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yCAAyC;IACzC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,qBAAqB,GAC7B,qBAAqB,CAavB"}
@@ -1,108 +0,0 @@
1
- import type { DbAdapter } from "./adapter.js";
2
- import { type CloudConfig, type CloudDaemonConfig } from "./config.js";
3
- import type { ConflictStrategy } from "./sync-conflicts.js";
4
- export interface DaemonFileState {
5
- path: string;
6
- enabled: boolean;
7
- interval_seconds: number;
8
- exists: boolean;
9
- last_mtime_ms: number;
10
- }
11
- export interface DaemonTableState {
12
- last_push_at: string | null;
13
- last_pull_at: string | null;
14
- }
15
- export interface DaemonServiceState {
16
- last_local_db_mtime_ms: number;
17
- last_push_at: string | null;
18
- last_pull_at: string | null;
19
- last_error: string | null;
20
- tables: Record<string, DaemonTableState>;
21
- }
22
- export interface DaemonState {
23
- pid: number | null;
24
- status: "stopped" | "running" | "paused";
25
- started_at: string | null;
26
- updated_at: string | null;
27
- last_push_at: string | null;
28
- last_pull_at: string | null;
29
- last_error: string | null;
30
- services: Record<string, DaemonServiceState>;
31
- files: Record<string, DaemonFileState>;
32
- }
33
- export interface DaemonRunSummary {
34
- services: string[];
35
- pushed_services: number;
36
- pulled_services: number;
37
- pushed_rows: number;
38
- pulled_rows: number;
39
- errors: string[];
40
- }
41
- export interface DaemonStatus {
42
- running: boolean;
43
- pid: number | null;
44
- status: "stopped" | "running" | "paused";
45
- config: CloudDaemonConfig;
46
- state: DaemonState;
47
- services: string[];
48
- }
49
- export interface TableIntervalRule {
50
- service: string;
51
- table: string;
52
- interval_seconds: number;
53
- }
54
- export interface ParsedFileRule {
55
- path: string;
56
- interval_seconds: number;
57
- enabled: boolean;
58
- }
59
- export interface DaemonAdapterFactory {
60
- getLocalDbPath(service: string): string;
61
- openLocal(service: string): DbAdapter;
62
- openRemote(service: string): DbAdapter;
63
- listRemoteTables(remote: DbAdapter): string[];
64
- }
65
- export declare const defaultDaemonAdapterFactory: DaemonAdapterFactory;
66
- export declare function getDefaultDaemonConfig(): CloudDaemonConfig;
67
- export declare function getDaemonConfig(config?: CloudConfig): CloudDaemonConfig;
68
- export declare function saveDaemonConfig(config: CloudDaemonConfig): CloudDaemonConfig;
69
- export declare function getDaemonStatePath(): string;
70
- export declare function createDefaultDaemonState(): DaemonState;
71
- export declare function readDaemonState(): DaemonState;
72
- export declare function writeDaemonState(state: DaemonState): void;
73
- export declare function resolveDaemonServices(config: CloudDaemonConfig): string[];
74
- export declare function parseTableIntervalRule(raw: string): TableIntervalRule;
75
- export declare function applyTableIntervalRules(existing: CloudDaemonConfig["table_intervals"], rules: string[]): CloudDaemonConfig["table_intervals"];
76
- export declare function parseFileRule(raw: string): ParsedFileRule;
77
- export declare function applyFileRules(existing: CloudDaemonConfig["file_rules"], rules: string[]): CloudDaemonConfig["file_rules"];
78
- export declare function runDaemonPass(config: CloudDaemonConfig, state?: DaemonState, options?: {
79
- adapterFactory?: DaemonAdapterFactory;
80
- forcePush?: boolean;
81
- forcePull?: boolean;
82
- services?: string[];
83
- }): {
84
- state: DaemonState;
85
- summary: DaemonRunSummary;
86
- };
87
- export declare function getDaemonStatus(): DaemonStatus;
88
- export declare function startDaemon(overrides?: Partial<CloudDaemonConfig>): DaemonStatus;
89
- export declare function stopDaemon(): DaemonStatus;
90
- export declare function pauseDaemon(): DaemonStatus;
91
- export declare function resumeDaemon(): DaemonStatus;
92
- export declare function runDaemonOnce(options?: {
93
- config?: CloudDaemonConfig;
94
- state?: DaemonState;
95
- adapterFactory?: DaemonAdapterFactory;
96
- forcePush?: boolean;
97
- forcePull?: boolean;
98
- services?: string[];
99
- }): {
100
- state: DaemonState;
101
- summary: DaemonRunSummary;
102
- };
103
- export declare function runDaemonLoop(options?: {
104
- adapterFactory?: DaemonAdapterFactory;
105
- max_passes?: number;
106
- }): void;
107
- export declare function normalizeConflictStrategy(strategy: string | undefined): ConflictStrategy;
108
- //# sourceMappingURL=daemon-sync.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"daemon-sync.d.ts","sourceRoot":"","sources":["../src/daemon-sync.ts"],"names":[],"mappings":"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"}
package/dist/dialect.d.ts DELETED
@@ -1,17 +0,0 @@
1
- export type Dialect = "sqlite" | "pg";
2
- /**
3
- * Translate SQLite-flavored SQL to PostgreSQL.
4
- * When dialect is "sqlite", returns the SQL unchanged.
5
- */
6
- export declare function translateSql(sql: string, dialect: Dialect): string;
7
- /**
8
- * Flatten params for PG — bun:sqlite accepts variadic params or a single
9
- * array; pg always wants a flat array. Also handles undefined → null.
10
- */
11
- export declare function translateParams(params: any[]): any[];
12
- /**
13
- * Translate a CREATE TABLE statement from SQLite DDL to PostgreSQL DDL.
14
- * More aggressive transformations than query-level translation.
15
- */
16
- export declare function translateDdl(ddl: string, dialect: Dialect): string;
17
- //# sourceMappingURL=dialect.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dialect.d.ts","sourceRoot":"","sources":["../src/dialect.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG,IAAI,CAAC;AAEtC;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAGlE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,CAKpD;AA8GD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CA6BlE"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=dialect.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dialect.test.d.ts","sourceRoot":"","sources":["../src/dialect.test.ts"],"names":[],"mappings":""}
@@ -1,35 +0,0 @@
1
- /**
2
- * Service discovery — find all @hasna/* services that have local data.
3
- *
4
- * Scans ~/.hasna/ for directories containing .db files.
5
- * Also maintains a known-services list for migration discovery.
6
- */
7
- /**
8
- * Services known to have pg-migrations.ts files.
9
- * Updated as services are onboarded to cloud sync.
10
- */
11
- export declare const KNOWN_PG_SERVICES: string[];
12
- /**
13
- * Tables to exclude from sync — internal SQLite tables, FTS virtual tables,
14
- * migration tracking, and sync metadata.
15
- */
16
- export declare const SYNC_EXCLUDED_TABLE_PATTERNS: RegExp[];
17
- /**
18
- * Check if a table name should be excluded from sync.
19
- */
20
- export declare function isSyncExcludedTable(table: string): boolean;
21
- /**
22
- * Discover all services that have local data directories under ~/.hasna/.
23
- * Returns service names (directory names), sorted alphabetically.
24
- */
25
- export declare function discoverServices(): string[];
26
- /**
27
- * Discover services that have both local data AND known PG migrations.
28
- */
29
- export declare function discoverSyncableServices(): string[];
30
- /**
31
- * Get the local SQLite database path for a service.
32
- * Convention: ~/.hasna/<service>/<service>.db
33
- */
34
- export declare function getServiceDbPath(service: string): string | null;
35
- //# sourceMappingURL=discover.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../src/discover.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,EAoCrC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,4BAA4B,UAMxC,CAAC;AAEF;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE1D;AAMD;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,EAAE,CAkB3C;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,EAAE,CAInD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA0B/D"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=discover.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"discover.test.d.ts","sourceRoot":"","sources":["../src/discover.test.ts"],"names":[],"mappings":""}
package/dist/dotfile.d.ts DELETED
@@ -1,27 +0,0 @@
1
- /**
2
- * Returns `~/.hasna/<serviceName>/`, creating it if needed.
3
- */
4
- export declare function getDataDir(serviceName: string): string;
5
- /**
6
- * Returns the path for the service's SQLite database:
7
- * `~/.hasna/<serviceName>/<serviceName>.db`
8
- */
9
- export declare function getDbPath(serviceName: string): string;
10
- /**
11
- * Migrate from legacy `~/.<serviceName>/` to `~/.hasna/<serviceName>/`.
12
- *
13
- * - If `~/.<serviceName>/` exists and `~/.hasna/<serviceName>/` does NOT,
14
- * copies all contents over.
15
- * - Returns a list of migrated file paths (relative to the source dir),
16
- * or an empty array if no migration was needed.
17
- */
18
- export declare function migrateDotfile(serviceName: string): string[];
19
- /**
20
- * Check if a legacy dotfile directory exists for the given service.
21
- */
22
- export declare function hasLegacyDotfile(serviceName: string): boolean;
23
- /**
24
- * Get the `.hasna` base directory.
25
- */
26
- export declare function getHasnaDir(): string;
27
- //# sourceMappingURL=dotfile.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dotfile.d.ts","sourceRoot":"","sources":["../src/dotfile.ts"],"names":[],"mappings":"AAoBA;;GAEG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAItD;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAGrD;AAMD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAe5D;AAsBD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAE7D;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAGpC"}
@@ -1,32 +0,0 @@
1
- import type { DbAdapter } from "./adapter.js";
2
- export interface Feedback {
3
- id?: string;
4
- service: string;
5
- version?: string;
6
- message: string;
7
- email?: string;
8
- machine_id?: string;
9
- created_at?: string;
10
- }
11
- /**
12
- * Ensure the feedback table exists in the given database.
13
- */
14
- export declare function ensureFeedbackTable(db: DbAdapter): void;
15
- /**
16
- * Save feedback to the local database.
17
- */
18
- export declare function saveFeedback(db: DbAdapter, feedback: Feedback): string;
19
- /**
20
- * Send feedback to the remote endpoint.
21
- * If the POST fails, saves locally and does NOT throw.
22
- */
23
- export declare function sendFeedback(feedback: Feedback, db?: DbAdapter): Promise<{
24
- sent: boolean;
25
- id: string;
26
- error?: string;
27
- }>;
28
- /**
29
- * Get all feedback entries from the local database.
30
- */
31
- export declare function listFeedback(db: DbAdapter): Feedback[];
32
- //# sourceMappingURL=feedback.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"feedback.d.ts","sourceRoot":"","sources":["../src/feedback.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAO9C,MAAM,WAAW,QAAQ;IACvB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAiBD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,SAAS,GAAG,IAAI,CAEvD;AAMD;;GAEG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAsBtE;AAMD;;;GAGG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,QAAQ,EAClB,EAAE,CAAC,EAAE,SAAS,GACb,OAAO,CAAC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAsDxD;AAMD;;GAEG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,SAAS,GAAG,QAAQ,EAAE,CAKtD"}
package/dist/index.d.ts DELETED
@@ -1,19 +0,0 @@
1
- export { SqliteAdapter, PgAdapter, PgAdapterAsync, type DbAdapter, type PreparedStatement, type RunResult, } from "./adapter.js";
2
- export { translateSql, translateDdl, translateParams, type Dialect, } from "./dialect.js";
3
- export { getCloudConfig, saveCloudConfig, getConnectionString, createDatabase, getConfigDir, getConfigPath, CloudConfigSchema, type CloudConfig, type CloudDaemonConfig, type CreateDatabaseOptions, } from "./config.js";
4
- export { getCurrentMachineId, detectCurrentMachine, ensureMachinesTable, getMachineRecord, registerMachine, listMachines, pingMachine, getMachineStatus, ensureMachineIdColumn, createMachineRegistry, createMachineAwareAdapter, type MachineRecord, type RegisterMachineOptions, type MachinePingResult, type MachineRegistryApi, type MachineAwareDbAdapter, } from "./machines.js";
5
- export { syncPush, syncPull, listSqliteTables, listPgTables, type SyncOptions, type SyncResult, type SyncProgress, type SyncProgressCallback, } from "./sync.js";
6
- export { saveFeedback, sendFeedback, listFeedback, ensureFeedbackTable, type Feedback, } from "./feedback.js";
7
- export { migrateDotfile, getDataDir, getDbPath, hasLegacyDotfile, getHasnaDir, } from "./dotfile.js";
8
- export { SyncProgressTracker, type SyncProgressInfo, type ProgressCallback, type ResumePoint, } from "./sync-progress.js";
9
- export { detectConflicts, resolveConflicts, getWinningData, ensureConflictsTable, storeConflicts, listConflicts, resolveConflict, getConflict, purgeResolvedConflicts, type SyncConflict, type ConflictStrategy, type StoredConflict, } from "./sync-conflicts.js";
10
- export { incrementalSyncPush, incrementalSyncPull, ensureSyncMetaTable, getSyncMetaAll, getSyncMetaForTable, resetSyncMeta, resetAllSyncMeta, type IncrementalSyncStats, type IncrementalSyncOptions, type SyncMeta, } from "./sync-incremental.js";
11
- export { setupAutoSync, enableAutoSync, getAutoSyncConfig, type AutoSyncConfig, type AutoSyncContext, type AutoSyncResult, } from "./auto-sync.js";
12
- export { runScheduledSync, discoverSyncableServices, type ScheduledSyncResult, } from "./scheduled-sync.js";
13
- export { registerSyncSchedule, removeSyncSchedule, getSyncScheduleStatus, parseInterval, minutesToCron, type SyncScheduleStatus, } from "./sync-schedule.js";
14
- export { getDefaultDaemonConfig, getDaemonConfig, saveDaemonConfig, getDaemonStatePath, createDefaultDaemonState, readDaemonState, writeDaemonState, resolveDaemonServices, parseTableIntervalRule, applyTableIntervalRules, parseFileRule, applyFileRules, runDaemonPass, getDaemonStatus, startDaemon, stopDaemon, pauseDaemon, resumeDaemon, runDaemonOnce, runDaemonLoop, normalizeConflictStrategy, type DaemonState, type DaemonStatus, type DaemonRunSummary, type DaemonServiceState, type DaemonTableState, type DaemonFileState, type TableIntervalRule, type ParsedFileRule, type DaemonAdapterFactory, } from "./daemon-sync.js";
15
- export { applyPgMigrations, migrateService, migrateAllServices, ensurePgDatabase, ensureAllPgDatabases, type PgMigrationResult, } from "./pg-migrate.js";
16
- export { discoverServices, discoverSyncableServices as discoverSyncableServicesV2, getServiceDbPath, isSyncExcludedTable, KNOWN_PG_SERVICES, SYNC_EXCLUDED_TABLE_PATTERNS, } from "./discover.js";
17
- export { registerCloudTools } from "./mcp-helpers.js";
18
- export { registerCloudCommands } from "./cli-helpers.js";
19
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}