@fias/plugin-dev-harness 1.2.0 → 1.3.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 (52) hide show
  1. package/dist/cli/check-auth.d.ts +3 -3
  2. package/dist/cli/check-auth.d.ts.map +1 -1
  3. package/dist/cli/check-auth.js +19 -8
  4. package/dist/cli/check-auth.js.map +1 -1
  5. package/dist/cli/check-auth.test.d.ts +2 -0
  6. package/dist/cli/check-auth.test.d.ts.map +1 -0
  7. package/dist/cli/check-auth.test.js +49 -0
  8. package/dist/cli/check-auth.test.js.map +1 -0
  9. package/dist/cli/dev.d.ts +2 -2
  10. package/dist/cli/dev.d.ts.map +1 -1
  11. package/dist/cli/dev.js +4 -20
  12. package/dist/cli/dev.js.map +1 -1
  13. package/dist/cli/dev.test.js +10 -38
  14. package/dist/cli/dev.test.js.map +1 -1
  15. package/dist/cli/entities.d.ts.map +1 -1
  16. package/dist/cli/entities.js +8 -6
  17. package/dist/cli/entities.js.map +1 -1
  18. package/dist/cli/entities.test.js +15 -24
  19. package/dist/cli/entities.test.js.map +1 -1
  20. package/dist/cli/index.test.js +2 -2
  21. package/dist/cli/login.d.ts +2 -0
  22. package/dist/cli/login.d.ts.map +1 -1
  23. package/dist/cli/login.js +19 -14
  24. package/dist/cli/login.js.map +1 -1
  25. package/dist/cli/login.test.js +46 -24
  26. package/dist/cli/login.test.js.map +1 -1
  27. package/dist/cli/submit.d.ts.map +1 -1
  28. package/dist/cli/submit.js +13 -11
  29. package/dist/cli/submit.js.map +1 -1
  30. package/dist/cli/submit.test.js +13 -22
  31. package/dist/cli/submit.test.js.map +1 -1
  32. package/dist/config/config-loader.d.ts +6 -0
  33. package/dist/config/config-loader.d.ts.map +1 -1
  34. package/dist/config/config-loader.js +12 -0
  35. package/dist/config/config-loader.js.map +1 -1
  36. package/dist/config/credentials.d.ts +19 -1
  37. package/dist/config/credentials.d.ts.map +1 -1
  38. package/dist/config/credentials.js +46 -6
  39. package/dist/config/credentials.js.map +1 -1
  40. package/dist/config/credentials.test.js +72 -27
  41. package/dist/config/credentials.test.js.map +1 -1
  42. package/dist/index.js +0 -0
  43. package/dist/server/harness-server.d.ts +2 -3
  44. package/dist/server/harness-server.d.ts.map +1 -1
  45. package/dist/server/harness-server.js +233 -41
  46. package/dist/server/harness-server.js.map +1 -1
  47. package/dist/server/harness-server.test.js +60 -3
  48. package/dist/server/harness-server.test.js.map +1 -1
  49. package/dist/server/static/static/harness.css +58 -0
  50. package/dist/server/static/static/harness.html +20 -7
  51. package/dist/server/static/static/harness.js +139 -2
  52. package/package.json +10 -10
@@ -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 modecan be toggled at runtime via UI
57
- let currentMode = options.isLive ? 'live' : 'mock';
58
- let currentApiKey = options.apiKey;
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: options.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.saveCredentials)({ apiKey: currentApiKey });
103
- liveHandler = new live_handler_1.LiveBridgeHandler({
104
- apiKey: currentApiKey,
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(`${options.apiUrl}/developer/credits`, {
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: ${currentMode.toUpperCase()}${currentApiKey ? '' : ' (no API key click MOCK badge in toolbar to login)'}`));
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
- <button id="mode-badge" class="mode-badge mode-${initialMode === 'live' ? 'live' : 'mock'}" title="Click to switch mode">
238
- ${initialMode.toUpperCase()} \u21C6
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>Enter your API key to enable live mode with real AI responses.</p>
252
- <p class="modal-hint">Get an API key from your FIAS platform account settings.</p>
253
- <input id="login-input" type="password" class="modal-input" placeholder="fias_sk_..." autocomplete="off" />
254
- <div id="login-error" class="modal-error" style="display: none"></div>
255
- <div class="modal-actions">
256
- <button id="login-cancel" class="btn-secondary">Cancel</button>
257
- <button id="login-submit" class="btn-primary">Save &amp; 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 &amp; 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 mirrors harness.js but is served inline for the fallback page.
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() { loginModal.style.display = 'flex'; loginInput.value = ''; loginError.style.display = 'none'; loginInput.focus(); }
428
- function hideLoginModal() { loginModal.style.display = 'none'; }
429
- loginCancel.addEventListener('click', hideLoginModal);
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
- function submitLogin() {
435
- var apiKey = loginInput.value.trim();
436
- if (!apiKey) { loginError.textContent = 'Please enter an API key.'; loginError.style.display = 'block'; return; }
437
- loginSubmit.disabled = true; loginSubmit.textContent = 'Connecting...';
438
- fetch('/api/login', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ apiKey: apiKey }) })
439
- .then(function(r) { if (!r.ok) return r.json().then(function(e) { throw new Error(e.error); }); return r.json(); })
440
- .then(function() { hasCredentials = true; hideLoginModal(); switchMode('live'); })
441
- .catch(function(err) { loginError.textContent = err.message; loginError.style.display = 'block'; })
442
- .finally(function() { loginSubmit.disabled = false; loginSubmit.textContent = 'Save & Connect'; });
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
- isLive: false,
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":"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"}
1
+ {"version":3,"file":"harness-server.test.js","sourceRoot":"","sources":["../../src/server/harness-server.test.ts"],"names":[],"mappings":"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"}