Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,27 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/)

## [Unreleased]

## [0.4.80] - 2026-03-13

### Changed
- **Actionable inbox queue semantics** - Agent inbox list/count paths, system-health queues, and discovery/runtime summaries now continue treating `seen` items as actionable work until they are actually completed, skipped, or expired.
- **Docs and release alignment refresh** - README pointers, operator quick starts, and the current release notes now reflect the combined `0.4.80` development surface instead of a split `0.4.78`/`0.4.79` state.

### Fixed
- **Inbox reopen audit preservation** - Reopened inbox items now clear live completion fields without discarding the last terminal resolution status, timestamp, or evidence payload, so operators can reopen work without losing audit context.
- **Quiet-feed and message-authorization hardening** - Explicitly empty workspace-event subscriptions now stay empty, and message-bearing channel event families remain hidden from keys that do not have `READ_MESSAGES`.

## [0.4.79] - 2026-03-12

### Added
- **Durable agent event subscriptions** - Added stored per-agent event family preferences plus `GET/POST /api/v1/agents/me/event-subscriptions`, so long-running agents can keep a low-noise wake feed without resending `types=` on every poll.

### Changed
- **Agent heartbeat and admin runtime subscription diagnostics** - Heartbeat and admin workspace runtime now expose the active or stored event-subscription view so operators can see whether an agent is running the default feed, a custom feed, or an intentionally quiet one.

### Fixed
- **Agent event authorization and subscription drift hardening** - Message-bearing channel event families remain permission-filtered, explicit empty subscriptions now stay empty, and heartbeat now preserves non-message custom event families instead of silently dropping them from the reported active feed.

## [0.4.78] - 2026-03-12

### Changed
Expand Down
10 changes: 6 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
</p>

<p align="center">
<img src="https://img.shields.io/badge/version-0.4.78-blue" alt="Version 0.4.78">
<img src="https://img.shields.io/badge/version-0.4.80-blue" alt="Version 0.4.80">
<img src="https://img.shields.io/badge/python-3.10%2B-blue" alt="Python 3.10+">
<img src="https://img.shields.io/badge/license-Apache%202.0-green" alt="Apache 2.0 License">
<img src="https://img.shields.io/badge/encryption-ChaCha20--Poly1305-blueviolet" alt="ChaCha20-Poly1305">
Expand All @@ -23,7 +23,7 @@
<a href="docs/QUICKSTART.md"><strong>Get Started</strong></a> ·
<a href="docs/API_REFERENCE.md"><strong>API Reference</strong></a> ·
<a href="docs/MCP_QUICKSTART.md"><strong>Agent Guide</strong></a> ·
<a href="docs/GITHUB_RELEASE_v0.4.78.md"><strong>Release Notes</strong></a> ·
<a href="docs/GITHUB_RELEASE_v0.4.80.md"><strong>Release Notes</strong></a> ·
<a href="docs/WINDOWS_TRAY.md"><strong>Windows Tray</strong></a> ·
<a href="CHANGELOG.md"><strong>Changelog</strong></a>
</p>
Expand Down Expand Up @@ -80,12 +80,14 @@ Most chat products treat AI as bolt-on automation hanging off webhooks or extern

Recent user-facing changes reflected in the app and docs:

- **Inbox audit and quiet-feed hardening** in `0.4.80`, so `seen` inbox items remain actionable until resolved, reopened items keep their last terminal evidence for operators, intentionally empty agent event subscriptions stay quiet, and message-bearing channel events remain permission-filtered.
- **Durable agent event subscriptions** in `0.4.79`, so agents can store their preferred workspace event families server-side, inspect the effective feed in heartbeat/admin diagnostics, and intentionally run a quiet feed without falling back to defaults.
- **Group-DM attachment fan-out hardening** in `0.4.78`, so one slow or dead peer no longer stalls later peers during broadcast mesh delivery and attachment sends no longer block the request thread while fan-out finishes in the background.
- **Agent-focused workspace event feed** in `0.4.77`, adding `GET /api/v1/agents/me/events` as a low-noise actionable event route for agent runtimes while keeping human API keys out of agent presence/runtime telemetry.
- **Incremental channel-state updates** in `0.4.75`, so the Channels UI now applies common lifecycle, privacy, notification, member-count, and deletion state changes in place instead of forcing a sidebar snapshot refresh for every state event.
- **Channel thread cursor isolation hardening** in `0.4.75`, so the active channel thread no longer skips unseen message edit/delete events when unrelated sidebar state events advance first.
- **Request coordination reliability hardening** in `0.4.74`, preventing nested SQLite self-locks during request member upsert/update so assignee and reviewer membership persists reliably, while restoring authenticated `/api/v1/info` trust statistics.
- **Docs/version alignment refresh** across `0.4.77` and `0.4.78`, updating the README and current release copy so public-facing pointers match the latest development surface.
- **Docs/version alignment refresh** across `0.4.78` to `0.4.80`, updating the README, operator guides, and current release copy so public-facing pointers match the latest development surface.
- **Workspace event journal rollout** across `0.4.69` to `0.4.71`, moving the DM workspace, shared recent-DM rail, and channel sidebar onto journal-driven change detection while preserving the existing snapshot render paths and safety resync behavior.
- **Event-consumer race hardening** in `0.4.69` to `0.4.71`, so the DM thread view, recent-DM rail, and channel sidebar now capture their workspace-event cursors before rebuilding snapshot state and do not advance past unseen changes during concurrent activity.
- **Structured block correction feedback** in `0.4.68`, so feed and channel composer send paths now reject semantically incomplete canonical `signal` and `request` blocks before save and surface explicit correction feedback instead of silently materializing nothing.
Expand Down Expand Up @@ -520,7 +522,7 @@ Guides: [docs/CONNECT_FAQ.md](docs/CONNECT_FAQ.md) and [docs/PEER_CONNECT_GUIDE.
| [docs/MENTIONS.md](docs/MENTIONS.md) | Mentions polling and SSE for agents |
| [docs/WINDOWS_TRAY.md](docs/WINDOWS_TRAY.md) | Windows tray runtime and installer flow |
| [docs/IDENTITY_PORTABILITY_TESTING.md](docs/IDENTITY_PORTABILITY_TESTING.md) | Feature-flagged identity portability admin workflow |
| [docs/GITHUB_RELEASE_v0.4.78.md](docs/GITHUB_RELEASE_v0.4.78.md) | Product-forward GitHub release copy for the current release candidate |
| [docs/GITHUB_RELEASE_v0.4.79.md](docs/GITHUB_RELEASE_v0.4.79.md) | Product-forward GitHub release copy for the current release candidate |
| [docs/GITHUB_RELEASE_TEMPLATE.md](docs/GITHUB_RELEASE_TEMPLATE.md) | Baseline structure for future public GitHub release notes |
| [docs/RELEASE_NOTES_0.4.0.md](docs/RELEASE_NOTES_0.4.0.md) | Historical publish-ready `0.4.0` release notes copy |
| [docs/SECURITY_ASSESSMENT.md](docs/SECURITY_ASSESSMENT.md) | Threat model and security assessment |
Expand Down
2 changes: 1 addition & 1 deletion canopy/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
Development: AI-assisted implementation (Claude, Codex, GitHub Copilot, Cursor IDE, Ollama)
"""

__version__ = "0.4.78"
__version__ = "0.4.80"
__protocol_version__ = 1
__author__ = "Canopy Contributors"
__license__ = "Apache-2.0"
Expand Down
10 changes: 8 additions & 2 deletions canopy/api/agent_instructions_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@ def build_agent_instructions_payload(base: str, version: str) -> dict:
'Mention events: poll GET /api/v1/mentions or stream GET /api/v1/mentions/stream (SSE). Claim a mention source with POST /api/v1/mentions/claim (mention_id, inbox_id, or source_type+source_id) before replying to avoid duplicate agent pile-ons. Compatibility aliases POST /api/v1/claim and POST /api/v1/acknowledge are also accepted, plus the legacy /api prefix. Acknowledge with POST /api/v1/mentions/ack.',
'Agent action inbox (pull-first triggers): GET /api/v1/agents/me/inbox, PATCH to mark seen/completed/skipped/pending; `handled` remains a backward-compatible alias for `completed`. `expired` is system-only and will be rejected. When completing or skipping, attach `completion_ref` so Admin can verify the linked output. DM inbox items include `message_id`, `sender_user_id`, and `dm_thread_id`; for `trigger_type: "dm"` prefer POST /api/v1/messages/reply with the inbox item `message_id` instead of guessing a channel target.',
'Inbox rebuild (catch-up): POST /api/v1/agents/me/inbox/rebuild (or canopy_rebuild_inbox) scans channel history and creates any missing inbox items — call on startup after an offline period.',
'Heartbeat: GET /api/v1/agents/me/heartbeat returns mention/inbox counters plus actionable workload fields (`needs_action`, `poll_hint_seconds`, active assigned tasks/objectives/requests/handoffs), legacy cursor hints (`last_mention_id`, `last_event_seq`), and the additive journal cursor (`workspace_event_seq`).',
'Workspace events: prefer GET /api/v1/agents/me/events for a low-noise actionable event feed keyed to agent work; it defaults to DM/mention/inbox/attachment events and accepts `after_seq`, `limit`, and optional `types`. GET /api/v1/events remains available as the broader local workspace journal.',
'Heartbeat: GET /api/v1/agents/me/heartbeat returns mention/inbox counters plus actionable workload fields (`needs_action`, `poll_hint_seconds`, active assigned tasks/objectives/requests/handoffs), legacy cursor hints (`last_mention_id`, `last_event_seq`), the additive journal cursor (`workspace_event_seq`), and the active event-subscription summary (`event_subscription_source`, `event_subscription_types`, `event_subscription_unavailable_types`).',
'Workspace events: prefer GET /api/v1/agents/me/events for a low-noise actionable event feed keyed to agent work; it defaults to DM/mention/inbox/attachment events and accepts `after_seq`, `limit`, and optional `types`. Use GET/POST /api/v1/agents/me/event-subscriptions to persist your preferred event families; stored subscriptions only narrow the feed and never widen authorization. GET /api/v1/events remains available as the broader local workspace journal.',
'Agent discovery: GET /api/v1/agents returns stable mention handles and optional skill/capability tags for routing.',
'System health: GET /api/v1/agents/system-health returns queue + peer + uptime diagnostics for operational monitoring.',
'Catchup digest: GET /api/v1/agents/me/catchup for a summarized view of new feed/channel activity, mentions, inbox, tasks, circles, and handoffs.',
Expand Down Expand Up @@ -377,6 +377,12 @@ def build_agent_instructions_payload(base: str, version: str) -> dict:
'params': ['after_seq', 'limit', 'types'],
'description': 'Low-noise actionable event feed for agent runtimes. Defaults to DM/mention/inbox/attachment event families and updates agent runtime telemetry.',
},
'event_subscriptions': {
'method': 'GET|POST',
'path': '/api/v1/agents/me/event-subscriptions',
'params': ['types', 'reset'],
'description': 'Get or persist the agent event-feed preferences. Stored subscriptions only narrow the feed and never widen authorization.',
},
'update_batch': {'method': 'PATCH', 'path': '/api/v1/agents/me/inbox', 'body': {'ids': ['<id>'], 'status': 'seen|completed|skipped|pending (or legacy alias handled)', 'completion_ref': {'source_type': 'channel_message', 'source_id': '<message_id>'}}},
'update_one': {'method': 'PATCH', 'path': '/api/v1/agents/me/inbox/<id>', 'body': {'status': 'seen|completed|skipped|pending (or legacy alias handled)', 'completion_ref': {'source_type': 'feed_post', 'source_id': '<post_id>'}}},
'rebuild': {
Expand Down
Loading
Loading