@marifold/service 0.64.0 → 0.64.1

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.
@@ -24,7 +24,7 @@ Attached file: `,n=e.indexOf(t);if(n===-1)return{prompt:e,files:[]};let r=[],i=n
24
24
 
25
25
  `))!==-1;){let e=wi(r.slice(0,o));r=r.slice(o+2),e&&(yield e)}r+=a}}finally{t.releaseLock()}}function wi(e){let t,n,r,i=[];for(let a of e.split(`
26
26
  `)){if(a.startsWith(`:`))continue;let e=a.indexOf(`:`);if(e===-1)continue;let o=a.slice(0,e),s=a.slice(e+1).replace(/^ /,``);if(o===`id`){let e=Number.parseInt(s,10);Number.isInteger(e)&&(t=e)}else if(o===`event`)n=s;else if(o===`data`)i.push(s);else if(o===`retry`){let e=Number.parseInt(s,10);Number.isInteger(e)&&e>=0&&(r=e)}}if(!(i.length===0&&n===void 0&&r===void 0&&t===void 0))return{...t===void 0?{}:{id:t},...n===void 0?{}:{event:n},...i.length>0?{data:Ti(i.join(`
27
- `))}:{},...r===void 0?{}:{retryMs:r}}}function Ti(e){try{return JSON.parse(e)}catch{return e}}async function*Ei(e,t,n){let r=await e.stream(`/v1/chat/stream`,{method:`POST`,body:t,signal:n}),i=!1;try{for await(let e of Ci(r.body))if(e.event===`chunk`){let t=e.data?.text;typeof t==`string`&&(yield{type:`chunk`,text:t})}else if(e.event===`reasoning`){let t=e.data?.text;typeof t==`string`&&(yield{type:`reasoning`,text:t})}else if(e.event===`error`){let t=e.data;yield{type:`error`,code:t?.code??`STREAM_ERROR`,message:t?.message??`Stream failed.`}}else if(e.event===`done`){let t=e.data,n=Di(t?.usage);i=!0,yield{type:`done`,...n?{usage:n}:{},...typeof t?.latencyMs==`number`&&Number.isFinite(t.latencyMs)?{latencyMs:t.latencyMs}:{}};return}}catch(e){if(n?.aborted)return;throw e}!i&&!n?.aborted&&(yield{type:`error`,code:`STREAM_INTERRUPTED`,message:`The chat stream ended before completing.`},yield{type:`done`})}function Di(e){if(typeof e!=`object`||!e||Array.isArray(e))return;let t=e,n={};for(let e of[`inputTokens`,`outputTokens`,`totalTokens`,`cachedInputTokens`,`reasoningTokens`,`estimatedCostUSD`]){let r=t[e];typeof r==`number`&&Number.isFinite(r)&&r>=0&&(n[e]=r)}return Object.keys(n).length>0?n:void 0}async function Oi(e,t){return(await e.request(`POST`,`/v1/runs`,t)).run}async function G(e){return(await e.request(`GET`,`/v1/runs`)).runs}async function ki(e,t,n,r){return e.request(`POST`,`/v1/runs/${encodeURIComponent(t)}/approvals/${encodeURIComponent(n)}`,{action:r})}async function Ai(e,t,n,r){return e.request(`POST`,`/v1/runs/${encodeURIComponent(t)}/inputs/${encodeURIComponent(n)}`,r)}async function ji(e,t,n){await e.request(`POST`,`/v1/runs/${encodeURIComponent(t)}/steer`,{text:n})}async function Mi(e,t){return(await e.request(`POST`,`/v1/runs/${encodeURIComponent(t)}/cancel`,{})).status}async function*Ni(e,t,n={}){let{signal:r}=n,i=n.afterSeq??0,a=n.retryDelayMs??3e3,o=n.maxRetryDelayMs??15e3;for(;!r?.aborted;){try{let n=await e.stream(`/v1/runs/${encodeURIComponent(t)}/events`,{...i>0?{lastEventId:String(i)}:{},signal:r});for await(let e of Ci(n.body)){if(e.retryMs!==void 0&&(a=Math.min(e.retryMs,o)),e.id===void 0||e.data===void 0||e.id<=i)continue;i=e.id;let t=e.data;if(yield{seq:e.id,event:t},t.type===`done`)return}}catch(e){if(r?.aborted)return;if(e instanceof d)throw e}if(r?.aborted)return;await Fi(Pi(a,o),r)}}function Pi(e,t){return Math.min(Math.round(e*(1+Math.random()*.3)),t)}function Fi(e,t){return new Promise(n=>{let r=setTimeout(i,e);function i(){clearTimeout(r),t?.removeEventListener(`abort`,i),n()}t?.addEventListener(`abort`,i,{once:!0})})}async function Ii(e,t={}){let n=new URLSearchParams;t.limit!==void 0&&n.set(`limit`,String(t.limit)),t.profile!==void 0&&n.set(`profile`,t.profile),t.archived!==void 0&&n.set(`archived`,String(t.archived)),t.search?.trim()&&n.set(`q`,t.search.trim());let r=n.size>0?`?${n.toString()}`:``;return(await e.request(`GET`,`/v1/sessions${r}`)).sessions}async function Li(e,t){return(await e.request(`GET`,`/v1/sessions/${encodeURIComponent(t)}`)).session}async function Ri(e,t){return(await e.request(`DELETE`,`/v1/sessions/${encodeURIComponent(t)}`)).deleted}async function zi(e,t,n){return(await e.request(`PATCH`,`/v1/sessions/${encodeURIComponent(t)}`,n)).session}async function Bi(e,t,n){return{compacted:(await e.request(`POST`,`/v1/sessions/${encodeURIComponent(t)}/compact`,n)).compacted}}var Vi=80;function Hi(e,t){if(e.some(e=>e.id===t.id))return e;let n=t.now??new Date().toISOString();return[{id:t.id,profileName:t.profileName,createdAt:n,updatedAt:n,turnCount:1,preview:Ui(t.prompt),pending:!0},...e]}function Ui(e){let t=e.replace(/\s+/g,` `).trim();return t.length<=Vi?t:`${t.slice(0,Vi-1).trimEnd()}…`}var Wi=class{client;dispatch;onDone;loops=new Map;constructor(e,t,n){this.client=e,this.dispatch=t,this.onDone=n}attach(e,t=0){if(this.loops.has(e))return;let n=new AbortController;this.loops.set(e,n),this.pump(e,t,n.signal).finally(()=>{this.loops.delete(e)})}following(e){return this.loops.has(e)}stop(e){this.loops.get(e)?.abort(),this.loops.delete(e)}stopAll(){for(let e of this.loops.values())e.abort();this.loops.clear()}async pump(e,t,n){try{for await(let{seq:r,event:i}of Ni(this.client,e,{afterSeq:t,signal:n}))this.dispatch({type:`run_event`,runId:e,seq:r,event:i}),i.type===`done`&&this.onDone?.(e)}catch(t){if(n.aborted)return;if(t instanceof d&&t.code===`RUN_NOT_FOUND`){this.dispatch({type:`run_lost`,runId:e});return}this.dispatch({type:`notice`,tone:`error`,text:`Run stream failed: ${t instanceof Error?t.message:String(t)}`})}}},Gi=1e4,Ki=75,qi=15e3;function Ji(e){let{client:t,route:n,navigate:r,onUnauthorized:i}=e,[a,o]=(0,l.useState)([]),[s,c]=(0,l.useState)(),[u,f]=(0,l.useState)([]),[p,m]=(0,l.useState)([]),[h,g]=(0,l.useState)(()=>new Set),[_,v]=(0,l.useState)(``),[b,x]=(0,l.useState)(!1),[S,C]=(0,l.useState)([]),[T,E]=(0,l.useState)(n.session),[D,te]=(0,l.useState)(!1),[ne,O]=(0,l.useState)([]),[re,ie]=(0,l.useState)(),[ae,oe]=(0,l.useState)(!1),[k,A]=(0,l.useState)(!1),[se,j]=(0,l.useReducer)(Mr,void 0,()=>Or(n.session)),ce=(0,l.useRef)(se);ce.current=se;let M=n.profile,[le,N]=(0,l.useState)({}),ue=`${M??`_`}:${T??`new`}`,de=le[ue]??[],fe=(0,l.useRef)(de);fe.current=de;let pe=(0,l.useRef)(()=>void 0),P=(0,l.useRef)(()=>void 0),me=(0,l.useRef)(()=>void 0),F=(0,l.useRef)(new Set),he=(0,l.useRef)(new Set),ge=(0,l.useRef)(void 0),xe=(0,l.useCallback)(()=>ge.current?(ge.current.controller.abort(),ge.current=void 0,A(!1),!0):!1,[]),Se=(0,l.useMemo)(()=>new Wi(t,j,e=>{pe.current(),P.current(),F.current.delete(e)&&(he.current.add(e),me.current())}),[t]);(0,l.useEffect)(()=>()=>Se.stopAll(),[Se]),(0,l.useEffect)(()=>()=>{xe()},[xe]);let I=(0,l.useCallback)(e=>{if(e instanceof d&&e.code===`UNAUTHORIZED`){i();return}j({type:`notice`,tone:`error`,text:e instanceof Error?e.message:String(e)})},[i]),Ce=(0,l.useCallback)(e=>{g(t=>{let n;for(let r of e)t.has(r)||(n??=new Set(t),n.add(r));return n??t})},[]),Te=(0,l.useCallback)(e=>{g(t=>{if(!t.has(e))return t;let n=new Set(t);return n.delete(e),n})},[]),Ee=(0,l.useCallback)(async e=>{let n=await G(t);C(n);let r=n.filter(t=>t.sessionId===e&&!he.current.has(t.id)),i=[];for(let e of r)e.status===`running`?Se.attach(e.id):ce.current.items.some(t=>t.kind===`run`&&t.run.runId===e.id)||i.push(e);i.length>0&&j({type:`catch_up`,runs:i})},[t,Se]),De=(0,l.useCallback)(async e=>{if(Se.stopAll(),j({type:`reset`,sessionId:e}),e){try{let n=await Li(t,e);Ce([e]),j({type:`session_loaded`,turns:n.turns.map(t=>{if(t.role===`assistant`)return{role:t.role,content:t.content,...t.responseMetrics?{responseMeta:{mode:t.responseMetrics.mode,startedAt:t.responseMetrics.startedAt,finishedAt:t.responseMetrics.finishedAt,latencyMs:t.responseMetrics.latencyMs,usage:t.responseMetrics.usage}}:{}};let n=et(t.content),r=[...ea(e,t.attachments??[]),...n.files.map(e=>{let t=Ye(e.name);return{kind:`text`,name:e.name,content:e.content,...t?{officeKind:t}:{},...e.content.includes(`[Office extraction truncated to fit the attachment text limit.]`)?{truncated:!0}:{}}})];return{role:t.role,content:n.prompt,...r.length>0?{attachments:r}:{}}})})}catch(t){if(!(t instanceof d&&t.status===404)){I(t);return}Te(e)}try{await Ee(e)}catch(e){I(e)}}},[t,Se,Ee,Te,I,Ce]);(0,l.useEffect)(()=>{g(new Set)},[t]),(0,l.useEffect)(()=>{let e=!1;return(async()=>{try{let[n,r]=await Promise.all([_e(t),y(t)]);if(e)return;o(n),O(r.options)}catch(t){e||I(t)}})(),()=>{e=!0}},[t,I]),(0,l.useEffect)(()=>{if(!M)return;let e=!1;return(async()=>{try{let[n,r]=await Promise.all([ve(t,M),w(t,M).catch(()=>[])]);if(e)return;c(n),f(r),te(n.settings.think??!1)}catch(t){e||I(t)}})(),()=>{e=!0}},[t,M,I]),(0,l.useEffect)(()=>{if(!M)return;let e=!1,n=window.setTimeout(()=>{Ii(t,{profile:M,limit:100,archived:b,search:_}).then(t=>{e||(Ce(t.map(e=>e.id)),m(t))}).catch(t=>{e||I(t)})},_?180:0);return()=>{e=!0,window.clearTimeout(n)}},[t,I,M,Ce,_,b]),(0,l.useEffect)(()=>{n.session!==T&&(xe(),E(n.session),De(n.session))},[n.session]),(0,l.useEffect)(()=>{T&&De(T)},[]),(0,l.useEffect)(()=>{if(!T)return;let e=setInterval(()=>{document.visibilityState===`visible`&&Ee(T).catch(()=>void 0)},Gi);return()=>clearInterval(e)},[T,Ee]);let Oe=(0,l.useCallback)(async()=>{try{o(await _e(t))}catch{}},[t]),ke=(0,l.useCallback)(async(e,n)=>{try{return o(await we(t,e,n)),!0}catch(e){return I(e),!1}},[t,I]),Me=(0,l.useCallback)(async(e=T)=>{if(M)try{let n=await Ii(t,{profile:M,limit:100,archived:b,search:_});if(Ce(n.map(e=>e.id)),m(n),e&&!n.some(t=>t.id===e))try{await Li(t,e),Ce([e])}catch(t){t instanceof d&&t.status===404&&Te(e)}}catch{}},[t,Te,M,Ce,T,_,b]);pe.current=()=>{Me()};let Ne=(0,l.useCallback)(async()=>{try{C(await G(t))}catch{}},[t]);P.current=()=>{Ne()},me.current=()=>{T&&De(T)};let Pe=(0,l.useCallback)(e=>{xe(),Se.stopAll(),E(void 0),j({type:`reset`}),r({view:`agent`,profile:e})},[xe,Se,r]),Fe=(0,l.useCallback)(()=>{xe(),Se.stopAll(),E(void 0),c(void 0),m([]),f([]),j({type:`reset`}),r({view:`agent`}),Oe()},[xe,Se,r,Oe]),Ie=(0,l.useCallback)(e=>{!M||e===T||(xe(),E(e),r({view:`agent`,profile:M,session:e}),De(e))},[xe,M,T,r,De]),Le=(0,l.useCallback)(()=>{if(!M||!T||!h.has(T))return;let e=crypto.randomUUID();xe(),Se.stopAll(),E(e),j({type:`reset`,sessionId:e}),r({view:`agent`,profile:M,session:e})},[xe,M,Se,r,h,T]),ze=(0,l.useCallback)(e=>{Ce([e.id]),m(t=>t.map(t=>t.id===e.id?e:t).sort((e,t)=>Number(!!t.pinned)-Number(!!e.pinned)||t.updatedAt.localeCompare(e.updatedAt)))},[Ce]),Be=(0,l.useCallback)(async(e,n)=>{try{return ze(await zi(t,e,{title:n})),!0}catch(e){return I(e),!1}},[t,I,ze]),Ve=(0,l.useCallback)(async(e,n)=>{try{return ze(await zi(t,e,{pinned:n})),!0}catch(e){return I(e),!1}},[t,I,ze]),He=(0,l.useCallback)(async(e,n)=>{try{return await zi(t,e,{archived:n}),m(t=>t.filter(t=>t.id!==e)),n&&e===T&&M&&(xe(),Se.stopAll(),E(void 0),j({type:`reset`}),r({view:`agent`,profile:M})),!0}catch(e){return I(e),!1}},[xe,t,Se,I,r,M,T]),Ue=(0,l.useCallback)(async e=>{try{let n=(await G(t)).filter(t=>t.sessionId===e&&t.status===`running`);for(let e of n)await Mi(t,e.id);n.length>0&&await Xi(t,e),ge.current?.sessionId===e&&xe();let i=p.some(t=>t.id===e&&t.pending);return!await Zi(t,e)&&!i?!1:(Te(e),m(t=>t.filter(t=>t.id!==e)),C(t=>t.filter(t=>t.sessionId!==e)),M&&N(t=>{let n={...t};return delete n[`${M}:${e}`],n}),e===T&&M&&(Se.stopAll(),E(void 0),j({type:`reset`}),r({view:`agent`,profile:M})),!0)}catch(e){return I(e),!1}},[xe,t,Se,Te,I,r,M,T,p]),We=(0,l.useCallback)(async e=>{let t=await tt(e,fe.current);for(let e of t.rejected)j({type:`notice`,tone:`warn`,text:e});t.accepted.length>0&&N(e=>({...e,[ue]:[...e[ue]??[],...t.accepted]}))},[ue]),Ge=(0,l.useCallback)(e=>{N(t=>({...t,[ue]:(t[ue]??[]).filter((t,n)=>n!==e)}))},[ue]),Ke=(0,l.useCallback)(async(e,n={})=>{if(!M)return!1;let i=jr(ce.current);if(i)try{return await ji(t,i.runId,e),!0}catch(e){return I(e),!1}let a;if(e.startsWith(`$`)){try{a=await ee(t,e,M)}catch(e){return I(e),!1}if(a.missing.length>0)return j({type:`notice`,tone:`warn`,text:`Missing required skill value(s): ${a.missing.join(`, `)}. Usage: ${a.usage}`}),!1}let o=T;o||(o=crypto.randomUUID(),E(o),r({view:`agent`,profile:M,session:o}));let c=n.attachments??fe.current,l=a?.mode??s?.settings.mode??`agent`;if(l===`chat`&&c.some(e=>e.kind===`file`))return j({type:`notice`,tone:`warn`,text:`Binary attachments require Agent mode so inspect_attachment can open them.`}),!1;if(n.originalImages&&c.reduce((e,t)=>e+(t.kind===`image`?t.originalSize??t.size:t.size),0)>16777216)return j({type:`notice`,tone:`warn`,text:`/attach-original attachments exceed the ${Re/(1024*1024)} MiB request limit.`}),!1;n.attachments===void 0&&N(e=>{let t={...e};return delete t[ue],t});let u=c.filter(e=>e.kind===`image`),d=await Promise.all(u.map(async e=>n.originalImages&&e.originalFile?{data:await at(e.originalFile),mediaType:e.originalFile.type||e.mediaType}:{data:e.data,mediaType:e.mediaType})),f=c.filter(e=>e.kind===`text`),p=c.filter(e=>e.kind!==`image`),h=await Promise.all(p.map(async e=>{if(e.kind===`file`)return{name:e.name,mediaType:e.mediaType,data:await at(e.originalFile)};let t=e.originalFile??new Blob([e.content],{type:e.mediaType||`text/plain`});return{name:e.name,mediaType:e.mediaType||t.type||`text/plain`,data:await at(t),inspectionText:e.content}})),g=$e(a?.prompt??e,f,l),_=l===`agent`&&!a&&f.length>0?Qe(e,f):void 0,v=c.map(e=>e.kind===`image`?{kind:`image`,name:e.name,previewUrl:`data:${e.mediaType};base64,${e.data}`}:e.kind===`file`?{kind:`file`,name:e.name}:{kind:`text`,name:e.name,content:e.content,...e.officeKind?{officeKind:e.officeKind}:{},...e.truncated?{truncated:!0}:{}});n.replaceItemId?j({type:`edit_user_message`,itemId:n.replaceItemId,text:e,attachments:v}):(j({type:`user_message`,text:e,attachments:v}),m(t=>Hi(t,{id:o,profileName:M,prompt:e})));let[y,b]=na(re);if(l===`chat`){oe(!0),j({type:`chat_started`});let e=!0,r=new AbortController;ge.current={sessionId:o,controller:r},A(!0);try{for await(let i of Ei(t,{prompt:g,...a?{userTurn:a.userTurn,instructions:a.instructions,isolated:!0}:{},profile:M,sessionId:o,replaceUserTurnIndex:n.replaceUserTurnIndex,think:D,provider:y,model:b,...d.length>0?{images:d}:{},...n.originalImages?{originalImages:!0}:{}},r.signal))i.type===`chunk`?j({type:`chat_chunk`,text:i.text}):i.type===`reasoning`?j({type:`chat_reasoning`,text:i.text}):i.type===`error`?(e=!1,j({type:`chat_error`,message:i.message})):j({type:`chat_done`,usage:i.usage,latencyMs:i.latencyMs});return r.signal.aborted&&(e=!1),e}catch(e){return r.signal.aborted||(j({type:`chat_done`}),I(e)),!1}finally{ge.current?.controller===r&&(ge.current=void 0,A(!1)),oe(!1),Me(o),n.replaceUserTurnIndex!==void 0&&De(o)}}try{oe(!0);let e=await Oi(t,{objective:g,...a?{userTurn:a.userTurn,instructions:a.instructions,lean:!0}:_?{userTurn:_}:{},profile:M,sessionId:o,replaceUserTurnIndex:n.replaceUserTurnIndex,think:D,provider:y,model:b,...d.length>0?{images:d}:{},...h.length>0?{files:h}:{},...n.originalImages?{originalImages:!0}:{}});return j({type:`run_created`,run:e}),C(t=>[e,...t.filter(t=>t.id!==e.id)]),n.replaceUserTurnIndex!==void 0&&F.current.add(e.id),Se.attach(e.id),!0}catch(e){return I(e),Me(o),n.replaceUserTurnIndex!==void 0&&De(o),!1}finally{oe(!1)}},[t,M,T,re,D,s,Se,r,I,Me,De,ue]),qe=(0,l.useCallback)(async()=>{if(xe())return j({type:`chat_cancelled`}),!0;let e=jr(ce.current);if(!e)return!1;try{return await Mi(t,e.runId),!0}catch(e){return I(e),!1}},[xe,t,I]),Je=(0,l.useCallback)(async({name:e,args:n})=>{let r=(e,t=`info`)=>j({type:`notice`,tone:t,text:e});switch(e){case`help`:r(En.map(e=>`${e.usage} — ${e.description}`).join(`
27
+ `))}:{},...r===void 0?{}:{retryMs:r}}}function Ti(e){try{return JSON.parse(e)}catch{return e}}async function*Ei(e,t,n){let r=await e.stream(`/v1/chat/stream`,{method:`POST`,body:t,signal:n}),i=!1;try{for await(let e of Ci(r.body))if(e.event===`chunk`){let t=e.data?.text;typeof t==`string`&&(yield{type:`chunk`,text:t})}else if(e.event===`reasoning`){let t=e.data?.text;typeof t==`string`&&(yield{type:`reasoning`,text:t})}else if(e.event===`error`){let t=e.data;yield{type:`error`,code:t?.code??`STREAM_ERROR`,message:t?.message??`Stream failed.`}}else if(e.event===`done`){let t=e.data,n=Di(t?.usage);i=!0,yield{type:`done`,...n?{usage:n}:{},...typeof t?.latencyMs==`number`&&Number.isFinite(t.latencyMs)?{latencyMs:t.latencyMs}:{}};return}}catch(e){if(n?.aborted)return;throw e}!i&&!n?.aborted&&(yield{type:`error`,code:`STREAM_INTERRUPTED`,message:`The chat stream ended before completing.`},yield{type:`done`})}function Di(e){if(typeof e!=`object`||!e||Array.isArray(e))return;let t=e,n={};for(let e of[`inputTokens`,`outputTokens`,`totalTokens`,`cachedInputTokens`,`reasoningTokens`,`estimatedCostUSD`]){let r=t[e];typeof r==`number`&&Number.isFinite(r)&&r>=0&&(n[e]=r)}return Object.keys(n).length>0?n:void 0}async function Oi(e,t){return(await e.request(`POST`,`/v1/runs`,t)).run}async function G(e){return(await e.request(`GET`,`/v1/runs`)).runs}async function ki(e,t,n,r){return e.request(`POST`,`/v1/runs/${encodeURIComponent(t)}/approvals/${encodeURIComponent(n)}`,{action:r})}async function Ai(e,t,n,r){return e.request(`POST`,`/v1/runs/${encodeURIComponent(t)}/inputs/${encodeURIComponent(n)}`,r)}async function ji(e,t,n){await e.request(`POST`,`/v1/runs/${encodeURIComponent(t)}/steer`,{text:n})}async function Mi(e,t){return(await e.request(`POST`,`/v1/runs/${encodeURIComponent(t)}/cancel`,{})).status}async function*Ni(e,t,n={}){let{signal:r}=n,i=n.afterSeq??0,a=n.retryDelayMs??3e3,o=n.maxRetryDelayMs??15e3;for(;!r?.aborted;){try{let n=await e.stream(`/v1/runs/${encodeURIComponent(t)}/events`,{...i>0?{lastEventId:String(i)}:{},signal:r});for await(let e of Ci(n.body)){if(e.retryMs!==void 0&&(a=Math.min(e.retryMs,o)),e.id===void 0||e.data===void 0||e.id<=i)continue;i=e.id;let t=e.data;if(yield{seq:e.id,event:t},t.type===`done`)return}}catch(e){if(r?.aborted)return;if(e instanceof d)throw e}if(r?.aborted)return;await Fi(Pi(a,o),r)}}function Pi(e,t){return Math.min(Math.round(e*(1+Math.random()*.3)),t)}function Fi(e,t){return new Promise(n=>{let r=setTimeout(i,e);function i(){clearTimeout(r),t?.removeEventListener(`abort`,i),n()}t?.addEventListener(`abort`,i,{once:!0})})}async function Ii(e,t={}){let n=new URLSearchParams;t.limit!==void 0&&n.set(`limit`,String(t.limit)),t.profile!==void 0&&n.set(`profile`,t.profile),t.archived!==void 0&&n.set(`archived`,String(t.archived)),t.search?.trim()&&n.set(`q`,t.search.trim());let r=n.size>0?`?${n.toString()}`:``;return(await e.request(`GET`,`/v1/sessions${r}`)).sessions}async function Li(e,t){return(await e.request(`GET`,`/v1/sessions/${encodeURIComponent(t)}`)).session}async function Ri(e,t){return(await e.request(`DELETE`,`/v1/sessions/${encodeURIComponent(t)}`)).deleted}async function zi(e,t,n){return(await e.request(`PATCH`,`/v1/sessions/${encodeURIComponent(t)}`,n)).session}async function Bi(e,t,n){return{compacted:(await e.request(`POST`,`/v1/sessions/${encodeURIComponent(t)}/compact`,n)).compacted}}var Vi=80;function Hi(e,t){if(e.some(e=>e.id===t.id))return e;let n=t.now??new Date().toISOString();return[{id:t.id,profileName:t.profileName,createdAt:n,updatedAt:n,turnCount:1,preview:Ui(t.prompt),pending:!0},...e]}function Ui(e){let t=e.replace(/\s+/g,` `).trim();return t.length<=Vi?t:`${t.slice(0,Vi-1).trimEnd()}…`}var Wi=class{client;dispatch;onDone;loops=new Map;constructor(e,t,n){this.client=e,this.dispatch=t,this.onDone=n}attach(e,t=0){if(this.loops.has(e))return;let n=new AbortController;this.loops.set(e,n),this.pump(e,t,n.signal).finally(()=>{this.loops.delete(e)})}following(e){return this.loops.has(e)}stop(e){this.loops.get(e)?.abort(),this.loops.delete(e)}stopAll(){for(let e of this.loops.values())e.abort();this.loops.clear()}async pump(e,t,n){try{for await(let{seq:r,event:i}of Ni(this.client,e,{afterSeq:t,signal:n}))this.dispatch({type:`run_event`,runId:e,seq:r,event:i}),i.type===`done`&&this.onDone?.(e)}catch(t){if(n.aborted)return;if(t instanceof d&&t.code===`RUN_NOT_FOUND`){this.dispatch({type:`run_lost`,runId:e});return}this.dispatch({type:`notice`,tone:`error`,text:`Run stream failed: ${t instanceof Error?t.message:String(t)}`})}}},Gi=1e4,Ki=75,qi=15e3;function Ji(e){let{client:t,route:n,navigate:r,onUnauthorized:i}=e,[a,o]=(0,l.useState)([]),[s,c]=(0,l.useState)(),[u,f]=(0,l.useState)([]),[p,m]=(0,l.useState)([]),[h,g]=(0,l.useState)(()=>new Set),[_,v]=(0,l.useState)(``),[b,x]=(0,l.useState)(!1),[S,C]=(0,l.useState)([]),[T,E]=(0,l.useState)(n.session),[D,te]=(0,l.useState)(!1),[ne,O]=(0,l.useState)([]),[re,ie]=(0,l.useState)(),[ae,oe]=(0,l.useState)(!1),[k,A]=(0,l.useState)(!1),[se,j]=(0,l.useReducer)(Mr,void 0,()=>Or(n.session)),ce=(0,l.useRef)(se);ce.current=se;let M=n.profile,[le,N]=(0,l.useState)({}),ue=`${M??`_`}:${T??`new`}`,de=le[ue]??[],fe=(0,l.useRef)(de);fe.current=de;let pe=(0,l.useRef)(()=>void 0),P=(0,l.useRef)(()=>void 0),me=(0,l.useRef)(()=>void 0),F=(0,l.useRef)(new Set),he=(0,l.useRef)(new Set),ge=(0,l.useRef)(void 0),xe=(0,l.useCallback)(()=>ge.current?(ge.current.controller.abort(),ge.current=void 0,A(!1),!0):!1,[]),Se=(0,l.useMemo)(()=>new Wi(t,j,e=>{pe.current(),P.current(),F.current.delete(e)&&(he.current.add(e),me.current())}),[t]);(0,l.useEffect)(()=>()=>Se.stopAll(),[Se]),(0,l.useEffect)(()=>()=>{xe()},[xe]);let I=(0,l.useCallback)(e=>{if(e instanceof d&&e.code===`UNAUTHORIZED`){i();return}j({type:`notice`,tone:`error`,text:e instanceof Error?e.message:String(e)})},[i]),Ce=(0,l.useCallback)(e=>{g(t=>{let n;for(let r of e)t.has(r)||(n??=new Set(t),n.add(r));return n??t})},[]),Te=(0,l.useCallback)(e=>{g(t=>{if(!t.has(e))return t;let n=new Set(t);return n.delete(e),n})},[]),Ee=(0,l.useCallback)(async e=>{let n=await G(t);C(n);let r=n.filter(t=>t.sessionId===e&&!he.current.has(t.id)),i=[];for(let e of r)e.status===`running`?Se.attach(e.id):ce.current.items.some(t=>t.kind===`run`&&t.run.runId===e.id)||i.push(e);i.length>0&&j({type:`catch_up`,runs:i})},[t,Se]),De=(0,l.useCallback)(async e=>{if(Se.stopAll(),j({type:`reset`,sessionId:e}),e){try{let n=await Li(t,e);Ce([e]),j({type:`session_loaded`,turns:n.turns.map(t=>{if(t.role===`assistant`)return{role:t.role,content:t.content,...t.responseMetrics?{responseMeta:{mode:t.responseMetrics.mode,startedAt:t.responseMetrics.startedAt,finishedAt:t.responseMetrics.finishedAt,latencyMs:t.responseMetrics.latencyMs,usage:t.responseMetrics.usage}}:{}};let n=et(t.content),r=[...ea(e,t.attachments??[]),...n.files.map(e=>{let t=Ye(e.name);return{kind:`text`,name:e.name,content:e.content,...t?{officeKind:t}:{},...e.content.includes(`[Office extraction truncated to fit the attachment text limit.]`)?{truncated:!0}:{}}})];return{role:t.role,content:n.prompt,...r.length>0?{attachments:r}:{}}})})}catch(t){if(!(t instanceof d&&t.status===404)){I(t);return}Te(e)}try{await Ee(e)}catch(e){I(e)}}},[t,Se,Ee,Te,I,Ce]);(0,l.useEffect)(()=>{g(new Set)},[t]),(0,l.useEffect)(()=>{let e=!1;return(async()=>{try{let[n,r]=await Promise.all([_e(t),y(t)]);if(e)return;o(n),O(r.options)}catch(t){e||I(t)}})(),()=>{e=!0}},[t,I]),(0,l.useEffect)(()=>{if(!M)return;let e=!1;return(async()=>{try{let[n,r]=await Promise.all([ve(t,M),w(t,M).catch(()=>[])]);if(e)return;c(n),f(r),te(n.settings.think??!1)}catch(t){e||I(t)}})(),()=>{e=!0}},[t,M,I]),(0,l.useEffect)(()=>{if(!M)return;let e=!1,n=window.setTimeout(()=>{Ii(t,{profile:M,limit:100,archived:b,search:_}).then(t=>{e||(Ce(t.map(e=>e.id)),m(t))}).catch(t=>{e||I(t)})},_?180:0);return()=>{e=!0,window.clearTimeout(n)}},[t,I,M,Ce,_,b]),(0,l.useEffect)(()=>{n.session!==T&&(xe(),E(n.session),De(n.session))},[n.session]),(0,l.useEffect)(()=>{T&&De(T)},[]),(0,l.useEffect)(()=>{if(!T)return;let e=setInterval(()=>{document.visibilityState===`visible`&&Ee(T).catch(()=>void 0)},Gi);return()=>clearInterval(e)},[T,Ee]);let Oe=(0,l.useCallback)(async()=>{try{o(await _e(t))}catch{}},[t]),ke=(0,l.useCallback)(async(e,n)=>{try{return o(await we(t,e,n)),!0}catch(e){return I(e),!1}},[t,I]),Me=(0,l.useCallback)(async(e=T)=>{if(M)try{let n=await Ii(t,{profile:M,limit:100,archived:b,search:_});if(Ce(n.map(e=>e.id)),m(n),e&&!n.some(t=>t.id===e))try{await Li(t,e),Ce([e])}catch(t){t instanceof d&&t.status===404&&Te(e)}}catch{}},[t,Te,M,Ce,T,_,b]);pe.current=()=>{Me()};let Ne=(0,l.useCallback)(async()=>{try{C(await G(t))}catch{}},[t]);P.current=()=>{Ne()},me.current=()=>{T&&De(T)};let Pe=(0,l.useCallback)(e=>{xe(),Se.stopAll(),E(void 0),j({type:`reset`}),r({view:`agent`,profile:e})},[xe,Se,r]),Fe=(0,l.useCallback)(()=>{xe(),Se.stopAll(),E(void 0),c(void 0),m([]),f([]),j({type:`reset`}),r({view:`agent`}),Oe()},[xe,Se,r,Oe]),Ie=(0,l.useCallback)(e=>{!M||e===T||(xe(),E(e),r({view:`agent`,profile:M,session:e}),De(e))},[xe,M,T,r,De]),Le=(0,l.useCallback)(()=>{if(!M||T&&!h.has(T))return;let e=crypto.randomUUID();xe(),Se.stopAll(),E(e),j({type:`reset`,sessionId:e}),r({view:`agent`,profile:M,session:e})},[xe,M,Se,r,h,T]),ze=(0,l.useCallback)(e=>{Ce([e.id]),m(t=>t.map(t=>t.id===e.id?e:t).sort((e,t)=>Number(!!t.pinned)-Number(!!e.pinned)||t.updatedAt.localeCompare(e.updatedAt)))},[Ce]),Be=(0,l.useCallback)(async(e,n)=>{try{return ze(await zi(t,e,{title:n})),!0}catch(e){return I(e),!1}},[t,I,ze]),Ve=(0,l.useCallback)(async(e,n)=>{try{return ze(await zi(t,e,{pinned:n})),!0}catch(e){return I(e),!1}},[t,I,ze]),He=(0,l.useCallback)(async(e,n)=>{try{return await zi(t,e,{archived:n}),m(t=>t.filter(t=>t.id!==e)),n&&e===T&&M&&(xe(),Se.stopAll(),E(void 0),j({type:`reset`}),r({view:`agent`,profile:M})),!0}catch(e){return I(e),!1}},[xe,t,Se,I,r,M,T]),Ue=(0,l.useCallback)(async e=>{try{let n=(await G(t)).filter(t=>t.sessionId===e&&t.status===`running`);for(let e of n)await Mi(t,e.id);n.length>0&&await Xi(t,e),ge.current?.sessionId===e&&xe();let i=p.some(t=>t.id===e&&t.pending);return!await Zi(t,e)&&!i?!1:(Te(e),m(t=>t.filter(t=>t.id!==e)),C(t=>t.filter(t=>t.sessionId!==e)),M&&N(t=>{let n={...t};return delete n[`${M}:${e}`],n}),e===T&&M&&(Se.stopAll(),E(void 0),j({type:`reset`}),r({view:`agent`,profile:M})),!0)}catch(e){return I(e),!1}},[xe,t,Se,Te,I,r,M,T,p]),We=(0,l.useCallback)(async e=>{let t=await tt(e,fe.current);for(let e of t.rejected)j({type:`notice`,tone:`warn`,text:e});t.accepted.length>0&&N(e=>({...e,[ue]:[...e[ue]??[],...t.accepted]}))},[ue]),Ge=(0,l.useCallback)(e=>{N(t=>({...t,[ue]:(t[ue]??[]).filter((t,n)=>n!==e)}))},[ue]),Ke=(0,l.useCallback)(async(e,n={})=>{if(!M)return!1;let i=jr(ce.current);if(i)try{return await ji(t,i.runId,e),!0}catch(e){return I(e),!1}let a;if(e.startsWith(`$`)){try{a=await ee(t,e,M)}catch(e){return I(e),!1}if(a.missing.length>0)return j({type:`notice`,tone:`warn`,text:`Missing required skill value(s): ${a.missing.join(`, `)}. Usage: ${a.usage}`}),!1}let o=T;o||(o=crypto.randomUUID(),E(o),r({view:`agent`,profile:M,session:o}));let c=n.attachments??fe.current,l=a?.mode??s?.settings.mode??`agent`;if(l===`chat`&&c.some(e=>e.kind===`file`))return j({type:`notice`,tone:`warn`,text:`Binary attachments require Agent mode so inspect_attachment can open them.`}),!1;if(n.originalImages&&c.reduce((e,t)=>e+(t.kind===`image`?t.originalSize??t.size:t.size),0)>16777216)return j({type:`notice`,tone:`warn`,text:`/attach-original attachments exceed the ${Re/(1024*1024)} MiB request limit.`}),!1;n.attachments===void 0&&N(e=>{let t={...e};return delete t[ue],t});let u=c.filter(e=>e.kind===`image`),d=await Promise.all(u.map(async e=>n.originalImages&&e.originalFile?{data:await at(e.originalFile),mediaType:e.originalFile.type||e.mediaType}:{data:e.data,mediaType:e.mediaType})),f=c.filter(e=>e.kind===`text`),p=c.filter(e=>e.kind!==`image`),h=await Promise.all(p.map(async e=>{if(e.kind===`file`)return{name:e.name,mediaType:e.mediaType,data:await at(e.originalFile)};let t=e.originalFile??new Blob([e.content],{type:e.mediaType||`text/plain`});return{name:e.name,mediaType:e.mediaType||t.type||`text/plain`,data:await at(t),inspectionText:e.content}})),g=$e(a?.prompt??e,f,l),_=l===`agent`&&!a&&f.length>0?Qe(e,f):void 0,v=c.map(e=>e.kind===`image`?{kind:`image`,name:e.name,previewUrl:`data:${e.mediaType};base64,${e.data}`}:e.kind===`file`?{kind:`file`,name:e.name}:{kind:`text`,name:e.name,content:e.content,...e.officeKind?{officeKind:e.officeKind}:{},...e.truncated?{truncated:!0}:{}});n.replaceItemId?j({type:`edit_user_message`,itemId:n.replaceItemId,text:e,attachments:v}):(j({type:`user_message`,text:e,attachments:v}),m(t=>Hi(t,{id:o,profileName:M,prompt:e})));let[y,b]=na(re);if(l===`chat`){oe(!0),j({type:`chat_started`});let e=!0,r=new AbortController;ge.current={sessionId:o,controller:r},A(!0);try{for await(let i of Ei(t,{prompt:g,...a?{userTurn:a.userTurn,instructions:a.instructions,isolated:!0}:{},profile:M,sessionId:o,replaceUserTurnIndex:n.replaceUserTurnIndex,think:D,provider:y,model:b,...d.length>0?{images:d}:{},...n.originalImages?{originalImages:!0}:{}},r.signal))i.type===`chunk`?j({type:`chat_chunk`,text:i.text}):i.type===`reasoning`?j({type:`chat_reasoning`,text:i.text}):i.type===`error`?(e=!1,j({type:`chat_error`,message:i.message})):j({type:`chat_done`,usage:i.usage,latencyMs:i.latencyMs});return r.signal.aborted&&(e=!1),e}catch(e){return r.signal.aborted||(j({type:`chat_done`}),I(e)),!1}finally{ge.current?.controller===r&&(ge.current=void 0,A(!1)),oe(!1),Me(o),n.replaceUserTurnIndex!==void 0&&De(o)}}try{oe(!0);let e=await Oi(t,{objective:g,...a?{userTurn:a.userTurn,instructions:a.instructions,lean:!0}:_?{userTurn:_}:{},profile:M,sessionId:o,replaceUserTurnIndex:n.replaceUserTurnIndex,think:D,provider:y,model:b,...d.length>0?{images:d}:{},...h.length>0?{files:h}:{},...n.originalImages?{originalImages:!0}:{}});return j({type:`run_created`,run:e}),C(t=>[e,...t.filter(t=>t.id!==e.id)]),n.replaceUserTurnIndex!==void 0&&F.current.add(e.id),Se.attach(e.id),!0}catch(e){return I(e),Me(o),n.replaceUserTurnIndex!==void 0&&De(o),!1}finally{oe(!1)}},[t,M,T,re,D,s,Se,r,I,Me,De,ue]),qe=(0,l.useCallback)(async()=>{if(xe())return j({type:`chat_cancelled`}),!0;let e=jr(ce.current);if(!e)return!1;try{return await Mi(t,e.runId),!0}catch(e){return I(e),!1}},[xe,t,I]),Je=(0,l.useCallback)(async({name:e,args:n})=>{let r=(e,t=`info`)=>j({type:`notice`,tone:t,text:e});switch(e){case`help`:r(En.map(e=>`${e.usage} — ${e.description}`).join(`
28
28
  `));break;case`status`:r([`Profile: ${M??`—`}`,`Mode: ${s?.settings.mode??`agent`}`,`Model: ${re??`Auto (profile default)`}`,`Thinking: ${D?`on`:`off`}`,`Session: ${T??`new`}`].join(`
29
29
  `));break;case`copy`:{let e=[...ce.current.items].reverse().find(e=>e.kind===`assistant`),t=e&&e.kind===`assistant`?e.markdown:``;if(!t){r(`Nothing to copy yet.`);break}try{await navigator.clipboard.writeText(t),r(`Copied the last response to the clipboard.`)}catch{r(`Clipboard is unavailable in this browser context.`,`warn`)}break}case`retry`:{let e=[...ce.current.items].reverse().find(e=>e.kind===`user`),t=e&&e.kind===`user`?e.text:``;if(!t){r(`No previous message to retry.`);break}await Ke(t);break}case`attach-original`:n?jr(ce.current)?r(`A task is running. Stop it before sending attached images.`,`warn`):await Ke(n,{originalImages:!0}):r(`Usage: /attach-original <prompt>`,`warn`);break;case`new`:Le();break;case`agent`:case`chat`:if(!M)break;try{let n=await be(t,M,{mode:e});c(n),r(`Profile mode set to ${e} (saved to the profile).`)}catch(e){I(e)}break;case`think`:te(!D),r(`Thinking mode ${D?`off`:`on`}.`);break;case`model`:n?(ie(n),r(`Model set to ${n}.`)):r(`Usage: /model <provider/model>, e.g. /model xai/grok-4.5`,`warn`);break;case`btw`:{if(!n){r(`Usage: /btw <text>`,`warn`);break}let e=jr(ce.current);e?await ji(t,e.runId,n).catch(I):r(`No task is running to steer.`);break}case`stop`:await qe()||r(`No task is running.`);break;case`remember`:if(!M||!n){r(`Usage: /remember <text>`,`warn`);break}try{await je(t,M,n),r(`Saved to memory.`)}catch(e){I(e)}break;case`forget`:if(!M||!n){r(`Usage: /forget <query>`,`warn`);break}try{let e=await ye(t,M),i=n.toLowerCase(),a=e.filter(e=>e.text.toLowerCase().includes(i));if(a.length===0){r(`No memories match "${n}".`);break}for(let e of a)await Ae(t,M,e.id,`forget`);r(`Forgot ${a.length} ${a.length===1?`memory`:`memories`}.`)}catch(e){I(e)}break;case`context-window`:{let e=s?.settings.maxContextTokens,t=s?.settings.sessionContextTurns;r([`Context budget: ${e===void 0?`default`:`${e} tokens`}`,`Turn window: ${t===void 0?`all`:`${t} turns`}`,`Change these in Config → the profile.`].join(`
30
30
  `));break}case`compact`:{if(!T){r(`No session to compact yet.`);break}let[e,n]=na(re);try{r((await Bi(t,T,{profile:M??`default`,...e?{provider:e}:{},...n?{model:n}:{},think:D})).compacted?`Compacted older turns in this session.`:`Nothing to compact yet.`),Me()}catch(e){I(e)}break}default:r(`Unknown command: /${e}`,`warn`)}},[t,M,s,re,D,T,Le,te,ie,c,Ke,Me,I,qe]),Xe=(0,l.useCallback)(async e=>{let t=e.trim();if(!t||!M)return;let n=Tn(t);if(n){await Je(n);return}await Ke(t)},[M,Je,Ke]),Ze=(0,l.useCallback)(async(e,n)=>{let r=n.trim();if(!r)return!1;let i=ce.current.items,a=i.findIndex(t=>t.id===e),o=i[a];if(a===-1||!o||o.kind!==`user`)return j({type:`notice`,tone:`warn`,text:`That message is no longer available to edit.`}),!1;let s=i.slice(0,a).filter(e=>e.kind===`user`&&e.sessionUserTurnIndex!==void 0).length,c=o.sessionUserTurnIndex??s,l=o.sessionUserTurnIndex!==void 0,u=await $i(o.attachments,t);oe(!0);try{if(l&&!T)throw Error(`Cannot edit durable history without a session.`);(o.attachments?.length??0)>u.length&&j({type:`notice`,tone:`warn`,text:`Only retained image attachments could be included with the edited message.`}),l||j({type:`discard_from`,itemId:e});let t=await Ke(r,{attachments:u,...l?{replaceUserTurnIndex:c,replaceItemId:e}:{}});return!t&&l&&T&&await De(T),t}catch(e){return I(e),!1}finally{oe(!1)}},[T,Ke,De,I]),nt=(0,l.useCallback)(async e=>{try{await Mi(t,e)}catch(e){I(e)}},[t,I]),rt=(0,l.useCallback)(async(e,n,r)=>{j({type:`approval_submitting`,runId:e});try{await ki(t,e,n,r)}catch(t){let n=t instanceof d&&t.code===`APPROVAL_NOT_FOUND`;j({type:`approval_failed`,runId:e,gone:n,message:n?`That approval already resolved (answered elsewhere or timed out).`:t instanceof Error?t.message:String(t)})}},[t]),it=(0,l.useCallback)(async(e,n,r)=>{j({type:`user_input_submitting`,runId:e});try{await Ai(t,e,n,r)}catch(t){let n=t instanceof d&&t.code===`USER_INPUT_NOT_FOUND`;j({type:`user_input_failed`,runId:e,gone:n,message:n?`Those questions already resolved (answered elsewhere or timed out).`:t instanceof Error?t.message:String(t)})}},[t]),ot=(0,l.useCallback)(e=>j({type:`toggle_run_details`,runId:e}),[]),st=(0,l.useCallback)(e=>{he.current.add(e.id),j({type:`run_created`,run:{...e,status:`running`}}),Se.attach(e.id,0),j({type:`dismiss_catch_up`,runId:e.id})},[Se]),ct=(0,l.useCallback)(()=>{for(let e of ce.current.catchUp)he.current.add(e.id);j({type:`dismiss_catch_up`})},[]);return{profiles:a,profileName:M,profileDetail:s,skills:u,sessions:p,sessionSearch:_,setSessionSearch:v,showArchivedSessions:b,setShowArchivedSessions:x,runningSessionIds:new Set([...S.filter(e=>e.status===`running`&&e.sessionId).map(e=>e.sessionId),...ae&&T?[T]:[]]),sessionId:T,thread:se,steeringRun:jr(se)?.runId,responding:k||jr(se)!==void 0,sending:ae,think:D,setThink:te,modelOptions:ne,modelChoice:re,setModelChoice:ie,attachments:de,addFiles:We,removeAttachment:Ge,send:Xe,resendEdited:Ze,refreshProfiles:Oe,setProfilePinned:ke,showProfiles:Fe,selectProfile:Pe,selectSession:Ie,newSession:Le,renameSession:Be,setSessionPinned:Ve,setSessionArchived:He,deleteSession:Ue,cancel:nt,stop:qe,answer:rt,answerInput:it,toggleRun:ot,expandCatchUp:st,dismissCatchUp:ct}}function Yi(e){let t=/^data:(image\/(?:png|jpeg|webp|gif));base64,(.*)$/s.exec(e);return t?{mediaType:t[1],data:t[2]}:void 0}async function Xi(e,t){let n=Date.now()+qi;for(;Date.now()<n;){if(!(await G(e)).some(e=>e.sessionId===t&&e.status===`running`))return;await new Promise(e=>window.setTimeout(e,Ki))}throw Error(`The active run did not stop in time. The session was not deleted.`)}async function Zi(e,t){let n=Date.now()+qi;for(;Date.now()<n;)try{return await Ri(e,t)}catch(e){if(!(e instanceof d&&e.code===`AGENT_RUN_INVALID`))throw e;await new Promise(e=>window.setTimeout(e,Ki))}throw Error(`The active request did not stop in time. The session was not deleted.`)}function Qi(e){let t=e.endsWith(`==`)?2:+!!e.endsWith(`=`);return Math.max(0,Math.floor(e.length*3/4)-t)}async function $i(e,t){let n=[];for(let r of e??[]){if(r.kind===`file`)continue;if(r.kind===`text`){if(r.content===void 0)continue;n.push({kind:`text`,name:r.name,size:new TextEncoder().encode(r.content).length,content:r.content,...r.officeKind?{officeKind:r.officeKind}:{},...r.truncated?{truncated:!0}:{}});continue}let e=r.previewUrl?Yi(r.previewUrl):void 0;if(!e&&r.sourcePath){let n=await t.blob(r.sourcePath);n&&(e={mediaType:n.type||`image/jpeg`,data:await ta(n)})}if(!e)continue;let i=Qi(e.data);n.push({kind:`image`,name:r.name,size:i,originalSize:i,optimized:!1,data:e.data,mediaType:e.mediaType})}return n}function ea(e,t){return t.flatMap((t,n)=>{let r=t.data?`data:${t.mediaType};base64,${t.data}`:t.url,i=t.ref?`/v1/sessions/${encodeURIComponent(e)}/attachments/${t.ref.userTurnIndex}/${t.ref.attachmentIndex}`:void 0;return r||i?[{kind:`image`,name:`Image ${n+1}`,...r?{previewUrl:r}:{},...i?{sourcePath:i}:{}}]:[]})}async function ta(e){let t=new Uint8Array(await e.arrayBuffer()),n=``,r=32768;for(let e=0;e<t.length;e+=r)n+=String.fromCharCode(...t.subarray(e,e+r));return btoa(n)}function na(e){if(!e)return[void 0,void 0];let t=e.indexOf(`/`);return t===-1?[void 0,e]:[e.slice(0,t),e.slice(t+1)]}var ra={layout:`_layout_i7gpx_1`,threadPane:`_threadPane_i7gpx_7`,dropOverlay:`_dropOverlay_i7gpx_16`,chooseProfile:`_chooseProfile_i7gpx_32`,chooseTitle:`_chooseTitle_i7gpx_40`,chooseHint:`_chooseHint_i7gpx_46`},ia=`marifold.sidebars`;function aa(e){let t=Ji(e),n=rn(e.client,e.onUnauthorized),[r,i]=(0,l.useState)(()=>localStorage.getItem(ia)===`hidden`),[a,o]=(0,l.useState)(!1),[s,c]=(0,l.useState)(!1),[u,d]=(0,l.useState)(!1),[f,p]=(0,l.useState)(!1),[m,h]=(0,l.useState)(),[g,_]=(0,l.useState)(0),v=e.workspaceView===`apps`;async function y(n){p(!0),h(void 0);try{await ke(e.client,n),await t.refreshProfiles(),d(!1),t.selectProfile(n.name)}catch(e){await t.refreshProfiles(),h(e instanceof Error?e.message:String(e))}finally{p(!1)}}function b(){i(e=>(localStorage.setItem(ia,e?`shown`:`hidden`),!e))}function x(e){[...e.dataTransfer.types].includes(`Files`)&&(e.preventDefault(),c(!0))}function S(e){if(![...e.dataTransfer.types].includes(`Files`))return;e.preventDefault(),c(!1);let n=[...e.dataTransfer.files];n.length>0&&t.addFiles(n)}let C=(0,l.useMemo)(()=>{let e=new Set;return t.steeringRun&&t.profileName&&e.add(t.profileName),e},[t.steeringRun,t.profileName]),w=t.sessions.find(e=>e.id===t.sessionId),ee=(0,F.jsx)(jt,{theme:e.theme,onThemeChange:e.onThemeChange,onOpenConnection:e.onOpenConnection,onOpenSettings:e.onOpenSettings,connectionName:e.connectionName});return(0,F.jsxs)(`div`,{className:ra.layout,children:[r?null:(0,F.jsx)(xt,{children:(0,F.jsx)(Qt,{ariaLabel:v?`Apps`:t.profileName?`Sessions`:`Profiles`,footer:ee,showBrand:v||!t.profileName,children:v?(0,F.jsx)(en,{client:e.client,apps:n.apps,selected:n.selectedName,busy:a,loading:n.loading,onSelect:n.select}):t.profileName?(0,F.jsx)(Kn,{sessions:t.sessions,selected:t.sessionId,profileName:t.profileName,profileDisplayName:t.profileDetail?.displayName,profileAvatar:(0,F.jsx)(Ne,{client:e.client,name:t.profileName,label:t.profileDetail?.displayName,hasAvatar:t.profiles.some(e=>e.name===t.profileName&&e.avatar!==void 0),size:64}),search:t.sessionSearch,onSearchChange:t.setSessionSearch,showArchived:t.showArchivedSessions,onShowArchivedChange:t.setShowArchivedSessions,runningSessionIds:t.runningSessionIds,onSelect:t.selectSession,onNew:t.newSession,onBack:t.showProfiles,onConfigureProfile:()=>e.navigate({view:`config`,section:`profiles`,item:t.profileName}),onRename:t.renameSession,onSetPinned:t.setSessionPinned,onSetArchived:t.setSessionArchived,onDelete:t.deleteSession}):(0,F.jsx)(Bn,{client:e.client,profiles:t.profiles,selected:t.profileName,workingProfiles:C,onSelect:t.selectProfile,onSetPinned:t.setProfilePinned,onConfigure:t=>e.navigate({view:`config`,section:`profiles`,item:t}),onCreate:()=>{h(void 0),d(!0)}})})}),(0,F.jsxs)(`div`,{className:ra.threadPane,onDragOver:v?void 0:x,onDragLeave:()=>c(!1),onDrop:v?void 0:S,children:[!v&&s?(0,F.jsx)(`div`,{className:ra.dropOverlay,"aria-hidden":!0,children:`Drop to attach`}):null,(0,F.jsx)(ar,{sessionTitle:v?`Apps`:t.profileName?w?$n(w):`New session`:`Profiles`,sidebarsHidden:r,onToggleSidebars:b,view:e.workspaceView,onViewChange:e.onWorkspaceViewChange}),v?(0,F.jsx)(Vt,{client:e.client,onUnauthorized:e.onUnauthorized,app:n.selected,loading:n.loading,loadError:n.error,onBusyChange:o}):t.profileName?(0,F.jsxs)(F.Fragment,{children:[(0,F.jsx)(fn,{runs:t.thread.catchUp,onShow:t.expandCatchUp,onDismiss:t.dismissCatchUp}),(0,F.jsx)(di,{client:e.client,items:t.thread.items,scrollToBottomRequest:g,onCancelRun:e=>void t.cancel(e),onAnswerApproval:(e,n,r)=>void t.answer(e,n,r),onSubmitUserInput:(e,n,r)=>void t.answerInput(e,n,r),onToggleRun:t.toggleRun,onEditUserMessage:t.resendEdited,editingDisabled:t.steeringRun!==void 0||t.sending},t.sessionId??`new-session`),(0,F.jsx)(On,{draftKey:`${e.connectionId}:${t.profileName}:${t.sessionId??`new`}`,steering:t.steeringRun!==void 0,responding:t.responding,disabled:t.sending,think:t.think,onToggleThink:()=>t.setThink(!t.think),modelOptions:t.modelOptions,modelChoice:t.modelChoice,onSelectModel:t.setModelChoice,attachments:t.attachments,onAttachFiles:e=>void t.addFiles(e),onRemoveAttachment:t.removeAttachment,skills:t.skills,onSubmit:e=>{_(e=>e+1),t.send(e)},onStop:()=>void t.stop()})]}):(0,F.jsxs)(`div`,{className:ra.chooseProfile,children:[(0,F.jsx)(`div`,{className:ra.chooseTitle,children:`Choose a profile`}),(0,F.jsx)(`div`,{className:ra.chooseHint,children:`Profiles keep their own instructions, sessions, skills, and memories.`})]})]}),u?(0,F.jsx)(_t,{existingNames:t.profiles.map(e=>e.name),modelOptions:t.modelOptions,busy:f,error:m,onSubmit:e=>void y(e),onClose:()=>d(!1)}):null]})}var K={backdrop:`_backdrop_avq38_1`,sheet:`_sheet_avq38_12`,header:`_header_avq38_24`,title:`_title_avq38_34`,subtitle:`_subtitle_avq38_39`,close:`_close_avq38_45`,catalog:`_catalog_avq38_65`,providerOption:`_providerOption_avq38_71`,optionText:`_optionText_avq38_91`,optionName:`_optionName_avq38_98`,optionLabel:`_optionLabel_avq38_109`,kind:`_kind_avq38_118`,configured:`_configured_avq38_119`,empty:`_empty_avq38_134`,setup:`_setup_avq38_141`,back:`_back_avq38_1`,metadata:`_metadata_avq38_157`,field:`_field_avq38_173`,hint:`_hint_avq38_208`,problem:`_problem_avq38_214`,actions:`_actions_avq38_219`,cancel:`_cancel_avq38_225`,add:`_add_avq38_226`},oa={local:`Local`,api:`API key`,oauth:`OAuth`};function sa(e){let[t,n]=(0,l.useState)(),[r,i]=(0,l.useState)(``),[a,o]=(0,l.useState)(``),[s,c]=(0,l.useState)(``),u=(0,l.useRef)(null),d=(0,l.useRef)(null),f=(0,l.useRef)(null),p=(0,l.useRef)(null),m=(0,l.useRef)(e.onClose),h=(0,l.useRef)(e.busy);m.current=e.onClose,h.current=e.busy;let g=e.catalog?.find(e=>e.name===t),_=new Set(e.existingNames),v=e.catalog?.find(e=>!_.has(e.name))?.name,y=g?.type===`ollama`||g?.type===`openai-compatible`,b=g?.kind===`api`,x=!!(y&&!r.trim()),S=!!(b&&!a.trim()),C=!!(g&&!x&&!S&&!e.busy);(0,l.useEffect)(()=>{let e=document.activeElement instanceof HTMLElement?document.activeElement:void 0,t=document.body.style.overflow;document.body.style.overflow=`hidden`;function n(e){if(e.key===`Escape`&&!h.current){m.current();return}if(e.key!==`Tab`)return;let t=[...u.current?.querySelectorAll(`button:not(:disabled), input:not(:disabled)`)??[]];if(t.length===0)return;let n=t.indexOf(document.activeElement),r=n<0?e.shiftKey?t.length-1:0:e.shiftKey?(n-1+t.length)%t.length:(n+1)%t.length;e.preventDefault(),t[r]?.focus()}return document.addEventListener(`keydown`,n),()=>{document.body.style.overflow=t,document.removeEventListener(`keydown`,n),e?.focus()}},[]),(0,l.useEffect)(()=>{g?f.current?.focus():(d.current??p.current)?.focus()},[g,v]);function w(e){_.has(e.name)||(n(e.name),i(e.defaultBaseUrl??``),o(e.apiKeyEnv??``),c(``))}function ee(){!g||!C||e.onSubmit({name:g.name,...r.trim()?{baseUrl:r.trim()}:{},...a.trim()?{apiKeyEnv:a.trim()}:{},...s.trim()?{proxy:s.trim()}:{}})}return(0,F.jsx)(`div`,{className:K.backdrop,onClick:e.busy?void 0:e.onClose,children:(0,F.jsxs)(`div`,{ref:u,className:K.sheet,role:`dialog`,"aria-modal":`true`,"aria-labelledby":`add-provider-title`,onClick:e=>e.stopPropagation(),children:[(0,F.jsxs)(`header`,{className:K.header,children:[(0,F.jsxs)(`div`,{children:[(0,F.jsx)(`div`,{id:`add-provider-title`,className:K.title,children:`Add provider`}),(0,F.jsx)(`div`,{className:K.subtitle,children:g?`${g.name} — ${g.label}`:`Choose from the same catalog as the CLI.`})]}),(0,F.jsx)(`button`,{ref:p,type:`button`,className:K.close,"aria-label":`Close`,disabled:e.busy,onClick:e.onClose,children:`×`})]}),g?(0,F.jsxs)(`form`,{className:K.setup,onSubmit:e=>{e.preventDefault(),ee()},children:[(0,F.jsx)(`button`,{type:`button`,className:K.back,disabled:e.busy,onClick:()=>n(void 0),children:`‹ All providers`}),(0,F.jsxs)(`div`,{className:K.metadata,children:[(0,F.jsx)(`span`,{children:`Type`}),(0,F.jsx)(`code`,{children:g.type}),(0,F.jsx)(`span`,{children:`Authentication`}),(0,F.jsx)(`span`,{children:oa[g.kind]})]}),y?(0,F.jsxs)(`label`,{className:K.field,children:[(0,F.jsx)(`span`,{children:`Server URL`}),(0,F.jsx)(`input`,{ref:f,value:r,disabled:e.busy,placeholder:`https://llm.example.com/v1`,onChange:e=>i(e.target.value)}),x?(0,F.jsx)(`small`,{children:`A server URL is required.`}):null]}):null,b?(0,F.jsxs)(`label`,{className:K.field,children:[(0,F.jsx)(`span`,{children:`API key environment variable`}),(0,F.jsx)(`input`,{ref:y?void 0:f,value:a,disabled:e.busy,placeholder:`PROVIDER_API_KEY`,autoCapitalize:`none`,autoCorrect:`off`,spellCheck:!1,onChange:e=>o(e.target.value)}),S?(0,F.jsx)(`small`,{children:`An environment-variable name is required.`}):null]}):null,(0,F.jsxs)(`label`,{className:K.field,children:[(0,F.jsxs)(`span`,{children:[`Proxy `,(0,F.jsx)(`small`,{children:`optional`})]}),(0,F.jsx)(`input`,{ref:!y&&!b?f:void 0,value:s,disabled:e.busy,placeholder:`http://127.0.0.1:7890`,onChange:e=>c(e.target.value)})]}),(0,F.jsx)(`div`,{className:K.hint,children:g.kind===`oauth`?`After adding, use Re-authenticate on the provider page to sign in from the service host.`:g.kind===`api`?`Store the key in this environment variable on the service host; raw keys never cross the Web API.`:`The server must be reachable from the machine running the marifold service.`}),e.error?(0,F.jsx)(`div`,{className:K.problem,children:e.error}):null,(0,F.jsxs)(`div`,{className:K.actions,children:[(0,F.jsx)(`button`,{type:`button`,className:K.cancel,disabled:e.busy,onClick:e.onClose,children:`Cancel`}),(0,F.jsx)(`button`,{type:`submit`,className:K.add,disabled:!C,children:e.busy?`Adding…`:`Add ${g.name}`})]})]}):(0,F.jsxs)(`div`,{className:K.catalog,"aria-label":`Provider catalog`,children:[e.catalog===void 0?(0,F.jsx)(`div`,{className:K.empty,children:`Loading providers…`}):null,e.catalog?.map(t=>{let n=_.has(t.name);return(0,F.jsxs)(`button`,{ref:t.name===v?d:void 0,type:`button`,className:K.providerOption,disabled:n||e.busy,onClick:()=>w(t),children:[(0,F.jsxs)(`span`,{className:K.optionText,children:[(0,F.jsx)(`span`,{className:K.optionName,children:t.name}),(0,F.jsx)(`span`,{className:K.optionLabel,children:t.label})]}),(0,F.jsx)(`span`,{className:n?K.configured:K.kind,children:n?`Configured`:oa[t.kind]})]},t.name)}),e.error?(0,F.jsx)(`div`,{className:K.problem,children:e.error}):null]})]})})}var q={page:`_page_1xk9h_4`,empty:`_empty_1xk9h_12`,pageHeader:`_pageHeader_1xk9h_18`,pageTitle:`_pageTitle_1xk9h_25`,pageSub:`_pageSub_1xk9h_30`,pageActions:`_pageActions_1xk9h_36`,linkAction:`_linkAction_1xk9h_41`,note:`_note_1xk9h_52`,problem:`_problem_1xk9h_57`,card:`_card_1xk9h_62`,cardTitle:`_cardTitle_1xk9h_71`,fieldRow:`_fieldRow_1xk9h_80`,fieldLabel:`_fieldLabel_1xk9h_93`,fieldEdit:`_fieldEdit_1xk9h_99`,fieldStatic:`_fieldStatic_1xk9h_108`,fieldHint:`_fieldHint_1xk9h_114`,input:`_input_1xk9h_118`,select:`_select_1xk9h_134`,saveAction:`_saveAction_1xk9h_144`,segmented:`_segmented_1xk9h_156`,segment:`_segment_1xk9h_156`,segmentActive:`_segmentActive_1xk9h_164`,optionRow:`_optionRow_1xk9h_184`,optionName:`_optionName_1xk9h_197`,defaultTag:`_defaultTag_1xk9h_202`,removeAction:`_removeAction_1xk9h_209`,modelList:`_modelList_1xk9h_224`,modelChipStatic:`_modelChipStatic_1xk9h_231`,formActions:`_formActions_1xk9h_240`,cancelAction:`_cancelAction_1xk9h_246`,primaryAction:`_primaryAction_1xk9h_255`,dangerCard:`_dangerCard_1xk9h_271`,dangerTitle:`_dangerTitle_1xk9h_282`,dangerDescription:`_dangerDescription_1xk9h_287`,dangerHint:`_dangerHint_1xk9h_288`,dangerAction:`_dangerAction_1xk9h_295`,removeBackdrop:`_removeBackdrop_1xk9h_310`,removeDialog:`_removeDialog_1xk9h_321`,removeDialogTitle:`_removeDialogTitle_1xk9h_333`,removeDialogDescription:`_removeDialogDescription_1xk9h_338`,commandBox:`_commandBox_1xk9h_344`,commandCopy:`_commandCopy_1xk9h_363`,reauthHint:`_reauthHint_1xk9h_378`,removeConfirmLabel:`_removeConfirmLabel_1xk9h_384`,removeConfirmInput:`_removeConfirmInput_1xk9h_392`,removeDialogActions:`_removeDialogActions_1xk9h_406`,removeDialogCancel:`_removeDialogCancel_1xk9h_412`,removeDialogDelete:`_removeDialogDelete_1xk9h_413`};function ca(e){let[t,n]=(0,l.useState)(``),[r,i]=(0,l.useState)(``),[a,o]=(0,l.useState)([]),[s,c]=(0,l.useState)();if(!e.models)return(0,F.jsx)(`div`,{className:q.empty,children:`Loading…`});let u=e.models.default.provider&&e.models.default.model?`${e.models.default.provider}/${e.models.default.model}`:``;async function d(t){if(!(!t||t===s)){c(t);try{let n=await T(e.client,t);o(n.models)}catch{o([])}}}return(0,F.jsxs)(`div`,{className:q.page,children:[(0,F.jsx)(`header`,{className:q.pageHeader,children:(0,F.jsx)(`div`,{className:q.pageTitle,children:`Models`})}),(0,F.jsx)(`section`,{className:q.card,children:(0,F.jsxs)(`div`,{className:q.fieldRow,children:[(0,F.jsx)(`span`,{className:q.fieldLabel,children:`Default model`}),(0,F.jsxs)(`select`,{className:q.select,value:u,disabled:e.busy,onChange:t=>{let n=t.target.value.indexOf(`/`);n>0&&e.onSetDefault(t.target.value.slice(0,n),t.target.value.slice(n+1))},children:[u===``?(0,F.jsx)(`option`,{value:``,children:`— not set —`}):null,e.models.options.map(e=>(0,F.jsx)(`option`,{value:e,children:e},e))]})]})}),(0,F.jsxs)(`section`,{className:q.card,children:[(0,F.jsx)(`div`,{className:q.cardTitle,children:`Saved options`}),e.models.options.length===0?(0,F.jsx)(`div`,{className:q.note,children:`No saved options yet.`}):null,e.models.options.map(t=>{let n=t.indexOf(`/`),r=t.slice(0,n),i=t.slice(n+1);return(0,F.jsxs)(`div`,{className:q.optionRow,children:[(0,F.jsxs)(`span`,{className:q.optionName,children:[t,t===u?(0,F.jsx)(`span`,{className:q.defaultTag,children:` default`}):null]}),(0,F.jsx)(`button`,{className:q.removeAction,title:`Remove ${t}`,"aria-label":`Remove ${t}`,disabled:e.busy,onClick:()=>void e.onRemove(r,i),children:`×`})]},t)})]}),(0,F.jsxs)(`section`,{className:q.card,children:[(0,F.jsx)(`div`,{className:q.cardTitle,children:`Add model`}),(0,F.jsxs)(`div`,{className:q.fieldRow,children:[(0,F.jsx)(`span`,{className:q.fieldLabel,children:`Provider`}),(0,F.jsxs)(`select`,{className:q.select,value:t,onChange:e=>{n(e.target.value),d(e.target.value)},children:[(0,F.jsx)(`option`,{value:``,children:`— choose —`}),e.providers.map(e=>(0,F.jsx)(`option`,{value:e,children:e},e))]})]}),(0,F.jsxs)(`div`,{className:q.fieldRow,children:[(0,F.jsx)(`span`,{className:q.fieldLabel,children:`Model`}),(0,F.jsxs)(`div`,{className:q.fieldEdit,children:[(0,F.jsx)(`input`,{className:q.input,value:r,placeholder:`model-name`,list:`model-suggestions`,onChange:e=>i(e.target.value)}),(0,F.jsx)(`datalist`,{id:`model-suggestions`,children:a.map(e=>(0,F.jsx)(`option`,{value:e},e))}),(0,F.jsx)(`button`,{className:q.saveAction,disabled:e.busy||!t||r.trim().length===0,onClick:()=>{e.onAdd({provider:t,model:r.trim()}).then(()=>i(``))},children:`Add`})]})]}),s&&a.length>0?(0,F.jsxs)(`div`,{className:q.note,children:[a.length,` models live on `,s,` — the field suggests them as you type.`]}):null]})]})}var la=[{kind:`read`,label:`Read files`},{kind:`write`,label:`Write & edit files`},{kind:`shell`,label:`Run shell commands`},{kind:`network`,label:`Search the web`},{kind:`delegate`,label:`Ask another profile`}],ua=[`allow`,`ask`,`deny`];function da({agent:e,busy:t,onSave:n}){let[r,i]=(0,l.useState)(),[a,o]=(0,l.useState)();return e?(0,F.jsxs)(`div`,{className:q.page,children:[(0,F.jsx)(`header`,{className:q.pageHeader,children:(0,F.jsxs)(`div`,{children:[(0,F.jsx)(`div`,{className:q.pageTitle,children:`Agent defaults`}),(0,F.jsx)(`div`,{className:q.pageSub,children:`Profiles inherit these permissions unless they define an override.`})]})}),(0,F.jsxs)(`section`,{className:q.card,children:[(0,F.jsx)(`div`,{className:q.cardTitle,children:`Approval policy`}),la.map(r=>(0,F.jsxs)(`div`,{className:q.fieldRow,children:[(0,F.jsx)(`span`,{className:q.fieldLabel,children:r.label}),(0,F.jsx)(`div`,{className:q.segmented,role:`radiogroup`,"aria-label":`${r.label} approval`,children:ua.map(i=>(0,F.jsx)(`button`,{type:`button`,role:`radio`,"aria-checked":e.approval[r.kind]===i,className:e.approval[r.kind]===i?q.segmentActive:q.segment,disabled:t,onClick:()=>n(`approval.${r.kind}`,i),children:i[0].toUpperCase()+i.slice(1)},i))})]},r.kind))]}),(0,F.jsxs)(`section`,{className:q.card,children:[(0,F.jsx)(`div`,{className:q.cardTitle,children:`Execution`}),(0,F.jsxs)(`div`,{className:q.fieldRow,children:[(0,F.jsx)(`label`,{className:q.fieldLabel,htmlFor:`agent-tool-mode`,children:`Tool-call mode`}),(0,F.jsxs)(`select`,{id:`agent-tool-mode`,className:q.select,value:e.toolMode,disabled:t,onChange:e=>n(`tool_mode`,e.target.value),children:[(0,F.jsx)(`option`,{value:`auto`,children:`Auto`}),(0,F.jsx)(`option`,{value:`native`,children:`Native`}),(0,F.jsx)(`option`,{value:`control-block`,children:`Control block`})]})]}),(0,F.jsx)(fa,{id:`agent-max-iterations`,label:`Maximum iterations`,value:r??String(e.maxIterations),changed:r!==void 0&&r!==String(e.maxIterations),busy:t,onChange:i,onSave:()=>{n(`max_iterations`,r??String(e.maxIterations)),i(void 0)}}),(0,F.jsx)(fa,{id:`agent-tool-output-limit`,label:`Tool output limit`,value:a??String(e.toolOutputLimit),changed:a!==void 0&&a!==String(e.toolOutputLimit),busy:t,onChange:o,onSave:()=>{n(`tool_output_limit`,a??String(e.toolOutputLimit)),o(void 0)}})]})]}):(0,F.jsx)(`div`,{className:q.empty,children:`Loading agent defaults…`})}function fa({id:e,label:t,value:n,changed:r,busy:i,onChange:a,onSave:o}){return(0,F.jsxs)(`div`,{className:q.fieldRow,children:[(0,F.jsx)(`label`,{className:q.fieldLabel,htmlFor:e,children:t}),(0,F.jsxs)(`div`,{className:q.fieldEdit,children:[(0,F.jsx)(`input`,{id:e,className:q.input,type:`number`,min:1,step:1,value:n,onChange:e=>a(e.target.value)}),r?(0,F.jsx)(`button`,{className:q.saveAction,type:`button`,disabled:i||Number(n)<1,onClick:o,children:`Save`}):null]})]})}function pa({theme:e,onThemeChange:t}){return(0,F.jsxs)(`div`,{className:q.page,children:[(0,F.jsx)(`header`,{className:q.pageHeader,children:(0,F.jsxs)(`div`,{children:[(0,F.jsx)(`div`,{className:q.pageTitle,children:`Appearance`}),(0,F.jsx)(`div`,{className:q.pageSub,children:`Choose a fixed theme or follow the operating system.`})]})}),(0,F.jsx)(`section`,{className:q.card,children:(0,F.jsxs)(`div`,{className:q.fieldRow,children:[(0,F.jsx)(`span`,{className:q.fieldLabel,children:`Theme`}),(0,F.jsx)(`div`,{className:q.segmented,role:`radiogroup`,"aria-label":`Theme`,children:[`auto`,`light`,`dark`].map(n=>(0,F.jsx)(`button`,{type:`button`,role:`radio`,"aria-checked":e===n,className:e===n?q.segmentActive:q.segment,onClick:()=>t(n),children:n[0].toUpperCase()+n.slice(1)},n))})]})})]})}var ma={backdrop:`_backdrop_1vpt8_1`,modal:`_modal_1vpt8_11`,title:`_title_1vpt8_23`,hint:`_hint_1vpt8_29`,viewport:`_viewport_1vpt8_36`,image:`_image_1vpt8_50`,mask:`_mask_1vpt8_61`,zoomRow:`_zoomRow_1vpt8_69`,zoom:`_zoom_1vpt8_69`,actions:`_actions_1vpt8_83`,cancel:`_cancel_1vpt8_90`,save:`_save_1vpt8_91`},ha=280,ga=512;function _a({file:e,busy:t,onCancel:n,onConfirm:r}){let[i,a]=(0,l.useState)(),o=(0,l.useRef)(null),[s,c]=(0,l.useState)(),[u,d]=(0,l.useState)(1),[f,p]=(0,l.useState)({x:0,y:0}),m=(0,l.useRef)(null);(0,l.useEffect)(()=>{let t=URL.createObjectURL(e);return a(t),()=>URL.revokeObjectURL(t)},[e]);let h=(s?Math.max(ha/s.w,ha/s.h):1)*u,g=s?s.w*h:ha,_=s?s.h*h:ha;function v(e){return{x:Math.min(0,Math.max(ha-g,e.x)),y:Math.min(0,Math.max(ha-_,e.y))}}(0,l.useEffect)(()=>{p(e=>v(e))},[u,s]);function y(e){e.target.setPointerCapture(e.pointerId),m.current={x:e.clientX,y:e.clientY,ox:f.x,oy:f.y}}function b(e){m.current&&p(v({x:m.current.ox+(e.clientX-m.current.x),y:m.current.oy+(e.clientY-m.current.y)}))}function x(){m.current=null}function S(){let e=o.current;if(!e||!s)return;let t=document.createElement(`canvas`);t.width=ga,t.height=ga;let n=t.getContext(`2d`);if(!n)return;n.imageSmoothingQuality=`high`;let i=ha/h;n.drawImage(e,-f.x/h,-f.y/h,i,i,0,0,ga,ga),t.toBlob(e=>{e&&r(new File([e],`avatar.png`,{type:`image/png`}))},`image/png`)}return(0,F.jsx)(`div`,{className:ma.backdrop,role:`dialog`,"aria-modal":`true`,"aria-label":`Adjust avatar`,children:(0,F.jsxs)(`div`,{className:ma.modal,children:[(0,F.jsx)(`div`,{className:ma.title,children:`Adjust avatar`}),(0,F.jsx)(`div`,{className:ma.hint,children:`Drag to reposition · slide to zoom`}),(0,F.jsxs)(`div`,{className:ma.viewport,style:{width:ha,height:ha},onPointerDown:y,onPointerMove:b,onPointerUp:x,onPointerCancel:x,children:[i?(0,F.jsx)(`img`,{ref:o,src:i,alt:``,draggable:!1,className:ma.image,style:{width:g,height:_,transform:`translate(${f.x}px, ${f.y}px)`},onLoad:e=>c({w:e.currentTarget.naturalWidth,h:e.currentTarget.naturalHeight})}):null,(0,F.jsx)(`div`,{className:ma.mask,"aria-hidden":!0})]}),(0,F.jsxs)(`div`,{className:ma.zoomRow,children:[(0,F.jsx)(`span`,{"aria-hidden":!0,children:`−`}),(0,F.jsx)(`input`,{type:`range`,min:1,max:3,step:.01,value:u,onChange:e=>d(Number(e.target.value)),className:ma.zoom,"aria-label":`Zoom`}),(0,F.jsx)(`span`,{"aria-hidden":!0,children:`+`})]}),(0,F.jsxs)(`div`,{className:ma.actions,children:[(0,F.jsx)(`button`,{className:ma.cancel,onClick:n,disabled:t,children:`Cancel`}),(0,F.jsx)(`button`,{className:ma.save,onClick:S,disabled:t||!s,children:`Save avatar`})]})]})})}var va={read:`allow`,write:`ask`,shell:`ask`,network:`ask`,delegate:`allow`},ya={read:`Read files`,write:`Write & edit files`,shell:`Run shell commands`,network:`Search the web`,delegate:`Ask another profile`},ba=[`read`,`write`,`shell`,`network`,`delegate`];function xa(e,t){return{approval:{...va,...e?.approval??{},...t?.approval??{}},trustedFolders:[...new Set([...e?.trustedFolders??[],...t?.trustedFolders??[]])]}}var J={page:`_page_1clai_1`,identity:`_identity_1clai_9`,avatarButton:`_avatarButton_1clai_19`,avatarOverlay:`_avatarOverlay_1clai_35`,avatarOverlayIcon:`_avatarOverlayIcon_1clai_56`,avatar:`_avatar_1clai_19`,identityText:`_identityText_1clai_74`,avatarRemove:`_avatarRemove_1clai_80`,name:`_name_1clai_91`,identitySub:`_identitySub_1clai_97`,group:`_group_1clai_102`,groupTitle:`_groupTitle_1clai_108`,groupHint:`_groupHint_1clai_117`,card:`_card_1clai_123`,rowLine:`_rowLine_1clai_130`,rowLabel:`_rowLabel_1clai_142`,rowValue:`_rowValue_1clai_146`,profileName:`_profileName_1clai_151`,fieldEdit:`_fieldEdit_1clai_160`,input:`_input_1clai_169`,saveAction:`_saveAction_1clai_175`,segments:`_segments_1clai_187`,segment:`_segment_1clai_187`,segmentSelected:`_segmentSelected_1clai_196`,memoryRow:`_memoryRow_1clai_209`,memoryBody:`_memoryBody_1clai_217`,memoryActions:`_memoryActions_1clai_224`,memoryText:`_memoryText_1clai_234`,memoryMeta:`_memoryMeta_1clai_238`,emptyRow:`_emptyRow_1clai_243`,folderRow:`_folderRow_1clai_249`,folderAdd:`_folderAdd_1clai_258`,select:`_select_1clai_265`,smallButton:`_smallButton_1clai_281`,smallButtonPrimary:`_smallButtonPrimary_1clai_282`,smallButtonDanger:`_smallButtonDanger_1clai_283`,inheritButton:`_inheritButton_1clai_312`,inheritedTag:`_inheritedTag_1clai_324`,dirtyTag:`_dirtyTag_1clai_325`,fileEditor:`_fileEditor_1clai_331`,textarea:`_textarea_1clai_338`,editorActions:`_editorActions_1clai_350`,fileBlock:`_fileBlock_1clai_356`,fileSummary:`_fileSummary_1clai_363`,fileContent:`_fileContent_1clai_371`,avatarInput:`_avatarInput_1clai_380`,dangerCard:`_dangerCard_1clai_384`,dangerTitle:`_dangerTitle_1clai_395`,dangerDescription:`_dangerDescription_1clai_400`,removeProfileButton:`_removeProfileButton_1clai_407`,removeBackdrop:`_removeBackdrop_1clai_422`,removeDialog:`_removeDialog_1clai_433`,removeDialogTitle:`_removeDialogTitle_1clai_445`,removeDialogDescription:`_removeDialogDescription_1clai_450`,removeConfirmLabel:`_removeConfirmLabel_1clai_456`,removeConfirmInput:`_removeConfirmInput_1clai_464`,removeDialogActions:`_removeDialogActions_1clai_478`,removeDialogCancel:`_removeDialogCancel_1clai_484`,removeDialogDelete:`_removeDialogDelete_1clai_485`},Sa=[{id:`allow`,label:`Allow`},{id:`ask`,label:`Ask`},{id:`deny`,label:`Deny`}],Ca=[{id:`agent`,label:`Agent`},{id:`chat`,label:`Chat`}];function wa(e){let{detail:t,memories:n,globalAgent:r,modelOptions:i,busy:a}=e,o=xa(r,t.settings.agent),s=n.filter(e=>e.status===`active`),c=t.settings.agent?.trustedFolders??[],u=o.trustedFolders.filter(e=>!c.includes(e)),d=t.settings.provider&&t.settings.model?`${t.settings.provider}/${t.settings.model}`:``,[f,p]=(0,l.useState)(``),[m,h]=(0,l.useState)(t.settings.displayName??``),[g,_]=(0,l.useState)(),[v,y]=(0,l.useState)(!1),[b,x]=(0,l.useState)(``),S=(0,l.useRef)(null),C=(0,l.useRef)(null),w=(0,l.useRef)(null),ee=(0,l.useRef)(null),T=(0,l.useRef)(a);T.current=a;let E=e.onAvatarPick!==void 0,D=b===t.name;(0,l.useEffect)(()=>{y(!1),x(``)},[t.name]),(0,l.useEffect)(()=>{h(t.settings.displayName??``)},[t.name,t.settings.displayName]),(0,l.useEffect)(()=>{if(!v)return;let e=document.body.style.overflow;document.body.style.overflow=`hidden`,ee.current?.focus();function t(e){if(e.key===`Escape`&&!T.current){y(!1),x(``);return}if(e.key!==`Tab`)return;let t=[...w.current?.querySelectorAll(`button:not(:disabled), input:not(:disabled)`)??[]];if(t.length===0)return;let n=t.indexOf(document.activeElement),r=e.shiftKey?(n-1+t.length)%t.length:(n+1)%t.length;e.preventDefault(),t[r]?.focus()}return document.addEventListener(`keydown`,t),()=>{document.body.style.overflow=e,document.removeEventListener(`keydown`,t),C.current?.focus()}},[v]);function te(){a||(y(!1),x(``))}let ne=e.avatar??(0,F.jsx)(`span`,{className:J.avatar,"aria-hidden":!0,children:t.displayName.slice(0,1).toUpperCase()});return(0,F.jsxs)(`div`,{className:J.page,children:[(0,F.jsxs)(`header`,{className:J.identity,children:[E?(0,F.jsxs)(`button`,{type:`button`,className:J.avatarButton,disabled:a,title:t.avatar?`Change avatar`:`Add avatar`,"aria-label":t.avatar?`Change avatar`:`Add avatar`,onClick:()=>S.current?.click(),children:[ne,(0,F.jsxs)(`span`,{className:J.avatarOverlay,"aria-hidden":!0,children:[(0,F.jsx)(`span`,{className:J.avatarOverlayIcon,children:`⌾`}),t.avatar?`Change`:`Add`]})]}):(0,F.jsx)(`div`,{className:J.avatarButton,children:ne}),(0,F.jsxs)(`div`,{className:J.identityText,children:[(0,F.jsx)(`div`,{className:J.name,children:t.displayName}),(0,F.jsxs)(`div`,{className:J.identitySub,children:[t.source,` profile`,t.settings.think?` · thinking on`:``]})]}),E?(0,F.jsx)(`input`,{ref:S,type:`file`,accept:`image/png,image/jpeg,image/webp`,className:J.avatarInput,onChange:e=>{let t=e.target.files?.[0];t&&_(t),e.target.value=``}}):null]}),g?(0,F.jsx)(_a,{file:g,busy:a,onCancel:()=>_(void 0),onConfirm:t=>{e.onAvatarPick?.(t),_(void 0)}}):null,(0,F.jsxs)(`section`,{className:J.group,"aria-label":`Profile`,children:[(0,F.jsx)(`div`,{className:J.groupTitle,children:`Profile`}),(0,F.jsxs)(`div`,{className:J.card,children:[(0,F.jsxs)(`div`,{className:J.rowLine,children:[(0,F.jsx)(`span`,{className:J.rowLabel,children:`Profile name`}),(0,F.jsx)(`code`,{className:J.profileName,children:t.name})]}),(0,F.jsxs)(`div`,{className:J.rowLine,children:[(0,F.jsx)(`label`,{className:J.rowLabel,htmlFor:`profile-display-name`,children:`Display name`}),(0,F.jsxs)(`div`,{className:J.fieldEdit,children:[(0,F.jsx)(`input`,{id:`profile-display-name`,className:J.input,value:m,placeholder:t.name,maxLength:100,disabled:a,onChange:e=>h(e.target.value),onKeyDown:e=>{e.key===`Escape`&&h(t.settings.displayName??``)}}),m.trim()===(t.settings.displayName??``)?null:(0,F.jsx)(`button`,{type:`button`,className:J.saveAction,disabled:a,onClick:()=>e.onPatch({displayName:m.trim()||null}),children:`Save`})]})]})]}),(0,F.jsx)(`div`,{className:J.groupHint,children:`Profile names use letters, numbers, underscores, and hyphens only. Display names are shown throughout the Web UI; blank uses the profile name.`})]}),(0,F.jsxs)(`section`,{className:J.group,"aria-label":`Model`,children:[(0,F.jsx)(`div`,{className:J.groupTitle,children:`Model`}),(0,F.jsxs)(`div`,{className:J.card,children:[(0,F.jsxs)(`div`,{className:J.rowLine,children:[(0,F.jsx)(`span`,{className:J.rowLabel,children:`Mode`}),(0,F.jsx)(dt,{options:Ca,value:t.settings.mode??`agent`,onChange:t=>e.onPatch({mode:t}),"aria-label":`Default mode`})]}),(0,F.jsxs)(`div`,{className:J.rowLine,children:[(0,F.jsx)(`span`,{className:J.rowLabel,children:`Model`}),(0,F.jsxs)(`select`,{className:J.select,"aria-label":`Model override`,value:d,disabled:a,onChange:t=>{let n=t.target.value;if(!n){e.onPatch({provider:null,model:null});return}let r=n.indexOf(`/`);e.onPatch({provider:n.slice(0,r),model:n.slice(r+1)})},children:[(0,F.jsx)(`option`,{value:``,children:`Default`}),i.map(e=>(0,F.jsx)(`option`,{value:e,children:e},e))]})]}),(0,F.jsxs)(`div`,{className:J.rowLine,children:[(0,F.jsx)(`span`,{className:J.rowLabel,children:`Memories`}),(0,F.jsx)(dt,{options:[{id:`on`,label:`On`},{id:`off`,label:`Off`}],value:t.settings.memories?`on`:`off`,onChange:t=>e.onPatch({memories:t===`on`}),"aria-label":`Memories`})]}),(0,F.jsxs)(`div`,{className:J.rowLine,children:[(0,F.jsx)(`span`,{className:J.rowLabel,children:`Thinking`}),(0,F.jsx)(dt,{options:[{id:`on`,label:`On`},{id:`off`,label:`Off`}],value:t.settings.think?`on`:`off`,onChange:t=>e.onPatch({think:t===`on`}),"aria-label":`Thinking`})]})]})]}),(0,F.jsxs)(`section`,{className:J.group,"aria-label":`Memory`,children:[(0,F.jsx)(`div`,{className:J.groupTitle,children:`Memory`}),(0,F.jsxs)(`div`,{className:J.card,children:[s.length===0?(0,F.jsx)(`div`,{className:J.emptyRow,children:`Nothing remembered yet.`}):null,s.map(t=>(0,F.jsxs)(`div`,{className:J.memoryRow,children:[(0,F.jsxs)(`div`,{className:J.memoryBody,children:[(0,F.jsx)(`div`,{className:J.memoryText,children:t.text}),(0,F.jsxs)(`div`,{className:J.memoryMeta,children:[t.kind,` · p`,t.priority,` · `,un(t.updated_at)]})]}),(0,F.jsxs)(`div`,{className:J.memoryActions,children:[(0,F.jsx)(`button`,{className:J.smallButton,disabled:a,onClick:()=>e.onMemoryAction(t.id,`forget`),children:`Forget`}),(0,F.jsx)(`button`,{className:J.smallButtonDanger,disabled:a,onClick:()=>{window.confirm(`Permanently delete this memory? Forget keeps it recoverable.`)&&e.onMemoryAction(t.id,`delete`)},children:`Delete`})]})]},t.id))]}),(0,F.jsx)(`div`,{className:J.groupHint,children:`Forget supersedes an entry (recoverable); Delete removes it for good. New memories still come from conversations.`})]}),(0,F.jsxs)(`section`,{className:J.group,"aria-label":`Agent permissions`,children:[(0,F.jsx)(`div`,{className:J.groupTitle,children:`Agent permissions`}),(0,F.jsx)(`div`,{className:J.card,children:ba.map(n=>{let r=t.settings.agent?.approval?.[n];return(0,F.jsxs)(`div`,{className:J.rowLine,children:[(0,F.jsxs)(`span`,{className:J.rowLabel,children:[ya[n],r?(0,F.jsx)(`button`,{className:J.inheritButton,disabled:a,title:`Remove this profile's override; inherit the global default`,onClick:()=>e.onPatch({approval:{[n]:null}}),children:`overridden — inherit`}):(0,F.jsx)(`span`,{className:J.inheritedTag,children:`inherited`})]}),(0,F.jsx)(dt,{options:Sa,value:o.approval[n],onChange:t=>e.onPatch({approval:{[n]:t}}),"aria-label":`${ya[n]} approval`})]},n)})}),(0,F.jsxs)(`div`,{className:J.card,children:[(0,F.jsx)(`div`,{className:J.rowLine,children:(0,F.jsx)(`span`,{className:J.rowLabel,children:`Trusted folders`})}),u.map(e=>(0,F.jsxs)(`div`,{className:J.folderRow,children:[(0,F.jsx)(`code`,{children:e}),(0,F.jsx)(`span`,{className:J.inheritedTag,children:`global`})]},e)),c.map(t=>(0,F.jsxs)(`div`,{className:J.folderRow,children:[(0,F.jsx)(`code`,{children:t}),(0,F.jsx)(`button`,{className:J.smallButton,disabled:a,onClick:()=>e.onRemoveTrustedFolder(t),children:`Remove`})]},t)),(0,F.jsxs)(`div`,{className:J.folderAdd,children:[(0,F.jsx)(`input`,{className:J.input,placeholder:`/path/to/folder`,"aria-label":`New trusted folder`,value:f,disabled:a,onChange:e=>p(e.target.value)}),(0,F.jsx)(`button`,{className:J.smallButton,disabled:a||!f.trim(),onClick:()=>{e.onAddTrustedFolder(f.trim()),p(``)},children:`Add`})]})]}),(0,F.jsx)(`div`,{className:J.groupHint,children:`The agent still narrates everything it does.`})]}),(0,F.jsxs)(`section`,{className:J.group,"aria-label":`Instructions`,children:[(0,F.jsx)(`div`,{className:J.groupTitle,children:`Instructions`}),[[`PROFILE`,`profile`,t.files.profile.content],[`RULES`,`rules`,t.files.rules.content],[`CUSTOM`,`custom`,t.files.custom.content]].map(([n,r,i])=>(0,F.jsx)(Ta,{label:n,content:i,busy:a,onSave:t=>e.onSaveFile(r,t)},`${t.name}:${r}`))]}),e.onDelete?(0,F.jsxs)(`section`,{className:J.group,"aria-label":`Remove profile`,children:[(0,F.jsx)(`div`,{className:J.groupTitle,children:`Profile`}),(0,F.jsxs)(`div`,{className:J.dangerCard,children:[(0,F.jsxs)(`div`,{children:[(0,F.jsx)(`div`,{className:J.dangerTitle,children:`Remove this profile`}),(0,F.jsx)(`div`,{className:J.dangerDescription,children:`Deletes its instructions, memories, skills, and avatar. Conversation history remains stored.`})]}),(0,F.jsx)(`button`,{ref:C,className:J.removeProfileButton,"aria-label":`Remove profile`,disabled:a||!!e.deleteDisabledReason,title:e.deleteDisabledReason,onClick:()=>{x(``),y(!0)},children:`Remove`})]}),e.deleteDisabledReason?(0,F.jsx)(`div`,{className:J.groupHint,children:e.deleteDisabledReason}):null]}):null,v?(0,Ln.createPortal)((0,F.jsx)(`div`,{className:J.removeBackdrop,onClick:te,children:(0,F.jsxs)(`form`,{ref:w,className:J.removeDialog,role:`alertdialog`,"aria-modal":`true`,"aria-labelledby":`remove-profile-title`,"aria-describedby":`remove-profile-description`,onClick:e=>e.stopPropagation(),onSubmit:t=>{t.preventDefault(),D&&!a&&e.onDelete?.()},children:[(0,F.jsxs)(`div`,{id:`remove-profile-title`,className:J.removeDialogTitle,children:[`Remove “`,t.name,`”?`]}),(0,F.jsx)(`div`,{id:`remove-profile-description`,className:J.removeDialogDescription,children:`Its instructions, memories, skills, and avatar will be permanently deleted. Conversation history will remain stored.`}),(0,F.jsxs)(`label`,{className:J.removeConfirmLabel,children:[`Type `,(0,F.jsx)(`strong`,{children:t.name}),` to confirm`,(0,F.jsx)(`input`,{ref:ee,className:J.removeConfirmInput,"aria-label":`Profile name confirmation`,autoComplete:`off`,spellCheck:!1,value:b,disabled:a,onChange:e=>x(e.target.value)})]}),(0,F.jsxs)(`div`,{className:J.removeDialogActions,children:[(0,F.jsx)(`button`,{type:`button`,className:J.removeDialogCancel,disabled:a,onClick:te,children:`Cancel`}),(0,F.jsx)(`button`,{type:`submit`,className:J.removeDialogDelete,disabled:a||!D,children:a?`Removing…`:`Remove profile`})]})]})}),document.body):null]})}function Ta(e){let[t,n]=(0,l.useState)(e.content),r=t!==e.content;return(0,F.jsxs)(`details`,{className:J.fileBlock,children:[(0,F.jsxs)(`summary`,{className:J.fileSummary,children:[e.label,r?(0,F.jsx)(`span`,{className:J.dirtyTag,children:`edited`}):null]}),(0,F.jsxs)(`div`,{className:J.fileEditor,children:[(0,F.jsx)(`textarea`,{className:J.textarea,"aria-label":`${e.label} content`,value:t,disabled:e.busy,rows:Math.min(16,Math.max(4,t.split(`
@@ -9,7 +9,7 @@
9
9
  href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='150 150 724 724'%3E%3Cdefs%3E%3Cpath id='p' d='M512%20175C477%20201%20443%20226%20423%20241C410%20253%20403%20272%20403%20287C403%20304%20409%20318%20420%20326L500%20390L500%20323A26%2026%200%201%201%20524%20323L524%20390L604%20326C615%20316%20620%20299%20619%20282C619%20266%20611%20250%20597%20236C573%20214%20543%20198%20512%20175Z'/%3E%3C/defs%3E%3Cg fill='%23EAA221'%3E%3Cuse href='%23p'/%3E%3Cuse href='%23p' transform='rotate(60%20512%20512)'/%3E%3Cuse href='%23p' transform='rotate(120%20512%20512)'/%3E%3Cuse href='%23p' transform='rotate(180%20512%20512)'/%3E%3Cuse href='%23p' transform='rotate(240%20512%20512)'/%3E%3Cuse href='%23p' transform='rotate(300%20512%20512)'/%3E%3Ccircle cx='512' cy='512' r='60'/%3E%3C/g%3E%3C/svg%3E"
10
10
  />
11
11
  <title>marifold</title>
12
- <script type="module" crossorigin src="/assets/index-DZRWcX6K.js"></script>
12
+ <script type="module" crossorigin src="/assets/index-SnlM_6z2.js"></script>
13
13
  <link rel="stylesheet" crossorigin href="/assets/index-CZvu_HRa.css">
14
14
  </head>
15
15
  <body>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@marifold/service",
3
- "version": "0.64.0",
3
+ "version": "0.64.1",
4
4
  "description": "Local HTTP service for Marifold",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -9,7 +9,7 @@
9
9
  ],
10
10
  "dependencies": {
11
11
  "fastify": "^5.10.0",
12
- "@marifold/core": "0.64.0"
12
+ "@marifold/core": "0.64.1"
13
13
  },
14
14
  "devDependencies": {
15
15
  "@types/node": "^24.13.3",