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