@versini/sassysaint-common 4.11.1 → 4.12.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
@@ -32,6 +32,12 @@ declare const MODEL_SONAR_PRO = "sonar-pro";
32
32
  declare const MODEL_DEV = "mistralai/mistral-small-3.2-24b-instruct:free";
33
33
  declare const MODEL_MEMORY_INFERENCE = "gpt-4o-mini";
34
34
  declare const MODEL_EMBEDDING_TEXT = "text-embedding-3-small";
35
+ /**
36
+ * Maps model constants to user-friendly display names.
37
+ * Used by client UI to show readable model names in plan descriptions and
38
+ * settings.
39
+ */
40
+ declare const MODEL_DISPLAY_NAMES: Record<string, string>;
35
41
  /**
36
42
  * List of all models available TODAY.
37
43
  * This is used by the client to display the list of models.
@@ -72,6 +78,24 @@ declare const DIGGIDY_CHAT_ID_HEADER = "x-diggidy-chat-id";
72
78
  *
73
79
  */
74
80
  declare const findProvider: (modelName: string) => null | typeof PROVIDER_ANTHROPIC | typeof PROVIDER_OPENAI | typeof PROVIDER_GOOGLE;
81
+ /**
82
+ * Derives the list of available providers from a given list of models.
83
+ * This allows the client to automatically filter provider options based on
84
+ * which models are available in a user's plan.
85
+ *
86
+ * @param models - Array of model names (e.g., from allowedModels in policies).
87
+ * @returns Array of provider names that have at least one model available.
88
+ *
89
+ * @example
90
+ * // If plan only has GPT and Claude models:
91
+ * getProvidersFromModels([MODEL_GPT4_MINI, MODEL_CLAUDE_HAIKU])
92
+ * // returns: [PROVIDER_OPENAI, PROVIDER_ANTHROPIC]
93
+ *
94
+ * // If Gemini models are removed from plan:
95
+ * getProvidersFromModels([MODEL_GPT4_MINI, MODEL_CLAUDE_HAIKU])
96
+ * // Google provider will not be in the result
97
+ */
98
+ declare const getProvidersFromModels: (models: string[]) => Array<typeof PROVIDER_OPENAI | typeof PROVIDER_ANTHROPIC | typeof PROVIDER_GOOGLE>;
75
99
  /**
76
100
  * Sort capabilities are shared across client and server.
77
101
  */
@@ -323,7 +347,7 @@ declare namespace index {
323
347
  /**
324
348
  * List of all plans available.
325
349
  */
326
- declare const PLAN_FREE = "sassy:free";
350
+ declare const PLAN_BASIC = "sassy:basic";
327
351
  declare const PLAN_PLUS = "sassy:plus";
328
352
  declare const PLAN_PREMIUM = "sassy:advanced";
329
353
  /**
@@ -332,7 +356,7 @@ declare const PLAN_PREMIUM = "sassy:advanced";
332
356
  * capabilities.
333
357
  */
334
358
  declare const POLICY_GRANTS: {
335
- PLAN_FREE: string;
359
+ PLAN_BASIC: string;
336
360
  PLAN_PLUS: string;
337
361
  PLAN_PREMIUM: string;
338
362
  };
@@ -384,4 +408,4 @@ declare function isEntitlementLoaded(state: EntitlementStateLike | null | undefi
384
408
  declare function toCapabilitySet(capabilities: string[] | undefined | null): Set<string> | null;
385
409
  declare function isEntitled(capabilitiesOrSet: string[] | Set<string> | null | undefined, required: CapabilityInput, options?: IsEntitledOptions): boolean;
386
410
 
387
- export { ALL_MODELS, ALL_PROVIDERS, ALL_REASONING_MODELS, APPLICATION_NAME, CAPABILITIES, type CapabilityInput, DEFAULT_PROVIDER, DIGGIDY_CHAT_ID_HEADER, type EntitlementStateLike, type IsEntitledOptions, MODELS_PER_PROVIDER, MODEL_CLAUDE_HAIKU, MODEL_CLAUDE_SONNET, MODEL_DEV, MODEL_EMBEDDING_TEXT, MODEL_GEMINI_FLASH, MODEL_GEMINI_PRO, MODEL_GPT4_MINI, MODEL_GPT5, MODEL_MEMORY_INFERENCE, MODEL_SONAR, MODEL_SONAR_PRO, PLAN_FREE, PLAN_PLUS, PLAN_PREMIUM, POLICY_GRANTS, PROVIDER_ANTHROPIC, PROVIDER_GOOGLE, PROVIDER_MEMORY, PROVIDER_MISTRAL, PROVIDER_OPENAI, PROVIDER_PERPLEXITY, PROVIDER_ROLE_MAP, PROVIDER_SUMMARY, ROLE_ASSISTANT, ROLE_HIDDEN, ROLE_INTERNAL, ROLE_SYSTEM, ROLE_USER, SORT_BY_TIMESTAMP, SORT_BY_TOKEN_USAGE, index as crypto, findProvider, isEntitled, isEntitlementLoaded, toCapabilitySet };
411
+ export { ALL_MODELS, ALL_PROVIDERS, ALL_REASONING_MODELS, APPLICATION_NAME, CAPABILITIES, type CapabilityInput, DEFAULT_PROVIDER, DIGGIDY_CHAT_ID_HEADER, type EntitlementStateLike, type IsEntitledOptions, MODELS_PER_PROVIDER, MODEL_CLAUDE_HAIKU, MODEL_CLAUDE_SONNET, MODEL_DEV, MODEL_DISPLAY_NAMES, MODEL_EMBEDDING_TEXT, MODEL_GEMINI_FLASH, MODEL_GEMINI_PRO, MODEL_GPT4_MINI, MODEL_GPT5, MODEL_MEMORY_INFERENCE, MODEL_SONAR, MODEL_SONAR_PRO, PLAN_BASIC, PLAN_PLUS, PLAN_PREMIUM, POLICY_GRANTS, PROVIDER_ANTHROPIC, PROVIDER_GOOGLE, PROVIDER_MEMORY, PROVIDER_MISTRAL, PROVIDER_OPENAI, PROVIDER_PERPLEXITY, PROVIDER_ROLE_MAP, PROVIDER_SUMMARY, ROLE_ASSISTANT, ROLE_HIDDEN, ROLE_INTERNAL, ROLE_SYSTEM, ROLE_USER, SORT_BY_TIMESTAMP, SORT_BY_TOKEN_USAGE, index as crypto, findProvider, getProvidersFromModels, isEntitled, isEntitlementLoaded, toCapabilitySet };
package/dist/index.js CHANGED
@@ -1,61 +1,80 @@
1
- const S = "system", a = "user", c = "assistant", ee = "hidden", te = "data", i = "OpenAI", E = "Anthropic", y = "Google", g = "Summary", L = "Memory", d = "Perplexity", ne = "Mistral", re = i, oe = [
2
- i,
3
- E,
4
- y
5
- ], u = "gpt-5", p = "gpt-4.1-nano", R = "claude-haiku-4-5-20251001", O = "claude-sonnet-4-5-20250929", _ = "gemini-2.5-flash", l = "gemini-2.5-pro", M = "sonar", T = "sonar-pro", se = "mistralai/mistral-small-3.2-24b-instruct:free", ae = "gpt-4o-mini", ce = "text-embedding-3-small", ie = [
1
+ const L = "system", a = "user", i = "assistant", ne = "hidden", re = "data", c = "OpenAI", y = "Anthropic", d = "Google", M = "Summary", T = "Memory", O = "Perplexity", oe = "Mistral", se = c, m = [
2
+ c,
3
+ y,
4
+ d
5
+ ], u = "gpt-5", p = "gpt-4.1-nano", f = "claude-haiku-4-5-20251001", A = "claude-sonnet-4-5-20250929", _ = "gemini-2.5-flash", l = "gemini-2.5-pro", R = "sonar", P = "sonar-pro", ae = "mistralai/mistral-small-3.2-24b-instruct:free", ie = "gpt-4o-mini", ce = "text-embedding-3-small", Ee = {
6
+ [u]: "GPT-5",
7
+ [p]: "GPT-4.1 Nano",
8
+ [f]: "Claude Haiku 4.5",
9
+ [A]: "Claude Sonnet 4.5",
10
+ [_]: "Gemini 2.5 Flash",
11
+ [l]: "Gemini 2.5 Pro",
12
+ [R]: "Sonar",
13
+ [P]: "Sonar Pro"
14
+ }, ye = [
6
15
  u,
7
16
  p,
8
- R,
9
- O,
17
+ f,
18
+ A,
10
19
  _,
11
20
  l
12
- ], Ee = [
21
+ ], de = [
13
22
  u,
14
- O,
23
+ A,
15
24
  l
16
- ], m = "claude-sonnet-4", w = "claude-3", h = "gpt-", b = "o3", N = "o4", C = "gemini", U = "sonar", v = {
17
- [E]: [
18
- m,
19
- w
25
+ ], w = "claude-sonnet-4", h = "claude-3", b = "gpt-", N = "o3", C = "o4", v = "gemini", U = "sonar", K = {
26
+ [y]: [
27
+ w,
28
+ h
20
29
  ],
21
- [i]: [
22
- h,
30
+ [c]: [
23
31
  b,
24
- N
32
+ N,
33
+ C
25
34
  ],
26
- [y]: [C],
27
- [d]: [U]
28
- }, ye = {
29
- [i]: [p, u],
30
- [E]: [R, O],
31
- [y]: [_, l],
32
- [d]: [M, T]
33
- }, Ae = {
34
- [i]: [S, a, c],
35
- [E]: [a, c],
36
- [g]: [a, c],
37
- [L]: [a, c],
38
- [y]: [a, c],
39
- [d]: [a, c]
40
- }, de = "x-diggidy-chat-id", ue = (n) => {
35
+ [d]: [v],
36
+ [O]: [U]
37
+ }, G = {
38
+ [c]: [p, u],
39
+ [y]: [f, A],
40
+ [d]: [_, l],
41
+ [O]: [R, P]
42
+ }, ue = {
43
+ [c]: [L, a, i],
44
+ [y]: [a, i],
45
+ [M]: [a, i],
46
+ [T]: [a, i],
47
+ [d]: [a, i],
48
+ [O]: [a, i]
49
+ }, Ae = "x-diggidy-chat-id", le = (n) => {
41
50
  for (const [e, r] of Object.entries(
42
- v
51
+ K
43
52
  ))
44
53
  if (r.some((t) => n.startsWith(t)))
45
54
  return e;
46
55
  return null;
47
- }, Oe = "timestamp", le = "tokenUsage", pe = "Diggidy";
56
+ }, Oe = (n) => {
57
+ if (!n || n.length === 0)
58
+ return [];
59
+ const e = /* @__PURE__ */ new Set();
60
+ for (const r of n)
61
+ for (const [t, E] of Object.entries(
62
+ G
63
+ ))
64
+ E.includes(r) && (t === c || t === y || t === d) && e.add(t);
65
+ return m.filter((r) => e.has(r));
66
+ }, pe = "timestamp", fe = "tokenUsage", _e = "Diggidy";
48
67
  class s extends Error {
49
68
  constructor(e, r, t) {
50
69
  super(e), this.code = r, this.originalError = t, this.name = "CryptoError";
51
70
  }
52
71
  }
53
- const f = {
72
+ const S = {
54
73
  keySize: 4096,
55
74
  debug: !1
56
75
  };
57
- async function K(n = {}) {
58
- const e = { ...f, ...n };
76
+ async function k(n = {}) {
77
+ const e = { ...S, ...n };
59
78
  try {
60
79
  const r = {
61
80
  modulusLength: e.keySize,
@@ -91,7 +110,7 @@ async function K(n = {}) {
91
110
  );
92
111
  }
93
112
  }
94
- async function k(n) {
113
+ async function F(n) {
95
114
  try {
96
115
  return {
97
116
  jwk: await crypto.subtle.exportKey("jwk", n),
@@ -106,7 +125,7 @@ async function k(n) {
106
125
  );
107
126
  }
108
127
  }
109
- async function P(n) {
128
+ async function I(n) {
110
129
  try {
111
130
  const e = JSON.parse(n);
112
131
  return await crypto.subtle.importKey(
@@ -128,14 +147,14 @@ async function P(n) {
128
147
  );
129
148
  }
130
149
  }
131
- async function G(n, e, r) {
150
+ async function Y(n, e, r) {
132
151
  try {
133
- const A = new TextEncoder().encode(n), o = await crypto.subtle.encrypt(
152
+ const E = new TextEncoder().encode(n), o = await crypto.subtle.encrypt(
134
153
  {
135
154
  name: "RSA-OAEP"
136
155
  },
137
156
  e,
138
- A
157
+ E
139
158
  );
140
159
  return {
141
160
  data: btoa(
@@ -152,7 +171,7 @@ async function G(n, e, r) {
152
171
  );
153
172
  }
154
173
  }
155
- async function F(n, e) {
174
+ async function V(n, e) {
156
175
  try {
157
176
  const r = Uint8Array.from(
158
177
  atob(n.data),
@@ -173,9 +192,9 @@ async function F(n, e) {
173
192
  );
174
193
  }
175
194
  }
176
- async function V(n, e, r) {
195
+ async function H(n, e, r) {
177
196
  try {
178
- const t = await P(
197
+ const t = await I(
179
198
  n.serverPublicKey
180
199
  );
181
200
  return {
@@ -193,10 +212,10 @@ async function V(n, e, r) {
193
212
  );
194
213
  }
195
214
  }
196
- function Y(n) {
215
+ function x(n) {
197
216
  return !(!n || !n.clientKeyPair || !n.serverPublicKey);
198
217
  }
199
- function H() {
218
+ function B() {
200
219
  const n = Date.now().toString(36), e = new Uint8Array(8);
201
220
  if (typeof window < "u" && window.crypto?.getRandomValues)
202
221
  window.crypto.getRandomValues(e);
@@ -206,50 +225,50 @@ function H() {
206
225
  const r = Array.from(e).map((t) => t.toString(36)).join("");
207
226
  return `device_${n}_${r}`;
208
227
  }
209
- function I() {
228
+ function D() {
210
229
  return typeof window < "u" && typeof window.crypto < "u" && typeof window.crypto.subtle < "u";
211
230
  }
212
- function D() {
231
+ function g() {
213
232
  return typeof window < "u" && (window.isSecureContext || window.location.protocol === "https:");
214
233
  }
215
- function x() {
216
- return I() && D();
234
+ function X() {
235
+ return D() && g();
217
236
  }
218
- function X(n) {
237
+ function j(n) {
219
238
  const e = new Uint8Array(n);
220
239
  let r = "";
221
240
  for (let t = 0; t < e.byteLength; t++)
222
241
  r += String.fromCharCode(e[t]);
223
242
  return btoa(r);
224
243
  }
225
- function B(n) {
244
+ function $(n) {
226
245
  const e = atob(n), r = new Uint8Array(e.length);
227
246
  for (let t = 0; t < e.length; t++)
228
247
  r[t] = e.charCodeAt(t);
229
248
  return r.buffer;
230
249
  }
231
- function $(n) {
250
+ function z(n) {
232
251
  try {
233
252
  return JSON.stringify(n);
234
253
  } catch {
235
254
  return String(n);
236
255
  }
237
256
  }
238
- function j(n) {
257
+ function W(n) {
239
258
  try {
240
259
  return JSON.parse(n);
241
260
  } catch {
242
261
  return null;
243
262
  }
244
263
  }
245
- function z(n, ...e) {
264
+ function J(n, ...e) {
246
265
  typeof process < "u" && process.env && process.env.NODE_ENV === "development" && console.info(`🔐 [Crypto] ${n}`, ...e);
247
266
  }
248
- const Re = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, CryptoError: s, DEFAULT_CRYPTO_CONFIG: f, arrayBufferToBase64: X, base64ToArrayBuffer: B, canUseEncryption: x, debugLog: z, decryptFromServer: F, encryptForServer: G, establishCryptoSession: V, exportPublicKey: k, generateClientKeyPair: K, generateDeviceId: H, importServerPublicKey: P, isCryptoSessionValid: Y, isSecureContext: D, isWebCryptoSupported: I, safeParse: j, safeStringify: $ }, Symbol.toStringTag, { value: "Module" })), W = "sassy:free", J = "sassy:plus", Z = "sassy:advanced", _e = {
249
- PLAN_FREE: W,
250
- PLAN_PLUS: J,
251
- PLAN_PREMIUM: Z
252
- }, fe = {
267
+ const Re = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, CryptoError: s, DEFAULT_CRYPTO_CONFIG: S, arrayBufferToBase64: j, base64ToArrayBuffer: $, canUseEncryption: X, debugLog: J, decryptFromServer: V, encryptForServer: Y, establishCryptoSession: H, exportPublicKey: F, generateClientKeyPair: k, generateDeviceId: B, importServerPublicKey: I, isCryptoSessionValid: x, isSecureContext: g, isWebCryptoSupported: D, safeParse: W, safeStringify: z }, Symbol.toStringTag, { value: "Module" })), Z = "sassy:basic", Q = "sassy:plus", q = "sassy:advanced", Pe = {
268
+ PLAN_BASIC: Z,
269
+ PLAN_PLUS: Q,
270
+ PLAN_PREMIUM: q
271
+ }, Se = {
253
272
  TOOL: {
254
273
  DATETIME: "getDateTime",
255
274
  IMAGES: "getImages",
@@ -268,60 +287,62 @@ const Re = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
268
287
  CODEINTERPRETER: "addon:codeinterpreter"
269
288
  }
270
289
  };
271
- function Pe(n) {
290
+ function Ie(n) {
272
291
  return !!n && Array.isArray(n.capabilities) && n.capabilities.length >= 0;
273
292
  }
274
- function Q(n) {
293
+ function ee(n) {
275
294
  return n ? new Set(n) : null;
276
295
  }
277
- function Ie(n, e, r) {
296
+ function De(n, e, r) {
278
297
  if (!e || Array.isArray(e) && e.length === 0)
279
298
  return !0;
280
- const t = n instanceof Set ? n : Q(n);
299
+ const t = n instanceof Set ? n : ee(n);
281
300
  return !t || t.size === 0 ? !1 : typeof e == "string" ? t.has(e) : r?.any === !0 ? e.some((o) => t.has(o)) : e.every((o) => t.has(o));
282
301
  }
283
302
  export {
284
- ie as ALL_MODELS,
285
- oe as ALL_PROVIDERS,
286
- Ee as ALL_REASONING_MODELS,
287
- pe as APPLICATION_NAME,
288
- fe as CAPABILITIES,
289
- re as DEFAULT_PROVIDER,
290
- de as DIGGIDY_CHAT_ID_HEADER,
291
- ye as MODELS_PER_PROVIDER,
292
- R as MODEL_CLAUDE_HAIKU,
293
- O as MODEL_CLAUDE_SONNET,
294
- se as MODEL_DEV,
303
+ ye as ALL_MODELS,
304
+ m as ALL_PROVIDERS,
305
+ de as ALL_REASONING_MODELS,
306
+ _e as APPLICATION_NAME,
307
+ Se as CAPABILITIES,
308
+ se as DEFAULT_PROVIDER,
309
+ Ae as DIGGIDY_CHAT_ID_HEADER,
310
+ G as MODELS_PER_PROVIDER,
311
+ f as MODEL_CLAUDE_HAIKU,
312
+ A as MODEL_CLAUDE_SONNET,
313
+ ae as MODEL_DEV,
314
+ Ee as MODEL_DISPLAY_NAMES,
295
315
  ce as MODEL_EMBEDDING_TEXT,
296
316
  _ as MODEL_GEMINI_FLASH,
297
317
  l as MODEL_GEMINI_PRO,
298
318
  p as MODEL_GPT4_MINI,
299
319
  u as MODEL_GPT5,
300
- ae as MODEL_MEMORY_INFERENCE,
301
- M as MODEL_SONAR,
302
- T as MODEL_SONAR_PRO,
303
- W as PLAN_FREE,
304
- J as PLAN_PLUS,
305
- Z as PLAN_PREMIUM,
306
- _e as POLICY_GRANTS,
307
- E as PROVIDER_ANTHROPIC,
308
- y as PROVIDER_GOOGLE,
309
- L as PROVIDER_MEMORY,
310
- ne as PROVIDER_MISTRAL,
311
- i as PROVIDER_OPENAI,
312
- d as PROVIDER_PERPLEXITY,
313
- Ae as PROVIDER_ROLE_MAP,
314
- g as PROVIDER_SUMMARY,
315
- c as ROLE_ASSISTANT,
316
- ee as ROLE_HIDDEN,
317
- te as ROLE_INTERNAL,
318
- S as ROLE_SYSTEM,
320
+ ie as MODEL_MEMORY_INFERENCE,
321
+ R as MODEL_SONAR,
322
+ P as MODEL_SONAR_PRO,
323
+ Z as PLAN_BASIC,
324
+ Q as PLAN_PLUS,
325
+ q as PLAN_PREMIUM,
326
+ Pe as POLICY_GRANTS,
327
+ y as PROVIDER_ANTHROPIC,
328
+ d as PROVIDER_GOOGLE,
329
+ T as PROVIDER_MEMORY,
330
+ oe as PROVIDER_MISTRAL,
331
+ c as PROVIDER_OPENAI,
332
+ O as PROVIDER_PERPLEXITY,
333
+ ue as PROVIDER_ROLE_MAP,
334
+ M as PROVIDER_SUMMARY,
335
+ i as ROLE_ASSISTANT,
336
+ ne as ROLE_HIDDEN,
337
+ re as ROLE_INTERNAL,
338
+ L as ROLE_SYSTEM,
319
339
  a as ROLE_USER,
320
- Oe as SORT_BY_TIMESTAMP,
321
- le as SORT_BY_TOKEN_USAGE,
340
+ pe as SORT_BY_TIMESTAMP,
341
+ fe as SORT_BY_TOKEN_USAGE,
322
342
  Re as crypto,
323
- ue as findProvider,
324
- Ie as isEntitled,
325
- Pe as isEntitlementLoaded,
326
- Q as toCapabilitySet
343
+ le as findProvider,
344
+ Oe as getProvidersFromModels,
345
+ De as isEntitled,
346
+ Ie as isEntitlementLoaded,
347
+ ee as toCapabilitySet
327
348
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@versini/sassysaint-common",
3
- "version": "4.11.1",
3
+ "version": "4.12.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": "61f0429fcce881386493da93867f2ce475dd4858"
35
+ "gitHead": "f7d78abb7a4c8517ab533addf1bfa6cd244439dc"
36
36
  }