@echomem/mcp 1.4.20 → 1.4.22

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");
@@ -1,5 +1,6 @@
1
1
  import { renderSetupPageDocument } from "./setup-page/document.js";
2
2
  import { renderSetupPreviewBootstrap } from "./setup-preview.js";
3
+ export { SETUP_PREVIEW_STATES } from "./setup-preview.js";
3
4
  /**
4
5
  * Setup page entry point. The implementation is split by product phase under ./setup-page/:
5
6
  * core utilities, local report, post-auth extraction, and lifecycle polling.
@@ -5,7 +5,21 @@ export const SETUP_PREVIEW_STATES = [
5
5
  "report",
6
6
  "extract-counting",
7
7
  "extract-ready",
8
+ "extract-free-selected",
9
+ "extract-free-trial-used",
8
10
  "extract-limit",
11
+ "extract-pro-trial",
12
+ "extract-pro-active",
13
+ "extract-power-active",
14
+ "extract-team-active",
15
+ "extract-enterprise-active",
16
+ "extract-unknown",
17
+ "auth-login",
18
+ "auth-login-pro",
19
+ "auth-otp",
20
+ "checkout-pro-selected",
21
+ "auth-unlock",
22
+ "auth-setup",
9
23
  "extract-run",
10
24
  "extract-overdue",
11
25
  "extract-done",
@@ -202,6 +216,62 @@ function previewWatermarkScript() {
202
216
  document.body.appendChild(previewWatermark);
203
217
  `;
204
218
  }
219
+ function extractionPreviewBootstrap(options) {
220
+ const candidateCount = options.candidateCount ?? 520;
221
+ const quotaLimit = options.quotaLimit;
222
+ const quotaRemaining = options.quotaRemaining;
223
+ const historicalConversationQuota = quotaLimit == null || quotaRemaining == null
224
+ ? null
225
+ : {
226
+ used: Math.max(0, quotaLimit - quotaRemaining),
227
+ limit: quotaLimit,
228
+ remaining: quotaRemaining,
229
+ };
230
+ const billingStatus = {
231
+ plan: options.plan,
232
+ paid: options.paid,
233
+ trialAvailable: options.trialAvailable,
234
+ trialUsed: options.trialUsed,
235
+ subscriptionStatus: options.subscriptionStatus ?? null,
236
+ trialEndedAt: options.trialEndedAt ?? null,
237
+ pricingUrl: "https://echoknows.com/pricing?source=mcp_onboarding",
238
+ account: {
239
+ displayName: "Preview User",
240
+ email: "preview@example.com",
241
+ avatarUrl: "/hud-assets/echo-face-cutout.png",
242
+ },
243
+ historicalConversationQuota,
244
+ };
245
+ return `
246
+ connected = true;
247
+ billingStatus = ${JSON.stringify(billingStatus)};
248
+ setupPlanChoice = ${JSON.stringify(options.selectFree ? "free" : options.selectedPlanChoice || "")};
249
+ stats = {
250
+ sessions: { total: ${candidateCount}, codex: ${Math.ceil(candidateCount * 0.68)}, claudeCode: ${Math.floor(candidateCount * 0.32)} },
251
+ migratable: {
252
+ pending: ${candidateCount}, pendingTotal: ${candidateCount}, pendingCodex: ${Math.ceil(candidateCount * 0.68)}, pendingClaudeCode: ${Math.floor(candidateCount * 0.32)},
253
+ alreadyMigrated: 108, skippedActive: 0,
254
+ eta: { estimatedLabel: "under 2 minutes" }, estimatedLabel: "under 2 minutes"
255
+ },
256
+ candidateSessions: Array.from({ length: ${candidateCount} }, function (_, index) {
257
+ var codex = index < ${Math.ceil(candidateCount * 0.68)};
258
+ return {
259
+ key: (codex ? "codex:" : "claude-code:") + "preview-" + index,
260
+ source: codex ? "codex" : "claude-code",
261
+ title: ["Plan the onboarding flow", "Repair memory extraction", "Review pricing limits", "Polish the EchoMem HUD"][index % 4] + " · " + (index + 1),
262
+ project: ["EchoMem Chrome", "MCP Server", "Memory Platform"][index % 3],
263
+ date: new Date(Date.UTC(2026, 6, 18 - (index % 12))).toISOString(),
264
+ characters: 42000 + index * 2700,
265
+ approxInputTokens: 10500 + index * 675,
266
+ turns: 18 + index
267
+ };
268
+ }),
269
+ discovery: { phase: "account", exact: false }
270
+ };
271
+ renderDashboard();
272
+ ${options.showUnknownStatus ? 'setSetupPlanStatus("Plan check unavailable. Original still works.");' : ""}
273
+ ${options.openSessionPicker ? "window.setTimeout(function () { openSessionPicker(); }, 0);" : ""}`;
274
+ }
205
275
  export function renderSetupPreviewBootstrap(state) {
206
276
  const watermark = previewWatermarkScript();
207
277
  if (state === "consent") {
@@ -227,6 +297,7 @@ export function renderSetupPreviewBootstrap(state) {
227
297
  if (state === "report") {
228
298
  const reportJson = JSON.stringify(previewReport);
229
299
  return `${watermark}
300
+ localHistoryConsentGranted = true;
230
301
  report = ${reportJson};
231
302
  reportEnvelope = { schemaVersion: 1, kind: "ready", mode: "preview", scanId: "design-preview", report: report };
232
303
  renderForensicReport();`;
@@ -236,44 +307,78 @@ export function renderSetupPreviewBootstrap(state) {
236
307
  stats = null;
237
308
  renderDashboard();`;
238
309
  }
239
- if (state === "extract-ready" || state === "extract-limit") {
240
- const remainingHistory = state === "extract-limit" ? 0 : 28;
310
+ if (state === "extract-ready")
311
+ return `${watermark}${extractionPreviewBootstrap({
312
+ plan: "free", paid: false, trialAvailable: true, trialUsed: false,
313
+ quotaLimit: 100, quotaRemaining: 28, candidateCount: 28,
314
+ })}`;
315
+ if (state === "extract-free-selected")
316
+ return `${watermark}${extractionPreviewBootstrap({
317
+ plan: "free", paid: false, trialAvailable: true, trialUsed: false,
318
+ quotaLimit: 100, quotaRemaining: 100, selectFree: true,
319
+ })}`;
320
+ if (state === "extract-free-trial-used")
321
+ return `${watermark}${extractionPreviewBootstrap({
322
+ plan: "free", paid: false, trialAvailable: false, trialUsed: true,
323
+ subscriptionStatus: "expired", trialEndedAt: "2026-07-20T00:00:00.000Z",
324
+ quotaLimit: 100, quotaRemaining: 100,
325
+ })}`;
326
+ if (state === "extract-limit")
327
+ return `${watermark}${extractionPreviewBootstrap({
328
+ plan: "free", paid: false, trialAvailable: false, trialUsed: true,
329
+ quotaLimit: 100, quotaRemaining: 0, selectFree: true, openSessionPicker: true,
330
+ })}`;
331
+ if (state === "extract-pro-trial")
332
+ return `${watermark}${extractionPreviewBootstrap({
333
+ plan: "pro", paid: true, trialAvailable: false, trialUsed: true,
334
+ subscriptionStatus: "trialing", trialEndedAt: "2026-08-04T00:00:00.000Z",
335
+ // The server currently grants trialing users Free's lifetime history allowance,
336
+ // even though recurring processing/search allowances resolve to Pro.
337
+ quotaLimit: 100, quotaRemaining: 100,
338
+ })}`;
339
+ if (state === "extract-pro-active")
340
+ return `${watermark}${extractionPreviewBootstrap({
341
+ plan: "pro", paid: true, trialAvailable: false, trialUsed: true,
342
+ subscriptionStatus: "active", quotaLimit: 250, quotaRemaining: 250,
343
+ })}`;
344
+ if (state === "extract-power-active")
345
+ return `${watermark}${extractionPreviewBootstrap({
346
+ plan: "power", paid: true, trialAvailable: false, trialUsed: true,
347
+ subscriptionStatus: "active", quotaLimit: 500, quotaRemaining: 500,
348
+ })}`;
349
+ if (state === "extract-team-active")
350
+ return `${watermark}${extractionPreviewBootstrap({
351
+ plan: "team", paid: true, trialAvailable: false, trialUsed: true,
352
+ subscriptionStatus: "active", quotaLimit: 250, quotaRemaining: 250,
353
+ })}`;
354
+ if (state === "extract-enterprise-active")
355
+ return `${watermark}${extractionPreviewBootstrap({
356
+ plan: "enterprise", paid: true, trialAvailable: false, trialUsed: true,
357
+ subscriptionStatus: "active", quotaLimit: 500, quotaRemaining: 500,
358
+ })}`;
359
+ if (state === "extract-unknown")
360
+ return `${watermark}${extractionPreviewBootstrap({
361
+ plan: "unknown", paid: false, trialAvailable: true, trialUsed: false,
362
+ showUnknownStatus: true,
363
+ })}`;
364
+ if (state === "auth-login")
365
+ return `${watermark}\n renderLocalLogin("");`;
366
+ if (state === "auth-login-pro")
241
367
  return `${watermark}
242
- connected = true;
243
- billingStatus = {
244
- plan: "free", paid: false, trialAvailable: true,
245
- pricingUrl: "https://echoknows.com/pricing?source=mcp_onboarding",
246
- account: {
247
- displayName: "Erik Hein",
248
- email: "erik@example.com",
249
- avatarUrl: "/hud-assets/echo-face-cutout.png"
250
- },
251
- historicalConversationQuota: { used: ${100 - remainingHistory}, limit: 100, remaining: ${remainingHistory} }
252
- };
253
- stats = {
254
- sessions: { total: 136, codex: 82, claudeCode: 54 },
255
- migratable: {
256
- pending: 28, pendingTotal: 28, pendingCodex: 19, pendingClaudeCode: 9,
257
- alreadyMigrated: 108, skippedActive: 0,
258
- eta: { estimatedLabel: "under 2 minutes" }, estimatedLabel: "under 2 minutes"
259
- },
260
- candidateSessions: Array.from({ length: 28 }, function (_, index) {
261
- var codex = index < 19;
262
- return {
263
- key: (codex ? "codex:" : "claude-code:") + "preview-" + index,
264
- source: codex ? "codex" : "claude-code",
265
- title: ["Plan the onboarding flow", "Repair memory extraction", "Review pricing limits", "Polish the EchoMem HUD"][index % 4] + " · " + (index + 1),
266
- project: ["EchoMem Chrome", "MCP Server", "Memory Platform"][index % 3],
267
- date: new Date(Date.UTC(2026, 6, 18 - (index % 12))).toISOString(),
268
- characters: 42000 + index * 2700,
269
- approxInputTokens: 10500 + index * 675,
270
- turns: 18 + index
271
- };
272
- }),
273
- discovery: { phase: "account", exact: false }
274
- };
275
- renderDashboard();`;
276
- }
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
+ })}`;
378
+ if (state === "auth-unlock")
379
+ return `${watermark}\n renderLocalPassphrase("unlock", "preview@example.com");`;
380
+ if (state === "auth-setup")
381
+ return `${watermark}\n renderLocalPassphrase("setup", "preview@example.com");`;
277
382
  if (state === "extract-run") {
278
383
  return `${watermark}
279
384
  renderProgress({ status: "running", total: 28, completed: 4, extracted: 19, failed: 1, latest: "preview session", latestRepo: "Preview Workspace" });`;