1__d(function(g,r,i,a,m,e,d){var t=r(d[0]).default,n=r(d[1]).default;Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(){const{user:t}=(0,r(d[14]).useAuth)();return(0,r(d[15]).jsx)(W,{},t?.id||'signed-out')};var o=n(r(d[2])),s=t(r(d[3])),c=t(r(d[4])),l=t(r(d[5])),u=t(r(d[6])),h=t(r(d[7])),p=t(r(d[8])),f=t(r(d[9])),y=n(r(d[10]));const b=32,C='ba_mcp_',w=8e3,S=['Codex','Claude','ChatGPT','Other MCP app'],x="You are Nursing Student Chief of Staff for one nursing student.\n\nUse BetterAt as the system of record through the BetterAt MCP tools.\n\nDefault loop: brief -> practice -> log -> reflect -> next.\n\nAt session start, call get_student_context or get_current_user plus list_my_interests. If the student asks for nursing, operate on interest: nursing and ignore unrelated timeline items unless they explicitly switch context.\n\nRead before planning: get_student_timeline, get_competency_dashboard, get_suggested_next_steps, and get_competency_progress for the selected competency.\n\nPractice: pick the highest-value AACN nursing-core-v1 competency, generate or retrieve one NCLEX-style practice rep, grade honestly, and use needs_practice -> developing -> proficient -> confident.\n\nWrite after evidence: call log_competency_attempt after practice, then create or update a short Plan / Act / Review reflection step.\n\nGenerated exam-style questions are allowed. Label them as generated practice and do not claim they are official, licensed, faculty-vetted, or a substitute for clinical judgment.\n\nEnd every turn with exactly one next action. Do not end with a menu.",_='Morning brief. I have 30 minutes before class.';function v(t){return`https://claude.ai/customize/connectors?modal=add-custom-connector&connectorName=BetterAt&connectorUrl=${encodeURIComponent(t)}`}const A=(function(){const t=(0,r(d[11]).getPreviewApiBase)();if(t)return t;const n=["https://better.at","https://better.at","https://better.at",void 0].map(t=>t?.replace(/\/$/,'')??'').find(t=>t&&!t.includes('localhost')&&!t.includes('127.0.0.1'))??'';if('undefined'!=typeof window){const t=window.location?.hostname,o=window.location?.port;if(('localhost'===t||'127.0.0.1'===t)&&'8081'===o&&!n)return'http://localhost:3000'}return n})();function k(){if('undefined'==typeof window)return!1;const t=window.location?.hostname;return'localhost'===t||'127.0.0.1'===t}function j(){const t=(0,r(d[11]).getPreviewApiBase)();if(t)return t;const n="https://better.at".replace(/\/$/,'');if('https://better.at'===n)return'https://www.better.at';if(n&&!n.includes('localhost')&&!n.includes('127.0.0.1'))return n;if('undefined'!=typeof window){const t=window.location?.hostname;if(t&&'localhost'!==t&&'127.0.0.1'!==t)return window.location.origin}return'https://www.better.at'}function I(){return!(0,r(d[12]).connectionEnvironment)(r(d[13]).supabaseUrl,`${A}/api/mcp`).canConnect||k()||!A||A.includes('localhost:3000')}function L(t,n){k()}function O(t){let n='';return t.forEach(t=>{n+=String.fromCharCode(t)}),btoa(n).replace(/\+/g,'-').replace(/\//g,'_').replace(/=+$/g,'')}async function B(t){const n=globalThis.crypto;if(!n?.subtle)throw new Error('Secure token hashing is not available in this browser.');const o=await n.subtle.digest('SHA-256',(new TextEncoder).encode(t));return Array.from(new Uint8Array(o)).map(t=>t.toString(16).padStart(2,'0')).join('')}async function R(){const t=globalThis.crypto;if(!t?.getRandomValues)throw new Error('Secure token generation is not available in this browser.');const n=new Uint8Array(b);t.getRandomValues(n);const o=`${C}${O(n)}`;return{token:o,token_hash:await B(o),token_prefix:o.slice(0,18)}}function E(t,n){return`claude mcp add --transport http betterat ${t} --header "Authorization: Bearer ${n}"`}function P(t,n){return`export BETTERAT_MCP_TOKEN='${n}'\n\ncodex mcp add betterat \\\n --url ${t} \\\n --bearer-token-env-var BETTERAT_MCP_TOKEN\n\ncodex mcp list`}function T(t,n){return`[mcp_servers.betterat]\nurl = "${t}"\nhttp_headers = { "Authorization" = "Bearer ${n}" }\nstartup_timeout_sec = 30\ntool_timeout_sec = 90`}function $(t){return t.replace(/ba_mcp_[A-Za-z0-9_-]+/g,t=>`${t.slice(0,18)}...[hidden]`).replace(/Bearer [A-Za-z0-9_.-]+/g,t=>`${t.slice(0,25)}...[hidden]`)}function z(t,n){return JSON.stringify({mcpServers:{betterat:{command:'npx',args:['-y','mcp-remote@latest',t,'--trans
1port','http-only','--header','Authorization:${AUTH_HEADER}'],env:{AUTH_HEADER:`Bearer ${n}`}}}},null,2)}async function D(){const{data:t}=await r(d[13]).supabase.auth.getSession();return t.session?.access_token??null}async function U(t){const n=await t.text();if(!n)return{};try{return JSON.parse(n)}catch{return{error:t.headers.get('content-type')?.includes('text/html')?`BetterAt API returned HTML instead of JSON from ${A||'the current host'}. In local web, start the API server on localhost:3000.`:n.slice(0,180)}}}function N(t){const n=t?.message?String(t.message):'';return A.includes('localhost:3000')?`${n||'Could not reach the BetterAt API'} Make sure the local BetterAt API is running at ${A}.`:n||'Please try again.'}function M(t){return t?new Date(t).toLocaleDateString(void 0,{month:'short',day:'numeric',year:'numeric'}):'Never'}function H(t,n,o=w){let s=null;const c=new Promise((t,c)=>{s=setTimeout(()=>{c(new Error(`${n} timed out after ${o}ms`))},o)});return Promise.race([Promise.resolve(t),c]).finally(()=>{s&&clearTimeout(s)})}function W(){const{user:t,ready:n}=(0,r(d[14]).useAuth)(),h=(0,r(d[16]).useRouter)(),b=t?.id??null,C=(0,o.useRef)(null),w=(0,o.useRef)(0),[k,O]=(0,o.useState)(!0),[B,$]=(0,o.useState)(!1),W=(0,o.useRef)(!1),[J,Y]=(0,o.useState)('Codex'),[K,Z]=(0,o.useState)(!1),[X,Q]=(0,o.useState)(!1),[ee,te]=(0,o.useState)(!1),[ne,oe]=(0,o.useState)(null),[ae,re]=(0,o.useState)(null),[ie,se]=(0,o.useState)([]),[ce,le]=(0,o.useState)(''),[de,ue]=(0,o.useState)(null),[he,pe]=(0,o.useState)(null),fe=(0,o.useMemo)(()=>ie.filter(t=>!t.revoked_at),[ie]),ye=ce||`${j()}/api/mcp`,me=(0,o.useMemo)(()=>(0,r(d[12]).connectionEnvironment)(r(d[13]).supabaseUrl,ye),[ye]),be=me.canConnect,ge=t?.user_metadata?.full_name||t?.email||'BetterAt account',Ce=`${J} \xb7 ${t?.email||'BetterAt'}`,we=(0,o.useCallback)(()=>(0,r(d[15]).jsxs)(l.default,{onPress:()=>h.canGoBack()?h.back():h.replace('/account/connected-services'),accessibilityRole:"button",accessibilityLabel:"Back to services",hitSlop:{top:12,bottom:12,left:12,right:12},style:V.headerBack,children:[(0,r(d[15]).jsx)(r(d[17]).Ionicons,{name:"chevron-back",size:26,color:r(d[18]).IOS_ACCESSIBLE_COLORS.action}),(0,r(d[15]).jsx)(p.default,{style:V.headerBackText,children:"Services"})]}),[h]),Se=(0,o.useCallback)(async(t,n)=>{try{await y.setStringAsync(n),(0,r(d[19],"../../../lib/utils/crossPlatformAlert").showAlert)('Copied',`${t} copied.`)}catch{(0,r(d[19]).showAlert)('Could not copy','Try copying again, or select and copy the text manually.')}},[]),xe=(0,o.useCallback)(async()=>{if(!be)return;const t=v(ye);L(0,(()=>{try{return new URL(ye).host}catch{return'invalid'}})()),await y.setStringAsync(ye),'undefined'!=typeof window?window.open(t,'_blank','noopener,noreferrer'):await c.default.openURL(t),(0,r(d[19]).showAlert)('Claude is opening','The connector form opens with BetterAt prefilled. If Claude web fails authorization, use the Codex setup or manual Claude token blocks below. The MCP URL is also on your clipboard.')},[ye,be]),_e=(0,o.useCallback)(async()=>{if(!b)return;L(0,j());const{data:t,error:n}=await H(r(d[13]).supabase.from('mcp_access_tokens').select('id, name, token_prefix, last_used_at, revoked_at, expires_at, created_at').eq('user_id',b).order('created_at',{ascending:!1}).limit(20),'Claude token read');if(n)throw n;L(),se(t??[]),le(`${j()}/api/mcp`)},[b]),ve=(0,o.useCallback)(async()=>{if(!b)return void(0,r(d[19]).showAlert)('Not logged in','Log into BetterAt before connecting an AI app.');if(!(0,r(d[12]).connectionEnvironment)(r(d[13]).supabaseUrl,`${j()}/api/mcp`).canConnect)throw new Error('Connection setup is unavailable for this database and MCP server.');const t=await R(),n=`${j()}/api/mcp`,{data:o,error:s}=await r(d[13]).supabase.from('mcp_access_tokens').insert({user_id:b,name:Ce,token_hash:t.token_hash,token_prefix:t.token_prefix}).select('id, name, token_prefix, last_used_at, revoked_at, expires_at, created_at').single();if(s)throw s;ue({token:t.token,token_record:o,mcp_url:n,claude_code_command:E(n,t.token),claude_desktop_config:z(n,t.token)}),await _e()},[_e,b,Ce,ue]),Ae=(0,o.useCallback)(async t=>{if(!b)return void(0,r(d[19]).showAlert)('Not logged in','Log into BetterAt before changing AI access.');const{error:n}=await r(d[13]).supabase.from('mcp_access_tokens').update({revoked_at:(new Date).toISOString(),updated_at:(new Date).toISOString()}).eq('id',t.id).eq('user_id',b).is('revoked_at',null);if(n)throw n;ue(n=>n?.token_record.id===t.id?null:n),await _e()},[_e,b,ue]),ke=(0,o.useCallback)(async()=>
1{if(re(null),L(0,(Boolean(b),I())),!n)return void O(!1);if(!b)return void O(!1);O(!1),L();let t=!1;try{if(I())return t=!0,L(),void await _e();L();const n=await D();if(!n)return void(0,r(d[19]).showAlert)('Not logged in','Log into BetterAt before connecting an AI app.');const o=await fetch(`${A}/api/mcp/tokens`,{headers:{Authorization:`Bearer ${n}`}}),s=await U(o);if(!o.ok)return t=!0,void await _e();se(s.tokens??[]),le(s.mcp_url??'')}catch(n){if(t)return L(0,(0,r(d[20]).serializeError)(n)),void re(N(n));try{L(0,(0,r(d[20]).serializeError)(n)),await _e()}catch(t){L(0,(0,r(d[20]).serializeError)(t)),re(N(t))}}finally{L(),n&&b&&pe(new Date),O(!1)}},[_e,n,b]);(0,o.useEffect)(()=>{let t=!0;return Promise.resolve().then(()=>{t&&ke()}),()=>{t=!1}},[ke]),(0,o.useEffect)(()=>{if('undefined'==typeof window)return;const t=()=>{ke()},n=()=>{'visible'===document.visibilityState&&ke()};return window.addEventListener('focus',t),document.addEventListener('visibilitychange',n),()=>{window.removeEventListener('focus',t),document.removeEventListener('visibilitychange',n)}},[ke]);const je=(0,o.useCallback)(async()=>{if(be&&!W.current&&!de){W.current=!0,$(!0);try{if(I())return void await ve();const t=await D();if(!t)return void(0,r(d[19]).showAlert)('Not logged in','Log into BetterAt before connecting an AI app.');const n=await fetch(`${A}/api/mcp/tokens`,{method:'POST',headers:{'Content-Type':'application/json',Authorization:`Bearer ${t}`},body:JSON.stringify({name:Ce})}),o=await U(n);if(!n.ok||'error'in o)throw new Error('error'in o&&o.error||'Credential creation could not be confirmed.');if(!(0,r(d[12]).connectionEnvironment)(r(d[13]).supabaseUrl,o.mcp_url).canConnect)return(0,r(d[19]).showAlert)('MCP server mismatch','The server returned connection details for an unverified environment. No setup instructions will be shown. Refresh AI access to review any credential that was issued.'),void await ke();ue(o),await ke()}catch(t){(0,r(d[19]).showAlert)('Could not confirm credential creation',`${N(t)} No automatic retry was made. Refresh connections and review any newly issued access before creating another credential.`),await ke()}finally{W.current=!1,$(!1)}}},[ve,ke,Ce,ue,be,de]),Ie=(0,o.useCallback)(t=>{(0,r(d[19]).showConfirm)('Disconnect AI access',`Disconnect ${t.name}? Every AI app using this credential will lose access to this BetterAt account. Your steps and notes will remain.`,async()=>{let n=!1;try{if(I())return n=!0,void await Ae(t);const o=await D();if(!o)return void(0,r(d[19]).showAlert)('Not logged in','Log into BetterAt before changing AI access.');const s=await fetch(`${A}/api/mcp/tokens?id=${encodeURIComponent(t.id)}`,{method:'DELETE',headers:{Authorization:`Bearer ${o}`}});if(await U(s),!s.ok)return n=!0,void await Ae(t);ue(n=>n?.token_record.id===t.id?null:n),await ke()}catch(o){if(n)return void(0,r(d[19]).showAlert)('Could not revoke token',N(o));try{await Ae(t)}catch(t){(0,r(d[19]).showAlert)('Could not revoke token',N(t))}}},{destructive:!0,confirmText:'Disconnect'})},[ke,Ae,ue]);return k||!n?(0,r(d[15]).jsx)(f.default,{style:V.loading,children:(0,r(d[15]).jsx)(s.default,{size:"large"})}):(0,r(d[15]).jsxs)(f.default,{style:V.surface,children:[(0,r(d[15]).jsx)(r(d[16]).Stack.Screen,{options:{title:'AI connections',headerShown:!0,headerLeft:we}}),(0,r(d[15]).jsxs)(u.default,{ref:C,contentContainerStyle:V.content,children:[(0,r(d[15]).jsxs)(f.default,{style:V.intro,children:[(0,r(d[15]).jsx)(p.default,{accessibilityRole:"header",style:V.pageTitle,children:"AI connections"}),(0,r(d[15]).jsx)(p.default,{style:V.body,children:"Give your AI app access to your BetterAt steps, plans, and progress."})]}),(0,r(d[15]).jsxs)(r(d[21]).IOSListSection,{headerStyle:V.sectionLabel,footerStyle:V.sectionLabel,header:"BetterAt account",footer:"This is the account open in BetterAt. An AI app may still be connected to a different account.",children:[(0,r(d[15]).jsx)(G,{title:`${me.label} environment`,subtitle:`Database: ${me.databaseHost}`,trailingAccessory:"none"}),(0,r(d[15]).jsx)(G,{title:ge,subtitle:t?.email||'Sign in to manage AI access',leadingIcon:"person-circle-outline",trailingAccessory:"none"}),(0,r(d[15]).jsx)(G,{title:"Switch BetterAt account",expanded:ee,subtitle:"See how to change the account your AI app uses",onPress:()=>te(!ee)}),ee&&(0,r(d[15]).jsxs)(f.default,{style:V.help,children:[(0,r(d[15]).jsx)(p.default,{style:V.body,children:"Sign out from the BetterAt account menu, then sign in to the account you want. Return here to create a connection for that account."}),(0,r(d[15]).jsx)(p.default,{style:V.body,children:"In your AI app, replace the old BetterAt credentials, or disconnect and sign in again if it uses browser authorization. Restart the connection and ask it to check your account name and email. Signing out of BetterAt alone does not disconnect AI access."})]})]}),(0,r(d[15]).jsxs)(r(d[21]).IOSListSection,{headerStyle:V.sectionLabel,footerStyle:V.sectionLabel,header:"AI access",footer
1:"These records show issued credentials and past activity. They cannot confirm which account a particular conversation is using.",children:[(0,r(d[15]).jsx)(G,{title:"Refresh connections",subtitle:he?`Last checked ${Le=he,Le?Le.toLocaleTimeString(void 0,{hour:'numeric',minute:'2-digit'}):'Not checked yet'}`:'Checking saved access\u2026',leadingIcon:"refresh-outline",onPress:ke}),ae?(0,r(d[15]).jsxs)(f.default,{style:V.help,children:[(0,r(d[15]).jsx)(p.default,{accessibilityRole:"alert",style:V.error,children:ae}),(0,r(d[15]).jsx)(p.default,{style:V.body,children:"Refresh connections to try again. Saved access may be out of date."})]}):null,!ae&&he&&!fe.length&&(0,r(d[15]).jsx)(G,{title:`No AI access in this ${me.label.toLowerCase()} environment`,subtitle:"Connections in other environments are separate, even when the account email is the same.",trailingAccessory:"none"}),fe.map(t=>{const n=Boolean(t.expires_at&&new Date(t.expires_at).getTime()<=(he?.getTime()??0));return(0,r(d[15]).jsxs)(f.default,{style:V.connection,children:[(0,r(d[15]).jsx)(p.default,{style:V.connectionTitle,children:t.name}),(0,r(d[15]).jsxs)(p.default,{style:V.body,children:[n?'Expired':t.last_used_at?`Used ${M(t.last_used_at)}`:'Awaiting first use'," \xb7 ",t.token_prefix,"\u2026"]}),(0,r(d[15]).jsxs)(f.default,{style:V.actions,children:[(0,r(d[15]).jsx)(q,{label:"Reconnect",disabled:!be||B||Boolean(de),onPress:()=>{oe(t.name),Y(S.find(n=>t.name.startsWith(n))||'Other MCP app'),ue(null),Z(!0),C.current?.scrollTo({y:w.current,animated:!1})}}),(0,r(d[15]).jsx)(q,{label:"Disconnect",disabled:B,destructive:!0,onPress:()=>Ie(t)})]})]},t.id)})]}),(0,r(d[15]).jsx)(f.default,{onLayout:t=>{w.current=t.nativeEvent.layout.y},children:(0,r(d[15]).jsxs)(r(d[21]).IOSListSection,{headerStyle:V.sectionLabel,footerStyle:V.sectionLabel,header:ne?`Reconnect ${ne}`:'Connect an AI app',children:[(0,r(d[15]).jsxs)(f.default,{style:V.help,children:[!be&&(0,r(d[15]).jsxs)(f.default,{children:[(0,r(d[15]).jsx)(p.default,{accessibilityRole:"alert",style:V.error,children:"Connection setup unavailable"}),(0,r(d[15]).jsx)(p.default,{style:V.body,children:"This database has no verified matching MCP server. Production connections belong to a separate account, even if the email matches. Open better.at to manage production AI access. A developer must configure a matching server before setup can be enabled here."})]}),(0,r(d[15]).jsx)(p.default,{style:V.body,children:be?`Choose the app you want to use with ${t?.email||'your BetterAt account'}.`:'Available platforms once a matching server is configured:'}),(0,r(d[15]).jsx)(f.default,{style:V.platforms,children:S.map(t=>(0,r(d[15]).jsx)(l.default,{accessibilityRole:"radio","aria-checked":J===t,"aria-disabled":!be||B||Boolean(de),accessibilityState:{checked:J===t,disabled:!be||B||Boolean(de)},disabled:!be||B||Boolean(de),onPress:()=>{Y(t),Z(!0)}
1,style:[V.platform,J===t&&V.platformSelected],children:(0,r(d[15]).jsx)(p.default,{style:[V.platformText,J===t&&V.platformTextSelected],children:t})},t))}),!K&&(0,r(d[15]).jsx)(q,{label:"Set up connection",disabled:!be||!b,onPress:()=>Z(!0)})]}),K&&be&&(0,r(d[15]).jsxs)(f.default,{style:V.help,children:[ne&&(0,r(d[15]).jsx)(p.default,{style:V.body,children:"Set up replacement access below, verify it in your AI app, then disconnect the old credential above. Reconnecting does not automatically revoke existing access."}),(0,r(d[15]).jsxs)(p.default,{style:V.connectionTitle,children:["Set up ",J]}),'ChatGPT'===J?(0,r(d[15]).jsxs)(r(d[15]).Fragment,{children:[(0,r(d[15]).jsx)(p.default,{style:V.body,children:"Use a BetterAt plugin or a custom MCP connector where your ChatGPT workspace supports one. For a custom connector, copy the server URL below and authorize the intended BetterAt account in the browser. Availability depends on your workspace. A personal token alone does not install a ChatGPT connector."}),(0,r(d[15]).jsx)(q,{label:"Copy server URL",onPress:()=>Se('MCP endpoint',ye)})]}):(0,r(d[15]).jsxs)(r(d[15]).Fragment,{children:[(0,r(d[15]).jsx)(p.default,{style:V.body,children:'Codex'===J?'Create a credential, copy the Codex configuration below into your MCP settings, then restart the connection.':'Claude'===J?'Use browser authorization with the Claude connector, or create a credential for manual setup in Claude Code or a compatible desktop configuration.':'Your app must support a remote MCP server and bearer-token authorization. Create a credential and enter the server URL and token in its connection settings.'}),'Claude'===J&&(0,r(d[15]).jsx)(q,{label:"Open Claude connector",onPress:xe}),(0,r(d[15]).jsx)(q,{label:B?'Creating access\u2026':de?'Credential created':`Create ${J} credential`,disabled:B||Boolean(de)||!b,onPress:je})]}),de&&be&&(0,r(d[15]).jsxs)(r(d[15]).Fragment,{children:[(0,r(d[15]).jsxs)(p.default,{style:V.body,children:["Access created for ",t?.email,". Copy these details now. Finish setup to choose another app. The credential cannot be shown again after you finish setup or leave this page."]}),'Codex'===J?(0,r(d[15]).jsx)(F,{label:"Codex app config",value:T(de.mcp_url,de.token),onCopy:()=>Se('Codex app config',T(de.mcp_url,de.token)),sensitive:!0}):(0,r(d[15]).jsxs)(r(d[15]).Fragment,{children:[(0,r(d[15]).jsx)(F,{label:"Server URL",value:de.mcp_url,onCopy:()=>Se('Server URL',de.mcp_url)}),(0,r(d[15]).jsx)(F,{label:"Personal token",value:de.token,onCopy:()=>Se('Personal token',de.token),sensitive:!0}),'Claude'===J&&(0,r(d[15]).jsx)(F,{label:"Claude Code",value:de.claude_code_command,onCopy:()=>Se('Claude Code',de.claude_code_command),sensitive:!0})]})]}),(0,r(d[15]).jsx)(p.default,{style:V.connectionTitle,children:"Verify the account in your AI app"}),(0,r(d[15]).jsx)(p.default,{style:V.body,children:"Paste this request in a new conversation. Check that the response matches the BetterAt account above before using your learning data."}),(0,r(d[15]).jsx)(F,{label:"Account verification request",value:"Use BetterAt get_current_user to show the connected account name and email. Do not change any data.",onCopy:()=>Se('Account verification request','Use BetterAt get_current_user to show the connected account name and email. Do not change any data.')}),(0,r(d[15]).jsx)(q,{label:"Done with setup",disabled:B,onPress:()=>{ue(null),Z(!1),oe(null),ke()}})]})]})}),(0,r(d[15]).jsxs)(r(d[21]).IOSListSection,{headerStyle:V.sectionLabel,footerStyle:V.sectionLabel,header:"Advanced",children:[(0,r(d[15]).jsx)(G,{title:"Technical setup and optional prompts",expanded:X,onPress:()=>Q(!X)}),X&&(0,r(d[15]).jsxs)(f.default,{style:V.help,children:[be?(0,r(d[15]).jsx)(F,{label:"MCP endpoint",value:ye,onCopy:()=>Se('MCP endpoint',ye)}):(0,r(d[15]).jsxs)(p.default,{style:V.body,children:["Configured endpoint (not verified for this database): ",ye,". Connection instructions and credential creation are disabled."]}),de&&be&&(0,r(d[15]).jsxs)(r(d[15]).Fragment,{children:[(0,r(d[15]).jsx)(F,{label:"Codex CLI command",value:P(de.mcp_url,de.token),onCopy:()=>
1Se('Codex CLI command',P(de.mcp_url,de.token)),sensitive:!0}),(0,r(d[15]).jsx)(F,{label:"Claude Desktop config",value:de.claude_desktop_config,onCopy:()=>Se('Claude Desktop config',de.claude_desktop_config),sensitive:!0})]}),(0,r(d[15]).jsx)(q,{label:"Copy Nursing CoS prompt",onPress:()=>Se('Nursing CoS prompt',x)}),(0,r(d[15]).jsx)(q,{label:"Copy nursing practice request",onPress:()=>Se('Nursing practice request',_)})]})]})]})]});var Le}function G({title:t,subtitle:n,leadingIcon:o,onPress:s,expanded:c}){const u=(0,r(d[15]).jsxs)(r(d[15]).Fragment,{children:[o&&(0,r(d[15]).jsx)(r(d[17]).Ionicons,{name:o,size:22,color:r(d[18]).IOS_ACCESSIBLE_COLORS.action}),(0,r(d[15]).jsxs)(f.default,{style:V.rowText,children:[(0,r(d[15]).jsx)(p.default,{style:V.connectionTitle,children:t}),n&&(0,r(d[15]).jsx)(p.default,{style:V.body,children:n})]}),s&&(0,r(d[15]).jsx)(r(d[17]).Ionicons,{name:c?'chevron-up':'chevron-forward',size:18,color:r(d[18]).IOS_ACCESSIBLE_COLORS.secondaryLabel})]});return s?(0,r(d[15]).jsx)(l.default,{accessibilityRole:"button",accessibilityLabel:t,"aria-expanded":c,accessibilityState:void 0===c?void 0:{expanded:c},onPress:s,style:V.row,children:u}):(0,r(d[15]).jsx)(f.default,{style:V.row,children:u})}function q({label:t,onPress:n,disabled:o=!1,destructive:s=!1}){return(0,r(d[15]).jsx)(l.default,{accessibilityRole:"button",accessibilityLabel:t,accessibilityState:{disabled:o},disabled:o,onPress:n,style:({pressed:t})=>[V.action,{opacity:o?.45:t?.65:1}],children:(0,r(d[15]).jsx)(p.default,{style:[V.actionText,s&&V.error],children:t})})}function F({label:t,value:n,onCopy:s,sensitive:c=!1}){const[u,h]=(0,o.useState)(!1),y=c&&!u?$(n):n;return(0,r(d[15]).jsxs)(f.default,{style:V.copyBlock,children:[(0,r(d[15]).jsxs)(f.default,{style:V.copyHeader,children:[(0,r(d[15]).jsx)(p.default,{style:V.copyLabel,children:t}),(0,r(d[15]).jsxs)(f.default,{style:V.copyActions,children:[c?(0,r(d[15]).jsx)(l.default,{onPress:()=>h(t=>!t),style:V.copyButton,accessibilityRole:"button",accessibilityLabel:u?`Hide ${t}`:`Reveal ${t}`,children:(0,r(d[15]).jsx)(r(d[17]).Ionicons,{name:u?'eye-off-outline':'eye-outline',size:16,color:r(d[18]).IOS_ACCESSIBLE_COLORS.secondaryLabel})}):null,(0,r(d[15]).jsx)(l.default,{onPress:s,style:V.copyButton,accessibilityRole:"button",accessibilityLabel:`Copy ${t}`,children:(0,r(d[15]).jsx)(r(d[17]).Ionicons,{name:"copy-outline",size:16,color:r(d[18]).IOS_ACCESSIBLE_COLORS.action})})]})]}),(0,r(d[15]).jsx)(p.default,{style:V.copyValue,selectable:!0,children:y})]})}const V=h.default.create({sectionLabel:{color:r(d[18]).IOS_ACCESSIBLE_COLORS.secondaryLabel},row:{padding:16,minHeight:56,flexDirection:'row',alignItems:'center',gap:12},rowText:{flex:1,gap:4},intro:{paddingHorizontal:20,paddingBottom:24,gap:8},pageTitle:{fontSize:28,fontWeight:'700',color:r(d[18]).IOS_COLORS.label},body:{fontSize:15,lineHeight:22,color:r(d[18]).IOS_ACCESSIBLE_COLORS.secondaryLabel},help:{padding:16,gap:12},connection:{padding:16,gap:6,borderTopWidth:h.default.hairlineWidth,borderTopColor:r(d[18]).IOS_COLORS.separator},connectionTitle:{fontSize:17,fontWeight:'600',color:r(d[18]).IOS_COLORS.label},actions:{flexDirection:'row',flexWrap:'wrap',gap:16},action:{minHeight:44,justifyContent:'center',alignSelf:'flex-start',paddingHorizontal:4},actionText:{fontSize:16,fontWeight:'600',color:r(d[18]).IOS_ACCESSIBLE_COLORS.action},error:{color:r(d[18]).IOS_ACCESSIBLE_COLORS.destructive},platforms:{flexDirection:'row',flexWrap:'wrap',gap:8},platform:{minHeight:44,paddingHorizontal:16,justifyContent:'center',borderWidth:1,borderColor:r(d[18]).IOS_COLORS.separator,borderRadius:10},platformSelected:{backgroundColor:r(d[18]).IOS_ACCESSIBLE_COLORS.action,borderColor:r(d[18]).IOS_ACCESSIBLE_COLORS.action},platformText:{fontSize:15,color:r(d[18]).IOS_COLORS.label},platformTextSelected:{color:r(d[18]).IOS_COLORS.systemBackgroun
1d},surface:{flex:1,backgroundColor:r(d[18]).IOS_COLORS.systemGroupedBackground},loading:{flex:1,alignItems:'center',justifyContent:'center',backgroundColor:r(d[18]).IOS_COLORS.systemGroupedBackground},content:{paddingTop:24,paddingBottom:40,width:'100%',maxWidth:820,alignSelf:'center'},headerBack:{flexDirection:'row',alignItems:'center'},headerBackText:{color:r(d[18]).IOS_ACCESSIBLE_COLORS.action,fontSize:17},copyBlock:{paddingHorizontal:16,paddingVertical:14,backgroundColor:r(d[18]).IOS_COLORS.secondarySystemGroupedBackground},copyHeader:{flexDirection:'row',alignItems:'center',justifyContent:'space-between',marginBottom:8},copyButton:{minWidth:44,minHeight:44,alignItems:'center',justifyContent:'center'},copyActions:{flexDirection:'row',alignItems:'center',gap:14},copyLabel:{color:r(d[18]).IOS_ACCESSIBLE_COLORS.secondaryLabel,fontSize:12,fontWeight:'700',textTransform:'uppercase'},copyValue:{color:r(d[18]).IOS_COLORS.label,fontFamily:'monospace',fontSize:12,lineHeight:17}})},1283,[2,4,7,722,716,737,109,29,164,22,1860,2939,2938,1682,1680,914,1681,1728,1783,1707,1688,2936]); 2__d(function(g,r,i,a,m,e,d){Object.defineProperty(e,"__esModule",{value:!0}),e.connectionEnvironment=function(o,c){const s=o?.replace(/\/$/,'')||'',p=s===t;let u='Not configured';try{u=new URL(s).host}catch{}return{label:p?'Production':s?'Non-production':'Unconfigured',databaseHost:u,canConnect:p&&n.has(c)}};const t='https://qavekrwdbsobecwrfxwu.supabase.co',n=new Set(['https://better.at/api/mcp','https://www.better.at/api/mcp'])},2938,[]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.