@fias/plugin-dev-harness 1.5.1 → 1.5.3

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.
@@ -1 +1 @@
1
- {"version":3,"file":"harness-server.d.ts","sourceRoot":"","sources":["../../src/server/harness-server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAKhE,OAAO,EAIL,KAAK,WAAW,EACjB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,WAAW,CAAC;IAChC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACzE,SAAS,EAAE,OAAO,GAAG,MAAM,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CACjD;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqWrF"}
1
+ {"version":3,"file":"harness-server.d.ts","sourceRoot":"","sources":["../../src/server/harness-server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAKhE,OAAO,EAIL,KAAK,WAAW,EACjB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,WAAW,CAAC;IAChC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACzE,SAAS,EAAE,OAAO,GAAG,MAAM,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CACjD;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+kBrF"}
@@ -44,6 +44,7 @@ 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 child_process_1 = require("child_process");
47
48
  const path = __importStar(require("path"));
48
49
  const fs = __importStar(require("fs"));
49
50
  const chalk_1 = __importDefault(require("chalk"));
@@ -256,15 +257,21 @@ async function startHarnessServer(options) {
256
257
  }
257
258
  return;
258
259
  }
259
- // SSE streaming response
260
+ // SSE streaming response — disable compression and flush immediately
260
261
  res.writeHead(200, {
261
262
  'Content-Type': 'text/event-stream',
262
263
  'Cache-Control': 'no-cache',
263
264
  Connection: 'keep-alive',
265
+ 'X-Accel-Buffering': 'no',
264
266
  });
267
+ res.flushHeaders();
265
268
  try {
266
269
  const result = await handler.handleStream(req.body, (text) => {
267
270
  res.write(`data: ${JSON.stringify({ text })}\n\n`);
271
+ // Force flush for real-time delivery
272
+ if (typeof res.flush === 'function') {
273
+ res.flush();
274
+ }
268
275
  });
269
276
  res.write(`data: ${JSON.stringify({ done: true, ...result })}\n\n`);
270
277
  }
@@ -296,6 +303,208 @@ async function startHarnessServer(options) {
296
303
  .json({ error: err instanceof Error ? err.message : 'Failed to fetch credits' });
297
304
  }
298
305
  });
306
+ // ────────────────────────────────────────────────────────────────
307
+ // Publish Wizard Endpoints
308
+ // ────────────────────────────────────────────────────────────────
309
+ // Read fias-plugin.json from plugin project
310
+ app.get('/api/manifest', (_req, res) => {
311
+ const manifestPath = path.resolve('fias-plugin.json');
312
+ if (!fs.existsSync(manifestPath)) {
313
+ res.status(404).json({ error: 'fias-plugin.json not found in project directory' });
314
+ return;
315
+ }
316
+ try {
317
+ const content = fs.readFileSync(manifestPath, 'utf-8');
318
+ res.json(JSON.parse(content));
319
+ }
320
+ catch (err) {
321
+ res
322
+ .status(400)
323
+ .json({ error: err instanceof Error ? err.message : 'Failed to read manifest' });
324
+ }
325
+ });
326
+ // Save updated manifest to disk
327
+ app.put('/api/manifest', (req, res) => {
328
+ try {
329
+ const manifestPath = path.resolve('fias-plugin.json');
330
+ fs.writeFileSync(manifestPath, JSON.stringify(req.body, null, 2) + '\n');
331
+ res.json({ success: true });
332
+ }
333
+ catch (err) {
334
+ res
335
+ .status(500)
336
+ .json({ error: err instanceof Error ? err.message : 'Failed to save manifest' });
337
+ }
338
+ });
339
+ // Validate manifest via platform API
340
+ app.post('/api/publish/validate', async (req, res) => {
341
+ if (currentMode !== 'live' || !currentAuthToken) {
342
+ res.status(400).json({ error: 'Switch to live mode to publish' });
343
+ return;
344
+ }
345
+ await ensureValidToken();
346
+ try {
347
+ const manifestPath = path.resolve('fias-plugin.json');
348
+ const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf-8'));
349
+ const response = await fetch(`${getCurrentApiUrl()}/developer/validate`, {
350
+ method: 'POST',
351
+ headers: {
352
+ 'Content-Type': 'application/json',
353
+ Authorization: `Bearer ${currentAuthToken}`,
354
+ },
355
+ body: JSON.stringify({ manifest }),
356
+ });
357
+ res.json(await response.json());
358
+ }
359
+ catch (err) {
360
+ res.status(500).json({ error: err instanceof Error ? err.message : 'Validation failed' });
361
+ }
362
+ });
363
+ // Build plugin via npm run build — streams output via SSE
364
+ app.post('/api/publish/build', (_req, res) => {
365
+ res.writeHead(200, {
366
+ 'Content-Type': 'text/event-stream',
367
+ 'Cache-Control': 'no-cache',
368
+ Connection: 'keep-alive',
369
+ });
370
+ const child = (0, child_process_1.spawn)('npm', ['run', 'build'], {
371
+ cwd: process.cwd(),
372
+ shell: true,
373
+ stdio: ['ignore', 'pipe', 'pipe'],
374
+ });
375
+ child.stdout.on('data', (data) => {
376
+ const lines = data.toString().split('\n').filter(Boolean);
377
+ for (const line of lines) {
378
+ res.write(`data: ${JSON.stringify({ line, stream: 'stdout' })}\n\n`);
379
+ }
380
+ });
381
+ child.stderr.on('data', (data) => {
382
+ const lines = data.toString().split('\n').filter(Boolean);
383
+ for (const line of lines) {
384
+ res.write(`data: ${JSON.stringify({ line, stream: 'stderr' })}\n\n`);
385
+ }
386
+ });
387
+ child.on('close', (code) => {
388
+ res.write(`data: ${JSON.stringify({ done: true, code: code ?? 1 })}\n\n`);
389
+ res.end();
390
+ });
391
+ child.on('error', (err) => {
392
+ res.write(`data: ${JSON.stringify({ done: true, code: 1, error: err.message })}\n\n`);
393
+ res.end();
394
+ });
395
+ });
396
+ // Package dist/ + fias-plugin.json into tarball
397
+ app.post('/api/publish/package', (_req, res) => {
398
+ try {
399
+ const distDir = path.resolve('dist');
400
+ if (!fs.existsSync(distDir)) {
401
+ res.status(400).json({ error: 'dist/ directory not found. Did the build succeed?' });
402
+ return;
403
+ }
404
+ const tarball = 'plugin-submission.tar.gz';
405
+ (0, child_process_1.execSync)(`tar -czf ${tarball} dist/ fias-plugin.json`, { cwd: process.cwd() });
406
+ const stats = fs.statSync(path.resolve(tarball));
407
+ res.json({ success: true, sizeBytes: stats.size });
408
+ }
409
+ catch (err) {
410
+ res.status(500).json({ error: err instanceof Error ? err.message : 'Packaging failed' });
411
+ }
412
+ });
413
+ // Submit: get upload URL → upload tarball → create submission
414
+ app.post('/api/publish/submit', async (req, res) => {
415
+ if (currentMode !== 'live' || !currentAuthToken) {
416
+ res.status(400).json({ error: 'Switch to live mode to publish' });
417
+ return;
418
+ }
419
+ await ensureValidToken();
420
+ const apiUrl = getCurrentApiUrl();
421
+ const headers = {
422
+ 'Content-Type': 'application/json',
423
+ Authorization: `Bearer ${currentAuthToken}`,
424
+ };
425
+ try {
426
+ // Read tarball and manifest
427
+ const tarballPath = path.resolve('plugin-submission.tar.gz');
428
+ if (!fs.existsSync(tarballPath)) {
429
+ res.status(400).json({ error: 'No packaged tarball found. Build and package first.' });
430
+ return;
431
+ }
432
+ const tarball = fs.readFileSync(tarballPath);
433
+ const manifest = JSON.parse(fs.readFileSync(path.resolve('fias-plugin.json'), 'utf-8'));
434
+ // 1. Get upload URL
435
+ const uploadResp = await fetch(`${apiUrl}/plugins/submissions/upload-url`, {
436
+ method: 'POST',
437
+ headers,
438
+ body: JSON.stringify({
439
+ fileName: 'plugin-submission.tar.gz',
440
+ sizeBytes: tarball.length,
441
+ }),
442
+ });
443
+ if (!uploadResp.ok) {
444
+ const err = await uploadResp.json().catch(() => ({}));
445
+ throw new Error(err.error?.message || 'Failed to get upload URL');
446
+ }
447
+ const { uploadUrl, submissionId, s3Key } = (await uploadResp.json());
448
+ // 2. Upload to S3
449
+ const s3Resp = await fetch(uploadUrl, {
450
+ method: 'PUT',
451
+ headers: { 'Content-Type': 'application/gzip' },
452
+ body: tarball,
453
+ });
454
+ if (!s3Resp.ok) {
455
+ throw new Error(`S3 upload failed: ${s3Resp.status}`);
456
+ }
457
+ // 3. Create submission
458
+ const submitResp = await fetch(`${apiUrl}/plugins/submissions`, {
459
+ method: 'POST',
460
+ headers,
461
+ body: JSON.stringify({
462
+ submissionId,
463
+ sourceRef: s3Key,
464
+ manifest,
465
+ ...(req.body?.archId ? { archId: req.body.archId } : {}),
466
+ }),
467
+ });
468
+ if (!submitResp.ok) {
469
+ const err = await submitResp.json().catch(() => ({}));
470
+ throw new Error(err.error?.message || 'Submission failed');
471
+ }
472
+ // Clean up tarball
473
+ try {
474
+ fs.unlinkSync(tarballPath);
475
+ }
476
+ catch {
477
+ /* ignore */
478
+ }
479
+ const result = await submitResp.json();
480
+ console.log(chalk_1.default.green(` Submission created: ${submissionId}`));
481
+ res.json(result);
482
+ }
483
+ catch (err) {
484
+ res.status(500).json({ error: err instanceof Error ? err.message : 'Submission failed' });
485
+ }
486
+ });
487
+ // Poll submission status
488
+ app.get('/api/publish/status/:id', async (req, res) => {
489
+ if (currentMode !== 'live' || !currentAuthToken) {
490
+ res.status(400).json({ error: 'Not in live mode' });
491
+ return;
492
+ }
493
+ await ensureValidToken();
494
+ try {
495
+ const response = await fetch(`${getCurrentApiUrl()}/plugins/submissions/${req.params.id}`, {
496
+ headers: { Authorization: `Bearer ${currentAuthToken}` },
497
+ });
498
+ if (!response.ok) {
499
+ res.status(response.status).json({ error: 'Failed to fetch status' });
500
+ return;
501
+ }
502
+ res.json(await response.json());
503
+ }
504
+ catch (err) {
505
+ res.status(500).json({ error: err instanceof Error ? err.message : 'Status check failed' });
506
+ }
507
+ });
299
508
  // Plugin reachability check
300
509
  app.get('/api/check-plugin', async (_req, res) => {
301
510
  try {
@@ -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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"}
@@ -65,17 +65,12 @@ body {
65
65
  font-size: 11px;
66
66
  font-weight: 600;
67
67
  text-transform: uppercase;
68
- cursor: pointer;
69
- transition: background 0.15s, border-color 0.15s;
70
68
  user-select: none;
71
69
  }
72
70
 
73
- .mode-badge:hover {
74
- filter: brightness(1.3);
75
- }
76
-
77
- .mode-badge:active {
78
- filter: brightness(0.9);
71
+ .btn-mode-toggle {
72
+ font-size: 11px;
73
+ padding: 3px 10px;
79
74
  }
80
75
 
81
76
  .mode-mock {
@@ -388,3 +383,255 @@ body {
388
383
  color: #fbbf24;
389
384
  margin-left: 8px;
390
385
  }
386
+
387
+ /* Publish Wizard */
388
+ .publish-modal {
389
+ width: 600px;
390
+ max-height: 85vh;
391
+ display: flex;
392
+ flex-direction: column;
393
+ }
394
+
395
+ .publish-steps {
396
+ display: flex;
397
+ gap: 4px;
398
+ margin-bottom: 16px;
399
+ }
400
+
401
+ .publish-step {
402
+ flex: 1;
403
+ padding: 6px 8px;
404
+ font-size: 11px;
405
+ font-weight: 600;
406
+ color: #6b7280;
407
+ background: #18181b;
408
+ border-radius: 4px;
409
+ text-align: center;
410
+ }
411
+
412
+ .publish-step.active {
413
+ color: #a78bfa;
414
+ background: #1e1b2e;
415
+ }
416
+
417
+ .publish-step.completed {
418
+ color: #86efac;
419
+ background: #0f291e;
420
+ }
421
+
422
+ .publish-content {
423
+ flex: 1;
424
+ overflow-y: auto;
425
+ max-height: 55vh;
426
+ padding: 4px 0;
427
+ }
428
+
429
+ .publish-form label {
430
+ display: block;
431
+ font-size: 12px;
432
+ color: #a1a1aa;
433
+ margin: 8px 0 4px;
434
+ }
435
+
436
+ .pub-textarea {
437
+ resize: vertical;
438
+ font-family: inherit;
439
+ min-height: 40px;
440
+ }
441
+
442
+ .pub-tags-container {
443
+ margin-bottom: 8px;
444
+ }
445
+
446
+ .pub-tags-list {
447
+ display: flex;
448
+ flex-wrap: wrap;
449
+ gap: 4px;
450
+ margin-bottom: 4px;
451
+ }
452
+
453
+ .pub-tag {
454
+ display: inline-flex;
455
+ align-items: center;
456
+ gap: 4px;
457
+ background: #3f3f46;
458
+ color: #e4e4e7;
459
+ padding: 2px 8px;
460
+ border-radius: 4px;
461
+ font-size: 11px;
462
+ }
463
+
464
+ .pub-tag-remove {
465
+ cursor: pointer;
466
+ color: #a1a1aa;
467
+ border: none;
468
+ background: none;
469
+ font-size: 14px;
470
+ padding: 0 2px;
471
+ }
472
+
473
+ .pub-permissions {
474
+ display: flex;
475
+ flex-direction: column;
476
+ gap: 6px;
477
+ margin-bottom: 12px;
478
+ }
479
+
480
+ .pub-checkbox {
481
+ display: flex;
482
+ align-items: center;
483
+ gap: 6px;
484
+ font-size: 12px;
485
+ color: #e4e4e7;
486
+ cursor: pointer;
487
+ }
488
+
489
+ .pub-checkbox input {
490
+ accent-color: #a78bfa;
491
+ }
492
+
493
+ .pub-loading {
494
+ display: flex;
495
+ flex-direction: column;
496
+ align-items: center;
497
+ gap: 12px;
498
+ padding: 32px 0;
499
+ color: #a1a1aa;
500
+ }
501
+
502
+ .pub-error-item {
503
+ color: #fca5a5;
504
+ font-size: 12px;
505
+ padding: 4px 0;
506
+ }
507
+
508
+ .pub-error-item::before {
509
+ content: '\2715 ';
510
+ }
511
+
512
+ .pub-warn-item {
513
+ color: #fde047;
514
+ font-size: 12px;
515
+ padding: 4px 0;
516
+ }
517
+
518
+ .pub-warn-item::before {
519
+ content: '\26A0 ';
520
+ }
521
+
522
+ .pub-valid {
523
+ color: #86efac;
524
+ font-size: 13px;
525
+ font-weight: 500;
526
+ margin-bottom: 12px;
527
+ }
528
+
529
+ .pub-listing-preview {
530
+ background: #18181b;
531
+ border: 1px solid #3f3f46;
532
+ border-radius: 8px;
533
+ padding: 16px;
534
+ margin-top: 12px;
535
+ }
536
+
537
+ .pub-listing-name {
538
+ font-size: 15px;
539
+ font-weight: 600;
540
+ color: #e4e4e7;
541
+ }
542
+
543
+ .pub-listing-desc {
544
+ font-size: 12px;
545
+ color: #a1a1aa;
546
+ margin-top: 4px;
547
+ }
548
+
549
+ .pub-listing-meta {
550
+ font-size: 11px;
551
+ color: #6b7280;
552
+ margin-top: 8px;
553
+ display: flex;
554
+ gap: 12px;
555
+ }
556
+
557
+ .pub-cost-info {
558
+ background: #1e1b2e;
559
+ border: 1px solid #3b3370;
560
+ border-radius: 8px;
561
+ padding: 12px;
562
+ margin-bottom: 12px;
563
+ font-size: 13px;
564
+ color: #e4e4e7;
565
+ }
566
+
567
+ .pub-cost-info strong {
568
+ color: #fde047;
569
+ }
570
+
571
+ .pub-build-output {
572
+ background: #0a0a0f;
573
+ border: 1px solid #3f3f46;
574
+ border-radius: 4px;
575
+ padding: 8px 12px;
576
+ font-family: 'SF Mono', 'Fira Code', monospace;
577
+ font-size: 11px;
578
+ max-height: 200px;
579
+ overflow-y: auto;
580
+ color: #a1a1aa;
581
+ white-space: pre-wrap;
582
+ display: none;
583
+ }
584
+
585
+ .pub-phase {
586
+ padding: 4px 0;
587
+ font-size: 12px;
588
+ color: #a1a1aa;
589
+ }
590
+
591
+ .pub-phase.active {
592
+ color: #e4e4e7;
593
+ }
594
+
595
+ .pub-phase.done {
596
+ color: #86efac;
597
+ }
598
+
599
+ .pub-phase.error {
600
+ color: #fca5a5;
601
+ }
602
+
603
+ .pub-phase::before {
604
+ content: '\25CB ';
605
+ }
606
+
607
+ .pub-phase.active::before {
608
+ content: '\25C9 ';
609
+ }
610
+
611
+ .pub-phase.done::before {
612
+ content: '\2713 ';
613
+ }
614
+
615
+ .pub-phase.error::before {
616
+ content: '\2715 ';
617
+ }
618
+
619
+ .pub-review-status {
620
+ text-align: center;
621
+ padding: 24px 0;
622
+ }
623
+
624
+ .pub-congrats {
625
+ color: #86efac;
626
+ font-size: 16px;
627
+ font-weight: 600;
628
+ text-align: center;
629
+ margin-bottom: 12px;
630
+ }
631
+
632
+ .pub-rejected {
633
+ color: #fca5a5;
634
+ font-size: 14px;
635
+ font-weight: 500;
636
+ margin-bottom: 8px;
637
+ }
@@ -14,26 +14,95 @@
14
14
  <option value="staging">STAGING</option>
15
15
  <option value="production">PRODUCTION</option>
16
16
  </select>
17
- <button id="mode-badge" class="mode-badge mode-mock" title="Click to switch mode">MOCK &#8646;</button>
17
+ <span id="mode-badge" class="mode-badge mode-mock">MOCK</span>
18
+ <button id="mode-toggle" class="btn-icon btn-mode-toggle" title="Switch mode">Switch to Live</button>
18
19
  </div>
19
20
  <div class="toolbar-right">
21
+ <button id="publish-btn" class="btn-icon" title="Publish plugin">&#9650;</button>
20
22
  <span id="credit-balance" class="credit-balance" style="display: none"></span>
21
23
  <span id="theme-badge" class="theme-badge theme-dark">DARK</span>
22
24
  <button id="theme-toggle" class="btn-icon" title="Toggle theme">&#9788;/&#9790;</button>
23
25
  <button id="reload-btn" class="btn-icon" title="Reload plugin">&#8635;</button>
24
26
  </div>
25
27
  </div>
26
- <!-- Login modal -->
27
- <div id="login-modal" class="modal-overlay" style="display: none">
28
- <div class="modal">
29
- <h3>Sign in to FIAS</h3>
30
- <p>Signing in to <strong id="login-target"></strong></p>
31
- <input id="login-email" type="email" class="modal-input" placeholder="Email" autocomplete="email" />
32
- <input id="login-password" type="password" class="modal-input" placeholder="Password" autocomplete="current-password" />
33
- <div id="login-error" class="modal-error" style="display: none"></div>
28
+ <!-- Publish wizard modal -->
29
+ <div id="publish-modal" class="modal-overlay" style="display: none">
30
+ <div class="modal publish-modal">
31
+ <div class="publish-steps">
32
+ <span class="publish-step active" data-step="1">1. Configure</span>
33
+ <span class="publish-step" data-step="2">2. Validate</span>
34
+ <span class="publish-step" data-step="3">3. Build &amp; Submit</span>
35
+ <span class="publish-step" data-step="4">4. Status</span>
36
+ </div>
37
+ <div id="publish-step-1" class="publish-content">
38
+ <div class="publish-form">
39
+ <label>Name</label>
40
+ <input id="pub-name" class="modal-input" type="text" />
41
+ <label>Version</label>
42
+ <input id="pub-version" class="modal-input" type="text" placeholder="1.0.0" />
43
+ <label>Description</label>
44
+ <textarea id="pub-description" class="modal-input pub-textarea" rows="2"></textarea>
45
+ <label>About (optional)</label>
46
+ <textarea id="pub-expanded-desc" class="modal-input pub-textarea" rows="3"></textarea>
47
+ <label>Type</label>
48
+ <select id="pub-archetype" class="modal-input">
49
+ <option value="tool">Tool</option>
50
+ <option value="site">Site</option>
51
+ </select>
52
+ <label>Tags</label>
53
+ <div class="pub-tags-container">
54
+ <div id="pub-tags-list" class="pub-tags-list"></div>
55
+ <input id="pub-tags-input" class="modal-input" type="text" placeholder="Add tag, press Enter" />
56
+ </div>
57
+ <label>Pricing</label>
58
+ <select id="pub-pricing-model" class="modal-input">
59
+ <option value="free">Free</option>
60
+ <option value="fixed">Fixed Price</option>
61
+ <option value="per_use">Per Use</option>
62
+ </select>
63
+ <div id="pub-price-row" style="display:none">
64
+ <label>Price (cents)</label>
65
+ <input id="pub-price" class="modal-input" type="number" min="0" />
66
+ </div>
67
+ <label>Permissions</label>
68
+ <div class="pub-permissions" id="pub-permissions">
69
+ <label class="pub-checkbox"><input type="checkbox" value="theme:read" /> theme:read</label>
70
+ <label class="pub-checkbox"><input type="checkbox" value="user:profile:read" /> user:profile:read</label>
71
+ <label class="pub-checkbox"><input type="checkbox" value="storage:sandbox" /> storage:sandbox</label>
72
+ <label class="pub-checkbox"><input type="checkbox" value="entities:invoke" /> entities:invoke</label>
73
+ <label class="pub-checkbox"><input type="checkbox" value="entities:image_generate" /> entities:image_generate</label>
74
+ </div>
75
+ </div>
76
+ </div>
77
+ <div id="publish-step-2" class="publish-content" style="display:none">
78
+ <div id="pub-validate-loading" class="pub-loading">
79
+ <div class="status-spinner"></div>
80
+ <p>Validating manifest...</p>
81
+ </div>
82
+ <div id="pub-validate-results" style="display:none">
83
+ <div id="pub-validate-status"></div>
84
+ <div id="pub-validate-errors"></div>
85
+ <div id="pub-validate-warnings"></div>
86
+ <div id="pub-listing-preview" class="pub-listing-preview"></div>
87
+ </div>
88
+ </div>
89
+ <div id="publish-step-3" class="publish-content" style="display:none">
90
+ <div id="pub-cost-info" class="pub-cost-info"></div>
91
+ <div id="pub-build-output" class="pub-build-output"></div>
92
+ <div id="pub-submit-progress"></div>
93
+ </div>
94
+ <div id="publish-step-4" class="publish-content" style="display:none">
95
+ <div id="pub-review-status" class="pub-review-status">
96
+ <div class="status-spinner"></div>
97
+ <p>Waiting for review...</p>
98
+ </div>
99
+ <div id="pub-review-result" style="display:none"></div>
100
+ </div>
101
+ <div id="pub-error" class="modal-error" style="display:none"></div>
34
102
  <div class="modal-actions">
35
- <button id="login-cancel" class="btn-secondary">Cancel</button>
36
- <button id="login-submit" class="btn-primary">Sign in</button>
103
+ <button id="pub-cancel" class="btn-secondary">Cancel</button>
104
+ <button id="pub-back" class="btn-secondary" style="display:none">Back</button>
105
+ <button id="pub-next" class="btn-primary">Next</button>
37
106
  </div>
38
107
  </div>
39
108
  </div>
@@ -16,14 +16,9 @@
16
16
  var themeToggle = document.getElementById('theme-toggle');
17
17
  var reloadBtn = document.getElementById('reload-btn');
18
18
  var modeBadge = document.getElementById('mode-badge');
19
+ var modeToggle = document.getElementById('mode-toggle');
19
20
  var pluginStatus = document.getElementById('plugin-status');
20
21
  var themeBadge = document.getElementById('theme-badge');
21
- var loginModal = document.getElementById('login-modal');
22
- var loginEmail = document.getElementById('login-email');
23
- var loginPassword = document.getElementById('login-password');
24
- var loginError = document.getElementById('login-error');
25
- var loginSubmit = document.getElementById('login-submit');
26
- var loginCancel = document.getElementById('login-cancel');
27
22
  var envSelector = document.getElementById('env-selector');
28
23
 
29
24
  var messageCount = 0;
@@ -126,11 +121,11 @@
126
121
  logMessage('send', 'theme_update', { mode: currentTheme });
127
122
  });
128
123
 
129
- // Mode toggle
130
- modeBadge.addEventListener('click', function () {
124
+ // Mode toggle button
125
+ modeToggle.addEventListener('click', function () {
131
126
  if (currentMode === 'mock') {
132
127
  if (!hasCredentials) {
133
- showLoginModal();
128
+ logMessage('error', 'Not authenticated. Run: npx fias-dev login');
134
129
  return;
135
130
  }
136
131
  switchMode('live');
@@ -207,88 +202,6 @@
207
202
  });
208
203
  }
209
204
 
210
- // ────────────────────────────────────────────────────────────────
211
- // Login Modal
212
- // ────────────────────────────────────────────────────────────────
213
-
214
- var loginTarget = document.getElementById('login-target');
215
-
216
- function showLoginModal() {
217
- loginModal.style.display = 'flex';
218
- loginEmail.value = '';
219
- loginPassword.value = '';
220
- loginError.style.display = 'none';
221
- loginSubmit.disabled = false;
222
- loginSubmit.textContent = 'Sign in';
223
- loginTarget.textContent = currentEnvironment === 'production' ? 'fias.io' : 'staging.fias.io';
224
- loginEmail.focus();
225
- }
226
-
227
- function hideLoginModal() {
228
- loginModal.style.display = 'none';
229
- }
230
-
231
- loginCancel.addEventListener('click', hideLoginModal);
232
-
233
- loginModal.addEventListener('click', function (e) {
234
- if (e.target === loginModal) hideLoginModal();
235
- });
236
-
237
- loginEmail.addEventListener('keydown', function (e) {
238
- if (e.key === 'Enter') loginPassword.focus();
239
- if (e.key === 'Escape') hideLoginModal();
240
- });
241
-
242
- loginPassword.addEventListener('keydown', function (e) {
243
- if (e.key === 'Enter') submitLogin();
244
- if (e.key === 'Escape') hideLoginModal();
245
- });
246
-
247
- loginSubmit.addEventListener('click', submitLogin);
248
-
249
- function submitLogin() {
250
- var email = loginEmail.value.trim();
251
- var password = loginPassword.value;
252
-
253
- if (!email || !password) {
254
- loginError.textContent = 'Email and password are required.';
255
- loginError.style.display = 'block';
256
- return;
257
- }
258
-
259
- loginSubmit.disabled = true;
260
- loginSubmit.textContent = 'Signing in...';
261
- loginError.style.display = 'none';
262
-
263
- fetch('/api/auth/login', {
264
- method: 'POST',
265
- headers: { 'Content-Type': 'application/json' },
266
- body: JSON.stringify({ email: email, password: password }),
267
- })
268
- .then(function (r) {
269
- if (!r.ok) {
270
- return r.json().then(function (err) {
271
- throw new Error(err.error || 'Sign in failed');
272
- });
273
- }
274
- return r.json();
275
- })
276
- .then(function () {
277
- hasCredentials = true;
278
- hideLoginModal();
279
- logMessage('info', 'Signed in for ' + currentEnvironment.toUpperCase());
280
- switchMode('live');
281
- })
282
- .catch(function (err) {
283
- loginError.textContent = err.message;
284
- loginError.style.display = 'block';
285
- })
286
- .finally(function () {
287
- loginSubmit.disabled = false;
288
- loginSubmit.textContent = 'Sign in';
289
- });
290
- }
291
-
292
205
  // ────────────────────────────────────────────────────────────────
293
206
  // Message Handling
294
207
  // ────────────────────────────────────────────────────────────────
@@ -477,6 +390,388 @@
477
390
  });
478
391
  }
479
392
 
393
+ // ────────────────────────────────────────────────────────────────
394
+ // Publish Wizard
395
+ // ────────────────────────────────────────────────────────────────
396
+
397
+ var publishBtn = document.getElementById('publish-btn');
398
+ var publishModal = document.getElementById('publish-modal');
399
+ var pubCancel = document.getElementById('pub-cancel');
400
+ var pubBack = document.getElementById('pub-back');
401
+ var pubNext = document.getElementById('pub-next');
402
+ var pubError = document.getElementById('pub-error');
403
+ var pubStep = 1;
404
+ var pubManifest = null;
405
+ var pubSubmissionId = null;
406
+ var pubPollTimer = null;
407
+ var pubValidationPassed = false;
408
+
409
+ publishBtn.addEventListener('click', function () {
410
+ if (currentMode !== 'live' || !hasCredentials) {
411
+ pubError.textContent = 'Switch to live mode and sign in to publish.';
412
+ pubError.style.display = 'block';
413
+ publishModal.style.display = 'flex';
414
+ showPublishStep(1);
415
+ return;
416
+ }
417
+ pubError.style.display = 'none';
418
+ fetch('/api/manifest')
419
+ .then(function (r) {
420
+ if (!r.ok) throw new Error('fias-plugin.json not found');
421
+ return r.json();
422
+ })
423
+ .then(function (manifest) {
424
+ pubManifest = manifest;
425
+ populatePublishForm(manifest);
426
+ publishModal.style.display = 'flex';
427
+ showPublishStep(1);
428
+ })
429
+ .catch(function (err) {
430
+ pubError.textContent = err.message;
431
+ pubError.style.display = 'block';
432
+ publishModal.style.display = 'flex';
433
+ showPublishStep(1);
434
+ });
435
+ });
436
+
437
+ pubCancel.addEventListener('click', closePublishModal);
438
+ publishModal.addEventListener('click', function (e) {
439
+ if (e.target === publishModal) closePublishModal();
440
+ });
441
+
442
+ function closePublishModal() {
443
+ publishModal.style.display = 'none';
444
+ if (pubPollTimer) { clearInterval(pubPollTimer); pubPollTimer = null; }
445
+ pubStep = 1;
446
+ }
447
+
448
+ pubBack.addEventListener('click', function () {
449
+ if (pubStep > 1) showPublishStep(pubStep - 1);
450
+ });
451
+
452
+ pubNext.addEventListener('click', function () {
453
+ pubError.style.display = 'none';
454
+ if (pubStep === 1) {
455
+ collectAndSaveManifest().then(function () { showPublishStep(2); startValidation(); });
456
+ } else if (pubStep === 2 && pubValidationPassed) {
457
+ showPublishStep(3);
458
+ showCostInfo();
459
+ } else if (pubStep === 3) {
460
+ startBuildAndSubmit();
461
+ } else if (pubStep === 4) {
462
+ closePublishModal();
463
+ }
464
+ });
465
+
466
+ function showPublishStep(step) {
467
+ pubStep = step;
468
+ for (var i = 1; i <= 4; i++) {
469
+ var el = document.getElementById('publish-step-' + i);
470
+ if (el) el.style.display = i === step ? 'block' : 'none';
471
+ }
472
+ var steps = document.querySelectorAll('.publish-step');
473
+ steps.forEach(function (s, idx) {
474
+ s.className = 'publish-step' + (idx + 1 === step ? ' active' : idx + 1 < step ? ' completed' : '');
475
+ });
476
+ pubBack.style.display = step > 1 && step < 4 ? 'inline-block' : 'none';
477
+ if (step === 1) { pubNext.textContent = 'Validate'; pubNext.style.display = 'inline-block'; }
478
+ else if (step === 2) { pubNext.textContent = 'Build & Submit'; pubNext.style.display = 'inline-block'; pubNext.disabled = !pubValidationPassed; }
479
+ else if (step === 3) { pubNext.textContent = 'Confirm & Build'; pubNext.style.display = 'inline-block'; }
480
+ else if (step === 4) { pubNext.textContent = 'Close'; pubNext.style.display = 'inline-block'; }
481
+ }
482
+
483
+ function populatePublishForm(m) {
484
+ document.getElementById('pub-name').value = m.name || '';
485
+ document.getElementById('pub-version').value = m.version || '1.0.0';
486
+ document.getElementById('pub-description').value = m.description || '';
487
+ document.getElementById('pub-expanded-desc').value = m.expandedDescription || '';
488
+ document.getElementById('pub-archetype').value = m.archeType || 'tool';
489
+ document.getElementById('pub-pricing-model').value = m.pricing?.model || 'free';
490
+ document.getElementById('pub-price').value = m.pricing?.priceCents || '';
491
+ document.getElementById('pub-price-row').style.display = m.pricing?.model === 'free' ? 'none' : 'block';
492
+
493
+ // Tags
494
+ var tagsList = document.getElementById('pub-tags-list');
495
+ tagsList.innerHTML = '';
496
+ (m.tags || []).forEach(function (t) { addPublishTag(t); });
497
+
498
+ // Permissions
499
+ var checkboxes = document.querySelectorAll('#pub-permissions input[type="checkbox"]');
500
+ var perms = m.permissions || [];
501
+ checkboxes.forEach(function (cb) { cb.checked = perms.indexOf(cb.value) !== -1; });
502
+ }
503
+
504
+ // Tag management
505
+ document.getElementById('pub-tags-input').addEventListener('keydown', function (e) {
506
+ if (e.key === 'Enter' || e.key === ',') {
507
+ e.preventDefault();
508
+ var val = this.value.trim().replace(/,/g, '');
509
+ if (val) { addPublishTag(val); this.value = ''; }
510
+ }
511
+ });
512
+
513
+ function addPublishTag(text) {
514
+ var tag = document.createElement('span');
515
+ tag.className = 'pub-tag';
516
+ tag.innerHTML = escapeHtml(text) + ' <button class="pub-tag-remove">&times;</button>';
517
+ tag.querySelector('.pub-tag-remove').addEventListener('click', function () { tag.remove(); });
518
+ document.getElementById('pub-tags-list').appendChild(tag);
519
+ }
520
+
521
+ // Pricing model change
522
+ document.getElementById('pub-pricing-model').addEventListener('change', function () {
523
+ document.getElementById('pub-price-row').style.display = this.value === 'free' ? 'none' : 'block';
524
+ });
525
+
526
+ function collectManifest() {
527
+ var tags = [];
528
+ document.querySelectorAll('#pub-tags-list .pub-tag').forEach(function (t) {
529
+ tags.push(t.textContent.replace('\u00d7', '').trim());
530
+ });
531
+ var perms = [];
532
+ document.querySelectorAll('#pub-permissions input:checked').forEach(function (cb) { perms.push(cb.value); });
533
+ var pricingModel = document.getElementById('pub-pricing-model').value;
534
+ var pricing = { model: pricingModel, currency: 'usd' };
535
+ if (pricingModel !== 'free') pricing.priceCents = parseInt(document.getElementById('pub-price').value, 10) || 0;
536
+
537
+ return {
538
+ name: document.getElementById('pub-name').value.trim(),
539
+ version: document.getElementById('pub-version').value.trim(),
540
+ description: document.getElementById('pub-description').value.trim(),
541
+ expandedDescription: document.getElementById('pub-expanded-desc').value.trim() || undefined,
542
+ main: (pubManifest && pubManifest.main) || 'src/index.tsx',
543
+ archeType: document.getElementById('pub-archetype').value,
544
+ tags: tags,
545
+ pricing: pricing,
546
+ permissions: perms,
547
+ sdk: (pubManifest && pubManifest.sdk) || '^1.0.0',
548
+ dependencies: pubManifest && pubManifest.dependencies,
549
+ };
550
+ }
551
+
552
+ function collectAndSaveManifest() {
553
+ var manifest = collectManifest();
554
+ pubManifest = manifest;
555
+ return fetch('/api/manifest', {
556
+ method: 'PUT',
557
+ headers: { 'Content-Type': 'application/json' },
558
+ body: JSON.stringify(manifest),
559
+ }).then(function (r) {
560
+ if (!r.ok) throw new Error('Failed to save manifest');
561
+ });
562
+ }
563
+
564
+ function startValidation() {
565
+ pubValidationPassed = false;
566
+ pubNext.disabled = true;
567
+ document.getElementById('pub-validate-loading').style.display = 'flex';
568
+ document.getElementById('pub-validate-results').style.display = 'none';
569
+
570
+ fetch('/api/publish/validate', { method: 'POST' })
571
+ .then(function (r) { return r.json(); })
572
+ .then(function (data) {
573
+ document.getElementById('pub-validate-loading').style.display = 'none';
574
+ document.getElementById('pub-validate-results').style.display = 'block';
575
+
576
+ var statusEl = document.getElementById('pub-validate-status');
577
+ var errorsEl = document.getElementById('pub-validate-errors');
578
+ var warningsEl = document.getElementById('pub-validate-warnings');
579
+ errorsEl.innerHTML = '';
580
+ warningsEl.innerHTML = '';
581
+
582
+ if (data.valid && (!data.errors || data.errors.length === 0)) {
583
+ statusEl.innerHTML = '<div class="pub-valid">Manifest is valid</div>';
584
+ pubValidationPassed = true;
585
+ pubNext.disabled = false;
586
+ } else {
587
+ statusEl.innerHTML = '<div style="color:#fca5a5;font-weight:500;margin-bottom:8px">Validation failed</div>';
588
+ }
589
+
590
+ if (data.errors) {
591
+ data.errors.forEach(function (e) {
592
+ var div = document.createElement('div');
593
+ div.className = 'pub-error-item';
594
+ div.textContent = e;
595
+ errorsEl.appendChild(div);
596
+ });
597
+ }
598
+ if (data.warnings) {
599
+ data.warnings.forEach(function (w) {
600
+ var div = document.createElement('div');
601
+ div.className = 'pub-warn-item';
602
+ div.textContent = w;
603
+ warningsEl.appendChild(div);
604
+ });
605
+ }
606
+
607
+ // Listing preview
608
+ var preview = document.getElementById('pub-listing-preview');
609
+ var m = pubManifest;
610
+ preview.innerHTML =
611
+ '<div class="pub-listing-name">' + escapeHtml(m.name) + '</div>' +
612
+ '<div class="pub-listing-desc">' + escapeHtml(m.description) + '</div>' +
613
+ '<div class="pub-listing-meta">' +
614
+ '<span>v' + escapeHtml(m.version) + '</span>' +
615
+ '<span>' + escapeHtml(m.archeType) + '</span>' +
616
+ '<span>' + escapeHtml(m.pricing.model) + '</span>' +
617
+ '</div>';
618
+ })
619
+ .catch(function (err) {
620
+ document.getElementById('pub-validate-loading').style.display = 'none';
621
+ pubError.textContent = err.message;
622
+ pubError.style.display = 'block';
623
+ });
624
+ }
625
+
626
+ function showCostInfo() {
627
+ var costEl = document.getElementById('pub-cost-info');
628
+ costEl.innerHTML = '<p>Submission cost: <strong>5,000 credits ($50.00)</strong> for first listing, <strong>100 credits ($1.00)</strong> for updates.</p>';
629
+ fetch('/api/credits').then(function (r) { return r.json(); }).then(function (d) {
630
+ if (d.balance != null && isFinite(d.balance)) {
631
+ costEl.innerHTML += '<p style="margin-top:8px">Your balance: <strong>' + d.balance.toFixed(2) + ' credits</strong></p>';
632
+ }
633
+ }).catch(function () {});
634
+ document.getElementById('pub-build-output').style.display = 'none';
635
+ document.getElementById('pub-build-output').textContent = '';
636
+ document.getElementById('pub-submit-progress').innerHTML = '';
637
+ }
638
+
639
+ function startBuildAndSubmit() {
640
+ pubNext.style.display = 'none';
641
+ pubBack.style.display = 'none';
642
+ var outputEl = document.getElementById('pub-build-output');
643
+ var progressEl = document.getElementById('pub-submit-progress');
644
+ outputEl.style.display = 'block';
645
+ outputEl.textContent = '';
646
+ progressEl.innerHTML = '<div class="pub-phase active" id="phase-build">Building...</div>' +
647
+ '<div class="pub-phase" id="phase-package">Packaging...</div>' +
648
+ '<div class="pub-phase" id="phase-submit">Uploading & submitting...</div>';
649
+
650
+ // SSE build
651
+ fetch('/api/publish/build', { method: 'POST' })
652
+ .then(function (response) {
653
+ var reader = response.body.getReader();
654
+ var decoder = new TextDecoder();
655
+ var buffer = '';
656
+
657
+ function pump() {
658
+ return reader.read().then(function (chunk) {
659
+ if (chunk.done) return;
660
+ buffer += decoder.decode(chunk.value, { stream: true });
661
+ var lines = buffer.split('\n');
662
+ buffer = lines.pop() || '';
663
+ for (var i = 0; i < lines.length; i++) {
664
+ if (lines[i].indexOf('data: ') !== 0) continue;
665
+ try {
666
+ var parsed = JSON.parse(lines[i].slice(6));
667
+ if (parsed.line) {
668
+ outputEl.textContent += parsed.line + '\n';
669
+ outputEl.scrollTop = outputEl.scrollHeight;
670
+ }
671
+ if (parsed.done) {
672
+ if (parsed.code !== 0) throw new Error('Build failed (exit code ' + parsed.code + ')');
673
+ document.getElementById('phase-build').className = 'pub-phase done';
674
+ document.getElementById('phase-build').textContent = 'Build complete';
675
+ return doPackageAndSubmit();
676
+ }
677
+ } catch (e) {
678
+ if (e instanceof SyntaxError) continue;
679
+ throw e;
680
+ }
681
+ }
682
+ return pump();
683
+ });
684
+ }
685
+ return pump();
686
+ })
687
+ .catch(function (err) {
688
+ document.getElementById('phase-build').className = 'pub-phase error';
689
+ document.getElementById('phase-build').textContent = 'Build failed: ' + err.message;
690
+ pubBack.style.display = 'inline-block';
691
+ });
692
+ }
693
+
694
+ function doPackageAndSubmit() {
695
+ var progressPhase = document.getElementById('phase-package');
696
+ progressPhase.className = 'pub-phase active';
697
+
698
+ return fetch('/api/publish/package', { method: 'POST' })
699
+ .then(function (r) {
700
+ if (!r.ok) return r.json().then(function (e) { throw new Error(e.error); });
701
+ return r.json();
702
+ })
703
+ .then(function (data) {
704
+ progressPhase.className = 'pub-phase done';
705
+ progressPhase.textContent = 'Packaged (' + Math.round(data.sizeBytes / 1024) + ' KB)';
706
+ document.getElementById('phase-submit').className = 'pub-phase active';
707
+
708
+ return fetch('/api/publish/submit', {
709
+ method: 'POST',
710
+ headers: { 'Content-Type': 'application/json' },
711
+ body: JSON.stringify({}),
712
+ });
713
+ })
714
+ .then(function (r) {
715
+ if (!r.ok) return r.json().then(function (e) { throw new Error(e.error); });
716
+ return r.json();
717
+ })
718
+ .then(function (data) {
719
+ document.getElementById('phase-submit').className = 'pub-phase done';
720
+ document.getElementById('phase-submit').textContent = 'Submitted for review';
721
+ pubSubmissionId = data.submissionId;
722
+ logMessage('info', 'Submitted: ' + pubSubmissionId);
723
+ setTimeout(function () { showPublishStep(4); startStatusPolling(); }, 1000);
724
+ })
725
+ .catch(function (err) {
726
+ var active = document.querySelector('.pub-phase.active');
727
+ if (active) { active.className = 'pub-phase error'; active.textContent += ' — ' + err.message; }
728
+ pubBack.style.display = 'inline-block';
729
+ });
730
+ }
731
+
732
+ function startStatusPolling() {
733
+ if (pubPollTimer) clearInterval(pubPollTimer);
734
+ document.getElementById('pub-review-status').style.display = 'block';
735
+ document.getElementById('pub-review-result').style.display = 'none';
736
+
737
+ pubPollTimer = setInterval(function () {
738
+ fetch('/api/publish/status/' + pubSubmissionId)
739
+ .then(function (r) { return r.json(); })
740
+ .then(function (data) {
741
+ var sub = data.submission || data;
742
+ var status = sub.status;
743
+ var statusEl = document.getElementById('pub-review-status');
744
+
745
+ if (status === 'reviewing') {
746
+ statusEl.innerHTML = '<div class="status-spinner"></div><p>AI is reviewing your plugin...</p>';
747
+ } else if (status === 'building') {
748
+ statusEl.innerHTML = '<div class="status-spinner"></div><p>Building your plugin...</p>';
749
+ } else if (status === 'published') {
750
+ clearInterval(pubPollTimer);
751
+ pubPollTimer = null;
752
+ statusEl.style.display = 'none';
753
+ document.getElementById('pub-review-result').style.display = 'block';
754
+ document.getElementById('pub-review-result').innerHTML =
755
+ '<div class="pub-congrats">Published!</div>' +
756
+ '<p style="text-align:center;color:#a1a1aa;font-size:13px">Your plugin is now live on the Fias marketplace.</p>';
757
+ logMessage('info', 'Plugin published!');
758
+ } else if (status === 'rejected') {
759
+ clearInterval(pubPollTimer);
760
+ pubPollTimer = null;
761
+ statusEl.style.display = 'none';
762
+ document.getElementById('pub-review-result').style.display = 'block';
763
+ var html = '<div class="pub-rejected">Submission Rejected</div>';
764
+ if (sub.errorMessage) html += '<p style="color:#a1a1aa;font-size:12px;margin-bottom:8px">' + escapeHtml(sub.errorMessage) + '</p>';
765
+ if (data.review) {
766
+ html += '<p style="color:#6b7280;font-size:11px">Risk score: ' + (data.review.riskScore || 'N/A') + '</p>';
767
+ }
768
+ document.getElementById('pub-review-result').innerHTML = html;
769
+ }
770
+ })
771
+ .catch(function () {});
772
+ }, 3000);
773
+ }
774
+
480
775
  // ────────────────────────────────────────────────────────────────
481
776
  // Iframe Init
482
777
  // ────────────────────────────────────────────────────────────────
@@ -503,9 +798,9 @@
503
798
 
504
799
  function updateModeBadge() {
505
800
  var opposite = currentMode === 'live' ? 'Mock' : 'Live';
506
- modeBadge.textContent = currentMode.toUpperCase() + ' \u21C6';
801
+ modeBadge.textContent = currentMode.toUpperCase();
507
802
  modeBadge.className = 'mode-badge ' + (currentMode === 'live' ? 'mode-live' : 'mode-mock');
508
- modeBadge.title = 'Click to switch to ' + opposite + ' mode';
803
+ modeToggle.textContent = 'Switch to ' + opposite;
509
804
  }
510
805
 
511
806
  function updateThemeBadge() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fias/plugin-dev-harness",
3
- "version": "1.5.1",
3
+ "version": "1.5.3",
4
4
  "description": "Development harness for building and testing FIAS plugin arches locally",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",