@chrysb/alphaclaw 0.9.23 → 0.9.24
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.
|
@@ -3629,7 +3629,7 @@ Please report this to https://github.com/markedjs/marked.`,t){let s="<p>An error
|
|
|
3629
3629
|
</div>
|
|
3630
3630
|
`:null}
|
|
3631
3631
|
</div>
|
|
3632
|
-
`};var Qx={off:"Off",on:"On",minimal:"Minimal",low:"Low",medium:"Medium",high:"High",adaptive:"Adaptive",xhigh:"Extra high",max:"Maximum"},Ti=(t="")=>{let e=String(t||"").trim().toLowerCase();return e?Qx[e]?Qx[e]:e.split(/[-_]/g).filter(Boolean).map(n=>n.charAt(0).toUpperCase()+n.slice(1)).join(" "):""},ev=(t="")=>{let e=Ti(t);return e?`Inherited: ${e}`:"Inherited"},tv=(t=[])=>{let e=(Array.isArray(t)?t:[]).map(n=>String(n?.id||n||"").trim().toLowerCase()).filter(Boolean);return e.length===0?!1:!(e.length===1&&e[0]==="off")};var un=null,ar=t=>String(t?.key||t?.token||t?.access||"").trim(),nv="No models found",sv="Failed to load model settings",Wl=t=>{let e=!!t,n=String(t||"").trim(),s=!e,[o,r]=x(()=>s&&un?.catalog||[]),[i,a]=x(()=>s&&un?.catalogStatus||{source:"",fetchedAt:null,stale:!1,refreshing:!1}),[l,c]=x(()=>s&&un?.primary||""),[d,u]=x(()=>s&&un?.configuredModels||{}),[p,f]=x(()=>s&&un?.authProfiles||[]),[g,m]=x(()=>s&&un?.authOrder||{}),[h,b]=x(()=>s&&un?.codexStatus||{connected:!1}),[y,v]=x(()=>!(s&&un)),[$,w]=x(!1),[S,A]=x(()=>!!(s&&un)),[C,k]=x(""),[_,L]=x({}),[I,F]=x({}),N=le(un?.primary||""),E=le(un?.configuredModels||{}),T=q(re=>{e||(un={...un||{},...re})},[e]),O=n?`/api/models/config?agentId=${encodeURIComponent(n)}`:"/api/models/config",z=at(ds,rs,{maxAgeMs:3e4}),H=at(O,()=>Cg(e?{agentId:t}:void 0),{maxAgeMs:3e4}),K=at("/api/codex/status",Zo,{maxAgeMs:15e3}),Q=Ie(rs,ul,{enabled:S&&pl(i),pauseWhenHidden:!0,cacheKey:ds}),te=q(re=>{k(ae=>re.length>0?ae===nv?"":ae:ae||nv)},[]),U=q(re=>{let ae=hi(re),ve={source:String(re?.source||""),fetchedAt:Number(re?.fetchedAt||0)||null,stale:!!re?.stale,refreshing:!!re?.refreshing};return r(ae),a(ve),T({catalog:ae,catalogStatus:ve}),te(ae),ae},[te,T]),W=q(async()=>{S||v(!0),k("");try{let[re,ae,ve]=await Promise.all([z.refresh({force:!0}),H.refresh({force:!0}),K.refresh({force:!0})]),Se=U(re),V=ae.primary||"",se=ae.configuredModels||{},X=ae.authProfiles||[],ke=ae.authOrder||{};c(V),u(se),f(X),m(ke),b(ve||{connected:!1}),L({}),F({}),N.current=V,E.current=se,T({catalog:Se,primary:V,configuredModels:se,authProfiles:X,authOrder:ke,codexStatus:ve||{connected:!1}})}catch(re){k(sv),D(`${sv}: ${re.message}`,"error")}finally{A(!0),v(!1)}},[U,z,K,H,S,T]);P(()=>{W()},[t]),P(()=>{Q.data&&U(Q.data)},[U,Q.data]);let ue=re=>JSON.stringify(Object.keys(re).sort().reduce((ae,ve)=>(ae[ve]=re[ve],ae),{})),he=l!==N.current||ue(d)!==ue(E.current),ee=(()=>{let re=Object.entries(_).some(([ve,Se])=>{let V=p.find(se=>se.id===ve);return ar(Se)!==ar(V)}),ae=Object.entries(I).some(([ve,Se])=>{let V=g[ve];return JSON.stringify(Se)!==JSON.stringify(V)});return re||ae})(),oe=he||ee,ie=q(re=>{re
|
|
3632
|
+
`};var Qx={off:"Off",on:"On",minimal:"Minimal",low:"Low",medium:"Medium",high:"High",adaptive:"Adaptive",xhigh:"Extra high",max:"Maximum"},Ti=(t="")=>{let e=String(t||"").trim().toLowerCase();return e?Qx[e]?Qx[e]:e.split(/[-_]/g).filter(Boolean).map(n=>n.charAt(0).toUpperCase()+n.slice(1)).join(" "):""},ev=(t="")=>{let e=Ti(t);return e?`Inherited: ${e}`:"Inherited"},tv=(t=[])=>{let e=(Array.isArray(t)?t:[]).map(n=>String(n?.id||n||"").trim().toLowerCase()).filter(Boolean);return e.length===0?!1:!(e.length===1&&e[0]==="off")};var un=null,ar=t=>String(t?.key||t?.token||t?.access||"").trim(),nv="No models found",sv="Failed to load model settings",Wl=t=>{let e=!!t,n=String(t||"").trim(),s=!e,[o,r]=x(()=>s&&un?.catalog||[]),[i,a]=x(()=>s&&un?.catalogStatus||{source:"",fetchedAt:null,stale:!1,refreshing:!1}),[l,c]=x(()=>s&&un?.primary||""),[d,u]=x(()=>s&&un?.configuredModels||{}),[p,f]=x(()=>s&&un?.authProfiles||[]),[g,m]=x(()=>s&&un?.authOrder||{}),[h,b]=x(()=>s&&un?.codexStatus||{connected:!1}),[y,v]=x(()=>!(s&&un)),[$,w]=x(!1),[S,A]=x(()=>!!(s&&un)),[C,k]=x(""),[_,L]=x({}),[I,F]=x({}),N=le(un?.primary||""),E=le(un?.configuredModels||{}),T=q(re=>{e||(un={...un||{},...re})},[e]),O=n?`/api/models/config?agentId=${encodeURIComponent(n)}`:"/api/models/config",z=at(ds,rs,{maxAgeMs:3e4}),H=at(O,()=>Cg(e?{agentId:t}:void 0),{maxAgeMs:3e4}),K=at("/api/codex/status",Zo,{maxAgeMs:15e3}),Q=Ie(rs,ul,{enabled:S&&pl(i),pauseWhenHidden:!0,cacheKey:ds}),te=q(re=>{k(ae=>re.length>0?ae===nv?"":ae:ae||nv)},[]),U=q(re=>{let ae=hi(re),ve={source:String(re?.source||""),fetchedAt:Number(re?.fetchedAt||0)||null,stale:!!re?.stale,refreshing:!!re?.refreshing};return r(ae),a(ve),T({catalog:ae,catalogStatus:ve}),te(ae),ae},[te,T]),W=q(async()=>{S||v(!0),k("");try{let[re,ae,ve]=await Promise.all([z.refresh({force:!0}),H.refresh({force:!0}),K.refresh({force:!0})]),Se=U(re),V=ae.primary||"",se=ae.configuredModels||{},X=ae.authProfiles||[],ke=ae.authOrder||{};c(V),u(se),f(X),m(ke),b(ve||{connected:!1}),L({}),F({}),N.current=V,E.current=se,T({catalog:Se,primary:V,configuredModels:se,authProfiles:X,authOrder:ke,codexStatus:ve||{connected:!1}})}catch(re){k(sv),D(`${sv}: ${re.message}`,"error")}finally{A(!0),v(!1)}},[U,z,K,H,S,T]);P(()=>{W()},[t]),P(()=>{Q.data&&U(Q.data)},[U,Q.data]);let ue=re=>JSON.stringify(Object.keys(re).sort().reduce((ae,ve)=>(ae[ve]=re[ve],ae),{})),he=l!==N.current||ue(d)!==ue(E.current),ee=(()=>{let re=Object.entries(_).some(([ve,Se])=>{let V=p.find(se=>se.id===ve);return ar(Se)!==ar(V)}),ae=Object.entries(I).some(([ve,Se])=>{let V=g[ve];return JSON.stringify(Se)!==JSON.stringify(V)});return re||ae})(),oe=he||ee,ie=q(re=>{if(!re)return;let ae=o.find(Se=>Se?.key===re),ve=ae?.agentRuntime?{agentRuntime:ae.agentRuntime}:{};u(Se=>{let V={...Se,[re]:ve};return T({configuredModels:V}),V})},[o,T]),fe=q(re=>{if(u(ae=>{let ve={...ae};return delete ve[re],T({configuredModels:ve}),ve}),l===re){let ve=Object.keys(d).filter(Se=>Se!==re)[0]||"";c(ve),T({primary:ve})}},[l,d,T]),J=q(re=>{c(re),T({primary:re})},[T]),ce=q((re,ae)=>{let ve=p.find(Se=>Se.id===re);if(ar(ae)===ar(ve)){L(Se=>{let V={...Se};return delete V[re],V});return}L(Se=>({...Se,[re]:ae}))},[p]),ye=q((re,ae)=>{let ve=g[re]||null;if(JSON.stringify(ae)===JSON.stringify(ve)){F(Se=>{let V={...Se};return delete V[re],V});return}F(Se=>({...Se,[re]:ae}))},[g]),Z=q(re=>_[re]!==void 0?_[re]:p.find(ve=>ve.id===re)||null,[_,p]),j=q(re=>I[re]!==void 0?I[re]:g[re]||null,[I,g]),Y=q(()=>{let re=N.current||"",ae=E.current||{};c(re),u(ae),L({}),F({}),T({primary:re,configuredModels:ae})},[T]),be=q(async()=>{if(!$){w(!0);try{let re=Object.entries(_).filter(([ve,Se])=>{let V=p.find(se=>se.id===ve);return ar(Se)!==ar(V)}).map(([ve,Se])=>({id:ve,...Se})),ae=await _g({primary:l,configuredModels:d,profiles:re.length>0?re:void 0,authOrder:Object.keys(I).length>0?I:void 0,...e?{agentId:t}:{}});if(!ae.ok)throw new Error(ae.error||"Failed to save config");D("Changes saved","success"),ae.syncWarning&&D(`Saved, but git-sync failed: ${ae.syncWarning}`,"warning"),eu(ds),await W()}catch(re){D(re.message||"Failed to save changes","error")}finally{w(!1)}}},[$,l,d,_,I,p,e,t,W]),pe=q(async()=>{let re;try{re=await Zo(),b(re||{connected:!1}),T({codexStatus:re||{connected:!1}})}catch{b({connected:!1}),T({codexStatus:{connected:!1}});return}try{eu(ds);let ae=await z.refresh({force:!0});U(ae)}catch{}},[U,z,T]);return{catalog:o,primary:l,configuredModels:d,authProfiles:p,authOrder:g,codexStatus:h,loading:y,saving:$,ready:S,error:C,isDirty:oe,refresh:W,addModel:ie,removeModel:fe,setPrimaryModel:J,editProfile:ce,editAuthOrder:ye,getProfileValue:Z,getEffectiveOrder:j,cancelChanges:Y,saveAll:be,refreshCodexStatus:pe}};var Q_=t=>t?typeof t=="string"?t:t.primary||null:null,ov=(t=[],e="")=>t.find(n=>String(n?.key||"").trim()===String(e||"").trim())||null,rv=({agent:t={},onUpdateAgent:e=async()=>{}})=>{let[n,s]=x(!1),[o,r]=x(!1),[i,a]=x(!1),[l,c]=x({levels:[],inheritedDefault:"off",modelDefault:"off"}),[d,u]=x(!1),{catalog:p,primary:f,configuredModels:g,authProfiles:m,codexStatus:h,loading:b,ready:y}=Wl(),v=Q_(t.model),$=v||f||"",w=!!v&&String(v).trim()!==String(f||"").trim(),S=String(t.thinkingDefault||"").trim(),A=String(l.inheritedDefault||l.modelDefault||"off").trim(),C=!!S&&S!==A,k=tv(l.levels);P(()=>{let te=String($||"").trim();if(!te.includes("/")){c({levels:[],inheritedDefault:"off",modelDefault:"off"});return}let U=!1;return u(!0),kg(te).then(W=>{U||!W?.ok||c({levels:Array.isArray(W.levels)?W.levels:[],inheritedDefault:String(W.inheritedDefault||"off").trim(),modelDefault:String(W.modelDefault||"off").trim()})}).finally(()=>{U||u(!1)}),()=>{U=!0}},[$]);let _=B(()=>Fl({authProfiles:m,codexStatus:h}),[m,h]),L=B(()=>Object.keys(g||{}).map(te=>ov(p,te)||Mi(te)).filter(te=>{let U=Bl(te.key);return!!_[U]}).sort((te,U)=>{let W=ir(Fs(te))-ir(Fs(U));return W!==0?W:String(te?.label||te?.key).localeCompare(String(U?.label||U?.key))}),[p,g,_]),I=B(()=>ov(p,$)||($?Mi($):null),[p,$]),F=B(()=>L.filter(te=>{let U=Fs(te);return U==="anthropic"||U==="openai"}),[L]),N=B(()=>{if(!I)return[];let te=String(I?.key||"").trim(),U=L.filter(W=>String(W?.key||"").trim()!==te);return[I,...U]},[L,I]),E=B(()=>new Set(N.map(te=>String(te?.key||"").trim()).filter(Boolean)),[N]),T=B(()=>L.filter(te=>!E.has(String(te?.key||"").trim())),[L,E]),O=async te=>{let U=String(te||"").trim();if(!(!U||U===$)){s(!0);try{await e(String(t.id||"").trim(),{model:{primary:U}},"Agent model updated")}finally{s(!1)}}},z=async()=>{if(w){s(!0);try{await e(String(t.id||"").trim(),{model:null},"Agent model reset to default")}finally{s(!1)}}},H=async te=>{let U=String(te||"").trim();if(!U){if(!C)return;r(!0);try{await e(String(t.id||"").trim(),{thinkingDefault:null},"Agent thinking level reset to default")}finally{r(!1)}return}if(U!==S){r(!0);try{await e(String(t.id||"").trim(),{thinkingDefault:U},"Agent thinking level updated")}finally{r(!1)}}},K=C?S:"",Q=B(()=>{let te=new Set,U=[],W=(ue,he)=>{let ee=String(ue||"").trim();!ee||te.has(ee)||(te.add(ee),U.push({value:ee,label:String(he||Ti(ee)).trim()}))};for(let ue of l.levels)W(ue?.id,Ti(ue?.label||ue?.id));return S&&!te.has(S)&&W(S,`${Ti(S)} (custom)`),U},[S,l.levels]);return{authorizedModelOptions:L,canEditModel:y&&!b,effectiveModel:$,effectiveModelEntry:I,handleClearModelOverride:z,handleSelectModel:O,handleSelectThinkingDefault:H,hasDistinctModelOverride:w,hasDistinctThinkingOverride:C,inheritedThinkingDefault:A,loading:!y||b,menuOpen:i,modelEntries:N,popularModels:F,remainingModelOptions:T,setMenuOpen:a,showThinkingSelect:k,thinkingOptionsLoading:d,thinkingSelectOptions:Q,thinkingSelectValue:K,formatInheritedThinkingLabel:ev,updatingModel:n,updatingThinking:o}};var zt=R.bind(M),iv=({agent:t={},saving:e=!1,onUpdateAgent:n=async()=>{},onSwitchToModels:s=()=>{}})=>{let{authorizedModelOptions:o,canEditModel:r,effectiveModel:i,effectiveModelEntry:a,formatInheritedThinkingLabel:l,handleClearModelOverride:c,handleSelectModel:d,handleSelectThinkingDefault:u,hasDistinctModelOverride:p,hasDistinctThinkingOverride:f,inheritedThinkingDefault:g,loading:m,menuOpen:h,modelEntries:b,popularModels:y,remainingModelOptions:v,setMenuOpen:$,showThinkingSelect:w,thinkingOptionsLoading:S,thinkingSelectOptions:A,thinkingSelectValue:C,updatingModel:k,updatingThinking:_}=rv({agent:t,onUpdateAgent:n});return zt`
|
|
3633
3633
|
<div class="bg-surface border border-border rounded-xl p-4 space-y-3">
|
|
3634
3634
|
<div class="flex items-start justify-between gap-3">
|
|
3635
3635
|
<h3 class="card-label">Model</h3>
|
|
@@ -199,13 +199,17 @@ export const useModels = (agentId) => {
|
|
|
199
199
|
const addModel = useCallback(
|
|
200
200
|
(modelKey) => {
|
|
201
201
|
if (!modelKey) return;
|
|
202
|
+
const catalogEntry = catalog.find((model) => model?.key === modelKey);
|
|
203
|
+
const modelConfig = catalogEntry?.agentRuntime
|
|
204
|
+
? { agentRuntime: catalogEntry.agentRuntime }
|
|
205
|
+
: {};
|
|
202
206
|
setConfiguredModels((prev) => {
|
|
203
|
-
const next = { ...prev, [modelKey]:
|
|
207
|
+
const next = { ...prev, [modelKey]: modelConfig };
|
|
204
208
|
updateCache({ configuredModels: next });
|
|
205
209
|
return next;
|
|
206
210
|
});
|
|
207
211
|
},
|
|
208
|
-
[updateCache],
|
|
212
|
+
[catalog, updateCache],
|
|
209
213
|
);
|
|
210
214
|
|
|
211
215
|
const removeModel = useCallback(
|
package/lib/server/helpers.js
CHANGED
|
@@ -115,13 +115,21 @@ const normalizeOnboardingModels = (models) => {
|
|
|
115
115
|
const deduped = new Map();
|
|
116
116
|
for (const model of models || []) {
|
|
117
117
|
if (!model?.key || typeof model.key !== "string") continue;
|
|
118
|
-
const
|
|
118
|
+
const sourceProvider = resolveModelProvider(model.key);
|
|
119
|
+
const isCodexRuntimeModel = sourceProvider === "codex";
|
|
120
|
+
const key = isCodexRuntimeModel
|
|
121
|
+
? `openai/${model.key.split("/").slice(1).join("/")}`
|
|
122
|
+
: model.key;
|
|
123
|
+
const provider = resolveModelProvider(key);
|
|
119
124
|
if (!kOnboardingModelProviders.has(provider)) continue;
|
|
120
|
-
if (!deduped.has(
|
|
121
|
-
deduped.set(
|
|
122
|
-
key
|
|
125
|
+
if (!deduped.has(key)) {
|
|
126
|
+
deduped.set(key, {
|
|
127
|
+
key,
|
|
123
128
|
provider,
|
|
124
129
|
label: model.name || model.key,
|
|
130
|
+
...(isCodexRuntimeModel
|
|
131
|
+
? { agentRuntime: { id: "codex" } }
|
|
132
|
+
: {}),
|
|
125
133
|
});
|
|
126
134
|
}
|
|
127
135
|
}
|