@versini/sassysaint-common 4.52.2 → 4.54.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,7 +505,28 @@ 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
- export declare const MODEL_CHAT_SUMMARY = "gpt-5.4-nano";
508
+ /**
509
+ * The highest-volume role slot: it pays for chat titles, search summaries AND
510
+ * context compression on every long chat.
511
+ *
512
+ * Bumped nano→luna. This slot was previously held off luna on purpose, and that
513
+ * tradeoff is now spent rather than solved. Usage rows are keyed by model id
514
+ * alone (`usageSchema.index({ email, date, model })`) and callType is never
515
+ * persisted, so every slot sharing an id also shares one cost series — a
516
+ * distinct id was what kept this job's per-job cost floor legible, the same
517
+ * signal that surfaced the consolidation-cron re-billing in #3111/#3113. Its
518
+ * spend now lands in the shared luna series alongside the Basic/Plus chat rung.
519
+ * To make it separable again, point this slot at an id nothing else holds; a
520
+ * per-job breakdown on a shared id would need usageSchema to persist callType
521
+ * first.
522
+ *
523
+ * Latency here is unmeasured against nano: the luna numbers in the block above
524
+ * were taken on memory extraction, not on this job, and this call is awaited on
525
+ * the critical path before time-to-first-token with no deadline. Watch
526
+ * time-to-first-token on long chats after deploying.
527
+ *
528
+ */
529
+ export declare const MODEL_CHAT_SUMMARY = "gpt-5.6-luna";
509
530
 
510
531
  export declare const MODEL_DEV = "openai/gpt-oss-20b:free";
511
532
 
@@ -552,23 +573,33 @@ export declare const MODEL_HUMANIZE_REWRITE = "gemini-3.6-flash";
552
573
  * Measured on the GH #3129 chat, 10 runs each: quality did not separate them —
553
574
  * both extracted the same 7 facts with verbatim quotes — but luna held a much
554
575
  * tighter latency tail (max 25.8s against mini's 64.4s) and used ~15% fewer
555
- * tokens. This slot no longer tracks MODEL_OPENAI_MEDIUM, so it carries its own
556
- * pricing row (see ROLE_MODEL_PRICING); without one it would fall through to
557
- * the "gpt-" prefix at 2/10 and over-bill by 10x.
576
+ * tokens.
577
+ *
578
+ * The OpenAI catalog bump then pointed MODEL_OPENAI_LOW at this same id. Five
579
+ * symbols now hold it — MODEL_OPENAI_LOW, this slot, MODEL_CHAT_SUMMARY,
580
+ * MODEL_NUTRITION_SEARCH and MODEL_REVIEW_TRUST_PANEL — so an EXACT row prices
581
+ * the id and the luna row in ROLE_MODEL_PRICING is the net for whichever of
582
+ * them moves first. Do not restate that set here; modelPricing.ts owns the
583
+ * count.
558
584
  *
559
585
  */
560
586
  export declare const MODEL_MEMORY_INFERENCE = "gpt-5.6-luna";
561
587
 
562
588
  /**
563
589
  * The nutrition fallback runs a web-search-tool lookup for branded products FDC
564
- * does not carry. It needs a mid-grade model with native web search, not
565
- * whatever the OpenAI mid tier happens to point at.
590
+ * does not carry. The hard requirement is native support for the hosted
591
+ * `openai.tools.webSearch` tool, NOT a particular tier — this slot now holds
592
+ * the same id as the entry rung, and that was confirmed in production against
593
+ * "1 cup dry uncooked chickpeas": the FDC soft-failure path fell through to
594
+ * this search and returned 728 kcal. Re-confirm with one branded-product lookup
595
+ * before pointing this slot at any new model, since a capability loss here
596
+ * degrades to a NO_DATA string and reads as "FDC didn't have it".
566
597
  */
567
- export declare const MODEL_NUTRITION_SEARCH = "gpt-5.4-mini";
598
+ export declare const MODEL_NUTRITION_SEARCH = "gpt-5.6-luna";
568
599
 
569
- export declare const MODEL_OPENAI_LOW = "gpt-5.4-nano";
600
+ export declare const MODEL_OPENAI_LOW = "gpt-5.6-luna";
570
601
 
571
- export declare const MODEL_OPENAI_MEDIUM = "gpt-5.4-mini";
602
+ export declare const MODEL_OPENAI_MEDIUM = "gpt-5.6-terra";
572
603
 
573
604
  /**
574
605
  * List of available models TODAY.
@@ -584,14 +615,14 @@ export declare const MODEL_OPENAI_MEDIUM = "gpt-5.4-mini";
584
615
  * Two deliberate exceptions follow the catalog: the Perplexity ids are legacy
585
616
  * and not user-selectable, and the role-purpose slots (MODEL_MEMORY_INFERENCE,
586
617
  * MODEL_CHAT_SUMMARY, MODEL_SEARCH_DECOMPOSER, MODEL_HUMANIZE_REWRITE,
587
- * MODEL_HUMANIZE_AUDIT, MODEL_NUTRITION_SEARCH, MODEL_EMBEDDING_TEXT,
588
- * MODEL_GENERATE_IMAGE, MODEL_DEV) are named for the job they do rather than a
589
- * provider tier, so a bump there never renames them either. Anything that needs
590
- * a specific model for a specific job belongs in that group, NOT pointed at a
591
- * picker tier whose value can move.
618
+ * MODEL_HUMANIZE_AUDIT, MODEL_NUTRITION_SEARCH, MODEL_REVIEW_TRUST_PANEL,
619
+ * MODEL_EMBEDDING_TEXT, MODEL_GENERATE_IMAGE, MODEL_DEV) are named for the job
620
+ * they do rather than a provider tier, so a bump there never renames them
621
+ * either. Anything that needs a specific model for a specific job belongs in
622
+ * that group, NOT pointed at a picker tier whose value can move.
592
623
  *
593
624
  */
594
- export declare const MODEL_OPENAI_TOP = "gpt-5.6-terra";
625
+ export declare const MODEL_OPENAI_TOP = "gpt-5.6-sol";
595
626
 
596
627
  /**
597
628
  * Pseudo-model id for the Perplexity Search API (getWebSearch). Deliberately
@@ -603,6 +634,24 @@ export declare const MODEL_OPENAI_TOP = "gpt-5.6-terra";
603
634
  */
604
635
  export declare const MODEL_PERPLEXITY_SEARCH = "perplexity-search";
605
636
 
637
+ /**
638
+ * The OpenAI seat on the reviewTrust eval panel. It gets its own slot so the
639
+ * roster stops following the OpenAI mid tier it used to read, which would move
640
+ * the panel on every catalog bump without anyone deciding to.
641
+ *
642
+ * This pin does NOT make the current panel comparable to the recorded holdout
643
+ * votes — it breaks that comparability once, deliberately. Both fixtures were
644
+ * labelled by gpt-5.4-mini (145 cases x 3 raters), and README.md records that
645
+ * rater calling "manipulated" 71%/59% against 13% for the other two, so it was
646
+ * the swing vote the leave-one-out table turns on. Those numbers describe a
647
+ * panel this code can no longer produce. Re-derive them with `node
648
+ * dist/evals/reviewTrust/runLabel.js <set> --force` before trusting the
649
+ * calibration again: a plain re-run relabels NOTHING, because runLabel treats a
650
+ * case as complete on vote COUNT and cannot see that a seat changed identity.
651
+ *
652
+ */
653
+ export declare const MODEL_REVIEW_TRUST_PANEL = "gpt-5.6-luna";
654
+
606
655
  /**
607
656
  * The decomposer sits in front of every complex search, so its latency is paid
608
657
  * on the critical path before a single result exists. Measured over 7 fixtures
@@ -629,7 +678,7 @@ export declare const MODEL_SONAR_PRO = "sonar-pro";
629
678
  *
630
679
  */
631
680
  export declare const MODELS_PER_PROVIDER: {
632
- readonly OpenAI: readonly ["gpt-5.6-terra", "gpt-5.4-mini", "gpt-5.4-nano"];
681
+ readonly OpenAI: readonly ["gpt-5.6-sol", "gpt-5.6-terra", "gpt-5.6-luna"];
633
682
  readonly Anthropic: readonly ["claude-opus-5", "claude-haiku-4-5", "claude-sonnet-5"];
634
683
  readonly Google: readonly ["gemini-3.5-flash-lite", "gemini-3.6-flash"];
635
684
  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",L="gpt-5.4-mini",M="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.6-luna",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",[L]:"GPT-5.4 Mini",[M]:"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,L,M,P,g,N,D,c,B],V=[l,L,M,P,g,c,D],W={[a]:[l,L,M],[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))},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(W))if(O.includes(E)){t.has(e)||t.set(e,[]),t.get(e)?.push(E);break}return t},eM=e=>{for(let t of eL(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,M as MODEL_OPENAI_LOW,L 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,eL as getModelsGroupedByProvider,el as getProvidersFromModels,eM 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.6-luna",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.2",
3
+ "version": "4.54.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": "aff48aac6d07b48e8bacf5edf585d296c2705a01"
35
+ "gitHead": "8e1f876e7bd0a6c494d9a0f02d9a72e1619dafcd"
36
36
  }