@versini/sassysaint-common 4.37.1 → 4.39.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
@@ -20,7 +20,7 @@ export declare enum ActionColor {
20
20
  * List of all models available TODAY. This is used by the client to display the
21
21
  * list of models.
22
22
  */
23
- export declare const ALL_MODELS: readonly ["gpt-5.4", "gpt-5.4-mini", "gpt-5.4-nano", "claude-opus-4-6", "claude-sonnet-4-6", "claude-haiku-4-5", "gemini-3-flash-preview", "gemini-3.1-pro-preview", "gemini-3-pro-image-preview"];
23
+ export declare const ALL_MODELS: readonly ["gpt-5.4", "gpt-5.4-mini", "gpt-5.4-nano", "claude-opus-4-8", "claude-sonnet-4-6", "claude-haiku-4-5", "gemini-3-flash-preview", "gemini-3.1-pro-preview", "gemini-3-pro-image"];
24
24
 
25
25
  export declare const ALL_PROVIDERS: readonly ["OpenAI", "Anthropic", "Google"];
26
26
 
@@ -93,6 +93,16 @@ export declare type CapabilityInput = string | readonly string[];
93
93
  */
94
94
  export declare type ColorMap = Partial<Record<ActionColor, string>>;
95
95
 
96
+ /**
97
+ * Maximum number of the most recent images carried forward when older messages
98
+ * are compressed into a text summary. Compression flattens older turns into
99
+ * image-blind text; without this the original upload and every previously
100
+ * generated image would silently vanish from what the model can see, breaking
101
+ * iterative image editing and vision follow-ups. Bounded so a few images don't
102
+ * defeat the token savings compression exists to provide.
103
+ */
104
+ export declare const CONTEXT_COMPRESSION_KEEP_IMAGES = 3;
105
+
96
106
  /**
97
107
  * Number of recent messages to keep intact during compression (two
98
108
  * user-assistant exchanges). Ensures the model has enough immediate
@@ -217,11 +227,11 @@ export declare const getModelsGroupedByProvider: (models: string[]) => Map<strin
217
227
  * @example
218
228
  * ```ts
219
229
  * // User's plan includes GPT and Claude models:
220
- * getProvidersFromModels([MODEL_GPT4_NANO, MODEL_CLAUDE_HAIKU]);
230
+ * getProvidersFromModels([MODEL_GPT5_NANO, MODEL_CLAUDE_HAIKU]);
221
231
  * // Returns: [PROVIDER_OPENAI, PROVIDER_ANTHROPIC]
222
232
  *
223
233
  * // Gemini models removed from plan:
224
- * getProvidersFromModels([MODEL_GPT4_NANO, MODEL_CLAUDE_HAIKU]);
234
+ * getProvidersFromModels([MODEL_GPT5_NANO, MODEL_CLAUDE_HAIKU]);
225
235
  * // Returns: [PROVIDER_OPENAI, PROVIDER_ANTHROPIC]
226
236
  * // (PROVIDER_GOOGLE is excluded)
227
237
  *
@@ -371,6 +381,15 @@ declare interface IsEntitledOptions {
371
381
  */
372
382
  export declare const isModelAllowedForPlan: (selectedModel: string | undefined | null, allowedModels: string[]) => boolean;
373
383
 
384
+ /**
385
+ * Runtime guard: true only for a real, SDK-instantiable provider literal.
386
+ * Returns false for PROVIDER_AUTO, undefined, null, and anything else. Shared
387
+ * by the Auto-router resolver (server) and the provider picker (client) so both
388
+ * agree on what counts as a real, selectable provider — and so neither lets the
389
+ * "Auto" pseudo-value leak into enum-keyed lookups.
390
+ */
391
+ export declare function isRealProvider(value: unknown): value is RealProvider;
392
+
374
393
  /**
375
394
  * Checks if a given model is classified as a reasoning-capable model. This
376
395
  * function is used to determine if advanced reasoning features should be
@@ -414,7 +433,7 @@ export declare const MODEL_CHAT_SUMMARY = "gpt-5.4-nano";
414
433
 
415
434
  export declare const MODEL_CLAUDE_HAIKU = "claude-haiku-4-5";
416
435
 
417
- export declare const MODEL_CLAUDE_OPUS = "claude-opus-4-6";
436
+ export declare const MODEL_CLAUDE_OPUS = "claude-opus-4-8";
418
437
 
419
438
  export declare const MODEL_CLAUDE_SONNET = "claude-sonnet-4-6";
420
439
 
@@ -432,9 +451,7 @@ export declare const MODEL_GEMINI_FLASH = "gemini-3-flash-preview";
432
451
 
433
452
  export declare const MODEL_GEMINI_PRO = "gemini-3.1-pro-preview";
434
453
 
435
- export declare const MODEL_GENERATE_IMAGE = "gemini-3-pro-image-preview";
436
-
437
- export declare const MODEL_GPT4_NANO = "gpt-4.1-nano";
454
+ export declare const MODEL_GENERATE_IMAGE = "gemini-3-pro-image";
438
455
 
439
456
  /**
440
457
  * List of available models TODAY.
@@ -459,8 +476,8 @@ export declare const MODEL_TEACHER = "mistral-large-latest";
459
476
  * List of models available according to the providers.
460
477
  */
461
478
  export declare const MODELS_PER_PROVIDER: {
462
- readonly OpenAI: readonly ["gpt-4.1-nano", "gpt-5.4", "gpt-5.4-mini", "gpt-5.4-nano"];
463
- readonly Anthropic: readonly ["claude-opus-4-6", "claude-haiku-4-5", "claude-sonnet-4-6"];
479
+ readonly OpenAI: readonly ["gpt-5.4", "gpt-5.4-mini", "gpt-5.4-nano"];
480
+ readonly Anthropic: readonly ["claude-opus-4-8", "claude-haiku-4-5", "claude-sonnet-4-6"];
464
481
  readonly Google: readonly ["gemini-3-flash-preview", "gemini-3.1-pro-preview"];
465
482
  readonly Perplexity: readonly ["sonar", "sonar-pro"];
466
483
  };
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- 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 E="system",O="user",n="assistant",r="OpenAI",i="Anthropic",a="Google",o="Summary",_="Memory",R="Perplexity",T="Mistral",A="Auto",s=r,L=[r,i,a],I="gpt-5.4",M="gpt-5.4-mini",P="gpt-5.4-nano",S="gpt-4.1-nano",l="claude-opus-4-6",g="claude-sonnet-4-6",N="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-preview",f=P,y=N,B=D,F=5,v=1e4,Y={[I]:"GPT-5.4",[M]:"GPT-5.4 Mini",[P]:"GPT-5.4 Nano",[S]:"GPT-4.1 Nano",[l]:"Claude Opus 4.6",[g]:"Claude Sonnet 4.6",[N]:"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"},V=[I,M,P,l,g,N,D,d,H],w=[I,M,P,l,g,d],b={[r]:[S,I,M,P],[i]:[l,N,g],[a]:[D,d],[R]:[u,c]},k={[r]:[E,O,n],[i]:[O,n],[o]:[O,n],[_]:[O,n],[a]:[O,n],[R]:[O,n],[T]:[O,n]},X={[i]:["claude-opus-4","claude-sonnet-4","claude-haiku-4","claude-3"],[r]:["gpt-","o3","o4"],[a]:["gemini"],[R]:["sonar"],[T]:["mistral"]},x="x-diggidy-chat-id",W="x-diggidy-chat-timestamp",z="timestamp",K="tokenUsage",Z="Diggidy",j="sassy:basic",Q="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",REASONING:"addon:reasoning",CODEINTERPRETER:"addon:codeinterpreter",SHARE_CHAT:"addon:share-chat"}},$={code_interpreter:"Running code...",[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..."},ee="Using tools...",et=5e4,eE=16384,eO=4,en="context-compression-summary",er=e=>{for(let[t,E]of Object.entries(X))if(E.some(t=>e.startsWith(t)))return t;return null},ei=e=>{if(!e||0===e.length)return[];let t=new Set;for(let E of e)for(let[e,O]of Object.entries(b))O.includes(E)&&(e===r||e===i||e===a)&&t.add(e);return L.filter(e=>t.has(e))},ea=e=>{let t=new Map;if(!e||0===e.length)return t;for(let E of e)for(let[e,O]of Object.entries(b))if(O.includes(E)){t.has(e)||t.set(e,[]),t.get(e)?.push(E);break}return t},eo=e=>{for(let t of ea(e).values())if(t.length>1)return!0;return!1},e_=(e,t)=>!!e&&!!t&&0!==t.length&&t.includes(e);function eR(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 eT(e){return w.includes(e)}export{V as ALL_MODELS,L as ALL_PROVIDERS,w as ALL_REASONING_MODELS,Z as APPLICATION_NAME,X as APPROXIMATE_MODELS_PER_PROVIDER,J as CAPABILITIES,eO as CONTEXT_COMPRESSION_KEEP_RECENT,en as CONTEXT_COMPRESSION_SUMMARY_ID,et as CONTEXT_COMPRESSION_THRESHOLD,s as DEFAULT_PROVIDER,ee as DEFAULT_TOOL_LOADING_LABEL,x as DIGGIDY_CHAT_ID_HEADER,W as DIGGIDY_CHAT_TIMESTAMP_HEADER,eE as MAX_OUTPUT_TOKENS,F as MAX_SEARCH_QUERIES,b as MODELS_PER_PROVIDER,y as MODEL_AUTO_ROUTER_ANTHROPIC,B as MODEL_AUTO_ROUTER_GOOGLE,f as MODEL_AUTO_ROUTER_OPENAI,G as MODEL_CHAT_SUMMARY,N as MODEL_CLAUDE_HAIKU,l as MODEL_CLAUDE_OPUS,g as MODEL_CLAUDE_SONNET,C as MODEL_DEV,Y as MODEL_DISPLAY_NAMES,m as MODEL_EMBEDDING_TEXT,D as MODEL_GEMINI_FLASH,d as MODEL_GEMINI_PRO,H as MODEL_GENERATE_IMAGE,S as MODEL_GPT4_NANO,I as MODEL_GPT5,M 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,Q as PLAN_PLUS,q as PLAN_PREMIUM,i as PROVIDER_ANTHROPIC,A as PROVIDER_AUTO,a as PROVIDER_GOOGLE,_ as PROVIDER_MEMORY,T as PROVIDER_MISTRAL,r as PROVIDER_OPENAI,R as PROVIDER_PERPLEXITY,k as PROVIDER_ROLE_MAP,o as PROVIDER_SUMMARY,n as ROLE_ASSISTANT,E as ROLE_SYSTEM,O as ROLE_USER,v as SEARCH_QUERY_TIMEOUT_MS,z as SORT_BY_TIMESTAMP,K as SORT_BY_TOKEN_USAGE,$ as TOOL_LOADING_LABELS,er as findProvider,ea as getModelsGroupedByProvider,ei as getProvidersFromModels,eo as hasMultipleModelsPerProvider,eR as isEntitled,e_ as isModelAllowedForPlan,eT as isReasoningModel,t as ActionColor};
1
+ var e,E=((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="user",t="assistant",r="OpenAI",n="Anthropic",_="Google",a="Summary",o="Perplexity",R="Mistral",i=[r,n,_],s="gpt-5.4",T="gpt-5.4-mini",A="gpt-5.4-nano",I="claude-opus-4-8",S="claude-sonnet-4-6",M="claude-haiku-4-5",L="gemini-3-flash-preview",P="gemini-3.1-pro-preview",l="sonar",N="sonar-pro",g="openai/gpt-oss-20b:free",D="mistral-large-latest",c="gpt-5.4-nano",d="gpt-5.4-nano",u="gpt-5.4-mini",C="text-embedding-3-small",h="gemini-3-pro-image",U=A,p=M,G=L,m={[s]:"GPT-5.4",[T]:"GPT-5.4 Mini",[A]:"GPT-5.4 Nano",[I]:"Claude Opus 4.8",[S]:"Claude Sonnet 4.6",[M]:"Claude Haiku 4.5",[P]:"Gemini 3.1 Pro",[L]:"Gemini 3 Flash",[l]:"Sonar",[N]:"Sonar Pro",[h]:"Nano Banana 3 Pro",[D]:"Mistral Large"},H=[s,T,A,I,S,M,L,P,h],f=[s,T,A,I,S,P],y={[r]:[s,T,A],[n]:[I,M,S],[_]:[L,P],[o]:[l,N]},V={[r]:["system",O,t],[n]:[O,t],[a]:[O,t],Memory:[O,t],[_]:[O,t],[o]:[O,t],[R]:[O,t]},B={[n]:["claude-opus-4","claude-sonnet-4","claude-haiku-4","claude-3"],[r]:["gpt-","o3","o4"],[_]:["gemini"],[o]:["sonar"],[R]:["mistral"]},Y="x-diggidy-chat-id",F="x-diggidy-chat-timestamp",v="timestamp",w="tokenUsage",X="Diggidy",b="sassy:basic",k="sassy:plus",K="sassy:advanced",x={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"}},W={code_interpreter:"Running code...",web_search:"Searching the web...",[x.TOOL.WEATHER]:"Checking the weather...",[x.TOOL.POLLUTION]:"Fetching air pollution data...",[x.TOOL.BUNDLESIZE]:"Analyzing bundle size...",[x.TOOL.URLCONTENTPARSER]:"Reading a webpage...",[x.TOOL.WEBSEARCH]:"Searching the web...",[x.TOOL.GITREPOSITORY]:"Looking up repository...",[x.TOOL.HOTELS]:"Searching for hotels...",[x.TOOL.NUTRITION_FACTS]:"Fetching nutrition facts...",[x.TOOL.GENERATE_IMAGE]:"Generating image...",[x.TOOL.BARCODE]:"Looking up product...",[x.TOOL.PRONUNCIATION]:"Generating pronunciation...",[x.TOOL.HUMANIZE]:"Rewriting text...",[x.TOOL.IMAGES]:"Searching for images..."},z="Using tools...",Q="context-compression-summary",Z=new Set(["OpenAI",n,"Google",R]);function j(e){return"string"==typeof e&&Z.has(e)}let q=e=>{for(let[E,O]of Object.entries(B))if(O.some(E=>e.startsWith(E)))return E;return null},J=e=>{if(!e||0===e.length)return[];let E=new Set;for(let O of e)for(let[e,t]of Object.entries(y))t.includes(O)&&("OpenAI"===e||e===n||"Google"===e)&&E.add(e);return i.filter(e=>E.has(e))},$=e=>{let E=new Map;if(!e||0===e.length)return E;for(let O of e)for(let[e,t]of Object.entries(y))if(t.includes(O)){E.has(e)||E.set(e,[]),E.get(e)?.push(O);break}return E},ee=e=>{for(let E of $(e).values())if(E.length>1)return!0;return!1},eE=(e,E)=>!!e&&!!E&&0!==E.length&&E.includes(e);function eO(e,E,O){if(!E||Array.isArray(E)&&0===E.length)return!0;let t=e instanceof Set?e:e?new Set(e):null;return!!t&&0!==t.size&&("string"==typeof E?t.has(E):O?.any===!0?E.some(e=>t.has(e)):E.every(e=>t.has(e)))}function et(e){return f.includes(e)}var er=3,en=4,e_=5e4,ea="OpenAI",eo=16384,eR=5,ei="sonar",es="Auto",eT="Google",eA="Memory",eI="OpenAI",eS="system",eM="user",eL=1e4;export{H as ALL_MODELS,i as ALL_PROVIDERS,f as ALL_REASONING_MODELS,X as APPLICATION_NAME,B as APPROXIMATE_MODELS_PER_PROVIDER,x as CAPABILITIES,Q as CONTEXT_COMPRESSION_SUMMARY_ID,z as DEFAULT_TOOL_LOADING_LABEL,Y as DIGGIDY_CHAT_ID_HEADER,F as DIGGIDY_CHAT_TIMESTAMP_HEADER,y as MODELS_PER_PROVIDER,p as MODEL_AUTO_ROUTER_ANTHROPIC,G as MODEL_AUTO_ROUTER_GOOGLE,U as MODEL_AUTO_ROUTER_OPENAI,d as MODEL_CHAT_SUMMARY,M as MODEL_CLAUDE_HAIKU,I as MODEL_CLAUDE_OPUS,S as MODEL_CLAUDE_SONNET,g as MODEL_DEV,m as MODEL_DISPLAY_NAMES,C as MODEL_EMBEDDING_TEXT,L as MODEL_GEMINI_FLASH,P as MODEL_GEMINI_PRO,h as MODEL_GENERATE_IMAGE,s as MODEL_GPT5,T as MODEL_GPT5_MINI,A as MODEL_GPT5_NANO,c as MODEL_MEMORY_INFERENCE,u as MODEL_SEARCH_DECOMPOSER,N as MODEL_SONAR_PRO,D as MODEL_TEACHER,b as PLAN_BASIC,k as PLAN_PLUS,K as PLAN_PREMIUM,n as PROVIDER_ANTHROPIC,R as PROVIDER_MISTRAL,o as PROVIDER_PERPLEXITY,V as PROVIDER_ROLE_MAP,a as PROVIDER_SUMMARY,t as ROLE_ASSISTANT,v as SORT_BY_TIMESTAMP,w as SORT_BY_TOKEN_USAGE,W as TOOL_LOADING_LABELS,q as findProvider,$ as getModelsGroupedByProvider,J as getProvidersFromModels,ee as hasMultipleModelsPerProvider,eO as isEntitled,eE as isModelAllowedForPlan,j as isRealProvider,et as isReasoningModel,er as CONTEXT_COMPRESSION_KEEP_IMAGES,en as CONTEXT_COMPRESSION_KEEP_RECENT,e_ as CONTEXT_COMPRESSION_THRESHOLD,ea as DEFAULT_PROVIDER,eo as MAX_OUTPUT_TOKENS,eR as MAX_SEARCH_QUERIES,ei as MODEL_SONAR,es as PROVIDER_AUTO,eT as PROVIDER_GOOGLE,eA as PROVIDER_MEMORY,eI as PROVIDER_OPENAI,eS as ROLE_SYSTEM,eM as ROLE_USER,eL as SEARCH_QUERY_TIMEOUT_MS,E as ActionColor};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@versini/sassysaint-common",
3
- "version": "4.37.1",
3
+ "version": "4.39.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": "4f643ba3ba9737f2b38a3f2f198e0fd29c59f5eb"
35
+ "gitHead": "a925e2b6b683a7d4c6958902e9a3f4bf1c39f765"
36
36
  }