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

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 (244) hide show
  1. package/README.md +51 -0
  2. package/dist/package.json +112 -0
  3. package/dist/public/bundle.82dc5d29fffb9f205051.js +3 -0
  4. package/dist/public/bundle.82dc5d29fffb9f205051.js.LICENSE.txt +92 -0
  5. package/dist/public/bundle.82dc5d29fffb9f205051.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 +115 -0
  9. package/dist/src/cli.js.map +1 -0
  10. package/dist/src/executor/DestinationExecutor.d.ts +19 -0
  11. package/dist/src/executor/DestinationExecutor.js +72 -0
  12. package/dist/src/executor/DestinationExecutor.js.map +1 -0
  13. package/dist/src/executor/FunctionExecutor.d.ts +67 -0
  14. package/dist/src/executor/FunctionExecutor.js +189 -0
  15. package/dist/src/executor/FunctionExecutor.js.map +1 -0
  16. package/dist/src/executor/JobExecutor.d.ts +79 -0
  17. package/dist/src/executor/JobExecutor.js +215 -0
  18. package/dist/src/executor/JobExecutor.js.map +1 -0
  19. package/dist/src/executor/LifecycleExecutor.d.ts +64 -0
  20. package/dist/src/executor/LifecycleExecutor.js +167 -0
  21. package/dist/src/executor/LifecycleExecutor.js.map +1 -0
  22. package/dist/src/executor/SourceExecutor.d.ts +32 -0
  23. package/dist/src/executor/SourceExecutor.js +163 -0
  24. package/dist/src/executor/SourceExecutor.js.map +1 -0
  25. package/dist/src/executor/watcher.d.ts +62 -0
  26. package/dist/src/executor/watcher.js +213 -0
  27. package/dist/src/executor/watcher.js.map +1 -0
  28. package/dist/src/functions/hello.d.ts +4 -0
  29. package/dist/src/functions/hello.js +8 -0
  30. package/dist/src/functions/hello.js.map +1 -0
  31. package/dist/src/index.d.ts +1 -0
  32. package/dist/src/index.js +9 -0
  33. package/dist/src/index.js.map +1 -0
  34. package/dist/src/jobs/dailyJob.d.ts +4 -0
  35. package/dist/src/jobs/dailyJob.js +8 -0
  36. package/dist/src/jobs/dailyJob.js.map +1 -0
  37. package/dist/src/local_engine/LocalFunctionApi.d.ts +17 -0
  38. package/dist/src/local_engine/LocalFunctionApi.js +54 -0
  39. package/dist/src/local_engine/LocalFunctionApi.js.map +1 -0
  40. package/dist/src/local_engine/LocalJobApi.d.ts +67 -0
  41. package/dist/src/local_engine/LocalJobApi.js +205 -0
  42. package/dist/src/local_engine/LocalJobApi.js.map +1 -0
  43. package/dist/src/local_engine/LocalNotifier.d.ts +9 -0
  44. package/dist/src/local_engine/LocalNotifier.js +26 -0
  45. package/dist/src/local_engine/LocalNotifier.js.map +1 -0
  46. package/dist/src/local_engine/local-engine-child-base.d.ts +110 -0
  47. package/dist/src/local_engine/local-engine-child-base.js +607 -0
  48. package/dist/src/local_engine/local-engine-child-base.js.map +1 -0
  49. package/dist/src/local_engine/local-engine-client.d.ts +161 -0
  50. package/dist/src/local_engine/local-engine-client.js +888 -0
  51. package/dist/src/local_engine/local-engine-client.js.map +1 -0
  52. package/dist/src/local_engine/local-engine-types.d.ts +245 -0
  53. package/dist/src/local_engine/local-engine-types.js +6 -0
  54. package/dist/src/local_engine/local-engine-types.js.map +1 -0
  55. package/dist/src/local_engine/local-engine-unified.d.ts +71 -0
  56. package/dist/src/local_engine/local-engine-unified.js +723 -0
  57. package/dist/src/local_engine/local-engine-unified.js.map +1 -0
  58. package/dist/src/local_engine/local-engine-utils.d.ts +68 -0
  59. package/dist/src/local_engine/local-engine-utils.js +219 -0
  60. package/dist/src/local_engine/local-engine-utils.js.map +1 -0
  61. package/dist/src/local_engine/localSDKConfig.d.ts +40 -0
  62. package/dist/src/local_engine/localSDKConfig.js +247 -0
  63. package/dist/src/local_engine/localSDKConfig.js.map +1 -0
  64. package/dist/src/local_engine/storage/BaseKVStoreWrapper.d.ts +37 -0
  65. package/dist/src/local_engine/storage/BaseKVStoreWrapper.js +110 -0
  66. package/dist/src/local_engine/storage/BaseKVStoreWrapper.js.map +1 -0
  67. package/dist/src/local_engine/storage/LocalConfigStore.d.ts +74 -0
  68. package/dist/src/local_engine/storage/LocalConfigStore.js +178 -0
  69. package/dist/src/local_engine/storage/LocalConfigStore.js.map +1 -0
  70. package/dist/src/local_engine/storage/LocalJobStore.d.ts +111 -0
  71. package/dist/src/local_engine/storage/LocalJobStore.js +249 -0
  72. package/dist/src/local_engine/storage/LocalJobStore.js.map +1 -0
  73. package/dist/src/local_engine/storage/LocalKVStore.d.ts +106 -0
  74. package/dist/src/local_engine/storage/LocalKVStore.js +1061 -0
  75. package/dist/src/local_engine/storage/LocalKVStore.js.map +1 -0
  76. package/dist/src/local_engine/storage/LocalNotificationStore.d.ts +28 -0
  77. package/dist/src/local_engine/storage/LocalNotificationStore.js +149 -0
  78. package/dist/src/local_engine/storage/LocalNotificationStore.js.map +1 -0
  79. package/dist/src/local_engine/storage/LocalSecretsStore.d.ts +115 -0
  80. package/dist/src/local_engine/storage/LocalSecretsStore.js +350 -0
  81. package/dist/src/local_engine/storage/LocalSecretsStore.js.map +1 -0
  82. package/dist/src/local_engine/storage/LocalSecretsStoreWrapper.d.ts +19 -0
  83. package/dist/src/local_engine/storage/LocalSecretsStoreWrapper.js +52 -0
  84. package/dist/src/local_engine/storage/LocalSecretsStoreWrapper.js.map +1 -0
  85. package/dist/src/local_engine/storage/LocalSettingsStore.d.ts +168 -0
  86. package/dist/src/local_engine/storage/LocalSettingsStore.js +509 -0
  87. package/dist/src/local_engine/storage/LocalSettingsStore.js.map +1 -0
  88. package/dist/src/local_engine/storage/LocalSettingsStoreWrapper.d.ts +15 -0
  89. package/dist/src/local_engine/storage/LocalSettingsStoreWrapper.js +28 -0
  90. package/dist/src/local_engine/storage/LocalSettingsStoreWrapper.js.map +1 -0
  91. package/dist/src/local_engine/storage/NumberSet.d.ts +21 -0
  92. package/dist/src/local_engine/storage/NumberSet.js +32 -0
  93. package/dist/src/local_engine/storage/NumberSet.js.map +1 -0
  94. package/dist/src/local_engine/storage/SourceDataStore.d.ts +23 -0
  95. package/dist/src/local_engine/storage/SourceDataStore.js +83 -0
  96. package/dist/src/local_engine/storage/SourceDataStore.js.map +1 -0
  97. package/dist/src/local_engine/storage/SourceJobExecutionStore.d.ts +25 -0
  98. package/dist/src/local_engine/storage/SourceJobExecutionStore.js +61 -0
  99. package/dist/src/local_engine/storage/SourceJobExecutionStore.js.map +1 -0
  100. package/dist/src/local_engine/storage/StringSet.d.ts +21 -0
  101. package/dist/src/local_engine/storage/StringSet.js +32 -0
  102. package/dist/src/local_engine/storage/StringSet.js.map +1 -0
  103. package/dist/src/local_engine/types.d.ts +53 -0
  104. package/dist/src/local_engine/types.js +6 -0
  105. package/dist/src/local_engine/types.js.map +1 -0
  106. package/dist/src/local_engine/utils.d.ts +33 -0
  107. package/dist/src/local_engine/utils.js +143 -0
  108. package/dist/src/local_engine/utils.js.map +1 -0
  109. package/dist/src/logging/LogManager.d.ts +246 -0
  110. package/dist/src/logging/LogManager.js +343 -0
  111. package/dist/src/logging/LogManager.js.map +1 -0
  112. package/dist/src/server/api/destinations.d.ts +7 -0
  113. package/dist/src/server/api/destinations.js +170 -0
  114. package/dist/src/server/api/destinations.js.map +1 -0
  115. package/dist/src/server/api/functions.d.ts +7 -0
  116. package/dist/src/server/api/functions.js +80 -0
  117. package/dist/src/server/api/functions.js.map +1 -0
  118. package/dist/src/server/api/jobs.d.ts +10 -0
  119. package/dist/src/server/api/jobs.js +244 -0
  120. package/dist/src/server/api/jobs.js.map +1 -0
  121. package/dist/src/server/api/settings.d.ts +6 -0
  122. package/dist/src/server/api/settings.js +116 -0
  123. package/dist/src/server/api/settings.js.map +1 -0
  124. package/dist/src/server/api/sources.d.ts +7 -0
  125. package/dist/src/server/api/sources.js +382 -0
  126. package/dist/src/server/api/sources.js.map +1 -0
  127. package/dist/src/server/api/stores.d.ts +2 -0
  128. package/dist/src/server/api/stores.js +341 -0
  129. package/dist/src/server/api/stores.js.map +1 -0
  130. package/dist/src/server/api/v1.d.ts +10 -0
  131. package/dist/src/server/api/v1.js +718 -0
  132. package/dist/src/server/api/v1.js.map +1 -0
  133. package/dist/src/server/api.d.ts +8 -0
  134. package/dist/src/server/api.js +217 -0
  135. package/dist/src/server/api.js.map +1 -0
  136. package/dist/src/server/app-discovery.d.ts +5 -0
  137. package/dist/src/server/app-discovery.js +113 -0
  138. package/dist/src/server/app-discovery.js.map +1 -0
  139. package/dist/src/server/config.d.ts +26 -0
  140. package/dist/src/server/config.js +112 -0
  141. package/dist/src/server/config.js.map +1 -0
  142. package/dist/src/server/mockDataGenerator.d.ts +1 -0
  143. package/dist/src/server/mockDataGenerator.js +154 -0
  144. package/dist/src/server/mockDataGenerator.js.map +1 -0
  145. package/dist/src/server/websocket.d.ts +0 -0
  146. package/dist/src/server/websocket.js +2 -0
  147. package/dist/src/server/websocket.js.map +1 -0
  148. package/dist/src/server.d.ts +2 -0
  149. package/dist/src/server.js +735 -0
  150. package/dist/src/server.js.map +1 -0
  151. package/dist/src/types/app.d.ts +154 -0
  152. package/dist/src/types/app.js +24 -0
  153. package/dist/src/types/app.js.map +1 -0
  154. package/dist/src/types/kvstore.d.ts +320 -0
  155. package/dist/src/types/kvstore.js +5 -0
  156. package/dist/src/types/kvstore.js.map +1 -0
  157. package/dist/src/ui/components/App.d.ts +6 -0
  158. package/dist/src/ui/components/App.js +432 -0
  159. package/dist/src/ui/components/App.js.map +1 -0
  160. package/dist/src/ui/components/DestinationBatchEditor.d.ts +7 -0
  161. package/dist/src/ui/components/DestinationBatchEditor.js +160 -0
  162. package/dist/src/ui/components/DestinationBatchEditor.js.map +1 -0
  163. package/dist/src/ui/components/DestinationSchemaViewer.d.ts +7 -0
  164. package/dist/src/ui/components/DestinationSchemaViewer.js +61 -0
  165. package/dist/src/ui/components/DestinationSchemaViewer.js.map +1 -0
  166. package/dist/src/ui/components/DestinationsView.d.ts +14 -0
  167. package/dist/src/ui/components/DestinationsView.js +68 -0
  168. package/dist/src/ui/components/DestinationsView.js.map +1 -0
  169. package/dist/src/ui/components/FunctionsView.d.ts +13 -0
  170. package/dist/src/ui/components/FunctionsView.js +288 -0
  171. package/dist/src/ui/components/FunctionsView.js.map +1 -0
  172. package/dist/src/ui/components/JobsView.d.ts +13 -0
  173. package/dist/src/ui/components/JobsView.js +320 -0
  174. package/dist/src/ui/components/JobsView.js.map +1 -0
  175. package/dist/src/ui/components/KVStoreViewer.d.ts +11 -0
  176. package/dist/src/ui/components/KVStoreViewer.js +168 -0
  177. package/dist/src/ui/components/KVStoreViewer.js.map +1 -0
  178. package/dist/src/ui/components/MetadataModal.d.ts +14 -0
  179. package/dist/src/ui/components/MetadataModal.js +28 -0
  180. package/dist/src/ui/components/MetadataModal.js.map +1 -0
  181. package/dist/src/ui/components/MetadataModal.test.d.ts +1 -0
  182. package/dist/src/ui/components/MetadataModal.test.js +143 -0
  183. package/dist/src/ui/components/MetadataModal.test.js.map +1 -0
  184. package/dist/src/ui/components/NotificationViewer.d.ts +16 -0
  185. package/dist/src/ui/components/NotificationViewer.js +69 -0
  186. package/dist/src/ui/components/NotificationViewer.js.map +1 -0
  187. package/dist/src/ui/components/SecretsStoreViewer.d.ts +11 -0
  188. package/dist/src/ui/components/SecretsStoreViewer.js +179 -0
  189. package/dist/src/ui/components/SecretsStoreViewer.js.map +1 -0
  190. package/dist/src/ui/components/SettingsStoreViewer.d.ts +24 -0
  191. package/dist/src/ui/components/SettingsStoreViewer.js +132 -0
  192. package/dist/src/ui/components/SettingsStoreViewer.js.map +1 -0
  193. package/dist/src/ui/components/SourceDataViewer.d.ts +8 -0
  194. package/dist/src/ui/components/SourceDataViewer.js +84 -0
  195. package/dist/src/ui/components/SourceDataViewer.js.map +1 -0
  196. package/dist/src/ui/components/SourceJobsSection.d.ts +8 -0
  197. package/dist/src/ui/components/SourceJobsSection.js +99 -0
  198. package/dist/src/ui/components/SourceJobsSection.js.map +1 -0
  199. package/dist/src/ui/components/SourceLifecycleSection.d.ts +7 -0
  200. package/dist/src/ui/components/SourceLifecycleSection.js +58 -0
  201. package/dist/src/ui/components/SourceLifecycleSection.js.map +1 -0
  202. package/dist/src/ui/components/SourceSchemaViewer.d.ts +7 -0
  203. package/dist/src/ui/components/SourceSchemaViewer.js +65 -0
  204. package/dist/src/ui/components/SourceSchemaViewer.js.map +1 -0
  205. package/dist/src/ui/components/SourceWebhookEditor.d.ts +8 -0
  206. package/dist/src/ui/components/SourceWebhookEditor.js +181 -0
  207. package/dist/src/ui/components/SourceWebhookEditor.js.map +1 -0
  208. package/dist/src/ui/components/SourcesView.d.ts +14 -0
  209. package/dist/src/ui/components/SourcesView.js +74 -0
  210. package/dist/src/ui/components/SourcesView.js.map +1 -0
  211. package/dist/src/ui/components/StoreViewer.d.ts +16 -0
  212. package/dist/src/ui/components/StoreViewer.js +86 -0
  213. package/dist/src/ui/components/StoreViewer.js.map +1 -0
  214. package/dist/src/ui/components/TabbedConsole.d.ts +17 -0
  215. package/dist/src/ui/components/TabbedConsole.js +163 -0
  216. package/dist/src/ui/components/TabbedConsole.js.map +1 -0
  217. package/dist/src/ui/components/common/DataTree.d.ts +15 -0
  218. package/dist/src/ui/components/common/DataTree.js +95 -0
  219. package/dist/src/ui/components/common/DataTree.js.map +1 -0
  220. package/dist/src/ui/components/common/EyeIcon.d.ts +11 -0
  221. package/dist/src/ui/components/common/EyeIcon.js +11 -0
  222. package/dist/src/ui/components/common/EyeIcon.js.map +1 -0
  223. package/dist/src/ui/hooks/useEntityNavigation.d.ts +72 -0
  224. package/dist/src/ui/hooks/useEntityNavigation.js +150 -0
  225. package/dist/src/ui/hooks/useEntityNavigation.js.map +1 -0
  226. package/dist/src/ui/hooks/useQueryParams.d.ts +6 -0
  227. package/dist/src/ui/hooks/useQueryParams.js +39 -0
  228. package/dist/src/ui/hooks/useQueryParams.js.map +1 -0
  229. package/dist/src/ui/index.d.ts +1 -0
  230. package/dist/src/ui/index.js +23 -0
  231. package/dist/src/ui/index.js.map +1 -0
  232. package/dist/src/ui/store/formStateSlice.d.ts +54 -0
  233. package/dist/src/ui/store/formStateSlice.js +94 -0
  234. package/dist/src/ui/store/formStateSlice.js.map +1 -0
  235. package/dist/src/ui/store/hooks.d.ts +6 -0
  236. package/dist/src/ui/store/hooks.js +8 -0
  237. package/dist/src/ui/store/hooks.js.map +1 -0
  238. package/dist/src/ui/store/index.d.ts +11 -0
  239. package/dist/src/ui/store/index.js +107 -0
  240. package/dist/src/ui/store/index.js.map +1 -0
  241. package/dist/src/utils/functionEndpoints.d.ts +24 -0
  242. package/dist/src/utils/functionEndpoints.js +45 -0
  243. package/dist/src/utils/functionEndpoints.js.map +1 -0
  244. package/package.json +112 -0
@@ -0,0 +1,350 @@
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.LocalSecretsStore = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const LogManager_1 = require("../../logging/LogManager");
10
+ /**
11
+ * Local secrets store that manages app secrets in .ocp-local/secrets.json
12
+ * Implements singleton pattern to ensure consistent state across wrapper and API
13
+ * Provides basic obfuscation for secrets at rest
14
+ */
15
+ class LocalSecretsStore {
16
+ constructor(appRootDir) {
17
+ this.logManager = LogManager_1.LogManager.getInstance();
18
+ this.appRootDir = appRootDir;
19
+ this.configDirPath = path_1.default.join(appRootDir, '.ocp-local');
20
+ this.secretsPath = path_1.default.join(this.configDirPath, 'secrets.json');
21
+ // Initialize secrets file if it doesn't exist
22
+ this.ensureSecretsFileExists();
23
+ }
24
+ /**
25
+ * Get or create a singleton instance for the given app directory
26
+ */
27
+ static getInstance(appRootDir) {
28
+ const normalizedPath = path_1.default.resolve(appRootDir);
29
+ if (!this.instances.has(normalizedPath)) {
30
+ this.instances.set(normalizedPath, new LocalSecretsStore(normalizedPath));
31
+ }
32
+ return this.instances.get(normalizedPath);
33
+ }
34
+ /**
35
+ * Clear all instances (useful for testing)
36
+ */
37
+ static clearAllInstances() {
38
+ this.instances.clear();
39
+ }
40
+ /**
41
+ * Ensure the secrets file exists with proper permissions
42
+ */
43
+ ensureSecretsFileExists() {
44
+ try {
45
+ // Create config directory if it doesn't exist
46
+ if (!fs_1.default.existsSync(this.configDirPath)) {
47
+ fs_1.default.mkdirSync(this.configDirPath, { recursive: true });
48
+ }
49
+ // Create secrets file if it doesn't exist
50
+ if (!fs_1.default.existsSync(this.secretsPath)) {
51
+ const defaultSecrets = {};
52
+ this.saveSecretsToDisk(defaultSecrets);
53
+ }
54
+ }
55
+ catch (error) {
56
+ this.logManager.warn(LogManager_1.LogSource.System, LogManager_1.LogCategory.Secrets, `Failed to ensure secrets file exists: ${error instanceof Error ? error.message : String(error)}`, {
57
+ id: 'secrets',
58
+ store: 'LocalSecretsStore',
59
+ operation: 'set',
60
+ error
61
+ });
62
+ }
63
+ }
64
+ /**
65
+ * Load secrets from disk with basic deobfuscation
66
+ */
67
+ loadSecretsFromDisk() {
68
+ try {
69
+ if (!fs_1.default.existsSync(this.secretsPath)) {
70
+ return {};
71
+ }
72
+ const fileContent = fs_1.default.readFileSync(this.secretsPath, 'utf-8');
73
+ const obfuscatedData = JSON.parse(fileContent);
74
+ // Deobfuscate the secrets
75
+ const secrets = {};
76
+ for (const [key, value] of Object.entries(obfuscatedData)) {
77
+ try {
78
+ if (typeof value === 'string') {
79
+ // Try to decode Base64, fallback to original value if invalid
80
+ secrets[key] = this.deobfuscateValue(value);
81
+ }
82
+ else {
83
+ // Handle nested objects
84
+ secrets[key] = this.deobfuscateObject(value);
85
+ }
86
+ }
87
+ catch (error) {
88
+ // If deobfuscation fails, keep original value
89
+ secrets[key] = value;
90
+ }
91
+ }
92
+ return secrets;
93
+ }
94
+ catch (error) {
95
+ this.logManager.warn(LogManager_1.LogSource.System, LogManager_1.LogCategory.Secrets, `Error loading secrets from disk: ${error instanceof Error ? error.message : String(error)}`, {
96
+ id: 'secrets',
97
+ store: 'LocalSecretsStore',
98
+ operation: 'get',
99
+ error
100
+ });
101
+ return {};
102
+ }
103
+ }
104
+ /**
105
+ * Save secrets to disk with basic obfuscation
106
+ */
107
+ saveSecretsToDisk(secrets) {
108
+ try {
109
+ // Obfuscate the secrets before saving
110
+ const obfuscatedSecrets = {};
111
+ for (const [key, value] of Object.entries(secrets)) {
112
+ if (typeof value === 'string') {
113
+ obfuscatedSecrets[key] = this.obfuscateValue(value);
114
+ }
115
+ else {
116
+ // Handle nested objects
117
+ obfuscatedSecrets[key] = this.obfuscateObject(value);
118
+ }
119
+ }
120
+ const jsonContent = JSON.stringify(obfuscatedSecrets, null, 2);
121
+ // Write to temp file first, then rename for atomicity
122
+ const tempPath = `${this.secretsPath}.tmp`;
123
+ fs_1.default.writeFileSync(tempPath, jsonContent, 'utf-8');
124
+ // Set restrictive permissions on the temp file
125
+ try {
126
+ fs_1.default.chmodSync(tempPath, 0o600); // Read/write for owner only
127
+ }
128
+ catch (error) {
129
+ this.logManager.warn(LogManager_1.LogSource.System, LogManager_1.LogCategory.Secrets, `Could not set restrictive permissions on secrets file: ${error instanceof Error ? error.message : String(error)}`, {
130
+ id: 'secrets',
131
+ store: 'LocalSecretsStore',
132
+ operation: 'set',
133
+ error
134
+ });
135
+ }
136
+ // Atomic rename
137
+ fs_1.default.renameSync(tempPath, this.secretsPath);
138
+ }
139
+ catch (error) {
140
+ this.logManager.error(LogManager_1.LogSource.System, LogManager_1.LogCategory.Secrets, `Error saving secrets to disk: ${error instanceof Error ? error.message : String(error)}`, {
141
+ id: 'secrets',
142
+ store: 'LocalSecretsStore',
143
+ operation: 'set',
144
+ error
145
+ });
146
+ throw error;
147
+ }
148
+ }
149
+ /**
150
+ * Basic obfuscation using Base64 encoding
151
+ */
152
+ obfuscateValue(value) {
153
+ return Buffer.from(value, 'utf-8').toString('base64');
154
+ }
155
+ /**
156
+ * Basic deobfuscation using Base64 decoding
157
+ */
158
+ deobfuscateValue(value) {
159
+ try {
160
+ return Buffer.from(value, 'base64').toString('utf-8');
161
+ }
162
+ catch (error) {
163
+ // If Base64 decoding fails, return original value
164
+ return value;
165
+ }
166
+ }
167
+ /**
168
+ * Recursively obfuscate object values
169
+ */
170
+ obfuscateObject(obj) {
171
+ if (typeof obj === 'string') {
172
+ return this.obfuscateValue(obj);
173
+ }
174
+ else if (Array.isArray(obj)) {
175
+ return obj.map(item => this.obfuscateObject(item));
176
+ }
177
+ else if (obj !== null && typeof obj === 'object') {
178
+ const obfuscated = {};
179
+ for (const [key, value] of Object.entries(obj)) {
180
+ obfuscated[key] = this.obfuscateObject(value);
181
+ }
182
+ return obfuscated;
183
+ }
184
+ return obj;
185
+ }
186
+ /**
187
+ * Recursively deobfuscate object values
188
+ */
189
+ deobfuscateObject(obj) {
190
+ if (typeof obj === 'string') {
191
+ return this.deobfuscateValue(obj);
192
+ }
193
+ else if (Array.isArray(obj)) {
194
+ return obj.map(item => this.deobfuscateObject(item));
195
+ }
196
+ else if (obj !== null && typeof obj === 'object') {
197
+ const deobfuscated = {};
198
+ for (const [key, value] of Object.entries(obj)) {
199
+ deobfuscated[key] = this.deobfuscateObject(value);
200
+ }
201
+ return deobfuscated;
202
+ }
203
+ return obj;
204
+ }
205
+ /**
206
+ * Get all secrets
207
+ */
208
+ getSecrets() {
209
+ return this.loadSecretsFromDisk();
210
+ }
211
+ /**
212
+ * Get secrets for a specific section/key
213
+ */
214
+ getSectionSecrets(section) {
215
+ const secrets = this.loadSecretsFromDisk();
216
+ return secrets[section] || {};
217
+ }
218
+ /**
219
+ * Get a specific secret value
220
+ */
221
+ getSecret(key) {
222
+ const secrets = this.loadSecretsFromDisk();
223
+ return secrets[key];
224
+ }
225
+ /**
226
+ * Set a specific secret value
227
+ */
228
+ setSecret(key, value) {
229
+ const secrets = this.loadSecretsFromDisk();
230
+ secrets[key] = value;
231
+ this.saveSecretsToDisk(secrets);
232
+ }
233
+ /**
234
+ * Update multiple secrets at once
235
+ */
236
+ updateSecrets(newSecrets) {
237
+ const secrets = this.loadSecretsFromDisk();
238
+ const updatedSecrets = { ...secrets, ...newSecrets };
239
+ this.saveSecretsToDisk(updatedSecrets);
240
+ }
241
+ /**
242
+ * Update secrets for a specific section
243
+ */
244
+ updateSectionSecrets(section, sectionSecrets) {
245
+ const secrets = this.loadSecretsFromDisk();
246
+ if (Object.keys(sectionSecrets).length === 0) {
247
+ // If empty object, delete the section
248
+ delete secrets[section];
249
+ }
250
+ else {
251
+ // Merge with existing section secrets
252
+ secrets[section] = { ...secrets[section], ...sectionSecrets };
253
+ }
254
+ this.saveSecretsToDisk(secrets);
255
+ }
256
+ /**
257
+ * Delete a specific secret
258
+ */
259
+ deleteSecret(key) {
260
+ const secrets = this.loadSecretsFromDisk();
261
+ delete secrets[key];
262
+ this.saveSecretsToDisk(secrets);
263
+ }
264
+ /**
265
+ * Delete specific fields from a secret section
266
+ */
267
+ deleteSecretFields(section, fields) {
268
+ const secrets = this.loadSecretsFromDisk();
269
+ const sectionSecrets = secrets[section];
270
+ if (sectionSecrets && typeof sectionSecrets === 'object') {
271
+ fields.forEach(field => {
272
+ delete sectionSecrets[field];
273
+ });
274
+ // If section is empty after deletion, remove it entirely
275
+ if (Object.keys(sectionSecrets).length === 0) {
276
+ delete secrets[section];
277
+ }
278
+ else {
279
+ secrets[section] = sectionSecrets;
280
+ }
281
+ this.saveSecretsToDisk(secrets);
282
+ }
283
+ }
284
+ /**
285
+ * Clear all secrets (wipe the store)
286
+ */
287
+ clearSecrets() {
288
+ this.saveSecretsToDisk({});
289
+ }
290
+ /**
291
+ * Check if secrets store is empty
292
+ */
293
+ isEmpty() {
294
+ const secrets = this.loadSecretsFromDisk();
295
+ return Object.keys(secrets).length === 0;
296
+ }
297
+ /**
298
+ * Check if a specific secret exists
299
+ */
300
+ hasSecret(key) {
301
+ const secrets = this.loadSecretsFromDisk();
302
+ return key in secrets;
303
+ }
304
+ /**
305
+ * Check if a section has any secrets
306
+ */
307
+ hasSectionSecrets(section) {
308
+ const secrets = this.loadSecretsFromDisk();
309
+ const sectionSecrets = secrets[section];
310
+ return !!(sectionSecrets && typeof sectionSecrets === 'object' && Object.keys(sectionSecrets).length > 0);
311
+ }
312
+ /**
313
+ * Get the path to the secrets file
314
+ */
315
+ getSecretsPath() {
316
+ return this.secretsPath;
317
+ }
318
+ /**
319
+ * Get the config directory path
320
+ */
321
+ getConfigDirPath() {
322
+ return this.configDirPath;
323
+ }
324
+ /**
325
+ * Wipe all secrets and remove the secrets file (for app uninstall)
326
+ */
327
+ wipeSecrets() {
328
+ try {
329
+ if (fs_1.default.existsSync(this.secretsPath)) {
330
+ fs_1.default.unlinkSync(this.secretsPath);
331
+ }
332
+ this.logManager.info(LogManager_1.LogSource.System, LogManager_1.LogCategory.Secrets, `Wiped secrets for app: ${this.appRootDir}`, {
333
+ id: 'secrets',
334
+ store: 'LocalSecretsStore',
335
+ operation: 'clear'
336
+ });
337
+ }
338
+ catch (error) {
339
+ this.logManager.warn(LogManager_1.LogSource.System, LogManager_1.LogCategory.Secrets, `Failed to wipe secrets: ${error instanceof Error ? error.message : String(error)}`, {
340
+ id: 'secrets',
341
+ store: 'LocalSecretsStore',
342
+ operation: 'clear',
343
+ error
344
+ });
345
+ }
346
+ }
347
+ }
348
+ exports.LocalSecretsStore = LocalSecretsStore;
349
+ LocalSecretsStore.instances = new Map();
350
+ //# sourceMappingURL=LocalSecretsStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocalSecretsStore.js","sourceRoot":"","sources":["../../../../src/local_engine/storage/LocalSecretsStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { LogCategory } from '../../logging/LogManager';
2
+ import { BaseKVStoreWrapper } from './BaseKVStoreWrapper';
3
+ import { LocalSecretsStore } from './LocalSecretsStore';
4
+ /**
5
+ * Wrapper to make LocalSecretsStore compatible with BaseKVStore interface
6
+ */
7
+ export declare class LocalSecretsStoreWrapper extends BaseKVStoreWrapper {
8
+ private secretsStore;
9
+ protected readonly storeName = "LocalSecretsStore";
10
+ protected readonly logCategory = LogCategory.Secrets;
11
+ constructor(secretsStore: LocalSecretsStore);
12
+ protected getSectionData(key: string): Record<string, any>;
13
+ protected updateSectionData(key: string, value: any): void;
14
+ protected hasSectionData(key: string): boolean;
15
+ /**
16
+ * Override delete to use deleteSecretFields for field-level deletion
17
+ */
18
+ delete(key: string, fields?: string[]): Promise<true>;
19
+ }
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LocalSecretsStoreWrapper = void 0;
4
+ const LogManager_1 = require("../../logging/LogManager");
5
+ const BaseKVStoreWrapper_1 = require("./BaseKVStoreWrapper");
6
+ /**
7
+ * Wrapper to make LocalSecretsStore compatible with BaseKVStore interface
8
+ */
9
+ class LocalSecretsStoreWrapper extends BaseKVStoreWrapper_1.BaseKVStoreWrapper {
10
+ constructor(secretsStore) {
11
+ super();
12
+ this.secretsStore = secretsStore;
13
+ this.storeName = 'LocalSecretsStore';
14
+ this.logCategory = LogManager_1.LogCategory.Secrets;
15
+ }
16
+ getSectionData(key) {
17
+ return this.secretsStore.getSectionSecrets(key) || {};
18
+ }
19
+ updateSectionData(key, value) {
20
+ this.secretsStore.updateSectionSecrets(key, value);
21
+ }
22
+ hasSectionData(key) {
23
+ return this.secretsStore.hasSectionSecrets(key);
24
+ }
25
+ /**
26
+ * Override delete to use deleteSecretFields for field-level deletion
27
+ */
28
+ async delete(key, fields) {
29
+ const context = {
30
+ id: key || 'unknown',
31
+ store: this.storeName,
32
+ operation: 'delete',
33
+ key
34
+ };
35
+ this.logManager.debug(LogManager_1.LogSource.System, this.logCategory, `DELETE: key="${key}", fields=${JSON.stringify(fields)}`, context);
36
+ try {
37
+ if (fields?.length) {
38
+ this.secretsStore.deleteSecretFields(key, fields);
39
+ }
40
+ else {
41
+ this.updateSectionData(key, {});
42
+ }
43
+ return true;
44
+ }
45
+ catch (error) {
46
+ this.logManager.error(LogManager_1.LogSource.System, this.logCategory, `DELETE failed: key="${key}"`, { ...context, error });
47
+ return true;
48
+ }
49
+ }
50
+ }
51
+ exports.LocalSecretsStoreWrapper = LocalSecretsStoreWrapper;
52
+ //# sourceMappingURL=LocalSecretsStoreWrapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocalSecretsStoreWrapper.js","sourceRoot":"","sources":["../../../../src/local_engine/storage/LocalSecretsStoreWrapper.ts"],"names":[],"mappings":";;;AAAA,yDAAqF;AACrF,6DAA0D;AAG1D;;GAEG;AACH,MAAa,wBAAyB,SAAQ,uCAAkB;IAI9D,YAAoB,YAA+B;QACjD,KAAK,EAAE,CAAC;QADU,iBAAY,GAAZ,YAAY,CAAmB;QAHhC,cAAS,GAAG,mBAAmB,CAAC;QAChC,gBAAW,GAAG,wBAAW,CAAC,OAAO,CAAC;IAIrD,CAAC;IAES,cAAc,CAAC,GAAW;QAClC,OAAO,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IACxD,CAAC;IAES,iBAAiB,CAAC,GAAW,EAAE,KAAU;QACjD,IAAI,CAAC,YAAY,CAAC,oBAAoB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACrD,CAAC;IAES,cAAc,CAAC,GAAW;QAClC,OAAO,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAClD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,GAAW,EAAE,MAAiB;QACzC,MAAM,OAAO,GAAsB;YACjC,EAAE,EAAE,GAAG,IAAI,SAAS;YACpB,KAAK,EAAE,IAAI,CAAC,SAAS;YACrB,SAAS,EAAE,QAAQ;YACnB,GAAG;SACJ,CAAC;QACF,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,sBAAS,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,gBAAgB,GAAG,aAAa,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAC7H,IAAI,CAAC;YACH,IAAI,MAAM,EAAE,MAAM,EAAE,CAAC;gBACnB,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YACpD,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAClC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,sBAAS,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,uBAAuB,GAAG,GAAG,EAAE,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YAChH,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF;AA3CD,4DA2CC"}
@@ -0,0 +1,168 @@
1
+ /**
2
+ * Interface for local app settings
3
+ */
4
+ export interface LocalAppSettings {
5
+ [key: string]: any;
6
+ }
7
+ /**
8
+ * Interface for settings field metadata
9
+ */
10
+ export interface SettingsFieldSchema {
11
+ type?: string;
12
+ secret?: boolean;
13
+ required?: boolean;
14
+ description?: string;
15
+ default?: any;
16
+ }
17
+ /**
18
+ * Interface for settings section schema
19
+ */
20
+ export interface SettingsSectionSchema {
21
+ [fieldName: string]: SettingsFieldSchema;
22
+ }
23
+ /**
24
+ * Interface for complete settings schema
25
+ */
26
+ export interface SettingsSchema {
27
+ [sectionName: string]: SettingsSectionSchema;
28
+ }
29
+ /**
30
+ * Interface for settings field with metadata
31
+ */
32
+ export interface SettingsFieldWithMetadata {
33
+ value: any;
34
+ isSecret: boolean;
35
+ isFromYml: boolean;
36
+ hasLocalValue: boolean;
37
+ fieldSchema?: SettingsFieldSchema;
38
+ }
39
+ /**
40
+ * Local settings store that manages app settings in .ocp-local/settings.json
41
+ * Implements singleton pattern to ensure consistent state across wrapper and API
42
+ */
43
+ export declare class LocalSettingsStore {
44
+ private static instances;
45
+ private logManager;
46
+ private settingsPath;
47
+ private configDirPath;
48
+ private appRootDir;
49
+ private settingsYmlSections;
50
+ private settingsSchema;
51
+ private constructor();
52
+ /**
53
+ * Get or create a singleton instance for the given app directory
54
+ */
55
+ static getInstance(appRootDir: string): LocalSettingsStore;
56
+ /**
57
+ * Clear singleton instance for the given app directory (useful for testing)
58
+ */
59
+ static clearInstance(appRootDir: string): void;
60
+ /**
61
+ * Clear all singleton instances (useful for testing)
62
+ */
63
+ static clearAllInstances(): void;
64
+ /**
65
+ * Parse settings.yml file to extract sections and field schemas
66
+ */
67
+ private parseSettingsYml;
68
+ /**
69
+ * Parse field schema from settings.yml fields array
70
+ */
71
+ private parseFieldsSchema;
72
+ /**
73
+ * Parse field schema from JSON Schema style properties
74
+ */
75
+ private parseJsonSchemaFields;
76
+ /**
77
+ * Create default settings structure based on sections from settings.yml
78
+ */
79
+ private createDefaultSettings;
80
+ /**
81
+ * Ensure settings file exists with default structure
82
+ */
83
+ private ensureSettingsFileExists;
84
+ /**
85
+ * Load settings from disk every time
86
+ */
87
+ private loadSettingsFromDisk;
88
+ /**
89
+ * Save settings to disk
90
+ */
91
+ private saveSettingsToDisk;
92
+ /**
93
+ * Get all current settings
94
+ */
95
+ getSettings(): LocalAppSettings;
96
+ /**
97
+ * Get settings as JSON string for API response
98
+ */
99
+ getSettingsAsJson(): string;
100
+ /**
101
+ * Get a specific setting value
102
+ */
103
+ getSetting(key: string): any;
104
+ /**
105
+ * Set a specific setting value
106
+ */
107
+ setSetting(key: string, value: any): void;
108
+ /**
109
+ * Update multiple settings at once
110
+ */
111
+ updateSettings(newSettings: Partial<LocalAppSettings>): void;
112
+ /**
113
+ * Update settings from JSON string
114
+ */
115
+ updateSettingsFromJson(jsonString: string): void;
116
+ /**
117
+ * Clear all settings (reset to empty)
118
+ */
119
+ clearSettings(): void;
120
+ /**
121
+ * Check if settings are empty
122
+ */
123
+ isEmpty(): boolean;
124
+ /**
125
+ * Remove a specific setting
126
+ */
127
+ removeSetting(key: string): boolean;
128
+ /**
129
+ * Get the list of sections parsed from settings.yml
130
+ */
131
+ getSections(): string[];
132
+ /**
133
+ * Get settings for a specific section
134
+ */
135
+ getSectionSettings(sectionName: string): any;
136
+ /**
137
+ * Update settings for a specific section.
138
+ * Preserves original values for secret fields when redacted values are submitted.
139
+ */
140
+ updateSectionSettings(sectionName: string, sectionSettings: any): void;
141
+ /**
142
+ * Get the parsed settings schema from settings.yml
143
+ */
144
+ getSettingsSchema(): SettingsSchema;
145
+ /**
146
+ * Get schema for a specific section
147
+ */
148
+ getSectionSchema(sectionName: string): SettingsSectionSchema;
149
+ /**
150
+ * Get settings for a section with metadata about each field
151
+ */
152
+ getSectionSettingsWithMetadata(sectionName: string): {
153
+ [fieldName: string]: SettingsFieldWithMetadata;
154
+ };
155
+ /**
156
+ * Get all settings with metadata organized by section
157
+ */
158
+ getAllSettingsWithMetadata(): {
159
+ [sectionName: string]: {
160
+ [fieldName: string]: SettingsFieldWithMetadata;
161
+ };
162
+ };
163
+ /**
164
+ * Get form data with secret fields redacted (matches OCP behavior)
165
+ * Secret fields with non-null, non-empty values are replaced with {redacted: true}
166
+ */
167
+ getRedactedFormData(): LocalAppSettings;
168
+ }