Skip to content

Release v1.4.0

Choose a tag to compare

@wu-changxing wu-changxing released this 26 Jul 15:20

Highlights

Your own Gmail and Google Drive, from the terminal. co gmail and co gdrive join co outlook with the same shape — numbered listings, read 3 opens row 3, tables that turn into full-ID text when you pipe them.

The reason they work at all is a fix underneath: ConnectOnion was loading either your project .env or ~/.co/keys.env, never both. Any project with its own .env made every credential that lives only in the global file invisible — which is why co auth google kept asking you to re-authorize. It was never the token; it was never being read.

What's Changed

✨ Features

  • co gmail — inbox, read, reply, send, sent, search with full Gmail query syntax. The Gmail tool gains list_inbox() / list_search() returning dicts (#254)
  • co gdrive and the GDrive tool — list, search, download, upload, trash. Google Docs/Sheets/Slides are exported on download (md/csv/pdf) rather than failing (#255)
  • co outlook contact — add, list, and search Outlook contacts (#243)
  • co skills link — publishes ConnectOnion's bundled skills into ~/.claude/skills and ~/.codex/skills. Replaces a bash script that only did Claude and never shipped in the wheel (#259)
  • New co-mail-and-drive skill teaching agents the three mail/file commands (#259)

🐛 Bug Fixes

  • Both env files now load. connectonion/__init__.py loaded the project .env or the global keys.env, never both, so OAuth tokens were invisible from any project with its own .env (#252)
  • Gmail refreshes its token every session, like Outlook. It previously refreshed only when GOOGLE_TOKEN_EXPIRES_AT said so — and did nothing at all when that variable was absent, which the backend allows (#253)
  • Rotated OAuth tokens persist to every file that is read back, including a project .env that would otherwise shadow the fresh copy. Microsoft single-uses its refresh token, so losing the rotation killed the connection (#206)
  • co outlook contact list emits real tabs when piped. Rich expands \t into spaces, so the documented tab-separated output could not be read by cut -f (#256)
  • Gemini 3.6 Flash reached everywhere it should have. co ai, co browser, the --model flag default, the subagent loader fallback, and eleven other sites were still on 2.5 or 3.5 (#263, #264)

🔒 Security

  • CLI tracebacks no longer print local variables. Typer defaults to show_locals=True, so a routine "session expired" crash rendered OPENONION_API_KEY and your refresh token into the terminal — and into scrollback, CI logs, and any error output pasted into a chat or issue (#258)

📚 Documentation

  • New docs/cli/gmail.md, docs/cli/gdrive.md, docs/useful_tools/gdrive.md, and pages on docs.connectonion.com
  • Repaired every broken internal link in docs/ — 54 of 335 were dead, and those docs ship inside every co create project

Installation

pip install --upgrade connectonion

Backend requirement

co gdrive and co outlook contact need OAuth scopes added in oo-api (openonion/oo-api#31, #32), already deployed. Existing users must re-run co auth google and co auth microsoft — a token refresh cannot widen scopes.

Breaking Changes

None.

Full Changelog: v1.3.0...v1.4.0