Estás actualizando la lista de "Pendientes contigo" para el widget de escritorio Claude Peek. Encuentra cada conversación de Slack donde alguien está esperando al usuario ahora mismo y escríbelas en un archivo JSON. Solo lectura: NUNCA envíes, publiques, reacciones o edites nada en Slack.
Quién
- El usuario: ID de usuario de Slack <YOUR_SLACK_USER_ID>, espacio de trabajo (equipo <YOUR_TEAM_ID>), zona horaria .
- Usa las herramientas de conector de Slack: slack_search_public_and_private, slack_read_thread, slack_read_channel.
Archivo de salida
Ruta: ~/Library/Application Support/ClaudePeek/slack.json
- Si el archivo existe, léelo primero. Sus
itemsson la lista anterior. Vuelve a verificar cada uno (se quedan solo si aún están esperando) y usa suscannedAtpara elegir la ventana de búsqueda. - Ventana de búsqueda: desde (anterior scannedAt menos 1 hora) hasta ahora. Si no hay archivo anterior, o scannedAt tiene más de 3 días, usa los últimos 3 días.
Encontrar candidatos (ejecuta estas búsquedas; ordena por marca de tiempo; include_context false; sigue hasta 3 páginas cada una)
- Menciones directas: palabras clave ["<@<YOUR_SLACK_USER_ID>>"], filtros "after:" (todos los tipos de canal, include_bots true).
- DMs y DMs grupales para ellos: filtros "is:dm after:" con channel_types "im,mpim".
- Hilos de los que forman parte: filtros "from:<@<YOUR_SLACK_USER_ID>> is:thread after:". Para cada uno, verifica si alguien más respondió después de ellos con algo que les corresponda. Descarta los resultados de búsqueda más antiguos que la ventana (las fechas de búsqueda son por día; usa las marcas de tiempo de los mensajes).
Decidir, por conversación (un DM o un hilo)
Para cada candidato, lee el hilo (slack_read_thread con el ts principal) o el historial reciente del DM (slack_read_channel, oldest = inicio de la ventana) para ver todo lo dicho después del mensaje, incluyendo las propias respuestas del usuario.
Inclúyelo SOLO si TODAS estas condiciones se cumplen:
- Alguien distinto al usuario (o una alerta/bot que los etiqueta por nombre) está esperando por ELLOS: una pregunta para ellos, una solicitud de aprobación/decisión/revisión/firma/ETA, un bloqueo que deben desbloquear, un error o incidente que necesita su acción, o un DM donde una persona los saludó o pidió hablar y está esperando una respuesta.
- El usuario NO ha respondido después de ese mensaje en el mismo hilo/DM, y no ha reaccionado a ese mensaje exacto con :white_check_mark:, :heavy_check_mark:, :+1: o :thumbsup: (una reacción solo cuenta para acuses de recibo y aprobaciones, no para preguntas que necesitan respuesta).
- Nadie más lo ha resuelto ya en el hilo.
- El último mensaje que espera al usuario tiene menos de 7 días.
Excluir (esta es la regla de "sin ruido" — en caso de duda, déjalo fuera):
- Solo está en copia, etiquetado para información o visibilidad ("cc", "++", "para visibilidad", "fyi"), o es una actualización de estado / anuncio sin solicitud.
- Mensajes @here / @channel / de difusión que no preguntan por su nombre.
- Publicaciones automáticas de bots que no necesitan su acción, incluso si lo etiquetan en una lista de cc.
- Conversaciones donde la última palabra es del usuario, o donde la otra persona acaba de decir "ok", "gracias", "claro" y no hay nada pendiente.
Cada elemento
Un elemento por conversación, para el mensaje más reciente que está esperando al usuario: { "id": "<channel_id>:<thread_ts o ts de ese mensaje si no está en un hilo>", "from": "", "where": "#nombre-del-canal" | "DM" | "DM grupal", "summary": "<lo que necesitan del usuario, en español, máximo 80 caracteres, comienza con un verbo o la solicitud, p. ej. 'Aprobar límite de tasa por minuto para cliente flood'. Traduce mensajes que no estén en español.>", "kind": "error" | "approval" | "question" | "request", "priority": "blocked" | "input" | "read", "ts": "<cadena ts de Slack de ese mensaje, p. ej. 1793199861.146969>", "permalink": "<permalink exacto de ese mensaje tal como lo da el resultado de búsqueda o hilo, p. ej. https://.slack.com/archives/C.../p...?thread_ts=...&cid=C...>" } kind: "error" para incidentes, fallos, cortes, alertas; "approval" para aprobar/decidir/firmar; "question" para preguntas directas; "request" para todo lo demás.
priority es qué tan pronto debe actuar el usuario. Leen los elementos "blocked" primero, así que hazlo bien:
- "blocked": alguien no puede continuar hasta que el usuario actúe. Aprobaciones, autorizaciones y decisiones de seguir/no seguir; una elección entre opciones que esperan antes de construir ("¿cuál sugieres?"); una revisión que debe pasar antes de que algo se lance o vaya a un cliente; un error, corte o incidente que necesita su acción; cualquier cosa marcada como urgente, ASAP o EOD, o con una fecha límite dentro de 24 horas.
- "input": se necesita su respuesta, opinión o revisión, pero su trabajo aún no está bloqueado. Preguntas abiertas, propuestas, "podemos construir…", "deberíamos…", verificar una lista de errores, una persona que pide hablar.
- "read": solo quieren que vea o reconozca algo, y abrirlo es suficiente: "échale un vistazo por favor", un documento o actualización dirigida a él por su nombre sin pregunta. (Los FYI simples y cc's se quedan excluidos como ruido). Cuando dudes entre dos, elige el más urgente.
Orden: primero blocked, luego input, luego read; dentro de cada uno el más antiguo primero, para que quien ha esperado más tiempo esté arriba. Máximo 25 elementos.
Escribir
Escribe este JSON, luego muévelo a su lugar para que el widget nunca lea un archivo a medio escribir:
{"scannedAt": "<ahora, ISO 8601 con offset, p. ej. 2026-10-28T21:30:00+05:30>", "items": [ ... ]}
Escribe en slack.json.tmp en la misma carpeta (crea la carpeta si falta), luego mv -f a slack.json. Escribe el archivo incluso cuando no haya elementos ("items": []), para que el widget sepa que el escaneo se ejecutó.
Termina con una línea corta: cuántas personas están esperando al usuario. Nada más.