@mindexec/cli 0.2.367 → 0.2.369
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-3LcuAtsJ.js → AdminDashboardPage-CTr-QRCb.js} +1 -1
- package/wwwroot/assets/AppSidebar-DzOsvUsP.js +2 -0
- package/wwwroot/assets/{AuthPages-Dy6PF7Bt.js → AuthPages-C5lUqzIU.js} +1 -1
- package/wwwroot/assets/{CodePage-CYXq8GTo.js → CodePage-Do4K07Ge.js} +1 -1
- package/wwwroot/assets/{CompanyCorePage-C5XVok23.js → CompanyCorePage-iD32axX4.js} +1 -1
- package/wwwroot/assets/{ExecutionModePage-DIApda43.js → ExecutionModePage-BHn-i9eu.js} +1 -1
- package/wwwroot/assets/{LaunchLeadCapture-BBRvHVnf.js → LaunchLeadCapture-Btre_FaA.js} +1 -1
- package/wwwroot/assets/{MarketingHome-GDLBvBqb.js → MarketingHome-BJI2zEYK.js} +1 -1
- package/wwwroot/assets/MindCanvas-CE6MTFCJ.js +48 -0
- package/wwwroot/assets/{PlanMasterPage-DLMFSdXW.js → PlanMasterPage-B9XXbERQ.js} +1 -1
- package/wwwroot/assets/{PricingPage-B49awnso.js → PricingPage-DynAXBL4.js} +1 -1
- package/wwwroot/assets/{ToolPages-baTmOCPP.js → ToolPages-DLme_QLb.js} +1 -1
- package/wwwroot/assets/{YouTubeSearchPage-D5mKtwgV.js → YouTubeSearchPage-BSQIhWnY.js} +1 -1
- package/wwwroot/assets/{canvas-runtime-BT5B2knz.js → canvas-runtime-CcSvL_l6.js} +1 -1
- package/wwwroot/assets/{index-bMdZ9KL8.js → index-CVhGWqQM.js} +2 -2
- package/wwwroot/assets/index-yNpEK-gp.css +1 -0
- package/wwwroot/assets/{storage-CWBhPPV8.js → storage-C8yTm9Oa.js} +1 -1
- package/wwwroot/assets/{supabaseAuthAdapter-DbmbdXn-.js → supabaseAuthAdapter-BRbhWFpi.js} +1 -1
- package/wwwroot/assets/{vendor-icons-Bt6FQ3FW.js → vendor-icons-678PAT8P.js} +1 -1
- package/wwwroot/index.html +3 -3
- package/wwwroot/assets/AppSidebar-DOM7tVOy.js +0 -2
- package/wwwroot/assets/MindCanvas-DYMYQl1C.js +0 -48
- package/wwwroot/assets/index-C59PJe77.css +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r,j as e}from"./vendor-react-BXzpOyCS.js";import{l as Re,i as Le}from"./storage-
|
|
1
|
+
import{r,j as e}from"./vendor-react-BXzpOyCS.js";import{l as Re,i as Le}from"./storage-C8yTm9Oa.js";import{a9 as ee,s as Q,aa as Te,a8 as Y,ab as $e}from"./canvas-runtime-CcSvL_l6.js";import{R as j}from"./app-runtime-xD2Z3NdN.js";import{aJ as Ee,Q as te,g as ze,aL as q,N as se,aM as De,A as ae,aN as Ie,aO as Be,J as re,aP as Fe,aQ as ne,R as Oe,c as Ue,F as Ge,T as _e,h as Je,aC as He,aR as Ke}from"./vendor-icons-678PAT8P.js";import"./runtimeSettingsPersistenceProjection-BoNWmYjU.js";const ie="mindexec-react-planmaster-v1",le=["Planning","Product","Marketing","Monetization","Ops","Growth"],oe=["Pending","Running","Done","Blocked","Failed"],Qe=["Canvas.ListMindMapNodes","Plan.ListSteps","Plan.SetStepStatus","Plan.CreateNote"],Ye=["Pending","Running","Done","Failed"],ce=["all","artifact","reflection","next_action","blocker","evidence","decision"],S="Launch MindExec React with a clear global USD path and one proof-producing user workflow.";function R(a){return typeof crypto<"u"&&"randomUUID"in crypto?`${a}-${crypto.randomUUID()}`:`${a}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}function p(){return new Date().toISOString()}function I(){const a=p();return{goal:S,steps:de(S,0),notes:[{id:R("note"),kind:"reflection",agentName:"PlanMaster Local Planner",title:"Initial plan restored",body:"This React PlanMaster keeps the original planning habit alive without loading the Blazor PlanAgent surface.",metrics:"6 steps / local state",updatedAt:a}],updatedAt:a}}function qe(){try{const a=window.localStorage.getItem(ie);if(!a)return I();const n=JSON.parse(a);return!Array.isArray(n.steps)||!Array.isArray(n.notes)?I():{goal:String(n.goal||S),steps:Ve(n.steps),notes:Xe(n.notes),updatedAt:String(n.updatedAt||p())}}catch{return I()}}function Ve(a){return a.map((n,o)=>{const i=n,L=le.includes(i.category)?i.category:"Planning",m=oe.includes(i.status)?i.status:"Pending",f=i.priority==="High"||i.priority==="Medium"||i.priority==="Low"?i.priority:"Medium";return{id:String(i.id||R("step")),stepNumber:Number(i.stepNumber||o+1),category:L,title:String(i.title||`Step ${o+1}`),detail:String(i.detail||""),status:m,note:i.note?String(i.note):void 0,priority:f,updatedAt:String(i.updatedAt||p())}}).sort((n,o)=>n.stepNumber-o.stepNumber)}function Xe(a){return a.map(n=>{const o=n,i=ce.includes(o.kind)?o.kind:"reflection";return{id:String(o.id||R("note")),kind:i,agentName:String(o.agentName||"PlanMaster Local Planner"),title:String(o.title||"Untitled note"),body:String(o.body||""),metrics:String(o.metrics||""),updatedAt:String(o.updatedAt||p())}}).sort((n,o)=>Date.parse(o.updatedAt)-Date.parse(n.updatedAt))}function We(a){window.localStorage.setItem(ie,JSON.stringify(a))}function Ze(a){const n=a.toLowerCase();return n.includes("talkagent")?"TalkAgent":n.includes("code")?"CodeGraph":n.includes("pricing")||n.includes("revenue")||n.includes("usd")?"USD offer":n.includes("tool")?"free-tool funnel":"MindExec"}function de(a,n){const o=Ze(a),i=p();return[{category:"Planning",title:"Define the success contract",detail:`Turn "${a.trim()||S}" into a measurable launch contract with proof, channel, risk, and finish criteria.`,priority:"High"},{category:"Product",title:`Ship the smallest useful ${o} workflow`,detail:"Keep the first workflow complete enough to prove value, but narrow enough to verify in one browser session.",priority:"High"},{category:"Marketing",title:"Publish one English-first proof asset",detail:"Create a short public artifact that shows before/after value and links directly to the working product surface.",priority:"High"},{category:"Monetization",title:"Connect the proof to a USD offer",detail:"Make the next paid step visible without blocking free utility value or local-first trust.",priority:"Medium"},{category:"Ops",title:"Verify runtime and rollback evidence",detail:"Run build, hosted route checks, console checks, and record the exact deployed bundle evidence.",priority:"Medium"},{category:"Growth",title:"Reuse the result as the next launch input",detail:"Capture learnings, customer language, and next actions back into MindCanvas or PlanMaster memory.",priority:"Low"}].map((m,f)=>({...m,id:R("step"),stepNumber:n+f+1,status:"Pending",updatedAt:i}))}function et(a,n,o){return["You are the MindExec PlanMaster local planner.",Y(n),"Create categorized execution steps, concise evidence notes, and next actions.",o?"Use the current MindCanvas board context when it is available.":"Plan from the goal only; do not assume MindCanvas board context.","",`Goal: ${a.trim()||S}`].join(`
|
|
2
2
|
`)}function z(a,n,o,i=""){return{id:R("note"),kind:a,agentName:"PlanMaster Local Planner",title:n,body:o,metrics:i,updatedAt:p()}}function B(a){if(!a)return"-";const n=new Date(a);return Number.isNaN(n.getTime())?"-":n.toLocaleString(void 0,{month:"short",day:"2-digit",hour:"2-digit",minute:"2-digit"})}function tt(a){return a==="Running"?"next_action":a==="Done"?"evidence":a==="Blocked"||a==="Failed"?"blocker":"reflection"}function at(a){return a.timestamp||a.timestamp===""?a.timestamp:void 0}function pt({navigate:a}){const[n,o]=r.useState(()=>qe()),[i,L]=r.useState(()=>ee()),[m,f]=r.useState(()=>n.goal),[v,ue]=r.useState(!0),[F,pe]=r.useState(!0),[b,me]=r.useState(!0),[y,k]=r.useState(!1),[O,T]=r.useState(0),[N,he]=r.useState(10),[U,ge]=r.useState(!0),[$,xe]=r.useState("all"),[G,be]=r.useState(""),[C,je]=r.useState(1),[M,fe]=r.useState("Running"),[E,ye]=r.useState("Local PlanMaster tool contract run."),[Ne,P]=r.useState("Run a PlanMaster tool to inspect the local contract output."),[V,_]=r.useState([]),[Se,J]=r.useState(()=>Q()?"Not refreshed yet":"Access gated"),[X,W]=r.useState(!1),H=r.useRef(),w=r.useMemo(()=>Te(i),[i]);r.useEffect(()=>{const t=()=>L(ee());return window.addEventListener("storage",t),window.addEventListener("focus",t),()=>{window.removeEventListener("storage",t),window.removeEventListener("focus",t)}},[]),r.useEffect(()=>(window.clearTimeout(H.current),H.current=window.setTimeout(()=>We(n),250),()=>window.clearTimeout(H.current)),[n]);const h=r.useCallback(t=>{o(s=>({...t(s),updatedAt:p()}))},[]),A=r.useMemo(()=>{const t=new Map;for(const l of oe)t.set(l,0);for(const l of n.steps)t.set(l.status,(t.get(l.status)||0)+1);const s=t.get("Done")||0,c=n.steps.length||1;return{total:n.steps.length,done:s,running:t.get("Running")||0,blocked:t.get("Blocked")||0,progress:Math.round(s/c*100)}},[n.steps]),ve=r.useMemo(()=>le.map(t=>({category:t,steps:n.steps.filter(s=>s.category===t)})),[n.steps]),Z=r.useMemo(()=>{const t=G.trim().toLowerCase();return n.notes.filter(s=>$!=="all"&&s.kind!==$?!1:t?`${s.title} ${s.body} ${s.metrics} ${s.agentName}`.toLowerCase().includes(t):!0)},[$,G,n.notes]),K=r.useCallback(()=>{const t=m.trim()||S,s=et(t,i,v),c=Y(i);h(l=>{const u=b?l.steps.length:0,d=de(t,u),x=z("decision",b?"Appended a new plan session":"Generated a fresh plan",[`Goal: ${t}`,c].join(`
|
|
3
3
|
`),[`${d.length} steps`,v?"MindCanvas context enabled":"Standalone plan",`Language ${w.label}`].join(" / "));return j.emit("planmaster.plan.generated",{append:b,stepCount:d.length,appLanguage:i,promptChars:s.length}),{goal:t,steps:b?[...l.steps,...d]:d,notes:[x,...b?l.notes:[]],updatedAt:p()}}),T(0),k(!1)},[i,w.label,m,b,h,v]),g=r.useCallback((t,s,c)=>{h(l=>{const u=l.steps.find(x=>x.id===t);if(!u)return l;const d=z(tt(s),`Step ${u.stepNumber} marked ${s}`,c||u.detail,`${u.category} / ${u.priority}`);return j.emit("planmaster.step.status",{stepNumber:u.stepNumber,status:s}),j.emit("planmaster.execution.note",{kind:d.kind,title:d.title}),{...l,steps:l.steps.map(x=>x.id===t?{...x,status:s,note:c||x.note,updatedAt:p()}:x),notes:[d,...l.notes]}})},[h]),ke=r.useCallback(t=>{const s=Y(i);if(j.emit("planmaster.tool.run",{toolName:t,appLanguage:i}),t==="Canvas.ListMindMapNodes"){const l=Re(Le),u=l.nodes.slice(0,60).map(d=>({id:d.id,contentType:d.kind,prompt:d.title,response:String(d.result||d.body||"").slice(0,500),isAiEnabled:d.aiEnabled!==!1}));P(JSON.stringify({boardId:l.id,boardTitle:l.name,appLanguage:i,languageInstruction:s,count:u.length,nodes:u},null,2));return}if(t==="Plan.ListSteps"){P(JSON.stringify({appLanguage:i,languageInstruction:s,steps:n.steps.map(l=>({stepNumber:l.stepNumber,category:l.category,title:l.title,status:l.status,note:l.note||""}))},null,2));return}if(t==="Plan.SetStepStatus"){const l=n.steps.find(u=>u.stepNumber===C);if(!l){P(`Error: stepNumber ${C} was not found.`);return}g(l.id,M,E.trim()||`Plan.SetStepStatus -> ${M}`),P(`Updated step ${C} status to '${M}'.`);return}const c=z("artifact","Plan.CreateNote local artifact",[E.trim()||"Created by the local PlanMaster tool contract panel.",s].join(`
|
|
4
4
|
`),`Plan.CreateNote / local shell / Language ${w.label}`);h(l=>({...l,notes:[c,...l.notes]})),j.emit("planmaster.execution.note",{kind:c.kind,title:c.title,source:"Plan.CreateNote"}),P(`Created PlanMaster note node: ${c.id}`)},[i,w.label,g,n.steps,E,M,C,h]),Ce=r.useCallback(()=>{if(F&&n.steps.length===0){K();return}const t=n.steps.find(s=>s.status==="Pending")||n.steps.find(s=>s.status==="Blocked");t&&(k(!0),T(s=>Math.min(N,s+1)),g(t.id,"Running","Local PlanMaster run selected this as the next active step."))},[F,K,N,g,n.steps]),Me=r.useCallback(()=>{const t=n.steps.find(c=>c.status==="Running");t&&g(t.id,"Done","Completed in the local PlanMaster run.");const s=n.steps.find(c=>c.status==="Pending");s&&O<N?(T(c=>c+1),g(s.id,"Running","Advanced to the next local execution step.")):k(!1)},[O,N,g,n.steps]),Pe=r.useCallback(()=>{k(!1),h(t=>({...t,notes:[z("reflection","Stopped local PlanMaster run","The local execution loop was stopped by the user."),...t.notes]}))},[h]),we=r.useCallback(()=>{const t=I();o(t),f(t.goal),k(!1),T(0),j.emit("planmaster.plan.generated",{reset:!0,stepCount:t.steps.length})},[]),Ae=r.useCallback(async()=>{if(!Q()){J("Access gated"),_([]);return}W(!0);try{const s=((await $e()).items||[]).slice(-12).reverse();_(s),J(s.length>0?`Updated ${new Date().toLocaleTimeString()}`:"No change feed items yet"),j.emit("planmaster.bridgeFeed.refreshed",{count:s.length})}catch(t){J(t instanceof Error?t.message:String(t)),_([])}finally{W(!1)}},[]);return e.jsxs("div",{className:"page planmaster-page","data-testid":"planmaster-app-language","data-app-language":i,"data-app-language-label":w.label,children:[e.jsxs("section",{className:"planmaster-hero",children:[e.jsxs("div",{children:[e.jsx("div",{className:"eyebrow",children:"PlanAgent / PlanMaster"}),e.jsx("h1",{children:"Turn a goal into an executable plan board."}),e.jsx("p",{children:"A React replacement for the original PlanMaster surface: goal intake, categorized steps, execution memory, and bridge feed visibility without loading the Blazor 3D agent canvas."})]}),e.jsxs("div",{className:"planmaster-hero-actions",children:[e.jsx("button",{className:"btn btn-secondary",type:"button",onClick:()=>a("/mindcanvas"),children:"Open MindCanvas"}),e.jsxs("button",{className:"btn btn-ghost",type:"button",onClick:we,children:[e.jsx(Ee,{size:16}),"Reset"]})]})]}),e.jsxs("section",{className:"planmaster-layout",children:[e.jsxs("aside",{className:"planmaster-control-panel",children:[e.jsxs("div",{className:"planmaster-panel-head",children:[e.jsx(te,{size:18}),e.jsx("strong",{children:"Agent control"})]}),e.jsxs("label",{className:"planmaster-field",children:[e.jsx("span",{children:"Goal"}),e.jsx("textarea",{"data-testid":"planmaster-goal-input",value:m,onChange:t=>f(t.target.value),placeholder:"Enter the agent goal..."})]}),e.jsxs("label",{className:"planmaster-check",children:[e.jsx("input",{type:"checkbox",checked:v,onChange:t=>ue(t.target.checked)}),e.jsx("span",{children:"Use current MindCanvas board as context"})]}),e.jsxs("label",{className:"planmaster-check",children:[e.jsx("input",{type:"checkbox",checked:F,disabled:!v,onChange:t=>pe(t.target.checked)}),e.jsx("span",{children:"Generate or update a plan before running"})]}),e.jsxs("label",{className:"planmaster-check",children:[e.jsx("input",{type:"checkbox",checked:b,onChange:t=>me(t.target.checked)}),e.jsx("span",{children:"Preserve canvas memory and append this run"})]}),e.jsxs("label",{className:"planmaster-field planmaster-field--compact",children:[e.jsx("span",{children:"Max iterations"}),e.jsx("input",{type:"number",min:1,max:30,value:N,onChange:t=>he(Math.max(1,Math.min(30,Number(t.target.value)||1)))})]}),e.jsxs("div",{className:"planmaster-command-grid",children:[e.jsxs("button",{className:"btn btn-primary",type:"button","data-testid":"planmaster-generate-plan",onClick:K,disabled:!m.trim(),children:[e.jsx(ze,{size:16}),"Generate plan"]}),e.jsxs("button",{className:"btn btn-secondary",type:"button",onClick:Ce,disabled:n.steps.length===0||y,children:[e.jsx(q,{size:16}),"Start"]}),e.jsxs("button",{className:"btn btn-secondary",type:"button",onClick:Me,disabled:!y,children:[e.jsx(se,{size:16}),"Advance"]}),e.jsxs("button",{className:"btn btn-ghost",type:"button",onClick:Pe,disabled:!y,children:[e.jsx(De,{size:16}),"Stop"]})]}),e.jsxs("div",{className:`planmaster-agent-status ${y?"is-running":""}`,children:[y?e.jsx(ae,{size:17,className:"spin-icon"}):e.jsx(Ie,{size:17}),e.jsx("span",{children:y?"Running local plan loop":"Idle"}),e.jsxs("b",{children:[O," / ",N]})]})]}),e.jsxs("main",{className:"planmaster-board",children:[e.jsxs("div",{className:"planmaster-board-head",children:[e.jsxs("div",{children:[e.jsx("span",{className:"card-label",children:"Plan canvas"}),e.jsx("h2",{"data-testid":"planmaster-board-goal",children:n.goal})]}),e.jsxs("div",{className:"planmaster-progress",children:[e.jsxs("strong",{children:[A.progress,"%"]}),e.jsxs("span",{children:[A.done," done"]})]})]}),e.jsxs("div",{className:"planmaster-metric-strip",children:[e.jsx(D,{icon:Be,label:"Steps",value:String(A.total)}),e.jsx(D,{icon:q,label:"Running",value:String(A.running)}),e.jsx(D,{icon:re,label:"Blocked",value:String(A.blocked)}),e.jsx(D,{icon:Fe,label:"Updated",value:B(n.updatedAt)})]}),e.jsx("div",{className:"planmaster-lanes",children:ve.map(t=>e.jsxs("section",{className:"planmaster-lane",children:[e.jsxs("div",{className:"planmaster-lane-head",children:[e.jsx("strong",{children:t.category}),e.jsx("span",{children:t.steps.length})]}),t.steps.length>0?t.steps.map(s=>e.jsx(nt,{step:s,onStatus:g},s.id)):e.jsx("div",{className:"planmaster-empty-lane",children:"No step yet"})]},t.category))})]}),e.jsxs("aside",{className:"planmaster-side",children:[e.jsxs("section",{className:"planmaster-tool-panel",children:[e.jsxs("div",{className:"planmaster-panel-head",children:[e.jsx(te,{size:18}),e.jsx("strong",{children:"Tool Contract"})]}),e.jsx("p",{children:"Original PlanMaster agent tools, simulated against local React state."}),e.jsx("div",{className:"planmaster-tool-grid",children:Qe.map(t=>e.jsx("button",{type:"button","data-tool-name":t,onClick:()=>ke(t),children:t},t))}),e.jsxs("div",{className:"planmaster-tool-form",children:[e.jsxs("label",{children:[e.jsx("span",{children:"stepNumber"}),e.jsx("input",{"data-testid":"planmaster-tool-step-number",type:"number",min:1,value:C,onChange:t=>je(Math.max(1,Number(t.target.value)||1))})]}),e.jsxs("label",{children:[e.jsx("span",{children:"status"}),e.jsx("select",{"data-testid":"planmaster-tool-status",value:M,onChange:t=>fe(t.target.value),children:Ye.map(t=>e.jsx("option",{value:t,children:t},t))})]})]}),e.jsxs("label",{className:"planmaster-tool-note",children:[e.jsx("span",{children:"note/content"}),e.jsx("textarea",{"data-testid":"planmaster-tool-note",value:E,onChange:t=>ye(t.target.value)})]}),e.jsx("pre",{className:"planmaster-tool-output","data-testid":"planmaster-tool-output",children:Ne})]}),e.jsxs("section",{className:"planmaster-bridge-panel",children:[e.jsxs("div",{className:"planmaster-panel-head",children:[e.jsx(ne,{size:18}),e.jsx("strong",{children:"Bridge Feed"}),e.jsx("button",{type:"button",title:"Refresh bridge feed",onClick:Ae,disabled:X,children:X?e.jsx(ae,{size:15,className:"spin-icon"}):e.jsx(Oe,{size:15})})]}),e.jsxs("div",{className:"planmaster-bridge-status",children:[Q()?e.jsx(ne,{size:15}):e.jsx(Ue,{size:15}),Se]}),e.jsx("div",{className:"planmaster-feed-list",children:V.length>0?V.map((t,s)=>e.jsxs("article",{className:"planmaster-feed-item",children:[e.jsxs("div",{children:[e.jsx("strong",{children:t.changeType||"change"}),e.jsx("span",{children:B(at(t))})]}),e.jsx("p",{children:t.message||t.path||"(no details)"})]},`${t.timestamp||s}-${t.path||t.message||""}`)):e.jsx("div",{className:"planmaster-empty-lane",children:"No bridge feed items loaded."})})]}),e.jsxs("section",{className:`planmaster-memory-panel ${U?"":"is-collapsed"}`,children:[e.jsxs("div",{className:"planmaster-panel-head",children:[e.jsx(Ge,{size:18}),e.jsx("strong",{children:"Execution Memory"}),e.jsx("button",{type:"button",onClick:()=>ge(t=>!t),children:U?e.jsx(_e,{size:15}):e.jsx(Je,{size:15})})]}),U&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"planmaster-memory-filters",children:ce.map(t=>e.jsx("button",{className:$===t?"is-selected":"",type:"button",onClick:()=>xe(t),children:t.replace("_"," ")},t))}),e.jsxs("label",{className:"planmaster-memory-search",children:[e.jsx(He,{size:15}),e.jsx("input",{value:G,onChange:t=>be(t.target.value),placeholder:"Search memory notes..."})]}),e.jsx("div",{className:"planmaster-memory-list","data-testid":"planmaster-memory-list",children:Z.length>0?Z.map(t=>e.jsx(rt,{note:t},t.id)):e.jsx("div",{className:"planmaster-empty-lane",children:"No execution memory notes match the current filter."})})]})]})]})]})]})}function D({icon:a,label:n,value:o}){return e.jsxs("article",{className:"planmaster-metric",children:[e.jsx(a,{size:17}),e.jsx("span",{children:n}),e.jsx("strong",{children:o})]})}function nt({step:a,onStatus:n}){return e.jsxs("article",{className:`plan-step-card plan-step-card--${a.status.toLowerCase()}`,"data-testid":"planmaster-step-card","data-step-number":a.stepNumber,"data-step-status":a.status,children:[e.jsxs("div",{className:"plan-step-top",children:[e.jsxs("span",{children:["Step ",a.stepNumber]}),e.jsx(st,{status:a.status})]}),e.jsx("h3",{children:a.title}),e.jsx("p",{children:a.detail}),a.note&&e.jsx("div",{className:"plan-step-note",children:a.note}),e.jsxs("div",{className:"plan-step-footer",children:[e.jsx("span",{children:a.priority}),e.jsx("span",{children:B(a.updatedAt)})]}),e.jsxs("div",{className:"plan-step-actions",children:[e.jsx("button",{type:"button",onClick:()=>n(a.id,"Running"),children:"Run"}),e.jsx("button",{type:"button",onClick:()=>n(a.id,"Done"),children:"Done"}),e.jsx("button",{type:"button",onClick:()=>n(a.id,"Blocked"),children:"Block"}),e.jsx("button",{type:"button",onClick:()=>n(a.id,"Failed"),children:"Fail"})]})]})}function st({status:a}){const n=a==="Done"?se:a==="Blocked"||a==="Failed"?re:a==="Running"?q:Ke;return e.jsxs("span",{className:`plan-status-pill plan-status-pill--${a.toLowerCase()}`,children:[e.jsx(n,{size:13}),a]})}function rt({note:a}){return e.jsxs("article",{className:`execution-memory-item execution-memory-item--${a.kind.replace("_","-")}`,children:[e.jsxs("div",{className:"execution-memory-item-top",children:[e.jsx("span",{children:a.kind.replace("_"," ")}),e.jsx("time",{children:B(a.updatedAt)})]}),e.jsx("strong",{children:a.title}),a.metrics&&e.jsx("small",{children:a.metrics}),e.jsx("p",{children:a.body})]})}export{pt as PlanMasterPage};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as h,j as t}from"./vendor-react-BXzpOyCS.js";import{L as M}from"./LaunchLeadCapture-BBRvHVnf.js";import{g as C,a as P}from"./index-bMdZ9KL8.js";import{p as E,P as N,r as _,c as x}from"./pricingCheckoutShell-O-DnwmbU.js";import{r as A,g as U}from"./supabaseAuthAdapter-DbmbdXn-.js";import{R as m}from"./app-runtime-xD2Z3NdN.js";import{A as I,aS as L,c as D,N as $}from"./vendor-icons-Bt6FQ3FW.js";import"./canvas-runtime-BT5B2knz.js";function f(e){return typeof e=="string"&&e.trim()?e.trim():null}function B(e){const o=Number(e);return Number.isFinite(o)?Math.max(1,Math.round(o)):1}function T(e){const o=B(e.quantity);return{price_id:e.priceId,return_url:e.returnUrl,email:e.email,quantity:o,source:"mindexec-react",sale_kind:"first_party",entitlement_kind:e.planKey,package_kind:e.planKey==="ltd"?"ltd":"subscription",plan_key:e.planKey,plan_code:e.planCode,price_stage:e.priceStage,metadata:{source:"mindexec-react",price_stage:e.priceStage,plan_key:e.planKey,plan_code:e.planCode,checkout_surface:"pricing"}}}async function O(e,o){var s;const u=A(e);if(!u.checkout.canAttempt)throw m.emit("pricing.checkout.provider.skipped",{mode:u.checkout.mode}),new Error(`Secure checkout adapter is not ready: ${u.checkout.mode}`);const l=U(e);if(!l)throw m.emit("pricing.checkout.provider.skipped",{mode:"config-missing"}),new Error("Supabase browser client is not available for checkout.");const{data:n,error:c}=await l.auth.getSession();if(c)throw m.emit("pricing.checkout.provider.sessionFailed",{message:c.message}),c;if(!((s=n.session)!=null&&s.access_token))throw m.emit("pricing.checkout.provider.sessionMissing"),new Error("Secure checkout requires a Supabase-authenticated session.");const p=T(o);m.emit("pricing.checkout.provider.started",{provider:"dodo",functionName:"dodo-create-checkout",priceStage:o.priceStage,priceId:o.priceId});const{data:r,error:a}=await l.functions.invoke("dodo-create-checkout",{body:p});if(a)throw m.emit("pricing.checkout.provider.failed",{provider:"dodo",message:a.message}),a;const g=f(r==null?void 0:r.checkout_url);if(!g){const i=f(r==null?void 0:r.reason)??f(r==null?void 0:r.error)??"checkout-url-missing";throw m.emit("pricing.checkout.provider.failed",{provider:"dodo",message:i}),new Error(`Dodo checkout did not return a checkout URL: ${i}`)}return m.emit("pricing.checkout.provider.ready",{provider:"dodo",hasSessionId:!!f(r==null?void 0:r.session_id)}),{mode:u.checkout.mode,canAttempt:!0,provider:"dodo",sessionId:f(r==null?void 0:r.session_id),checkoutUrl:g,userId:f(r==null?void 0:r.user_id)}}const d={currentStage:"STANDARD",ltdLimit:100,ltdSold:0,ltdRemaining:100,isLtdAvailable:!1,isClosed:!1,freeCloudBoardLimit:2,proMonthlyIncludedCredits:1e4,proMonthlyPriceUsd:12,proAnnualPriceUsd:96,ltdPriceUsd:149,managedAiMarkupMultiplier:1.7,localModeFreeEnabled:!0,byokFreeEnabled:!0};function b(e){return`$${e.toLocaleString("en-US",{maximumFractionDigits:2})}`}function R(e){return e?"Start Pro":"Sign in to continue"}function F(){return`${b(d.proMonthlyPriceUsd)} starting point`}function K(){return"Standard paid access should feel like a continuation of the free workflow, not a forced first step."}function z(){return[`Monthly Pro starts at ${b(d.proMonthlyPriceUsd)}`,`Annual target pricing is ${b(d.proAnnualPriceUsd)} per year`,`${d.freeCloudBoardLimit} cloud boards are available before paid limits matter`]}function H(){return A(P())}function Y(e){return"dodo_pro_monthly_v1"}function G(e){return"pro"}function k(e,o,u){const l=document.head.querySelector(e),n=l??o(),c=n.getAttribute("content"),p=!l;return p&&document.head.appendChild(n),n.setAttribute("content",u),()=>{p?n.remove():c===null?n.removeAttribute("content"):n.setAttribute("content",c)}}function j(e){const o=document.createElement("meta");return o.setAttribute("name",e),o}function w(e){const o=document.createElement("meta");return o.setAttribute("property",e),o}function J(){const e=document.title,o="MindExec Pricing",u="MindExec pricing for free local tools and MindCanvas projects. Start free with local tools, then upgrade when saved boards, cloud workflows, and AI support become important.",l="https://mindexec.pages.dev/pricing",n=document.head.querySelector('link[rel="canonical"]')??document.createElement("link"),c=!n.parentElement,p=n.getAttribute("href");n.setAttribute("rel","canonical"),n.setAttribute("href",l),c&&document.head.appendChild(n);const r={"@context":"https://schema.org","@type":"SoftwareApplication",name:"MindExec",applicationCategory:"ProductivityApplication",operatingSystem:"Web",description:"Local-first visual workspace with free markdown tools and paid MindCanvas project workflows.",url:l,offers:[{"@type":"Offer",name:"Free local tools",price:"0",priceCurrency:"USD"},{"@type":"Offer",name:"MindCanvas Pro",price:String(d.proMonthlyPriceUsd),priceCurrency:"USD"}]},a=document.head.querySelector("#pricing-structured-data")??document.createElement("script"),g=!a.parentElement,s=a.textContent;a.id="pricing-structured-data",a.type="application/ld+json",a.setAttribute("data-testid","pricing-structured-data"),a.textContent=JSON.stringify(r),g&&document.head.appendChild(a),document.title=o;const i=[k('meta[name="description"]',()=>j("description"),u),k('meta[name="robots"]',()=>j("robots"),"index,follow"),k('meta[property="og:title"]',()=>w("og:title"),o),k('meta[property="og:description"]',()=>w("og:description"),"Compare free local tools, MindCanvas Pro, and the current checkout offer."),k('meta[property="og:type"]',()=>w("og:type"),"website"),k('meta[property="og:url"]',()=>w("og:url"),l)];return()=>{document.title=e,i.forEach(y=>y()),c?n.remove():p===null?n.removeAttribute("href"):n.setAttribute("href",p),g?a.remove():a.textContent=s}}function re({navigate:e}){const[o,u]=h.useState(()=>C()),[l,n]=h.useState(!1),c=h.useMemo(()=>H(),[]),[p,r]=h.useState(()=>{const s=C(),i=E();return s&&i?`Signed in as ${s.email}. Continue checkout when ready; payment remains adapter-gated.`:""}),a=h.useMemo(()=>z(),[]);h.useEffect(()=>J(),[]);const g=async()=>{const s=C();if(u(s),m.emit("pricing.checkout.requested",{stage:d.currentStage,signedIn:!!s}),!s){_(d.currentStage,"/pricing"),r("Sign in first to continue to secure checkout."),e("/login");return}if(n(!0),c.checkout.canAttempt)try{const i=G(d.currentStage),y=await O(P(),{priceId:Y(d.currentStage),priceStage:d.currentStage,planKey:i,planCode:i.toUpperCase(),email:s.email,returnUrl:new URL("/pricing?checkout=return",window.location.origin).toString()});x("pricing-checkout-provider-started"),r("Opening secure Dodo checkout..."),window.location.assign(y.checkoutUrl);return}catch(i){n(!1),r(`Secure checkout could not start: ${i instanceof Error?i.message:String(i)}`),m.emit("pricing.checkout.provider.failed",{stage:d.currentStage,message:i instanceof Error?i.message:String(i)});return}window.setTimeout(()=>{x("pricing-checkout-adapter-gated"),n(!1),r(`Checkout policy is ready for ${s.email}; secure payment adapter wiring is the remaining backend step.`),m.emit("pricing.checkout.adapter.gated",{stage:d.currentStage,signedIn:!0})},650)};return t.jsxs("div",{className:"page pricing-page","data-testid":"pricing-shell","data-pricing-stage":d.currentStage,"data-pricing-checkout-intent-key":N,"data-production-adapter-state":c.overallState,"data-pricing-checkout-provider-mode":c.checkout.mode,"data-pricing-checkout-provider-ready":c.checkout.canAttempt?"true":"false","data-client-secret-blocked":c.forbiddenClientSecretKeys.length>0?"true":"false",children:[t.jsxs("section",{className:"pricing-hero",children:[t.jsx("div",{className:"eyebrow",children:"Pricing"}),t.jsx("h1",{children:"Start free. Pay when the work becomes worth keeping."}),t.jsx("p",{children:"Free tools stay fast and local. MindCanvas becomes valuable when saved projects, cloud workflows, and AI-supported organization matter across larger boards."}),t.jsxs("div",{className:"action-row",children:[t.jsx("button",{className:"btn btn-primary",type:"button",onClick:()=>e("/tools"),"data-testid":"pricing-browse-tools",children:"Browse free tools"}),t.jsx("button",{className:"btn btn-secondary",type:"button",onClick:()=>e("/mindcanvas"),"data-testid":"pricing-open-mindcanvas",children:"Open MindCanvas"})]})]}),t.jsxs("section",{className:"pricing-grid pricing-grid--detailed",children:[t.jsx(v,{label:"Free local tools",price:"$0",body:"Best for quick markdown, notes, clipboard work, and no-login utility tasks.",lines:["Markdown preview, outline, and README tools","Browser notepad and clipboard board","Local-first use with no required upload","Great for one-off jobs before a project exists"],action:"Use the free tools",onAction:()=>e("/tools")}),t.jsx(v,{label:"MindCanvas Pro",price:b(d.proMonthlyPriceUsd),suffix:"/month",body:"For saved boards, cloud projects, and AI-assisted organization once the work grows beyond a disposable tool session.",note:`Annual planning target: ${b(d.proAnnualPriceUsd)} per year`,lines:["Saved project workflows instead of one-off tool output","Cloud access when local-only is no longer enough",`${d.proMonthlyIncludedCredits.toLocaleString()} included monthly credits`,"Better fit for repeat work, larger docs, and visual organization"],action:R(o==null?void 0:o.email),icon:l?I:L,actionClass:"btn-primary",busy:l,onAction:g,status:p,testId:"pricing-pro-checkout"}),t.jsx(v,{label:"Current offer",price:F(),body:K(),lines:a,action:"Open MindCanvas first",onAction:()=>e("/mindcanvas")})]}),t.jsxs("section",{className:"pricing-compare",children:[t.jsxs("div",{children:[t.jsx("div",{className:"eyebrow",children:"Why pay later"}),t.jsx("h2",{children:"The free entry point should stay frictionless."}),t.jsx("p",{children:"Pricing works when it appears after the user already understands value. Public tools are for instant utility. Pro is for keeping the work alive after it becomes important."})]}),t.jsxs("div",{className:"pricing-compare-grid",children:[t.jsxs("article",{children:[t.jsx(D,{size:20}),t.jsx("h3",{children:"Stay free when"}),t.jsx("p",{children:"You only need a quick preview, outline, conversion, note, or snippet board with no ongoing project state."})]}),t.jsxs("article",{children:[t.jsx($,{size:20}),t.jsx("h3",{children:"Upgrade when"}),t.jsx("p",{children:"You want saved boards, repeat workflows, cloud access, or AI-assisted organization across bigger visual projects."})]})]})]}),t.jsx(M,{compact:!0,eyebrow:"Launch list",headline:"Not ready to buy today?",body:"Join the English launch list for checkout openings, launch offers, and short examples of serious MindCanvas workflows.",buttonText:"Notify me",sourceTag:"pricing"})]})}function v({label:e,price:o,suffix:u,body:l,note:n,lines:c,action:p,icon:r,actionClass:a,busy:g,status:s,testId:i,onAction:y}){return t.jsxs("article",{className:"pricing-card pricing-card--detailed",children:[t.jsx("div",{className:"card-label",children:e}),t.jsxs("h2",{children:[o,u&&t.jsx("span",{children:u})]}),t.jsx("p",{children:l}),n&&t.jsx("div",{className:"pricing-note",children:n}),t.jsx("ul",{children:c.map(S=>t.jsx("li",{children:S},S))}),t.jsxs("button",{className:`btn pricing-card-action ${a||"btn-secondary"}`,type:"button",disabled:g,onClick:y,"data-testid":i,children:[r&&t.jsx(r,{size:16,className:g?"spin-icon":void 0}),p]}),s&&t.jsx("p",{className:"pricing-status","data-testid":i?`${i}-status`:void 0,children:s})]})}export{re as PricingPage};
|
|
1
|
+
import{r as h,j as t}from"./vendor-react-BXzpOyCS.js";import{L as M}from"./LaunchLeadCapture-Btre_FaA.js";import{g as C,a as P}from"./index-CVhGWqQM.js";import{p as E,P as N,r as _,c as x}from"./pricingCheckoutShell-O-DnwmbU.js";import{r as A,g as U}from"./supabaseAuthAdapter-BRbhWFpi.js";import{R as m}from"./app-runtime-xD2Z3NdN.js";import{A as I,aS as L,c as D,N as $}from"./vendor-icons-678PAT8P.js";import"./canvas-runtime-CcSvL_l6.js";function f(e){return typeof e=="string"&&e.trim()?e.trim():null}function B(e){const o=Number(e);return Number.isFinite(o)?Math.max(1,Math.round(o)):1}function T(e){const o=B(e.quantity);return{price_id:e.priceId,return_url:e.returnUrl,email:e.email,quantity:o,source:"mindexec-react",sale_kind:"first_party",entitlement_kind:e.planKey,package_kind:e.planKey==="ltd"?"ltd":"subscription",plan_key:e.planKey,plan_code:e.planCode,price_stage:e.priceStage,metadata:{source:"mindexec-react",price_stage:e.priceStage,plan_key:e.planKey,plan_code:e.planCode,checkout_surface:"pricing"}}}async function O(e,o){var s;const u=A(e);if(!u.checkout.canAttempt)throw m.emit("pricing.checkout.provider.skipped",{mode:u.checkout.mode}),new Error(`Secure checkout adapter is not ready: ${u.checkout.mode}`);const l=U(e);if(!l)throw m.emit("pricing.checkout.provider.skipped",{mode:"config-missing"}),new Error("Supabase browser client is not available for checkout.");const{data:n,error:c}=await l.auth.getSession();if(c)throw m.emit("pricing.checkout.provider.sessionFailed",{message:c.message}),c;if(!((s=n.session)!=null&&s.access_token))throw m.emit("pricing.checkout.provider.sessionMissing"),new Error("Secure checkout requires a Supabase-authenticated session.");const p=T(o);m.emit("pricing.checkout.provider.started",{provider:"dodo",functionName:"dodo-create-checkout",priceStage:o.priceStage,priceId:o.priceId});const{data:r,error:a}=await l.functions.invoke("dodo-create-checkout",{body:p});if(a)throw m.emit("pricing.checkout.provider.failed",{provider:"dodo",message:a.message}),a;const g=f(r==null?void 0:r.checkout_url);if(!g){const i=f(r==null?void 0:r.reason)??f(r==null?void 0:r.error)??"checkout-url-missing";throw m.emit("pricing.checkout.provider.failed",{provider:"dodo",message:i}),new Error(`Dodo checkout did not return a checkout URL: ${i}`)}return m.emit("pricing.checkout.provider.ready",{provider:"dodo",hasSessionId:!!f(r==null?void 0:r.session_id)}),{mode:u.checkout.mode,canAttempt:!0,provider:"dodo",sessionId:f(r==null?void 0:r.session_id),checkoutUrl:g,userId:f(r==null?void 0:r.user_id)}}const d={currentStage:"STANDARD",ltdLimit:100,ltdSold:0,ltdRemaining:100,isLtdAvailable:!1,isClosed:!1,freeCloudBoardLimit:2,proMonthlyIncludedCredits:1e4,proMonthlyPriceUsd:12,proAnnualPriceUsd:96,ltdPriceUsd:149,managedAiMarkupMultiplier:1.7,localModeFreeEnabled:!0,byokFreeEnabled:!0};function b(e){return`$${e.toLocaleString("en-US",{maximumFractionDigits:2})}`}function R(e){return e?"Start Pro":"Sign in to continue"}function F(){return`${b(d.proMonthlyPriceUsd)} starting point`}function K(){return"Standard paid access should feel like a continuation of the free workflow, not a forced first step."}function z(){return[`Monthly Pro starts at ${b(d.proMonthlyPriceUsd)}`,`Annual target pricing is ${b(d.proAnnualPriceUsd)} per year`,`${d.freeCloudBoardLimit} cloud boards are available before paid limits matter`]}function H(){return A(P())}function Y(e){return"dodo_pro_monthly_v1"}function G(e){return"pro"}function k(e,o,u){const l=document.head.querySelector(e),n=l??o(),c=n.getAttribute("content"),p=!l;return p&&document.head.appendChild(n),n.setAttribute("content",u),()=>{p?n.remove():c===null?n.removeAttribute("content"):n.setAttribute("content",c)}}function j(e){const o=document.createElement("meta");return o.setAttribute("name",e),o}function w(e){const o=document.createElement("meta");return o.setAttribute("property",e),o}function J(){const e=document.title,o="MindExec Pricing",u="MindExec pricing for free local tools and MindCanvas projects. Start free with local tools, then upgrade when saved boards, cloud workflows, and AI support become important.",l="https://mindexec.pages.dev/pricing",n=document.head.querySelector('link[rel="canonical"]')??document.createElement("link"),c=!n.parentElement,p=n.getAttribute("href");n.setAttribute("rel","canonical"),n.setAttribute("href",l),c&&document.head.appendChild(n);const r={"@context":"https://schema.org","@type":"SoftwareApplication",name:"MindExec",applicationCategory:"ProductivityApplication",operatingSystem:"Web",description:"Local-first visual workspace with free markdown tools and paid MindCanvas project workflows.",url:l,offers:[{"@type":"Offer",name:"Free local tools",price:"0",priceCurrency:"USD"},{"@type":"Offer",name:"MindCanvas Pro",price:String(d.proMonthlyPriceUsd),priceCurrency:"USD"}]},a=document.head.querySelector("#pricing-structured-data")??document.createElement("script"),g=!a.parentElement,s=a.textContent;a.id="pricing-structured-data",a.type="application/ld+json",a.setAttribute("data-testid","pricing-structured-data"),a.textContent=JSON.stringify(r),g&&document.head.appendChild(a),document.title=o;const i=[k('meta[name="description"]',()=>j("description"),u),k('meta[name="robots"]',()=>j("robots"),"index,follow"),k('meta[property="og:title"]',()=>w("og:title"),o),k('meta[property="og:description"]',()=>w("og:description"),"Compare free local tools, MindCanvas Pro, and the current checkout offer."),k('meta[property="og:type"]',()=>w("og:type"),"website"),k('meta[property="og:url"]',()=>w("og:url"),l)];return()=>{document.title=e,i.forEach(y=>y()),c?n.remove():p===null?n.removeAttribute("href"):n.setAttribute("href",p),g?a.remove():a.textContent=s}}function re({navigate:e}){const[o,u]=h.useState(()=>C()),[l,n]=h.useState(!1),c=h.useMemo(()=>H(),[]),[p,r]=h.useState(()=>{const s=C(),i=E();return s&&i?`Signed in as ${s.email}. Continue checkout when ready; payment remains adapter-gated.`:""}),a=h.useMemo(()=>z(),[]);h.useEffect(()=>J(),[]);const g=async()=>{const s=C();if(u(s),m.emit("pricing.checkout.requested",{stage:d.currentStage,signedIn:!!s}),!s){_(d.currentStage,"/pricing"),r("Sign in first to continue to secure checkout."),e("/login");return}if(n(!0),c.checkout.canAttempt)try{const i=G(d.currentStage),y=await O(P(),{priceId:Y(d.currentStage),priceStage:d.currentStage,planKey:i,planCode:i.toUpperCase(),email:s.email,returnUrl:new URL("/pricing?checkout=return",window.location.origin).toString()});x("pricing-checkout-provider-started"),r("Opening secure Dodo checkout..."),window.location.assign(y.checkoutUrl);return}catch(i){n(!1),r(`Secure checkout could not start: ${i instanceof Error?i.message:String(i)}`),m.emit("pricing.checkout.provider.failed",{stage:d.currentStage,message:i instanceof Error?i.message:String(i)});return}window.setTimeout(()=>{x("pricing-checkout-adapter-gated"),n(!1),r(`Checkout policy is ready for ${s.email}; secure payment adapter wiring is the remaining backend step.`),m.emit("pricing.checkout.adapter.gated",{stage:d.currentStage,signedIn:!0})},650)};return t.jsxs("div",{className:"page pricing-page","data-testid":"pricing-shell","data-pricing-stage":d.currentStage,"data-pricing-checkout-intent-key":N,"data-production-adapter-state":c.overallState,"data-pricing-checkout-provider-mode":c.checkout.mode,"data-pricing-checkout-provider-ready":c.checkout.canAttempt?"true":"false","data-client-secret-blocked":c.forbiddenClientSecretKeys.length>0?"true":"false",children:[t.jsxs("section",{className:"pricing-hero",children:[t.jsx("div",{className:"eyebrow",children:"Pricing"}),t.jsx("h1",{children:"Start free. Pay when the work becomes worth keeping."}),t.jsx("p",{children:"Free tools stay fast and local. MindCanvas becomes valuable when saved projects, cloud workflows, and AI-supported organization matter across larger boards."}),t.jsxs("div",{className:"action-row",children:[t.jsx("button",{className:"btn btn-primary",type:"button",onClick:()=>e("/tools"),"data-testid":"pricing-browse-tools",children:"Browse free tools"}),t.jsx("button",{className:"btn btn-secondary",type:"button",onClick:()=>e("/mindcanvas"),"data-testid":"pricing-open-mindcanvas",children:"Open MindCanvas"})]})]}),t.jsxs("section",{className:"pricing-grid pricing-grid--detailed",children:[t.jsx(v,{label:"Free local tools",price:"$0",body:"Best for quick markdown, notes, clipboard work, and no-login utility tasks.",lines:["Markdown preview, outline, and README tools","Browser notepad and clipboard board","Local-first use with no required upload","Great for one-off jobs before a project exists"],action:"Use the free tools",onAction:()=>e("/tools")}),t.jsx(v,{label:"MindCanvas Pro",price:b(d.proMonthlyPriceUsd),suffix:"/month",body:"For saved boards, cloud projects, and AI-assisted organization once the work grows beyond a disposable tool session.",note:`Annual planning target: ${b(d.proAnnualPriceUsd)} per year`,lines:["Saved project workflows instead of one-off tool output","Cloud access when local-only is no longer enough",`${d.proMonthlyIncludedCredits.toLocaleString()} included monthly credits`,"Better fit for repeat work, larger docs, and visual organization"],action:R(o==null?void 0:o.email),icon:l?I:L,actionClass:"btn-primary",busy:l,onAction:g,status:p,testId:"pricing-pro-checkout"}),t.jsx(v,{label:"Current offer",price:F(),body:K(),lines:a,action:"Open MindCanvas first",onAction:()=>e("/mindcanvas")})]}),t.jsxs("section",{className:"pricing-compare",children:[t.jsxs("div",{children:[t.jsx("div",{className:"eyebrow",children:"Why pay later"}),t.jsx("h2",{children:"The free entry point should stay frictionless."}),t.jsx("p",{children:"Pricing works when it appears after the user already understands value. Public tools are for instant utility. Pro is for keeping the work alive after it becomes important."})]}),t.jsxs("div",{className:"pricing-compare-grid",children:[t.jsxs("article",{children:[t.jsx(D,{size:20}),t.jsx("h3",{children:"Stay free when"}),t.jsx("p",{children:"You only need a quick preview, outline, conversion, note, or snippet board with no ongoing project state."})]}),t.jsxs("article",{children:[t.jsx($,{size:20}),t.jsx("h3",{children:"Upgrade when"}),t.jsx("p",{children:"You want saved boards, repeat workflows, cloud access, or AI-assisted organization across bigger visual projects."})]})]})]}),t.jsx(M,{compact:!0,eyebrow:"Launch list",headline:"Not ready to buy today?",body:"Join the English launch list for checkout openings, launch offers, and short examples of serious MindCanvas workflows.",buttonText:"Notify me",sourceTag:"pricing"})]})}function v({label:e,price:o,suffix:u,body:l,note:n,lines:c,action:p,icon:r,actionClass:a,busy:g,status:s,testId:i,onAction:y}){return t.jsxs("article",{className:"pricing-card pricing-card--detailed",children:[t.jsx("div",{className:"card-label",children:e}),t.jsxs("h2",{children:[o,u&&t.jsx("span",{children:u})]}),t.jsx("p",{children:l}),n&&t.jsx("div",{className:"pricing-note",children:n}),t.jsx("ul",{children:c.map(S=>t.jsx("li",{children:S},S))}),t.jsxs("button",{className:`btn pricing-card-action ${a||"btn-secondary"}`,type:"button",disabled:g,onClick:y,"data-testid":i,children:[r&&t.jsx(r,{size:16,className:g?"spin-icon":void 0}),p]}),s&&t.jsx("p",{className:"pricing-status","data-testid":i?`${i}-status`:void 0,children:s})]})}export{re as PricingPage};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{j as t,r as m}from"./vendor-react-BXzpOyCS.js";import{g as te,a as q,d as ne,b as se,c as re}from"./marketingTools-DN_rnHeB.js";import{V as oe}from"./canvas-runtime-
|
|
1
|
+
import{j as t,r as m}from"./vendor-react-BXzpOyCS.js";import{g as te,a as q,d as ne,b as se,c as re}from"./marketingTools-DN_rnHeB.js";import{V as oe}from"./canvas-runtime-CcSvL_l6.js";import{R as f}from"./app-runtime-xD2Z3NdN.js";import{b as ie}from"./toolHandoff-D5e5f7t5.js";import{u as ae,aW as Q,aX as le,aY as ce,aZ as de,F as ue,a_ as pe,$ as R,ag as he,a$ as me,T as Y,i as K,g as fe,f as _,an as xe}from"./vendor-icons-678PAT8P.js";const U=2*1024*1024,ke=".md,.markdown,.txt,text/markdown,text/plain",G={"markdown-preview":ue,"markdown-outline":de,"markdown-table":ce,"markdown-links":le,notepad:Q,clipboard:ae};function $(e,n,r){const s=document.head.querySelector(e),o=s??n(),l=o.getAttribute("content"),i=!s;return i&&document.head.appendChild(o),o.setAttribute("content",r),()=>{i?o.remove():l===null?o.removeAttribute("content"):o.setAttribute("content",l)}}function je(e){const n=document.createElement("meta");return n.setAttribute("name",e),n}function M(e){const n=document.createElement("meta");return n.setAttribute("property",e),n}function be(e,n){const r=document.title,s=n?e.liveUrl:`https://mindexec.pages.dev/tools/${e.key}`,o=n?`${e.title} - Free local browser tool`:`${e.title} | MindExec`,l=n?e.heroSubtitle:e.description,i=document.head.querySelector('link[rel="canonical"]')??document.createElement("link"),c=!i.parentElement,d=i.getAttribute("href");i.setAttribute("rel","canonical"),i.setAttribute("href",s),c&&document.head.appendChild(i),document.title=o;const p=[$('meta[name="description"]',()=>je("description"),l),$('meta[property="og:title"]',()=>M("og:title"),o),$('meta[property="og:description"]',()=>M("og:description"),l),$('meta[property="og:url"]',()=>M("og:url"),s)];return()=>{document.title=r,p.forEach(h=>h()),c?i.remove():d===null?i.removeAttribute("href"):i.setAttribute("href",d)}}function We({navigate:e}){const n=te();return t.jsxs("div",{className:"page tools-directory-page",children:[t.jsxs("section",{className:"section-head",children:[t.jsx("div",{className:"eyebrow",children:"Free local-first tools"}),t.jsx("h1",{children:"Markdown, notes, and clipboard tools from MindExec"}),t.jsx("p",{children:"Use lightweight browser tools with no login and no database save. When the work gets bigger, move into MindCanvas for saved projects, AI workflows, and visual organization."})]}),t.jsx("div",{className:"tools-directory-groups",children:n.map(r=>t.jsxs("section",{className:"tools-directory-section",children:[t.jsxs("div",{className:"tools-directory-head",children:[t.jsx("h2",{children:r.title}),t.jsx("p",{children:r.description})]}),t.jsx("div",{className:"tools-directory-grid",children:r.entries.map(s=>{const o=G[s.kind];return t.jsxs("article",{className:"tools-directory-card","data-testid":"tool-directory-card","data-tool-key":s.key,children:[t.jsxs("div",{className:"tool-card-topline",children:[t.jsx("span",{children:s.label}),t.jsx(o,{size:18})]}),t.jsx("h3",{children:s.title}),t.jsx("p",{children:s.description}),t.jsxs("button",{type:"button",className:"btn btn-secondary",onClick:()=>e(`/tools/${s.key}`),children:["Open tool",t.jsx(pe,{size:16})]}),t.jsxs("a",{className:"tool-live-link",href:s.liveUrl,target:"_blank",rel:"noreferrer",children:[t.jsx(R,{size:14}),"Standalone"]})]},s.key)})})]},r.id))}),t.jsxs("section",{className:"tools-directory-cta",children:[t.jsxs("div",{children:[t.jsx("h2",{children:"Need a bigger workspace?"}),t.jsx("p",{children:"MindCanvas is where these small tasks turn into saved canvases, larger document sets, AI workflows, and cloud projects inside MindExec."})]}),t.jsx("button",{type:"button",className:"btn btn-primary",onClick:()=>e("/mindcanvas"),children:"Open MindCanvas"})]})]})}function De({toolKey:e,navigate:n,miniHost:r=!1}){const s=q(e);return s?t.jsx(ge,{tool:s,navigate:n,miniHost:r}):t.jsx("div",{className:"page tools-directory-page",children:t.jsxs("section",{className:"section-head",children:[t.jsx("div",{className:"eyebrow",children:"Tool not found"}),t.jsx("h1",{children:"This local tool is not enabled."}),t.jsx("p",{children:"Open the tools directory and pick one of the current MindExec browser tools."}),t.jsx("div",{className:"action-row",children:t.jsx("button",{className:"btn btn-primary",type:"button",onClick:()=>n("/tools"),children:"Back to tools"})})]})})}function ge({tool:e,navigate:n,miniHost:r}){const[s,o]=m.useState(()=>S(e.kind)),[l,i]=m.useState(""),[c,d]=m.useState(["Pricing proof from a user conversation","Demo clip idea for English-first launch","Competitor headline worth comparing"]),[p,h]=m.useState(null),[B,y]=m.useState(""),T=m.useRef(null),C=m.useRef(null),b=m.useMemo(()=>Ne(e,s,c),[c,s,e]),V=G[e.kind],X=e.relatedKeys.map(a=>q(a)).filter(a=>!!a),z=ve(e.kind),w=e.key==="bulk-markdown-viewer";m.useEffect(()=>{const a=be(e,r);return f.emit("tool.meta.applied",{toolKey:e.key,host:window.location.hostname,miniHost:r,canonical:r?e.liveUrl:`https://mindexec.pages.dev/tools/${e.key}`}),r&&f.emit("tool.hostProfile.applied",{toolKey:e.key,host:window.location.hostname}),a},[r,e]),m.useEffect(()=>{o(S(e.kind)),y(""),h(null)},[e.key,e.kind]);const P=async(a,x,k)=>{try{const u=await oe(x);h(a),f.emit("tool.copy",{toolKey:e.key,ok:!0,method:u,chars:x.length}),window.setTimeout(()=>h(null),1400)}catch(u){const j=k==="source"?T.current:C.current;if(j){j.focus(),j.select(),h(k==="source"?"Source selected":"Output selected"),f.emit("tool.copy",{toolKey:e.key,ok:!1,selected:!0,target:k,message:u instanceof Error?u.message:String(u)});return}h("Copy failed"),f.emit("tool.copy",{toolKey:e.key,ok:!1,target:k,message:u instanceof Error?u.message:String(u)})}},Z=()=>{o(S(e.kind)),y("Sample loaded."),f.emit("tool.sample.loaded",{toolKey:e.key})},J=()=>{o(""),y(""),f.emit("tool.source.cleared",{toolKey:e.key})},O=()=>{ie({toolKey:e.key,toolTitle:e.title,sourceTitle:`${e.label} source`,sourceBody:e.kind==="clipboard"?c.join(`
|
|
2
2
|
|
|
3
3
|
`):s,resultTitle:b.title,resultBody:b.text,taskBody:`Review this ${e.title} output and propose the next concrete step for a global MindExec launch workflow.`}),n("/mindcanvas")},ee=async a=>{const x=Array.from(a.currentTarget.files??[]);if(a.currentTarget.value="",!z||x.length===0)return;const k=x.slice(0,w?12:1),u=k.filter(g=>g.size>U),j=k.filter(g=>g.size<=U);if(j.length===0){y("Selected file is over the 2 MB local preview limit."),f.emit("tool.file.rejected",{toolKey:e.key,reason:"size-limit",count:k.length});return}try{const v=(await Promise.all(j.map(async F=>{const I=(await F.text()).trim();return w?[`# ${F.name}`,"",I].join(`
|
|
4
4
|
`):I}))).filter(Boolean).join(`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as i,j as e}from"./vendor-react-BXzpOyCS.js";import{g as H,i as fe,s as M,o as xe,ah as Se,x as we}from"./canvas-runtime-
|
|
1
|
+
import{r as i,j as e}from"./vendor-react-BXzpOyCS.js";import{g as H,i as fe,s as M,o as xe,ah as Se,x as we}from"./canvas-runtime-CcSvL_l6.js";import{R as d}from"./app-runtime-xD2Z3NdN.js";import{b as je}from"./toolHandoff-D5e5f7t5.js";import{A as ke,aC as Ce,b0 as te,f as Le,b1 as Te,aw as $e,$ as Ne}from"./vendor-icons-678PAT8P.js";const ae=[{id:"yt-ai-workflow-1",videoId:"mexecAI0001",title:"AI workflow systems for solo founders",channel:"Indie Build Lab",publishedAt:"2026-06-18",duration:"12:34",views:"42,180",url:"https://www.youtube.com/watch?v=mexecAI0001",thumbnailUrl:"/assets/mindexecution-mindcanvas.png",summary:"A practical breakdown of capture, planning, execution, and proof loops for one-person products."},{id:"yt-canvas-ops-2",videoId:"mexecRC0002",title:"Building a visual operating system with React canvas",channel:"Product Runtime",publishedAt:"2026-06-14",duration:"18:09",views:"31,904",url:"https://www.youtube.com/watch?v=mexecRC0002",thumbnailUrl:"/assets/mindexecution-mindcanvas.png",summary:"Covers node layout, local persistence, keyboard workflows, and avoiding heavy runtimes in the browser."},{id:"yt-launch-3",videoId:"mexecLN0003",title:"From prototype to paid users in seven days",channel:"Global SaaS Notes",publishedAt:"2026-06-11",duration:"09:52",views:"88,430",url:"https://www.youtube.com/watch?v=mexecLN0003",thumbnailUrl:"/assets/mindexecution-mindcanvas.png",summary:"Launch checklist focused on proof assets, lead capture, pricing pressure, and distribution sequencing."},{id:"yt-local-first-4",videoId:"mexecLF0004",title:"Local-first web apps that feel instant",channel:"Frontend Engine Room",publishedAt:"2026-06-07",duration:"22:18",views:"17,609",url:"https://www.youtube.com/watch?v=mexecLF0004",thumbnailUrl:"/assets/mindexecution-mindcanvas.png",summary:"Explains local state, cache boundaries, browser storage, and sync contracts for fast product surfaces."},{id:"yt-agent-5",videoId:"mexecAD0005",title:"Agent dashboards for real business execution",channel:"Ops With AI",publishedAt:"2026-06-01",duration:"15:21",views:"56,112",url:"https://www.youtube.com/watch?v=mexecAD0005",thumbnailUrl:"/assets/mindexecution-mindcanvas.png",summary:"Maps agent tasks to approvals, artifacts, execution evidence, and human-gated external actions."}],Be=["relevance","date","viewCount","rating","title"],Ae=["any","day","week","month","year"],Ie=["any","short","medium","long"],Re=["any","live","upcoming","completed"],Ue=["moderate","none","strict"];function qe(a,t){const c=t.toLowerCase(),g=`${a.title} ${a.channel} ${a.summary}`.toLowerCase();return c?c.split(/\s+/).filter(n=>g.includes(n)).length+1:1}function se(a,t,c){return ae.map(n=>({...n,title:a.trim()?`${n.title}: ${a.trim()}`:n.title,score:qe(n,a)})).sort((n,u)=>t==="date"?u.publishedAt.localeCompare(n.publishedAt):t==="viewCount"?Number(u.views.replace(/,/g,""))-Number(n.views.replace(/,/g,"")):t==="title"?n.title.localeCompare(u.title):u.score-n.score).slice(0,c).map(({score:n,...u})=>({...u,source:"sample"}))}function Pe(a){return a.map((t,c)=>[`${c+1}. ${t.title}`,` - Channel: ${t.channel}`,` - Published: ${t.publishedAt}`,` - Duration: ${t.duration}`,` - Views: ${t.views}`,` - URL: ${t.url}`,t.thumbnailUrl?` - Thumbnail: ${t.thumbnailUrl}`:"",` - Note: ${t.summary}`].filter(Boolean).join(`
|
|
2
2
|
`)).join(`
|
|
3
3
|
|
|
4
4
|
`)}function De(a){return a.map(t=>({id:t.id,kind:"youtube-video",title:t.title,url:t.url,videoId:t.videoId,thumbnailUrl:t.thumbnailUrl,summary:t.summary,channel:t.channel,publishedAt:t.publishedAt,duration:t.duration,views:t.views,source:t.source||"sample"}))}function Ye(a){if(!a)return"-";const t=Date.parse(a);return Number.isFinite(t)?new Date(t).toISOString().slice(0,10):a}function Ee(a){return typeof a!="number"||!Number.isFinite(a)?"-":a.toLocaleString("en-US")}function ze(a){const t=String(a.videoId||"").trim(),c=String(a.title||"").trim();if(!t||!c)return null;const g=String(a.url||"").trim()||`https://www.youtube.com/watch?v=${t}`,n=String(a.channelTitle||"").trim()||"Unknown channel",u=String(a.durationText||a.duration||"").trim()||"-",y=Ye(a.publishedAt),C=Ee(a.viewCount);return{id:t,videoId:t,title:c,channel:n,publishedAt:y,duration:u,views:C,url:g,thumbnailUrl:String(a.thumbnailUrl||"").trim()||void 0,summary:`Live YouTube result from ${n}. Published ${y}; duration ${u}; views ${C}.`,source:"bridge"}}function Fe(){return{state:M()?"idle":"blocked",baseUrl:H(),message:M()?"LocalBridge not checked yet.":"Hosted LocalBridge access is gated."}}function Qe({navigate:a}){const t=i.useRef(0),[c,g]=i.useState(()=>H()),[n,u]=i.useState(()=>Fe()),[y,C]=i.useState("AI workflow for solo founders"),[L,ne]=i.useState("relevance"),[$,re]=i.useState("any"),[N,oe]=i.useState("any"),[B,ie]=i.useState("any"),[A,le]=i.useState("moderate"),[I,ce]=i.useState("en"),[R,ue]=i.useState("US"),[U,de]=i.useState(10),[m,O]=i.useState(()=>se("AI workflow for solo founders","relevance",5)),[q,v]=i.useState(()=>new Set(["yt-ai-workflow-1"])),[be,f]=i.useState("Local sample results loaded. Search will use LocalBridge /api/youtube/search on loopback or after enabling local bridge access."),[T,P]=i.useState(!1),[w,W]=i.useState("sample"),[V,Q]=i.useState(""),[_,G]=i.useState(""),[K,J]=i.useState(!1),[X,Z]=i.useState(""),D=i.useMemo(()=>m.filter(s=>q.has(s.id)),[m,q]),Y=(s,l="fallback",r)=>{const b=(r==null?void 0:r.query)??y,x=(r==null?void 0:r.order)??L,o=(r==null?void 0:r.maxResults)??U,S=se(b,x,Math.min(o,ae.length));O(S),v(new Set),W(l),Q(""),G(""),J(!1),Z(""),f(s)},E=async(s,l="")=>{s==null||s.preventDefault();const r=y.trim();if(!r){f("Enter a query before searching.");return}const b=t.current+1;t.current=b;const x=()=>t.current===b,o={query:r,order:L,publishedWithin:$,videoDuration:N,eventType:B,safeSearch:A,language:I.trim(),region:R.trim(),maxResults:U};P(!0);const S=H();if(g(S),d.emit("youtube.search.local",{requestSeq:b,q:o.query,order:o.order,pageToken:!!l}),!M()){u({state:"blocked",baseUrl:S,message:"Hosted LocalBridge access is gated."}),Y("Hosted LocalBridge access is gated. Showing local sample results only.","blocked",o),d.emit("youtube.search.fallback",{requestSeq:b,reason:"hosted-localbridge-gated",order:o.order,publishedWithin:o.publishedWithin,videoDuration:o.videoDuration,eventType:o.eventType,safeSearch:o.safeSearch,language:o.language,region:o.region}),P(!1);return}try{const p=await xe(S);if(!x()){d.emit("youtube.search.staleIgnored",{requestSeq:b,stage:"bridge-status"});return}if(u(p),p.state!=="connected"){Y(`${p.message||"LocalBridge is unavailable."} Showing local sample results.`,"fallback",o),d.emit("youtube.search.fallback",{requestSeq:b,reason:"localbridge-unavailable",state:p.state});return}const h=await Se({q:o.query,order:o.order,publishedWithin:o.publishedWithin,videoDuration:o.videoDuration,eventType:o.eventType,safeSearch:o.safeSearch,relevanceLanguage:o.language,regionCode:o.region,maxResults:o.maxResults,pageToken:l},S);if(!x()){d.emit("youtube.search.staleIgnored",{requestSeq:b,stage:"bridge-results"});return}const j=(h.items||[]).map(ze).filter(z=>!!z);O(j),v(l?z=>new Set(j.filter(F=>z.has(F.id)).map(F=>F.id)):new Set),Q(String(h.nextPageToken||"")),G(String(h.prevPageToken||"")),J(h.fromCache===!0),Z(h.fetchedAt||new Date().toISOString()),W("bridge"),f(j.length>0?`Live YouTube search complete: ${j.length} results${h.fromCache?" from cache":""}.`:"Live YouTube search returned no videos."),d.emit("youtube.search.bridge",{requestSeq:b,count:j.length,fromCache:h.fromCache===!0,hasNext:!!h.nextPageToken,hasPrevious:!!h.prevPageToken})}catch(p){if(!x()){d.emit("youtube.search.staleIgnored",{requestSeq:b,stage:"bridge-error"});return}const h=p instanceof Error?p.message:String(p);Y(`${h} Showing local sample results.`,"fallback",o),d.emit("youtube.search.fallback",{requestSeq:b,reason:"bridge-search-error",message:h})}finally{x()&&P(!1)}},he=()=>{we(!0),u({state:"idle",baseUrl:c,message:"Hosted LocalBridge access enabled. Search again to use the live adapter."}),f("Hosted LocalBridge access enabled. Search again to use LocalBridge /api/youtube/search."),d.emit("youtube.bridge.hostedAccess.enabled")},ge=s=>{v(l=>{const r=new Set(l);return r.has(s)?r.delete(s):r.add(s),d.emit("youtube.selection.changed",{count:r.size}),r})},me=()=>{v(new Set(m.map(s=>s.id))),d.emit("youtube.selection.all",{count:m.length})},pe=()=>{v(new Set),d.emit("youtube.selection.clear")},ee=s=>{const l=s==="selected"?D:m;if(l.length===0){f("Select at least one video before creating MindCanvas nodes.");return}const r=Pe(l);je({toolKey:"youtube-search",toolTitle:"YouTube Search",sourceTitle:`YouTube search: ${y.trim()}`,sourceBody:`Filters: order=${L}, period=${$}, duration=${N}, event=${B}, safe=${A}, lang=${I}, region=${R}`,resultTitle:`${l.length} YouTube candidates`,resultBody:r,taskBody:"Turn these YouTube candidates into a MindExec content or research plan. Extract buyer pain, proof angles, and next launch asset ideas.",resultItems:De(l)}),d.emit("youtube.nodes.created",{mode:s,count:l.length}),f(`${l.length} video records prepared for MindCanvas handoff.`),a("/mindcanvas")},ye=n.state==="connected"?"live adapter":n.state==="blocked"?"bridge gated":n.state==="unavailable"?"bridge unavailable":"local bridge ready",ve=w==="bridge"?K?"live cache":"live":w==="blocked"?"gated sample":w==="fallback"?"fallback sample":"sample";return e.jsxs("div",{className:"page youtube-page","data-youtube-bridge-state":n.state,"data-youtube-result-source":w,children:[e.jsxs("section",{className:"youtube-hero",children:[e.jsxs("div",{children:[e.jsx("div",{className:"eyebrow",children:"Content Capture"}),e.jsx("h1",{children:"YouTube Search"}),e.jsx("p",{children:"Search, filter, select, and send video candidates into MindCanvas as research nodes. Live search runs through the LocalBridge YouTube proxy when local bridge access is available."})]}),e.jsx("span",{className:`youtube-badge youtube-badge--${w}`,"data-testid":"youtube-result-source",children:ve})]}),e.jsxs("form",{className:"youtube-search-panel","data-testid":"youtube-search-form",onSubmit:s=>void E(s),children:[e.jsxs("div",{className:"youtube-query-row",children:[e.jsx("input",{"data-testid":"youtube-query-input","aria-label":"YouTube query",value:y,onChange:s=>C(s.target.value),placeholder:"Search terms"}),e.jsxs("button",{className:"btn btn-primary","data-testid":"youtube-search-submit",type:"submit",disabled:T,children:[T?e.jsx(ke,{size:16,className:"spin-icon"}):e.jsx(Ce,{size:16}),"Search"]})]}),e.jsxs("div",{className:"youtube-filter-grid",children:[e.jsx(k,{label:"Order",value:L,options:Be,onChange:ne}),e.jsx(k,{label:"Period",value:$,options:Ae,onChange:re}),e.jsx(k,{label:"Duration",value:N,options:Ie,onChange:oe}),e.jsx(k,{label:"Live",value:B,options:Re,onChange:ie}),e.jsx(k,{label:"Safe search",value:A,options:Ue,onChange:le}),e.jsxs("label",{children:["Language",e.jsx("input",{maxLength:8,value:I,onChange:s=>ce(s.target.value)})]}),e.jsxs("label",{children:["Region",e.jsx("input",{maxLength:4,value:R,onChange:s=>ue(s.target.value)})]}),e.jsxs("label",{children:["Count",e.jsxs("select",{value:U,onChange:s=>de(Number(s.target.value)),children:[e.jsx("option",{value:"5",children:"5"}),e.jsx("option",{value:"10",children:"10"}),e.jsx("option",{value:"25",children:"25"})]})]})]})]}),e.jsxs("section",{className:"youtube-banner","data-testid":"youtube-status-banner",children:[e.jsx(te,{size:18}),e.jsxs("span",{children:[be,e.jsxs("small",{children:[ye,X?`, fetched ${new Date(X).toLocaleTimeString()}`:""]})]}),n.state==="blocked"&&!fe()&&e.jsx("button",{className:"btn btn-secondary","data-testid":"youtube-enable-local-bridge",type:"button",onClick:he,children:"Enable local bridge"})]}),e.jsxs("section",{className:"youtube-actions-row",children:[e.jsxs("div",{children:[e.jsxs("strong",{children:[m.length," results"]}),e.jsxs("span",{children:[D.length," selected",K?" (cache)":""]})]}),e.jsxs("div",{className:"youtube-actions",children:[e.jsx("button",{className:"btn btn-secondary","data-testid":"youtube-select-visible",type:"button",onClick:me,children:"Select visible"}),e.jsx("button",{className:"btn btn-secondary","data-testid":"youtube-clear-selection",type:"button",onClick:pe,children:"Clear"}),e.jsxs("button",{className:"btn btn-primary","data-testid":"youtube-send-selected",type:"button",onClick:()=>ee("selected"),disabled:D.length===0,children:[e.jsx(Le,{size:15}),"Send selected"]}),e.jsx("button",{className:"btn btn-primary","data-testid":"youtube-send-all",type:"button",onClick:()=>ee("all"),disabled:m.length===0,children:"Send all"})]})]}),e.jsxs("section",{className:"youtube-pagination","aria-label":"YouTube result pages",children:[e.jsx("button",{className:"btn btn-secondary",type:"button",onClick:()=>void E(void 0,_),disabled:T||!_,children:"Previous"}),e.jsx("button",{className:"btn btn-secondary",type:"button",onClick:()=>void E(void 0,V),disabled:T||!V,children:"Next"})]}),e.jsx("section",{className:"youtube-results-grid",children:m.map((s,l)=>{const r=q.has(s.id);return e.jsxs("article",{className:`youtube-card ${r?"is-selected":""}`,"data-testid":"youtube-result-card","data-video-id":s.videoId||"",children:[e.jsxs("div",{className:"youtube-card-top",children:[e.jsxs("button",{className:"youtube-select-button","data-testid":"youtube-result-select",type:"button",onClick:()=>ge(s.id),"aria-label":`${r?"Unselect":"Select"} ${s.title}`,children:[r?e.jsx(Te,{size:17}):e.jsx($e,{size:17}),r?"Selected":"Select"]}),e.jsxs("a",{href:s.url,target:"_blank",rel:"noreferrer",children:[e.jsx(Ne,{size:15}),"YouTube"]})]}),e.jsxs("div",{className:"youtube-thumb",children:[s.thumbnailUrl?e.jsx("img",{src:s.thumbnailUrl,alt:"",loading:"lazy"}):e.jsx(te,{size:34}),e.jsx("span",{children:String(l+1).padStart(2,"0")})]}),e.jsx("h2",{children:s.title}),e.jsx("p",{children:s.summary}),e.jsxs("div",{className:"youtube-meta",children:[e.jsx("span",{children:s.channel}),e.jsx("span",{children:s.publishedAt}),e.jsx("span",{children:s.duration}),e.jsxs("span",{children:[s.views," views"]})]})]},s.id)})})]})}function k({label:a,value:t,options:c,onChange:g}){return e.jsxs("label",{children:[a,e.jsx("select",{value:t,onChange:n=>g(n.target.value),children:c.map(n=>e.jsx("option",{value:n,children:n},n))})]})}export{Qe as YouTubeSearchPage};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as p,j as a}from"./vendor-react-BXzpOyCS.js";import{R as g}from"./app-runtime-xD2Z3NdN.js";import{S as gi,L as fi,P as bi,I as La,U as yi,a as ki,b as Ti,X as Po,K as pa,V as Ii,C as vi,B as Ci,c as ko,d as xi,e as wi,R as vo,f as nn,g as Si,M as Ri,h as ja,i as Na,j as Da,k as Oa,l as Mi,m as _a,n as Pi,o as Ai,F as Ei,p as Li,H as ji,q as Ni,r as Di,s as Fa,t as Oi,G as _i,u as Fi,v as Bi,w as Gi,x as Ui,y as zi,T as $i,z as Vi}from"./vendor-icons-Bt6FQ3FW.js";const Qe=Object.freeze({status:"/api/remote/status",devices:"/api/remote/devices",frames:"/api/remote/frames",hostTarget:"/api/remote/host-target",agentStatus:"/api/remote/agent/status",agentConnect:"/api/remote/agent/connect",agentDisconnect:"/api/remote/agent/disconnect",deviceTasksTemplate:"/api/remote/devices/{deviceId}/tasks",taskBatch:"/api/remote/tasks"}),Ba=Object.freeze({frames:"/api/remote/frames/ws",input:"/api/remote/input/ws"});function qi(e){return Qe.deviceTasksTemplate.replace("{deviceId}",encodeURIComponent(e))}function Ga(e){return za(e==null?void 0:e.remoteFrameWsPath,Ba.frames)}function Ua(e){return za(e==null?void 0:e.remoteInputWsPath,Ba.input)}function za(e,t){return typeof e=="string"?e.trim():t}const Qo={},Wi="http://127.0.0.1:5147",$a="MindExec.AllowHostedLocalBridge",Ki=new Set(["4173","5173"]);function Yt(e){return e.replace(/\/+$/,"")}function Hi(){return((Qo==null?void 0:Qo.VITE_LOCAL_BRIDGE_URL)||"").trim()}function Xi(){if(typeof window>"u")return"";const{protocol:e,hostname:t,port:o,origin:n}=window.location,r=t.toLowerCase();return(e==="http:"||e==="https:")&&(r==="localhost"||r==="127.0.0.1"||r==="::1")&&o&&!Ki.has(o)?n:""}function j(){return Yt(Hi()||Xi()||Wi)}function Yi(){const e=window.location.hostname.toLowerCase();return e==="localhost"||e==="127.0.0.1"||e==="::1"}function Qi(){try{return window.localStorage.getItem($a)==="true"}catch{return!1}}function Va(e){try{e&&window.localStorage.setItem($a,"true")}catch{}}function Pt(){return Yi()||Qi()}function qa(e){const t=String((e==null?void 0:e.bridgeToken)||"").trim();if(t)return{header:(e==null?void 0:e.bridgeTokenHeader)||"X-Bridge-Token",token:t}}async function D(e,t,o={}){const n=new AbortController,r=window.setTimeout(()=>n.abort(),o.timeoutMs??4200),s=new Headers;s.set("Accept","application/json"),s.set("Cache-Control","no-store"),s.set("Pragma","no-cache"),o.body!==void 0&&s.set("Content-Type","application/json"),o.auth&&s.set(o.auth.header,o.auth.token);try{const c=await fetch(`${Yt(e)}${t}`,{method:o.method||(o.body===void 0?"GET":"POST"),headers:s,body:o.body===void 0?void 0:JSON.stringify(o.body),cache:"no-store",signal:n.signal}),m=await c.text(),l=m?JSON.parse(m):null;if(!c.ok){const b=(l==null?void 0:l.error)||(l==null?void 0:l.message)||`LocalBridge request failed: ${c.status}`;throw new Error(b)}return l}finally{window.clearTimeout(r)}}function Ji(e){return e instanceof DOMException&&e.name==="AbortError"?"LocalBridge probe timed out.":e instanceof SyntaxError?"LocalBridge returned a non-JSON response.":e instanceof Error?e.message||"LocalBridge is unavailable.":String(e||"LocalBridge is unavailable.")}async function kn(e=j()){var t;try{const o=await D(e,"/api/status?refresh=1",{timeoutMs:4200});return g.emit("localBridge.status",{baseUrl:e,connected:!0,projectOpen:((t=o.project)==null?void 0:t.isOpen)===!0}),{state:"connected",baseUrl:e,status:o}}catch(o){const n=Ji(o);return g.emit("localBridge.status",{baseUrl:e,connected:!1,message:n}),{state:"unavailable",baseUrl:e,message:n}}}async function Qc(e,t,o=j()){return g.emit("localBridge.authSession.save.request",{baseUrl:o,hasContent:!!e.trim()}),D(o,"/api/auth/session",{method:"POST",body:{content:e},auth:t,timeoutMs:6500})}async function Jc(e,t=j()){return g.emit("localBridge.authSession.clear.request",{baseUrl:t}),D(t,"/api/auth/session",{method:"DELETE",auth:e,timeoutMs:6500})}async function Zc(e,t,o=j()){return D(o,"/project/open",{method:"POST",body:{path:e},auth:t,timeoutMs:15e3})}async function ed(e=j(),t=18,o=1200){var r,s;let n={state:"idle",baseUrl:e};for(let c=0;c<t;c+=1){if(n=await kn(e),n.state==="connected"&&((s=(r=n.status)==null?void 0:r.project)!=null&&s.isOpen))return n;await new Promise(m=>{window.setTimeout(m,o)})}return n}async function td(e,t=j()){return D(t,"/project/symbols",{auth:e,timeoutMs:12e3})}async function od(e,t=j()){return D(t,"/project/graph",{auth:e,timeoutMs:12e3})}async function nd(e="standard",t,o=j()){const n=`?level=${encodeURIComponent(e)}`;return D(o,`/project/ai-context${n}`,{auth:t,timeoutMs:14e3})}async function ad(e,t=j()){return g.emit("localBridge.codex.capabilities.request",{baseUrl:t}),D(t,"/api/codex/capabilities",{auth:e,timeoutMs:12e3})}async function rd(e,t=5,o,n=j()){return g.emit("localBridge.web.search.request",{baseUrl:n,maxResults:t}),D(n,"/api/web/search",{method:"POST",body:{query:e,maxResults:t},auth:o,timeoutMs:24e3})}async function id(e,t=6e3,o,n=j()){return g.emit("localBridge.web.fetch.request",{baseUrl:n,maxChars:t}),D(n,"/api/web/fetch",{method:"POST",body:{url:e,maxChars:t},auth:o,timeoutMs:24e3})}async function sd(e,t,o=j()){return g.emit("localBridge.browser.open.request",{baseUrl:o}),D(o,"/api/browser/open",{method:"POST",body:{url:e},auth:t,timeoutMs:24e3})}async function ld(e,t=4e3,o,n=j()){return g.emit("localBridge.browser.snapshot.request",{baseUrl:n,maxChars:t}),D(n,"/api/browser/snapshot",{method:"POST",body:{sessionId:e,maxChars:t},auth:o,timeoutMs:18e3})}async function cd(e,t="hero",o=3e3,n,r=j()){return g.emit("localBridge.browser.extract.request",{baseUrl:r,scope:t,maxChars:o}),D(r,"/api/browser/extract",{method:"POST",body:{sessionId:e,scope:t,maxChars:o},auth:n,timeoutMs:18e3})}async function dd(e,t,o=j()){return g.emit("localBridge.evidence.save.request",{baseUrl:o,kind:e.kind||"evidence"}),D(o,"/api/evidence/save",{method:"POST",body:e,auth:t,timeoutMs:18e3})}async function ud(e,t,o=j()){var n;return g.emit("localBridge.concept.defineComposite.request",{baseUrl:o,hasSignature:!!((n=e.signature)!=null&&n.trim())}),D(o,"/api/concept/define-composite",{method:"POST",body:e,auth:t,timeoutMs:18e3})}async function pd(e,t=j()){return g.emit("localBridge.concept.status.request",{baseUrl:t}),D(t,"/api/concept/status",{method:"GET",auth:e,timeoutMs:12e3})}async function md(e,t,o=j()){return g.emit("localBridge.concept.row.request",{baseUrl:o,id:e}),D(o,`/api/concept/row?id=${encodeURIComponent(e)}`,{method:"GET",auth:t,timeoutMs:12e3})}async function hd(e,t=j()){return g.emit("localBridge.concept.embed.readiness.request",{baseUrl:t}),D(t,"/api/concept/embed/readiness",{method:"GET",auth:e,timeoutMs:12e3})}async function gd(e,t=j()){return D(t,"/project/close",{method:"POST",auth:e,timeoutMs:12e3})}async function fd(e=j()){return D(e,"/api/workspace",{timeoutMs:4200})}async function bd(e,t,o=j()){return D(o,"/api/workspace/browse",{method:"POST",body:{initialPath:e||""},auth:t,timeoutMs:12e4})}async function yd(e,t,o=j()){return D(o,"/api/workspace/set",{method:"POST",body:{path:e},auth:t,timeoutMs:3e4})}async function kd(e,t,o=j()){return g.emit("localBridge.dir.list.request",{baseUrl:o}),D(o,"/api/dir/list",{method:"POST",body:{path:e},auth:t,timeoutMs:12e3})}async function Td(e=j()){return D(e,"/project/change-feed",{timeoutMs:4200})}async function Wa(e,t=j()){return D(t,Qe.status,{auth:e,timeoutMs:4200})}async function Zi(e,t=j()){return D(t,Qe.agentStatus,{auth:e,timeoutMs:4200})}async function Ka(e,t=j(),o={}){const n=o.includeDataUrl?"?includeDataUrl=true":"";return D(t,`${Qe.devices}${n}`,{auth:e,timeoutMs:6500})}async function Ha(e,t,o=j()){return D(o,Qe.frames,{method:"POST",body:{deviceIds:e,includeThumbnail:!0,includeLive:!0},auth:t,timeoutMs:6500})}async function ma(e,t,o,n=j(),r={}){return D(n,Qe.hostTarget,{method:"POST",body:{nodeId:e,enabled:t,leaseMs:r.leaseMs??6e4},auth:o,timeoutMs:6500})}async function es(e,t,o=j()){return D(o,Qe.agentConnect,{method:"POST",body:e,auth:t,timeoutMs:3e4})}async function ts(e="react-remote-monitor",t,o=j()){return D(o,Qe.agentDisconnect,{method:"POST",body:{reason:e},auth:t,timeoutMs:12e3})}async function Xa(e,t,o,n=j()){return D(n,qi(e),{method:"POST",body:t,auth:o,timeoutMs:12e3})}async function os(e,t,o=j()){return D(o,Qe.taskBatch,{method:"POST",body:e,auth:t,timeoutMs:16e3})}async function Id(e,t=j()){const o=new URLSearchParams;return o.set("q",e.q),o.set("order",e.order||"relevance"),o.set("publishedWithin",e.publishedWithin||"any"),o.set("videoDuration",e.videoDuration||"any"),o.set("eventType",e.eventType||"any"),o.set("safeSearch",e.safeSearch||"moderate"),e.relevanceLanguage&&o.set("relevanceLanguage",e.relevanceLanguage),e.regionCode&&o.set("regionCode",e.regionCode),e.maxResults&&o.set("maxResults",String(e.maxResults)),e.pageToken&&o.set("pageToken",e.pageToken),D(t,`/api/youtube/search?${o.toString()}`,{timeoutMs:16e3})}function We(e){return`/api/company-core${e.startsWith("/")?e:`/${e}`}`}async function vd(e,t=j()){return g.emit("companyCore.bridge.request",{method:"GET",path:"/health"}),D(t,We("/health"),{auth:e,timeoutMs:6500})}async function Cd(e,t=j()){return g.emit("companyCore.bridge.request",{method:"GET",path:"/api/companies"}),D(t,We("/api/companies"),{auth:e,timeoutMs:12e3})}async function xd(e=20,t,o=j()){const n=Math.max(1,Math.min(100,Math.round(e)));return g.emit("companyCore.bridge.request",{method:"GET",path:"/api/company-runs",limit:n}),D(o,We(`/api/company-runs?limit=${n}`),{auth:t,timeoutMs:12e3})}async function wd(e,t,o=j()){const n=encodeURIComponent(e);return g.emit("companyCore.bridge.request",{method:"GET",path:"/api/companies/:id/snapshot"}),D(o,We(`/api/companies/${n}/snapshot`),{auth:t,timeoutMs:12e3})}async function Sd(e,t,o=j()){const n=encodeURIComponent(e);return g.emit("companyCore.bridge.request",{method:"GET",path:"/api/companies/:id/approvals"}),D(o,We(`/api/companies/${n}/approvals?pendingOnly=false`),{auth:t,timeoutMs:12e3})}async function Rd(e,t,o=j()){const n=encodeURIComponent(e);return g.emit("companyCore.bridge.request",{method:"GET",path:"/api/companies/:id/artifacts"}),D(o,We(`/api/companies/${n}/artifacts`),{auth:t,timeoutMs:12e3})}async function Md(e,t,o=j()){const n=encodeURIComponent(e);return g.emit("companyCore.bridge.request",{method:"GET",path:"/api/companies/:id/publishing-jobs"}),D(o,We(`/api/companies/${n}/publishing-jobs?limit=100`),{auth:t,timeoutMs:12e3})}async function Pd(e,t,o=j()){const n=encodeURIComponent(e);return g.emit("companyCore.bridge.request",{method:"GET",path:"/api/companies/:id/growth"}),D(o,We(`/api/companies/${n}/growth?limit=100`),{auth:t,timeoutMs:12e3})}async function Ad(e,t,o=j()){const n=encodeURIComponent(e);return g.emit("companyCore.bridge.request",{method:"GET",path:"/api/companies/:id/revenue"}),D(o,We(`/api/companies/${n}/revenue?limit=100`),{auth:t,timeoutMs:12e3})}async function Ed(e,t,o=j()){const n=encodeURIComponent(e);return g.emit("companyCore.bridge.request",{method:"GET",path:"/api/companies/:id/reflections"}),D(o,We(`/api/companies/${n}/reflections?limit=50`),{auth:t,timeoutMs:12e3})}async function Ld(e,t,o=j()){return D(o,"/api/codex/thread/run",{method:"POST",body:e,auth:t,timeoutMs:18e4})}async function jd(e,t=j()){return D(t,"/api/file/read",{method:"POST",body:{path:e},timeoutMs:3e4})}async function Nd(e,t=j()){const o=new AbortController,n=window.setTimeout(()=>o.abort(),3e4);try{const r=await fetch(`${Yt(t)}/api/file/read-raw?path=${encodeURIComponent(e)}`,{method:"GET",headers:{Accept:"application/octet-stream","Cache-Control":"no-store",Pragma:"no-cache"},cache:"no-store",signal:o.signal});if(!r.ok)throw new Error(`LocalBridge raw file read failed: ${r.status}`);return new Uint8Array(await r.arrayBuffer())}finally{window.clearTimeout(n)}}async function Dd(e,t,o,n=j()){return D(n,"/api/file/write",{method:"POST",body:{path:e,content:t,encoding:"utf8"},auth:o,timeoutMs:3e4})}async function Od(e,t,o,n=j()){const r=new AbortController,s=window.setTimeout(()=>r.abort(),3e4),c=new Headers;c.set("Accept","application/json"),c.set("Content-Type","application/octet-stream"),c.set("Cache-Control","no-store"),c.set("Pragma","no-cache"),c.set(o.header,o.token);try{const m=new ArrayBuffer(t.byteLength);new Uint8Array(m).set(t);const l=await fetch(`${Yt(n)}/api/file/write-raw?path=${encodeURIComponent(e)}`,{method:"PUT",headers:c,body:m,cache:"no-store",signal:r.signal}),b=await l.json().catch(()=>null);if(!l.ok){const k=(b==null?void 0:b.error)||(b==null?void 0:b.message)||`LocalBridge raw file write failed: ${l.status}`;throw new Error(k)}return b}finally{window.clearTimeout(s)}}async function _d(e,t,o=j()){return D(o,"/api/file/delete",{method:"POST",body:{path:e},auth:t,timeoutMs:3e4})}function ns(e,t=j()){const o=String(e||"").trim();if(!o)return;if(/^https?:\/\//i.test(o)||o.startsWith("data:"))return o;const n=o.replace(/\\/g,"/").replace(/^\/+/,"");return`${Yt(t)}/${n}`}const rt="gpt-5.5",as="gemini-3-flash-preview",rs="llama3",Tn=[{id:"gpt-5.5",label:"GPT-5.5",provider:"codex"},{id:"gpt-5.4",label:"GPT-5.4",provider:"codex"},{id:"gpt-5.4-mini",label:"GPT-5.4 mini",provider:"codex"},{id:"gpt-5.3-codex-spark",label:"GPT-5.3 Codex Spark",provider:"codex"},{id:rs,label:"llama3",provider:"ollama"},{id:"llama3.2",label:"llama3.2",provider:"ollama"},{id:"openrouter/auto",label:"Auto Router",provider:"openrouter"},{id:"openai/gpt-chat-latest",label:"GPT Chat Latest",provider:"openrouter"},{id:"anthropic/claude-sonnet-4.5",label:"Claude Sonnet 4.5",provider:"openrouter"},{id:"google/gemini-2.5-pro",label:"Gemini 2.5 Pro",provider:"openrouter"},{id:"google/gemini-2.5-flash",label:"Gemini 2.5 Flash",provider:"openrouter"},{id:as,label:"Gemini 3 Flash Preview",provider:"gemini-cli"},{id:"gemini-3-pro-preview",label:"Gemini 3 Pro Preview",provider:"gemini-cli"},{id:"gemini-2.5-flash",label:"Gemini 2.5 Flash",provider:"gemini-cli"},{id:"gemini-2.5-pro",label:"Gemini 2.5 Pro",provider:"gemini-cli"},{id:"gemini-2.5-flash-lite-preview-06-17",label:"Gemini 2.5 Flash Lite Preview",provider:"gemini-cli"}],is=new Map([["",rt],["openai: gpt-4.1 mini",rt],["gpt-4.1 mini",rt],["gpt-5.3-codex",rt],["gpt-5.2",rt],["gpt-5.2-codex",rt]]);function Qt(e){const t=String(e??"").trim().replace(/^["']|["']$/g,""),o=t.toLowerCase();return is.get(o)??t}function ss(e){const t=Qt(e);return t.includes("/")||t.includes(":")}function ls(e){const t=Qt(e);return Tn.find(o=>o.id===t)??null}function Ya(e){switch(e){case"codex":return"Codex";case"ollama":return"Ollama";case"gemini-cli":return"Gemini CLI";case"openrouter":return"OpenRouter";default:return e}}function ho(e,t){const o=new Map(t.map((n,r)=>[n,r]));return e.map((n,r)=>({option:n,index:r})).filter(({option:n})=>o.has(n.provider)).sort((n,r)=>{const s=o.get(n.option.provider)??Number.MAX_SAFE_INTEGER,c=o.get(r.option.provider)??Number.MAX_SAFE_INTEGER;return s-c||n.index-r.index}).map(({option:n})=>n)}function cs(e,t=Tn){switch(e){case"Local Ollama":return ho(t,["ollama","openrouter"]);case"OpenAI Codex":return ho(t,["codex","openrouter"]);case"Gemini CLI":return ho(t,["gemini-cli"]);case"Managed Cloud":case"BYOK":default:return ho(t,["openrouter"])}}function ds(e){return e.startsWith("gemini-")?"gemini-cli":e.startsWith("llama")?"ollama":ss(e)?"openrouter":"codex"}function us(e){const t=e.aiProvider??"OpenAI Codex",o=cs(t),n=Qt(e.model);return n&&!o.some(r=>r.id===n)?[{id:n,label:`${n} (custom)`,provider:ds(n)},...o]:o}const In="gpt-image-2",vn="google/veo-2",ps="1:1",ms="16:9",Co="codex-image:",an="codex:",hs=["1024x1024","1536x1024","1024x1536"],gs=[{id:"low",label:"Low"},{id:"medium",label:"Mid"},{id:"high",label:"High"}],fs=Tn.filter(e=>e.provider==="codex").flatMap(e=>gs.map(t=>({id:To(e.id,t.id),label:`Codex Image ${t.label} (${e.label})`,provider:"OpenAI Codex",mode:"Image",supportedSizes:hs}))),bs=[{id:"gpt-image-2",label:"GPT Image 2",provider:"OpenAI",mode:"Image",supportedSizes:["custom"]},{id:"Tongyi-MAI/Z-Image-Turbo:free",label:"Z-Image Turbo",provider:"ImageRouter",mode:"Image",supportedSizes:["custom"]},...fs],ys=[{id:"google/veo-2",label:"Google Veo 2",provider:"ImageRouter",mode:"Video",supportedSizes:["1280x720","720x1280"]},{id:"runway/gen-3",label:"Runway Gen-3",provider:"ImageRouter",mode:"Video",supportedSizes:["1280x720","720x1280"]}],Qa=[{id:"1:1",label:"1:1",ratio:1,size:"1024x1024",width:1024,height:1024},{id:"4:3",label:"4:3",ratio:4/3,size:"1152x864",width:1152,height:864},{id:"3:4",label:"3:4",ratio:3/4,size:"864x1152",width:864,height:1152},{id:"16:9",label:"16:9",ratio:16/9,size:"1280x720",width:1280,height:720},{id:"9:16",label:"9:16",ratio:9/16,size:"720x1280",width:720,height:1280}],Cn={id:"auto",label:"Auto",resolvedSize:null,note:"Adapter decides the final render size."},ha=.16;function Ao(e){return e==="Image"?bs:ys}function Ja(e,t){const o=xn(t),n=e==="Image"?In:vn;if(!o)return n;if(e==="Image"){const r=Ts(o);if(r)return r;if(vs(o))return xs(o)}else{const r=Is(o);if(r)return r}return wn(e,o)??o}function rn(e,t){const o=e==="Image"?t.imageRouterImageModel:t.imageRouterVideoModel,n=Ja(e,o),r=e==="Image"?In:vn,s=Ao(e),c=s.find(m=>m.id===n)??s.find(m=>m.id===r);return c||{id:n??r,label:n??r,provider:"Saved",mode:e,supportedSizes:e==="Image"?["custom"]:[]}}function Za(e,t){if(e.supportedSizes.map(r=>r.toLowerCase()).includes("custom"))return ga(t);const n=e.supportedSizes.map(r=>ws(r)).filter(r=>!!r);return n.length>0?n:t==="Image"?ga(t):[Cn]}function sn(e,t,o){const n=Za(t,e),r=e==="Image"?ps:ms;return n.find(s=>s.id===o)??n.find(s=>s.id===r)??n[0]??Cn}function ks(e){switch(e){case"1:1":return"aspect-swatch--square";case"4:3":return"aspect-swatch--wide";case"3:4":return"aspect-swatch--portrait";case"16:9":return"aspect-swatch--cinema";case"9:16":return"aspect-swatch--vertical";default:return"aspect-swatch--auto"}}function ln(e){return e.resolvedSize??"auto"}function ga(e){const t=e==="Image"?"Image":"Video";return[Cn,...Qa.map(o=>({id:o.id,label:o.label,resolvedSize:o.size,width:o.width,height:o.height,note:`${t} adapter hint: ${o.size}.`}))]}function xn(e){return String(e??"").trim().replace(/^["']|["']$/g,"").trim()}function dt(e){return e.trim().toLowerCase().replace(/\s+/g," ")}function Ts(e){const t=dt(e);return["gpt-image-2","gpt image 2","gpt-image2","openai/gpt-image-2","openai:gpt-image-2","openai gpt-image-2","openai gpt image 2"].includes(t)?In:["tongyi-mai/z-image-turbo:free","z-image-turbo","z-image turbo","z image turbo","image-router/z-image-turbo","imagerouter z-image turbo"].includes(t)?"Tongyi-MAI/Z-Image-Turbo:free":wn("Image",e)}function Is(e){const t=dt(e);return["google/veo-2","google veo 2","google/veo2","google veo2","veo-2","veo2"].includes(t)?vn:wn("Video",e)}function wn(e,t){const o=dt(t),n=Ao(e).find(r=>dt(r.id)===o||dt(r.label)===o);return(n==null?void 0:n.id)??null}function vs(e){const t=dt(e);return t.startsWith(Co)||t.startsWith(an)||t.startsWith("codex image")}function Cs(e){const t=dt(xn(e));return t==="low"?"low":t==="mid"||t==="medium"?"medium":t==="high"?"high":"medium"}function To(e,t){const o=Qt(e)||rt;return`${Co}${o}:${Cs(t)}`}function xs(e,t=rt){const o=xn(e),n=dt(o);let r="";if(n.startsWith(Co)?r=o.slice(Co.length).trim():n.startsWith(an)?r=o.slice(an.length).trim():n.startsWith("codex image")&&(r=o.replace(/^codex\s+image\s*/i,"").trim()),!r)return To(t,"medium");const s=r.lastIndexOf(":");return s>0&&s<r.length-1?To(r.slice(0,s),r.slice(s+1)):To(t,r)}function ws(e){const t=Ss(e);if(!t)return null;const o=t.width/t.height,n=Qa.map(s=>({definition:s,delta:Math.abs(s.ratio-o)})).sort((s,c)=>s.delta-c.delta)[0];return{id:n&&n.delta<=ha?n.definition.id:`${t.width}:${t.height}`,label:n&&n.delta<=ha?n.definition.label:e,resolvedSize:`${t.width}x${t.height}`,width:t.width,height:t.height,note:`Model native size: ${t.width}x${t.height}.`}}function Ss(e){const t=e.trim().match(/^(\d{2,5})x(\d{2,5})$/i);if(!t)return null;const o=Number(t[1]),n=Number(t[2]);return!Number.isFinite(o)||!Number.isFinite(n)||o<=0||n<=0?null:{width:o,height:n}}const Rs=[{id:"blank",label:"New Mind Canvas",description:"완전히 빈 실행 캔버스를 새로 만듭니다.",iconClass:"fa-solid fa-plus",prompt:"생성할 보드를 선택하세요.",quickCreateTemplateId:"blank-core",options:[]},{id:"business",label:"Business",description:"아이디어를 수익 모델, MVP, 실행 계획으로 바꾸는 비즈니스 설계 보드를 만듭니다.",iconClass:"fa-solid fa-lightbulb",prompt:"어떤 비즈니스 구조로 시작할까요?",options:[{id:"saas",label:"SaaS",description:"구독형 SaaS 비즈니스",templateId:"business-core"},{id:"mobile",label:"모바일 앱",description:"앱 중심 실행 보드",templateId:"business-core"},{id:"automation",label:"AI 자동화",description:"자동화 서비스 구조",templateId:"business-core"},{id:"education",label:"교육 상품",description:"코스/강의형 사업",templateId:"business-core"},{id:"unknown",label:"아직 모름",description:"아이디어 탐색 중심",templateId:"business-core"}]},{id:"build",label:"Build",description:"PRD, 데이터, 결제, 배포까지 한 흐름으로 정리한 서비스 개발 보드를 만듭니다.",iconClass:"fa-solid fa-hammer",prompt:"어떤 방식으로 제품을 만들고 싶나요?",options:[{id:"webapp",label:"웹앱",description:"웹앱 MVP 빌드",templateId:"build-core"},{id:"saas_mvp",label:"SaaS MVP",description:"구독형 SaaS 출시",templateId:"build-core"},{id:"aitool",label:"AI 도구",description:"AI 기반 서비스 구현",templateId:"build-core"},{id:"internal",label:"내부 도구",description:"팀/개인 생산성 도구",templateId:"build-core"}]},{id:"launch",label:"Launch",description:"랜딩 카피, 채널 게시물, 일정까지 묶인 마케팅 런치 보드를 만듭니다.",iconClass:"fa-solid fa-bullhorn",prompt:"어떤 런치 흐름에 맞춰 보드를 만들까요?",options:[{id:"product_hunt",label:"Product Hunt",description:"런치 페이지 중심",templateId:"launch-core"},{id:"social",label:"X / LinkedIn",description:"소셜 런치 중심",templateId:"launch-core"},{id:"community",label:"커뮤니티",description:"커뮤니티 배포 중심",templateId:"launch-core"},{id:"demo",label:"데모 영상",description:"데모 자산 준비 중심",templateId:"launch-core"}]},{id:"more",label:"More",description:"콘텐츠, 학습, 책, 음악처럼 다음 확장용 실행 보드를 불러옵니다.",iconClass:"fa-solid fa-ellipsis",prompt:"다음으로 확장할 실행 보드를 골라보세요.",options:[{id:"content",label:"콘텐츠",description:"영상/콘텐츠 제작",templateId:"content-core"},{id:"learn",label:"학습",description:"출시형 학습 보드",templateId:"learn-core"},{id:"book",label:"책",description:"전자책/스토리 제작",templateId:"book-core"},{id:"music",label:"음악",description:"오디오 제작 스튜디오",templateId:"music-core"}]}],Ms=JSON.parse('[{"id":"blank-core","version":"0.1.0","tier":"core","status":"stable","boardTitle":"Canvas {{timestampShort}}","inputs":[],"nodes":[]},{"id":"business-core","version":"0.1.0","tier":"core","status":"stable","boardTitle":"비즈니스 설계 · {{optionLabel}}","inputs":[{"key":"businessIdea","type":"textarea","label":"어떤 비즈니스를 만들고 싶나요?","description":"한두 문장으로 해결하려는 문제와 아이디어를 적어보세요.","placeholder":"예: AI가 회의록을 정리하고 후속 업무를 자동으로 배정해주는 SaaS","required":true},{"key":"targetUser","type":"text","label":"주요 고객은 누구인가요?","description":"처음 돈을 낼 가능성이 큰 사용자군을 적어보세요.","placeholder":"예: 스타트업 팀 리드, 프리랜서 운영자"},{"key":"businessGoal","type":"select","label":"이번 보드의 목표","description":"지금 가장 먼저 해결하고 싶은 목표를 고르세요.","defaultValue":"validate","options":[{"value":"validate","label":"아이디어 검증"},{"value":"mvp","label":"MVP 설계"},{"value":"monetize","label":"수익화 설계"}]}],"nodes":[{"id":"idea","contentType":"memo","title":"사업 아이디어","body":"{{businessIdea}}","x":-520,"y":-40,"z":0,"width":360,"height":240,"metadata":{"memoColor":"amber","memoIcon":"lightbulb"}},{"id":"target","contentType":"note","title":"타깃 고객","body":"첫 고객 후보: {{targetUser}}\\n\\n1. 첫 고객군 3개\\n2. 각 고객의 급한 문제\\n3. 왜 지금 해결해야 하는지","x":-120,"y":-180,"z":0,"width":340,"height":220},{"id":"problem","contentType":"note","title":"문제 정의","body":"이번 목표는 {{businessGoal}}입니다.\\n불편함이 아니라 비용, 시간, 리스크처럼 돈이 되는 문제를 적어보세요.","x":280,"y":-180,"z":0,"width":340,"height":220},{"id":"revenue","contentType":"note","title":"수익 모델 후보","body":"구독 / 일회성 판매 / 크레딧 / 서비스형 결합 모델을 비교해보세요.","x":680,"y":-180,"z":0,"width":340,"height":220},{"id":"mvp","contentType":"note","title":"MVP 기능","body":"핵심 문제를 해결하는 기능만 3개 이하로 제한하세요.","x":-120,"y":120,"z":0,"width":340,"height":220},{"id":"pricing","contentType":"note","title":"가격 정책","body":"무료 체험, 기본 요금제, 업셀 지점을 함께 적어보세요.","x":280,"y":120,"z":0,"width":340,"height":220},{"id":"first100","contentType":"note","title":"첫 100명 전략","body":"직접 판매, 커뮤니티, 콘텐츠, 파트너십 중 가장 빠른 채널을 고르세요.","x":680,"y":120,"z":0,"width":340,"height":220},{"id":"plan7","contentType":"note","title":"7일 실행 계획","body":"오늘부터 7일 동안 해야 할 일만 날짜별로 적어 실행 가능한 일정으로 바꾸세요.","x":1080,"y":-20,"z":0,"width":340,"height":260}]},{"id":"build-core","version":"0.1.0","tier":"core","status":"stable","boardTitle":"서비스 개발 · {{productName}}","inputs":[{"key":"productName","type":"text","label":"무엇을 만들고 있나요?","description":"보드 상단과 노드에 바로 반영될 제품 이름을 적어보세요.","placeholder":"예: MeetingPilot","required":true},{"key":"productGoal","type":"textarea","label":"이번 MVP의 핵심 가치는 무엇인가요?","description":"사용자가 왜 이 제품을 써야 하는지 한두 문장으로 적어보세요.","placeholder":"예: 회의 후 5분 안에 실행 항목이 정리되도록 한다.","required":true},{"key":"stackOpinion","type":"select","label":"기본 빌드 흐름","description":"처음 버전에서 따라갈 구현 흐름을 고르세요.","defaultValue":"supabase-cloudflare","options":[{"value":"supabase-cloudflare","label":"Supabase + Cloudflare"},{"value":"webapp-default","label":"표준 웹앱 MVP"},{"value":"ai-tooling","label":"AI 도구 중심"}]}],"nodes":[{"id":"overview","contentType":"memo","title":"서비스 개요","body":"{{productName}}\\n\\n{{productGoal}}","x":-520,"y":-40,"z":0,"width":360,"height":240,"metadata":{"memoColor":"sky","memoIcon":"hammer"}},{"id":"prd","contentType":"note","title":"PRD","body":"제품: {{productName}}\\n문제, 사용자 흐름, 필수 기능, 제외 기능을 한 장으로 정리하세요.","x":-120,"y":-180,"z":0,"width":340,"height":220},{"id":"prompt","contentType":"note","title":"개발 프롬프트","body":"외부 개발 도구나 Codex에 넘길 구현 프롬프트 초안을 작성하세요.\\n기본 흐름: {{stackOpinion}}","x":280,"y":-180,"z":0,"width":340,"height":220},{"id":"db","contentType":"note","title":"DB 설계","body":"핵심 테이블, 관계, 최소 필수 컬럼만 먼저 정의하세요.","x":680,"y":-180,"z":0,"width":340,"height":220},{"id":"auth","contentType":"note","title":"Auth / 권한","body":"로그인, 역할, 온보딩, 접근 제어 시나리오를 적어보세요.","x":-120,"y":120,"z":0,"width":340,"height":220},{"id":"payment","contentType":"note","title":"결제 흐름","body":"요금제, 결제 성공/실패, 환불, 사용량 제한까지 연결하세요.","x":280,"y":120,"z":0,"width":340,"height":220},{"id":"deploy","contentType":"note","title":"배포 체크리스트","body":"환경 변수, 도메인, 모니터링, 오류 추적 준비 상태를 확인하세요.","x":680,"y":120,"z":0,"width":340,"height":220},{"id":"ops","contentType":"note","title":"운영 / 고객지원","body":"문의, 환불, 버그 리포트, 관리자 대시보드 항목을 정리하세요.","x":1080,"y":-180,"z":0,"width":340,"height":220},{"id":"qa","contentType":"note","title":"출시 전 QA","body":"결제, 로그인, 온보딩, 모바일 화면, 오류 복구 시나리오를 최종 점검하세요.","x":1080,"y":120,"z":0,"width":340,"height":220}]},{"id":"launch-core","version":"0.1.0","tier":"core","status":"stable","boardTitle":"마케팅 런치 · {{productName}}","inputs":[{"key":"productName","type":"text","label":"무엇을 홍보하나요?","description":"제품명이나 캠페인 이름을 적어보세요.","placeholder":"예: MeetingPilot","required":true},{"key":"targetAudience","type":"text","label":"주요 타깃은 누구인가요?","description":"메시지를 맞출 대표 사용자군을 적어보세요.","placeholder":"예: 스타트업 팀 리드, 솔로 파운더"},{"key":"launchGoal","type":"select","label":"이번 런치의 목표","description":"보드가 최우선으로 도와줄 목표를 고르세요.","defaultValue":"signups","options":[{"value":"signups","label":"가입 전환"},{"value":"waitlist","label":"대기자 확보"},{"value":"sales","label":"첫 결제 만들기"}]}],"nodes":[{"id":"positioning","contentType":"memo","title":"포지셔닝","body":"{{productName}}\\n주요 타깃: {{targetAudience}}\\n이번 목표: {{launchGoal}}","x":-520,"y":-40,"z":0,"width":360,"height":240,"metadata":{"memoColor":"rose","memoIcon":"bullhorn"}},{"id":"landing","contentType":"note","title":"랜딩페이지 카피","body":"헤드라인, 서브카피, CTA, 신뢰 요소를 빠르게 초안화하세요.","x":-120,"y":-180,"z":0,"width":340,"height":220},{"id":"channelCopy","contentType":"note","title":"채널별 소개문","body":"Product Hunt / X / LinkedIn / 커뮤니티용 소개문을 각각 다르게 써보세요.","x":280,"y":-180,"z":0,"width":340,"height":220},{"id":"community","contentType":"note","title":"커뮤니티 포스트","body":"홍보가 아니라 문제 해결 경험 공유 형태로 바꿔보세요.","x":680,"y":-180,"z":0,"width":340,"height":220},{"id":"demoChecklist","contentType":"note","title":"데모 영상 체크리스트","body":"문제 제시, 해결 시연, CTA 순서로 필요한 장면을 정리하세요.","x":-120,"y":120,"z":0,"width":340,"height":220},{"id":"assets","contentType":"note","title":"스크린샷 자산","body":"대표 화면, 비교 장면, 후기/증거 이미지를 수집하세요.","x":280,"y":120,"z":0,"width":340,"height":220},{"id":"schedule","contentType":"note","title":"배포 일정","body":"오늘, 내일, 일주일 안에 배포할 채널과 시간을 적어보세요.","x":680,"y":120,"z":0,"width":340,"height":220},{"id":"metrics","contentType":"note","title":"성과 기록","body":"방문, 가입, 결제, 반응이 좋았던 메시지를 한곳에 적재하세요.","x":1080,"y":-20,"z":0,"width":340,"height":260}]},{"id":"content-core","version":"0.1.0","tier":"preview","status":"experimental","boardTitle":"콘텐츠 제작 · {{contentTheme}}","inputs":[{"key":"contentTheme","type":"text","label":"무슨 콘텐츠를 만들까요?","description":"영상/게시물의 핵심 주제를 적어보세요.","placeholder":"예: AI 회의 요약 도구 소개 영상","required":true},{"key":"contentChannel","type":"select","label":"주요 채널","description":"초기 기획을 맞출 채널을 골라보세요.","defaultValue":"youtube","options":[{"value":"youtube","label":"YouTube"},{"value":"shorts","label":"Shorts / Reels"},{"value":"blog","label":"블로그 / 글"}]}],"nodes":[{"id":"contentPlan","contentType":"memo","title":"콘텐츠 기획","body":"{{contentTheme}}\\n주요 채널: {{contentChannel}}","x":-420,"y":-20,"z":0,"width":360,"height":240,"metadata":{"memoColor":"violet","memoIcon":"film"}},{"id":"script","contentType":"note","title":"대본","body":"오프닝 훅, 핵심 포인트, CTA를 써보세요.","x":0,"y":-160,"z":0,"width":340,"height":220},{"id":"scenes","contentType":"note","title":"장면 구성","body":"장면별 메시지와 필요한 시각 자료를 나누세요.","x":400,"y":-160,"z":0,"width":340,"height":220},{"id":"imagePrompts","contentType":"note","title":"이미지 프롬프트","body":"썸네일/컷신용 이미지 프롬프트를 작성하세요.","x":0,"y":120,"z":0,"width":340,"height":220},{"id":"videoPrompts","contentType":"note","title":"영상 프롬프트","body":"카메라 움직임, 분위기, 길이를 정의하세요.","x":400,"y":120,"z":0,"width":340,"height":220},{"id":"distribution","contentType":"note","title":"배포 체크","body":"제목, 설명, 썸네일, 업로드 일정까지 확인하세요.","x":800,"y":-20,"z":0,"width":340,"height":260}]},{"id":"learn-core","version":"0.1.0","tier":"preview","status":"experimental","boardTitle":"출시형 학습 · {{learningGoal}}","inputs":[{"key":"learningGoal","type":"text","label":"어떤 결과물을 목표로 배우나요?","description":"단순 문법보다 만들고 싶은 산출물을 적어보세요.","placeholder":"예: 첫 번째 SaaS MVP 출시","required":true}],"nodes":[{"id":"goal","contentType":"memo","title":"학습 목표","body":"{{learningGoal}}","x":-420,"y":-20,"z":0,"width":360,"height":240,"metadata":{"memoColor":"emerald","memoIcon":"graduation-cap"}},{"id":"basics","contentType":"note","title":"기초 개념","body":"지금 부족한 문법과 개념을 적어 우선순위를 정하세요.","x":0,"y":-160,"z":0,"width":340,"height":220},{"id":"smallFeature","contentType":"note","title":"작은 기능 만들기","body":"작게 끝낼 수 있는 기능 단위를 나누세요.","x":400,"y":-160,"z":0,"width":340,"height":220},{"id":"api","contentType":"note","title":"API 사용","body":"연동할 API와 테스트 시나리오를 정리하세요.","x":0,"y":120,"z":0,"width":340,"height":220},{"id":"dbAuth","contentType":"note","title":"DB / Auth","body":"저장 구조와 로그인 흐름을 간단히 설계하세요.","x":400,"y":120,"z":0,"width":340,"height":220},{"id":"ship","contentType":"note","title":"배포","body":"배포까지 필요한 최소 단계만 체크리스트로 적으세요.","x":800,"y":-20,"z":0,"width":340,"height":260}]},{"id":"book-core","version":"0.1.0","tier":"preview","status":"experimental","boardTitle":"책/전자책 · {{bookTopic}}","inputs":[{"key":"bookTopic","type":"text","label":"어떤 책을 만들까요?","description":"주제나 제목 초안을 적어보세요.","placeholder":"예: 솔로 파운더를 위한 AI 실행 가이드","required":true},{"key":"readerType","type":"text","label":"누구를 위한 책인가요?","description":"대표 독자층을 한 줄로 적어보세요.","placeholder":"예: 첫 제품을 만들려는 1인 창업자"}],"nodes":[{"id":"bookConcept","contentType":"memo","title":"책 컨셉","body":"{{bookTopic}}\\n대표 독자: {{readerType}}","x":-420,"y":-20,"z":0,"width":360,"height":240,"metadata":{"memoColor":"amber","memoIcon":"book-open"}},{"id":"toc","contentType":"note","title":"목차","body":"큰 장과 소장 흐름을 먼저 정리하세요.","x":0,"y":-160,"z":0,"width":340,"height":220},{"id":"chapters","contentType":"note","title":"챕터 초안","body":"핵심 메시지와 사례를 장별로 메모하세요.","x":400,"y":-160,"z":0,"width":340,"height":220},{"id":"cover","contentType":"note","title":"삽화 / 표지","body":"필요한 비주얼 자산 목록을 정리하세요.","x":0,"y":120,"z":0,"width":340,"height":220},{"id":"edit","contentType":"note","title":"교정 / 편집","body":"말투, 중복, 흐름, CTA 점검 포인트를 적으세요.","x":400,"y":120,"z":0,"width":340,"height":220},{"id":"export","contentType":"note","title":"Export","body":"PDF/EPUB/배포 채널까지 마무리 작업을 적으세요.","x":800,"y":-20,"z":0,"width":340,"height":260}]},{"id":"music-core","version":"0.1.0","tier":"preview","status":"experimental","boardTitle":"음악 제작 · {{trackMood}}","inputs":[{"key":"trackMood","type":"text","label":"어떤 분위기의 트랙을 만들까요?","description":"감정이나 사용 장면을 짧게 적어보세요.","placeholder":"예: 밤 작업용 로파이 집중 트랙","required":true},{"key":"musicGenre","type":"select","label":"기본 장르","description":"가장 가까운 출발 장르를 골라보세요.","defaultValue":"lofi","options":[{"value":"lofi","label":"Lo-fi"},{"value":"ambient","label":"Ambient"},{"value":"pop","label":"Pop"},{"value":"cinematic","label":"Cinematic"}]}],"nodes":[{"id":"musicConcept","contentType":"memo","title":"음악 컨셉","body":"{{trackMood}}\\n기본 장르: {{musicGenre}}","x":-420,"y":-20,"z":0,"width":360,"height":240,"metadata":{"memoColor":"pink","memoIcon":"music"}},{"id":"references","contentType":"note","title":"레퍼런스","body":"참고곡과 참고 포인트를 나열하세요.","x":0,"y":-160,"z":0,"width":340,"height":220},{"id":"vocals","contentType":"note","title":"보컬 / 악기","body":"보컬 타입과 핵심 악기 구성을 적어보세요.","x":400,"y":-160,"z":0,"width":340,"height":220},{"id":"lyrics","contentType":"note","title":"가사","body":"주제, 반복 훅, 금지 표현을 정리하세요.","x":0,"y":120,"z":0,"width":340,"height":220},{"id":"generationPrompt","contentType":"note","title":"생성 프롬프트","body":"음향, 구조, 분위기 지시문을 모아두세요.","x":400,"y":120,"z":0,"width":340,"height":220},{"id":"versions","contentType":"note","title":"버전 비교","body":"mp3 결과물과 수정 포인트를 기록하세요.","x":800,"y":-20,"z":0,"width":340,"height":260}]}]'),Ps={launchers:Rs,templates:Ms},fa={en:{"launcher.blank.title":"New Mind Canvas","launcher.blank.desc":"Create a clean execution canvas.","launcher.blank.prompt":"Choose the board you want to create.","launcher.business.title":"Business","launcher.business.desc":"Turn an idea into a revenue model, MVP, and execution plan.","launcher.business.prompt":"What business structure should we start with?","launcher.business.option.saas.title":"SaaS","launcher.business.option.saas.desc":"Subscription SaaS business","launcher.business.option.mobile.title":"Mobile App","launcher.business.option.mobile.desc":"Mobile-first execution board","launcher.business.option.automation.title":"AI Automation","launcher.business.option.automation.desc":"Automation service structure","launcher.business.option.education.title":"Education Product","launcher.business.option.education.desc":"Course or lecture business","launcher.business.option.unknown.title":"Not sure yet","launcher.business.option.unknown.desc":"Explore possible ideas","launcher.build.title":"Build","launcher.build.desc":"Organize a service build from PRD, data, billing, and deployment.","launcher.build.prompt":"What kind of product should we build?","launcher.build.option.webapp.title":"Web App","launcher.build.option.webapp.desc":"Build a web MVP","launcher.build.option.saas_mvp.title":"SaaS MVP","launcher.build.option.saas_mvp.desc":"Launch a subscription SaaS","launcher.build.option.aitool.title":"AI Tool","launcher.build.option.aitool.desc":"Implement an AI-powered service","launcher.build.option.internal.title":"Internal Tool","launcher.build.option.internal.desc":"Team or personal productivity tool","launcher.launch.title":"Launch","launcher.launch.desc":"Plan landing copy, channel posts, assets, and launch schedule.","launcher.launch.prompt":"What launch flow should we prepare?","launcher.launch.option.product_hunt.title":"Product Hunt","launcher.launch.option.product_hunt.desc":"Prepare a launch page","launcher.launch.option.social.title":"X / LinkedIn","launcher.launch.option.social.desc":"Plan social launch posts","launcher.launch.option.community.title":"Community","launcher.launch.option.community.desc":"Plan community distribution","launcher.launch.option.demo.title":"Demo Video","launcher.launch.option.demo.desc":"Prepare a demo asset","launcher.more.title":"More","launcher.more.desc":"Open more execution boards for content, learning, books, and music.","launcher.more.prompt":"Choose the next execution board.","launcher.more.option.content.title":"Content","launcher.more.option.content.desc":"Start video or content production","launcher.more.option.learn.title":"Learn","launcher.more.option.learn.desc":"Create a launch-focused learning board","launcher.more.option.book.title":"Book","launcher.more.option.book.desc":"Start an ebook or story board","launcher.more.option.music.title":"Music","launcher.more.option.music.desc":"Start an audio production studio","templateCard.eyebrow":"Template","templateCard.generate":"Generate","templateCard.noInputs":"No inputs needed.","templateCard.generating":"Generating nodes...","templateCard.generated":"Generated {0} nodes below.","templateCard.failed":"Template generation failed.","templateCard.required":"{0} is required.","template.blank-core.boardTitle":"Canvas {{timestampShort}}","template.business-core.boardTitle":"Business Design - {{optionLabel}}","template.business-core.input.businessIdea.label":"What business do you want to build?","template.business-core.input.businessIdea.desc":"Write the problem and idea you want to solve in one or two sentences.","template.business-core.input.businessIdea.placeholder":"Example: A SaaS that summarizes meetings and assigns follow-up work automatically","template.business-core.input.targetUser.label":"Who is the primary customer?","template.business-core.input.targetUser.desc":"Write the user group most likely to pay first.","template.business-core.input.targetUser.placeholder":"Example: startup team leads, freelance operators","template.business-core.input.businessGoal.label":"Goal for this board","template.business-core.input.businessGoal.desc":"Choose what you want to solve first.","template.business-core.input.businessGoal.option.validate":"Validate the idea","template.business-core.input.businessGoal.option.mvp":"Design the MVP","template.business-core.input.businessGoal.option.monetize":"Design monetization","template.business-core.node.idea.title":"Business Idea","template.business-core.node.idea.body":"{{businessIdea}}","template.business-core.node.target.title":"Target Customers","template.business-core.node.target.body":`First customer candidates: {{targetUser}}
|
|
1
|
+
import{r as p,j as a}from"./vendor-react-BXzpOyCS.js";import{R as g}from"./app-runtime-xD2Z3NdN.js";import{S as gi,L as fi,P as bi,I as La,U as yi,a as ki,b as Ti,X as Po,K as pa,V as Ii,C as vi,B as Ci,c as ko,d as xi,e as wi,R as vo,f as nn,g as Si,M as Ri,h as ja,i as Na,j as Da,k as Oa,l as Mi,m as _a,n as Pi,o as Ai,F as Ei,p as Li,H as ji,q as Ni,r as Di,s as Fa,t as Oi,G as _i,u as Fi,v as Bi,w as Gi,x as Ui,y as zi,T as $i,z as Vi}from"./vendor-icons-678PAT8P.js";const Qe=Object.freeze({status:"/api/remote/status",devices:"/api/remote/devices",frames:"/api/remote/frames",hostTarget:"/api/remote/host-target",agentStatus:"/api/remote/agent/status",agentConnect:"/api/remote/agent/connect",agentDisconnect:"/api/remote/agent/disconnect",deviceTasksTemplate:"/api/remote/devices/{deviceId}/tasks",taskBatch:"/api/remote/tasks"}),Ba=Object.freeze({frames:"/api/remote/frames/ws",input:"/api/remote/input/ws"});function qi(e){return Qe.deviceTasksTemplate.replace("{deviceId}",encodeURIComponent(e))}function Ga(e){return za(e==null?void 0:e.remoteFrameWsPath,Ba.frames)}function Ua(e){return za(e==null?void 0:e.remoteInputWsPath,Ba.input)}function za(e,t){return typeof e=="string"?e.trim():t}const Qo={},Wi="http://127.0.0.1:5147",$a="MindExec.AllowHostedLocalBridge",Ki=new Set(["4173","5173"]);function Yt(e){return e.replace(/\/+$/,"")}function Hi(){return((Qo==null?void 0:Qo.VITE_LOCAL_BRIDGE_URL)||"").trim()}function Xi(){if(typeof window>"u")return"";const{protocol:e,hostname:t,port:o,origin:n}=window.location,r=t.toLowerCase();return(e==="http:"||e==="https:")&&(r==="localhost"||r==="127.0.0.1"||r==="::1")&&o&&!Ki.has(o)?n:""}function j(){return Yt(Hi()||Xi()||Wi)}function Yi(){const e=window.location.hostname.toLowerCase();return e==="localhost"||e==="127.0.0.1"||e==="::1"}function Qi(){try{return window.localStorage.getItem($a)==="true"}catch{return!1}}function Va(e){try{e&&window.localStorage.setItem($a,"true")}catch{}}function Pt(){return Yi()||Qi()}function qa(e){const t=String((e==null?void 0:e.bridgeToken)||"").trim();if(t)return{header:(e==null?void 0:e.bridgeTokenHeader)||"X-Bridge-Token",token:t}}async function D(e,t,o={}){const n=new AbortController,r=window.setTimeout(()=>n.abort(),o.timeoutMs??4200),s=new Headers;s.set("Accept","application/json"),s.set("Cache-Control","no-store"),s.set("Pragma","no-cache"),o.body!==void 0&&s.set("Content-Type","application/json"),o.auth&&s.set(o.auth.header,o.auth.token);try{const c=await fetch(`${Yt(e)}${t}`,{method:o.method||(o.body===void 0?"GET":"POST"),headers:s,body:o.body===void 0?void 0:JSON.stringify(o.body),cache:"no-store",signal:n.signal}),m=await c.text(),l=m?JSON.parse(m):null;if(!c.ok){const b=(l==null?void 0:l.error)||(l==null?void 0:l.message)||`LocalBridge request failed: ${c.status}`;throw new Error(b)}return l}finally{window.clearTimeout(r)}}function Ji(e){return e instanceof DOMException&&e.name==="AbortError"?"LocalBridge probe timed out.":e instanceof SyntaxError?"LocalBridge returned a non-JSON response.":e instanceof Error?e.message||"LocalBridge is unavailable.":String(e||"LocalBridge is unavailable.")}async function kn(e=j()){var t;try{const o=await D(e,"/api/status?refresh=1",{timeoutMs:4200});return g.emit("localBridge.status",{baseUrl:e,connected:!0,projectOpen:((t=o.project)==null?void 0:t.isOpen)===!0}),{state:"connected",baseUrl:e,status:o}}catch(o){const n=Ji(o);return g.emit("localBridge.status",{baseUrl:e,connected:!1,message:n}),{state:"unavailable",baseUrl:e,message:n}}}async function Qc(e,t,o=j()){return g.emit("localBridge.authSession.save.request",{baseUrl:o,hasContent:!!e.trim()}),D(o,"/api/auth/session",{method:"POST",body:{content:e},auth:t,timeoutMs:6500})}async function Jc(e,t=j()){return g.emit("localBridge.authSession.clear.request",{baseUrl:t}),D(t,"/api/auth/session",{method:"DELETE",auth:e,timeoutMs:6500})}async function Zc(e,t,o=j()){return D(o,"/project/open",{method:"POST",body:{path:e},auth:t,timeoutMs:15e3})}async function ed(e=j(),t=18,o=1200){var r,s;let n={state:"idle",baseUrl:e};for(let c=0;c<t;c+=1){if(n=await kn(e),n.state==="connected"&&((s=(r=n.status)==null?void 0:r.project)!=null&&s.isOpen))return n;await new Promise(m=>{window.setTimeout(m,o)})}return n}async function td(e,t=j()){return D(t,"/project/symbols",{auth:e,timeoutMs:12e3})}async function od(e,t=j()){return D(t,"/project/graph",{auth:e,timeoutMs:12e3})}async function nd(e="standard",t,o=j()){const n=`?level=${encodeURIComponent(e)}`;return D(o,`/project/ai-context${n}`,{auth:t,timeoutMs:14e3})}async function ad(e,t=j()){return g.emit("localBridge.codex.capabilities.request",{baseUrl:t}),D(t,"/api/codex/capabilities",{auth:e,timeoutMs:12e3})}async function rd(e,t=5,o,n=j()){return g.emit("localBridge.web.search.request",{baseUrl:n,maxResults:t}),D(n,"/api/web/search",{method:"POST",body:{query:e,maxResults:t},auth:o,timeoutMs:24e3})}async function id(e,t=6e3,o,n=j()){return g.emit("localBridge.web.fetch.request",{baseUrl:n,maxChars:t}),D(n,"/api/web/fetch",{method:"POST",body:{url:e,maxChars:t},auth:o,timeoutMs:24e3})}async function sd(e,t,o=j()){return g.emit("localBridge.browser.open.request",{baseUrl:o}),D(o,"/api/browser/open",{method:"POST",body:{url:e},auth:t,timeoutMs:24e3})}async function ld(e,t=4e3,o,n=j()){return g.emit("localBridge.browser.snapshot.request",{baseUrl:n,maxChars:t}),D(n,"/api/browser/snapshot",{method:"POST",body:{sessionId:e,maxChars:t},auth:o,timeoutMs:18e3})}async function cd(e,t="hero",o=3e3,n,r=j()){return g.emit("localBridge.browser.extract.request",{baseUrl:r,scope:t,maxChars:o}),D(r,"/api/browser/extract",{method:"POST",body:{sessionId:e,scope:t,maxChars:o},auth:n,timeoutMs:18e3})}async function dd(e,t,o=j()){return g.emit("localBridge.evidence.save.request",{baseUrl:o,kind:e.kind||"evidence"}),D(o,"/api/evidence/save",{method:"POST",body:e,auth:t,timeoutMs:18e3})}async function ud(e,t,o=j()){var n;return g.emit("localBridge.concept.defineComposite.request",{baseUrl:o,hasSignature:!!((n=e.signature)!=null&&n.trim())}),D(o,"/api/concept/define-composite",{method:"POST",body:e,auth:t,timeoutMs:18e3})}async function pd(e,t=j()){return g.emit("localBridge.concept.status.request",{baseUrl:t}),D(t,"/api/concept/status",{method:"GET",auth:e,timeoutMs:12e3})}async function md(e,t,o=j()){return g.emit("localBridge.concept.row.request",{baseUrl:o,id:e}),D(o,`/api/concept/row?id=${encodeURIComponent(e)}`,{method:"GET",auth:t,timeoutMs:12e3})}async function hd(e,t=j()){return g.emit("localBridge.concept.embed.readiness.request",{baseUrl:t}),D(t,"/api/concept/embed/readiness",{method:"GET",auth:e,timeoutMs:12e3})}async function gd(e,t=j()){return D(t,"/project/close",{method:"POST",auth:e,timeoutMs:12e3})}async function fd(e=j()){return D(e,"/api/workspace",{timeoutMs:4200})}async function bd(e,t,o=j()){return D(o,"/api/workspace/browse",{method:"POST",body:{initialPath:e||""},auth:t,timeoutMs:12e4})}async function yd(e,t,o=j()){return D(o,"/api/workspace/set",{method:"POST",body:{path:e},auth:t,timeoutMs:3e4})}async function kd(e,t,o=j()){return g.emit("localBridge.dir.list.request",{baseUrl:o}),D(o,"/api/dir/list",{method:"POST",body:{path:e},auth:t,timeoutMs:12e3})}async function Td(e=j()){return D(e,"/project/change-feed",{timeoutMs:4200})}async function Wa(e,t=j()){return D(t,Qe.status,{auth:e,timeoutMs:4200})}async function Zi(e,t=j()){return D(t,Qe.agentStatus,{auth:e,timeoutMs:4200})}async function Ka(e,t=j(),o={}){const n=o.includeDataUrl?"?includeDataUrl=true":"";return D(t,`${Qe.devices}${n}`,{auth:e,timeoutMs:6500})}async function Ha(e,t,o=j()){return D(o,Qe.frames,{method:"POST",body:{deviceIds:e,includeThumbnail:!0,includeLive:!0},auth:t,timeoutMs:6500})}async function ma(e,t,o,n=j(),r={}){return D(n,Qe.hostTarget,{method:"POST",body:{nodeId:e,enabled:t,leaseMs:r.leaseMs??6e4},auth:o,timeoutMs:6500})}async function es(e,t,o=j()){return D(o,Qe.agentConnect,{method:"POST",body:e,auth:t,timeoutMs:3e4})}async function ts(e="react-remote-monitor",t,o=j()){return D(o,Qe.agentDisconnect,{method:"POST",body:{reason:e},auth:t,timeoutMs:12e3})}async function Xa(e,t,o,n=j()){return D(n,qi(e),{method:"POST",body:t,auth:o,timeoutMs:12e3})}async function os(e,t,o=j()){return D(o,Qe.taskBatch,{method:"POST",body:e,auth:t,timeoutMs:16e3})}async function Id(e,t=j()){const o=new URLSearchParams;return o.set("q",e.q),o.set("order",e.order||"relevance"),o.set("publishedWithin",e.publishedWithin||"any"),o.set("videoDuration",e.videoDuration||"any"),o.set("eventType",e.eventType||"any"),o.set("safeSearch",e.safeSearch||"moderate"),e.relevanceLanguage&&o.set("relevanceLanguage",e.relevanceLanguage),e.regionCode&&o.set("regionCode",e.regionCode),e.maxResults&&o.set("maxResults",String(e.maxResults)),e.pageToken&&o.set("pageToken",e.pageToken),D(t,`/api/youtube/search?${o.toString()}`,{timeoutMs:16e3})}function We(e){return`/api/company-core${e.startsWith("/")?e:`/${e}`}`}async function vd(e,t=j()){return g.emit("companyCore.bridge.request",{method:"GET",path:"/health"}),D(t,We("/health"),{auth:e,timeoutMs:6500})}async function Cd(e,t=j()){return g.emit("companyCore.bridge.request",{method:"GET",path:"/api/companies"}),D(t,We("/api/companies"),{auth:e,timeoutMs:12e3})}async function xd(e=20,t,o=j()){const n=Math.max(1,Math.min(100,Math.round(e)));return g.emit("companyCore.bridge.request",{method:"GET",path:"/api/company-runs",limit:n}),D(o,We(`/api/company-runs?limit=${n}`),{auth:t,timeoutMs:12e3})}async function wd(e,t,o=j()){const n=encodeURIComponent(e);return g.emit("companyCore.bridge.request",{method:"GET",path:"/api/companies/:id/snapshot"}),D(o,We(`/api/companies/${n}/snapshot`),{auth:t,timeoutMs:12e3})}async function Sd(e,t,o=j()){const n=encodeURIComponent(e);return g.emit("companyCore.bridge.request",{method:"GET",path:"/api/companies/:id/approvals"}),D(o,We(`/api/companies/${n}/approvals?pendingOnly=false`),{auth:t,timeoutMs:12e3})}async function Rd(e,t,o=j()){const n=encodeURIComponent(e);return g.emit("companyCore.bridge.request",{method:"GET",path:"/api/companies/:id/artifacts"}),D(o,We(`/api/companies/${n}/artifacts`),{auth:t,timeoutMs:12e3})}async function Md(e,t,o=j()){const n=encodeURIComponent(e);return g.emit("companyCore.bridge.request",{method:"GET",path:"/api/companies/:id/publishing-jobs"}),D(o,We(`/api/companies/${n}/publishing-jobs?limit=100`),{auth:t,timeoutMs:12e3})}async function Pd(e,t,o=j()){const n=encodeURIComponent(e);return g.emit("companyCore.bridge.request",{method:"GET",path:"/api/companies/:id/growth"}),D(o,We(`/api/companies/${n}/growth?limit=100`),{auth:t,timeoutMs:12e3})}async function Ad(e,t,o=j()){const n=encodeURIComponent(e);return g.emit("companyCore.bridge.request",{method:"GET",path:"/api/companies/:id/revenue"}),D(o,We(`/api/companies/${n}/revenue?limit=100`),{auth:t,timeoutMs:12e3})}async function Ed(e,t,o=j()){const n=encodeURIComponent(e);return g.emit("companyCore.bridge.request",{method:"GET",path:"/api/companies/:id/reflections"}),D(o,We(`/api/companies/${n}/reflections?limit=50`),{auth:t,timeoutMs:12e3})}async function Ld(e,t,o=j()){return D(o,"/api/codex/thread/run",{method:"POST",body:e,auth:t,timeoutMs:18e4})}async function jd(e,t=j()){return D(t,"/api/file/read",{method:"POST",body:{path:e},timeoutMs:3e4})}async function Nd(e,t=j()){const o=new AbortController,n=window.setTimeout(()=>o.abort(),3e4);try{const r=await fetch(`${Yt(t)}/api/file/read-raw?path=${encodeURIComponent(e)}`,{method:"GET",headers:{Accept:"application/octet-stream","Cache-Control":"no-store",Pragma:"no-cache"},cache:"no-store",signal:o.signal});if(!r.ok)throw new Error(`LocalBridge raw file read failed: ${r.status}`);return new Uint8Array(await r.arrayBuffer())}finally{window.clearTimeout(n)}}async function Dd(e,t,o,n=j()){return D(n,"/api/file/write",{method:"POST",body:{path:e,content:t,encoding:"utf8"},auth:o,timeoutMs:3e4})}async function Od(e,t,o,n=j()){const r=new AbortController,s=window.setTimeout(()=>r.abort(),3e4),c=new Headers;c.set("Accept","application/json"),c.set("Content-Type","application/octet-stream"),c.set("Cache-Control","no-store"),c.set("Pragma","no-cache"),c.set(o.header,o.token);try{const m=new ArrayBuffer(t.byteLength);new Uint8Array(m).set(t);const l=await fetch(`${Yt(n)}/api/file/write-raw?path=${encodeURIComponent(e)}`,{method:"PUT",headers:c,body:m,cache:"no-store",signal:r.signal}),b=await l.json().catch(()=>null);if(!l.ok){const k=(b==null?void 0:b.error)||(b==null?void 0:b.message)||`LocalBridge raw file write failed: ${l.status}`;throw new Error(k)}return b}finally{window.clearTimeout(s)}}async function _d(e,t,o=j()){return D(o,"/api/file/delete",{method:"POST",body:{path:e},auth:t,timeoutMs:3e4})}function ns(e,t=j()){const o=String(e||"").trim();if(!o)return;if(/^https?:\/\//i.test(o)||o.startsWith("data:"))return o;const n=o.replace(/\\/g,"/").replace(/^\/+/,"");return`${Yt(t)}/${n}`}const rt="gpt-5.5",as="gemini-3-flash-preview",rs="llama3",Tn=[{id:"gpt-5.5",label:"GPT-5.5",provider:"codex"},{id:"gpt-5.4",label:"GPT-5.4",provider:"codex"},{id:"gpt-5.4-mini",label:"GPT-5.4 mini",provider:"codex"},{id:"gpt-5.3-codex-spark",label:"GPT-5.3 Codex Spark",provider:"codex"},{id:rs,label:"llama3",provider:"ollama"},{id:"llama3.2",label:"llama3.2",provider:"ollama"},{id:"openrouter/auto",label:"Auto Router",provider:"openrouter"},{id:"openai/gpt-chat-latest",label:"GPT Chat Latest",provider:"openrouter"},{id:"anthropic/claude-sonnet-4.5",label:"Claude Sonnet 4.5",provider:"openrouter"},{id:"google/gemini-2.5-pro",label:"Gemini 2.5 Pro",provider:"openrouter"},{id:"google/gemini-2.5-flash",label:"Gemini 2.5 Flash",provider:"openrouter"},{id:as,label:"Gemini 3 Flash Preview",provider:"gemini-cli"},{id:"gemini-3-pro-preview",label:"Gemini 3 Pro Preview",provider:"gemini-cli"},{id:"gemini-2.5-flash",label:"Gemini 2.5 Flash",provider:"gemini-cli"},{id:"gemini-2.5-pro",label:"Gemini 2.5 Pro",provider:"gemini-cli"},{id:"gemini-2.5-flash-lite-preview-06-17",label:"Gemini 2.5 Flash Lite Preview",provider:"gemini-cli"}],is=new Map([["",rt],["openai: gpt-4.1 mini",rt],["gpt-4.1 mini",rt],["gpt-5.3-codex",rt],["gpt-5.2",rt],["gpt-5.2-codex",rt]]);function Qt(e){const t=String(e??"").trim().replace(/^["']|["']$/g,""),o=t.toLowerCase();return is.get(o)??t}function ss(e){const t=Qt(e);return t.includes("/")||t.includes(":")}function ls(e){const t=Qt(e);return Tn.find(o=>o.id===t)??null}function Ya(e){switch(e){case"codex":return"Codex";case"ollama":return"Ollama";case"gemini-cli":return"Gemini CLI";case"openrouter":return"OpenRouter";default:return e}}function ho(e,t){const o=new Map(t.map((n,r)=>[n,r]));return e.map((n,r)=>({option:n,index:r})).filter(({option:n})=>o.has(n.provider)).sort((n,r)=>{const s=o.get(n.option.provider)??Number.MAX_SAFE_INTEGER,c=o.get(r.option.provider)??Number.MAX_SAFE_INTEGER;return s-c||n.index-r.index}).map(({option:n})=>n)}function cs(e,t=Tn){switch(e){case"Local Ollama":return ho(t,["ollama","openrouter"]);case"OpenAI Codex":return ho(t,["codex","openrouter"]);case"Gemini CLI":return ho(t,["gemini-cli"]);case"Managed Cloud":case"BYOK":default:return ho(t,["openrouter"])}}function ds(e){return e.startsWith("gemini-")?"gemini-cli":e.startsWith("llama")?"ollama":ss(e)?"openrouter":"codex"}function us(e){const t=e.aiProvider??"OpenAI Codex",o=cs(t),n=Qt(e.model);return n&&!o.some(r=>r.id===n)?[{id:n,label:`${n} (custom)`,provider:ds(n)},...o]:o}const In="gpt-image-2",vn="google/veo-2",ps="1:1",ms="16:9",Co="codex-image:",an="codex:",hs=["1024x1024","1536x1024","1024x1536"],gs=[{id:"low",label:"Low"},{id:"medium",label:"Mid"},{id:"high",label:"High"}],fs=Tn.filter(e=>e.provider==="codex").flatMap(e=>gs.map(t=>({id:To(e.id,t.id),label:`Codex Image ${t.label} (${e.label})`,provider:"OpenAI Codex",mode:"Image",supportedSizes:hs}))),bs=[{id:"gpt-image-2",label:"GPT Image 2",provider:"OpenAI",mode:"Image",supportedSizes:["custom"]},{id:"Tongyi-MAI/Z-Image-Turbo:free",label:"Z-Image Turbo",provider:"ImageRouter",mode:"Image",supportedSizes:["custom"]},...fs],ys=[{id:"google/veo-2",label:"Google Veo 2",provider:"ImageRouter",mode:"Video",supportedSizes:["1280x720","720x1280"]},{id:"runway/gen-3",label:"Runway Gen-3",provider:"ImageRouter",mode:"Video",supportedSizes:["1280x720","720x1280"]}],Qa=[{id:"1:1",label:"1:1",ratio:1,size:"1024x1024",width:1024,height:1024},{id:"4:3",label:"4:3",ratio:4/3,size:"1152x864",width:1152,height:864},{id:"3:4",label:"3:4",ratio:3/4,size:"864x1152",width:864,height:1152},{id:"16:9",label:"16:9",ratio:16/9,size:"1280x720",width:1280,height:720},{id:"9:16",label:"9:16",ratio:9/16,size:"720x1280",width:720,height:1280}],Cn={id:"auto",label:"Auto",resolvedSize:null,note:"Adapter decides the final render size."},ha=.16;function Ao(e){return e==="Image"?bs:ys}function Ja(e,t){const o=xn(t),n=e==="Image"?In:vn;if(!o)return n;if(e==="Image"){const r=Ts(o);if(r)return r;if(vs(o))return xs(o)}else{const r=Is(o);if(r)return r}return wn(e,o)??o}function rn(e,t){const o=e==="Image"?t.imageRouterImageModel:t.imageRouterVideoModel,n=Ja(e,o),r=e==="Image"?In:vn,s=Ao(e),c=s.find(m=>m.id===n)??s.find(m=>m.id===r);return c||{id:n??r,label:n??r,provider:"Saved",mode:e,supportedSizes:e==="Image"?["custom"]:[]}}function Za(e,t){if(e.supportedSizes.map(r=>r.toLowerCase()).includes("custom"))return ga(t);const n=e.supportedSizes.map(r=>ws(r)).filter(r=>!!r);return n.length>0?n:t==="Image"?ga(t):[Cn]}function sn(e,t,o){const n=Za(t,e),r=e==="Image"?ps:ms;return n.find(s=>s.id===o)??n.find(s=>s.id===r)??n[0]??Cn}function ks(e){switch(e){case"1:1":return"aspect-swatch--square";case"4:3":return"aspect-swatch--wide";case"3:4":return"aspect-swatch--portrait";case"16:9":return"aspect-swatch--cinema";case"9:16":return"aspect-swatch--vertical";default:return"aspect-swatch--auto"}}function ln(e){return e.resolvedSize??"auto"}function ga(e){const t=e==="Image"?"Image":"Video";return[Cn,...Qa.map(o=>({id:o.id,label:o.label,resolvedSize:o.size,width:o.width,height:o.height,note:`${t} adapter hint: ${o.size}.`}))]}function xn(e){return String(e??"").trim().replace(/^["']|["']$/g,"").trim()}function dt(e){return e.trim().toLowerCase().replace(/\s+/g," ")}function Ts(e){const t=dt(e);return["gpt-image-2","gpt image 2","gpt-image2","openai/gpt-image-2","openai:gpt-image-2","openai gpt-image-2","openai gpt image 2"].includes(t)?In:["tongyi-mai/z-image-turbo:free","z-image-turbo","z-image turbo","z image turbo","image-router/z-image-turbo","imagerouter z-image turbo"].includes(t)?"Tongyi-MAI/Z-Image-Turbo:free":wn("Image",e)}function Is(e){const t=dt(e);return["google/veo-2","google veo 2","google/veo2","google veo2","veo-2","veo2"].includes(t)?vn:wn("Video",e)}function wn(e,t){const o=dt(t),n=Ao(e).find(r=>dt(r.id)===o||dt(r.label)===o);return(n==null?void 0:n.id)??null}function vs(e){const t=dt(e);return t.startsWith(Co)||t.startsWith(an)||t.startsWith("codex image")}function Cs(e){const t=dt(xn(e));return t==="low"?"low":t==="mid"||t==="medium"?"medium":t==="high"?"high":"medium"}function To(e,t){const o=Qt(e)||rt;return`${Co}${o}:${Cs(t)}`}function xs(e,t=rt){const o=xn(e),n=dt(o);let r="";if(n.startsWith(Co)?r=o.slice(Co.length).trim():n.startsWith(an)?r=o.slice(an.length).trim():n.startsWith("codex image")&&(r=o.replace(/^codex\s+image\s*/i,"").trim()),!r)return To(t,"medium");const s=r.lastIndexOf(":");return s>0&&s<r.length-1?To(r.slice(0,s),r.slice(s+1)):To(t,r)}function ws(e){const t=Ss(e);if(!t)return null;const o=t.width/t.height,n=Qa.map(s=>({definition:s,delta:Math.abs(s.ratio-o)})).sort((s,c)=>s.delta-c.delta)[0];return{id:n&&n.delta<=ha?n.definition.id:`${t.width}:${t.height}`,label:n&&n.delta<=ha?n.definition.label:e,resolvedSize:`${t.width}x${t.height}`,width:t.width,height:t.height,note:`Model native size: ${t.width}x${t.height}.`}}function Ss(e){const t=e.trim().match(/^(\d{2,5})x(\d{2,5})$/i);if(!t)return null;const o=Number(t[1]),n=Number(t[2]);return!Number.isFinite(o)||!Number.isFinite(n)||o<=0||n<=0?null:{width:o,height:n}}const Rs=[{id:"blank",label:"New Mind Canvas",description:"완전히 빈 실행 캔버스를 새로 만듭니다.",iconClass:"fa-solid fa-plus",prompt:"생성할 보드를 선택하세요.",quickCreateTemplateId:"blank-core",options:[]},{id:"business",label:"Business",description:"아이디어를 수익 모델, MVP, 실행 계획으로 바꾸는 비즈니스 설계 보드를 만듭니다.",iconClass:"fa-solid fa-lightbulb",prompt:"어떤 비즈니스 구조로 시작할까요?",options:[{id:"saas",label:"SaaS",description:"구독형 SaaS 비즈니스",templateId:"business-core"},{id:"mobile",label:"모바일 앱",description:"앱 중심 실행 보드",templateId:"business-core"},{id:"automation",label:"AI 자동화",description:"자동화 서비스 구조",templateId:"business-core"},{id:"education",label:"교육 상품",description:"코스/강의형 사업",templateId:"business-core"},{id:"unknown",label:"아직 모름",description:"아이디어 탐색 중심",templateId:"business-core"}]},{id:"build",label:"Build",description:"PRD, 데이터, 결제, 배포까지 한 흐름으로 정리한 서비스 개발 보드를 만듭니다.",iconClass:"fa-solid fa-hammer",prompt:"어떤 방식으로 제품을 만들고 싶나요?",options:[{id:"webapp",label:"웹앱",description:"웹앱 MVP 빌드",templateId:"build-core"},{id:"saas_mvp",label:"SaaS MVP",description:"구독형 SaaS 출시",templateId:"build-core"},{id:"aitool",label:"AI 도구",description:"AI 기반 서비스 구현",templateId:"build-core"},{id:"internal",label:"내부 도구",description:"팀/개인 생산성 도구",templateId:"build-core"}]},{id:"launch",label:"Launch",description:"랜딩 카피, 채널 게시물, 일정까지 묶인 마케팅 런치 보드를 만듭니다.",iconClass:"fa-solid fa-bullhorn",prompt:"어떤 런치 흐름에 맞춰 보드를 만들까요?",options:[{id:"product_hunt",label:"Product Hunt",description:"런치 페이지 중심",templateId:"launch-core"},{id:"social",label:"X / LinkedIn",description:"소셜 런치 중심",templateId:"launch-core"},{id:"community",label:"커뮤니티",description:"커뮤니티 배포 중심",templateId:"launch-core"},{id:"demo",label:"데모 영상",description:"데모 자산 준비 중심",templateId:"launch-core"}]},{id:"more",label:"More",description:"콘텐츠, 학습, 책, 음악처럼 다음 확장용 실행 보드를 불러옵니다.",iconClass:"fa-solid fa-ellipsis",prompt:"다음으로 확장할 실행 보드를 골라보세요.",options:[{id:"content",label:"콘텐츠",description:"영상/콘텐츠 제작",templateId:"content-core"},{id:"learn",label:"학습",description:"출시형 학습 보드",templateId:"learn-core"},{id:"book",label:"책",description:"전자책/스토리 제작",templateId:"book-core"},{id:"music",label:"음악",description:"오디오 제작 스튜디오",templateId:"music-core"}]}],Ms=JSON.parse('[{"id":"blank-core","version":"0.1.0","tier":"core","status":"stable","boardTitle":"Canvas {{timestampShort}}","inputs":[],"nodes":[]},{"id":"business-core","version":"0.1.0","tier":"core","status":"stable","boardTitle":"비즈니스 설계 · {{optionLabel}}","inputs":[{"key":"businessIdea","type":"textarea","label":"어떤 비즈니스를 만들고 싶나요?","description":"한두 문장으로 해결하려는 문제와 아이디어를 적어보세요.","placeholder":"예: AI가 회의록을 정리하고 후속 업무를 자동으로 배정해주는 SaaS","required":true},{"key":"targetUser","type":"text","label":"주요 고객은 누구인가요?","description":"처음 돈을 낼 가능성이 큰 사용자군을 적어보세요.","placeholder":"예: 스타트업 팀 리드, 프리랜서 운영자"},{"key":"businessGoal","type":"select","label":"이번 보드의 목표","description":"지금 가장 먼저 해결하고 싶은 목표를 고르세요.","defaultValue":"validate","options":[{"value":"validate","label":"아이디어 검증"},{"value":"mvp","label":"MVP 설계"},{"value":"monetize","label":"수익화 설계"}]}],"nodes":[{"id":"idea","contentType":"memo","title":"사업 아이디어","body":"{{businessIdea}}","x":-520,"y":-40,"z":0,"width":360,"height":240,"metadata":{"memoColor":"amber","memoIcon":"lightbulb"}},{"id":"target","contentType":"note","title":"타깃 고객","body":"첫 고객 후보: {{targetUser}}\\n\\n1. 첫 고객군 3개\\n2. 각 고객의 급한 문제\\n3. 왜 지금 해결해야 하는지","x":-120,"y":-180,"z":0,"width":340,"height":220},{"id":"problem","contentType":"note","title":"문제 정의","body":"이번 목표는 {{businessGoal}}입니다.\\n불편함이 아니라 비용, 시간, 리스크처럼 돈이 되는 문제를 적어보세요.","x":280,"y":-180,"z":0,"width":340,"height":220},{"id":"revenue","contentType":"note","title":"수익 모델 후보","body":"구독 / 일회성 판매 / 크레딧 / 서비스형 결합 모델을 비교해보세요.","x":680,"y":-180,"z":0,"width":340,"height":220},{"id":"mvp","contentType":"note","title":"MVP 기능","body":"핵심 문제를 해결하는 기능만 3개 이하로 제한하세요.","x":-120,"y":120,"z":0,"width":340,"height":220},{"id":"pricing","contentType":"note","title":"가격 정책","body":"무료 체험, 기본 요금제, 업셀 지점을 함께 적어보세요.","x":280,"y":120,"z":0,"width":340,"height":220},{"id":"first100","contentType":"note","title":"첫 100명 전략","body":"직접 판매, 커뮤니티, 콘텐츠, 파트너십 중 가장 빠른 채널을 고르세요.","x":680,"y":120,"z":0,"width":340,"height":220},{"id":"plan7","contentType":"note","title":"7일 실행 계획","body":"오늘부터 7일 동안 해야 할 일만 날짜별로 적어 실행 가능한 일정으로 바꾸세요.","x":1080,"y":-20,"z":0,"width":340,"height":260}]},{"id":"build-core","version":"0.1.0","tier":"core","status":"stable","boardTitle":"서비스 개발 · {{productName}}","inputs":[{"key":"productName","type":"text","label":"무엇을 만들고 있나요?","description":"보드 상단과 노드에 바로 반영될 제품 이름을 적어보세요.","placeholder":"예: MeetingPilot","required":true},{"key":"productGoal","type":"textarea","label":"이번 MVP의 핵심 가치는 무엇인가요?","description":"사용자가 왜 이 제품을 써야 하는지 한두 문장으로 적어보세요.","placeholder":"예: 회의 후 5분 안에 실행 항목이 정리되도록 한다.","required":true},{"key":"stackOpinion","type":"select","label":"기본 빌드 흐름","description":"처음 버전에서 따라갈 구현 흐름을 고르세요.","defaultValue":"supabase-cloudflare","options":[{"value":"supabase-cloudflare","label":"Supabase + Cloudflare"},{"value":"webapp-default","label":"표준 웹앱 MVP"},{"value":"ai-tooling","label":"AI 도구 중심"}]}],"nodes":[{"id":"overview","contentType":"memo","title":"서비스 개요","body":"{{productName}}\\n\\n{{productGoal}}","x":-520,"y":-40,"z":0,"width":360,"height":240,"metadata":{"memoColor":"sky","memoIcon":"hammer"}},{"id":"prd","contentType":"note","title":"PRD","body":"제품: {{productName}}\\n문제, 사용자 흐름, 필수 기능, 제외 기능을 한 장으로 정리하세요.","x":-120,"y":-180,"z":0,"width":340,"height":220},{"id":"prompt","contentType":"note","title":"개발 프롬프트","body":"외부 개발 도구나 Codex에 넘길 구현 프롬프트 초안을 작성하세요.\\n기본 흐름: {{stackOpinion}}","x":280,"y":-180,"z":0,"width":340,"height":220},{"id":"db","contentType":"note","title":"DB 설계","body":"핵심 테이블, 관계, 최소 필수 컬럼만 먼저 정의하세요.","x":680,"y":-180,"z":0,"width":340,"height":220},{"id":"auth","contentType":"note","title":"Auth / 권한","body":"로그인, 역할, 온보딩, 접근 제어 시나리오를 적어보세요.","x":-120,"y":120,"z":0,"width":340,"height":220},{"id":"payment","contentType":"note","title":"결제 흐름","body":"요금제, 결제 성공/실패, 환불, 사용량 제한까지 연결하세요.","x":280,"y":120,"z":0,"width":340,"height":220},{"id":"deploy","contentType":"note","title":"배포 체크리스트","body":"환경 변수, 도메인, 모니터링, 오류 추적 준비 상태를 확인하세요.","x":680,"y":120,"z":0,"width":340,"height":220},{"id":"ops","contentType":"note","title":"운영 / 고객지원","body":"문의, 환불, 버그 리포트, 관리자 대시보드 항목을 정리하세요.","x":1080,"y":-180,"z":0,"width":340,"height":220},{"id":"qa","contentType":"note","title":"출시 전 QA","body":"결제, 로그인, 온보딩, 모바일 화면, 오류 복구 시나리오를 최종 점검하세요.","x":1080,"y":120,"z":0,"width":340,"height":220}]},{"id":"launch-core","version":"0.1.0","tier":"core","status":"stable","boardTitle":"마케팅 런치 · {{productName}}","inputs":[{"key":"productName","type":"text","label":"무엇을 홍보하나요?","description":"제품명이나 캠페인 이름을 적어보세요.","placeholder":"예: MeetingPilot","required":true},{"key":"targetAudience","type":"text","label":"주요 타깃은 누구인가요?","description":"메시지를 맞출 대표 사용자군을 적어보세요.","placeholder":"예: 스타트업 팀 리드, 솔로 파운더"},{"key":"launchGoal","type":"select","label":"이번 런치의 목표","description":"보드가 최우선으로 도와줄 목표를 고르세요.","defaultValue":"signups","options":[{"value":"signups","label":"가입 전환"},{"value":"waitlist","label":"대기자 확보"},{"value":"sales","label":"첫 결제 만들기"}]}],"nodes":[{"id":"positioning","contentType":"memo","title":"포지셔닝","body":"{{productName}}\\n주요 타깃: {{targetAudience}}\\n이번 목표: {{launchGoal}}","x":-520,"y":-40,"z":0,"width":360,"height":240,"metadata":{"memoColor":"rose","memoIcon":"bullhorn"}},{"id":"landing","contentType":"note","title":"랜딩페이지 카피","body":"헤드라인, 서브카피, CTA, 신뢰 요소를 빠르게 초안화하세요.","x":-120,"y":-180,"z":0,"width":340,"height":220},{"id":"channelCopy","contentType":"note","title":"채널별 소개문","body":"Product Hunt / X / LinkedIn / 커뮤니티용 소개문을 각각 다르게 써보세요.","x":280,"y":-180,"z":0,"width":340,"height":220},{"id":"community","contentType":"note","title":"커뮤니티 포스트","body":"홍보가 아니라 문제 해결 경험 공유 형태로 바꿔보세요.","x":680,"y":-180,"z":0,"width":340,"height":220},{"id":"demoChecklist","contentType":"note","title":"데모 영상 체크리스트","body":"문제 제시, 해결 시연, CTA 순서로 필요한 장면을 정리하세요.","x":-120,"y":120,"z":0,"width":340,"height":220},{"id":"assets","contentType":"note","title":"스크린샷 자산","body":"대표 화면, 비교 장면, 후기/증거 이미지를 수집하세요.","x":280,"y":120,"z":0,"width":340,"height":220},{"id":"schedule","contentType":"note","title":"배포 일정","body":"오늘, 내일, 일주일 안에 배포할 채널과 시간을 적어보세요.","x":680,"y":120,"z":0,"width":340,"height":220},{"id":"metrics","contentType":"note","title":"성과 기록","body":"방문, 가입, 결제, 반응이 좋았던 메시지를 한곳에 적재하세요.","x":1080,"y":-20,"z":0,"width":340,"height":260}]},{"id":"content-core","version":"0.1.0","tier":"preview","status":"experimental","boardTitle":"콘텐츠 제작 · {{contentTheme}}","inputs":[{"key":"contentTheme","type":"text","label":"무슨 콘텐츠를 만들까요?","description":"영상/게시물의 핵심 주제를 적어보세요.","placeholder":"예: AI 회의 요약 도구 소개 영상","required":true},{"key":"contentChannel","type":"select","label":"주요 채널","description":"초기 기획을 맞출 채널을 골라보세요.","defaultValue":"youtube","options":[{"value":"youtube","label":"YouTube"},{"value":"shorts","label":"Shorts / Reels"},{"value":"blog","label":"블로그 / 글"}]}],"nodes":[{"id":"contentPlan","contentType":"memo","title":"콘텐츠 기획","body":"{{contentTheme}}\\n주요 채널: {{contentChannel}}","x":-420,"y":-20,"z":0,"width":360,"height":240,"metadata":{"memoColor":"violet","memoIcon":"film"}},{"id":"script","contentType":"note","title":"대본","body":"오프닝 훅, 핵심 포인트, CTA를 써보세요.","x":0,"y":-160,"z":0,"width":340,"height":220},{"id":"scenes","contentType":"note","title":"장면 구성","body":"장면별 메시지와 필요한 시각 자료를 나누세요.","x":400,"y":-160,"z":0,"width":340,"height":220},{"id":"imagePrompts","contentType":"note","title":"이미지 프롬프트","body":"썸네일/컷신용 이미지 프롬프트를 작성하세요.","x":0,"y":120,"z":0,"width":340,"height":220},{"id":"videoPrompts","contentType":"note","title":"영상 프롬프트","body":"카메라 움직임, 분위기, 길이를 정의하세요.","x":400,"y":120,"z":0,"width":340,"height":220},{"id":"distribution","contentType":"note","title":"배포 체크","body":"제목, 설명, 썸네일, 업로드 일정까지 확인하세요.","x":800,"y":-20,"z":0,"width":340,"height":260}]},{"id":"learn-core","version":"0.1.0","tier":"preview","status":"experimental","boardTitle":"출시형 학습 · {{learningGoal}}","inputs":[{"key":"learningGoal","type":"text","label":"어떤 결과물을 목표로 배우나요?","description":"단순 문법보다 만들고 싶은 산출물을 적어보세요.","placeholder":"예: 첫 번째 SaaS MVP 출시","required":true}],"nodes":[{"id":"goal","contentType":"memo","title":"학습 목표","body":"{{learningGoal}}","x":-420,"y":-20,"z":0,"width":360,"height":240,"metadata":{"memoColor":"emerald","memoIcon":"graduation-cap"}},{"id":"basics","contentType":"note","title":"기초 개념","body":"지금 부족한 문법과 개념을 적어 우선순위를 정하세요.","x":0,"y":-160,"z":0,"width":340,"height":220},{"id":"smallFeature","contentType":"note","title":"작은 기능 만들기","body":"작게 끝낼 수 있는 기능 단위를 나누세요.","x":400,"y":-160,"z":0,"width":340,"height":220},{"id":"api","contentType":"note","title":"API 사용","body":"연동할 API와 테스트 시나리오를 정리하세요.","x":0,"y":120,"z":0,"width":340,"height":220},{"id":"dbAuth","contentType":"note","title":"DB / Auth","body":"저장 구조와 로그인 흐름을 간단히 설계하세요.","x":400,"y":120,"z":0,"width":340,"height":220},{"id":"ship","contentType":"note","title":"배포","body":"배포까지 필요한 최소 단계만 체크리스트로 적으세요.","x":800,"y":-20,"z":0,"width":340,"height":260}]},{"id":"book-core","version":"0.1.0","tier":"preview","status":"experimental","boardTitle":"책/전자책 · {{bookTopic}}","inputs":[{"key":"bookTopic","type":"text","label":"어떤 책을 만들까요?","description":"주제나 제목 초안을 적어보세요.","placeholder":"예: 솔로 파운더를 위한 AI 실행 가이드","required":true},{"key":"readerType","type":"text","label":"누구를 위한 책인가요?","description":"대표 독자층을 한 줄로 적어보세요.","placeholder":"예: 첫 제품을 만들려는 1인 창업자"}],"nodes":[{"id":"bookConcept","contentType":"memo","title":"책 컨셉","body":"{{bookTopic}}\\n대표 독자: {{readerType}}","x":-420,"y":-20,"z":0,"width":360,"height":240,"metadata":{"memoColor":"amber","memoIcon":"book-open"}},{"id":"toc","contentType":"note","title":"목차","body":"큰 장과 소장 흐름을 먼저 정리하세요.","x":0,"y":-160,"z":0,"width":340,"height":220},{"id":"chapters","contentType":"note","title":"챕터 초안","body":"핵심 메시지와 사례를 장별로 메모하세요.","x":400,"y":-160,"z":0,"width":340,"height":220},{"id":"cover","contentType":"note","title":"삽화 / 표지","body":"필요한 비주얼 자산 목록을 정리하세요.","x":0,"y":120,"z":0,"width":340,"height":220},{"id":"edit","contentType":"note","title":"교정 / 편집","body":"말투, 중복, 흐름, CTA 점검 포인트를 적으세요.","x":400,"y":120,"z":0,"width":340,"height":220},{"id":"export","contentType":"note","title":"Export","body":"PDF/EPUB/배포 채널까지 마무리 작업을 적으세요.","x":800,"y":-20,"z":0,"width":340,"height":260}]},{"id":"music-core","version":"0.1.0","tier":"preview","status":"experimental","boardTitle":"음악 제작 · {{trackMood}}","inputs":[{"key":"trackMood","type":"text","label":"어떤 분위기의 트랙을 만들까요?","description":"감정이나 사용 장면을 짧게 적어보세요.","placeholder":"예: 밤 작업용 로파이 집중 트랙","required":true},{"key":"musicGenre","type":"select","label":"기본 장르","description":"가장 가까운 출발 장르를 골라보세요.","defaultValue":"lofi","options":[{"value":"lofi","label":"Lo-fi"},{"value":"ambient","label":"Ambient"},{"value":"pop","label":"Pop"},{"value":"cinematic","label":"Cinematic"}]}],"nodes":[{"id":"musicConcept","contentType":"memo","title":"음악 컨셉","body":"{{trackMood}}\\n기본 장르: {{musicGenre}}","x":-420,"y":-20,"z":0,"width":360,"height":240,"metadata":{"memoColor":"pink","memoIcon":"music"}},{"id":"references","contentType":"note","title":"레퍼런스","body":"참고곡과 참고 포인트를 나열하세요.","x":0,"y":-160,"z":0,"width":340,"height":220},{"id":"vocals","contentType":"note","title":"보컬 / 악기","body":"보컬 타입과 핵심 악기 구성을 적어보세요.","x":400,"y":-160,"z":0,"width":340,"height":220},{"id":"lyrics","contentType":"note","title":"가사","body":"주제, 반복 훅, 금지 표현을 정리하세요.","x":0,"y":120,"z":0,"width":340,"height":220},{"id":"generationPrompt","contentType":"note","title":"생성 프롬프트","body":"음향, 구조, 분위기 지시문을 모아두세요.","x":400,"y":120,"z":0,"width":340,"height":220},{"id":"versions","contentType":"note","title":"버전 비교","body":"mp3 결과물과 수정 포인트를 기록하세요.","x":800,"y":-20,"z":0,"width":340,"height":260}]}]'),Ps={launchers:Rs,templates:Ms},fa={en:{"launcher.blank.title":"New Mind Canvas","launcher.blank.desc":"Create a clean execution canvas.","launcher.blank.prompt":"Choose the board you want to create.","launcher.business.title":"Business","launcher.business.desc":"Turn an idea into a revenue model, MVP, and execution plan.","launcher.business.prompt":"What business structure should we start with?","launcher.business.option.saas.title":"SaaS","launcher.business.option.saas.desc":"Subscription SaaS business","launcher.business.option.mobile.title":"Mobile App","launcher.business.option.mobile.desc":"Mobile-first execution board","launcher.business.option.automation.title":"AI Automation","launcher.business.option.automation.desc":"Automation service structure","launcher.business.option.education.title":"Education Product","launcher.business.option.education.desc":"Course or lecture business","launcher.business.option.unknown.title":"Not sure yet","launcher.business.option.unknown.desc":"Explore possible ideas","launcher.build.title":"Build","launcher.build.desc":"Organize a service build from PRD, data, billing, and deployment.","launcher.build.prompt":"What kind of product should we build?","launcher.build.option.webapp.title":"Web App","launcher.build.option.webapp.desc":"Build a web MVP","launcher.build.option.saas_mvp.title":"SaaS MVP","launcher.build.option.saas_mvp.desc":"Launch a subscription SaaS","launcher.build.option.aitool.title":"AI Tool","launcher.build.option.aitool.desc":"Implement an AI-powered service","launcher.build.option.internal.title":"Internal Tool","launcher.build.option.internal.desc":"Team or personal productivity tool","launcher.launch.title":"Launch","launcher.launch.desc":"Plan landing copy, channel posts, assets, and launch schedule.","launcher.launch.prompt":"What launch flow should we prepare?","launcher.launch.option.product_hunt.title":"Product Hunt","launcher.launch.option.product_hunt.desc":"Prepare a launch page","launcher.launch.option.social.title":"X / LinkedIn","launcher.launch.option.social.desc":"Plan social launch posts","launcher.launch.option.community.title":"Community","launcher.launch.option.community.desc":"Plan community distribution","launcher.launch.option.demo.title":"Demo Video","launcher.launch.option.demo.desc":"Prepare a demo asset","launcher.more.title":"More","launcher.more.desc":"Open more execution boards for content, learning, books, and music.","launcher.more.prompt":"Choose the next execution board.","launcher.more.option.content.title":"Content","launcher.more.option.content.desc":"Start video or content production","launcher.more.option.learn.title":"Learn","launcher.more.option.learn.desc":"Create a launch-focused learning board","launcher.more.option.book.title":"Book","launcher.more.option.book.desc":"Start an ebook or story board","launcher.more.option.music.title":"Music","launcher.more.option.music.desc":"Start an audio production studio","templateCard.eyebrow":"Template","templateCard.generate":"Generate","templateCard.noInputs":"No inputs needed.","templateCard.generating":"Generating nodes...","templateCard.generated":"Generated {0} nodes below.","templateCard.failed":"Template generation failed.","templateCard.required":"{0} is required.","template.blank-core.boardTitle":"Canvas {{timestampShort}}","template.business-core.boardTitle":"Business Design - {{optionLabel}}","template.business-core.input.businessIdea.label":"What business do you want to build?","template.business-core.input.businessIdea.desc":"Write the problem and idea you want to solve in one or two sentences.","template.business-core.input.businessIdea.placeholder":"Example: A SaaS that summarizes meetings and assigns follow-up work automatically","template.business-core.input.targetUser.label":"Who is the primary customer?","template.business-core.input.targetUser.desc":"Write the user group most likely to pay first.","template.business-core.input.targetUser.placeholder":"Example: startup team leads, freelance operators","template.business-core.input.businessGoal.label":"Goal for this board","template.business-core.input.businessGoal.desc":"Choose what you want to solve first.","template.business-core.input.businessGoal.option.validate":"Validate the idea","template.business-core.input.businessGoal.option.mvp":"Design the MVP","template.business-core.input.businessGoal.option.monetize":"Design monetization","template.business-core.node.idea.title":"Business Idea","template.business-core.node.idea.body":"{{businessIdea}}","template.business-core.node.target.title":"Target Customers","template.business-core.node.target.body":`First customer candidates: {{targetUser}}
|
|
2
2
|
|
|
3
3
|
1. Three first customer groups
|
|
4
4
|
2. Urgent problems for each group
|