@runnerpro/backend 1.33.0 → 1.34.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.
@@ -0,0 +1,153 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.urlPublica = exports.Storage = exports.Contenedor = exports.Archivo = exports.TIPO_POR_DEFECTO = void 0;
13
+ /**
14
+ * Almacenamiento de archivos en Azure Blob Storage.
15
+ *
16
+ * Expone la MISMA forma que el cliente de `@google-cloud/storage` que había antes
17
+ * (`storage.bucket(nombre).file(ruta).save()/download()/exists()/delete()`), para que los
18
+ * puntos de llamada no cambien más allá del import. Se migró el 19-ago-2026: los servicios
19
+ * ya corrían en Azure pero seguían escribiendo en los cubos de Google, así que cada archivo
20
+ * nuevo nacía en la nube que estábamos apagando.
21
+ *
22
+ * El "nombre de cubo" es ahora `cuenta/contenedor` (p.ej. `rppublicprod/public`), que es lo
23
+ * que llevan las variables CLOUD_STORAGE_BUCKET y CLOUD_STORAGE_BUCKET_PUBLIC. La clave de
24
+ * cada cuenta se lee de `AZURE_STORAGE_KEY_<CUENTA EN MAYÚSCULAS>`.
25
+ *
26
+ * Gemelo de `Cliente-backend/src/utils/almacenamiento.js`: si cambias uno, cambia el otro.
27
+ */
28
+ const storage_blob_1 = require("@azure/storage-blob");
29
+ /**
30
+ * Tipo por defecto cuando quien sube no dice cuál es. Es exactamente lo que ponía Google en
31
+ * los archivos sin extensión (los mapas de entreno no la tienen), así que respetarlo evita
32
+ * que un archivo servido cambie de tipo al migrar.
33
+ */
34
+ exports.TIPO_POR_DEFECTO = 'application/octet-stream';
35
+ /** Reintentos por defecto del SDK de Azure si nadie pide otra cosa. Son los suyos. */
36
+ const REINTENTOS_POR_DEFECTO = 4;
37
+ /** Clientes ya construidos, por cuenta+presupuesto. Uno por petición sería tirar conexiones. */
38
+ const clientesPorCuenta = new Map();
39
+ /**
40
+ * Nombres de los cubos viejos de Google y dónde viven ahora en Azure.
41
+ *
42
+ * Está aquí para que el despliegue no tenga que ser coordinado: los consumidores piden el
43
+ * paquete con `^1.31`, así que cualquier servicio que se redespliegue por un motivo ajeno se
44
+ * trae esta versión. Si además hubiera que haber cambiado sus variables a mano y en el mismo
45
+ * momento, ese servicio subiría a ninguna parte hasta que alguien se diera cuenta. Con la
46
+ * traducción aquí, la configuración vieja sigue funcionando y cambiar las variables pasa a ser
47
+ * limpieza, no un requisito.
48
+ */
49
+ const CUBOS_ANTIGUOS = {
50
+ web_runnerpro: 'rpwebprod/web',
51
+ runnerpro_public_prod: 'rppublicprod/public',
52
+ assets_runnerpro: 'rppublicprod/assets',
53
+ };
54
+ const partirNombre = (nombre) => {
55
+ if (!nombre) {
56
+ throw new Error('almacenamiento: falta el nombre del contenedor (cuenta/contenedor)');
57
+ }
58
+ const [cuenta, contenedor] = (CUBOS_ANTIGUOS[nombre] || nombre).split('/');
59
+ if (!cuenta || !contenedor) {
60
+ throw new Error(`almacenamiento: "${nombre}" no tiene la forma cuenta/contenedor (p.ej. rppublicprod/public)`);
61
+ }
62
+ return { cuenta, contenedor };
63
+ };
64
+ const clienteDeCuenta = (cuenta, presupuestoS) => {
65
+ const llave = `${cuenta}|${presupuestoS || 0}`;
66
+ const yaEsta = clientesPorCuenta.get(llave);
67
+ if (yaEsta)
68
+ return yaEsta;
69
+ const clave = process.env[`AZURE_STORAGE_KEY_${cuenta.toUpperCase()}`];
70
+ if (!clave) {
71
+ throw new Error(`almacenamiento: falta la variable AZURE_STORAGE_KEY_${cuenta.toUpperCase()}`);
72
+ }
73
+ const opciones = presupuestoS
74
+ ? {
75
+ retryOptions: {
76
+ maxTries: REINTENTOS_POR_DEFECTO,
77
+ tryTimeoutInMs: Math.floor((presupuestoS * 1000) / REINTENTOS_POR_DEFECTO),
78
+ },
79
+ }
80
+ : undefined;
81
+ const cliente = new storage_blob_1.BlobServiceClient(`https://${cuenta}.blob.core.windows.net`, new storage_blob_1.StorageSharedKeyCredential(cuenta, clave), opciones);
82
+ clientesPorCuenta.set(llave, cliente);
83
+ return cliente;
84
+ };
85
+ /**
86
+ * Un archivo dentro de un contenedor. `download()` y `exists()` devuelven ARRAY porque así
87
+ * lo desestructura el código que ya existe (`const [data] = await ....download()`).
88
+ */
89
+ class Archivo {
90
+ constructor(contenedor, ruta) {
91
+ this.ruta = ruta;
92
+ this.blob = contenedor.getBlockBlobClient(ruta);
93
+ }
94
+ save(datos, opciones = {}) {
95
+ return __awaiter(this, void 0, void 0, function* () {
96
+ const buffer = Buffer.isBuffer(datos) ? datos : Buffer.from(datos);
97
+ yield this.blob.uploadData(buffer, {
98
+ blobHTTPHeaders: { blobContentType: opciones.contentType || exports.TIPO_POR_DEFECTO },
99
+ });
100
+ });
101
+ }
102
+ download() {
103
+ return __awaiter(this, void 0, void 0, function* () {
104
+ return [yield this.blob.downloadToBuffer()];
105
+ });
106
+ }
107
+ exists() {
108
+ return __awaiter(this, void 0, void 0, function* () {
109
+ return [yield this.blob.exists()];
110
+ });
111
+ }
112
+ delete() {
113
+ return __awaiter(this, void 0, void 0, function* () {
114
+ yield this.blob.deleteIfExists();
115
+ });
116
+ }
117
+ }
118
+ exports.Archivo = Archivo;
119
+ /** Un contenedor. Equivale al `Bucket` de Google. */
120
+ class Contenedor {
121
+ constructor(nombre, presupuestoS) {
122
+ const { cuenta, contenedor } = partirNombre(nombre);
123
+ this.contenedor = clienteDeCuenta(cuenta, presupuestoS).getContainerClient(contenedor);
124
+ }
125
+ file(ruta) {
126
+ return new Archivo(this.contenedor, ruta);
127
+ }
128
+ }
129
+ exports.Contenedor = Contenedor;
130
+ /** Equivale al `Storage` de Google: `new Storage().bucket(nombre)`. */
131
+ class Storage {
132
+ /**
133
+ * Acepta el mismo objeto de opciones que el cliente de Google. `keyFilename` se ignora (la
134
+ * credencial de Azure va por variable de entorno); `retryOptions.totalTimeout` sí se respeta.
135
+ */
136
+ constructor(opciones = {}) {
137
+ var _a;
138
+ this.presupuestoS = (_a = opciones === null || opciones === void 0 ? void 0 : opciones.retryOptions) === null || _a === void 0 ? void 0 : _a.totalTimeout;
139
+ }
140
+ bucket(nombre) {
141
+ return new Contenedor(nombre, this.presupuestoS);
142
+ }
143
+ }
144
+ exports.Storage = Storage;
145
+ /**
146
+ * Dirección pública de un archivo. Sustituye a los
147
+ * `https://storage.googleapis.com/${bucket}/${ruta}` que se construían a mano.
148
+ */
149
+ const urlPublica = (nombre, ruta) => {
150
+ const { cuenta, contenedor } = partirNombre(nombre);
151
+ return `https://${cuenta}.blob.core.windows.net/${contenedor}/${ruta}`;
152
+ };
153
+ exports.urlPublica = urlPublica;
package/lib/cjs/index.js CHANGED
@@ -23,8 +23,9 @@ var __importStar = (this && this.__importStar) || function (mod) {
23
23
  return result;
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.describeImage = exports.transcribeAudio = exports.updateSenderView = exports.saveResponseTime = exports.getZone = exports.saveDoneStructuraWorkout = exports.computeStreakStats = exports.getUnlockedAchievements = exports.evaluateAchievementsBounded = exports.evaluateAchievements = exports.saveWorkoutLaps = exports.saveWorkoutAplication = exports.getPlanificacionPrueba7dias = exports.sendWorkoutToWatch = exports.getDefaultWorkoutImage = exports.generateShareMap = exports.reduceSizeImage = exports.getLetter = exports.getNumberByLetter = exports.appendSheet = exports.writeSheet = exports.findCellByValue = exports.readSheet = exports.NOTION_DATABASES_ID = exports.notionEditPage = exports.notionAddPage = exports.notionGetDatabase = exports.notionGetUsers = exports.getCountNotificaciones = exports.chatExposed = exports.chatApi = exports.chat = exports.getExerciseTranslatedDescription = exports.useTranslation = exports.LANGUAGES = exports.translate = exports.CHANNEL_SLACK = exports.notifySlack = exports.fetchIA = exports.err = exports.sendMail = exports.pool = exports.toPgArray = exports.batchQuery = exports.longRunningQuery = exports.queryWithClient = exports.query = exports.sleep = exports.sendNotification = exports.achievementsCatalog = void 0;
27
- exports.calculateCost = exports.MODEL_PRICING = exports.AISTUDIO_PREFIX = exports.BEDROCK_CLAUDE_HAIKU = exports.BEDROCK_CLAUDE_SONNET_4 = exports.BEDROCK_CLAUDE_SONNET_4_5 = exports.BEDROCK_CLAUDE_OPUS_4_1 = exports.BEDROCK_CLAUDE_OPUS_4_5 = exports.BEDROCK_CLAUDE_SONNET = exports.BEDROCK_CLAUDE_OPUS = exports.FALLBACK_MODELS = exports.PRODUCTION_MODELS = exports.AZURE_FALLBACK_MODELS = exports.AZURE_PRIMARY_MODELS = exports.AZURE_DEEPSEEK_V4_FLASH = exports.AZURE_DEEPSEEK_V4_PRO = exports.AZURE_GPT_5_4_NANO = exports.AZURE_GPT_5_4_MINI = exports.AZURE_GPT_5_6_LUNA = exports.AZURE_GPT_5_6_TERRA = exports.AZURE_GPT_5_6_SOL = exports.AZURE_GPT_5_5 = exports.AZURE_DEEPSEEK_V4_FLASH_DEPLOYMENT = exports.AZURE_DEEPSEEK_V4_PRO_DEPLOYMENT = exports.AZURE_GPT_5_4_NANO_DEPLOYMENT = exports.AZURE_GPT_5_4_MINI_DEPLOYMENT = exports.AZURE_GPT_5_6_LUNA_DEPLOYMENT = exports.AZURE_GPT_5_6_TERRA_DEPLOYMENT = exports.AZURE_GPT_5_6_SOL_DEPLOYMENT = exports.AZURE_GPT_5_5_DEPLOYMENT = exports.AZURE_PREFIX = exports.GOOGLE_MODELS = exports.AI_MODELS = exports.MODEL_TIER = exports.runWithModels = exports.runWithCostTracking = exports.createModelFromString = exports.createAzureModelFromString = exports.createBedrockModelFromString = exports.createGoogleModelFromString = exports.createGoogleModel = exports.generateText = exports.generateObject = exports.reprocessRecentMedia = exports.processMediaFile = exports.analyzeFile = exports.describeTextFile = exports.describePdf = exports.describeVideo = void 0;
26
+ exports.saveDoneStructuraWorkout = exports.computeStreakStats = exports.getUnlockedAchievements = exports.evaluateAchievementsBounded = exports.evaluateAchievements = exports.saveWorkoutLaps = exports.saveWorkoutAplication = exports.getPlanificacionPrueba7dias = exports.sendWorkoutToWatch = exports.getDefaultWorkoutImage = exports.generateShareMap = exports.reduceSizeImage = exports.getLetter = exports.getNumberByLetter = exports.appendSheet = exports.writeSheet = exports.findCellByValue = exports.readSheet = exports.NOTION_DATABASES_ID = exports.notionEditPage = exports.notionAddPage = exports.notionGetDatabase = exports.notionGetUsers = exports.getCountNotificaciones = exports.chatExposed = exports.chatApi = exports.chat = exports.getExerciseTranslatedDescription = exports.useTranslation = exports.LANGUAGES = exports.translate = exports.CHANNEL_SLACK = exports.notifySlack = exports.fetchIA = exports.err = exports.sendMail = exports.pool = exports.toPgArray = exports.batchQuery = exports.longRunningQuery = exports.queryWithClient = exports.query = exports.sleep = exports.sendNotification = exports.TIPO_POR_DEFECTO = exports.urlPublica = exports.Archivo = exports.Contenedor = exports.StorageAzure = exports.achievementsCatalog = void 0;
27
+ exports.BEDROCK_CLAUDE_SONNET_4 = exports.BEDROCK_CLAUDE_SONNET_4_5 = exports.BEDROCK_CLAUDE_OPUS_4_1 = exports.BEDROCK_CLAUDE_OPUS_4_5 = exports.BEDROCK_CLAUDE_SONNET = exports.BEDROCK_CLAUDE_OPUS = exports.FALLBACK_MODELS = exports.PRODUCTION_MODELS = exports.AZURE_FALLBACK_MODELS = exports.AZURE_PRIMARY_MODELS = exports.AZURE_DEEPSEEK_V4_FLASH = exports.AZURE_DEEPSEEK_V4_PRO = exports.AZURE_GPT_5_4_NANO = exports.AZURE_GPT_5_4_MINI = exports.AZURE_GPT_5_6_LUNA = exports.AZURE_GPT_5_6_TERRA = exports.AZURE_GPT_5_6_SOL = exports.AZURE_GPT_5_5 = exports.AZURE_DEEPSEEK_V4_FLASH_DEPLOYMENT = exports.AZURE_DEEPSEEK_V4_PRO_DEPLOYMENT = exports.AZURE_GPT_5_4_NANO_DEPLOYMENT = exports.AZURE_GPT_5_4_MINI_DEPLOYMENT = exports.AZURE_GPT_5_6_LUNA_DEPLOYMENT = exports.AZURE_GPT_5_6_TERRA_DEPLOYMENT = exports.AZURE_GPT_5_6_SOL_DEPLOYMENT = exports.AZURE_GPT_5_5_DEPLOYMENT = exports.AZURE_PREFIX = exports.GOOGLE_MODELS = exports.AI_MODELS = exports.MODEL_TIER = exports.runWithModels = exports.runWithCostTracking = exports.createModelFromString = exports.createAzureModelFromString = exports.createBedrockModelFromString = exports.createGoogleModelFromString = exports.createGoogleModel = exports.generateText = exports.generateObject = exports.reprocessRecentMedia = exports.processMediaFile = exports.analyzeFile = exports.describeTextFile = exports.describePdf = exports.describeVideo = exports.describeImage = exports.transcribeAudio = exports.updateSenderView = exports.saveResponseTime = exports.getZone = void 0;
28
+ exports.calculateCost = exports.MODEL_PRICING = exports.AISTUDIO_PREFIX = exports.BEDROCK_CLAUDE_HAIKU = void 0;
28
29
  const sendNotification_1 = require("./sendNotification");
29
30
  Object.defineProperty(exports, "sendNotification", { enumerable: true, get: function () { return sendNotification_1.sendNotification; } });
30
31
  const sleep_1 = require("./sleep");
@@ -152,3 +153,9 @@ Object.defineProperty(exports, "BEDROCK_CLAUDE_HAIKU", { enumerable: true, get:
152
153
  Object.defineProperty(exports, "AISTUDIO_PREFIX", { enumerable: true, get: function () { return prompt_1.AISTUDIO_PREFIX; } });
153
154
  Object.defineProperty(exports, "MODEL_PRICING", { enumerable: true, get: function () { return prompt_1.MODEL_PRICING; } });
154
155
  Object.defineProperty(exports, "calculateCost", { enumerable: true, get: function () { return prompt_1.calculateCost; } });
156
+ var almacenamiento_1 = require("./almacenamiento");
157
+ Object.defineProperty(exports, "StorageAzure", { enumerable: true, get: function () { return almacenamiento_1.Storage; } });
158
+ Object.defineProperty(exports, "Contenedor", { enumerable: true, get: function () { return almacenamiento_1.Contenedor; } });
159
+ Object.defineProperty(exports, "Archivo", { enumerable: true, get: function () { return almacenamiento_1.Archivo; } });
160
+ Object.defineProperty(exports, "urlPublica", { enumerable: true, get: function () { return almacenamiento_1.urlPublica; } });
161
+ Object.defineProperty(exports, "TIPO_POR_DEFECTO", { enumerable: true, get: function () { return almacenamiento_1.TIPO_POR_DEFECTO; } });
@@ -0,0 +1,65 @@
1
+ /// <reference types="node" />
2
+ /**
3
+ * Almacenamiento de archivos en Azure Blob Storage.
4
+ *
5
+ * Expone la MISMA forma que el cliente de `@google-cloud/storage` que había antes
6
+ * (`storage.bucket(nombre).file(ruta).save()/download()/exists()/delete()`), para que los
7
+ * puntos de llamada no cambien más allá del import. Se migró el 19-ago-2026: los servicios
8
+ * ya corrían en Azure pero seguían escribiendo en los cubos de Google, así que cada archivo
9
+ * nuevo nacía en la nube que estábamos apagando.
10
+ *
11
+ * El "nombre de cubo" es ahora `cuenta/contenedor` (p.ej. `rppublicprod/public`), que es lo
12
+ * que llevan las variables CLOUD_STORAGE_BUCKET y CLOUD_STORAGE_BUCKET_PUBLIC. La clave de
13
+ * cada cuenta se lee de `AZURE_STORAGE_KEY_<CUENTA EN MAYÚSCULAS>`.
14
+ *
15
+ * Gemelo de `Cliente-backend/src/utils/almacenamiento.js`: si cambias uno, cambia el otro.
16
+ */
17
+ import { ContainerClient } from '@azure/storage-blob';
18
+ /**
19
+ * Tipo por defecto cuando quien sube no dice cuál es. Es exactamente lo que ponía Google en
20
+ * los archivos sin extensión (los mapas de entreno no la tienen), así que respetarlo evita
21
+ * que un archivo servido cambie de tipo al migrar.
22
+ */
23
+ export declare const TIPO_POR_DEFECTO = "application/octet-stream";
24
+ /**
25
+ * Un archivo dentro de un contenedor. `download()` y `exists()` devuelven ARRAY porque así
26
+ * lo desestructura el código que ya existe (`const [data] = await ....download()`).
27
+ */
28
+ export declare class Archivo {
29
+ ruta: string;
30
+ private blob;
31
+ constructor(contenedor: ContainerClient, ruta: string);
32
+ save(datos: Buffer | string, opciones?: {
33
+ contentType?: string;
34
+ }): Promise<void>;
35
+ download(): Promise<[Buffer]>;
36
+ exists(): Promise<[boolean]>;
37
+ delete(): Promise<void>;
38
+ }
39
+ /** Un contenedor. Equivale al `Bucket` de Google. */
40
+ export declare class Contenedor {
41
+ private contenedor;
42
+ constructor(nombre?: string, presupuestoS?: number);
43
+ file(ruta: string): Archivo;
44
+ }
45
+ /** Equivale al `Storage` de Google: `new Storage().bucket(nombre)`. */
46
+ export declare class Storage {
47
+ private presupuestoS?;
48
+ /**
49
+ * Acepta el mismo objeto de opciones que el cliente de Google. `keyFilename` se ignora (la
50
+ * credencial de Azure va por variable de entorno); `retryOptions.totalTimeout` sí se respeta.
51
+ */
52
+ constructor(opciones?: {
53
+ keyFilename?: string;
54
+ retryOptions?: {
55
+ totalTimeout?: number;
56
+ };
57
+ });
58
+ bucket(nombre?: string): Contenedor;
59
+ }
60
+ /**
61
+ * Dirección pública de un archivo. Sustituye a los
62
+ * `https://storage.googleapis.com/${bucket}/${ruta}` que se construían a mano.
63
+ */
64
+ export declare const urlPublica: (nombre: string | undefined, ruta: string) => string;
65
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/almacenamiento/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAiD,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAErG;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,6BAA6B,CAAC;AAiE3D;;;GAGG;AACH,qBAAa,OAAO;IAG8B,IAAI,EAAE,MAAM;IAF5D,OAAO,CAAC,IAAI,CAAC;gBAED,UAAU,EAAE,eAAe,EAAS,IAAI,EAAE,MAAM;IAItD,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,QAAQ,GAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAOpF,QAAQ,IAAI,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC;IAI7B,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC;IAI5B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CAG9B;AAED,qDAAqD;AACrD,qBAAa,UAAU;IACrB,OAAO,CAAC,UAAU,CAAkB;gBAExB,MAAM,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM;IAKlD,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAG5B;AAED,uEAAuE;AACvE,qBAAa,OAAO;IAClB,OAAO,CAAC,YAAY,CAAC,CAAS;IAE9B;;;OAGG;gBACS,QAAQ,GAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE;YAAE,YAAY,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAO;IAI7F,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,UAAU;CAGpC;AAED;;;GAGG;AACH,eAAO,MAAM,UAAU,WAAY,MAAM,GAAG,SAAS,QAAQ,MAAM,KAAG,MAGrE,CAAC"}
@@ -24,5 +24,6 @@ import { saveResponseTime } from './chat/saveResponseTime';
24
24
  import { updateSenderView } from './chat/api/conversation';
25
25
  import { transcribeAudio, describeImage, describeVideo, describePdf, describeTextFile, analyzeFile, processMediaFile, reprocessRecentMedia } from './mediaProcessing';
26
26
  import { generateObject, generateText, createGoogleModel, createGoogleModelFromString, createBedrockModelFromString, createAzureModelFromString, createModelFromString, runWithCostTracking, runWithModels, MODEL_TIER, AI_MODELS, GOOGLE_MODELS, AZURE_PREFIX, AZURE_GPT_5_5_DEPLOYMENT, AZURE_GPT_5_6_SOL_DEPLOYMENT, AZURE_GPT_5_6_TERRA_DEPLOYMENT, AZURE_GPT_5_6_LUNA_DEPLOYMENT, AZURE_GPT_5_4_MINI_DEPLOYMENT, AZURE_GPT_5_4_NANO_DEPLOYMENT, AZURE_DEEPSEEK_V4_PRO_DEPLOYMENT, AZURE_DEEPSEEK_V4_FLASH_DEPLOYMENT, AZURE_GPT_5_5, AZURE_GPT_5_6_SOL, AZURE_GPT_5_6_TERRA, AZURE_GPT_5_6_LUNA, AZURE_GPT_5_4_MINI, AZURE_GPT_5_4_NANO, AZURE_DEEPSEEK_V4_PRO, AZURE_DEEPSEEK_V4_FLASH, AZURE_PRIMARY_MODELS, AZURE_FALLBACK_MODELS, PRODUCTION_MODELS, FALLBACK_MODELS, BEDROCK_CLAUDE_OPUS, BEDROCK_CLAUDE_SONNET, BEDROCK_CLAUDE_OPUS_4_5, BEDROCK_CLAUDE_OPUS_4_1, BEDROCK_CLAUDE_SONNET_4_5, BEDROCK_CLAUDE_SONNET_4, BEDROCK_CLAUDE_HAIKU, AISTUDIO_PREFIX, MODEL_PRICING, calculateCost } from './prompt';
27
+ export { Storage as StorageAzure, Contenedor, Archivo, urlPublica, TIPO_POR_DEFECTO, } from './almacenamiento';
27
28
  export { sendNotification, sleep, query, queryWithClient, longRunningQuery, batchQuery, toPgArray, pool, sendMail, err, fetchIA, notifySlack, CHANNEL_SLACK, translate, LANGUAGES, useTranslation, getExerciseTranslatedDescription, chat, chatApi, chatExposed, getCountNotificaciones, notionGetUsers, notionGetDatabase, notionAddPage, notionEditPage, NOTION_DATABASES_ID, readSheet, findCellByValue, writeSheet, appendSheet, getNumberByLetter, getLetter, reduceSizeImage, generateShareMap, getDefaultWorkoutImage, sendWorkoutToWatch, getPlanificacionPrueba7dias, saveWorkoutAplication, saveWorkoutLaps, evaluateAchievements, evaluateAchievementsBounded, getUnlockedAchievements, computeStreakStats, saveDoneStructuraWorkout, getZone, saveResponseTime, updateSenderView, transcribeAudio, describeImage, describeVideo, describePdf, describeTextFile, analyzeFile, processMediaFile, reprocessRecentMedia, generateObject, generateText, createGoogleModel, createGoogleModelFromString, createBedrockModelFromString, createAzureModelFromString, createModelFromString, runWithCostTracking, runWithModels, MODEL_TIER, AI_MODELS, GOOGLE_MODELS, AZURE_PREFIX, AZURE_GPT_5_5_DEPLOYMENT, AZURE_GPT_5_6_SOL_DEPLOYMENT, AZURE_GPT_5_6_TERRA_DEPLOYMENT, AZURE_GPT_5_6_LUNA_DEPLOYMENT, AZURE_GPT_5_4_MINI_DEPLOYMENT, AZURE_GPT_5_4_NANO_DEPLOYMENT, AZURE_DEEPSEEK_V4_PRO_DEPLOYMENT, AZURE_DEEPSEEK_V4_FLASH_DEPLOYMENT, AZURE_GPT_5_5, AZURE_GPT_5_6_SOL, AZURE_GPT_5_6_TERRA, AZURE_GPT_5_6_LUNA, AZURE_GPT_5_4_MINI, AZURE_GPT_5_4_NANO, AZURE_DEEPSEEK_V4_PRO, AZURE_DEEPSEEK_V4_FLASH, AZURE_PRIMARY_MODELS, AZURE_FALLBACK_MODELS, PRODUCTION_MODELS, FALLBACK_MODELS, BEDROCK_CLAUDE_OPUS, BEDROCK_CLAUDE_SONNET, BEDROCK_CLAUDE_OPUS_4_5, BEDROCK_CLAUDE_OPUS_4_1, BEDROCK_CLAUDE_SONNET_4_5, BEDROCK_CLAUDE_SONNET_4, BEDROCK_CLAUDE_HAIKU, AISTUDIO_PREFIX, MODEL_PRICING, calculateCost, };
28
29
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"garmin.d.ts","sourceRoot":"","sources":["../../../../src/workout/garmin.ts"],"names":[],"mappings":"AAoBA,UAAU,iBAAiB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,iBAAiB,EAAE,CAAC;CAC7B;AAED,UAAU,aAAa;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,iBAAiB,EAAE,CAAC;CAC5B;AA4FD,QAAA,MAAM,sBAAsB,iCAyD3B,CAAC;AA+EF,QAAA,MAAM,mBAAmB;;;EAWxB,CAAC;AAEF,QAAA,MAAM,mBAAmB,6CASxB,CAAC;AAEF,QAAA,MAAM,mBAAmB,6CAMxB,CAAC;AAEF,QAAA,MAAM,qBAAqB,6CAU1B,CAAC;AAEF,QAAA,MAAM,2BAA2B,4DAWhC,CAAC;AAIF,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,2BAA2B,GAC5B,CAAC"}
1
+ {"version":3,"file":"garmin.d.ts","sourceRoot":"","sources":["../../../../src/workout/garmin.ts"],"names":[],"mappings":"AAoBA,UAAU,iBAAiB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,iBAAiB,EAAE,CAAC;CAC7B;AAED,UAAU,aAAa;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,iBAAiB,EAAE,CAAC;CAC5B;AAgHD,QAAA,MAAM,sBAAsB,iCA4D3B,CAAC;AAmFF,QAAA,MAAM,mBAAmB;;;EAcxB,CAAC;AAEF,QAAA,MAAM,mBAAmB,6CASxB,CAAC;AAEF,QAAA,MAAM,mBAAmB,6CAMxB,CAAC;AAEF,QAAA,MAAM,qBAAqB,6CAU1B,CAAC;AAEF,QAAA,MAAM,2BAA2B,4DAWhC,CAAC;AAIF,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,2BAA2B,GAC5B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"saveWorkoutAplication.d.ts","sourceRoot":"","sources":["../../../../src/workout/saveWorkoutAplication.ts"],"names":[],"mappings":"AAsTA;;;;;;;;;;GAUG;AACH,QAAA,MAAM,qBAAqB,SACnB,GAAG,UAED,GAAG,KACV,QAAQ,MAAM,GAAG,IAAI,CAqFvB,CAAC;AA0GF,OAAO,EAAE,qBAAqB,EAAE,CAAC"}
1
+ {"version":3,"file":"saveWorkoutAplication.d.ts","sourceRoot":"","sources":["../../../../src/workout/saveWorkoutAplication.ts"],"names":[],"mappings":"AAqTA;;;;;;;;;;GAUG;AACH,QAAA,MAAM,qBAAqB,SACnB,GAAG,UAED,GAAG,KACV,QAAQ,MAAM,GAAG,IAAI,CAqFvB,CAAC;AAuGF,OAAO,EAAE,qBAAqB,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"sendToWatch.d.ts","sourceRoot":"","sources":["../../../../src/workout/sendToWatch.ts"],"names":[],"mappings":"AAKA,QAAA,MAAM,kBAAkB;;;;;;EAmBvB,CAAC;AAEF,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
1
+ {"version":3,"file":"sendToWatch.d.ts","sourceRoot":"","sources":["../../../../src/workout/sendToWatch.ts"],"names":[],"mappings":"AAKA,QAAA,MAAM,kBAAkB;;;;;;EAuBvB,CAAC;AAEF,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
@@ -65,22 +65,40 @@ const garminOauthActivity = ({ url, httpMethod, userid, params = {} }) => __awai
65
65
  const secondsPerKmToMetersPerSecond = (secondsPerKm) => {
66
66
  return Math.round((1000 / secondsPerKm) * 100) / 100;
67
67
  };
68
+ /**
69
+ * Devuelve la metrica planificada como numero, o null si no la hay.
70
+ *
71
+ * OJO: Postgres devuelve las columnas `numeric` como TEXTO, asi que una distancia
72
+ * de 0 llega como la cadena "0", que en JS es truthy. Los entrenos de bici y
73
+ * natacion se planifican por tiempo y guardan `DISTANCE PLANNED` = 0: comparar
74
+ * en crudo hacia colar entrenos de 0 metros a Garmin.
75
+ */
76
+ const metricaPlanificada = (valor) => {
77
+ const n = Number(valor);
78
+ return Number.isFinite(n) && n > 0 ? n : null;
79
+ };
68
80
  const getWorkoutGarminDuration = (workout) => {
81
+ const distancia = metricaPlanificada(workout.distancePlanned);
82
+ const duracion = metricaPlanificada(workout.durationPlanned);
69
83
  const rangePlanning = (0, common_1.getWorkoutRangePlanning)({
70
84
  workoutType: workout.type,
71
85
  distancePlanned: workout.distancePlanned,
72
86
  durationPlanned: workout.durationPlanned,
73
87
  zonePlanned: workout.zonePlanned,
74
88
  });
75
- if (rangePlanning.fixedMetric === common_1.WORKOUT_FIXED_METRIC.TIME) {
89
+ // `fixedMetric` solo se calcula cuando hay rango de ritmo, y eso solo pasa en
90
+ // CORRER/COMPETICION. Para bici y natacion siempre es null, asi que sin este
91
+ // fallback caian SIEMPRE por distancia (y se enviaba un paso de 0 metros).
92
+ const prefiereTiempo = rangePlanning.fixedMetric === common_1.WORKOUT_FIXED_METRIC.TIME;
93
+ if (duracion && (prefiereTiempo || !distancia)) {
76
94
  return {
77
95
  type: 'TIME',
78
- value: Number(workout.durationPlanned),
96
+ value: duracion,
79
97
  };
80
98
  }
81
99
  return {
82
100
  type: 'DISTANCE',
83
- value: Number(workout.distancePlanned),
101
+ value: distancia,
84
102
  valueType: 'METER',
85
103
  };
86
104
  };
@@ -126,7 +144,10 @@ const translateWorkoutGarmin = (workout) => {
126
144
  });
127
145
  }
128
146
  else if (!workout.estructura) {
129
- if (!workout.distancePlanned || !workout.durationPlanned)
147
+ // Basta con una de las dos: bici/natacion se planifican por tiempo y correr
148
+ // por distancia. Exigir las dos (comparando ademas en crudo) era lo que
149
+ // dejaba fuera a los entrenos por tiempo.
150
+ if (!metricaPlanificada(workout.distancePlanned) && !metricaPlanificada(workout.durationPlanned))
130
151
  return null;
131
152
  const targetType = getWorkoutGarminTargetType(workout, null);
132
153
  const targetValue = getWorkoutGarminTargetValue(workout, null);
@@ -203,7 +224,11 @@ const getWorkoutGarminTargetValue = (workout, row) => {
203
224
  // } else {
204
225
  // El resto calcular el ritmo
205
226
  // No se puede añadir potencia ya que el valor que hay que dar es una zona, no absoluto
206
- value = Number(workout.distancePlanned) / Number(workout.durationPlanned);
227
+ const distancia = metricaPlanificada(workout.distancePlanned);
228
+ const duracion = metricaPlanificada(workout.durationPlanned);
229
+ // Sin las dos metricas no hay ritmo objetivo: el paso va sin target (que es
230
+ // lo que ya se hace hoy en natacion y Garmin acepta).
231
+ value = distancia && duracion ? distancia / duracion : null;
207
232
  paceRange = (0, common_1.getWorkoutRangePlanning)({
208
233
  workoutType: workout.type,
209
234
  distancePlanned: workout.distancePlanned,
@@ -247,6 +272,10 @@ const getWorkoutGarminTargetValue = (workout, row) => {
247
272
  };
248
273
  const createWorkoutGarmin = (userid, workout) => __awaiter(void 0, void 0, void 0, function* () {
249
274
  const workoutGarmin = translateWorkoutGarmin(workout);
275
+ // Sin payload no se manda nada: antes se hacia el POST con body null y Garmin
276
+ // respondia un error opaco.
277
+ if (!workoutGarmin)
278
+ throw new Error(`Workout ${workout.id} no es traducible a Garmin (sin estructura y sin distancia ni duracion)`);
250
279
  const data = yield garminOauthActivity({
251
280
  url: 'https://apis.garmin.com/training-api/workout',
252
281
  userid,
@@ -14,8 +14,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.saveWorkoutAplication = void 0;
16
16
  const db_1 = require("../db");
17
- const storage_1 = require("@google-cloud/storage");
18
- const path_1 = __importDefault(require("path"));
17
+ const almacenamiento_1 = require("../almacenamiento");
19
18
  const axios_1 = __importDefault(require("axios"));
20
19
  const generateShareMap_1 = require("../image/generateShareMap");
21
20
  const getDefaultWorkoutImage_1 = require("../image/getDefaultWorkoutImage");
@@ -440,8 +439,7 @@ const saveMap = (idWorkout, polyline) => __awaiter(void 0, void 0, void 0, funct
440
439
  if (!polyline)
441
440
  return;
442
441
  // @ts-ignore
443
- const serviceKey = path_1.default.join(process.cwd(), process.env.FIREBASE_STORAGE_CREDENTIALS);
444
- const storage = new storage_1.Storage({ keyFilename: serviceKey });
442
+ const storage = new almacenamiento_1.Storage();
445
443
  const encodedPolyline = encodeURIComponent(typeof polyline === 'string' ? polyline : getPolyline(polyline) || '');
446
444
  if (!encodedPolyline)
447
445
  return;
@@ -449,7 +447,7 @@ const saveMap = (idWorkout, polyline) => __awaiter(void 0, void 0, void 0, funct
449
447
  const imageBuffer = Buffer.from(result.data, 'binary');
450
448
  // @ts-ignore
451
449
  yield storage.bucket(process.env.CLOUD_STORAGE_BUCKET_PUBLIC).file(`Workout/${idWorkout}`).save(imageBuffer);
452
- const urlMap = `https://storage.googleapis.com/${process.env.CLOUD_STORAGE_BUCKET_PUBLIC}/Workout/${idWorkout}`;
450
+ const urlMap = (0, almacenamiento_1.urlPublica)(process.env.CLOUD_STORAGE_BUCKET_PUBLIC, `Workout/${idWorkout}`);
453
451
  try {
454
452
  yield (0, db_1.query)('UPDATE "WORKOUT" SET "HAVE MAP IMAGE" = TRUE, "PHOTO URL" = ? WHERE "ID" = ?', [urlMap, idWorkout]);
455
453
  }
@@ -461,9 +459,7 @@ const saveMap = (idWorkout, polyline) => __awaiter(void 0, void 0, void 0, funct
461
459
  }
462
460
  });
463
461
  const saveShareWorkoutImage = (id, type) => __awaiter(void 0, void 0, void 0, function* () {
464
- // @ts-ignore
465
- const serviceKey = path_1.default.join(process.cwd(), process.env.FIREBASE_STORAGE_CREDENTIALS);
466
- const storage = new storage_1.Storage({ keyFilename: serviceKey });
462
+ const storage = new almacenamiento_1.Storage();
467
463
  // @ts-ignore
468
464
  const [exists] = yield storage.bucket(process.env.CLOUD_STORAGE_BUCKET_PUBLIC).file(`Workout/${id}`).exists();
469
465
  let image;
@@ -479,7 +475,7 @@ const saveShareWorkoutImage = (id, type) => __awaiter(void 0, void 0, void 0, fu
479
475
  return;
480
476
  // @ts-ignore
481
477
  yield storage.bucket(process.env.CLOUD_STORAGE_BUCKET_PUBLIC).file(`Workout/${id}-share`).save(shareMap);
482
- const urlShare = `https://storage.googleapis.com/${process.env.CLOUD_STORAGE_BUCKET_PUBLIC}/Workout/${id}-share`;
478
+ const urlShare = (0, almacenamiento_1.urlPublica)(process.env.CLOUD_STORAGE_BUCKET_PUBLIC, `Workout/${id}-share`);
483
479
  try {
484
480
  yield (0, db_1.query)('UPDATE "WORKOUT" SET "PHOTO URL SHARE" = ? WHERE "ID" = ?', [urlShare, id]);
485
481
  }
@@ -28,6 +28,10 @@ const sendWorkoutToWatch = (clientId, workoutId) => __awaiter(void 0, void 0, vo
28
28
  const estructura = yield (0, db_1.query)('SELECT * FROM [WORKOUT STRUCTURE] WHERE [ID WORKOUT] = ? ORDER BY [INDEX]', [workoutId]);
29
29
  if (estructura.length > 0)
30
30
  workout.estructura = estructura;
31
+ // Si el entreno no se puede traducir, se avisa con un 400 legible en vez de
32
+ // dejar que el POST a Garmin reviente con un 500 opaco.
33
+ if (!(0, garmin_1.translateWorkoutGarmin)(workout))
34
+ return { error: 'Este entrenamiento no se puede enviar al reloj' };
31
35
  // Llamar a la función que envía el workout al Garmin
32
36
  const { workoutGarminId } = yield (0, garmin_1.createWorkoutGarmin)(clientId, workout);
33
37
  yield (0, garmin_1.scheduleWorkoutGarmin)(clientId, { date: (0, moment_1.default)(workout.date).format('YYYY-MM-DD'), workoutGarminId });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@runnerpro/backend",
3
- "version": "1.33.0",
3
+ "version": "1.34.0",
4
4
  "description": "A collection of common backend functions",
5
5
  "exports": {
6
6
  ".": "./lib/cjs/index.js"
@@ -68,6 +68,7 @@
68
68
  "@ai-sdk/azure": "^3.0.74",
69
69
  "@ai-sdk/google": "^3.0.43",
70
70
  "@ai-sdk/google-vertex": "^4.0.102",
71
+ "@azure/storage-blob": "^12.32.0",
71
72
  "@google-cloud/speech": "^7.2.1",
72
73
  "@google-cloud/storage": "^7.11.3",
73
74
  "@google-cloud/translate": "^8.3.0",