mindexec-ai 0.2.387 → 0.2.388
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/wwwroot/assets/{AdminDashboardPage-_x_oqzWL.js → AdminDashboardPage-C6C0NzZ_.js} +1 -1
- package/wwwroot/assets/{AppSidebar-sGY6ZVqZ.js → AppSidebar-C0YY4yCc.js} +2 -2
- package/wwwroot/assets/{AuthPages-Bt5a9jSO.js → AuthPages-swiwmA4b.js} +1 -1
- package/wwwroot/assets/{CodePage-C0OcxSo1.js → CodePage-Bjz-Oxkj.js} +1 -1
- package/wwwroot/assets/{CompanyCorePage-BhB6Azad.js → CompanyCorePage-CZxJyjgp.js} +1 -1
- package/wwwroot/assets/{ExecutionModePage-DQ6L2G6g.js → ExecutionModePage-ylAKXaYX.js} +1 -1
- package/wwwroot/assets/{MindCanvas-B5hSTh9A.js → MindCanvas-DjyNvGo-.js} +19 -19
- package/wwwroot/assets/{PlanMasterPage-DevUmIeD.js → PlanMasterPage-BeKyoE-j.js} +1 -1
- package/wwwroot/assets/{PricingPage-3sc6Juig.js → PricingPage-Cb4iN0dc.js} +1 -1
- package/wwwroot/assets/{ToolPages-DILzDdzH.js → ToolPages-B4URLnao.js} +1 -1
- package/wwwroot/assets/{YouTubeSearchPage-D5B05Qdb.js → YouTubeSearchPage-DZQZM9YK.js} +1 -1
- package/wwwroot/assets/{canvas-runtime-F1OftOhQ.js → canvas-runtime-qWnXqOnu.js} +1 -1
- package/wwwroot/assets/{index-CmaOkjme.js → index-D8RqkCyH.js} +2 -2
- package/wwwroot/assets/{storage-k24X2WPI.js → storage-Chd5qEii.js} +1 -1
- package/wwwroot/assets/{supabaseAuthAdapter-BcLkoGvY.js → supabaseAuthAdapter-BBfom_he.js} +10 -10
- package/wwwroot/index.html +1 -1
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as E,j as e}from"./vendor-react-BXzpOyCS.js";import{a as U}from"./index-CmaOkjme.js";import{r as te}from"./productionAdapterConfig-C5jfk6oG.js";import{R as d}from"./app-runtime-xD2Z3NdN.js";import{getSupabaseBrowserClient as re}from"./supabaseAuthAdapter-BcLkoGvY.js";import{an as _e,R as ge,D as Ee,b0 as Se,aQ as De,b1 as ye,P as we,aH as xe,b2 as Ae,j as Ce,q as Ie,W as Ne,b3 as Re,c as je,b4 as ke,e as Oe,aA as Pe}from"./vendor-icons-DE3gIReG.js";import"./canvas-runtime-F1OftOhQ.js";const Le=!1,Me="hold-release",Te=[{id:"cloud-auth-billing",label:"Secure cloud/auth/billing adapter closure",uiLabel:"Cloud/auth/billing adapter",state:"blocked-live-proof",requiredProof:["Dodo checkout live smoke with fresh Supabase session","Supabase provider read-only smoke with fresh session","Supabase provider write/admin mutation smoke with explicit admin values","Original launch proof supabaseLeakedPasswordProtection remains required as artifact-backed security proof","Original launch proof bolaIdorNegativeGate remains required as artifact-backed 20-user authorization proof","Original launch proof activeEditorHttpGate remains required as artifact-backed active editor load proof","Original launch proof dodoSignedSmoke remains required as signed webhook proof","Original launch proof dodoCheckoutDisabled remains required as fail-closed checkout proof","Original launch proof dodoSandboxWebhook remains required as real sandbox webhook proof","Original launch proof deploymentHardening.webCaptureWorkerSsrfRedirectGuard remains required as capture hardening proof","Original launch proof deploymentHardening.uploadFileSizeValidation remains required as upload hardening proof","Original launch proof deploymentHardening.dodoWebhookReplayGuard remains required as webhook replay hardening proof"],uiProof:"Dodo checkout, Supabase read-only, cloud write, and admin mutation proof need fresh provider inputs.",requiredInputs:["VITE_MINDEXEC_SUPABASE_URL","VITE_MINDEXEC_SUPABASE_PUBLISHABLE_KEY","VITE_MINDEXEC_DODO_CHECKOUT_FUNCTION_URL","MINDEXEC_SUPABASE_PROVIDER_SESSION_JSON","MINDEXEC_DODO_CHECKOUT_LIVE_CONFIRM","MINDEXEC_SUPABASE_PROVIDER_LIVE_CONFIRM","MINDEXEC_SUPABASE_PROVIDER_WRITE_CONFIRM","MINDEXEC_SUPABASE_PROVIDER_ADMIN_MUTATION_CONFIRM","MINDEXEC_SUPABASE_PROVIDER_ADMIN_PRICE_STAGE","MINDEXEC_SUPABASE_PROVIDER_ADMIN_LTD_LIMIT","MINDEXEC_ORIGINAL_LAUNCH_PROOF_JSON"],uiCommand:"npm run verify:release-blocker-preflight",proofCommands:[{label:"Dodo checkout live smoke",command:"npm run verify:dodo-checkout-live-smoke",mode:"opt-in-live-proof",liveCall:!0,hostAffecting:!1,defaultGate:!1,requiredInputs:["VITE_MINDEXEC_SUPABASE_URL","VITE_MINDEXEC_SUPABASE_PUBLISHABLE_KEY","VITE_MINDEXEC_DODO_CHECKOUT_FUNCTION_URL","MINDEXEC_SUPABASE_PROVIDER_SESSION_JSON","MINDEXEC_DODO_CHECKOUT_LIVE_CONFIRM"]},{label:"Supabase provider read-only smoke",command:"npm run verify:supabase-provider-live-smoke",mode:"opt-in-live-proof",liveCall:!0,hostAffecting:!1,defaultGate:!1,requiredInputs:["VITE_MINDEXEC_SUPABASE_URL","VITE_MINDEXEC_SUPABASE_PUBLISHABLE_KEY","MINDEXEC_SUPABASE_PROVIDER_SESSION_JSON","MINDEXEC_SUPABASE_PROVIDER_LIVE_CONFIRM"]},{label:"Supabase provider write/admin mutation smoke",command:"npm run verify:supabase-provider-write-smoke",mode:"opt-in-live-proof",liveCall:!0,hostAffecting:!1,defaultGate:!1,requiredInputs:["VITE_MINDEXEC_SUPABASE_URL","VITE_MINDEXEC_SUPABASE_PUBLISHABLE_KEY","MINDEXEC_SUPABASE_PROVIDER_SESSION_JSON","MINDEXEC_SUPABASE_PROVIDER_WRITE_CONFIRM","MINDEXEC_SUPABASE_PROVIDER_ADMIN_MUTATION_CONFIRM","MINDEXEC_SUPABASE_PROVIDER_ADMIN_PRICE_STAGE","MINDEXEC_SUPABASE_PROVIDER_ADMIN_LTD_LIMIT"]},{label:"Original launch proof artifacts",command:"npm run verify:original-launch-proof-artifacts",mode:"opt-in-proof-file",liveCall:!1,hostAffecting:!1,defaultGate:!1,requiredInputs:["MINDEXEC_ORIGINAL_LAUNCH_PROOF_JSON"]}]},{id:"agent-webresearch-codemaster",label:"Agent execution and WebResearch adapter closure",uiLabel:"Agent and CodeMaster provider depth",state:"blocked-provider-depth",requiredProof:["Real provider-backed diff/apply proof stays bounded to disposable workspace evidence","Cloud execution adapter proof avoids deploy, publish, billing, and unsafe file mutations","Concept embedding live proof keeps the provider API key server-side and opt-in only"],uiProof:"Live provider diff/apply and cloud execution proof remain opt-in and bounded.",requiredInputs:["MINDEXEC_CODEX_LIVE_READONLY_CONFIRM","MINDEXEC_CODEX_LIVE_TEMP_WRITE_CONFIRM","MINDEXEC_CODEX_LIVE_PROJECT_WRITE_CONFIRM","MINDEXEC_CODEMASTER_CLOUD_EXECUTION_PROOF_JSON","MINDEXEC_CONCEPT_EMBED_LIVE_CONFIRM","MINDEXEC_CONCEPT_EMBED_API_KEY"],uiCommand:"npm run verify:codemaster-codex-live-project-write-smoke",proofCommands:[{label:"Codex live read-only provider smoke",command:"npm run verify:codemaster-codex-live-readonly-smoke",mode:"opt-in-live-proof",liveCall:!0,hostAffecting:!1,defaultGate:!1,requiredInputs:["MINDEXEC_CODEX_LIVE_READONLY_CONFIRM"]},{label:"Codex live temp-write provider smoke",command:"npm run verify:codemaster-codex-live-temp-write-smoke",mode:"opt-in-live-proof",liveCall:!0,hostAffecting:!1,defaultGate:!1,requiredInputs:["MINDEXEC_CODEX_LIVE_TEMP_WRITE_CONFIRM"]},{label:"Codex live project-write provider smoke",command:"npm run verify:codemaster-codex-live-project-write-smoke",mode:"opt-in-live-proof",liveCall:!0,hostAffecting:!1,defaultGate:!1,requiredInputs:["MINDEXEC_CODEX_LIVE_PROJECT_WRITE_CONFIRM"]},{label:"CodeMaster cloud execution adapter proof",command:"npm run verify:codemaster-cloud-execution-adapter-proof",mode:"opt-in-proof-file",liveCall:!1,hostAffecting:!1,defaultGate:!1,requiredInputs:["MINDEXEC_CODEMASTER_CLOUD_EXECUTION_PROOF_JSON"]},{label:"Concept embedding live provider smoke",command:"npm run verify:concept-embedding-live-smoke",mode:"opt-in-live-proof",liveCall:!0,hostAffecting:!1,defaultGate:!1,requiredInputs:["MINDEXEC_CONCEPT_EMBED_LIVE_CONFIRM","MINDEXEC_CONCEPT_EMBED_API_KEY"]}]},{id:"mindcanvas-ai-media-provider",label:"MindCanvas AI media provider closure",uiLabel:"MindCanvas AI media provider",state:"blocked-provider-proof",requiredProof:["Provider-backed image generation proof from the MindCanvas node workflow","Provider-backed video generation proof from the MindCanvas node workflow","No raw provider secrets appear in browser storage, docs, logs, or release artifacts"],uiProof:"Image and video generation need sanitized provider proof from the node workflow.",requiredInputs:["MINDEXEC_MEDIA_PROVIDER_LIVE_CONFIRM","MINDEXEC_MEDIA_PROVIDER_PROOF_JSON"],uiCommand:"npm run verify:mindcanvas-media-provider-proof",proofCommands:[{label:"MindCanvas AI media provider proof",command:"npm run verify:mindcanvas-media-provider-proof",mode:"opt-in-proof-file",liveCall:!1,hostAffecting:!1,defaultGate:!1,requiredInputs:["MINDEXEC_MEDIA_PROVIDER_LIVE_CONFIRM","MINDEXEC_MEDIA_PROVIDER_PROOF_JSON"]}]},{id:"remote-fast-os-input",label:"RemoteFast opt-in OS-input smoke",uiLabel:"RemoteFast host OS input",state:"blocked-operator-confirmation",requiredProof:["Bounded pointer/key smoke against the host with cursor restore evidence"],uiProof:"Pointer/key smoke affects the host and must stay explicitly confirmed.",requiredInputs:["MINDEXEC_REMOTE_FAST_OS_INPUT_CONFIRM"],uiCommand:"npm run verify:remote-monitor-remote-fast-os-input-smoke",proofCommands:[{label:"RemoteFast bounded host OS-input smoke",command:"npm run verify:remote-monitor-remote-fast-os-input-smoke",mode:"opt-in-host-proof",liveCall:!1,hostAffecting:!0,defaultGate:!1,requiredInputs:["MINDEXEC_REMOTE_FAST_OS_INPUT_CONFIRM"]}]},{id:"release-approval",label:"Cloudflare/npm release approval",uiLabel:"Cloudflare/npm approval",state:"hold-release",requiredProof:["Green local gates after live proofs","Reviewed release notes","Explicit user approval before Cloudflare deploy or npm publish","Original `ref/~MindExec` launch proof manifest parity reviewed before release approval"],uiProof:"Deploy and npm publish require a reviewed proof packet and explicit user approval.",requiredInputs:["manual user approval"],uiCommand:"npm run verify:release-proof-packet",proofCommands:[{label:"Cloudflare Pages release pass",command:"manual-release-pass:cloudflare-pages",mode:"manual-release-approval",liveCall:!0,hostAffecting:!1,defaultGate:!1,requiredInputs:["manual user approval"]},{label:"npm package release pass",command:"manual-release-pass:npm-package",mode:"manual-release-approval",liveCall:!0,hostAffecting:!1,defaultGate:!1,requiredInputs:["manual user approval"]}]}],H={releaseReady:Le,releasePosture:Me,blockers:Te},ne="admin-dashboard-data";function v(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}function D(t){return Array.isArray(t)?t:[]}function f(t,a=""){return typeof t=="string"&&t.trim()?t.trim():a}function F(t,a=0){const r=typeof t=="number"?t:Number(t);return Number.isFinite(r)?r:a}function T(t,a=0){return Math.round(F(t,a))}function u(t){return T(t).toLocaleString()}function j(t){return`$${F(t).toLocaleString(void 0,{minimumFractionDigits:2,maximumFractionDigits:2})}`}function L(t){return`${F(t).toFixed(1)}%`}function V(t){return`${u(t)}P`}function se(t){const a=f(t);if(!a)return"--/--";const r=new Date(a);return Number.isNaN(r.getTime())?a.slice(0,5):`${String(r.getUTCMonth()+1).padStart(2,"0")}/${String(r.getUTCDate()).padStart(2,"0")}`}function Ue(t){const a=f(t).toLowerCase();if(/(failed|error|suspended|revoked|high|danger|blocked)/.test(a))return"danger";if(/(pending|review|grace|warn|manual|locked)/.test(a))return"warn";if(/(active|ok|processed|healthy|paid|closed|enforced)/.test(a))return"ok"}function _(t,a,r="-"){for(const n of a){const s=t[n];if(s!=null&&String(s).trim())return String(s)}return r}function Y(t,a){return t.map(r=>{const n=v(r),s=a.find(c=>n[c]!==void 0)??a[0];return{label:se(n.date??n.day??n.created_at),value:Math.max(0,F(n[s]))}})}function Fe(t){const a=v(t),r=v(a.launch_overview),n=v(a.billing_control),s=v(a.credit_totals),c=v(a.refund_rate),h=Y(D(a.daily_signups),["count","signup_count"]),l=Y(D(a.daily_revenue),["revenue","amount"]),y=D(a.referrers).map(b=>{const i=v(b);return[_(i,["referrer"],"direct"),u(i.visit_count??i.count)]}),O=D(a.countries).map(b=>{const i=v(b);return[_(i,["country"],"--"),u(i.visit_count??i.count),u(i.unique_users)]}),A=D(a.heavy_users).map(b=>{const i=v(b);return[_(i,["email","user_email","display_name"],"unknown"),`${u(i.boards_count??i.board_count)} boards`]}),C=D(a.entitlements).map(b=>{const i=v(b);return[_(i,["email","user_email"],"unknown"),_(i,["plan_key","plan","normalized_plan_key"],"free"),_(i,["status","entitlement_status"],"active"),_(i,["ends_at","current_period_end","renews_at"],"-")]}),I=D(a.refunds).map(b=>{const i=v(b);return[_(i,["email","user_email"],"unknown"),j(i.amount),_(i,["risk","revocation_status"],"review"),_(i,["review_status","status"],"open")]}),P=D(a.credit_ledger).map(b=>{const i=v(b);return[se(i.created_at),_(i,["email","user_email","reason"],"unknown"),V(i.delta??i.amount??i.credit_delta),_(i,["reason","event_type","source"],"-")]}),N=D(a.feature_limits).map(b=>{const i=v(b);return[_(i,["feature","feature_key"],"Feature"),_(i,["free_limit","free"],"-"),_(i,["pro_limit","pro","limit_value"],"-"),_(i,["status","entitlement_status"],"enforced")]}),R=D(a.user_funnel).map(b=>{const i=v(b);return{label:_(i,["stage","label"],"Stage"),count:T(i.count??i.user_count),rate:F(i.rate??i.conversion_rate)}});return{source:"supabase-admin-dashboard-data",fetchedAt:f(a.fetched_at,new Date().toISOString()),billingMode:f(r.billing_mode??n.billing_mode,"DODO_LIVE"),currency:f(r.currency_code??n.currency_code,"USD"),usdPerPoint:f(r.usd_per_point,"0.0002"),overviewKpis:[{label:"DAU",value:u(r.dau),tone:"ok"},{label:"WAU",value:u(r.wau),tone:"ok"},{label:"Activation",value:L(r.activation_rate),tone:"ok"},{label:"AI usage",value:L(r.ai_usage_rate),tone:"ok"},{label:"Paid conversion",value:L(r.paid_conversion_rate),tone:"warn"},{label:"D1 retention",value:L(r.d1_retention_rate),tone:"warn"},{label:"D7 retention",value:L(r.d7_retention_rate),tone:"warn"},{label:"Avg points / user",value:V(r.avg_points_spent_per_user)},{label:"AI cost estimate",value:j(r.ai_cost_estimate_usd)},{label:"Gross margin estimate",value:j(r.gross_margin_estimate_usd),tone:"ok"}],billingKpis:[{label:"Billing mode",value:f(n.billing_mode??r.billing_mode,"DODO_LIVE"),tone:"ok"},{label:"Webhook received 24h",value:u(n.webhook_received_24h??r.webhook_received_24h),tone:"ok"},{label:"Webhook failed 24h",value:u(n.webhook_failures_24h??r.webhook_failures_24h),tone:"warn"},{label:"Pending events",value:u(n.pending_events),tone:"warn"},{label:"Active Pro users",value:u(n.pro_active_users??n.active_entitlements),tone:"ok"},{label:"Manual reviews",value:u(n.manual_reviews),tone:"warn"},{label:"Locked boards",value:u(n.locked_boards),tone:"warn"},{label:"Create blocked today",value:u(n.create_blocked_today)}],operatingHealth:[{label:"Signups today",value:u(r.signups_today),tone:"ok"},{label:"Active users today",value:u(r.active_users_today),tone:"ok"},{label:"Points spent users",value:u(r.points_spent_users)},{label:"AI failures 24h",value:u(r.ai_failures_24h),tone:Ue(r.ai_failures_24h)??"warn"},{label:"Save failures 24h",value:u(r.save_failures_24h),tone:"ok"},{label:"Webhook failures 24h",value:u(r.webhook_failures_24h),tone:"warn"}],revenueBand:[{label:"Revenue today",value:j(r.revenue_today),tone:"ok"},{label:"7 day revenue",value:j(r.revenue_7_days),tone:"ok"},{label:"30 day revenue",value:j(r.revenue_30_days)},{label:"Total revenue",value:j(r.total_revenue)},{label:"Paid users",value:u(r.paid_users)},{label:"Wallet liability",value:V(r.total_credit_balance??s.total_credit_balance),tone:"warn"}],signupTrend:h,revenueTrend:l,referrerRows:y,countryRows:O,heavyUserRows:A,entitlementRows:C,webhookRows:[["24h received","payment/provider","processed",u(n.webhook_received_24h??r.webhook_received_24h)],["24h failed","payment/provider","manual-review",u(n.webhook_failures_24h??r.webhook_failures_24h)],["Refund rate","refunds","watch",L(c.refund_rate??c.rate)]],refundRows:I,creditRows:P,featureLimitRows:N,funnelRows:R,auditRows:[]}}async function W(t){var y,O,A,C;const a=te(t);if(!a.adminData.canAttempt)throw d.emit("adminDashboard.provider.skipped",{mode:a.adminData.mode}),new Error(`Secure admin data adapter is not ready: ${a.adminData.mode}`);const r=re(t);if(!r)throw d.emit("adminDashboard.provider.skipped",{mode:"config-missing"}),new Error("Supabase browser client is not available for admin data.");const{data:n,error:s}=await r.auth.getSession();if(s||!((y=n.session)!=null&&y.access_token))throw d.emit("adminDashboard.provider.sessionMissing",{message:(s==null?void 0:s.message)??"missing-session"}),new Error("Secure admin data requires a Supabase-authenticated session.");const{data:c,error:h}=await r.auth.getUser(),l=(O=c.user)==null?void 0:O.id;if(h||!l)throw d.emit("adminDashboard.provider.sessionMissing",{message:(h==null?void 0:h.message)??"missing-user"}),new Error("Secure admin data requires a verified Supabase user.");return{config:a,accessToken:n.session.access_token,userId:l,email:((C=(A=c.user)==null?void 0:A.email)==null?void 0:C.toLowerCase())??""}}async function X(t,a){await W(t);const r=re(t);if(!r)throw new Error("Supabase browser client is not available for admin data.");const{data:n,error:s}=await r.functions.invoke(ne,{body:a});if(s)throw d.emit("adminDashboard.provider.failed",{operation:f(a.action,"summary"),message:s.message}),s;if(n!=null&&n.error){const c=f(n.message??n.error,"admin-dashboard-data failed");throw d.emit("adminDashboard.provider.failed",{operation:f(a.action,"summary"),message:c}),new Error(c)}return n??{}}async function Be(t){d.emit("adminDashboard.provider.summary.requested",{functionName:ne});const a=await X(t,{action:"summary"}),r=Fe(a.summary);return d.emit("adminDashboard.provider.summary.loaded",{source:r.source,overviewMetrics:r.overviewKpis.length,signupPoints:r.signupTrend.length}),r}async function Xe(t,a){if(d.emit("adminDashboard.provider.userSearch.requested",{hasQuery:!!a.trim()}),!a.trim())return null;const r=await X(t,{action:"user-search",query:a}),n=v(r.user);if(!Object.keys(n).length)return d.emit("adminDashboard.provider.userSearch.loaded",{found:!1}),null;const s=v(n.profile),c=v(n.board_stats),h=v(n.activity),l=D(n.timeline),y={email:f(s.email,"unknown"),plan:f(s.plan_type,"Free"),boards:T(c.boards_count??c.board_count),points:T(s.credits_balance??h.credit_balance??h.points_balance),country:f(s.country,"--"),lastSeen:f(s.last_seen_at,f(s.created_at,"unknown")),timelineCount:l.length};return d.emit("adminDashboard.provider.userSearch.loaded",{found:!0,boards:y.boards}),y}async function Ve(t,a,r){const n=await W(t);d.emit("adminDashboard.provider.settings.requested",{priceStage:a,ltdLimit:r});const s=await X(t,{action:"save-settings",price_stage:a,ltd_limit:r}),c={mode:n.config.adminData.mode,canAttempt:!0,priceStage:f(s.price_stage,a),ltdLimit:T(s.ltd_limit,r),updatedAt:f(s.updated_at,new Date().toISOString())};return d.emit("adminDashboard.provider.settings.saved",{priceStage:c.priceStage,ltdLimit:c.ltdLimit}),c}async function qe(t,a){const r=await W(t);d.emit("adminDashboard.provider.emergencyClose.requested",{ltdLimit:a});const n=await X(t,{action:"emergency-close",price_stage:"CLOSED",ltd_limit:a}),s={mode:r.config.adminData.mode,canAttempt:!0,priceStage:f(n.price_stage,"CLOSED"),ltdLimit:T(n.ltd_limit,a),updatedAt:f(n.updated_at,new Date().toISOString())};return d.emit("adminDashboard.provider.emergencyClose.staged",{priceStage:s.priceStage,ltdLimit:s.ltdLimit}),s}const K="mindexec.react.admin.dashboard.v1",$e=["STANDARD","EARLY","LTD","CLOSED"],k={priceStage:"EARLY",ltdLimit:100,lastAction:"Admin dashboard restored as a local React shell.",updatedAtUtc:""};function Ge(){return te(U())}const He=[{key:"overview",label:"Overview",icon:Se},{key:"billing",label:"Billing Control",icon:De},{key:"entitlements",label:"Entitlements",icon:ye},{key:"dodo",label:"Dodo Events",icon:we},{key:"refunds",label:"Refunds",icon:xe},{key:"credits",label:"Credits",icon:Ae},{key:"limits",label:"Feature Limits",icon:Ce},{key:"funnel",label:"User Funnel",icon:Ie},{key:"explorer",label:"User Explorer",icon:Ne},{key:"release",label:"Release Readiness",icon:Re},{key:"audit",label:"Audit Log",icon:je}],We=[{label:"06/08",value:2},{label:"06/09",value:4},{label:"06/10",value:5},{label:"06/11",value:8},{label:"06/12",value:7},{label:"06/13",value:13},{label:"06/14",value:11},{label:"06/15",value:16},{label:"06/16",value:19},{label:"06/17",value:18},{label:"06/18",value:23},{label:"06/19",value:26},{label:"06/20",value:31},{label:"06/21",value:34}],Ke=[{label:"06/08",value:0},{label:"06/09",value:12},{label:"06/10",value:18},{label:"06/11",value:12},{label:"06/12",value:29},{label:"06/13",value:41},{label:"06/14",value:38},{label:"06/15",value:49},{label:"06/16",value:64},{label:"06/17",value:72},{label:"06/18",value:81},{label:"06/19",value:94},{label:"06/20",value:108},{label:"06/21",value:124}],G=[{email:"maya@buildloop.ai",plan:"Pro",boards:18,points:1240,country:"US",lastSeen:"today"},{email:"kenji@solo-studio.jp",plan:"Early",boards:9,points:640,country:"JP",lastSeen:"today"},{email:"linh@vietlaunch.dev",plan:"Free",boards:5,points:120,country:"VN",lastSeen:"yesterday"},{email:"alex@indieops.co",plan:"LTD",boards:32,points:2840,country:"SG",lastSeen:"2d ago"}],Je=[{label:"DAU",value:"128",tone:"ok"},{label:"WAU",value:"614",tone:"ok"},{label:"Activation",value:"41.8%",tone:"ok"},{label:"AI usage",value:"63.2%",tone:"ok"},{label:"Paid conversion",value:"4.6%",tone:"warn"},{label:"D1 retention",value:"38.1%",tone:"warn"},{label:"D7 retention",value:"22.7%",tone:"warn"},{label:"Avg points / user",value:"318P"},{label:"AI cost estimate",value:"$74.82"},{label:"Gross margin estimate",value:"$418.10",tone:"ok"}],ze=[{label:"Billing mode",value:"DODO_LIVE_GATED",tone:"warn"},{label:"Webhook received 24h",value:"19",tone:"ok"},{label:"Webhook failed 24h",value:"1",tone:"warn"},{label:"Pending events",value:"3",tone:"warn"},{label:"Active Pro users",value:"28",tone:"ok"},{label:"Manual reviews",value:"2",tone:"warn"},{label:"Locked boards",value:"6",tone:"warn"},{label:"Create blocked today",value:"14"}],ie=[["06/21 18:41","admin@mindexec.local","Changed price stage draft to EARLY"],["06/21 16:10","system","Dodo webhook replay queued"],["06/20 23:55","admin@mindexec.local","Raised LTD capacity review flag"],["06/20 19:20","system","Credit ledger reconciliation completed"]],Ye=[["evt_4912","payment.succeeded","processed","$12.00 USD"],["evt_4911","subscription.created","processed","Pro monthly"],["evt_4910","payment.failed","manual-review","$12.00 USD"],["evt_4909","refund.requested","pending","$24.00 USD"]],Qe=[{label:"Visitor",count:1280,rate:100},{label:"Signup",count:214,rate:16.7},{label:"First board",count:132,rate:61.7},{label:"AI run",count:83,rate:62.8},{label:"Pricing visit",count:44,rate:53},{label:"Paid",count:11,rate:25}],Q=String(H.releaseReady),q=H.releasePosture,Ze=H.blockers.map(t=>{var a;return{id:t.id,label:t.uiLabel||t.label,state:t.state,proof:t.uiProof||t.requiredProof.join(" "),command:t.uiCommand||((a=t.proofCommands[0])==null?void 0:a.command)||"npm run verify:release-blocker-preflight",proofCommands:t.proofCommands.map(r=>({label:r.label,command:r.command,mode:r.mode,liveCall:r.liveCall,hostAffecting:r.hostAffecting,defaultGate:r.defaultGate,requiredInputs:r.requiredInputs}))}}),ea={source:"local",fetchedAt:"",billingMode:"DODO_LIVE_GATED",currency:"USD",usdPerPoint:"0.0002",overviewKpis:Je,billingKpis:ze,operatingHealth:[{label:"Signups today",value:"34",tone:"ok"},{label:"Active users today",value:"128",tone:"ok"},{label:"Points spent users",value:"77"},{label:"AI failures 24h",value:"2",tone:"warn"},{label:"Save failures 24h",value:"0",tone:"ok"},{label:"Webhook failures 24h",value:"1",tone:"warn"}],revenueBand:[{label:"Revenue today",value:"$124.00",tone:"ok"},{label:"7 day revenue",value:"$530.00",tone:"ok"},{label:"30 day revenue",value:"$1,870.00"},{label:"Total revenue",value:"$4,418.00"},{label:"Paid users",value:"28"},{label:"Wallet liability",value:"184,200P",tone:"warn"}],signupTrend:We,revenueTrend:Ke,referrerRows:[["direct","312"],["x.com","128"],["reddit","84"],["youtube","62"]],countryRows:[["US","41%"],["JP","18%"],["SG","11%"],["VN","8%"]],heavyUserRows:G.slice(0,4).map(t=>[t.email.split("@")[0],`${t.boards} boards`]),entitlementRows:G.map(t=>[t.email,t.plan,t.plan==="Free"?"free":"active",t.plan==="Free"?"-":"2026-07-21"]),webhookRows:Ye,refundRows:[["maya@buildloop.ai","$12.00","low","closed"],["alex@indieops.co","$24.00","medium","open"],["unknown@blocked.test","$12.00","high","manual review"]],creditRows:[["18:41","maya@buildloop.ai","+1000P","monthly grant"],["18:20","kenji@solo-studio.jp","-120P","AI task"],["17:52","alex@indieops.co","-280P","image generation"]],featureLimitRows:[["Cloud boards","3","Unlimited","enforced"],["AI runs / month","20","1000","enforced"],["Image uploads","100MB","10GB","watching"],["Private boards","0","Unlimited","enforced"]],funnelRows:Qe,auditRows:ie};function aa(t,a){const r=Math.max(...a.map(n=>n.value),1);return Math.max(8,Math.round(t/r*100))}function ta(t){return t?`admin-kpi-card--${t}`:""}function $(t){return t.map(a=>({label:a[0]??"-",value:a[1]??"-"}))}function ra(t){return"timelineCount"in t?t.timelineCount:9}function oe(t){const a=typeof t=="number"?t:Number(t);return Number.isFinite(a)?Math.max(0,Math.min(1e4,Math.round(a))):k.ltdLimit}function le(t){if(!t||typeof t!="object")return k;const a=t,r=$e.includes(a.priceStage)?String(a.priceStage):k.priceStage,n=typeof a.lastAction=="string"&&a.lastAction.trim()?a.lastAction.slice(0,240):k.lastAction,s=typeof a.updatedAtUtc=="string"?a.updatedAtUtc:"";return{priceStage:r,ltdLimit:oe(a.ltdLimit),lastAction:n,updatedAtUtc:s}}function na(){if(typeof window>"u")return k;try{const t=window.localStorage.getItem(K),a=t?le(JSON.parse(t)):k;return d.emit("adminDashboard.localDraft.loaded",{source:t?"stored":"default",priceStage:a.priceStage,ltdLimit:a.ltdLimit}),a}catch(t){return d.emit("adminDashboard.localDraft.failed",{operation:"load",message:t instanceof Error?t.message:String(t)}),k}}function Z(t,a){const r=le({...t,updatedAtUtc:new Date().toISOString()});if(typeof window>"u")return r;try{window.localStorage.setItem(K,JSON.stringify(r)),d.emit("adminDashboard.localDraft.saved",{source:a,priceStage:r.priceStage,ltdLimit:r.ltdLimit})}catch(n){d.emit("adminDashboard.localDraft.failed",{operation:"save",source:a,message:n instanceof Error?n.message:String(n)})}return r}function ha(){const[t]=E.useState(na),[a,r]=E.useState("overview"),[n,s]=E.useState(!1),c=E.useMemo(()=>Ge(),[]),h=c.adminData.canAttempt,[l,y]=E.useState(ea),[O,A]=E.useState(null),[C,I]=E.useState(t.priceStage),[P,N]=E.useState(t.ltdLimit),[R,b]=E.useState(""),[i,de]=E.useState(""),[ce,g]=E.useState(t.lastAction),[ue,J]=E.useState(()=>new Date),me=E.useMemo(()=>{if(!i.trim())return null;const o=i.trim().toLowerCase();return G.find(m=>m.email.toLowerCase().includes(o))||null},[i]),w=l.source==="supabase-admin-dashboard-data"?O:me,pe=o=>{r(o),d.emit("adminDashboard.tab",{key:o})},fe=async()=>{if(s(!0),d.emit("adminDashboard.refresh"),h){try{const o=await Be(U());y(o),J(new Date(o.fetchedAt)),g("Secure Supabase admin snapshot refreshed.")}catch(o){const m=o instanceof Error?o.message:String(o);d.emit("adminDashboard.provider.refreshFailed",{message:m}),g(`Secure admin snapshot failed: ${m}. Local snapshot remains visible.`)}finally{s(!1)}return}window.setTimeout(()=>{J(new Date),g("Local admin snapshot refreshed. Wire Supabase read adapters before treating it as live production data."),s(!1)},260)},he=async o=>{o.preventDefault();const m=`Saved local settings draft: ${C}, LTD ${P}.`,p=Z({priceStage:C,ltdLimit:P,lastAction:m},"settings.form");if(d.emit("adminDashboard.settings.saved",{priceStage:p.priceStage,ltdLimit:p.ltdLimit}),I(p.priceStage),N(p.ltdLimit),g(p.lastAction),!!h)try{const S=await Ve(U(),p.priceStage,p.ltdLimit);I(S.priceStage),N(S.ltdLimit),g(`Secure admin settings saved: ${S.priceStage}, LTD ${S.ltdLimit}.`)}catch(S){const z=S instanceof Error?S.message:String(S);d.emit("adminDashboard.provider.settingsFailed",{message:z}),g(`Local settings draft saved, but secure provider save failed: ${z}`)}},ve=async()=>{const m=Z({priceStage:"CLOSED",ltdLimit:P,lastAction:"Emergency close staged locally. Real billing closure requires a secure admin adapter."},"emergency.close");if(d.emit("adminDashboard.emergency.closed",{priceStage:m.priceStage,ltdLimit:m.ltdLimit}),I(m.priceStage),N(m.ltdLimit),g(m.lastAction),!!h)try{const p=await qe(U(),m.ltdLimit);I(p.priceStage),N(p.ltdLimit),g(`Secure emergency close staged through admin provider: ${p.priceStage}, LTD ${p.ltdLimit}.`)}catch(p){const S=p instanceof Error?p.message:String(p);d.emit("adminDashboard.provider.emergencyFailed",{message:S}),g(`Emergency close staged locally, but secure provider close failed: ${S}`)}},be=async o=>{if(o.preventDefault(),de(R),d.emit("adminDashboard.user.search",{hasQuery:!!R.trim()}),!R.trim()){A(null),g("User explorer query cleared.");return}if(!h){g("User explorer searched local sample data.");return}try{const m=await Xe(U(),R);A(m),g(m?"User explorer loaded secure provider data.":"No secure provider user matched that query.")}catch(m){const p=m instanceof Error?m.message:String(m);d.emit("adminDashboard.provider.userSearchFailed",{message:p}),A(null),g(`Secure user explorer failed: ${p}`)}};return e.jsxs("div",{className:"page admin-dashboard-page","data-testid":"admin-dashboard-shell","data-admin-storage-key":K,"data-production-adapter-state":c.overallState,"data-admin-provider-mode":c.adminData.mode,"data-admin-provider-ready":c.adminData.canAttempt?"true":"false","data-client-secret-blocked":c.forbiddenClientSecretKeys.length>0?"true":"false",children:[e.jsxs("section",{className:"admin-hero",children:[e.jsxs("div",{children:[e.jsx("div",{className:"eyebrow",children:"Operations Console"}),e.jsx("h1",{children:"MindExec Admin Dashboard"}),e.jsx("p",{children:"React port of the original admin plugin: revenue, billing control, credits, limits, funnel, user explorer, and audit surfaces without loading the Blazor plugin runtime."})]}),e.jsxs("div",{className:"admin-hero-actions",children:[e.jsx("span",{className:"admin-badge","data-testid":"admin-dashboard-mode",children:h?"supabase-admin-provider":"local-admin-shell"}),e.jsxs("button",{className:"btn btn-secondary",type:"button",onClick:fe,disabled:n,"data-testid":"admin-refresh",children:[n?e.jsx(_e,{size:16,className:"spin-icon"}):e.jsx(ge,{size:16}),"Refresh"]})]})]}),e.jsxs("section",{className:"admin-status-strip","data-testid":"admin-status-strip",children:[e.jsx(B,{label:"Billing mode",value:l.billingMode}),e.jsx(B,{label:"Currency",value:l.currency}),e.jsx(B,{label:"USD / point",value:l.usdPerPoint}),e.jsx(B,{label:"Updated",value:ue.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})})]}),e.jsxs("section",{className:"admin-alert admin-alert--warning",children:[e.jsx(Ee,{size:18}),e.jsxs("div",{children:[e.jsx("strong",{children:h?"Secure admin provider ready":"Local React shell only"}),e.jsx("span",{"data-testid":"admin-last-action",children:ce})]})]}),e.jsx("nav",{className:"admin-tabs","aria-label":"Admin dashboard tabs","data-testid":"admin-tabs",children:He.map(o=>{const m=o.icon;return e.jsxs("button",{className:a===o.key?"is-active":"",type:"button",onClick:()=>pe(o.key),"data-testid":`admin-tab-${o.key}`,"data-admin-tab":o.key,children:[e.jsx(m,{size:16}),e.jsx("span",{children:o.label})]},o.key)})}),a==="overview"&&e.jsxs(e.Fragment,{children:[e.jsx(ee,{metrics:l.overviewKpis}),e.jsxs("section",{className:"admin-panel-grid admin-panel-grid--two",children:[e.jsx(x,{title:"Operating Health",metrics:l.operatingHealth}),e.jsx(x,{title:"Revenue Band",metrics:l.revenueBand})]}),e.jsxs("section",{className:"admin-panel-grid admin-panel-grid--two",children:[e.jsx(ae,{title:"Daily Signups",points:l.signupTrend}),e.jsx(ae,{title:"Daily Revenue",points:l.revenueTrend,money:!0})]}),e.jsxs("section",{className:"admin-panel-grid admin-panel-grid--three",children:[e.jsx(x,{title:"Top Referrers",metrics:$(l.referrerRows),compact:!0}),e.jsx(x,{title:"Countries",metrics:$(l.countryRows),compact:!0}),e.jsx(x,{title:"Heavy Users",metrics:$(l.heavyUserRows),compact:!0})]})]}),a==="billing"&&e.jsxs(e.Fragment,{children:[e.jsx(ee,{metrics:l.billingKpis}),e.jsxs("section",{className:"admin-panel-grid admin-panel-grid--three",children:[e.jsx(x,{title:"Webhook Status",metrics:[{label:"24h received",value:"19",tone:"ok"},{label:"24h failed",value:"1",tone:"warn"},{label:"Pending",value:"3",tone:"warn"},{label:"Last success",value:"18:41"}]}),e.jsx(x,{title:"Entitlement State",metrics:[{label:"Active",value:"28",tone:"ok"},{label:"Grace",value:"3",tone:"warn"},{label:"Suspended",value:"2",tone:"danger"},{label:"Revoked",value:"1"}]}),e.jsxs("form",{className:"admin-panel admin-settings-panel",onSubmit:he,"data-testid":"admin-settings-form",children:[e.jsxs("div",{className:"admin-panel-head",children:[e.jsx("h2",{children:"Price Controls"}),e.jsxs("button",{className:"btn btn-primary",type:"submit","data-testid":"admin-save-settings",children:[e.jsx(ke,{size:15}),"Save draft"]})]}),e.jsxs("label",{children:["Price stage",e.jsxs("select",{value:C,onChange:o=>I(o.target.value),"data-testid":"admin-price-stage",children:[e.jsx("option",{value:"STANDARD",children:"STANDARD"}),e.jsx("option",{value:"EARLY",children:"EARLY"}),e.jsx("option",{value:"LTD",children:"LTD"}),e.jsx("option",{value:"CLOSED",children:"CLOSED"})]})]}),e.jsxs("label",{children:["LTD limit",e.jsx("input",{type:"number",min:"0",value:P,onChange:o=>N(oe(o.target.value)),"data-testid":"admin-ltd-limit"})]}),e.jsxs("button",{className:"btn btn-secondary admin-danger-button",type:"button",onClick:ve,"data-testid":"admin-emergency-close",children:[e.jsx(Oe,{size:15}),"Stage emergency close"]})]})]})]}),a==="entitlements"&&e.jsx(M,{title:"Entitlements",columns:["User","Plan","Status","Renews"],rows:l.entitlementRows}),a==="dodo"&&e.jsx(M,{title:"Dodo Webhook Events",columns:["Event","Type","Status","Amount"],rows:l.webhookRows}),a==="refunds"&&e.jsx(M,{title:"Refund Reviews",columns:["User","Amount","Risk","Status"],rows:[...l.refundRows]}),a==="credits"&&e.jsx(M,{title:"Credit Ledger",columns:["Time","User","Delta","Reason"],rows:l.creditRows}),a==="limits"&&e.jsx(M,{title:"Feature Limits",columns:["Feature","Free","Pro","Status"],rows:l.featureLimitRows}),a==="funnel"&&e.jsx(ia,{rows:l.funnelRows}),a==="explorer"&&e.jsxs("section",{className:"admin-panel",children:[e.jsxs("div",{className:"admin-panel-head",children:[e.jsx("h2",{children:"User Explorer"}),e.jsx("span",{className:"admin-note",children:h?"Secure provider data":"Local sample data"})]}),e.jsxs("form",{className:"admin-search-row",onSubmit:be,"data-testid":"admin-user-search-form",children:[e.jsx("input",{"aria-label":"Search user",value:R,onChange:o=>b(o.target.value),placeholder:"email, domain, or segment","data-testid":"admin-user-query"}),e.jsxs("button",{className:"btn btn-primary",type:"submit","data-testid":"admin-user-search",children:[e.jsx(Pe,{size:15}),"Search"]})]}),i&&!w&&e.jsx("div",{className:"admin-empty","data-testid":"admin-user-empty",children:h?"No secure provider user matched that query.":"No local sample user matched that query."}),w&&e.jsxs("div",{className:"admin-user-card","data-testid":"admin-user-card",children:[e.jsx("strong",{children:w.email}),e.jsxs("span",{children:[w.plan," / ",w.country," / last seen ",w.lastSeen]}),e.jsx(x,{title:"User Snapshot",compact:!0,metrics:[{label:"Boards",value:String(w.boards)},{label:"Points",value:`${w.points}P`},{label:"Timeline",value:`${ra(w)} events`}]})]})]}),a==="release"&&e.jsx(sa,{blockers:Ze}),a==="audit"&&e.jsxs("section",{className:"admin-panel-grid admin-panel-grid--two",children:[e.jsx(oa,{}),e.jsx(M,{title:"Recent Setting Changes",columns:["Time","Admin","Action"],rows:l.auditRows.length?l.auditRows:ie,compact:!0})]})]})}function sa({blockers:t}){return e.jsxs("section",{className:"admin-release-readiness","data-testid":"admin-release-readiness-panel","data-release-ready":Q,"data-release-posture":q,"data-release-blocker-count":t.length,children:[e.jsxs("div",{className:"admin-panel-head",children:[e.jsxs("div",{children:[e.jsx("h2",{children:"Release Readiness"}),e.jsx("p",{className:"admin-release-summary",children:"Local gates are green enough for RC work, but release remains held until live proofs and explicit approval are complete."})]}),e.jsx("span",{className:"admin-badge admin-badge--hold","data-testid":"admin-release-posture",children:q})]}),e.jsxs("div",{className:"admin-release-grid",children:[e.jsx(x,{title:"Local RC State",compact:!0,metrics:[{label:"Release ready",value:Q,tone:"warn"},{label:"Posture",value:q,tone:"warn"},{label:"Blockers",value:String(t.length),tone:"warn"},{label:"Default deploy/publish",value:"blocked",tone:"ok"}]}),e.jsxs("article",{className:"admin-panel admin-panel--compact",children:[e.jsx("div",{className:"admin-panel-head",children:e.jsx("h2",{children:"Proof Packet"})}),e.jsxs("div",{className:"admin-release-command-list",children:[e.jsx("code",{children:"npm run verify:release-blocker-preflight"}),e.jsx("code",{children:"npm run verify:release-proof-packet"}),e.jsx("code",{children:"npm run check"}),e.jsx("code",{children:"npm run build"})]})]})]}),e.jsx("div",{className:"admin-release-blocker-list","data-testid":"admin-release-blocker-list",children:t.map(a=>e.jsxs("article",{className:"admin-release-blocker","data-testid":"admin-release-blocker","data-release-blocker-id":a.id,"data-release-blocker-state":a.state,children:[e.jsxs("div",{children:[e.jsx("strong",{children:a.label}),e.jsx("span",{children:a.proof})]}),e.jsxs("div",{children:[e.jsx("span",{className:"admin-release-state",children:a.state}),e.jsx("code",{children:a.command})]}),e.jsx("div",{className:"admin-release-proof-command-list","data-testid":"admin-release-proof-command-list","data-release-blocker-id":a.id,"data-release-proof-command-count":a.proofCommands.length,children:a.proofCommands.map(r=>e.jsxs("div",{className:"admin-release-proof-command","data-testid":"admin-release-proof-command","data-release-proof-command-mode":r.mode,"data-release-proof-command-live-call":String(r.liveCall),"data-release-proof-command-host-affecting":String(r.hostAffecting),"data-release-proof-command-default-gate":String(r.defaultGate),children:[e.jsx("span",{children:r.label}),e.jsx("code",{children:r.command}),e.jsxs("div",{className:"admin-release-proof-command__badges",children:[e.jsx("span",{children:r.mode}),e.jsx("span",{children:r.liveCall?"live":"local"}),e.jsx("span",{children:r.hostAffecting?"host-affecting":"host-safe"}),e.jsx("span",{children:r.defaultGate?"default-gate":"manual-only"})]})]},`${a.id}:${r.command}`))})]},a.id))})]})}function B({label:t,value:a}){return e.jsxs("div",{className:"admin-status-pill",children:[e.jsx("span",{children:t}),e.jsx("strong",{children:a})]})}function ee({metrics:t}){return e.jsx("section",{className:"admin-kpi-grid",children:t.map(a=>e.jsxs("article",{className:`admin-kpi-card ${ta(a.tone)}`,children:[e.jsx("span",{children:a.label}),e.jsx("strong",{children:a.value})]},a.label))})}function x({title:t,metrics:a,compact:r}){return e.jsxs("article",{className:`admin-panel ${r?"admin-panel--compact":""}`,children:[e.jsx("div",{className:"admin-panel-head",children:e.jsx("h2",{children:t})}),e.jsx("div",{className:"admin-metric-list",children:a.map(n=>e.jsxs("div",{className:`admin-metric-row ${n.tone?`admin-metric-row--${n.tone}`:""}`,children:[e.jsx("span",{children:n.label}),e.jsx("strong",{children:n.value})]},n.label))})]})}function ae({title:t,points:a,money:r}){return e.jsxs("article",{className:"admin-panel",children:[e.jsxs("div",{className:"admin-panel-head",children:[e.jsx("h2",{children:t}),e.jsx("span",{className:"admin-note",children:"Last 14 days"})]}),e.jsx("div",{className:"admin-mini-chart",children:a.map(n=>e.jsxs("div",{className:"admin-bar-item",children:[e.jsx("div",{className:"admin-bar",style:{height:`${aa(n.value,a)}%`}}),e.jsx("span",{children:n.label.slice(3)}),e.jsx("b",{children:r?`$${n.value}`:n.value})]},n.label))})]})}function M({title:t,columns:a,rows:r,compact:n}){return e.jsxs("section",{className:`admin-panel ${n?"admin-panel--compact":""}`,children:[e.jsx("div",{className:"admin-panel-head",children:e.jsx("h2",{children:t})}),e.jsx("div",{className:"admin-table-wrap",children:e.jsxs("table",{className:"admin-table",children:[e.jsx("thead",{children:e.jsx("tr",{children:a.map(s=>e.jsx("th",{children:s},s))})}),e.jsx("tbody",{children:r.map(s=>e.jsx("tr",{children:s.map(c=>e.jsx("td",{children:c},c))},s.join("|")))})]})})]})}function ia({rows:t}){return e.jsxs("section",{className:"admin-panel",children:[e.jsxs("div",{className:"admin-panel-head",children:[e.jsx("h2",{children:"User Funnel"}),e.jsx("span",{className:"admin-note",children:"30 day sample"})]}),e.jsx("div",{className:"admin-funnel-list",children:t.map(a=>e.jsxs("div",{className:"admin-funnel-row",children:[e.jsxs("div",{children:[e.jsx("strong",{children:a.label}),e.jsxs("span",{children:[a.count.toLocaleString()," users / ",a.rate,"%"]})]}),e.jsx("div",{className:"admin-progress-track",children:e.jsx("div",{className:"admin-progress-fill",style:{width:`${Math.min(100,a.rate)}%`}})})]},a.label))})]})}function oa(){const t=[["Paid users",28,100],["D7 retention",22,35],["AI failure rate",2,1]];return e.jsxs("article",{className:"admin-panel",children:[e.jsx("div",{className:"admin-panel-head",children:e.jsx("h2",{children:"Goal Progress"})}),e.jsx("div",{className:"admin-funnel-list",children:t.map(([a,r,n])=>{const s=a==="AI failure rate"?Math.max(8,100-Math.min(100,r/10*100)):Math.min(100,r/n*100);return e.jsxs("div",{className:"admin-funnel-row",children:[e.jsxs("div",{children:[e.jsx("strong",{children:a}),e.jsxs("span",{children:[r," / ",n]})]}),e.jsx("div",{className:"admin-progress-track",children:e.jsx("div",{className:"admin-progress-fill",style:{width:`${s}%`}})})]},a)})})]})}export{ha as AdminDashboardPage};
|
|
1
|
+
import{r as E,j as e}from"./vendor-react-BXzpOyCS.js";import{a as U}from"./index-D8RqkCyH.js";import{r as te}from"./productionAdapterConfig-C5jfk6oG.js";import{R as d}from"./app-runtime-xD2Z3NdN.js";import{getSupabaseBrowserClient as re}from"./supabaseAuthAdapter-BBfom_he.js";import{an as _e,R as ge,D as Ee,b0 as Se,aQ as De,b1 as ye,P as we,aH as xe,b2 as Ae,j as Ce,q as Ie,W as Ne,b3 as Re,c as je,b4 as ke,e as Oe,aA as Pe}from"./vendor-icons-DE3gIReG.js";import"./canvas-runtime-qWnXqOnu.js";const Le=!1,Me="hold-release",Te=[{id:"cloud-auth-billing",label:"Secure cloud/auth/billing adapter closure",uiLabel:"Cloud/auth/billing adapter",state:"blocked-live-proof",requiredProof:["Dodo checkout live smoke with fresh Supabase session","Supabase provider read-only smoke with fresh session","Supabase provider write/admin mutation smoke with explicit admin values","Original launch proof supabaseLeakedPasswordProtection remains required as artifact-backed security proof","Original launch proof bolaIdorNegativeGate remains required as artifact-backed 20-user authorization proof","Original launch proof activeEditorHttpGate remains required as artifact-backed active editor load proof","Original launch proof dodoSignedSmoke remains required as signed webhook proof","Original launch proof dodoCheckoutDisabled remains required as fail-closed checkout proof","Original launch proof dodoSandboxWebhook remains required as real sandbox webhook proof","Original launch proof deploymentHardening.webCaptureWorkerSsrfRedirectGuard remains required as capture hardening proof","Original launch proof deploymentHardening.uploadFileSizeValidation remains required as upload hardening proof","Original launch proof deploymentHardening.dodoWebhookReplayGuard remains required as webhook replay hardening proof"],uiProof:"Dodo checkout, Supabase read-only, cloud write, and admin mutation proof need fresh provider inputs.",requiredInputs:["VITE_MINDEXEC_SUPABASE_URL","VITE_MINDEXEC_SUPABASE_PUBLISHABLE_KEY","VITE_MINDEXEC_DODO_CHECKOUT_FUNCTION_URL","MINDEXEC_SUPABASE_PROVIDER_SESSION_JSON","MINDEXEC_DODO_CHECKOUT_LIVE_CONFIRM","MINDEXEC_SUPABASE_PROVIDER_LIVE_CONFIRM","MINDEXEC_SUPABASE_PROVIDER_WRITE_CONFIRM","MINDEXEC_SUPABASE_PROVIDER_ADMIN_MUTATION_CONFIRM","MINDEXEC_SUPABASE_PROVIDER_ADMIN_PRICE_STAGE","MINDEXEC_SUPABASE_PROVIDER_ADMIN_LTD_LIMIT","MINDEXEC_ORIGINAL_LAUNCH_PROOF_JSON"],uiCommand:"npm run verify:release-blocker-preflight",proofCommands:[{label:"Dodo checkout live smoke",command:"npm run verify:dodo-checkout-live-smoke",mode:"opt-in-live-proof",liveCall:!0,hostAffecting:!1,defaultGate:!1,requiredInputs:["VITE_MINDEXEC_SUPABASE_URL","VITE_MINDEXEC_SUPABASE_PUBLISHABLE_KEY","VITE_MINDEXEC_DODO_CHECKOUT_FUNCTION_URL","MINDEXEC_SUPABASE_PROVIDER_SESSION_JSON","MINDEXEC_DODO_CHECKOUT_LIVE_CONFIRM"]},{label:"Supabase provider read-only smoke",command:"npm run verify:supabase-provider-live-smoke",mode:"opt-in-live-proof",liveCall:!0,hostAffecting:!1,defaultGate:!1,requiredInputs:["VITE_MINDEXEC_SUPABASE_URL","VITE_MINDEXEC_SUPABASE_PUBLISHABLE_KEY","MINDEXEC_SUPABASE_PROVIDER_SESSION_JSON","MINDEXEC_SUPABASE_PROVIDER_LIVE_CONFIRM"]},{label:"Supabase provider write/admin mutation smoke",command:"npm run verify:supabase-provider-write-smoke",mode:"opt-in-live-proof",liveCall:!0,hostAffecting:!1,defaultGate:!1,requiredInputs:["VITE_MINDEXEC_SUPABASE_URL","VITE_MINDEXEC_SUPABASE_PUBLISHABLE_KEY","MINDEXEC_SUPABASE_PROVIDER_SESSION_JSON","MINDEXEC_SUPABASE_PROVIDER_WRITE_CONFIRM","MINDEXEC_SUPABASE_PROVIDER_ADMIN_MUTATION_CONFIRM","MINDEXEC_SUPABASE_PROVIDER_ADMIN_PRICE_STAGE","MINDEXEC_SUPABASE_PROVIDER_ADMIN_LTD_LIMIT"]},{label:"Original launch proof artifacts",command:"npm run verify:original-launch-proof-artifacts",mode:"opt-in-proof-file",liveCall:!1,hostAffecting:!1,defaultGate:!1,requiredInputs:["MINDEXEC_ORIGINAL_LAUNCH_PROOF_JSON"]}]},{id:"agent-webresearch-codemaster",label:"Agent execution and WebResearch adapter closure",uiLabel:"Agent and CodeMaster provider depth",state:"blocked-provider-depth",requiredProof:["Real provider-backed diff/apply proof stays bounded to disposable workspace evidence","Cloud execution adapter proof avoids deploy, publish, billing, and unsafe file mutations","Concept embedding live proof keeps the provider API key server-side and opt-in only"],uiProof:"Live provider diff/apply and cloud execution proof remain opt-in and bounded.",requiredInputs:["MINDEXEC_CODEX_LIVE_READONLY_CONFIRM","MINDEXEC_CODEX_LIVE_TEMP_WRITE_CONFIRM","MINDEXEC_CODEX_LIVE_PROJECT_WRITE_CONFIRM","MINDEXEC_CODEMASTER_CLOUD_EXECUTION_PROOF_JSON","MINDEXEC_CONCEPT_EMBED_LIVE_CONFIRM","MINDEXEC_CONCEPT_EMBED_API_KEY"],uiCommand:"npm run verify:codemaster-codex-live-project-write-smoke",proofCommands:[{label:"Codex live read-only provider smoke",command:"npm run verify:codemaster-codex-live-readonly-smoke",mode:"opt-in-live-proof",liveCall:!0,hostAffecting:!1,defaultGate:!1,requiredInputs:["MINDEXEC_CODEX_LIVE_READONLY_CONFIRM"]},{label:"Codex live temp-write provider smoke",command:"npm run verify:codemaster-codex-live-temp-write-smoke",mode:"opt-in-live-proof",liveCall:!0,hostAffecting:!1,defaultGate:!1,requiredInputs:["MINDEXEC_CODEX_LIVE_TEMP_WRITE_CONFIRM"]},{label:"Codex live project-write provider smoke",command:"npm run verify:codemaster-codex-live-project-write-smoke",mode:"opt-in-live-proof",liveCall:!0,hostAffecting:!1,defaultGate:!1,requiredInputs:["MINDEXEC_CODEX_LIVE_PROJECT_WRITE_CONFIRM"]},{label:"CodeMaster cloud execution adapter proof",command:"npm run verify:codemaster-cloud-execution-adapter-proof",mode:"opt-in-proof-file",liveCall:!1,hostAffecting:!1,defaultGate:!1,requiredInputs:["MINDEXEC_CODEMASTER_CLOUD_EXECUTION_PROOF_JSON"]},{label:"Concept embedding live provider smoke",command:"npm run verify:concept-embedding-live-smoke",mode:"opt-in-live-proof",liveCall:!0,hostAffecting:!1,defaultGate:!1,requiredInputs:["MINDEXEC_CONCEPT_EMBED_LIVE_CONFIRM","MINDEXEC_CONCEPT_EMBED_API_KEY"]}]},{id:"mindcanvas-ai-media-provider",label:"MindCanvas AI media provider closure",uiLabel:"MindCanvas AI media provider",state:"blocked-provider-proof",requiredProof:["Provider-backed image generation proof from the MindCanvas node workflow","Provider-backed video generation proof from the MindCanvas node workflow","No raw provider secrets appear in browser storage, docs, logs, or release artifacts"],uiProof:"Image and video generation need sanitized provider proof from the node workflow.",requiredInputs:["MINDEXEC_MEDIA_PROVIDER_LIVE_CONFIRM","MINDEXEC_MEDIA_PROVIDER_PROOF_JSON"],uiCommand:"npm run verify:mindcanvas-media-provider-proof",proofCommands:[{label:"MindCanvas AI media provider proof",command:"npm run verify:mindcanvas-media-provider-proof",mode:"opt-in-proof-file",liveCall:!1,hostAffecting:!1,defaultGate:!1,requiredInputs:["MINDEXEC_MEDIA_PROVIDER_LIVE_CONFIRM","MINDEXEC_MEDIA_PROVIDER_PROOF_JSON"]}]},{id:"remote-fast-os-input",label:"RemoteFast opt-in OS-input smoke",uiLabel:"RemoteFast host OS input",state:"blocked-operator-confirmation",requiredProof:["Bounded pointer/key smoke against the host with cursor restore evidence"],uiProof:"Pointer/key smoke affects the host and must stay explicitly confirmed.",requiredInputs:["MINDEXEC_REMOTE_FAST_OS_INPUT_CONFIRM"],uiCommand:"npm run verify:remote-monitor-remote-fast-os-input-smoke",proofCommands:[{label:"RemoteFast bounded host OS-input smoke",command:"npm run verify:remote-monitor-remote-fast-os-input-smoke",mode:"opt-in-host-proof",liveCall:!1,hostAffecting:!0,defaultGate:!1,requiredInputs:["MINDEXEC_REMOTE_FAST_OS_INPUT_CONFIRM"]}]},{id:"release-approval",label:"Cloudflare/npm release approval",uiLabel:"Cloudflare/npm approval",state:"hold-release",requiredProof:["Green local gates after live proofs","Reviewed release notes","Explicit user approval before Cloudflare deploy or npm publish","Original `ref/~MindExec` launch proof manifest parity reviewed before release approval"],uiProof:"Deploy and npm publish require a reviewed proof packet and explicit user approval.",requiredInputs:["manual user approval"],uiCommand:"npm run verify:release-proof-packet",proofCommands:[{label:"Cloudflare Pages release pass",command:"manual-release-pass:cloudflare-pages",mode:"manual-release-approval",liveCall:!0,hostAffecting:!1,defaultGate:!1,requiredInputs:["manual user approval"]},{label:"npm package release pass",command:"manual-release-pass:npm-package",mode:"manual-release-approval",liveCall:!0,hostAffecting:!1,defaultGate:!1,requiredInputs:["manual user approval"]}]}],H={releaseReady:Le,releasePosture:Me,blockers:Te},ne="admin-dashboard-data";function v(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}function D(t){return Array.isArray(t)?t:[]}function f(t,a=""){return typeof t=="string"&&t.trim()?t.trim():a}function F(t,a=0){const r=typeof t=="number"?t:Number(t);return Number.isFinite(r)?r:a}function T(t,a=0){return Math.round(F(t,a))}function u(t){return T(t).toLocaleString()}function j(t){return`$${F(t).toLocaleString(void 0,{minimumFractionDigits:2,maximumFractionDigits:2})}`}function L(t){return`${F(t).toFixed(1)}%`}function V(t){return`${u(t)}P`}function se(t){const a=f(t);if(!a)return"--/--";const r=new Date(a);return Number.isNaN(r.getTime())?a.slice(0,5):`${String(r.getUTCMonth()+1).padStart(2,"0")}/${String(r.getUTCDate()).padStart(2,"0")}`}function Ue(t){const a=f(t).toLowerCase();if(/(failed|error|suspended|revoked|high|danger|blocked)/.test(a))return"danger";if(/(pending|review|grace|warn|manual|locked)/.test(a))return"warn";if(/(active|ok|processed|healthy|paid|closed|enforced)/.test(a))return"ok"}function _(t,a,r="-"){for(const n of a){const s=t[n];if(s!=null&&String(s).trim())return String(s)}return r}function Y(t,a){return t.map(r=>{const n=v(r),s=a.find(c=>n[c]!==void 0)??a[0];return{label:se(n.date??n.day??n.created_at),value:Math.max(0,F(n[s]))}})}function Fe(t){const a=v(t),r=v(a.launch_overview),n=v(a.billing_control),s=v(a.credit_totals),c=v(a.refund_rate),h=Y(D(a.daily_signups),["count","signup_count"]),l=Y(D(a.daily_revenue),["revenue","amount"]),y=D(a.referrers).map(b=>{const i=v(b);return[_(i,["referrer"],"direct"),u(i.visit_count??i.count)]}),O=D(a.countries).map(b=>{const i=v(b);return[_(i,["country"],"--"),u(i.visit_count??i.count),u(i.unique_users)]}),A=D(a.heavy_users).map(b=>{const i=v(b);return[_(i,["email","user_email","display_name"],"unknown"),`${u(i.boards_count??i.board_count)} boards`]}),C=D(a.entitlements).map(b=>{const i=v(b);return[_(i,["email","user_email"],"unknown"),_(i,["plan_key","plan","normalized_plan_key"],"free"),_(i,["status","entitlement_status"],"active"),_(i,["ends_at","current_period_end","renews_at"],"-")]}),I=D(a.refunds).map(b=>{const i=v(b);return[_(i,["email","user_email"],"unknown"),j(i.amount),_(i,["risk","revocation_status"],"review"),_(i,["review_status","status"],"open")]}),P=D(a.credit_ledger).map(b=>{const i=v(b);return[se(i.created_at),_(i,["email","user_email","reason"],"unknown"),V(i.delta??i.amount??i.credit_delta),_(i,["reason","event_type","source"],"-")]}),N=D(a.feature_limits).map(b=>{const i=v(b);return[_(i,["feature","feature_key"],"Feature"),_(i,["free_limit","free"],"-"),_(i,["pro_limit","pro","limit_value"],"-"),_(i,["status","entitlement_status"],"enforced")]}),R=D(a.user_funnel).map(b=>{const i=v(b);return{label:_(i,["stage","label"],"Stage"),count:T(i.count??i.user_count),rate:F(i.rate??i.conversion_rate)}});return{source:"supabase-admin-dashboard-data",fetchedAt:f(a.fetched_at,new Date().toISOString()),billingMode:f(r.billing_mode??n.billing_mode,"DODO_LIVE"),currency:f(r.currency_code??n.currency_code,"USD"),usdPerPoint:f(r.usd_per_point,"0.0002"),overviewKpis:[{label:"DAU",value:u(r.dau),tone:"ok"},{label:"WAU",value:u(r.wau),tone:"ok"},{label:"Activation",value:L(r.activation_rate),tone:"ok"},{label:"AI usage",value:L(r.ai_usage_rate),tone:"ok"},{label:"Paid conversion",value:L(r.paid_conversion_rate),tone:"warn"},{label:"D1 retention",value:L(r.d1_retention_rate),tone:"warn"},{label:"D7 retention",value:L(r.d7_retention_rate),tone:"warn"},{label:"Avg points / user",value:V(r.avg_points_spent_per_user)},{label:"AI cost estimate",value:j(r.ai_cost_estimate_usd)},{label:"Gross margin estimate",value:j(r.gross_margin_estimate_usd),tone:"ok"}],billingKpis:[{label:"Billing mode",value:f(n.billing_mode??r.billing_mode,"DODO_LIVE"),tone:"ok"},{label:"Webhook received 24h",value:u(n.webhook_received_24h??r.webhook_received_24h),tone:"ok"},{label:"Webhook failed 24h",value:u(n.webhook_failures_24h??r.webhook_failures_24h),tone:"warn"},{label:"Pending events",value:u(n.pending_events),tone:"warn"},{label:"Active Pro users",value:u(n.pro_active_users??n.active_entitlements),tone:"ok"},{label:"Manual reviews",value:u(n.manual_reviews),tone:"warn"},{label:"Locked boards",value:u(n.locked_boards),tone:"warn"},{label:"Create blocked today",value:u(n.create_blocked_today)}],operatingHealth:[{label:"Signups today",value:u(r.signups_today),tone:"ok"},{label:"Active users today",value:u(r.active_users_today),tone:"ok"},{label:"Points spent users",value:u(r.points_spent_users)},{label:"AI failures 24h",value:u(r.ai_failures_24h),tone:Ue(r.ai_failures_24h)??"warn"},{label:"Save failures 24h",value:u(r.save_failures_24h),tone:"ok"},{label:"Webhook failures 24h",value:u(r.webhook_failures_24h),tone:"warn"}],revenueBand:[{label:"Revenue today",value:j(r.revenue_today),tone:"ok"},{label:"7 day revenue",value:j(r.revenue_7_days),tone:"ok"},{label:"30 day revenue",value:j(r.revenue_30_days)},{label:"Total revenue",value:j(r.total_revenue)},{label:"Paid users",value:u(r.paid_users)},{label:"Wallet liability",value:V(r.total_credit_balance??s.total_credit_balance),tone:"warn"}],signupTrend:h,revenueTrend:l,referrerRows:y,countryRows:O,heavyUserRows:A,entitlementRows:C,webhookRows:[["24h received","payment/provider","processed",u(n.webhook_received_24h??r.webhook_received_24h)],["24h failed","payment/provider","manual-review",u(n.webhook_failures_24h??r.webhook_failures_24h)],["Refund rate","refunds","watch",L(c.refund_rate??c.rate)]],refundRows:I,creditRows:P,featureLimitRows:N,funnelRows:R,auditRows:[]}}async function W(t){var y,O,A,C;const a=te(t);if(!a.adminData.canAttempt)throw d.emit("adminDashboard.provider.skipped",{mode:a.adminData.mode}),new Error(`Secure admin data adapter is not ready: ${a.adminData.mode}`);const r=re(t);if(!r)throw d.emit("adminDashboard.provider.skipped",{mode:"config-missing"}),new Error("Supabase browser client is not available for admin data.");const{data:n,error:s}=await r.auth.getSession();if(s||!((y=n.session)!=null&&y.access_token))throw d.emit("adminDashboard.provider.sessionMissing",{message:(s==null?void 0:s.message)??"missing-session"}),new Error("Secure admin data requires a Supabase-authenticated session.");const{data:c,error:h}=await r.auth.getUser(),l=(O=c.user)==null?void 0:O.id;if(h||!l)throw d.emit("adminDashboard.provider.sessionMissing",{message:(h==null?void 0:h.message)??"missing-user"}),new Error("Secure admin data requires a verified Supabase user.");return{config:a,accessToken:n.session.access_token,userId:l,email:((C=(A=c.user)==null?void 0:A.email)==null?void 0:C.toLowerCase())??""}}async function X(t,a){await W(t);const r=re(t);if(!r)throw new Error("Supabase browser client is not available for admin data.");const{data:n,error:s}=await r.functions.invoke(ne,{body:a});if(s)throw d.emit("adminDashboard.provider.failed",{operation:f(a.action,"summary"),message:s.message}),s;if(n!=null&&n.error){const c=f(n.message??n.error,"admin-dashboard-data failed");throw d.emit("adminDashboard.provider.failed",{operation:f(a.action,"summary"),message:c}),new Error(c)}return n??{}}async function Be(t){d.emit("adminDashboard.provider.summary.requested",{functionName:ne});const a=await X(t,{action:"summary"}),r=Fe(a.summary);return d.emit("adminDashboard.provider.summary.loaded",{source:r.source,overviewMetrics:r.overviewKpis.length,signupPoints:r.signupTrend.length}),r}async function Xe(t,a){if(d.emit("adminDashboard.provider.userSearch.requested",{hasQuery:!!a.trim()}),!a.trim())return null;const r=await X(t,{action:"user-search",query:a}),n=v(r.user);if(!Object.keys(n).length)return d.emit("adminDashboard.provider.userSearch.loaded",{found:!1}),null;const s=v(n.profile),c=v(n.board_stats),h=v(n.activity),l=D(n.timeline),y={email:f(s.email,"unknown"),plan:f(s.plan_type,"Free"),boards:T(c.boards_count??c.board_count),points:T(s.credits_balance??h.credit_balance??h.points_balance),country:f(s.country,"--"),lastSeen:f(s.last_seen_at,f(s.created_at,"unknown")),timelineCount:l.length};return d.emit("adminDashboard.provider.userSearch.loaded",{found:!0,boards:y.boards}),y}async function Ve(t,a,r){const n=await W(t);d.emit("adminDashboard.provider.settings.requested",{priceStage:a,ltdLimit:r});const s=await X(t,{action:"save-settings",price_stage:a,ltd_limit:r}),c={mode:n.config.adminData.mode,canAttempt:!0,priceStage:f(s.price_stage,a),ltdLimit:T(s.ltd_limit,r),updatedAt:f(s.updated_at,new Date().toISOString())};return d.emit("adminDashboard.provider.settings.saved",{priceStage:c.priceStage,ltdLimit:c.ltdLimit}),c}async function qe(t,a){const r=await W(t);d.emit("adminDashboard.provider.emergencyClose.requested",{ltdLimit:a});const n=await X(t,{action:"emergency-close",price_stage:"CLOSED",ltd_limit:a}),s={mode:r.config.adminData.mode,canAttempt:!0,priceStage:f(n.price_stage,"CLOSED"),ltdLimit:T(n.ltd_limit,a),updatedAt:f(n.updated_at,new Date().toISOString())};return d.emit("adminDashboard.provider.emergencyClose.staged",{priceStage:s.priceStage,ltdLimit:s.ltdLimit}),s}const K="mindexec.react.admin.dashboard.v1",$e=["STANDARD","EARLY","LTD","CLOSED"],k={priceStage:"EARLY",ltdLimit:100,lastAction:"Admin dashboard restored as a local React shell.",updatedAtUtc:""};function Ge(){return te(U())}const He=[{key:"overview",label:"Overview",icon:Se},{key:"billing",label:"Billing Control",icon:De},{key:"entitlements",label:"Entitlements",icon:ye},{key:"dodo",label:"Dodo Events",icon:we},{key:"refunds",label:"Refunds",icon:xe},{key:"credits",label:"Credits",icon:Ae},{key:"limits",label:"Feature Limits",icon:Ce},{key:"funnel",label:"User Funnel",icon:Ie},{key:"explorer",label:"User Explorer",icon:Ne},{key:"release",label:"Release Readiness",icon:Re},{key:"audit",label:"Audit Log",icon:je}],We=[{label:"06/08",value:2},{label:"06/09",value:4},{label:"06/10",value:5},{label:"06/11",value:8},{label:"06/12",value:7},{label:"06/13",value:13},{label:"06/14",value:11},{label:"06/15",value:16},{label:"06/16",value:19},{label:"06/17",value:18},{label:"06/18",value:23},{label:"06/19",value:26},{label:"06/20",value:31},{label:"06/21",value:34}],Ke=[{label:"06/08",value:0},{label:"06/09",value:12},{label:"06/10",value:18},{label:"06/11",value:12},{label:"06/12",value:29},{label:"06/13",value:41},{label:"06/14",value:38},{label:"06/15",value:49},{label:"06/16",value:64},{label:"06/17",value:72},{label:"06/18",value:81},{label:"06/19",value:94},{label:"06/20",value:108},{label:"06/21",value:124}],G=[{email:"maya@buildloop.ai",plan:"Pro",boards:18,points:1240,country:"US",lastSeen:"today"},{email:"kenji@solo-studio.jp",plan:"Early",boards:9,points:640,country:"JP",lastSeen:"today"},{email:"linh@vietlaunch.dev",plan:"Free",boards:5,points:120,country:"VN",lastSeen:"yesterday"},{email:"alex@indieops.co",plan:"LTD",boards:32,points:2840,country:"SG",lastSeen:"2d ago"}],Je=[{label:"DAU",value:"128",tone:"ok"},{label:"WAU",value:"614",tone:"ok"},{label:"Activation",value:"41.8%",tone:"ok"},{label:"AI usage",value:"63.2%",tone:"ok"},{label:"Paid conversion",value:"4.6%",tone:"warn"},{label:"D1 retention",value:"38.1%",tone:"warn"},{label:"D7 retention",value:"22.7%",tone:"warn"},{label:"Avg points / user",value:"318P"},{label:"AI cost estimate",value:"$74.82"},{label:"Gross margin estimate",value:"$418.10",tone:"ok"}],ze=[{label:"Billing mode",value:"DODO_LIVE_GATED",tone:"warn"},{label:"Webhook received 24h",value:"19",tone:"ok"},{label:"Webhook failed 24h",value:"1",tone:"warn"},{label:"Pending events",value:"3",tone:"warn"},{label:"Active Pro users",value:"28",tone:"ok"},{label:"Manual reviews",value:"2",tone:"warn"},{label:"Locked boards",value:"6",tone:"warn"},{label:"Create blocked today",value:"14"}],ie=[["06/21 18:41","admin@mindexec.local","Changed price stage draft to EARLY"],["06/21 16:10","system","Dodo webhook replay queued"],["06/20 23:55","admin@mindexec.local","Raised LTD capacity review flag"],["06/20 19:20","system","Credit ledger reconciliation completed"]],Ye=[["evt_4912","payment.succeeded","processed","$12.00 USD"],["evt_4911","subscription.created","processed","Pro monthly"],["evt_4910","payment.failed","manual-review","$12.00 USD"],["evt_4909","refund.requested","pending","$24.00 USD"]],Qe=[{label:"Visitor",count:1280,rate:100},{label:"Signup",count:214,rate:16.7},{label:"First board",count:132,rate:61.7},{label:"AI run",count:83,rate:62.8},{label:"Pricing visit",count:44,rate:53},{label:"Paid",count:11,rate:25}],Q=String(H.releaseReady),q=H.releasePosture,Ze=H.blockers.map(t=>{var a;return{id:t.id,label:t.uiLabel||t.label,state:t.state,proof:t.uiProof||t.requiredProof.join(" "),command:t.uiCommand||((a=t.proofCommands[0])==null?void 0:a.command)||"npm run verify:release-blocker-preflight",proofCommands:t.proofCommands.map(r=>({label:r.label,command:r.command,mode:r.mode,liveCall:r.liveCall,hostAffecting:r.hostAffecting,defaultGate:r.defaultGate,requiredInputs:r.requiredInputs}))}}),ea={source:"local",fetchedAt:"",billingMode:"DODO_LIVE_GATED",currency:"USD",usdPerPoint:"0.0002",overviewKpis:Je,billingKpis:ze,operatingHealth:[{label:"Signups today",value:"34",tone:"ok"},{label:"Active users today",value:"128",tone:"ok"},{label:"Points spent users",value:"77"},{label:"AI failures 24h",value:"2",tone:"warn"},{label:"Save failures 24h",value:"0",tone:"ok"},{label:"Webhook failures 24h",value:"1",tone:"warn"}],revenueBand:[{label:"Revenue today",value:"$124.00",tone:"ok"},{label:"7 day revenue",value:"$530.00",tone:"ok"},{label:"30 day revenue",value:"$1,870.00"},{label:"Total revenue",value:"$4,418.00"},{label:"Paid users",value:"28"},{label:"Wallet liability",value:"184,200P",tone:"warn"}],signupTrend:We,revenueTrend:Ke,referrerRows:[["direct","312"],["x.com","128"],["reddit","84"],["youtube","62"]],countryRows:[["US","41%"],["JP","18%"],["SG","11%"],["VN","8%"]],heavyUserRows:G.slice(0,4).map(t=>[t.email.split("@")[0],`${t.boards} boards`]),entitlementRows:G.map(t=>[t.email,t.plan,t.plan==="Free"?"free":"active",t.plan==="Free"?"-":"2026-07-21"]),webhookRows:Ye,refundRows:[["maya@buildloop.ai","$12.00","low","closed"],["alex@indieops.co","$24.00","medium","open"],["unknown@blocked.test","$12.00","high","manual review"]],creditRows:[["18:41","maya@buildloop.ai","+1000P","monthly grant"],["18:20","kenji@solo-studio.jp","-120P","AI task"],["17:52","alex@indieops.co","-280P","image generation"]],featureLimitRows:[["Cloud boards","3","Unlimited","enforced"],["AI runs / month","20","1000","enforced"],["Image uploads","100MB","10GB","watching"],["Private boards","0","Unlimited","enforced"]],funnelRows:Qe,auditRows:ie};function aa(t,a){const r=Math.max(...a.map(n=>n.value),1);return Math.max(8,Math.round(t/r*100))}function ta(t){return t?`admin-kpi-card--${t}`:""}function $(t){return t.map(a=>({label:a[0]??"-",value:a[1]??"-"}))}function ra(t){return"timelineCount"in t?t.timelineCount:9}function oe(t){const a=typeof t=="number"?t:Number(t);return Number.isFinite(a)?Math.max(0,Math.min(1e4,Math.round(a))):k.ltdLimit}function le(t){if(!t||typeof t!="object")return k;const a=t,r=$e.includes(a.priceStage)?String(a.priceStage):k.priceStage,n=typeof a.lastAction=="string"&&a.lastAction.trim()?a.lastAction.slice(0,240):k.lastAction,s=typeof a.updatedAtUtc=="string"?a.updatedAtUtc:"";return{priceStage:r,ltdLimit:oe(a.ltdLimit),lastAction:n,updatedAtUtc:s}}function na(){if(typeof window>"u")return k;try{const t=window.localStorage.getItem(K),a=t?le(JSON.parse(t)):k;return d.emit("adminDashboard.localDraft.loaded",{source:t?"stored":"default",priceStage:a.priceStage,ltdLimit:a.ltdLimit}),a}catch(t){return d.emit("adminDashboard.localDraft.failed",{operation:"load",message:t instanceof Error?t.message:String(t)}),k}}function Z(t,a){const r=le({...t,updatedAtUtc:new Date().toISOString()});if(typeof window>"u")return r;try{window.localStorage.setItem(K,JSON.stringify(r)),d.emit("adminDashboard.localDraft.saved",{source:a,priceStage:r.priceStage,ltdLimit:r.ltdLimit})}catch(n){d.emit("adminDashboard.localDraft.failed",{operation:"save",source:a,message:n instanceof Error?n.message:String(n)})}return r}function ha(){const[t]=E.useState(na),[a,r]=E.useState("overview"),[n,s]=E.useState(!1),c=E.useMemo(()=>Ge(),[]),h=c.adminData.canAttempt,[l,y]=E.useState(ea),[O,A]=E.useState(null),[C,I]=E.useState(t.priceStage),[P,N]=E.useState(t.ltdLimit),[R,b]=E.useState(""),[i,de]=E.useState(""),[ce,g]=E.useState(t.lastAction),[ue,J]=E.useState(()=>new Date),me=E.useMemo(()=>{if(!i.trim())return null;const o=i.trim().toLowerCase();return G.find(m=>m.email.toLowerCase().includes(o))||null},[i]),w=l.source==="supabase-admin-dashboard-data"?O:me,pe=o=>{r(o),d.emit("adminDashboard.tab",{key:o})},fe=async()=>{if(s(!0),d.emit("adminDashboard.refresh"),h){try{const o=await Be(U());y(o),J(new Date(o.fetchedAt)),g("Secure Supabase admin snapshot refreshed.")}catch(o){const m=o instanceof Error?o.message:String(o);d.emit("adminDashboard.provider.refreshFailed",{message:m}),g(`Secure admin snapshot failed: ${m}. Local snapshot remains visible.`)}finally{s(!1)}return}window.setTimeout(()=>{J(new Date),g("Local admin snapshot refreshed. Wire Supabase read adapters before treating it as live production data."),s(!1)},260)},he=async o=>{o.preventDefault();const m=`Saved local settings draft: ${C}, LTD ${P}.`,p=Z({priceStage:C,ltdLimit:P,lastAction:m},"settings.form");if(d.emit("adminDashboard.settings.saved",{priceStage:p.priceStage,ltdLimit:p.ltdLimit}),I(p.priceStage),N(p.ltdLimit),g(p.lastAction),!!h)try{const S=await Ve(U(),p.priceStage,p.ltdLimit);I(S.priceStage),N(S.ltdLimit),g(`Secure admin settings saved: ${S.priceStage}, LTD ${S.ltdLimit}.`)}catch(S){const z=S instanceof Error?S.message:String(S);d.emit("adminDashboard.provider.settingsFailed",{message:z}),g(`Local settings draft saved, but secure provider save failed: ${z}`)}},ve=async()=>{const m=Z({priceStage:"CLOSED",ltdLimit:P,lastAction:"Emergency close staged locally. Real billing closure requires a secure admin adapter."},"emergency.close");if(d.emit("adminDashboard.emergency.closed",{priceStage:m.priceStage,ltdLimit:m.ltdLimit}),I(m.priceStage),N(m.ltdLimit),g(m.lastAction),!!h)try{const p=await qe(U(),m.ltdLimit);I(p.priceStage),N(p.ltdLimit),g(`Secure emergency close staged through admin provider: ${p.priceStage}, LTD ${p.ltdLimit}.`)}catch(p){const S=p instanceof Error?p.message:String(p);d.emit("adminDashboard.provider.emergencyFailed",{message:S}),g(`Emergency close staged locally, but secure provider close failed: ${S}`)}},be=async o=>{if(o.preventDefault(),de(R),d.emit("adminDashboard.user.search",{hasQuery:!!R.trim()}),!R.trim()){A(null),g("User explorer query cleared.");return}if(!h){g("User explorer searched local sample data.");return}try{const m=await Xe(U(),R);A(m),g(m?"User explorer loaded secure provider data.":"No secure provider user matched that query.")}catch(m){const p=m instanceof Error?m.message:String(m);d.emit("adminDashboard.provider.userSearchFailed",{message:p}),A(null),g(`Secure user explorer failed: ${p}`)}};return e.jsxs("div",{className:"page admin-dashboard-page","data-testid":"admin-dashboard-shell","data-admin-storage-key":K,"data-production-adapter-state":c.overallState,"data-admin-provider-mode":c.adminData.mode,"data-admin-provider-ready":c.adminData.canAttempt?"true":"false","data-client-secret-blocked":c.forbiddenClientSecretKeys.length>0?"true":"false",children:[e.jsxs("section",{className:"admin-hero",children:[e.jsxs("div",{children:[e.jsx("div",{className:"eyebrow",children:"Operations Console"}),e.jsx("h1",{children:"MindExec Admin Dashboard"}),e.jsx("p",{children:"React port of the original admin plugin: revenue, billing control, credits, limits, funnel, user explorer, and audit surfaces without loading the Blazor plugin runtime."})]}),e.jsxs("div",{className:"admin-hero-actions",children:[e.jsx("span",{className:"admin-badge","data-testid":"admin-dashboard-mode",children:h?"supabase-admin-provider":"local-admin-shell"}),e.jsxs("button",{className:"btn btn-secondary",type:"button",onClick:fe,disabled:n,"data-testid":"admin-refresh",children:[n?e.jsx(_e,{size:16,className:"spin-icon"}):e.jsx(ge,{size:16}),"Refresh"]})]})]}),e.jsxs("section",{className:"admin-status-strip","data-testid":"admin-status-strip",children:[e.jsx(B,{label:"Billing mode",value:l.billingMode}),e.jsx(B,{label:"Currency",value:l.currency}),e.jsx(B,{label:"USD / point",value:l.usdPerPoint}),e.jsx(B,{label:"Updated",value:ue.toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"})})]}),e.jsxs("section",{className:"admin-alert admin-alert--warning",children:[e.jsx(Ee,{size:18}),e.jsxs("div",{children:[e.jsx("strong",{children:h?"Secure admin provider ready":"Local React shell only"}),e.jsx("span",{"data-testid":"admin-last-action",children:ce})]})]}),e.jsx("nav",{className:"admin-tabs","aria-label":"Admin dashboard tabs","data-testid":"admin-tabs",children:He.map(o=>{const m=o.icon;return e.jsxs("button",{className:a===o.key?"is-active":"",type:"button",onClick:()=>pe(o.key),"data-testid":`admin-tab-${o.key}`,"data-admin-tab":o.key,children:[e.jsx(m,{size:16}),e.jsx("span",{children:o.label})]},o.key)})}),a==="overview"&&e.jsxs(e.Fragment,{children:[e.jsx(ee,{metrics:l.overviewKpis}),e.jsxs("section",{className:"admin-panel-grid admin-panel-grid--two",children:[e.jsx(x,{title:"Operating Health",metrics:l.operatingHealth}),e.jsx(x,{title:"Revenue Band",metrics:l.revenueBand})]}),e.jsxs("section",{className:"admin-panel-grid admin-panel-grid--two",children:[e.jsx(ae,{title:"Daily Signups",points:l.signupTrend}),e.jsx(ae,{title:"Daily Revenue",points:l.revenueTrend,money:!0})]}),e.jsxs("section",{className:"admin-panel-grid admin-panel-grid--three",children:[e.jsx(x,{title:"Top Referrers",metrics:$(l.referrerRows),compact:!0}),e.jsx(x,{title:"Countries",metrics:$(l.countryRows),compact:!0}),e.jsx(x,{title:"Heavy Users",metrics:$(l.heavyUserRows),compact:!0})]})]}),a==="billing"&&e.jsxs(e.Fragment,{children:[e.jsx(ee,{metrics:l.billingKpis}),e.jsxs("section",{className:"admin-panel-grid admin-panel-grid--three",children:[e.jsx(x,{title:"Webhook Status",metrics:[{label:"24h received",value:"19",tone:"ok"},{label:"24h failed",value:"1",tone:"warn"},{label:"Pending",value:"3",tone:"warn"},{label:"Last success",value:"18:41"}]}),e.jsx(x,{title:"Entitlement State",metrics:[{label:"Active",value:"28",tone:"ok"},{label:"Grace",value:"3",tone:"warn"},{label:"Suspended",value:"2",tone:"danger"},{label:"Revoked",value:"1"}]}),e.jsxs("form",{className:"admin-panel admin-settings-panel",onSubmit:he,"data-testid":"admin-settings-form",children:[e.jsxs("div",{className:"admin-panel-head",children:[e.jsx("h2",{children:"Price Controls"}),e.jsxs("button",{className:"btn btn-primary",type:"submit","data-testid":"admin-save-settings",children:[e.jsx(ke,{size:15}),"Save draft"]})]}),e.jsxs("label",{children:["Price stage",e.jsxs("select",{value:C,onChange:o=>I(o.target.value),"data-testid":"admin-price-stage",children:[e.jsx("option",{value:"STANDARD",children:"STANDARD"}),e.jsx("option",{value:"EARLY",children:"EARLY"}),e.jsx("option",{value:"LTD",children:"LTD"}),e.jsx("option",{value:"CLOSED",children:"CLOSED"})]})]}),e.jsxs("label",{children:["LTD limit",e.jsx("input",{type:"number",min:"0",value:P,onChange:o=>N(oe(o.target.value)),"data-testid":"admin-ltd-limit"})]}),e.jsxs("button",{className:"btn btn-secondary admin-danger-button",type:"button",onClick:ve,"data-testid":"admin-emergency-close",children:[e.jsx(Oe,{size:15}),"Stage emergency close"]})]})]})]}),a==="entitlements"&&e.jsx(M,{title:"Entitlements",columns:["User","Plan","Status","Renews"],rows:l.entitlementRows}),a==="dodo"&&e.jsx(M,{title:"Dodo Webhook Events",columns:["Event","Type","Status","Amount"],rows:l.webhookRows}),a==="refunds"&&e.jsx(M,{title:"Refund Reviews",columns:["User","Amount","Risk","Status"],rows:[...l.refundRows]}),a==="credits"&&e.jsx(M,{title:"Credit Ledger",columns:["Time","User","Delta","Reason"],rows:l.creditRows}),a==="limits"&&e.jsx(M,{title:"Feature Limits",columns:["Feature","Free","Pro","Status"],rows:l.featureLimitRows}),a==="funnel"&&e.jsx(ia,{rows:l.funnelRows}),a==="explorer"&&e.jsxs("section",{className:"admin-panel",children:[e.jsxs("div",{className:"admin-panel-head",children:[e.jsx("h2",{children:"User Explorer"}),e.jsx("span",{className:"admin-note",children:h?"Secure provider data":"Local sample data"})]}),e.jsxs("form",{className:"admin-search-row",onSubmit:be,"data-testid":"admin-user-search-form",children:[e.jsx("input",{"aria-label":"Search user",value:R,onChange:o=>b(o.target.value),placeholder:"email, domain, or segment","data-testid":"admin-user-query"}),e.jsxs("button",{className:"btn btn-primary",type:"submit","data-testid":"admin-user-search",children:[e.jsx(Pe,{size:15}),"Search"]})]}),i&&!w&&e.jsx("div",{className:"admin-empty","data-testid":"admin-user-empty",children:h?"No secure provider user matched that query.":"No local sample user matched that query."}),w&&e.jsxs("div",{className:"admin-user-card","data-testid":"admin-user-card",children:[e.jsx("strong",{children:w.email}),e.jsxs("span",{children:[w.plan," / ",w.country," / last seen ",w.lastSeen]}),e.jsx(x,{title:"User Snapshot",compact:!0,metrics:[{label:"Boards",value:String(w.boards)},{label:"Points",value:`${w.points}P`},{label:"Timeline",value:`${ra(w)} events`}]})]})]}),a==="release"&&e.jsx(sa,{blockers:Ze}),a==="audit"&&e.jsxs("section",{className:"admin-panel-grid admin-panel-grid--two",children:[e.jsx(oa,{}),e.jsx(M,{title:"Recent Setting Changes",columns:["Time","Admin","Action"],rows:l.auditRows.length?l.auditRows:ie,compact:!0})]})]})}function sa({blockers:t}){return e.jsxs("section",{className:"admin-release-readiness","data-testid":"admin-release-readiness-panel","data-release-ready":Q,"data-release-posture":q,"data-release-blocker-count":t.length,children:[e.jsxs("div",{className:"admin-panel-head",children:[e.jsxs("div",{children:[e.jsx("h2",{children:"Release Readiness"}),e.jsx("p",{className:"admin-release-summary",children:"Local gates are green enough for RC work, but release remains held until live proofs and explicit approval are complete."})]}),e.jsx("span",{className:"admin-badge admin-badge--hold","data-testid":"admin-release-posture",children:q})]}),e.jsxs("div",{className:"admin-release-grid",children:[e.jsx(x,{title:"Local RC State",compact:!0,metrics:[{label:"Release ready",value:Q,tone:"warn"},{label:"Posture",value:q,tone:"warn"},{label:"Blockers",value:String(t.length),tone:"warn"},{label:"Default deploy/publish",value:"blocked",tone:"ok"}]}),e.jsxs("article",{className:"admin-panel admin-panel--compact",children:[e.jsx("div",{className:"admin-panel-head",children:e.jsx("h2",{children:"Proof Packet"})}),e.jsxs("div",{className:"admin-release-command-list",children:[e.jsx("code",{children:"npm run verify:release-blocker-preflight"}),e.jsx("code",{children:"npm run verify:release-proof-packet"}),e.jsx("code",{children:"npm run check"}),e.jsx("code",{children:"npm run build"})]})]})]}),e.jsx("div",{className:"admin-release-blocker-list","data-testid":"admin-release-blocker-list",children:t.map(a=>e.jsxs("article",{className:"admin-release-blocker","data-testid":"admin-release-blocker","data-release-blocker-id":a.id,"data-release-blocker-state":a.state,children:[e.jsxs("div",{children:[e.jsx("strong",{children:a.label}),e.jsx("span",{children:a.proof})]}),e.jsxs("div",{children:[e.jsx("span",{className:"admin-release-state",children:a.state}),e.jsx("code",{children:a.command})]}),e.jsx("div",{className:"admin-release-proof-command-list","data-testid":"admin-release-proof-command-list","data-release-blocker-id":a.id,"data-release-proof-command-count":a.proofCommands.length,children:a.proofCommands.map(r=>e.jsxs("div",{className:"admin-release-proof-command","data-testid":"admin-release-proof-command","data-release-proof-command-mode":r.mode,"data-release-proof-command-live-call":String(r.liveCall),"data-release-proof-command-host-affecting":String(r.hostAffecting),"data-release-proof-command-default-gate":String(r.defaultGate),children:[e.jsx("span",{children:r.label}),e.jsx("code",{children:r.command}),e.jsxs("div",{className:"admin-release-proof-command__badges",children:[e.jsx("span",{children:r.mode}),e.jsx("span",{children:r.liveCall?"live":"local"}),e.jsx("span",{children:r.hostAffecting?"host-affecting":"host-safe"}),e.jsx("span",{children:r.defaultGate?"default-gate":"manual-only"})]})]},`${a.id}:${r.command}`))})]},a.id))})]})}function B({label:t,value:a}){return e.jsxs("div",{className:"admin-status-pill",children:[e.jsx("span",{children:t}),e.jsx("strong",{children:a})]})}function ee({metrics:t}){return e.jsx("section",{className:"admin-kpi-grid",children:t.map(a=>e.jsxs("article",{className:`admin-kpi-card ${ta(a.tone)}`,children:[e.jsx("span",{children:a.label}),e.jsx("strong",{children:a.value})]},a.label))})}function x({title:t,metrics:a,compact:r}){return e.jsxs("article",{className:`admin-panel ${r?"admin-panel--compact":""}`,children:[e.jsx("div",{className:"admin-panel-head",children:e.jsx("h2",{children:t})}),e.jsx("div",{className:"admin-metric-list",children:a.map(n=>e.jsxs("div",{className:`admin-metric-row ${n.tone?`admin-metric-row--${n.tone}`:""}`,children:[e.jsx("span",{children:n.label}),e.jsx("strong",{children:n.value})]},n.label))})]})}function ae({title:t,points:a,money:r}){return e.jsxs("article",{className:"admin-panel",children:[e.jsxs("div",{className:"admin-panel-head",children:[e.jsx("h2",{children:t}),e.jsx("span",{className:"admin-note",children:"Last 14 days"})]}),e.jsx("div",{className:"admin-mini-chart",children:a.map(n=>e.jsxs("div",{className:"admin-bar-item",children:[e.jsx("div",{className:"admin-bar",style:{height:`${aa(n.value,a)}%`}}),e.jsx("span",{children:n.label.slice(3)}),e.jsx("b",{children:r?`$${n.value}`:n.value})]},n.label))})]})}function M({title:t,columns:a,rows:r,compact:n}){return e.jsxs("section",{className:`admin-panel ${n?"admin-panel--compact":""}`,children:[e.jsx("div",{className:"admin-panel-head",children:e.jsx("h2",{children:t})}),e.jsx("div",{className:"admin-table-wrap",children:e.jsxs("table",{className:"admin-table",children:[e.jsx("thead",{children:e.jsx("tr",{children:a.map(s=>e.jsx("th",{children:s},s))})}),e.jsx("tbody",{children:r.map(s=>e.jsx("tr",{children:s.map(c=>e.jsx("td",{children:c},c))},s.join("|")))})]})})]})}function ia({rows:t}){return e.jsxs("section",{className:"admin-panel",children:[e.jsxs("div",{className:"admin-panel-head",children:[e.jsx("h2",{children:"User Funnel"}),e.jsx("span",{className:"admin-note",children:"30 day sample"})]}),e.jsx("div",{className:"admin-funnel-list",children:t.map(a=>e.jsxs("div",{className:"admin-funnel-row",children:[e.jsxs("div",{children:[e.jsx("strong",{children:a.label}),e.jsxs("span",{children:[a.count.toLocaleString()," users / ",a.rate,"%"]})]}),e.jsx("div",{className:"admin-progress-track",children:e.jsx("div",{className:"admin-progress-fill",style:{width:`${Math.min(100,a.rate)}%`}})})]},a.label))})]})}function oa(){const t=[["Paid users",28,100],["D7 retention",22,35],["AI failure rate",2,1]];return e.jsxs("article",{className:"admin-panel",children:[e.jsx("div",{className:"admin-panel-head",children:e.jsx("h2",{children:"Goal Progress"})}),e.jsx("div",{className:"admin-funnel-list",children:t.map(([a,r,n])=>{const s=a==="AI failure rate"?Math.max(8,100-Math.min(100,r/10*100)):Math.min(100,r/n*100);return e.jsxs("div",{className:"admin-funnel-row",children:[e.jsxs("div",{children:[e.jsx("strong",{children:a}),e.jsxs("span",{children:[r," / ",n]})]}),e.jsx("div",{className:"admin-progress-track",children:e.jsx("div",{className:"admin-progress-fill",style:{width:`${s}%`}})})]},a)})})]})}export{ha as AdminDashboardPage};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/supabaseAuthAdapter-
|
|
2
|
-
import{g as C,A as N,a as b,_ as L,c as P,s as U}from"./index-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/supabaseAuthAdapter-BBfom_he.js","assets/productionAdapterConfig-C5jfk6oG.js","assets/canvas-runtime-qWnXqOnu.js","assets/vendor-react-BXzpOyCS.js","assets/app-runtime-xD2Z3NdN.js","assets/vendor-icons-DE3gIReG.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{g as C,A as N,a as b,_ as L,c as P,s as U}from"./index-D8RqkCyH.js";import{r as o,j as e,a as V}from"./vendor-react-BXzpOyCS.js";import{r as Y}from"./productionAdapterConfig-C5jfk6oG.js";import{R as d}from"./app-runtime-xD2Z3NdN.js";import{b2 as K,aQ as O,b9 as W,ba as x,ap as Q,aE as J,bb as X,a3 as Z,bc as ee,a_ as se,b8 as ne,b0 as ae,bd as te}from"./vendor-icons-DE3gIReG.js";const ie=[{id:"/",label:"Home",description:"MindExec product surface",icon:J},{id:"/mindcanvas",label:"MindCanvas",description:"AI execution canvas",icon:X},{id:"/planmaster",label:"PlanMaster",description:"Execution planning board",icon:Z},{id:"/tools",label:"Tools",description:"Free browser utilities",icon:ee},{id:"/youtube",label:"YouTube",description:"Video capture to canvas",icon:se},{id:"/code",label:"Code",description:"CodeGraph workspace preview",icon:ne},{id:"/pricing",label:"Pricing",description:"USD paid path",icon:O},{id:"/company-core",label:"Company Core",description:"Business operating view",icon:ae},{id:"/login",label:"Login",description:"Google sign-in shell",icon:x}];function M(a){return typeof a=="number"?`${a.toLocaleString()}P`:"Pending"}function oe(a){var l;const c=(a||"").trim();return c?(l=c[0])==null?void 0:l.toUpperCase():"M"}function re(a){return a==="supabase-provider-session"?"Supabase OAuth":a==="supabase-callback-shell"?"OAuth callback shell":a==="manual-google-shell"?"Local Google shell":"Local shell"}function ce(a){return a?a.source==="manual-google-shell"?{availablePoints:0,reservedPoints:0,mode:"Local/BYOK",description:"Local shell, BYOK, and offline work stay outside managed cloud credits."}:{availablePoints:null,reservedPoints:null,mode:"Cloud wallet",description:"Credit wallet sync is reserved for the hosted paid adapter."}:{availablePoints:null,reservedPoints:null,mode:"Sign in required",description:"Sign in to sync managed AI credits for hosted workflows."}}function ve({route:a,navigate:c,canvasActions:l=[]}){const k=l.length>0,[n,v]=o.useState(()=>C()),[u,p]=o.useState(!1),[f,j]=o.useState(!1),w=o.useRef(null),A=o.useRef(null),m=o.useMemo(()=>ce(n),[n]);o.useEffect(()=>{const s=()=>v(C());return window.addEventListener(N,s),window.addEventListener("storage",s),()=>{window.removeEventListener(N,s),window.removeEventListener("storage",s)}},[]),o.useEffect(()=>{if(!Y(b()).auth.canAttempt)return;let t=!1;return(async()=>{try{const{loadSupabaseAuthSession:r,loadSupabaseAuthSessionFromLocalBridge:g,syncSupabaseAuthSessionToLocalBridge:D}=await L(async()=>{const{loadSupabaseAuthSession:G,loadSupabaseAuthSessionFromLocalBridge:H,syncSupabaseAuthSessionToLocalBridge:q}=await import("./supabaseAuthAdapter-BBfom_he.js");return{loadSupabaseAuthSession:G,loadSupabaseAuthSessionFromLocalBridge:H,syncSupabaseAuthSessionToLocalBridge:q}},__vite__mapDeps([0,1,2,3,4,5]));let h=await r(b());if(h.session||(h=await g(b(),"sidebar-local-bridge-session-restore")),t)return;if(!h.session){(n==null?void 0:n.source)==="supabase-provider-session"&&(P(),v(null),d.emit("auth.accountMenu.providerSession.cleared",{reason:"session-missing"}));return}const F=U({...h.session,source:"supabase-provider-session"});v(F),await D(b(),"sidebar-provider-session-restore")}catch(r){d.emit("auth.accountMenu.providerRestore.warning",{message:r instanceof Error?r.message:String(r)})}})(),()=>{t=!0}},[n==null?void 0:n.source]),o.useEffect(()=>{if(!u)return;const s=i=>{var r,g;i.target instanceof Node&&((r=w.current)!=null&&r.contains(i.target)||(g=A.current)!=null&&g.contains(i.target)||p(!1))},t=i=>{i.key==="Escape"&&p(!1)};return window.addEventListener("pointerdown",s,!0),window.addEventListener("keydown",t),()=>{window.removeEventListener("pointerdown",s,!0),window.removeEventListener("keydown",t)}},[u]);const _=n?te:x,S=n?`Account: signed in as ${n.email}`:"Account: sign in with Google",I=a==="/login"||!!n,R=(n==null?void 0:n.email)??"Sign in required",B=n?re(n.source):"Not connected",y=s=>{p(!1),c(s)},T=()=>{p(s=>{const t=!s;return d.emit("auth.accountMenu.toggled",{open:t,signedIn:!!n,source:(n==null?void 0:n.source)??"none"}),t})},$=n?e.jsxs("div",{className:"account-popover-credit","data-testid":"sidebar-account-credits",children:[e.jsxs("div",{className:"account-popover-credit-title",children:[e.jsx(K,{size:15}),e.jsx("span",{children:"AI Credits"})]}),e.jsx("strong",{"data-testid":"sidebar-account-credit-available",children:M(m.availablePoints)}),e.jsx("p",{children:m.description}),e.jsxs("div",{className:"account-popover-credit-grid",children:[e.jsxs("div",{children:[e.jsx("span",{children:"Reserved"}),e.jsx("b",{"data-testid":"sidebar-account-credit-reserved",children:M(m.reservedPoints)})]}),e.jsxs("div",{children:[e.jsx("span",{children:"Mode"}),e.jsx("b",{children:m.mode})]})]})]}):null,z=async()=>{if(!f){j(!0),d.emit("auth.accountMenu.signOut.requested",{source:(n==null?void 0:n.source)??"none"});try{const{signOutSupabaseAuthSession:s}=await L(async()=>{const{signOutSupabaseAuthSession:t}=await import("./supabaseAuthAdapter-BBfom_he.js");return{signOutSupabaseAuthSession:t}},__vite__mapDeps([0,1,2,3,4,5]));await s(b(),"sidebar-account-menu")}catch(s){d.emit("auth.accountMenu.signOut.warning",{message:s instanceof Error?s.message:String(s)})}P(),v(null),p(!1),j(!1),d.emit("auth.accountMenu.signOut.completed"),c("/")}},E=u?e.jsxs("div",{className:"sidebar-account-popover",role:"dialog","aria-label":"Account","data-testid":"sidebar-account-menu",ref:A,children:[e.jsxs("div",{className:"account-popover-head",children:[e.jsx("div",{className:"account-popover-avatar","aria-hidden":"true",children:oe(n==null?void 0:n.email)}),e.jsxs("div",{className:"account-popover-title",children:[e.jsx("span",{children:"Account"}),e.jsx("strong",{"data-testid":"sidebar-account-email",children:R}),e.jsx("small",{children:B})]})]}),$,e.jsxs("div",{className:"account-popover-actions",children:[e.jsxs("button",{className:"account-popover-action",type:"button","data-testid":"sidebar-account-pricing",onClick:()=>y("/pricing"),children:[e.jsx(O,{size:16}),e.jsx("span",{children:"Credit plans"})]}),n?e.jsxs("button",{className:"account-popover-action account-popover-action--danger",type:"button","data-testid":"sidebar-account-sign-out",disabled:f,onClick:z,children:[e.jsx(W,{size:16}),e.jsx("span",{children:f?"Signing out ...":"Sign out"})]}):e.jsxs("button",{className:"account-popover-action account-popover-action--primary",type:"button","data-testid":"sidebar-account-sign-in",onClick:()=>y("/login"),children:[e.jsx(x,{size:16}),e.jsx("span",{children:"Continue with Google"})]})]})]}):null;return e.jsxs("aside",{className:"app-sidebar","aria-label":"MindExec navigation",children:[e.jsx("button",{className:"sidebar-brand",type:"button",title:"Open MindCanvas","aria-label":"Open MindCanvas",onClick:()=>c("/mindcanvas"),children:e.jsx(Q,{size:22})}),e.jsx("div",{className:"sidebar-divider"}),e.jsx("nav",{className:"sidebar-nav",children:ie.slice(1,8).map(s=>{const t=s.icon,i=s.id===a||s.id==="/mindcanvas"&&a==="/mindmap"||s.id==="/planmaster"&&a==="/planagent"||s.id==="/tools"&&a.startsWith("/tools/")||s.id==="/"&&a==="/";return e.jsx("button",{type:"button",className:`sidebar-icon ${i?"is-active":""}`,title:`${s.label}: ${s.description}`,"aria-label":s.label,"aria-current":i?"page":void 0,onClick:()=>c(s.id),children:e.jsx(t,{size:21})},s.id)})}),e.jsx("div",{className:"sidebar-spacer"}),k&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"sidebar-divider sidebar-divider--context"}),e.jsx("nav",{className:"sidebar-nav sidebar-nav--context","aria-label":"MindCanvas quick actions",children:l.map(s=>{const t=s.icon;return e.jsx("button",{type:"button",className:`sidebar-icon sidebar-icon--context ${s.active?"is-active":""}`,title:`${s.label}: ${s.description}`,"aria-label":s.label,"aria-pressed":s.active?"true":void 0,"data-testid":s.testId,onClick:s.onClick,children:e.jsx(t,{size:20})},s.id)})})]}),e.jsxs("div",{className:"sidebar-account-wrap",ref:w,children:[e.jsx("button",{className:`sidebar-icon ${I?"is-active":""}`,type:"button",title:S,"aria-label":S,"aria-haspopup":"dialog","aria-expanded":u,"data-testid":"sidebar-account","data-auth-session-active":n?"true":"false","data-auth-session-source":(n==null?void 0:n.source)??"none",onClick:T,children:e.jsx(_,{size:20})}),u&&(typeof document<"u"?V.createPortal(E,document.body):E)]})]})}export{ve as AppSidebar};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r,j as e}from"./vendor-react-BXzpOyCS.js";import{g as C,a as g,c as k,s as q,b as K,p as F,d as L}from"./index-CmaOkjme.js";import{p as T,P as U}from"./pricingCheckoutShell-O-DnwmbU.js";import{r as O}from"./productionAdapterConfig-C5jfk6oG.js";import{R as f}from"./app-runtime-xD2Z3NdN.js";import{syncSupabaseAuthSessionToLocalBridge as P,loadSupabaseAuthSession as _,loadSupabaseAuthSessionFromLocalBridge as D,buildSupabaseAuthRedirectUrl as I,startSupabaseGoogleOAuth as H,signOutSupabaseAuthSession as Y,requestSupabasePasswordReset as V,updateSupabasePassword as W}from"./supabaseAuthAdapter-BcLkoGvY.js";import{X,ak as J,ab as Q,aR as z,ad as $,f as Z,aS as N,K as B,aT as ee,a7 as te}from"./vendor-icons-DE3gIReG.js";import"./canvas-runtime-F1OftOhQ.js";function se(o){return/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(o.trim())}function S(){return O(g())}function E(o,a,u=!1){return o.source==="supabase-provider-session"?a?`Google sign-in is active for ${o.email}. Return to pricing to continue checkout.`:`Google sign-in is active for ${o.email}.`:u?a?"A local auth shell exists, but secure Google sign-in is required before checkout can continue.":"A local auth shell exists, but secure Google sign-in is required before MindCanvas can sync remote services.":a?"A local Google auth shell is active. Return to pricing to continue checkout.":"A local Google auth shell is already active for this browser."}function M(o,a){return a?`Local Google auth shell ready for ${o}. Return to pricing to continue the gated checkout.`:`Local Google auth shell ready for ${o}. Secure Supabase OAuth can replace this adapter later.`}function de({navigate:o}){const[a,u]=r.useState(!1),[t,l]=r.useState(()=>C()),[i]=r.useState(()=>T()),d=r.useMemo(()=>S(),[]),[x,c]=r.useState(()=>{const s=C(),n=T();return s?E(s,!!n,S().auth.canAttempt):n?"Sign in to continue MindCanvas Pro checkout. Payment remains gated until the secure adapter is connected.":"Use your Google account to sync cloud projects. No password to create or remember."});r.useEffect(()=>{if(!d.auth.canAttempt)return;let s=!1;return(async()=>{try{let h=await _(g());if(h.session||(h=await D(g(),"login-local-bridge-session-restore")),s)return;if(!h.session){(t==null?void 0:t.source)==="supabase-provider-session"&&(k(),l(null),c("Google sign-in expired. Choose your account again."),f.emit("auth.supabase.sessionShell.cleared",{source:"login-provider-session-restore",reason:"session-missing"}));return}const G=q({...h.session,source:"supabase-provider-session"});l(G),c(E(G,!!i,d.auth.canAttempt)),await P(g(),"login-provider-session-restore")}catch(h){f.emit("auth.supabase.sessionRestore.uiFailed",{message:h instanceof Error?h.message:String(h)})}})(),()=>{s=!0}},[i,d.auth.canAttempt,t==null?void 0:t.source]),r.useEffect(()=>{(t==null?void 0:t.source)!=="supabase-provider-session"||!d.auth.canAttempt||P(g(),"login-existing-session")},[d.auth.canAttempt,t==null?void 0:t.email,t==null?void 0:t.source]);const m=()=>{const s=C();if(s)return l(s),c(E(s,!!i,d.auth.canAttempt)),s;const n=L();return l(n),c(M(n.email,!!i)),n},b=async()=>{const s=m();s.source==="supabase-provider-session"&&await P(g(),"login-continue");const n={hasCheckoutIntent:!!i,signedIn:!!s,sessionSource:s.source};i?f.emit("auth.returnToPricing",n):f.emit("auth.continueMindCanvas",n),o(i?"/pricing":"/mindcanvas")},w=()=>{const s=L();l(s),c(M(s.email,!!i)),u(!1),window.setTimeout(()=>{b()},240)},p=async()=>{u(!0);const s=await F();if(O(s).auth.canAttempt)try{const h=I("/login",i?"/pricing":"/mindcanvas");c("Opening secure Google sign-in..."),(t==null?void 0:t.source)!=="supabase-provider-session"&&(k(),l(null)),await H(s,h);return}catch(h){c(`Secure Google sign-in failed: ${h instanceof Error?h.message:String(h)}`),u(!1);return}window.setTimeout(()=>{w()},550)},j=!!(t&&(!d.auth.canAttempt||t.source==="supabase-provider-session")),y=j?i?"Continue checkout":"Continue to MindCanvas":a?"Opening Google...":"Continue with Google",v=j?b:p,A=async()=>{u(!0),c("Signing out...");let s="";try{await Y(g(),"login-sign-out")}catch(n){s=n instanceof Error?n.message:String(n),f.emit("auth.signOut.uiFailed",{message:s})}k(),l(null),c(s?`Signed out locally. Provider sign-out warning: ${s}`:i?"Signed out. Choose another Google account to continue checkout.":"Signed out. Choose another Google account to continue."),u(!1)};return e.jsxs(R,{page:"login",children:[e.jsx("button",{className:"auth-close",type:"button",title:"Close",onClick:()=>o("/mindcanvas"),"data-testid":"auth-close",children:e.jsx(X,{size:16})}),e.jsxs("div",{className:"auth-logo",children:[e.jsx(J,{size:24}),e.jsx("strong",{children:"MindExec"})]}),e.jsx("h1",{children:"Sign in with Google"}),e.jsx("p",{"data-testid":"auth-message",children:x}),e.jsxs("button",{className:"google-button",type:"button",disabled:a,onClick:v,"data-testid":"auth-google-shell",children:[e.jsx("span",{className:"google-g",children:"G"}),y]}),e.jsxs("div",{className:"auth-action-strip",children:[t&&i&&e.jsx("button",{type:"button",onClick:()=>void b(),"data-testid":"auth-return-pricing",children:"Return to pricing"}),t&&e.jsx("button",{type:"button",disabled:a,onClick:()=>void A(),"data-testid":"auth-sign-out",children:"Sign out"}),e.jsx("button",{type:"button",onClick:()=>o("/forgot-password"),"data-testid":"auth-forgot-password",children:"Forgot password"}),e.jsx("button",{type:"button",onClick:()=>o("/pricing"),"data-testid":"auth-view-pricing",children:"View pricing"})]}),e.jsx("p",{className:"auth-note",children:d.auth.canAttempt?"Secure Supabase OAuth is connected for this browser build.":"The React port keeps this as a local auth shell until the secure Supabase OAuth adapter is connected."})]})}function he({navigate:o}){const[a,u]=r.useState(""),[t,l]=r.useState(!1),[i,d]=r.useState(""),[x,c]=r.useState(!1),m=r.useMemo(()=>S(),[]),b=async w=>{if(w.preventDefault(),!se(a)){d("Enter a valid email address.");return}if(l(!0),d(""),m.passwordReset.canAttempt){try{const p=I("/reset-password","/login");await V(g(),a,p),c(!0),l(!1),f.emit("auth.reset.requested",{emailDomain:a.split("@")[1]||"",provider:"supabase"})}catch(p){d(p instanceof Error?p.message:String(p)),l(!1)}return}window.setTimeout(()=>{c(!0),l(!1),f.emit("auth.reset.requested",{emailDomain:a.split("@")[1]||""})},450)};return e.jsxs(R,{page:"forgot-password",children:[e.jsxs("button",{className:"auth-back",type:"button",onClick:()=>o("/login"),"data-testid":"forgot-back-login",children:[e.jsx(Q,{size:16}),"Sign in"]}),e.jsx("div",{className:"auth-mark auth-mark--amber",children:e.jsx(z,{size:28})}),e.jsx("h1",{children:"Forgot password?"}),e.jsx("p",{children:"No worries. Enter your email and the React auth shell will walk through the reset flow."}),i&&e.jsx("div",{className:"auth-inline-error","data-testid":"forgot-error",children:i}),x?e.jsxs("div",{className:"auth-success-panel","data-testid":"forgot-success",children:[e.jsx($,{size:32}),e.jsx("strong",{children:"Check your email"}),e.jsxs("span",{children:["Reset instructions were prepared for ",a,"."]}),e.jsx("button",{className:"btn btn-primary",type:"button",onClick:()=>o("/reset-password"),"data-testid":"forgot-continue-reset",children:"Continue to reset"})]}):e.jsxs("form",{className:"auth-form",onSubmit:b,"data-testid":"forgot-password-form",children:[e.jsxs("label",{children:[e.jsx("span",{children:"Email Address"}),e.jsxs("div",{className:"auth-input-wrap",children:[e.jsx(z,{size:18}),e.jsx("input",{value:a,onChange:w=>u(w.target.value),type:"email",placeholder:"you@example.com","data-testid":"forgot-email"})]})]}),e.jsxs("button",{className:"btn btn-primary auth-submit",type:"submit",disabled:t,"data-testid":"forgot-submit",children:[e.jsx(Z,{size:16}),t?"Sending...":"Send Reset Link"]})]})]})}function pe({navigate:o}){const[a,u]=r.useState(""),[t,l]=r.useState(""),[i,d]=r.useState(!1),[x,c]=r.useState(!1),[m,b]=r.useState(!1),[w,p]=r.useState(""),j=r.useMemo(()=>S(),[]),y=r.useMemo(()=>a.length>=6&&a===t,[t,a]),v=t.length>0&&t!==a,A=async s=>{if(s.preventDefault(),a.length<6){p("Password must be at least 6 characters.");return}if(a!==t){p("Passwords do not match.");return}if(c(!0),p(""),j.passwordReset.canAttempt){try{await W(g(),a),b(!0),c(!1),f.emit("auth.password.updated",{provider:"supabase"})}catch(n){p(n instanceof Error?n.message:String(n)),c(!1)}return}window.setTimeout(()=>{b(!0),c(!1),f.emit("auth.password.updated",{localShell:!0})},520)};return e.jsxs(R,{page:"reset-password",children:[e.jsx("div",{className:`auth-mark ${m?"auth-mark--success":""}`,children:m?e.jsx($,{size:30}):e.jsx(N,{size:30})}),e.jsx("h1",{children:m?"Password reset!":"Reset password"}),e.jsx("p",{"data-testid":"reset-message",children:m?"Your local auth shell accepted the new password state.":"Enter a new password and confirm it below."}),w&&e.jsx("div",{className:"auth-inline-error","data-testid":"reset-error",children:w}),m?e.jsxs("button",{className:"btn btn-primary auth-submit",type:"button",onClick:()=>o("/login"),"data-testid":"reset-login",children:[e.jsx(B,{size:16}),"Sign In"]}):e.jsxs("form",{className:"auth-form",onSubmit:A,"data-testid":"reset-password-form",children:[e.jsxs("label",{children:[e.jsx("span",{children:"New Password"}),e.jsxs("div",{className:"auth-input-wrap",children:[e.jsx(N,{size:18}),e.jsx("input",{value:a,onChange:s=>u(s.target.value),type:i?"text":"password",placeholder:"Enter new password","data-testid":"reset-password-input"}),e.jsx("button",{type:"button",className:"auth-icon-button",title:"Toggle password visibility",onClick:()=>d(s=>!s),"data-testid":"reset-toggle-visibility",children:i?e.jsx(ee,{size:17}):e.jsx(te,{size:17})})]}),e.jsx("span",{className:`auth-requirement ${a.length>=6?"is-met":""}`,children:"At least 6 characters"})]}),e.jsxs("label",{children:[e.jsx("span",{children:"Confirm Password"}),e.jsxs("div",{className:"auth-input-wrap",children:[e.jsx(N,{size:18}),e.jsx("input",{value:t,onChange:s=>l(s.target.value),type:"password",placeholder:"Confirm new password","data-testid":"reset-confirm-input"})]}),t&&e.jsx("span",{className:`auth-requirement ${v?"is-error":"is-met"}`,children:v?"Passwords do not match":"Passwords match"})]}),e.jsxs("button",{className:"btn btn-primary auth-submit",type:"submit",disabled:!y||x,"data-testid":"reset-submit",children:[e.jsx(B,{size:16}),x?"Updating...":"Update Password"]})]})]})}function R({children:o,page:a}){const u=S();return e.jsxs("div",{className:"auth-page","data-testid":"auth-shell","data-auth-page":a,"data-auth-storage-key":K,"data-pricing-checkout-intent-key":U,"data-production-adapter-state":u.overallState,"data-auth-provider-mode":u.auth.mode,"data-auth-provider-ready":u.auth.canAttempt?"true":"false","data-client-secret-blocked":u.forbiddenClientSecretKeys.length>0?"true":"false",children:[e.jsx("div",{className:"auth-scrim"}),e.jsx("section",{className:"auth-card",children:o})]})}export{he as ForgotPasswordPage,de as LoginPage,pe as ResetPasswordPage};
|
|
1
|
+
import{r,j as e}from"./vendor-react-BXzpOyCS.js";import{g as C,a as g,c as k,s as q,b as K,p as F,d as L}from"./index-D8RqkCyH.js";import{p as T,P as U}from"./pricingCheckoutShell-O-DnwmbU.js";import{r as O}from"./productionAdapterConfig-C5jfk6oG.js";import{R as f}from"./app-runtime-xD2Z3NdN.js";import{syncSupabaseAuthSessionToLocalBridge as P,loadSupabaseAuthSession as _,loadSupabaseAuthSessionFromLocalBridge as D,buildSupabaseAuthRedirectUrl as I,startSupabaseGoogleOAuth as H,signOutSupabaseAuthSession as Y,requestSupabasePasswordReset as V,updateSupabasePassword as W}from"./supabaseAuthAdapter-BBfom_he.js";import{X,ak as J,ab as Q,aR as z,ad as $,f as Z,aS as N,K as B,aT as ee,a7 as te}from"./vendor-icons-DE3gIReG.js";import"./canvas-runtime-qWnXqOnu.js";function se(o){return/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(o.trim())}function S(){return O(g())}function E(o,a,u=!1){return o.source==="supabase-provider-session"?a?`Google sign-in is active for ${o.email}. Return to pricing to continue checkout.`:`Google sign-in is active for ${o.email}.`:u?a?"A local auth shell exists, but secure Google sign-in is required before checkout can continue.":"A local auth shell exists, but secure Google sign-in is required before MindCanvas can sync remote services.":a?"A local Google auth shell is active. Return to pricing to continue checkout.":"A local Google auth shell is already active for this browser."}function M(o,a){return a?`Local Google auth shell ready for ${o}. Return to pricing to continue the gated checkout.`:`Local Google auth shell ready for ${o}. Secure Supabase OAuth can replace this adapter later.`}function de({navigate:o}){const[a,u]=r.useState(!1),[t,l]=r.useState(()=>C()),[i]=r.useState(()=>T()),d=r.useMemo(()=>S(),[]),[x,c]=r.useState(()=>{const s=C(),n=T();return s?E(s,!!n,S().auth.canAttempt):n?"Sign in to continue MindCanvas Pro checkout. Payment remains gated until the secure adapter is connected.":"Use your Google account to sync cloud projects. No password to create or remember."});r.useEffect(()=>{if(!d.auth.canAttempt)return;let s=!1;return(async()=>{try{let h=await _(g());if(h.session||(h=await D(g(),"login-local-bridge-session-restore")),s)return;if(!h.session){(t==null?void 0:t.source)==="supabase-provider-session"&&(k(),l(null),c("Google sign-in expired. Choose your account again."),f.emit("auth.supabase.sessionShell.cleared",{source:"login-provider-session-restore",reason:"session-missing"}));return}const G=q({...h.session,source:"supabase-provider-session"});l(G),c(E(G,!!i,d.auth.canAttempt)),await P(g(),"login-provider-session-restore")}catch(h){f.emit("auth.supabase.sessionRestore.uiFailed",{message:h instanceof Error?h.message:String(h)})}})(),()=>{s=!0}},[i,d.auth.canAttempt,t==null?void 0:t.source]),r.useEffect(()=>{(t==null?void 0:t.source)!=="supabase-provider-session"||!d.auth.canAttempt||P(g(),"login-existing-session")},[d.auth.canAttempt,t==null?void 0:t.email,t==null?void 0:t.source]);const m=()=>{const s=C();if(s)return l(s),c(E(s,!!i,d.auth.canAttempt)),s;const n=L();return l(n),c(M(n.email,!!i)),n},b=async()=>{const s=m();s.source==="supabase-provider-session"&&await P(g(),"login-continue");const n={hasCheckoutIntent:!!i,signedIn:!!s,sessionSource:s.source};i?f.emit("auth.returnToPricing",n):f.emit("auth.continueMindCanvas",n),o(i?"/pricing":"/mindcanvas")},w=()=>{const s=L();l(s),c(M(s.email,!!i)),u(!1),window.setTimeout(()=>{b()},240)},p=async()=>{u(!0);const s=await F();if(O(s).auth.canAttempt)try{const h=I("/login",i?"/pricing":"/mindcanvas");c("Opening secure Google sign-in..."),(t==null?void 0:t.source)!=="supabase-provider-session"&&(k(),l(null)),await H(s,h);return}catch(h){c(`Secure Google sign-in failed: ${h instanceof Error?h.message:String(h)}`),u(!1);return}window.setTimeout(()=>{w()},550)},j=!!(t&&(!d.auth.canAttempt||t.source==="supabase-provider-session")),y=j?i?"Continue checkout":"Continue to MindCanvas":a?"Opening Google...":"Continue with Google",v=j?b:p,A=async()=>{u(!0),c("Signing out...");let s="";try{await Y(g(),"login-sign-out")}catch(n){s=n instanceof Error?n.message:String(n),f.emit("auth.signOut.uiFailed",{message:s})}k(),l(null),c(s?`Signed out locally. Provider sign-out warning: ${s}`:i?"Signed out. Choose another Google account to continue checkout.":"Signed out. Choose another Google account to continue."),u(!1)};return e.jsxs(R,{page:"login",children:[e.jsx("button",{className:"auth-close",type:"button",title:"Close",onClick:()=>o("/mindcanvas"),"data-testid":"auth-close",children:e.jsx(X,{size:16})}),e.jsxs("div",{className:"auth-logo",children:[e.jsx(J,{size:24}),e.jsx("strong",{children:"MindExec"})]}),e.jsx("h1",{children:"Sign in with Google"}),e.jsx("p",{"data-testid":"auth-message",children:x}),e.jsxs("button",{className:"google-button",type:"button",disabled:a,onClick:v,"data-testid":"auth-google-shell",children:[e.jsx("span",{className:"google-g",children:"G"}),y]}),e.jsxs("div",{className:"auth-action-strip",children:[t&&i&&e.jsx("button",{type:"button",onClick:()=>void b(),"data-testid":"auth-return-pricing",children:"Return to pricing"}),t&&e.jsx("button",{type:"button",disabled:a,onClick:()=>void A(),"data-testid":"auth-sign-out",children:"Sign out"}),e.jsx("button",{type:"button",onClick:()=>o("/forgot-password"),"data-testid":"auth-forgot-password",children:"Forgot password"}),e.jsx("button",{type:"button",onClick:()=>o("/pricing"),"data-testid":"auth-view-pricing",children:"View pricing"})]}),e.jsx("p",{className:"auth-note",children:d.auth.canAttempt?"Secure Supabase OAuth is connected for this browser build.":"The React port keeps this as a local auth shell until the secure Supabase OAuth adapter is connected."})]})}function he({navigate:o}){const[a,u]=r.useState(""),[t,l]=r.useState(!1),[i,d]=r.useState(""),[x,c]=r.useState(!1),m=r.useMemo(()=>S(),[]),b=async w=>{if(w.preventDefault(),!se(a)){d("Enter a valid email address.");return}if(l(!0),d(""),m.passwordReset.canAttempt){try{const p=I("/reset-password","/login");await V(g(),a,p),c(!0),l(!1),f.emit("auth.reset.requested",{emailDomain:a.split("@")[1]||"",provider:"supabase"})}catch(p){d(p instanceof Error?p.message:String(p)),l(!1)}return}window.setTimeout(()=>{c(!0),l(!1),f.emit("auth.reset.requested",{emailDomain:a.split("@")[1]||""})},450)};return e.jsxs(R,{page:"forgot-password",children:[e.jsxs("button",{className:"auth-back",type:"button",onClick:()=>o("/login"),"data-testid":"forgot-back-login",children:[e.jsx(Q,{size:16}),"Sign in"]}),e.jsx("div",{className:"auth-mark auth-mark--amber",children:e.jsx(z,{size:28})}),e.jsx("h1",{children:"Forgot password?"}),e.jsx("p",{children:"No worries. Enter your email and the React auth shell will walk through the reset flow."}),i&&e.jsx("div",{className:"auth-inline-error","data-testid":"forgot-error",children:i}),x?e.jsxs("div",{className:"auth-success-panel","data-testid":"forgot-success",children:[e.jsx($,{size:32}),e.jsx("strong",{children:"Check your email"}),e.jsxs("span",{children:["Reset instructions were prepared for ",a,"."]}),e.jsx("button",{className:"btn btn-primary",type:"button",onClick:()=>o("/reset-password"),"data-testid":"forgot-continue-reset",children:"Continue to reset"})]}):e.jsxs("form",{className:"auth-form",onSubmit:b,"data-testid":"forgot-password-form",children:[e.jsxs("label",{children:[e.jsx("span",{children:"Email Address"}),e.jsxs("div",{className:"auth-input-wrap",children:[e.jsx(z,{size:18}),e.jsx("input",{value:a,onChange:w=>u(w.target.value),type:"email",placeholder:"you@example.com","data-testid":"forgot-email"})]})]}),e.jsxs("button",{className:"btn btn-primary auth-submit",type:"submit",disabled:t,"data-testid":"forgot-submit",children:[e.jsx(Z,{size:16}),t?"Sending...":"Send Reset Link"]})]})]})}function pe({navigate:o}){const[a,u]=r.useState(""),[t,l]=r.useState(""),[i,d]=r.useState(!1),[x,c]=r.useState(!1),[m,b]=r.useState(!1),[w,p]=r.useState(""),j=r.useMemo(()=>S(),[]),y=r.useMemo(()=>a.length>=6&&a===t,[t,a]),v=t.length>0&&t!==a,A=async s=>{if(s.preventDefault(),a.length<6){p("Password must be at least 6 characters.");return}if(a!==t){p("Passwords do not match.");return}if(c(!0),p(""),j.passwordReset.canAttempt){try{await W(g(),a),b(!0),c(!1),f.emit("auth.password.updated",{provider:"supabase"})}catch(n){p(n instanceof Error?n.message:String(n)),c(!1)}return}window.setTimeout(()=>{b(!0),c(!1),f.emit("auth.password.updated",{localShell:!0})},520)};return e.jsxs(R,{page:"reset-password",children:[e.jsx("div",{className:`auth-mark ${m?"auth-mark--success":""}`,children:m?e.jsx($,{size:30}):e.jsx(N,{size:30})}),e.jsx("h1",{children:m?"Password reset!":"Reset password"}),e.jsx("p",{"data-testid":"reset-message",children:m?"Your local auth shell accepted the new password state.":"Enter a new password and confirm it below."}),w&&e.jsx("div",{className:"auth-inline-error","data-testid":"reset-error",children:w}),m?e.jsxs("button",{className:"btn btn-primary auth-submit",type:"button",onClick:()=>o("/login"),"data-testid":"reset-login",children:[e.jsx(B,{size:16}),"Sign In"]}):e.jsxs("form",{className:"auth-form",onSubmit:A,"data-testid":"reset-password-form",children:[e.jsxs("label",{children:[e.jsx("span",{children:"New Password"}),e.jsxs("div",{className:"auth-input-wrap",children:[e.jsx(N,{size:18}),e.jsx("input",{value:a,onChange:s=>u(s.target.value),type:i?"text":"password",placeholder:"Enter new password","data-testid":"reset-password-input"}),e.jsx("button",{type:"button",className:"auth-icon-button",title:"Toggle password visibility",onClick:()=>d(s=>!s),"data-testid":"reset-toggle-visibility",children:i?e.jsx(ee,{size:17}):e.jsx(te,{size:17})})]}),e.jsx("span",{className:`auth-requirement ${a.length>=6?"is-met":""}`,children:"At least 6 characters"})]}),e.jsxs("label",{children:[e.jsx("span",{children:"Confirm Password"}),e.jsxs("div",{className:"auth-input-wrap",children:[e.jsx(N,{size:18}),e.jsx("input",{value:t,onChange:s=>l(s.target.value),type:"password",placeholder:"Confirm new password","data-testid":"reset-confirm-input"})]}),t&&e.jsx("span",{className:`auth-requirement ${v?"is-error":"is-met"}`,children:v?"Passwords do not match":"Passwords match"})]}),e.jsxs("button",{className:"btn btn-primary auth-submit",type:"submit",disabled:!y||x,"data-testid":"reset-submit",children:[e.jsx(B,{size:16}),x?"Updating...":"Update Password"]})]})]})}function R({children:o,page:a}){const u=S();return e.jsxs("div",{className:"auth-page","data-testid":"auth-shell","data-auth-page":a,"data-auth-storage-key":K,"data-pricing-checkout-intent-key":U,"data-production-adapter-state":u.overallState,"data-auth-provider-mode":u.auth.mode,"data-auth-provider-ready":u.auth.canAttempt?"true":"false","data-client-secret-blocked":u.forbiddenClientSecretKeys.length>0?"true":"false",children:[e.jsx("div",{className:"auth-scrim"}),e.jsx("section",{className:"auth-card",children:o})]})}export{he as ForgotPasswordPage,de as LoginPage,pe as ResetPasswordPage};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as f,j as e}from"./vendor-react-BXzpOyCS.js";import{g as ns,ah as is,s as _e,B as jt,j as Fr,ai as qr,z as yt,aA as Kr,aB as Or,aC as Ur,aD as zr,aE as Hr,aF as Gr,c as ws,a3 as Qr,aG as Jr,aH as Vr,E as Xr,aI as os,aJ as ds,aK as Yr,aL as Zr,aM as en}from"./canvas-runtime-
|
|
1
|
+
import{r as f,j as e}from"./vendor-react-BXzpOyCS.js";import{g as ns,ah as is,s as _e,B as jt,j as Fr,ai as qr,z as yt,aA as Kr,aB as Or,aC as Ur,aD as zr,aE as Hr,aF as Gr,c as ws,a3 as Qr,aG as Jr,aH as Vr,E as Xr,aI as os,aJ as ds,aK as Yr,aL as Zr,aM as en}from"./canvas-runtime-qWnXqOnu.js";import{R as q}from"./app-runtime-xD2Z3NdN.js";import{l as tn}from"./executionModeSettings-NJqurj-o.js";import{g as Ss,r as rt,b as ta,p as Cs,a as As,c as Ns,d as Ps,e as Rs,f as Xe,h as Is,i as Es,j as $s,k as Ms,l as Ls,m as Ds,n as Ts,o as Bs,q as _s,s as ls,t as an,u as Qt,v as ht,w as we,x as sn,y as De,z as rn,A as nn,B as on,C as Ws,D as nt,E as dn,F as cs,G as ln,H as cn,I as us,J as wt,K as un,L as pn,M as gn,N as hn,O as mn,P as fn,Q as vn,R as bn,S as xn,T as jn,U as yn,V as kn,W as wn,X as Sn,Y as Cn,Z as An,_ as Nn,$ as Pn,a0 as Rn,a1 as In,a2 as En,a3 as $n,a4 as Mn,a5 as Ln,a6 as Dn,a7 as Tn,a8 as Bn,a9 as _n,aa as Wn,ab as Fn,ac as qn,ad as Kn,ae as On,af as Un,ag as zn,ah as Hn,ai as Gn}from"./code-agent-runtime-B5PPZd1t.js";import{an as Qe,R as Wt,c as Mt,ad as Lt,ae as ps,ac as Jt,b5 as Qn,b6 as Dt,b7 as Tt,a3 as gs,b8 as St,ao as Jn,g as Ft}from"./vendor-icons-DE3gIReG.js";import"./runtimeSettingsPersistenceProjection-BoNWmYjU.js";const Bt=["Web.Search","Web.FetchPage","Browser.Actionbook","Browser.Open","Browser.Snapshot","Browser.Extract","Extract.Structured","Evidence.Save","FinalAnswer"],Vn=["web-research-evidence","source-triage","structured-extraction","evidence-save"],Xn=["evidence-first","source-backed-summary","citation-ready-records","adapter-gated-browser"],Fs=[{id:"capture-endpoint",label:"POST /capture",summary:"Use the original Cloudflare web-capture-worker endpoint only after a verified adapter is connected."},{id:"capture-auth",label:"Supabase bearer",summary:"Require a Supabase Authorization bearer before capture work can start."},{id:"capture-request",label:"url nodeId width height force",summary:"Plan the capture request shape without sending it from the React shell."},{id:"capture-safety",label:"public URL guard",summary:"Allow public http/https only; block localhost, private networks, metadata hosts, redirects, and private subresources."},{id:"capture-cache",label:"bounded force refresh",summary:"Respect the worker cache and FORCE_RECAPTURE_MIN_SECONDS before recapturing a URL."},{id:"capture-output",label:"snapshot evidence",summary:"Treat snapshotUrl, thumbnailUrl, and capturedAt as Evidence.Save inputs after adapter success."}];function Yn(){return Fs.map(t=>`- ${t.label}: ${t.summary}`)}const aa="mindexec-react-code-workflow-v1";function hs(t){const a=`code-note-review:${t.id}`,n=t.artifacts.map(o=>({workItemId:a,kind:o.startsWith("local-runtime-trace://")?"trace":o.includes("implementation-handoff")?"handoff":"artifact",summary:o,path:o})),i=n.length>0;return{reviewTitle:t.title,targetFiles:t.relatedFiles,artifacts:n,evaluations:[],upstreamWorkItems:i?[{id:a,title:t.title,status:"completed",lastOutcome:t.acceptanceCriteria||t.body||t.why}]:[{id:a,title:t.title,status:"pending"}]}}function Zn(t){var v,_,w,N,J,F,g,oe,Y,Pe,Ye,Se;const a=((v=t.capabilities)==null?void 0:v.sandboxModes)||((w=(_=t.bridge.status)==null?void 0:_.codex)==null?void 0:w.sandboxModes)||[],n=((N=t.capabilities)==null?void 0:N.providers)||((F=(J=t.bridge.status)==null?void 0:J.codex)==null?void 0:F.providers)||[],i="LegacyExec",o=n.find(Re=>Re.kind===i),d=((oe=(g=t.bridge.status)==null?void 0:g.project)==null?void 0:oe.rootPath)||((Y=t.bridge.status)==null?void 0:Y.workspace)||t.projectPath.trim(),h=[{key:"selected-command",label:"Selected command",state:t.command?"pass":"blocked",value:((Pe=t.command)==null?void 0:Pe.title)||"No selected command"},{key:"bridge-connected",label:"LocalBridge",state:t.bridge.state==="connected"?"pass":"blocked",value:t.bridge.state},{key:"bridge-token",label:"Bridge token",state:(Ye=t.bridge.status)!=null&&Ye.bridgeToken?"pass":"blocked",value:(Se=t.bridge.status)!=null&&Se.bridgeToken?"available":"missing"},{key:"workspace-write",label:"Sandbox mode",state:a.includes("workspace_write")?"pass":"blocked",value:a.join(", ")||"unknown"},{key:"legacy-provider",label:"Provider",state:(o==null?void 0:o.available)===!0?"pass":"blocked",value:(o==null?void 0:o.available)===!0?i:"LegacyExec unavailable"},{key:"project-root",label:"Project root",state:d?"pass":"blocked",value:d||"missing"},{key:"network-off",label:"Network",state:"pass",value:"networkAccessEnabled=false"},{key:"web-search-off",label:"Web search",state:"pass",value:"webSearchMode=disabled"},{key:"approval-policy",label:"Approval policy",state:"pass",value:"approvalPolicy=never for workspace_write only"}],j=h.filter(Re=>Re.state==="pass").length,b=h.filter(Re=>Re.state==="blocked").length,k=h.filter(Re=>Re.state==="warn").length;return{state:b===0?"opt-in-required":"adapter-gated",reason:b===0?"All technical checks pass; live project-write still requires the explicit opt-in smoke.":"Project-write execution stays gated until the missing checks pass.",providerKind:i,sandbox:"workspace_write",approvalPolicy:"never",webSearchMode:"disabled",networkAccessEnabled:!1,workingDirectory:d,additionalDirectories:d?[d]:[],allowedChangedFiles:["src/project-write-proof.ts"],forbiddenCommandPattern:"curl|wget|wrangler|npm publish|npm install|git push|Remove-Item|rm -rf",passCount:j,blockedCount:b,warnCount:k,checks:h}}function ei(t){let a=2166136261;for(let n=0;n<t.length;n+=1)a^=t.charCodeAt(n),a=Math.imul(a,16777619)>>>0;return a.toString(16).padStart(8,"0")}function qs(t){const a=vt(t.targetFiles).slice(0,10),n=vt(t.allowedChangedFiles).slice(0,10),i=t.diffPreview.slice(0,10),o=t.applyPlan.slice(0,10),d=t.blockedReasons.slice(0,8),h={adapterState:"draft-only",providerKind:t.providerKind||"LegacyExec",sandbox:"workspace_write",approvalPolicy:"never",networkAccessEnabled:!1,webSearchMode:"disabled"},j=[`policy=${h.adapterState}|${h.providerKind}|${h.sandbox}|${h.approvalPolicy}|network=${h.networkAccessEnabled}|webSearch=${h.webSearchMode}`,`targets=${a.join("|")}`,`allowed=${n.join("|")}`,`forbidden=${t.forbiddenCommandPattern}`,`diff=${i.map(k=>`${k.file}:${k.changeKind}:${k.summary}:${k.risk}`).join("|")}`,`apply=${o.join("|")}`,`blocked=${d.join("|")}`].join(`
|
|
2
2
|
`),b=ei(j);return{version:1,manifestId:`project-write-dryrun-${b}`,generatedFrom:"react-local-draft",policy:h,targetFileCount:a.length,diffPreviewCount:i.length,applyStepCount:o.length,blockedReasonCount:d.length,allowedChangedFiles:n,targetFiles:a,forbiddenCommandPattern:t.forbiddenCommandPattern,safetyDigest:b}}function ti(t){const a=vt([...t.linkedNotes.flatMap(b=>b.relatedFiles),...t.readiness.allowedChangedFiles]).slice(0,10),n=a.map(b=>{const k=t.readiness.allowedChangedFiles.includes(b);return{file:b,changeKind:k?"create":"modify",summary:k?"Create the bounded project-write proof file during the opt-in smoke.":"Candidate implementation target derived from linked Code Note context.",risk:k?"Low: disposable proof path, still requires opt-in smoke confirmation.":"Review required: only change after approval, diff inspection, and local gates."}}),i=t.readiness.checks.filter(b=>b.state==="blocked").map(b=>`${b.label}: ${b.value}`).slice(0,8),o=z(["Project-write draft for opt-in execution only.",`Language: ${t.appLanguage}`,`Objective: ${t.command.objective}`,`Constraints: ${t.command.constraints||"Use the readiness policy and linked note acceptance criteria."}`,`Planner summary: ${t.command.plannerSummary||"-"}`,t.linkedNotes.length>0?`Linked notes: ${t.linkedNotes.map(b=>`${b.title} [${b.status}]`).join("; ")}`:"Linked notes: none",`Target files: ${a.join(", ")||"-"}`,"Do not deploy Cloudflare, publish npm packages, browse the web, call billing, or mutate files outside the bounded target set."].join(`
|
|
3
3
|
`),1600),d=["Review the diff preview and blockers in this local draft.","Approve the draft locally only when target files and linked notes are correct.","Stage the apply plan without writing files from the React UI.","Run the explicit opt-in project-write smoke from a terminal.","Inspect changed files and command logs, then run npm run check.","Keep Cloudflare deploy and npm publish out of this flow until explicitly approved."],h=["Run the default read-only Execute Command first and inspect its summary.","Confirm linked Code Notes are approved or reviewed before live writes.","Keep networkAccessEnabled=false and webSearchMode=disabled.","Allow only the listed target/proof files to change.",`Reject command logs matching ${t.readiness.forbiddenCommandPattern}.`,"Run npm run check after any project-write proof."],j=qs({providerKind:t.readiness.providerKind,targetFiles:a,diffPreview:n,applyPlan:d,blockedReasons:i,allowedChangedFiles:t.readiness.allowedChangedFiles,forbiddenCommandPattern:t.readiness.forbiddenCommandPattern});return{adapterState:"draft-only",generatedAt:new Date().toISOString(),readinessState:t.readiness.state,approvalState:"pending-review",applyPlanState:"not-staged",providerKind:t.readiness.providerKind,sandbox:t.readiness.sandbox,approvalPolicy:t.readiness.approvalPolicy,webSearchMode:t.readiness.webSearchMode,networkAccessEnabled:t.readiness.networkAccessEnabled,workingDirectory:t.readiness.workingDirectory,additionalDirectories:t.readiness.additionalDirectories,allowedChangedFiles:t.readiness.allowedChangedFiles,forbiddenCommandPattern:t.readiness.forbiddenCommandPattern,targetFiles:a,diffPreview:n,applyPlan:d,linkedNoteIds:t.command.linkedNoteIds,blockedReasons:i,checklist:h,dryRunManifest:j,promptPreview:o,smokeCommand:"$env:MINDEXEC_CODEX_LIVE_PROJECT_WRITE_CONFIRM='I_UNDERSTAND_THIS_WRITES_PROJECT_WORKSPACE'; npm run verify:codemaster-codex-live-project-write-smoke"}}function Vt(){const t=We("code-note"),a=We("agent-command");return{selectedCommandId:a,selectedNoteId:t,lastMessage:"CodeMaster workflow restored as local React state.",commands:[{id:a,title:"Audit React parity",objective:"Compare original CodeMaster flows with the React port and queue the next implementation slice.",constraints:"Do not mutate project files from this local shell. Keep execution adapter-gated.",requestedRole:"CEO",status:"planned",runtimeProfile:ht("Use graph evidence, linked notes, and the runtime contract before proposing execution."),plannerSummary:"Use graph stats, hot files, and code notes as context before routing to a real agent adapter.",plannedSkills:["repo-audit","contract-review","runtime-verification"],plannedTools:["SearchInFiles","ReadFileRange","Code.Actionbook","GetDiagnostics","FinalAnswer"],plannedConcepts:["CodeGraph parity","adapter-gated execution","trace evidence","LocalBridge graph","React board state","Cloudflare deploy checks"],linkedNoteIds:[t],progressDigest:we({phase:{key:"react-code-workflow-restore",title:"CodeMaster parity",summary:"Default CodeMaster workflow restored as local React state.",why:"The React port needs the original planning loop before live agent execution is reattached.",gap:"Pick the next original-reference workflow slice and verify it under the React contract.",candidates:["Review contract evidence","Plan the next implementation slice"]},step:{stepNumber:1,toolName:"React.LocalState",observation:"CodeMaster command and code note drafts are available without LocalBridge execution."}})}],notes:[{id:t,title:"CodeMaster React parity slice",body:"Keep the original CodeMaster habit: write the goal as a code note, connect graph context, approve it, then hand it to execution only after evidence is ready.",kind:"Feature",status:"draft",syncState:"unlinked",plannerPhase:"manual",why:"Natural language code planning should survive the Blazor-to-React port before live agent execution is reattached.",relatedFiles:["src/App.tsx","src/lib/localBridge.ts","docs/contracts/react-runtime-contract.md"],relatedSymbols:["CodePage","RuntimeTrace","ProjectGraphSnapshot"],acceptanceCriteria:"The /code and /agent routes can create, select, edit, approve, and persist code notes plus agent command drafts without LocalBridge.",artifacts:[]}]}}function ai(){var t,a;try{const n=window.localStorage.getItem(aa);if(!n){const b=Vt();return q.emit("codegraph.workflow.loaded",{source:"default",commands:b.commands.length,notes:b.notes.length}),b}const i=JSON.parse(n),o=Vt(),d=Array.isArray(i.notes)?i.notes.map(hi).filter(Boolean):o.notes,h=Array.isArray(i.commands)?i.commands.map(b=>ri(b,d)).filter(Boolean):o.commands,j={commands:h.length>0?h:o.commands,notes:d.length>0?d:o.notes,selectedCommandId:i.selectedCommandId&&h.some(b=>b.id===i.selectedCommandId)?i.selectedCommandId:((t=h[0])==null?void 0:t.id)??null,selectedNoteId:i.selectedNoteId&&d.some(b=>b.id===i.selectedNoteId)?i.selectedNoteId:((a=d[0])==null?void 0:a.id)??null,lastMessage:String(i.lastMessage||o.lastMessage)};return q.emit("codegraph.workflow.loaded",{source:"stored",commands:j.commands.length,notes:j.notes.length}),j}catch(n){const i=Vt();return q.emit("codegraph.workflow.failed",{source:"load",message:n instanceof Error?n.message:String(n),commands:i.commands.length,notes:i.notes.length}),i}}function si(t){try{window.localStorage.setItem(aa,JSON.stringify(t)),q.emit("codegraph.workflow.saved",{commands:t.commands.length,notes:t.notes.length,selectedCommandId:t.selectedCommandId,selectedNoteId:t.selectedNoteId})}catch(a){q.emit("codegraph.workflow.failed",{source:"save",message:a instanceof Error?a.message:String(a)})}}function ri(t,a){if(!t||typeof t!="object")return null;const n=t,i=new Set(a.map(d=>d.id)),o=Ws({plannedTools:Q(n.plannedTools),plannedConcepts:Q(n.plannedConcepts)});return{id:String(n.id||We("agent-command")),title:String(n.title||"Agent"),objective:String(n.objective||""),constraints:String(n.constraints||""),requestedRole:String(n.requestedRole||"CEO"),status:mi(n.status)?n.status:"planned",runtimeProfile:wt(n.runtimeProfile),plannerSummary:String(n.plannerSummary||""),plannedSkills:Q(n.plannedSkills),plannedTools:o.plannedTools,plannedConcepts:o.plannedConcepts,linkedNoteIds:Q(n.linkedNoteIds).filter(d=>i.has(d)),linkedMissionId:n.linkedMissionId?String(n.linkedMissionId):void 0,linkedWorkItemIds:Q(n.linkedWorkItemIds),lastExecutedAt:n.lastExecutedAt?String(n.lastExecutedAt):void 0,progressDigest:Gn(n.progressDigest),researchAdapter:di(n.researchAdapter),parallelScout:ci(n.parallelScout),researchPearls:pi(n.researchPearls),projectWriteDraft:ni(n.projectWriteDraft)}}function ni(t){if(!t||typeof t!="object")return;const a=t,n=a.readinessState==="opt-in-required"?"opt-in-required":"adapter-gated",i=a.approvalState==="approved-local"||a.approvalState==="rejected-local"?a.approvalState:"pending-review",o=a.applyPlanState==="staged-local"?"staged-local":"not-staged",d=String(a.providerKind||"LegacyExec"),h=Q(a.targetFiles).slice(0,10),j=Q(a.allowedChangedFiles),b=String(a.forbiddenCommandPattern||"curl|wget|wrangler|npm publish|npm install|git push|Remove-Item|rm -rf"),k=Array.isArray(a.diffPreview)?a.diffPreview.map(oi).filter(Boolean):[],v=k.length>0?k.slice(0,10):h.map(J=>({file:J,changeKind:"verify-only",summary:"Reloaded draft target awaiting a refreshed diff preview.",risk:"Review required before opt-in execution."})),_=Q(a.applyPlan).length>0?Q(a.applyPlan).slice(0,10):["Review the refreshed diff preview and blockers.","Approve locally before staging the apply plan.","Run the explicit opt-in project-write smoke from a terminal.","Run npm run check after any project-write proof."],w=Q(a.blockedReasons).slice(0,8),N=ii(a.dryRunManifest,{providerKind:d,targetFiles:h,diffPreview:v,applyPlan:_,blockedReasons:w,allowedChangedFiles:j,forbiddenCommandPattern:b});return{adapterState:"draft-only",generatedAt:a.generatedAt?String(a.generatedAt):new Date().toISOString(),readinessState:n,approvalState:i,approvalUpdatedAt:a.approvalUpdatedAt?String(a.approvalUpdatedAt):void 0,approvalNote:a.approvalNote?String(a.approvalNote):void 0,applyPlanState:o,applyPlanStagedAt:a.applyPlanStagedAt?String(a.applyPlanStagedAt):void 0,providerKind:d,sandbox:"workspace_write",approvalPolicy:"never",webSearchMode:"disabled",networkAccessEnabled:!1,workingDirectory:String(a.workingDirectory||""),additionalDirectories:Q(a.additionalDirectories),allowedChangedFiles:j,forbiddenCommandPattern:b,targetFiles:h,diffPreview:v,applyPlan:_,linkedNoteIds:Q(a.linkedNoteIds),blockedReasons:w,checklist:Q(a.checklist).slice(0,10),dryRunManifest:N,promptPreview:z(String(a.promptPreview||""),1800),smokeCommand:String(a.smokeCommand||"$env:MINDEXEC_CODEX_LIVE_PROJECT_WRITE_CONFIRM='I_UNDERSTAND_THIS_WRITES_PROJECT_WORKSPACE'; npm run verify:codemaster-codex-live-project-write-smoke")}}function ii(t,a){const n=qs(a);if(!t||typeof t!="object")return n;const i=t;return i.safetyDigest&&i.safetyDigest!==n.safetyDigest,n}function oi(t){if(!t||typeof t!="object")return null;const a=t,n=a.changeKind==="create"||a.changeKind==="modify"||a.changeKind==="verify-only"?a.changeKind:"verify-only";return{file:String(a.file||""),changeKind:n,summary:String(a.summary||"Project write target awaiting review."),risk:String(a.risk||"Review required before opt-in execution.")}}function di(t){if(!t||typeof t!="object")return;const a=t,n=["idle","running","done","blocked","error"].includes(String(a.status))?a.status:"idle",i=a.adapterState==="localbridge-connected"||a.adapterState==="error"?a.adapterState:"adapter-gated";return{status:n,adapterState:i,query:String(a.query||""),source:a.source?String(a.source):void 0,retrievedAt:a.retrievedAt?String(a.retrievedAt):void 0,resultCount:Number.isFinite(Number(a.resultCount))?Number(a.resultCount):void 0,topTitle:a.topTitle?String(a.topTitle):void 0,topUrl:a.topUrl?String(a.topUrl):void 0,topSnippet:a.topSnippet?String(a.topSnippet):void 0,fetchTitle:a.fetchTitle?String(a.fetchTitle):void 0,fetchUrl:a.fetchUrl?String(a.fetchUrl):void 0,fetchContentPreview:a.fetchContentPreview?String(a.fetchContentPreview):void 0,fetchContentType:a.fetchContentType?String(a.fetchContentType):void 0,fetchTruncated:a.fetchTruncated===!0,browserSessionId:a.browserSessionId?String(a.browserSessionId):void 0,browserTitle:a.browserTitle?String(a.browserTitle):void 0,browserUrl:a.browserUrl?String(a.browserUrl):void 0,browserContentType:a.browserContentType?String(a.browserContentType):void 0,browserLinkCount:Number.isFinite(Number(a.browserLinkCount))?Number(a.browserLinkCount):void 0,browserButtonCount:Number.isFinite(Number(a.browserButtonCount))?Number(a.browserButtonCount):void 0,browserInputCount:Number.isFinite(Number(a.browserInputCount))?Number(a.browserInputCount):void 0,browserHeadingCount:Number.isFinite(Number(a.browserHeadingCount))?Number(a.browserHeadingCount):void 0,browserSnapshotPreview:a.browserSnapshotPreview?String(a.browserSnapshotPreview):void 0,browserSnapshotTruncated:a.browserSnapshotTruncated===!0,browserExtractScope:a.browserExtractScope?String(a.browserExtractScope):void 0,browserExtractPreview:a.browserExtractPreview?String(a.browserExtractPreview):void 0,browserExtractTruncated:a.browserExtractTruncated===!0,structuredEvidence:li(a.structuredEvidence),providerWarnings:Q(a.providerWarnings),error:a.error?String(a.error):void 0}}function li(t){if(!t||typeof t!="object")return;const a=t,n=a.evidenceSaveState==="saved"||a.evidenceSaveState==="saving"||a.evidenceSaveState==="error"?a.evidenceSaveState:"draft-only";return{schema:a.schema==="pricing"?"pricing":"facts",sourceType:a.sourceType==="browser"||a.sourceType==="adapter"?a.sourceType:"web",title:String(a.title||"Structured evidence draft"),summary:String(a.summary||""),facts:Q(a.facts).slice(0,8),dates:Q(a.dates).slice(0,8),links:Q(a.links).slice(0,8),prices:Q(a.prices).slice(0,8),excerpt:String(a.excerpt||""),query:String(a.query||""),sourceUrl:a.sourceUrl?String(a.sourceUrl):void 0,charCount:Number.isFinite(Number(a.charCount))?Number(a.charCount):0,structuredAt:a.structuredAt?String(a.structuredAt):new Date().toISOString(),evidenceKind:String(a.evidenceKind||"web_source"),evidenceSaveState:n,evidenceSaveId:a.evidenceSaveId?String(a.evidenceSaveId):void 0,evidenceSavePath:a.evidenceSavePath?String(a.evidenceSavePath):void 0,evidenceSaveSha256:a.evidenceSaveSha256?String(a.evidenceSaveSha256):void 0,evidenceSavedAt:a.evidenceSavedAt?String(a.evidenceSavedAt):void 0,evidenceSaveError:a.evidenceSaveError?String(a.evidenceSaveError):void 0}}function ci(t){if(!t||typeof t!="object")return;const a=t,n=Array.isArray(a.definitions)?a.definitions.map(ui).filter(Boolean):[];if(n.length!==0)return{adapterState:"adapter-gated",trancheIndex:Je(a.trancheIndex,1),targetPearls:Je(a.targetPearls,30),pearlsPerTranche:Je(a.pearlsPerTranche,5),concurrencyLimit:Je(a.concurrencyLimit,2),maxIterations:Je(a.maxIterations,6),definitions:n.slice(0,5),brief:String(a.brief||""),plannedAt:a.plannedAt?String(a.plannedAt):new Date().toISOString()}}function ui(t){if(!t||typeof t!="object")return null;const a=t,n=a.status==="succeeded"||a.status==="blocked"?a.status:"planned";return{key:String(a.key||We("scout")),title:String(a.title||"Parallel scout"),focus:String(a.focus||""),goal:String(a.goal||""),status:n,summary:String(a.summary||"")}}function pi(t){if(!t||typeof t!="object")return;const a=t,n=a.source==="structured-evidence"||a.source==="parallel-scout"||a.source==="local-sample"?a.source:"planner-summary",i=Array.isArray(a.candidates)?a.candidates.map(gi).filter(Boolean):[];return{source:n,adapterState:"local-draft",trancheIndex:Je(a.trancheIndex,1),targetPearls:Je(a.targetPearls,30),pearlsPerTranche:Je(a.pearlsPerTranche,5),candidates:i.slice(0,12),acceptedCount:ms(a.acceptedCount,i.filter(o=>!o.duplicate).length),duplicateRejectCount:ms(a.duplicateRejectCount,i.filter(o=>o.duplicate).length),extractedAt:a.extractedAt?String(a.extractedAt):new Date().toISOString()}}function gi(t){if(!t||typeof t!="object")return null;const a=t,n={id:String(a.id||We("research-pearl")),angleKey:String(a.angleKey||""),lane:String(a.lane||"General"),title:String(a.title||a.claim||"Research pearl"),claim:String(a.claim||""),whyNew:String(a.whyNew||""),evidence:String(a.evidence||""),executionMethod:String(a.executionMethod||""),expectedImpact:String(a.expectedImpact||""),risk:String(a.risk||""),nextExperiment:String(a.nextExperiment||""),score:Number.isFinite(Number(a.score))?Number(a.score):void 0,duplicate:a.duplicate===!0,markdown:String(a.markdown||"")};return n.markdown=n.markdown||Kt(n),n.angleKey.trim()||n.claim.trim()?n:null}function Je(t,a){const n=Number(t);return!Number.isFinite(n)||n<=0?a:Math.max(1,Math.round(n))}function ms(t,a){const n=Number(t);return!Number.isFinite(n)||n<0?Math.max(0,Math.round(a)):Math.max(0,Math.round(n))}function hi(t){if(!t||typeof t!="object")return null;const a=t;return{id:String(a.id||We("code-note")),title:String(a.title||"New Code Note"),body:String(a.body||""),kind:String(a.kind||"Feature"),status:fi(a.status)?a.status:"draft",syncState:vi(a.syncState)?a.syncState:"unlinked",plannerPhase:a.plannerPhase?String(a.plannerPhase):void 0,why:String(a.why||""),relatedFiles:Q(a.relatedFiles),relatedSymbols:Q(a.relatedSymbols),acceptanceCriteria:String(a.acceptanceCriteria||""),artifacts:Q(a.artifacts),linkedMissionId:a.linkedMissionId?String(a.linkedMissionId):void 0,linkedWorkItemId:a.linkedWorkItemId?String(a.linkedWorkItemId):void 0,lastAppliedAt:a.lastAppliedAt?String(a.lastAppliedAt):void 0}}function Q(t){return Array.isArray(t)?t.map(a=>String(a).trim()).filter(Boolean).slice(0,12):[]}function mi(t){return t==="planned"||t==="running"||t==="done"||t==="blocked"}function fi(t){return t==="draft"||t==="proposed"||t==="approved"||t==="queued"||t==="implementing"||t==="implemented"||t==="reviewed"||t==="blocked"||t==="deprecated"||t==="out-of-sync"}function vi(t){return t==="planned"||t==="unlinked"||t==="in-sync"||t==="out-of-sync"||t==="needs-review"||t==="orphaned"}function We(t){return`${t}-${Math.random().toString(36).slice(2,9)}`}function kt(t){return t.split(/\r?\n|,/).map(a=>a.trim()).filter(Boolean).slice(0,12)}function Xt(t){return t.split(/\r?\n|,/).map(a=>a.trim()).filter(Boolean).slice(0,48)}function Ge(t){return t.join(`
|
|
4
4
|
`)}function fs(t,a){const n=t.trim();return n?n.length>44?`${n.slice(0,41).trimEnd()}...`:n:a}function bi(t){return t==="lite"?"low":t==="deep"?"high":"medium"}function z(t,a=1800){const n=t.trim();return n.length<=a?n:`${n.slice(0,a-3).trimEnd()}...`}function ft(t){if(!t)return!1;const a=Xe({plannedTools:t.plannedTools,plannedConcepts:t.plannedConcepts});return nt(t.requestedRole)==="Researcher"||a.actualTools.some(n=>n.startsWith("Web.")||n.startsWith("Browser."))}function xi(t){return t==="done"?.9:t==="running"?.58:t==="blocked"?.34:.18}function ji(t){var i,o;const a=(o=(i=t.progressDigest)==null?void 0:i.metadata.toolName)==null?void 0:o.trim();if(a)return a;if(t.status==="blocked")return"GetDiagnostics";if(t.status==="done")return"FinalAnswer";const n=Xe({plannedTools:t.plannedTools,plannedConcepts:t.plannedConcepts}).actualTools.find(d=>/web\.search|browser\.|searchinfiles|readfile|applypatch|runbuild|runtests|getdiagnostics|code\.actionbook|test\.runbook/i.test(d));return n||(ft(t)?"Web.Search":"ReadFile")}function yi(t,a){var j,b;const n=ft(t),i=Number(((j=t.progressDigest)==null?void 0:j.metadata.evidenceGain)||0),o=a.filter(k=>k.artifacts.length>0||k.status==="approved"||k.status==="reviewed").length,d=t.status==="blocked"?[t.plannerSummary||t.constraints||"Selected command is blocked."]:[],h=[...t.plannedConcepts,...t.plannedSkills,...a.map(k=>k.acceptanceCriteria||k.title)].filter(Boolean).slice(0,3);return De({goal:t.objective,activeGoal:t.title,currentFocus:t.plannerSummary||t.title,rationale:((b=t.progressDigest)==null?void 0:b.metadata.phaseTitle)||t.plannerSummary||t.constraints,blockers:d,nextActions:h,missionProgress:xi(t.status),isResearchContext:n,evidenceCount:Math.max(0,i,o),requiredEvidence:n?2:1,toolName:ji(t),completed:t.status==="done"})}function mt(t){if(!t||!ft(t))return!1;const a=[t.objective,t.constraints,t.plannerSummary,...t.plannedConcepts,...t.plannedSkills].join(" ").toLowerCase();return["business","startup","opportunity","monetize","monetization","revenue","profit","cash","pricing","customer","channel","distribution","acquisition","sales","willingness to pay","time-to-cash","micro-saas","saas","mvp","landing page","playbook","marketing","growth","viral","seo","audience","go to market","gtm","launch","partnership","community"].some(n=>a.includes(n))}function ki(t,a){const n=jn({template:"market",query:t.objective,includeSnapshot:!0,maxChars:6e3,followText:"Extract citation-ready evidence for the selected CodeMaster command."});return[t.plannerSummary||"Research command planned from the React CodeMaster shell.","","WebResearch local pack:","- Discover candidates with Web.Search.","- Use Browser.Actionbook or Browser.Snapshot when interaction matters.","- Condense raw page material through Extract.Structured.","- Save durable, citation-ready source records with Evidence.Save.","- When visual page evidence is needed, stage the original web-capture-worker request without launching Browser Run.","","Web Capture adapter plan:",...Yn(),"",mt(t)?"Parallel Scout plan: build five adapter-gated Deep Research lanes before the main run consumes successful scout outcomes.":"Parallel Scout plan: only business opportunity research commands receive Deep Research scout lanes.","",n,"",`Current graph context: ${a.nodes} nodes, ${a.edges} edges, ${a.files} files, ${a.symbols} symbols.`,"Adapter boundary: React plans the research workflow locally and does not browse, download, save evidence, or claim live web results until a verified adapter runs."].join(`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as o,j as e}from"./vendor-react-BXzpOyCS.js";import{s as pe,z as st,B as rt,aq as ot,ar as ct,as as lt,at as dt,au as pt,av as ut,aw as mt,ax as ht,ay as gt,az as yt}from"./canvas-runtime-F1OftOhQ.js";import{R as y}from"./app-runtime-xD2Z3NdN.js";import{an as bt,R as ft,a3 as Be,ad as vt,c as xt,D as wt,h as kt,aA as Ct}from"./vendor-icons-DE3gIReG.js";const ee=[{role:"bootstrap",label:"Low Risk / Bootstrap-Friendly",strategy:"Single-function AI utility with a capped free tier",why:"Ship one painful workflow as a narrow tool before building a broad platform surface.",keyPoints:["Keep the product boundary small enough for one founder to maintain.","Use the free tier as proof of repeated usage, not as vanity traffic.","Convert on saved history, exports, and team review rather than raw access."],executionPlaybook:["Name one repetitive task with clear input and output.","Build a deterministic workflow around that task before adding broad AI chat.","Publish a before-and-after proof page for the workflow.","Add usage caps and one paid upgrade path after repeat usage is visible."],firstProof:"Publish one before-and-after demo and collect five qualified problem statements.",monetization:"Free utility, then USD monthly subscription for saved history, exports, and team review.",expectedImpact:{initialCac:"$0-$25 through niche community demos",monthlyGrowthRate:"5-12% while proof content compounds",requiredCapital:"$0-$500 before paid adapter work"},toolsServices:["LLM APIs","Stripe or Paddle","Product Hunt"],caveats:["The free tier must be capped tightly enough to protect model cost.","A narrow tool can be copied, so proof quality and workflow memory matter."],keywords:["ai","workflow","utility","solo","builder","memory","proof","launch","automation","canvas"],sourcePrinciples:["Single-function AI utility solving repetitive knowledge work","Freemium subscription model with tiered access"]},{role:"bootstrap",label:"Low Risk / Bootstrap-Friendly",strategy:"Expert template library with paid packs",why:"A template pack lets a solo founder validate willingness to pay without heavy runtime infrastructure.",keyPoints:["Package expertise as finished artifacts before building a larger engine.","Sell a narrow outcome instead of a vague productivity promise.","Use pack sales and replies as demand evidence for the later SaaS."],executionPlaybook:["Create three outcome-specific templates from the same product engine.","Publish a free sample and a paid pack with concrete examples.","Collect buyer objections and missing-template requests.","Turn repeated requests into the next automated workflow."],firstProof:"Release three outcome-specific templates and measure completed downloads plus replies.",monetization:"One-time paid packs that can later become a subscription library.",expectedImpact:{initialCac:"$0-$15 from direct creator channels",monthlyGrowthRate:"3-8% until a recurring workflow is added",requiredCapital:"$0-$200 for payment and landing setup"},toolsServices:["Gumroad or Lemon Squeezy","Notion","Email capture"],caveats:["Templates validate appetite, but they do not prove recurring software retention.","The artifact must feel complete enough to buy without a sales call."],keywords:["template","pack","content","prompt","playbook","doc","notion","guide","side project"],sourcePrinciples:["AI-driven frameworks for structured ideation","Simultaneously create validation artifacts during ideation phase"]},{role:"bootstrap",label:"Low Risk / Bootstrap-Friendly",strategy:"Bootstrapped marketplace wedge",why:"Marketplace-native distribution can validate a small paid workflow before paid acquisition or enterprise integrations are needed.",keyPoints:["Borrow demand from a marketplace where the target buyer already searches.","Start with a listing, plug-in, or downloadable asset before a full platform.","Reinvest every early dollar into proof quality and retention evidence."],executionPlaybook:["Pick one marketplace with existing buyer intent.","Publish a tightly scoped first listing with a measurable before-and-after result.","Use marketplace analytics to identify the strongest niche language.","Move repeat buyers into an owned email or workspace loop."],firstProof:"Launch one marketplace listing and track saves, installs, replies, and paid trials.",monetization:"Marketplace sale or lightweight subscription, then owned direct plan after proof.",expectedImpact:{initialCac:"$0-$30 from marketplace search",monthlyGrowthRate:"4-10% while listing rank improves",requiredCapital:"$0-$300 plus marketplace fees"},toolsServices:["Shopify App Store","Chrome Web Store","Etsy","Stripe"],caveats:["Platform policy changes can break distribution.","Marketplace users compare quickly, so positioning must be painfully specific."],keywords:["marketplace","plugin","extension","shopify","chrome","store","distribution","bootstrap"],sourcePrinciples:["Marketplace-native distribution","Bootstrapped revenue reinvestment"]},{role:"growth",label:"High Growth / Viral",strategy:"Community-led proof loop",why:"Make the output easy to share so each user proof becomes distribution for the workflow.",keyPoints:["Every generated result should be useful as a public artifact.","Community posts should teach first and sell second.","The product loop should capture replies as future feature evidence."],executionPlaybook:["Create one shareable proof page for every successful run.","Post the proof in one high-fit community with transparent context.","Add a small badge or fork button that brings viewers back into the workflow.","Turn repeated comments into the next validation prompt."],firstProof:"Generate a public proof page for each run and add a shareable result badge.",monetization:"Free public proofs with paid private workspaces, branding removal, and analytics.",expectedImpact:{initialCac:"$0-$10 from Reddit, Indie Hackers, and X posts",monthlyGrowthRate:"10-25% when proofs travel",requiredCapital:"$0-$500 for hosting and analytics"},toolsServices:["Reddit","Indie Hackers","Product Hunt","Analytics"],caveats:["Communities punish low-effort promotion.","Shareable output must be genuinely useful without signing in."],keywords:["community","viral","share","proof","public","launch","founder","reddit","indie","growth"],sourcePrinciples:["Organic community-driven launch","Simultaneously create validation artifacts during ideation phase"]},{role:"growth",label:"High Growth / Viral",strategy:"Creator-led video proof engine",why:"Video demos make a complex workflow easier to trust and can turn each build session into search-driven distribution.",keyPoints:["Turn the product doing work into content, not a separate marketing chore.","Use repeatable screen recordings to show before-and-after transformation.","Let public demos feed the next workflow backlog."],executionPlaybook:["Record short workflow transformations with one buyer problem per video.","Publish the same proof as YouTube, Shorts, and a written teardown.","Invite viewers to submit their own input for the next public run.","Gate private runs, saved history, and exports behind a paid plan."],firstProof:"Publish three short workflow videos and measure comments, saves, and inbound prompts.",monetization:"Free public video proofs with paid private execution workspace and consulting upgrades.",expectedImpact:{initialCac:"$0-$20 but time-heavy",monthlyGrowthRate:"8-20% after a searchable content base forms",requiredCapital:"$0-$400 for capture, editing, and hosting"},toolsServices:["YouTube","Loom","Screen Studio","Email capture"],caveats:["Audience growth is slower than direct outreach.","The founder must keep publishing consistently enough for the loop to learn."],keywords:["youtube","video","demo","content","creator","tutorial","screen","marketing"],sourcePrinciples:["Build YouTube content as primary distribution channel","Replace text with video messaging"]},{role:"growth",label:"High Growth / Viral",strategy:"Ecosystem wedge for an existing mass-market tool",why:"Attaching to a tool people already use reduces adoption friction and discovery cost.",keyPoints:["Integrate with a tool that already owns the daily habit.","Solve the secondary workflow the platform does not prioritize.","Keep import/export compatibility visible from day one."],executionPlaybook:["Pick one ecosystem with a large installed base and obvious workflow pain.","Build one import/export path before trying deep two-way sync.","Launch in the ecosystem community with a concrete migration example.","Track which imported objects become paid retained workspaces."],firstProof:"Create an import/export flow for one existing tool and launch in that community.",monetization:"Subscription for automation limits, synced history, and advanced integrations.",expectedImpact:{initialCac:"$0-$40 from ecosystem communities",monthlyGrowthRate:"12-30% if the wedge becomes a habit",requiredCapital:"$200-$1,500 for integration polish"},toolsServices:["Chrome extension","Zapier","Notion API","Slack or Discord"],caveats:["Third-party API changes can create urgent maintenance.","The wedge must respect ecosystem conventions or users will reject it."],keywords:["integration","ecosystem","notion","slack","chrome","import","export","sync","agent"],sourcePrinciples:["Tapping established mass-market ecosystems","Accelerated component-based development"]},{role:"premium",label:"Premium / High Margin",strategy:"High-margin operating cockpit",why:"A cockpit can justify higher pricing when it combines decisions, evidence, and repeatable execution.",keyPoints:["Sell a decision system, not a generic AI surface.","Make evidence, approvals, and artifact history visible enough for serious buyers.","Use onboarding and audit trails as premium value, not overhead."],executionPlaybook:["Run the cockpit manually for three qualified buyers.","Document every repeated decision, approval, and artifact handoff.","Productize the repeated path while keeping money and publish actions gated.","Sell annual access after one measurable business outcome is proven."],firstProof:"Run the workflow manually for three buyers and turn each result into a paid case study.",monetization:"Premium monthly seat or annual license with onboarding, priority workflows, and audit trails.",expectedImpact:{initialCac:"$50-$300 through direct outreach",monthlyGrowthRate:"3-10% with high ARPA and referrals",requiredCapital:"$500-$2,500 for onboarding and support bandwidth"},toolsServices:["CRM","Stripe or Paddle","Audit logs","Customer interviews"],caveats:["Premium buyers need trust, proof, and support.","A cockpit must stay calm and operational, not decorative."],keywords:["cockpit","dashboard","operations","execution","approval","audit","company","decision","workspace"],sourcePrinciples:["High-margin operating cockpit","Data-driven UX optimization"]},{role:"premium",label:"Premium / High Margin",strategy:"Done-with-you specialist workflow",why:"Service-assisted delivery can discover the exact product boundary before automating the expensive parts.",keyPoints:["Charge for expert execution while learning which steps deserve software.","Use each sprint as a structured discovery session.","Keep the future product boundary grounded in paid work, not guesses."],executionPlaybook:["Offer a fixed-price sprint with a clear deliverable.","Deliver manually through the React cockpit and record every repeated step.","Convert repeated steps into reusable product modules.","Move satisfied sprint buyers to recurring access."],firstProof:"Offer a fixed-price sprint and capture every repeated step as future product scope.",monetization:"High-ticket setup fee plus recurring platform access after the sprint.",expectedImpact:{initialCac:"$75-$500 from targeted founder outreach",monthlyGrowthRate:"2-8% but high cash efficiency",requiredCapital:"$0-$1,000, mostly founder time"},toolsServices:["Calendly","Stripe invoice","Screen recordings","CRM"],caveats:["Service work can crowd out product building if not bounded.","Every sprint needs a product-learning artifact."],keywords:["consulting","service","sprint","premium","founder","agency","case study"],sourcePrinciples:["Done-with-you specialist workflow","Compressed time entrepreneurship"]},{role:"premium",label:"Premium / High Margin",strategy:"Compliance or policy-shift command center",why:"When external rules change, buyers pay more for a system that turns uncertainty into a tracked action plan.",keyPoints:["Monitor a niche where rule changes create urgent business work.","Translate changes into tasks, evidence, and approval checkpoints.","Price around risk reduction and implementation confidence."],executionPlaybook:["Pick one policy-sensitive niche with visible upcoming changes.","Create a local readiness checklist and evidence graph.","Run one manual audit for a target buyer.","Turn the audit into a recurring monitoring workspace."],firstProof:"Complete one paid readiness audit and identify the repeatable monitoring workflow.",monetization:"Annual license or monitoring retainer with premium onboarding.",expectedImpact:{initialCac:"$100-$600 through targeted expert outreach",monthlyGrowthRate:"2-6% but high retention if the risk persists",requiredCapital:"$500-$3,000 for expert validation"},toolsServices:["Monitoring feeds","CRM","Audit logs","Secure storage"],caveats:["Bad advice can create trust and liability risk.","Expert review should remain explicit until a verified adapter exists."],keywords:["compliance","policy","regulatory","risk","audit","security","finance","health","legal"],sourcePrinciples:["Regulatory shift anticipation","Premium high-margin operating model"]}],jt=["bootstrap","growth","premium"];function St(){return ee.length}function At(a,i){const n=a.trim()||"Untitled company",p=i.trim()||"Untitled SaaS idea",v=`${n} ${p}`,A=jt.map(r=>{const I=ee.filter($=>$.role===r).map($=>Pt($,v)).sort(($,G)=>G.score-$.score||$.strategy.strategy.localeCompare(G.strategy.strategy))[0],{keywords:S,sourcePrinciples:E,...q}=I.strategy;return{...q,matchSignals:I.matchSignals.length>0?I.matchSignals:E.slice(0,2),score:I.score}}),k=Array.from(new Set(A.flatMap(r=>r.matchSignals))).slice(0,8);return{content:["# SaaS Strategy Blueprint","",`Company: ${n}`,`Idea: ${p}`,"","Adapter boundary: this is a deterministic local blueprint generated from the React knowledge base extracted from the original Business plugin. It does not claim live AI, checkout, publishing, CRM, or external execution until a bridge-backed adapter returns evidence.",`Knowledge base: ${ee.length} local strategy entries / ${k.length} matched signals.`,"",...A.flatMap((r,U)=>[`### Option ${U+1}: ${r.strategy} (${r.label})`,"","**Why this fits:**",r.why,"","**Key points:**",...r.keyPoints.map(w=>`- ${w}`),"","**Execution playbook:**",...r.executionPlaybook.map((w,I)=>`${I+1}. ${w}`),"","**Expected impact:**",`- Initial CAC: ${r.expectedImpact.initialCac}`,`- Expected monthly growth rate: ${r.expectedImpact.monthlyGrowthRate}`,`- Required capital: ${r.expectedImpact.requiredCapital}`,"","**First proof:**",r.firstProof,"","**Monetization:**",r.monetization,"","**Knowledge signals:**",...r.matchSignals.map(w=>`- ${w}`),"","**Caveats:**",...r.caveats.map(w=>`- ${w}`),""]),"Next local action: pick one option, produce one proof artifact, and keep every external action approval-gated."].join(`
|
|
1
|
+
import{r as o,j as e}from"./vendor-react-BXzpOyCS.js";import{s as pe,z as st,B as rt,aq as ot,ar as ct,as as lt,at as dt,au as pt,av as ut,aw as mt,ax as ht,ay as gt,az as yt}from"./canvas-runtime-qWnXqOnu.js";import{R as y}from"./app-runtime-xD2Z3NdN.js";import{an as bt,R as ft,a3 as Be,ad as vt,c as xt,D as wt,h as kt,aA as Ct}from"./vendor-icons-DE3gIReG.js";const ee=[{role:"bootstrap",label:"Low Risk / Bootstrap-Friendly",strategy:"Single-function AI utility with a capped free tier",why:"Ship one painful workflow as a narrow tool before building a broad platform surface.",keyPoints:["Keep the product boundary small enough for one founder to maintain.","Use the free tier as proof of repeated usage, not as vanity traffic.","Convert on saved history, exports, and team review rather than raw access."],executionPlaybook:["Name one repetitive task with clear input and output.","Build a deterministic workflow around that task before adding broad AI chat.","Publish a before-and-after proof page for the workflow.","Add usage caps and one paid upgrade path after repeat usage is visible."],firstProof:"Publish one before-and-after demo and collect five qualified problem statements.",monetization:"Free utility, then USD monthly subscription for saved history, exports, and team review.",expectedImpact:{initialCac:"$0-$25 through niche community demos",monthlyGrowthRate:"5-12% while proof content compounds",requiredCapital:"$0-$500 before paid adapter work"},toolsServices:["LLM APIs","Stripe or Paddle","Product Hunt"],caveats:["The free tier must be capped tightly enough to protect model cost.","A narrow tool can be copied, so proof quality and workflow memory matter."],keywords:["ai","workflow","utility","solo","builder","memory","proof","launch","automation","canvas"],sourcePrinciples:["Single-function AI utility solving repetitive knowledge work","Freemium subscription model with tiered access"]},{role:"bootstrap",label:"Low Risk / Bootstrap-Friendly",strategy:"Expert template library with paid packs",why:"A template pack lets a solo founder validate willingness to pay without heavy runtime infrastructure.",keyPoints:["Package expertise as finished artifacts before building a larger engine.","Sell a narrow outcome instead of a vague productivity promise.","Use pack sales and replies as demand evidence for the later SaaS."],executionPlaybook:["Create three outcome-specific templates from the same product engine.","Publish a free sample and a paid pack with concrete examples.","Collect buyer objections and missing-template requests.","Turn repeated requests into the next automated workflow."],firstProof:"Release three outcome-specific templates and measure completed downloads plus replies.",monetization:"One-time paid packs that can later become a subscription library.",expectedImpact:{initialCac:"$0-$15 from direct creator channels",monthlyGrowthRate:"3-8% until a recurring workflow is added",requiredCapital:"$0-$200 for payment and landing setup"},toolsServices:["Gumroad or Lemon Squeezy","Notion","Email capture"],caveats:["Templates validate appetite, but they do not prove recurring software retention.","The artifact must feel complete enough to buy without a sales call."],keywords:["template","pack","content","prompt","playbook","doc","notion","guide","side project"],sourcePrinciples:["AI-driven frameworks for structured ideation","Simultaneously create validation artifacts during ideation phase"]},{role:"bootstrap",label:"Low Risk / Bootstrap-Friendly",strategy:"Bootstrapped marketplace wedge",why:"Marketplace-native distribution can validate a small paid workflow before paid acquisition or enterprise integrations are needed.",keyPoints:["Borrow demand from a marketplace where the target buyer already searches.","Start with a listing, plug-in, or downloadable asset before a full platform.","Reinvest every early dollar into proof quality and retention evidence."],executionPlaybook:["Pick one marketplace with existing buyer intent.","Publish a tightly scoped first listing with a measurable before-and-after result.","Use marketplace analytics to identify the strongest niche language.","Move repeat buyers into an owned email or workspace loop."],firstProof:"Launch one marketplace listing and track saves, installs, replies, and paid trials.",monetization:"Marketplace sale or lightweight subscription, then owned direct plan after proof.",expectedImpact:{initialCac:"$0-$30 from marketplace search",monthlyGrowthRate:"4-10% while listing rank improves",requiredCapital:"$0-$300 plus marketplace fees"},toolsServices:["Shopify App Store","Chrome Web Store","Etsy","Stripe"],caveats:["Platform policy changes can break distribution.","Marketplace users compare quickly, so positioning must be painfully specific."],keywords:["marketplace","plugin","extension","shopify","chrome","store","distribution","bootstrap"],sourcePrinciples:["Marketplace-native distribution","Bootstrapped revenue reinvestment"]},{role:"growth",label:"High Growth / Viral",strategy:"Community-led proof loop",why:"Make the output easy to share so each user proof becomes distribution for the workflow.",keyPoints:["Every generated result should be useful as a public artifact.","Community posts should teach first and sell second.","The product loop should capture replies as future feature evidence."],executionPlaybook:["Create one shareable proof page for every successful run.","Post the proof in one high-fit community with transparent context.","Add a small badge or fork button that brings viewers back into the workflow.","Turn repeated comments into the next validation prompt."],firstProof:"Generate a public proof page for each run and add a shareable result badge.",monetization:"Free public proofs with paid private workspaces, branding removal, and analytics.",expectedImpact:{initialCac:"$0-$10 from Reddit, Indie Hackers, and X posts",monthlyGrowthRate:"10-25% when proofs travel",requiredCapital:"$0-$500 for hosting and analytics"},toolsServices:["Reddit","Indie Hackers","Product Hunt","Analytics"],caveats:["Communities punish low-effort promotion.","Shareable output must be genuinely useful without signing in."],keywords:["community","viral","share","proof","public","launch","founder","reddit","indie","growth"],sourcePrinciples:["Organic community-driven launch","Simultaneously create validation artifacts during ideation phase"]},{role:"growth",label:"High Growth / Viral",strategy:"Creator-led video proof engine",why:"Video demos make a complex workflow easier to trust and can turn each build session into search-driven distribution.",keyPoints:["Turn the product doing work into content, not a separate marketing chore.","Use repeatable screen recordings to show before-and-after transformation.","Let public demos feed the next workflow backlog."],executionPlaybook:["Record short workflow transformations with one buyer problem per video.","Publish the same proof as YouTube, Shorts, and a written teardown.","Invite viewers to submit their own input for the next public run.","Gate private runs, saved history, and exports behind a paid plan."],firstProof:"Publish three short workflow videos and measure comments, saves, and inbound prompts.",monetization:"Free public video proofs with paid private execution workspace and consulting upgrades.",expectedImpact:{initialCac:"$0-$20 but time-heavy",monthlyGrowthRate:"8-20% after a searchable content base forms",requiredCapital:"$0-$400 for capture, editing, and hosting"},toolsServices:["YouTube","Loom","Screen Studio","Email capture"],caveats:["Audience growth is slower than direct outreach.","The founder must keep publishing consistently enough for the loop to learn."],keywords:["youtube","video","demo","content","creator","tutorial","screen","marketing"],sourcePrinciples:["Build YouTube content as primary distribution channel","Replace text with video messaging"]},{role:"growth",label:"High Growth / Viral",strategy:"Ecosystem wedge for an existing mass-market tool",why:"Attaching to a tool people already use reduces adoption friction and discovery cost.",keyPoints:["Integrate with a tool that already owns the daily habit.","Solve the secondary workflow the platform does not prioritize.","Keep import/export compatibility visible from day one."],executionPlaybook:["Pick one ecosystem with a large installed base and obvious workflow pain.","Build one import/export path before trying deep two-way sync.","Launch in the ecosystem community with a concrete migration example.","Track which imported objects become paid retained workspaces."],firstProof:"Create an import/export flow for one existing tool and launch in that community.",monetization:"Subscription for automation limits, synced history, and advanced integrations.",expectedImpact:{initialCac:"$0-$40 from ecosystem communities",monthlyGrowthRate:"12-30% if the wedge becomes a habit",requiredCapital:"$200-$1,500 for integration polish"},toolsServices:["Chrome extension","Zapier","Notion API","Slack or Discord"],caveats:["Third-party API changes can create urgent maintenance.","The wedge must respect ecosystem conventions or users will reject it."],keywords:["integration","ecosystem","notion","slack","chrome","import","export","sync","agent"],sourcePrinciples:["Tapping established mass-market ecosystems","Accelerated component-based development"]},{role:"premium",label:"Premium / High Margin",strategy:"High-margin operating cockpit",why:"A cockpit can justify higher pricing when it combines decisions, evidence, and repeatable execution.",keyPoints:["Sell a decision system, not a generic AI surface.","Make evidence, approvals, and artifact history visible enough for serious buyers.","Use onboarding and audit trails as premium value, not overhead."],executionPlaybook:["Run the cockpit manually for three qualified buyers.","Document every repeated decision, approval, and artifact handoff.","Productize the repeated path while keeping money and publish actions gated.","Sell annual access after one measurable business outcome is proven."],firstProof:"Run the workflow manually for three buyers and turn each result into a paid case study.",monetization:"Premium monthly seat or annual license with onboarding, priority workflows, and audit trails.",expectedImpact:{initialCac:"$50-$300 through direct outreach",monthlyGrowthRate:"3-10% with high ARPA and referrals",requiredCapital:"$500-$2,500 for onboarding and support bandwidth"},toolsServices:["CRM","Stripe or Paddle","Audit logs","Customer interviews"],caveats:["Premium buyers need trust, proof, and support.","A cockpit must stay calm and operational, not decorative."],keywords:["cockpit","dashboard","operations","execution","approval","audit","company","decision","workspace"],sourcePrinciples:["High-margin operating cockpit","Data-driven UX optimization"]},{role:"premium",label:"Premium / High Margin",strategy:"Done-with-you specialist workflow",why:"Service-assisted delivery can discover the exact product boundary before automating the expensive parts.",keyPoints:["Charge for expert execution while learning which steps deserve software.","Use each sprint as a structured discovery session.","Keep the future product boundary grounded in paid work, not guesses."],executionPlaybook:["Offer a fixed-price sprint with a clear deliverable.","Deliver manually through the React cockpit and record every repeated step.","Convert repeated steps into reusable product modules.","Move satisfied sprint buyers to recurring access."],firstProof:"Offer a fixed-price sprint and capture every repeated step as future product scope.",monetization:"High-ticket setup fee plus recurring platform access after the sprint.",expectedImpact:{initialCac:"$75-$500 from targeted founder outreach",monthlyGrowthRate:"2-8% but high cash efficiency",requiredCapital:"$0-$1,000, mostly founder time"},toolsServices:["Calendly","Stripe invoice","Screen recordings","CRM"],caveats:["Service work can crowd out product building if not bounded.","Every sprint needs a product-learning artifact."],keywords:["consulting","service","sprint","premium","founder","agency","case study"],sourcePrinciples:["Done-with-you specialist workflow","Compressed time entrepreneurship"]},{role:"premium",label:"Premium / High Margin",strategy:"Compliance or policy-shift command center",why:"When external rules change, buyers pay more for a system that turns uncertainty into a tracked action plan.",keyPoints:["Monitor a niche where rule changes create urgent business work.","Translate changes into tasks, evidence, and approval checkpoints.","Price around risk reduction and implementation confidence."],executionPlaybook:["Pick one policy-sensitive niche with visible upcoming changes.","Create a local readiness checklist and evidence graph.","Run one manual audit for a target buyer.","Turn the audit into a recurring monitoring workspace."],firstProof:"Complete one paid readiness audit and identify the repeatable monitoring workflow.",monetization:"Annual license or monitoring retainer with premium onboarding.",expectedImpact:{initialCac:"$100-$600 through targeted expert outreach",monthlyGrowthRate:"2-6% but high retention if the risk persists",requiredCapital:"$500-$3,000 for expert validation"},toolsServices:["Monitoring feeds","CRM","Audit logs","Secure storage"],caveats:["Bad advice can create trust and liability risk.","Expert review should remain explicit until a verified adapter exists."],keywords:["compliance","policy","regulatory","risk","audit","security","finance","health","legal"],sourcePrinciples:["Regulatory shift anticipation","Premium high-margin operating model"]}],jt=["bootstrap","growth","premium"];function St(){return ee.length}function At(a,i){const n=a.trim()||"Untitled company",p=i.trim()||"Untitled SaaS idea",v=`${n} ${p}`,A=jt.map(r=>{const I=ee.filter($=>$.role===r).map($=>Pt($,v)).sort(($,G)=>G.score-$.score||$.strategy.strategy.localeCompare(G.strategy.strategy))[0],{keywords:S,sourcePrinciples:E,...q}=I.strategy;return{...q,matchSignals:I.matchSignals.length>0?I.matchSignals:E.slice(0,2),score:I.score}}),k=Array.from(new Set(A.flatMap(r=>r.matchSignals))).slice(0,8);return{content:["# SaaS Strategy Blueprint","",`Company: ${n}`,`Idea: ${p}`,"","Adapter boundary: this is a deterministic local blueprint generated from the React knowledge base extracted from the original Business plugin. It does not claim live AI, checkout, publishing, CRM, or external execution until a bridge-backed adapter returns evidence.",`Knowledge base: ${ee.length} local strategy entries / ${k.length} matched signals.`,"",...A.flatMap((r,U)=>[`### Option ${U+1}: ${r.strategy} (${r.label})`,"","**Why this fits:**",r.why,"","**Key points:**",...r.keyPoints.map(w=>`- ${w}`),"","**Execution playbook:**",...r.executionPlaybook.map((w,I)=>`${I+1}. ${w}`),"","**Expected impact:**",`- Initial CAC: ${r.expectedImpact.initialCac}`,`- Expected monthly growth rate: ${r.expectedImpact.monthlyGrowthRate}`,`- Required capital: ${r.expectedImpact.requiredCapital}`,"","**First proof:**",r.firstProof,"","**Monetization:**",r.monetization,"","**Knowledge signals:**",...r.matchSignals.map(w=>`- ${w}`),"","**Caveats:**",...r.caveats.map(w=>`- ${w}`),""]),"Next local action: pick one option, produce one proof artifact, and keep every external action approval-gated."].join(`
|
|
2
2
|
`),options:A,sourceStrategyCount:ee.length,knowledgeSignals:k}}function Pt(a,i){const n=i.toLowerCase(),p=a.keywords.filter(g=>n.includes(g.toLowerCase())),v=a.sourcePrinciples.filter(g=>g.toLowerCase().split(/[^a-z0-9]+/).filter(Boolean).some(r=>r.length>4&&n.includes(r))),A=Nt(`${i}:${a.strategy}`)%100/1e3,k=Math.min(.99,.42+p.length*.08+v.length*.05+A);return{strategy:a,matchSignals:Array.from(new Set([...p,...v])),score:k}}function Nt(a){let i=2166136261;for(let n=0;n<a.length;n+=1)i^=a.charCodeAt(n),i=Math.imul(i,16777619);return i>>>0}const me="mindexec-react-company-core-v1",N={id:"company-mindexec-global-launch",name:"MindExec Global Launch",goal:"Ship a USD-first execution cockpit for solo builders and prove one paid workflow.",status:"running",enableSubAgents:!0,createdAt:"2026-06-21T00:00:00.000Z"};function x(){return new Date().toISOString()}function f(a){return typeof crypto<"u"&&"randomUUID"in crypto?`${a}-${crypto.randomUUID()}`:`${a}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}function te(){return{companies:[N],runs:[{id:"run-local-readiness",companyId:N.id,action:"Prepare React CompanyCore cockpit",status:"completed",createdAt:x()}],approvals:[{id:"approval-pricing-proof",companyId:N.id,riskLevel:"medium",toolName:"PublishingJob.MarkPublished",action:"Publish pricing proof after hosted verification",summary:"External publishing stays human-gated until a real URL and checkout adapter are confirmed.",status:"pending"}],artifacts:[{id:"artifact-launch-contract",companyId:N.id,type:"launch-contract",summary:"USD-first launch contract and verification checklist",path:"company-core/mindexec-global-launch/launch-contract.md",content:`Goal: prove MindExec can turn a free utility workflow into a durable paid MindCanvas workflow.
|
|
3
3
|
|
|
4
4
|
Evidence required: hosted URL, working React route, pricing gate, lead capture, and one reusable execution artifact.`,createdAt:x()}],publishing:[{id:"publish-launch-note",companyId:N.id,channel:"Launch note",action:"Publish hosted proof URL after route verification",status:"draft"}],signals:[{id:"signal-builder-memory",companyId:N.id,community:"solo builders",text:"People lose momentum when AI outputs are scattered across chats and files.",detectedPain:"Reusable context and evidence disappear between work sessions.",relevance:.88,url:"https://mindexec.pages.dev/mindcanvas"}],growthDecisions:[{id:"growth-decision-continue",companyId:N.id,kind:"continue",score:.74,reason:"The free tools to MindCanvas handoff gives a clear low-friction funnel.",next:"Create one English proof asset that shows a tool result becoming a canvas plan."}],revenueDecisions:[{id:"revenue-decision-pilot",companyId:N.id,kind:"continue",score:.68,reason:"The $12 Pro path is plausible once saved boards and launch evidence are visible.",next:"Keep checkout gated until secure payment adapter is wired."}],metrics:[{id:"metric-cta-click",companyId:N.id,name:"cta_click_rate",value:.08,unit:"ratio",createdAt:x()}],reflections:[{id:"reflection-local-shell",companyId:N.id,scope:"CompanyCore React port",summary:"The web cockpit can operate locally while external publish and money actions remain gated.",ruleUpdate:"Never show external actions as completed without adapter evidence.",createdAt:x()}],selectedCompanyId:N.id,lastActionMessage:"Local CompanyCore shell restored.",bridgeProjection:{source:"local"}}}function It(){var a;try{const i=window.localStorage.getItem(me);if(!i){const v=te();return y.emit("companyCore.localState.loaded",{source:"default",companies:v.companies.length}),v}const n=JSON.parse(i);if(!Array.isArray(n.companies)||n.companies.length===0){const v=te();return y.emit("companyCore.localState.loaded",{source:"invalid",companies:v.companies.length}),v}const p={companies:n.companies,runs:Array.isArray(n.runs)?n.runs:[],approvals:Array.isArray(n.approvals)?n.approvals:[],artifacts:Array.isArray(n.artifacts)?n.artifacts:[],publishing:Array.isArray(n.publishing)?n.publishing:[],signals:Array.isArray(n.signals)?n.signals:[],growthDecisions:Array.isArray(n.growthDecisions)?n.growthDecisions:[],revenueDecisions:Array.isArray(n.revenueDecisions)?n.revenueDecisions:[],metrics:Array.isArray(n.metrics)?n.metrics:[],reflections:Array.isArray(n.reflections)?n.reflections:[],selectedCompanyId:n.selectedCompanyId,lastActionMessage:n.lastActionMessage,bridgeProjection:((a=n.bridgeProjection)==null?void 0:a.source)==="bridge"?n.bridgeProjection:{source:"local"}};return y.emit("companyCore.localState.loaded",{source:"stored",companies:p.companies.length,selectedCompanyId:p.selectedCompanyId||""}),p}catch(i){return y.emit("companyCore.localState.failed",{operation:"load",message:i instanceof Error?i.message:String(i)}),te()}}function $t(a){try{window.localStorage.setItem(me,JSON.stringify(a)),y.emit("companyCore.localState.saved",{companies:a.companies.length,selectedCompanyId:a.selectedCompanyId||"",artifacts:a.artifacts.length})}catch(i){y.emit("companyCore.localState.failed",{operation:"save",message:i instanceof Error?i.message:String(i)})}}function he(a){return Math.max(.1,Math.min(.99,a))}function d(a,i){return String(a??"").trim()||i}function Ge(a){const i=String(a||"").toLowerCase();return i.includes("pause")?"paused":i.includes("queue")||i.includes("draft")?"queued":"running"}function Rt(a){const i=String(a||"").toLowerCase();return i.includes("run")||i.includes("progress")?"running":i.includes("queue")||i.includes("pending")?"queued":"completed"}function Mt(a){const i=String(a||"").toLowerCase();return i.includes("reject")||i.includes("deny")?"rejected":i.includes("approve")||i.includes("accept")||i.includes("execut")?"approved":"pending"}function Bt(a){const i=String(a||"").toLowerCase();return i.includes("high")?"high":i.includes("low")?"low":"medium"}function Dt(a){const i=String(a||"").toLowerCase();return i.includes("publish")||i.includes("done")||i.includes("complete")?"published":i.includes("queue")||i.includes("pending")?"queued":"draft"}function ze(a){const i=String(a||"").toLowerCase();return i.includes("scale")?"scale":i.includes("pivot")?"pivot":i.includes("kill")||i.includes("stop")?"kill":"continue"}function Lt(a,i){return{id:d(a.id,`bridge-company-${i+1}`),name:d(a.name,"Unnamed CompanyCore company"),goal:d(a.purpose||a.topGoalId,"Bridge-backed CompanyCore company"),status:Ge(a.status),enableSubAgents:!0,createdAt:x()}}function Gt(a,i){return{id:d(a.id,`bridge-run-${i+1}`),companyId:d(a.companyId,"bridge-company"),action:d(a.summary||a.type,"CompanyCore bridge run"),status:Rt(a.status),createdAt:d(a.createdAt,x())}}function zt(a,i,n){return{id:d(a.id,`bridge-approval-${i+1}`),companyId:d(a.companyId,n),riskLevel:Bt(a.riskLevel),toolName:d(a.toolName,"CompanyCore.Tool"),action:d(a.action,"Review bridge approval"),summary:d(a.summary||a.expectedImpact||a.rollbackPlan,"Bridge approval requires explicit review."),status:Mt(a.status)}}function Tt(a,i,n){const p=d(a.path,`company-core/bridge-artifact-${i+1}.md`);return{id:d(a.id,`bridge-artifact-${i+1}`),companyId:d(a.companyId,n),type:d(a.type,"bridge-artifact"),summary:d(a.summary,p),path:p,content:["# CompanyCore Bridge Artifact","",`Path: ${p}`,`Summary: ${d(a.summary,"No summary provided by bridge.")}`,"","Content preview remains read-only in React until artifact content streaming is wired."].join(`
|