zynk/CHANGELOG.md

13 KiB

2026.07.22 - Fix whitespace collapsing in !ai, !gitlog, !changelog responses. (0.39.1)

  • Fixed collapse_spaces() to treat tabs, newlines, and carriage returns as whitespace (not just spaces), collapsing any run of mixed whitespace into a single space.
  • collapse_spaces() now strips leading and trailing whitespace from output.
  • Added collapse_spaces() call to !ai responses (after strip_ai_phrases()).
  • Added collapse_spaces() call to !changelog full entries before sending.
  • Fixed !gitlog full output still containing multiple spaces from git's tab-delimited commit fields.
  • Version bumped to 0.39.1.

2026.07.21 - Hot reload preserves IRC session (nick, channels, voice). (0.39.0)

  • reload_do() now accepts an exec_new parameter: when 0 (!reload/!restart), the child inherits the socket fd and SSL context directly and continues the event loop without reconnecting; when 1 (!rebuild/!code), the old fork+exec path is used.
  • Removed irc_part_all() from the reload path — the bot no longer parts channels on reload, so voice mode (+v) and channel presence are preserved.
  • Reset pending_ai_pid/pending_ai_id in the fork child to avoid stale state from orphaned AI processes.
  • !reload and !restart now keep the bot's IRC session alive (no nick collision, no rejoin, no lost voice). !rebuild/!code still do a clean QUIT+exec since the binary changed.
  • Version bumped to 0.39.0.

2026.07.21 - Strip opencode header from !ai responses. (0.38.3)

  • Added strip_opencode_header(): removes the opencode header line (e.g. > plan · big-pickle) and any trailing blank lines from AI responses before sending to IRC.
  • Pipeline order: format strip → header strip → phrase strip, so ANSI codes are cleaned up first and the > prefix is reliably detected.
  • Version bumped to 0.38.3.

2026.07.21 - Full mode for !gitlog/!changelog, optional pull for !rebuild. (0.38.2)

  • Added optional full keyword to !gitlog and !changelog: !gitlog 5 full shows full commit messages (author, date, body), !changelog 5 full shows the complete entry text including bullet points.
  • !gitlog full mode collapses multiple spaces and strips leading whitespace from each commit block for cleaner IRC output.
  • Changed !rebuild to skip git pull by default; pass pull to pull before rebuilding (e.g. !rebuild pull).
  • Changed the default count GITLOG_COUNT for !gitlog from 5 to 1 and CHANGELOG_COUNT for !changelog from 5 to 1.
  • Reduced GITLOG_MAX from 10 to 5.
  • Updated !help text to reflect new [full] and [pull] arguments.
  • Updated README.md with full option for !gitlog/!changelog and pull option for !rebuild.
  • Version bumped to 0.38.2.

2026.07.21 - Exempt ops from rate limiting. (0.38.1)

  • Op users in channels are now exempt from rate limiting: rate_limit_check() calls chan_is_op() and allows ops through immediately.
  • Removed unused AI_REPLY_MAX constant.
  • Version bumped to 0.38.1.

2026.07.21 - Add !changelog command. (0.38.0)

  • Added !changelog [count] command: displays the latest changelog entries from CHANGELOG.md. Defaults to 5 entries (CHANGELOG_COUNT), accepts 1-10 as count. Each entry title (date line) is sent as a separate IRC message with a 200ms delay to avoid IRC server flood protection.
  • Reduced GITLOG_MAX and CHANGELOG_MAX from 20 to 10.
  • Updated !help to list !changelog.
  • Updated README.md with !changelog documentation and corrected max values.
  • Version bumped to 0.38.0.

2026.07.20 - Add !rebuild command. (0.37.0)

  • Added !rebuild command (ops only, channels): runs git pull, make clean, and make in sequence, then triggers a hot reload if all steps succeed. If any step fails, the error output from the build is reported to the channel.
  • Updated !help to list !rebuild.
  • Updated README.md with !rebuild documentation in the Admin (Ops Only) section.
  • Version bumped to 0.37.0.

2026.07.20 - Fix !seen showing UTC instead of local time. (0.36.1)

  • Fixed !seen command storing UTC timestamps instead of local time: seen_update() used datetime('now') which returns UTC, causing !seen <nick> to display a time offset by the server's timezone difference (e.g. 16:00 instead of 18:00 on a UTC+2 system). Changed to datetime('now','localtime') so seen timestamps match the system's local time.
  • Version bumped to 0.36.1.

2026.07.20 - Add !gitlog command. (0.36.0)

  • Added !gitlog [count] command: displays recent git commits of the zynk project using git log --oneline. Defaults to 5 commits (GITLOG_COUNT), accepts 1-20 as count. Each commit is sent as a separate IRC message.
  • Updated !help to list !gitlog.
  • Updated README.md with !gitlog documentation and git as a requirement.
  • Added detailed doc comment to cmd_gitlog() matching the style of all other function documentation in zynk.c.
  • Version bumped to 0.36.0.

2026.07.20 - Remove timezone abbreviation from !time response. (0.35.6)

  • !time now outputs date and time only (YYYY-MM-DD HH:MM:SS) without the timezone abbreviation, keeping IRC responses shorter and cleaner.
  • Removed 60 lines of dead timezone abbreviation-matching code from tz_format() (previously mapped 45 IANA timezone names to abbreviations like CEST, EDT, JST, etc.).
  • Updated README.md output format to reflect the change.
  • Added tzdata to README.md requirements as optional (without it, !time falls back to 45 built-in timezones).
  • Version bumped to 0.35.6.

2026.07.20 - Fix !time to work without tzdata. (0.35.5)

  • Rewrote !time to try the system localtime_r() first, then fall back to a built-in timezone table with 45 IANA zones and simplified DST rules when the system can't resolve timezones (e.g. no tzdata installed). This means !time Australia/Sydney now shows correct AEST/AEDT even on minimal systems.
  • Added doc comments to all undocumented functions in zynk.c: seen_update, seen_lookup, tell_add, tell_deliver, valid_irc_word, normalize_city, collapse_spaces, cmd_reload, cmd_time, cmd_seen, cmd_tell, cmd_greeting_or_chat, tz_lookup, tz_format.
  • Added full list of built-in timezones to README.md (all 45 entries from tz_table) with region, offset, and DST status.
  • Version bumped to 0.35.5.

2026.07.20 - Update README with !calc pi() docs and date requirement. (0.35.4)

  • Added pi() constants section to README.md with examples (!calc pi(), !calc pi()*2, !calc pi()^2).
  • Added date to the list of system requirements in README.md.
  • Version bumped to 0.35.4.

2026.07.20 - Add pi() to !calc. (0.35.3)

  • Added pi() function support to !calc: bc -l does not define pi() on all systems, so cmd_calc now prepends a pi() definition before evaluating expressions. !calc pi(), !calc pi()*2, !calc pi()^2 etc. all work.
  • Version bumped to 0.35.3.

2026.07.20 - Fix !time timezone conversion bug. (0.35.2)

  • Fixed !time command: setenv("TZ",...) + localtime() was not reliably converting to the requested timezone. Replaced with TZ=... date via popen(), which handles all IANA timezone names correctly (e.g. !time Australia/Sydney now shows 11:15 AEST instead of UTC).
  • Version bumped to 0.35.2.

2026.07.20 - Fix !calc not working (bc stdin not connected). (0.35.1)

  • Fixed !calc command: the expression was never piped to bc's stdin, causing empty output and a "no result" error for every expression. Added a second pipe to feed the expression into bc before reading the result.
  • Version bumped to 0.35.1.

2026.07.20 - Calculator, time, seen, and tell commands. (0.35.0)

  • Added !calc <expression> command: evaluate math expressions via bc -l (supports arithmetic, powers, trigonometry, logarithms, variables, and multi-statement expressions).
  • Added !time [timezone] command: display the current time in any IANA timezone (e.g. !time US/Pacific, !time Europe/Berlin).
  • Added !seen <nick> command: track and query when users were last seen (auto-updated on PRIVMSG, PART, and QUIT).
  • Added !tell <nick> <message> command: leave offline messages for users, delivered automatically when they next speak.
  • Added seen and tell tables to the SQLite database for persistent user tracking and message storage.
  • Updated !help to list all new commands.
  • Updated README.md with detailed documentation for all commands, including !calc expression syntax and !time timezone examples.
  • Version bumped to 0.35.0.

2026.07.20 - Disabled stripping feature from 0.34.4 because it needs more testing. (0.34.5)

  • Disabled strip_opencode_header() (introduced in 0.34.4) as it requires further testing.
  • Version bumped to 0.34.5.

2026.07.20 - Strip opencode header from AI responses. (0.34.4)

  • Added strip_opencode_header() to remove the opencode model/agent header line from AI responses before sending them to IRC.
  • Version bumped to 0.34.4.

2026.07.19 - Show full AI error output on failure. (0.34.3)

  • AI error messages now include the actual opencode output instead of a generic "(opencode exited with error)" message.
  • Captured stderr from opencode (previously sent to /dev/null) so error details are no longer lost.
  • Version bumped to 0.34.3.

2026.07.19 - Collapsed double spaces in !forecast and !stock responses (0.34.2)

  • Collapsed double spaces in !forecast and !stock responses (e.g., when weather condition is empty).
  • Version bumped to 0.34.2.

2026.07.19 - Fix !weather returning HTML. (0.34.1)

  • Fixed !weather command returning <!DOCTYPE html> instead of weather data: wttr.in now returns HTML when it detects a browser User-Agent, so replaced the fake Firefox UA string with zynk/VERSION.
  • Fixed !forecast showing all days as Sunday on musl libc (Alpine Linux): strptime on musl does not compute tm_wday, so added mktime() to normalize the struct before formatting.
  • Version bumped to 0.34.1.

2026.07.19 - Uptime command, remove !hello. (0.34.0)

  • Added !uptime command: displays bot uptime in a human-readable format (days/hours/minutes/seconds).
  • Removed !hello command.
  • Version bumped to 0.34.0.

2026.07.19 - Hot reload re-registration fix, !hello, docs. (0.33.1)

  • Fixed hot reload: after TLS session restore, the bot now re-sends PASS/NICK/USER to re-register with the IRC server, fixing the issue where channels were never re-joined after !reload or !restart.
  • Added !hello command: responds with a greeting and the user's nick.
  • Added atomic build target in Makefile: compiles to a temp file and moves into place to avoid partial binaries on failure.
  • Added comprehensive doc comments to all major functions in zynk.c.
  • Version bumped to 0.33.1.

2026.07.19 - Hot reload, stock quotes, and auto-recompile. (0.33.0)

  • Added hot reload: !reload and !restart commands (ops) save TLS session state, fork a new process with the inherited socket, and resume without dropping from IRC.
  • Added !stock <SYMBOL>[,SYMBOL...] command to fetch real-time stock quotes from Yahoo Finance (up to 3 symbols).
  • Added auto-compile and restart on !code changes: when the AI code change response is received, the bot runs make and reloads on success.
  • Added User-Agent header to curl requests to avoid being blocked by servers that reject the default curl agent.
  • Increased curl read buffer from 2 KiB to 32 KiB to handle larger API responses.
  • Improved !forecast JSON parsing: returns a descriptive error message on parse failure instead of silently returning nothing.
  • Increased AI_TIMEOUT from 240s to 600s and AI_REPLY_MAX from 400 to 2048 chars for longer AI interactions.
  • Version bumped to 0.33.0.

2026.07.16 - Security hardening.

  • Fixed buffer overflow in ai_child_task: plen unsigned underflow when history entries exceed prefix buffer size, causing out-of-bounds writes via snprintf.
  • Fixed IRC injection in handle_nick_change: validate new nick for CRLF and control characters before storing in op cache.
  • Fixed control char leak in irc_msg: drop the message on strdup failure instead of sending unsanitized input on the wire.
  • Fixed CRLF/control char injection in -pass argument: reject passwords containing control characters at startup.

2026.07.15 - Numerous optimizations and fixes.

  • Fixed DB/TLS resource cleanup on partial startup failures and normal shutdown.
  • Fixed net_send() stack over-read risk when vsnprintf() truncates.
  • Fixed curl/opencode pipe readers so oversized output cannot deadlock the bot.
  • Fixed !code AI agent propagation into the forked child.
  • Added CR/LF rejection for startup IRC args to prevent local IRC command injection.
  • Normalized weather/forecast city input before building wttr.in URLs.
  • Fixed IRC op cache bugs around nick changes and long NAMES entries.
  • Added !version command to report the bot's version via IRC.
  • Fixed the malformed VERSION macro definition to ensure successful builds.
  • Added !help command to list available bot commands.
  • Added -opencode command-line option to set the path to the opencode binary, overriding OPENCODE_BIN.
  • Hardened IRC sending: strip control characters from messages and sanitize targets to prevent IRC injection.
  • Sanitized JOIN/NICK targets and PONG payload to avoid injection via CR/LF or control chars.
  • Validated -opencode path at startup to reject control characters.