@versini/sassysaint-common 4.52.0 → 4.52.2

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
@@ -296,11 +296,10 @@ export declare const getProvidersFromModels: (models: string[]) => Array<typeof
296
296
  /**
297
297
  * "Hard" categories — durable, high-trust attributes of the user (name/role,
298
298
  * demographics/family, requirements, profession) that the system has always
299
- * captured well. These auto-persist. Every other category is "soft" (vague
300
- * preferences, one-off interests, behavioral asides) and only persists on an
301
- * explicit "remember this" or after being seen in enough distinct chats — the
302
- * precision-first stance (see `isPersistable`). Subset of {@link
303
- * MEMORY_CATEGORIES}.
299
+ * captured well. These auto-persist regardless of confidence. Every other
300
+ * category is "soft" (vague preferences, one-off interests, behavioral asides)
301
+ * and persists on an explicit "remember this" or at/above the soft confidence
302
+ * floor (see `isPersistable`). Subset of {@link MEMORY_CATEGORIES}.
304
303
  */
305
304
  export declare const HARD_CATEGORIES: readonly ["identity", "bio", "constraint", "professional"];
306
305
 
@@ -546,8 +545,19 @@ export declare const MODEL_HUMANIZE_REWRITE = "gemini-3.6-flash";
546
545
  * Bumped nano→mini (Track 2 T7): memory extraction now emits structured
547
546
  * canonical keys, an explicit-request flag, and obeys the precision gate — nano
548
547
  * was too weak for that reasoning; mini materially improves salience.
548
+ *
549
+ * Bumped mini→luna: mini is nearing deprecation, and luna is cheaper (0.20/1.20
550
+ * against 0.75/4.50). Re-derive with `MEMORY_MODEL_OVERRIDE=<model> node
551
+ * dist/maintenance/inspectExtractionSpans.js <chatId> --extract=10` (dev only).
552
+ * Measured on the GH #3129 chat, 10 runs each: quality did not separate them —
553
+ * both extracted the same 7 facts with verbatim quotes — but luna held a much
554
+ * 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.
558
+ *
549
559
  */
550
- export declare const MODEL_MEMORY_INFERENCE = "gpt-5.4-mini";
560
+ export declare const MODEL_MEMORY_INFERENCE = "gpt-5.6-luna";
551
561
 
552
562
  /**
553
563
  * The nutrition fallback runs a web-search-tool lookup for branded products FDC
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",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};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@versini/sassysaint-common",
3
- "version": "4.52.0",
3
+ "version": "4.52.2",
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": "664ce6283c7e634dbf322c69c9b55815926e010e"
35
+ "gitHead": "aff48aac6d07b48e8bacf5edf585d296c2705a01"
36
36
  }