@optimizely/ocp-local-env 1.0.0-beta.9 → 1.0.1

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 (185) hide show
  1. package/README.md +18 -133
  2. package/dist/package.json +15 -9
  3. package/dist/public/bundle.fa87c838198caf8c051a.js +3 -0
  4. package/dist/public/{bundle.82dc5d29fffb9f205051.js.LICENSE.txt → bundle.fa87c838198caf8c051a.js.LICENSE.txt} +3 -3
  5. package/dist/public/bundle.fa87c838198caf8c051a.js.map +1 -0
  6. package/dist/public/index.html +1 -1
  7. package/dist/src/cli.js +2 -2
  8. package/dist/src/cli.js.map +1 -1
  9. package/dist/src/executor/FunctionExecutor.js +8 -5
  10. package/dist/src/executor/FunctionExecutor.js.map +1 -1
  11. package/dist/src/executor/JobExecutor.js +0 -17
  12. package/dist/src/executor/JobExecutor.js.map +1 -1
  13. package/dist/src/executor/LifecycleExecutor.js +11 -2
  14. package/dist/src/executor/LifecycleExecutor.js.map +1 -1
  15. package/dist/src/executor/watcher.d.ts +6 -0
  16. package/dist/src/executor/watcher.js +45 -0
  17. package/dist/src/executor/watcher.js.map +1 -1
  18. package/dist/src/local_engine/LocalJobApi.d.ts +31 -2
  19. package/dist/src/local_engine/LocalJobApi.js +42 -17
  20. package/dist/src/local_engine/LocalJobApi.js.map +1 -1
  21. package/dist/src/local_engine/LocalNotifier.d.ts +3 -2
  22. package/dist/src/local_engine/LocalNotifier.js +7 -0
  23. package/dist/src/local_engine/LocalNotifier.js.map +1 -1
  24. package/dist/src/local_engine/LocalSourceApi.d.ts +40 -0
  25. package/dist/src/local_engine/LocalSourceApi.js +69 -0
  26. package/dist/src/local_engine/LocalSourceApi.js.map +1 -0
  27. package/dist/src/local_engine/local-engine-child-base.d.ts +0 -12
  28. package/dist/src/local_engine/local-engine-child-base.js +0 -127
  29. package/dist/src/local_engine/local-engine-child-base.js.map +1 -1
  30. package/dist/src/local_engine/local-engine-client.d.ts +19 -29
  31. package/dist/src/local_engine/local-engine-client.js +45 -94
  32. package/dist/src/local_engine/local-engine-client.js.map +1 -1
  33. package/dist/src/local_engine/local-engine-types.d.ts +13 -50
  34. package/dist/src/local_engine/local-engine-unified.d.ts +6 -13
  35. package/dist/src/local_engine/local-engine-unified.js +108 -222
  36. package/dist/src/local_engine/local-engine-unified.js.map +1 -1
  37. package/dist/src/local_engine/localSDKConfig.d.ts +6 -0
  38. package/dist/src/local_engine/localSDKConfig.js +66 -1
  39. package/dist/src/local_engine/localSDKConfig.js.map +1 -1
  40. package/dist/src/local_engine/storage/BaseKVStoreWrapper.d.ts +1 -2
  41. package/dist/src/local_engine/storage/BaseKVStoreWrapper.js.map +1 -1
  42. package/dist/src/local_engine/storage/LocalConfigStore.d.ts +7 -13
  43. package/dist/src/local_engine/storage/LocalConfigStore.js +9 -31
  44. package/dist/src/local_engine/storage/LocalConfigStore.js.map +1 -1
  45. package/dist/src/local_engine/storage/LocalKVStore.d.ts +4 -0
  46. package/dist/src/local_engine/storage/LocalKVStore.js +23 -0
  47. package/dist/src/local_engine/storage/LocalKVStore.js.map +1 -1
  48. package/dist/src/local_engine/storage/SourceDataStore.d.ts +16 -14
  49. package/dist/src/local_engine/storage/SourceDataStore.js +57 -57
  50. package/dist/src/local_engine/storage/SourceDataStore.js.map +1 -1
  51. package/dist/src/local_engine/utils.d.ts +2 -0
  52. package/dist/src/local_engine/utils.js +4 -2
  53. package/dist/src/local_engine/utils.js.map +1 -1
  54. package/dist/src/server/api/deploy.d.ts +20 -0
  55. package/dist/src/server/api/deploy.js +399 -0
  56. package/dist/src/server/api/deploy.js.map +1 -0
  57. package/dist/src/server/api/destinations.js +1 -1
  58. package/dist/src/server/api/destinations.js.map +1 -1
  59. package/dist/src/server/api/env.d.ts +2 -0
  60. package/dist/src/server/api/env.js +28 -0
  61. package/dist/src/server/api/env.js.map +1 -0
  62. package/dist/src/server/api/functions.js +13 -12
  63. package/dist/src/server/api/functions.js.map +1 -1
  64. package/dist/src/server/api/opalTools.d.ts +4 -0
  65. package/dist/src/server/api/opalTools.js +81 -0
  66. package/dist/src/server/api/opalTools.js.map +1 -0
  67. package/dist/src/server/api/schema.d.ts +6 -0
  68. package/dist/src/server/api/schema.js +95 -0
  69. package/dist/src/server/api/schema.js.map +1 -0
  70. package/dist/src/server/api/sources.d.ts +1 -2
  71. package/dist/src/server/api/sources.js +16 -275
  72. package/dist/src/server/api/sources.js.map +1 -1
  73. package/dist/src/server/api/v1.js +63 -55
  74. package/dist/src/server/api/v1.js.map +1 -1
  75. package/dist/src/server/api.d.ts +4 -0
  76. package/dist/src/server/api.js +131 -9
  77. package/dist/src/server/api.js.map +1 -1
  78. package/dist/src/server/app-discovery.js +37 -4
  79. package/dist/src/server/app-discovery.js.map +1 -1
  80. package/dist/src/server/app-env.d.ts +21 -0
  81. package/dist/src/server/app-env.js +122 -0
  82. package/dist/src/server/app-env.js.map +1 -0
  83. package/dist/src/server/browserFocus.d.ts +5 -0
  84. package/dist/src/server/browserFocus.js +39 -0
  85. package/dist/src/server/browserFocus.js.map +1 -0
  86. package/dist/src/server/config.d.ts +3 -0
  87. package/dist/src/server/config.js +7 -0
  88. package/dist/src/server/config.js.map +1 -1
  89. package/dist/src/server/mockDataGenerator.d.ts +1 -2
  90. package/dist/src/server/mockDataGenerator.js +77 -35
  91. package/dist/src/server/mockDataGenerator.js.map +1 -1
  92. package/dist/src/server/mockToolDataGenerator.d.ts +12 -0
  93. package/dist/src/server/mockToolDataGenerator.js +393 -0
  94. package/dist/src/server/mockToolDataGenerator.js.map +1 -0
  95. package/dist/src/server.js +152 -168
  96. package/dist/src/server.js.map +1 -1
  97. package/dist/src/types/app.d.ts +1 -3
  98. package/dist/src/types/app.js.map +1 -1
  99. package/dist/src/ui/components/App.js +303 -47
  100. package/dist/src/ui/components/App.js.map +1 -1
  101. package/dist/src/ui/components/DeployModal.d.ts +16 -0
  102. package/dist/src/ui/components/DeployModal.js +75 -0
  103. package/dist/src/ui/components/DeployModal.js.map +1 -0
  104. package/dist/src/ui/components/DestinationBatchEditor.d.ts +9 -1
  105. package/dist/src/ui/components/DestinationBatchEditor.js +12 -4
  106. package/dist/src/ui/components/DestinationBatchEditor.js.map +1 -1
  107. package/dist/src/ui/components/DestinationsView.js +5 -1
  108. package/dist/src/ui/components/DestinationsView.js.map +1 -1
  109. package/dist/src/ui/components/EntityNotAvailable.d.ts +15 -0
  110. package/dist/src/ui/components/EntityNotAvailable.js +27 -0
  111. package/dist/src/ui/components/EntityNotAvailable.js.map +1 -0
  112. package/dist/src/ui/components/EnvViewer.d.ts +8 -0
  113. package/dist/src/ui/components/EnvViewer.js +35 -0
  114. package/dist/src/ui/components/EnvViewer.js.map +1 -0
  115. package/dist/src/ui/components/FunctionsView.d.ts +2 -6
  116. package/dist/src/ui/components/FunctionsView.js +52 -75
  117. package/dist/src/ui/components/FunctionsView.js.map +1 -1
  118. package/dist/src/ui/components/JobsView.js +4 -4
  119. package/dist/src/ui/components/JobsView.js.map +1 -1
  120. package/dist/src/ui/components/KVStoreViewer.js +5 -5
  121. package/dist/src/ui/components/KVStoreViewer.js.map +1 -1
  122. package/dist/src/ui/components/KeyValueEditor.d.ts +15 -0
  123. package/dist/src/ui/components/KeyValueEditor.js +12 -0
  124. package/dist/src/ui/components/KeyValueEditor.js.map +1 -0
  125. package/dist/src/ui/components/NotificationViewer.d.ts +2 -11
  126. package/dist/src/ui/components/NotificationViewer.js +69 -15
  127. package/dist/src/ui/components/NotificationViewer.js.map +1 -1
  128. package/dist/src/ui/components/OdpSchemaView.d.ts +3 -0
  129. package/dist/src/ui/components/OdpSchemaView.js +58 -0
  130. package/dist/src/ui/components/OdpSchemaView.js.map +1 -0
  131. package/dist/src/ui/components/OpalToolsView.d.ts +9 -0
  132. package/dist/src/ui/components/OpalToolsView.js +399 -0
  133. package/dist/src/ui/components/OpalToolsView.js.map +1 -0
  134. package/dist/src/ui/components/ResponseViewer.d.ts +39 -0
  135. package/dist/src/ui/components/ResponseViewer.js +43 -0
  136. package/dist/src/ui/components/ResponseViewer.js.map +1 -0
  137. package/dist/src/ui/components/SecretsStoreViewer.js +3 -2
  138. package/dist/src/ui/components/SecretsStoreViewer.js.map +1 -1
  139. package/dist/src/ui/components/SettingsStoreViewer.js +3 -2
  140. package/dist/src/ui/components/SettingsStoreViewer.js.map +1 -1
  141. package/dist/src/ui/components/SourceEmittedDataPanel.d.ts +8 -0
  142. package/dist/src/ui/components/SourceEmittedDataPanel.js +103 -0
  143. package/dist/src/ui/components/SourceEmittedDataPanel.js.map +1 -0
  144. package/dist/src/ui/components/SourcesView.js +4 -8
  145. package/dist/src/ui/components/SourcesView.js.map +1 -1
  146. package/dist/src/ui/components/StoreViewer.js +2 -1
  147. package/dist/src/ui/components/StoreViewer.js.map +1 -1
  148. package/dist/src/ui/components/TabbedConsole.d.ts +11 -0
  149. package/dist/src/ui/components/TabbedConsole.js +134 -44
  150. package/dist/src/ui/components/TabbedConsole.js.map +1 -1
  151. package/dist/src/ui/components/ToolSettingsView.d.ts +7 -0
  152. package/dist/src/ui/components/ToolSettingsView.js +25 -0
  153. package/dist/src/ui/components/ToolSettingsView.js.map +1 -0
  154. package/dist/src/ui/components/common/EyeIcon.js +2 -1
  155. package/dist/src/ui/components/common/EyeIcon.js.map +1 -1
  156. package/dist/src/ui/hooks/useKeyValuePairs.d.ts +52 -0
  157. package/dist/src/ui/hooks/useKeyValuePairs.js +66 -0
  158. package/dist/src/ui/hooks/useKeyValuePairs.js.map +1 -0
  159. package/dist/src/ui/store/formStateSlice.d.ts +19 -2
  160. package/dist/src/ui/store/formStateSlice.js +69 -4
  161. package/dist/src/ui/store/formStateSlice.js.map +1 -1
  162. package/dist/src/ui/types/common.d.ts +33 -0
  163. package/dist/src/ui/types/common.js +6 -0
  164. package/dist/src/ui/types/common.js.map +1 -0
  165. package/package.json +15 -9
  166. package/dist/public/bundle.82dc5d29fffb9f205051.js +0 -3
  167. package/dist/public/bundle.82dc5d29fffb9f205051.js.map +0 -1
  168. package/dist/src/executor/SourceExecutor.d.ts +0 -32
  169. package/dist/src/executor/SourceExecutor.js +0 -163
  170. package/dist/src/executor/SourceExecutor.js.map +0 -1
  171. package/dist/src/local_engine/storage/SourceJobExecutionStore.d.ts +0 -25
  172. package/dist/src/local_engine/storage/SourceJobExecutionStore.js +0 -61
  173. package/dist/src/local_engine/storage/SourceJobExecutionStore.js.map +0 -1
  174. package/dist/src/ui/components/SourceDataViewer.d.ts +0 -8
  175. package/dist/src/ui/components/SourceDataViewer.js +0 -84
  176. package/dist/src/ui/components/SourceDataViewer.js.map +0 -1
  177. package/dist/src/ui/components/SourceJobsSection.d.ts +0 -8
  178. package/dist/src/ui/components/SourceJobsSection.js +0 -99
  179. package/dist/src/ui/components/SourceJobsSection.js.map +0 -1
  180. package/dist/src/ui/components/SourceLifecycleSection.d.ts +0 -7
  181. package/dist/src/ui/components/SourceLifecycleSection.js +0 -58
  182. package/dist/src/ui/components/SourceLifecycleSection.js.map +0 -1
  183. package/dist/src/ui/components/SourceWebhookEditor.d.ts +0 -8
  184. package/dist/src/ui/components/SourceWebhookEditor.js +0 -181
  185. package/dist/src/ui/components/SourceWebhookEditor.js.map +0 -1
@@ -0,0 +1,399 @@
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
+ const jsx_runtime_1 = require("react/jsx-runtime");
7
+ const react_1 = require("react");
8
+ const react_router_dom_1 = require("react-router-dom");
9
+ const useEntityNavigation_1 = require("../hooks/useEntityNavigation");
10
+ const useQueryParams_1 = require("../hooks/useQueryParams");
11
+ const useKeyValuePairs_1 = require("../hooks/useKeyValuePairs");
12
+ const hooks_1 = require("../store/hooks");
13
+ const formStateSlice_1 = require("../store/formStateSlice");
14
+ const KeyValueEditor_1 = __importDefault(require("./KeyValueEditor"));
15
+ const EntityNotAvailable_1 = __importDefault(require("./EntityNotAvailable"));
16
+ const ResponseViewer_1 = __importDefault(require("./ResponseViewer"));
17
+ const axiom_icons_1 = require("@optimizely/axiom-icons");
18
+ // Unique identifier for a tool: functionId:toolName (tools from different functions can share names)
19
+ const getToolId = (tool) => `${tool.functionId}:${tool.name}`;
20
+ const OpalToolsView = ({ appInstalled, buildStatus, installVersion }) => {
21
+ const location = (0, react_router_dom_1.useLocation)();
22
+ const navigate = (0, react_router_dom_1.useNavigate)();
23
+ const dispatch = (0, hooks_1.useAppDispatch)();
24
+ const opalToolStates = (0, hooks_1.useAppSelector)(state => state.formState.opalTools) || {};
25
+ // State for functions and tools
26
+ const [opalFunctions, setOpalFunctions] = (0, react_1.useState)([]);
27
+ const [tools, setTools] = (0, react_1.useState)([]);
28
+ const [loadingTools, setLoadingTools] = (0, react_1.useState)(false);
29
+ const [discoveryError, setDiscoveryError] = (0, react_1.useState)(null);
30
+ // Ephemeral state (not persisted)
31
+ const [ephemeralStates, setEphemeralStates] = (0, react_1.useState)({});
32
+ // Collapsed state for function groups in sidebar
33
+ const [collapsedFunctions, setCollapsedFunctions] = (0, react_1.useState)({});
34
+ // Ready probe state
35
+ const [readyLoading, setReadyLoading] = (0, react_1.useState)({});
36
+ const [readyResults, setReadyResults] = (0, react_1.useState)({});
37
+ const [readyPopupFunction, setReadyPopupFunction] = (0, react_1.useState)(null);
38
+ // Discovery response state
39
+ const [discoveryResponses, setDiscoveryResponses] = (0, react_1.useState)({});
40
+ const [discoveryPopupFunction, setDiscoveryPopupFunction] = (0, react_1.useState)(null);
41
+ // Track previous build timestamp for change detection
42
+ const lastBuildTimestampRef = (0, react_1.useRef)(null);
43
+ // Derive selected tool from URL path
44
+ const pathParts = location.pathname.split('/').filter(Boolean);
45
+ const selectedToolName = pathParts.length > 1 ? decodeURIComponent(pathParts[1]) : null;
46
+ const selectedTool = tools.find(t => getToolId(t) === selectedToolName);
47
+ // Entity navigation hook
48
+ const { navigateToEntity } = (0, useEntityNavigation_1.useEntityNavigation)({
49
+ basePath: '/opal-tools',
50
+ entityName: 'tool',
51
+ entities: tools.map(t => ({ id: getToolId(t) })),
52
+ selectedEntityId: selectedToolName,
53
+ });
54
+ // Group tools by functionId for sidebar display
55
+ const toolsByFunction = tools.reduce((acc, tool) => {
56
+ const funcId = tool.functionId || 'unknown';
57
+ if (!acc[funcId]) {
58
+ acc[funcId] = [];
59
+ }
60
+ acc[funcId].push(tool);
61
+ return acc;
62
+ }, {});
63
+ // Toggle function group collapsed state
64
+ const toggleFunctionCollapsed = (functionId) => {
65
+ setCollapsedFunctions(prev => ({
66
+ ...prev,
67
+ [functionId]: !prev[functionId],
68
+ }));
69
+ };
70
+ // Test the ready endpoint for a tool function
71
+ const testReady = async (functionId, functionUrl) => {
72
+ setReadyPopupFunction(functionId);
73
+ setReadyLoading(prev => ({ ...prev, [functionId]: true }));
74
+ setReadyResults(prev => {
75
+ const updated = { ...prev };
76
+ delete updated[functionId]; // Clear previous result
77
+ return updated;
78
+ });
79
+ try {
80
+ const response = await fetch(`${functionUrl}/ready`, {
81
+ method: 'POST',
82
+ headers: { 'Content-Type': 'application/json' },
83
+ body: JSON.stringify({}) // Empty body - auth is bypassed locally
84
+ });
85
+ if (response.ok) {
86
+ const data = await response.json();
87
+ setReadyResults(prev => ({ ...prev, [functionId]: data }));
88
+ }
89
+ else {
90
+ const errorData = await response.json().catch(() => ({ detail: 'Unknown error' }));
91
+ setReadyResults(prev => ({
92
+ ...prev,
93
+ [functionId]: { error: errorData.detail || `HTTP ${response.status}` }
94
+ }));
95
+ }
96
+ }
97
+ catch (error) {
98
+ setReadyResults(prev => ({
99
+ ...prev,
100
+ [functionId]: { error: error instanceof Error ? error.message : 'Network error' }
101
+ }));
102
+ }
103
+ finally {
104
+ setReadyLoading(prev => ({ ...prev, [functionId]: false }));
105
+ }
106
+ };
107
+ // Helper functions for state management
108
+ const getOrCreateToolState = (toolName) => {
109
+ return opalToolStates[toolName] || (0, formStateSlice_1.getDefaultOpalToolFormState)();
110
+ };
111
+ const getOrCreateEphemeralState = (toolName) => {
112
+ return ephemeralStates[toolName] || {
113
+ response: null,
114
+ loading: false,
115
+ generatingMock: false,
116
+ };
117
+ };
118
+ const updateCurrentFormState = (updates) => {
119
+ if (!selectedToolName)
120
+ return;
121
+ dispatch((0, formStateSlice_1.updateOpalToolState)({ id: selectedToolName, data: updates }));
122
+ };
123
+ const updateCurrentEphemeralState = (updates) => {
124
+ if (!selectedToolName)
125
+ return;
126
+ setEphemeralStates(prev => ({
127
+ ...prev,
128
+ [selectedToolName]: {
129
+ ...getOrCreateEphemeralState(selectedToolName),
130
+ ...updates,
131
+ },
132
+ }));
133
+ };
134
+ // URL-based tab state for request tabs
135
+ const { getParam, setParam } = (0, useQueryParams_1.useQueryParams)();
136
+ const urlTab = getParam('requestTab');
137
+ const activeTab = urlTab && ['params', 'headers', 'body', 'toolParams', 'toolDescription', 'authData'].includes(urlTab) ? urlTab : 'body';
138
+ const setActiveTab = (0, react_1.useCallback)((tab) => {
139
+ setParam('requestTab', tab);
140
+ }, [setParam]);
141
+ // Get current state for rendering and hook usage
142
+ const currentFormState = selectedToolName ? getOrCreateToolState(selectedToolName) : (0, formStateSlice_1.getDefaultOpalToolFormState)();
143
+ const currentEphemeral = selectedToolName ? getOrCreateEphemeralState(selectedToolName) : { response: null, loading: false, generatingMock: false };
144
+ // Key-value pair helpers (via shared hook)
145
+ const { addKeyValuePair, updateKeyValuePair, removeKeyValuePair } = (0, useKeyValuePairs_1.useKeyValuePairs)({
146
+ params: currentFormState.params,
147
+ headers: currentFormState.headers,
148
+ onUpdate: updateCurrentFormState,
149
+ });
150
+ // Fetch opal functions on mount or when install state changes
151
+ // Global opal tools are always available regardless of installation
152
+ (0, react_1.useEffect)(() => {
153
+ setOpalFunctions([]);
154
+ setTools([]);
155
+ fetchOpalFunctions();
156
+ }, [appInstalled, installVersion]);
157
+ // Fetch tools when functions are loaded
158
+ (0, react_1.useEffect)(() => {
159
+ if (opalFunctions.length > 0) {
160
+ fetchAllTools();
161
+ }
162
+ }, [opalFunctions]);
163
+ // Initialize or update authData when a tool is selected.
164
+ // Regenerates the template if authData is empty or if the auth provider changed.
165
+ (0, react_1.useEffect)(() => {
166
+ if (selectedTool && selectedToolName) {
167
+ const toolState = opalToolStates[selectedToolName];
168
+ const defaultAuthData = (0, formStateSlice_1.generateDefaultAuthData)(selectedTool.auth_requirements);
169
+ if (!toolState?.authData) {
170
+ dispatch((0, formStateSlice_1.updateOpalToolState)({ id: selectedToolName, data: { authData: defaultAuthData } }));
171
+ }
172
+ else {
173
+ // Check if the provider changed — regenerate template if so
174
+ try {
175
+ const currentProvider = JSON.parse(toolState.authData).provider;
176
+ const newProvider = JSON.parse(defaultAuthData).provider;
177
+ if (currentProvider !== newProvider) {
178
+ dispatch((0, formStateSlice_1.updateOpalToolState)({ id: selectedToolName, data: { authData: defaultAuthData } }));
179
+ }
180
+ }
181
+ catch {
182
+ // If current authData is invalid JSON, leave it as-is
183
+ }
184
+ }
185
+ }
186
+ }, [selectedTool, selectedToolName, dispatch]);
187
+ const fetchOpalFunctions = async () => {
188
+ try {
189
+ const response = await fetch('/devserver/api/opal-tools');
190
+ if (response.ok) {
191
+ const data = await response.json();
192
+ setOpalFunctions(data.functions || []);
193
+ }
194
+ else {
195
+ setDiscoveryError(`Failed to fetch functions: HTTP ${response.status}`);
196
+ }
197
+ }
198
+ catch (error) {
199
+ setDiscoveryError(error instanceof Error ? error.message : 'Network error fetching functions');
200
+ }
201
+ };
202
+ const fetchAllTools = async () => {
203
+ setLoadingTools(true);
204
+ setDiscoveryError(null);
205
+ const allTools = [];
206
+ const rawResponses = {};
207
+ try {
208
+ for (const func of opalFunctions) {
209
+ // Skip functions without a URL (non-global functions when app is not installed)
210
+ if (!func.url)
211
+ continue;
212
+ // Call discovery directly on the function URL (no auth required for /discovery)
213
+ const discoveryUrl = `${func.url}/discovery`;
214
+ try {
215
+ const response = await fetch(discoveryUrl);
216
+ if (response.ok) {
217
+ const data = await response.json();
218
+ rawResponses[func.id] = data;
219
+ // Add function context to each tool
220
+ const toolsWithContext = (data.functions || []).map((tool) => ({
221
+ ...tool,
222
+ functionId: func.id,
223
+ functionUrl: func.url,
224
+ }));
225
+ allTools.push(...toolsWithContext);
226
+ }
227
+ else {
228
+ rawResponses[func.id] = { error: `Discovery failed: HTTP ${response.status}` };
229
+ }
230
+ }
231
+ catch (funcError) {
232
+ rawResponses[func.id] = {
233
+ error: funcError instanceof Error ? funcError.message : `Discovery failed for ${func.id}`,
234
+ };
235
+ }
236
+ }
237
+ setTools(allTools);
238
+ setDiscoveryResponses(rawResponses);
239
+ }
240
+ catch (error) {
241
+ setDiscoveryError(error instanceof Error ? error.message : 'Failed to fetch tools');
242
+ }
243
+ finally {
244
+ setLoadingTools(false);
245
+ }
246
+ };
247
+ const refreshDiscovery = (0, react_1.useCallback)(() => {
248
+ fetchOpalFunctions();
249
+ }, []);
250
+ // Auto-refresh discovery on successful build completion
251
+ // No delay needed: connections are closed at build start, so by the time
252
+ // buildSuccess fires, the old child process is fully gone and a fresh one
253
+ // will be spawned on the next request.
254
+ (0, react_1.useEffect)(() => {
255
+ if (buildStatus?.lastBuildSuccess &&
256
+ buildStatus.lastBuildTimestamp &&
257
+ lastBuildTimestampRef.current !== null &&
258
+ buildStatus.lastBuildTimestamp !== lastBuildTimestampRef.current) {
259
+ refreshDiscovery();
260
+ }
261
+ if (buildStatus?.lastBuildTimestamp) {
262
+ lastBuildTimestampRef.current = buildStatus.lastBuildTimestamp;
263
+ }
264
+ }, [buildStatus?.lastBuildSuccess, buildStatus?.lastBuildTimestamp, refreshDiscovery]);
265
+ const generateMockData = async () => {
266
+ if (!selectedTool)
267
+ return;
268
+ updateCurrentEphemeralState({ generatingMock: true });
269
+ try {
270
+ const response = await fetch(`/devserver/api/opal-tools/${selectedTool.functionId}/tools/${selectedTool.name}/generate-mock`, {
271
+ method: 'POST',
272
+ headers: { 'Content-Type': 'application/json' },
273
+ body: JSON.stringify({ parameters: selectedTool.parameters }),
274
+ });
275
+ if (response.ok) {
276
+ const data = await response.json();
277
+ updateCurrentFormState({
278
+ requestBody: JSON.stringify({ parameters: data.data }, null, 2),
279
+ });
280
+ }
281
+ }
282
+ catch (error) {
283
+ console.error('Error generating mock data:', error);
284
+ }
285
+ finally {
286
+ updateCurrentEphemeralState({ generatingMock: false });
287
+ }
288
+ };
289
+ const executeToolRequest = async () => {
290
+ if (!selectedTool)
291
+ return;
292
+ const currentState = getOrCreateToolState(selectedToolName);
293
+ updateCurrentEphemeralState({ loading: true });
294
+ const startTime = performance.now();
295
+ try {
296
+ let payload = {};
297
+ if (currentState.requestBody.trim()) {
298
+ try {
299
+ payload = JSON.parse(currentState.requestBody);
300
+ }
301
+ catch (e) {
302
+ updateCurrentEphemeralState({
303
+ response: {
304
+ result: null,
305
+ executionTime: 0,
306
+ error: {
307
+ message: 'Invalid JSON in request body',
308
+ stack: String(e),
309
+ },
310
+ },
311
+ loading: false,
312
+ });
313
+ return;
314
+ }
315
+ }
316
+ // Parse and merge auth data if present
317
+ if (currentState.authData && currentState.authData.trim()) {
318
+ try {
319
+ const authData = JSON.parse(currentState.authData);
320
+ payload = { ...payload, auth: authData };
321
+ }
322
+ catch (e) {
323
+ updateCurrentEphemeralState({
324
+ response: {
325
+ result: null,
326
+ executionTime: 0,
327
+ error: {
328
+ message: 'Invalid JSON in auth data',
329
+ stack: String(e),
330
+ },
331
+ },
332
+ loading: false,
333
+ });
334
+ return;
335
+ }
336
+ }
337
+ const toolUrl = `${selectedTool.functionUrl}${selectedTool.endpoint}`;
338
+ const response = await fetch(toolUrl, {
339
+ method: selectedTool.http_method || 'POST',
340
+ headers: { 'Content-Type': 'application/json' },
341
+ body: JSON.stringify(payload),
342
+ });
343
+ const executionTime = Math.round(performance.now() - startTime);
344
+ const responseHeaders = [];
345
+ response.headers.forEach((value, key) => {
346
+ responseHeaders.push([key, value]);
347
+ });
348
+ const responseText = await response.text();
349
+ let responseData;
350
+ try {
351
+ responseData = JSON.parse(responseText);
352
+ }
353
+ catch {
354
+ responseData = responseText;
355
+ }
356
+ updateCurrentEphemeralState({
357
+ response: {
358
+ result: responseData,
359
+ executionTime,
360
+ status: response.status,
361
+ statusText: response.statusText,
362
+ headers: responseHeaders,
363
+ },
364
+ loading: false,
365
+ });
366
+ }
367
+ catch (error) {
368
+ const executionTime = Math.round(performance.now() - startTime);
369
+ updateCurrentEphemeralState({
370
+ response: {
371
+ result: null,
372
+ executionTime,
373
+ error: {
374
+ message: error instanceof Error ? error.message : 'Unknown error',
375
+ stack: error instanceof Error ? error.stack : undefined,
376
+ },
377
+ },
378
+ loading: false,
379
+ });
380
+ }
381
+ };
382
+ // Check if entity is not available (building, failed, or not installed)
383
+ // Note: !appInstalled no longer blocks — global opal tools work without installation
384
+ const isNotAvailable = buildStatus?.buildInProgress ||
385
+ (buildStatus?.lastBuildSuccess === null && buildStatus?.lastBuildTimestamp === null) ||
386
+ buildStatus?.lastBuildSuccess === false;
387
+ if (isNotAvailable) {
388
+ return ((0, jsx_runtime_1.jsx)(EntityNotAvailable_1.default, { buildStatus: buildStatus, appInstalled: appInstalled, entityName: "Opal Tools" }));
389
+ }
390
+ return ((0, jsx_runtime_1.jsxs)("div", { className: "functions-view", children: [(0, jsx_runtime_1.jsxs)("div", { className: "content-header", children: [(0, jsx_runtime_1.jsx)("h2", { children: "Opal Tools" }), (0, jsx_runtime_1.jsxs)("div", { className: "functions-url-bar", children: [(0, jsx_runtime_1.jsx)("span", { className: "http-method-select http-method-display", children: selectedTool?.http_method || 'POST' }), (0, jsx_runtime_1.jsx)("input", { type: "text", className: "url-input", value: selectedTool ? `${selectedTool.functionUrl}${selectedTool.endpoint}` : '', placeholder: "Select a tool to see URL", readOnly: true }), (0, jsx_runtime_1.jsx)("button", { className: "send-button generate-mock-btn", onClick: generateMockData, disabled: !selectedTool || currentEphemeral.generatingMock, children: currentEphemeral.generatingMock ? 'Generating...' : 'Generate Mock' }), (0, jsx_runtime_1.jsx)("button", { className: "send-button", onClick: executeToolRequest, disabled: !selectedTool || currentEphemeral.loading || buildStatus?.buildInProgress, children: currentEphemeral.loading ? 'Sending...' : 'Send' })] })] }), (0, jsx_runtime_1.jsxs)("div", { className: "functions-layout", children: [(0, jsx_runtime_1.jsxs)("div", { className: "functions-sidebar", children: [(0, jsx_runtime_1.jsxs)("div", { className: "functions-header", children: [(0, jsx_runtime_1.jsx)("h4", { children: "Tools" }), (0, jsx_runtime_1.jsx)("button", { className: "refresh-btn", onClick: refreshDiscovery, title: "Refresh discovery", disabled: loadingTools, children: (0, jsx_runtime_1.jsx)(axiom_icons_1.IconArrowsRotate, { size: "2xs" }) })] }), (0, jsx_runtime_1.jsx)("div", { className: "functions-list", children: loadingTools ? ((0, jsx_runtime_1.jsx)("div", { className: "no-functions", children: (0, jsx_runtime_1.jsx)("p", { children: "Loading tools..." }) })) : discoveryError ? ((0, jsx_runtime_1.jsx)("div", { className: "no-functions", children: (0, jsx_runtime_1.jsxs)("p", { children: ["Error: ", discoveryError] }) })) : tools.length === 0 ? ((0, jsx_runtime_1.jsx)("div", { className: "no-functions", children: (0, jsx_runtime_1.jsx)("p", { children: "No Opal tools found" }) })) : (Object.entries(toolsByFunction).map(([functionId, functionTools]) => {
391
+ const func = opalFunctions.find(f => f.id === functionId);
392
+ const isLoading = readyLoading[functionId];
393
+ return ((0, jsx_runtime_1.jsxs)("div", { className: "tool-function-group", children: [(0, jsx_runtime_1.jsxs)("div", { className: "tool-function-header", onClick: () => toggleFunctionCollapsed(functionId), children: [(0, jsx_runtime_1.jsx)("span", { className: `collapse-icon ${collapsedFunctions[functionId] ? 'collapsed' : ''}`, children: "\u25BC" }), (0, jsx_runtime_1.jsx)("span", { className: "function-group-name", children: functionId }), func?.global && (0, jsx_runtime_1.jsx)("div", { className: "function-badge", children: "Global" }), (0, jsx_runtime_1.jsxs)("span", { className: "tool-count", children: ["(", functionTools.length, ")"] })] }), func?.url && ((0, jsx_runtime_1.jsxs)("div", { className: "tool-ready-row", children: [(0, jsx_runtime_1.jsx)("button", { className: "send-button tool-ready-btn", onClick: () => testReady(functionId, func.url), disabled: isLoading, children: isLoading ? 'Testing...' : 'Test Ready' }), (0, jsx_runtime_1.jsx)("button", { className: "send-button tool-ready-btn", onClick: () => setDiscoveryPopupFunction(functionId), children: "View Discovery" })] })), !collapsedFunctions[functionId] && ((0, jsx_runtime_1.jsx)("div", { className: "tool-items-container", children: functionTools.map((tool) => ((0, jsx_runtime_1.jsxs)("div", { className: `function-item tool-item-nested ${selectedToolName === getToolId(tool) ? 'active' : ''}`, onClick: () => navigateToEntity(getToolId(tool)), children: [(0, jsx_runtime_1.jsx)("div", { className: "function-name", children: tool.name }), (0, jsx_runtime_1.jsx)("div", { className: "function-description", children: tool.description.length > 60
394
+ ? tool.description.substring(0, 60) + '...'
395
+ : tool.description })] }, getToolId(tool)))) }))] }, functionId));
396
+ })) })] }), (0, jsx_runtime_1.jsx)("div", { className: "functions-content", children: selectedTool ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { className: "request-section", children: (0, jsx_runtime_1.jsxs)("div", { className: "request-tabs", children: [(0, jsx_runtime_1.jsxs)("div", { className: "tab-headers", children: [(0, jsx_runtime_1.jsx)("button", { className: `tab-header ${activeTab === 'params' ? 'active' : ''}`, onClick: () => setActiveTab('params'), children: "Params" }), (0, jsx_runtime_1.jsx)("button", { className: `tab-header ${activeTab === 'headers' ? 'active' : ''}`, onClick: () => setActiveTab('headers'), children: "Headers" }), (0, jsx_runtime_1.jsx)("button", { className: `tab-header ${activeTab === 'body' ? 'active' : ''}`, onClick: () => setActiveTab('body'), children: "Body" }), (0, jsx_runtime_1.jsx)("div", { className: "tab-spacer" }), (0, jsx_runtime_1.jsx)("button", { className: `tab-header ${activeTab === 'toolDescription' ? 'active' : ''}`, onClick: () => setActiveTab('toolDescription'), children: "Tool Description" }), (0, jsx_runtime_1.jsxs)("button", { className: `tab-header ${activeTab === 'toolParams' ? 'active' : ''}`, onClick: () => setActiveTab('toolParams'), children: ["Tool Parameters (", selectedTool.parameters.length, ")"] }), (0, jsx_runtime_1.jsx)("button", { className: `tab-header ${activeTab === 'authData' ? 'active' : ''}`, onClick: () => setActiveTab('authData'), children: "Auth Data" })] }), (0, jsx_runtime_1.jsxs)("div", { className: "tab-content", children: [activeTab === 'params' && ((0, jsx_runtime_1.jsx)(KeyValueEditor_1.default, { items: currentFormState.params, onAdd: () => addKeyValuePair('params'), onUpdate: (index, field, value) => updateKeyValuePair('params', index, field, value), onRemove: (index) => removeKeyValuePair('params', index), addButtonLabel: "Add Parameter" })), activeTab === 'headers' && ((0, jsx_runtime_1.jsx)(KeyValueEditor_1.default, { items: currentFormState.headers, onAdd: () => addKeyValuePair('headers'), onUpdate: (index, field, value) => updateKeyValuePair('headers', index, field, value), onRemove: (index) => removeKeyValuePair('headers', index), addButtonLabel: "Add Header" })), activeTab === 'body' && ((0, jsx_runtime_1.jsx)("div", { className: "body-editor", children: (0, jsx_runtime_1.jsx)("textarea", { className: "body-textarea", value: currentFormState.requestBody, onChange: (e) => updateCurrentFormState({ requestBody: e.target.value }), placeholder: "Enter JSON request body..." }) })), activeTab === 'toolDescription' && ((0, jsx_runtime_1.jsxs)("div", { className: "tool-description-content", children: [(0, jsx_runtime_1.jsx)("h4", { children: selectedTool.name }), (0, jsx_runtime_1.jsx)("p", { children: selectedTool.description || 'No description available.' })] })), activeTab === 'toolParams' && ((0, jsx_runtime_1.jsx)("div", { className: "schema-viewer", children: (0, jsx_runtime_1.jsx)("div", { className: "schema-fields", children: selectedTool.parameters.length > 0 ? ((0, jsx_runtime_1.jsxs)("table", { className: "fields-table", children: [(0, jsx_runtime_1.jsx)("thead", { children: (0, jsx_runtime_1.jsxs)("tr", { children: [(0, jsx_runtime_1.jsx)("th", { children: "Name" }), (0, jsx_runtime_1.jsx)("th", { children: "Type" }), (0, jsx_runtime_1.jsx)("th", { children: "Required" }), (0, jsx_runtime_1.jsx)("th", { children: "Description" })] }) }), (0, jsx_runtime_1.jsx)("tbody", { children: selectedTool.parameters.map((param) => ((0, jsx_runtime_1.jsxs)("tr", { children: [(0, jsx_runtime_1.jsx)("td", { className: "field-name", children: param.name }), (0, jsx_runtime_1.jsx)("td", { className: "field-type", children: (0, jsx_runtime_1.jsx)("span", { className: `type-badge type-${param.type.replace(/[^a-z]/gi, '')}`, children: param.type }) }), (0, jsx_runtime_1.jsxs)("td", { children: [param.required && (0, jsx_runtime_1.jsx)("span", { className: "primary-badge", children: "YES" }), !param.required && (0, jsx_runtime_1.jsx)("span", { className: "text-secondary", children: "No" })] }), (0, jsx_runtime_1.jsx)("td", { className: "field-description", children: param.description })] }, param.name))) })] })) : ((0, jsx_runtime_1.jsx)("p", { className: "empty-params-message", children: "This tool has no parameters." })) }) })), activeTab === 'authData' && ((0, jsx_runtime_1.jsxs)("div", { className: "auth-data-content", children: [selectedTool.auth_requirements && selectedTool.auth_requirements.length > 0 && ((0, jsx_runtime_1.jsxs)("div", { className: "auth-requirements-info", children: [(0, jsx_runtime_1.jsx)("h5", { children: "Auth Requirements" }), (0, jsx_runtime_1.jsx)("ul", { children: selectedTool.auth_requirements.map((req, idx) => ((0, jsx_runtime_1.jsxs)("li", { children: [(0, jsx_runtime_1.jsx)("strong", { children: req.provider }), ": ", req.scope_bundle, req.required && (0, jsx_runtime_1.jsx)("span", { className: "required-badge", children: "Required" })] }, idx))) })] })), (0, jsx_runtime_1.jsx)("div", { className: "body-editor", children: (0, jsx_runtime_1.jsx)("textarea", { className: "body-textarea", value: currentFormState.authData, onChange: (e) => updateCurrentFormState({ authData: e.target.value }), placeholder: "Enter JSON auth data..." }) })] }))] })] }) }), (0, jsx_runtime_1.jsxs)("div", { className: "response-section", children: [(0, jsx_runtime_1.jsxs)("div", { className: "response-header", children: [(0, jsx_runtime_1.jsx)("h4", { children: "Response" }), currentEphemeral.response && ((0, jsx_runtime_1.jsxs)("div", { className: "response-meta", children: [(0, jsx_runtime_1.jsxs)("span", { className: "execution-time", children: [currentEphemeral.response.executionTime, "ms"] }), currentEphemeral.response.status && ((0, jsx_runtime_1.jsxs)("span", { className: `http-status status-${Math.floor(currentEphemeral.response.status / 100)}xx`, children: [currentEphemeral.response.status, " ", currentEphemeral.response.statusText] }))] }))] }), (0, jsx_runtime_1.jsx)(ResponseViewer_1.default, { response: currentEphemeral.response })] })] })) : ((0, jsx_runtime_1.jsx)("div", { className: "no-function-selected", children: (0, jsx_runtime_1.jsxs)("div", { className: "placeholder-content", children: [(0, jsx_runtime_1.jsx)("h3", { children: "Select an Opal Tool" }), (0, jsx_runtime_1.jsx)("p", { children: "Choose a tool from the sidebar to test it, or click \"Test Ready\" to check function readiness" })] }) })) })] }), discoveryPopupFunction && ((0, jsx_runtime_1.jsx)("div", { className: "modal-overlay", onClick: () => setDiscoveryPopupFunction(null), children: (0, jsx_runtime_1.jsxs)("div", { className: "modal json-modal", onClick: e => e.stopPropagation(), children: [(0, jsx_runtime_1.jsxs)("div", { className: "modal-header", children: [(0, jsx_runtime_1.jsxs)("h3", { children: ["Discovery: ", discoveryPopupFunction] }), (0, jsx_runtime_1.jsx)("button", { className: "modal-close", onClick: () => setDiscoveryPopupFunction(null), children: "\u00D7" })] }), (0, jsx_runtime_1.jsx)("div", { className: "modal-body", children: discoveryResponses[discoveryPopupFunction] ? ((0, jsx_runtime_1.jsx)("pre", { className: "response-body", children: JSON.stringify(discoveryResponses[discoveryPopupFunction], null, 2) })) : ((0, jsx_runtime_1.jsx)("p", { children: "No discovery data available. Click refresh to load." })) })] }) })), readyPopupFunction && ((0, jsx_runtime_1.jsx)("div", { className: "modal-overlay", onClick: () => setReadyPopupFunction(null), children: (0, jsx_runtime_1.jsxs)("div", { className: "modal json-modal", onClick: e => e.stopPropagation(), children: [(0, jsx_runtime_1.jsxs)("div", { className: "modal-header", children: [(0, jsx_runtime_1.jsxs)("h3", { children: ["Ready Probe: ", readyPopupFunction] }), (0, jsx_runtime_1.jsx)("button", { className: "modal-close", onClick: () => setReadyPopupFunction(null), children: "\u00D7" })] }), (0, jsx_runtime_1.jsx)("div", { className: "modal-body", children: readyLoading[readyPopupFunction] ? ((0, jsx_runtime_1.jsx)("p", { children: "Testing readiness..." })) : readyResults[readyPopupFunction] ? ((0, jsx_runtime_1.jsx)("pre", { className: "response-body", children: JSON.stringify(readyResults[readyPopupFunction], null, 2) })) : null })] }) }))] }));
397
+ };
398
+ exports.default = OpalToolsView;
399
+ //# sourceMappingURL=OpalToolsView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpalToolsView.js","sourceRoot":"","sources":["../../../../src/ui/components/OpalToolsView.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import React from 'react';
2
+ import { ExecutionResponse } from '../types/common';
3
+ interface ResponseViewerProps {
4
+ /** The response object to display */
5
+ response: ExecutionResponse | null;
6
+ /** Optional logs to display (used by FunctionsView) */
7
+ logs?: string[];
8
+ /** Whether to show response tabs (body/headers). Default: false */
9
+ showTabs?: boolean;
10
+ /** Active tab when showTabs is true */
11
+ activeTab?: 'body' | 'headers';
12
+ /** Callback when tab changes */
13
+ onTabChange?: (tab: 'body' | 'headers') => void;
14
+ }
15
+ /**
16
+ * Reusable response viewer component.
17
+ * Displays HTTP response data including status, body, headers, and errors.
18
+ *
19
+ * Supports two modes:
20
+ * - Simple mode (default): Shows response body directly
21
+ * - Tabbed mode: Shows body/headers tabs when showTabs=true
22
+ *
23
+ * @example
24
+ * ```typescript
25
+ * // Simple mode (OpalToolsView)
26
+ * <ResponseViewer response={response} />
27
+ *
28
+ * // Tabbed mode (FunctionsView)
29
+ * <ResponseViewer
30
+ * response={response}
31
+ * logs={response.logs}
32
+ * showTabs
33
+ * activeTab={responseTab}
34
+ * onTabChange={setResponseTab}
35
+ * />
36
+ * ```
37
+ */
38
+ declare const ResponseViewer: React.FC<ResponseViewerProps>;
39
+ export default ResponseViewer;
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const jsx_runtime_1 = require("react/jsx-runtime");
4
+ /**
5
+ * Reusable response viewer component.
6
+ * Displays HTTP response data including status, body, headers, and errors.
7
+ *
8
+ * Supports two modes:
9
+ * - Simple mode (default): Shows response body directly
10
+ * - Tabbed mode: Shows body/headers tabs when showTabs=true
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * // Simple mode (OpalToolsView)
15
+ * <ResponseViewer response={response} />
16
+ *
17
+ * // Tabbed mode (FunctionsView)
18
+ * <ResponseViewer
19
+ * response={response}
20
+ * logs={response.logs}
21
+ * showTabs
22
+ * activeTab={responseTab}
23
+ * onTabChange={setResponseTab}
24
+ * />
25
+ * ```
26
+ */
27
+ const ResponseViewer = ({ response, logs, showTabs = false, activeTab = 'body', onTabChange, }) => {
28
+ if (!response) {
29
+ return ((0, jsx_runtime_1.jsx)("div", { className: "response-content", children: (0, jsx_runtime_1.jsx)("div", { className: "no-response", children: (0, jsx_runtime_1.jsx)("p", { children: "Send a request to see the response" }) }) }));
30
+ }
31
+ const renderBody = () => ((0, jsx_runtime_1.jsxs)("div", { className: "response-data", children: [response.error ? ((0, jsx_runtime_1.jsxs)("div", { className: "response-error", children: [(0, jsx_runtime_1.jsx)("h5", { children: "Error" }), (0, jsx_runtime_1.jsx)("pre", { children: response.error.message }), response.error.stack && ((0, jsx_runtime_1.jsxs)("details", { children: [(0, jsx_runtime_1.jsx)("summary", { children: "Stack trace" }), (0, jsx_runtime_1.jsx)("pre", { children: response.error.stack })] }))] })) : ((0, jsx_runtime_1.jsx)("div", { className: "response-body", children: (0, jsx_runtime_1.jsx)("pre", { children: typeof response.result === 'string'
32
+ ? response.result
33
+ : JSON.stringify(response.result, null, 2) }) })), logs && logs.length > 0 && ((0, jsx_runtime_1.jsxs)("div", { className: "response-logs", children: [(0, jsx_runtime_1.jsx)("h5", { children: "Execution Logs" }), (0, jsx_runtime_1.jsx)("div", { className: "log-entries", children: logs.map((log, index) => ((0, jsx_runtime_1.jsx)("div", { className: "log-entry", children: log }, index))) })] }))] }));
34
+ const renderHeaders = () => ((0, jsx_runtime_1.jsx)("div", { className: "response-headers", children: response.headers && response.headers.length > 0 ? ((0, jsx_runtime_1.jsxs)("div", { className: "key-value-editor", children: [(0, jsx_runtime_1.jsxs)("div", { className: "key-value-header", children: [(0, jsx_runtime_1.jsx)("span", { className: "col-key", children: "Key" }), (0, jsx_runtime_1.jsx)("span", { className: "col-value", children: "Value" })] }), response.headers.map(([key, value], index) => ((0, jsx_runtime_1.jsxs)("div", { className: "key-value-row", children: [(0, jsx_runtime_1.jsx)("input", { type: "text", value: key, readOnly: true, className: "header-key" }), (0, jsx_runtime_1.jsx)("input", { type: "text", value: value, readOnly: true, className: "header-value" })] }, index)))] })) : ((0, jsx_runtime_1.jsx)("div", { className: "no-headers", children: (0, jsx_runtime_1.jsx)("p", { children: "No response headers" }) })) }));
35
+ // Simple mode: just show body
36
+ if (!showTabs) {
37
+ return (0, jsx_runtime_1.jsx)("div", { className: "response-content", children: renderBody() });
38
+ }
39
+ // Tabbed mode: show body/headers tabs
40
+ return ((0, jsx_runtime_1.jsxs)("div", { className: "response-tabs", children: [(0, jsx_runtime_1.jsxs)("div", { className: "tab-headers", children: [(0, jsx_runtime_1.jsx)("button", { className: `tab-header ${activeTab === 'body' ? 'active' : ''}`, onClick: () => onTabChange?.('body'), children: "Body" }), (0, jsx_runtime_1.jsx)("button", { className: `tab-header ${activeTab === 'headers' ? 'active' : ''}`, onClick: () => onTabChange?.('headers'), children: "Headers" })] }), (0, jsx_runtime_1.jsxs)("div", { className: "tab-content", children: [activeTab === 'body' && renderBody(), activeTab === 'headers' && renderHeaders()] })] }));
41
+ };
42
+ exports.default = ResponseViewer;
43
+ //# sourceMappingURL=ResponseViewer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResponseViewer.js","sourceRoot":"","sources":["../../../../src/ui/components/ResponseViewer.tsx"],"names":[],"mappings":";;;AAgBA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,cAAc,GAAkC,CAAC,EACrD,QAAQ,EACR,IAAI,EACJ,QAAQ,GAAG,KAAK,EAChB,SAAS,GAAG,MAAM,EAClB,WAAW,GACZ,EAAE,EAAE;IACH,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CACL,gCAAK,SAAS,EAAC,kBAAkB,YAC/B,gCAAK,SAAS,EAAC,aAAa,YAC1B,+EAAyC,GACrC,GACF,CACP,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,CACvB,iCAAK,SAAS,EAAC,eAAe,aAC3B,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAChB,iCAAK,SAAS,EAAC,gBAAgB,aAC7B,mDAAc,EACd,0CAAM,QAAQ,CAAC,KAAK,CAAC,OAAO,GAAO,EAClC,QAAQ,CAAC,KAAK,CAAC,KAAK,IAAI,CACvB,gDACE,8DAA8B,EAC9B,0CAAM,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAO,IACzB,CACX,IACG,CACP,CAAC,CAAC,CAAC,CACF,gCAAK,SAAS,EAAC,eAAe,YAC5B,0CACG,OAAO,QAAQ,CAAC,MAAM,KAAK,QAAQ;wBAClC,CAAC,CAAC,QAAQ,CAAC,MAAM;wBACjB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GACxC,GACF,CACP,EAEA,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAC1B,iCAAK,SAAS,EAAC,eAAe,aAC5B,4DAAuB,EACvB,gCAAK,SAAS,EAAC,aAAa,YACzB,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CACxB,gCAAiB,SAAS,EAAC,WAAW,YACnC,GAAG,IADI,KAAK,CAET,CACP,CAAC,GACE,IACF,CACP,IACG,CACP,CAAC;IAEF,MAAM,aAAa,GAAG,GAAG,EAAE,CAAC,CAC1B,gCAAK,SAAS,EAAC,kBAAkB,YAC9B,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CACjD,iCAAK,SAAS,EAAC,kBAAkB,aAC/B,iCAAK,SAAS,EAAC,kBAAkB,aAC/B,iCAAM,SAAS,EAAC,SAAS,oBAAW,EACpC,iCAAM,SAAS,EAAC,WAAW,sBAAa,IACpC,EACL,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAC7C,iCAAiB,SAAS,EAAC,eAAe,aACxC,kCAAO,IAAI,EAAC,MAAM,EAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,QAAC,SAAS,EAAC,YAAY,GAAG,EACjE,kCAAO,IAAI,EAAC,MAAM,EAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,QAAC,SAAS,EAAC,cAAc,GAAG,KAF7D,KAAK,CAGT,CACP,CAAC,IACE,CACP,CAAC,CAAC,CAAC,CACF,gCAAK,SAAS,EAAC,YAAY,YACzB,gEAA0B,GACtB,CACP,GACG,CACP,CAAC;IAEF,8BAA8B;IAC9B,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,gCAAK,SAAS,EAAC,kBAAkB,YAAE,UAAU,EAAE,GAAO,CAAC;IAChE,CAAC;IAED,sCAAsC;IACtC,OAAO,CACL,iCAAK,SAAS,EAAC,eAAe,aAC5B,iCAAK,SAAS,EAAC,aAAa,aAC1B,mCACE,SAAS,EAAE,cAAc,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,EAC/D,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,qBAG7B,EACT,mCACE,SAAS,EAAE,cAAc,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,EAClE,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,wBAGhC,IACL,EAEN,iCAAK,SAAS,EAAC,aAAa,aACzB,SAAS,KAAK,MAAM,IAAI,UAAU,EAAE,EACpC,SAAS,KAAK,SAAS,IAAI,aAAa,EAAE,IACvC,IACF,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,kBAAe,cAAc,CAAC"}
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const jsx_runtime_1 = require("react/jsx-runtime");
7
7
  const react_1 = require("react");
8
8
  const EyeIcon_1 = __importDefault(require("./common/EyeIcon"));
9
+ const axiom_icons_1 = require("@optimizely/axiom-icons");
9
10
  const SecretsStoreViewer = ({ secrets, onUpdate }) => {
10
11
  const [expandedSections, setExpandedSections] = (0, react_1.useState)(new Set());
11
12
  const [visibleSecrets, setVisibleSecrets] = (0, react_1.useState)(new Set());
@@ -162,7 +163,7 @@ const SecretsStoreViewer = ({ secrets, onUpdate }) => {
162
163
  };
163
164
  const sectionNames = Object.keys(secrets).sort();
164
165
  if (sectionNames.length === 0) {
165
- return ((0, jsx_runtime_1.jsx)("div", { className: "secrets-store-viewer empty", children: (0, jsx_runtime_1.jsxs)("div", { className: "empty-message", children: [(0, jsx_runtime_1.jsx)("span", { className: "empty-icon", children: "\uD83D\uDD10" }), (0, jsx_runtime_1.jsx)("p", { children: "No secrets stored" }), (0, jsx_runtime_1.jsx)("button", { className: "add-section-btn", onClick: () => addNewSecret('default'), children: "Add First Secret" })] }) }));
166
+ return ((0, jsx_runtime_1.jsx)("div", { className: "secrets-store-viewer empty", children: (0, jsx_runtime_1.jsxs)("div", { className: "empty-message", children: [(0, jsx_runtime_1.jsx)(axiom_icons_1.IconKey, { size: "xl" }), (0, jsx_runtime_1.jsx)("p", { children: "No secrets stored" }), (0, jsx_runtime_1.jsx)("button", { className: "add-section-btn", onClick: () => addNewSecret('default'), children: "Add First Secret" })] }) }));
166
167
  }
167
168
  return ((0, jsx_runtime_1.jsx)("div", { className: "secrets-store-viewer compact-store", children: (0, jsx_runtime_1.jsxs)("div", { className: "store-sections", children: [sectionNames.map((sectionName) => {
168
169
  const section = secrets[sectionName];
@@ -171,7 +172,7 @@ const SecretsStoreViewer = ({ secrets, onUpdate }) => {
171
172
  return ((0, jsx_runtime_1.jsxs)("div", { className: "store-section", children: [(0, jsx_runtime_1.jsxs)("div", { className: "section-header", onClick: () => toggleSection(sectionName), children: [(0, jsx_runtime_1.jsx)("span", { className: "expand-icon", children: isExpanded ? '▼' : '▶' }), (0, jsx_runtime_1.jsx)("span", { className: "section-name", children: sectionName }), (0, jsx_runtime_1.jsxs)("span", { className: "field-count", children: ["(", fieldNames.length, ")"] })] }), isExpanded && ((0, jsx_runtime_1.jsx)("div", { className: "section-fields", children: fieldNames.map((fieldName) => {
172
173
  const value = section[fieldName];
173
174
  const secretId = `${sectionName}.${fieldName}`;
174
- return ((0, jsx_runtime_1.jsxs)("div", { className: "field-row", children: [(0, jsx_runtime_1.jsx)("div", { className: "field-key", children: fieldName }), (0, jsx_runtime_1.jsx)("div", { className: "field-value", children: renderSecretValue(value, secretId) }), (0, jsx_runtime_1.jsxs)("div", { className: "field-metadata", children: [(0, jsx_runtime_1.jsx)(EyeIcon_1.default, { isVisible: visibleSecrets.has(secretId), onClick: () => toggleSecretVisibility(secretId), className: "metadata-icon" }), (0, jsx_runtime_1.jsx)("button", { className: "edit-icon", onClick: () => startEditing(sectionName, fieldName, value), title: "Edit", children: "\u270F\uFE0F" }), (0, jsx_runtime_1.jsx)("button", { className: "delete-icon", onClick: () => deleteSecret(sectionName, fieldName), title: "Delete", children: "\uD83D\uDDD1\uFE0F" })] })] }, fieldName));
175
+ return ((0, jsx_runtime_1.jsxs)("div", { className: "field-row", children: [(0, jsx_runtime_1.jsx)("div", { className: "field-key", children: fieldName }), (0, jsx_runtime_1.jsx)("div", { className: "field-value", children: renderSecretValue(value, secretId) }), (0, jsx_runtime_1.jsxs)("div", { className: "field-metadata", children: [(0, jsx_runtime_1.jsx)(EyeIcon_1.default, { isVisible: visibleSecrets.has(secretId), onClick: () => toggleSecretVisibility(secretId), className: "metadata-icon" }), (0, jsx_runtime_1.jsx)("button", { className: "edit-icon", onClick: () => startEditing(sectionName, fieldName, value), title: "Edit", children: (0, jsx_runtime_1.jsx)(axiom_icons_1.IconPen, { size: "2xs" }) }), (0, jsx_runtime_1.jsx)("button", { className: "delete-icon", onClick: () => deleteSecret(sectionName, fieldName), title: "Delete", children: "\uD83D\uDDD1\uFE0F" })] })] }, fieldName));
175
176
  }) }))] }, sectionName));
176
177
  }), sectionNames.length === 0 && ((0, jsx_runtime_1.jsx)("div", { className: "empty-store", children: "No secrets configured" }))] }) }));
177
178
  };