@juspay/neurolink 12.7.5 → 12.7.6

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/CHANGELOG.md CHANGED
@@ -1,8 +1,8 @@
1
- ## [12.7.5](https://github.com/juspay/neurolink/compare/v12.7.4...v12.7.5) (2026-09-01)
1
+ ## [12.7.6](https://github.com/juspay/neurolink/compare/v12.7.5...v12.7.6) (2026-09-01)
2
2
 
3
3
  ### Bug Fixes
4
4
 
5
- - **(memory):** guard retrieve_context on Redis capability ([f94b9d2](https://github.com/juspay/neurolink/commit/f94b9d2eb7dcce6374473c79bb5165373c1a52ab))
5
+ - **(proxy):** fold inline system-role messages into systemPrompt ([fdeefae](https://github.com/juspay/neurolink/commit/fdeefae6808eddf42df711d1d867f964751d2729))
6
6
 
7
7
  ## [11.2.3](https://github.com/juspay/neurolink/compare/v11.2.2...v11.2.3) (2026-08-19)
8
8
 
@@ -2319,7 +2319,10 @@ ${i}`:Array.isArray(s)?`${r}${o}:
2319
2319
  ${i}`:`${r}${o}: ${i}`}).join(`
2320
2320
  `)}return String(e)}};function Jnn(e){return new xA(e)}function Ynn(e,t){const r=new xA(t);return r.addRoutes(e),r.generate()}function Znn(e,t){const r=new xA({basePath:e.basePath??"/api",servers:[{url:`http://${e.host??"localhost"}:${e.port??3e3}`,description:"Configured server"}]});return t&&r.addRoutes(t),r.generate()}er(),fa(),Wr(),yr(),q();var Xnn=["request","args","result","apiKey","token","authorization","credentials","password","secret"],Qnn="[REDACTED]",eon=10;function ton(e,t){if(!t?.enabled||!e||typeof e!="object")return e;const r=t?.placeholder??Qnn,n=new Set([...Xnn,...t?.additionalFields??[]]);if(t?.preserveFields)for(const o of t.preserveFields)n.delete(o);return ron(e,n,r,t)}function ron(e,t,r,n){const o=e;switch(o.type){case"step-start":return non(e,t,r);case"tool-call":return oon(e,t,r,n);case"tool-result":return son(e,t,r,n);case"error":return ion(e,t,r);default:return aon(o,t,r)}}function non(e,t,r){if(!nle(e))return e;const{payload:n,...o}=e,s=xh(n,t,r,0);return{...o,payload:s}}function oon(e,t,r,n){if(nle(e)){const{payload:o,...s}=e;if(o.toolCall&&typeof o.toolCall=="object"){const a=o.toolCall,l=n?.redactToolArgs!==!1&&t.has("args");return{...s,payload:{...o,toolCall:{...a,args:l?r:a.args}}}}return{...s,payload:xh(o,t,r,0)}}if(ole(e)){const{data:o,...s}=e,i=n?.redactToolArgs!==!1&&t.has("args");return"arguments"in o&&i?{...s,data:{...o,arguments:r}}:{...s,data:xh(o,t,r,0)}}return e}function son(e,t,r,n){const o=n?.redactToolResults!==!1&&t.has("result");if(nle(e)){const{payload:s,...i}=e;return{...i,payload:{...s,result:o?r:s.result}}}if(ole(e)){const{data:s,...i}=e;return{...i,data:{...s,result:o?r:s.result}}}return e}function ion(e,t,r){const n=process.env.NODE_ENV==="production";if(ole(e)){const{data:l,...c}=e,{stack:u,...d}=l;return{...c,data:{...xh(d,t,r,0),...n?{}:{stack:u}}}}const o=e,{stack:s,...i}=o;return{...xh(i,t,r,0),type:"error",...n?{}:{stack:s}}}function aon(e,t,r){return xh(e,t,r,0)}function xh(e,t,r,n){if(n>eon)return e;const o={};for(const[s,i]of Object.entries(e))t.has(s.toLowerCase())?o[s]=r:i&&typeof i=="object"&&!Array.isArray(i)?o[s]=xh(i,t,r,n+1):Array.isArray(i)?o[s]=i.map(l=>l&&typeof l=="object"?xh(l,t,r,n+1):l):o[s]=i;return o}function nle(e){const t=e;return"payload"in t&&t.payload!==null&&typeof t.payload=="object"}function ole(e){return"data"in e&&e.data!==null&&typeof e.data=="object"}function lon(e){return t=>e?.enabled?ton(t,e):t}Pp();async function Nsr(e,t){if(!Array.isArray(t)||t.length===0)return;const r=new Set((await e.neurolink.getAllAvailableTools()).map(o=>o.name)),n=t.filter(o=>typeof o=="string"&&r.has(o));if(n.length>0)return n;f.warn("[agentRoutes] Ignoring request.tools \u2014 no entries match registered tool names (legacy fail-open)",{requested:t})}function sle(e){const t=e.neurolink.getSkillsManager();return t||Kt("SKILLS_UNAVAILABLE","Skills are not enabled on this server \u2014 construct NeuroLink with a `skills` config.",void 0,e.requestId)}function ile(e){const t=sle(e);return"error"in t||t.mutationsAllowed?t:Kt("SKILLS_MUTATIONS_DISABLED","Skill mutations are disabled on this server \u2014 construct NeuroLink with `skills.allowMutations: true` to enable create/update/delete.",void 0,e.requestId)}function Lsr(e="/api"){return{prefix:`${e}/agent`,routes:[{method:"POST",path:`${e}/agent/execute`,handler:async t=>{const r=gd(c$,t.body,t.requestId);if(!r.success)return r.error;const n=r.data;return gt({name:"neurolink.http.execute",tracer:He.http,attributes:{"http.route":"/api/agent/execute","ai.provider":n.provider||"default","ai.model":n.model||"default"}},async()=>{const o=typeof n.input=="string"?{text:n.input}:n.input,s=await Nsr(t,n.tools),i=await t.neurolink.generate({input:o,provider:n.provider,model:n.model,systemPrompt:n.systemPrompt,temperature:n.temperature,maxTokens:n.maxTokens,...s?{toolFilter:s}:{},context:{sessionId:t.user?t.session?.id:t.session?.id??n.sessionId,userId:t.user?t.user.id:n.userId,userEmail:t.user?.email,userRoles:t.user?.roles,requestId:t.requestId}}),a=i.toolCalls?.map(l=>({name:l.toolName,arguments:l.args}));return{content:i.content||"",provider:i.provider||n.provider||"unknown",model:i.model||n.model||"unknown",usage:i.usage,toolCalls:a}})},description:"Execute agent with prompt",tags:["agent"]},{method:"POST",path:`${e}/agent/stream`,streaming:{enabled:!0,contentType:"text/event-stream"},handler:async t=>{const r=gd(c$,t.body,t.requestId);if(!r.success)return r.error;const n=r.data,o=typeof n.input=="string"?{text:n.input}:n.input,s=await Nsr(t,n.tools),i=await t.neurolink.stream({input:o,provider:n.provider,model:n.model,systemPrompt:n.systemPrompt,temperature:n.temperature,maxTokens:n.maxTokens,...s?{toolFilter:s}:{},context:{sessionId:t.user?t.session?.id:t.session?.id??n.sessionId,userId:t.user?t.user.id:n.userId,userEmail:t.user?.email,userRoles:t.user?.roles,requestId:t.requestId}}),a=lon(t.redaction);async function*l(){const c=He.http.startSpan("neurolink.http.stream",{attributes:{"http.route":"/api/agent/stream","ai.provider":n.provider||"default","ai.model":n.model||"default"}});try{for await(const u of i.stream)yield a(u);c.setStatus({code:qe.OK})}catch(u){throw c.recordException(u instanceof Error?u:new Error(String(u))),c.setStatus({code:qe.ERROR,message:u instanceof Error?u.message:String(u)}),u}finally{c.end()}}return l()},description:"Stream agent response",tags:["agent","streaming"]},{method:"GET",path:`${e}/agent/providers`,handler:async()=>{const t=zr.getAvailableProviders();return{providers:t,total:t.length}},description:"List available AI providers",tags:["agent","providers"]},{method:"POST",path:`${e}/agent/embed`,handler:async t=>{const r=gd(_Xt,t.body,t.requestId);if(!r.success)return r.error;const n=r.data;try{const o=n.provider||"openai";return await gt({name:"neurolink.http.embed",tracer:He.http,attributes:{"http.route":"/api/agent/embed","ai.provider":o,"ai.model":n.model||"default"}},async()=>{const i=await(await zr.createProvider(o,n.model)).embed(n.text,n.model);return{embedding:i,provider:o,model:n.model||"default",dimension:i.length}})}catch(o){return Kt("EXECUTION_FAILED",o instanceof Error?o.message:"Embedding generation failed",void 0,t.requestId)}},description:"Generate embedding for a single text",tags:["agent","embeddings"]},{method:"POST",path:`${e}/agent/embed-many`,handler:async t=>{const r=gd(wXt,t.body,t.requestId);if(!r.success)return r.error;const n=r.data;try{const o=n.provider||"openai";return await gt({name:"neurolink.http.embedMany",tracer:He.http,attributes:{"http.route":"/api/agent/embed-many","ai.provider":o,"ai.model":n.model||"default","ai.embed.count":n.texts.length}},async()=>{const i=await(await zr.createProvider(o,n.model)).embedMany(n.texts,n.model);return{embeddings:i,provider:o,model:n.model||"default",count:i.length,dimension:i[0]?.length??0}})}catch(o){return Kt("EXECUTION_FAILED",o instanceof Error?o.message:"Batch embedding generation failed",void 0,t.requestId)}},description:"Generate embeddings for multiple texts in a batch",tags:["agent","embeddings"]},{method:"GET",path:`${e}/agent/skills`,handler:async t=>{const r=sle(t);if("error"in r)return r;try{const n=await r.list(t.query.scopeId);return{skills:n,count:n.length}}catch(n){return Kt("EXECUTION_FAILED",n instanceof Error?n.message:"Skills listing failed",void 0,t.requestId)}},description:"List active skills (index only \u2014 no instructions). Optional ?scopeId= filter.",tags:["agent","skills"]},{method:"GET",path:`${e}/agent/skills/:id`,handler:async t=>{const r=sle(t);if("error"in r)return r;try{const n=await r.get(t.params.id);return n||Kt("NOT_FOUND",`Skill "${t.params.id}" not found`,void 0,t.requestId)}catch(n){return Kt("EXECUTION_FAILED",n instanceof Error?n.message:"Skill lookup failed",void 0,t.requestId)}},description:"Fetch one skill (by id or exact name) with instructions",tags:["agent","skills"]},{method:"POST",path:`${e}/agent/skills`,handler:async t=>{const r=ile(t);if("error"in r)return r;const n=gd(Rie,t.body,t.requestId);if(!n.success)return n.error;const{requestedBy:o,...s}=n.data;try{return await r.requestMutation({type:"create",skill:s,...t.user?.id||o?{requestedBy:t.user?.id??o}:{}})}catch(i){return Kt("EXECUTION_FAILED",i instanceof Error?i.message:"Skill create failed",void 0,t.requestId)}},description:"Create a skill (routed through the host's onMutationRequest gate when configured)",tags:["agent","skills"]},{method:"PATCH",path:`${e}/agent/skills/:id`,handler:async t=>{const r=ile(t);if("error"in r)return r;const n=gd(bXt,t.body,t.requestId);if(!n.success)return n.error;const{requestedBy:o,...s}=n.data;try{return await r.requestMutation({type:"update",skillId:t.params.id,patch:s,...t.user?.id||o?{requestedBy:t.user?.id??o}:{}})}catch(i){const a=i instanceof Error?i.message:"Skill update failed";return Kt(a.includes("not found")?"NOT_FOUND":"EXECUTION_FAILED",a,void 0,t.requestId)}},description:"Update a skill (patch semantics; version is bumped)",tags:["agent","skills"]},{method:"DELETE",path:`${e}/agent/skills/:id`,handler:async t=>{const r=ile(t);if("error"in r)return r;try{return await r.requestMutation({type:"delete",skillId:t.params.id,...t.user?.id?{requestedBy:t.user.id}:{}})}catch(n){const o=n instanceof Error?n.message:"Skill delete failed";return Kt(o.includes("not found")?"NOT_FOUND":"EXECUTION_FAILED",o,void 0,t.requestId)}},description:"Soft-delete (deprecate) a skill",tags:["agent","skills"]}]}}Jr(),ii(),nr(),Gf(),mk(),Jr(),ii(),nr(),Oc(),q();var con=["weekly","session","unified","transient","auth"],$sr={session:300*60*1e3+900*1e3,weekly:10080*60*1e3+720*60*1e3,unified:720*60*1e3,transient:900*1e3,auth:300*1e3};Gl();var uon="account-cooldowns.json",don=new Set(con),pon=null,Fsr=!1,G$=null,Up={},ale=new sl;function lle(){return pon??St(Wa(),".neurolink",uon)}function mon(e){if(!e||typeof e!="object")return!1;const t=e;return typeof t.coolingUntil=="number"&&Number.isFinite(t.coolingUntil)&&typeof t.updatedAt=="number"&&Number.isFinite(t.updatedAt)&&typeof t.reason=="string"&&don.has(t.reason)}function hon(e,t){const r=$sr[t.reason];if(r===void 0)return t;const n=t.updatedAt+r;if(t.coolingUntil<=n)return t;const o=s=>(s/36e5).toFixed(1);return f.always(`[proxy] cooldown clamp: ${e} ${t.reason} entry healed from ${o(t.coolingUntil-t.updatedAt)}h to ${o(r)}h \u2014 the stored wait exceeded what "${t.reason}" can mean`),{...t,coolingUntil:n}}async function cle(){Fsr||(G$||(G$=(async()=>{try{const e=JSON.parse(await Kr(lle(),"utf8"));Up=Object.fromEntries(Object.entries(e).filter(t=>mon(t[1])).map(([t,r])=>[t,hon(t,r)]))}catch{Up={}}Fsr=!0})().finally(()=>{G$=null})),await G$)}async function AA(){return await cle(),ale.runExclusive(async()=>({...Up}))}async function bd(e,t,r){await ale.runExclusive(async()=>{await cle();const n=Up[e];n&&n.coolingUntil>t||(Up[e]={coolingUntil:t,reason:r,updatedAt:Date.now()},await il(lle(),Up))})}async function xy(e,t){await ale.runExclusive(async()=>{await cle();const r=Up[e];r&&(t!==void 0&&r.coolingUntil!==t||(delete Up[e],await il(lle(),Up)))})}Uie(),kr(),ma(),nn(),Oc(),Gl();function Li(e,t){if(typeof e.get=="function")return e.get(t)??void 0;const r=e;if(r[t]!==void 0)return r[t];const n=t.toLowerCase();for(const o of Object.keys(r))if(o.toLowerCase()===n)return r[o]}function fon(e,t){if(typeof e.forEach=="function"){e.forEach((r,n)=>t(n));return}for(const r of Object.keys(e))t(r)}function H$(e){return e.trim().replace(/[-_](latest)$/i,"").replace(/-\d{6,8}$/,"")}var gon=new Set(["5h","7d"]),yon=/^anthropic-ratelimit-unified-([a-z0-9_]+)-utilization$/;function von(e,t,r){if(!t)return[];const n=H$(t);if(!n)return[];const o=[];fon(e,i=>{const a=yon.exec(i.toLowerCase());a?.[1]&&!gon.has(a[1])&&o.push(a[1])});const s=[];for(const i of o){const a=`anthropic-ratelimit-unified-${i}-`,l=parseFloat(Li(e,`${a}utilization`)??"");if(Number.isNaN(l))continue;const c=Li(e,`${a}reset`),u=Li(e,`${a}status`)?.trim().toLowerCase();s.push({kind:i.startsWith("7d")?"weekly_scoped":"session_scoped",group:i.startsWith("7d")?"weekly":"session",used:l,status:u??"unknown",resetsAt:c&&parseInt(c,10)||0,scopeModel:n,scopeModelId:t,headerWindow:i,source:"headers",updatedAt:r})}return s}function V$(e){return Li(e,"anthropic-ratelimit-unified-status")?.trim().toLowerCase()||void 0}function Usr(e){const t=e?.overageStatus?.trim().toLowerCase(),r=t==="rejected"||e?.overageDisabledReason!==void 0;if(e?.overageEnabled===!0&&!r)return!0;if(!e||t!=="allowed")return!1;if(e.overageInUse===!0)return!0;const n=e.fallbackStatus?.trim().toLowerCase(),o=(e.upgradePaths??"").split(",").map(s=>s.trim().toLowerCase()).includes("overage");return n==="available"&&o?!0:n===void 0&&(e.fallbackPercentage??0)>0}function rb(e,t){const r="anthropic-ratelimit-",n=Li(e,`${r}unified-5h-utilization`),o=Li(e,`${r}unified-7d-utilization`);if(n===void 0||o===void 0)return null;const s=parseFloat(n),i=parseFloat(o);if(Number.isNaN(s)||Number.isNaN(i))return null;const a=Li(e,`${r}unified-5h-reset`),l=Li(e,`${r}unified-7d-reset`),c=Li(e,`${r}unified-fallback-percentage`),u=t?.now??Date.now(),d=von(e,t?.model,u),m=Li(e,`${r}unified-overage-disabled-reason`),h=Li(e,`${r}unified-representative-claim`);return{unifiedStatus:V$(e),sessionUsed:s,sessionStatus:Li(e,`${r}unified-5h-status`)??"unknown",sessionResetAt:a&&parseInt(a,10)||0,weeklyUsed:i,weeklyStatus:Li(e,`${r}unified-7d-status`)??"unknown",weeklyResetAt:l&&parseInt(l,10)||0,fallbackPercentage:c&&parseFloat(c)||0,fallbackStatus:Li(e,`${r}unified-fallback`)??"unknown",upgradePaths:Li(e,`${r}unified-upgrade-paths`),overageStatus:Li(e,`${r}unified-overage-status`)??"unknown",overageInUse:Li(e,`${r}unified-overage-in-use`)?.trim().toLowerCase()==="true",...m?{overageDisabledReason:m}:{},...h?{representativeClaim:h}:{},lastUpdated:u,source:"headers",...d.length>0?{windows:d}:{}}}function Bsr(e){return[e.kind,e.source??"usage-api",e.headerWindow??"",e.scopeModel??e.scopeModelId??"",e.scopeSurface??""].join("|")}function _on(e,t){if(!t?.length)return e;if(!e?.length)return t;const r=new Map,n=t.some(o=>(o.source??"usage-api")==="usage-api");for(const o of e)n&&(o.source??"usage-api")!=="headers"||r.set(Bsr(o),o);for(const o of t)r.set(Bsr(o),o);return[...r.values()]}function Ay(e,t){if(!e)return t;const r=_on(e.windows,t.windows),n={...t};r!==void 0&&(n.windows=r),n.overageEnabled===void 0&&e.overageEnabled!==void 0&&(n.overageEnabled=e.overageEnabled),n.overageDisabledReason===void 0&&e.overageDisabledReason!==void 0&&(n.overageDisabledReason=e.overageDisabledReason),n.representativeClaim===void 0&&e.representativeClaim!==void 0&&(n.representativeClaim=e.representativeClaim);const o=t.source==="usage-api"?t.windowsUpdatedAt:t.windowsUpdatedAt??e.windowsUpdatedAt;return o!==void 0&&(n.windowsUpdatedAt=o),n}var won="account-quotas.json",bon=5e3,nb={},zsr=!1,W$=null,ule=!1,dle=0,Iy=null,K$=new sl,Ton=new sl,Eon=null;function jsr(){return Eon??rr(El(),".neurolink",won)}async function Son(){await Ton.runExclusive(async()=>{let e,t=0,r="";if(await K$.runExclusive(async()=>{ule&&(e=Object.fromEntries(Object.entries(nb).map(([n,o])=>[n,{...o}])),t=dle,r=jsr())}),!!e)try{await il(r,e,384),await K$.runExclusive(async()=>{dle===t&&(ule=!1)})}catch{}})}function Con(){Iy||(Iy=setTimeout(()=>{Iy=null,Son().catch(()=>{})},bon),Iy&&typeof Iy=="object"&&"unref"in Iy&&Iy.unref())}async function qsr(){zsr||(W$||(W$=(async()=>{try{const e=await Ci.readFile(jsr(),"utf-8");nb=JSON.parse(e)}catch{nb={}}zsr=!0})().finally(()=>{W$=null})),await W$)}async function ple(){return await qsr(),K$.runExclusive(async()=>({...nb}))}async function Ry(e,t){await K$.runExclusive(async()=>{await qsr(),nb[e]=Ay(nb[e],t),ule=!0,dle+=1}),Con()}q(),rA(),mk(),q(),rA(),mk(),Gl(),pn(),wr();var kon=300*1e3,xon=6e4,mle=2e3,Td=new Map;function hle(e){return!!(e.expiresAt&&e.expiresAt<=Date.now()+kon&&e.refreshToken)}function Gsr(e){return e===400||e===401||e===403||e===404}function My(e){return Gsr(e.status)}async function Aon(e){if(!e.refreshToken)return{success:!1,error:"No refresh token available"};const t=new URLSearchParams({grant_type:"refresh_token",refresh_token:e.refreshToken,client_id:zX}).toString(),r={"Content-Type":"application/x-www-form-urlencoded",Accept:"application/json","User-Agent":Ag},n=[dk,qxt];let o;for(const s of n)try{const i=await fetch(s,{method:"POST",headers:r,body:t,signal:AbortSignal.timeout(1e4)});if(!i.ok){const l=await i.text();f.warn(`[token-refresh] failed for ${e.label} at ${dn(s)}`,{status:i.status,error:l.slice(0,500)});const c={success:!1,error:l,status:i.status};if(Gsr(i.status)&&(o=c),s===dk)continue;return o??c}const a=await i.json();return e.token=a.access_token,e.expiresAt=a.expires_in!==void 0?Date.now()+a.expires_in*1e3:Date.now()+3300*1e3,a.refresh_token&&(e.refreshToken=a.refresh_token),f.debug(`[token-refresh] refreshed for ${e.label}`),{success:!0}}catch(i){if(f.warn(`[token-refresh] exception for ${e.label} at ${dn(s)}`,{error:String(i)}),s===dk)continue;return o??{success:!1,error:String(i)}}return o??{success:!1,error:"No refresh URLs available"}}async function Hsr(e){if(!e.refreshToken)return{success:!1,error:"No refresh token available"};const t=e.refreshToken;let r=Td.get(t);if(!r){const o={...e},s=Aon(o).then(i=>{const a={result:i,token:o.token,refreshToken:o.refreshToken,expiresAt:o.expiresAt};if(i.success){const l=new Set([t]),c=o.refreshToken;c&&c!==t&&!Td.has(c)&&(Td.set(c,s),l.add(c)),setTimeout(()=>{for(const d of l)Td.get(d)===s&&Td.delete(d)},xon).unref?.()}else Td.get(t)===s&&Td.delete(t);return a},i=>{throw Td.get(t)===s&&Td.delete(t),i});Td.set(t,s),r=s}const n=await r;return n.result.success&&(e.token=n.token,e.refreshToken=n.refreshToken,e.expiresAt=n.expiresAt),n.result}async function Vsr(e,t){if(!t||typeof t=="string"||!("providerKey"in t))return!1;let r;try{r=await Bt(al.peekTokens(t.providerKey),mle,"[token-refresh] peekTokens reconciliation timed out")}catch(n){return f.debug("[token-refresh] skipping persisted-state reconciliation (peek failed)",{error:n instanceof Error?n.message:String(n)}),!1}return!r||r.expiresAt<=(e.expiresAt??0)||r.accessToken===e.token&&r.refreshToken===e.refreshToken&&r.expiresAt===e.expiresAt?!1:(e.token=r.accessToken,e.refreshToken=r.refreshToken,e.expiresAt=r.expiresAt,!0)}async function J$(e,t){if(await Vsr(e,t)&&!hle(e))return{success:!0};const n=await Hsr(e);return n.success?n:await Vsr(e,t)?{success:!0}:n}async function Y$(e,t){if(typeof e!="string"&&"providerKey"in e){await Ron(e.providerKey,t);return}const r=typeof e=="string"?e:e.credPath;await Ion(r,t)}async function Ion(e,t){try{const r=await Promise.resolve().then(()=>(si(),zf)),n=JSON.parse(await r.readFile(e,"utf8"));n.oauth={...n.oauth,accessToken:t.token,expiresAt:t.expiresAt,refreshToken:t.refreshToken},n.updatedAt=Date.now(),await il(e,n,384)}catch(r){f.warn("[token-refresh] Failed to persist legacy credentials",{error:r instanceof Error?r.message:String(r)})}}async function Ron(e,t){try{const r=await Bt(al.peekTokens(e),mle,"[token-refresh] peekTokens for persistence timed out"),n={accessToken:t.token,refreshToken:t.refreshToken??r?.refreshToken,expiresAt:t.expiresAt??r?.expiresAt??Date.now()+3300*1e3,tokenType:r?.tokenType??"Bearer",...r?.scope?{scope:r.scope}:{}};await Bt(al.saveTokens(e,n),mle,"[token-refresh] saveTokens timed out")}catch(r){f.warn("[token-refresh] Failed to persist TokenStore credentials",{error:r instanceof Error?r.message:String(r)})}}Uie();var Mon="https://api.anthropic.com/api/oauth/usage",Pon=1e4;async function Wsr(e){const t=[],r=await al.listByPrefix("anthropic:");for(const n of r){if(!$ie(n,e)||await al.isDisabled(n))continue;const o=await al.loadTokens(n);if(!o)continue;const s=n.indexOf(":");t.push({key:n,label:s>=0?n.slice(s+1):n,token:o.accessToken,refreshToken:o.refreshToken,expiresAt:o.expiresAt,type:o.tokenType==="Bearer"?"oauth":"api_key",persistTarget:{providerKey:n}})}return t}async function Ksr(e){try{return{response:await fetch(Mon,{method:"GET",headers:{authorization:`Bearer ${e}`,"anthropic-beta":Jxt,"user-agent":Ag,accept:"application/json"},signal:AbortSignal.timeout(Pon)})}}catch(t){return{networkError:t instanceof Error?t.message:String(t)}}}async function Don(e){if(e.type!=="oauth")return{ok:!1,reason:"not_oauth",error:"api_key accounts have no subscription usage windows"};const t=async()=>{const s=await J$(e,e.persistTarget);return s.success?(e.persistTarget&&await Y$(e.persistTarget,e),null):My(s)?{ok:!1,reason:"auth",error:"reauth required (refresh token rejected)",status:s.status}:(e.expiresAt?e.expiresAt<=Date.now():!1)?{ok:!1,reason:"auth",error:"token expired and refresh failed",status:s.status}:null};let r=!1;if(hle(e)){r=!0;const s=await t();if(s)return s}let{response:n,networkError:o}=await Ksr(e.token);if(n?.status===401&&e.refreshToken&&!r){const s=await t();if(s)return s;({response:n,networkError:o}=await Ksr(e.token))}if(!n)return{ok:!1,reason:"network",error:o??"network failure"};if(!n.ok){const s=await n.text().catch(()=>"");return f.debug(`[account-usage] usage fetch failed for ${e.label}`,{status:n.status,body:s.slice(0,300)}),{ok:!1,reason:n.status===401||n.status===403?"auth":"http",error:`usage endpoint returned HTTP ${n.status}`,status:n.status}}try{return{ok:!0,usage:await n.json()}}catch(s){return{ok:!1,reason:"parse",error:s instanceof Error?s.message:String(s)}}}var Oon=new Set(["rejected","exceeded","over_limit","blocked"]);function fle(e,t){const r=t?.trim().toLowerCase();return typeof e=="number"&&e>=100||r!==void 0&&Oon.has(r)?"rejected":"allowed"}function IA(e){if(!e)return 0;const t=Date.parse(e);return Number.isNaN(t)?0:Math.floor(t/1e3)}function gle(e){return typeof e=="number"&&Number.isFinite(e)?e/100:void 0}function Non(e,t){const r={kind:e.kind??"unknown",used:gle(e.percent)??0,status:fle(e.percent,e.severity),resetsAt:IA(e.resets_at),source:"usage-api",updatedAt:t};e.group!==void 0&&(r.group=e.group),e.severity!==null&&e.severity!==void 0&&(r.severity=e.severity),e.is_active!==null&&e.is_active!==void 0&&(r.isActive=e.is_active);const n=e.scope?.model?.display_name;n&&(r.scopeModel=n);const o=e.scope?.model?.id;o&&(r.scopeModelId=o);const s=e.scope?.surface;return s&&(r.scopeSurface=s),r}function Jsr(e,t){const r=Array.isArray(e.limits)?e.limits:[];if(!e.five_hour&&!e.seven_day&&r.length===0)return null;const{now:n,prior:o}=t,s=r.map(y=>Non(y,n)),i=r.find(y=>y.kind==="session"),a=r.find(y=>y.kind==="weekly_all"),l=e.five_hour?.utilization??i?.percent??void 0,c=e.seven_day?.utilization??a?.percent??void 0,u=IA(e.five_hour?.resets_at)||IA(i?.resets_at)||(o?.sessionResetAt??0),d=IA(e.seven_day?.resets_at)||IA(a?.resets_at)||(o?.weeklyResetAt??0),m=e.extra_usage?.is_enabled,h=m===!0?"allowed":m===!1?"rejected":o?.overageStatus??"unknown",g={sessionUsed:gle(l)??o?.sessionUsed??0,sessionStatus:fle(l,i?.severity),sessionResetAt:u,weeklyUsed:gle(c)??o?.weeklyUsed??0,weeklyStatus:fle(c,a?.severity),weeklyResetAt:d,fallbackPercentage:o?.fallbackPercentage??0,overageStatus:h,...typeof m=="boolean"?{overageEnabled:m}:{},lastUpdated:n,windows:s,windowsUpdatedAt:n,source:"usage-api"};return o?.fallbackStatus!==void 0&&(g.fallbackStatus=o.fallbackStatus),o?.upgradePaths!==void 0&&(g.upgradePaths=o.upgradePaths),g}var Lon=[3e4,2*6e4,10*6e4],$on=30*6e4,Fon=class{inFlight=new Map;states=new Map;metrics={attempted:0,succeeded:0,failed:0,coalesced:0,backoffSuppressed:0,triggerDeduplicated:0};getState(e){const t=this.states.get(e);return t?{...t,inFlight:this.inFlight.has(e)}:{inFlight:!1,consecutiveFailures:0,coalesced:0}}run(e,t,r,n={}){const o=this.inFlight.get(e.key);if(o){const l=this.getOrCreateState(e.key);return l.coalesced+=1,this.metrics.coalesced+=1,o}const s=n.now??Date.now(),i=this.getOrCreateState(e.key);if(!n.force&&i.lastCompletedTrigger===t)return this.metrics.triggerDeduplicated+=1,Promise.resolve({kind:"not_due"});if(!n.force&&s<(i.nextEligibleAt??0))return this.metrics.backoffSuppressed+=1,Promise.resolve({kind:"backoff",nextEligibleAt:i.nextEligibleAt??s});i.lastAttemptAt=s,this.metrics.attempted+=1;const a=r(e).catch(l=>({ok:!1,reason:"network",error:l instanceof Error?l.message:String(l)})).then(l=>{const c=n.now??Date.now();if(l.ok===!1){this.metrics.failed+=1,i.consecutiveFailures+=1,i.lastFailureReason=l.reason;const u=Lon[Math.max(0,i.consecutiveFailures-1)]??$on,d=.9+Math.random()*.2;i.nextEligibleAt=c+Math.round(u*d)}else this.metrics.succeeded+=1,i.lastSuccessAt=c,i.nextEligibleAt=void 0,i.consecutiveFailures=0,i.lastFailureReason=void 0,i.lastCompletedTrigger=t;return{kind:"completed",result:l,startedAt:s}}).finally(()=>{this.inFlight.delete(e.key)});return this.inFlight.set(e.key,a),a}clear(){this.inFlight.clear(),this.states.clear(),this.metrics={attempted:0,succeeded:0,failed:0,coalesced:0,backoffSuppressed:0,triggerDeduplicated:0}}getMetrics(){return{...this.metrics}}getOrCreateState(e){let t=this.states.get(e);return t||(t={inFlight:!1,consecutiveFailures:0,coalesced:0},this.states.set(e,t)),t}};pn();var Ysr=250,Uon=3e4,Bon=class{generation=0;degraded=!1;backoffUntil=0;lastErrorCode=null;lastTransportScope="shared_provider_transport";probe;async acquire(e){if(!this.degraded)return{allowed:!0,probe:!1,generation:this.generation};const t=Math.max(0,this.backoffUntil-Date.now());if(t>0&&await this.wait(t,e),!this.degraded)return{allowed:!0,probe:!1,generation:this.generation};if(this.probe){const o=await this.waitForProbe(this.probe.promise,e);return o==="recovered"?{allowed:!0,probe:!1,generation:this.generation}:o==="abandoned"?this.acquire(e):{allowed:!1,errorCode:this.lastErrorCode,transportScope:this.lastTransportScope}}let r;const n=new Promise(o=>{r=o});return this.probe={generation:this.generation,promise:n,resolve:r},{allowed:!0,probe:!0,generation:this.generation}}reportSuccess(e){!e.allowed||e.generation!==this.generation||e.probe&&this.probe?.generation!==e.generation||(this.degraded=!1,this.backoffUntil=0,this.lastErrorCode=null,this.lastTransportScope="shared_provider_transport",e.probe&&this.probe?.generation===e.generation&&(this.probe.resolve("recovered"),this.probe=void 0))}reportTransportFailure(e,t,r){!r.allowed||r.generation!==this.generation||r.probe&&this.probe?.generation!==r.generation||(this.degraded=!0,this.backoffUntil=Date.now()+Ysr,this.lastErrorCode=e??null,this.lastTransportScope=t,r.probe&&this.probe?.generation===r.generation&&(this.probe.resolve("failed"),this.probe=void 0),this.generation+=1)}reportProbeAbandoned(e){!e.allowed||!e.probe||e.generation!==this.generation||this.probe?.generation!==e.generation||(this.probe.resolve("abandoned"),this.probe=void 0,this.generation+=1)}clear(){this.probe?.resolve("failed"),this.probe=void 0,this.generation+=1,this.degraded=!1,this.backoffUntil=0,this.lastErrorCode=null,this.lastTransportScope="shared_provider_transport"}async wait(e,t){if(t?.aborted)throw t.reason;await new Promise((r,n)=>{const o={},s=()=>{o.current&&clearTimeout(o.current),n(t?.reason)};o.current=setTimeout(()=>{t?.removeEventListener("abort",s),r()},e),o.current.unref?.(),t?.addEventListener("abort",s,{once:!0})})}async waitForProbe(e,t){const r=Bt(e,Uon,"Anthropic transport recovery probe timed out");try{return await this.waitForProbeOrAbort(r,t)}catch(n){if(n instanceof Em&&this.probe?.promise===e)return this.probe.resolve("failed"),this.probe=void 0,this.generation+=1,this.backoffUntil=Date.now()+Ysr,"failed";throw n}}waitForProbeOrAbort(e,t){if(!t)return e;if(t.aborted)throw t.reason;return new Promise((r,n)=>{const o=()=>n(t.reason);t.addEventListener("abort",o,{once:!0}),e.then(s=>{t.removeEventListener("abort",o),r(s)},s=>{t.removeEventListener("abort",o),n(s)})})}},zon="anthropic-ratelimit-",jon=["retry-after"],qon=4102444800;function Zsr(e){return e.replace(/[^\x20-\x7E]/g,"").trim()}function Xsr(e,t){if(!e||e<=0)return;const r=e>qon?e:e*1e3;if(!(r<=t))return Math.round((r-t)/1e3)}function yle(e){return Number.isFinite(e)?Math.max(0,Math.min(100,Math.round((1-e)*100))):0}function Gon(e){const t={},r=(n,o)=>{const s=n.toLowerCase();if(s.startsWith(zon)||jon.includes(s)){const i=Zsr(o);i&&(t[s]=i)}};if(typeof e.forEach=="function")return e.forEach((n,o)=>r(o,n)),t;for(const[n,o]of Object.entries(e))typeof o=="string"&&r(n,o);return t}function Hon(e,t=Date.now()){const r={"x-neurolink-quota-source":e.source},n=(s,i)=>{if(i==null)return;const a=Zsr(String(i));a&&(r[s]=a)};n("x-neurolink-account",e.accountLabel),n("x-neurolink-account-type",e.accountType),n("x-neurolink-served-by",e.servedBy),n("x-neurolink-attempt",e.attempt),n("x-neurolink-account-cooling-until",e.coolingUntil),n("x-neurolink-account-cooling-reason",e.coolingReason),e.pool&&(n("x-neurolink-pool-available",e.pool.available),n("x-neurolink-pool-cooling",e.pool.cooling),n("x-neurolink-pool-best-session-left",e.pool.bestSessionLeftPct));const o=e.quota;return o&&e.source!=="none"&&(n("x-neurolink-quota-session-left-pct",yle(o.sessionUsed)),n("x-neurolink-quota-session-status",o.sessionStatus),n("x-neurolink-quota-session-resets-in",Xsr(o.sessionResetAt,t)),n("x-neurolink-quota-weekly-left-pct",yle(o.weeklyUsed)),n("x-neurolink-quota-weekly-status",o.weeklyStatus),n("x-neurolink-quota-weekly-resets-in",Xsr(o.weeklyResetAt,t)),n("x-neurolink-quota-unified-status",o.unifiedStatus),n("x-neurolink-quota-overage-status",o.overageStatus),n("x-neurolink-quota-fallback-pct",Math.round((o.fallbackPercentage??0)*100)),n("x-neurolink-quota-updated-at",o.lastUpdated)),r}function Von(e){return{...e.upstreamHeaders?Gon(e.upstreamHeaders):{},...Hon(e.context,e.now)}}function Won(e,t=Date.now()){let r=0,n=0,o;for(const s of e){if(!!s.coolingUntil&&s.coolingUntil>t){n+=1;continue}if(r+=1,s.quota){const a=yle(s.quota.sessionUsed);(o===void 0||a>o)&&(o=a)}}return{available:r,cooling:n,...o!==void 0?{bestSessionLeftPct:o}:{}}}Ut(),Yi(),dc();var Qsr=0;function eir(){Qsr+=1;const e=Math.random().toString(36).slice(2,10);return`msg_${Date.now().toString(36)}${e}${Qsr}`}function Z$(){return`toolu_${pf(18).toString("base64url").slice(0,24)}`}function vle(e){let t;typeof e.system=="string"?t=e.system:Array.isArray(e.system)&&(t=e.system.map(u=>u.text).join(`
2321
2321
 
2322
- `));const r=[],n=[];let o="",s=-1;for(let u=e.messages.length-1;u>=0;u--)if(e.messages[u].role==="user"){s=u;break}for(let u=0;u<e.messages.length;u++){const d=e.messages[u],m=u===s;if(typeof d.content=="string")r.push({role:d.role,content:d.content}),d.role==="user"&&(o=d.content);else if(Array.isArray(d.content)){const h=[];for(const y of d.content)if(y.type==="text")h.push(y.text);else if(y.type==="image")if(m){let v="";y.source.type==="base64"&&y.source.data?v=`data:${y.source.media_type||"image/png"};base64,${y.source.data}`:y.source.type==="url"&&y.source.url&&(v=y.source.url),v&&n.push(v)}else h.push(`[image: ${y.source.type}]`);else if(y.type==="tool_use"){const v=y.input!==void 0?JSON.stringify(y.input):"{}";h.push(`[tool_use:${y.id}:${y.name}] ${v}`)}else if(y.type==="tool_result"){const v=typeof y.content=="string"?y.content:Array.isArray(y.content)?y.content.map(_=>_.type==="text"?_.text:`[${_.type}]`).join(`
2322
+ `));const r=[],n=[];let o="",s=-1;for(let u=e.messages.length-1;u>=0;u--)if(e.messages[u].role==="user"){s=u;break}for(let u=0;u<e.messages.length;u++){const d=e.messages[u],m=u===s;if(d.role==="system"){const h=typeof d.content=="string"?d.content:Array.isArray(d.content)?d.content.map(g=>g.type==="text"?g.text:"").filter(g=>g.length>0).join(`
2323
+ `):"";h&&(t=t?`${t}
2324
+
2325
+ ${h}`:h);continue}if(typeof d.content=="string")r.push({role:d.role,content:d.content}),d.role==="user"&&(o=d.content);else if(Array.isArray(d.content)){const h=[];for(const y of d.content)if(y.type==="text")h.push(y.text);else if(y.type==="image")if(m){let v="";y.source.type==="base64"&&y.source.data?v=`data:${y.source.media_type||"image/png"};base64,${y.source.data}`:y.source.type==="url"&&y.source.url&&(v=y.source.url),v&&n.push(v)}else h.push(`[image: ${y.source.type}]`);else if(y.type==="tool_use"){const v=y.input!==void 0?JSON.stringify(y.input):"{}";h.push(`[tool_use:${y.id}:${y.name}] ${v}`)}else if(y.type==="tool_result"){const v=typeof y.content=="string"?y.content:Array.isArray(y.content)?y.content.map(_=>_.type==="text"?_.text:`[${_.type}]`).join(`
2323
2326
  `):"";h.push(`[tool_result:${y.tool_use_id}] ${v}`)}else if(y.type){const{type:v,..._}=y,b=JSON.stringify(_),T=b.length>200?b.slice(0,200)+"\u2026":b;h.push(`[${v}: ${T}]`)}const g=h.join(`
2324
2327
  `);r.push({role:d.role,content:g}),d.role==="user"&&(o=g)}}const i={};if(e.tools)for(const u of e.tools)i[u.name]={description:u.description??"",inputSchema:fm(n8e(u.input_schema??{type:"object"}))};let a,l;if(e.tool_choice)switch(e.tool_choice.type){case"auto":a="auto";break;case"any":a="required";break;case"tool":a="required",l=e.tool_choice.name;break;case"none":a="none";break}let c;return e.thinking&&(c={enabled:e.thinking.type==="enabled"||e.thinking.type==="adaptive",budgetTokens:e.thinking.budget_tokens,...e.thinking.type==="adaptive"?{thinkingLevel:"medium"}:{}}),{model:e.model,maxTokens:e.max_tokens,temperature:e.temperature,topP:e.top_p,topK:e.top_k,systemPrompt:t,stream:e.stream===!0,prompt:o,images:n,conversationMessages:r,tools:i,toolChoice:a,toolChoiceName:l,thinkingConfig:c,metadata:e.metadata,stopSequences:e.stop_sequences}}function tir(e){switch(e){case"stop":case"end_turn":return"end_turn";case"length":case"max_tokens":return"max_tokens";case"tool-calls":case"tool_use":return"tool_use";case"content_filter":case"safety":return"stop_sequence";default:return e??"end_turn"}}function _le(e,t){const r=[],n=e.toolCalls&&e.toolCalls.length>0&&(!e.finishReason||e.finishReason==="stop")?"tool_use":e.finishReason;if(e.reasoning&&r.push({type:"thinking",thinking:e.reasoning}),e.content&&r.push({type:"text",text:e.content}),e.toolCalls&&e.toolCalls.length>0)for(const o of e.toolCalls){const s=o.args??o.parameters??o.input??{};r.push({type:"tool_use",id:Z$(),name:o.toolName,input:s})}return r.length===0&&r.push({type:"text",text:""}),{id:eir(),type:"message",role:"assistant",content:r,model:e.model??t,stop_reason:tir(n),stop_sequence:null,usage:{input_tokens:e.usage?.input??0,output_tokens:e.usage?.output??0,...e.usage?.cacheCreationTokens!==void 0&&{cache_creation_input_tokens:e.usage.cacheCreationTokens},...e.usage?.cacheReadTokens!==void 0&&{cache_read_input_tokens:e.usage.cacheReadTokens}}}}function Kon(e){switch(e){case 400:return"invalid_request_error";case 401:return"authentication_error";case 403:return"permission_error";case 404:return"not_found_error";case 413:return"request_too_large";case 429:return"rate_limit_error";case 500:case 502:case 503:return"api_error";case 529:return"overloaded_error";default:return"api_error"}}function ul(e,t,r){return{type:"error",error:{type:r??Kon(e),message:t}}}function Lc(e,t){const r=JSON.stringify(t);return`event: ${e}
2325
2328
  data: ${r}
@@ -71,6 +71,28 @@ export function parseClaudeRequest(body) {
71
71
  for (let msgIdx = 0; msgIdx < body.messages.length; msgIdx++) {
72
72
  const msg = body.messages[msgIdx];
73
73
  const isLatestUserMsg = msgIdx === lastUserMsgIdx;
74
+ // The Messages API restricts `messages[].role` to "user"/"assistant" —
75
+ // system prompts are a separate top-level field — but nothing at the
76
+ // wire boundary enforces that. A client that inlines a "system" message
77
+ // here would otherwise flow straight into conversationMessages and land
78
+ // at a non-leading index once translated to an OpenAI-shaped request for
79
+ // a fallback provider (e.g. LiteLLM/vLLM), whose chat templates reject
80
+ // any system message not at index 0. Fold it into systemPrompt instead,
81
+ // mirroring parseOpenAIRequest's handling of inline system messages.
82
+ if (msg.role === "system") {
83
+ const text = typeof msg.content === "string"
84
+ ? msg.content
85
+ : Array.isArray(msg.content)
86
+ ? msg.content
87
+ .map((b) => (b.type === "text" ? b.text : ""))
88
+ .filter((t) => t.length > 0)
89
+ .join("\n")
90
+ : "";
91
+ if (text) {
92
+ systemPrompt = systemPrompt ? `${systemPrompt}\n\n${text}` : text;
93
+ }
94
+ continue;
95
+ }
74
96
  if (typeof msg.content === "string") {
75
97
  conversationMessages.push({ role: msg.role, content: msg.content });
76
98
  if (msg.role === "user") {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@juspay/neurolink",
3
- "version": "12.7.5",
3
+ "version": "12.7.6",
4
4
  "packageManager": "pnpm@10.15.1",
5
5
  "description": "TypeScript AI SDK with 24+ LLM providers behind one consistent API. MCP-native (connect any MCP server), voice TTS/STT/realtime, RAG, agents, memory, context compaction. OpenAI · Anthropic · Gemini · Bedrock · Azure · Ollama · DeepSeek · NVIDIA NIM and more.",
6
6
  "author": {