@echomem/mcp 1.4.21 → 1.4.23

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.
@@ -135,21 +135,43 @@ export const SETUP_PAGE_STYLES_WEBSITE_ALIGNMENT = String.raw `
135
135
  .scanMascot {
136
136
  display: grid;
137
137
  place-items: center;
138
- width: clamp(92px, 13vw, 118px);
138
+ width: clamp(108px, 14vw, 132px);
139
139
  aspect-ratio: 1;
140
140
  flex: 0 0 auto;
141
141
  border: 1px solid rgba(26,58,143,0.11);
142
142
  border-radius: 20px;
143
143
  background: color-mix(in srgb, var(--echo-paper-white) 64%, var(--echo-note-cream) 36%);
144
144
  box-shadow: var(--echo-shadow-paper);
145
+ overflow: hidden;
145
146
  transform: rotate(-1.5deg);
146
147
  }
147
- .scanMascot img {
148
+ .scanMascotFrames {
149
+ position: relative;
148
150
  display: block;
149
- width: 76%;
150
- height: 76%;
151
+ width: 100%;
152
+ height: 100%;
153
+ }
154
+ .scanMascotFrame {
155
+ position: absolute;
156
+ inset: 0;
157
+ display: block;
158
+ width: 100%;
159
+ height: 100%;
151
160
  object-fit: contain;
161
+ opacity: 0;
152
162
  filter: drop-shadow(0 12px 14px rgba(26,58,143,0.16));
163
+ animation: scanMascotFrame 4.2s linear infinite;
164
+ }
165
+ .scanMascotFrame:nth-child(1) { animation-delay: 0s; }
166
+ .scanMascotFrame:nth-child(2) { animation-delay: 0.6s; }
167
+ .scanMascotFrame:nth-child(3) { animation-delay: 1.2s; }
168
+ .scanMascotFrame:nth-child(4) { animation-delay: 1.8s; }
169
+ .scanMascotFrame:nth-child(5) { animation-delay: 2.4s; }
170
+ .scanMascotFrame:nth-child(6) { animation-delay: 3s; }
171
+ .scanMascotFrame:nth-child(7) { animation-delay: 3.6s; }
172
+ @keyframes scanMascotFrame {
173
+ 0%, 14.2% { opacity: 1; }
174
+ 14.3%, 100% { opacity: 0; }
153
175
  }
154
176
  .scanLoaderCopy { min-width: 0; }
155
177
  .scanEyebrow {
@@ -424,6 +446,7 @@ export const SETUP_PAGE_STYLES_WEBSITE_ALIGNMENT = String.raw `
424
446
  border: 1.5px solid rgba(26,58,143,0.13);
425
447
  border-radius: var(--echo-radius-card);
426
448
  background: color-mix(in srgb, var(--echo-paper-white) 70%, var(--echo-note-cream) 30%);
449
+ padding: 42px 18px 18px;
427
450
  box-shadow: var(--echo-shadow-paper);
428
451
  transform: rotate(-0.45deg) translateY(5px);
429
452
  transition: transform 160ms ease, box-shadow 160ms ease, border-color 160ms ease;
@@ -482,6 +505,9 @@ export const SETUP_PAGE_STYLES_WEBSITE_ALIGNMENT = String.raw `
482
505
  transform: rotate(8deg);
483
506
  box-shadow: 0 6px 14px rgba(199,55,47,0.24), inset 0 0 0 2px rgba(255,255,255,0.13);
484
507
  }
508
+ .setupPlanCard.is-pro .setupPlanHead {
509
+ padding-right: 0;
510
+ }
485
511
  .setupPlanCard button {
486
512
  border-radius: 999px;
487
513
  box-shadow: var(--echo-shadow-glass);
@@ -520,6 +546,193 @@ export const SETUP_PAGE_STYLES_WEBSITE_ALIGNMENT = String.raw `
520
546
  .readyDecision .actions .skipHistoryButton {
521
547
  border-radius: 999px;
522
548
  }
549
+ .extractionReady .readyHero {
550
+ grid-template-columns: 72px minmax(0, 1fr);
551
+ gap: 22px;
552
+ padding-top: 28px;
553
+ padding-bottom: 28px;
554
+ }
555
+ .extractionReady .readyMascot {
556
+ width: 68px;
557
+ height: 68px;
558
+ }
559
+ .extractionReady .readyHero .exCopy h2 {
560
+ max-width: 700px;
561
+ font-size: clamp(38px, 4.8vw, 56px);
562
+ }
563
+ .extractionReady .readyHero .exCopy .exSub {
564
+ max-width: 700px;
565
+ margin-top: 10px;
566
+ font-size: 15px;
567
+ }
568
+ .extractionReady .sessionSelectionCard {
569
+ grid-template-columns: 30px minmax(0, 1fr) auto;
570
+ min-height: 0;
571
+ padding: 11px clamp(22px, 4vw, 34px);
572
+ background: rgba(255,255,255,0.74);
573
+ }
574
+ .extractionReady .sessionSelectionIcon {
575
+ width: 30px;
576
+ height: 30px;
577
+ border: 0;
578
+ background: rgba(41,83,186,0.07);
579
+ box-shadow: none;
580
+ }
581
+ .extractionReady .sessionSelectionIcon .setupGlyph {
582
+ width: 17px;
583
+ height: 17px;
584
+ }
585
+ .extractionReady .sessionSelectionEyebrow {
586
+ display: none;
587
+ }
588
+ .extractionReady .sessionSelectionCopy > strong {
589
+ margin: 0;
590
+ font-size: 14px;
591
+ }
592
+ .extractionReady .sessionSelectionCopy p {
593
+ margin-top: 1px;
594
+ font-size: 11px;
595
+ }
596
+ .extractionReady .sessionEditButton {
597
+ min-height: 32px;
598
+ padding: 6px 12px;
599
+ border: 0;
600
+ background: transparent;
601
+ box-shadow: none;
602
+ font-size: 11px;
603
+ text-decoration: underline;
604
+ }
605
+ .extractionReady .readyGo {
606
+ justify-items: center;
607
+ padding: 28px clamp(22px, 4vw, 34px) 24px;
608
+ background: rgba(255,255,255,0.90);
609
+ }
610
+ .extractionReady .actions {
611
+ display: grid;
612
+ width: min(520px, 100%);
613
+ grid-template-columns: 1fr;
614
+ justify-items: center;
615
+ gap: 12px;
616
+ }
617
+ .extractionReady .actions .primary {
618
+ width: 100%;
619
+ min-height: 56px;
620
+ justify-content: center;
621
+ font-size: 15px;
622
+ }
623
+ .extractionReady .actions .skipHistoryButton {
624
+ min-height: 0;
625
+ border: 0;
626
+ background: transparent;
627
+ padding: 4px 10px;
628
+ color: var(--echo-ink-mute);
629
+ box-shadow: none;
630
+ font-size: 11px;
631
+ text-decoration: underline;
632
+ }
633
+ .extractionReady .ctaMeta {
634
+ justify-content: center;
635
+ margin-top: 12px;
636
+ text-align: center;
637
+ }
638
+ .readySettings {
639
+ display: grid;
640
+ width: 100%;
641
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
642
+ gap: 16px;
643
+ border-top: 1px solid rgba(26,58,143,0.10);
644
+ border-bottom: 1px solid rgba(26,58,143,0.10);
645
+ background: color-mix(in srgb, var(--echo-paper-white) 76%, var(--echo-note-cream) 24%);
646
+ padding: 12px clamp(22px, 4vw, 34px);
647
+ }
648
+ .readySetting {
649
+ display: grid;
650
+ min-width: 0;
651
+ grid-template-columns: auto minmax(0, 1fr);
652
+ align-items: center;
653
+ gap: 10px;
654
+ }
655
+ .readySetting + .readySetting {
656
+ border-left: 1px solid rgba(26,58,143,0.10);
657
+ padding-left: 16px;
658
+ }
659
+ .readySettingLabel {
660
+ color: var(--echo-ink-faint);
661
+ font: 800 8px/1 var(--echo-font-mono);
662
+ letter-spacing: 0.10em;
663
+ text-transform: uppercase;
664
+ }
665
+ .extractionReady .readySettings .setupAccountCard {
666
+ grid-template-columns: 28px minmax(0, 1fr) auto;
667
+ gap: 8px;
668
+ border: 0;
669
+ background: transparent;
670
+ padding: 0;
671
+ box-shadow: none;
672
+ }
673
+ .extractionReady .readySettings .setupAccountAvatar {
674
+ width: 28px;
675
+ height: 28px;
676
+ border-radius: 8px;
677
+ font-size: 9px;
678
+ box-shadow: none;
679
+ }
680
+ .extractionReady .readySettings .setupAccountCopy small,
681
+ .extractionReady .readySettings .setupAccountCopy > span {
682
+ display: none;
683
+ }
684
+ .extractionReady .readySettings .setupAccountCopy strong {
685
+ margin: 0;
686
+ font-size: 12px;
687
+ }
688
+ .extractionReady .readySettings .setupAccountChange,
689
+ .extractionReady .readySettings .setupPlanConfirmed .textButton {
690
+ min-height: 0;
691
+ border: 0;
692
+ background: transparent;
693
+ padding: 4px 6px;
694
+ box-shadow: none;
695
+ font-size: 10px;
696
+ text-decoration: underline;
697
+ }
698
+ .extractionReady .readySettings .setupPlanConfirmed {
699
+ grid-template-columns: 24px minmax(0, 1fr) auto;
700
+ gap: 7px;
701
+ border: 0;
702
+ background: transparent;
703
+ padding: 0;
704
+ box-shadow: none;
705
+ }
706
+ .extractionReady .readySettings .setupPlanConfirmedIcon {
707
+ width: 24px;
708
+ height: 24px;
709
+ background: rgba(44,143,104,0.10);
710
+ }
711
+ .extractionReady .readySettings .setupPlanConfirmedIcon .setupGlyph {
712
+ width: 14px;
713
+ height: 14px;
714
+ }
715
+ .extractionReady .readySettings .setupPlanConfirmedCopy strong {
716
+ font-size: 12px;
717
+ }
718
+ .extractionReady .readySettings .setupPlanConfirmedCopy > span {
719
+ display: none;
720
+ }
721
+ .readySettings.is-plan-open {
722
+ grid-template-columns: 1fr;
723
+ padding: 0;
724
+ }
725
+ .readySettings.is-plan-open .readyAccountSetting {
726
+ display: none;
727
+ }
728
+ .readySettings.is-plan-open .readyPlanSetting {
729
+ grid-template-columns: 1fr;
730
+ border: 0;
731
+ padding: 0;
732
+ }
733
+ .readySettings.is-plan-open .readySettingLabel {
734
+ display: none;
735
+ }
523
736
  .readyFoot {
524
737
  border-top-color: rgba(26,58,143,0.10);
525
738
  border-radius: 0 0 calc(var(--echo-radius-panel) - 2px) calc(var(--echo-radius-panel) - 2px);
@@ -751,7 +964,7 @@ export const SETUP_PAGE_STYLES_WEBSITE_ALIGNMENT = String.raw `
751
964
  gap: 18px;
752
965
  }
753
966
  .scanMascot {
754
- width: 76px;
967
+ width: 88px;
755
968
  border-radius: 16px;
756
969
  }
757
970
  .scanLoader h2.siteHeadline {
@@ -786,6 +999,18 @@ export const SETUP_PAGE_STYLES_WEBSITE_ALIGNMENT = String.raw `
786
999
  .setupPlanGrid {
787
1000
  gap: 20px;
788
1001
  }
1002
+ .extractionReady .readyHero {
1003
+ grid-template-columns: 1fr;
1004
+ }
1005
+ .readySettings {
1006
+ grid-template-columns: 1fr;
1007
+ }
1008
+ .readySetting + .readySetting {
1009
+ border-top: 1px solid rgba(26,58,143,0.10);
1010
+ border-left: 0;
1011
+ padding-top: 10px;
1012
+ padding-left: 0;
1013
+ }
789
1014
  .setupPlanCard,
790
1015
  .setupPlanCard:nth-child(2),
791
1016
  .setupPlanCard:nth-child(3) {
@@ -814,5 +1039,12 @@ export const SETUP_PAGE_STYLES_WEBSITE_ALIGNMENT = String.raw `
814
1039
  transition: none;
815
1040
  transform: none;
816
1041
  }
1042
+ .scanMascotFrame {
1043
+ animation: none;
1044
+ opacity: 0;
1045
+ }
1046
+ .scanMascotFrame:first-child {
1047
+ opacity: 1;
1048
+ }
817
1049
  }
818
1050
  `;
@@ -3,6 +3,7 @@ import { SETUP_PAGE_STYLES_CITY_REPORT } from "./styles-city-report.js";
3
3
  import { SETUP_PAGE_STYLES_EXTRACTION } from "./styles-extraction.js";
4
4
  import { SETUP_PAGE_STYLES_CONTEXT_AUDIT } from "./styles-context-audit.js";
5
5
  import { SETUP_PAGE_STYLES_WEBSITE_ALIGNMENT } from "./styles-website-alignment.js";
6
+ import { SETUP_PAGE_STYLES_MVP } from "./styles-mvp.js";
6
7
  // Kept as one emitted style tag so the local HTML page remains self-contained.
7
8
  export const SETUP_PAGE_STYLES = [
8
9
  SETUP_PAGE_STYLES_FOUNDATION,
@@ -10,4 +11,5 @@ export const SETUP_PAGE_STYLES = [
10
11
  SETUP_PAGE_STYLES_EXTRACTION,
11
12
  SETUP_PAGE_STYLES_CONTEXT_AUDIT,
12
13
  SETUP_PAGE_STYLES_WEBSITE_ALIGNMENT,
14
+ SETUP_PAGE_STYLES_MVP,
13
15
  ].join("\n");
@@ -15,6 +15,9 @@ export const SETUP_PREVIEW_STATES = [
15
15
  "extract-enterprise-active",
16
16
  "extract-unknown",
17
17
  "auth-login",
18
+ "auth-login-pro",
19
+ "auth-otp",
20
+ "checkout-pro-selected",
18
21
  "auth-unlock",
19
22
  "auth-setup",
20
23
  "extract-run",
@@ -242,7 +245,7 @@ function extractionPreviewBootstrap(options) {
242
245
  return `
243
246
  connected = true;
244
247
  billingStatus = ${JSON.stringify(billingStatus)};
245
- setupPlanChoice = ${JSON.stringify(options.selectFree ? "free" : "")};
248
+ setupPlanChoice = ${JSON.stringify(options.selectFree ? "free" : options.selectedPlanChoice || "")};
246
249
  stats = {
247
250
  sessions: { total: ${candidateCount}, codex: ${Math.ceil(candidateCount * 0.68)}, claudeCode: ${Math.floor(candidateCount * 0.32)} },
248
251
  migratable: {
@@ -266,7 +269,7 @@ function extractionPreviewBootstrap(options) {
266
269
  discovery: { phase: "account", exact: false }
267
270
  };
268
271
  renderDashboard();
269
- ${options.showUnknownStatus ? 'setSetupPlanStatus("Plan check unavailable. Free still works.");' : ""}
272
+ ${options.showUnknownStatus ? 'setSetupPlanStatus("Plan check unavailable. Original still works.");' : ""}
270
273
  ${options.openSessionPicker ? "window.setTimeout(function () { openSessionPicker(); }, 0);" : ""}`;
271
274
  }
272
275
  export function renderSetupPreviewBootstrap(state) {
@@ -294,6 +297,7 @@ export function renderSetupPreviewBootstrap(state) {
294
297
  if (state === "report") {
295
298
  const reportJson = JSON.stringify(previewReport);
296
299
  return `${watermark}
300
+ localHistoryConsentGranted = true;
297
301
  report = ${reportJson};
298
302
  reportEnvelope = { schemaVersion: 1, kind: "ready", mode: "preview", scanId: "design-preview", report: report };
299
303
  renderForensicReport();`;
@@ -335,22 +339,22 @@ export function renderSetupPreviewBootstrap(state) {
335
339
  if (state === "extract-pro-active")
336
340
  return `${watermark}${extractionPreviewBootstrap({
337
341
  plan: "pro", paid: true, trialAvailable: false, trialUsed: true,
338
- subscriptionStatus: "active", quotaLimit: 250, quotaRemaining: 250,
342
+ subscriptionStatus: "active", quotaLimit: 500, quotaRemaining: 500,
339
343
  })}`;
340
344
  if (state === "extract-power-active")
341
345
  return `${watermark}${extractionPreviewBootstrap({
342
346
  plan: "power", paid: true, trialAvailable: false, trialUsed: true,
343
- subscriptionStatus: "active", quotaLimit: 500, quotaRemaining: 500,
347
+ subscriptionStatus: "active", quotaLimit: 2_000, quotaRemaining: 2_000,
344
348
  })}`;
345
349
  if (state === "extract-team-active")
346
350
  return `${watermark}${extractionPreviewBootstrap({
347
351
  plan: "team", paid: true, trialAvailable: false, trialUsed: true,
348
- subscriptionStatus: "active", quotaLimit: 250, quotaRemaining: 250,
352
+ subscriptionStatus: "active", quotaLimit: 500, quotaRemaining: 500,
349
353
  })}`;
350
354
  if (state === "extract-enterprise-active")
351
355
  return `${watermark}${extractionPreviewBootstrap({
352
356
  plan: "enterprise", paid: true, trialAvailable: false, trialUsed: true,
353
- subscriptionStatus: "active", quotaLimit: 500, quotaRemaining: 500,
357
+ subscriptionStatus: "active", quotaLimit: 2_000, quotaRemaining: 2_000,
354
358
  })}`;
355
359
  if (state === "extract-unknown")
356
360
  return `${watermark}${extractionPreviewBootstrap({
@@ -359,6 +363,18 @@ export function renderSetupPreviewBootstrap(state) {
359
363
  })}`;
360
364
  if (state === "auth-login")
361
365
  return `${watermark}\n renderLocalLogin("");`;
366
+ if (state === "auth-login-pro")
367
+ return `${watermark}
368
+ renderLocalLogin("");`;
369
+ if (state === "auth-otp")
370
+ return `${watermark}
371
+ localAuthEmail = "preview@example.com";
372
+ renderLocalOtp("Verification code sent. Check your email inbox.");`;
373
+ if (state === "checkout-pro-selected")
374
+ return `${watermark}${extractionPreviewBootstrap({
375
+ plan: "free", paid: false, trialAvailable: true, trialUsed: false,
376
+ quotaLimit: 100, quotaRemaining: 100, selectedPlanChoice: "pro",
377
+ })}`;
362
378
  if (state === "auth-unlock")
363
379
  return `${watermark}\n renderLocalPassphrase("unlock", "preview@example.com");`;
364
380
  if (state === "auth-setup")