Weekly upstream sync 2026-05-13 (4 commits) - #8
loganbronstein wants to merge 5 commits into
Conversation
…ision flake (grandamenium#385) createTask generated ids as `task_${Date.now()}_${randomDigits(3)}`. With only 3 random digits, two createTask calls landing in the same millisecond had a ~1/1000 chance of colliding. When they did, the new task's id matched its own declared blocker — detectCycleOrThrow then threw "X ultimately blocks itself via X" and the test failed nondeterministically. CI run 25618845172 (https://github.com/grandamenium/cortextos/actions/runs/25618845172) hit exactly this case in tests/unit/bus/task.test.ts:761 ("once the dependent completes, the blocker becomes eligible"), which calls createTask twice back-to-back. The branch under test (feat/voice-transcription) does not touch src/bus/task.ts or its tests — this is a pre-existing flake. Bumping to randomDigits(8) drops collision probability to ~1e-8 per same-ms call pair. The id-format assertion in task.test.ts:40 was tightened to match. The looser regex in codex-bus-roundtrip.test.ts (/[a-z0-9]+/) is unaffected. Co-authored-by: Boris <boris@cortextos.ai>
…ine (grandamenium#384) * feat(telegram): wire whisper-cli voice transcription into media pipeline Voice .ogg files are now transcribed locally via whisper-cli + ffmpeg the moment they're downloaded in src/telegram/media.ts, threaded through ProcessedMedia.transcript, and surfaced to agents via formatTelegramVoiceMessage. Previously the framework downloaded voice notes but never produced a transcript — agents received only the .ogg path and had to invoke whisper themselves (which most templates did not), so voice messages effectively reached agents as "[voice message]". Behaviour: - Transcription runs best-effort with graceful fallback. Any failure (missing whisper-cli, missing ffmpeg, missing model, timeout) returns null and the agent still receives the .ogg path — no regression vs. the previous behaviour. - Defaults to ggml-tiny.en.bin (~75MB) at ~/.cortextos/models/. Override with CTX_WHISPER_MODEL, CTX_WHISPER_BIN, CTX_FFMPEG_BIN. Disable entirely with CTX_TELEGRAM_NO_TRANSCRIBE=1. - scripts/install-whisper-model.sh downloads the GGML model idempotently; intentionally separate from npm install so the bundle stays slim. whisper-cli + ffmpeg come from `brew install whisper-cpp ffmpeg` on macOS. Tests: 7 new unit tests in tests/unit/telegram/transcribe.test.ts covering env disable, missing inputs, missing binaries, and timeout. Existing media tests updated to set CTX_TELEGRAM_NO_TRANSCRIBE=1 so they don't shell out. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * feat(install): auto-install whisper-cli + ffmpeg + GGML model Extends `cortextos install` to provision the voice-transcription stack that PR 384 wires into the media pipeline. New agents now get voice transcripts out of the box on macOS without a separate manual step. Behaviour: - whisper-cli auto-install via `brew install whisper-cpp` (mac). Linux/Windows print build/install instructions; install.ts continues. - ffmpeg auto-install via brew (mac), apt-get (linux), or winget/choco (windows). - GGML model fetched via the existing scripts/install-whisper-model.sh (idempotent, skips if present). - All three steps are best-effort: any failure prints a hint and lets install.ts continue. Voice messages still flow as path-only when the stack is incomplete — transcribe.ts already returns null gracefully. This complements PR 384 by making "default voice transcription for all agents" a real default rather than something each operator wires up manually after the fact. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: Boris <boris@cortextos.ai> Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Co-authored-by: Boris <boris@cortextos.ai>
…amenium#403) Session-based CronList tool references in memory and heartbeat skill templates pointed new agents at the wrong command. Updated all 11 files to use `cortextos bus list-crons $CTX_AGENT_NAME` — the correct external cron introspection path. AGENTS.md step 6 and daemon bootstrap were already correct; this clears the last stale references from skill template placeholders and community agents. Co-authored-by: Boris <boris@cortextos.ai> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 7a32124885
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| "name": "agentic-crm-assistant", | ||
| "description": "Agentic CRM personal assistant — reusable executive/personal assistant template with structured relationship memory, inbox/calendar/meeting workflows, full interactive setup, tool-agnostic connectors, CRM skills, and recurring assistant crons", | ||
| "author": "cortextos", | ||
| "type": "agent", |
There was a problem hiding this comment.
Make the new agent template loadable after install
In the workflow I checked, cortextos bus install-community-item routes every type: "agent" catalog item to templates/personas/<name>, but cortextos add-agent --template only searches templates/<template> when creating an agent. As a result, after installing this new CRM assistant from the catalog, cortextos add-agent <name> --template agentic-crm-assistant will not find the installed files and will fall back to creating a minimal generic agent instead of the CRM template. Either install/copy this template to a path add-agent searches or teach add-agent to look under templates/personas.
Useful? React with 👍 / 👎.
Weekly upstream sync (2026-05-13)
Upstream
grandamenium/cortextosadded 4 commit(s) since the last run.Each one is summarized in plain English below.
What's new
Bug fix: replace stale CronList refs with cortextos bus list-crons (fix: replace stale CronList refs in templates and community skills grandamenium/cortextos#403)
c21fbfe(grandamenium@c21fbfe)Add agentic CRM assistant community template (Add agentic CRM assistant community template grandamenium/cortextos#401)
06ee45c(grandamenium@06ee45c)New feature in telegram: wire whisper-cli voice transcription into media pipeline (feat(telegram): wire whisper-cli voice transcription into media pipeline grandamenium/cortextos#384)
4815617(grandamenium@4815617)Bug fix in task: bump random suffix from 3 to 8 digits to eliminate ID-collision flake (fix(task): eliminate task-ID collision flake (3→8 random digits) grandamenium/cortextos#385)
f8eec59(grandamenium@f8eec59)How to merge
merge allto take everything.merge 1 3 5(numbers from the list above) to cherry-pick those.skipto dismiss this whole PR.This PR was opened automatically by boss every Sunday at 6:30pm Chicago time.