@versini/sassysaint-common 4.52.1 → 4.53.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
@@ -19,7 +19,7 @@ export declare enum ActionColor {
19
19
  * List of all models available TODAY. This is used by the client to display the
20
20
  * list of models.
21
21
  */
22
- export declare const ALL_MODELS: readonly ["gpt-5.6-terra", "gpt-5.4-mini", "gpt-5.4-nano", "claude-opus-5", "claude-sonnet-5", "claude-haiku-4-5", "gemini-3.5-flash-lite", "gemini-3.6-flash", "gemini-3-pro-image"];
22
+ export declare const ALL_MODELS: readonly ["gpt-5.6-sol", "gpt-5.6-terra", "gpt-5.6-luna", "claude-opus-5", "claude-sonnet-5", "claude-haiku-4-5", "gemini-3.5-flash-lite", "gemini-3.6-flash", "gemini-3-pro-image"];
23
23
 
24
24
  export declare const ALL_PROVIDERS: readonly ["OpenAI", "Anthropic", "Google"];
25
25
 
@@ -505,6 +505,21 @@ export declare const MODEL_ANTHROPIC_MEDIUM = "claude-sonnet-5";
505
505
 
506
506
  export declare const MODEL_ANTHROPIC_TOP = "claude-opus-5";
507
507
 
508
+ /**
509
+ * Deliberately NOT moved to luna with the other role slots. Usage rows are
510
+ * keyed by model id alone (`usageSchema.index({ email, date, model })`) and
511
+ * callType is never persisted, so every slot sharing an id also shares one cost
512
+ * series. This job is the highest-volume role slot — it pays for chat titles,
513
+ * search summaries AND context compression on every long chat — so collapsing
514
+ * it into the Basic/Plus chat bucket would hide exactly the kind of per-job
515
+ * cost floor that surfaced the consolidation-cron re-billing in #3111/#3113.
516
+ * Keeping one id distinct is what preserves that signal.
517
+ *
518
+ * It also stays on the model whose latency is known here: the luna measurement
519
+ * in the block above was taken against mini, not nano, and this call is awaited
520
+ * on the critical path before time-to-first-token with no deadline.
521
+ *
522
+ */
508
523
  export declare const MODEL_CHAT_SUMMARY = "gpt-5.4-nano";
509
524
 
510
525
  export declare const MODEL_DEV = "openai/gpt-oss-20b:free";
@@ -545,19 +560,39 @@ export declare const MODEL_HUMANIZE_REWRITE = "gemini-3.6-flash";
545
560
  * Bumped nano→mini (Track 2 T7): memory extraction now emits structured
546
561
  * canonical keys, an explicit-request flag, and obeys the precision gate — nano
547
562
  * was too weak for that reasoning; mini materially improves salience.
563
+ *
564
+ * Bumped mini→luna: mini is nearing deprecation, and luna is cheaper (0.20/1.20
565
+ * against 0.75/4.50). Re-derive with `MEMORY_MODEL_OVERRIDE=<model> node
566
+ * dist/maintenance/inspectExtractionSpans.js <chatId> --extract=10` (dev only).
567
+ * Measured on the GH #3129 chat, 10 runs each: quality did not separate them —
568
+ * both extracted the same 7 facts with verbatim quotes — but luna held a much
569
+ * tighter latency tail (max 25.8s against mini's 64.4s) and used ~15% fewer
570
+ * tokens.
571
+ *
572
+ * The OpenAI catalog bump then pointed MODEL_OPENAI_LOW at this same id. Four
573
+ * symbols now hold it — MODEL_OPENAI_LOW, this slot, MODEL_NUTRITION_SEARCH and
574
+ * MODEL_REVIEW_TRUST_PANEL — so an EXACT row prices the id and the luna row in
575
+ * ROLE_MODEL_PRICING is the net for whichever of them moves first. Do not
576
+ * restate that set here; modelPricing.ts owns the count.
577
+ *
548
578
  */
549
- export declare const MODEL_MEMORY_INFERENCE = "gpt-5.4-mini";
579
+ export declare const MODEL_MEMORY_INFERENCE = "gpt-5.6-luna";
550
580
 
551
581
  /**
552
582
  * The nutrition fallback runs a web-search-tool lookup for branded products FDC
553
- * does not carry. It needs a mid-grade model with native web search, not
554
- * whatever the OpenAI mid tier happens to point at.
583
+ * does not carry. The hard requirement is native support for the hosted
584
+ * `openai.tools.webSearch` tool, NOT a particular tier — this slot now holds
585
+ * the same id as the entry rung, and that was confirmed in production against
586
+ * "1 cup dry uncooked chickpeas": the FDC soft-failure path fell through to
587
+ * this search and returned 728 kcal. Re-confirm with one branded-product lookup
588
+ * before pointing this slot at any new model, since a capability loss here
589
+ * degrades to a NO_DATA string and reads as "FDC didn't have it".
555
590
  */
556
- export declare const MODEL_NUTRITION_SEARCH = "gpt-5.4-mini";
591
+ export declare const MODEL_NUTRITION_SEARCH = "gpt-5.6-luna";
557
592
 
558
- export declare const MODEL_OPENAI_LOW = "gpt-5.4-nano";
593
+ export declare const MODEL_OPENAI_LOW = "gpt-5.6-luna";
559
594
 
560
- export declare const MODEL_OPENAI_MEDIUM = "gpt-5.4-mini";
595
+ export declare const MODEL_OPENAI_MEDIUM = "gpt-5.6-terra";
561
596
 
562
597
  /**
563
598
  * List of available models TODAY.
@@ -573,14 +608,14 @@ export declare const MODEL_OPENAI_MEDIUM = "gpt-5.4-mini";
573
608
  * Two deliberate exceptions follow the catalog: the Perplexity ids are legacy
574
609
  * and not user-selectable, and the role-purpose slots (MODEL_MEMORY_INFERENCE,
575
610
  * MODEL_CHAT_SUMMARY, MODEL_SEARCH_DECOMPOSER, MODEL_HUMANIZE_REWRITE,
576
- * MODEL_HUMANIZE_AUDIT, MODEL_NUTRITION_SEARCH, MODEL_EMBEDDING_TEXT,
577
- * MODEL_GENERATE_IMAGE, MODEL_DEV) are named for the job they do rather than a
578
- * provider tier, so a bump there never renames them either. Anything that needs
579
- * a specific model for a specific job belongs in that group, NOT pointed at a
580
- * picker tier whose value can move.
611
+ * MODEL_HUMANIZE_AUDIT, MODEL_NUTRITION_SEARCH, MODEL_REVIEW_TRUST_PANEL,
612
+ * MODEL_EMBEDDING_TEXT, MODEL_GENERATE_IMAGE, MODEL_DEV) are named for the job
613
+ * they do rather than a provider tier, so a bump there never renames them
614
+ * either. Anything that needs a specific model for a specific job belongs in
615
+ * that group, NOT pointed at a picker tier whose value can move.
581
616
  *
582
617
  */
583
- export declare const MODEL_OPENAI_TOP = "gpt-5.6-terra";
618
+ export declare const MODEL_OPENAI_TOP = "gpt-5.6-sol";
584
619
 
585
620
  /**
586
621
  * Pseudo-model id for the Perplexity Search API (getWebSearch). Deliberately
@@ -592,6 +627,24 @@ export declare const MODEL_OPENAI_TOP = "gpt-5.6-terra";
592
627
  */
593
628
  export declare const MODEL_PERPLEXITY_SEARCH = "perplexity-search";
594
629
 
630
+ /**
631
+ * The OpenAI seat on the reviewTrust eval panel. It gets its own slot so the
632
+ * roster stops following the OpenAI mid tier it used to read, which would move
633
+ * the panel on every catalog bump without anyone deciding to.
634
+ *
635
+ * This pin does NOT make the current panel comparable to the recorded holdout
636
+ * votes — it breaks that comparability once, deliberately. Both fixtures were
637
+ * labelled by gpt-5.4-mini (145 cases x 3 raters), and README.md records that
638
+ * rater calling "manipulated" 71%/59% against 13% for the other two, so it was
639
+ * the swing vote the leave-one-out table turns on. Those numbers describe a
640
+ * panel this code can no longer produce. Re-derive them with `node
641
+ * dist/evals/reviewTrust/runLabel.js <set> --force` before trusting the
642
+ * calibration again: a plain re-run relabels NOTHING, because runLabel treats a
643
+ * case as complete on vote COUNT and cannot see that a seat changed identity.
644
+ *
645
+ */
646
+ export declare const MODEL_REVIEW_TRUST_PANEL = "gpt-5.6-luna";
647
+
595
648
  /**
596
649
  * The decomposer sits in front of every complex search, so its latency is paid
597
650
  * on the critical path before a single result exists. Measured over 7 fixtures
@@ -618,7 +671,7 @@ export declare const MODEL_SONAR_PRO = "sonar-pro";
618
671
  *
619
672
  */
620
673
  export declare const MODELS_PER_PROVIDER: {
621
- readonly OpenAI: readonly ["gpt-5.6-terra", "gpt-5.4-mini", "gpt-5.4-nano"];
674
+ readonly OpenAI: readonly ["gpt-5.6-sol", "gpt-5.6-terra", "gpt-5.6-luna"];
622
675
  readonly Anthropic: readonly ["claude-opus-5", "claude-haiku-4-5", "claude-sonnet-5"];
623
676
  readonly Google: readonly ["gemini-3.5-flash-lite", "gemini-3.6-flash"];
624
677
  readonly Perplexity: readonly ["sonar", "sonar-pro", "perplexity-search"];
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",T="Anthropic",_="Google",s="Summary",R="Memory",S="Perplexity",A=a,I=[a,T,_],L="gpt-5.6-terra",M="gpt-5.4-mini",l="gpt-5.4-nano",P="claude-opus-5",g="claude-sonnet-5",N="claude-haiku-4-5",c="gemini-3.6-flash",D="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",U="gemini-3.6-flash",H="gpt-5.6-terra",f="gpt-5.4-mini",y="text-embedding-3-small",B="gemini-3-pro-image",Y=5,b=1e4,v=3e3,F={[L]:"GPT-5.6 Terra",[M]:"GPT-5.4 Mini",[l]:"GPT-5.4 Nano",[P]:"Claude Opus 5",[g]:"Claude Sonnet 5",[N]:"Claude Haiku 4.5",[c]:"Gemini 3.6 Flash",[D]:"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,D,c,B],V=[L,M,l,P,g,c,D],W={[a]:[L,M,l],[T]:[P,N,g],[_]:[D,c],[S]:[d,u,C]},X={[a]:[r,i,o],[T]:[i,o],[s]:[i,o],[R]:[i,o],[_]:[i,o],[S]:[i,o]},k={[T]:["claude-opus-5","claude-opus-4","claude-sonnet-5","claude-sonnet-4","claude-haiku-4","claude-3"],[a]:["gpt-","o3","o4"],[_]:["gemini"],[S]:["sonar"]},x="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",PRODUCTS:"getProducts",REVIEW_TRUST:"getReviewTrust",STREAMING_PICKS:"getStreamingPicks",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.PRODUCTS]:"Searching for products...",[ee.TOOL.REVIEW_TRUST]:"Checking reviews...",[ee.TOOL.STREAMING_PICKS]:"Finding movies to stream...",[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,eT=3,e_="context-compression-summary",es=new Set(["OpenAI",T,"Google"]);function eR(e){return"string"==typeof e&&es.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(k))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(W))O.includes(E)&&("OpenAI"===e||e===T||"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(W))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,k 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,eT as CONTEXT_COMPRESSION_KEEP_IMAGES,ea as CONTEXT_COMPRESSION_KEEP_RECENT,e_ as CONTEXT_COMPRESSION_SUMMARY_ID,eO as CONTEXT_COMPRESSION_THRESHOLD,A 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,eo as MAX_OUTPUT_TOKENS,Y as MAX_SEARCH_QUERIES,e as MEMORY_CATEGORIES,W 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,B as MODEL_GENERATE_IMAGE,D as MODEL_GOOGLE_MEDIUM,c as MODEL_GOOGLE_TOP,H as MODEL_HUMANIZE_AUDIT,U as MODEL_HUMANIZE_REWRITE,p as MODEL_MEMORY_INFERENCE,f 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,T as PROVIDER_ANTHROPIC,_ as PROVIDER_GOOGLE,R as PROVIDER_MEMORY,a as PROVIDER_OPENAI,S as PROVIDER_PERPLEXITY,X as PROVIDER_ROLE_MAP,s as PROVIDER_SUMMARY,o as ROLE_ASSISTANT,r as ROLE_SYSTEM,i as ROLE_USER,v 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,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",T="Google",s="Summary",R="Memory",S="Perplexity",A=a,I=[a,_,T],l="gpt-5.6-sol",L="gpt-5.6-terra",M="gpt-5.6-luna",P="claude-opus-5",g="claude-sonnet-5",N="claude-haiku-4-5",u="gemini-3.6-flash",c="gemini-3.5-flash-lite",D="sonar",d="sonar-pro",C="perplexity-search",h="openai/gpt-oss-20b:free",p="gpt-5.6-luna",U="gpt-5.4-nano",m="gemini-3.5-flash-lite",G="gemini-3.6-flash",H="gpt-5.6-terra",f="gpt-5.6-luna",y="gpt-5.6-luna",B="text-embedding-3-small",Y="gemini-3-pro-image",b=5,v=1e4,F=3e3,w={[l]:"GPT-5.6 Sol",[L]:"GPT-5.6 Terra",[M]:"GPT-5.6 Luna",[P]:"Claude Opus 5",[g]:"Claude Sonnet 5",[N]:"Claude Haiku 4.5",[u]:"Gemini 3.6 Flash",[c]:"Gemini 3.5 Flash-Lite",[D]:"Sonar",[d]:"Sonar Pro",[C]:"Perplexity Search",[Y]:"Nano Banana 3 Pro"},V=[l,L,M,P,g,N,c,u,Y],W=[l,L,M,P,g,u,c],X={[a]:[l,L,M],[_]:[P,N,g],[T]:[c,u],[S]:[D,d,C]},k={[a]:[r,i,o],[_]:[i,o],[s]:[i,o],[R]:[i,o],[T]:[i,o],[S]:[i,o]},x={[_]:["claude-opus-5","claude-opus-4","claude-sonnet-5","claude-sonnet-4","claude-haiku-4","claude-3"],[a]:["gpt-","o3","o4"],[T]:["gemini"],[S]:["sonar"]},K="x-diggidy-chat-id",Z="x-diggidy-chat-timestamp",z="complete",j="timestamp",Q="tokenUsage",$="Diggidy",q="sassy:basic",J="sassy:plus",ee="sassy:advanced",et={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",PRODUCTS:"getProducts",REVIEW_TRUST:"getReviewTrust",STREAMING_PICKS:"getStreamingPicks",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...",[et.TOOL.WEATHER]:"Checking the weather...",[et.TOOL.POLLUTION]:"Fetching air pollution data...",[et.TOOL.BUNDLESIZE]:"Analyzing bundle size...",[et.TOOL.URLCONTENTPARSER]:"Reading a webpage...",[et.TOOL.WEBSEARCH]:"Searching the web...",[et.TOOL.GITREPOSITORY]:"Looking up repository...",[et.TOOL.HOTELS]:"Searching for hotels...",[et.TOOL.LOCAL_BUSINESSES]:"Searching for local businesses...",[et.TOOL.PRODUCTS]:"Searching for products...",[et.TOOL.REVIEW_TRUST]:"Checking reviews...",[et.TOOL.STREAMING_PICKS]:"Finding movies to stream...",[et.TOOL.NUTRITION_FACTS]:"Fetching nutrition facts...",[et.TOOL.GENERATE_IMAGE]:"Generating image...",[et.TOOL.BARCODE]:"Looking up product...",[et.TOOL.PRONUNCIATION]:"Generating pronunciation...",[et.TOOL.HUMANIZE]:"Rewriting text...",[et.TOOL.IMAGES]:"Searching for images..."},eO="Using tools...",en=5e4,er=1e5,ei=8e5;function eo(e){return e===ee?ei:er}let ea=16384,e_=4,eT=3,es="context-compression-summary",eR=new Set(["OpenAI",_,"Google"]);function eS(e){return"string"==typeof e&&eR.has(e)}let eA=/^auto \((.+)\)$/;function eI(e){let t=e.match(eA);return t?t[1]:e}let el=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},eP=e=>{for(let t of eM(e).values())if(t.length>1)return!0;return!1},eg=(e,t)=>!!e&&!!t&&0!==t.length&&t.includes(e);function eN(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 eu(e){return W.includes(e)}export{V as ALL_MODELS,I as ALL_PROVIDERS,W as ALL_REASONING_MODELS,$ as APPLICATION_NAME,x as APPROXIMATE_MODELS_PER_PROVIDER,et as CAPABILITIES,z as CHAT_COMPLETION_MARKER_KEY,er as CONTEXT_COMPRESSION_EMERGENCY_THRESHOLD,ei as CONTEXT_COMPRESSION_EMERGENCY_THRESHOLD_PREMIUM,eT as CONTEXT_COMPRESSION_KEEP_IMAGES,e_ as CONTEXT_COMPRESSION_KEEP_RECENT,es as CONTEXT_COMPRESSION_SUMMARY_ID,en as CONTEXT_COMPRESSION_THRESHOLD,A as DEFAULT_PROVIDER,eO as DEFAULT_TOOL_LOADING_LABEL,K as DIGGIDY_CHAT_ID_HEADER,Z as DIGGIDY_CHAT_TIMESTAMP_HEADER,t as HARD_CATEGORIES,ea as MAX_OUTPUT_TOKENS,b 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,U as MODEL_CHAT_SUMMARY,h as MODEL_DEV,w as MODEL_DISPLAY_NAMES,B as MODEL_EMBEDDING_TEXT,Y as MODEL_GENERATE_IMAGE,c as MODEL_GOOGLE_MEDIUM,u as MODEL_GOOGLE_TOP,H as MODEL_HUMANIZE_AUDIT,G as MODEL_HUMANIZE_REWRITE,p as MODEL_MEMORY_INFERENCE,f as MODEL_NUTRITION_SEARCH,M as MODEL_OPENAI_LOW,L as MODEL_OPENAI_MEDIUM,l as MODEL_OPENAI_TOP,C as MODEL_PERPLEXITY_SEARCH,y as MODEL_REVIEW_TRUST_PANEL,m as MODEL_SEARCH_DECOMPOSER,D as MODEL_SONAR,d as MODEL_SONAR_PRO,q as PLAN_BASIC,J as PLAN_PLUS,ee as PLAN_PREMIUM,_ as PROVIDER_ANTHROPIC,T as PROVIDER_GOOGLE,R as PROVIDER_MEMORY,a as PROVIDER_OPENAI,S as PROVIDER_PERPLEXITY,k as PROVIDER_ROLE_MAP,s as PROVIDER_SUMMARY,o as ROLE_ASSISTANT,r as ROLE_SYSTEM,i as ROLE_USER,F as SEARCH_DECOMPOSE_TIMEOUT_MS,v as SEARCH_QUERY_TIMEOUT_MS,j as SORT_BY_TIMESTAMP,Q as SORT_BY_TOKEN_USAGE,eE as TOOL_LOADING_LABELS,el as findProvider,eo as getCompressionEmergencyThreshold,eM as getModelsGroupedByProvider,eL as getProvidersFromModels,eP as hasMultipleModelsPerProvider,eN as isEntitled,E as isHardCategory,eg as isModelAllowedForPlan,eS as isRealProvider,eu as isReasoningModel,eI as stripAutoWrapper,n as ActionColor};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@versini/sassysaint-common",
3
- "version": "4.52.1",
3
+ "version": "4.53.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": "12e66b87e24d38af7c17cad02077bcbb5f171c8a"
35
+ "gitHead": "4aa1ba6fa226a88a0259be6ea92c36d1ccce7f30"
36
36
  }