@versini/sassysaint-common 4.48.2 → 4.50.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
@@ -79,6 +79,7 @@ export declare const CAPABILITIES: {
79
79
  readonly WEBSEARCH: "getWebSearch";
80
80
  readonly GITREPOSITORY: "getGitRepoDetails";
81
81
  readonly HOTELS: "getHotelDetails";
82
+ readonly LOCAL_BUSINESSES: "getLocalBusinesses";
82
83
  readonly PRONUNCIATION: "getPronunciation";
83
84
  readonly FRENCH_TEACHINGS: "getFrenchTeachings";
84
85
  };
@@ -589,7 +590,16 @@ export declare const MODEL_OPENAI_TOP = "gpt-5.6-terra";
589
590
  */
590
591
  export declare const MODEL_PERPLEXITY_SEARCH = "perplexity-search";
591
592
 
592
- export declare const MODEL_SEARCH_DECOMPOSER = "gpt-5.4-mini";
593
+ /**
594
+ * The decomposer sits in front of every complex search, so its latency is paid
595
+ * on the critical path before a single result exists. Measured over 7 fixtures
596
+ * x 3 runs (GH #3018): Flash-Lite p50 644ms / p90 720ms, against gpt-5.4-mini's
597
+ * p50 1186ms / p90 1515ms and gemini-3.6-flash's p50 2037ms — the Google TOP
598
+ * tier is SLOWER than either, so this slot must not be pointed at it.
599
+ * Flash-Lite also decomposed better, splitting on real axes (one query per
600
+ * country) where mini emitted near-duplicate rewordings of the whole question.
601
+ */
602
+ export declare const MODEL_SEARCH_DECOMPOSER = "gemini-3.5-flash-lite";
593
603
 
594
604
  export declare const MODEL_SONAR = "sonar";
595
605
 
@@ -674,6 +684,15 @@ export declare const ROLE_SYSTEM = "system";
674
684
 
675
685
  export declare const ROLE_USER = "user";
676
686
 
687
+ /**
688
+ * Deadline for the decompose hop that runs before the searches. Kept well under
689
+ * SEARCH_QUERY_TIMEOUT_MS because this call is pure latency — nothing has been
690
+ * retrieved yet — and because a miss is cheap: the orchestrator falls back to
691
+ * searching the user's undecomposed question. 3s is generous headroom over the
692
+ * measured p90 of 720ms (GH #3018).
693
+ */
694
+ export declare const SEARCH_DECOMPOSE_TIMEOUT_MS = 3000;
695
+
677
696
  /**
678
697
  * Per-sub-query deadline for the parallel search fan-out. The Perplexity Search
679
698
  * API returns in ~1s (measured p100 ~1.4s over the migration spike), far below
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 O,n=((O={})[O.NewChat=0]="NewChat",O[O.Prompts=1]="Prompts",O[O.Attachment=2]="Attachment",O[O.PrivateChat=3]="PrivateChat",O[O.Send=4]="Send",O[O.Header=5]="Header",O[O.Provider=6]="Provider",O[O.Logo=7]="Logo",O[O.Placeholder=8]="Placeholder",O[O.Footer=9]="Footer",O);let r="system",i="user",o="assistant",a="OpenAI",_="Anthropic",R="Google",T="Summary",s="Memory",A="Perplexity",I=a,M=[a,_,R],l="gpt-5.6-terra",L="gpt-5.4-mini",S="gpt-5.4-nano",P="claude-opus-4-8",g="claude-sonnet-5",N="claude-haiku-4-5",D="gemini-3.6-flash",d="gemini-3.5-flash-lite",c="sonar",u="sonar-pro",C="perplexity-search",h="openai/gpt-oss-20b:free",p="gpt-5.4-mini",m="gpt-5.4-nano",G="gpt-5.4-mini",H="gemini-3.6-flash",f="gpt-5.6-terra",U="gpt-5.4-mini",y="text-embedding-3-small",Y="gemini-3-pro-image",B=5,b=1e4,F={[l]:"GPT-5.6 Terra",[L]:"GPT-5.4 Mini",[S]:"GPT-5.4 Nano",[P]:"Claude Opus 4.8",[g]:"Claude Sonnet 5",[N]:"Claude Haiku 4.5",[D]:"Gemini 3.6 Flash",[d]:"Gemini 3.5 Flash-Lite",[c]:"Sonar",[u]:"Sonar Pro",[C]:"Perplexity Search",[Y]:"Nano Banana 3 Pro"},v=[l,L,S,P,g,N,d,D,Y],w=[l,L,S,P,g,D,d],V={[a]:[l,L,S],[_]:[P,N,g],[R]:[d,D],[A]:[c,u,C]},X={[a]:[r,i,o],[_]:[i,o],[T]:[i,o],[s]:[i,o],[R]:[i,o],[A]:[i,o]},W={[_]:["claude-opus-4","claude-sonnet-5","claude-sonnet-4","claude-haiku-4","claude-3"],[a]:["gpt-","o3","o4"],[R]:["gemini"],[A]:["sonar"]},x="x-diggidy-chat-id",k="x-diggidy-chat-timestamp",K="complete",Z="timestamp",z="tokenUsage",j="Diggidy",Q="sassy:basic",$="sassy:plus",q="sassy:advanced",J={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"}},ee={code_interpreter:"Running code...",web_search:"Searching the web...",[J.TOOL.WEATHER]:"Checking the weather...",[J.TOOL.POLLUTION]:"Fetching air pollution data...",[J.TOOL.BUNDLESIZE]:"Analyzing bundle size...",[J.TOOL.URLCONTENTPARSER]:"Reading a webpage...",[J.TOOL.WEBSEARCH]:"Searching the web...",[J.TOOL.GITREPOSITORY]:"Looking up repository...",[J.TOOL.HOTELS]:"Searching for hotels...",[J.TOOL.NUTRITION_FACTS]:"Fetching nutrition facts...",[J.TOOL.GENERATE_IMAGE]:"Generating image...",[J.TOOL.BARCODE]:"Looking up product...",[J.TOOL.PRONUNCIATION]:"Generating pronunciation...",[J.TOOL.HUMANIZE]:"Rewriting text...",[J.TOOL.IMAGES]:"Searching for images..."},et="Using tools...",eE=5e4,eO=1e5,en=8e5;function er(e){return e===q?en:eO}let ei=16384,eo=4,ea=3,e_="context-compression-summary",eR=new Set(["OpenAI",_,"Google"]);function eT(e){return"string"==typeof e&&eR.has(e)}let es=/^auto \((.+)\)$/;function eA(e){let t=e.match(es);return t?t[1]:e}let eI=e=>{for(let[t,E]of Object.entries(W))if(E.some(t=>e.startsWith(t)))return t;return null},eM=e=>{if(!e||0===e.length)return[];let t=new Set;for(let E of e)for(let[e,O]of Object.entries(V))O.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,O]of Object.entries(V))if(O.includes(E)){t.has(e)||t.set(e,[]),t.get(e)?.push(E);break}return t},eL=e=>{for(let t of el(e).values())if(t.length>1)return!0;return!1},eS=(e,t)=>!!e&&!!t&&0!==t.length&&t.includes(e);function eP(e,t,E){if(!t||Array.isArray(t)&&0===t.length)return!0;let O=e instanceof Set?e:e?new Set(e):null;return!!O&&0!==O.size&&("string"==typeof t?O.has(t):E?.any===!0?t.some(e=>O.has(e)):t.every(e=>O.has(e)))}function eg(e){return w.includes(e)}export{v as ALL_MODELS,M as ALL_PROVIDERS,w as ALL_REASONING_MODELS,j as APPLICATION_NAME,W as APPROXIMATE_MODELS_PER_PROVIDER,J as CAPABILITIES,K as CHAT_COMPLETION_MARKER_KEY,eO as CONTEXT_COMPRESSION_EMERGENCY_THRESHOLD,en as CONTEXT_COMPRESSION_EMERGENCY_THRESHOLD_PREMIUM,ea as CONTEXT_COMPRESSION_KEEP_IMAGES,eo as CONTEXT_COMPRESSION_KEEP_RECENT,e_ as CONTEXT_COMPRESSION_SUMMARY_ID,eE as CONTEXT_COMPRESSION_THRESHOLD,I as DEFAULT_PROVIDER,et 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,B as MAX_SEARCH_QUERIES,e as MEMORY_CATEGORIES,V as MODELS_PER_PROVIDER,N as MODEL_ANTHROPIC_LOW,g as MODEL_ANTHROPIC_MEDIUM,P as MODEL_ANTHROPIC_TOP,m as MODEL_CHAT_SUMMARY,h as MODEL_DEV,F as MODEL_DISPLAY_NAMES,y as MODEL_EMBEDDING_TEXT,Y as MODEL_GENERATE_IMAGE,d as MODEL_GOOGLE_MEDIUM,D as MODEL_GOOGLE_TOP,f as MODEL_HUMANIZE_AUDIT,H as MODEL_HUMANIZE_REWRITE,p as MODEL_MEMORY_INFERENCE,U as MODEL_NUTRITION_SEARCH,S as MODEL_OPENAI_LOW,L as MODEL_OPENAI_MEDIUM,l as MODEL_OPENAI_TOP,C as MODEL_PERPLEXITY_SEARCH,G as MODEL_SEARCH_DECOMPOSER,c as MODEL_SONAR,u as MODEL_SONAR_PRO,Q as PLAN_BASIC,$ as PLAN_PLUS,q as PLAN_PREMIUM,_ as PROVIDER_ANTHROPIC,R as PROVIDER_GOOGLE,s as PROVIDER_MEMORY,a as PROVIDER_OPENAI,A as PROVIDER_PERPLEXITY,X as PROVIDER_ROLE_MAP,T as PROVIDER_SUMMARY,o as ROLE_ASSISTANT,r as ROLE_SYSTEM,i as ROLE_USER,b as SEARCH_QUERY_TIMEOUT_MS,Z as SORT_BY_TIMESTAMP,z as SORT_BY_TOKEN_USAGE,ee as TOOL_LOADING_LABELS,eI as findProvider,er as getCompressionEmergencyThreshold,el as getModelsGroupedByProvider,eM as getProvidersFromModels,eL as hasMultipleModelsPerProvider,eP as isEntitled,E as isHardCategory,eS as isModelAllowedForPlan,eT as isRealProvider,eg as isReasoningModel,eA 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 O,n=((O={})[O.NewChat=0]="NewChat",O[O.Prompts=1]="Prompts",O[O.Attachment=2]="Attachment",O[O.PrivateChat=3]="PrivateChat",O[O.Send=4]="Send",O[O.Header=5]="Header",O[O.Provider=6]="Provider",O[O.Logo=7]="Logo",O[O.Placeholder=8]="Placeholder",O[O.Footer=9]="Footer",O);let r="system",i="user",o="assistant",a="OpenAI",_="Anthropic",s="Google",T="Summary",R="Memory",A="Perplexity",S=a,I=[a,_,s],l="gpt-5.6-terra",M="gpt-5.4-mini",L="gpt-5.4-nano",P="claude-opus-4-8",g="claude-sonnet-5",N="claude-haiku-4-5",D="gemini-3.6-flash",c="gemini-3.5-flash-lite",d="sonar",u="sonar-pro",C="perplexity-search",h="openai/gpt-oss-20b:free",p="gpt-5.4-mini",m="gpt-5.4-nano",G="gemini-3.5-flash-lite",H="gemini-3.6-flash",f="gpt-5.6-terra",U="gpt-5.4-mini",y="text-embedding-3-small",B="gemini-3-pro-image",Y=5,b=1e4,F=3e3,v={[l]:"GPT-5.6 Terra",[M]:"GPT-5.4 Mini",[L]:"GPT-5.4 Nano",[P]:"Claude Opus 4.8",[g]:"Claude Sonnet 5",[N]:"Claude Haiku 4.5",[D]:"Gemini 3.6 Flash",[c]:"Gemini 3.5 Flash-Lite",[d]:"Sonar",[u]:"Sonar Pro",[C]:"Perplexity Search",[B]:"Nano Banana 3 Pro"},w=[l,M,L,P,g,N,c,D,B],V=[l,M,L,P,g,D,c],X={[a]:[l,M,L],[_]:[P,N,g],[s]:[c,D],[A]:[d,u,C]},W={[a]:[r,i,o],[_]:[i,o],[T]:[i,o],[R]:[i,o],[s]:[i,o],[A]:[i,o]},x={[_]:["claude-opus-4","claude-sonnet-5","claude-sonnet-4","claude-haiku-4","claude-3"],[a]:["gpt-","o3","o4"],[s]:["gemini"],[A]:["sonar"]},k="x-diggidy-chat-id",K="x-diggidy-chat-timestamp",Z="complete",z="timestamp",j="tokenUsage",Q="Diggidy",$="sassy:basic",q="sassy:plus",J="sassy:advanced",ee={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",LOCAL_BUSINESSES:"getLocalBusinesses",PRONUNCIATION:"getPronunciation",FRENCH_TEACHINGS:"getFrenchTeachings"},ADDON:{ATTACHMENTS:"addon:attachments",CODEINTERPRETER:"addon:codeinterpreter",SHARE_CHAT:"addon:share-chat"}},et={code_interpreter:"Running code...",web_search:"Searching the web...",[ee.TOOL.WEATHER]:"Checking the weather...",[ee.TOOL.POLLUTION]:"Fetching air pollution data...",[ee.TOOL.BUNDLESIZE]:"Analyzing bundle size...",[ee.TOOL.URLCONTENTPARSER]:"Reading a webpage...",[ee.TOOL.WEBSEARCH]:"Searching the web...",[ee.TOOL.GITREPOSITORY]:"Looking up repository...",[ee.TOOL.HOTELS]:"Searching for hotels...",[ee.TOOL.LOCAL_BUSINESSES]:"Searching for local businesses...",[ee.TOOL.NUTRITION_FACTS]:"Fetching nutrition facts...",[ee.TOOL.GENERATE_IMAGE]:"Generating image...",[ee.TOOL.BARCODE]:"Looking up product...",[ee.TOOL.PRONUNCIATION]:"Generating pronunciation...",[ee.TOOL.HUMANIZE]:"Rewriting text...",[ee.TOOL.IMAGES]:"Searching for images..."},eE="Using tools...",eO=5e4,en=1e5,er=8e5;function ei(e){return e===J?er:en}let eo=16384,ea=4,e_=3,es="context-compression-summary",eT=new Set(["OpenAI",_,"Google"]);function eR(e){return"string"==typeof e&&eT.has(e)}let eA=/^auto \((.+)\)$/;function eS(e){let t=e.match(eA);return t?t[1]:e}let eI=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,O]of Object.entries(X))O.includes(E)&&("OpenAI"===e||e===_||"Google"===e)&&t.add(e);return I.filter(e=>t.has(e))},eM=e=>{let t=new Map;if(!e||0===e.length)return t;for(let E of e)for(let[e,O]of Object.entries(X))if(O.includes(E)){t.has(e)||t.set(e,[]),t.get(e)?.push(E);break}return t},eL=e=>{for(let t of eM(e).values())if(t.length>1)return!0;return!1},eP=(e,t)=>!!e&&!!t&&0!==t.length&&t.includes(e);function eg(e,t,E){if(!t||Array.isArray(t)&&0===t.length)return!0;let O=e instanceof Set?e:e?new Set(e):null;return!!O&&0!==O.size&&("string"==typeof t?O.has(t):E?.any===!0?t.some(e=>O.has(e)):t.every(e=>O.has(e)))}function eN(e){return V.includes(e)}export{w as ALL_MODELS,I as ALL_PROVIDERS,V as ALL_REASONING_MODELS,Q as APPLICATION_NAME,x as APPROXIMATE_MODELS_PER_PROVIDER,ee as CAPABILITIES,Z as CHAT_COMPLETION_MARKER_KEY,en as CONTEXT_COMPRESSION_EMERGENCY_THRESHOLD,er as CONTEXT_COMPRESSION_EMERGENCY_THRESHOLD_PREMIUM,e_ as CONTEXT_COMPRESSION_KEEP_IMAGES,ea as CONTEXT_COMPRESSION_KEEP_RECENT,es as CONTEXT_COMPRESSION_SUMMARY_ID,eO as CONTEXT_COMPRESSION_THRESHOLD,S as DEFAULT_PROVIDER,eE as DEFAULT_TOOL_LOADING_LABEL,k as DIGGIDY_CHAT_ID_HEADER,K as DIGGIDY_CHAT_TIMESTAMP_HEADER,t as HARD_CATEGORIES,eo as MAX_OUTPUT_TOKENS,Y as MAX_SEARCH_QUERIES,e as MEMORY_CATEGORIES,X as MODELS_PER_PROVIDER,N as MODEL_ANTHROPIC_LOW,g as MODEL_ANTHROPIC_MEDIUM,P as MODEL_ANTHROPIC_TOP,m as MODEL_CHAT_SUMMARY,h as MODEL_DEV,v as MODEL_DISPLAY_NAMES,y as MODEL_EMBEDDING_TEXT,B as MODEL_GENERATE_IMAGE,c as MODEL_GOOGLE_MEDIUM,D as MODEL_GOOGLE_TOP,f as MODEL_HUMANIZE_AUDIT,H as MODEL_HUMANIZE_REWRITE,p as MODEL_MEMORY_INFERENCE,U as MODEL_NUTRITION_SEARCH,L as MODEL_OPENAI_LOW,M as MODEL_OPENAI_MEDIUM,l as MODEL_OPENAI_TOP,C as MODEL_PERPLEXITY_SEARCH,G as MODEL_SEARCH_DECOMPOSER,d as MODEL_SONAR,u as MODEL_SONAR_PRO,$ as PLAN_BASIC,q as PLAN_PLUS,J as PLAN_PREMIUM,_ as PROVIDER_ANTHROPIC,s as PROVIDER_GOOGLE,R as PROVIDER_MEMORY,a as PROVIDER_OPENAI,A as PROVIDER_PERPLEXITY,W as PROVIDER_ROLE_MAP,T as PROVIDER_SUMMARY,o as ROLE_ASSISTANT,r as ROLE_SYSTEM,i as ROLE_USER,F as SEARCH_DECOMPOSE_TIMEOUT_MS,b as SEARCH_QUERY_TIMEOUT_MS,z as SORT_BY_TIMESTAMP,j as SORT_BY_TOKEN_USAGE,et as TOOL_LOADING_LABELS,eI as findProvider,ei as getCompressionEmergencyThreshold,eM as getModelsGroupedByProvider,el as getProvidersFromModels,eL as hasMultipleModelsPerProvider,eg as isEntitled,E as isHardCategory,eP as isModelAllowedForPlan,eR as isRealProvider,eN as isReasoningModel,eS as stripAutoWrapper,n as ActionColor};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@versini/sassysaint-common",
3
- "version": "4.48.2",
3
+ "version": "4.50.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": "57e3767249413170e3ede4be10c7fa6adc8c3837"
35
+ "gitHead": "3c28037a9e8cae0e6da0f0d4e8d0acc163526f32"
36
36
  }