@optimizely/ocp-local-env 1.0.0-beta.8 → 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.
- package/README.md +18 -133
- package/dist/package.json +17 -9
- package/dist/public/bundle.fa87c838198caf8c051a.js +3 -0
- package/dist/public/{bundle.0a495807b6ef336cb500.js.LICENSE.txt → bundle.fa87c838198caf8c051a.js.LICENSE.txt} +13 -3
- package/dist/public/bundle.fa87c838198caf8c051a.js.map +1 -0
- package/dist/public/index.html +1 -1
- package/dist/src/cli.js +2 -2
- package/dist/src/cli.js.map +1 -1
- package/dist/src/executor/FunctionExecutor.js +8 -5
- package/dist/src/executor/FunctionExecutor.js.map +1 -1
- package/dist/src/executor/JobExecutor.js +0 -17
- package/dist/src/executor/JobExecutor.js.map +1 -1
- package/dist/src/executor/LifecycleExecutor.js +11 -2
- package/dist/src/executor/LifecycleExecutor.js.map +1 -1
- package/dist/src/executor/watcher.d.ts +6 -0
- package/dist/src/executor/watcher.js +45 -0
- package/dist/src/executor/watcher.js.map +1 -1
- package/dist/src/local_engine/LocalJobApi.d.ts +31 -2
- package/dist/src/local_engine/LocalJobApi.js +42 -17
- package/dist/src/local_engine/LocalJobApi.js.map +1 -1
- package/dist/src/local_engine/LocalNotifier.d.ts +3 -2
- package/dist/src/local_engine/LocalNotifier.js +7 -0
- package/dist/src/local_engine/LocalNotifier.js.map +1 -1
- package/dist/src/local_engine/LocalSourceApi.d.ts +40 -0
- package/dist/src/local_engine/LocalSourceApi.js +69 -0
- package/dist/src/local_engine/LocalSourceApi.js.map +1 -0
- package/dist/src/local_engine/local-engine-child-base.d.ts +0 -12
- package/dist/src/local_engine/local-engine-child-base.js +0 -127
- package/dist/src/local_engine/local-engine-child-base.js.map +1 -1
- package/dist/src/local_engine/local-engine-client.d.ts +19 -29
- package/dist/src/local_engine/local-engine-client.js +45 -94
- package/dist/src/local_engine/local-engine-client.js.map +1 -1
- package/dist/src/local_engine/local-engine-types.d.ts +13 -50
- package/dist/src/local_engine/local-engine-unified.d.ts +6 -13
- package/dist/src/local_engine/local-engine-unified.js +108 -222
- package/dist/src/local_engine/local-engine-unified.js.map +1 -1
- package/dist/src/local_engine/localSDKConfig.d.ts +6 -0
- package/dist/src/local_engine/localSDKConfig.js +66 -1
- package/dist/src/local_engine/localSDKConfig.js.map +1 -1
- package/dist/src/local_engine/storage/BaseKVStoreWrapper.d.ts +1 -2
- package/dist/src/local_engine/storage/BaseKVStoreWrapper.js.map +1 -1
- package/dist/src/local_engine/storage/LocalConfigStore.d.ts +7 -13
- package/dist/src/local_engine/storage/LocalConfigStore.js +9 -31
- package/dist/src/local_engine/storage/LocalConfigStore.js.map +1 -1
- package/dist/src/local_engine/storage/LocalKVStore.d.ts +4 -0
- package/dist/src/local_engine/storage/LocalKVStore.js +23 -0
- package/dist/src/local_engine/storage/LocalKVStore.js.map +1 -1
- package/dist/src/local_engine/storage/LocalSettingsStore.d.ts +7 -1
- package/dist/src/local_engine/storage/LocalSettingsStore.js +46 -4
- package/dist/src/local_engine/storage/LocalSettingsStore.js.map +1 -1
- package/dist/src/local_engine/storage/SourceDataStore.d.ts +16 -14
- package/dist/src/local_engine/storage/SourceDataStore.js +57 -57
- package/dist/src/local_engine/storage/SourceDataStore.js.map +1 -1
- package/dist/src/local_engine/utils.d.ts +2 -0
- package/dist/src/local_engine/utils.js +4 -2
- package/dist/src/local_engine/utils.js.map +1 -1
- package/dist/src/server/api/deploy.d.ts +20 -0
- package/dist/src/server/api/deploy.js +399 -0
- package/dist/src/server/api/deploy.js.map +1 -0
- package/dist/src/server/api/destinations.js +1 -1
- package/dist/src/server/api/destinations.js.map +1 -1
- package/dist/src/server/api/env.d.ts +2 -0
- package/dist/src/server/api/env.js +28 -0
- package/dist/src/server/api/env.js.map +1 -0
- package/dist/src/server/api/functions.js +13 -12
- package/dist/src/server/api/functions.js.map +1 -1
- package/dist/src/server/api/opalTools.d.ts +4 -0
- package/dist/src/server/api/opalTools.js +81 -0
- package/dist/src/server/api/opalTools.js.map +1 -0
- package/dist/src/server/api/schema.d.ts +6 -0
- package/dist/src/server/api/schema.js +95 -0
- package/dist/src/server/api/schema.js.map +1 -0
- package/dist/src/server/api/sources.d.ts +1 -2
- package/dist/src/server/api/sources.js +16 -275
- package/dist/src/server/api/sources.js.map +1 -1
- package/dist/src/server/api/v1.js +67 -70
- package/dist/src/server/api/v1.js.map +1 -1
- package/dist/src/server/api.d.ts +4 -0
- package/dist/src/server/api.js +133 -11
- package/dist/src/server/api.js.map +1 -1
- package/dist/src/server/app-discovery.js +37 -4
- package/dist/src/server/app-discovery.js.map +1 -1
- package/dist/src/server/app-env.d.ts +21 -0
- package/dist/src/server/app-env.js +122 -0
- package/dist/src/server/app-env.js.map +1 -0
- package/dist/src/server/browserFocus.d.ts +5 -0
- package/dist/src/server/browserFocus.js +39 -0
- package/dist/src/server/browserFocus.js.map +1 -0
- package/dist/src/server/config.d.ts +3 -0
- package/dist/src/server/config.js +7 -0
- package/dist/src/server/config.js.map +1 -1
- package/dist/src/server/mockDataGenerator.d.ts +1 -2
- package/dist/src/server/mockDataGenerator.js +77 -35
- package/dist/src/server/mockDataGenerator.js.map +1 -1
- package/dist/src/server/mockToolDataGenerator.d.ts +12 -0
- package/dist/src/server/mockToolDataGenerator.js +393 -0
- package/dist/src/server/mockToolDataGenerator.js.map +1 -0
- package/dist/src/server.js +152 -168
- package/dist/src/server.js.map +1 -1
- package/dist/src/types/app.d.ts +1 -3
- package/dist/src/types/app.js.map +1 -1
- package/dist/src/ui/components/App.js +311 -50
- package/dist/src/ui/components/App.js.map +1 -1
- package/dist/src/ui/components/DeployModal.d.ts +16 -0
- package/dist/src/ui/components/DeployModal.js +75 -0
- package/dist/src/ui/components/DeployModal.js.map +1 -0
- package/dist/src/ui/components/DestinationBatchEditor.d.ts +9 -1
- package/dist/src/ui/components/DestinationBatchEditor.js +30 -16
- package/dist/src/ui/components/DestinationBatchEditor.js.map +1 -1
- package/dist/src/ui/components/DestinationsView.js +5 -1
- package/dist/src/ui/components/DestinationsView.js.map +1 -1
- package/dist/src/ui/components/EntityNotAvailable.d.ts +15 -0
- package/dist/src/ui/components/EntityNotAvailable.js +27 -0
- package/dist/src/ui/components/EntityNotAvailable.js.map +1 -0
- package/dist/src/ui/components/EnvViewer.d.ts +8 -0
- package/dist/src/ui/components/EnvViewer.js +35 -0
- package/dist/src/ui/components/EnvViewer.js.map +1 -0
- package/dist/src/ui/components/FunctionsView.d.ts +2 -6
- package/dist/src/ui/components/FunctionsView.js +106 -124
- package/dist/src/ui/components/FunctionsView.js.map +1 -1
- package/dist/src/ui/components/JobsView.js +28 -5
- package/dist/src/ui/components/JobsView.js.map +1 -1
- package/dist/src/ui/components/KVStoreViewer.js +5 -5
- package/dist/src/ui/components/KVStoreViewer.js.map +1 -1
- package/dist/src/ui/components/KeyValueEditor.d.ts +15 -0
- package/dist/src/ui/components/KeyValueEditor.js +12 -0
- package/dist/src/ui/components/KeyValueEditor.js.map +1 -0
- package/dist/src/ui/components/NotificationViewer.d.ts +2 -11
- package/dist/src/ui/components/NotificationViewer.js +69 -15
- package/dist/src/ui/components/NotificationViewer.js.map +1 -1
- package/dist/src/ui/components/OdpSchemaView.d.ts +3 -0
- package/dist/src/ui/components/OdpSchemaView.js +58 -0
- package/dist/src/ui/components/OdpSchemaView.js.map +1 -0
- package/dist/src/ui/components/OpalToolsView.d.ts +9 -0
- package/dist/src/ui/components/OpalToolsView.js +399 -0
- package/dist/src/ui/components/OpalToolsView.js.map +1 -0
- package/dist/src/ui/components/ResponseViewer.d.ts +39 -0
- package/dist/src/ui/components/ResponseViewer.js +43 -0
- package/dist/src/ui/components/ResponseViewer.js.map +1 -0
- package/dist/src/ui/components/SecretsStoreViewer.js +3 -2
- package/dist/src/ui/components/SecretsStoreViewer.js.map +1 -1
- package/dist/src/ui/components/SettingsStoreViewer.js +3 -2
- package/dist/src/ui/components/SettingsStoreViewer.js.map +1 -1
- package/dist/src/ui/components/SourceEmittedDataPanel.d.ts +8 -0
- package/dist/src/ui/components/SourceEmittedDataPanel.js +103 -0
- package/dist/src/ui/components/SourceEmittedDataPanel.js.map +1 -0
- package/dist/src/ui/components/SourcesView.js +4 -8
- package/dist/src/ui/components/SourcesView.js.map +1 -1
- package/dist/src/ui/components/StoreViewer.js +2 -1
- package/dist/src/ui/components/StoreViewer.js.map +1 -1
- package/dist/src/ui/components/TabbedConsole.d.ts +11 -0
- package/dist/src/ui/components/TabbedConsole.js +134 -44
- package/dist/src/ui/components/TabbedConsole.js.map +1 -1
- package/dist/src/ui/components/ToolSettingsView.d.ts +7 -0
- package/dist/src/ui/components/ToolSettingsView.js +25 -0
- package/dist/src/ui/components/ToolSettingsView.js.map +1 -0
- package/dist/src/ui/components/common/EyeIcon.js +2 -1
- package/dist/src/ui/components/common/EyeIcon.js.map +1 -1
- package/dist/src/ui/hooks/useKeyValuePairs.d.ts +52 -0
- package/dist/src/ui/hooks/useKeyValuePairs.js +66 -0
- package/dist/src/ui/hooks/useKeyValuePairs.js.map +1 -0
- package/dist/src/ui/index.js +4 -2
- package/dist/src/ui/index.js.map +1 -1
- package/dist/src/ui/store/formStateSlice.d.ts +71 -0
- package/dist/src/ui/store/formStateSlice.js +159 -0
- package/dist/src/ui/store/formStateSlice.js.map +1 -0
- package/dist/src/ui/store/hooks.d.ts +6 -0
- package/dist/src/ui/store/hooks.js +8 -0
- package/dist/src/ui/store/hooks.js.map +1 -0
- package/dist/src/ui/store/index.d.ts +11 -0
- package/dist/src/ui/store/index.js +107 -0
- package/dist/src/ui/store/index.js.map +1 -0
- package/dist/src/ui/types/common.d.ts +33 -0
- package/dist/src/ui/types/common.js +6 -0
- package/dist/src/ui/types/common.js.map +1 -0
- package/package.json +17 -9
- package/dist/public/bundle.0a495807b6ef336cb500.js +0 -3
- package/dist/public/bundle.0a495807b6ef336cb500.js.map +0 -1
- package/dist/src/executor/SourceExecutor.d.ts +0 -32
- package/dist/src/executor/SourceExecutor.js +0 -163
- package/dist/src/executor/SourceExecutor.js.map +0 -1
- package/dist/src/local_engine/storage/SourceJobExecutionStore.d.ts +0 -25
- package/dist/src/local_engine/storage/SourceJobExecutionStore.js +0 -61
- package/dist/src/local_engine/storage/SourceJobExecutionStore.js.map +0 -1
- package/dist/src/ui/components/SourceDataViewer.d.ts +0 -8
- package/dist/src/ui/components/SourceDataViewer.js +0 -84
- package/dist/src/ui/components/SourceDataViewer.js.map +0 -1
- package/dist/src/ui/components/SourceJobsSection.d.ts +0 -8
- package/dist/src/ui/components/SourceJobsSection.js +0 -99
- package/dist/src/ui/components/SourceJobsSection.js.map +0 -1
- package/dist/src/ui/components/SourceLifecycleSection.d.ts +0 -7
- package/dist/src/ui/components/SourceLifecycleSection.js +0 -58
- package/dist/src/ui/components/SourceLifecycleSection.js.map +0 -1
- package/dist/src/ui/components/SourceWebhookEditor.d.ts +0 -8
- package/dist/src/ui/components/SourceWebhookEditor.js +0 -168
- 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)(
|
|
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: "
|
|
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
|
};
|