@fias/plugin-dev-harness 1.2.0 → 1.3.0
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/dist/cli/check-auth.d.ts +3 -3
- package/dist/cli/check-auth.d.ts.map +1 -1
- package/dist/cli/check-auth.js +19 -8
- package/dist/cli/check-auth.js.map +1 -1
- package/dist/cli/check-auth.test.d.ts +2 -0
- package/dist/cli/check-auth.test.d.ts.map +1 -0
- package/dist/cli/check-auth.test.js +49 -0
- package/dist/cli/check-auth.test.js.map +1 -0
- package/dist/cli/dev.d.ts +2 -2
- package/dist/cli/dev.d.ts.map +1 -1
- package/dist/cli/dev.js +4 -20
- package/dist/cli/dev.js.map +1 -1
- package/dist/cli/dev.test.js +10 -38
- package/dist/cli/dev.test.js.map +1 -1
- package/dist/cli/entities.d.ts.map +1 -1
- package/dist/cli/entities.js +8 -6
- package/dist/cli/entities.js.map +1 -1
- package/dist/cli/entities.test.js +15 -24
- package/dist/cli/entities.test.js.map +1 -1
- package/dist/cli/index.test.js +2 -2
- package/dist/cli/login.d.ts +2 -0
- package/dist/cli/login.d.ts.map +1 -1
- package/dist/cli/login.js +19 -14
- package/dist/cli/login.js.map +1 -1
- package/dist/cli/login.test.js +46 -24
- package/dist/cli/login.test.js.map +1 -1
- package/dist/cli/submit.d.ts.map +1 -1
- package/dist/cli/submit.js +13 -11
- package/dist/cli/submit.js.map +1 -1
- package/dist/cli/submit.test.js +13 -22
- package/dist/cli/submit.test.js.map +1 -1
- package/dist/config/config-loader.d.ts +6 -0
- package/dist/config/config-loader.d.ts.map +1 -1
- package/dist/config/config-loader.js +12 -0
- package/dist/config/config-loader.js.map +1 -1
- package/dist/config/credentials.d.ts +19 -1
- package/dist/config/credentials.d.ts.map +1 -1
- package/dist/config/credentials.js +46 -6
- package/dist/config/credentials.js.map +1 -1
- package/dist/config/credentials.test.js +72 -27
- package/dist/config/credentials.test.js.map +1 -1
- package/dist/index.js +0 -0
- package/dist/server/harness-server.d.ts +2 -3
- package/dist/server/harness-server.d.ts.map +1 -1
- package/dist/server/harness-server.js +233 -41
- package/dist/server/harness-server.js.map +1 -1
- package/dist/server/harness-server.test.js +60 -3
- package/dist/server/harness-server.test.js.map +1 -1
- package/dist/server/static/harness.css +58 -0
- package/dist/server/static/harness.html +20 -7
- package/dist/server/static/harness.js +162 -6
- package/package.json +10 -10
- package/dist/server/static/static/harness.css +0 -332
- package/dist/server/static/static/harness.html +0 -53
- package/dist/server/static/static/harness.js +0 -569
|
@@ -44,29 +44,39 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
44
44
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
45
|
exports.startHarnessServer = startHarnessServer;
|
|
46
46
|
const express_1 = __importDefault(require("express"));
|
|
47
|
+
const crypto = __importStar(require("crypto"));
|
|
47
48
|
const path = __importStar(require("path"));
|
|
48
49
|
const fs = __importStar(require("fs"));
|
|
49
50
|
const chalk_1 = __importDefault(require("chalk"));
|
|
51
|
+
const config_loader_1 = require("../config/config-loader");
|
|
50
52
|
const mock_handler_1 = require("../bridge/mock-handler");
|
|
51
53
|
const live_handler_1 = require("../bridge/live-handler");
|
|
52
54
|
const credentials_1 = require("../config/credentials");
|
|
53
55
|
async function startHarnessServer(options) {
|
|
54
56
|
const app = (0, express_1.default)();
|
|
55
57
|
app.use(express_1.default.json());
|
|
56
|
-
// Mutable
|
|
57
|
-
let currentMode =
|
|
58
|
-
let
|
|
58
|
+
// Mutable state — toggled at runtime via UI
|
|
59
|
+
let currentMode = 'mock';
|
|
60
|
+
let currentEnvironment = options.defaultEnvironment;
|
|
61
|
+
let currentApiKey = (0, credentials_1.loadApiKeyForEnvironment)(currentEnvironment);
|
|
62
|
+
let pendingAuthState = null;
|
|
63
|
+
function getCurrentApiUrl() {
|
|
64
|
+
return config_loader_1.ENVIRONMENT_URLS[currentEnvironment].apiUrl;
|
|
65
|
+
}
|
|
66
|
+
function getCurrentPlatformUrl() {
|
|
67
|
+
return config_loader_1.ENVIRONMENT_URLS[currentEnvironment].platformUrl;
|
|
68
|
+
}
|
|
59
69
|
// Always create mock handler
|
|
60
70
|
const mockHandler = new mock_handler_1.MockBridgeHandler({
|
|
61
71
|
mockUser: options.mockUser,
|
|
62
72
|
mockTheme: options.mockTheme,
|
|
63
73
|
mockEntities: options.mockEntities,
|
|
64
74
|
});
|
|
65
|
-
// Create live handler (recreated when credentials change)
|
|
75
|
+
// Create live handler (recreated when credentials or environment change)
|
|
66
76
|
let liveHandler = currentApiKey
|
|
67
77
|
? new live_handler_1.LiveBridgeHandler({
|
|
68
78
|
apiKey: currentApiKey,
|
|
69
|
-
apiUrl:
|
|
79
|
+
apiUrl: getCurrentApiUrl(),
|
|
70
80
|
permissions: options.permissions,
|
|
71
81
|
mockUser: options.mockUser,
|
|
72
82
|
mockTheme: options.mockTheme,
|
|
@@ -75,6 +85,20 @@ async function startHarnessServer(options) {
|
|
|
75
85
|
function getActiveHandler() {
|
|
76
86
|
return currentMode === 'live' && liveHandler ? liveHandler : mockHandler;
|
|
77
87
|
}
|
|
88
|
+
function rebuildLiveHandler() {
|
|
89
|
+
if (currentApiKey) {
|
|
90
|
+
liveHandler = new live_handler_1.LiveBridgeHandler({
|
|
91
|
+
apiKey: currentApiKey,
|
|
92
|
+
apiUrl: getCurrentApiUrl(),
|
|
93
|
+
permissions: options.permissions,
|
|
94
|
+
mockUser: options.mockUser,
|
|
95
|
+
mockTheme: options.mockTheme,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
liveHandler = null;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
78
102
|
// Mode toggle endpoint — called by harness.js
|
|
79
103
|
app.post('/api/mode', (req, res) => {
|
|
80
104
|
const { mode } = req.body;
|
|
@@ -99,17 +123,63 @@ async function startHarnessServer(options) {
|
|
|
99
123
|
return;
|
|
100
124
|
}
|
|
101
125
|
currentApiKey = apiKey.trim();
|
|
102
|
-
(0, credentials_1.
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
apiUrl: options.apiUrl,
|
|
106
|
-
permissions: options.permissions,
|
|
107
|
-
mockUser: options.mockUser,
|
|
108
|
-
mockTheme: options.mockTheme,
|
|
109
|
-
});
|
|
110
|
-
console.log(chalk_1.default.green(' API key saved to ~/.fias/credentials'));
|
|
126
|
+
(0, credentials_1.saveApiKeyForEnvironment)(currentEnvironment, currentApiKey);
|
|
127
|
+
rebuildLiveHandler();
|
|
128
|
+
console.log(chalk_1.default.green(` API key saved for ${currentEnvironment} environment`));
|
|
111
129
|
res.json({ success: true });
|
|
112
130
|
});
|
|
131
|
+
// Auth start endpoint — generates state token and returns auth URL for popup
|
|
132
|
+
app.post('/api/auth/start', (_req, res) => {
|
|
133
|
+
pendingAuthState = crypto.randomBytes(32).toString('hex');
|
|
134
|
+
const authUrl = `${getCurrentPlatformUrl()}/developer/cli-auth?port=${options.port}&state=${pendingAuthState}`;
|
|
135
|
+
res.json({ authUrl });
|
|
136
|
+
});
|
|
137
|
+
// Auth callback — receives redirect from CliAuthPage after browser login
|
|
138
|
+
app.get('/callback', (req, res) => {
|
|
139
|
+
const key = req.query.key;
|
|
140
|
+
const returnedState = req.query.state;
|
|
141
|
+
res.setHeader('Content-Type', 'text/html');
|
|
142
|
+
if (!pendingAuthState || returnedState !== pendingAuthState) {
|
|
143
|
+
res
|
|
144
|
+
.status(400)
|
|
145
|
+
.send(renderCallbackHtml('Authentication Failed', 'State mismatch. Please try again.', true));
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
if (!key || !key.startsWith('fias_sk_')) {
|
|
149
|
+
res
|
|
150
|
+
.status(400)
|
|
151
|
+
.send(renderCallbackHtml('Authentication Failed', 'Invalid API key received.', true));
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
// Save key for current environment
|
|
155
|
+
currentApiKey = key;
|
|
156
|
+
(0, credentials_1.saveApiKeyForEnvironment)(currentEnvironment, currentApiKey);
|
|
157
|
+
rebuildLiveHandler();
|
|
158
|
+
pendingAuthState = null;
|
|
159
|
+
console.log(chalk_1.default.green(` Authenticated for ${currentEnvironment} environment`));
|
|
160
|
+
res.send(renderCallbackHtml('Authentication Successful', 'You can close this window. The harness will switch to live mode automatically.', false));
|
|
161
|
+
});
|
|
162
|
+
// Environment switch endpoint
|
|
163
|
+
app.post('/api/environment', (req, res) => {
|
|
164
|
+
const { environment } = req.body;
|
|
165
|
+
if (environment !== 'staging' && environment !== 'production') {
|
|
166
|
+
res.status(400).json({ error: 'Invalid environment. Use "staging" or "production".' });
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
currentEnvironment = environment;
|
|
170
|
+
currentApiKey = (0, credentials_1.loadApiKeyForEnvironment)(currentEnvironment);
|
|
171
|
+
rebuildLiveHandler();
|
|
172
|
+
// Fall back to mock if no key for this environment
|
|
173
|
+
if (currentMode === 'live' && !liveHandler) {
|
|
174
|
+
currentMode = 'mock';
|
|
175
|
+
}
|
|
176
|
+
console.log(chalk_1.default.dim(` Environment switched to ${currentEnvironment.toUpperCase()}`));
|
|
177
|
+
res.json({
|
|
178
|
+
environment: currentEnvironment,
|
|
179
|
+
mode: currentMode,
|
|
180
|
+
hasCredentials: Boolean(currentApiKey),
|
|
181
|
+
});
|
|
182
|
+
});
|
|
113
183
|
// Bridge API endpoint — called by harness.js
|
|
114
184
|
app.post('/api/bridge', async (req, res) => {
|
|
115
185
|
try {
|
|
@@ -129,7 +199,7 @@ async function startHarnessServer(options) {
|
|
|
129
199
|
return;
|
|
130
200
|
}
|
|
131
201
|
try {
|
|
132
|
-
const response = await fetch(`${
|
|
202
|
+
const response = await fetch(`${getCurrentApiUrl()}/developer/credits`, {
|
|
133
203
|
headers: { Authorization: `Bearer ${currentApiKey}` },
|
|
134
204
|
});
|
|
135
205
|
if (!response.ok) {
|
|
@@ -165,6 +235,8 @@ async function startHarnessServer(options) {
|
|
|
165
235
|
hasCredentials: Boolean(currentApiKey),
|
|
166
236
|
permissions: options.permissions,
|
|
167
237
|
mockTheme: options.mockTheme,
|
|
238
|
+
environment: currentEnvironment,
|
|
239
|
+
platformUrl: getCurrentPlatformUrl(),
|
|
168
240
|
});
|
|
169
241
|
});
|
|
170
242
|
// Serve static harness files
|
|
@@ -198,7 +270,8 @@ async function startHarnessServer(options) {
|
|
|
198
270
|
console.log('');
|
|
199
271
|
console.log(chalk_1.default.green.bold(` ➜ Open in browser: http://localhost:${options.port}`));
|
|
200
272
|
console.log(chalk_1.default.dim(` Plugin dev server: ${options.pluginUrl}`));
|
|
201
|
-
console.log(chalk_1.default.dim(` Mode:
|
|
273
|
+
console.log(chalk_1.default.dim(` Mode: MOCK (toggle to LIVE in the toolbar)`));
|
|
274
|
+
console.log(chalk_1.default.dim(` Environment: ${currentEnvironment.toUpperCase()}`));
|
|
202
275
|
console.log('');
|
|
203
276
|
// Check if plugin dev server is reachable
|
|
204
277
|
checkPluginReachable(options.pluginUrl).then((reachable) => {
|
|
@@ -215,13 +288,33 @@ async function startHarnessServer(options) {
|
|
|
215
288
|
});
|
|
216
289
|
});
|
|
217
290
|
}
|
|
291
|
+
/**
|
|
292
|
+
* Renders the HTML page shown in the popup after auth callback.
|
|
293
|
+
* Sends a postMessage to the opener window and auto-closes.
|
|
294
|
+
*/
|
|
295
|
+
function renderCallbackHtml(title, message, isError) {
|
|
296
|
+
const color = isError ? '#ef4444' : '#22c55e';
|
|
297
|
+
const postMessageScript = isError
|
|
298
|
+
? `if(window.opener){window.opener.postMessage({type:'auth_callback',success:false,error:${JSON.stringify(title)}},'*');}`
|
|
299
|
+
: `if(window.opener){window.opener.postMessage({type:'auth_callback',success:true},'*');setTimeout(function(){window.close()},1500);}`;
|
|
300
|
+
return `<!DOCTYPE html>
|
|
301
|
+
<html>
|
|
302
|
+
<head><title>${title}</title></head>
|
|
303
|
+
<body style="font-family: -apple-system, system-ui, sans-serif; display: flex; justify-content: center; padding-top: 80px; background: #111; color: #e5e7eb;">
|
|
304
|
+
<div style="text-align: center; max-width: 400px;">
|
|
305
|
+
<h1 style="color: ${color}; font-size: 1.5rem;">${title}</h1>
|
|
306
|
+
<p style="margin-top: 12px; color: #9ca3af;">${message}</p>
|
|
307
|
+
</div>
|
|
308
|
+
<script>${postMessageScript}</script>
|
|
309
|
+
</body>
|
|
310
|
+
</html>`;
|
|
311
|
+
}
|
|
218
312
|
/**
|
|
219
313
|
* Fallback HTML when static files haven't been copied to dist.
|
|
220
314
|
* This enables the harness to work during development.
|
|
221
315
|
* Mirrors the structure of harness.html but with inline styles/scripts.
|
|
222
316
|
*/
|
|
223
317
|
function generateFallbackHtml(options) {
|
|
224
|
-
const initialMode = options.isLive ? 'live' : 'mock';
|
|
225
318
|
return `<!DOCTYPE html>
|
|
226
319
|
<html lang="en">
|
|
227
320
|
<head>
|
|
@@ -234,8 +327,12 @@ function generateFallbackHtml(options) {
|
|
|
234
327
|
<div class="toolbar">
|
|
235
328
|
<div class="toolbar-left">
|
|
236
329
|
<span class="logo">Fias Arche Dev</span>
|
|
237
|
-
<
|
|
238
|
-
${
|
|
330
|
+
<select id="env-selector" class="env-selector">
|
|
331
|
+
<option value="staging"${options.defaultEnvironment === 'staging' ? ' selected' : ''}>STAGING</option>
|
|
332
|
+
<option value="production"${options.defaultEnvironment === 'production' ? ' selected' : ''}>PRODUCTION</option>
|
|
333
|
+
</select>
|
|
334
|
+
<button id="mode-badge" class="mode-badge mode-mock" title="Click to switch mode">
|
|
335
|
+
MOCK \u21C6
|
|
239
336
|
</button>
|
|
240
337
|
</div>
|
|
241
338
|
<div class="toolbar-right">
|
|
@@ -248,14 +345,21 @@ function generateFallbackHtml(options) {
|
|
|
248
345
|
<div id="login-modal" class="modal-overlay" style="display: none">
|
|
249
346
|
<div class="modal">
|
|
250
347
|
<h3>Connect to FIAS</h3>
|
|
251
|
-
<p>
|
|
252
|
-
<
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
<button id="login-
|
|
257
|
-
<button id="login-submit" class="btn-primary">Save & Connect</button>
|
|
348
|
+
<p>Sign in to your FIAS account to enable live mode with real AI responses.</p>
|
|
349
|
+
<div id="login-popup-section">
|
|
350
|
+
<button id="login-popup-btn" class="btn-primary btn-full">Sign in with FIAS</button>
|
|
351
|
+
<p id="login-popup-hint" class="modal-hint" style="display:none">Popup blocked? <a id="login-popup-link" href="#" target="_blank" style="color:#a78bfa">Open login page manually</a></p>
|
|
352
|
+
<div class="modal-divider"><span>or</span></div>
|
|
353
|
+
<button id="login-manual-toggle" class="btn-link">Enter API key manually</button>
|
|
258
354
|
</div>
|
|
355
|
+
<div id="login-manual-section" style="display:none">
|
|
356
|
+
<input id="login-input" type="password" class="modal-input" placeholder="fias_sk_..." autocomplete="off" />
|
|
357
|
+
<div class="modal-actions">
|
|
358
|
+
<button id="login-cancel" class="btn-secondary">Cancel</button>
|
|
359
|
+
<button id="login-submit" class="btn-primary">Save & Connect</button>
|
|
360
|
+
</div>
|
|
361
|
+
</div>
|
|
362
|
+
<div id="login-error" class="modal-error" style="display: none"></div>
|
|
259
363
|
</div>
|
|
260
364
|
</div>
|
|
261
365
|
<div id="plugin-status" class="plugin-status">
|
|
@@ -296,6 +400,9 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; b
|
|
|
296
400
|
.toolbar { display: flex; justify-content: space-between; align-items: center; padding: 8px 16px; background: #18181b; border-bottom: 1px solid #3f3f46; flex-shrink: 0; }
|
|
297
401
|
.toolbar-left, .toolbar-right { display: flex; align-items: center; gap: 12px; }
|
|
298
402
|
.logo { font-weight: 600; font-size: 14px; color: #a78bfa; }
|
|
403
|
+
.env-selector { background: #27272a; color: #a1a1aa; border: 1px solid #3f3f46; border-radius: 4px; padding: 3px 8px; font-size: 11px; font-weight: 600; cursor: pointer; outline: none; text-transform: uppercase; }
|
|
404
|
+
.env-selector:hover { border-color: #52525b; }
|
|
405
|
+
.env-selector:focus { border-color: #a78bfa; }
|
|
299
406
|
.mode-badge { padding: 3px 10px; border-radius: 4px; font-size: 11px; font-weight: 600; text-transform: uppercase; cursor: pointer; transition: background 0.15s, border-color 0.15s; user-select: none; }
|
|
300
407
|
.mode-badge:hover { filter: brightness(1.3); }
|
|
301
408
|
.mode-badge:active { filter: brightness(0.9); }
|
|
@@ -319,8 +426,13 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; b
|
|
|
319
426
|
.btn-primary { background: #ffffff; color: #0a0a0a; border: none; padding: 6px 16px; border-radius: 4px; cursor: pointer; font-size: 13px; font-weight: 500; }
|
|
320
427
|
.btn-primary:hover { background: #e5e5e5; }
|
|
321
428
|
.btn-primary:disabled { opacity: 0.5; cursor: not-allowed; }
|
|
429
|
+
.btn-full { width: 100%; padding: 10px 16px; margin-bottom: 12px; }
|
|
322
430
|
.btn-secondary { background: transparent; color: #a1a1aa; border: 1px solid #3f3f46; padding: 6px 16px; border-radius: 4px; cursor: pointer; font-size: 13px; }
|
|
323
431
|
.btn-secondary:hover { background: #3f3f46; }
|
|
432
|
+
.btn-link { background: none; border: none; color: #a78bfa; cursor: pointer; font-size: 12px; padding: 0; }
|
|
433
|
+
.btn-link:hover { text-decoration: underline; }
|
|
434
|
+
.modal-divider { display: flex; align-items: center; gap: 12px; margin: 12px 0; color: #6b7280; font-size: 12px; }
|
|
435
|
+
.modal-divider::before, .modal-divider::after { content: ''; flex: 1; height: 1px; background: #3f3f46; }
|
|
324
436
|
.plugin-status { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 16px; color: #a1a1aa; font-size: 14px; }
|
|
325
437
|
.plugin-status.hidden { display: none; }
|
|
326
438
|
.plugin-status.error { color: #fca5a5; }
|
|
@@ -341,8 +453,7 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; b
|
|
|
341
453
|
.log-time { color: #6b7280; margin-right: 8px; }
|
|
342
454
|
.log-cost { color: #fbbf24; margin-left: 8px; }
|
|
343
455
|
`;
|
|
344
|
-
// The embedded JS
|
|
345
|
-
// It uses the same API endpoints as the static version.
|
|
456
|
+
// The embedded JS is a minified version of harness.js for the fallback page.
|
|
346
457
|
const EMBEDDED_JS = `
|
|
347
458
|
(function() {
|
|
348
459
|
var iframe = document.getElementById('plugin-iframe');
|
|
@@ -360,12 +471,21 @@ const EMBEDDED_JS = `
|
|
|
360
471
|
var loginError = document.getElementById('login-error');
|
|
361
472
|
var loginSubmit = document.getElementById('login-submit');
|
|
362
473
|
var loginCancel = document.getElementById('login-cancel');
|
|
474
|
+
var envSelector = document.getElementById('env-selector');
|
|
475
|
+
var loginPopupBtn = document.getElementById('login-popup-btn');
|
|
476
|
+
var loginPopupHint = document.getElementById('login-popup-hint');
|
|
477
|
+
var loginPopupLink = document.getElementById('login-popup-link');
|
|
478
|
+
var loginManualToggle = document.getElementById('login-manual-toggle');
|
|
479
|
+
var loginManualSection = document.getElementById('login-manual-section');
|
|
480
|
+
var loginPopupSection = document.getElementById('login-popup-section');
|
|
363
481
|
|
|
364
482
|
var messageCount = 0;
|
|
365
483
|
var currentTheme = 'dark';
|
|
366
484
|
var currentMode = 'mock';
|
|
485
|
+
var currentEnvironment = 'staging';
|
|
367
486
|
var hasCredentials = false;
|
|
368
487
|
var cachedConfig = null;
|
|
488
|
+
var authPollInterval = null;
|
|
369
489
|
|
|
370
490
|
var PERMISSION_MAP = {
|
|
371
491
|
get_user: 'user:profile:read', get_theme: 'theme:read', entity_invoke: 'entities:invoke',
|
|
@@ -388,7 +508,9 @@ const EMBEDDED_JS = `
|
|
|
388
508
|
cachedConfig = config;
|
|
389
509
|
currentTheme = config.mockTheme || 'dark';
|
|
390
510
|
currentMode = config.mode || 'mock';
|
|
511
|
+
currentEnvironment = config.environment || 'staging';
|
|
391
512
|
hasCredentials = config.hasCredentials || false;
|
|
513
|
+
envSelector.value = currentEnvironment;
|
|
392
514
|
updateThemeBadge();
|
|
393
515
|
updateModeBadge();
|
|
394
516
|
if (currentMode === 'live') { creditBalance.style.display = 'inline'; fetchCredits(); }
|
|
@@ -414,6 +536,20 @@ const EMBEDDED_JS = `
|
|
|
414
536
|
} else { switchMode('mock'); }
|
|
415
537
|
});
|
|
416
538
|
|
|
539
|
+
envSelector.addEventListener('change', function() {
|
|
540
|
+
fetch('/api/environment', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ environment: envSelector.value }) })
|
|
541
|
+
.then(function(r) { return r.json(); })
|
|
542
|
+
.then(function(data) {
|
|
543
|
+
currentEnvironment = data.environment;
|
|
544
|
+
currentMode = data.mode;
|
|
545
|
+
hasCredentials = data.hasCredentials;
|
|
546
|
+
updateModeBadge();
|
|
547
|
+
if (currentMode === 'live') { creditBalance.style.display = 'inline'; fetchCredits(); }
|
|
548
|
+
else { creditBalance.style.display = 'none'; creditBalance.textContent = ''; }
|
|
549
|
+
logMessage('info', 'Environment: ' + currentEnvironment.toUpperCase() + (hasCredentials ? '' : ' (not authenticated)'));
|
|
550
|
+
}).catch(function(err) { logMessage('error', err.message); });
|
|
551
|
+
});
|
|
552
|
+
|
|
417
553
|
function switchMode(newMode) {
|
|
418
554
|
fetch('/api/mode', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ mode: newMode }) })
|
|
419
555
|
.then(function(r) { if (!r.ok) return r.json().then(function(e) { throw new Error(e.error); }); return r.json(); })
|
|
@@ -424,25 +560,69 @@ const EMBEDDED_JS = `
|
|
|
424
560
|
}).catch(function(err) { logMessage('error', err.message); });
|
|
425
561
|
}
|
|
426
562
|
|
|
427
|
-
function showLoginModal() {
|
|
428
|
-
|
|
429
|
-
|
|
563
|
+
function showLoginModal() {
|
|
564
|
+
loginModal.style.display = 'flex';
|
|
565
|
+
loginPopupSection.style.display = 'block';
|
|
566
|
+
loginManualSection.style.display = 'none';
|
|
567
|
+
loginPopupHint.style.display = 'none';
|
|
568
|
+
loginError.style.display = 'none';
|
|
569
|
+
loginPopupBtn.disabled = false;
|
|
570
|
+
loginPopupBtn.textContent = 'Sign in with FIAS';
|
|
571
|
+
}
|
|
572
|
+
function hideLoginModal() { loginModal.style.display = 'none'; stopAuthPolling(); }
|
|
573
|
+
|
|
574
|
+
loginCancel && loginCancel.addEventListener('click', hideLoginModal);
|
|
430
575
|
loginModal.addEventListener('click', function(e) { if (e.target === loginModal) hideLoginModal(); });
|
|
576
|
+
|
|
577
|
+
loginManualToggle && loginManualToggle.addEventListener('click', function() {
|
|
578
|
+
loginPopupSection.style.display = 'none';
|
|
579
|
+
loginManualSection.style.display = 'block';
|
|
580
|
+
loginInput.focus();
|
|
581
|
+
});
|
|
582
|
+
|
|
431
583
|
loginInput.addEventListener('keydown', function(e) { if (e.key === 'Enter') submitLogin(); if (e.key === 'Escape') hideLoginModal(); });
|
|
432
584
|
loginSubmit.addEventListener('click', submitLogin);
|
|
433
585
|
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
.then(function(
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
586
|
+
loginPopupBtn && loginPopupBtn.addEventListener('click', function() {
|
|
587
|
+
loginPopupBtn.disabled = true;
|
|
588
|
+
loginPopupBtn.textContent = 'Opening...';
|
|
589
|
+
fetch('/api/auth/start', { method: 'POST' })
|
|
590
|
+
.then(function(r) { return r.json(); })
|
|
591
|
+
.then(function(data) {
|
|
592
|
+
var popup = window.open(data.authUrl, 'fias-auth', 'width=500,height=650');
|
|
593
|
+
if (!popup || popup.closed) {
|
|
594
|
+
loginPopupHint.style.display = 'block';
|
|
595
|
+
loginPopupLink.href = data.authUrl;
|
|
596
|
+
loginPopupBtn.disabled = false;
|
|
597
|
+
loginPopupBtn.textContent = 'Sign in with FIAS';
|
|
598
|
+
} else {
|
|
599
|
+
loginPopupBtn.textContent = 'Waiting for sign-in...';
|
|
600
|
+
}
|
|
601
|
+
startAuthPolling();
|
|
602
|
+
}).catch(function(err) {
|
|
603
|
+
loginError.textContent = err.message;
|
|
604
|
+
loginError.style.display = 'block';
|
|
605
|
+
loginPopupBtn.disabled = false;
|
|
606
|
+
loginPopupBtn.textContent = 'Sign in with FIAS';
|
|
607
|
+
});
|
|
608
|
+
});
|
|
444
609
|
|
|
445
610
|
window.addEventListener('message', function(event) {
|
|
611
|
+
if (event.data && event.data.type === 'auth_callback') {
|
|
612
|
+
stopAuthPolling();
|
|
613
|
+
if (event.data.success) {
|
|
614
|
+
hasCredentials = true;
|
|
615
|
+
hideLoginModal();
|
|
616
|
+
logMessage('info', 'Authenticated for ' + currentEnvironment.toUpperCase());
|
|
617
|
+
switchMode('live');
|
|
618
|
+
} else {
|
|
619
|
+
loginError.textContent = event.data.error || 'Authentication failed';
|
|
620
|
+
loginError.style.display = 'block';
|
|
621
|
+
}
|
|
622
|
+
loginPopupBtn.disabled = false;
|
|
623
|
+
loginPopupBtn.textContent = 'Sign in with FIAS';
|
|
624
|
+
return;
|
|
625
|
+
}
|
|
446
626
|
if (event.source !== iframe.contentWindow) return;
|
|
447
627
|
var data = event.data;
|
|
448
628
|
if (!data || typeof data !== 'object' || !data.type || !data.messageId) return;
|
|
@@ -476,6 +656,8 @@ const EMBEDDED_JS = `
|
|
|
476
656
|
logMessage('send', 'init');
|
|
477
657
|
});
|
|
478
658
|
|
|
659
|
+
function startAuthPolling() { if (authPollInterval) return; authPollInterval = setInterval(function() { fetch('/api/config').then(function(r){return r.json();}).then(function(c){ if(c.hasCredentials&&!hasCredentials){hasCredentials=true;stopAuthPolling();hideLoginModal();logMessage('info','Authenticated for '+currentEnvironment.toUpperCase());switchMode('live');} }).catch(function(){}); }, 2000); }
|
|
660
|
+
function stopAuthPolling() { if (authPollInterval) { clearInterval(authPollInterval); authPollInterval = null; } }
|
|
479
661
|
function updateModeBadge() {
|
|
480
662
|
modeBadge.textContent = currentMode.toUpperCase() + ' \\u21C6';
|
|
481
663
|
modeBadge.className = 'mode-badge ' + (currentMode === 'live' ? 'mode-live' : 'mode-mock');
|
|
@@ -498,6 +680,16 @@ const EMBEDDED_JS = `
|
|
|
498
680
|
if (payload && typeof payload === 'object') text += ' <span style="color:#6b7280">' + JSON.stringify(payload).substring(0, 120) + '</span>';
|
|
499
681
|
entry.innerHTML = text; consoleBody.appendChild(entry); consoleBody.scrollTop = consoleBody.scrollHeight;
|
|
500
682
|
}
|
|
683
|
+
function submitLogin() {
|
|
684
|
+
var apiKey = loginInput.value.trim();
|
|
685
|
+
if (!apiKey) { loginError.textContent = 'Please enter an API key.'; loginError.style.display = 'block'; return; }
|
|
686
|
+
loginSubmit.disabled = true; loginSubmit.textContent = 'Connecting...';
|
|
687
|
+
fetch('/api/login', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ apiKey: apiKey }) })
|
|
688
|
+
.then(function(r) { if (!r.ok) return r.json().then(function(e) { throw new Error(e.error); }); return r.json(); })
|
|
689
|
+
.then(function() { hasCredentials = true; hideLoginModal(); switchMode('live'); })
|
|
690
|
+
.catch(function(err) { loginError.textContent = err.message; loginError.style.display = 'block'; })
|
|
691
|
+
.finally(function() { loginSubmit.disabled = false; loginSubmit.textContent = 'Save & Connect'; });
|
|
692
|
+
}
|
|
501
693
|
})();
|
|
502
694
|
`;
|
|
503
695
|
//# sourceMappingURL=harness-server.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"harness-server.js","sourceRoot":"","sources":["../../src/server/harness-server.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"harness-server.js","sourceRoot":"","sources":["../../src/server/harness-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -35,8 +35,13 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
const fs = __importStar(require("fs"));
|
|
37
37
|
jest.mock('fs');
|
|
38
|
+
jest.mock('../config/credentials', () => ({
|
|
39
|
+
loadApiKeyForEnvironment: jest.fn().mockReturnValue(''),
|
|
40
|
+
saveApiKeyForEnvironment: jest.fn(),
|
|
41
|
+
}));
|
|
38
42
|
const mockedFs = jest.mocked(fs);
|
|
39
43
|
const harness_server_1 = require("./harness-server");
|
|
44
|
+
const credentials_1 = require("../config/credentials");
|
|
40
45
|
// We need to test the server by actually starting it and making HTTP requests
|
|
41
46
|
// to avoid coupling to Express internals.
|
|
42
47
|
const http = require('http');
|
|
@@ -80,9 +85,7 @@ describe('server/harness-server', () => {
|
|
|
80
85
|
const defaultOptions = {
|
|
81
86
|
port: testPort,
|
|
82
87
|
pluginUrl: 'http://localhost:3100',
|
|
83
|
-
|
|
84
|
-
apiKey: '',
|
|
85
|
-
apiUrl: 'https://api.fias.app/v1',
|
|
88
|
+
defaultEnvironment: 'staging',
|
|
86
89
|
permissions: ['theme:read', 'entities:invoke'],
|
|
87
90
|
mockUser: { userId: 'dev_user_001', displayName: 'Dev User', avatar: null },
|
|
88
91
|
mockTheme: 'dark',
|
|
@@ -108,6 +111,8 @@ describe('server/harness-server', () => {
|
|
|
108
111
|
expect(data.hasCredentials).toBe(false);
|
|
109
112
|
expect(data.permissions).toEqual(['theme:read', 'entities:invoke']);
|
|
110
113
|
expect(data.mockTheme).toBe('dark');
|
|
114
|
+
expect(data.environment).toBe('staging');
|
|
115
|
+
expect(data.platformUrl).toBe('https://staging.fias.io');
|
|
111
116
|
});
|
|
112
117
|
});
|
|
113
118
|
describe('GET /api/credits', () => {
|
|
@@ -164,6 +169,57 @@ describe('server/harness-server', () => {
|
|
|
164
169
|
expect(data.error).toContain('Unknown bridge call type');
|
|
165
170
|
});
|
|
166
171
|
});
|
|
172
|
+
describe('POST /api/auth/start', () => {
|
|
173
|
+
it('returns an auth URL with staging platform URL', async () => {
|
|
174
|
+
const resp = await httpPost(testPort, '/api/auth/start', {});
|
|
175
|
+
expect(resp.status).toBe(200);
|
|
176
|
+
const data = JSON.parse(resp.body);
|
|
177
|
+
expect(data.authUrl).toContain('https://staging.fias.io/developer/cli-auth');
|
|
178
|
+
expect(data.authUrl).toContain(`port=${testPort}`);
|
|
179
|
+
expect(data.authUrl).toContain('state=');
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
describe('GET /callback', () => {
|
|
183
|
+
it('returns 400 when state does not match', async () => {
|
|
184
|
+
// First generate a state via /api/auth/start
|
|
185
|
+
await httpPost(testPort, '/api/auth/start', {});
|
|
186
|
+
const resp = await httpGet(testPort, '/callback?key=fias_sk_test&state=wrong_state');
|
|
187
|
+
expect(resp.status).toBe(400);
|
|
188
|
+
expect(resp.body).toContain('State mismatch');
|
|
189
|
+
});
|
|
190
|
+
it('returns 400 when key is missing', async () => {
|
|
191
|
+
const authResp = await httpPost(testPort, '/api/auth/start', {});
|
|
192
|
+
const authData = JSON.parse(authResp.body);
|
|
193
|
+
const state = new URL(authData.authUrl).searchParams.get('state');
|
|
194
|
+
const resp = await httpGet(testPort, `/callback?state=${state}`);
|
|
195
|
+
expect(resp.status).toBe(400);
|
|
196
|
+
expect(resp.body).toContain('Invalid API key');
|
|
197
|
+
});
|
|
198
|
+
it('saves credentials and returns success on valid callback', async () => {
|
|
199
|
+
const authResp = await httpPost(testPort, '/api/auth/start', {});
|
|
200
|
+
const authData = JSON.parse(authResp.body);
|
|
201
|
+
const state = new URL(authData.authUrl).searchParams.get('state');
|
|
202
|
+
const resp = await httpGet(testPort, `/callback?key=fias_sk_valid&state=${state}`);
|
|
203
|
+
expect(resp.status).toBe(200);
|
|
204
|
+
expect(resp.body).toContain('Authentication Successful');
|
|
205
|
+
expect(credentials_1.saveApiKeyForEnvironment).toHaveBeenCalledWith('staging', 'fias_sk_valid');
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
describe('POST /api/environment', () => {
|
|
209
|
+
it('rejects invalid environment values', async () => {
|
|
210
|
+
const resp = await httpPost(testPort, '/api/environment', { environment: 'invalid' });
|
|
211
|
+
expect(resp.status).toBe(400);
|
|
212
|
+
});
|
|
213
|
+
it('switches to production environment', async () => {
|
|
214
|
+
const resp = await httpPost(testPort, '/api/environment', { environment: 'production' });
|
|
215
|
+
expect(resp.status).toBe(200);
|
|
216
|
+
const data = JSON.parse(resp.body);
|
|
217
|
+
expect(data.environment).toBe('production');
|
|
218
|
+
expect(data.hasCredentials).toBe(false);
|
|
219
|
+
// Switch back
|
|
220
|
+
await httpPost(testPort, '/api/environment', { environment: 'staging' });
|
|
221
|
+
});
|
|
222
|
+
});
|
|
167
223
|
describe('GET /', () => {
|
|
168
224
|
it('serves fallback HTML when static files are not found', async () => {
|
|
169
225
|
const resp = await httpGet(testPort, '/');
|
|
@@ -171,6 +227,7 @@ describe('server/harness-server', () => {
|
|
|
171
227
|
expect(resp.body).toContain('Fias Arche Dev');
|
|
172
228
|
expect(resp.body).toContain('<!DOCTYPE html>');
|
|
173
229
|
expect(resp.body).toContain('MOCK');
|
|
230
|
+
expect(resp.body).toContain('env-selector');
|
|
174
231
|
});
|
|
175
232
|
});
|
|
176
233
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"harness-server.test.js","sourceRoot":"","sources":["../../src/server/harness-server.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AAEzB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"harness-server.test.js","sourceRoot":"","sources":["../../src/server/harness-server.test.ts"],"names":[],"mappings":"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"}
|