@versini/sassysaint-common 4.67.0 → 4.69.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.
@@ -1 +1 @@
1
- export*from"./memory.js";export*from"./theme-types.js";let E="system",e="user",O="assistant",_="OpenAI",T="Anthropic",R="Google",S="Summary",t="Memory",a="Perplexity",A=_,I=[_,T,R],L="gpt-6.1-sol",i="gpt-6-luna",s="claude-opus-5-5",n="claude-sonnet-5-5",P="claude-haiku-5-5",N="gemini-3.8-flash",o="gemini-3.5-flash-lite",M="sonar",r="sonar-pro",D="perplexity-search",g="openai/gpt-oss-20b:free",C="claude-haiku-5-5",u="gpt-6-luna",l="gemini-3.5-flash-lite",c="gemini-3.8-flash",h="gpt-6.1-sol",U="gpt-6-luna",d="gpt-5.6-luna",m="gemini-3.6-flash",p="text-embedding-3-small",G="gpt-image-2.5-sunburst",H=5,y=1e4,B=3e3,Y={[L]:"GPT-6.1 Sol",[i]:"GPT-6 Luna",[s]:"Claude Opus 5.5",[n]:"Claude Sonnet 5.5",[P]:"Claude Haiku 5.5",[N]:"Gemini 3.8 Flash",[o]:"Gemini 3.5 Flash-Lite",[M]:"Sonar",[r]:"Sonar Pro",[D]:"Perplexity Search",[G]:"GPT Image 2.5 Sunburst"},F=[L,i,s,n,P,o,N,G],f=[L,i,s,n,P,N,o],V="fast",b="balanced",W="thorough",X=[V,b,W],k={[V]:"low",[b]:"medium",[W]:"high"},w={[_]:V,[T]:b,[R]:V},x="none",K=["settings","shortcuts","memories","history","usage","about"],Z={[_]:[L,i],[T]:[s,P,n],[R]:[o,N],[a]:[M,r,D]},v={[_]:[E,e,O],[T]:[e,O],[S]:[e,O],[t]:[e,O],[R]:[e,O],[a]:[e,O]},z={[T]:["claude-opus-5","claude-opus-4","claude-sonnet-5","claude-sonnet-4","claude-haiku-5","claude-haiku-4","claude-3"],[_]:["gpt-","o3","o4"],[R]:["gemini"],[a]:["sonar"]},Q="x-diggidy-chat-id",j="x-diggidy-chat-timestamp",q="complete",J="timestamp",$="tokenUsage",EE="Diggidy",Ee="sassy:basic",EO="sassy:plus",E_="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",NEWS_BRIEF:"getNewsBrief",PRODUCTS:"getProducts",REVIEW_TRUST:"getReviewTrust",STREAMING_PICKS:"getStreamingPicks",PRONUNCIATION:"getPronunciation",FRENCH_TEACHINGS:"getFrenchTeachings",PAST_CHATS:"searchPastChats"},ADDON:{ATTACHMENTS:"addon:attachments",CODEINTERPRETER:"addon:codeinterpreter",SHARE_CHAT:"addon:share-chat"}},ER={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.NEWS_BRIEF]:"Reading today's news...",[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...",[ET.TOOL.PAST_CHATS]:"Searching your past chats..."},ES="Using tools...",Et=1e5,Ea=8e5;function EA(E){return E===E_?Ea:Et}let EI=16384,EL=4,Ei=3,Es=8388608,En="context-compression-summary",EP="data-urlRead",EN="[Note from the system: you read";export{F as ALL_MODELS,I as ALL_PROVIDERS,f as ALL_REASONING_MODELS,EE as APPLICATION_NAME,z as APPROXIMATE_MODELS_PER_PROVIDER,ET as CAPABILITIES,q as CHAT_COMPLETION_MARKER_KEY,Et as CONTEXT_COMPRESSION_EMERGENCY_THRESHOLD,Ea as CONTEXT_COMPRESSION_EMERGENCY_THRESHOLD_PREMIUM,Ei as CONTEXT_COMPRESSION_KEEP_IMAGES,EL as CONTEXT_COMPRESSION_KEEP_RECENT,Es as CONTEXT_COMPRESSION_MAX_DOCUMENT_BYTES,En as CONTEXT_COMPRESSION_SUMMARY_ID,A as DEFAULT_PROVIDER,w as DEFAULT_RESPONSE_SPEED,ES as DEFAULT_TOOL_LOADING_LABEL,Q as DIGGIDY_CHAT_ID_HEADER,j as DIGGIDY_CHAT_TIMESTAMP_HEADER,EI as MAX_OUTPUT_TOKENS,H as MAX_SEARCH_QUERIES,Z as MODELS_PER_PROVIDER,P as MODEL_ANTHROPIC_LOW,n as MODEL_ANTHROPIC_MEDIUM,s as MODEL_ANTHROPIC_TOP,u as MODEL_CHAT_SUMMARY,g as MODEL_DEV,Y as MODEL_DISPLAY_NAMES,p as MODEL_EMBEDDING_TEXT,G as MODEL_GENERATE_IMAGE,o as MODEL_GOOGLE_MEDIUM,N as MODEL_GOOGLE_TOP,h as MODEL_HUMANIZE_AUDIT,c as MODEL_HUMANIZE_REWRITE,C as MODEL_MEMORY_INFERENCE,U as MODEL_NUTRITION_SEARCH,i as MODEL_OPENAI_MEDIUM,L as MODEL_OPENAI_TOP,D as MODEL_PERPLEXITY_SEARCH,d as MODEL_REVIEW_TRUST_PANEL,m as MODEL_REVIEW_TRUST_PANEL_GOOGLE,l as MODEL_SEARCH_DECOMPOSER,M as MODEL_SONAR,r as MODEL_SONAR_PRO,Ee as PLAN_BASIC,EO as PLAN_PLUS,E_ as PLAN_PREMIUM,T as PROVIDER_ANTHROPIC,R as PROVIDER_GOOGLE,t as PROVIDER_MEMORY,_ as PROVIDER_OPENAI,a as PROVIDER_PERPLEXITY,v as PROVIDER_ROLE_MAP,S as PROVIDER_SUMMARY,x as QUICK_ACCESS_NONE,K as QUICK_ACCESS_PANELS,X as RESPONSE_SPEEDS,b as RESPONSE_SPEED_BALANCED,V as RESPONSE_SPEED_FAST,W as RESPONSE_SPEED_THOROUGH,k as RESPONSE_SPEED_TO_EFFORT,O as ROLE_ASSISTANT,E as ROLE_SYSTEM,e as ROLE_USER,B as SEARCH_DECOMPOSE_TIMEOUT_MS,y as SEARCH_QUERY_TIMEOUT_MS,J as SORT_BY_TIMESTAMP,$ as SORT_BY_TOKEN_USAGE,ER as TOOL_LOADING_LABELS,EN as URL_READ_NOTE_PREFIX,EP as URL_READ_PART_TYPE,EA as getCompressionEmergencyThreshold};
1
+ export*from"./memory.js";export*from"./theme-types.js";let E="system",e="user",O="assistant",_="OpenAI",T="Anthropic",R="Google",S="Summary",t="Memory",a="Perplexity",A=_,I=[_,T,R],L="gpt-6.1-sol",i="gpt-6-luna",s="claude-opus-5-5",n="claude-sonnet-5-5",P="claude-haiku-5-5",N="gemini-3.8-flash",o="gemini-3.5-flash-lite",M="sonar",r="sonar-pro",D="perplexity-search",g="openai/gpt-oss-20b:free",C="claude-haiku-5-5",u="gpt-6-luna",l="gemini-3.5-flash-lite",c="gemini-3.8-flash",h="gpt-6.1-sol",U="gpt-6-luna",d="gpt-5.6-luna",m="gemini-3.6-flash",p="text-embedding-3-small",G="gpt-image-2.5-sunburst",H=5,y=1e4,B=3e3,Y={[L]:"GPT-6.1 Sol",[i]:"GPT-6 Luna",[s]:"Claude Opus 5.5",[n]:"Claude Sonnet 5.5",[P]:"Claude Haiku 5.5",[N]:"Gemini 3.8 Flash",[o]:"Gemini 3.5 Flash-Lite",[M]:"Sonar",[r]:"Sonar Pro",[D]:"Perplexity Search",[G]:"GPT Image 2.5 Sunburst"},F=[L,i,s,n,P,o,N,G],f=[L,i,s,n,P,N,o],V="fast",W="balanced",b="thorough",X=[V,W,b],k={[V]:"low",[W]:"medium",[b]:"high"},w={[_]:V,[T]:W,[R]:V},x="none",K=["settings","shortcuts","memories","history","usage","about"],Z={[_]:[L,i],[T]:[s,P,n],[R]:[o,N],[a]:[M,r,D]},v={[_]:[E,e,O],[T]:[e,O],[S]:[e,O],[t]:[e,O],[R]:[e,O],[a]:[e,O]},z={[T]:["claude-opus-5","claude-opus-4","claude-sonnet-5","claude-sonnet-4","claude-haiku-5","claude-haiku-4","claude-3"],[_]:["gpt-","o3","o4"],[R]:["gemini"],[a]:["sonar"]},Q="x-diggidy-chat-id",j="x-diggidy-chat-timestamp",q="complete",J="timestamp",$="tokenUsage",EE="Diggidy",Ee="sassy:basic",EO="sassy:plus",E_="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",NEWS_BRIEF:"getNewsBrief",PRODUCTS:"getProducts",REVIEW_TRUST:"getReviewTrust",STREAMING_PICKS:"getStreamingPicks",PRONUNCIATION:"getPronunciation",FRENCH_TEACHINGS:"getFrenchTeachings",PAST_CHATS:"searchPastChats"},ADDON:{ATTACHMENTS:"addon:attachments",CODEINTERPRETER:"addon:codeinterpreter",SHARE_CHAT:"addon:share-chat"}},ER={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.NEWS_BRIEF]:"Reading today's news...",[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...",[ET.TOOL.PAST_CHATS]:"Searching your past chats..."},ES="Using tools...",Et=1e5,Ea=8e5;function EA(E){return E===E_?Ea:Et}let EI=16384,EL=4,Ei=3,Es=8388608,En="context-compression-summary",EP="data-urlRead",EN="[Note from the system: you read",Eo="data-newsLinks";export{F as ALL_MODELS,I as ALL_PROVIDERS,f as ALL_REASONING_MODELS,EE as APPLICATION_NAME,z as APPROXIMATE_MODELS_PER_PROVIDER,ET as CAPABILITIES,q as CHAT_COMPLETION_MARKER_KEY,Et as CONTEXT_COMPRESSION_EMERGENCY_THRESHOLD,Ea as CONTEXT_COMPRESSION_EMERGENCY_THRESHOLD_PREMIUM,Ei as CONTEXT_COMPRESSION_KEEP_IMAGES,EL as CONTEXT_COMPRESSION_KEEP_RECENT,Es as CONTEXT_COMPRESSION_MAX_DOCUMENT_BYTES,En as CONTEXT_COMPRESSION_SUMMARY_ID,A as DEFAULT_PROVIDER,w as DEFAULT_RESPONSE_SPEED,ES as DEFAULT_TOOL_LOADING_LABEL,Q as DIGGIDY_CHAT_ID_HEADER,j as DIGGIDY_CHAT_TIMESTAMP_HEADER,EI as MAX_OUTPUT_TOKENS,H as MAX_SEARCH_QUERIES,Z as MODELS_PER_PROVIDER,P as MODEL_ANTHROPIC_LOW,n as MODEL_ANTHROPIC_MEDIUM,s as MODEL_ANTHROPIC_TOP,u as MODEL_CHAT_SUMMARY,g as MODEL_DEV,Y as MODEL_DISPLAY_NAMES,p as MODEL_EMBEDDING_TEXT,G as MODEL_GENERATE_IMAGE,o as MODEL_GOOGLE_MEDIUM,N as MODEL_GOOGLE_TOP,h as MODEL_HUMANIZE_AUDIT,c as MODEL_HUMANIZE_REWRITE,C as MODEL_MEMORY_INFERENCE,U as MODEL_NUTRITION_SEARCH,i as MODEL_OPENAI_MEDIUM,L as MODEL_OPENAI_TOP,D as MODEL_PERPLEXITY_SEARCH,d as MODEL_REVIEW_TRUST_PANEL,m as MODEL_REVIEW_TRUST_PANEL_GOOGLE,l as MODEL_SEARCH_DECOMPOSER,M as MODEL_SONAR,r as MODEL_SONAR_PRO,Eo as NEWS_LINKS_PART_TYPE,Ee as PLAN_BASIC,EO as PLAN_PLUS,E_ as PLAN_PREMIUM,T as PROVIDER_ANTHROPIC,R as PROVIDER_GOOGLE,t as PROVIDER_MEMORY,_ as PROVIDER_OPENAI,a as PROVIDER_PERPLEXITY,v as PROVIDER_ROLE_MAP,S as PROVIDER_SUMMARY,x as QUICK_ACCESS_NONE,K as QUICK_ACCESS_PANELS,X as RESPONSE_SPEEDS,W as RESPONSE_SPEED_BALANCED,V as RESPONSE_SPEED_FAST,b as RESPONSE_SPEED_THOROUGH,k as RESPONSE_SPEED_TO_EFFORT,O as ROLE_ASSISTANT,E as ROLE_SYSTEM,e as ROLE_USER,B as SEARCH_DECOMPOSE_TIMEOUT_MS,y as SEARCH_QUERY_TIMEOUT_MS,J as SORT_BY_TIMESTAMP,$ as SORT_BY_TOKEN_USAGE,ER as TOOL_LOADING_LABELS,EN as URL_READ_NOTE_PREFIX,EP as URL_READ_PART_TYPE,EA as getCompressionEmergencyThreshold};
package/dist/index.d.ts CHANGED
@@ -557,6 +557,8 @@ export declare const isHardCategory: (category: string) => boolean;
557
557
  */
558
558
  export declare const isModelAllowedForPlan: (selectedModel: string | undefined | null, allowedModels: string[]) => boolean;
559
559
 
560
+ export declare function isNewsImageUrl(value: unknown): value is string;
561
+
560
562
  /**
561
563
  * Runtime guard: true only for a real, SDK-instantiable provider literal.
562
564
  * Returns false for undefined, null, and anything else. Shared by the server
@@ -837,9 +839,19 @@ export declare const MODELS_PER_PROVIDER: {
837
839
  readonly Perplexity: readonly ["sonar", "sonar-pro", "perplexity-search"];
838
840
  };
839
841
 
842
+ /**
843
+ * UI message part that keeps a news brief's article links readable after a
844
+ * reload. getUrlContent may open a brief's links only while the getNewsBrief
845
+ * result is in the chat, and a saved chat does not keep tool results. The
846
+ * server persists the links the card showed as a message's `newsLinks`, and the
847
+ * client rebuilds this part from them when a chat is restored.
848
+ */
849
+ export declare const NEWS_LINKS_PART_TYPE = "data-newsLinks";
850
+
840
851
  export declare interface NewsBrief {
841
852
  asOf: string;
842
853
  note?: string;
854
+ place?: string;
843
855
  earlier?: {
844
856
  chatId: string;
845
857
  time: string;
@@ -854,6 +866,7 @@ export declare interface NewsBriefItem {
854
866
  title: string;
855
867
  summary: string;
856
868
  local: boolean;
869
+ image?: string;
857
870
  evidence: NewsEvidence[];
858
871
  commentary?: NewsCommentary[];
859
872
  }
@@ -872,6 +885,18 @@ export declare interface NewsEvidence {
872
885
  url: string;
873
886
  }
874
887
 
888
+ /**
889
+ * The news-links part for a persisted message's `newsLinks`, keeping only
890
+ * string entries, or none when no link is left. The server validates them again
891
+ * before trusting them.
892
+ */
893
+ export declare function newsLinkParts(newsLinks: unknown): {
894
+ type: string;
895
+ data: {
896
+ urls: string[];
897
+ };
898
+ }[];
899
+
875
900
  export declare interface NewsOnThisDay {
876
901
  title: string;
877
902
  url: string;
@@ -905,6 +930,13 @@ export declare const PLAN_PLUS = "sassy:plus";
905
930
 
906
931
  export declare const PLAN_PREMIUM = "sassy:advanced";
907
932
 
933
+ /**
934
+ * The accessible name of a post's "Read the post" link, on the chat card and
935
+ * the shared page alike: the visible text first, then the title and newsletter,
936
+ * so two posts with the same title still read as different links.
937
+ */
938
+ export declare function postLinkName(post: NewsCommentary): string;
939
+
908
940
  export declare const PROVIDER_ANTHROPIC = "Anthropic";
909
941
 
910
942
  export declare const PROVIDER_GOOGLE = "Google";
@@ -1065,6 +1097,25 @@ export declare const SORT_BY_TOKEN_USAGE = "tokenUsage";
1065
1097
  */
1066
1098
  export declare function stripAutoWrapper(modelName: string): string;
1067
1099
 
1100
+ /**
1101
+ * The follow-up a news card's "Tell me more" sends, and how the server tells it
1102
+ * apart from words the user typed.
1103
+ *
1104
+ * The story title is written by the model from third-party headlines, yet the
1105
+ * follow-up goes out as a user message, and the server grants a user's words
1106
+ * authority: a domain in them becomes a site getUrlContent may read
1107
+ * (buildAllowedHostSet), and memory extraction quotes them as the user's own.
1108
+ * So the title travels in one fixed form, between curly quotes, and
1109
+ * withoutCardQuote drops it wherever user text carries that authority. The chat
1110
+ * still shows the headline.
1111
+ *
1112
+ */
1113
+ /**
1114
+ * The follow-up for one story: its title on one line, without curly quotes and
1115
+ * cut to MAX_TITLE_LENGTH characters, so it always matches CARD_FOLLOW_UP_RE.
1116
+ */
1117
+ export declare function tellMeMorePrompt(title: string): string;
1118
+
1068
1119
  /**
1069
1120
  * Complete theme palette. This is the structure sent from the server to the
1070
1121
  * client via getUserPreferences.
@@ -1082,6 +1133,18 @@ export declare interface ThemePalette {
1082
1133
  normal: Palette;
1083
1134
  }
1084
1135
 
1136
+ /**
1137
+ * The news-links part for a message's brief links. The single builder of that
1138
+ * shape, shared by the server, which also reads it back, and the client, which
1139
+ * rebuilds it from stored `newsLinks`.
1140
+ */
1141
+ export declare function toNewsLinksPart(urls: string[]): {
1142
+ type: string;
1143
+ data: {
1144
+ urls: string[];
1145
+ };
1146
+ };
1147
+
1085
1148
  /**
1086
1149
  * Static loading labels for tool activity display. Generator tools override
1087
1150
  * these with contextual text (e.g., "Analyzing bundle size for lodash...").
@@ -1124,4 +1187,11 @@ export declare interface UrlReadRecord {
1124
1187
  partial: boolean;
1125
1188
  }
1126
1189
 
1190
+ /**
1191
+ * A user message's text with a card follow-up's title removed, so only the
1192
+ * words the user chose keep their authority. Any other text is returned
1193
+ * unchanged.
1194
+ */
1195
+ export declare function withoutCardQuote(text: string): string;
1196
+
1127
1197
  export { }
@@ -0,0 +1 @@
1
+ let t="Tell me more about",e=RegExp(`^${t} “[^“”\\n]{1,200}”$`);function r(e){let r=e.replace(/[“”]/g,'"').replace(/\s+/g," ").trim().slice(0,200).trim()||"this story";return`${t} “${r}”`}function o(r){return e.test(r.trim())?`${t} a story`:r}export{r as tellMeMorePrompt,o as withoutCardQuote};
@@ -1 +1 @@
1
- import{ALL_MODELS as e,ALL_PROVIDERS as t,ALL_REASONING_MODELS as r,APPROXIMATE_MODELS_PER_PROVIDER as n,DEFAULT_RESPONSE_SPEED as l,MODELS_PER_PROVIDER as s,PROVIDER_ANTHROPIC as o,PROVIDER_GOOGLE as i,PROVIDER_OPENAI as u,QUICK_ACCESS_NONE as f,QUICK_ACCESS_PANELS as a,RESPONSE_SPEEDS as d}from"../constants/index.js";export*from"./newChatRequest.js";export*from"./newsBrief.js";export*from"./readUrlParts.js";let c=new Set([u,o,i]);function h(e){return"string"==typeof e&&c.has(e)}let p=/^auto \((.+)\)$/;function g(e){let t=e.match(p);return t?t[1]:e}let m=e=>{for(let[t,r]of Object.entries(n))if(r.some(t=>e.startsWith(t)))return t;return null},v=/image|embedding|tts|realtime|transcribe|audio/;function P(t,{matchUnknownByPrefix:r=!1}){for(let[e,r]of Object.entries(s))if(r.includes(t))return h(e)?e:null;if(!r||e.includes(t)||v.test(t))return null;let n=m(t);return h(n)?n:null}let w=(e,r={})=>{if(!e||0===e.length)return[];let n=new Set;for(let t of e){let e=P(t,r);e&&n.add(e)}return t.filter(e=>n.has(e))},y=(e,t={})=>{let r=new Map;if(!e||0===e.length)return r;for(let n of e){let e=P(n,t);e&&(r.has(e)||r.set(e,[]),r.get(e)?.push(n))}return r},M=(e,t={})=>{for(let r of y(e,t).values())if(r.length>1)return!0;return!1},j=(e,t)=>!!e&&!!t&&0!==t.length&&t.includes(e);function x(e,t,r){if(!t||Array.isArray(t)&&0===t.length)return!0;let n=e instanceof Set?e:e?new Set(e):null;return!!n&&0!==n.size&&("string"==typeof t?n.has(t):r?.any===!0?t.some(e=>n.has(e)):t.every(e=>n.has(e)))}function A(e){return r.includes(e)}function S(e){let t=t=>{let r=e?.[t];return d.includes(r)?r:l[t]};return{[u]:t(u),[o]:t(o),[i]:t(i)}}function b(e){return a.includes(e)?e:f}export{m as findProvider,y as getModelsGroupedByProvider,w as getProvidersFromModels,M as hasMultipleModelsPerProvider,x as isEntitled,j as isModelAllowedForPlan,h as isRealProvider,A as isReasoningModel,b as resolveQuickAccess,S as resolveResponseSpeed,g as stripAutoWrapper};
1
+ import{ALL_MODELS as e,ALL_PROVIDERS as t,ALL_REASONING_MODELS as r,APPROXIMATE_MODELS_PER_PROVIDER as n,DEFAULT_RESPONSE_SPEED as l,MODELS_PER_PROVIDER as o,PROVIDER_ANTHROPIC as s,PROVIDER_GOOGLE as i,PROVIDER_OPENAI as u,QUICK_ACCESS_NONE as f,QUICK_ACCESS_PANELS as a,RESPONSE_SPEEDS as d}from"../constants/index.js";export*from"./cardFollowUp.js";export*from"./newChatRequest.js";export*from"./newsBrief.js";export*from"./newsLinkParts.js";export*from"./readUrlParts.js";let c=new Set([u,s,i]);function p(e){return"string"==typeof e&&c.has(e)}let h=/^auto \((.+)\)$/;function m(e){let t=e.match(h);return t?t[1]:e}let g=e=>{for(let[t,r]of Object.entries(n))if(r.some(t=>e.startsWith(t)))return t;return null},v=/image|embedding|tts|realtime|transcribe|audio/;function w(t,{matchUnknownByPrefix:r=!1}){for(let[e,r]of Object.entries(o))if(r.includes(t))return p(e)?e:null;if(!r||e.includes(t)||v.test(t))return null;let n=g(t);return p(n)?n:null}let P=(e,r={})=>{if(!e||0===e.length)return[];let n=new Set;for(let t of e){let e=w(t,r);e&&n.add(e)}return t.filter(e=>n.has(e))},j=(e,t={})=>{let r=new Map;if(!e||0===e.length)return r;for(let n of e){let e=w(n,t);e&&(r.has(e)||r.set(e,[]),r.get(e)?.push(n))}return r},x=(e,t={})=>{for(let r of j(e,t).values())if(r.length>1)return!0;return!1},y=(e,t)=>!!e&&!!t&&0!==t.length&&t.includes(e);function M(e,t,r){if(!t||Array.isArray(t)&&0===t.length)return!0;let n=e instanceof Set?e:e?new Set(e):null;return!!n&&0!==n.size&&("string"==typeof t?n.has(t):r?.any===!0?t.some(e=>n.has(e)):t.every(e=>n.has(e)))}function A(e){return r.includes(e)}function S(e){let t=t=>{let r=e?.[t];return d.includes(r)?r:l[t]};return{[u]:t(u),[s]:t(s),[i]:t(i)}}function b(e){return a.includes(e)?e:f}export{g as findProvider,j as getModelsGroupedByProvider,P as getProvidersFromModels,x as hasMultipleModelsPerProvider,M as isEntitled,y as isModelAllowedForPlan,p as isRealProvider,A as isReasoningModel,b as resolveQuickAccess,S as resolveResponseSpeed,m as stripAutoWrapper};
@@ -1 +1 @@
1
- function t(t){return"string"==typeof t&&""!==t.trim()}let e=new Set(['"',"\\","/","b","f","n","r","t","u"]),r={"\n":"\\n","\r":"\\r"," ":"\\t"};function n(t){return t.replace(/\\([\\|[\]])/g,"$1")}function a(e){if(!t(e))return!1;try{let{protocol:t}=new URL(e);return"http:"===t||"https:"===t}catch{return!1}}function l(e,r){return Array.isArray(e)?e.flatMap(e=>{let{author:l,newsletter:i,title:u,url:f,summary:o}=e??{};return!t(l)||!t(i)||!t(u)||!t(o)||!a(f)||r.has(f)?[]:(r.add(f),[{author:n(l),newsletter:i,title:n(u),url:f,summary:o}])}):[]}function i(i){let u,f=i.trim();if(!f||f.length>4e4)return null;try{u=function(t){try{return JSON.parse(t)}catch{return JSON.parse(function(t){let n="",a=!1;for(let l=0;l<t.length;l++){let i=t[l];if(a)if("\\"===i){let r=t[l+1]??"";n+=e.has(r)?`\\${r}`:`\\\\${r}`,l++}else'"'===i?(a=!1,n+=i):i<" "?n+=r[i]??`\\u${i.charCodeAt(0).toString(16).padStart(4,"0")}`:n+=i;else a='"'===i,n+=i}return n}(t))}}(f)}catch{return null}if(!u||!t(u.asOf)||!Array.isArray(u.items))return null;let o=new Set,s=function(e){let{title:r,url:l,line:i}=e??{};return t(r)&&a(l)&&t(i)?{title:n(r),url:l,line:i}:void 0}(u.onThisDay),c=new Set(s?[s.url]:[]),h=u.items.flatMap(e=>{let{id:r,title:i,summary:u,local:f,evidence:s,commentary:h}=e??{};if(!t(r)||o.has(r)||!t(i)||!t(u))return[];o.add(r);let d=l(h,c);return[{id:r,title:i,summary:u,local:!0===f,evidence:function(e){if(!Array.isArray(e))return[];let r=new Set;return e.flatMap(e=>{let{outlet:l,headline:i,url:u}=e??{};return!t(l)||!t(i)||!a(u)||r.has(u)?[]:(r.add(u),[{outlet:n(l),headline:n(i),url:u}])})}(s),...d.length>0?{commentary:d}:{}}]}),d=l(u.otherCommentary,c),m=u.earlier;return{asOf:u.asOf,...t(u.note)?{note:u.note}:{},...m&&t(m.chatId)&&t(m.time)?{earlier:{chatId:m.chatId,time:m.time}}:{},items:h,...d.length>0?{otherCommentary:d}:{},...s?{onThisDay:s}:{}}}let u=/^[^\S\n]{0,3}```(\w*)[^\S\n]*\n([\s\S]*?)\n[^\S\n]{0,3}```/gm;function f(t){for(let[,e,r]of t.matchAll(u))if("newsbrief"===e.toLowerCase()||""===e&&/"asOf"/.test(r)){let t=i(r);if(t)return t}return null}export{f as findNewsBrief,i as parseNewsBrief};
1
+ function t(t){return`Read the post: ${t.title}, ${t.newsletter}`}let e=/^https:\/\/encrypted-tbn\d\.gstatic\.com\/images\?q=tbn:[\w-]+$/;function r(t){return"string"==typeof t&&e.test(t)}function n(t){return"string"==typeof t&&""!==t.trim()}let a=new Set(['"',"\\","/","b","f","n","r","t","u"]),l={"\n":"\\n","\r":"\\r"," ":"\\t"};function i(t){return t.replace(/\\([\\|[\]])/g,"$1")}function u(t){if(!n(t))return!1;try{let{protocol:e}=new URL(t);return"http:"===e||"https:"===e}catch{return!1}}function f(t,e){return Array.isArray(t)?t.flatMap(t=>{let{author:r,newsletter:a,title:l,url:f,summary:s}=t??{};return!n(r)||!n(a)||!n(l)||!n(s)||!u(f)||e.has(f)?[]:(e.add(f),[{author:i(r),newsletter:a,title:i(l),url:f,summary:s}])}):[]}function s(t){let e,s=t.trim();if(!s||s.length>4e4)return null;try{e=function(t){try{return JSON.parse(t)}catch{return JSON.parse(function(t){let e="",r=!1;for(let n=0;n<t.length;n++){let i=t[n];if(r)if("\\"===i){let r=t[n+1]??"";e+=a.has(r)?`\\${r}`:`\\\\${r}`,n++}else'"'===i?(r=!1,e+=i):i<" "?e+=l[i]??`\\u${i.charCodeAt(0).toString(16).padStart(4,"0")}`:e+=i;else r='"'===i,e+=i}return e}(t))}}(s)}catch{return null}if(!e||!n(e.asOf)||!Array.isArray(e.items))return null;let o=new Set,c=function(t){let{title:e,url:r,line:a}=t??{};return n(e)&&u(r)&&n(a)?{title:i(e),url:r,line:a}:void 0}(e.onThisDay),h=new Set(c?[c.url]:[]),p=e.items.flatMap(t=>{let{id:e,title:a,summary:l,local:s,image:c,evidence:p,commentary:d}=t??{};if(!n(e)||o.has(e)||!n(a)||!n(l))return[];o.add(e);let m=f(d,h);return[{id:e,title:a,summary:l,local:!0===s,...r(c)?{image:c}:{},evidence:function(t){if(!Array.isArray(t))return[];let e=new Set;return t.flatMap(t=>{let{outlet:r,headline:a,url:l}=t??{};return!n(r)||!n(a)||!u(l)||e.has(l)?[]:(e.add(l),[{outlet:i(r),headline:i(a),url:l}])})}(p),...m.length>0?{commentary:m}:{}}]}),d=f(e.otherCommentary,h),m=e.earlier;return{asOf:e.asOf,...n(e.note)?{note:e.note}:{},...n(e.place)?{place:e.place}:{},...m&&n(m.chatId)&&n(m.time)?{earlier:{chatId:m.chatId,time:m.time}}:{},items:p,...d.length>0?{otherCommentary:d}:{},...c?{onThisDay:c}:{}}}let o=/^[^\S\n]{0,3}```(\w*)[^\S\n]*\n([\s\S]*?)\n[^\S\n]{0,3}```/gm;function c(t){for(let[,e,r]of t.matchAll(o))if("newsbrief"===e.toLowerCase()||""===e&&/"asOf"/.test(r)){let t=s(r);if(t)return t}return null}export{c as findNewsBrief,r as isNewsImageUrl,s as parseNewsBrief,t as postLinkName};
@@ -0,0 +1 @@
1
+ import{NEWS_LINKS_PART_TYPE as t}from"../constants/index.js";function r(r){return{type:t,data:{urls:r}}}function n(t){if(!Array.isArray(t))return[];let n=t.filter(t=>"string"==typeof t);return n.length>0?[r(n)]:[]}export{n as newsLinkParts,r as toNewsLinksPart};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@versini/sassysaint-common",
3
- "version": "4.67.0",
3
+ "version": "4.69.0",
4
4
  "license": "MIT",
5
5
  "author": "Arno Versini",
6
6
  "publishConfig": {