@versini/sassysaint-common 4.46.0 → 4.48.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,10 +19,26 @@ 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-4-8", "claude-sonnet-5", "claude-haiku-4-5", "gemini-3-flash-preview", "gemini-3.1-pro-preview", "gemini-3-pro-image"];
22
+ export declare const ALL_MODELS: readonly ["gpt-5.6-terra", "gpt-5.4-mini", "gpt-5.4-nano", "claude-opus-4-8", "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
 
26
+ /**
27
+ * Despite the name, this list has exactly one consumer (isReasoningModel, read
28
+ * by vercelEngine) and only affects Google: members get thinkingLevel, while
29
+ * non-members get the older numeric thinkingBudget. The OpenAI entries are
30
+ * inert because vercelEngine sets reasoningEffort unconditionally; the
31
+ * Anthropic entries are inert because nothing reads them at all (there is no
32
+ * anthropic key in that providerOptions object, so Anthropic extended thinking
33
+ * is NOT enabled by listing a model here).
34
+ *
35
+ * Both Google models are listed because Google documents thinking_level for
36
+ * both ids. This matters more than it looks: our explicit providerOptions
37
+ * overrides the SDK's own gemini-3 routing, so a Google model left out of this
38
+ * list is sent thinkingBudget even though the SDK would have picked
39
+ * thinkingLevel for it. Add any new Google model here.
40
+ *
41
+ */
26
42
  export declare const ALL_REASONING_MODELS: string[];
27
43
 
28
44
  /**
@@ -219,17 +235,17 @@ export declare function getCompressionEmergencyThreshold(plan?: string): number;
219
235
  * @example
220
236
  * ```ts
221
237
  * // User has multiple models per provider:
222
- * getModelsGroupedByProvider([MODEL_GPT5, MODEL_GPT5_MINI, MODEL_CLAUDE_HAIKU]);
238
+ * getModelsGroupedByProvider([MODEL_OPENAI_TOP, MODEL_OPENAI_MEDIUM, MODEL_ANTHROPIC_LOW]);
223
239
  * // Returns: Map {
224
- * // "OpenAI" => ["gpt-5", "gpt-5-mini"],
225
- * // "Anthropic" => ["claude-haiku-4-5"]
240
+ * // "OpenAI" => [MODEL_OPENAI_TOP, MODEL_OPENAI_MEDIUM],
241
+ * // "Anthropic" => [MODEL_ANTHROPIC_LOW]
226
242
  * // }
227
243
  *
228
244
  * // Single model per provider:
229
- * getModelsGroupedByProvider([MODEL_GPT5, MODEL_CLAUDE_HAIKU]);
245
+ * getModelsGroupedByProvider([MODEL_OPENAI_TOP, MODEL_ANTHROPIC_LOW]);
230
246
  * // Returns: Map {
231
- * // "OpenAI" => ["gpt-5"],
232
- * // "Anthropic" => ["claude-haiku-4-5"]
247
+ * // "OpenAI" => [MODEL_OPENAI_TOP],
248
+ * // "Anthropic" => [MODEL_ANTHROPIC_LOW]
233
249
  * // }
234
250
  *
235
251
  * // Empty models array:
@@ -257,12 +273,12 @@ export declare const getModelsGroupedByProvider: (models: string[]) => Map<strin
257
273
  *
258
274
  * @example
259
275
  * ```ts
260
- * // User's plan includes GPT and Claude models:
261
- * getProvidersFromModels([MODEL_GPT5_NANO, MODEL_CLAUDE_HAIKU]);
262
- * // Returns: [PROVIDER_OPENAI, PROVIDER_ANTHROPIC]
276
+ * // User's plan includes OpenAI, Anthropic and Google models:
277
+ * getProvidersFromModels([MODEL_OPENAI_LOW, MODEL_ANTHROPIC_LOW, MODEL_GOOGLE_MEDIUM]);
278
+ * // Returns: [PROVIDER_OPENAI, PROVIDER_ANTHROPIC, PROVIDER_GOOGLE]
263
279
  *
264
- * // Gemini models removed from plan:
265
- * getProvidersFromModels([MODEL_GPT5_NANO, MODEL_CLAUDE_HAIKU]);
280
+ * // Google models removed from plan:
281
+ * getProvidersFromModels([MODEL_OPENAI_LOW, MODEL_ANTHROPIC_LOW]);
266
282
  * // Returns: [PROVIDER_OPENAI, PROVIDER_ANTHROPIC]
267
283
  * // (PROVIDER_GOOGLE is excluded)
268
284
  *
@@ -304,15 +320,15 @@ export declare type HardCategory = (typeof HARD_CATEGORIES)[number];
304
320
  * @example
305
321
  * ```ts
306
322
  * // Premium plan with multiple models per provider:
307
- * hasMultipleModelsPerProvider([MODEL_GPT5, MODEL_GPT5_MINI, MODEL_CLAUDE_HAIKU]);
323
+ * hasMultipleModelsPerProvider([MODEL_OPENAI_TOP, MODEL_OPENAI_MEDIUM, MODEL_ANTHROPIC_LOW]);
308
324
  * // Returns: true (OpenAI has 2 models)
309
325
  *
310
326
  * // Plus plan with one model per provider:
311
- * hasMultipleModelsPerProvider([MODEL_GPT5_MINI, MODEL_CLAUDE_HAIKU, MODEL_GEMINI_FLASH]);
327
+ * hasMultipleModelsPerProvider([MODEL_OPENAI_MEDIUM, MODEL_ANTHROPIC_LOW, MODEL_GOOGLE_MEDIUM]);
312
328
  * // Returns: false (each provider has only 1 model)
313
329
  *
314
330
  * // Basic plan with single model:
315
- * hasMultipleModelsPerProvider([MODEL_GPT5_NANO]);
331
+ * hasMultipleModelsPerProvider([MODEL_OPENAI_LOW]);
316
332
  * // Returns: false
317
333
  * ```
318
334
  *
@@ -449,8 +465,8 @@ export declare function isRealProvider(value: unknown): value is RealProvider;
449
465
  *
450
466
  * @example
451
467
  * ```ts
452
- * isReasoningModel(MODEL_GPT5); // Returns: true
453
- * isReasoningModel(MODEL_GEMINI_FLASH); // Returns: false
468
+ * isReasoningModel(MODEL_OPENAI_TOP); // Returns: true
469
+ * isReasoningModel(MODEL_GOOGLE_MEDIUM); // Returns: false
454
470
  * ```
455
471
  *
456
472
  */
@@ -481,13 +497,13 @@ export declare const MEMORY_CATEGORIES: readonly ["preference", "identity", "con
481
497
 
482
498
  export declare type MemoryCategory = (typeof MEMORY_CATEGORIES)[number];
483
499
 
484
- export declare const MODEL_CHAT_SUMMARY = "gpt-5.4-nano";
500
+ export declare const MODEL_ANTHROPIC_LOW = "claude-haiku-4-5";
485
501
 
486
- export declare const MODEL_CLAUDE_HAIKU = "claude-haiku-4-5";
502
+ export declare const MODEL_ANTHROPIC_MEDIUM = "claude-sonnet-5";
487
503
 
488
- export declare const MODEL_CLAUDE_OPUS = "claude-opus-4-8";
504
+ export declare const MODEL_ANTHROPIC_TOP = "claude-opus-4-8";
489
505
 
490
- export declare const MODEL_CLAUDE_SONNET = "claude-sonnet-5";
506
+ export declare const MODEL_CHAT_SUMMARY = "gpt-5.4-nano";
491
507
 
492
508
  export declare const MODEL_DEV = "openai/gpt-oss-20b:free";
493
509
 
@@ -499,20 +515,20 @@ export declare const MODEL_DISPLAY_NAMES: Record<string, string>;
499
515
 
500
516
  export declare const MODEL_EMBEDDING_TEXT = "text-embedding-3-small";
501
517
 
502
- export declare const MODEL_GEMINI_FLASH = "gemini-3-flash-preview";
518
+ export declare const MODEL_GENERATE_IMAGE = "gemini-3-pro-image";
503
519
 
504
- export declare const MODEL_GEMINI_PRO = "gemini-3.1-pro-preview";
520
+ export declare const MODEL_GOOGLE_MEDIUM = "gemini-3.5-flash-lite";
505
521
 
506
- export declare const MODEL_GENERATE_IMAGE = "gemini-3-pro-image";
522
+ export declare const MODEL_GOOGLE_TOP = "gemini-3.6-flash";
507
523
 
508
524
  /**
509
- * List of available models TODAY.
525
+ * The humanizer's rewrite pass needs a model that supports a high temperature
526
+ * and is fast; the Lite tier is too weak for it. It gets its own slot rather
527
+ * than borrowing a picker tier, so swapping the Google catalog can never
528
+ * silently move it (it previously rode MODEL_GOOGLE_MEDIUM and was downgraded
529
+ * to Flash-Lite by exactly that).
510
530
  */
511
- export declare const MODEL_GPT5 = "gpt-5.6-terra";
512
-
513
- export declare const MODEL_GPT5_MINI = "gpt-5.4-mini";
514
-
515
- export declare const MODEL_GPT5_NANO = "gpt-5.4-nano";
531
+ export declare const MODEL_HUMANIZE_REWRITE = "gemini-3.6-flash";
516
532
 
517
533
  /**
518
534
  * Bumped nano→mini (Track 2 T7): memory extraction now emits structured
@@ -521,6 +537,42 @@ export declare const MODEL_GPT5_NANO = "gpt-5.4-nano";
521
537
  */
522
538
  export declare const MODEL_MEMORY_INFERENCE = "gpt-5.4-mini";
523
539
 
540
+ export declare const MODEL_OPENAI_LOW = "gpt-5.4-nano";
541
+
542
+ export declare const MODEL_OPENAI_MEDIUM = "gpt-5.4-mini";
543
+
544
+ /**
545
+ * List of available models TODAY.
546
+ *
547
+ * The user-selectable catalog models are named MODEL_<PROVIDER>_<TIER>, where
548
+ * the tier is relative WITHIN that provider rather than an absolute capability
549
+ * claim. Rungs fill from the top, so a provider offering two models uses TOP
550
+ * and MEDIUM and leaves LOW unused. The name is a stable slot: bumping a model
551
+ * swaps the value here (plus its display name, pricing row, and prefix match)
552
+ * and never renames the symbol, so a vendor moving its brand lines around
553
+ * cannot strand a name like MODEL_GEMINI_PRO on a Flash model.
554
+ *
555
+ * Two deliberate exceptions follow the catalog: the Perplexity ids are legacy
556
+ * and not user-selectable, and the role-purpose slots (MODEL_MEMORY_INFERENCE,
557
+ * MODEL_CHAT_SUMMARY, MODEL_SEARCH_DECOMPOSER, MODEL_HUMANIZE_REWRITE,
558
+ * MODEL_EMBEDDING_TEXT, MODEL_GENERATE_IMAGE, MODEL_TEACHER, MODEL_DEV) are
559
+ * named for the job they do rather than a provider tier, so a bump there never
560
+ * renames them either. Anything that needs a specific model for a specific job
561
+ * belongs in that group, NOT pointed at a picker tier whose value can move.
562
+ *
563
+ */
564
+ export declare const MODEL_OPENAI_TOP = "gpt-5.6-terra";
565
+
566
+ /**
567
+ * Pseudo-model id for the Perplexity Search API (getWebSearch). Deliberately
568
+ * does NOT start with "sonar": the pricing prefix-fallback would otherwise bill
569
+ * this token-less, flat-per-request endpoint at the sonar token rate. Search
570
+ * cost is tracked out-of-band via a Prometheus request counter, not through the
571
+ * token usage pipeline, so its pricing row is priced at zero (see
572
+ * modelPricing).
573
+ */
574
+ export declare const MODEL_PERPLEXITY_SEARCH = "perplexity-search";
575
+
524
576
  export declare const MODEL_SEARCH_DECOMPOSER = "gpt-5.4-mini";
525
577
 
526
578
  export declare const MODEL_SONAR = "sonar";
@@ -531,12 +583,19 @@ export declare const MODEL_TEACHER = "mistral-large-latest";
531
583
 
532
584
  /**
533
585
  * List of models available according to the providers.
586
+ *
587
+ * Array order is load-bearing and is NOT sorted by tier: index [0] is the
588
+ * per-provider fallback default in getModelNameForPlan (server providers.ts).
589
+ * Google deliberately defaults to MEDIUM, and Anthropic lists LOW before
590
+ * MEDIUM. Re-sorting these to match the TOP/MEDIUM/LOW names would silently
591
+ * change which model a user falls back to.
592
+ *
534
593
  */
535
594
  export declare const MODELS_PER_PROVIDER: {
536
595
  readonly OpenAI: readonly ["gpt-5.6-terra", "gpt-5.4-mini", "gpt-5.4-nano"];
537
596
  readonly Anthropic: readonly ["claude-opus-4-8", "claude-haiku-4-5", "claude-sonnet-5"];
538
- readonly Google: readonly ["gemini-3-flash-preview", "gemini-3.1-pro-preview"];
539
- readonly Perplexity: readonly ["sonar", "sonar-pro"];
597
+ readonly Google: readonly ["gemini-3.5-flash-lite", "gemini-3.6-flash"];
598
+ readonly Perplexity: readonly ["sonar", "sonar-pro", "perplexity-search"];
540
599
  };
541
600
 
542
601
  /**
@@ -605,14 +664,13 @@ export declare const ROLE_SYSTEM = "system";
605
664
  export declare const ROLE_USER = "user";
606
665
 
607
666
  /**
608
- * Per-sub-query deadline for the parallel search fan-out. sonar-pro routinely
609
- * takes 14-22s to answer a decomposed query (it runs its own search + synthesis
610
- * with medium context), so a tighter bound kills every sub-query before the
611
- * provider responds and the whole search reports a false failure. 30s leaves
612
- * headroom over the observed tail while still bounding a genuinely hung
613
- * request.
667
+ * Per-sub-query deadline for the parallel search fan-out. The Perplexity Search
668
+ * API returns in ~1s (measured p100 ~1.4s over the migration spike), far below
669
+ * the 14-22s the retired sonar-pro chat model took, so the old 30s bound is now
670
+ * mostly a hang-detector. 10s leaves generous headroom over the observed tail
671
+ * while stopping a genuinely stuck request from holding the chat turn.
614
672
  */
615
- export declare const SEARCH_QUERY_TIMEOUT_MS = 30000;
673
+ export declare const SEARCH_QUERY_TIMEOUT_MS = 10000;
616
674
 
617
675
  /**
618
676
  * Sort capabilities are shared across client and server.
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 r,n=((r={})[r.NewChat=0]="NewChat",r[r.Prompts=1]="Prompts",r[r.Attachment=2]="Attachment",r[r.PrivateChat=3]="PrivateChat",r[r.Send=4]="Send",r[r.Header=5]="Header",r[r.Provider=6]="Provider",r[r.Logo=7]="Logo",r[r.Placeholder=8]="Placeholder",r[r.Footer=9]="Footer",r);let i="system",O="user",o="assistant",a="OpenAI",_="Anthropic",s="Google",R="Summary",T="Memory",A="Perplexity",l="Mistral",I=a,M=[a,_,s],S="gpt-5.6-terra",L="gpt-5.4-mini",P="gpt-5.4-nano",g="claude-opus-4-8",N="claude-sonnet-5",d="claude-haiku-4-5",D="gemini-3-flash-preview",c="gemini-3.1-pro-preview",u="sonar",C="sonar-pro",h="openai/gpt-oss-20b:free",p="mistral-large-latest",m="gpt-5.4-mini",G="gpt-5.4-nano",H="gpt-5.4-mini",f="text-embedding-3-small",U="gemini-3-pro-image",y=5,Y=3e4,B={[S]:"GPT-5.6 Terra",[L]:"GPT-5.4 Mini",[P]:"GPT-5.4 Nano",[g]:"Claude Opus 4.8",[N]:"Claude Sonnet 5",[d]:"Claude Haiku 4.5",[c]:"Gemini 3.1 Pro",[D]:"Gemini 3 Flash",[u]:"Sonar",[C]:"Sonar Pro",[U]:"Nano Banana 3 Pro",[p]:"Mistral Large"},b=[S,L,P,g,N,d,D,c,U],v=[S,L,P,g,N,c],F={[a]:[S,L,P],[_]:[g,d,N],[s]:[D,c],[A]:[u,C]},w={[a]:[i,O,o],[_]:[O,o],[R]:[O,o],[T]:[O,o],[s]:[O,o],[A]:[O,o],[l]:[O,o]},V={[_]:["claude-opus-4","claude-sonnet-5","claude-sonnet-4","claude-haiku-4","claude-3"],[a]:["gpt-","o3","o4"],[s]:["gemini"],[A]:["sonar"],[l]:["mistral"]},X="x-diggidy-chat-id",k="x-diggidy-chat-timestamp",W="complete",x="timestamp",K="tokenUsage",z="Diggidy",Z="sassy:basic",j="sassy:plus",Q="sassy:advanced",$={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",CODEINTERPRETER:"addon:codeinterpreter",SHARE_CHAT:"addon:share-chat"}},q={code_interpreter:"Running code...",web_search:"Searching the web...",[$.TOOL.WEATHER]:"Checking the weather...",[$.TOOL.POLLUTION]:"Fetching air pollution data...",[$.TOOL.BUNDLESIZE]:"Analyzing bundle size...",[$.TOOL.URLCONTENTPARSER]:"Reading a webpage...",[$.TOOL.WEBSEARCH]:"Searching the web...",[$.TOOL.GITREPOSITORY]:"Looking up repository...",[$.TOOL.HOTELS]:"Searching for hotels...",[$.TOOL.NUTRITION_FACTS]:"Fetching nutrition facts...",[$.TOOL.GENERATE_IMAGE]:"Generating image...",[$.TOOL.BARCODE]:"Looking up product...",[$.TOOL.PRONUNCIATION]:"Generating pronunciation...",[$.TOOL.HUMANIZE]:"Rewriting text...",[$.TOOL.IMAGES]:"Searching for images..."},J="Using tools...",ee=5e4,et=1e5,eE=8e5;function er(e){return e===Q?eE:et}let en=16384,ei=4,eO=3,eo="context-compression-summary",ea=new Set(["OpenAI",_,"Google",l]);function e_(e){return"string"==typeof e&&ea.has(e)}let es=/^auto \((.+)\)$/;function eR(e){let t=e.match(es);return t?t[1]:e}let eT=e=>{for(let[t,E]of Object.entries(V))if(E.some(t=>e.startsWith(t)))return t;return null},eA=e=>{if(!e||0===e.length)return[];let t=new Set;for(let E of e)for(let[e,r]of Object.entries(F))r.includes(E)&&("OpenAI"===e||e===_||"Google"===e)&&t.add(e);return M.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,r]of Object.entries(F))if(r.includes(E)){t.has(e)||t.set(e,[]),t.get(e)?.push(E);break}return t},eI=e=>{for(let t of el(e).values())if(t.length>1)return!0;return!1},eM=(e,t)=>!!e&&!!t&&0!==t.length&&t.includes(e);function eS(e,t,E){if(!t||Array.isArray(t)&&0===t.length)return!0;let r=e instanceof Set?e:e?new Set(e):null;return!!r&&0!==r.size&&("string"==typeof t?r.has(t):E?.any===!0?t.some(e=>r.has(e)):t.every(e=>r.has(e)))}function eL(e){return v.includes(e)}export{b as ALL_MODELS,M as ALL_PROVIDERS,v as ALL_REASONING_MODELS,z as APPLICATION_NAME,V as APPROXIMATE_MODELS_PER_PROVIDER,$ as CAPABILITIES,W as CHAT_COMPLETION_MARKER_KEY,et as CONTEXT_COMPRESSION_EMERGENCY_THRESHOLD,eE as CONTEXT_COMPRESSION_EMERGENCY_THRESHOLD_PREMIUM,eO as CONTEXT_COMPRESSION_KEEP_IMAGES,ei as CONTEXT_COMPRESSION_KEEP_RECENT,eo as CONTEXT_COMPRESSION_SUMMARY_ID,ee as CONTEXT_COMPRESSION_THRESHOLD,I as DEFAULT_PROVIDER,J as DEFAULT_TOOL_LOADING_LABEL,X as DIGGIDY_CHAT_ID_HEADER,k as DIGGIDY_CHAT_TIMESTAMP_HEADER,t as HARD_CATEGORIES,en as MAX_OUTPUT_TOKENS,y as MAX_SEARCH_QUERIES,e as MEMORY_CATEGORIES,F as MODELS_PER_PROVIDER,G as MODEL_CHAT_SUMMARY,d as MODEL_CLAUDE_HAIKU,g as MODEL_CLAUDE_OPUS,N as MODEL_CLAUDE_SONNET,h as MODEL_DEV,B as MODEL_DISPLAY_NAMES,f as MODEL_EMBEDDING_TEXT,D as MODEL_GEMINI_FLASH,c as MODEL_GEMINI_PRO,U as MODEL_GENERATE_IMAGE,S as MODEL_GPT5,L as MODEL_GPT5_MINI,P as MODEL_GPT5_NANO,m as MODEL_MEMORY_INFERENCE,H as MODEL_SEARCH_DECOMPOSER,u as MODEL_SONAR,C as MODEL_SONAR_PRO,p as MODEL_TEACHER,Z as PLAN_BASIC,j as PLAN_PLUS,Q as PLAN_PREMIUM,_ as PROVIDER_ANTHROPIC,s as PROVIDER_GOOGLE,T as PROVIDER_MEMORY,l as PROVIDER_MISTRAL,a as PROVIDER_OPENAI,A as PROVIDER_PERPLEXITY,w as PROVIDER_ROLE_MAP,R as PROVIDER_SUMMARY,o as ROLE_ASSISTANT,i as ROLE_SYSTEM,O as ROLE_USER,Y as SEARCH_QUERY_TIMEOUT_MS,x as SORT_BY_TIMESTAMP,K as SORT_BY_TOKEN_USAGE,q as TOOL_LOADING_LABELS,eT as findProvider,er as getCompressionEmergencyThreshold,el as getModelsGroupedByProvider,eA as getProvidersFromModels,eI as hasMultipleModelsPerProvider,eS as isEntitled,E as isHardCategory,eM as isModelAllowedForPlan,e_ as isRealProvider,eL as isReasoningModel,eR 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",R="Google",s="Summary",T="Memory",A="Perplexity",l="Mistral",M=a,I=[a,_,R],L="gpt-5.6-terra",P="gpt-5.4-mini",S="gpt-5.4-nano",g="claude-opus-4-8",N="claude-sonnet-5",D="claude-haiku-4-5",d="gemini-3.6-flash",c="gemini-3.5-flash-lite",u="sonar",C="sonar-pro",h="perplexity-search",p="openai/gpt-oss-20b:free",m="mistral-large-latest",G="gpt-5.4-mini",H="gpt-5.4-nano",f="gpt-5.4-mini",U="gemini-3.6-flash",y="text-embedding-3-small",Y="gemini-3-pro-image",B=5,b=1e4,F={[L]:"GPT-5.6 Terra",[P]:"GPT-5.4 Mini",[S]:"GPT-5.4 Nano",[g]:"Claude Opus 4.8",[N]:"Claude Sonnet 5",[D]:"Claude Haiku 4.5",[d]:"Gemini 3.6 Flash",[c]:"Gemini 3.5 Flash-Lite",[u]:"Sonar",[C]:"Sonar Pro",[h]:"Perplexity Search",[Y]:"Nano Banana 3 Pro",[m]:"Mistral Large"},v=[L,P,S,g,N,D,c,d,Y],w=[L,P,S,g,N,d,c],V={[a]:[L,P,S],[_]:[g,D,N],[R]:[c,d],[A]:[u,C,h]},X={[a]:[r,i,o],[_]:[i,o],[s]:[i,o],[T]:[i,o],[R]:[i,o],[A]:[i,o],[l]:[i,o]},W={[_]:["claude-opus-4","claude-sonnet-5","claude-sonnet-4","claude-haiku-4","claude-3"],[a]:["gpt-","o3","o4"],[R]:["gemini"],[A]:["sonar"],[l]:["mistral"]},x="x-diggidy-chat-id",k="x-diggidy-chat-timestamp",K="complete",z="timestamp",Z="tokenUsage",j="Diggidy",Q="sassy:basic",$="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",CODEINTERPRETER:"addon:codeinterpreter",SHARE_CHAT:"addon:share-chat"}},ee={code_interpreter:"Running code...",web_search:"Searching the web...",[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..."},et="Using tools...",eE=5e4,eO=1e5,en=8e5;function er(e){return e===q?en:eO}let ei=16384,eo=4,ea=3,e_="context-compression-summary",eR=new Set(["OpenAI",_,"Google",l]);function es(e){return"string"==typeof e&&eR.has(e)}let eT=/^auto \((.+)\)$/;function eA(e){let t=e.match(eT);return t?t[1]:e}let el=e=>{for(let[t,E]of Object.entries(W))if(E.some(t=>e.startsWith(t)))return t;return null},eM=e=>{if(!e||0===e.length)return[];let t=new Set;for(let E of e)for(let[e,O]of Object.entries(V))O.includes(E)&&("OpenAI"===e||e===_||"Google"===e)&&t.add(e);return I.filter(e=>t.has(e))},eI=e=>{let t=new Map;if(!e||0===e.length)return t;for(let E of e)for(let[e,O]of Object.entries(V))if(O.includes(E)){t.has(e)||t.set(e,[]),t.get(e)?.push(E);break}return t},eL=e=>{for(let t of eI(e).values())if(t.length>1)return!0;return!1},eP=(e,t)=>!!e&&!!t&&0!==t.length&&t.includes(e);function eS(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 eg(e){return w.includes(e)}export{v as ALL_MODELS,I as ALL_PROVIDERS,w as ALL_REASONING_MODELS,j as APPLICATION_NAME,W as APPROXIMATE_MODELS_PER_PROVIDER,J as CAPABILITIES,K as CHAT_COMPLETION_MARKER_KEY,eO as CONTEXT_COMPRESSION_EMERGENCY_THRESHOLD,en as CONTEXT_COMPRESSION_EMERGENCY_THRESHOLD_PREMIUM,ea as CONTEXT_COMPRESSION_KEEP_IMAGES,eo as CONTEXT_COMPRESSION_KEEP_RECENT,e_ as CONTEXT_COMPRESSION_SUMMARY_ID,eE as CONTEXT_COMPRESSION_THRESHOLD,M as DEFAULT_PROVIDER,et as DEFAULT_TOOL_LOADING_LABEL,x as DIGGIDY_CHAT_ID_HEADER,k as DIGGIDY_CHAT_TIMESTAMP_HEADER,t as HARD_CATEGORIES,ei as MAX_OUTPUT_TOKENS,B as MAX_SEARCH_QUERIES,e as MEMORY_CATEGORIES,V as MODELS_PER_PROVIDER,D as MODEL_ANTHROPIC_LOW,N as MODEL_ANTHROPIC_MEDIUM,g as MODEL_ANTHROPIC_TOP,H as MODEL_CHAT_SUMMARY,p as MODEL_DEV,F as MODEL_DISPLAY_NAMES,y as MODEL_EMBEDDING_TEXT,Y as MODEL_GENERATE_IMAGE,c as MODEL_GOOGLE_MEDIUM,d as MODEL_GOOGLE_TOP,U as MODEL_HUMANIZE_REWRITE,G as MODEL_MEMORY_INFERENCE,S as MODEL_OPENAI_LOW,P as MODEL_OPENAI_MEDIUM,L as MODEL_OPENAI_TOP,h as MODEL_PERPLEXITY_SEARCH,f as MODEL_SEARCH_DECOMPOSER,u as MODEL_SONAR,C as MODEL_SONAR_PRO,m as MODEL_TEACHER,Q as PLAN_BASIC,$ as PLAN_PLUS,q as PLAN_PREMIUM,_ as PROVIDER_ANTHROPIC,R as PROVIDER_GOOGLE,T as PROVIDER_MEMORY,l as PROVIDER_MISTRAL,a as PROVIDER_OPENAI,A as PROVIDER_PERPLEXITY,X as PROVIDER_ROLE_MAP,s as PROVIDER_SUMMARY,o as ROLE_ASSISTANT,r as ROLE_SYSTEM,i as ROLE_USER,b as SEARCH_QUERY_TIMEOUT_MS,z as SORT_BY_TIMESTAMP,Z as SORT_BY_TOKEN_USAGE,ee as TOOL_LOADING_LABELS,el as findProvider,er as getCompressionEmergencyThreshold,eI as getModelsGroupedByProvider,eM as getProvidersFromModels,eL as hasMultipleModelsPerProvider,eS as isEntitled,E as isHardCategory,eP as isModelAllowedForPlan,es as isRealProvider,eg 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.46.0",
3
+ "version": "4.48.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": "562106b618d254e47dee7db2ec4f1f5ce8791667"
35
+ "gitHead": "17673edb51a6d532a5fd1d5018245fbbf16c8cb7"
36
36
  }