';
}
// Same .tc-room skeleton as renderRoomRow (avatar/info/top/bottom) so a group row matches the
// 1:1 rows visually — data-type="group" + data-gid instead of data-cid/data-uid is what the
// click-delegation in renderRooms() switches on. No online/typing indicator (doesn't apply to
// a group), and the avatar is a rounded square instead of a circle as the only visual cue
// distinguishing a group from a person, mirroring common chat-app convention.
function renderGroupRow(group) {
var gid = group.gid;
var name = group.name || '';
var lastMsg = group.lastMessage;
var preview = '';
if (lastMsg) {
preview = parseDisplayText(lastMsg.msm);
if (!preview) {
if (lastMsg.urlima && lastMsg.urlima.indexOf('public://') >= 0) preview = '📷';
else if (lastMsg.urlaudi && lastMsg.urlaudi.indexOf('public://') >= 0) preview = '🎵';
}
if (String(lastMsg.whosend) === String(userId)) preview = 'You: ' + preview;
} else {
preview = 'No messages yet';
}
var timeStr = group.updated ? fmtTime(unixToDbTimestamp(group.updated)) : '';
var unread = group.unreadCount > 0;
var active = activeGid === gid;
return '
';
}
var body = '';
if (msg.urlima === '_loading_') {
body += '
📷 Sending…
';
} else if (msg.urlima && msg.urlima.indexOf('public://') >= 0) {
var src = msg.urlima.replace('public://', FILES_BASE);
body += '';
}
if (msg.urlaudi && msg.urlaudi.indexOf('public://') >= 0) {
var asrc = msg.urlaudi.replace('public://', FILES_BASE);
body += '';
}
if (meta && meta.type === 'loc') {
body += locationLinkHtml(meta.lat, meta.lng);
} else if (!isSalt && text) {
body += '
' + linkifyText(escHtml(text)) + '
';
}
var time = fmtTime(msg.timestamp || '');
return '
'
+ metaHtml + body
+ '' + escHtml(time) + ''
+ '
';
}
// ── Render group messages ────────────────────────────────────────────────────
function renderGroupMessages(gid) {
var msgs = allGroupMsgs[gid] || [];
var $el = $('#tc-msgs');
var order = msgs.slice().reverse();
$el.html(order.map(renderGroupMsg).join(''));
$el.scrollTop($el[0].scrollHeight);
}
// Same shape as renderMsg(), plus a sender-name label on incoming bubbles — unlike a 1:1
// conversation, "not me" doesn't tell you who actually sent it. Reuses the identical
// urlima/urlaudi rendering, so images/audio sent from the Android app (or sendGroupImage()
// here) display correctly. Audio still has no send control in this web widget.
function renderGroupMsg(msg) {
var isMe = String(msg.whosend) === String(userId);
var side = isMe ? 'tc-out' : 'tc-in';
var parsed = parseInlineMeta(msg.msm || '');
var text = parsed.text;
var meta = parsed.meta;
var isSalt = (text.length === 18 && text.indexOf(' ') < 0);
var senderHtml = '';
if (!isMe) {
senderHtml = '
' + escHtml(msg.senderName || msg.whosend) + '
';
}
var metaHtml = '';
if (meta && meta.type === 'fwd') {
metaHtml = '
';
}
// ── Send (opc 11) ────────────────────────────────────────────────────────────
function sendMessage() {
var text = $.trim($('#tc-input').val());
if (!text || !activeCid) return;
$('#tc-input').val('').focus();
isTyping = false;
post({ opc: '11', userid: userId, cid: activeCid, msm: text, fid: '0' })
.then(function (resp) {
if (!resp) return;
var ok = (resp.resp === 3 || resp.resp === '3' ||
resp.resp === 11 || resp.resp === '11');
if (!ok) return;
var msg = {
id: resp.lastmid || String(Date.now()),
whosend: String(userId),
msm: text,
urlima: '',
urlaudi: '',
timestamp: new Date().toISOString().replace('T', ' ').substr(0, 19)
};
if (!allMsgs[activeCid]) allMsgs[activeCid] = [];
allMsgs[activeCid].unshift(msg);
renderMessages(activeCid);
if (socket && socket.connected) {
socket.emit('send-message', {
id: resp.lastmid,
chatId: activeCid,
from: String(userId),
to: String(activeUid),
message: text,
type: 'text'
});
}
});
}
// ── Send group message ───────────────────────────────────────────────────────
// Purely socket-based — group-message-send both persists (tc_group_message, via the
// signaling server) and delivers, unlike 1:1's HTTP-then-socket-notify split. The server
// echoes the message back to the sender too (see group-message-send in signaling-server-2.js),
// so onGroupSocketMessage() is what actually appends it here — no optimistic local insert.
function sendGroupMessage() {
var text = $.trim($('#tc-input').val());
if (!text || !activeGid) return;
if (!socket || !socket.connected) return;
$('#tc-input').val('').focus();
isTyping = false;
socket.emit('group-message-send', {
gid: parseInt(activeGid, 10),
from: userId,
message: text,
type: 'text',
localId: 'web-' + Date.now() + '-' + Math.random().toString(36).substr(2, 8)
});
}
// ── Send group image (group-message-send, type:"image") ─────────────────────
// Unlike 1:1 (HTTP upload then socket notify), groups have no HTTP upload endpoint —
// the server expects the raw file as a base64 string on the same socket event used for
// text (see group-message-send in signaling-server-2.js), and does its own resize/compress
// (sharp, 1024x1024 max, jpeg75) server-side before writing it and echoing "group-message"
// back to every member including the sender. That echo is what onGroupSocketMessage() uses
// to both confirm this optimistic placeholder (matched by localId) and actually display it.
function sendGroupImage(file) {
if (!activeGid) return;
if (!socket || !socket.connected) return;
if (pendingGroupImage) return; // one at a time — button is disabled meanwhile anyway
var gid = activeGid;
var localId = 'web-img-' + Date.now() + '-' + Math.random().toString(36).substr(2, 8);
pendingGroupImage = { gid: gid, localId: localId };
if (!allGroupMsgs[gid]) allGroupMsgs[gid] = [];
allGroupMsgs[gid].unshift({
id: localId, localId: localId, whosend: String(userId), senderName: myName,
msm: '', urlima: '_loading_', urlaudi: '', created: Math.floor(Date.now() / 1000)
});
renderGroupMessages(gid);
$('#tc-img-btn').attr('disabled', 'disabled');
// Safety net — if the server/socket never answers at all (disconnect mid-flight etc.),
// don't leave "Sending…" stuck forever (see the 1:1 image-send bug this mirrors).
var timeoutId = setTimeout(function () { onGroupMessageError({}); }, 20000);
compressImageIfNeeded(file, function (uploadFile) {
var reader = new FileReader();
reader.onload = function () {
clearTimeout(timeoutId);
if (!pendingGroupImage || pendingGroupImage.localId !== localId) return; // already cleared
var base64 = (reader.result || '').split(',')[1] || '';
if (!base64 || !socket || !socket.connected) { onGroupMessageError({}); return; }
socket.emit('group-message-send', {
gid: parseInt(gid, 10),
from: userId,
message: '',
type: 'image',
filedata: base64,
localId: localId
});
};
reader.onerror = function () {
clearTimeout(timeoutId);
onGroupMessageError({});
};
reader.readAsDataURL(uploadFile);
});
}
// Clears whatever group image send is currently in flight — used both for explicit
// "group-message-error" replies (bad file, not a member, rate-limited) and the
// client-side timeout above. Doesn't distinguish by localId: only one send is ever
// in flight at a time (the button is disabled meanwhile), so there's nothing to match.
function onGroupMessageError(data) {
if (!pendingGroupImage) return;
var gid = pendingGroupImage.gid;
var localId = pendingGroupImage.localId;
pendingGroupImage = null;
$('#tc-img-btn').removeAttr('disabled');
if (allGroupMsgs[gid]) {
allGroupMsgs[gid] = allGroupMsgs[gid].filter(function (m) { return m.localId !== localId; });
}
if (activeGid === gid && isOpen) renderGroupMessages(gid);
if (data && data.error) { console.warn('group image send failed:', data.error); }
}
// Resizes/re-encodes as JPEG when a file exceeds COMPRESS_THRESHOLD. Skips GIFs —
// redrawing to canvas would flatten an animated GIF to a single static frame.
// Falls back to the original file untouched if decoding/encoding fails for any reason.
function compressImageIfNeeded(file, callback) {
if (file.size <= COMPRESS_THRESHOLD || file.type === 'image/gif') {
callback(file);
return;
}
var img = new Image();
var url = URL.createObjectURL(file);
img.onload = function () {
URL.revokeObjectURL(url);
var scale = Math.min(1, COMPRESS_MAX_DIM / Math.max(img.width, img.height));
var canvas = document.createElement('canvas');
canvas.width = Math.round(img.width * scale);
canvas.height = Math.round(img.height * scale);
canvas.getContext('2d').drawImage(img, 0, 0, canvas.width, canvas.height);
canvas.toBlob(function (blob) {
callback(blob || file, !!blob);
}, 'image/jpeg', COMPRESS_QUALITY);
};
img.onerror = function () {
URL.revokeObjectURL(url);
callback(file);
};
img.src = url;
}
// ── Send image (opc 11I) ─────────────────────────────────────────────────────
function sendImage(file) {
if (!activeCid) return;
var tempId = '_img_' + Date.now();
if (!allMsgs[activeCid]) allMsgs[activeCid] = [];
allMsgs[activeCid].unshift({
id: tempId, whosend: String(userId), msm: '', urlima: '_loading_',
urlaudi: '', timestamp: new Date().toISOString().replace('T', ' ').substr(0, 19)
});
renderMessages(activeCid);
// .attr()/.removeAttr(), not .prop() — this site's jQuery predates 1.6 (which is
// when .prop() was introduced), and every other call in this file sticks to
// pre-1.6-safe APIs already.
$('#tc-img-btn').attr('disabled', 'disabled');
compressImageIfNeeded(file, function (uploadFile, wasCompressed) {
var form = new FormData();
form.append('opc', '11I');
form.append('userid', String(userId));
form.append('cid', activeCid);
form.append('image', uploadFile, wasCompressed ? 'upload.jpg' : file.name);
fetch(API_URL, { method: 'POST', body: form })
.then(function (r) { return r.ok ? r.json() : null; })
.then(function (resp) {
allMsgs[activeCid] = allMsgs[activeCid].filter(function (m) { return m.id !== tempId; });
if (resp && (resp.resp === 3 || resp.resp === '3') && resp.urlima) {
var msg = {
id: resp.lastmid || String(Date.now()),
whosend: String(userId),
msm: '',
urlima: resp.urlima,
urlaudi: '',
timestamp: new Date().toISOString().replace('T', ' ').substr(0, 19)
};
allMsgs[activeCid].unshift(msg);
if (socket && socket.connected) {
socket.emit('send-message', {
id: resp.lastmid,
chatId: activeCid,
from: String(userId),
to: String(activeUid),
message: '',
urlima: resp.urlima,
type: 'image'
});
}
}
renderMessages(activeCid);
})
.catch(function () {
allMsgs[activeCid] = allMsgs[activeCid].filter(function (m) { return m.id !== tempId; });
renderMessages(activeCid);
})
.then(function () { $('#tc-img-btn').removeAttr('disabled'); });
});
}
// ── Inline meta parser ────────────────────────────────────────────────────────
function parseInlineMeta(raw) {
if (!raw) return { text: '', meta: null };
if (raw.substr(0, FWD_MARKER.length) === FWD_MARKER) {
var end = raw.indexOf(META_ETX);
if (end < 0) return { text: raw, meta: null };
var sender = raw.substring(FWD_MARKER.length, end);
return { text: raw.substring(end + 1), meta: { type: 'fwd', sender: sender } };
}
if (raw.substr(0, REPLY_MARKER.length) === REPLY_MARKER) {
var rend = raw.indexOf(META_ETX);
if (rend < 0) return { text: raw, meta: null };
var parts = raw.substring(REPLY_MARKER.length, rend);
var sep = parts.indexOf(META_SEP);
var rsender = sep >= 0 ? parts.substring(0, sep) : parts;
var orig = sep >= 0 ? parts.substring(sep + 1) : '';
return { text: raw.substring(rend + 1), meta: { type: 'reply', sender: rsender, orig: orig } };
}
// Shared location — same "lat" + META_SEP + "lng" encoding the Android app writes
// (see LOC_MARKER / sendLocationMessage() in ActivityChat.java). No trailing text.
if (raw.substr(0, LOC_MARKER.length) === LOC_MARKER) {
var lend = raw.indexOf(META_ETX);
if (lend < 0) return { text: raw, meta: null };
var coords = raw.substring(LOC_MARKER.length, lend);
var lsep = coords.indexOf(META_SEP);
var lat = lsep >= 0 ? coords.substring(0, lsep) : coords;
var lng = lsep >= 0 ? coords.substring(lsep + 1) : '';
return { text: raw.substring(lend + 1), meta: { type: 'loc', lat: lat, lng: lng } };
}
return { text: raw, meta: null };
}
function parseDisplayText(msm) {
var p = parseInlineMeta(msm || '');
var t = p.text;
if (p.meta && p.meta.type === 'loc') return '📍 ' + LOC_LABEL;
if (t.length === 18 && t.indexOf(' ') < 0) return '';
return (p.meta ? (p.meta.type === 'fwd' ? '↪ ' : '↩ ') : '') + t;
}
// ── Badge & notifications ─────────────────────────────────────────────────────
function updateBadge() {
var n = Object.keys(unreadCids).length;
Object.keys(allGroups).forEach(function (k) {
if (allGroups[k].unreadCount > 0) n++;
});
var $b = $('#tc-badge');
if (n > 0) { $b.text(n).removeClass('tc-hidden'); }
else { $b.addClass('tc-hidden'); }
}
function showNotif(title, body) {
if (!('Notification' in window)) return;
if (Notification.permission === 'granted') {
new Notification(title, {
body: body || '',
icon: 'https://www.taleoi.com/sites/default/files/taleoi.ico'
});
} else if (Notification.permission === 'default') {
Notification.requestPermission();
}
}
// ── HTTP ──────────────────────────────────────────────────────────────────────
function post(params) {
var form = new FormData();
Object.keys(params).forEach(function (k) { form.append(k, String(params[k])); });
return fetch(API_URL, { method: 'POST', body: form })
.then(function (r) { return r.ok ? r.json() : null; })
.catch(function () { return null; });
}
// ── Helpers ───────────────────────────────────────────────────────────────────
// Group timestamps (tc_group.updated, tc_group_message.created) are unix seconds, unlike
// 1:1's "YYYY-MM-DD HH:MM:SS" strings — converts to that same shape (local time) so both can
// share fmtTime() and the plain string comparison renderRooms() sorts by.
// Formatted with UTC getters, not local — fmtTime() (below) always treats this
// "YYYY-MM-DD HH:MM:SS" shape as UTC (appending 'Z' before parsing), matching the raw
// DB timestamp strings 1:1 chat passes it directly. Using local getters here would hand
// fmtTime() an already-local time it then re-shifts by the viewer's UTC offset again.
function unixToDbTimestamp(unixSec) {
if (!unixSec) return '0';
var d = new Date(unixSec * 1000);
function pad(n) { return (n < 10 ? '0' : '') + n; }
return d.getUTCFullYear() + '-' + pad(d.getUTCMonth() + 1) + '-' + pad(d.getUTCDate()) + ' '
+ pad(d.getUTCHours()) + ':' + pad(d.getUTCMinutes()) + ':' + pad(d.getUTCSeconds());
}
function fmtTime(ts) {
if (!ts) return '';
// DB timestamps are plain "YYYY-MM-DD HH:MM:SS" in UTC (MySQL TIMESTAMP column).
// Without a trailing 'Z', the JS Date parser treats a date-TIME string (unlike a
// date-only string) as local time, not UTC — silently shifting displayed times by
// the viewer's UTC offset. The 'Z' forces correct UTC interpretation.
var d = new Date(ts.replace(' ', 'T') + 'Z');
if (isNaN(d.getTime())) return '';
var now = new Date();
if (d.toDateString() === now.toDateString()) {
return d.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });
}
return (d.getMonth() + 1) + '/' + d.getDate();
}
function escHtml(s) {
return String(s == null ? '' : s)
.replace(/&/g, '&').replace(//g, '>')
.replace(/"/g, '"').replace(/'/g, ''');
}
function escAttr(s) { return escHtml(s); }
// Wraps http(s) URLs in a message's already-escaped text with clickable links. Must run
// AFTER escHtml() — matching against the escaped string is safe since escaping never
// introduces whitespace inside a URL run, and the entities it does introduce (e.g. "&"
// for a literal "&" in a query string) are exactly what a browser expects inside an href
// attribute anyway. target="_blank" + rel="noopener noreferrer" so following a link never
// navigates away from (or exposes window.opener to) the page the chat widget is floating on.
function linkifyText(escapedText) {
return escapedText.replace(/https?:\/\/[^\s<]+/g, function (url) {
var trail = '';
var m = url.match(/[.,!?:;)\]}'"]+$/);
if (m) { trail = m[0]; url = url.slice(0, -trail.length); }
if (!url) return trail;
return '' + url + '' + trail;
});
}
// A shared location (LOC_MARKER — see parseInlineMeta()) renders as a tappable card
// linking to Google Maps, matching how the Android app opens a geo: intent for the
// same coordinates. Uses an https:// maps URL instead since geo: isn't reliably
// clickable in desktop browsers.
function locationLinkHtml(lat, lng) {
var mapUrl = 'https://www.google.com/maps?q=' + encodeURIComponent(lat) + ',' + encodeURIComponent(lng);
return ''
+ '📍 ' + escHtml(LOC_LABEL) + '';
}
})(jQuery);
world taleoi | Page 21 | taleoi.com
Check Point Research descubre el primer ransomware nativo del navegador asistido por IA
Un modelo de IA logra razonar de manera autónoma para conectar un riesgo teórico de la web con una técnica funcional de secuestro de datos
Check Point Research, la división de Inteligencia de Amenazas de Check Point® Software Technologies Ltd. (NASDAQ: CHKP), pionero y líder global en soluciones de ciberseguridad, ha descubierto una muestra de malware en la que un modelo de IA cone...read more
Check Point Research, la división de Inteligencia de Amenazas de Check Point® Software Technologies Ltd. (NASDAQ: CHKP), pionero y líder global en soluciones de ciberseguridad, ha descubierto una muestra de malware en la que un modelo de IA conectó, de forma totalmente independiente, un riesgo de navegación teórico con una técnica operativa de ransomware, logrando el objetivo sin explotar vulnerabilidades del sistema, sin instalar aplicaciones y sin requerir conocimientos técnicos avanzados por parte del atacante.
Durante el análisis de cerca de 3.000 archivos atribuidos al modelo DeepSeek en telemetría pública, los expertos de Check Point Research han localizado una aplicación estructurada en Python Flask. En un primer vistazo, el código parecía una clásica “alucinación” de la IA: intentaba empaquetar de forma caótica un keylogger, un sistema de robo de credenciales, captura de webcam y una pantalla de bloqueo por ransomware en una única página web; funciones que los navegadores modernos bloquean por defecto de forma estricta. El modelo de IA había fallado en casi todo el diseño de infraestructura.
Sin embargo, oculto entre todo ese código ineficaz, los investigadores han desvelado un acierto crítico y alarmante: el código invocaba legítimamente la API nativa showDirectoryPicker(). Esta función estándar del navegador permite que una página web solicite acceso explícito a una carpeta local del dispositivo del usuario, lea los archivos internos, los modifique (los cifre) y los transmita a un servidor remoto de manera nativa. No requiere exploits ni descargas de malware tradicional. Todo se reduce a una petición de permiso en apariencia rutinaria.
El usuario que interactuó con la IA muy probablemente desconocía la existencia de esta API web. Al describir un objetivo malicioso de alto nivel en lenguaje natural, el modelo exploró de manera autónoma su conocimiento de las funciones legítimas de los navegadores para dar con una vía ejecutable. Este proceso de razonamiento propio de la IA para descubrir vectores de ataque inéditos supone un giro drástico en la ciberseguridad.
Mientras que los principales desarrolladores de IA del mercado (como OpenAI o Anthropic) han implementado estrictas barreras de seguridad y control normativo para rechazar categóricamente peticiones vinculadas a comportamientos de ransomware o robo de datos, la consistencia de DeepSeek es menor. “Al tratarse de un modelo gratuito y de libre acceso, las pruebas de Check Point Research confirmaron que una única solicitud genérica bastó para que el modelo generara una aplicación maliciosa completamente estructurada, algo que en otros entornos habría exigido múltiples interacciones complejas para eludir los filtros. Esto reduce drásticamente las barreras de entrada para actores de amenazas con nulas competencias técnicas”, explica, Ángel Salazar Gerente de Ingeniería de Canales en América Latina de Check Point Software.
Para verificar la viabilidad técnica de este vector de ataque, Check Point Research diseñó una prueba de concepto (PoC) en un entorno seguro: una herramienta web falsa de optimización de imágenes con IA. El flujo de interacción resulta sumamente natural para la víctima: el usuario selecciona una fotografía, la página web le solicita elegir una carpeta local para almacenar los supuestos resultados mejorados y este acepta el aviso del navegador de manera rutinaria. En segundo plano, mientras la web simula procesar la imagen, ejecuta el cifrado de la carpeta completa a través de la API de acceso a archivos. El ataque se ejecuta por completo dentro del navegador.
Este vector adquiere una gravedad extrema en el ecosistema Android. Tras la incorporación del soporte completo para la API de Acceso al Sistema de Archivos en Chrome 132, las pruebas de CPR en Chrome 148 ratificaron que una web maliciosa puede solicitar y obtener acceso directo a la carpeta DCIM (el directorio principal de imágenes del dispositivo). Este repositorio suele albergar años de fotografías personales, capturas de pantalla con información financiera, códigos de recuperación de cuentas o copias de documentos de identidad, cuya exfiltración o pérdida definitiva expone a los usuarios a extorsiones, brechas de reputación corporativa y pérdidas económicas. Actualmente, el ataque no es viable en iOS debido a que Safari no tiene expuesta dicha API.
Dado que no se requiere la descarga de archivos ejecutables tradicionales, Check Point Research aconseja adoptar de inmediato las siguientes pautas de defensa:
• Escrutinio riguroso de permisos: los usuarios deben desconfiar de cualquier ventana emergente que solicite acceso a carpetas locales. Es crucial evaluar qué sitio lo solicita y si realmente es necesario el permiso de escritura para realizar la tarea.
• Aislamiento de directorios: en caso de utilizar herramientas web desconocidas, se recomienda asignar exclusivamente una carpeta temporal completamente vacía. Nunca se debe dar acceso a la biblioteca principal de imágenes ni a directorios con información crítica o irremplazable.
• Copias de seguridad: mantener respaldos periódicos y externos garantiza que un secuestro de datos en el navegador nunca deje al usuario sin su única copia de la información.
• Protección preventiva proactiva: el mecanismo de ataque depende enteramente del engaño para atraer al usuario a un sitio fraudulento. Herramientas avanzadas como Check Point Threat Cloud Anti-Phishing son capaces de interceptar y bloquear las páginas maliciosas antes de que el usuario interactúe con ellas, anulando por completo la cadena de entrega del ataque.
Por ahora, Check Point Research no ha detectado evidencias de que esta técnica concreta esté siendo explotada en campañas activas. La publicación responde a una labor de prevención temprana dada la baja complejidad técnica que requiere su puesta en marcha en la actualidad.
Este análisis pone de manifiesto una transformación profunda en las ciberamenazas: históricamente, descubrir una nueva vía de ataque exigía alta especialización y pensamiento creativo humano. Hoy, la IA elimina ese cuello de botella, permitiendo que perfiles no expertos traduzcan intenciones dañinas en prototipos funcionales aprovechando capacidades legítimas de las plataformas que ellos mismos desconocían. El paradigma defensivo debe evolucionar con urgencia para contrarrestar este nuevo ritmo de descubrimiento automatizado.
Alerta naranja en el sector salud por afectaciones derivadas del retraso en el pago al personal asistencial
La Administración Municipal de Leticia informa a la comunidad que, en atención a la situación que atraviesa la red pública de salud y a las afectaciones ocasionadas por el retraso en el pago de salarios al personal asistencial, se mantiene un esta...read more
La Administración Municipal de Leticia informa a la comunidad que, en atención a la situación que atraviesa la red pública de salud y a las afectaciones ocasionadas por el retraso en el pago de salarios al personal asistencial, se mantiene un estado de alerta que busca garantizar la continuidad de la prestación de los servicios esenciales de salud para la población.
La medida responde a la necesidad de coordinar acciones interinstitucionales que permitan mitigar el impacto generado por la disminución de la capacidad operativa del sistema de salud, priorizando la atención de urgencias, hospitalización, cuidados intensivos y demás servicios indispensables para la protección de la vida y la salud de los habitantes del municipio.
La Administración Municipal hace un llamado a las entidades competentes para adelantar las gestiones necesarias que permitan superar la situación financiera que afecta al personal del sector salud y garantizar el cumplimiento oportuno de sus obligaciones laborales.
De igual manera, se invita a la ciudadanía a hacer un uso responsable de los servicios de urgencias, acudir a los canales oficiales de información y atender las recomendaciones emitidas por las autoridades de salud mientras se normaliza la prestación de los servicios.
La Alcaldía de Leticia continuará realizando seguimiento permanente a la evolución de esta situación y mantendrá informada a la comunidad sobre las decisiones que se adopten en coordinación con las autoridades departamentales y la E.S.E. Hospital San Rafael de Leticia.
Poder aéreo rescata perrito en condiciones críticas en el Amazonas
El poder aéreo volvió a convertirse en un puente de esperanza en el Amazonas. En esta oportunidad, la Fuerza Aeroespacial Colombiana, a través del Grupo Aéreo del Amazonas, empleó sus capacidades de movilidad aérea para rescatar y trasladar a un canino conocido como "Patitas", el cual presentaba una fractura en una de sus extremidades y requería atención veterinaria especializada.
El poder aéreo volvió a convertirse en un puente de esperanza en el Amazonas. En esta oportunidad, la Fuerza Aeroespacial Colombiana, a través del Grupo Aéreo del Amazonas, empleó sus capacidades de movilidad aérea para rescatar y trasladar a un c...read more
El poder aéreo volvió a convertirse en un puente de esperanza en el Amazonas. En esta oportunidad, la Fuerza Aeroespacial Colombiana, a través del Grupo Aéreo del Amazonas, empleó sus capacidades de movilidad aérea para rescatar y trasladar a un canino conocido como "Patitas", el cual presentaba una fractura en una de sus extremidades y requería atención veterinaria especializada.
Esta misión fue posible gracias al trabajo articulado entre el Grupo Aéreo del Amazonas y la Fundación Adopta un Peludo, organización que gestionó la atención de “Patitas” tras conocer su estado de salud. La coordinación entre ambas entidades permitió realizar su evacuación de manera oportuna desde el área no municipalizada de Tarapacá, una de las zonas más apartadas y de difícil acceso del departamento del Amazonas.
Mediante el empleo del poder aéreo, el canino, fue trasladado hasta la ciudad de Leticia, superando las limitaciones geográficas propias de la región. Posteriormente, la Fundación Adopta un Peludo continuó su traslado hacia Bogotá, D.C. Donde “Tarzan” como ahora es conocido, recibirá el tratamiento y el proceso de rehabilitación necesarios para su recuperación.
Con este tipo de acciones, la Fuerza Aeroespacial Colombiana ratifica que servir a la Nación también significa contribuir al bienestar de los seres vivos que hacen parte de nuestro entorno. A través de sus capacidades de movilidad aérea y del trabajo articulado con diferentes organizaciones, continúa llevando esperanza y brindando oportunidades para nuestros caninos, incluso en los lugares más apartados en el extremo sur del país.
se registra una explosión en la zona externa de la Unidad de Cuidados Intensivos en leticia Aamazonas
La E.S.E. Hospital San Rafael de Leticia informa que, en el marco de un ejercicio de simulación, se plantea un escenario hipotético en el que se registra una explosión en la zona externa de la Unidad de Cuidados Intensivos (UCI).
La E.S.E. Hospital San Rafael de Leticia informa que, en el marco de un ejercicio de simulación, se plantea un escenario hipotético en el que se registra una explosión en la zona externa de la Unidad de Cuidados Intensivos (UCI).
Conforme a los protocolos establecidos para la atención de emergencias, se activa el Plan Hospitalario de Emergencias, se inicia la evacuación de pacientes y personal asistencial de las áreas comprometidas y se coordina la respuesta con el Cuerpo de Bomberos, los organismos de socorro y las autoridades competentes.
El objetivo de este ejercicio es evaluar la capacidad de respuesta institucional, fortalecer los mecanismos de coordinación y garantizar la preparación del personal frente a eventos de alto impacto.
La institución recuerda que este comunicado corresponde exclusivamente a una simulación y no refleja una situación real ocurrida en sus instalaciones.
PAIF promove roda de conversa sobre a importância da rede de apoio à pessoa idosa
(PAIF)
O Programa de Atenção Integral à Família (PAIF) realizou mais uma atividade voltada ao fortalecimento do cuidado e da valorização da pessoa idosa. O encontro contou com a participação da psicóloga do CRAS, Gigliola Moraes, que conduziu uma roda de...read more
O Programa de Atenção Integral à Família (PAIF) realizou mais uma atividade voltada ao fortalecimento do cuidado e da valorização da pessoa idosa. O encontro contou com a participação da psicóloga do CRAS, Gigliola Moraes, que conduziu uma roda de conversa com as usuárias do programa.
Durante a atividade, foram abordados temas relacionados à importância da rede de apoio para a pessoa idosa, destacando o papel da família, da comunidade e dos serviços de assistência social na promoção de um envelhecimento mais saudável e digno.
A conversa também enfatizou a relevância do cuidado integral com a saúde da pessoa idosa, ressaltando os benefícios do acompanhamento psicológico, da terapia e do bem-estar emocional como fatores essenciais para uma melhor qualidade de vida.
Além de promover a troca de experiências entre as participantes, a ação reforçou a importância do acolhimento, da escuta ativa e do fortalecimento dos vínculos sociais, contribuindo para o desenvolvimento de uma rede de apoio mais sólida e humanizada.
Grupo Anti-contrabando fortalece acciones de inspección, vigilancia y sensibilización durante las festividades sanpedrinas
Con el propósito de promover el consumo responsable de licor legal y fortalecer la lucha contra el contrabando, el Grupo Anti-contrabando de la Oficina de Rentas Departamental desarrolló jornadas de inspección, vigilancia y sensibilización durante...read more
Con el propósito de promover el consumo responsable de licor legal y fortalecer la lucha contra el contrabando, el Grupo Anti-contrabando de la Oficina de Rentas Departamental desarrolló jornadas de inspección, vigilancia y sensibilización durante la celebración de las festividades sanpedrinas.
Las actividades se llevaron a cabo en establecimientos comerciales, puntos de venta y espacios de alta afluencia de público, donde se verificó el cumplimiento de la normatividad vigente relacionada con la comercialización de bebidas alcohólicas. Asimismo, se brindó orientación a comerciantes y consumidores sobre la importancia de adquirir productos legales, debidamente autorizados y con los mecanismos de identificación exigidos por las autoridades.
Durante las jornadas, el equipo técnico destacó los riesgos que representa el consumo de licor de procedencia ilegal, tanto para la salud pública como para las finanzas del departamento, ya que el contrabando y la adulteración afectan los recursos destinados a sectores fundamentales como la salud, la educación y el deporte.
La Oficina de Rentas Departamental reiteró su compromiso con la protección de los consumidores y el fortalecimiento de la cultura de la legalidad, invitando a la ciudadanía a verificar la autenticidad de las bebidas alcohólicas antes de adquirirlas y a denunciar cualquier actividad relacionada con el contrabando o la comercialización de productos adulterados.
Estas acciones hacen parte de la estrategia permanente de inspección, vigilancia y control que adelanta la Administración Departamental para combatir el comercio ilegal y garantizar que los productos que llegan a los consumidores cumplan con las condiciones de calidad, seguridad y legalidad establecidas por la normativa vigente.