@llmops/core 0.2.13 → 0.2.14
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/{bun-sqlite-dialect-Bxz4B97L.cjs → bun-sqlite-dialect-BNaQHMpk.cjs} +1 -1
- package/dist/db/index.cjs +2 -2
- package/dist/db/index.d.cts +1 -1
- package/dist/db/index.d.mts +1 -1
- package/dist/db/index.mjs +1 -1
- package/dist/{db-DohlAqJU.mjs → db-B-EsQtOz.mjs} +5 -0
- package/dist/{db-BOe6mM51.cjs → db-Du2xmkGS.cjs} +8 -3
- package/dist/{index-C5xtb4gO.d.cts → index-COkIT6TH.d.mts} +15 -1
- package/dist/{index-BO5Rse5J.d.mts → index-Dm1Gi0cH.d.cts} +50 -36
- package/dist/index.cjs +39 -11
- package/dist/index.d.cts +290 -271
- package/dist/index.d.mts +20 -1
- package/dist/index.mjs +38 -10
- package/dist/{neon-dialect-C0GZuGot.cjs → neon-dialect-B-Q6mmbI.cjs} +1 -1
- package/dist/{neon-dialect-BQey5lUw.cjs → neon-dialect-BR1nZmKX.cjs} +1 -1
- package/dist/{node-sqlite-dialect-N8j5UsT-.cjs → node-sqlite-dialect-DpdAEbyp.cjs} +1 -1
- package/package.json +2 -2
package/dist/index.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $ as variantsSchema, A as ProviderConfig, B as VariantVersionsTable, C as Environment, D as Insertable, E as EnvironmentsTable, F as TargetingRule, G as configsSchema, H as WorkspaceSettings, I as TargetingRulesTable, J as llmRequestsSchema, K as environmentSecretsSchema, L as Updateable, M as SCHEMA_METADATA, N as Selectable, O as LLMRequest, P as TableName, Q as variantVersionsSchema, R as Variant, S as Database, T as EnvironmentSecretsTable, U as WorkspaceSettingsTable, V as VariantsTable, W as configVariantsSchema, X as schemas, Y as providerConfigsSchema, Z as targetingRulesSchema, _ as validateTableData, a as createDatabaseFromConnection, b as ConfigVariantsTable, c as executeWithSchema, d as getMigrations, et as workspaceSettingsSchema, f as matchType, g as validatePartialTableData, h as parseTableData, i as createDatabase, j as ProviderConfigsTable, k as LLMRequestsTable, l as MigrationOptions, m as parsePartialTableData, n as DatabaseOptions, o as detectDatabaseType, p as runAutoMigrations, q as environmentsSchema, r as DatabaseType, s as createNeonDialect, t as DatabaseConnection, u as MigrationResult, v as Config, w as EnvironmentSecret, x as ConfigsTable, y as ConfigVariant, z as VariantVersion } from "./index-
|
|
1
|
+
import { $ as variantsSchema, A as ProviderConfig, B as VariantVersionsTable, C as Environment, D as Insertable, E as EnvironmentsTable, F as TargetingRule, G as configsSchema, H as WorkspaceSettings, I as TargetingRulesTable, J as llmRequestsSchema, K as environmentSecretsSchema, L as Updateable, M as SCHEMA_METADATA, N as Selectable, O as LLMRequest, P as TableName, Q as variantVersionsSchema, R as Variant, S as Database, T as EnvironmentSecretsTable, U as WorkspaceSettingsTable, V as VariantsTable, W as configVariantsSchema, X as schemas, Y as providerConfigsSchema, Z as targetingRulesSchema, _ as validateTableData, a as createDatabaseFromConnection, b as ConfigVariantsTable, c as executeWithSchema, d as getMigrations, et as workspaceSettingsSchema, f as matchType, g as validatePartialTableData, h as parseTableData, i as createDatabase, j as ProviderConfigsTable, k as LLMRequestsTable, l as MigrationOptions, m as parsePartialTableData, n as DatabaseOptions, o as detectDatabaseType, p as runAutoMigrations, q as environmentsSchema, r as DatabaseType, s as createNeonDialect, t as DatabaseConnection, u as MigrationResult, v as Config, w as EnvironmentSecret, x as ConfigsTable, y as ConfigVariant, z as VariantVersion } from "./index-COkIT6TH.mjs";
|
|
2
2
|
import gateway from "@llmops/gateway";
|
|
3
3
|
import { Kysely } from "kysely";
|
|
4
4
|
import pino from "pino";
|
|
@@ -1374,12 +1374,14 @@ declare const createWorkspaceSettingsDataLayer: (db: Kysely<Database>) => {
|
|
|
1374
1374
|
//#region src/datalayer/providerConfigs.d.ts
|
|
1375
1375
|
declare const createProviderConfig: z$1.ZodObject<{
|
|
1376
1376
|
providerId: z$1.ZodString;
|
|
1377
|
+
slug: z$1.ZodOptional<z$1.ZodNullable<z$1.ZodString>>;
|
|
1377
1378
|
name: z$1.ZodOptional<z$1.ZodNullable<z$1.ZodString>>;
|
|
1378
1379
|
config: z$1.ZodRecord<z$1.ZodString, z$1.ZodUnknown>;
|
|
1379
1380
|
enabled: z$1.ZodDefault<z$1.ZodOptional<z$1.ZodBoolean>>;
|
|
1380
1381
|
}, z$1.core.$strip>;
|
|
1381
1382
|
declare const updateProviderConfig: z$1.ZodObject<{
|
|
1382
1383
|
id: z$1.ZodUUID;
|
|
1384
|
+
slug: z$1.ZodOptional<z$1.ZodNullable<z$1.ZodString>>;
|
|
1383
1385
|
name: z$1.ZodOptional<z$1.ZodNullable<z$1.ZodString>>;
|
|
1384
1386
|
config: z$1.ZodOptional<z$1.ZodRecord<z$1.ZodString, z$1.ZodUnknown>>;
|
|
1385
1387
|
enabled: z$1.ZodOptional<z$1.ZodBoolean>;
|
|
@@ -1399,6 +1401,7 @@ declare const listProviderConfigs: z$1.ZodObject<{
|
|
|
1399
1401
|
}, z$1.core.$strip>;
|
|
1400
1402
|
declare const createProviderConfigsDataLayer: (db: Kysely<Database>) => {
|
|
1401
1403
|
createProviderConfig: (params: z$1.infer<typeof createProviderConfig>) => Promise<{
|
|
1404
|
+
slug: string | null;
|
|
1402
1405
|
name: string | null;
|
|
1403
1406
|
id: string;
|
|
1404
1407
|
createdAt: Date;
|
|
@@ -1408,6 +1411,7 @@ declare const createProviderConfigsDataLayer: (db: Kysely<Database>) => {
|
|
|
1408
1411
|
config: Record<string, unknown>;
|
|
1409
1412
|
} | undefined>;
|
|
1410
1413
|
updateProviderConfig: (params: z$1.infer<typeof updateProviderConfig>) => Promise<{
|
|
1414
|
+
slug: string | null;
|
|
1411
1415
|
name: string | null;
|
|
1412
1416
|
id: string;
|
|
1413
1417
|
createdAt: Date;
|
|
@@ -1417,6 +1421,7 @@ declare const createProviderConfigsDataLayer: (db: Kysely<Database>) => {
|
|
|
1417
1421
|
config: Record<string, unknown>;
|
|
1418
1422
|
} | undefined>;
|
|
1419
1423
|
getProviderConfigById: (params: z$1.infer<typeof getProviderConfigById>) => Promise<{
|
|
1424
|
+
slug: string | null;
|
|
1420
1425
|
name: string | null;
|
|
1421
1426
|
id: string;
|
|
1422
1427
|
createdAt: Date;
|
|
@@ -1426,6 +1431,7 @@ declare const createProviderConfigsDataLayer: (db: Kysely<Database>) => {
|
|
|
1426
1431
|
config: Record<string, unknown>;
|
|
1427
1432
|
} | undefined>;
|
|
1428
1433
|
getProviderConfigByProviderId: (params: z$1.infer<typeof getProviderConfigByProviderId>) => Promise<{
|
|
1434
|
+
slug: string | null;
|
|
1429
1435
|
name: string | null;
|
|
1430
1436
|
id: string;
|
|
1431
1437
|
createdAt: Date;
|
|
@@ -1435,6 +1441,7 @@ declare const createProviderConfigsDataLayer: (db: Kysely<Database>) => {
|
|
|
1435
1441
|
config: Record<string, unknown>;
|
|
1436
1442
|
} | undefined>;
|
|
1437
1443
|
deleteProviderConfig: (params: z$1.infer<typeof deleteProviderConfig>) => Promise<{
|
|
1444
|
+
slug: string | null;
|
|
1438
1445
|
name: string | null;
|
|
1439
1446
|
id: string;
|
|
1440
1447
|
createdAt: Date;
|
|
@@ -1444,6 +1451,7 @@ declare const createProviderConfigsDataLayer: (db: Kysely<Database>) => {
|
|
|
1444
1451
|
config: Record<string, unknown>;
|
|
1445
1452
|
} | undefined>;
|
|
1446
1453
|
listProviderConfigs: (params?: z$1.infer<typeof listProviderConfigs>) => Promise<{
|
|
1454
|
+
slug: string | null;
|
|
1447
1455
|
name: string | null;
|
|
1448
1456
|
id: string;
|
|
1449
1457
|
createdAt: Date;
|
|
@@ -1458,6 +1466,7 @@ declare const createProviderConfigsDataLayer: (db: Kysely<Database>) => {
|
|
|
1458
1466
|
* Useful for the dashboard UI where you want to set/update a provider config
|
|
1459
1467
|
*/
|
|
1460
1468
|
upsertProviderConfig: (params: z$1.infer<typeof createProviderConfig>) => Promise<{
|
|
1469
|
+
slug: string | null;
|
|
1461
1470
|
name: string | null;
|
|
1462
1471
|
id: string;
|
|
1463
1472
|
createdAt: Date;
|
|
@@ -1911,10 +1920,12 @@ declare const createDataLayer: (db: Kysely<Database>) => Promise<{
|
|
|
1911
1920
|
} | undefined>;
|
|
1912
1921
|
createProviderConfig: (params: zod33.infer<zod33.ZodObject<{
|
|
1913
1922
|
providerId: zod33.ZodString;
|
|
1923
|
+
slug: zod33.ZodOptional<zod33.ZodNullable<zod33.ZodString>>;
|
|
1914
1924
|
name: zod33.ZodOptional<zod33.ZodNullable<zod33.ZodString>>;
|
|
1915
1925
|
config: zod33.ZodRecord<zod33.ZodString, zod33.ZodUnknown>;
|
|
1916
1926
|
enabled: zod33.ZodDefault<zod33.ZodOptional<zod33.ZodBoolean>>;
|
|
1917
1927
|
}, better_auth0.$strip>>) => Promise<{
|
|
1928
|
+
slug: string | null;
|
|
1918
1929
|
name: string | null;
|
|
1919
1930
|
id: string;
|
|
1920
1931
|
createdAt: Date;
|
|
@@ -1925,10 +1936,12 @@ declare const createDataLayer: (db: Kysely<Database>) => Promise<{
|
|
|
1925
1936
|
} | undefined>;
|
|
1926
1937
|
updateProviderConfig: (params: zod33.infer<zod33.ZodObject<{
|
|
1927
1938
|
id: zod33.ZodUUID;
|
|
1939
|
+
slug: zod33.ZodOptional<zod33.ZodNullable<zod33.ZodString>>;
|
|
1928
1940
|
name: zod33.ZodOptional<zod33.ZodNullable<zod33.ZodString>>;
|
|
1929
1941
|
config: zod33.ZodOptional<zod33.ZodRecord<zod33.ZodString, zod33.ZodUnknown>>;
|
|
1930
1942
|
enabled: zod33.ZodOptional<zod33.ZodBoolean>;
|
|
1931
1943
|
}, better_auth0.$strip>>) => Promise<{
|
|
1944
|
+
slug: string | null;
|
|
1932
1945
|
name: string | null;
|
|
1933
1946
|
id: string;
|
|
1934
1947
|
createdAt: Date;
|
|
@@ -1940,6 +1953,7 @@ declare const createDataLayer: (db: Kysely<Database>) => Promise<{
|
|
|
1940
1953
|
getProviderConfigById: (params: zod33.infer<zod33.ZodObject<{
|
|
1941
1954
|
id: zod33.ZodUUID;
|
|
1942
1955
|
}, better_auth0.$strip>>) => Promise<{
|
|
1956
|
+
slug: string | null;
|
|
1943
1957
|
name: string | null;
|
|
1944
1958
|
id: string;
|
|
1945
1959
|
createdAt: Date;
|
|
@@ -1951,6 +1965,7 @@ declare const createDataLayer: (db: Kysely<Database>) => Promise<{
|
|
|
1951
1965
|
getProviderConfigByProviderId: (params: zod33.infer<zod33.ZodObject<{
|
|
1952
1966
|
providerId: zod33.ZodString;
|
|
1953
1967
|
}, better_auth0.$strip>>) => Promise<{
|
|
1968
|
+
slug: string | null;
|
|
1954
1969
|
name: string | null;
|
|
1955
1970
|
id: string;
|
|
1956
1971
|
createdAt: Date;
|
|
@@ -1962,6 +1977,7 @@ declare const createDataLayer: (db: Kysely<Database>) => Promise<{
|
|
|
1962
1977
|
deleteProviderConfig: (params: zod33.infer<zod33.ZodObject<{
|
|
1963
1978
|
id: zod33.ZodUUID;
|
|
1964
1979
|
}, better_auth0.$strip>>) => Promise<{
|
|
1980
|
+
slug: string | null;
|
|
1965
1981
|
name: string | null;
|
|
1966
1982
|
id: string;
|
|
1967
1983
|
createdAt: Date;
|
|
@@ -1974,6 +1990,7 @@ declare const createDataLayer: (db: Kysely<Database>) => Promise<{
|
|
|
1974
1990
|
limit: zod33.ZodOptional<zod33.ZodNumber>;
|
|
1975
1991
|
offset: zod33.ZodOptional<zod33.ZodNumber>;
|
|
1976
1992
|
}, better_auth0.$strip>>) => Promise<{
|
|
1993
|
+
slug: string | null;
|
|
1977
1994
|
name: string | null;
|
|
1978
1995
|
id: string;
|
|
1979
1996
|
createdAt: Date;
|
|
@@ -1985,10 +2002,12 @@ declare const createDataLayer: (db: Kysely<Database>) => Promise<{
|
|
|
1985
2002
|
countProviderConfigs: () => Promise<number>;
|
|
1986
2003
|
upsertProviderConfig: (params: zod33.infer<zod33.ZodObject<{
|
|
1987
2004
|
providerId: zod33.ZodString;
|
|
2005
|
+
slug: zod33.ZodOptional<zod33.ZodNullable<zod33.ZodString>>;
|
|
1988
2006
|
name: zod33.ZodOptional<zod33.ZodNullable<zod33.ZodString>>;
|
|
1989
2007
|
config: zod33.ZodRecord<zod33.ZodString, zod33.ZodUnknown>;
|
|
1990
2008
|
enabled: zod33.ZodDefault<zod33.ZodOptional<zod33.ZodBoolean>>;
|
|
1991
2009
|
}, better_auth0.$strip>>) => Promise<{
|
|
2010
|
+
slug: string | null;
|
|
1992
2011
|
name: string | null;
|
|
1993
2012
|
id: string;
|
|
1994
2013
|
createdAt: Date;
|
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { A as literal, C as variantsSchema, D as any, E as _enum, F as union, I as unknown, M as object, N as record, O as array, P as string, S as variantVersionsSchema, T as zod_default, _ as environmentsSchema, a as matchType, b as schemas, c as logger, d as validatePartialTableData, f as validateTableData, g as environmentSecretsSchema, h as configsSchema, i as getMigrations, j as number, k as boolean, l as parsePartialTableData, m as configVariantsSchema, n as createDatabaseFromConnection, o as runAutoMigrations, p as SCHEMA_METADATA, r as detectDatabaseType, s as getAuthClientOptions, t as createDatabase, u as parseTableData, v as llmRequestsSchema, w as workspaceSettingsSchema, x as targetingRulesSchema, y as providerConfigsSchema } from "./db-
|
|
1
|
+
import { A as literal, C as variantsSchema, D as any, E as _enum, F as union, I as unknown, M as object, N as record, O as array, P as string, S as variantVersionsSchema, T as zod_default, _ as environmentsSchema, a as matchType, b as schemas, c as logger, d as validatePartialTableData, f as validateTableData, g as environmentSecretsSchema, h as configsSchema, i as getMigrations, j as number, k as boolean, l as parsePartialTableData, m as configVariantsSchema, n as createDatabaseFromConnection, o as runAutoMigrations, p as SCHEMA_METADATA, r as detectDatabaseType, s as getAuthClientOptions, t as createDatabase, u as parseTableData, v as llmRequestsSchema, w as workspaceSettingsSchema, x as targetingRulesSchema, y as providerConfigsSchema } from "./db-B-EsQtOz.mjs";
|
|
2
2
|
import { n as executeWithSchema, t as createNeonDialect } from "./neon-dialect-DySGBYUi.mjs";
|
|
3
3
|
import gateway from "@llmops/gateway";
|
|
4
4
|
import { sql } from "kysely";
|
|
@@ -1795,14 +1795,33 @@ const createLLMRequestsDataLayer = (db) => {
|
|
|
1795
1795
|
|
|
1796
1796
|
//#endregion
|
|
1797
1797
|
//#region src/datalayer/providerConfigs.ts
|
|
1798
|
+
/**
|
|
1799
|
+
* Generate a unique slug for a provider config.
|
|
1800
|
+
* If the base slug already exists, appends -01, -02, etc.
|
|
1801
|
+
*/
|
|
1802
|
+
async function generateUniqueSlug(db, baseSlug) {
|
|
1803
|
+
const existing = await db.selectFrom("provider_configs").select("slug").where("slug", "like", `${baseSlug}%`).execute();
|
|
1804
|
+
if (existing.length === 0) return baseSlug;
|
|
1805
|
+
const existingSlugs = new Set(existing.map((e) => e.slug));
|
|
1806
|
+
if (!existingSlugs.has(baseSlug)) return baseSlug;
|
|
1807
|
+
let counter = 1;
|
|
1808
|
+
while (counter < 100) {
|
|
1809
|
+
const candidateSlug = `${baseSlug}-${counter.toString().padStart(2, "0")}`;
|
|
1810
|
+
if (!existingSlugs.has(candidateSlug)) return candidateSlug;
|
|
1811
|
+
counter++;
|
|
1812
|
+
}
|
|
1813
|
+
return `${baseSlug}-${randomUUID().slice(0, 8)}`;
|
|
1814
|
+
}
|
|
1798
1815
|
const createProviderConfig = zod_default.object({
|
|
1799
1816
|
providerId: zod_default.string().min(1),
|
|
1817
|
+
slug: zod_default.string().nullable().optional(),
|
|
1800
1818
|
name: zod_default.string().nullable().optional(),
|
|
1801
1819
|
config: zod_default.record(zod_default.string(), zod_default.unknown()),
|
|
1802
1820
|
enabled: zod_default.boolean().optional().default(true)
|
|
1803
1821
|
});
|
|
1804
1822
|
const updateProviderConfig = zod_default.object({
|
|
1805
1823
|
id: zod_default.uuidv4(),
|
|
1824
|
+
slug: zod_default.string().nullable().optional(),
|
|
1806
1825
|
name: zod_default.string().nullable().optional(),
|
|
1807
1826
|
config: zod_default.record(zod_default.string(), zod_default.unknown()).optional(),
|
|
1808
1827
|
enabled: zod_default.boolean().optional()
|
|
@@ -1819,10 +1838,12 @@ const createProviderConfigsDataLayer = (db) => {
|
|
|
1819
1838
|
createProviderConfig: async (params) => {
|
|
1820
1839
|
const value = await createProviderConfig.safeParseAsync(params);
|
|
1821
1840
|
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
1822
|
-
const { providerId, name, config, enabled } = value.data;
|
|
1841
|
+
const { providerId, slug, name, config, enabled } = value.data;
|
|
1842
|
+
const finalSlug = slug ?? await generateUniqueSlug(db, providerId);
|
|
1823
1843
|
return db.insertInto("provider_configs").values({
|
|
1824
1844
|
id: randomUUID(),
|
|
1825
1845
|
providerId,
|
|
1846
|
+
slug: finalSlug,
|
|
1826
1847
|
name: name ?? null,
|
|
1827
1848
|
config: JSON.stringify(config),
|
|
1828
1849
|
enabled,
|
|
@@ -1833,8 +1854,9 @@ const createProviderConfigsDataLayer = (db) => {
|
|
|
1833
1854
|
updateProviderConfig: async (params) => {
|
|
1834
1855
|
const value = await updateProviderConfig.safeParseAsync(params);
|
|
1835
1856
|
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
1836
|
-
const { id, name, config, enabled } = value.data;
|
|
1857
|
+
const { id, slug, name, config, enabled } = value.data;
|
|
1837
1858
|
const updateData = { updatedAt: (/* @__PURE__ */ new Date()).toISOString() };
|
|
1859
|
+
if (slug !== void 0) updateData.slug = slug;
|
|
1838
1860
|
if (name !== void 0) updateData.name = name;
|
|
1839
1861
|
if (config !== void 0) updateData.config = JSON.stringify(config);
|
|
1840
1862
|
if (enabled !== void 0) updateData.enabled = enabled;
|
|
@@ -1871,17 +1893,23 @@ const createProviderConfigsDataLayer = (db) => {
|
|
|
1871
1893
|
upsertProviderConfig: async (params) => {
|
|
1872
1894
|
const value = await createProviderConfig.safeParseAsync(params);
|
|
1873
1895
|
if (!value.success) throw new LLMOpsError(`Invalid parameters: ${value.error.message}`);
|
|
1874
|
-
const { providerId, name, config, enabled } = value.data;
|
|
1896
|
+
const { providerId, slug, name, config, enabled } = value.data;
|
|
1875
1897
|
const existing = await db.selectFrom("provider_configs").selectAll().where("providerId", "=", providerId).executeTakeFirst();
|
|
1876
|
-
if (existing)
|
|
1877
|
-
|
|
1878
|
-
|
|
1879
|
-
|
|
1880
|
-
|
|
1881
|
-
|
|
1898
|
+
if (existing) {
|
|
1899
|
+
const finalSlug$1 = slug ?? existing.slug ?? await generateUniqueSlug(db, providerId);
|
|
1900
|
+
return db.updateTable("provider_configs").set({
|
|
1901
|
+
slug: finalSlug$1,
|
|
1902
|
+
name: name ?? existing.name,
|
|
1903
|
+
config: JSON.stringify(config),
|
|
1904
|
+
enabled,
|
|
1905
|
+
updatedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
1906
|
+
}).where("id", "=", existing.id).returningAll().executeTakeFirst();
|
|
1907
|
+
}
|
|
1908
|
+
const finalSlug = slug ?? await generateUniqueSlug(db, providerId);
|
|
1882
1909
|
return db.insertInto("provider_configs").values({
|
|
1883
1910
|
id: randomUUID(),
|
|
1884
1911
|
providerId,
|
|
1912
|
+
slug: finalSlug,
|
|
1885
1913
|
name: name ?? null,
|
|
1886
1914
|
config: JSON.stringify(config),
|
|
1887
1915
|
enabled,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@llmops/core",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.14",
|
|
4
4
|
"description": "Core LLMOps functionality and utilities",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
"kysely": "^0.28.8",
|
|
55
55
|
"kysely-neon": "^2.0.2",
|
|
56
56
|
"pino": "^10.1.0",
|
|
57
|
-
"@llmops/gateway": "^0.2.
|
|
57
|
+
"@llmops/gateway": "^0.2.14"
|
|
58
58
|
},
|
|
59
59
|
"devDependencies": {
|
|
60
60
|
"@types/ws": "^8.18.1"
|