@juspay/neurolink 9.63.0 → 9.63.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.
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
## [9.63.1](https://github.com/juspay/neurolink/compare/v9.63.0...v9.63.1) (2026-05-14)
|
|
2
|
+
|
|
3
|
+
### Bug Fixes
|
|
4
|
+
|
|
5
|
+
- **(conversation-history):** remove conversation title truncation and character limit prompt constraint ([cf3d9b7](https://github.com/juspay/neurolink/commit/cf3d9b71541c57dfabe462053d06939cce8614c1))
|
|
6
|
+
|
|
1
7
|
## [9.63.0](https://github.com/juspay/neurolink/compare/v9.62.0...v9.63.0) (2026-05-09)
|
|
2
8
|
|
|
3
9
|
### Features
|
|
@@ -1801,7 +1801,7 @@ The title must meaningfully reflect the topic or intent of the message.
|
|
|
1801
1801
|
Do not output anything unrelated, vague, or generic.
|
|
1802
1802
|
Do not say you cannot create a title. Always return a valid title.
|
|
1803
1803
|
|
|
1804
|
-
User message: "${e}"`,o=process.env.NEUROLINK_TITLE_PROMPT,s=o?o.replace(/\$\{userMessage\}/g,e):n,i=await t.generate({input:{text:s},provider:this.config.summarizationProvider||"vertex",model:this.config.summarizationModel||"gemini-2.5-flash",disableTools:!0}),a=i.content?.trim()||"New Conversation";return a=a.replace(/^(Title:|Here's a title:|The title is:)\s*/i,""),a=a.replace(/['"]/g,""),a=a.replace(/\.$/,""),a.length
|
|
1804
|
+
User message: "${e}"`,o=process.env.NEUROLINK_TITLE_PROMPT,s=o?o.replace(/\$\{userMessage\}/g,e):n,i=await t.generate({input:{text:s},provider:this.config.summarizationProvider||"vertex",model:this.config.summarizationModel||"gemini-2.5-flash",disableTools:!0}),a=i.content?.trim()||"New Conversation";return a=a.replace(/^(Title:|Here's a title:|The title is:)\s*/i,""),a=a.replace(/['"]/g,""),a=a.replace(/\.$/,""),a.length<3&&(a="New Conversation"),g.info("[RedisConversationMemoryManager] Generated conversation title",{originalLength:i.content?.length||0,cleanedTitle:a,titleLength:a.length}),a}catch(t){return g.error("[RedisConversationMemoryManager] Failed to generate conversation title",{error:t instanceof Error?t.message:String(t),userMessagePreview:e.substring(0,100)}),e.length>30?e.substring(0,30)+"...":e||"New Conversation"}}createSummarySystemMessage(e,t,n){return{id:`summary-${Ue()}`,role:"system",content:`Summary of previous conversation turns:
|
|
1805
1805
|
|
|
1806
1806
|
${e}`,timestamp:new Date().toISOString(),metadata:{isSummary:!0,summarizesFrom:t,summarizesTo:n}}}async getSessionMessages(e,t){if(await this.ensureInitialized(),!this.redisClient)return[];try{let n=Gl(this.redisConfig,e,t),o=await this.redisClient.get(n);return Vl(o||null)?.messages??[]}catch(n){return g.error("[RedisConversationMemoryManager] Failed to get session messages",{sessionId:e,userId:t,error:n instanceof Error?n.message:String(n)}),[]}}async setSessionMessages(e,t,n){if(await this.ensureInitialized(),!this.redisClient)throw new Sa("Redis client not initialized","STORAGE_ERROR",{sessionId:e});try{let o=Gl(this.redisConfig,e,n),s=await this.redisClient.get(o),i=Vl(s||null);if(!i)throw new Sa(`Session ${e} not found`,"STORAGE_ERROR",{sessionId:e});i.messages=t,i.updatedAt=new Date().toISOString(),i.summarizedUpToMessageId=void 0,i.summarizedMessage=void 0,i.lastTokenCount=void 0,i.lastCountedAt=void 0;let a=S_(i);await this.redisClient.set(o,a),this.redisConfig.ttl>0&&await this.redisClient.expire(o,this.redisConfig.ttl),g.debug("[RedisConversationMemoryManager] Session messages replaced",{sessionId:e,userId:n,messageCount:t.length})}catch(o){throw o instanceof Sa?o:new Sa(`Failed to set session messages for session ${e}`,"STORAGE_ERROR",{sessionId:e,error:o instanceof Error?o.message:String(o)})}}async close(){this.redisClient&&(await uLe(this.redisConfig),this.redisClient=null,this.isInitialized=!1,g.info("Redis connection closed"))}async getStats(){if(await this.ensureInitialized(),!this.redisClient)return{totalSessions:0,totalTurns:0};let e=`${this.redisConfig.keyPrefix}*`,t=await Ij(this.redisClient,e);g.debug("[RedisConversationMemoryManager] Got session keys with SCAN",{pattern:e,keyCount:t.length});let n=0;for(let o of t){let s=await this.redisClient.get(o),i=Vl(s);i?.messages&&(n+=i.messages.length/2)}return{totalSessions:t.length,totalTurns:n}}async clearSession(e,t){if(await this.ensureInitialized(),!this.redisClient)return!1;let n=this.redisClient;return BI.startActiveSpan("neurolink.memory.clear",{kind:ir.CLIENT,attributes:{"session.id":e,...t&&{"user.id":t}}},async o=>{try{let s=Gl(this.redisConfig,e,t),i=await Me(n.del(s),cre);return Number(i)>0?(t&&await this.removeUserSession(t,e),o.setAttribute("session.deleted",!0),o.setStatus({code:be.OK}),g.info("Redis session cleared",{sessionId:e}),!0):(o.setAttribute("session.deleted",!1),o.setStatus({code:be.OK}),!1)}catch(s){throw o.setStatus({code:be.ERROR,message:s instanceof Error?s.message:String(s)}),o.recordException(s instanceof Error?s:new Error(String(s))),s}finally{o.end()}})}async clearAllSessions(){if(await this.ensureInitialized(),!this.redisClient)return;let e=`${this.redisConfig.keyPrefix}*`,t=`${this.redisConfig.userSessionsKeyPrefix}*`,n=await Ij(this.redisClient,e),o=await Ij(this.redisClient,t),s=[...n,...o];if(g.debug("[RedisConversationMemoryManager] Got all keys with SCAN for clearing",{conversationPattern:e,userSessionsPattern:t,conversationKeyCount:n.length,userSessionsKeyCount:o.length,totalKeyCount:s.length}),s.length>0){for(let a=0;a<s.length;a+=100){let l=s.slice(a,a+100);await this.redisClient.del(l),g.debug("[RedisConversationMemoryManager] Cleared batch of sessions and user mappings",{batchIndex:Math.floor(a/100)+1,batchSize:l.length,totalProcessed:a+l.length,totalKeys:s.length})}g.info("All Redis sessions and user session mappings cleared",{clearedCount:s.length,conversationSessions:n.length,userSessionMappings:o.length})}}async ensureInitialized(){g.debug("[RedisConversationMemoryManager] Ensuring initialization"),this.isInitialized?g.debug("[RedisConversationMemoryManager] Already initialized"):(g.debug("[RedisConversationMemoryManager] Not initialized, initializing now"),await this.initialize())}async getUserAllSessionsHistory(e){if(await this.ensureInitialized(),!this.redisClient)return g.warn("[RedisConversationMemoryManager] Redis client not available",{userId:e}),[];let t=[];try{let n=await this.getUserSessions(e);if(n.length===0)return t;for(let o of n)try{let s=await this.getUserSessionMetadata(e,o);s?t.push(s):(g.debug("[RedisConversationMemoryManager] Empty or missing session metadata - removing from user history",{userId:e,sessionId:o}),await this.removeUserSession(e,o))}catch(s){g.error("[RedisConversationMemoryManager] Failed to get session metadata",{userId:e,sessionId:o,error:s instanceof Error?s.message:String(s)})}return t}catch(n){return g.error("[RedisConversationMemoryManager] Failed to get user all sessions metadata",{userId:e,error:n instanceof Error?n.message:String(n),stack:n instanceof Error?n.stack:void 0}),t}}cleanupStalePendingData(){let e=Date.now()-3e5,t=[];for(let[n,o]of this.pendingToolExecutions)o.timestamp<e&&t.push(n);t.length>0&&(g.debug("[RedisConversationMemoryManager] Cleaning up stale pending tool data",{stalePendingKeys:t.length,totalPendingKeys:this.pendingToolExecutions.size}),t.forEach(n=>this.pendingToolExecutions.delete(n)))}async flushPendingToolData(e,t,n){let o=`${t}:${n}`,s=this.pendingToolExecutions.get(o);if(!s){g.debug("[RedisConversationMemoryManager] No pending tool data to flush",{sessionId:t,userId:n,pendingKey:o});return}g.debug("[RedisConversationMemoryManager] Flushing pending tool data",{sessionId:t,userId:n,toolCallsCount:s.toolCalls.length,toolResultsCount:s.toolResults.length});try{let i=new Map;for(let a of s.toolCalls){let l=a.toolCallId??"",u=a.toolName??"";i.set(l,u);let d={id:Ue(),timestamp:a.timestamp?.toISOString()||this.generateTimestamp(),role:"tool_call",content:"",tool:u,args:a.args||a.arguments||a.parameters||{},metadata:{...a.thoughtSignature?{thoughtSignature:String(a.thoughtSignature)}:{},...a.stepIndex!==null&&a.stepIndex!==void 0?{stepIndex:Number(a.stepIndex)}:{}}};e.messages.push(d)}for(let a of s.toolResults){let l=String(a.toolCallId||a.id||"unknown"),u=i.get(l)||String(a.toolName||"unknown"),d=a,m=("output"in d?"output":"result")==="output"?d.output:a.result,f;if(typeof m=="string")f=m;else if(m==null)f=String(m??"null");else try{f=JSON.stringify(m,null,2)}catch(C){f=`[Serialization failed: ${C instanceof Error?C.message:String(C)}]`}let{preview:h,truncated:y,originalSize:v}=sf(f,{maxBytes:this.config?.contextCompaction?.maxToolOutputBytes,maxLines:this.config?.contextCompaction?.maxToolOutputLines}),b;try{let C=m;if(C&&typeof C=="object"){let k=C._meta;if(k&&typeof k=="object"){let I=k[wB];typeof I=="string"&&(b=I)}}}catch{}let T={truncated:y,...y&&{toolOutputPreview:h},...y&&{originalSize:v},...b&&{artifactId:b},...a.stepIndex!==null&&a.stepIndex!==void 0?{stepIndex:Number(a.stepIndex)}:{}},S={success:!a.error,error:a.error?String(a.error):void 0},_={id:Ue(),timestamp:a.timestamp?.toISOString()||this.generateTimestamp(),role:"tool_result",content:f,tool:u,result:S,metadata:T};e.messages.push(_)}g.debug("[RedisConversationMemoryManager] Successfully flushed pending tool data",{sessionId:t,userId:n,toolMessagesAdded:s.toolCalls.length+s.toolResults.length,totalMessages:e.messages.length})}finally{this.pendingToolExecutions.delete(o)}}async updateAgenticLoopReport(e,t,n){if(g.debug("[RedisConversationMemoryManager] Updating agentic loop report",{sessionId:e,userId:t,reportId:n.reportId,reportType:n.reportType,reportStatus:n.reportStatus}),await this.ensureInitialized(),!this.redisClient){g.warn("[RedisConversationMemoryManager] Redis client not available for report update",{sessionId:e,userId:t});return}try{let o=Gl(this.redisConfig,e,t||void 0),s=await Me(this.redisClient.get(o),5e3);if(!s){g.warn("[RedisConversationMemoryManager] No conversation found for report update",{sessionId:e,userId:t});return}let i=Vl(s);if(!i){g.warn("[RedisConversationMemoryManager] Failed to deserialize conversation for report update",{sessionId:e,userId:t});return}i.additionalMetadata||(i.additionalMetadata={}),i.additionalMetadata.agenticLoopReports||(i.additionalMetadata.agenticLoopReports=[]);let a=i.additionalMetadata.agenticLoopReports.findIndex(u=>u.reportId===n.reportId);a>=0?(i.additionalMetadata.agenticLoopReports[a]=n,g.debug("[RedisConversationMemoryManager] Updated existing agentic loop report",{sessionId:e,reportId:n.reportId})):(i.additionalMetadata.agenticLoopReports.push(n),g.debug("[RedisConversationMemoryManager] Added new agentic loop report",{sessionId:e,reportId:n.reportId})),i.updatedAt=new Date().toISOString();let l=S_(i);await Me(this.redisClient.set(o,l),5e3),this.redisConfig.ttl>0&&await Me(this.redisClient.expire(o,this.redisConfig.ttl),5e3),g.info("[RedisConversationMemoryManager] Successfully updated agentic loop report",{sessionId:e,userId:t,reportId:n.reportId,reportStatus:n.reportStatus})}catch(o){throw g.error("[RedisConversationMemoryManager] Failed to update agentic loop report",{sessionId:e,userId:t,reportId:n.reportId,error:o instanceof Error?o.message:String(o)}),new Sa("Failed to update agentic loop report","STORAGE_ERROR",{sessionId:e,userId:t,reportId:n.reportId,error:o instanceof Error?o.message:String(o)})}}}});function lre(r,e="memory",t){if(g.debug("[conversationMemoryFactory] Creating conversation memory manager",{storageType:e,config:{enabled:r.enabled,maxSessions:r.maxSessions,enableSummarization:r.enableSummarization,summarizationProvider:r.summarizationProvider,summarizationModel:r.summarizationModel},hasRedisConfig:!!t}),e==="memory"||!e){g.debug("[conversationMemoryFactory] Creating in-memory conversation manager");let o=new Jv(r);return g.debug("[conversationMemoryFactory] In-memory conversation manager created successfully",{managerType:o.constructor.name}),o}if(e==="redis"){g.debug("[conversationMemoryFactory] Creating Redis conversation manager",{host:t?.host||"localhost",port:t?.port||6379,keyPrefix:t?.keyPrefix||"neurolink:conversation:",ttl:t?.ttl||86400,hasConnectionOptions:!!t?.connectionOptions});let o=new Pj(r,t);return g.debug("[conversationMemoryFactory] Redis conversation manager created successfully",{managerType:o.constructor.name,config:{maxSessions:r.maxSessions,maxTurnsPerSession:r.maxTurnsPerSession}}),o}g.warn(`[conversationMemoryFactory] Unknown storage type: ${e}, falling back to memory storage`);let n=new Jv(r);return g.debug("[conversationMemoryFactory] Fallback memory manager created successfully",{managerType:n.constructor.name}),n}function mLe(){let r=process.env.STORAGE_TYPE;if(!r)return g.debug("[conversationMemoryFactory] No storage type configured, using default",{storageType:"memory",fromEnv:!1}),"memory";let e=r.trim().toLowerCase(),t=["memory","redis"];return t.includes(e)?(g.debug("[conversationMemoryFactory] Determined storage type",{storageType:e,fromEnv:!0,envValue:r,normalized:e!==r}),e):(g.warn(`[conversationMemoryFactory] Unrecognized storage type in environment: "${r}", falling back to "memory"`,{providedValue:r,normalizedValue:e,validValues:t,usingDefault:!0}),"memory")}function fLe(){g.debug("[conversationMemoryFactory] Reading Redis configuration from environment",{REDIS_URL:process.env.REDIS_URL?"******":"(not set)",REDIS_HOST:process.env.REDIS_HOST||"(not set)",REDIS_PORT:process.env.REDIS_PORT||"(not set)",REDIS_PASSWORD:process.env.REDIS_PASSWORD?"******":"(not set)",REDIS_DB:process.env.REDIS_DB||"(not set)",REDIS_KEY_PREFIX:process.env.REDIS_KEY_PREFIX||"(not set)",REDIS_TTL:process.env.REDIS_TTL||"(not set)",REDIS_CONNECT_TIMEOUT:process.env.REDIS_CONNECT_TIMEOUT||"(not set)",REDIS_MAX_RETRIES:process.env.REDIS_MAX_RETRIES||"(not set)",REDIS_RETRY_DELAY:process.env.REDIS_RETRY_DELAY||"(not set)"});let r={host:process.env.REDIS_HOST,port:process.env.REDIS_PORT?Number(process.env.REDIS_PORT):void 0,password:process.env.REDIS_PASSWORD,db:process.env.REDIS_DB?Number(process.env.REDIS_DB):void 0,keyPrefix:process.env.REDIS_KEY_PREFIX,ttl:process.env.REDIS_TTL?Number(process.env.REDIS_TTL):void 0,connectionOptions:{connectTimeout:process.env.REDIS_CONNECT_TIMEOUT?Number(process.env.REDIS_CONNECT_TIMEOUT):void 0,maxRetriesPerRequest:process.env.REDIS_MAX_RETRIES?Number(process.env.REDIS_MAX_RETRIES):void 0,retryDelayOnFailover:process.env.REDIS_RETRY_DELAY?Number(process.env.REDIS_RETRY_DELAY):void 0}};return process.env.REDIS_URL&&(g.debug("[conversationMemoryFactory] Using REDIS_URL for connection"),r.url=process.env.REDIS_URL),g.debug("[conversationMemoryFactory] Redis configuration normalized",{host:r.host||"localhost",port:r.port||6379,hasPassword:!!r.password,db:r.db||0,keyPrefix:r.keyPrefix||"neurolink:conversation:",ttl:r.ttl||86400,hasConnectionOptions:!!r.connectionOptions}),r}var gLe=A(async()=>{"use strict";X();d7();await pLe()});var hLe={};oe(hLe,{initializeConversationMemory:()=>nnr});async function nnr(r){if(g.debug("[conversationMemoryInitializer] Initialize conversation memory called",{hasConfig:!!r,hasMemoryConfig:!!r?.conversationMemory,memoryEnabled:r?.conversationMemory?.enabled||!1,storageType:process.env.STORAGE_TYPE||"memory"}),!r?.conversationMemory?.enabled)return g.debug("[conversationMemoryInitializer] Conversation memory not enabled - skipping initialization"),null;try{g.debug("[conversationMemoryInitializer] Applying conversation memory defaults");let e=PAe(r.conversationMemory);g.debug("[conversationMemoryInitializer] Memory configuration processed",{enabled:e.enabled,maxSessions:e.maxSessions,maxTurnsPerSession:e.maxTurnsPerSession,enableSummarization:e.enableSummarization});let t=!!r.conversationMemory?.redisConfig,n=t?"redis":mLe();if(g.debug("[conversationMemoryInitializer] Storage type determined",{storageType:n,fromConfig:t,fromEnv:!t&&!!process.env.STORAGE_TYPE}),n==="redis"){g.info("[conversationMemoryInitializer] Initializing Redis-based conversation memory manager"),g.debug("[conversationMemoryInitializer] Getting Redis configuration");let o=r.conversationMemory?.redisConfig||fLe(),s=r.conversationMemory?.redisConfig?"SDK input (from Lighthouse)":"environment variables (NeuroLink)";g.debug("[conversationMemoryInitializer] Redis configuration retrieved",{configSource:s,host:o.host||"localhost",port:o.port||6379,hasPassword:!!o.password,db:o.db||0,keyPrefix:o.keyPrefix||"neurolink:conversation:",ttl:o.ttl||86400}),g.debug("[conversationMemoryInitializer] Creating Redis conversation memory manager");let i=lre(e,"redis",o);return g.debug("[conversationMemoryInitializer] Checking Redis manager creation result",{managerType:i?.constructor?.name||"unknown",isRedisType:i?.constructor?.name==="RedisConversationMemoryManager",hasConfig:!!i?.config}),g.info("[conversationMemoryInitializer] Redis conversation memory manager created successfully"),i?.constructor?.name!=="RedisConversationMemoryManager"&&g.warn("[conversationMemoryInitializer] Created manager is not of RedisConversationMemoryManager type",{actualType:i?.constructor?.name}),i}else{g.info("[conversationMemoryInitializer] Initializing in-memory conversation memory manager"),g.debug("[conversationMemoryInitializer] Creating in-memory conversation memory manager");let o=lre(e);return g.debug("[conversationMemoryInitializer] Checking memory manager creation result",{managerType:o?.constructor?.name||"unknown",isInMemoryType:o?.constructor?.name==="ConversationMemoryManager",hasConfig:!!o?.config}),g.info("[conversationMemoryInitializer] In-memory conversation memory manager created successfully",{maxSessions:e.maxSessions,maxTurnsPerSession:e.maxTurnsPerSession,managerType:o?.constructor?.name}),o}}catch(e){throw g.error("[conversationMemoryInitializer] Failed to initialize conversation memory",{error:e instanceof Error?e.message:String(e),errorName:e instanceof Error?e.name:"UnknownError",errorStack:e instanceof Error?e.stack:void 0,storageType:process.env.STORAGE_TYPE||"memory",memoryConfig:{enabled:r?.conversationMemory?.enabled,maxSessions:r?.conversationMemory?.maxSessions,maxTurnsPerSession:r?.conversationMemory?.maxTurnsPerSession},redisConfig:{host:process.env.REDIS_HOST||"(not set)",port:process.env.REDIS_PORT||"(not set)",hasPassword:!!process.env.REDIS_PASSWORD,keyPrefix:process.env.REDIS_KEY_PREFIX||"(not set)"}}),process.env.STORAGE_TYPE==="redis"&&g.error("[conversationMemoryInitializer] Redis configuration error details",{REDIS_HOST:process.env.REDIS_HOST||"(not set)",REDIS_PORT:process.env.REDIS_PORT||"(not set)",REDIS_PASSWORD:process.env.REDIS_PASSWORD?"******":"(not set)",REDIS_DB:process.env.REDIS_DB||"(not set)",REDIS_KEY_PREFIX:process.env.REDIS_KEY_PREFIX||"(not set)",REDIS_TTL:process.env.REDIS_TTL||"(not set)",errorMessage:e instanceof Error?e.message:String(e)}),e}}var yLe=A(async()=>{"use strict";Kv();X();await gLe()});var vLe={};oe(vLe,{AuthProviderFactory:()=>Zo,createAuthProvider:()=>ure});async function ure(r,e){return Zo.createProvider(r,e)}var Zo,jI=A(()=>{"use strict";X();sa();Zo=class r{static providers=new Map;static aliasMap=new Map;static registerProvider(e,t,n=[],o){r.providers.set(e,{factory:t,aliases:n,metadata:o});for(let s of n)r.aliasMap.set(s.toLowerCase(),e);g.debug(`Registered auth provider: ${e}`)}static async createProvider(e,t){let n=r.resolveType(e),o=r.providers.get(n);if(!o)throw et.create("PROVIDER_NOT_FOUND",`Auth provider not found: ${e}. Available: ${r.getAvailableProviders().join(", ")}`);try{return await o.factory(t)}catch(s){throw et.create("CREATION_FAILED",`Failed to create auth provider ${e}: ${s instanceof Error?s.message:String(s)}`,{cause:s instanceof Error?s:void 0})}}static hasProvider(e){return r.providers.has(e)||r.aliasMap.has(e.toLowerCase())}static getAvailableProviders(){return Array.from(r.providers.keys())}static getProviderMetadata(e){let t=r.resolveType(e);return r.providers.get(t)?.metadata}static getAllProviderInfo(){return Array.from(r.providers.entries()).map(([e,t])=>({type:e,aliases:t.aliases,metadata:t.metadata}))}static clearRegistrations(){r.providers.clear(),r.aliasMap.clear()}static resolveType(e){return r.aliasMap.get(e.toLowerCase())||e}}});var OAe={};oe(OAe,{NeuroLink:()=>xx,STREAM_DEDUP_CONTEXT_KEY:()=>inr,default:()=>anr,markStreamProviderEmittedGenerationEnd:()=>w_,neurolink:()=>bLe});function onr(r){let e=r.toLowerCase();return e.includes("not found")||e.includes("404")||e.includes("does not exist")||e.includes("no such")?"not_found":e.includes("permission")||e.includes("forbidden")||e.includes("403")||e.includes("unauthorized")||e.includes("401")||e.includes("access denied")?"permission_denied":e.includes("timeout")||e.includes("timed out")||e.includes("deadline exceeded")?"timeout":e.includes("rate limit")||e.includes("429")||e.includes("too many requests")||e.includes("throttl")?"rate_limited":e.includes("invalid")||e.includes("validation")||e.includes("bad request")||e.includes("400")?"validation_error":"unknown"}function snr(r){switch(r){case"not_found":return"validation";case"permission_denied":return"permission";case"timeout":return"timeout";case"rate_limited":return"resource";case"validation_error":return"validation";case"unknown":return"execution"}}function dre(r){if(!r)return!1;let e=r;if(e.name==="ModelAccessDeniedError"||e.code==="MODEL_ACCESS_DENIED")return!0;let t=typeof e.message=="string"?e.message:r instanceof Error?r.message:String(r);if(!t)return!1;let n=t.toLowerCase();return n.includes("team")&&n.includes("not allowed")||n.includes("team can only access")||/not\s+allowed\s+to\s+access\s+(this\s+)?model/i.test(t)}function xLe(r){if(r instanceof Tl||r instanceof Dn||r instanceof YL||r instanceof Ny)return!0;if(r&&typeof r=="object"){let e=r,t=typeof e.status=="number"?e.status:typeof e.statusCode=="number"?e.statusCode:void 0;if(t&&aNe.includes(t))return!0}if(r instanceof Error){let e=r.message;if(e.includes("NOT_FOUND")||e.includes("Model Not Found")||e.includes("model not found")||e.includes("PERMISSION_DENIED")||e.includes("UNAUTHENTICATED"))return!0}return!1}function w_(r){let e=r?._streamDedupContext;e&&(e.providerEmitted=!0)}var Mj,inr,xx,bLe,anr,Ew=A(async()=>{"use strict";Zt();yA();os();AA();Bve();gAe();LAe();FAe();BAe();jAe();GAe();Cn();d7();bl();lU();hk();ZAe();YAe();eIe();h7();x7();Oz();QQ();tee();uMe();nee();fMe();Aw();SB();xMe();wMe();CMe();n1();cr();ik();of();rOe();oOe();W1();ar();Kv();yt();pOe();X();rz();hB();mOe();_Oe();ff();cNe();Mm();kee();oF();$v();Bee();ZB();try{process.env.DOTENV_CONFIG_QUIET=process.env.DOTENV_CONFIG_QUIET??"true";let{config:r}=await Promise.resolve().then(()=>to(KNe(),1));r({quiet:!0})}catch{}Mj=new Vv,inr="_streamDedupContext";xx=class{mcpInitialized=!1;mcpSkipped=!1;mcpInitPromise=null;emitter=new kr;_taskManager;_taskManagerConfig;toolRegistry;autoDiscoveredServerInfos=[];externalServerManager;toolCache=null;toolCacheDuration;modelAliasConfig;lastCompactionMessageCount=new Map;getCompactionSessionId(e){return e.context?.sessionId||"__default__"}mcpToolResultCache;mcpToolRouter;mcpToolBatcher;mcpEnhancedDiscovery;mcpToolMiddlewares=[];mcpArtifactStore;_disableToolCacheForCurrentRequest=!1;mcpEnhancementsConfig;toolCircuitBreakers=new Map;toolExecutionMetrics=new Map;currentStreamToolExecutions=[];toolExecutionHistory=[];activeToolExecutions=new Map;emitToolEndEvent(e,t,n,o,s){this.emitter.emit("tool:end",Lm(e,{responseTime:Date.now()-t,success:n,timestamp:Date.now(),result:o,error:s?s.message:void 0}))}conversationMemory;conversationMemoryNeedsInit=!1;conversationMemoryConfig;enableOrchestration;authProvider;pendingAuthConfig;authInitPromise;credentials;fallbackConfig={};resolveCredentials(e){if(!this.credentials&&!e)return;if(!this.credentials)return e;if(!e)return this.credentials;let t={...this.credentials};for(let n of Object.keys(e)){let o=this.credentials[n],s=e[n];o&&s&&typeof o=="object"&&typeof s=="object"?t[n]={...o,...s}:t[n]=s??o}return t}hitlManager;_sessionCostUsd=0;fileRegistry;cachedFileTools=null;memoryInstance;memorySDKConfig;async setLangfuseContextFromOptions(e,t){if(e.context&&typeof e.context=="object"&&e.context!==null){let n=!1;try{let o=e.context;if(o.userId||o.sessionId||o.conversationId||o.requestId||o.traceName||o.metadata){let s;if(o.metadata&&typeof o.metadata=="object"){let i=o.metadata,a={};for(let[l,u]of Object.entries(i))(typeof u=="string"||typeof u=="number"||typeof u=="boolean")&&(a[l]=u);Object.keys(a).length>0&&(s=a)}return await new Promise((i,a)=>{Hv({userId:typeof o.userId=="string"?o.userId:null,sessionId:typeof o.sessionId=="string"?o.sessionId:null,conversationId:typeof o.conversationId=="string"?o.conversationId:null,requestId:typeof o.requestId=="string"?o.requestId:null,traceName:typeof o.traceName=="string"?o.traceName:null,metadata:o.metadata&&typeof o.metadata=="object"?o.metadata:null,...s!==void 0&&{customAttributes:s}},async()=>{try{n=!0;let l=await t();i(l)}catch(l){a(l)}})})}}catch(o){if(n)throw o;g.warn("Failed to set Langfuse context from options",{error:o instanceof Error?o.message:String(o)})}}return await t()}createMetricsTraceContext(){let e=at.getSpan(hr.active());if(e){let t=e.spanContext();if(t.traceId&&t.traceId!=="00000000000000000000000000000000")return{traceId:t.traceId,parentSpanId:t.spanId}}return{traceId:crypto.randomUUID().replace(/-/g,""),parentSpanId:crypto.randomUUID().replace(/-/g,"").substring(0,16)}}enforceSessionBudget(e){if(!(e===void 0||e<=0||this._sessionCostUsd<e))throw new Ve({code:"SESSION_BUDGET_EXCEEDED",message:`Session budget exceeded: spent $${this._sessionCostUsd.toFixed(4)} of $${e.toFixed(4)} limit`,category:"validation",severity:"high",retriable:!1,context:{spent:this._sessionCostUsd,limit:e}})}assertInputText(e,t){if(!e||typeof e!="string")throw new Error(t)}async applyAuthenticatedRequestContext(e){if(e.auth?.token){let{AuthError:n}=await Promise.resolve().then(()=>(sa(),oMe));if(await this.ensureAuthProvider(),!this.authProvider)throw n.create("PROVIDER_ERROR","No auth provider configured. Set auth in constructor or via setAuthProvider() before using auth: { token }.");let o;try{o=await Me(this.authProvider.authenticateToken(e.auth.token),5e3,n.create("PROVIDER_ERROR","Auth token validation timed out after 5000ms"))}catch(s){throw s instanceof Error&&"feature"in s&&s.feature==="Auth"?s:n.create("PROVIDER_ERROR",`Auth token validation failed: ${s instanceof Error?s.message:String(s)}`)}if(!o.valid)throw n.create("INVALID_TOKEN",o.error||"Token validation failed");if(!o.user)throw n.create("INVALID_TOKEN","Token validated but no user identity returned");if(!o.user.id)throw n.create("INVALID_TOKEN","Token validated but user identity missing required 'id' field");e.context={...e.context||{},userId:o.user.id,userEmail:o.user.email,userRoles:o.user.roles}}if(!e.requestContext)return;let t=e.auth?.token&&this.authProvider?{userId:e.context?.userId,userEmail:e.context?.userEmail,userRoles:e.context?.userRoles}:{};e.context={...e.context||{},...e.requestContext,...t}}applyGenerateLifecycleMiddleware(e){!e.onFinish&&!e.onError||(e.middleware={...e.middleware,middlewareConfig:{...e.middleware?.middlewareConfig,lifecycle:{...e.middleware?.middlewareConfig?.lifecycle,enabled:!0,config:{...e.middleware?.middlewareConfig?.lifecycle?.config,...e.onFinish!==void 0?{onFinish:e.onFinish}:{},...e.onError!==void 0?{onError:e.onError}:{}}}}})}applyStreamLifecycleMiddleware(e){!e.onFinish&&!e.onError&&!e.onChunk||(e.middleware={...e.middleware,middlewareConfig:{...e.middleware?.middlewareConfig,lifecycle:{...e.middleware?.middlewareConfig?.lifecycle,enabled:!0,config:{...e.middleware?.middlewareConfig?.lifecycle?.config,...e.onFinish!==void 0?{onFinish:e.onFinish}:{},...e.onError!==void 0?{onError:e.onError}:{},...e.onChunk!==void 0?{onChunk:e.onChunk}:{}}}}})}initializeMemoryConfig(){let e=this.conversationMemoryConfig?.conversationMemory?.memory;return e?.enabled?(this.memorySDKConfig=e,!0):!1}ensureMemoryReady(){return this.memoryInstance!==void 0?this.memoryInstance:this.initializeMemoryConfig()?this.memorySDKConfig?(this.memoryInstance=SMe(this.memorySDKConfig),this.memoryInstance):(this.memoryInstance=null,null):(this.memoryInstance=null,null)}toolExecutionContext;observabilityConfig;metricsAggregator=new Fy;get _metricsTraceContext(){return Mj.getStore()??null}constructor(e){this.toolRegistry=e?.toolRegistry||new ux,this.fileRegistry=new kz,this.observabilityConfig=e?.observability,this.enableOrchestration=e?.enableOrchestration??!1,e?.modelAliasConfig&&(this.modelAliasConfig=e.modelAliasConfig),e?.providerFallback&&(this.fallbackConfig.providerFallback=e.providerFallback),e?.modelChain&&(this.fallbackConfig.modelChain=e.modelChain),g.setEventEmitter(this.emitter);let t=process.env.NEUROLINK_TOOL_CACHE_DURATION;this.toolCacheDuration=t?parseInt(t,10):2e4;let n=Date.now(),o=process.hrtime.bigint(),s=`neurolink-constructor-${Date.now()}-${Math.random().toString(36).substr(2,9)}`;this.initializeProviderRegistry(s,n,o),this.initializeConversationMemory(e,s,n,o),this.initializeExternalServerManager(s,n,o),this.initializeHITL(e,s,n,o),this.initializeMCPEnhancements(e),this.registerFileTools(),this.registerMemoryRetrievalTools(),this.initializeLangfuse(s,n,o),this.initializeMetricsListeners(),this.logConstructorComplete(s,n,o),e?.auth&&(this.pendingAuthConfig=e.auth),e?.credentials&&(this.credentials=e.credentials),this._taskManagerConfig=e?.tasks,this._taskManagerConfig&&(this._taskManager=new SI(this,this._taskManagerConfig),this._taskManager.setEmitter(this.emitter),this.registerTaskTools(this._taskManager))}get tasks(){return this._taskManager||(this._taskManager=new SI(this,this._taskManagerConfig),this._taskManager.setEmitter(this.emitter),this.registerTaskTools(this._taskManager)),this._taskManager}initializeProviderRegistry(e,t,n){let o=process.hrtime.bigint();g.debug("[NeuroLink] \u{1F3D7}\uFE0F LOG_POINT_C002_PROVIDER_REGISTRY_SETUP_START",{logPoint:"C002_PROVIDER_REGISTRY_SETUP_START",constructorId:e,timestamp:new Date().toISOString(),elapsedMs:Date.now()-t,elapsedNs:(process.hrtime.bigint()-n).toString(),registrySetupStartTimeNs:o.toString(),message:"Starting ProviderRegistry configuration for security"}),_l.setOptions({enableManualMCP:!1})}initializeConversationMemory(e,t,n,o){if(e?.conversationMemory?.enabled){let s=process.hrtime.bigint();this.conversationMemoryConfig=e,this.conversationMemoryNeedsInit=!0;let a=process.hrtime.bigint()-s;g.debug("[NeuroLink] \u2705 LOG_POINT_C006_MEMORY_INIT_FLAG_SET_SUCCESS",{logPoint:"C006_MEMORY_INIT_FLAG_SET_SUCCESS",constructorId:t,timestamp:new Date().toISOString(),elapsedMs:Date.now()-n,elapsedNs:(process.hrtime.bigint()-o).toString(),memoryInitDurationNs:a.toString(),memoryInitDurationMs:Number(a)/nd,message:"Conversation memory initialization flag set successfully for lazy loading"})}else g.debug("[NeuroLink] \u{1F6AB} LOG_POINT_C008_MEMORY_DISABLED",{logPoint:"C008_MEMORY_DISABLED",constructorId:t,timestamp:new Date().toISOString(),elapsedMs:Date.now()-n,elapsedNs:(process.hrtime.bigint()-o).toString(),hasConfig:!!e,hasMemoryConfig:!!e?.conversationMemory,memoryEnabled:e?.conversationMemory?.enabled||!1,reason:e?e.conversationMemory?e.conversationMemory.enabled?"UNKNOWN":"MEMORY_DISABLED":"NO_MEMORY_CONFIG":"NO_CONFIG",message:"Conversation memory not enabled - skipping initialization"})}initializeHITL(e,t,n,o){if(e?.hitl?.enabled){let s=process.hrtime.bigint();g.debug("[NeuroLink] \u{1F6E1}\uFE0F LOG_POINT_C015_HITL_INIT_START",{logPoint:"C015_HITL_INIT_START",constructorId:t,timestamp:new Date().toISOString(),elapsedMs:Date.now()-n,elapsedNs:(process.hrtime.bigint()-o).toString(),hitlInitStartTimeNs:s.toString(),hitlConfig:{enabled:e.hitl.enabled,dangerousActions:e.hitl.dangerousActions||[],timeout:e.hitl.timeout||3e4,allowArgumentModification:e.hitl.allowArgumentModification??!0,auditLogging:e.hitl.auditLogging??!1},message:"Starting HITL (Human-in-the-Loop) initialization"});try{this.hitlManager=new Rz(e.hitl),this.toolRegistry.setHITLManager(this.hitlManager),this.externalServerManager.setHITLManager(this.hitlManager),this.setupHITLEventForwarding();let a=process.hrtime.bigint()-s;g.debug("[NeuroLink] \u2705 LOG_POINT_C016_HITL_INIT_SUCCESS",{logPoint:"C016_HITL_INIT_SUCCESS",constructorId:t,timestamp:new Date().toISOString(),elapsedMs:Date.now()-n,elapsedNs:(process.hrtime.bigint()-o).toString(),hitlInitDurationNs:a.toString(),hitlInitDurationMs:Number(a)/nd,hasHitlManager:!!this.hitlManager,message:"HITL (Human-in-the-Loop) initialized successfully"}),g.info("[NeuroLink] HITL safety features enabled",{dangerousActions:e.hitl.dangerousActions?.length||0,timeout:e.hitl.timeout||3e4,allowArgumentModification:e.hitl.allowArgumentModification??!0,auditLogging:e.hitl.auditLogging??!1})}catch(i){let l=process.hrtime.bigint()-s;throw g.error("[NeuroLink] \u274C LOG_POINT_C017_HITL_INIT_ERROR",{logPoint:"C017_HITL_INIT_ERROR",constructorId:t,timestamp:new Date().toISOString(),elapsedMs:Date.now()-n,elapsedNs:(process.hrtime.bigint()-o).toString(),hitlInitDurationNs:l.toString(),hitlInitDurationMs:Number(l)/nd,error:i instanceof Error?i.message:String(i),errorName:i instanceof Error?i.name:"UnknownError",errorStack:i instanceof Error?i.stack:void 0,message:"HITL (Human-in-the-Loop) initialization failed"}),i}}else g.debug("[NeuroLink] \u{1F6AB} LOG_POINT_C018_HITL_DISABLED",{logPoint:"C018_HITL_DISABLED",constructorId:t,timestamp:new Date().toISOString(),elapsedMs:Date.now()-n,elapsedNs:(process.hrtime.bigint()-o).toString(),hasConfig:!!e,hasHitlConfig:!!e?.hitl,hitlEnabled:e?.hitl?.enabled||!1,reason:e?e.hitl?e.hitl.enabled?"UNKNOWN":"HITL_DISABLED":"NO_HITL_CONFIG":"NO_CONFIG",message:"HITL (Human-in-the-Loop) not enabled - skipping initialization"})}initializeMCPEnhancements(e){let t=e?.mcp;if(this.mcpEnhancementsConfig=t,t?.cache?.enabled!==!1&&(this.mcpToolResultCache=new uh({ttl:t?.cache?.ttl??3e5,maxSize:t?.cache?.maxSize??500,strategy:t?.cache?.strategy??"lru"}),g.debug("[NeuroLink] MCP tool result cache initialized",{ttl:t?.cache?.ttl??3e5,maxSize:t?.cache?.maxSize??500,strategy:t?.cache?.strategy??"lru"})),t?.batcher?.enabled&&(this.mcpToolBatcher=new lh({maxBatchSize:t.batcher.maxBatchSize??10,maxWaitMs:t.batcher.maxWaitMs??100}),this.mcpToolBatcher.setToolExecutor(async(n,o)=>this.executeToolInternal(n,o,{timeout:au.EXECUTION_DEFAULT_MS,maxRetries:po.DEFAULT,retryDelayMs:kn.BASE_MS})),g.debug("[NeuroLink] MCP tool call batcher initialized")),t?.discovery?.enabled!==!1&&(this.mcpEnhancedDiscovery=new Yv,g.debug("[NeuroLink] Enhanced tool discovery initialized")),t?.middleware?.length&&(this.mcpToolMiddlewares=[...t.middleware],g.debug("[NeuroLink] MCP tool middlewares registered",{count:this.mcpToolMiddlewares.length})),t?.outputLimits){let n=t.outputLimits.strategy??"externalize",o=t.outputLimits.maxBytes??aMe,s=t.outputLimits.warnBytes??eee,i;n==="externalize"&&(i=new EB,this.mcpArtifactStore=i,g.debug("[NeuroLink] MCP artifact store initialized (local-temp)"));let a=new _B({strategy:n,maxBytes:o,warnBytes:s},i);this.externalServerManager.setOutputNormalizer(a),g.debug("[NeuroLink] MCP output normalizer initialized",{strategy:n,maxBytes:o,warnBytes:s})}}registerFileTools(){let e=m7(this.fileRegistry),t=Object.entries(e).map(async([n,o])=>{let s=`direct.${n}`,i={name:n,description:o.description||`File tool: ${n}`,inputSchema:{},serverId:"direct",category:"built-in"};await this.toolRegistry.registerTool(s,i,{execute:async a=>{try{return{success:!0,data:await o.execute(a,{toolCallId:"file-tool",messages:[]}),metadata:{toolName:n,serverId:"direct",executionTime:0}}}catch(l){return{success:!1,error:l instanceof Error?l.message:String(l),metadata:{toolName:n,serverId:"direct",executionTime:0}}}},description:o.description,inputSchema:{}})});Promise.all(t).then(()=>{g.debug(`[NeuroLink] Registered ${Object.keys(e).length} file reference tools`)})}registerTaskTools(e){let t=nOe(e);for(let[n,o]of Object.entries(t)){let s=`direct.${n}`,i={name:n,description:o.description||`Task tool: ${n}`,inputSchema:{},serverId:"direct",category:"built-in"};this.toolRegistry.registerTool(s,i,{execute:async a=>{try{return{success:!0,data:await o.execute(a,{toolCallId:"task-tool",messages:[]}),metadata:{toolName:n,serverId:"direct",executionTime:0}}}catch(l){return{success:!1,error:l instanceof Error?l.message:String(l),metadata:{toolName:n,serverId:"direct",executionTime:0}}}},description:o.description,inputSchema:{}})}g.debug(`[NeuroLink] Registered ${Object.keys(t).length} task tools`)}registerMemoryRetrievalTools(){let e=this.conversationMemoryConfig?.conversationMemory,t=!!e?.redisConfig||e&&"redis"in e&&!!e.redis||process.env.STORAGE_TYPE==="redis",n=!!this.mcpArtifactStore;if((!e?.enabled||!t)&&!n){g.debug("[NeuroLink] Skipping memory retrieval tools \u2014 requires Redis conversation memory or an artifact store");return}let s=pee(void 0,this.mcpArtifactStore).retrieve_context;this.registerTool("retrieve_context",{name:"retrieve_context",description:s.description??"Retrieve context or artifacts",inputSchema:s.inputSchema,execute:async i=>{let a=this.conversationMemory,l=pee(a,this.mcpArtifactStore);return await Me(l.retrieve_context.execute(i,{toolCallId:"memory-retrieval",messages:[]}),au.EXECUTION_DEFAULT_MS,me.toolTimeout("retrieve_context",au.EXECUTION_DEFAULT_MS))}}),g.info("[NeuroLink] Memory retrieval tools registered")}formatMemoryContext(e,t){return`Context from previous conversations:
|
|
1807
1807
|
|
|
@@ -958,9 +958,6 @@ User message: "${userMessage}"`;
|
|
|
958
958
|
title = title.replace(/^(Title:|Here's a title:|The title is:)\s*/i, "");
|
|
959
959
|
title = title.replace(/['"]/g, ""); // Remove quotes
|
|
960
960
|
title = title.replace(/\.$/, ""); // Remove trailing period
|
|
961
|
-
if (title.length > 60) {
|
|
962
|
-
title = title.substring(0, 57) + "...";
|
|
963
|
-
}
|
|
964
961
|
if (title.length < 3) {
|
|
965
962
|
title = "New Conversation";
|
|
966
963
|
}
|
|
@@ -958,9 +958,6 @@ User message: "${userMessage}"`;
|
|
|
958
958
|
title = title.replace(/^(Title:|Here's a title:|The title is:)\s*/i, "");
|
|
959
959
|
title = title.replace(/['"]/g, ""); // Remove quotes
|
|
960
960
|
title = title.replace(/\.$/, ""); // Remove trailing period
|
|
961
|
-
if (title.length > 60) {
|
|
962
|
-
title = title.substring(0, 57) + "...";
|
|
963
|
-
}
|
|
964
961
|
if (title.length < 3) {
|
|
965
962
|
title = "New Conversation";
|
|
966
963
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@juspay/neurolink",
|
|
3
|
-
"version": "9.63.
|
|
3
|
+
"version": "9.63.1",
|
|
4
4
|
"packageManager": "pnpm@10.15.1",
|
|
5
5
|
"description": "Universal AI Development Platform with working MCP integration, multi-provider support, voice (TTS/STT/realtime), and professional CLI. 58+ external MCP servers discoverable, multimodal file processing, RAG pipelines. Build, test, and deploy AI applications with 21+ providers: OpenAI, Anthropic, Google AI Studio, Google Vertex, AWS Bedrock, Azure OpenAI, Mistral, LiteLLM, SageMaker, Hugging Face, Ollama, OpenAI-compatible, OpenRouter, DeepSeek, NVIDIA NIM, LM Studio, llama.cpp, plus voice (OpenAI TTS, ElevenLabs, Deepgram, Azure Speech).",
|
|
6
6
|
"author": {
|