@versini/sassysaint-common 4.46.0 → 4.47.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -521,6 +521,16 @@ export declare const MODEL_GPT5_NANO = "gpt-5.4-nano";
521
521
  */
522
522
  export declare const MODEL_MEMORY_INFERENCE = "gpt-5.4-mini";
523
523
 
524
+ /**
525
+ * Pseudo-model id for the Perplexity Search API (getWebSearch). Deliberately
526
+ * does NOT start with "sonar": the pricing prefix-fallback would otherwise bill
527
+ * this token-less, flat-per-request endpoint at the sonar token rate. Search
528
+ * cost is tracked out-of-band via a Prometheus request counter, not through the
529
+ * token usage pipeline, so its pricing row is priced at zero (see
530
+ * modelPricing).
531
+ */
532
+ export declare const MODEL_PERPLEXITY_SEARCH = "perplexity-search";
533
+
524
534
  export declare const MODEL_SEARCH_DECOMPOSER = "gpt-5.4-mini";
525
535
 
526
536
  export declare const MODEL_SONAR = "sonar";
@@ -536,7 +546,7 @@ export declare const MODELS_PER_PROVIDER: {
536
546
  readonly OpenAI: readonly ["gpt-5.6-terra", "gpt-5.4-mini", "gpt-5.4-nano"];
537
547
  readonly Anthropic: readonly ["claude-opus-4-8", "claude-haiku-4-5", "claude-sonnet-5"];
538
548
  readonly Google: readonly ["gemini-3-flash-preview", "gemini-3.1-pro-preview"];
539
- readonly Perplexity: readonly ["sonar", "sonar-pro"];
549
+ readonly Perplexity: readonly ["sonar", "sonar-pro", "perplexity-search"];
540
550
  };
541
551
 
542
552
  /**
@@ -605,14 +615,13 @@ export declare const ROLE_SYSTEM = "system";
605
615
  export declare const ROLE_USER = "user";
606
616
 
607
617
  /**
608
- * Per-sub-query deadline for the parallel search fan-out. sonar-pro routinely
609
- * takes 14-22s to answer a decomposed query (it runs its own search + synthesis
610
- * with medium context), so a tighter bound kills every sub-query before the
611
- * provider responds and the whole search reports a false failure. 30s leaves
612
- * headroom over the observed tail while still bounding a genuinely hung
613
- * request.
618
+ * Per-sub-query deadline for the parallel search fan-out. The Perplexity Search
619
+ * API returns in ~1s (measured p100 ~1.4s over the migration spike), far below
620
+ * the 14-22s the retired sonar-pro chat model took, so the old 30s bound is now
621
+ * mostly a hang-detector. 10s leaves generous headroom over the observed tail
622
+ * while stopping a genuinely stuck request from holding the chat turn.
614
623
  */
615
- export declare const SEARCH_QUERY_TIMEOUT_MS = 30000;
624
+ export declare const SEARCH_QUERY_TIMEOUT_MS = 10000;
616
625
 
617
626
  /**
618
627
  * Sort capabilities are shared across client and server.
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- let e=["preference","identity","constraint","habit","bio","device","location","finance","professional","interest","style","behavior","other"],t=["identity","bio","constraint","professional"],E=e=>t.includes(e);var r,n=((r={})[r.NewChat=0]="NewChat",r[r.Prompts=1]="Prompts",r[r.Attachment=2]="Attachment",r[r.PrivateChat=3]="PrivateChat",r[r.Send=4]="Send",r[r.Header=5]="Header",r[r.Provider=6]="Provider",r[r.Logo=7]="Logo",r[r.Placeholder=8]="Placeholder",r[r.Footer=9]="Footer",r);let i="system",O="user",o="assistant",a="OpenAI",_="Anthropic",s="Google",R="Summary",T="Memory",A="Perplexity",l="Mistral",I=a,M=[a,_,s],S="gpt-5.6-terra",L="gpt-5.4-mini",P="gpt-5.4-nano",g="claude-opus-4-8",N="claude-sonnet-5",d="claude-haiku-4-5",D="gemini-3-flash-preview",c="gemini-3.1-pro-preview",u="sonar",C="sonar-pro",h="openai/gpt-oss-20b:free",p="mistral-large-latest",m="gpt-5.4-mini",G="gpt-5.4-nano",H="gpt-5.4-mini",f="text-embedding-3-small",U="gemini-3-pro-image",y=5,Y=3e4,B={[S]:"GPT-5.6 Terra",[L]:"GPT-5.4 Mini",[P]:"GPT-5.4 Nano",[g]:"Claude Opus 4.8",[N]:"Claude Sonnet 5",[d]:"Claude Haiku 4.5",[c]:"Gemini 3.1 Pro",[D]:"Gemini 3 Flash",[u]:"Sonar",[C]:"Sonar Pro",[U]:"Nano Banana 3 Pro",[p]:"Mistral Large"},b=[S,L,P,g,N,d,D,c,U],v=[S,L,P,g,N,c],F={[a]:[S,L,P],[_]:[g,d,N],[s]:[D,c],[A]:[u,C]},w={[a]:[i,O,o],[_]:[O,o],[R]:[O,o],[T]:[O,o],[s]:[O,o],[A]:[O,o],[l]:[O,o]},V={[_]:["claude-opus-4","claude-sonnet-5","claude-sonnet-4","claude-haiku-4","claude-3"],[a]:["gpt-","o3","o4"],[s]:["gemini"],[A]:["sonar"],[l]:["mistral"]},X="x-diggidy-chat-id",k="x-diggidy-chat-timestamp",W="complete",x="timestamp",K="tokenUsage",z="Diggidy",Z="sassy:basic",j="sassy:plus",Q="sassy:advanced",$={TOOL:{BARCODE:"getProductByBarcode",BUNDLESIZE:"getBundleSize",DATETIME:"getDateTime",GENERATE_IMAGE:"generateImage",IMAGES:"getImages",NUTRITION_FACTS:"getNutritionFacts",POLLUTION:"getAirPollution",WEATHER:"getWeather",URLCONTENTPARSER:"getUrlContent",MEMORIES:"getUserMemories",HUMANIZE:"humanize",WEBSEARCH:"getWebSearch",GITREPOSITORY:"getGitRepoDetails",HOTELS:"getHotelDetails",PRONUNCIATION:"getPronunciation",FRENCH_TEACHINGS:"getFrenchTeachings"},ADDON:{ATTACHMENTS:"addon:attachments",CODEINTERPRETER:"addon:codeinterpreter",SHARE_CHAT:"addon:share-chat"}},q={code_interpreter:"Running code...",web_search:"Searching the web...",[$.TOOL.WEATHER]:"Checking the weather...",[$.TOOL.POLLUTION]:"Fetching air pollution data...",[$.TOOL.BUNDLESIZE]:"Analyzing bundle size...",[$.TOOL.URLCONTENTPARSER]:"Reading a webpage...",[$.TOOL.WEBSEARCH]:"Searching the web...",[$.TOOL.GITREPOSITORY]:"Looking up repository...",[$.TOOL.HOTELS]:"Searching for hotels...",[$.TOOL.NUTRITION_FACTS]:"Fetching nutrition facts...",[$.TOOL.GENERATE_IMAGE]:"Generating image...",[$.TOOL.BARCODE]:"Looking up product...",[$.TOOL.PRONUNCIATION]:"Generating pronunciation...",[$.TOOL.HUMANIZE]:"Rewriting text...",[$.TOOL.IMAGES]:"Searching for images..."},J="Using tools...",ee=5e4,et=1e5,eE=8e5;function er(e){return e===Q?eE:et}let en=16384,ei=4,eO=3,eo="context-compression-summary",ea=new Set(["OpenAI",_,"Google",l]);function e_(e){return"string"==typeof e&&ea.has(e)}let es=/^auto \((.+)\)$/;function eR(e){let t=e.match(es);return t?t[1]:e}let eT=e=>{for(let[t,E]of Object.entries(V))if(E.some(t=>e.startsWith(t)))return t;return null},eA=e=>{if(!e||0===e.length)return[];let t=new Set;for(let E of e)for(let[e,r]of Object.entries(F))r.includes(E)&&("OpenAI"===e||e===_||"Google"===e)&&t.add(e);return M.filter(e=>t.has(e))},el=e=>{let t=new Map;if(!e||0===e.length)return t;for(let E of e)for(let[e,r]of Object.entries(F))if(r.includes(E)){t.has(e)||t.set(e,[]),t.get(e)?.push(E);break}return t},eI=e=>{for(let t of el(e).values())if(t.length>1)return!0;return!1},eM=(e,t)=>!!e&&!!t&&0!==t.length&&t.includes(e);function eS(e,t,E){if(!t||Array.isArray(t)&&0===t.length)return!0;let r=e instanceof Set?e:e?new Set(e):null;return!!r&&0!==r.size&&("string"==typeof t?r.has(t):E?.any===!0?t.some(e=>r.has(e)):t.every(e=>r.has(e)))}function eL(e){return v.includes(e)}export{b as ALL_MODELS,M as ALL_PROVIDERS,v as ALL_REASONING_MODELS,z as APPLICATION_NAME,V as APPROXIMATE_MODELS_PER_PROVIDER,$ as CAPABILITIES,W as CHAT_COMPLETION_MARKER_KEY,et as CONTEXT_COMPRESSION_EMERGENCY_THRESHOLD,eE as CONTEXT_COMPRESSION_EMERGENCY_THRESHOLD_PREMIUM,eO as CONTEXT_COMPRESSION_KEEP_IMAGES,ei as CONTEXT_COMPRESSION_KEEP_RECENT,eo as CONTEXT_COMPRESSION_SUMMARY_ID,ee as CONTEXT_COMPRESSION_THRESHOLD,I as DEFAULT_PROVIDER,J as DEFAULT_TOOL_LOADING_LABEL,X as DIGGIDY_CHAT_ID_HEADER,k as DIGGIDY_CHAT_TIMESTAMP_HEADER,t as HARD_CATEGORIES,en as MAX_OUTPUT_TOKENS,y as MAX_SEARCH_QUERIES,e as MEMORY_CATEGORIES,F as MODELS_PER_PROVIDER,G as MODEL_CHAT_SUMMARY,d as MODEL_CLAUDE_HAIKU,g as MODEL_CLAUDE_OPUS,N as MODEL_CLAUDE_SONNET,h as MODEL_DEV,B as MODEL_DISPLAY_NAMES,f as MODEL_EMBEDDING_TEXT,D as MODEL_GEMINI_FLASH,c as MODEL_GEMINI_PRO,U as MODEL_GENERATE_IMAGE,S as MODEL_GPT5,L as MODEL_GPT5_MINI,P as MODEL_GPT5_NANO,m as MODEL_MEMORY_INFERENCE,H as MODEL_SEARCH_DECOMPOSER,u as MODEL_SONAR,C as MODEL_SONAR_PRO,p as MODEL_TEACHER,Z as PLAN_BASIC,j as PLAN_PLUS,Q as PLAN_PREMIUM,_ as PROVIDER_ANTHROPIC,s as PROVIDER_GOOGLE,T as PROVIDER_MEMORY,l as PROVIDER_MISTRAL,a as PROVIDER_OPENAI,A as PROVIDER_PERPLEXITY,w as PROVIDER_ROLE_MAP,R as PROVIDER_SUMMARY,o as ROLE_ASSISTANT,i as ROLE_SYSTEM,O as ROLE_USER,Y as SEARCH_QUERY_TIMEOUT_MS,x as SORT_BY_TIMESTAMP,K as SORT_BY_TOKEN_USAGE,q as TOOL_LOADING_LABELS,eT as findProvider,er as getCompressionEmergencyThreshold,el as getModelsGroupedByProvider,eA as getProvidersFromModels,eI as hasMultipleModelsPerProvider,eS as isEntitled,E as isHardCategory,eM as isModelAllowedForPlan,e_ as isRealProvider,eL as isReasoningModel,eR as stripAutoWrapper,n as ActionColor};
1
+ let e=["preference","identity","constraint","habit","bio","device","location","finance","professional","interest","style","behavior","other"],t=["identity","bio","constraint","professional"],E=e=>t.includes(e);var r,n=((r={})[r.NewChat=0]="NewChat",r[r.Prompts=1]="Prompts",r[r.Attachment=2]="Attachment",r[r.PrivateChat=3]="PrivateChat",r[r.Send=4]="Send",r[r.Header=5]="Header",r[r.Provider=6]="Provider",r[r.Logo=7]="Logo",r[r.Placeholder=8]="Placeholder",r[r.Footer=9]="Footer",r);let i="system",O="user",o="assistant",a="OpenAI",_="Anthropic",R="Google",s="Summary",T="Memory",A="Perplexity",l="Mistral",S=a,I=[a,_,R],M="gpt-5.6-terra",L="gpt-5.4-mini",P="gpt-5.4-nano",g="claude-opus-4-8",N="claude-sonnet-5",d="claude-haiku-4-5",D="gemini-3-flash-preview",c="gemini-3.1-pro-preview",u="sonar",C="sonar-pro",h="perplexity-search",p="openai/gpt-oss-20b:free",m="mistral-large-latest",G="gpt-5.4-mini",H="gpt-5.4-nano",f="gpt-5.4-mini",U="text-embedding-3-small",y="gemini-3-pro-image",Y=5,B=1e4,b={[M]:"GPT-5.6 Terra",[L]:"GPT-5.4 Mini",[P]:"GPT-5.4 Nano",[g]:"Claude Opus 4.8",[N]:"Claude Sonnet 5",[d]:"Claude Haiku 4.5",[c]:"Gemini 3.1 Pro",[D]:"Gemini 3 Flash",[u]:"Sonar",[C]:"Sonar Pro",[h]:"Perplexity Search",[y]:"Nano Banana 3 Pro",[m]:"Mistral Large"},v=[M,L,P,g,N,d,D,c,y],F=[M,L,P,g,N,c],w={[a]:[M,L,P],[_]:[g,d,N],[R]:[D,c],[A]:[u,C,h]},V={[a]:[i,O,o],[_]:[O,o],[s]:[O,o],[T]:[O,o],[R]:[O,o],[A]:[O,o],[l]:[O,o]},X={[_]:["claude-opus-4","claude-sonnet-5","claude-sonnet-4","claude-haiku-4","claude-3"],[a]:["gpt-","o3","o4"],[R]:["gemini"],[A]:["sonar"],[l]:["mistral"]},x="x-diggidy-chat-id",k="x-diggidy-chat-timestamp",W="complete",K="timestamp",z="tokenUsage",Z="Diggidy",j="sassy:basic",Q="sassy:plus",$="sassy:advanced",q={TOOL:{BARCODE:"getProductByBarcode",BUNDLESIZE:"getBundleSize",DATETIME:"getDateTime",GENERATE_IMAGE:"generateImage",IMAGES:"getImages",NUTRITION_FACTS:"getNutritionFacts",POLLUTION:"getAirPollution",WEATHER:"getWeather",URLCONTENTPARSER:"getUrlContent",MEMORIES:"getUserMemories",HUMANIZE:"humanize",WEBSEARCH:"getWebSearch",GITREPOSITORY:"getGitRepoDetails",HOTELS:"getHotelDetails",PRONUNCIATION:"getPronunciation",FRENCH_TEACHINGS:"getFrenchTeachings"},ADDON:{ATTACHMENTS:"addon:attachments",CODEINTERPRETER:"addon:codeinterpreter",SHARE_CHAT:"addon:share-chat"}},J={code_interpreter:"Running code...",web_search:"Searching the web...",[q.TOOL.WEATHER]:"Checking the weather...",[q.TOOL.POLLUTION]:"Fetching air pollution data...",[q.TOOL.BUNDLESIZE]:"Analyzing bundle size...",[q.TOOL.URLCONTENTPARSER]:"Reading a webpage...",[q.TOOL.WEBSEARCH]:"Searching the web...",[q.TOOL.GITREPOSITORY]:"Looking up repository...",[q.TOOL.HOTELS]:"Searching for hotels...",[q.TOOL.NUTRITION_FACTS]:"Fetching nutrition facts...",[q.TOOL.GENERATE_IMAGE]:"Generating image...",[q.TOOL.BARCODE]:"Looking up product...",[q.TOOL.PRONUNCIATION]:"Generating pronunciation...",[q.TOOL.HUMANIZE]:"Rewriting text...",[q.TOOL.IMAGES]:"Searching for images..."},ee="Using tools...",et=5e4,eE=1e5,er=8e5;function en(e){return e===$?er:eE}let ei=16384,eO=4,eo=3,ea="context-compression-summary",e_=new Set(["OpenAI",_,"Google",l]);function eR(e){return"string"==typeof e&&e_.has(e)}let es=/^auto \((.+)\)$/;function eT(e){let t=e.match(es);return t?t[1]:e}let eA=e=>{for(let[t,E]of Object.entries(X))if(E.some(t=>e.startsWith(t)))return t;return null},el=e=>{if(!e||0===e.length)return[];let t=new Set;for(let E of e)for(let[e,r]of Object.entries(w))r.includes(E)&&("OpenAI"===e||e===_||"Google"===e)&&t.add(e);return I.filter(e=>t.has(e))},eS=e=>{let t=new Map;if(!e||0===e.length)return t;for(let E of e)for(let[e,r]of Object.entries(w))if(r.includes(E)){t.has(e)||t.set(e,[]),t.get(e)?.push(E);break}return t},eI=e=>{for(let t of eS(e).values())if(t.length>1)return!0;return!1},eM=(e,t)=>!!e&&!!t&&0!==t.length&&t.includes(e);function eL(e,t,E){if(!t||Array.isArray(t)&&0===t.length)return!0;let r=e instanceof Set?e:e?new Set(e):null;return!!r&&0!==r.size&&("string"==typeof t?r.has(t):E?.any===!0?t.some(e=>r.has(e)):t.every(e=>r.has(e)))}function eP(e){return F.includes(e)}export{v as ALL_MODELS,I as ALL_PROVIDERS,F as ALL_REASONING_MODELS,Z as APPLICATION_NAME,X as APPROXIMATE_MODELS_PER_PROVIDER,q as CAPABILITIES,W as CHAT_COMPLETION_MARKER_KEY,eE as CONTEXT_COMPRESSION_EMERGENCY_THRESHOLD,er as CONTEXT_COMPRESSION_EMERGENCY_THRESHOLD_PREMIUM,eo as CONTEXT_COMPRESSION_KEEP_IMAGES,eO as CONTEXT_COMPRESSION_KEEP_RECENT,ea as CONTEXT_COMPRESSION_SUMMARY_ID,et as CONTEXT_COMPRESSION_THRESHOLD,S as DEFAULT_PROVIDER,ee as DEFAULT_TOOL_LOADING_LABEL,x as DIGGIDY_CHAT_ID_HEADER,k as DIGGIDY_CHAT_TIMESTAMP_HEADER,t as HARD_CATEGORIES,ei as MAX_OUTPUT_TOKENS,Y as MAX_SEARCH_QUERIES,e as MEMORY_CATEGORIES,w as MODELS_PER_PROVIDER,H as MODEL_CHAT_SUMMARY,d as MODEL_CLAUDE_HAIKU,g as MODEL_CLAUDE_OPUS,N as MODEL_CLAUDE_SONNET,p as MODEL_DEV,b as MODEL_DISPLAY_NAMES,U as MODEL_EMBEDDING_TEXT,D as MODEL_GEMINI_FLASH,c as MODEL_GEMINI_PRO,y as MODEL_GENERATE_IMAGE,M as MODEL_GPT5,L as MODEL_GPT5_MINI,P as MODEL_GPT5_NANO,G as MODEL_MEMORY_INFERENCE,h as MODEL_PERPLEXITY_SEARCH,f as MODEL_SEARCH_DECOMPOSER,u as MODEL_SONAR,C as MODEL_SONAR_PRO,m as MODEL_TEACHER,j as PLAN_BASIC,Q as PLAN_PLUS,$ as PLAN_PREMIUM,_ as PROVIDER_ANTHROPIC,R as PROVIDER_GOOGLE,T as PROVIDER_MEMORY,l as PROVIDER_MISTRAL,a as PROVIDER_OPENAI,A as PROVIDER_PERPLEXITY,V as PROVIDER_ROLE_MAP,s as PROVIDER_SUMMARY,o as ROLE_ASSISTANT,i as ROLE_SYSTEM,O as ROLE_USER,B as SEARCH_QUERY_TIMEOUT_MS,K as SORT_BY_TIMESTAMP,z as SORT_BY_TOKEN_USAGE,J as TOOL_LOADING_LABELS,eA as findProvider,en as getCompressionEmergencyThreshold,eS as getModelsGroupedByProvider,el as getProvidersFromModels,eI as hasMultipleModelsPerProvider,eL as isEntitled,E as isHardCategory,eM as isModelAllowedForPlan,eR as isRealProvider,eP as isReasoningModel,eT as stripAutoWrapper,n as ActionColor};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@versini/sassysaint-common",
3
- "version": "4.46.0",
3
+ "version": "4.47.0",
4
4
  "license": "MIT",
5
5
  "author": "Arno Versini",
6
6
  "publishConfig": {
@@ -32,5 +32,5 @@
32
32
  "test:watch": "vitest",
33
33
  "watch": "npm-run-all dev"
34
34
  },
35
- "gitHead": "562106b618d254e47dee7db2ec4f1f5ce8791667"
35
+ "gitHead": "5837a2c8f83a525f7efa3350e49a978896abba5c"
36
36
  }