@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,320 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const jsx_runtime_1 = require("react/jsx-runtime");
4
+ const react_1 = require("react");
5
+ const react_router_dom_1 = require("react-router-dom");
6
+ const useQueryParams_1 = require("../hooks/useQueryParams");
7
+ const useEntityNavigation_1 = require("../hooks/useEntityNavigation");
8
+ const hooks_1 = require("../store/hooks");
9
+ const formStateSlice_1 = require("../store/formStateSlice");
10
+ const JobsView = ({ appInstalled, buildStatus }) => {
11
+ const location = (0, react_router_dom_1.useLocation)();
12
+ const { getParam, setParam } = (0, useQueryParams_1.useQueryParams)();
13
+ const [jobs, setJobs] = (0, react_1.useState)([]);
14
+ const [executions, setExecutions] = (0, react_1.useState)([]);
15
+ const [executionStates, setExecutionStates] = (0, react_1.useState)([]);
16
+ // Derive selection from URL
17
+ const pathParts = location.pathname.split('/').filter(Boolean);
18
+ const selectedJob = pathParts.length > 1 ? pathParts[1] : null;
19
+ const selectedExecution = getParam('execution');
20
+ const [expandedStates, setExpandedStates] = (0, react_1.useState)(new Set());
21
+ const [loading, setLoading] = (0, react_1.useState)(false);
22
+ const [startJobDialogOpen, setStartJobDialogOpen] = (0, react_1.useState)(false);
23
+ const [startJobError, setStartJobError] = (0, react_1.useState)(null);
24
+ const [pollingInterval, setPollingInterval] = (0, react_1.useState)(null);
25
+ // Redux state for persisted job parameters
26
+ const dispatch = (0, hooks_1.useAppDispatch)();
27
+ const jobFormState = (0, hooks_1.useAppSelector)(state => state.formState.jobs['global'] || (0, formStateSlice_1.getDefaultJobFormState)());
28
+ // Parse parameters from JSON string
29
+ const jobParameters = (() => {
30
+ try {
31
+ return JSON.parse(jobFormState.params);
32
+ }
33
+ catch {
34
+ return {};
35
+ }
36
+ })();
37
+ // Helper to update job parameters in Redux
38
+ const setJobParameters = (paramsOrUpdater) => {
39
+ const newParams = typeof paramsOrUpdater === 'function'
40
+ ? paramsOrUpdater(jobParameters)
41
+ : paramsOrUpdater;
42
+ dispatch((0, formStateSlice_1.updateJobState)({
43
+ id: 'global',
44
+ data: { params: JSON.stringify(newParams) }
45
+ }));
46
+ };
47
+ // Use entity navigation hook for job (primary) selection
48
+ const { navigateToEntity: setSelectedJobAndNavigate } = (0, useEntityNavigation_1.useEntityNavigation)({
49
+ basePath: '/jobs',
50
+ entityName: 'job',
51
+ entities: jobs,
52
+ selectedEntityId: selectedJob,
53
+ });
54
+ // Navigation helper for execution (secondary) selection
55
+ const setSelectedExecutionAndUpdateUrl = (0, react_1.useCallback)((executionId, replace = false) => {
56
+ setParam('execution', executionId, replace);
57
+ }, [setParam]);
58
+ // Fetch jobs on mount
59
+ (0, react_1.useEffect)(() => {
60
+ if (appInstalled) {
61
+ fetchJobs();
62
+ }
63
+ }, [appInstalled]);
64
+ // Fetch executions when job is selected
65
+ (0, react_1.useEffect)(() => {
66
+ // Clear any existing polling when job changes
67
+ if (pollingInterval) {
68
+ clearInterval(pollingInterval);
69
+ setPollingInterval(null);
70
+ }
71
+ if (selectedJob) {
72
+ fetchExecutions(selectedJob);
73
+ }
74
+ }, [selectedJob]);
75
+ // Fetch execution states when execution is selected
76
+ (0, react_1.useEffect)(() => {
77
+ if (selectedExecution) {
78
+ fetchExecutionStates(selectedExecution);
79
+ }
80
+ }, [selectedExecution]);
81
+ // Polling effect for running jobs
82
+ (0, react_1.useEffect)(() => {
83
+ const hasRunningJobs = executions.some(execution => execution.status === 'running');
84
+ if (hasRunningJobs && selectedJob && !pollingInterval) {
85
+ // Start polling every 2 seconds for running jobs
86
+ const interval = setInterval(async () => {
87
+ await fetchExecutions(selectedJob);
88
+ if (selectedExecution) {
89
+ await fetchExecutionStates(selectedExecution);
90
+ }
91
+ }, 2000);
92
+ setPollingInterval(interval);
93
+ }
94
+ else if (!hasRunningJobs && pollingInterval) {
95
+ // Stop polling when no running jobs
96
+ clearInterval(pollingInterval);
97
+ setPollingInterval(null);
98
+ }
99
+ // Cleanup on unmount
100
+ return () => {
101
+ if (pollingInterval) {
102
+ clearInterval(pollingInterval);
103
+ }
104
+ };
105
+ }, [executions, selectedJob, selectedExecution, pollingInterval]);
106
+ // Validate execution ID in URL - redirect if invalid (secondary selection, not handled by hook)
107
+ (0, react_1.useEffect)(() => {
108
+ if (selectedExecution && executions.length > 0) {
109
+ const exists = executions.some(e => e.id === selectedExecution);
110
+ if (!exists) {
111
+ // Invalid execution ID in URL, redirect to first execution
112
+ console.warn(`Execution '${selectedExecution}' not found, redirecting to first execution`);
113
+ setSelectedExecutionAndUpdateUrl(executions[0].id, true); // replace: true for validation redirect
114
+ }
115
+ }
116
+ // eslint-disable-next-line react-hooks/exhaustive-deps
117
+ }, [selectedExecution, executions]);
118
+ // Auto-select first execution when job changes (secondary selection, not handled by hook)
119
+ (0, react_1.useEffect)(() => {
120
+ if (executions.length > 0 && !selectedExecution) {
121
+ setSelectedExecutionAndUpdateUrl(executions[0].id, true); // replace: true for auto-selection
122
+ }
123
+ // eslint-disable-next-line react-hooks/exhaustive-deps
124
+ }, [executions, selectedExecution]);
125
+ const fetchJobs = async () => {
126
+ try {
127
+ const response = await fetch('/devserver/api/jobs');
128
+ if (response.ok) {
129
+ const data = await response.json();
130
+ setJobs(data.jobs || []);
131
+ }
132
+ }
133
+ catch (error) {
134
+ console.error('Error fetching jobs:', error);
135
+ }
136
+ };
137
+ const fetchExecutions = async (jobId) => {
138
+ try {
139
+ const response = await fetch(`/devserver/api/jobs/executions?jobId=${jobId}&limit=50`);
140
+ if (response.ok) {
141
+ const data = await response.json();
142
+ setExecutions(data.executions || []);
143
+ if (!data.executions || data.executions.length === 0) {
144
+ setSelectedExecutionAndUpdateUrl(null, true); // replace: true to avoid history entry
145
+ setExecutionStates([]);
146
+ }
147
+ }
148
+ }
149
+ catch (error) {
150
+ console.error('Error fetching executions:', error);
151
+ }
152
+ };
153
+ const fetchExecutionStates = async (executionId) => {
154
+ try {
155
+ const response = await fetch(`/devserver/api/jobs/executions/${executionId}/states`);
156
+ if (response.ok) {
157
+ const data = await response.json();
158
+ setExecutionStates(data.states || []);
159
+ }
160
+ }
161
+ catch (error) {
162
+ console.error('Error fetching execution states:', error);
163
+ }
164
+ };
165
+ const startJob = async () => {
166
+ if (!selectedJob)
167
+ return;
168
+ setLoading(true);
169
+ setStartJobError(null);
170
+ try {
171
+ const response = await fetch(`/devserver/api/jobs/${selectedJob}/start`, {
172
+ method: 'POST',
173
+ headers: {
174
+ 'Content-Type': 'application/json',
175
+ },
176
+ body: JSON.stringify({
177
+ parameters: jobParameters
178
+ })
179
+ });
180
+ const data = await response.json();
181
+ if (response.ok) {
182
+ // Job started successfully - close modal immediately and reset loading state
183
+ setStartJobDialogOpen(false);
184
+ setJobParameters({});
185
+ setStartJobError(null);
186
+ setLoading(false);
187
+ // Get the execution ID from the response
188
+ const newExecutionId = data.execution?.id;
189
+ // Refresh executions to show the new running job (with small delay to ensure job is persisted)
190
+ setTimeout(async () => {
191
+ await fetchExecutions(selectedJob);
192
+ // Force polling for a short period to catch the running state and completion
193
+ const forcePollingInterval = setInterval(async () => {
194
+ await fetchExecutions(selectedJob);
195
+ // Always fetch states for the newest execution (first in list)
196
+ const response = await fetch(`/devserver/api/jobs/executions?jobId=${selectedJob}&limit=1`);
197
+ if (response.ok) {
198
+ const data = await response.json();
199
+ if (data.executions && data.executions.length > 0) {
200
+ await fetchExecutionStates(data.executions[0].id);
201
+ }
202
+ }
203
+ }, 1000);
204
+ // Stop force polling after 15 seconds
205
+ setTimeout(() => {
206
+ clearInterval(forcePollingInterval);
207
+ }, 15000);
208
+ }, 100);
209
+ if (!data.success) {
210
+ // Job failed to start - log the error but modal is already closed
211
+ console.error('Job execution failed to start:', data.error);
212
+ }
213
+ }
214
+ else {
215
+ // Request failed - show error and keep modal open for retry
216
+ const errorMessage = data.error?.message || data.error || 'Failed to start job';
217
+ setStartJobError(errorMessage);
218
+ console.error('Failed to start job:', data.error);
219
+ }
220
+ }
221
+ catch (error) {
222
+ // Network or other error
223
+ const errorMessage = error instanceof Error ? error.message : 'Network error occurred';
224
+ setStartJobError(errorMessage);
225
+ console.error('Error starting job:', error);
226
+ }
227
+ finally {
228
+ setLoading(false);
229
+ }
230
+ };
231
+ const formatTimestamp = (timestamp) => {
232
+ return new Date(timestamp).toLocaleString();
233
+ };
234
+ const formatExecutionTime = (time) => {
235
+ if (!time)
236
+ return 'N/A';
237
+ return `${time}ms`;
238
+ };
239
+ const getStatusColor = (status) => {
240
+ switch (status) {
241
+ case 'completed': return '#28a745';
242
+ case 'running': return '#007bff';
243
+ case 'failed': return '#dc3545';
244
+ case 'interrupted': return '#ffc107';
245
+ default: return '#6c757d';
246
+ }
247
+ };
248
+ const toggleStateExpansion = (stateId) => {
249
+ const newExpanded = new Set(expandedStates);
250
+ if (newExpanded.has(stateId)) {
251
+ newExpanded.delete(stateId);
252
+ }
253
+ else {
254
+ newExpanded.add(stateId);
255
+ }
256
+ setExpandedStates(newExpanded);
257
+ };
258
+ const updateJobParameter = (key, value) => {
259
+ setJobParameters(prev => ({
260
+ ...prev,
261
+ [key]: value
262
+ }));
263
+ };
264
+ const removeJobParameter = (key) => {
265
+ const newParams = { ...jobParameters };
266
+ delete newParams[key];
267
+ setJobParameters(newParams);
268
+ };
269
+ const addJobParameter = () => {
270
+ const key = `param_${Object.keys(jobParameters).length + 1}`;
271
+ updateJobParameter(key, '');
272
+ };
273
+ // Show loading state during initial build or when build is in progress
274
+ if (buildStatus?.buildInProgress || (buildStatus?.lastBuildSuccess === null && buildStatus?.lastBuildTimestamp === null)) {
275
+ return ((0, jsx_runtime_1.jsx)("div", { className: "jobs-not-installed", children: (0, jsx_runtime_1.jsxs)("div", { className: "placeholder-content", children: [(0, jsx_runtime_1.jsx)("h3", { children: "Building App..." }), (0, jsx_runtime_1.jsx)("p", { children: "Please wait while the app is being built." }), (0, jsx_runtime_1.jsx)("div", { className: "spinner" })] }) }));
276
+ }
277
+ // Show error state if build failed
278
+ if (buildStatus?.lastBuildSuccess === false) {
279
+ return ((0, jsx_runtime_1.jsx)("div", { className: "jobs-not-installed", children: (0, jsx_runtime_1.jsxs)("div", { className: "placeholder-content", children: [(0, jsx_runtime_1.jsx)("h3", { children: "Build Failed" }), (0, jsx_runtime_1.jsx)("p", { children: "The app failed to build. Please check the console for errors." }), buildStatus.lastBuildError && ((0, jsx_runtime_1.jsx)("pre", { className: "error-details", children: buildStatus.lastBuildError }))] }) }));
280
+ }
281
+ if (!appInstalled) {
282
+ return ((0, jsx_runtime_1.jsx)("div", { className: "jobs-not-installed", children: (0, jsx_runtime_1.jsxs)("div", { className: "placeholder-content", children: [(0, jsx_runtime_1.jsx)("h3", { children: "Jobs Not Available" }), (0, jsx_runtime_1.jsx)("p", { children: "Install your app first to manage jobs. Jobs will appear here after installation." })] }) }));
283
+ }
284
+ const selectedJobObj = jobs.find(j => j.id === selectedJob);
285
+ return ((0, jsx_runtime_1.jsxs)("div", { className: "jobs-view", children: [(0, jsx_runtime_1.jsxs)("div", { className: "jobs-controls", children: [(0, jsx_runtime_1.jsxs)("div", { className: "job-selector-group", children: [(0, jsx_runtime_1.jsx)("label", { htmlFor: "job-select", children: "Job:" }), (0, jsx_runtime_1.jsx)("select", { id: "job-select", value: selectedJob || '', onChange: (e) => setSelectedJobAndNavigate(e.target.value), disabled: jobs.length === 0, children: jobs.length === 0 ? ((0, jsx_runtime_1.jsx)("option", { value: "", children: "No jobs defined" })) : (jobs.map((job) => ((0, jsx_runtime_1.jsxs)("option", { value: job.id, children: [job.id, job.isSourceJob && ' (Source)', job.cron && ' (Scheduled)', !job.validation.valid && ' (Invalid)', job.description && ` - ${job.description}`] }, job.id)))) })] }), selectedJob && selectedJobObj?.validation.valid && ((0, jsx_runtime_1.jsx)("button", { className: "start-job-btn", onClick: () => {
286
+ setStartJobDialogOpen(true);
287
+ setStartJobError(null);
288
+ }, disabled: loading || buildStatus?.buildInProgress, title: buildStatus?.buildInProgress ? "Build in progress..." : "Start job execution", children: "Start Job" }))] }), (0, jsx_runtime_1.jsxs)("div", { className: "jobs-layout", children: [(0, jsx_runtime_1.jsxs)("div", { className: "executions-panel", children: [(0, jsx_runtime_1.jsxs)("div", { className: "executions-header", children: [(0, jsx_runtime_1.jsx)("h4", { children: "Execution History" }), selectedJob && ((0, jsx_runtime_1.jsxs)("span", { className: "selected-job", children: ["Job: ", selectedJob] }))] }), (0, jsx_runtime_1.jsx)("div", { className: "executions-list", children: executions.length === 0 ? ((0, jsx_runtime_1.jsx)("div", { className: "no-executions", children: (0, jsx_runtime_1.jsx)("p", { children: selectedJob ? 'No executions yet' : 'Select a job to see executions' }) })) : (executions.map((execution) => ((0, jsx_runtime_1.jsxs)("div", { className: `execution-item ${selectedExecution === execution.id ? 'active' : ''}`, onClick: () => setSelectedExecutionAndUpdateUrl(execution.id), children: [(0, jsx_runtime_1.jsxs)("div", { className: "execution-status", children: [execution.status === 'running' ? ((0, jsx_runtime_1.jsx)("span", { className: "status-spinner" })) : ((0, jsx_runtime_1.jsx)("span", { className: "status-dot", style: { backgroundColor: getStatusColor(execution.status) } })), (0, jsx_runtime_1.jsx)("span", { className: "status-text", children: execution.status })] }), (0, jsx_runtime_1.jsxs)("div", { className: "execution-time", children: [(0, jsx_runtime_1.jsx)("div", { className: "started-at", children: formatTimestamp(execution.startedAt) }), execution.completedAt && ((0, jsx_runtime_1.jsxs)("div", { className: "execution-duration", children: ["Duration: ", formatExecutionTime(execution.executionTime)] }))] }), (0, jsx_runtime_1.jsx)("div", { className: "execution-stats", children: (0, jsx_runtime_1.jsxs)("span", { className: "state-count", children: [execution.stateCount, " states"] }) }), execution.error && ((0, jsx_runtime_1.jsxs)("div", { className: "execution-error", children: ["Error: ", execution.error.message] }))] }, execution.id)))) })] }), (0, jsx_runtime_1.jsxs)("div", { className: "states-panel", children: [(0, jsx_runtime_1.jsxs)("div", { className: "states-header", children: [(0, jsx_runtime_1.jsx)("h4", { children: "Job States" }), selectedExecution && ((0, jsx_runtime_1.jsxs)("span", { className: "selected-execution", children: ["Execution: ", selectedExecution.slice(0, 8), "..."] }))] }), (0, jsx_runtime_1.jsx)("div", { className: "states-list", children: executionStates.length === 0 ? ((0, jsx_runtime_1.jsx)("div", { className: "no-states", children: (0, jsx_runtime_1.jsx)("p", { children: selectedExecution ? 'No states recorded' : 'Select an execution to see states' }) })) : (executionStates.map((state) => ((0, jsx_runtime_1.jsxs)("div", { className: "state-item", children: [(0, jsx_runtime_1.jsxs)("div", { className: "state-header", onClick: () => toggleStateExpansion(state.id), children: [(0, jsx_runtime_1.jsxs)("div", { className: "state-meta", children: [(0, jsx_runtime_1.jsxs)("div", { className: "state-primary-info", children: [(0, jsx_runtime_1.jsx)("span", { className: "state-timestamp", children: formatTimestamp(state.timestamp) }), (0, jsx_runtime_1.jsx)("span", { className: `state-phase ${state.phase}`, children: state.phase })] }), state.complete && ((0, jsx_runtime_1.jsx)("div", { className: "state-secondary-info", children: (() => {
289
+ const currentExecution = executions.find(e => e.id === state.executionId);
290
+ const isError = currentExecution?.status === 'failed' && currentExecution?.error;
291
+ return ((0, jsx_runtime_1.jsx)("span", { className: `state-status ${isError ? 'error' : 'complete'}`, children: isError ? 'Error' : 'Completed' }));
292
+ })() }))] }), (0, jsx_runtime_1.jsx)("div", { className: "state-expand", children: (0, jsx_runtime_1.jsx)("span", { className: `expand-icon ${expandedStates.has(state.id) ? 'expanded' : ''}`, children: "\u25BC" }) })] }), expandedStates.has(state.id) && ((0, jsx_runtime_1.jsx)("div", { className: "state-content", children: (0, jsx_runtime_1.jsx)("pre", { children: JSON.stringify(state.state, null, 2) }) }))] }, state.id)))) })] })] }), startJobDialogOpen && ((0, jsx_runtime_1.jsx)("div", { className: "modal-overlay", children: (0, jsx_runtime_1.jsxs)("div", { className: "modal", children: [(0, jsx_runtime_1.jsxs)("div", { className: "modal-header", children: [(0, jsx_runtime_1.jsxs)("h3", { children: ["Start Job: ", selectedJob] }), (0, jsx_runtime_1.jsx)("button", { className: "modal-close", onClick: () => {
293
+ setStartJobDialogOpen(false);
294
+ setStartJobError(null);
295
+ setJobParameters({});
296
+ }, children: "\u00D7" })] }), (0, jsx_runtime_1.jsxs)("div", { className: "modal-body", children: [startJobError && ((0, jsx_runtime_1.jsxs)("div", { className: "start-job-error", children: [(0, jsx_runtime_1.jsx)("h4", { children: "Error" }), (0, jsx_runtime_1.jsx)("p", { children: startJobError })] })), (0, jsx_runtime_1.jsxs)("div", { className: "job-parameters", children: [(0, jsx_runtime_1.jsx)("h4", { children: "Parameters" }), (0, jsx_runtime_1.jsxs)("div", { className: "parameter-list", children: [Object.entries(jobParameters).map(([key, value]) => ((0, jsx_runtime_1.jsxs)("div", { className: "parameter-row", children: [(0, jsx_runtime_1.jsx)("input", { type: "text", value: key, onChange: (e) => {
297
+ const newKey = e.target.value;
298
+ const newParams = { ...jobParameters };
299
+ delete newParams[key];
300
+ newParams[newKey] = value;
301
+ setJobParameters(newParams);
302
+ }, placeholder: "Parameter name", className: "parameter-key" }), (0, jsx_runtime_1.jsx)("input", { type: "text", value: typeof value === 'string' ? value : JSON.stringify(value), onChange: (e) => {
303
+ try {
304
+ updateJobParameter(key, JSON.parse(e.target.value));
305
+ }
306
+ catch {
307
+ updateJobParameter(key, e.target.value);
308
+ }
309
+ }, placeholder: "Parameter value (JSON or string)", className: "parameter-value" }), (0, jsx_runtime_1.jsx)("button", { className: "remove-parameter", onClick: () => removeJobParameter(key), children: "\u00D7" })] }, key))), (0, jsx_runtime_1.jsx)("button", { className: "add-parameter", onClick: addJobParameter, children: "Add Parameter" })] })] })] }), (0, jsx_runtime_1.jsxs)("div", { className: "modal-footer", children: [(0, jsx_runtime_1.jsx)("button", { className: "cancel-btn", onClick: () => {
310
+ setStartJobDialogOpen(false);
311
+ setStartJobError(null);
312
+ setJobParameters({});
313
+ }, children: "Cancel" }), startJobError ? ((0, jsx_runtime_1.jsx)("button", { className: "start-btn", onClick: () => {
314
+ setStartJobDialogOpen(false);
315
+ setStartJobError(null);
316
+ setJobParameters({});
317
+ }, children: "Close" })) : ((0, jsx_runtime_1.jsx)("button", { className: "start-btn", onClick: startJob, disabled: loading, children: loading ? 'Starting...' : 'Start Job' }))] })] }) }))] }));
318
+ };
319
+ exports.default = JobsView;
320
+ //# sourceMappingURL=JobsView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JobsView.js","sourceRoot":"","sources":["../../../../src/ui/components/JobsView.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ interface KVStoreViewerProps {
3
+ data: {
4
+ [key: string]: any;
5
+ };
6
+ title: string;
7
+ apiEndpoint: string;
8
+ onUpdate: (updatedData: any) => void;
9
+ }
10
+ declare const KVStoreViewer: React.FC<KVStoreViewerProps>;
11
+ export default KVStoreViewer;
@@ -0,0 +1,168 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const jsx_runtime_1 = require("react/jsx-runtime");
4
+ const react_1 = require("react");
5
+ const KVStoreViewer = ({ data, title, apiEndpoint, onUpdate }) => {
6
+ const [editingKey, setEditingKey] = (0, react_1.useState)(null);
7
+ const [editValue, setEditValue] = (0, react_1.useState)('');
8
+ const [newKey, setNewKey] = (0, react_1.useState)('');
9
+ const [newValue, setNewValue] = (0, react_1.useState)('');
10
+ const [showAddForm, setShowAddForm] = (0, react_1.useState)(false);
11
+ const startEditing = (key, value) => {
12
+ setEditingKey(key);
13
+ // Format JSON for editing
14
+ setEditValue(JSON.stringify(value, null, 2));
15
+ };
16
+ const saveEdit = async (key) => {
17
+ try {
18
+ // Parse JSON value
19
+ let newValue;
20
+ try {
21
+ newValue = JSON.parse(editValue);
22
+ }
23
+ catch (error) {
24
+ alert('Invalid JSON format. Please check your syntax.');
25
+ return;
26
+ }
27
+ // Update via API - API expects value wrapped in object
28
+ const response = await fetch(`${apiEndpoint}/${encodeURIComponent(key)}`, {
29
+ method: 'PUT',
30
+ headers: {
31
+ 'Content-Type': 'application/json',
32
+ },
33
+ body: JSON.stringify(newValue),
34
+ });
35
+ if (!response.ok) {
36
+ throw new Error(`Failed to update KV value: ${response.statusText}`);
37
+ }
38
+ const result = await response.json();
39
+ // API only returns the key, so we trust that our value was stored correctly
40
+ // Update local state with what we sent
41
+ const updatedData = { ...data, [key]: newValue };
42
+ onUpdate(updatedData);
43
+ setEditingKey(null);
44
+ setEditValue('');
45
+ }
46
+ catch (error) {
47
+ console.error('Error updating KV value:', error);
48
+ alert(`Failed to update value: ${error instanceof Error ? error.message : String(error)}`);
49
+ }
50
+ };
51
+ const deleteKey = async (key) => {
52
+ if (!confirm(`Are you sure you want to delete the key "${key}"?`)) {
53
+ return;
54
+ }
55
+ try {
56
+ // Delete via API
57
+ const response = await fetch(`${apiEndpoint}/${encodeURIComponent(key)}`, {
58
+ method: 'DELETE',
59
+ });
60
+ if (!response.ok) {
61
+ throw new Error(`Failed to delete KV value: ${response.statusText}`);
62
+ }
63
+ // Update local state
64
+ const updatedData = { ...data };
65
+ delete updatedData[key];
66
+ onUpdate(updatedData);
67
+ }
68
+ catch (error) {
69
+ console.error('Error deleting KV value:', error);
70
+ alert(`Failed to delete value: ${error instanceof Error ? error.message : String(error)}`);
71
+ }
72
+ };
73
+ const addNewEntry = async () => {
74
+ if (!newKey.trim()) {
75
+ alert('Please enter a key name');
76
+ return;
77
+ }
78
+ try {
79
+ // Parse JSON value
80
+ let value;
81
+ try {
82
+ value = JSON.parse(newValue);
83
+ }
84
+ catch (error) {
85
+ alert('Invalid JSON format. Please check your syntax.');
86
+ return;
87
+ }
88
+ // Add via API - API expects value wrapped in object
89
+ const response = await fetch(`${apiEndpoint}/${encodeURIComponent(newKey)}`, {
90
+ method: 'PUT',
91
+ headers: {
92
+ 'Content-Type': 'application/json',
93
+ },
94
+ body: JSON.stringify({ value }),
95
+ });
96
+ if (!response.ok) {
97
+ throw new Error(`Failed to add KV value: ${response.statusText}`);
98
+ }
99
+ const result = await response.json();
100
+ // API only returns the key, so we trust that our value was stored correctly
101
+ // Update local state with what we sent
102
+ const updatedData = { ...data, [newKey]: value };
103
+ onUpdate(updatedData);
104
+ // Reset form
105
+ setNewKey('');
106
+ setNewValue('');
107
+ setShowAddForm(false);
108
+ }
109
+ catch (error) {
110
+ console.error('Error adding KV value:', error);
111
+ alert(`Failed to add value: ${error instanceof Error ? error.message : String(error)}`);
112
+ }
113
+ };
114
+ const cancelEdit = () => {
115
+ setEditingKey(null);
116
+ setEditValue('');
117
+ };
118
+ const cancelAdd = () => {
119
+ setNewKey('');
120
+ setNewValue('');
121
+ setShowAddForm(false);
122
+ };
123
+ const keys = Object.keys(data).sort();
124
+ const [expandedKeys, setExpandedKeys] = (0, react_1.useState)(new Set());
125
+ const toggleKey = (key) => {
126
+ const newExpanded = new Set(expandedKeys);
127
+ if (newExpanded.has(key)) {
128
+ newExpanded.delete(key);
129
+ }
130
+ else {
131
+ newExpanded.add(key);
132
+ }
133
+ setExpandedKeys(newExpanded);
134
+ };
135
+ const renderKeyValue = (key, value) => {
136
+ const isEditing = editingKey === key;
137
+ if (isEditing) {
138
+ return ((0, jsx_runtime_1.jsxs)("div", { className: "edit-mode", children: [(0, jsx_runtime_1.jsx)("textarea", { className: "edit-input", value: editValue, onChange: (e) => setEditValue(e.target.value), placeholder: "Enter JSON document", rows: 8, style: { width: '100%', fontFamily: 'monospace' } }), (0, jsx_runtime_1.jsxs)("div", { className: "edit-controls", children: [(0, jsx_runtime_1.jsx)("button", { className: "save-btn", onClick: () => saveEdit(key), children: "Save" }), (0, jsx_runtime_1.jsx)("button", { className: "cancel-btn", onClick: cancelEdit, children: "Cancel" })] })] }));
139
+ }
140
+ // Show formatted JSON for all values
141
+ return ((0, jsx_runtime_1.jsx)("div", { className: "json-display", children: (0, jsx_runtime_1.jsx)("pre", { style: {
142
+ margin: 0,
143
+ padding: '8px',
144
+ background: '#3c3c3c',
145
+ border: '1px solid #4a4a4a',
146
+ borderRadius: '3px',
147
+ color: '#cccccc',
148
+ fontFamily: 'monospace',
149
+ fontSize: '11px',
150
+ whiteSpace: 'pre-wrap',
151
+ wordWrap: 'break-word',
152
+ overflowX: 'auto'
153
+ }, children: JSON.stringify(value, null, 2) }) }));
154
+ };
155
+ return ((0, jsx_runtime_1.jsx)("div", { className: "kv-store-viewer compact-store", children: (0, jsx_runtime_1.jsxs)("div", { className: "store-sections", children: [keys.map((key) => {
156
+ const value = data[key];
157
+ const isExpanded = expandedKeys.has(key);
158
+ return ((0, jsx_runtime_1.jsxs)("div", { className: "store-section", children: [(0, jsx_runtime_1.jsxs)("div", { className: "section-header", onClick: () => toggleKey(key), style: { cursor: 'pointer' }, children: [(0, jsx_runtime_1.jsx)("span", { className: "expand-icon", children: isExpanded ? '▼' : '▶' }), (0, jsx_runtime_1.jsx)("span", { className: "section-name", children: key }), (0, jsx_runtime_1.jsxs)("div", { className: "section-actions", children: [(0, jsx_runtime_1.jsx)("button", { className: "edit-icon", onClick: (e) => {
159
+ e.stopPropagation();
160
+ startEditing(key, value);
161
+ }, title: "Edit JSON", children: "\u270F\uFE0F" }), (0, jsx_runtime_1.jsx)("button", { className: "delete-icon", onClick: (e) => {
162
+ e.stopPropagation();
163
+ deleteKey(key);
164
+ }, title: "Delete Entry", children: "\uD83D\uDDD1\uFE0F" })] })] }), isExpanded && ((0, jsx_runtime_1.jsx)("div", { className: "json-content", children: renderKeyValue(key, value) }))] }, key));
165
+ }), showAddForm && ((0, jsx_runtime_1.jsxs)("div", { className: "store-section add-form", children: [(0, jsx_runtime_1.jsxs)("div", { className: "section-header", children: [(0, jsx_runtime_1.jsx)("span", { className: "expand-icon" }), (0, jsx_runtime_1.jsx)("input", { type: "text", value: newKey, onChange: (e) => setNewKey(e.target.value), placeholder: "Key name", className: "key-input" }), (0, jsx_runtime_1.jsxs)("div", { className: "section-actions", children: [(0, jsx_runtime_1.jsx)("button", { className: "save-btn", onClick: addNewEntry, children: "Save" }), (0, jsx_runtime_1.jsx)("button", { className: "cancel-btn", onClick: cancelAdd, children: "Cancel" })] })] }), (0, jsx_runtime_1.jsx)("div", { className: "primitive-value", children: (0, jsx_runtime_1.jsx)("textarea", { value: newValue, onChange: (e) => setNewValue(e.target.value), placeholder: 'Enter JSON document (e.g., {"field1": "value1", "field2": "value2"})', className: "value-input", rows: 4, style: { width: '100%', fontFamily: 'monospace' } }) })] })), (0, jsx_runtime_1.jsx)("div", { className: "add-entry-section", children: (0, jsx_runtime_1.jsx)("button", { className: "add-entry-btn", onClick: () => setShowAddForm(!showAddForm), children: showAddForm ? 'Cancel' : '+ Add Entry' }) }), keys.length === 0 && !showAddForm && ((0, jsx_runtime_1.jsx)("div", { className: "empty-store", children: "No entries in this store" }))] }) }));
166
+ };
167
+ exports.default = KVStoreViewer;
168
+ //# sourceMappingURL=KVStoreViewer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KVStoreViewer.js","sourceRoot":"","sources":["../../../../src/ui/components/KVStoreViewer.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import React from 'react';
2
+ import './MetadataModal.css';
3
+ interface MetadataModalProps {
4
+ isOpen: boolean;
5
+ onClose: () => void;
6
+ attempt: string;
7
+ syncId: string;
8
+ syncName: string;
9
+ onAttemptChange: (value: string) => void;
10
+ onSyncIdChange: (value: string) => void;
11
+ onSyncNameChange: (value: string) => void;
12
+ }
13
+ export declare const MetadataModal: React.FC<MetadataModalProps>;
14
+ export {};
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MetadataModal = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ require("./MetadataModal.css");
7
+ const MetadataModal = ({ isOpen, onClose, attempt, syncId, syncName, onAttemptChange, onSyncIdChange, onSyncNameChange }) => {
8
+ (0, react_1.useEffect)(() => {
9
+ if (!isOpen)
10
+ return;
11
+ const handleEscape = (e) => {
12
+ if (e.key === 'Escape')
13
+ onClose();
14
+ };
15
+ window.addEventListener('keydown', handleEscape);
16
+ return () => window.removeEventListener('keydown', handleEscape);
17
+ }, [isOpen, onClose]);
18
+ if (!isOpen)
19
+ return null;
20
+ const handleOverlayClick = (e) => {
21
+ if (e.target === e.currentTarget) {
22
+ onClose();
23
+ }
24
+ };
25
+ return ((0, jsx_runtime_1.jsx)("div", { className: "metadata-modal-overlay", onClick: handleOverlayClick, children: (0, jsx_runtime_1.jsxs)("div", { className: "metadata-modal-content", children: [(0, jsx_runtime_1.jsxs)("div", { className: "metadata-modal-header", children: [(0, jsx_runtime_1.jsx)("h3", { children: "Batch Metadata" }), (0, jsx_runtime_1.jsx)("button", { className: "metadata-modal-close", onClick: onClose, children: "\u00D7" })] }), (0, jsx_runtime_1.jsxs)("div", { className: "metadata-modal-body", children: [(0, jsx_runtime_1.jsxs)("div", { className: "metadata-modal-field", children: [(0, jsx_runtime_1.jsx)("label", { htmlFor: "attempt", children: "Attempt:" }), (0, jsx_runtime_1.jsx)("input", { id: "attempt", type: "number", value: attempt, onChange: (e) => onAttemptChange(e.target.value), min: "1" })] }), (0, jsx_runtime_1.jsxs)("div", { className: "metadata-modal-field", children: [(0, jsx_runtime_1.jsx)("label", { htmlFor: "syncId", children: "Sync ID:" }), (0, jsx_runtime_1.jsx)("input", { id: "syncId", type: "text", value: syncId, onChange: (e) => onSyncIdChange(e.target.value) })] }), (0, jsx_runtime_1.jsxs)("div", { className: "metadata-modal-field", children: [(0, jsx_runtime_1.jsx)("label", { htmlFor: "syncName", children: "Sync Name:" }), (0, jsx_runtime_1.jsx)("input", { id: "syncName", type: "text", value: syncName, onChange: (e) => onSyncNameChange(e.target.value) })] })] }), (0, jsx_runtime_1.jsx)("div", { className: "metadata-modal-footer", children: (0, jsx_runtime_1.jsx)("p", { className: "auto-save-indicator", children: "Changes auto-saved" }) })] }) }));
26
+ };
27
+ exports.MetadataModal = MetadataModal;
28
+ //# sourceMappingURL=MetadataModal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MetadataModal.js","sourceRoot":"","sources":["../../../../src/ui/components/MetadataModal.tsx"],"names":[],"mappings":";;;;AAAA,iCAAyC;AACzC,+BAA6B;AAatB,MAAM,aAAa,GAAiC,CAAC,EAC1D,MAAM,EACN,OAAO,EACP,OAAO,EACP,MAAM,EACN,QAAQ,EACR,eAAe,EACf,cAAc,EACd,gBAAgB,EACjB,EAAE,EAAE;IACH,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,MAAM,YAAY,GAAG,CAAC,CAAgB,EAAE,EAAE;YACxC,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ;gBAAE,OAAO,EAAE,CAAC;QACpC,CAAC,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QACjD,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACnE,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAEtB,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,MAAM,kBAAkB,GAAG,CAAC,CAAmC,EAAE,EAAE;QACjE,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,aAAa,EAAE,CAAC;YACjC,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CACL,gCACE,SAAS,EAAC,wBAAwB,EAClC,OAAO,EAAE,kBAAkB,YAE3B,iCAAK,SAAS,EAAC,wBAAwB,aACrC,iCAAK,SAAS,EAAC,uBAAuB,aACpC,4DAAuB,EACvB,mCAAQ,SAAS,EAAC,sBAAsB,EAAC,OAAO,EAAE,OAAO,uBAAY,IACjE,EACN,iCAAK,SAAS,EAAC,qBAAqB,aAClC,iCAAK,SAAS,EAAC,sBAAsB,aACnC,kCAAO,OAAO,EAAC,SAAS,yBAAiB,EACzC,kCACE,EAAE,EAAC,SAAS,EACZ,IAAI,EAAC,QAAQ,EACb,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAChD,GAAG,EAAC,GAAG,GACP,IACE,EACN,iCAAK,SAAS,EAAC,sBAAsB,aACnC,kCAAO,OAAO,EAAC,QAAQ,yBAAiB,EACxC,kCACE,EAAE,EAAC,QAAQ,EACX,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAC/C,IACE,EACN,iCAAK,SAAS,EAAC,sBAAsB,aACnC,kCAAO,OAAO,EAAC,UAAU,2BAAmB,EAC5C,kCACE,EAAE,EAAC,UAAU,EACb,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GACjD,IACE,IACF,EACN,gCAAK,SAAS,EAAC,uBAAuB,YACpC,8BAAG,SAAS,EAAC,qBAAqB,mCAAuB,GACrD,IACF,GACF,CACP,CAAC;AACJ,CAAC,CAAC;AAzEW,QAAA,aAAa,iBAyExB"}
@@ -0,0 +1 @@
1
+ import '@testing-library/jest-dom';