@optimizely/ocp-local-env 1.0.0-beta.4

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 (160) hide show
  1. package/README.md +165 -0
  2. package/dist/package.json +104 -0
  3. package/dist/public/bundle.da978bb5437cd82e6d37.js +3 -0
  4. package/dist/public/bundle.da978bb5437cd82e6d37.js.LICENSE.txt +49 -0
  5. package/dist/public/bundle.da978bb5437cd82e6d37.js.map +1 -0
  6. package/dist/public/index.html +1 -0
  7. package/dist/src/cli.d.ts +2 -0
  8. package/dist/src/cli.js +88 -0
  9. package/dist/src/cli.js.map +1 -0
  10. package/dist/src/executor/FunctionExecutor.d.ts +56 -0
  11. package/dist/src/executor/FunctionExecutor.js +175 -0
  12. package/dist/src/executor/FunctionExecutor.js.map +1 -0
  13. package/dist/src/executor/JobExecutor.d.ts +60 -0
  14. package/dist/src/executor/JobExecutor.js +203 -0
  15. package/dist/src/executor/JobExecutor.js.map +1 -0
  16. package/dist/src/executor/LifecycleExecutor.d.ts +45 -0
  17. package/dist/src/executor/LifecycleExecutor.js +153 -0
  18. package/dist/src/executor/LifecycleExecutor.js.map +1 -0
  19. package/dist/src/executor/watcher.d.ts +63 -0
  20. package/dist/src/executor/watcher.js +213 -0
  21. package/dist/src/executor/watcher.js.map +1 -0
  22. package/dist/src/functions/hello.d.ts +4 -0
  23. package/dist/src/functions/hello.js +8 -0
  24. package/dist/src/functions/hello.js.map +1 -0
  25. package/dist/src/index.d.ts +1 -0
  26. package/dist/src/index.js +9 -0
  27. package/dist/src/index.js.map +1 -0
  28. package/dist/src/jobs/dailyJob.d.ts +4 -0
  29. package/dist/src/jobs/dailyJob.js +8 -0
  30. package/dist/src/jobs/dailyJob.js.map +1 -0
  31. package/dist/src/local_engine/LocalNotifier.d.ts +10 -0
  32. package/dist/src/local_engine/LocalNotifier.js +26 -0
  33. package/dist/src/local_engine/LocalNotifier.js.map +1 -0
  34. package/dist/src/local_engine/local-engine-child-base.d.ts +79 -0
  35. package/dist/src/local_engine/local-engine-child-base.js +304 -0
  36. package/dist/src/local_engine/local-engine-child-base.js.map +1 -0
  37. package/dist/src/local_engine/local-engine-client.d.ts +80 -0
  38. package/dist/src/local_engine/local-engine-client.js +333 -0
  39. package/dist/src/local_engine/local-engine-client.js.map +1 -0
  40. package/dist/src/local_engine/local-engine-types.d.ts +132 -0
  41. package/dist/src/local_engine/local-engine-types.js +6 -0
  42. package/dist/src/local_engine/local-engine-types.js.map +1 -0
  43. package/dist/src/local_engine/local-engine-unified.d.ts +40 -0
  44. package/dist/src/local_engine/local-engine-unified.js +406 -0
  45. package/dist/src/local_engine/local-engine-unified.js.map +1 -0
  46. package/dist/src/local_engine/local-engine-utils.d.ts +70 -0
  47. package/dist/src/local_engine/local-engine-utils.js +192 -0
  48. package/dist/src/local_engine/local-engine-utils.js.map +1 -0
  49. package/dist/src/local_engine/localSDKConfig.d.ts +30 -0
  50. package/dist/src/local_engine/localSDKConfig.js +392 -0
  51. package/dist/src/local_engine/localSDKConfig.js.map +1 -0
  52. package/dist/src/local_engine/storage/LocalConfigStore.d.ts +56 -0
  53. package/dist/src/local_engine/storage/LocalConfigStore.js +129 -0
  54. package/dist/src/local_engine/storage/LocalConfigStore.js.map +1 -0
  55. package/dist/src/local_engine/storage/LocalJobStore.d.ts +110 -0
  56. package/dist/src/local_engine/storage/LocalJobStore.js +239 -0
  57. package/dist/src/local_engine/storage/LocalJobStore.js.map +1 -0
  58. package/dist/src/local_engine/storage/LocalKVStore.d.ts +105 -0
  59. package/dist/src/local_engine/storage/LocalKVStore.js +1002 -0
  60. package/dist/src/local_engine/storage/LocalKVStore.js.map +1 -0
  61. package/dist/src/local_engine/storage/LocalNotificationStore.d.ts +27 -0
  62. package/dist/src/local_engine/storage/LocalNotificationStore.js +125 -0
  63. package/dist/src/local_engine/storage/LocalNotificationStore.js.map +1 -0
  64. package/dist/src/local_engine/storage/LocalSecretsStore.d.ts +114 -0
  65. package/dist/src/local_engine/storage/LocalSecretsStore.js +319 -0
  66. package/dist/src/local_engine/storage/LocalSecretsStore.js.map +1 -0
  67. package/dist/src/local_engine/storage/LocalSettingsStore.d.ts +161 -0
  68. package/dist/src/local_engine/storage/LocalSettingsStore.js +417 -0
  69. package/dist/src/local_engine/storage/LocalSettingsStore.js.map +1 -0
  70. package/dist/src/local_engine/storage/NumberSet.d.ts +21 -0
  71. package/dist/src/local_engine/storage/NumberSet.js +32 -0
  72. package/dist/src/local_engine/storage/NumberSet.js.map +1 -0
  73. package/dist/src/local_engine/storage/StringSet.d.ts +21 -0
  74. package/dist/src/local_engine/storage/StringSet.js +32 -0
  75. package/dist/src/local_engine/storage/StringSet.js.map +1 -0
  76. package/dist/src/local_engine/types.d.ts +52 -0
  77. package/dist/src/local_engine/types.js +6 -0
  78. package/dist/src/local_engine/types.js.map +1 -0
  79. package/dist/src/local_engine/utils.d.ts +31 -0
  80. package/dist/src/local_engine/utils.js +126 -0
  81. package/dist/src/local_engine/utils.js.map +1 -0
  82. package/dist/src/logging/LogManager.d.ts +89 -0
  83. package/dist/src/logging/LogManager.js +237 -0
  84. package/dist/src/logging/LogManager.js.map +1 -0
  85. package/dist/src/server/api/functions.d.ts +7 -0
  86. package/dist/src/server/api/functions.js +80 -0
  87. package/dist/src/server/api/functions.js.map +1 -0
  88. package/dist/src/server/api/jobs.d.ts +8 -0
  89. package/dist/src/server/api/jobs.js +242 -0
  90. package/dist/src/server/api/jobs.js.map +1 -0
  91. package/dist/src/server/api/lifecycle.d.ts +6 -0
  92. package/dist/src/server/api/lifecycle.js +73 -0
  93. package/dist/src/server/api/lifecycle.js.map +1 -0
  94. package/dist/src/server/api/settings.d.ts +6 -0
  95. package/dist/src/server/api/settings.js +117 -0
  96. package/dist/src/server/api/settings.js.map +1 -0
  97. package/dist/src/server/api/stores.d.ts +2 -0
  98. package/dist/src/server/api/stores.js +341 -0
  99. package/dist/src/server/api/stores.js.map +1 -0
  100. package/dist/src/server/api/v1.d.ts +10 -0
  101. package/dist/src/server/api/v1.js +711 -0
  102. package/dist/src/server/api/v1.js.map +1 -0
  103. package/dist/src/server/api.d.ts +8 -0
  104. package/dist/src/server/api.js +154 -0
  105. package/dist/src/server/api.js.map +1 -0
  106. package/dist/src/server/app-discovery.d.ts +5 -0
  107. package/dist/src/server/app-discovery.js +81 -0
  108. package/dist/src/server/app-discovery.js.map +1 -0
  109. package/dist/src/server/config.d.ts +21 -0
  110. package/dist/src/server/config.js +100 -0
  111. package/dist/src/server/config.js.map +1 -0
  112. package/dist/src/server/websocket.d.ts +0 -0
  113. package/dist/src/server/websocket.js +2 -0
  114. package/dist/src/server/websocket.js.map +1 -0
  115. package/dist/src/server.d.ts +2 -0
  116. package/dist/src/server.js +546 -0
  117. package/dist/src/server.js.map +1 -0
  118. package/dist/src/types/app.d.ts +155 -0
  119. package/dist/src/types/app.js +24 -0
  120. package/dist/src/types/app.js.map +1 -0
  121. package/dist/src/types/kvstore.d.ts +320 -0
  122. package/dist/src/types/kvstore.js +5 -0
  123. package/dist/src/types/kvstore.js.map +1 -0
  124. package/dist/src/ui/components/App.d.ts +6 -0
  125. package/dist/src/ui/components/App.js +255 -0
  126. package/dist/src/ui/components/App.js.map +1 -0
  127. package/dist/src/ui/components/FunctionsView.d.ts +6 -0
  128. package/dist/src/ui/components/FunctionsView.js +217 -0
  129. package/dist/src/ui/components/FunctionsView.js.map +1 -0
  130. package/dist/src/ui/components/JobsView.d.ts +6 -0
  131. package/dist/src/ui/components/JobsView.js +257 -0
  132. package/dist/src/ui/components/JobsView.js.map +1 -0
  133. package/dist/src/ui/components/KVStoreViewer.d.ts +11 -0
  134. package/dist/src/ui/components/KVStoreViewer.js +168 -0
  135. package/dist/src/ui/components/KVStoreViewer.js.map +1 -0
  136. package/dist/src/ui/components/NotificationViewer.d.ts +16 -0
  137. package/dist/src/ui/components/NotificationViewer.js +69 -0
  138. package/dist/src/ui/components/NotificationViewer.js.map +1 -0
  139. package/dist/src/ui/components/SecretsStoreViewer.d.ts +11 -0
  140. package/dist/src/ui/components/SecretsStoreViewer.js +179 -0
  141. package/dist/src/ui/components/SecretsStoreViewer.js.map +1 -0
  142. package/dist/src/ui/components/SettingsStoreViewer.d.ts +24 -0
  143. package/dist/src/ui/components/SettingsStoreViewer.js +132 -0
  144. package/dist/src/ui/components/SettingsStoreViewer.js.map +1 -0
  145. package/dist/src/ui/components/StoreViewer.d.ts +16 -0
  146. package/dist/src/ui/components/StoreViewer.js +86 -0
  147. package/dist/src/ui/components/StoreViewer.js.map +1 -0
  148. package/dist/src/ui/components/TabbedConsole.d.ts +15 -0
  149. package/dist/src/ui/components/TabbedConsole.js +93 -0
  150. package/dist/src/ui/components/TabbedConsole.js.map +1 -0
  151. package/dist/src/ui/components/common/DataTree.d.ts +15 -0
  152. package/dist/src/ui/components/common/DataTree.js +95 -0
  153. package/dist/src/ui/components/common/DataTree.js.map +1 -0
  154. package/dist/src/ui/components/common/EyeIcon.d.ts +11 -0
  155. package/dist/src/ui/components/common/EyeIcon.js +11 -0
  156. package/dist/src/ui/components/common/EyeIcon.js.map +1 -0
  157. package/dist/src/ui/index.d.ts +1 -0
  158. package/dist/src/ui/index.js +20 -0
  159. package/dist/src/ui/index.js.map +1 -0
  160. package/package.json +104 -0
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Configuration interface for local app state
3
+ */
4
+ export interface LocalAppConfig {
5
+ isInstalled: boolean;
6
+ functionGuids?: Record<string, string>;
7
+ }
8
+ /**
9
+ * Local configuration store that manages app state in .ocp-local/config.json
10
+ */
11
+ export declare class LocalConfigStore {
12
+ private configPath;
13
+ private configDirPath;
14
+ private config;
15
+ constructor(appRootDir: string);
16
+ /**
17
+ * Load configuration from disk or create default if not exists
18
+ */
19
+ private loadConfig;
20
+ /**
21
+ * Save configuration to disk
22
+ */
23
+ private saveConfigToDisk;
24
+ /**
25
+ * Get the current configuration
26
+ */
27
+ getConfig(): LocalAppConfig;
28
+ /**
29
+ * Get the installation status
30
+ */
31
+ isInstalled(): boolean;
32
+ /**
33
+ * Set the installation status
34
+ */
35
+ setInstalled(isInstalled: boolean): void;
36
+ /**
37
+ * Update the entire configuration
38
+ */
39
+ updateConfig(newConfig: Partial<LocalAppConfig>): void;
40
+ /**
41
+ * Reset configuration to defaults
42
+ */
43
+ resetConfig(): void;
44
+ /**
45
+ * Get or generate a GUID for a function
46
+ */
47
+ getFunctionGuid(functionName: string): string;
48
+ /**
49
+ * Get all function GUIDs
50
+ */
51
+ getAllFunctionGuids(): Record<string, string>;
52
+ /**
53
+ * Clear all function GUIDs (useful on uninstall)
54
+ */
55
+ clearFunctionGuids(): void;
56
+ }
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.LocalConfigStore = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const crypto_1 = require("crypto");
10
+ /**
11
+ * Default configuration values
12
+ */
13
+ const DEFAULT_CONFIG = {
14
+ isInstalled: false,
15
+ functionGuids: {}
16
+ };
17
+ /**
18
+ * Local configuration store that manages app state in .ocp-local/config.json
19
+ */
20
+ class LocalConfigStore {
21
+ constructor(appRootDir) {
22
+ this.configDirPath = path_1.default.join(appRootDir, '.ocp-local');
23
+ this.configPath = path_1.default.join(this.configDirPath, 'config.json');
24
+ this.config = this.loadConfig();
25
+ }
26
+ /**
27
+ * Load configuration from disk or create default if not exists
28
+ */
29
+ loadConfig() {
30
+ try {
31
+ // Ensure the .ocp-local directory exists
32
+ if (!fs_1.default.existsSync(this.configDirPath)) {
33
+ fs_1.default.mkdirSync(this.configDirPath, { recursive: true });
34
+ }
35
+ // Load existing config if file exists
36
+ if (fs_1.default.existsSync(this.configPath)) {
37
+ const configData = fs_1.default.readFileSync(this.configPath, 'utf-8');
38
+ const parsedConfig = JSON.parse(configData);
39
+ // Merge with defaults to ensure all required properties exist
40
+ return { ...DEFAULT_CONFIG, ...parsedConfig };
41
+ }
42
+ // Create default config file
43
+ this.saveConfigToDisk(DEFAULT_CONFIG);
44
+ return { ...DEFAULT_CONFIG };
45
+ }
46
+ catch (error) {
47
+ console.warn(`Failed to load config from ${this.configPath}, using defaults:`, error);
48
+ return { ...DEFAULT_CONFIG };
49
+ }
50
+ }
51
+ /**
52
+ * Save configuration to disk
53
+ */
54
+ saveConfigToDisk(config) {
55
+ try {
56
+ // Ensure the .ocp-local directory exists
57
+ if (!fs_1.default.existsSync(this.configDirPath)) {
58
+ fs_1.default.mkdirSync(this.configDirPath, { recursive: true });
59
+ }
60
+ // Write config to file
61
+ fs_1.default.writeFileSync(this.configPath, JSON.stringify(config, null, 2), 'utf-8');
62
+ }
63
+ catch (error) {
64
+ console.error(`Failed to save config to ${this.configPath}:`, error);
65
+ throw error;
66
+ }
67
+ }
68
+ /**
69
+ * Get the current configuration
70
+ */
71
+ getConfig() {
72
+ return { ...this.config };
73
+ }
74
+ /**
75
+ * Get the installation status
76
+ */
77
+ isInstalled() {
78
+ return this.config.isInstalled;
79
+ }
80
+ /**
81
+ * Set the installation status
82
+ */
83
+ setInstalled(isInstalled) {
84
+ this.config.isInstalled = isInstalled;
85
+ this.saveConfigToDisk(this.config);
86
+ }
87
+ /**
88
+ * Update the entire configuration
89
+ */
90
+ updateConfig(newConfig) {
91
+ this.config = { ...this.config, ...newConfig };
92
+ this.saveConfigToDisk(this.config);
93
+ }
94
+ /**
95
+ * Reset configuration to defaults
96
+ */
97
+ resetConfig() {
98
+ this.config = { ...DEFAULT_CONFIG };
99
+ this.saveConfigToDisk(this.config);
100
+ }
101
+ /**
102
+ * Get or generate a GUID for a function
103
+ */
104
+ getFunctionGuid(functionName) {
105
+ if (!this.config.functionGuids) {
106
+ this.config.functionGuids = {};
107
+ }
108
+ if (!this.config.functionGuids[functionName]) {
109
+ this.config.functionGuids[functionName] = (0, crypto_1.randomUUID)();
110
+ this.saveConfigToDisk(this.config);
111
+ }
112
+ return this.config.functionGuids[functionName];
113
+ }
114
+ /**
115
+ * Get all function GUIDs
116
+ */
117
+ getAllFunctionGuids() {
118
+ return { ...(this.config.functionGuids || {}) };
119
+ }
120
+ /**
121
+ * Clear all function GUIDs (useful on uninstall)
122
+ */
123
+ clearFunctionGuids() {
124
+ this.config.functionGuids = {};
125
+ this.saveConfigToDisk(this.config);
126
+ }
127
+ }
128
+ exports.LocalConfigStore = LocalConfigStore;
129
+ //# sourceMappingURL=LocalConfigStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocalConfigStore.js","sourceRoot":"","sources":["../../../../src/local_engine/storage/LocalConfigStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Job execution status enum
3
+ */
4
+ export declare enum JobExecutionStatus {
5
+ PENDING = "pending",
6
+ RUNNING = "running",
7
+ COMPLETED = "completed",
8
+ FAILED = "failed",
9
+ INTERRUPTED = "interrupted"
10
+ }
11
+ /**
12
+ * Job execution record
13
+ */
14
+ export interface JobExecution {
15
+ id: string;
16
+ jobId: string;
17
+ status: JobExecutionStatus;
18
+ startedAt: Date;
19
+ completedAt?: Date;
20
+ parameters: Record<string, any>;
21
+ error?: {
22
+ message: string;
23
+ stack?: string;
24
+ };
25
+ executionTime?: number;
26
+ stateCount: number;
27
+ }
28
+ /**
29
+ * Job state snapshot
30
+ */
31
+ export interface JobStateSnapshot {
32
+ id: string;
33
+ executionId: string;
34
+ timestamp: Date;
35
+ state: Record<string, any>;
36
+ complete: boolean;
37
+ stateHash: string;
38
+ phase: 'prepare' | 'perform';
39
+ }
40
+ /**
41
+ * Local storage for job executions and state history
42
+ */
43
+ export declare class LocalJobStore {
44
+ private appDir;
45
+ private static instances;
46
+ private jobsDir;
47
+ private executionsDir;
48
+ private statesDir;
49
+ private constructor();
50
+ /**
51
+ * Get singleton instance for the given app directory
52
+ */
53
+ static getInstance(appDir: string): LocalJobStore;
54
+ /**
55
+ * Ensure required directories exist
56
+ */
57
+ private ensureDirectories;
58
+ /**
59
+ * Create a new job execution record
60
+ */
61
+ createExecution(jobId: string, parameters?: Record<string, any>): JobExecution;
62
+ /**
63
+ * Update job execution status
64
+ */
65
+ updateExecutionStatus(executionId: string, status: JobExecutionStatus, error?: {
66
+ message: string;
67
+ stack?: string;
68
+ }): void;
69
+ /**
70
+ * Save job state snapshot
71
+ */
72
+ saveState(executionId: string, state: Record<string, any>, complete: boolean, stateHash: string, phase: 'prepare' | 'perform'): JobStateSnapshot;
73
+ /**
74
+ * Get job execution by ID
75
+ */
76
+ getExecution(executionId: string): JobExecution | null;
77
+ /**
78
+ * Get all executions, optionally filtered by job ID
79
+ */
80
+ getExecutions(jobId?: string): JobExecution[];
81
+ /**
82
+ * Get state snapshots for an execution
83
+ */
84
+ getExecutionStates(executionId: string): JobStateSnapshot[];
85
+ /**
86
+ * Get latest state for an execution
87
+ */
88
+ getLatestState(executionId: string): JobStateSnapshot | null;
89
+ /**
90
+ * Save execution to disk
91
+ */
92
+ private saveExecution;
93
+ /**
94
+ * Clean up old executions (7 days retention)
95
+ */
96
+ cleanup(): void;
97
+ /**
98
+ * Delete execution and its states
99
+ */
100
+ private deleteExecution;
101
+ /**
102
+ * Get summary statistics
103
+ */
104
+ getStats(): {
105
+ totalExecutions: number;
106
+ runningExecutions: number;
107
+ completedExecutions: number;
108
+ failedExecutions: number;
109
+ };
110
+ }
@@ -0,0 +1,239 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.LocalJobStore = exports.JobExecutionStatus = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const crypto_1 = require("crypto");
10
+ /**
11
+ * Job execution status enum
12
+ */
13
+ var JobExecutionStatus;
14
+ (function (JobExecutionStatus) {
15
+ JobExecutionStatus["PENDING"] = "pending";
16
+ JobExecutionStatus["RUNNING"] = "running";
17
+ JobExecutionStatus["COMPLETED"] = "completed";
18
+ JobExecutionStatus["FAILED"] = "failed";
19
+ JobExecutionStatus["INTERRUPTED"] = "interrupted";
20
+ })(JobExecutionStatus = exports.JobExecutionStatus || (exports.JobExecutionStatus = {}));
21
+ /**
22
+ * Local storage for job executions and state history
23
+ */
24
+ class LocalJobStore {
25
+ constructor(appDir) {
26
+ this.appDir = appDir;
27
+ this.jobsDir = path_1.default.join(appDir, '.ocp-local', 'jobs');
28
+ this.executionsDir = path_1.default.join(this.jobsDir, 'executions');
29
+ this.statesDir = path_1.default.join(this.jobsDir, 'states');
30
+ this.ensureDirectories();
31
+ }
32
+ /**
33
+ * Get singleton instance for the given app directory
34
+ */
35
+ static getInstance(appDir) {
36
+ if (!this.instances.has(appDir)) {
37
+ this.instances.set(appDir, new LocalJobStore(appDir));
38
+ }
39
+ return this.instances.get(appDir);
40
+ }
41
+ /**
42
+ * Ensure required directories exist
43
+ */
44
+ ensureDirectories() {
45
+ [this.jobsDir, this.executionsDir, this.statesDir].forEach(dir => {
46
+ if (!fs_1.default.existsSync(dir)) {
47
+ fs_1.default.mkdirSync(dir, { recursive: true });
48
+ }
49
+ });
50
+ }
51
+ /**
52
+ * Create a new job execution record
53
+ */
54
+ createExecution(jobId, parameters = {}) {
55
+ const execution = {
56
+ id: (0, crypto_1.randomUUID)(),
57
+ jobId,
58
+ status: JobExecutionStatus.PENDING,
59
+ startedAt: new Date(),
60
+ parameters,
61
+ stateCount: 0
62
+ };
63
+ this.saveExecution(execution);
64
+ return execution;
65
+ }
66
+ /**
67
+ * Update job execution status
68
+ */
69
+ updateExecutionStatus(executionId, status, error) {
70
+ const execution = this.getExecution(executionId);
71
+ if (!execution) {
72
+ throw new Error(`Execution not found: ${executionId}`);
73
+ }
74
+ execution.status = status;
75
+ if (error) {
76
+ execution.error = error;
77
+ }
78
+ if (status === JobExecutionStatus.COMPLETED || status === JobExecutionStatus.FAILED || status === JobExecutionStatus.INTERRUPTED) {
79
+ execution.completedAt = new Date();
80
+ execution.executionTime = execution.completedAt.getTime() - execution.startedAt.getTime();
81
+ }
82
+ this.saveExecution(execution);
83
+ }
84
+ /**
85
+ * Save job state snapshot
86
+ */
87
+ saveState(executionId, state, complete, stateHash, phase) {
88
+ const snapshot = {
89
+ id: (0, crypto_1.randomUUID)(),
90
+ executionId,
91
+ timestamp: new Date(),
92
+ state,
93
+ complete,
94
+ stateHash,
95
+ phase
96
+ };
97
+ // Create execution state directory if it doesn't exist
98
+ const executionStatesDir = path_1.default.join(this.statesDir, executionId);
99
+ if (!fs_1.default.existsSync(executionStatesDir)) {
100
+ fs_1.default.mkdirSync(executionStatesDir, { recursive: true });
101
+ }
102
+ // Save state snapshot
103
+ const stateFile = path_1.default.join(executionStatesDir, `state-${snapshot.timestamp.getTime()}.json`);
104
+ fs_1.default.writeFileSync(stateFile, JSON.stringify(snapshot, null, 2));
105
+ // Update state count in execution
106
+ const execution = this.getExecution(executionId);
107
+ if (execution) {
108
+ execution.stateCount++;
109
+ this.saveExecution(execution);
110
+ }
111
+ return snapshot;
112
+ }
113
+ /**
114
+ * Get job execution by ID
115
+ */
116
+ getExecution(executionId) {
117
+ const executionFile = path_1.default.join(this.executionsDir, `${executionId}.json`);
118
+ if (!fs_1.default.existsSync(executionFile)) {
119
+ return null;
120
+ }
121
+ try {
122
+ const data = JSON.parse(fs_1.default.readFileSync(executionFile, 'utf8'));
123
+ // Convert date strings back to Date objects
124
+ data.startedAt = new Date(data.startedAt);
125
+ if (data.completedAt) {
126
+ data.completedAt = new Date(data.completedAt);
127
+ }
128
+ return data;
129
+ }
130
+ catch (error) {
131
+ console.error(`Error reading execution file ${executionFile}:`, error);
132
+ return null;
133
+ }
134
+ }
135
+ /**
136
+ * Get all executions, optionally filtered by job ID
137
+ */
138
+ getExecutions(jobId) {
139
+ if (!fs_1.default.existsSync(this.executionsDir)) {
140
+ return [];
141
+ }
142
+ const executions = [];
143
+ const files = fs_1.default.readdirSync(this.executionsDir);
144
+ for (const file of files) {
145
+ if (file.endsWith('.json')) {
146
+ const executionId = file.replace('.json', '');
147
+ const execution = this.getExecution(executionId);
148
+ if (execution && (!jobId || execution.jobId === jobId)) {
149
+ executions.push(execution);
150
+ }
151
+ }
152
+ }
153
+ // Sort by start time (newest first)
154
+ return executions.sort((a, b) => b.startedAt.getTime() - a.startedAt.getTime());
155
+ }
156
+ /**
157
+ * Get state snapshots for an execution
158
+ */
159
+ getExecutionStates(executionId) {
160
+ const executionStatesDir = path_1.default.join(this.statesDir, executionId);
161
+ if (!fs_1.default.existsSync(executionStatesDir)) {
162
+ return [];
163
+ }
164
+ const states = [];
165
+ const files = fs_1.default.readdirSync(executionStatesDir);
166
+ for (const file of files) {
167
+ if (file.endsWith('.json')) {
168
+ try {
169
+ const stateFile = path_1.default.join(executionStatesDir, file);
170
+ const data = JSON.parse(fs_1.default.readFileSync(stateFile, 'utf8'));
171
+ data.timestamp = new Date(data.timestamp);
172
+ states.push(data);
173
+ }
174
+ catch (error) {
175
+ console.error(`Error reading state file ${file}:`, error);
176
+ }
177
+ }
178
+ }
179
+ // Sort by timestamp (oldest first)
180
+ return states.sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());
181
+ }
182
+ /**
183
+ * Get latest state for an execution
184
+ */
185
+ getLatestState(executionId) {
186
+ const states = this.getExecutionStates(executionId);
187
+ return states.length > 0 ? states[states.length - 1] : null;
188
+ }
189
+ /**
190
+ * Save execution to disk
191
+ */
192
+ saveExecution(execution) {
193
+ const executionFile = path_1.default.join(this.executionsDir, `${execution.id}.json`);
194
+ fs_1.default.writeFileSync(executionFile, JSON.stringify(execution, null, 2));
195
+ }
196
+ /**
197
+ * Clean up old executions (7 days retention)
198
+ */
199
+ cleanup() {
200
+ const retentionMs = 7 * 24 * 60 * 60 * 1000; // 7 days
201
+ const cutoff = new Date(Date.now() - retentionMs);
202
+ const executions = this.getExecutions();
203
+ for (const execution of executions) {
204
+ if (execution.startedAt < cutoff) {
205
+ this.deleteExecution(execution.id);
206
+ }
207
+ }
208
+ }
209
+ /**
210
+ * Delete execution and its states
211
+ */
212
+ deleteExecution(executionId) {
213
+ // Delete execution file
214
+ const executionFile = path_1.default.join(this.executionsDir, `${executionId}.json`);
215
+ if (fs_1.default.existsSync(executionFile)) {
216
+ fs_1.default.unlinkSync(executionFile);
217
+ }
218
+ // Delete state directory
219
+ const executionStatesDir = path_1.default.join(this.statesDir, executionId);
220
+ if (fs_1.default.existsSync(executionStatesDir)) {
221
+ fs_1.default.rmSync(executionStatesDir, { recursive: true, force: true });
222
+ }
223
+ }
224
+ /**
225
+ * Get summary statistics
226
+ */
227
+ getStats() {
228
+ const executions = this.getExecutions();
229
+ return {
230
+ totalExecutions: executions.length,
231
+ runningExecutions: executions.filter(e => e.status === JobExecutionStatus.RUNNING).length,
232
+ completedExecutions: executions.filter(e => e.status === JobExecutionStatus.COMPLETED).length,
233
+ failedExecutions: executions.filter(e => e.status === JobExecutionStatus.FAILED).length
234
+ };
235
+ }
236
+ }
237
+ exports.LocalJobStore = LocalJobStore;
238
+ LocalJobStore.instances = new Map();
239
+ //# sourceMappingURL=LocalJobStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocalJobStore.js","sourceRoot":"","sources":["../../../../src/local_engine/storage/LocalJobStore.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAoB;AACpB,gDAAwB;AACxB,mCAAoC;AAEpC;;GAEG;AACH,IAAY,kBAMX;AAND,WAAY,kBAAkB;IAC5B,yCAAmB,CAAA;IACnB,yCAAmB,CAAA;IACnB,6CAAuB,CAAA;IACvB,uCAAiB,CAAA;IACjB,iDAA2B,CAAA;AAC7B,CAAC,EANW,kBAAkB,GAAlB,0BAAkB,KAAlB,0BAAkB,QAM7B;AAiCD;;GAEG;AACH,MAAa,aAAa;IAMxB,YAA4B,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;QACxC,IAAI,CAAC,OAAO,GAAG,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;QACvD,IAAI,CAAC,aAAa,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC3D,IAAI,CAAC,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAEnD,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC3B,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,WAAW,CAAC,MAAc;QACtC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;YAC/B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;SACvD;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC;IACrC,CAAC;IAED;;OAEG;IACK,iBAAiB;QACvB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YAC/D,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;gBACvB,YAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;aACxC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACI,eAAe,CAAC,KAAa,EAAE,aAAkC,EAAE;QACxE,MAAM,SAAS,GAAiB;YAC9B,EAAE,EAAE,IAAA,mBAAU,GAAE;YAChB,KAAK;YACL,MAAM,EAAE,kBAAkB,CAAC,OAAO;YAClC,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,UAAU;YACV,UAAU,EAAE,CAAC;SACd,CAAC;QAEF,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAC9B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACI,qBAAqB,CAC1B,WAAmB,EACnB,MAA0B,EAC1B,KAA2C;QAE3C,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;QACjD,IAAI,CAAC,SAAS,EAAE;YACd,MAAM,IAAI,KAAK,CAAC,wBAAwB,WAAW,EAAE,CAAC,CAAC;SACxD;QAED,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC;QAC1B,IAAI,KAAK,EAAE;YACT,SAAS,CAAC,KAAK,GAAG,KAAK,CAAC;SACzB;QAED,IAAI,MAAM,KAAK,kBAAkB,CAAC,SAAS,IAAI,MAAM,KAAK,kBAAkB,CAAC,MAAM,IAAI,MAAM,KAAK,kBAAkB,CAAC,WAAW,EAAE;YAChI,SAAS,CAAC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC;YACnC,SAAS,CAAC,aAAa,GAAG,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;SAC3F;QAED,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IAChC,CAAC;IAED;;OAEG;IACI,SAAS,CAAC,WAAmB,EAAE,KAA0B,EAAE,QAAiB,EAAE,SAAiB,EAAE,KAA4B;QAClI,MAAM,QAAQ,GAAqB;YACjC,EAAE,EAAE,IAAA,mBAAU,GAAE;YAChB,WAAW;YACX,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,KAAK;YACL,QAAQ;YACR,SAAS;YACT,KAAK;SACN,CAAC;QAEF,uDAAuD;QACvD,MAAM,kBAAkB,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAClE,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE;YACtC,YAAE,CAAC,SAAS,CAAC,kBAAkB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;SACvD;QAED,sBAAsB;QACtB,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,SAAS,QAAQ,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9F,YAAE,CAAC,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAE/D,kCAAkC;QAClC,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;QACjD,IAAI,SAAS,EAAE;YACb,SAAS,CAAC,UAAU,EAAE,CAAC;YACvB,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;SAC/B;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACI,YAAY,CAAC,WAAmB;QACrC,MAAM,aAAa,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,WAAW,OAAO,CAAC,CAAC;QAE3E,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE;YACjC,OAAO,IAAI,CAAC;SACb;QAED,IAAI;YACF,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC;YAChE,4CAA4C;YAC5C,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC1C,IAAI,IAAI,CAAC,WAAW,EAAE;gBACpB,IAAI,CAAC,WAAW,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;aAC/C;YACD,OAAO,IAAI,CAAC;SACb;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,KAAK,CAAC,gCAAgC,aAAa,GAAG,EAAE,KAAK,CAAC,CAAC;YACvE,OAAO,IAAI,CAAC;SACb;IACH,CAAC;IAED;;OAEG;IACI,aAAa,CAAC,KAAc;QACjC,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE;YACtC,OAAO,EAAE,CAAC;SACX;QAED,MAAM,UAAU,GAAmB,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,YAAE,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAEjD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;YACxB,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;gBAC1B,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;gBAEjD,IAAI,SAAS,IAAI,CAAC,CAAC,KAAK,IAAI,SAAS,CAAC,KAAK,KAAK,KAAK,CAAC,EAAE;oBACtD,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;iBAC5B;aACF;SACF;QAED,oCAAoC;QACpC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;IAClF,CAAC;IAED;;OAEG;IACI,kBAAkB,CAAC,WAAmB;QAC3C,MAAM,kBAAkB,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAElE,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE;YACtC,OAAO,EAAE,CAAC;SACX;QAED,MAAM,MAAM,GAAuB,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,YAAE,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC;QAEjD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;YACxB,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;gBAC1B,IAAI;oBACF,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;oBACtD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;oBAC5D,IAAI,CAAC,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;oBAC1C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;iBACnB;gBAAC,OAAO,KAAK,EAAE;oBACd,OAAO,CAAC,KAAK,CAAC,4BAA4B,IAAI,GAAG,EAAE,KAAK,CAAC,CAAC;iBAC3D;aACF;SACF;QAED,mCAAmC;QACnC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED;;OAEG;IACI,cAAc,CAAC,WAAmB;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QACpD,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9D,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,SAAuB;QAC3C,MAAM,aAAa,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;QAC5E,YAAE,CAAC,aAAa,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACtE,CAAC;IAED;;OAEG;IACI,OAAO;QACZ,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,SAAS;QACtD,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC,CAAC;QAElD,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACxC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;YAClC,IAAI,SAAS,CAAC,SAAS,GAAG,MAAM,EAAE;gBAChC,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;aACpC;SACF;IACH,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,WAAmB;QACzC,wBAAwB;QACxB,MAAM,aAAa,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,WAAW,OAAO,CAAC,CAAC;QAC3E,IAAI,YAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE;YAChC,YAAE,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;SAC9B;QAED,yBAAyB;QACzB,MAAM,kBAAkB,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAClE,IAAI,YAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE;YACrC,YAAE,CAAC,MAAM,CAAC,kBAAkB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;SACjE;IACH,CAAC;IAED;;OAEG;IACI,QAAQ;QAMb,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QAExC,OAAO;YACL,eAAe,EAAE,UAAU,CAAC,MAAM;YAClC,iBAAiB,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,kBAAkB,CAAC,OAAO,CAAC,CAAC,MAAM;YACzF,mBAAmB,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,kBAAkB,CAAC,SAAS,CAAC,CAAC,MAAM;YAC7F,gBAAgB,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,kBAAkB,CAAC,MAAM,CAAC,CAAC,MAAM;SACxF,CAAC;IACJ,CAAC;;AAjQH,sCAkQC;AAjQgB,uBAAS,GAAG,IAAI,GAAG,EAAyB,CAAC"}
@@ -0,0 +1,105 @@
1
+ import { KVStore, KVHash, KVRowOptions, KVPatchUpdater, MultiValue, Value } from '../../types/kvstore';
2
+ import { NumberSet } from './NumberSet';
3
+ import { StringSet } from './StringSet';
4
+ /**
5
+ * Local implementation of KVStore that persists data to disk
6
+ * Follows the pattern of LocalSettingsStore with singleton per app directory
7
+ */
8
+ export declare class LocalKVStore implements KVStore {
9
+ private static instances;
10
+ private kvStorePath;
11
+ private configDirPath;
12
+ private appRootDir;
13
+ private storeFileName;
14
+ private constructor();
15
+ /**
16
+ * Get or create a singleton instance for the given app directory
17
+ */
18
+ static getInstance(appRootDir: string, storeFileName?: string): LocalKVStore;
19
+ /**
20
+ * Clear singleton instance for testing
21
+ */
22
+ static clearInstance(appRootDir: string, storeFileName?: string): void;
23
+ /**
24
+ * Clear all singleton instances for testing
25
+ */
26
+ static clearAllInstances(): void;
27
+ /**
28
+ * Ensure store file exists with empty structure
29
+ */
30
+ private ensureStoreFileExists;
31
+ /**
32
+ * Load data from disk and clean up expired entries
33
+ */
34
+ private loadDataFromDisk;
35
+ /**
36
+ * Save data to disk atomically
37
+ */
38
+ private saveDataToDisk;
39
+ /**
40
+ * Deserialize data with custom handling for NumberSet and StringSet
41
+ */
42
+ private deserializeValue;
43
+ /**
44
+ * Get stored item with deserialization
45
+ */
46
+ private getStoredItem;
47
+ /**
48
+ * Store item with optional TTL
49
+ */
50
+ private storeItem;
51
+ get<T extends KVHash>(key: string, fields?: string[]): Promise<T>;
52
+ put<T extends KVHash>(key: string, value: T, options?: KVRowOptions): Promise<T>;
53
+ patch<T extends KVHash>(key: string, value: T, options?: KVRowOptions): Promise<T>;
54
+ patch<T extends KVHash>(key: string, updater: KVPatchUpdater<T>, options?: KVRowOptions): Promise<T>;
55
+ delete<T extends KVHash>(key: string, fields?: string[]): Promise<T>;
56
+ exists(key: string): Promise<boolean>;
57
+ increment(key: string, field: string, amount?: number, options?: KVRowOptions): Promise<number>;
58
+ incrementMulti(key: string, fieldAmounts: MultiValue<number>, options?: KVRowOptions): Promise<MultiValue<number>>;
59
+ shift<T extends Value>(key: string, field: string): Promise<T | undefined>;
60
+ shiftMulti<T extends Value>(key: string, fieldCounts: MultiValue<number>): Promise<MultiValue<T[]>>;
61
+ unshift<T extends Value>(key: string, field: string, value: T): Promise<void>;
62
+ unshiftMulti<T extends Value>(key: string, fieldValues: MultiValue<T[]>): Promise<void>;
63
+ peek<T extends Value>(key: string, field: string): Promise<T | undefined>;
64
+ peekMulti<T extends Value>(key: string, fieldCounts: MultiValue<number>): Promise<MultiValue<T[]>>;
65
+ append<T extends Value>(key: string, field: string, value: T): Promise<void>;
66
+ appendMulti<T extends Value>(key: string, fieldValues: MultiValue<T[]>): Promise<void>;
67
+ addNumber(key: string, field: string, value: number): Promise<boolean>;
68
+ addNumberMulti(key: string, fieldValues: MultiValue<number[]>): Promise<MultiValue<NumberSet>>;
69
+ removeNumber(key: string, field: string, value: number): Promise<boolean>;
70
+ removeNumberMulti(key: string, fieldValues: MultiValue<number[]>): Promise<MultiValue<NumberSet>>;
71
+ hasNumber(key: string, field: string, value: number): Promise<boolean>;
72
+ hasNumberMulti(key: string, fieldValues: MultiValue<number[]>): Promise<MultiValue<NumberSet>>;
73
+ addString(key: string, field: string, value: string): Promise<boolean>;
74
+ addStringMulti(key: string, fieldValues: MultiValue<string[]>): Promise<MultiValue<StringSet>>;
75
+ removeString(key: string, field: string, value: string): Promise<boolean>;
76
+ removeStringMulti(key: string, fieldValues: MultiValue<string[]>): Promise<MultiValue<StringSet>>;
77
+ hasString(key: string, field: string, value: string): Promise<boolean>;
78
+ hasStringMulti(key: string, fieldValues: MultiValue<string[]>): Promise<MultiValue<StringSet>>;
79
+ /**
80
+ * Get all stored data as a simple key-value object for the UI
81
+ */
82
+ getAllData(): {
83
+ [key: string]: any;
84
+ };
85
+ /**
86
+ * Set a simple key-value pair (for UI convenience)
87
+ */
88
+ set(key: string, value: any): Promise<void>;
89
+ /**
90
+ * Get a simple value by key (for UI convenience)
91
+ */
92
+ getValue(key: string): Promise<any>;
93
+ /**
94
+ * Delete a key entirely (for UI convenience)
95
+ */
96
+ deleteKey(key: string): Promise<boolean>;
97
+ /**
98
+ * Get all keys
99
+ */
100
+ getAllKeys(): string[];
101
+ /**
102
+ * Get a shared instance for shared KV store (global across installations of the same app)
103
+ */
104
+ static getSharedInstance(appRootDir: string): LocalKVStore;
105
+ }