bazilion 0.8.0 → 0.9.0
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/README.md +47 -5
- package/dist/cli.js +1184 -628
- package/dist/cli.js.map +1 -1
- package/dist/daemon.js +5194 -1574
- package/dist/daemon.js.map +1 -1
- package/dist/migrations/0001_init.sql +318 -88
- package/dist/web/client/assets/{FieldRow-CNKma5LE.js → FieldRow-DmwAFfbF.js} +1 -1
- package/dist/web/client/assets/ProductionTeamPolicyEditor-1a5jQqUB.js +7 -0
- package/dist/web/client/assets/ProductionTeamPolicyEditor-DLioOiRN.css +1 -0
- package/dist/web/client/assets/ProfileCommunicationEditor-D1OZ8WE5.js +1 -0
- package/dist/web/client/assets/RecoveryState-QfMSuwy3.js +1 -0
- package/dist/web/client/assets/TeamTabs-BViZ4sti.js +1 -0
- package/dist/web/client/assets/TemplatesTabs-DVcY9pMD.js +1 -0
- package/dist/web/client/assets/_id-8P7brhGy.js +1 -0
- package/dist/web/client/assets/_id-C3o3MHq8.js +1 -0
- package/dist/web/client/assets/_id-DGRrSF1e.js +1 -0
- package/dist/web/client/assets/_id-DGyKURCp.js +1 -0
- package/dist/web/client/assets/_id-KnJe-aW9.js +1 -0
- package/dist/web/client/assets/activity-DJuhhQCb.js +1 -0
- package/dist/web/client/assets/activity-WWvJSo4t.js +1 -0
- package/dist/web/client/assets/agents-C32T1voV.js +1 -0
- package/dist/web/client/assets/agents-nH4m4gZ1.js +1 -0
- package/dist/web/client/assets/approvals-DGi0PSx8.js +1 -0
- package/dist/web/client/assets/approvals-l8jIZjqz.js +1 -0
- package/dist/web/client/assets/{config-DIuEc5bm.js → config-C7wvi1nR.js} +2 -2
- package/dist/web/client/assets/context-BEGWE3RC.js +1 -0
- package/dist/web/client/assets/inbox--4aBaAgG.js +1 -0
- package/dist/web/client/assets/index-BCXoh1c8.js +12 -0
- package/dist/web/client/assets/{login-CawJX16E.js → login-Bk2wwIHQ.js} +1 -1
- package/dist/web/client/assets/{mcp-DIrh9-v_.js → mcp-vM7xgh9e.js} +1 -1
- package/dist/web/client/assets/members-cPKfnrSL.js +1 -0
- package/dist/web/client/assets/memory-BOcsaemD.js +1 -0
- package/dist/web/client/assets/policy-BGLCJYvS.js +1 -0
- package/dist/web/client/assets/policy-K4hIbbIN.js +1 -0
- package/dist/web/client/assets/{preload-helper-CvnapA2_.js → preload-helper-eOOCz1Fu.js} +1 -1
- package/dist/web/client/assets/routes-DnrP3dwv.js +1 -0
- package/dist/web/client/assets/services-C2_O3ifw.js +1 -0
- package/dist/web/client/assets/{skills-Da0MURjY.js → skills-B__fLZjx.js} +1 -1
- package/dist/web/client/assets/styles-Dn24-ZvP.css +2 -0
- package/dist/web/client/assets/team-policy-BdX340m4.js +1 -0
- package/dist/web/client/assets/teams-CSNyLz3l.js +1 -0
- package/dist/web/client/assets/teams-DZMB4_iw.js +1 -0
- package/dist/web/client/assets/teams-rpaYKNIb.js +1 -0
- package/dist/web/client/assets/telegram-B1O4Ko0V.js +1 -0
- package/dist/web/client/assets/{tokens-E_JvO5JN.js → tokens-D7FH9VgA.js} +1 -1
- package/dist/web/client/assets/triggers-3PLy2_Fo.js +1 -0
- package/dist/web/client/assets/welcome-B-QQobzq.js +1 -0
- package/dist/web/client/assets/{ChatPane-DzEgOEqS.js → wire-constants-BY9Q9Z7d.js} +4 -4
- package/dist/web/server/assets/{ChatPane-BvpswYvF.js → ChatPane-Dh3qxzdb.js} +23 -12
- package/dist/web/server/assets/ProductionTeamPolicyEditor-Bke5doyl.js +1009 -0
- package/dist/web/server/assets/ProfileCommunicationEditor-C2RU-2QB.js +107 -0
- package/dist/web/server/assets/RecoveryState-B2SG-mrY.js +37 -0
- package/dist/web/server/assets/{Sidebar-DmEiewRN.js → Sidebar-CGmtCnYU.js} +372 -48
- package/dist/web/server/assets/TeamTabs-BPxDBfqy.js +50 -0
- package/dist/web/server/assets/{TemplatesTabs---7h5GYa.js → TemplatesTabs-zf4YhStd.js} +6 -6
- package/dist/web/server/assets/{_id-CXg-Blec.js → _id-5lLzLwcv.js} +52 -40
- package/dist/web/server/assets/_id-A8Xiv6Lc.js +11 -0
- package/dist/web/server/assets/{_id-BqnDy_Ca.js → _id-B04VaQlh.js} +6 -5
- package/dist/web/server/assets/{_id-BdRiQb2H.js → _id-B6g9wmPR.js} +126 -27
- package/dist/web/server/assets/_id-ButXHnRH.js +14 -0
- package/dist/web/server/assets/_id-C4AOhstq.js +44 -0
- package/dist/web/server/assets/{_id-DDixKEud.js → _id-CCHA0gdR.js} +72 -12
- package/dist/web/server/assets/{_id-D_Ew11ED.js → _id-CUWgTqMS.js} +8 -8
- package/dist/web/server/assets/_id-DJkzwHjM.js +42 -0
- package/dist/web/server/assets/{_id-CnQflrRv.js → _id-DdC9wpNN.js} +5 -5
- package/dist/web/server/assets/{_id-DUIrFV3G.js → _id-DkFgCIb-.js} +9 -1
- package/dist/web/server/assets/{_id-D8duqgd5.js → _id-_nFwi9gD.js} +5 -4
- package/dist/web/server/assets/{_id-Sjw0zhA6.js → _id-fpFQ9_Ya.js} +4 -4
- package/dist/web/server/assets/_tanstack-start-manifest_v-Div-TukY.js +241 -0
- package/dist/web/server/assets/activity-C2ZKg1Q9.js +170 -0
- package/dist/web/server/assets/activity-CGCf8BQf.js +11 -0
- package/dist/web/server/assets/activity-DedraoFj.js +14 -0
- package/dist/web/server/assets/activity-GPx8NCeB.js +12 -0
- package/dist/web/server/assets/{profiles-CZ5NkmVw.js → agents-B8kinIPW.js} +4 -4
- package/dist/web/server/assets/{agents-k5QURC4I.js → agents-BR2qXlXF.js} +4 -4
- package/dist/web/server/assets/{agents-ChcAJUI5.js → agents-Bp1nsVs2.js} +1 -1
- package/dist/web/server/assets/{profiles-LxcC_L6n.js → agents-CUQmWhTp.js} +36 -10
- package/dist/web/server/assets/{agents-C7SBPN0M.js → agents-DU9Hqs58.js} +51 -12
- package/dist/web/server/assets/{profiles-C6a3RKgu.js → agents-LHowEI6S.js} +4 -4
- package/dist/web/server/assets/approvals-CbFXFvG8.js +11 -0
- package/dist/web/server/assets/approvals-DHgARzd8.js +242 -0
- package/dist/web/server/assets/approvals-Dw2LJoSA.js +14 -0
- package/dist/web/server/assets/approvals-VPc0YpLN.js +12 -0
- package/dist/web/server/assets/{auth-DzRAMwVt.js → auth-l-Vf8wlu.js} +5 -1
- package/dist/web/server/assets/{config-CdVjqjin.js → config-BvKctDOX.js} +4 -4
- package/dist/web/server/assets/{config-Bq3o924J.js → config-QvHaxGlP.js} +1 -1
- package/dist/web/server/assets/context-5lrf2ame.js +12 -0
- package/dist/web/server/assets/context-CEr4-xiA.js +49 -0
- package/dist/web/server/assets/context-D3Egm-vY.js +12 -0
- package/dist/web/server/assets/members-40DxRdVj.js +48 -0
- package/dist/web/server/assets/members-DlGBKZNl.js +12 -0
- package/dist/web/server/assets/members-ksELRsyk.js +12 -0
- package/dist/web/server/assets/{memory-Ns2-Z31p.js → memory-B5moRnnp.js} +5 -5
- package/dist/web/server/assets/{memory-BaYnfm7K.js → memory-CO0jKGzJ.js} +8 -8
- package/dist/web/server/assets/memory-CiTl4cN9.js +289 -0
- package/dist/web/server/assets/policy-BYVXqsan.js +11 -0
- package/dist/web/server/assets/policy-DNcGZLOB.js +21 -0
- package/dist/web/server/assets/policy-Dr55y-Mh.js +496 -0
- package/dist/web/server/assets/policy-Dxs78_GO.js +40 -0
- package/dist/web/server/assets/{router-BrDascdO.js → router-_izWQUeG.js} +156 -101
- package/dist/web/server/assets/{routes-Ce2VWrU9.js → routes-BSSKp3Rv.js} +4 -4
- package/dist/web/server/assets/{routes-C61gBiXa.js → routes-BrTOoeth.js} +5 -5
- package/dist/web/server/assets/{routes-V9URcp1v.js → routes-DOj6ljcm.js} +1 -1
- package/dist/web/server/assets/{services-B91w2f-X.js → services-CHe4ihJk.js} +11 -11
- package/dist/web/server/assets/{services-Ccc5s2bS.js → services-Pv_V88VA.js} +3 -3
- package/dist/web/server/assets/{start-CYDpZ6cb.js → start-DlHq0RaQ.js} +1 -1
- package/dist/web/server/assets/team-policy-Csvc5EDd.js +180 -0
- package/dist/web/server/assets/teams-35Oprf6e.js +14 -0
- package/dist/web/server/assets/teams-3im0oQnS.js +11 -0
- package/dist/web/server/assets/teams-B5IF65p2.js +12 -0
- package/dist/web/server/assets/teams-B9O-WDH5.js +108 -0
- package/dist/web/server/assets/teams-DFkN7ic7.js +36 -0
- package/dist/web/server/assets/teams-DH1CvWmT.js +12 -0
- package/dist/web/server/assets/teams-zcm9XaQU.js +174 -0
- package/dist/web/server/assets/{telegram-DfAddLdv.js → telegram-C9sQFwWj.js} +7 -7
- package/dist/web/server/assets/{telegram-T3l9KtiE.js → telegram-mTnJCOmn.js} +1 -1
- package/dist/web/server/assets/{welcome-CP4CZ9B6.js → welcome-CDGE2Sdk.js} +2 -2
- package/dist/web/server/assets/{wire-constants-Deb4NxBb.js → wire-constants-C8nBJcU3.js} +3 -3
- package/dist/web/server/server.js +64 -42
- package/dist/worker.js +180 -128
- package/dist/worker.js.map +1 -1
- package/package.json +7 -7
- package/dist/migrations/0002_profile_groups.sql +0 -38
- package/dist/migrations/0003_agent_telegram.sql +0 -40
- package/dist/migrations/0004_agent_mirror_mode.sql +0 -17
- package/dist/migrations/0005_group_topic_name_format.sql +0 -15
- package/dist/migrations/0006_telegram_acl.sql +0 -18
- package/dist/migrations/0007_mcp_servers.sql +0 -30
- package/dist/migrations/0008_seed_user_md.sql +0 -39
- package/dist/web/client/assets/MembersEditor-C6UpqDdV.js +0 -1
- package/dist/web/client/assets/SpawnTeamModal-BEkNCKXm.js +0 -1
- package/dist/web/client/assets/TemplatesTabs-UM04RMO9.js +0 -1
- package/dist/web/client/assets/_id-BNJapCT4.js +0 -1
- package/dist/web/client/assets/_id-CjGoV8Mr.js +0 -1
- package/dist/web/client/assets/_id-DehuCHUw.js +0 -1
- package/dist/web/client/assets/_id-Dz9fjcCM.js +0 -1
- package/dist/web/client/assets/agents-M6omAXcZ.js +0 -1
- package/dist/web/client/assets/groups-DpE2d2zZ.js +0 -1
- package/dist/web/client/assets/inbox-BPnLsRNf.js +0 -1
- package/dist/web/client/assets/index-MAJuXnie.js +0 -12
- package/dist/web/client/assets/memory-BpHbdKsd.js +0 -1
- package/dist/web/client/assets/profile-groups-ByoKak0c.js +0 -1
- package/dist/web/client/assets/profiles-BEjv8LGo.js +0 -1
- package/dist/web/client/assets/routes-D2COHy7v.js +0 -1
- package/dist/web/client/assets/services-D212jSK_.js +0 -1
- package/dist/web/client/assets/styles-BgE5bCHA.css +0 -2
- package/dist/web/client/assets/telegram-Czh2MdVm.js +0 -1
- package/dist/web/client/assets/triggers-BBRZQOm7.js +0 -1
- package/dist/web/client/assets/welcome-Dn-zvmBE.js +0 -1
- package/dist/web/client/assets/wire-constants-BkT5-597.js +0 -1
- package/dist/web/server/assets/MembersEditor-BWQztvrX.js +0 -131
- package/dist/web/server/assets/SpawnTeamModal-dSN421k_.js +0 -107
- package/dist/web/server/assets/_id-BKev9H1p.js +0 -12
- package/dist/web/server/assets/_id-BNwlbWHP.js +0 -24
- package/dist/web/server/assets/_id-CRqqi8IE.js +0 -161
- package/dist/web/server/assets/_tanstack-start-manifest_v-D9FLKShQ.js +0 -178
- package/dist/web/server/assets/groups-CbSwND2r.js +0 -12
- package/dist/web/server/assets/groups-CeRRlZaZ.js +0 -150
- package/dist/web/server/assets/groups-pk4CYSuf.js +0 -21
- package/dist/web/server/assets/memory-CQaqWnyM.js +0 -284
- package/dist/web/server/assets/profile-groups-CiU06yN1.js +0 -28
- package/dist/web/server/assets/profile-groups-D21MYoLM.js +0 -208
- package/dist/web/server/assets/profile-groups-aoJleXHP.js +0 -12
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as e,t}from"./jsx-runtime-DGeXAQPT.js";import{Q as n}from"./preload-helper-CvnapA2_.js";import{i as r}from"./index-MAJuXnie.js";var i=e(n()),a=t();function o(e){return e.split(`/`).map(encodeURIComponent).join(`/`)}function s(){let{group:e,memberCount:t,entries:n}=r.useLoaderData(),s=e.id,[c,l]=(0,i.useState)(()=>n.map(e=>({key:e.key,preview:e.content.slice(0,80)}))),[u,d]=(0,i.useState)(!1),[f,p]=(0,i.useState)(``),[m,h]=(0,i.useState)(null),[g,_]=(0,i.useState)(`none`),[v,y]=(0,i.useState)(``),[b,x]=(0,i.useState)(``),[S,C]=(0,i.useState)(null),w=(0,i.useRef)(null);async function T(e){try{let t=e.trim().length>0?`/api/groups/${encodeURIComponent(s)}/memory/search?q=${encodeURIComponent(e)}&limit=50`:`/api/groups/${encodeURIComponent(s)}/memory`,n=await fetch(t);if(!n.ok){let e=await n.json().catch(()=>null);throw Error(e?.error??n.statusText)}let r=await n.json();e.trim().length>0?(l(r.map(e=>({key:e.key,preview:e.snippet,score:e.score}))),d(!0)):(l(r.map(e=>({key:e.key,preview:e.content.slice(0,80)}))),d(!1))}catch(e){C({msg:`error: ${e.message}`,kind:`error`})}}(0,i.useEffect)(()=>(w.current&&clearTimeout(w.current),w.current=setTimeout(()=>{T(f)},200),()=>{w.current&&clearTimeout(w.current)}),[f]);async function E(e){h(e),_(`edit`),C({msg:`loading…`,kind:`info`});try{let t=await fetch(`/api/groups/${encodeURIComponent(s)}/memory/${o(e)}`);if(!t.ok){let e=await t.json().catch(()=>null);throw Error(e?.error??t.statusText)}let n=await t.json();y(n.key),x(n.content??``),C({msg:`loaded ${n.key}`,kind:`info`})}catch(e){C({msg:`error: ${e.message}`,kind:`error`})}}function D(){h(null),_(`new`),y(``),x(``),C({msg:`new entry — type a key and content, then save`,kind:`info`})}async function O(){let e=v.trim();if(!e){C({msg:`key is required`,kind:`error`});return}try{let t=await fetch(`/api/groups/${encodeURIComponent(s)}/memory/${o(e)}`,{method:`PUT`,headers:{"content-type":`application/json`},body:JSON.stringify({content:b})});if(!t.ok){let e=await t.json().catch(()=>null);throw Error(e?.error??t.statusText)}h(e),_(`edit`),C({msg:`saved`,kind:`info`}),await T(f)}catch(e){C({msg:`error: ${e.message}`,kind:`error`})}}async function k(){if(m&&confirm(`delete ${m}?`))try{let e=await fetch(`/api/groups/${encodeURIComponent(s)}/memory/${o(m)}`,{method:`DELETE`});if(!e.ok&&e.status!==204){let t=await e.json().catch(()=>null);throw Error(t?.error??e.statusText)}h(null),_(`none`),y(``),x(``),C({msg:`deleted`,kind:`info`}),await T(f)}catch(e){C({msg:`error: ${e.message}`,kind:`error`})}}let A=g!==`none`&&v.trim().length>0,j=g===`edit`&&m!==null;return(0,a.jsxs)(`main`,{className:`mx-auto max-w-5xl px-6 py-8`,children:[(0,a.jsxs)(`header`,{className:`mb-6`,children:[(0,a.jsxs)(`h1`,{className:`font-serif text-3xl text-foreground`,children:[e.name,` `,(0,a.jsx)(`span`,{className:`text-muted-foreground text-base`,children:`/ shared memory`})]}),(0,a.jsxs)(`p`,{className:`text-muted-foreground text-sm mt-1`,children:[`BM25-indexed markdown notes shared by every agent in`,` `,(0,a.jsx)(`a`,{href:`/groups/${encodeURIComponent(e.id)}`,className:`font-mono underline`,children:e.id}),` `,`(`,t,` member`,t===1?``:`s`,`). Anything written here is visible to every member; per-agent notes belong in the agent's own`,` `,(0,a.jsx)(`code`,{className:`font-mono`,children:`IDENTITY.md`}),` via `,(0,a.jsx)(`code`,{children:`home_write`}),`.`]})]}),(0,a.jsxs)(`div`,{className:`grid grid-cols-1 gap-6 lg:grid-cols-[320px_1fr]`,children:[(0,a.jsxs)(`div`,{children:[(0,a.jsxs)(`div`,{className:`overflow-hidden rounded-[16px] border border-frost bg-snow`,children:[(0,a.jsx)(`div`,{className:`border-b border-frost p-2`,children:(0,a.jsx)(`input`,{type:`text`,placeholder:`search (BM25)...`,autoComplete:`off`,value:f,onChange:e=>p(e.target.value)})}),(0,a.jsx)(`div`,{className:`max-h-[520px] overflow-y-auto`,children:c.length===0?(0,a.jsx)(`div`,{className:`p-8 text-center text-mocha-light`,children:`no entries`}):c.map(e=>(0,a.jsxs)(`button`,{type:`button`,onClick:()=>E(e.key),className:`unstyled block w-full cursor-pointer border-b border-frost/50 px-3.5 py-2 text-left font-mono text-[0.84em] transition-colors last:border-b-0 hover:bg-sapphire-glow ${e.key===m?`bg-sapphire-glow font-medium text-sapphire-deep`:``}`,children:[u&&e.score!==void 0&&(0,a.jsx)(`span`,{className:`float-right text-[0.75em] text-sapphire`,children:e.score.toFixed(2)}),e.key,e.preview&&(0,a.jsx)(`span`,{className:`mt-1 block text-[0.9em] font-normal text-mocha-light`,children:e.preview})]},e.key))})]}),(0,a.jsx)(`button`,{type:`button`,className:`ghost-btn mt-3 w-full`,onClick:D,children:`+ new entry`})]}),(0,a.jsxs)(`div`,{children:[(0,a.jsx)(`div`,{className:`mb-3 flex items-center gap-2`,children:(0,a.jsx)(`input`,{type:`text`,placeholder:`key (e.g. prefs/hiking.md)`,value:v,onChange:e=>y(e.target.value),disabled:g!==`new`,className:`flex-1 font-mono`})}),(0,a.jsx)(`textarea`,{placeholder:`select an entry on the left, or create a new one.`,value:b,onChange:e=>x(e.target.value),className:`min-h-[360px] w-full font-mono text-[0.9em] leading-[1.55]`}),(0,a.jsxs)(`div`,{className:`mt-3 flex gap-2`,children:[(0,a.jsx)(`button`,{type:`button`,className:`btn-primary`,onClick:O,disabled:!A,children:`save`}),(0,a.jsx)(`button`,{type:`button`,className:`ghost-btn`,onClick:k,disabled:!j,children:`delete`})]}),S&&(0,a.jsx)(`p`,{className:`mt-2 text-[0.9em] ${S.kind===`error`?`text-[#9B3D3D]`:`text-mocha-light`}`,children:S.msg})]})]})]})}export{s as component};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as e,t}from"./jsx-runtime-DGeXAQPT.js";import{Q as n,u as r}from"./preload-helper-CvnapA2_.js";import{h as i}from"./index-MAJuXnie.js";import{t as a}from"./Button-ByiV6fpd.js";import{t as o}from"./SpawnTeamModal-BEkNCKXm.js";import{t as s}from"./MembersEditor-C6UpqDdV.js";import{t as c}from"./TemplatesTabs-UM04RMO9.js";var l=e(n()),u=t();function d(){let{profileGroups:e,groups:t,profiles:n,modelGroups:s,userMdDefault:d}=i.useLoaderData(),p=r(),[m,h]=(0,l.useState)(null);async function g(e){if(!confirm(`delete this profile group? (does not affect spawned agents)`))return;let t=await fetch(`/api/profile-groups/${e}`,{method:`DELETE`});if(!t.ok&&t.status!==204){let e=await t.json().catch(()=>null);alert(e?.error??t.statusText);return}await p.invalidate()}return(0,u.jsxs)(`div`,{children:[(0,u.jsx)(c,{}),(0,u.jsx)(`h1`,{children:`profile groups`}),(0,u.jsx)(`p`,{className:`muted`,children:`A profile group is a reusable team template. Each one holds an ordered list of members — profile + agent-name + optional overrides — that get replayed as a single transactional spawn into a target group.`}),(0,u.jsx)(f,{profiles:n,modelGroups:s,userMdDefault:d,onCreated:()=>p.invalidate()}),(0,u.jsxs)(`table`,{children:[(0,u.jsx)(`thead`,{children:(0,u.jsxs)(`tr`,{children:[(0,u.jsx)(`th`,{children:`id`}),(0,u.jsx)(`th`,{children:`name`}),(0,u.jsx)(`th`,{children:`members`}),(0,u.jsx)(`th`,{})]})}),(0,u.jsxs)(`tbody`,{children:[e.length===0&&(0,u.jsx)(`tr`,{children:(0,u.jsx)(`td`,{colSpan:4,className:`muted`,children:`no profile groups yet`})}),e.map(e=>(0,u.jsxs)(`tr`,{children:[(0,u.jsx)(`td`,{children:(0,u.jsx)(`a`,{href:`/profile-groups/${e.id}`,children:(0,u.jsx)(`code`,{children:e.id})})}),(0,u.jsx)(`td`,{children:e.name}),(0,u.jsx)(`td`,{children:e.memberCount}),(0,u.jsxs)(`td`,{className:`flex gap-2`,children:[(0,u.jsx)(a,{variant:`primary`,disabled:e.memberCount===0,title:e.memberCount===0?`add at least one member before spawning`:void 0,onClick:()=>h(e.id),children:`spawn team`}),(0,u.jsx)(a,{variant:`danger`,onClick:()=>g(e.id),children:`delete`})]})]},e.id))]})]}),m&&(0,u.jsx)(o,{profileGroup:e.find(e=>e.id===m),groups:t,onClose:()=>h(null),onSpawned:e=>{h(null),p.navigate({to:`/groups/$id`,params:{id:e}})}})]})}function f({profiles:e,modelGroups:t,userMdDefault:n,onCreated:r}){let[i,o]=(0,l.useState)(``),[c,d]=(0,l.useState)(``),[f,p]=(0,l.useState)(n),[m,h]=(0,l.useState)([]),[g,_]=(0,l.useState)(null),[v,y]=(0,l.useState)(!1);async function b(e){if(e.preventDefault(),_(null),!i.trim()){_(`id is required`);return}y(!0);try{let e={id:i.trim()};c.trim()&&(e.name=c.trim()),f&&(e.userMd=f);let t=await fetch(`/api/profile-groups`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(e)});if(!t.ok){let e=await t.json().catch(()=>null);throw Error(e?.error??t.statusText)}if(m.length>0){let e=await fetch(`/api/profile-groups/${i.trim()}/members`,{method:`PUT`,headers:{"content-type":`application/json`},body:JSON.stringify({members:m})});if(!e.ok){let t=await e.json().catch(()=>null);throw Error(`group created, member save failed: ${t?.error??e.statusText}`)}}o(``),d(``),p(n),h([]),r()}catch(e){_(e.message)}finally{y(!1)}}return(0,u.jsxs)(`form`,{className:`card`,onSubmit:b,children:[(0,u.jsx)(`h3`,{children:`create profile group`}),g&&(0,u.jsx)(`div`,{className:`err`,children:g}),(0,u.jsxs)(`div`,{className:`flex gap-4`,children:[(0,u.jsxs)(`label`,{className:`flex-1`,children:[`id (slug)`,(0,u.jsx)(`input`,{value:i,onChange:e=>o(e.target.value),required:!0,placeholder:`platform-team`})]}),(0,u.jsxs)(`label`,{className:`flex-1`,children:[`name`,(0,u.jsx)(`input`,{value:c,onChange:e=>d(e.target.value),placeholder:`Platform Team`})]})]}),(0,u.jsxs)(`label`,{children:[`starter USER.md (seeded into freshly-created target groups; prefilled with the built-in default — edit to customise)`,(0,u.jsx)(`textarea`,{rows:3,value:f,onChange:e=>p(e.target.value),className:`font-mono text-[0.88em] leading-[1.55]`})]}),(0,u.jsxs)(`div`,{className:`mt-4`,children:[(0,u.jsx)(`h4`,{className:`mb-1 text-[0.95em] font-medium`,children:`members`}),(0,u.jsxs)(`p`,{className:`muted mb-2 text-[0.88em]`,children:[`Each member becomes one agent when the team is spawned. You can also configure members later from the detail page.`,` `,e.length>0&&(0,u.jsxs)(u.Fragment,{children:[`Available profiles:`,` `,e.map((e,t)=>(0,u.jsxs)(`span`,{children:[t>0&&`, `,(0,u.jsx)(`code`,{children:e.id})]},e.id)),`.`]})]}),(0,u.jsx)(s,{members:m,onChange:h,profiles:e,modelGroups:t,emptyHint:`No members configured yet — add one to pick a profile for each team member.`})]}),(0,u.jsx)(`div`,{className:`mt-4`,children:(0,u.jsx)(a,{variant:`primary`,type:`submit`,disabled:v,children:v?`creating…`:`create`})})]})}export{d as component};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as e,t}from"./jsx-runtime-DGeXAQPT.js";import{Q as n,u as r}from"./preload-helper-CvnapA2_.js";import{g as i}from"./index-MAJuXnie.js";import{t as a}from"./Button-ByiV6fpd.js";import{t as o}from"./TemplatesTabs-UM04RMO9.js";var s=e(n()),c=t();function l(){let{profiles:e,modelGroups:t,skills:n,templates:s}=i.useLoaderData(),l=r();async function d(e){if(!confirm(`delete profile and all its files?`))return;let t=await fetch(`/api/profiles/${e}`,{method:`DELETE`});if(!t.ok&&t.status!==204){let e=await t.json().catch(()=>null);alert(e?.error??t.statusText);return}await l.invalidate()}return(0,c.jsxs)(`div`,{children:[(0,c.jsx)(o,{}),(0,c.jsx)(`h1`,{children:`profiles`}),(0,c.jsx)(`p`,{className:`muted`,children:`A profile is a spawn template — SOUL/IDENTITY templates, a default model, a skills policy. Agents choose a group at spawn time, independent of their profile.`}),(0,c.jsx)(u,{modelGroups:t,skills:n,templates:s,onCreated:()=>l.invalidate()}),(0,c.jsxs)(`table`,{children:[(0,c.jsx)(`thead`,{children:(0,c.jsxs)(`tr`,{children:[(0,c.jsx)(`th`,{children:`id`}),(0,c.jsx)(`th`,{children:`name`}),(0,c.jsx)(`th`,{children:`model`}),(0,c.jsx)(`th`,{children:`agents`}),(0,c.jsx)(`th`,{children:`skills`}),(0,c.jsx)(`th`,{})]})}),(0,c.jsxs)(`tbody`,{children:[e.length===0&&(0,c.jsx)(`tr`,{children:(0,c.jsx)(`td`,{colSpan:6,className:`muted`,children:`no profiles yet`})}),e.map(e=>{let t=e.skillsMode===`all`?`all`:e.defaultSkills.length===0?`—`:e.defaultSkills.join(`, `);return(0,c.jsxs)(`tr`,{children:[(0,c.jsx)(`td`,{children:(0,c.jsx)(`a`,{href:`/profiles/${e.id}`,children:(0,c.jsx)(`code`,{children:e.id})})}),(0,c.jsx)(`td`,{children:e.name}),(0,c.jsx)(`td`,{children:(0,c.jsx)(`code`,{children:e.defaultModel})}),(0,c.jsx)(`td`,{children:e.agentCount}),(0,c.jsx)(`td`,{className:`text-xs text-mocha-light`,children:t}),(0,c.jsx)(`td`,{children:e.agentCount===0?(0,c.jsx)(a,{variant:`danger`,onClick:()=>d(e.id),children:`delete`}):(0,c.jsx)(`span`,{className:`muted`,title:`${e.agentCount} agent(s) use this profile`,children:`in use`})})]},e.id)})]})]})]})}function u({modelGroups:e,skills:t,templates:n,onCreated:r}){let[i,o]=(0,s.useState)(`basics`),[l,u]=(0,s.useState)(``),[p,m]=(0,s.useState)(``),[h,g]=(0,s.useState)(``),[_,v]=(0,s.useState)(n.soul),[y,b]=(0,s.useState)(n.identity),[x,S]=(0,s.useState)(n.bootstrap),[C,w]=(0,s.useState)(!0),[T,E]=(0,s.useState)(n.agents),[D,O]=(0,s.useState)(!0),[k,A]=(0,s.useState)(n.tools),[j,M]=(0,s.useState)(!0),[N,P]=(0,s.useState)(n.heartbeat),[F,I]=(0,s.useState)(!1);function L(e,t,n){t(n),!n&&i===e&&o(`basics`)}let[R,z]=(0,s.useState)(`all`),[B,V]=(0,s.useState)(new Set),[H,U]=(0,s.useState)(null),[W,G]=(0,s.useState)(!1);function K(e){V(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})}async function q(e){if(e.preventDefault(),U(null),!l.trim()){U(`id is required`);return}if(!h.trim()){U(`default model is required`);return}G(!0);try{let e={id:l.trim(),name:p.trim()||void 0,model:h.trim(),skillsMode:R,defaultSkills:R===`selected`?Array.from(B):[],soul:_,identity:y,bootstrap:C?x:null,agents:D?T:null,tools:j?k:null,heartbeat:F?N:null},t=await fetch(`/api/profiles`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(e)});if(!t.ok){let e=await t.json().catch(()=>null);throw Error(e?.error??t.statusText)}u(``),m(``),g(``),w(!0),E(n.agents),O(!0),A(n.tools),M(!0),P(n.heartbeat),I(!1),V(new Set),z(`all`),o(`basics`),r()}catch(e){U(e.message)}finally{G(!1)}}return(0,c.jsxs)(`form`,{className:`card`,onSubmit:q,children:[(0,c.jsx)(`h3`,{children:`create profile`}),H&&(0,c.jsx)(`div`,{className:`err`,children:H}),(0,c.jsx)(d,{items:[{id:`basics`,label:`basics`},{id:`soul`,label:`SOUL`},{id:`identity`,label:`IDENTITY`},{id:`bootstrap`,label:`BOOTSTRAP`,disabled:!C},{id:`agents`,label:`AGENTS`,disabled:!D},{id:`tools`,label:`TOOLS`,disabled:!j},{id:`heartbeat`,label:`HEARTBEAT`,disabled:!F},{id:`skills`,label:`skills`}],active:i,onChange:e=>o(e)}),(0,c.jsxs)(`fieldset`,{className:`mb-5 rounded-md border border-frost p-3`,children:[(0,c.jsx)(`legend`,{className:`px-1 text-[0.85em] font-medium text-mocha`,children:`templates to include`}),(0,c.jsxs)(`div`,{className:`flex flex-wrap gap-x-5 gap-y-2 text-[0.9em]`,children:[(0,c.jsxs)(`label`,{className:`inline-flex items-center gap-1.5 opacity-60`,title:`always included`,children:[(0,c.jsx)(`input`,{type:`checkbox`,defaultChecked:!0,disabled:!0}),` SOUL.md`]}),(0,c.jsxs)(`label`,{className:`inline-flex items-center gap-1.5 opacity-60`,title:`always included`,children:[(0,c.jsx)(`input`,{type:`checkbox`,defaultChecked:!0,disabled:!0}),` IDENTITY.md`]}),(0,c.jsxs)(`label`,{className:`inline-flex cursor-pointer items-center gap-1.5`,children:[(0,c.jsx)(`input`,{type:`checkbox`,checked:C,onChange:e=>L(`bootstrap`,w,e.target.checked)}),`BOOTSTRAP.md`]}),(0,c.jsxs)(`label`,{className:`inline-flex cursor-pointer items-center gap-1.5`,children:[(0,c.jsx)(`input`,{type:`checkbox`,checked:D,onChange:e=>L(`agents`,O,e.target.checked)}),`AGENTS.md`]}),(0,c.jsxs)(`label`,{className:`inline-flex cursor-pointer items-center gap-1.5`,children:[(0,c.jsx)(`input`,{type:`checkbox`,checked:j,onChange:e=>L(`tools`,M,e.target.checked)}),`TOOLS.md`]}),(0,c.jsxs)(`label`,{className:`inline-flex cursor-pointer items-center gap-1.5`,children:[(0,c.jsx)(`input`,{type:`checkbox`,checked:F,onChange:e=>L(`heartbeat`,I,e.target.checked)}),`HEARTBEAT.md`]})]}),(0,c.jsx)(`p`,{className:`muted mt-2 text-[0.8em]`,children:`Disabled files aren't created for this profile. Each spawned agent gets its own copy of the enabled files at spawn time.`})]}),i===`basics`&&(0,c.jsxs)(`div`,{children:[(0,c.jsxs)(`div`,{className:`flex gap-4`,children:[(0,c.jsxs)(`label`,{className:`flex-1`,children:[`id (slug)`,(0,c.jsx)(`input`,{value:l,onChange:e=>u(e.target.value),required:!0})]}),(0,c.jsxs)(`label`,{className:`flex-1`,children:[`name`,(0,c.jsx)(`input`,{value:p,onChange:e=>m(e.target.value)})]})]}),(0,c.jsxs)(`label`,{children:[`default model`,e.length===0?(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(`select`,{disabled:!0,children:(0,c.jsx)(`option`,{children:`(no models available)`})}),(0,c.jsxs)(`span`,{className:`muted text-[0.85em]`,children:[`Enable a provider and curate models on `,(0,c.jsx)(`a`,{href:`/config`,children:`/config`}),` first.`]})]}):(0,c.jsxs)(`select`,{value:h,onChange:e=>g(e.target.value),required:!0,children:[(0,c.jsx)(`option`,{value:``,children:`-- pick a model --`}),e.map(e=>(0,c.jsx)(`optgroup`,{label:e.provider,children:e.models.map(t=>(0,c.jsx)(`option`,{value:`${e.provider}:${t}`,children:`${e.provider}:${t}`},t))},e.provider))]})]})]}),i===`soul`&&(0,c.jsx)(f,{label:`SOUL.md`,hint:`Persona, values, and operating principles. Injected into every session.`,value:_,onChange:v,rows:16}),i===`identity`&&(0,c.jsx)(f,{label:`IDENTITY.md`,hint:`Name, creature, vibe, emoji, avatar — filled in during the bootstrap ritual.`,value:y,onChange:b,rows:12}),i===`bootstrap`&&(0,c.jsx)(f,{label:`BOOTSTRAP.md`,hint:`One-time first-run ritual. The agent retires it once introductions are done.`,value:x,onChange:S,rows:16}),i===`agents`&&(0,c.jsx)(f,{label:`AGENTS.md`,hint:`The workspace operating manual — memory discipline, red lines, channel etiquette.`,value:T,onChange:E,rows:16}),i===`tools`&&(0,c.jsx)(f,{label:`TOOLS.md`,hint:`Agent-specific tool notes and environment facts beyond the generic tool descriptions.`,value:k,onChange:A,rows:14}),i===`heartbeat`&&(0,c.jsx)(f,{label:`HEARTBEAT.md`,hint:`Optional checklist run on scheduled wake-ups. Pair with an interval/cron trigger.`,value:N,onChange:P,rows:12}),i===`skills`&&(0,c.jsxs)(`div`,{children:[(0,c.jsx)(`p`,{className:`muted my-2`,children:`Choose which skills agents inherit at spawn time. In both modes each agent can still attach or detach skills individually after it's spawned.`}),(0,c.jsxs)(`label`,{className:`flex items-start gap-2 my-2 cursor-pointer`,children:[(0,c.jsx)(`input`,{type:`radio`,name:`skillsMode`,value:`all`,checked:R===`all`,onChange:()=>z(`all`)}),(0,c.jsxs)(`span`,{children:[(0,c.jsx)(`strong`,{children:`allow all skills`}),` — every skill on disk is attached when an agent is spawned.`]})]}),(0,c.jsxs)(`label`,{className:`flex items-start gap-2 my-2 cursor-pointer`,children:[(0,c.jsx)(`input`,{type:`radio`,name:`skillsMode`,value:`selected`,checked:R===`selected`,onChange:()=>z(`selected`)}),(0,c.jsxs)(`span`,{children:[(0,c.jsx)(`strong`,{children:`select skills`}),` — attach only the ones you pick below.`]})]}),(0,c.jsx)(`div`,{className:`mt-3 max-h-[22rem] overflow-y-auto rounded-md border border-frost p-3 ${R===`all`?`opacity-50 pointer-events-none`:``}`,children:t.length===0?(0,c.jsxs)(`p`,{className:`muted`,children:[`No skills installed yet. Import some on `,(0,c.jsx)(`a`,{href:`/skills`,children:`/skills`}),`.`]}):t.map(e=>(0,c.jsxs)(`label`,{className:`my-1.5 flex cursor-pointer items-start gap-2`,children:[(0,c.jsx)(`input`,{type:`checkbox`,checked:B.has(e.name),onChange:()=>K(e.name)}),(0,c.jsxs)(`span`,{children:[(0,c.jsx)(`code`,{children:e.name}),e.description&&(0,c.jsxs)(`span`,{className:`text-[0.9em] text-mocha-light`,children:[` — `,e.description]})]})]},e.name))})]}),(0,c.jsx)(`div`,{className:`mt-5 flex gap-2`,children:(0,c.jsx)(a,{variant:`primary`,type:`submit`,disabled:W,children:W?`creating…`:`create`})})]})}function d({items:e,active:t,onChange:n}){return(0,c.jsx)(`nav`,{role:`tablist`,className:`-mb-px mb-5 flex flex-wrap gap-1 border-b border-frost`,children:e.map(e=>(0,c.jsx)(`button`,{type:`button`,role:`tab`,"aria-selected":t===e.id,disabled:e.disabled,title:e.disabled?`disabled — enable it in “templates to include”`:void 0,onClick:()=>n(e.id),className:`unstyled border-b-2 bg-transparent px-4 py-2 text-[0.9em] font-medium transition-colors ${e.disabled?`cursor-not-allowed border-transparent text-mocha-light/40`:t===e.id?`cursor-pointer border-sapphire text-sapphire`:`cursor-pointer border-transparent text-mocha hover:text-sapphire`}`,children:e.label},e.id))})}function f({label:e,hint:t,value:n,onChange:r,rows:i}){return(0,c.jsxs)(`div`,{children:[(0,c.jsx)(`p`,{className:`muted my-2 text-[0.85em]`,children:t}),(0,c.jsxs)(`label`,{children:[e,(0,c.jsx)(`textarea`,{rows:i,value:n,onChange:e=>r(e.target.value),className:`font-mono text-[0.88em] leading-[1.55]`})]})]})}export{l as component};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as e,t}from"./jsx-runtime-DGeXAQPT.js";import{Q as n,a as r,o as i,u as a}from"./preload-helper-CvnapA2_.js";import{v as o}from"./index-MAJuXnie.js";import{t as s}from"./ChatPane-DzEgOEqS.js";import"./wire-constants-BkT5-597.js";import{t as c}from"./SpawnTeamModal-BEkNCKXm.js";var l=e(n(),1),u=t();function d({onClose:e}){let t=a(),[n,r]=(0,l.useState)(``),[i,o]=(0,l.useState)(``),[s,c]=(0,l.useState)(``),[d,f]=(0,l.useState)(!1),[p,m]=(0,l.useState)(null);async function h(r){if(r.preventDefault(),m(null),!n.trim()){m(`id is required`);return}f(!0);try{let r={id:n.trim()};i.trim()&&(r.name=i.trim()),s.trim()&&(r.link=s.trim());let a=await fetch(`/api/groups`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(r)});if(!a.ok){let e=await a.json().catch(()=>({}));throw Error(e.error??`${a.status} ${a.statusText}`)}e(),await t.invalidate()}catch(e){m(e.message),f(!1)}}return(0,u.jsx)(`div`,{onClick:e,className:`fixed inset-0 z-50 flex items-center justify-center bg-black/30 backdrop-blur-[1px]`,children:(0,u.jsxs)(`form`,{onSubmit:h,onClick:e=>e.stopPropagation(),className:`w-full max-w-md rounded-2xl border bg-card p-6 shadow-lg`,children:[(0,u.jsx)(`h3`,{className:`font-serif text-xl text-foreground mb-1`,children:`Create a new group`}),(0,u.jsxs)(`p`,{className:`text-sm text-muted-foreground mb-4`,children:[`A group is a collaboration context — one filesystem root, one USER.md, one roster. The slot lives at `,(0,u.jsx)(`code`,{className:`font-mono`,children:`~/.bazilion/groups/<slug>/`}),`.`]}),(0,u.jsxs)(`div`,{className:`grid grid-cols-2 gap-3 mb-3`,children:[(0,u.jsxs)(`label`,{className:`block text-sm`,children:[`ID (slug)`,(0,u.jsx)(`input`,{type:`text`,value:n,onChange:e=>r(e.target.value),required:!0,pattern:`[a-z0-9][a-z0-9_-]*`,placeholder:`myproject`,autoFocus:!0,className:`mt-1 block w-full rounded-md border bg-background px-3 py-2 outline-none focus:ring-2 focus:ring-ring/30`})]}),(0,u.jsxs)(`label`,{className:`block text-sm`,children:[`Name `,(0,u.jsx)(`span`,{className:`text-muted-foreground font-normal`,children:`(optional)`}),(0,u.jsx)(`input`,{type:`text`,value:i,onChange:e=>o(e.target.value),className:`mt-1 block w-full rounded-md border bg-background px-3 py-2 outline-none focus:ring-2 focus:ring-ring/30`})]})]}),(0,u.jsxs)(`label`,{className:`block text-sm mb-3`,children:[`Link target`,` `,(0,u.jsx)(`span`,{className:`text-muted-foreground font-normal`,children:`(optional, absolute path)`}),(0,u.jsx)(`input`,{type:`text`,value:s,onChange:e=>c(e.target.value),placeholder:`/home/you/projects/myrepo`,className:`mt-1 block w-full rounded-md border bg-background px-3 py-2 outline-none focus:ring-2 focus:ring-ring/30`}),(0,u.jsx)(`span`,{className:`mt-1 block text-xs text-muted-foreground`,children:`Leave blank to create a fresh directory. Supply an absolute path to materialize the slot as a symlink to your existing project tree.`})]}),p&&(0,u.jsx)(`p`,{className:`mt-2 text-sm text-rose-700`,children:p}),(0,u.jsxs)(`div`,{className:`mt-5 flex justify-end gap-2`,children:[(0,u.jsx)(`button`,{type:`button`,onClick:e,className:`rounded-md border px-3 py-2 text-sm text-foreground hover:bg-accent`,children:`Cancel`}),(0,u.jsx)(`button`,{type:`submit`,disabled:d,className:`rounded-md bg-primary px-3 py-2 text-sm font-medium text-primary-foreground disabled:opacity-50`,children:d?`Creating…`:`Create`})]})]})})}function f({profileId:e,groupHint:t,groups:n,onClose:r}){let a=i(),[o,s]=(0,l.useState)(``),[c,d]=(0,l.useState)(t??`default`),[f,m]=(0,l.useState)(!1),[h,g]=(0,l.useState)(null);async function _(t){t.preventDefault(),g(null),m(!0);try{let t={profile:e};o.trim()&&(t.name=o.trim()),c&&(t.groupId=c);let n=await fetch(`/api/agents`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(t)});if(!n.ok){let e=await n.json().catch(()=>({}));throw Error(e.error??`${n.status} ${n.statusText}`)}let i=await n.json();r(),await a({to:`/`,search:{agent:i.id}})}catch(e){g(e.message),m(!1)}}return(0,u.jsx)(p,{onClose:r,children:(0,u.jsxs)(`form`,{onSubmit:_,className:`w-full max-w-md rounded-2xl border bg-card p-6 shadow-lg`,onClick:e=>e.stopPropagation(),children:[(0,u.jsx)(`h3`,{className:`font-serif text-xl text-foreground mb-1`,children:`Spawn a new agent`}),(0,u.jsxs)(`p`,{className:`text-sm text-muted-foreground mb-4`,children:[`Profile: `,(0,u.jsx)(`code`,{className:`font-mono`,children:e})]}),(0,u.jsxs)(`label`,{className:`block text-sm text-foreground mb-3`,children:[`Agent name`,` `,(0,u.jsx)(`span`,{className:`text-muted-foreground font-normal`,children:`(optional — defaults to the profile's name)`}),(0,u.jsx)(`input`,{type:`text`,value:o,onChange:e=>s(e.target.value),autoFocus:!0,autoComplete:`off`,className:`mt-1 block w-full rounded-md border bg-background px-3 py-2 outline-none focus:ring-2 focus:ring-ring/30`})]}),(0,u.jsxs)(`label`,{className:`block text-sm text-foreground mb-3`,children:[`Group`,(0,u.jsx)(`select`,{value:c,onChange:e=>d(e.target.value),className:`mt-1 block w-full rounded-md border bg-background px-3 py-2 outline-none focus:ring-2 focus:ring-ring/30`,children:n.map(e=>(0,u.jsxs)(`option`,{value:e.id,children:[e.name,e.id==="default"?` (default)`:``]},e.id))})]}),h&&(0,u.jsx)(`p`,{className:`mt-2 text-sm text-rose-700`,children:h}),(0,u.jsxs)(`div`,{className:`mt-5 flex justify-end gap-2`,children:[(0,u.jsx)(`button`,{type:`button`,onClick:r,className:`rounded-md border px-3 py-2 text-sm text-foreground hover:bg-accent`,children:`Cancel`}),(0,u.jsx)(`button`,{type:`submit`,disabled:f,className:`rounded-md bg-primary px-3 py-2 text-sm font-medium text-primary-foreground disabled:opacity-50`,children:f?`Creating…`:`Create`})]})]})})}function p({children:e,onClose:t}){return(0,u.jsx)(`div`,{onClick:t,className:`fixed inset-0 z-50 flex items-center justify-center bg-black/30 backdrop-blur-[1px]`,children:e})}var m=`bz_sidebar_open_groups`;function h(e){if(typeof document>`u`)return;let t=encodeURIComponent(JSON.stringify(e));document.cookie=`${m}=${t}; Path=/; Max-Age=31536000; SameSite=Lax`}function g({agents:e,groups:t,profiles:n,profileGroups:i,selectedAgentId:o,initialOpenGroups:s}){let p=a(),[m,g]=(0,l.useState)(null),[_,v]=(0,l.useState)(null),[y,b]=(0,l.useState)(!1),[x,S]=(0,l.useState)(!1),[C,w]=(0,l.useState)(()=>s??{});async function T(e){let t=window.prompt(`rename "${e.name}" to:`,e.name)?.trim();if(!t||t===e.name)return;let n=await fetch(`/api/agents/${e.id}`,{method:`PATCH`,headers:{"content-type":`application/json`},body:JSON.stringify({name:t})});if(!n.ok){let e=await n.json().catch(()=>null);alert(e?.error??n.statusText);return}await p.invalidate()}async function E(e){if(!confirm(`archive "${e.name}"? (reversible — find under "show archived")`))return;let t=await fetch(`/api/agents/${e.id}/archive`,{method:`POST`});if(!t.ok&&t.status!==204){alert(t.statusText);return}await p.invalidate()}let D=[...n].sort((e,t)=>e.id==="default"?-1:+(t.id==="default")),O=[...t].sort((e,t)=>e.id==="default"?-1:+(t.id==="default")),k=new Map;for(let t of e){let e=k.get(t.groupId)??[];e.push(t),k.set(t.groupId,e)}let A=e.find(e=>e.id===o)?.groupId??null;return(0,u.jsxs)(`aside`,{className:`flex h-full flex-col rounded-lg border bg-card overflow-hidden`,children:[(0,u.jsxs)(`header`,{className:`flex items-center justify-between border-b px-3 py-2.5 bg-muted/30`,children:[(0,u.jsx)(`span`,{className:`font-serif text-base text-foreground`,children:`agents`}),(0,u.jsxs)(`div`,{className:`relative`,children:[(0,u.jsx)(`button`,{type:`button`,onClick:()=>S(e=>!e),className:`rounded-md border px-2 py-1 text-xs text-muted-foreground hover:text-foreground hover:border-foreground/30`,children:`+ new ▾`}),x&&(0,u.jsxs)(`div`,{role:`menu`,className:`absolute right-0 top-[calc(100%+0.3rem)] z-20 min-w-[14rem] rounded-md border bg-popover p-1 shadow-md`,onMouseLeave:()=>S(!1),children:[n.length===0?(0,u.jsxs)(`div`,{className:`px-3 py-2 text-sm text-muted-foreground`,children:[`No profiles yet.`,(0,u.jsx)(`br`,{}),(0,u.jsx)(`a`,{href:`/profiles`,className:`text-primary underline`,children:`Create one`}),` `,`to spawn agents.`]}):(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(`div`,{className:`px-3 pt-1 pb-0.5 text-[0.7em] uppercase tracking-wide text-muted-foreground`,children:`spawn agent from template`}),D.map(e=>(0,u.jsxs)(`button`,{type:`button`,role:`menuitem`,onClick:()=>{S(!1),g({profileId:e.id})},className:`flex w-full items-center justify-between rounded-sm px-3 py-1.5 text-sm hover:bg-accent`,children:[(0,u.jsx)(`span`,{children:e.name||e.id}),e.id==="default"&&(0,u.jsx)(`span`,{className:`rounded bg-muted px-1 text-[0.7em] text-muted-foreground`,children:`default`})]},e.id))]}),(0,u.jsx)(`div`,{className:`my-1 h-px bg-border`}),(0,u.jsx)(`div`,{className:`px-3 pt-1 pb-0.5 text-[0.7em] uppercase tracking-wide text-muted-foreground`,children:`spawn group from template`}),i.length===0?(0,u.jsxs)(`div`,{className:`px-3 py-1.5 text-xs text-muted-foreground`,children:[`No team templates yet.`,` `,(0,u.jsx)(`a`,{href:`/profile-groups`,className:`text-primary underline`,children:`Create one`}),`.`]}):i.map(e=>(0,u.jsxs)(`button`,{type:`button`,role:`menuitem`,disabled:e.memberCount===0,title:e.memberCount===0?`add at least one member before spawning`:void 0,onClick:()=>{S(!1),v(e)},className:`flex w-full items-center justify-between rounded-sm px-3 py-1.5 text-sm hover:bg-accent disabled:cursor-not-allowed disabled:opacity-50 disabled:hover:bg-transparent`,children:[(0,u.jsx)(`span`,{children:e.name||e.id}),(0,u.jsx)(`span`,{className:`font-mono text-[0.7em] text-muted-foreground`,children:e.memberCount})]},e.id)),(0,u.jsx)(`div`,{className:`my-1 h-px bg-border`}),(0,u.jsx)(`button`,{type:`button`,onClick:()=>{S(!1),b(!0)},className:`block w-full text-left rounded-sm px-3 py-1.5 text-xs text-muted-foreground hover:bg-accent`,children:`+ create group`})]})]})]}),(0,u.jsx)(`nav`,{className:`flex-1 overflow-y-auto p-1`,children:e.length===0&&t.length===0?(0,u.jsxs)(`div`,{className:`p-4 text-sm text-muted-foreground`,children:[`No agents yet.`,` `,(0,u.jsx)(`a`,{href:`/agents`,className:`text-primary underline`,children:`Spawn one`}),` `,`to start chatting.`]}):O.map(e=>{let t=k.get(e.id)??[],n=A===e.id,i=C[e.id];return(0,u.jsxs)(`details`,{open:i===void 0?n||e.id==="default":i,onToggle:t=>{let n=t.currentTarget.open;if(C[e.id]===n)return;let r={...C,[e.id]:n};h(r),w(r),p.invalidate()},className:`group/details mb-1 last:mb-0`,children:[(0,u.jsxs)(`summary`,{className:`flex cursor-pointer list-none items-center gap-1.5 rounded-sm px-2 py-1.5 text-xs uppercase tracking-wide text-muted-foreground hover:bg-accent`,children:[(0,u.jsx)(`span`,{className:`w-3 text-xs transition-transform group-open/details:rotate-90 inline-block`,children:`▸`}),(0,u.jsx)(`span`,{className:`flex-1 truncate font-semibold`,children:e.name}),(0,u.jsx)(`span`,{className:`font-mono text-xs rounded bg-muted px-1 min-w-[1.4em] text-center`,children:t.length})]}),t.length===0?(0,u.jsx)(`div`,{className:`pl-6 py-1 text-xs italic text-muted-foreground`,children:`no agents`}):(0,u.jsx)(`div`,{className:`pl-2`,children:t.map(e=>(0,u.jsxs)(`div`,{className:`group/row relative`,children:[(0,u.jsxs)(r,{to:`/`,search:{agent:e.id},className:`block rounded-sm border-l-2 px-3 py-1.5 pr-14 hover:bg-accent ${e.id===o?`border-primary bg-accent`:`border-transparent`}`,children:[(0,u.jsxs)(`div`,{className:`flex items-center gap-1.5 truncate text-sm font-medium`,children:[(0,u.jsx)(`span`,{className:`truncate`,children:e.name}),e.telegramTopicId!==null&&(0,u.jsx)(`span`,{className:`text-xs`,title:`Telegram topic #${e.telegramTopicId}`,"aria-label":`Bound to Telegram topic ${e.telegramTopicId}`,children:`✈`})]}),(0,u.jsxs)(`div`,{className:`flex gap-2 font-mono text-[0.7em] text-muted-foreground`,children:[(0,u.jsx)(`span`,{className:`uppercase tracking-wide`,children:e.status}),(0,u.jsx)(`code`,{children:e.id.slice(0,8)})]})]}),(0,u.jsxs)(`div`,{className:`absolute right-1 top-1 flex gap-0.5 opacity-0 transition-opacity group-hover/row:opacity-100 focus-within:opacity-100`,children:[(0,u.jsx)(`button`,{type:`button`,onClick:()=>T(e),title:`rename`,"aria-label":`rename ${e.name}`,className:`unstyled flex h-6 w-6 items-center justify-center rounded-sm text-mocha-light hover:bg-snow hover:text-sapphire`,children:`✎`}),(0,u.jsx)(`button`,{type:`button`,onClick:()=>E(e),title:`archive`,"aria-label":`archive ${e.name}`,className:`unstyled flex h-6 w-6 items-center justify-center rounded-sm text-mocha-light hover:bg-snow hover:text-[#9B3D3D]`,children:`×`})]})]},e.id))})]},e.id)})}),m&&(0,u.jsx)(f,{profileId:m.profileId,groupHint:m.groupHint,groups:O,onClose:()=>g(null)}),_&&(0,u.jsx)(c,{profileGroup:_,groups:O,onClose:()=>v(null),onSpawned:e=>{v(null),p.navigate({to:`/groups/$id`,params:{id:e}})}}),y&&(0,u.jsx)(d,{onClose:()=>b(!1)})]})}function _(){let e=o.useLoaderData(),t=e.selected?.resolved.agent.id??null;return(0,u.jsxs)(`div`,{className:`grid h-full grid-cols-1 gap-3 py-3 sm:grid-cols-[16rem_minmax(0,1fr)]`,children:[(0,u.jsx)(g,{agents:e.agents,groups:e.groups,profiles:e.profiles,profileGroups:e.profileGroups,selectedAgentId:t,initialOpenGroups:e.initialOpenGroups}),(0,u.jsx)(`main`,{className:`overflow-hidden`,children:e.selected?(0,u.jsx)(s,{agentId:e.selected.resolved.agent.id,agentName:e.selected.resolved.agent.name,initialMessages:e.selected.initialMessages,initialSessionHead:e.selected.sessionHead}):(0,u.jsx)(`div`,{className:`flex h-full items-center justify-center rounded-lg border border-dashed bg-card text-muted-foreground`,children:e.agents.length===0?`No agents yet.`:`Pick an agent on the left to start chatting.`})})]})}export{_ as component};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./jsx-runtime-DGeXAQPT.js";import{c as t}from"./index-MAJuXnie.js";import{t as n}from"./ConfigTabs-pY-V0Rie.js";import{t as r}from"./FieldRow-CNKma5LE.js";var i=e(),a=`Other`;function o(e){let t=new Map;for(let n of e){let e=n.group??a,r=t.get(e)??[];r.push(n),t.set(e,r)}let n=Array.from(t,([e,t])=>({group:e,items:t}));return n.length>1&&n.sort((e,t)=>e.group===a?1:t.group===a?-1:0),n}function s(){let{services:e}=t.useLoaderData(),a=o(e);return(0,i.jsxs)(`main`,{className:`mx-auto max-w-5xl px-6 py-8`,children:[(0,i.jsx)(`h1`,{className:`font-serif text-3xl text-foreground mb-2`,children:`config`}),(0,i.jsx)(n,{active:`services`}),(0,i.jsxs)(`p`,{className:`text-muted-foreground text-sm mb-6`,children:[`Configuration for non-LLM integrations — web search, crawlers, and similar. Fields marked as secrets are encrypted in the `,(0,i.jsx)(`code`,{className:`font-mono`,children:`secrets`}),` `,`table; plaintext URLs and IDs live in the `,(0,i.jsx)(`code`,{className:`font-mono`,children:`config`}),` `,`table.`]}),e.length===0&&(0,i.jsx)(`p`,{className:`text-muted-foreground italic`,children:`(no services registered)`}),a.map(({group:e,items:t})=>(0,i.jsxs)(`section`,{className:`mb-6`,children:[(0,i.jsx)(`h2`,{className:`mb-2 text-xs font-semibold uppercase tracking-wide text-muted-foreground`,children:e}),t.map(e=>(0,i.jsxs)(`section`,{className:`rounded-lg border bg-card p-5 mb-3`,children:[(0,i.jsxs)(`header`,{className:`flex items-center gap-2 mb-3`,children:[(0,i.jsx)(`span`,{className:`font-mono font-semibold`,children:e.id}),(0,i.jsxs)(`span`,{className:`text-muted-foreground text-sm`,children:[`· `,e.displayName]})]}),e.hint&&(0,i.jsx)(`p`,{className:`text-xs text-muted-foreground mb-2`,children:e.hint}),e.fields.map(e=>(0,i.jsx)(r,{field:e},e.envVar))]},e.id))]},e))]})}export{s as component};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/*! tailwindcss v4.3.1 | MIT License | https://tailwindcss.com */
|
|
2
|
-
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-content:"";--tw-animation-delay:0s;--tw-animation-direction:normal;--tw-animation-duration:initial;--tw-animation-fill-mode:none;--tw-animation-iteration-count:1;--tw-enter-blur:0;--tw-enter-opacity:1;--tw-enter-rotate:0;--tw-enter-scale:1;--tw-enter-translate-x:0;--tw-enter-translate-y:0;--tw-exit-blur:0;--tw-exit-opacity:1;--tw-exit-rotate:0;--tw-exit-scale:1;--tw-exit-translate-x:0;--tw-exit-translate-y:0}}}@layer theme{:root,:host{--font-sans:"DM Sans", system-ui, sans-serif;--font-serif:ui-serif, Georgia, Cambria, "Times New Roman", Times, serif;--font-mono:"JetBrains Mono", "Fira Code", monospace;--color-amber-50:oklch(98.7% .022 95.277);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-700:oklch(55.5% .163 48.998);--color-amber-800:oklch(47.3% .137 46.201);--color-amber-900:oklch(41.4% .112 45.904);--color-emerald-100:oklch(95% .052 163.051);--color-emerald-700:oklch(50.8% .118 165.612);--color-emerald-800:oklch(43.2% .095 166.913);--color-rose-50:oklch(96.9% .015 12.422);--color-rose-100:oklch(94.1% .03 12.58);--color-rose-300:oklch(81% .117 11.638);--color-rose-400:oklch(71.2% .194 13.428);--color-rose-700:oklch(51.4% .222 16.935);--color-rose-800:oklch(45.5% .188 13.697);--color-rose-900:oklch(41% .159 10.272);--color-black:#000;--spacing:.25rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-2xl:42rem;--container-3xl:48rem;--container-5xl:64rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-normal:0em;--tracking-wide:.025em;--tracking-wider:.05em;--leading-tight:1.25;--leading-snug:1.375;--leading-relaxed:1.625;--radius-sm:6px;--radius-md:10px;--radius-lg:16px;--radius-xl:22px;--radius-2xl:28px;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-xs:4px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--font-heading:"DM Serif Display", Georgia, serif;--font-display:"DM Serif Display", Georgia, serif;--font-body:"DM Sans", system-ui, sans-serif;--color-cream:#f5f0e8;--color-ivory:#faf8f4;--color-frost:#e8e2d8;--color-fawn:#d4cab8;--color-chocolate:#3d2b1f;--color-charcoal:#2a1f16;--color-mocha:#7a6555;--color-mocha-light:#9e8e7e;--color-sapphire:#4a7c9b;--color-sapphire-deep:#3a6580;--color-sapphire-light:#6ba3c2;--color-sapphire-glow:#4a7c9b1f;--color-rose-baziu:#c4878a;--color-snow:#fff;--shadow-baziu-sm:0 1px 3px #2a1f160f;--shadow-baziu-md:0 4px 12px #2a1f1614;--color-ring:var(--ring);--color-input:var(--input);--color-border:var(--border);--color-destructive:var(--destructive);--color-accent-foreground:var(--accent-foreground);--color-accent:var(--accent);--color-muted-foreground:var(--muted-foreground);--color-muted:var(--muted);--color-secondary-foreground:var(--secondary-foreground);--color-secondary:var(--secondary);--color-primary-foreground:var(--primary-foreground);--color-primary:var(--primary);--color-popover-foreground:var(--popover-foreground);--color-popover:var(--popover);--color-card-foreground:var(--card-foreground);--color-card:var(--card);--color-foreground:var(--foreground);--color-background:var(--background)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*{border-color:var(--color-border);outline-color:var(--color-ring)}@supports (color:color-mix(in lab, red, red)){*{outline-color:color-mix(in oklab, var(--color-ring) 50%, transparent)}}body{background-color:var(--color-background);color:var(--color-foreground);font-family:var(--font-body);-webkit-font-smoothing:antialiased;min-height:100vh;font-size:15px;line-height:1.6}html{font-family:var(--font-sans);scrollbar-gutter:stable;overflow-y:scroll}html[data-layout=home],body[data-layout=home]{height:100dvh;overflow:hidden}body:before{content:"";opacity:.025;pointer-events:none;z-index:9999;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");background-repeat:repeat;background-size:256px;position:fixed;inset:0}h1,h2,h3{font-family:var(--font-display);color:var(--color-charcoal);letter-spacing:-.01em;font-weight:400}h1{margin-bottom:.25rem;font-size:2rem}h2{font-size:1.5rem}h3{color:var(--color-mocha);margin-bottom:.4rem;font-size:1.15rem}code{font-family:var(--font-mono);background:var(--color-frost);border-radius:var(--radius-sm);color:var(--color-mocha);padding:.15em .4em;font-size:.88em}a{color:var(--color-sapphire);text-decoration:none;transition:color .2s}a:hover{color:var(--color-sapphire-deep)}}@layer components{label{color:var(--color-mocha);margin:.6rem 0;font-size:.9em;display:block}input[type=text],input[type=password],input[type=number],input:not([type]),select,textarea{font:inherit;border:1.5px solid var(--color-frost);border-radius:var(--radius-md);background:var(--color-ivory);width:100%;color:var(--color-chocolate);outline:none;padding:.5rem .75rem;font-size:.95em;transition:all .2s}input:focus,select:focus,textarea:focus{border-color:var(--color-sapphire);box-shadow:0 0 0 3px var(--color-sapphire-glow);background:var(--color-snow)}input::placeholder{color:var(--color-fawn)}input[type=checkbox]{accent-color:var(--color-sapphire);vertical-align:middle;width:16px;height:16px;margin-right:.35rem}button[type=submit]:not(.unstyled),.btn-primary{font:inherit;letter-spacing:.01em;border-radius:var(--radius-md);cursor:pointer;background:var(--color-sapphire);color:var(--color-snow);border:none;justify-content:center;align-items:center;gap:.4rem;padding:.5rem 1.25rem;font-size:.92em;font-weight:600;transition:all .2s;display:inline-flex}button[type=submit]:not(.unstyled):hover,.btn-primary:hover{background:var(--color-sapphire-deep);color:var(--color-snow);box-shadow:var(--shadow-baziu-md);transform:translateY(-1px)}button[type=submit]:not(.unstyled):active,.btn-primary:active{transform:translateY(0)}button[type=submit]:not(.unstyled):disabled,button[type=submit]:not(.unstyled)[disabled],.btn-primary:disabled,.btn-primary[disabled]{opacity:.5;cursor:not-allowed;box-shadow:none;transform:none}.ghost-btn{color:var(--color-mocha);border:1.5px solid var(--color-frost);font:inherit;border-radius:var(--radius-md);cursor:pointer;background:0 0;align-items:center;gap:.3rem;padding:.35rem .85rem;font-size:.92em;font-weight:500;transition:all .2s;display:inline-flex}.ghost-btn:hover{border-color:var(--color-sapphire-light);color:var(--color-sapphire);background:var(--color-sapphire-glow)}.ghost-btn:disabled,.ghost-btn[disabled]{opacity:.5;cursor:not-allowed}.danger-btn{color:var(--destructive);border:1.5px solid var(--destructive);background:0 0;align-items:center;gap:.3rem;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.danger-btn{border:1.5px solid color-mix(in srgb, var(--destructive) 30%, transparent)}}.danger-btn{font:inherit;border-radius:var(--radius-md);cursor:pointer;padding:.35rem .85rem;font-size:.92em;font-weight:500;transition:all .2s}.danger-btn:hover{background:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.danger-btn:hover{background:color-mix(in srgb, var(--destructive) 10%, transparent)}}.danger-btn:hover{border-color:var(--destructive)}.danger-btn:disabled,.danger-btn[disabled]{opacity:.5;cursor:not-allowed}table{border-collapse:separate;border-spacing:0;background:var(--color-snow);border:1px solid var(--color-frost);border-radius:var(--radius-lg);width:100%;margin:1rem 0;overflow:hidden}thead{background:var(--color-ivory)}th{text-align:left;text-transform:uppercase;letter-spacing:.06em;color:var(--color-mocha-light);border-bottom:1px solid var(--color-frost);padding:.65rem 1rem;font-size:.82em;font-weight:600}td{border-bottom:1px solid var(--color-frost);vertical-align:middle;padding:.6rem 1rem;font-size:.93em}tr:last-child td{border-bottom:none}tbody tr{transition:background .2s}tbody tr:hover{background:var(--color-sapphire-glow)}.md-content>*+*{margin-top:.65em}.md-content h1,.md-content h2,.md-content h3,.md-content h4,.md-content h5,.md-content h6{font-family:var(--font-serif);color:var(--color-chocolate);margin-top:1.1em;font-weight:600;line-height:1.3}.md-content h1{font-size:1.45em}.md-content h2{font-size:1.25em}.md-content h3{font-size:1.1em}.md-content h4,.md-content h5,.md-content h6{font-size:1em}.md-content p{line-height:1.55}.md-content ul,.md-content ol{padding-left:1.5em;line-height:1.55}.md-content ul{list-style:outside}.md-content ol{list-style:decimal}.md-content li+li,.md-content li>ul,.md-content li>ol{margin-top:.25em}.md-content a{color:var(--color-sapphire);text-underline-offset:2px;text-decoration:underline}.md-content a:hover{color:var(--color-sapphire-deep)}.md-content strong{color:var(--color-chocolate);font-weight:600}.md-content em{font-style:italic}.md-content code{font-family:var(--font-mono,ui-monospace, monospace);background:var(--color-frost);border-radius:var(--radius-sm,4px);color:var(--color-chocolate);padding:.1em .35em;font-size:.88em}.md-content pre{background:var(--color-ivory);border:1px solid var(--color-frost);border-radius:var(--radius-md);margin:.7em 0;padding:.75rem 1rem;font-size:.88em;line-height:1.5;overflow-x:auto}.md-content pre code{font-size:inherit;background:0 0;border-radius:0;padding:0}.md-content blockquote{border-left:3px solid var(--color-frost);color:var(--color-mocha-light);padding-left:.9rem;font-style:italic}.md-content hr{border:none;border-top:1px solid var(--color-frost);margin:1em 0}.md-content table{border-collapse:collapse;margin:.5em 0;font-size:.93em}.md-content th,.md-content td{border:1px solid var(--color-frost);text-align:left;padding:.4rem .7rem}.md-content th{background:var(--color-frost);font-weight:600}.md-content img{border-radius:var(--radius-sm,4px);max-width:100%;height:auto}.card{background:var(--color-snow);border:1px solid var(--color-frost);border-radius:var(--radius-lg);box-shadow:var(--shadow-baziu-sm);margin:1.25rem 0;padding:1.5rem;transition:box-shadow .2s}.card:hover{box-shadow:var(--shadow-baziu-md)}.card h3{font-family:var(--font-body);text-transform:uppercase;letter-spacing:.06em;color:var(--color-mocha-light);margin-bottom:1rem;font-size:.92em;font-weight:600}.muted{color:var(--color-mocha-light);font-size:.9em}.err{color:var(--destructive);background:var(--destructive);padding:.75rem 1rem}@supports (color:color-mix(in lab, red, red)){.err{background:color-mix(in srgb, var(--destructive) 12%, transparent)}}.err{border:1px solid var(--destructive)}@supports (color:color-mix(in lab, red, red)){.err{border:1px solid color-mix(in srgb, var(--destructive) 25%, transparent)}}.err{border-radius:var(--radius-md);margin-bottom:1rem;font-size:.92em}}@layer utilities{.\@container\/card-header{container:card-header/inline-size}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:0}.inset-x-0{inset-inline:0}.-top-1\.5{top:calc(var(--spacing) * -1.5)}.top-1{top:var(--spacing)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing) * 2)}.top-\[calc\(100\%\+0\.3rem\)\]{top:calc(100% + .3rem)}.-right-1\.5{right:calc(var(--spacing) * -1.5)}.right-0{right:0}.right-1{right:var(--spacing)}.right-2{right:calc(var(--spacing) * 2)}.bottom-0{bottom:0}.bottom-4{bottom:calc(var(--spacing) * 4)}.left-0{left:0}.left-1{left:var(--spacing)}.left-1\/2{left:50%}.isolate{isolation:isolate}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.col-span-4{grid-column:span 4/span 4}.col-start-2{grid-column-start:2}.row-span-2{grid-row:span 2/span 2}.row-start-1{grid-row-start:1}.float-right{float:right}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.m-0{margin:0}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.-mx-4{margin-inline:calc(var(--spacing) * -4)}.mx-5{margin-inline:calc(var(--spacing) * 5)}.mx-auto{margin-inline:auto}.my-1{margin-block:var(--spacing)}.my-1\.5{margin-block:calc(var(--spacing) * 1.5)}.my-2{margin-block:calc(var(--spacing) * 2)}.my-3{margin-block:calc(var(--spacing) * 3)}.my-4{margin-block:calc(var(--spacing) * 4)}.my-5{margin-block:calc(var(--spacing) * 5)}.my-6{margin-block:calc(var(--spacing) * 6)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mt-10{margin-top:calc(var(--spacing) * 10)}.mt-16{margin-top:calc(var(--spacing) * 16)}.mr-1{margin-right:var(--spacing)}.mr-1\.5{margin-right:calc(var(--spacing) * 1.5)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mr-6{margin-right:calc(var(--spacing) * 6)}.-mb-3{margin-bottom:calc(var(--spacing) * -3)}.-mb-4{margin-bottom:calc(var(--spacing) * -4)}.-mb-px{margin-bottom:-1px}.mb-0{margin-bottom:0}.mb-1{margin-bottom:var(--spacing)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.ml-0\.5{margin-left:calc(var(--spacing) * .5)}.ml-1{margin-left:var(--spacing)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-3{margin-left:calc(var(--spacing) * 3)}.ml-4{margin-left:calc(var(--spacing) * 4)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.table-caption{display:table-caption}.table-cell{display:table-cell}.table-row{display:table-row}.field-sizing-content{field-sizing:content}.aspect-square{aspect-ratio:1}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-3{height:calc(var(--spacing) * 3)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-16{height:calc(var(--spacing) * 16)}.h-\[1\.3rem\]{height:1.3rem}.h-\[28px\]{height:28px}.h-\[70vh\]{height:70vh}.h-\[calc\(100\%-1px\)\]{height:calc(100% - 1px)}.h-dvh{height:100dvh}.h-full{height:100%}.h-px{height:1px}.max-h-\(--radix-select-content-available-height\){max-height:var(--radix-select-content-available-height)}.max-h-40{max-height:calc(var(--spacing) * 40)}.max-h-48{max-height:calc(var(--spacing) * 48)}.max-h-\[22rem\]{max-height:22rem}.max-h-\[200px\]{max-height:200px}.max-h-\[520px\]{max-height:520px}.max-h-\[640px\]{max-height:640px}.min-h-0{min-height:0}.min-h-16{min-height:calc(var(--spacing) * 16)}.min-h-\[2\.4rem\]{min-height:2.4rem}.min-h-\[80px\]{min-height:80px}.min-h-\[240px\]{min-height:240px}.min-h-\[360px\]{min-height:360px}.min-h-dvh{min-height:100dvh}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-2{width:calc(var(--spacing) * 2)}.w-3{width:calc(var(--spacing) * 3)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-16{width:calc(var(--spacing) * 16)}.w-28{width:calc(var(--spacing) * 28)}.w-32{width:calc(var(--spacing) * 32)}.w-40{width:calc(var(--spacing) * 40)}.w-48{width:calc(var(--spacing) * 48)}.w-56{width:calc(var(--spacing) * 56)}.w-72{width:calc(var(--spacing) * 72)}.w-\[1\.6rem\]{width:1.6rem}.w-\[28px\]{width:28px}.w-fit{width:fit-content}.w-full{width:100%}.w-px{width:1px}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-\[85\%\]{max-width:85%}.max-w-\[160px\]{max-width:160px}.max-w-\[180px\]{max-width:180px}.max-w-\[260px\]{max-width:260px}.max-w-\[calc\(100\%-2rem\)\]{max-width:calc(100% - 2rem)}.max-w-full{max-width:100%}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.min-w-0{min-width:0}.min-w-36{min-width:calc(var(--spacing) * 36)}.min-w-\[1\.4em\]{min-width:1.4em}.min-w-\[14rem\]{min-width:14rem}.min-w-\[16rem\]{min-width:16rem}.min-w-\[18rem\]{min-width:18rem}.flex-1{flex:1}.flex-none{flex:none}.shrink-0{flex-shrink:0}.caption-bottom{caption-side:bottom}.origin-\(--radix-select-content-transform-origin\){transform-origin:var(--radix-select-content-transform-origin)}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.animate-pulse{animation:var(--animate-pulse)}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.scroll-my-1{scroll-margin-block:var(--spacing)}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.auto-rows-min{grid-auto-rows:min-content}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-\[2rem_1fr\]{grid-template-columns:2rem 1fr}.grid-cols-\[12rem_minmax\(14rem\,1fr\)_auto_auto\]{grid-template-columns:12rem minmax(14rem,1fr) auto auto}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.place-content-center{place-content:center}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0{gap:0}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-\[0\.45rem\]{gap:.45rem}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-1{column-gap:var(--spacing)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-x-5{column-gap:calc(var(--spacing) * 5)}:where(.space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse)))}.gap-y-1{row-gap:var(--spacing)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}.self-center{align-self:center}.self-start{align-self:flex-start}.justify-self-end{justify-self:flex-end}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-\[4px\]{border-radius:4px}.rounded-\[14px_14px_4px_14px\]{border-radius:14px 14px 4px}.rounded-\[16px\]{border-radius:16px}.rounded-\[min\(var\(--radius-md\)\,10px\)\]{border-radius:min(var(--radius-md), 10px)}.rounded-\[min\(var\(--radius-md\)\,12px\)\]{border-radius:min(var(--radius-md), 12px)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t-xl{border-top-left-radius:var(--radius-xl);border-top-right-radius:var(--radius-xl)}.rounded-r-sm{border-top-right-radius:var(--radius-sm);border-bottom-right-radius:var(--radius-sm)}.rounded-b-xl{border-bottom-right-radius:var(--radius-xl);border-bottom-left-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-\[1\.5px\]{border-style:var(--tw-border-style);border-width:1.5px}.border-y{border-block-style:var(--tw-border-style);border-block-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-l-\[3px\]{border-left-style:var(--tw-border-style);border-left-width:3px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-none{--tw-border-style:none;border-style:none}.border-solid{--tw-border-style:solid;border-style:solid}.border-\[\#9B3D3D\]{border-color:#9b3d3d}.border-\[\#D7A3A3\]{border-color:#d7a3a3}.border-\[\#bcd9bc\]{border-color:#bcd9bc}.border-\[rgba\(196\,135\,138\,0\.4\)\]{border-color:#c4878a66}.border-amber-200{border-color:var(--color-amber-200)}.border-amber-400{border-color:var(--color-amber-400)}.border-border{border-color:var(--color-border)}.border-fawn{border-color:var(--color-fawn)}.border-frost{border-color:var(--color-frost)}.border-frost\/50{border-color:#e8e2d880}@supports (color:color-mix(in lab, red, red)){.border-frost\/50{border-color:color-mix(in oklab, var(--color-frost) 50%, transparent)}}.border-input{border-color:var(--color-input)}.border-primary{border-color:var(--color-primary)}.border-rose-300{border-color:var(--color-rose-300)}.border-rose-400{border-color:var(--color-rose-400)}.border-sapphire{border-color:var(--color-sapphire)}.border-sapphire-light{border-color:var(--color-sapphire-light)}.border-transparent{border-color:#0000}.border-l-\[\#9B3D3D\]{border-left-color:#9b3d3d}.border-l-mocha-light{border-left-color:var(--color-mocha-light)}.bg-\[\#FFF7F5\]{background-color:#fff7f5}.bg-\[\#eef7ee\]{background-color:#eef7ee}.bg-\[rgba\(42\,31\,22\,0\.04\)\]{background-color:#2a1f160a}.bg-\[rgba\(196\,135\,138\,0\.06\)\]{background-color:#c4878a0f}.bg-\[rgba\(196\,135\,138\,0\.08\)\]{background-color:#c4878a14}.bg-accent,.bg-accent\/40{background-color:var(--color-accent)}@supports (color:color-mix(in lab, red, red)){.bg-accent\/40{background-color:color-mix(in oklab, var(--color-accent) 40%, transparent)}}.bg-amber-50{background-color:var(--color-amber-50)}.bg-amber-100{background-color:var(--color-amber-100)}.bg-background{background-color:var(--color-background)}.bg-black\/10{background-color:#0000001a}@supports (color:color-mix(in lab, red, red)){.bg-black\/10{background-color:color-mix(in oklab, var(--color-black) 10%, transparent)}}.bg-black\/30{background-color:#0000004d}@supports (color:color-mix(in lab, red, red)){.bg-black\/30{background-color:color-mix(in oklab, var(--color-black) 30%, transparent)}}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab, red, red)){.bg-black\/50{background-color:color-mix(in oklab, var(--color-black) 50%, transparent)}}.bg-border{background-color:var(--color-border)}.bg-card{background-color:var(--color-card)}.bg-cream{background-color:var(--color-cream)}.bg-destructive\/10{background-color:var(--color-destructive)}@supports (color:color-mix(in lab, red, red)){.bg-destructive\/10{background-color:color-mix(in oklab, var(--color-destructive) 10%, transparent)}}.bg-emerald-100{background-color:var(--color-emerald-100)}.bg-fawn\/35{background-color:#d4cab859}@supports (color:color-mix(in lab, red, red)){.bg-fawn\/35{background-color:color-mix(in oklab, var(--color-fawn) 35%, transparent)}}.bg-frost{background-color:var(--color-frost)}.bg-frost\/40{background-color:#e8e2d866}@supports (color:color-mix(in lab, red, red)){.bg-frost\/40{background-color:color-mix(in oklab, var(--color-frost) 40%, transparent)}}.bg-ivory{background-color:var(--color-ivory)}.bg-mocha-light\/60{background-color:#9e8e7e99}@supports (color:color-mix(in lab, red, red)){.bg-mocha-light\/60{background-color:color-mix(in oklab, var(--color-mocha-light) 60%, transparent)}}.bg-muted,.bg-muted\/30{background-color:var(--color-muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/30{background-color:color-mix(in oklab, var(--color-muted) 30%, transparent)}}.bg-muted\/50{background-color:var(--color-muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/50{background-color:color-mix(in oklab, var(--color-muted) 50%, transparent)}}.bg-popover{background-color:var(--color-popover)}.bg-primary{background-color:var(--color-primary)}.bg-primary-foreground{background-color:var(--color-primary-foreground)}.bg-rose-50{background-color:var(--color-rose-50)}.bg-rose-100{background-color:var(--color-rose-100)}.bg-sapphire{background-color:var(--color-sapphire)}.bg-sapphire-glow{background-color:var(--color-sapphire-glow)}.bg-sapphire-glow\/80{background-color:#4a7c9b19}@supports (color:color-mix(in lab, red, red)){.bg-sapphire-glow\/80{background-color:color-mix(in oklab, var(--color-sapphire-glow) 80%, transparent)}}.bg-secondary{background-color:var(--color-secondary)}.bg-snow{background-color:var(--color-snow)}.bg-transparent{background-color:#0000}.bg-clip-padding{background-clip:padding-box}.object-cover{object-fit:cover}.p-1{padding:var(--spacing)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.p-\[3px\]{padding:3px}.px-0{padding-inline:0}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-12{padding-block:calc(var(--spacing) * 12)}.pt-1{padding-top:var(--spacing)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pr-14{padding-right:calc(var(--spacing) * 14)}.pb-0\.5{padding-bottom:calc(var(--spacing) * .5)}.pb-12{padding-bottom:calc(var(--spacing) * 12)}.pl-1\.5{padding-left:calc(var(--spacing) * 1.5)}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-2\.5{padding-left:calc(var(--spacing) * 2.5)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-5{padding-left:calc(var(--spacing) * 5)}.pl-6{padding-left:calc(var(--spacing) * 6)}.text-center{text-align:center}.text-left{text-align:left}.align-\[-1px\]{vertical-align:-1px}.align-middle{vertical-align:middle}.align-top{vertical-align:top}.font-body{font-family:var(--font-body)}.font-display{font-family:var(--font-display)}.font-heading{font-family:var(--font-heading)}.font-mono{font-family:var(--font-mono)}.font-serif{font-family:var(--font-serif)}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[0\.7em\]{font-size:.7em}.text-\[0\.8em\]{font-size:.8em}.text-\[0\.8rem\]{font-size:.8rem}.text-\[0\.9em\]{font-size:.9em}.text-\[0\.72em\]{font-size:.72em}.text-\[0\.75em\]{font-size:.75em}.text-\[0\.78em\]{font-size:.78em}.text-\[0\.82em\]{font-size:.82em}.text-\[0\.84em\]{font-size:.84em}.text-\[0\.85em\]{font-size:.85em}.text-\[0\.86em\]{font-size:.86em}.text-\[0\.88em\]{font-size:.88em}.text-\[0\.92em\]{font-size:.92em}.text-\[0\.93em\]{font-size:.93em}.text-\[0\.95em\]{font-size:.95em}.text-\[1\.2rem\]{font-size:1.2rem}.text-\[1\.35rem\]{font-size:1.35rem}.text-\[1em\]{font-size:1em}.text-\[2rem\]{font-size:2rem}.text-\[10px\]{font-size:10px}.leading-\[1\.4\]{--tw-leading:1.4;line-height:1.4}.leading-\[1\.5\]{--tw-leading:1.5;line-height:1.5}.leading-\[1\.45\]{--tw-leading:1.45;line-height:1.45}.leading-\[1\.55\]{--tw-leading:1.55;line-height:1.55}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[-0\.02em\]{--tw-tracking:-.02em;letter-spacing:-.02em}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-\[\#3b7a3b\]{color:#3b7a3b}.text-\[\#7C2D2D\]{color:#7c2d2d}.text-\[\#7a4e2a\]{color:#7a4e2a}.text-\[\#9B3D3D\]{color:#9b3d3d}.text-amber-700{color:var(--color-amber-700)}.text-amber-800{color:var(--color-amber-800)}.text-amber-900{color:var(--color-amber-900)}.text-card-foreground{color:var(--color-card-foreground)}.text-charcoal{color:var(--color-charcoal)}.text-chocolate{color:var(--color-chocolate)}.text-current{color:currentColor}.text-destructive{color:var(--color-destructive)}.text-emerald-700{color:var(--color-emerald-700)}.text-emerald-800{color:var(--color-emerald-800)}.text-fawn{color:var(--color-fawn)}.text-foreground,.text-foreground\/60{color:var(--color-foreground)}@supports (color:color-mix(in lab, red, red)){.text-foreground\/60{color:color-mix(in oklab, var(--color-foreground) 60%, transparent)}}.text-mocha{color:var(--color-mocha)}.text-mocha-light{color:var(--color-mocha-light)}.text-mocha-light\/40{color:#9e8e7e66}@supports (color:color-mix(in lab, red, red)){.text-mocha-light\/40{color:color-mix(in oklab, var(--color-mocha-light) 40%, transparent)}}.text-muted-foreground{color:var(--color-muted-foreground)}.text-popover-foreground{color:var(--color-popover-foreground)}.text-primary{color:var(--color-primary)}.text-primary-foreground{color:var(--color-primary-foreground)}.text-rose-700{color:var(--color-rose-700)}.text-rose-800{color:var(--color-rose-800)}.text-rose-900{color:var(--color-rose-900)}.text-rose-baziu{color:var(--color-rose-baziu)}.text-sapphire{color:var(--color-sapphire)}.text-sapphire-deep{color:var(--color-sapphire-deep)}.text-secondary-foreground{color:var(--color-secondary-foreground)}.text-snow{color:var(--color-snow)}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.italic{font-style:italic}.not-italic{font-style:normal}.no-underline{text-decoration-line:none}.underline{text-decoration-line:underline}.underline-offset-4{text-underline-offset:4px}.opacity-0{opacity:0}.opacity-40{opacity:.4}.opacity-45{opacity:.45}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-65{opacity:.65}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.opacity-90{opacity:.9}.shadow-baziu-md{--tw-shadow:0 4px 12px var(--tw-shadow-color,#2a1f1614);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-baziu-sm{--tw-shadow:0 1px 3px var(--tw-shadow-color,#2a1f160f);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-foreground\/10{--tw-ring-color:var(--color-foreground)}@supports (color:color-mix(in lab, red, red)){.ring-foreground\/10{--tw-ring-color:color-mix(in oklab, var(--color-foreground) 10%, transparent)}}.outline-hidden{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.outline-hidden{outline-offset:2px;outline:2px solid #0000}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.backdrop-blur-\[1px\]{--tw-backdrop-blur:blur(1px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-none{transition-property:none}.duration-100{--tw-duration:.1s;transition-duration:.1s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.outline-none{--tw-outline-style:none;outline-style:none}.select-all{-webkit-user-select:all;user-select:all}.select-none{-webkit-user-select:none;user-select:none}.running{animation-play-state:running}.group-open\/details\:rotate-90:is(:where(.group\/details):is([open],:popover-open,:open) *){rotate:90deg}.group-focus-within\:opacity-100:is(:where(.group):focus-within *){opacity:1}@media (hover:hover){.group-hover\:scale-\[1\.08\]:is(:where(.group):hover *){scale:1.08}.group-hover\:rotate-\[-8deg\]:is(:where(.group):hover *){rotate:-8deg}.group-hover\:opacity-100:is(:where(.group):hover *),.group-hover\/row\:opacity-100:is(:where(.group\/row):hover *){opacity:1}}.group-has-disabled\/field\:opacity-50:is(:where(.group\/field):has(:disabled) *){opacity:.5}.group-data-\[disabled\=true\]\:pointer-events-none:is(:where(.group)[data-disabled=true] *){pointer-events:none}.group-data-\[disabled\=true\]\:opacity-50:is(:where(.group)[data-disabled=true] *){opacity:.5}.group-data-\[size\=sm\]\/card\:p-3:is(:where(.group\/card)[data-size=sm] *){padding:calc(var(--spacing) * 3)}.group-data-\[size\=sm\]\/card\:px-3:is(:where(.group\/card)[data-size=sm] *){padding-inline:calc(var(--spacing) * 3)}.group-data-\[size\=sm\]\/card\:text-sm:is(:where(.group\/card)[data-size=sm] *){font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.group-data-\[variant\=line\]\/tabs-list\:bg-transparent:is(:where(.group\/tabs-list)[data-variant=line] *){background-color:#0000}.group-data-horizontal\/tabs\:h-8:is(:where(.group\/tabs):where([data-orientation=horizontal]) *){height:calc(var(--spacing) * 8)}.group-data-vertical\/tabs\:h-fit:is(:where(.group\/tabs):where([data-orientation=vertical]) *){height:fit-content}.group-data-vertical\/tabs\:w-full:is(:where(.group\/tabs):where([data-orientation=vertical]) *){width:100%}.group-data-vertical\/tabs\:flex-col:is(:where(.group\/tabs):where([data-orientation=vertical]) *){flex-direction:column}.group-data-vertical\/tabs\:justify-start:is(:where(.group\/tabs):where([data-orientation=vertical]) *){justify-content:flex-start}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-50:is(:where(.peer):disabled~*){opacity:.5}.file\:inline-flex::file-selector-button{display:inline-flex}.file\:h-6::file-selector-button{height:calc(var(--spacing) * 6)}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\:text-foreground::file-selector-button{color:var(--color-foreground)}.placeholder\:text-muted-foreground::placeholder{color:var(--color-muted-foreground)}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:-inset-x-3:after{content:var(--tw-content);inset-inline:calc(var(--spacing) * -3)}.after\:-inset-y-2:after{content:var(--tw-content);inset-block:calc(var(--spacing) * -2)}.after\:bg-foreground:after{content:var(--tw-content);background-color:var(--color-foreground)}.after\:opacity-0:after{content:var(--tw-content);opacity:0}.after\:transition-opacity:after{content:var(--tw-content);transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.group-data-horizontal\/tabs\:after\:inset-x-0:is(:where(.group\/tabs):where([data-orientation=horizontal]) *):after{content:var(--tw-content);inset-inline:0}.group-data-horizontal\/tabs\:after\:bottom-\[-5px\]:is(:where(.group\/tabs):where([data-orientation=horizontal]) *):after{content:var(--tw-content);bottom:-5px}.group-data-horizontal\/tabs\:after\:h-0\.5:is(:where(.group\/tabs):where([data-orientation=horizontal]) *):after{content:var(--tw-content);height:calc(var(--spacing) * .5)}.group-data-vertical\/tabs\:after\:inset-y-0:is(:where(.group\/tabs):where([data-orientation=vertical]) *):after{content:var(--tw-content);inset-block:0}.group-data-vertical\/tabs\:after\:-right-1:is(:where(.group\/tabs):where([data-orientation=vertical]) *):after{content:var(--tw-content);right:calc(var(--spacing) * -1)}.group-data-vertical\/tabs\:after\:w-0\.5:is(:where(.group\/tabs):where([data-orientation=vertical]) *):after{content:var(--tw-content);width:calc(var(--spacing) * .5)}.first\:border-t-0:first-child{border-top-style:var(--tw-border-style);border-top-width:0}.first\:pt-0:first-child{padding-top:0}.last\:mb-0:last-child{margin-bottom:0}.last\:border-0:last-child{border-style:var(--tw-border-style);border-width:0}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.focus-within\:opacity-100:focus-within{opacity:1}@media (hover:hover){.hover\:border-\[\#bcd9bc\]:hover{border-color:#bcd9bc}.hover\:border-foreground\/30:hover{border-color:var(--color-foreground)}@supports (color:color-mix(in lab, red, red)){.hover\:border-foreground\/30:hover{border-color:color-mix(in oklab, var(--color-foreground) 30%, transparent)}}.hover\:border-frost:hover{border-color:var(--color-frost)}.hover\:border-primary:hover{border-color:var(--color-primary)}.hover\:border-sapphire:hover{border-color:var(--color-sapphire)}.hover\:border-sapphire-light:hover{border-color:var(--color-sapphire-light)}.hover\:bg-\[\#eef7ee\]:hover{background-color:#eef7ee}.hover\:bg-\[rgba\(196\,135\,138\,0\.08\)\]:hover{background-color:#c4878a14}.hover\:bg-accent:hover,.hover\:bg-accent\/30:hover{background-color:var(--color-accent)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-accent\/30:hover{background-color:color-mix(in oklab, var(--color-accent) 30%, transparent)}}.hover\:bg-destructive\/20:hover{background-color:var(--color-destructive)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-destructive\/20:hover{background-color:color-mix(in oklab, var(--color-destructive) 20%, transparent)}}.hover\:bg-muted:hover,.hover\:bg-muted\/50:hover{background-color:var(--color-muted)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-muted\/50:hover{background-color:color-mix(in oklab, var(--color-muted) 50%, transparent)}}.hover\:bg-rose-50:hover{background-color:var(--color-rose-50)}.hover\:bg-sapphire-deep:hover{background-color:var(--color-sapphire-deep)}.hover\:bg-sapphire-glow:hover{background-color:var(--color-sapphire-glow)}.hover\:bg-secondary\/80:hover{background-color:var(--color-secondary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab, var(--color-secondary) 80%, transparent)}}.hover\:bg-snow:hover{background-color:var(--color-snow)}.hover\:text-\[\#3b7a3b\]:hover{color:#3b7a3b}.hover\:text-\[\#9B3D3D\]:hover{color:#9b3d3d}.hover\:text-foreground:hover{color:var(--color-foreground)}.hover\:text-mocha:hover{color:var(--color-mocha)}.hover\:text-sapphire:hover{color:var(--color-sapphire)}.hover\:text-sapphire-deep:hover{color:var(--color-sapphire-deep)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-90:hover{opacity:.9}.hover\:opacity-100:hover{opacity:1}}.focus\:border-sapphire:focus{border-color:var(--color-sapphire)}.focus\:bg-accent:focus{background-color:var(--color-accent)}.focus\:text-accent-foreground:focus{color:var(--color-accent-foreground)}.focus\:shadow-\[0_0_0_3px_var\(--color-sapphire-glow\)\]:focus{--tw-shadow:0 0 0 3px var(--tw-shadow-color,var(--color-sapphire-glow));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-ring\/30:focus{--tw-ring-color:var(--color-ring)}@supports (color:color-mix(in lab, red, red)){.focus\:ring-ring\/30:focus{--tw-ring-color:color-mix(in oklab, var(--color-ring) 30%, transparent)}}:is(.not-data-\[variant\=destructive\]\:focus\:\*\*\:text-accent-foreground:not([data-variant=destructive]):focus *){color:var(--color-accent-foreground)}.focus-visible\:border-destructive\/40:focus-visible{border-color:var(--color-destructive)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:border-destructive\/40:focus-visible{border-color:color-mix(in oklab, var(--color-destructive) 40%, transparent)}}.focus-visible\:border-ring:focus-visible{border-color:var(--color-ring)}.focus-visible\:ring-3:focus-visible,.focus-visible\:ring-\[3px\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:var(--color-destructive)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-destructive) 20%, transparent)}}.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:var(--color-ring)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-ring) 50%, transparent)}}.focus-visible\:outline-1:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.focus-visible\:outline-ring:focus-visible{outline-color:var(--color-ring)}.active\:not-aria-\[haspopup\]\:translate-y-px:active:not([aria-haspopup]){--tw-translate-y:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:bg-input\/50:disabled{background-color:var(--color-input)}@supports (color:color-mix(in lab, red, red)){.disabled\:bg-input\/50:disabled{background-color:color-mix(in oklab, var(--color-input) 50%, transparent)}}.disabled\:opacity-50:disabled{opacity:.5}@media (hover:hover){.disabled\:hover\:bg-transparent:disabled:hover{background-color:#0000}}:where([data-slot=button-group]) .in-data-\[slot\=button-group\]\:rounded-lg{border-radius:var(--radius-lg)}.has-aria-expanded\:bg-muted\/50:has([aria-expanded=true]){background-color:var(--color-muted)}@supports (color:color-mix(in lab, red, red)){.has-aria-expanded\:bg-muted\/50:has([aria-expanded=true]){background-color:color-mix(in oklab, var(--color-muted) 50%, transparent)}}.has-data-\[icon\=inline-end\]\:pr-1:has([data-icon=inline-end]){padding-right:var(--spacing)}.has-data-\[icon\=inline-end\]\:pr-1\.5:has([data-icon=inline-end]){padding-right:calc(var(--spacing) * 1.5)}.has-data-\[icon\=inline-end\]\:pr-2:has([data-icon=inline-end]){padding-right:calc(var(--spacing) * 2)}.has-data-\[icon\=inline-start\]\:pl-1:has([data-icon=inline-start]){padding-left:var(--spacing)}.has-data-\[icon\=inline-start\]\:pl-1\.5:has([data-icon=inline-start]){padding-left:calc(var(--spacing) * 1.5)}.has-data-\[icon\=inline-start\]\:pl-2:has([data-icon=inline-start]){padding-left:calc(var(--spacing) * 2)}.has-data-\[slot\=card-action\]\:grid-cols-\[1fr_auto\]:has([data-slot=card-action]){grid-template-columns:1fr auto}.has-data-\[slot\=card-description\]\:grid-rows-\[auto_auto\]:has([data-slot=card-description]){grid-template-rows:auto auto}.has-data-\[slot\=card-footer\]\:pb-0:has([data-slot=card-footer]){padding-bottom:0}.has-\[\>img\:first-child\]\:pt-0:has(>img:first-child){padding-top:0}.aria-expanded\:bg-muted[aria-expanded=true]{background-color:var(--color-muted)}.aria-expanded\:bg-secondary[aria-expanded=true]{background-color:var(--color-secondary)}.aria-expanded\:text-foreground[aria-expanded=true]{color:var(--color-foreground)}.aria-expanded\:text-secondary-foreground[aria-expanded=true]{color:var(--color-secondary-foreground)}.aria-invalid\:border-destructive[aria-invalid=true]{border-color:var(--color-destructive)}.aria-invalid\:ring-3[aria-invalid=true]{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:var(--color-destructive)}@supports (color:color-mix(in lab, red, red)){.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--color-destructive) 20%, transparent)}}.aria-invalid\:aria-checked\:border-primary[aria-invalid=true][aria-checked=true]{border-color:var(--color-primary)}.data-placeholder\:text-muted-foreground[data-placeholder]{color:var(--color-muted-foreground)}.data-\[align-trigger\=true\]\:animate-none[data-align-trigger=true]{animation:none}.data-\[position\=popper\]\:h-\(--radix-select-trigger-height\)[data-position=popper]{height:var(--radix-select-trigger-height)}.data-\[position\=popper\]\:w-full[data-position=popper]{width:100%}.data-\[position\=popper\]\:min-w-\(--radix-select-trigger-width\)[data-position=popper]{min-width:var(--radix-select-trigger-width)}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:calc(2*var(--spacing)*-1)}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:calc(2*var(--spacing))}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x:var(--spacing);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:calc(2*var(--spacing)*-1)}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y:calc(var(--spacing) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:calc(2*var(--spacing))}.data-\[size\=default\]\:h-8[data-size=default]{height:calc(var(--spacing) * 8)}.data-\[size\=sm\]\:h-7[data-size=sm]{height:calc(var(--spacing) * 7)}.data-\[size\=sm\]\:gap-3[data-size=sm]{gap:calc(var(--spacing) * 3)}.data-\[size\=sm\]\:rounded-\[min\(var\(--radius-md\)\,10px\)\][data-size=sm]{border-radius:min(var(--radius-md), 10px)}.data-\[size\=sm\]\:py-3[data-size=sm]{padding-block:calc(var(--spacing) * 3)}.data-\[size\=sm\]\:has-data-\[slot\=card-footer\]\:pb-0[data-size=sm]:has([data-slot=card-footer]){padding-bottom:0}:is(.\*\:data-\[slot\=select-value\]\:line-clamp-1>*)[data-slot=select-value]{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}:is(.\*\:data-\[slot\=select-value\]\:flex>*)[data-slot=select-value]{display:flex}:is(.\*\:data-\[slot\=select-value\]\:items-center>*)[data-slot=select-value]{align-items:center}:is(.\*\:data-\[slot\=select-value\]\:gap-1\.5>*)[data-slot=select-value]{gap:calc(var(--spacing) * 1.5)}.data-\[state\=selected\]\:bg-muted[data-state=selected]{background-color:var(--color-muted)}.data-\[variant\=line\]\:rounded-none[data-variant=line]{border-radius:0}@supports ((-webkit-backdrop-filter:var(--tw)) or (backdrop-filter:var(--tw))){.supports-backdrop-filter\:backdrop-blur-xs{--tw-backdrop-blur:blur(var(--blur-xs));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}}@media (width>=40rem){.sm\:max-w-sm{max-width:var(--container-sm)}.sm\:grid-cols-\[16rem_minmax\(0\,1fr\)\]{grid-template-columns:16rem minmax(0,1fr)}.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}}@media (width>=48rem){.md\:grid-cols-\[360px_1fr\]{grid-template-columns:360px 1fr}.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}@media (width>=64rem){.lg\:grid-cols-\[320px_1fr\]{grid-template-columns:320px 1fr}}.dark\:border-input:is(.dark *){border-color:var(--color-input)}.dark\:bg-destructive\/20:is(.dark *){background-color:var(--color-destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-destructive\/20:is(.dark *){background-color:color-mix(in oklab, var(--color-destructive) 20%, transparent)}}.dark\:bg-input\/30:is(.dark *){background-color:var(--color-input)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-input\/30:is(.dark *){background-color:color-mix(in oklab, var(--color-input) 30%, transparent)}}.dark\:text-muted-foreground:is(.dark *){color:var(--color-muted-foreground)}@media (hover:hover){.dark\:hover\:bg-destructive\/30:is(.dark *):hover{background-color:var(--color-destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-destructive\/30:is(.dark *):hover{background-color:color-mix(in oklab, var(--color-destructive) 30%, transparent)}}.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:var(--color-input)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:color-mix(in oklab, var(--color-input) 50%, transparent)}}.dark\:hover\:bg-muted\/50:is(.dark *):hover{background-color:var(--color-muted)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-muted\/50:is(.dark *):hover{background-color:color-mix(in oklab, var(--color-muted) 50%, transparent)}}.dark\:hover\:text-foreground:is(.dark *):hover{color:var(--color-foreground)}}.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:var(--color-destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-destructive) 40%, transparent)}}.dark\:disabled\:bg-input\/80:is(.dark *):disabled{background-color:var(--color-input)}@supports (color:color-mix(in lab, red, red)){.dark\:disabled\:bg-input\/80:is(.dark *):disabled{background-color:color-mix(in oklab, var(--color-input) 80%, transparent)}}.dark\:aria-invalid\:border-destructive\/50:is(.dark *)[aria-invalid=true]{border-color:var(--color-destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:aria-invalid\:border-destructive\/50:is(.dark *)[aria-invalid=true]{border-color:color-mix(in oklab, var(--color-destructive) 50%, transparent)}}.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:var(--color-destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--color-destructive) 40%, transparent)}}.data-open\:animate-in:where([data-state=open]),.data-open\:animate-in:where([data-open]:not([data-open=false])){animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-open\:fade-in-0:where([data-state=open]),.data-open\:fade-in-0:where([data-open]:not([data-open=false])){--tw-enter-opacity:0}.data-open\:zoom-in-95:where([data-state=open]),.data-open\:zoom-in-95:where([data-open]:not([data-open=false])){--tw-enter-scale:.95}.data-closed\:animate-out:where([data-state=closed]),.data-closed\:animate-out:where([data-closed]:not([data-closed=false])){animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-closed\:fade-out-0:where([data-state=closed]),.data-closed\:fade-out-0:where([data-closed]:not([data-closed=false])){--tw-exit-opacity:0}.data-closed\:zoom-out-95:where([data-state=closed]),.data-closed\:zoom-out-95:where([data-closed]:not([data-closed=false])){--tw-exit-scale:.95}.data-checked\:border-primary:where([data-state=checked]),.data-checked\:border-primary:where([data-checked]:not([data-checked=false])){border-color:var(--color-primary)}.data-checked\:bg-primary:where([data-state=checked]),.data-checked\:bg-primary:where([data-checked]:not([data-checked=false])){background-color:var(--color-primary)}.data-checked\:text-primary-foreground:where([data-state=checked]),.data-checked\:text-primary-foreground:where([data-checked]:not([data-checked=false])){color:var(--color-primary-foreground)}.dark\:data-checked\:bg-primary:is(.dark *):where([data-state=checked]),.dark\:data-checked\:bg-primary:is(.dark *):where([data-checked]:not([data-checked=false])){background-color:var(--color-primary)}.data-disabled\:pointer-events-none:where([data-disabled=true]),.data-disabled\:pointer-events-none:where([data-disabled]:not([data-disabled=false])){pointer-events:none}.data-disabled\:opacity-50:where([data-disabled=true]),.data-disabled\:opacity-50:where([data-disabled]:not([data-disabled=false])){opacity:.5}.data-active\:bg-background:where([data-state=active]),.data-active\:bg-background:where([data-active]:not([data-active=false])){background-color:var(--color-background)}.data-active\:text-foreground:where([data-state=active]),.data-active\:text-foreground:where([data-active]:not([data-active=false])){color:var(--color-foreground)}.group-data-\[variant\=default\]\/tabs-list\:data-active\:shadow-sm:is(:where(.group\/tabs-list)[data-variant=default] *):where([data-state=active]),.group-data-\[variant\=default\]\/tabs-list\:data-active\:shadow-sm:is(:where(.group\/tabs-list)[data-variant=default] *):where([data-active]:not([data-active=false])){--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.group-data-\[variant\=line\]\/tabs-list\:data-active\:bg-transparent:is(:where(.group\/tabs-list)[data-variant=line] *):where([data-state=active]),.group-data-\[variant\=line\]\/tabs-list\:data-active\:bg-transparent:is(:where(.group\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false])){background-color:#0000}.group-data-\[variant\=line\]\/tabs-list\:data-active\:shadow-none:is(:where(.group\/tabs-list)[data-variant=line] *):where([data-state=active]),.group-data-\[variant\=line\]\/tabs-list\:data-active\:shadow-none:is(:where(.group\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false])){--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}:is(.group-data-\[variant\=line\]\/tabs-list\:data-active\:after\:opacity-100:is(:where(.group\/tabs-list)[data-variant=line] *):where([data-state=active]),.group-data-\[variant\=line\]\/tabs-list\:data-active\:after\:opacity-100:is(:where(.group\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false]))):after{content:var(--tw-content);opacity:1}.dark\:data-active\:border-input:is(.dark *):where([data-state=active]),.dark\:data-active\:border-input:is(.dark *):where([data-active]:not([data-active=false])){border-color:var(--color-input)}.dark\:data-active\:bg-input\/30:is(.dark *):where([data-state=active]),.dark\:data-active\:bg-input\/30:is(.dark *):where([data-active]:not([data-active=false])){background-color:var(--color-input)}@supports (color:color-mix(in lab, red, red)){.dark\:data-active\:bg-input\/30:is(.dark *):where([data-state=active]),.dark\:data-active\:bg-input\/30:is(.dark *):where([data-active]:not([data-active=false])){background-color:color-mix(in oklab, var(--color-input) 30%, transparent)}}.dark\:data-active\:text-foreground:is(.dark *):where([data-state=active]),.dark\:data-active\:text-foreground:is(.dark *):where([data-active]:not([data-active=false])){color:var(--color-foreground)}.dark\:group-data-\[variant\=line\]\/tabs-list\:data-active\:border-transparent:is(.dark *):is(:where(.group\/tabs-list)[data-variant=line] *):where([data-state=active]),.dark\:group-data-\[variant\=line\]\/tabs-list\:data-active\:border-transparent:is(.dark *):is(:where(.group\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false])){border-color:#0000}.dark\:group-data-\[variant\=line\]\/tabs-list\:data-active\:bg-transparent:is(.dark *):is(:where(.group\/tabs-list)[data-variant=line] *):where([data-state=active]),.dark\:group-data-\[variant\=line\]\/tabs-list\:data-active\:bg-transparent:is(.dark *):is(:where(.group\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false])){background-color:#0000}.data-horizontal\:h-px:where([data-orientation=horizontal]){height:1px}.data-horizontal\:w-full:where([data-orientation=horizontal]){width:100%}.data-horizontal\:flex-col:where([data-orientation=horizontal]){flex-direction:column}.data-vertical\:w-px:where([data-orientation=vertical]){width:1px}.data-vertical\:self-stretch:where([data-orientation=vertical]){align-self:stretch}.\[\&_\.bubble-content\]\:line-through .bubble-content{text-decoration-line:line-through}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-3 svg:not([class*=size-]){width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-3\.5 svg:not([class*=size-]){width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&_tr\]\:border-b tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-style:var(--tw-border-style);border-width:0}.\[\&\:\:-webkit-details-marker\]\:hidden::-webkit-details-marker{display:none}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:0}.\[\.border-b\]\:pb-4.border-b{padding-bottom:calc(var(--spacing) * 4)}.group-data-\[size\=sm\]\/card\:\[\.border-b\]\:pb-3:is(:where(.group\/card)[data-size=sm] *).border-b{padding-bottom:calc(var(--spacing) * 3)}:is(.\*\:\[a\]\:underline>*):is(a){text-decoration-line:underline}:is(.\*\:\[a\]\:underline-offset-3>*):is(a){text-underline-offset:3px}@media (hover:hover){.\[a\]\:hover\:bg-primary\/80:is(a):hover{background-color:var(--color-primary)}@supports (color:color-mix(in lab, red, red)){.\[a\]\:hover\:bg-primary\/80:is(a):hover{background-color:color-mix(in oklab, var(--color-primary) 80%, transparent)}}:is(.\*\:\[a\]\:hover\:text-foreground>*):is(a):hover{color:var(--color-foreground)}}:is(.\*\:\[img\:first-child\]\:rounded-t-xl>*):is(img:first-child){border-top-left-radius:var(--radius-xl);border-top-right-radius:var(--radius-xl)}:is(.\*\:\[img\:last-child\]\:rounded-b-xl>*):is(img:last-child){border-bottom-right-radius:var(--radius-xl);border-bottom-left-radius:var(--radius-xl)}:is(.\*\:\[span\]\:last\:flex>*):is(span):last-child{display:flex}:is(.\*\:\[span\]\:last\:items-center>*):is(span):last-child{align-items:center}:is(.\*\:\[span\]\:last\:gap-2>*):is(span):last-child{gap:calc(var(--spacing) * 2)}.\[\&\>svg\]\:size-3\.5>svg{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.\[\&\>tr\]\:last\:border-b-0>tr:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}}@property --tw-animation-delay{syntax:"*";inherits:false;initial-value:0s}@property --tw-animation-direction{syntax:"*";inherits:false;initial-value:normal}@property --tw-animation-duration{syntax:"*";inherits:false}@property --tw-animation-fill-mode{syntax:"*";inherits:false;initial-value:none}@property --tw-animation-iteration-count{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-translate-y{syntax:"*";inherits:false;initial-value:0}:root{--background:#f5f0e8;--foreground:#3d2b1f;--card:#fff;--card-foreground:#3d2b1f;--popover:#fff;--popover-foreground:#3d2b1f;--primary:#4a7c9b;--primary-foreground:#fff;--secondary:#faf8f4;--secondary-foreground:#3d2b1f;--muted:#faf8f4;--muted-foreground:#9e8e7e;--accent:#4a7c9b1f;--accent-foreground:#3a6580;--destructive:#9b3d3d;--border:#e8e2d8;--input:#e8e2d8;--ring:#4a7c9b;--chart-1:#4a7c9b;--chart-2:#c4878a;--chart-3:#7a6555;--chart-4:#d4cab8;--chart-5:#6ba3c2;--radius:16px;--sidebar:#faf8f4;--sidebar-foreground:#3d2b1f;--sidebar-primary:#4a7c9b;--sidebar-primary-foreground:#fff;--sidebar-accent:#4a7c9b1f;--sidebar-accent-foreground:#3a6580;--sidebar-border:#e8e2d8;--sidebar-ring:#4a7c9b}:root.dark{--color-cream:#1a140f;--color-ivory:#211a13;--color-frost:#3b2e24;--color-fawn:#5c4a3d;--color-chocolate:#f5f0e8;--color-charcoal:#faf8f4;--color-mocha:#c4b3a0;--color-mocha-light:#a89789;--color-sapphire:#7bb4d2;--color-sapphire-deep:#5e9bba;--color-sapphire-light:#a0cee3;--color-sapphire-glow:#7bb4d22e;--color-rose-baziu:#d89a9d;--color-snow:#2a211a;--shadow-baziu-sm:0 1px 3px #0006;--shadow-baziu-md:0 4px 12px #00000080;--shadow-baziu-lg:0 8px 30px #0009;--background:#1a140f;--foreground:#f5f0e8;--card:#2a211a;--card-foreground:#f5f0e8;--popover:#2a211a;--popover-foreground:#f5f0e8;--primary:#7bb4d2;--primary-foreground:#0f0a07;--secondary:#211a13;--secondary-foreground:#f5f0e8;--muted:#211a13;--muted-foreground:#a89789;--accent:#7bb4d22e;--accent-foreground:#a0cee3;--destructive:#d87878;--border:#3b2e24;--input:#3b2e24;--ring:#7bb4d2;--chart-1:#7bb4d2;--chart-2:#d89a9d;--chart-3:#c4b3a0;--chart-4:#5c4a3d;--chart-5:#a0cee3;--sidebar:#1f1812;--sidebar-foreground:#f5f0e8;--sidebar-primary:#7bb4d2;--sidebar-primary-foreground:#0f0a07;--sidebar-accent:#7bb4d22e;--sidebar-accent-foreground:#a0cee3;--sidebar-border:#3b2e24;--sidebar-ring:#7bb4d2}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@keyframes pulse{50%{opacity:.5}}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0));filter:blur(var(--tw-enter-blur,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0));filter:blur(var(--tw-exit-blur,0))}}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as e,t}from"./jsx-runtime-DGeXAQPT.js";import{Q as n,u as r}from"./preload-helper-CvnapA2_.js";import{r as i}from"./index-MAJuXnie.js";import{t as a}from"./ConfigTabs-pY-V0Rie.js";import{t as o}from"./Button-ByiV6fpd.js";var s=e(n()),c=t();function l(){let e=i.useLoaderData(),t=r(),[n,l]=(0,s.useState)(``),[h,g]=(0,s.useState)(e.chatId),[_,v]=(0,s.useState)(!1),[y,b]=(0,s.useState)(null),[x,S]=(0,s.useState)(!1),[C,w]=(0,s.useState)(null),[T,E]=(0,s.useState)(!1);async function D(e){e.preventDefault(),v(!0),b(null),S(!1);try{let e=await fetch(`/api/config/telegram`,{method:`PUT`,headers:{"content-type":`application/json`},body:JSON.stringify({botToken:n,chatId:h})});if(!e.ok){let t=await e.json().catch(()=>({}));throw Error(t.error??`${e.status} ${e.statusText}`)}l(``),S(!0),await t.invalidate()}catch(e){b(e.message)}finally{v(!1)}}async function O(){if(confirm(`Clear the saved Telegram credentials?`))try{await fetch(`/api/config/telegram`,{method:`DELETE`}),l(``),g(``),w(null),S(!1),b(null),await t.invalidate()}catch(e){b(e.message)}}async function k(){E(!0),w(null);try{w(await(await fetch(`/api/config/telegram/health`)).json())}catch(e){w({configured:!0,preflight:null,error:{step:`getMe`,message:e.message},polling:null})}finally{E(!1)}}return(0,c.jsxs)(`main`,{className:`mx-auto max-w-3xl px-6 py-8`,children:[(0,c.jsx)(`h1`,{className:`font-serif text-3xl text-foreground mb-2`,children:`config`}),(0,c.jsx)(a,{active:`integrations`}),(0,c.jsxs)(`header`,{className:`mb-6`,children:[(0,c.jsx)(`h2`,{className:`text-xl font-semibold`,children:`Telegram`}),(0,c.jsx)(`p`,{className:`text-muted-foreground text-sm`,children:`One forum-supergroup bot, one topic per agent. Talk to any of your agents from a phone.`})]}),(0,c.jsx)(f,{}),e.migratedChatId&&(0,c.jsx)(d,{toChatId:e.migratedChatId}),(0,c.jsxs)(`section`,{className:`rounded-lg border bg-card p-5 mb-6`,children:[(0,c.jsx)(`h3`,{className:`text-sm font-semibold uppercase tracking-wide text-muted-foreground mb-3`,children:`Credentials`}),e.configured&&(0,c.jsxs)(`p`,{className:`text-xs text-emerald-700 mb-3`,children:[`✓ Stored: `,(0,c.jsx)(`code`,{className:`font-mono`,children:e.botTokenPreview}),` `,e.chatId&&(0,c.jsxs)(c.Fragment,{children:[`· chat `,(0,c.jsx)(`code`,{className:`font-mono`,children:e.chatId})]})]}),(0,c.jsxs)(`form`,{onSubmit:D,className:`space-y-3`,children:[(0,c.jsxs)(`label`,{className:`block`,children:[(0,c.jsx)(`span`,{className:`block text-sm font-medium mb-1`,children:`Bot token`}),(0,c.jsx)(`input`,{type:`password`,autoComplete:`off`,value:n,onChange:e=>l(e.target.value),placeholder:e.configured?`(leave blank to keep stored value)`:`1234567890:ABC...`,className:`w-full rounded-md border bg-background px-2 py-1.5 font-mono text-sm outline-none focus:ring-2 focus:ring-ring/30`,required:!e.configured}),(0,c.jsxs)(`p`,{className:`text-xs text-muted-foreground mt-1`,children:[`From @BotFather → /newbot. Disable Privacy Mode in `,(0,c.jsx)(`em`,{children:`Bot Settings → Group Privacy → Turn off`}),`.`]})]}),(0,c.jsxs)(`label`,{className:`block`,children:[(0,c.jsx)(`span`,{className:`block text-sm font-medium mb-1`,children:`Supergroup chat ID`}),(0,c.jsx)(`input`,{type:`text`,value:h,onChange:e=>g(e.target.value),placeholder:`-1001234567890`,className:`w-full rounded-md border bg-background px-2 py-1.5 font-mono text-sm outline-none focus:ring-2 focus:ring-ring/30`,required:!0}),(0,c.jsxs)(`p`,{className:`text-xs text-muted-foreground mt-1`,children:[`Forum-enabled supergroup the bot is admin in (with`,` `,(0,c.jsx)(`code`,{className:`font-mono`,children:`can_manage_topics`}),`).`]})]}),(0,c.jsxs)(`div`,{className:`flex items-center gap-3 pt-1`,children:[(0,c.jsx)(o,{variant:`primary`,type:`submit`,disabled:_,children:_?`saving…`:`save credentials`}),e.configured&&(0,c.jsx)(o,{variant:`danger`,onClick:O,children:`clear credentials`}),x&&(0,c.jsx)(`span`,{className:`text-xs text-emerald-700`,children:`saved ✓`}),y&&(0,c.jsxs)(`span`,{className:`text-xs text-rose-700`,children:[`error: `,y]})]})]})]}),(0,c.jsxs)(`section`,{className:`rounded-lg border bg-card p-5`,children:[(0,c.jsxs)(`div`,{className:`flex items-center justify-between mb-3`,children:[(0,c.jsx)(`h3`,{className:`text-sm font-semibold uppercase tracking-wide text-muted-foreground`,children:`Preflight checks`}),(0,c.jsx)(o,{variant:`ghost`,onClick:k,disabled:T||!e.configured,children:T?`checking…`:`run preflight`})]}),!e.configured&&(0,c.jsx)(`p`,{className:`text-xs text-muted-foreground italic`,children:`Save credentials above first.`}),e.configured&&!C&&!T&&(0,c.jsxs)(`p`,{className:`text-xs text-muted-foreground italic`,children:[`Click `,(0,c.jsx)(`em`,{children:`run preflight`}),` to validate the stored credentials against the Telegram Bot API.`]}),C&&(0,c.jsx)(m,{health:C}),C?.polling&&(0,c.jsx)(p,{polling:C.polling})]}),e.configured&&(0,c.jsx)(u,{})]})}function u(){let[e,t]=(0,s.useState)(null),[n,r]=(0,s.useState)(``),[i,a]=(0,s.useState)(``),[l,u]=(0,s.useState)(!1),[d,f]=(0,s.useState)(null);async function p(){try{let e=await fetch(`/api/config/telegram/acl`);if(!e.ok)throw Error(e.statusText);t(await e.json())}catch(e){f(e.message)}}(0,s.useEffect)(()=>{p()},[]);async function m(e){e.preventDefault();let t=Number(n);if(!Number.isInteger(t)){f(`user id must be an integer`);return}u(!0),f(null);try{let e=await fetch(`/api/config/telegram/acl`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({userId:t,label:i.trim()||null})});if(!e.ok){let t=await e.json().catch(()=>({}));throw Error(t.error??e.statusText)}r(``),a(``),await p()}catch(e){f(e.message)}finally{u(!1)}}async function h(e){f(null);try{let t=await fetch(`/api/config/telegram/acl/${e}`,{method:`DELETE`});if(!t.ok){let e=await t.json().catch(()=>({}));throw Error(e.error??t.statusText)}await p()}catch(e){f(e.message)}}return(0,c.jsxs)(`section`,{className:`rounded-lg border bg-card p-5 mt-6`,children:[(0,c.jsx)(`h3`,{className:`text-sm font-semibold uppercase tracking-wide text-muted-foreground mb-1`,children:`Access control`}),(0,c.jsxs)(`p`,{className:`text-xs text-muted-foreground mb-3`,children:[`Allowlisted Telegram users can use the bot (commands + chat). While the list is empty the bot is open and the first person to message it becomes owner. Users find their id via`,` `,(0,c.jsx)(`code`,{className:`font-mono`,children:`/whoami`}),`.`]}),e===null?(0,c.jsx)(`p`,{className:`text-xs text-muted-foreground italic`,children:`loading…`}):e.length===0?(0,c.jsx)(`p`,{className:`text-xs text-amber-700 mb-3`,children:`Open — no allowlist yet. The first user to message the bot claims owner.`}):(0,c.jsx)(`ul`,{className:`mb-3 space-y-1 text-sm`,children:e.map(e=>(0,c.jsxs)(`li`,{className:`flex items-center gap-2`,children:[(0,c.jsx)(`code`,{className:`font-mono`,children:e.userId}),(0,c.jsxs)(`span`,{className:`text-muted-foreground`,children:[e.label??(e.username?`@${e.username}`:`—`),` · `,e.role]}),e.role!==`owner`&&(0,c.jsx)(`button`,{type:`button`,onClick:()=>void h(e.userId),className:`ghost-btn text-xs text-[#9B3D3D]`,children:`remove`})]},e.userId))}),(0,c.jsxs)(`form`,{onSubmit:m,className:`flex items-center gap-2`,children:[(0,c.jsx)(`input`,{value:n,onChange:e=>r(e.target.value),placeholder:`user id`,className:`w-28 rounded-md border bg-background px-2 py-1 font-mono text-sm`}),(0,c.jsx)(`input`,{value:i,onChange:e=>a(e.target.value),placeholder:`label (optional)`,className:`w-40 rounded-md border bg-background px-2 py-1 text-sm`}),(0,c.jsx)(o,{variant:`ghost`,type:`submit`,disabled:l,children:`add`}),d&&(0,c.jsx)(`span`,{className:`text-xs text-rose-700`,children:d})]})]})}function d({toChatId:e}){let[t,n]=(0,s.useState)(!1),[r,i]=(0,s.useState)(null);async function a(){n(!0),i(null);try{let e=await fetch(`/api/config/telegram/reconnect`,{method:`POST`});if(!e.ok){let t=await e.json().catch(()=>({}));throw Error(t.error??e.statusText)}window.location.reload()}catch(e){i(e.message),n(!1)}}return(0,c.jsxs)(`div`,{className:`rounded-md border-2 border-rose-400 bg-rose-50 px-4 py-3 mb-6 text-sm`,children:[(0,c.jsx)(`div`,{className:`font-semibold text-rose-900 mb-1`,children:`Supergroup chat id changed`}),(0,c.jsxs)(`p`,{className:`text-rose-900 mb-2`,children:[`Telegram migrated this supergroup to a new chat id (`,(0,c.jsx)(`code`,{className:`font-mono`,children:e}),`). The bot is still pointed at the old id. Reconnect to repoint it and re-create the `,(0,c.jsx)(`code`,{className:`font-mono`,children:`⚙ bazilion`}),` `,`service chat in the new group. Agent topic bindings will reconcile on next use.`]}),(0,c.jsx)(o,{variant:`primary`,onClick:a,disabled:t,children:t?`reconnecting…`:`Reconnect to ${e}`}),r&&(0,c.jsx)(`span`,{className:`ml-3 text-xs text-rose-700`,children:r})]})}function f(){return(0,c.jsxs)(`div`,{className:`rounded-md border-2 border-amber-400 bg-amber-50 px-4 py-3 mb-6 text-sm`,children:[(0,c.jsx)(`div`,{className:`font-semibold text-amber-900 mb-1`,children:`Step 2 of the rollout`}),(0,c.jsxs)(`p`,{className:`text-amber-900`,children:[`The bot polls Telegram and creates the `,(0,c.jsx)(`code`,{className:`font-mono`,children:`⚙ bazilion`}),` `,`service chat on first start. Inbound messages are logged but not yet routed to agents —`,` `,`slash commands and per-agent topics ship in the next release. Outbound from agents ships after that.`]})]})}function p({polling:e}){let t=e.startedAt?new Date(e.startedAt).toISOString():null,n=e.lastSuccessfulPollAt?new Date(e.lastSuccessfulPollAt).toISOString():null;return(0,c.jsxs)(`div`,{className:`mt-4 rounded-md border bg-muted/30 px-3 py-2 text-xs space-y-1`,children:[(0,c.jsx)(`p`,{className:`font-semibold uppercase tracking-wide text-muted-foreground`,children:`Polling state`}),(0,c.jsxs)(`div`,{className:`flex flex-wrap gap-x-4 gap-y-1 font-mono`,children:[(0,c.jsx)(`span`,{className:e.running?`text-emerald-700`:`text-rose-700`,children:e.running?`running`:`stopped`}),(0,c.jsx)(`span`,{className:e.activated?`text-emerald-700`:`text-amber-700`,children:e.activated?`activated`:`awaiting activation`}),e.lastUpdateId!==null&&(0,c.jsxs)(`span`,{children:[`last update `,e.lastUpdateId]}),t&&(0,c.jsxs)(`span`,{children:[`started `,t]}),n&&(0,c.jsxs)(`span`,{children:[`last poll `,n]})]}),e.error&&(0,c.jsxs)(`p`,{className:`text-rose-700`,children:[`error: `,e.error]})]})}function m({health:e}){if(e.error)return(0,c.jsxs)(`div`,{className:`rounded-md border border-rose-300 bg-rose-50 px-3 py-2 text-sm`,children:[(0,c.jsxs)(`p`,{className:`font-semibold text-rose-900`,children:[`Failed at `,(0,c.jsx)(`code`,{className:`font-mono`,children:e.error.step})]}),(0,c.jsx)(`p`,{className:`text-rose-900 mt-1`,children:e.error.message}),g(e.error.step)]});if(!e.preflight)return(0,c.jsx)(`p`,{className:`text-xs text-muted-foreground italic`,children:`No preflight data.`});let t=e.preflight;return(0,c.jsxs)(`ul`,{className:`space-y-1.5`,children:[(0,c.jsxs)(h,{ok:t.botUsername.length>0,label:`Bot identity`,children:[`@`,t.botUsername]}),(0,c.jsx)(h,{ok:t.chatTitle.length>0,label:`Supergroup reachable`,children:t.chatTitle}),(0,c.jsx)(h,{ok:t.isForum,label:`Forum topics enabled`,children:t.isForum?`is_forum: true`:`is_forum: false — the supergroup owner must enable Topics in group settings`}),(0,c.jsx)(h,{ok:t.hasManageTopics,label:`Bot has can_manage_topics`,children:t.hasManageTopics?`admin with can_manage_topics`:`promote the bot to admin in the supergroup with the "Manage topics" permission`}),(0,c.jsx)(h,{ok:t.privacyModeOff,label:`Privacy Mode is OFF`,children:t.privacyModeOff?`can_read_all_group_messages: true`:`BotFather → /mybots → select bot → Bot Settings → Group Privacy → Turn off`})]})}function h({ok:e,label:t,children:n}){return(0,c.jsxs)(`li`,{className:`flex items-start gap-2 text-sm`,children:[(0,c.jsx)(`span`,{className:`mt-0.5 inline-flex h-4 w-4 items-center justify-center rounded-full text-[10px] font-bold leading-none ${e?`bg-emerald-100 text-emerald-800`:`bg-rose-100 text-rose-800`}`,"aria-hidden":!0,children:e?`✓`:`✕`}),(0,c.jsxs)(`div`,{children:[(0,c.jsx)(`span`,{className:`font-medium`,children:t}),(0,c.jsx)(`span`,{className:`ml-2 text-xs ${e?`text-muted-foreground`:`text-rose-800`}`,children:n})]})]})}function g(e){switch(e){case`getMe`:return(0,c.jsx)(`p`,{className:`text-xs text-rose-900 mt-1`,children:`The token is invalid or revoked. Re-issue with @BotFather → /token, or paste a fresh one above.`});case`getChat`:return(0,c.jsx)(`p`,{className:`text-xs text-rose-900 mt-1`,children:`The chat id either doesn't exist, points at a basic group (not a supergroup), or the bot isn't a member. Forward any message from the supergroup to the bot to double-check the id, then add the bot to the group.`});case`getChatMember`:return(0,c.jsx)(`p`,{className:`text-xs text-rose-900 mt-1`,children:`The bot is in the chat but the membership lookup failed. Usually means the bot was kicked or the chat id was migrated — confirm the bot is still in the supergroup.`})}}export{l as component};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as e,t}from"./jsx-runtime-DGeXAQPT.js";import{Q as n,u as r}from"./preload-helper-CvnapA2_.js";import{n as i}from"./index-MAJuXnie.js";import{t as a}from"./AgentTabs-DioGqUVR.js";var o=e(n()),s=t();function c(){let{resolved:e,triggers:t}=i.useLoaderData(),n=r();async function o(e){await fetch(`/api/triggers/${e.id}`,{method:`PATCH`,headers:{"content-type":`application/json`},body:JSON.stringify({enabled:!e.enabled})}),await n.invalidate()}async function c(e){confirm(`delete this trigger?`)&&(await fetch(`/api/triggers/${e}`,{method:`DELETE`}),await n.invalidate())}return(0,s.jsxs)(`div`,{children:[(0,s.jsx)(`header`,{className:`mb-6`,children:(0,s.jsx)(`h1`,{children:e.agent.name})}),(0,s.jsx)(a,{agentId:e.agent.id,active:`triggers`,archived:e.agent.status===`archived`}),(0,s.jsx)(l,{agentId:e.agent.id,onAdded:()=>n.invalidate()}),(0,s.jsx)(`h3`,{className:`mb-3 mt-6 font-body text-[0.85em] font-semibold uppercase tracking-wider text-mocha-light`,children:`Active triggers`}),t.length===0?(0,s.jsx)(`p`,{className:`muted`,children:`no triggers yet — add one above.`}):(0,s.jsxs)(`table`,{children:[(0,s.jsx)(`thead`,{children:(0,s.jsxs)(`tr`,{children:[(0,s.jsx)(`th`,{children:`id`}),(0,s.jsx)(`th`,{children:`kind`}),(0,s.jsx)(`th`,{children:`spec`}),(0,s.jsx)(`th`,{children:`message`}),(0,s.jsx)(`th`,{children:`last fired`}),(0,s.jsx)(`th`,{})]})}),(0,s.jsx)(`tbody`,{children:t.map(e=>{let t=e.kind===`interval`?`every ${e.intervalSec}s`:e.cronExpr,n=e.lastFiredAt?new Date(e.lastFiredAt).toLocaleString():`(never)`;return(0,s.jsxs)(`tr`,{className:e.enabled?``:`opacity-60`,children:[(0,s.jsx)(`td`,{children:(0,s.jsxs)(`code`,{children:[e.id.slice(0,8),`…`]})}),(0,s.jsx)(`td`,{children:(0,s.jsx)(`span`,{className:`inline-block rounded-sm border border-frost bg-ivory px-2 py-0.5 font-mono text-[0.8em] text-mocha`,children:e.kind})}),(0,s.jsx)(`td`,{children:(0,s.jsx)(`code`,{children:t})}),(0,s.jsx)(`td`,{children:e.message.length>60?`${e.message.slice(0,60)}…`:e.message}),(0,s.jsx)(`td`,{className:`text-[0.82em] text-mocha-light`,children:n}),(0,s.jsx)(`td`,{children:(0,s.jsxs)(`div`,{className:`flex gap-1.5`,children:[(0,s.jsx)(`button`,{type:`button`,className:`ghost-btn`,onClick:()=>o(e),children:e.enabled?`disable`:`enable`}),(0,s.jsx)(`button`,{type:`button`,className:`ghost-btn`,onClick:()=>c(e.id),children:`delete`})]})})]},e.id)})})]})]})}function l({agentId:e,onAdded:t}){let[n,r]=(0,o.useState)(`interval`),[i,a]=(0,o.useState)(300),[c,l]=(0,o.useState)(``),[u,d]=(0,o.useState)(``),[f,p]=(0,o.useState)(null),[m,h]=(0,o.useState)(!1);async function g(r){if(r.preventDefault(),p(null),!u.trim()){p(`message is required`);return}if(n===`interval`&&(!Number.isFinite(i)||i<=0)){p(`interval must be a positive number`);return}if(n===`cron`&&!c.trim()){p(`cron expression is required`);return}h(!0);try{let r={kind:n,message:u.trim()};n===`interval`?r.intervalSec=i:r.cronExpr=c.trim();let o=await fetch(`/api/agents/${encodeURIComponent(e)}/triggers`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(r)});if(!o.ok){let e=await o.json().catch(()=>null);throw Error(e?.error??o.statusText)}d(``),l(``),a(300),t()}catch(e){p(e.message)}finally{h(!1)}}return(0,s.jsxs)(`form`,{className:`card`,onSubmit:g,children:[(0,s.jsx)(`h3`,{children:`Add trigger`}),(0,s.jsxs)(`div`,{className:`mb-3 flex gap-3`,children:[(0,s.jsxs)(`label`,{className:`m-0 inline-flex cursor-pointer items-center gap-1`,children:[(0,s.jsx)(`input`,{type:`radio`,checked:n===`interval`,onChange:()=>r(`interval`)}),`interval (every N seconds)`]}),(0,s.jsxs)(`label`,{className:`m-0 inline-flex cursor-pointer items-center gap-1`,children:[(0,s.jsx)(`input`,{type:`radio`,checked:n===`cron`,onChange:()=>r(`cron`)}),`cron (5-field)`]})]}),n===`interval`?(0,s.jsxs)(`label`,{children:[`interval (seconds)`,(0,s.jsx)(`input`,{type:`number`,min:1,value:i,onChange:e=>a(Number(e.target.value))})]}):(0,s.jsxs)(`label`,{children:[`cron expression (minute hour dom month dow)`,(0,s.jsx)(`input`,{type:`text`,placeholder:`*/15 * * * *`,value:c,onChange:e=>l(e.target.value)})]}),(0,s.jsxs)(`label`,{children:[`message`,(0,s.jsx)(`textarea`,{placeholder:`e.g. check your inbox and act on anything new`,value:u,onChange:e=>d(e.target.value),className:`font-mono text-[0.9em] min-h-[80px]`})]}),(0,s.jsxs)(`div`,{className:`mt-3 flex items-center gap-3`,children:[(0,s.jsx)(`button`,{type:`submit`,disabled:m,children:m?`adding…`:`add`}),f&&(0,s.jsx)(`span`,{className:`text-[0.85em] text-[#9B3D3D]`,children:f})]})]})}export{c as component};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./jsx-runtime-DGeXAQPT.js";var t=e();function n(){return(0,t.jsx)(`div`,{className:`mx-auto max-w-2xl`,children:(0,t.jsxs)(`div`,{className:`card`,children:[(0,t.jsx)(`h1`,{children:`Welcome to bazilion`}),(0,t.jsxs)(`p`,{className:`muted my-3`,children:[`Before you can spawn agents, enable a provider and save at least one concrete model id. Once you do, a `,(0,t.jsx)(`code`,{children:`default`}),` profile (and a `,(0,t.jsx)(`code`,{children:`default`}),` group directory) are created automatically and the rest of the app unlocks.`]}),(0,t.jsxs)(`ol`,{className:`my-5 space-y-4`,children:[(0,t.jsxs)(r,{n:1,children:[(0,t.jsx)(`strong`,{children:`Choose a provider.`}),` Head to the`,` `,(0,t.jsx)(`a`,{href:`/config`,children:`providers tab`}),`, pick a provider, and set credentials or a local endpoint if that provider needs one. Local providers like Ollama and LM Studio can use their default loopback URLs.`]}),(0,t.jsxs)(r,{n:2,children:[(0,t.jsx)(`strong`,{children:`Enable it and save a model.`}),` Flip the provider's toggle on, then click a catalog chip or type one exact model id (for example`,` `,(0,t.jsx)(`code`,{children:`claude-opus-4-8`}),`, `,(0,t.jsx)(`code`,{children:`gpt-5.5`}),`, or `,(0,t.jsx)(`code`,{children:`llama3.3`}),`) and press `,(0,t.jsx)(`em`,{children:`save models`}),`.`]}),(0,t.jsxs)(r,{n:3,children:[(0,t.jsx)(`strong`,{children:`Start chatting.`}),` You'll be redirected to the home page automatically, where a `,(0,t.jsx)(`code`,{children:`default`}),` profile is waiting for a first spawn.`]})]}),(0,t.jsx)(`a`,{href:`/config`,className:`inline-flex items-center gap-2 rounded-md bg-sapphire px-4 py-2 text-[0.92em] font-semibold text-snow no-underline transition-colors hover:bg-sapphire-deep`,children:`Go to config →`})]})})}function r({n:e,children:n}){return(0,t.jsxs)(`li`,{className:`grid grid-cols-[2rem_1fr] gap-3 border-t border-frost pt-3 first:border-t-0 first:pt-0`,children:[(0,t.jsx)(`span`,{className:`text-center font-display text-xl text-sapphire`,children:e}),(0,t.jsx)(`div`,{className:`text-[0.92em] leading-relaxed text-mocha`,children:n})]})}export{n as component};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
var e=`default`,t=`default`,n=[`off`,`minimal`,`low`,`medium`,`high`,`xhigh`];export{e as n,n as r,t};
|
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
import { r as REASONING_LEVELS } from "./wire-constants-Deb4NxBb.js";
|
|
2
|
-
import { t as Button } from "./Button-Dsnw22OF.js";
|
|
3
|
-
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
4
|
-
//#region src/components/MembersEditor.tsx
|
|
5
|
-
function MembersEditor({ members, onChange, profiles, modelGroups, emptyHint = "No members yet. Add one to define your first team member." }) {
|
|
6
|
-
function update(i, patch) {
|
|
7
|
-
onChange(members.map((m, idx) => idx === i ? {
|
|
8
|
-
...m,
|
|
9
|
-
...patch
|
|
10
|
-
} : m));
|
|
11
|
-
}
|
|
12
|
-
function move(i, delta) {
|
|
13
|
-
const j = i + delta;
|
|
14
|
-
if (j < 0 || j >= members.length) return;
|
|
15
|
-
const next = [...members];
|
|
16
|
-
const tmp = next[i];
|
|
17
|
-
const swap = next[j];
|
|
18
|
-
if (!tmp || !swap) return;
|
|
19
|
-
next[i] = swap;
|
|
20
|
-
next[j] = tmp;
|
|
21
|
-
onChange(next);
|
|
22
|
-
}
|
|
23
|
-
function removeMember(i) {
|
|
24
|
-
onChange(members.filter((_, idx) => idx !== i));
|
|
25
|
-
}
|
|
26
|
-
function addMember() {
|
|
27
|
-
const firstProfile = profiles[0];
|
|
28
|
-
if (!firstProfile) return;
|
|
29
|
-
onChange([...members, {
|
|
30
|
-
profileId: firstProfile.id,
|
|
31
|
-
agentName: "agent",
|
|
32
|
-
modelOverride: null,
|
|
33
|
-
reasoningLevel: null
|
|
34
|
-
}]);
|
|
35
|
-
}
|
|
36
|
-
if (profiles.length === 0) return /* @__PURE__ */ jsxs("p", {
|
|
37
|
-
className: "muted",
|
|
38
|
-
children: [
|
|
39
|
-
"Create a profile first under ",
|
|
40
|
-
/* @__PURE__ */ jsx("a", {
|
|
41
|
-
href: "/profiles",
|
|
42
|
-
children: "/profiles"
|
|
43
|
-
}),
|
|
44
|
-
" — members reference existing profiles."
|
|
45
|
-
]
|
|
46
|
-
});
|
|
47
|
-
return /* @__PURE__ */ jsxs(Fragment, { children: [members.length === 0 ? /* @__PURE__ */ jsx("p", {
|
|
48
|
-
className: "muted",
|
|
49
|
-
children: emptyHint
|
|
50
|
-
}) : /* @__PURE__ */ jsxs("table", { children: [/* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsxs("tr", { children: [
|
|
51
|
-
/* @__PURE__ */ jsx("th", { children: "#" }),
|
|
52
|
-
/* @__PURE__ */ jsx("th", { children: "profile" }),
|
|
53
|
-
/* @__PURE__ */ jsx("th", { children: "agent name" }),
|
|
54
|
-
/* @__PURE__ */ jsx("th", { children: "model override" }),
|
|
55
|
-
/* @__PURE__ */ jsx("th", { children: "reasoning" }),
|
|
56
|
-
/* @__PURE__ */ jsx("th", {})
|
|
57
|
-
] }) }), /* @__PURE__ */ jsx("tbody", { children: members.map((m, i) => /* @__PURE__ */ jsxs("tr", { children: [
|
|
58
|
-
/* @__PURE__ */ jsx("td", { children: i }),
|
|
59
|
-
/* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsx("select", {
|
|
60
|
-
value: m.profileId,
|
|
61
|
-
onChange: (e) => update(i, { profileId: e.target.value }),
|
|
62
|
-
children: profiles.map((p) => /* @__PURE__ */ jsx("option", {
|
|
63
|
-
value: p.id,
|
|
64
|
-
children: p.id
|
|
65
|
-
}, p.id))
|
|
66
|
-
}) }),
|
|
67
|
-
/* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsx("input", {
|
|
68
|
-
value: m.agentName,
|
|
69
|
-
onChange: (e) => update(i, { agentName: e.target.value })
|
|
70
|
-
}) }),
|
|
71
|
-
/* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsxs("select", {
|
|
72
|
-
value: m.modelOverride ?? "",
|
|
73
|
-
onChange: (e) => update(i, { modelOverride: e.target.value === "" ? null : e.target.value }),
|
|
74
|
-
children: [/* @__PURE__ */ jsx("option", {
|
|
75
|
-
value: "",
|
|
76
|
-
children: "(use profile default)"
|
|
77
|
-
}), modelGroups.map((g) => /* @__PURE__ */ jsx("optgroup", {
|
|
78
|
-
label: g.provider,
|
|
79
|
-
children: g.models.map((mm) => /* @__PURE__ */ jsx("option", {
|
|
80
|
-
value: `${g.provider}:${mm}`,
|
|
81
|
-
children: `${g.provider}:${mm}`
|
|
82
|
-
}, mm))
|
|
83
|
-
}, g.provider))]
|
|
84
|
-
}) }),
|
|
85
|
-
/* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsxs("select", {
|
|
86
|
-
value: m.reasoningLevel ?? "",
|
|
87
|
-
onChange: (e) => update(i, { reasoningLevel: e.target.value === "" ? null : e.target.value }),
|
|
88
|
-
children: [/* @__PURE__ */ jsx("option", {
|
|
89
|
-
value: "",
|
|
90
|
-
children: "(default: medium)"
|
|
91
|
-
}), REASONING_LEVELS.map((lvl) => /* @__PURE__ */ jsx("option", {
|
|
92
|
-
value: lvl,
|
|
93
|
-
children: lvl
|
|
94
|
-
}, lvl))]
|
|
95
|
-
}) }),
|
|
96
|
-
/* @__PURE__ */ jsxs("td", {
|
|
97
|
-
className: "flex gap-1",
|
|
98
|
-
children: [
|
|
99
|
-
/* @__PURE__ */ jsx(Button, {
|
|
100
|
-
variant: "ghost",
|
|
101
|
-
onClick: () => move(i, -1),
|
|
102
|
-
disabled: i === 0,
|
|
103
|
-
title: "move up",
|
|
104
|
-
children: "↑"
|
|
105
|
-
}),
|
|
106
|
-
/* @__PURE__ */ jsx(Button, {
|
|
107
|
-
variant: "ghost",
|
|
108
|
-
onClick: () => move(i, 1),
|
|
109
|
-
disabled: i === members.length - 1,
|
|
110
|
-
title: "move down",
|
|
111
|
-
children: "↓"
|
|
112
|
-
}),
|
|
113
|
-
/* @__PURE__ */ jsx(Button, {
|
|
114
|
-
variant: "danger",
|
|
115
|
-
onClick: () => removeMember(i),
|
|
116
|
-
title: "remove member",
|
|
117
|
-
children: "✕"
|
|
118
|
-
})
|
|
119
|
-
]
|
|
120
|
-
})
|
|
121
|
-
] }, i)) })] }), /* @__PURE__ */ jsx("div", {
|
|
122
|
-
className: "mt-3",
|
|
123
|
-
children: /* @__PURE__ */ jsx(Button, {
|
|
124
|
-
variant: "ghost",
|
|
125
|
-
onClick: addMember,
|
|
126
|
-
children: "+ add member"
|
|
127
|
-
})
|
|
128
|
-
})] });
|
|
129
|
-
}
|
|
130
|
-
//#endregion
|
|
131
|
-
export { MembersEditor as t };
|
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
import { t as Button } from "./Button-Dsnw22OF.js";
|
|
2
|
-
import { useState } from "react";
|
|
3
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
4
|
-
//#region src/components/SpawnTeamModal.tsx
|
|
5
|
-
function SpawnTeamModal({ profileGroup, groups, onClose, onSpawned }) {
|
|
6
|
-
const [groupSlug, setGroupSlug] = useState("");
|
|
7
|
-
const [userMd, setUserMd] = useState("");
|
|
8
|
-
const [err, setErr] = useState(null);
|
|
9
|
-
const [submitting, setSubmitting] = useState(false);
|
|
10
|
-
async function spawn() {
|
|
11
|
-
setErr(null);
|
|
12
|
-
if (!groupSlug.trim()) {
|
|
13
|
-
setErr("target group slug is required");
|
|
14
|
-
return;
|
|
15
|
-
}
|
|
16
|
-
setSubmitting(true);
|
|
17
|
-
try {
|
|
18
|
-
const body = { groupSlug: groupSlug.trim() };
|
|
19
|
-
if (userMd) body.userMd = userMd;
|
|
20
|
-
const res = await fetch(`/api/profile-groups/${profileGroup.id}/spawn`, {
|
|
21
|
-
method: "POST",
|
|
22
|
-
headers: { "content-type": "application/json" },
|
|
23
|
-
body: JSON.stringify(body)
|
|
24
|
-
});
|
|
25
|
-
if (!res.ok) {
|
|
26
|
-
const e = await res.json().catch(() => null);
|
|
27
|
-
throw new Error(e?.error ?? res.statusText);
|
|
28
|
-
}
|
|
29
|
-
const result = await res.json();
|
|
30
|
-
if (result.orphanAgentIds && result.orphanAgentIds.length > 0) alert(`Spawn completed with warnings: ${result.orphanAgentIds.length} orphan agent dir(s) left on disk.`);
|
|
31
|
-
onSpawned(result.groupSlug);
|
|
32
|
-
} catch (e) {
|
|
33
|
-
setErr(e.message);
|
|
34
|
-
} finally {
|
|
35
|
-
setSubmitting(false);
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
return /* @__PURE__ */ jsx("div", {
|
|
39
|
-
role: "dialog",
|
|
40
|
-
"aria-modal": "true",
|
|
41
|
-
className: "fixed inset-0 z-50 flex items-center justify-center bg-black/50",
|
|
42
|
-
onClick: onClose,
|
|
43
|
-
onKeyDown: (e) => {
|
|
44
|
-
if (e.key === "Escape") onClose();
|
|
45
|
-
},
|
|
46
|
-
children: /* @__PURE__ */ jsxs("div", {
|
|
47
|
-
className: "card w-full max-w-lg",
|
|
48
|
-
onClick: (e) => e.stopPropagation(),
|
|
49
|
-
onKeyDown: (e) => e.stopPropagation(),
|
|
50
|
-
role: "document",
|
|
51
|
-
children: [
|
|
52
|
-
/* @__PURE__ */ jsxs("h3", { children: ["spawn team — ", profileGroup.name] }),
|
|
53
|
-
err && /* @__PURE__ */ jsx("div", {
|
|
54
|
-
className: "err",
|
|
55
|
-
children: err
|
|
56
|
-
}),
|
|
57
|
-
/* @__PURE__ */ jsxs("p", {
|
|
58
|
-
className: "muted",
|
|
59
|
-
children: [
|
|
60
|
-
"Spawns ",
|
|
61
|
-
profileGroup.memberCount,
|
|
62
|
-
" agent",
|
|
63
|
-
profileGroup.memberCount === 1 ? "" : "s",
|
|
64
|
-
" into the target group. If the group doesn't exist, it'll be created on the fly. Failures roll back the whole spawn."
|
|
65
|
-
]
|
|
66
|
-
}),
|
|
67
|
-
/* @__PURE__ */ jsxs("label", { children: [
|
|
68
|
-
"target group slug",
|
|
69
|
-
/* @__PURE__ */ jsx("input", {
|
|
70
|
-
value: groupSlug,
|
|
71
|
-
onChange: (e) => setGroupSlug(e.target.value),
|
|
72
|
-
list: "existing-groups",
|
|
73
|
-
required: true
|
|
74
|
-
}),
|
|
75
|
-
/* @__PURE__ */ jsx("datalist", {
|
|
76
|
-
id: "existing-groups",
|
|
77
|
-
children: groups.map((g) => /* @__PURE__ */ jsx("option", {
|
|
78
|
-
value: g.id,
|
|
79
|
-
children: g.name
|
|
80
|
-
}, g.id))
|
|
81
|
-
})
|
|
82
|
-
] }),
|
|
83
|
-
/* @__PURE__ */ jsxs("label", { children: ["override USER.md (optional — only takes effect on a freshly-created target group)", /* @__PURE__ */ jsx("textarea", {
|
|
84
|
-
rows: 3,
|
|
85
|
-
value: userMd,
|
|
86
|
-
onChange: (e) => setUserMd(e.target.value),
|
|
87
|
-
className: "font-mono text-[0.88em] leading-[1.55]"
|
|
88
|
-
})] }),
|
|
89
|
-
/* @__PURE__ */ jsxs("div", {
|
|
90
|
-
className: "mt-4 flex gap-2 justify-end",
|
|
91
|
-
children: [/* @__PURE__ */ jsx(Button, {
|
|
92
|
-
variant: "ghost",
|
|
93
|
-
onClick: onClose,
|
|
94
|
-
children: "cancel"
|
|
95
|
-
}), /* @__PURE__ */ jsx(Button, {
|
|
96
|
-
variant: "primary",
|
|
97
|
-
onClick: spawn,
|
|
98
|
-
disabled: submitting,
|
|
99
|
-
children: submitting ? "spawning…" : "spawn team"
|
|
100
|
-
})]
|
|
101
|
-
})
|
|
102
|
-
]
|
|
103
|
-
})
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
//#endregion
|
|
107
|
-
export { SpawnTeamModal as t };
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { t as createServerFn } from "../server.js";
|
|
2
|
-
import { t as createSsrRpc } from "./createSsrRpc-ZBGxhl8t.js";
|
|
3
|
-
import { createFileRoute, lazyRouteComponent } from "@tanstack/react-router";
|
|
4
|
-
//#region src/routes/profile-groups/$id.tsx
|
|
5
|
-
var $$splitComponentImporter = () => import("./_id-CRqqi8IE.js");
|
|
6
|
-
var fetchDetail = createServerFn({ method: "POST" }).inputValidator((d) => d).handler(createSsrRpc("86dad0c33c97a6f0913d1f38e9b01ac4144f7d0970b45fdb3470e9bc9a78e0e0"));
|
|
7
|
-
var Route = createFileRoute("/profile-groups/$id")({
|
|
8
|
-
loader: ({ params }) => fetchDetail({ data: { id: params.id } }),
|
|
9
|
-
component: lazyRouteComponent($$splitComponentImporter, "component")
|
|
10
|
-
});
|
|
11
|
-
//#endregion
|
|
12
|
-
export { Route as t };
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { t as createServerFn } from "../server.js";
|
|
2
|
-
import { t as createServerRpc } from "./createServerRpc-CeKECg65.js";
|
|
3
|
-
import { n as daemonClient } from "./daemon-client-2NRMzlTr.js";
|
|
4
|
-
//#region src/routes/profile-groups/$id.tsx?tss-serverfn-split
|
|
5
|
-
var fetchDetail_createServerFn_handler = createServerRpc({
|
|
6
|
-
id: "86dad0c33c97a6f0913d1f38e9b01ac4144f7d0970b45fdb3470e9bc9a78e0e0",
|
|
7
|
-
name: "fetchDetail",
|
|
8
|
-
filename: "src/routes/profile-groups/$id.tsx"
|
|
9
|
-
}, (opts) => fetchDetail.__executeServer(opts));
|
|
10
|
-
var fetchDetail = createServerFn({ method: "POST" }).inputValidator((d) => d).handler(fetchDetail_createServerFn_handler, async ({ data }) => {
|
|
11
|
-
const c = daemonClient();
|
|
12
|
-
const [detail, profiles, models] = await Promise.all([
|
|
13
|
-
c.get(`/api/profile-groups/${encodeURIComponent(data.id)}`),
|
|
14
|
-
c.get("/api/profiles"),
|
|
15
|
-
c.get("/api/config/available-models")
|
|
16
|
-
]);
|
|
17
|
-
return {
|
|
18
|
-
detail,
|
|
19
|
-
profiles,
|
|
20
|
-
modelGroups: models.groups
|
|
21
|
-
};
|
|
22
|
-
});
|
|
23
|
-
//#endregion
|
|
24
|
-
export { fetchDetail_createServerFn_handler };
|