@versini/sassysaint-common 4.40.2 → 4.42.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
@@ -82,6 +82,15 @@ export declare const CAPABILITIES: {
82
82
  */
83
83
  export declare type CapabilityInput = string | readonly string[];
84
84
 
85
+ /**
86
+ * Metadata key the server stamps on the assistant message's `finish` part to
87
+ * mark a turn that streamed to completion. A truncated stream never emits a
88
+ * finish part, so the client treats this key's absence as a turn that was cut
89
+ * off mid-stream (#2890). Shared so the server writer and client reader can
90
+ * never drift on the string.
91
+ */
92
+ export declare const CHAT_COMPLETION_MARKER_KEY = "complete";
93
+
85
94
  /**
86
95
  * Maps each ActionColor to its corresponding Tailwind CSS class string. These
87
96
  * are complete class strings (e.g., "fill-[#7A9BC4]", "text-copy-medium") that
@@ -266,6 +275,18 @@ export declare const getModelsGroupedByProvider: (models: string[]) => Map<strin
266
275
  */
267
276
  export declare const getProvidersFromModels: (models: string[]) => Array<typeof PROVIDER_OPENAI | typeof PROVIDER_ANTHROPIC | typeof PROVIDER_GOOGLE>;
268
277
 
278
+ /**
279
+ * "Hard" categories — durable, high-trust attributes of the user (name/role,
280
+ * demographics/family, requirements, profession) that the system has always
281
+ * captured well. These auto-persist. Every other category is "soft" (vague
282
+ * preferences, one-off interests, behavioral asides) and only persists on an
283
+ * explicit "remember this" or after being seen in enough distinct chats — the
284
+ * precision-first stance (see `isPersistable`). Subset of {@link MEMORY_CATEGORIES}.
285
+ */
286
+ export declare const HARD_CATEGORIES: readonly ["identity", "bio", "constraint", "professional"];
287
+
288
+ export declare type HardCategory = (typeof HARD_CATEGORIES)[number];
289
+
269
290
  /**
270
291
  * Checks if the user has multiple models available for at least one provider.
271
292
  * This function is used to determine if the nested model selection feature
@@ -370,6 +391,11 @@ declare interface IsEntitledOptions {
370
391
  set?: Set<string>;
371
392
  }
372
393
 
394
+ /**
395
+ * True when `category` is a hard (auto-persist) category.
396
+ */
397
+ export declare const isHardCategory: (category: string) => boolean;
398
+
373
399
  /**
374
400
  * Validates if a selected model is allowed for the user based on their current
375
401
  * plan's allowed models. This function is used to prevent users from using
@@ -520,7 +546,7 @@ export declare const MODEL_GPT5_MINI = "gpt-5.4-mini";
520
546
 
521
547
  export declare const MODEL_GPT5_NANO = "gpt-5.4-nano";
522
548
 
523
- export declare const MODEL_MEMORY_INFERENCE = "gpt-5.4-nano";
549
+ export declare const MODEL_MEMORY_INFERENCE = "gpt-5.4-mini";
524
550
 
525
551
  export declare const MODEL_SEARCH_DECOMPOSER = "gpt-5.4-mini";
526
552
 
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- let e=["preference","identity","constraint","habit","bio","device","location","finance","professional","interest","style","behavior","other"];var E,t=((E={})[E.NewChat=0]="NewChat",E[E.Prompts=1]="Prompts",E[E.Attachment=2]="Attachment",E[E.PrivateChat=3]="PrivateChat",E[E.Reasoning=4]="Reasoning",E[E.Send=5]="Send",E[E.Header=6]="Header",E[E.Provider=7]="Provider",E[E.Logo=8]="Logo",E[E.Placeholder=9]="Placeholder",E[E.Footer=10]="Footer",E);let O="system",n="user",r="assistant",i="OpenAI",o="Anthropic",a="Google",_="Summary",R="Memory",T="Perplexity",A="Mistral",s="Auto",L=i,I=[i,o,a],M="gpt-5.4",S="gpt-5.4-mini",P="gpt-5.4-nano",l="claude-opus-4-8",N="claude-sonnet-4-6",g="claude-haiku-4-5",D="gemini-3-flash-preview",d="gemini-3.1-pro-preview",u="sonar",c="sonar-pro",C="openai/gpt-oss-20b:free",h="mistral-large-latest",p="gpt-5.4-nano",G="gpt-5.4-nano",U="gpt-5.4-mini",m="text-embedding-3-small",H="gemini-3-pro-image",f=P,y=g,B=D,Y=S,v=N,b=D,F=5,w=3e4,V={[M]:"GPT-5.4",[S]:"GPT-5.4 Mini",[P]:"GPT-5.4 Nano",[l]:"Claude Opus 4.8",[N]:"Claude Sonnet 4.6",[g]:"Claude Haiku 4.5",[d]:"Gemini 3.1 Pro",[D]:"Gemini 3 Flash",[u]:"Sonar",[c]:"Sonar Pro",[H]:"Nano Banana 3 Pro",[h]:"Mistral Large"},X=[M,S,P,l,N,g,D,d,H],k=[M,S,P,l,N,d],x={[i]:[M,S,P],[o]:[l,g,N],[a]:[D,d],[T]:[u,c]},W={[i]:[O,n,r],[o]:[n,r],[_]:[n,r],[R]:[n,r],[a]:[n,r],[T]:[n,r],[A]:[n,r]},z={[o]:["claude-opus-4","claude-sonnet-4","claude-haiku-4","claude-3"],[i]:["gpt-","o3","o4"],[a]:["gemini"],[T]:["sonar"],[A]:["mistral"]},K="x-diggidy-chat-id",Z="x-diggidy-chat-timestamp",j="timestamp",Q="tokenUsage",q="Diggidy",J="sassy:basic",$="sassy:plus",ee="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",PRONUNCIATION:"getPronunciation",FRENCH_TEACHINGS:"getFrenchTeachings"},ADDON:{ATTACHMENTS:"addon:attachments",REASONING:"addon:reasoning",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.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..."},eO="Using tools...",en=5e4,er=1e5,ei=8e5;function eo(e){return e===ee?ei:er}let ea=16384,e_=4,eR=3,eT="context-compression-summary",eA=new Set(["OpenAI",o,"Google",A]);function es(e){return"string"==typeof e&&eA.has(e)}let eL=e=>{for(let[E,t]of Object.entries(z))if(t.some(E=>e.startsWith(E)))return E;return null},eI=e=>{if(!e||0===e.length)return[];let E=new Set;for(let t of e)for(let[e,O]of Object.entries(x))O.includes(t)&&("OpenAI"===e||e===o||"Google"===e)&&E.add(e);return I.filter(e=>E.has(e))},eM=e=>{let E=new Map;if(!e||0===e.length)return E;for(let t of e)for(let[e,O]of Object.entries(x))if(O.includes(t)){E.has(e)||E.set(e,[]),E.get(e)?.push(t);break}return E},eS=e=>{for(let E of eM(e).values())if(E.length>1)return!0;return!1},eP=(e,E)=>!!e&&!!E&&0!==E.length&&E.includes(e);function el(e,E,t){if(!E||Array.isArray(E)&&0===E.length)return!0;let O=e instanceof Set?e:e?new Set(e):null;return!!O&&0!==O.size&&("string"==typeof E?O.has(E):t?.any===!0?E.some(e=>O.has(e)):E.every(e=>O.has(e)))}function eN(e){return k.includes(e)}export{X as ALL_MODELS,I as ALL_PROVIDERS,k as ALL_REASONING_MODELS,q as APPLICATION_NAME,z as APPROXIMATE_MODELS_PER_PROVIDER,eE as CAPABILITIES,er as CONTEXT_COMPRESSION_EMERGENCY_THRESHOLD,ei as CONTEXT_COMPRESSION_EMERGENCY_THRESHOLD_PREMIUM,eR as CONTEXT_COMPRESSION_KEEP_IMAGES,e_ as CONTEXT_COMPRESSION_KEEP_RECENT,eT as CONTEXT_COMPRESSION_SUMMARY_ID,en as CONTEXT_COMPRESSION_THRESHOLD,L as DEFAULT_PROVIDER,eO as DEFAULT_TOOL_LOADING_LABEL,K as DIGGIDY_CHAT_ID_HEADER,Z as DIGGIDY_CHAT_TIMESTAMP_HEADER,ea as MAX_OUTPUT_TOKENS,F as MAX_SEARCH_QUERIES,e as MEMORY_CATEGORIES,x as MODELS_PER_PROVIDER,v as MODEL_AUTO_RESPONDER_ANTHROPIC,b as MODEL_AUTO_RESPONDER_GOOGLE,Y as MODEL_AUTO_RESPONDER_OPENAI,y as MODEL_AUTO_ROUTER_ANTHROPIC,B as MODEL_AUTO_ROUTER_GOOGLE,f as MODEL_AUTO_ROUTER_OPENAI,G as MODEL_CHAT_SUMMARY,g as MODEL_CLAUDE_HAIKU,l as MODEL_CLAUDE_OPUS,N as MODEL_CLAUDE_SONNET,C as MODEL_DEV,V as MODEL_DISPLAY_NAMES,m as MODEL_EMBEDDING_TEXT,D as MODEL_GEMINI_FLASH,d as MODEL_GEMINI_PRO,H as MODEL_GENERATE_IMAGE,M as MODEL_GPT5,S as MODEL_GPT5_MINI,P as MODEL_GPT5_NANO,p as MODEL_MEMORY_INFERENCE,U as MODEL_SEARCH_DECOMPOSER,u as MODEL_SONAR,c as MODEL_SONAR_PRO,h as MODEL_TEACHER,J as PLAN_BASIC,$ as PLAN_PLUS,ee as PLAN_PREMIUM,o as PROVIDER_ANTHROPIC,s as PROVIDER_AUTO,a as PROVIDER_GOOGLE,R as PROVIDER_MEMORY,A as PROVIDER_MISTRAL,i as PROVIDER_OPENAI,T as PROVIDER_PERPLEXITY,W as PROVIDER_ROLE_MAP,_ as PROVIDER_SUMMARY,r as ROLE_ASSISTANT,O as ROLE_SYSTEM,n as ROLE_USER,w as SEARCH_QUERY_TIMEOUT_MS,j as SORT_BY_TIMESTAMP,Q as SORT_BY_TOKEN_USAGE,et as TOOL_LOADING_LABELS,eL as findProvider,eo as getCompressionEmergencyThreshold,eM as getModelsGroupedByProvider,eI as getProvidersFromModels,eS as hasMultipleModelsPerProvider,el as isEntitled,eP as isModelAllowedForPlan,es as isRealProvider,eN as isReasoningModel,t as ActionColor};
1
+ let e=["preference","identity","constraint","habit","bio","device","location","finance","professional","interest","style","behavior","other"],E=["identity","bio","constraint","professional"],t=e=>E.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.Reasoning=4]="Reasoning",O[O.Send=5]="Send",O[O.Header=6]="Header",O[O.Provider=7]="Provider",O[O.Logo=8]="Logo",O[O.Placeholder=9]="Placeholder",O[O.Footer=10]="Footer",O);let r="system",i="user",o="assistant",a="OpenAI",_="Anthropic",R="Google",T="Summary",A="Memory",s="Perplexity",I="Mistral",L="Auto",M=a,S=[a,_,R],P="gpt-5.4",l="gpt-5.4-mini",N="gpt-5.4-nano",g="claude-opus-4-8",D="claude-sonnet-4-6",d="claude-haiku-4-5",C="gemini-3-flash-preview",c="gemini-3.1-pro-preview",u="sonar",h="sonar-pro",p="openai/gpt-oss-20b:free",G="mistral-large-latest",U="gpt-5.4-mini",m="gpt-5.4-nano",H="gpt-5.4-mini",f="text-embedding-3-small",y="gemini-3-pro-image",Y=N,B=d,b=C,v=l,F=D,w=C,V=5,X=3e4,k={[P]:"GPT-5.4",[l]:"GPT-5.4 Mini",[N]:"GPT-5.4 Nano",[g]:"Claude Opus 4.8",[D]:"Claude Sonnet 4.6",[d]:"Claude Haiku 4.5",[c]:"Gemini 3.1 Pro",[C]:"Gemini 3 Flash",[u]:"Sonar",[h]:"Sonar Pro",[y]:"Nano Banana 3 Pro",[G]:"Mistral Large"},x=[P,l,N,g,D,d,C,c,y],K=[P,l,N,g,D,c],W={[a]:[P,l,N],[_]:[g,d,D],[R]:[C,c],[s]:[u,h]},z={[a]:[r,i,o],[_]:[i,o],[T]:[i,o],[A]:[i,o],[R]:[i,o],[s]:[i,o],[I]:[i,o]},Z={[_]:["claude-opus-4","claude-sonnet-4","claude-haiku-4","claude-3"],[a]:["gpt-","o3","o4"],[R]:["gemini"],[s]:["sonar"],[I]:["mistral"]},j="x-diggidy-chat-id",Q="x-diggidy-chat-timestamp",q="complete",J="timestamp",$="tokenUsage",ee="Diggidy",eE="sassy:basic",et="sassy:plus",eO="sassy:advanced",en={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",REASONING:"addon:reasoning",CODEINTERPRETER:"addon:codeinterpreter",SHARE_CHAT:"addon:share-chat"}},er={code_interpreter:"Running code...",web_search:"Searching the web...",[en.TOOL.WEATHER]:"Checking the weather...",[en.TOOL.POLLUTION]:"Fetching air pollution data...",[en.TOOL.BUNDLESIZE]:"Analyzing bundle size...",[en.TOOL.URLCONTENTPARSER]:"Reading a webpage...",[en.TOOL.WEBSEARCH]:"Searching the web...",[en.TOOL.GITREPOSITORY]:"Looking up repository...",[en.TOOL.HOTELS]:"Searching for hotels...",[en.TOOL.NUTRITION_FACTS]:"Fetching nutrition facts...",[en.TOOL.GENERATE_IMAGE]:"Generating image...",[en.TOOL.BARCODE]:"Looking up product...",[en.TOOL.PRONUNCIATION]:"Generating pronunciation...",[en.TOOL.HUMANIZE]:"Rewriting text...",[en.TOOL.IMAGES]:"Searching for images..."},ei="Using tools...",eo=5e4,ea=1e5,e_=8e5;function eR(e){return e===eO?e_:ea}let eT=16384,eA=4,es=3,eI="context-compression-summary",eL=new Set(["OpenAI",_,"Google",I]);function eM(e){return"string"==typeof e&&eL.has(e)}let eS=e=>{for(let[E,t]of Object.entries(Z))if(t.some(E=>e.startsWith(E)))return E;return null},eP=e=>{if(!e||0===e.length)return[];let E=new Set;for(let t of e)for(let[e,O]of Object.entries(W))O.includes(t)&&("OpenAI"===e||e===_||"Google"===e)&&E.add(e);return S.filter(e=>E.has(e))},el=e=>{let E=new Map;if(!e||0===e.length)return E;for(let t of e)for(let[e,O]of Object.entries(W))if(O.includes(t)){E.has(e)||E.set(e,[]),E.get(e)?.push(t);break}return E},eN=e=>{for(let E of el(e).values())if(E.length>1)return!0;return!1},eg=(e,E)=>!!e&&!!E&&0!==E.length&&E.includes(e);function eD(e,E,t){if(!E||Array.isArray(E)&&0===E.length)return!0;let O=e instanceof Set?e:e?new Set(e):null;return!!O&&0!==O.size&&("string"==typeof E?O.has(E):t?.any===!0?E.some(e=>O.has(e)):E.every(e=>O.has(e)))}function ed(e){return K.includes(e)}export{x as ALL_MODELS,S as ALL_PROVIDERS,K as ALL_REASONING_MODELS,ee as APPLICATION_NAME,Z as APPROXIMATE_MODELS_PER_PROVIDER,en as CAPABILITIES,q as CHAT_COMPLETION_MARKER_KEY,ea as CONTEXT_COMPRESSION_EMERGENCY_THRESHOLD,e_ as CONTEXT_COMPRESSION_EMERGENCY_THRESHOLD_PREMIUM,es as CONTEXT_COMPRESSION_KEEP_IMAGES,eA as CONTEXT_COMPRESSION_KEEP_RECENT,eI as CONTEXT_COMPRESSION_SUMMARY_ID,eo as CONTEXT_COMPRESSION_THRESHOLD,M as DEFAULT_PROVIDER,ei as DEFAULT_TOOL_LOADING_LABEL,j as DIGGIDY_CHAT_ID_HEADER,Q as DIGGIDY_CHAT_TIMESTAMP_HEADER,E as HARD_CATEGORIES,eT as MAX_OUTPUT_TOKENS,V as MAX_SEARCH_QUERIES,e as MEMORY_CATEGORIES,W as MODELS_PER_PROVIDER,F as MODEL_AUTO_RESPONDER_ANTHROPIC,w as MODEL_AUTO_RESPONDER_GOOGLE,v as MODEL_AUTO_RESPONDER_OPENAI,B as MODEL_AUTO_ROUTER_ANTHROPIC,b as MODEL_AUTO_ROUTER_GOOGLE,Y as MODEL_AUTO_ROUTER_OPENAI,m as MODEL_CHAT_SUMMARY,d as MODEL_CLAUDE_HAIKU,g as MODEL_CLAUDE_OPUS,D as MODEL_CLAUDE_SONNET,p as MODEL_DEV,k as MODEL_DISPLAY_NAMES,f as MODEL_EMBEDDING_TEXT,C as MODEL_GEMINI_FLASH,c as MODEL_GEMINI_PRO,y as MODEL_GENERATE_IMAGE,P as MODEL_GPT5,l as MODEL_GPT5_MINI,N as MODEL_GPT5_NANO,U as MODEL_MEMORY_INFERENCE,H as MODEL_SEARCH_DECOMPOSER,u as MODEL_SONAR,h as MODEL_SONAR_PRO,G as MODEL_TEACHER,eE as PLAN_BASIC,et as PLAN_PLUS,eO as PLAN_PREMIUM,_ as PROVIDER_ANTHROPIC,L as PROVIDER_AUTO,R as PROVIDER_GOOGLE,A as PROVIDER_MEMORY,I as PROVIDER_MISTRAL,a as PROVIDER_OPENAI,s as PROVIDER_PERPLEXITY,z as PROVIDER_ROLE_MAP,T as PROVIDER_SUMMARY,o as ROLE_ASSISTANT,r as ROLE_SYSTEM,i as ROLE_USER,X as SEARCH_QUERY_TIMEOUT_MS,J as SORT_BY_TIMESTAMP,$ as SORT_BY_TOKEN_USAGE,er as TOOL_LOADING_LABELS,eS as findProvider,eR as getCompressionEmergencyThreshold,el as getModelsGroupedByProvider,eP as getProvidersFromModels,eN as hasMultipleModelsPerProvider,eD as isEntitled,t as isHardCategory,eg as isModelAllowedForPlan,eM as isRealProvider,ed as isReasoningModel,n as ActionColor};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@versini/sassysaint-common",
3
- "version": "4.40.2",
3
+ "version": "4.42.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": "edeea07b6a417a53951f6158d48a178ed31973b1"
35
+ "gitHead": "babef04327d3b0aa12b23da85332cb950891218b"
36
36
  }