|
1 | 1 | # Changelog |
2 | 2 |
|
| 3 | +## v0.41.1 (2026-05-24) — Quality Hardening |
| 4 | + |
| 5 | +### Bug Fixes |
| 6 | +- **sort numeric** — empty lines no longer cause panic (`strings.Fields("")` index out of range). Guarded with `len(fa) > 0` check |
| 7 | +- **head_tail total** — `readHead` second scanner loop after EOF never executed, so total always equalled count for files larger than N. Removed dead loop |
| 8 | +- **telegram.go** — `builtinTools()` in Telegram handler was passing empty `TranscriptionConfig`, ignoring user's configured binary_path and models_dir. Now passes `resolved.Transcription` |
| 9 | +- **fileInfoTool** — named return `result string` shadowed by local `result fileInfoResult` (would fail compilation on any change) |
| 10 | +- **mathEvalTool** — named return `result string` shadowed by `result, err := evalMath()` which returns `float64` |
| 11 | +- **parallel_shell** — data race on `shCmd.Process.Kill()` vs `shCmd.Run()` from concurrent goroutines. Fixed with mutex-guarded Process access |
| 12 | + |
| 13 | +### Recoverability |
| 14 | +- Added `defer recover` to top-level Call methods of 11 tools: batch_patch, parallel_shell, http_batch, math_eval, diff, sort, base64, tr, json_query, tree, batch_read, glob, file_info |
| 15 | +- Every tool Call method now guards against panics with named returns and JSON error response |
| 16 | + |
| 17 | +### New Tests |
| 18 | +- Metadata (Name/Description/Schema) tests for all 15 perf tools |
| 19 | +- `TestSort_Numeric` — numeric sort correctness |
| 20 | +- `TestSort_NumericWithEmptyLine` — regression: empty line + numeric sort (was panic) |
| 21 | +- `TestHeadTail_HeadTotalAccuracy` — regression: total=100 not 3 for head(3) of 100 lines |
| 22 | +- `TestMultiGrep_GlobFilter` — glob filtering works across file types |
| 23 | +- `TestWordCount_BinaryFile` — binary files don't cause errors |
| 24 | + |
| 25 | +### Stats |
| 26 | +- 364 insertions, 26 deletions across 4 files |
| 27 | +- All tests pass with `-race` |
| 28 | + |
| 29 | +--- |
| 30 | + |
| 31 | +## v0.41.0 (2026-05-24) — Native Audio Transcription |
| 32 | + |
| 33 | +### New Tool: `transcribe` |
| 34 | +- Transcribes audio files (OGG, WAV, MP3) to text using a local whisper.cpp CLI |
| 35 | +- Fully local — zero cloud APIs, no API keys, no credentials |
| 36 | +- Returns: `{text, duration_sec, segments, model, language}` |
| 37 | +- Streams via `exec.Command("whisper", "--model", ..., "--output-json", "--file", ...)` and parses JSON output |
| 38 | + |
| 39 | +### Dependency Management |
| 40 | +- If whisper CLI is missing → clear error with install instructions (brew / apt / git clone) |
| 41 | +- If model file is missing → clear error with download instructions (curl from HuggingFace) |
| 42 | +- No silent installs, no auto-downloads — tool errors until user installs dependencies |
| 43 | + |
| 44 | +### Configuration (`~/.odek/config.json`) |
| 45 | +```json |
| 46 | +{ |
| 47 | + "transcription": { |
| 48 | + "model": "tiny", |
| 49 | + "language": "en", |
| 50 | + "auto_transcribe": true, |
| 51 | + "models_dir": "~/.odek/whisper/models", |
| 52 | + "binary_path": "/usr/local/bin/whisper" |
| 53 | + } |
| 54 | +} |
| 55 | +``` |
| 56 | + |
| 57 | +### Telegram Integration |
| 58 | +- Voice messages downloaded to `~/.odek/media/` |
| 59 | +- When `auto_transcribe: true` and whisper is available → transcribed text injected directly as user message |
| 60 | +- When `auto_transcribe: false` or transcription fails → file path passed to agent with `transcribe()` tool suggestion |
| 61 | + |
| 62 | +### Security |
| 63 | +- Path gated through `danger.ClassifyPath` + `O_NOFOLLOW` |
| 64 | +- Symlink paths rejected (tested) |
| 65 | +- Panic recovery in Call method |
| 66 | + |
| 67 | +### Stats |
| 68 | +- 590 lines across 12 files, 7 new tests, 0 new Go dependencies |
| 69 | +- External: whisper.cpp CLI (user installs, tool validates) |
| 70 | + |
| 71 | +--- |
| 72 | + |
3 | 73 | ## v0.40.1 (2026-05-24) — Security Hardening |
4 | 74 |
|
5 | 75 | ### Panic Recovery |
|
0 commit comments