openvisio-agent 0.20.0 → 0.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +797 -0
- package/README.md +8 -2
- package/USER_GUIDE.md +15 -6
- package/package.json +3 -2
- package/scenarios/runtime.scenarios.mjs +6 -11
- package/scenarios/workspace.scenarios.mjs +4 -3
- package/scripts/certify.mjs +13 -13
- package/src/codex-mcp-proxy.mjs +12 -1
- package/src/events.mjs +23 -3
- package/src/mastra-harness.mjs +51 -22
- package/src/memory.mjs +4 -3
- package/src/model-settings.mjs +57 -0
- package/src/opencode-config.mjs +13 -16
- package/src/runtime-control.mjs +50 -0
- package/src/studio-cli.mjs +11 -0
- package/src/studio-server.mjs +43 -7
- package/src/watch.mjs +239 -168
- package/studio/app.mjs +234 -47
- package/studio/guide.html +15 -3
- package/studio/index.html +45 -9
- package/studio/openvisio.svg +1 -0
- package/studio/satoshi-400.woff2 +0 -0
- package/studio/satoshi-500.woff2 +0 -0
- package/studio/style.css +240 -70
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,797 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## [0.22.0] — 2026-09-10
|
|
4
|
+
|
|
5
|
+
- Carry the agent’s configured role and voice through every session, with cached identity when the roster is unavailable.
|
|
6
|
+
- Let agents request their own coding workspace and carry forward findings without asking teammates to reassign work. Record the continuation in the source context graph and Studio.
|
|
7
|
+
- Bound graph recall to direct source neighbors so shared nodes cannot pull in unrelated conversations.
|
|
8
|
+
|
|
9
|
+
- Let the agent's native final turn end a cycle. Remove required code mutations, ticket updates, PR evidence, and forced recovery turns from the completion decision.
|
|
10
|
+
- Deliver and persist the agent's actual response, including research, questions, and blockers, without automatically completing the ticket or rerunning an unchanged assignment after restart.
|
|
11
|
+
- Expose advertised MCP capabilities independently of scheduling classification; allow native reading, search, browsing, planning, and context tools in reply sessions while keeping local writes scoped to coding workspaces.
|
|
12
|
+
- Keep Claude context warm like Codex and OpenCode, tolerate unavailable optional history, and treat runtime deadlines as inactivity watchdogs.
|
|
13
|
+
|
|
14
|
+
## [0.21.1] — 2026-09-10
|
|
15
|
+
|
|
16
|
+
- Recover identifier-owned assignments even when the agent is missing from `list_agents` or the roster request fails. Keep numeric-assignee compatibility, fresh ticket verification, and reassignment guards.
|
|
17
|
+
- Center Studio and its transparent sidebar together, with the OpenVisio logo, locally bundled Satoshi, and OA-style cards with white frames and recessed gray panels.
|
|
18
|
+
- Show recorded task activity across agents and add Plan, Commands, and Response views with bounded content and responsive layouts.
|
|
19
|
+
- Add a Documentation card in the sidebar and a mobile header link to the local guide.
|
|
20
|
+
|
|
21
|
+
## [0.21.0] — 2026-09-09
|
|
22
|
+
|
|
23
|
+
- Add per-agent Studio settings for reply and coding models, with runtime model choices, private atomic saves, stale-edit protection, and live application to the next request.
|
|
24
|
+
- Start Studio automatically alongside backend watchers and support app/chat buttons that open a selected agent's model settings.
|
|
25
|
+
- Surface OpenCode main-request rate limits promptly, release the blocked session, and include a Studio settings CTA in the blocker.
|
|
26
|
+
- Distinguish rate-limited cycles from successful completions in Studio and document local-machine controls and upgrade requirements.
|
|
27
|
+
|
|
28
|
+
- Route explicit ticket-creation requests through the authenticated coordination bridge and recognize creation failures without replaying the mutation.
|
|
29
|
+
- Skip confirmed duplicate mentions before network lookups; bound optional thread context to one second while retaining authoritative final-delivery checks.
|
|
30
|
+
- Include message identities in duplicate logs and report intake and delivery timing separately from queue and model time.
|
|
31
|
+
|
|
32
|
+
## [0.20.0] — 2026-09-08
|
|
33
|
+
|
|
34
|
+
- Add `openvisio-agent studio`: a local live viewer of watcher processes, cycles, explicit plans, tool calls, and coding progress, with a separate demo mode.
|
|
35
|
+
- Mark unfinished cycles and runtimes from stopped or replaced watchers offline; retain stable keyboard focus during updates and reveal linked cycles through existing filters.
|
|
36
|
+
- Ship a plain-language user guide and local, printable Studio help with keyboard instructions, status explanations, setup, and troubleshooting.
|
|
37
|
+
- Record bounded, credential-redacted activity locally without blocking agent execution; closing the viewer leaves agents running.
|
|
38
|
+
- Include the executable scenario catalogue in the npm package so its advertised command works after installation.
|
|
39
|
+
- Add an executable catalogue of over 1,000 BYO workspace scenarios, including production watcher integration sequences and machine-readable results.
|
|
40
|
+
- Unify assignment identity precedence, recover owned-thread context, keep distinct messages distinct, and persist threaded replies through delivery outages without rerunning models.
|
|
41
|
+
- Correct cancellation, timeout, session cleanup, tool evidence, memory isolation, transport retry and parsing, PR authorization, and task-column edge cases found by the scenario suite.
|
|
42
|
+
- Align the runtime specification, prompts, and README on model preservation, setup PR authority, retries, and recovery behavior.
|
|
43
|
+
- Fix issues reproduced in live validation: prefer the server's `create_task_comment` capability, keep Codex commentary out of final replies, and remove agent-directory credentials before ACP model delivery.
|
|
44
|
+
- Subscribe to the verified organization for live channel events, restore the subscription after reconnect, and share guarded mention routing without self-replies or duplicate fanout responses.
|
|
45
|
+
|
|
46
|
+
## [0.19.12] — 2026-09-08
|
|
47
|
+
|
|
48
|
+
- Register agent-authored completion threads as owned conversations, and recover older roots from verified backend thread authorship before filtering follow-ups.
|
|
49
|
+
- Route explicit build/test repair requests using the completion thread's PR context, preserve original-thread delivery, and retain redirect, cancellation, and replay guards.
|
|
50
|
+
|
|
51
|
+
## [0.19.11] — 2026-09-08
|
|
52
|
+
|
|
53
|
+
- Enable routine PR branch publishing in coding setup, shared by future clones and linked worktrees. Keep an opt-out and repository revocation.
|
|
54
|
+
- Check authorization-blocked tickets every two seconds, clear stale failure gates when authorized, and recover legacy helper denials once.
|
|
55
|
+
- Route new threads to the agent’s dedicated channel, preserve source-thread replies, and stop older answers from suppressing fresh follow-ups.
|
|
56
|
+
- Remove unreachable pre-Mastra Codex/OpenCode runners, lazily load the watcher for CLI commands, retain bounded warm sessions, and use asynchronous Git snapshots.
|
|
57
|
+
- Reconcile three projects concurrently and start ticket work before optional activity reads. Keep per-thread ordering with bounded parallel replies.
|
|
58
|
+
- Require completed ACP tool evidence; route helper failures as structured blockers. Allow scoped coordination mutations without enabling local tools, and never retry those mutations after ambiguous failures.
|
|
59
|
+
- Deduplicate unchanged memory observations and separate per-thread write waits. Log queue, preflight, first-event, and runtime latency.
|
|
60
|
+
|
|
61
|
+
## [0.19.10] — 2026-09-08
|
|
62
|
+
|
|
63
|
+
- Route ticket implementation requests and assignment notifications through live assignment lookup into independent coding workers before the restricted chat runtime runs.
|
|
64
|
+
- Pick up actionable assignments discovered during pending-ticket questions, unless the requester explicitly asks for status only. Preserve ownership checks, queue deduplication, and review/testing handoffs.
|
|
65
|
+
- Keep automatic backlog pickup working when the activity feed is unavailable, and resolve agent identity when a ticket lookup arrives before startup reconciliation.
|
|
66
|
+
- Explicit `--chat-only` installations still require a coding workspace; no remote runtime dispatch API is available in this watcher.
|
|
67
|
+
|
|
68
|
+
## [0.19.9] — 2026-09-08
|
|
69
|
+
|
|
70
|
+
- Fix reproduced missing-credential MCP failures by isolating the Codex stdio bridge from inherited HTTP server configuration.
|
|
71
|
+
- Preserve exact model selections, persist same-model shorthand resolution, honor the Codex chat model, and disable automatic generation/family/effort substitution.
|
|
72
|
+
- Log redacted ACP error details and distinguish completed turns with tool failures from clean success.
|
|
73
|
+
- Other findings from the integration audit remain outstanding.
|
|
74
|
+
|
|
75
|
+
## [0.19.8] — 2026-09-08
|
|
76
|
+
|
|
77
|
+
- Publish the accumulated local 0.19.5–0.19.7 changes: pending-ticket reads, warm ACP sessions, and the Codex chat MCP allowlist.
|
|
78
|
+
- Known limitations: the integration audit identified unresolved reply suppression, permission classification, work-evidence, identity lookup, and latency issues. This version does not resolve those findings.
|
|
79
|
+
|
|
80
|
+
## [0.19.7] — 2026-09-07
|
|
81
|
+
|
|
82
|
+
- Fix Codex ACP's opaque MCP permission requests by enforcing a strict read-only tool allowlist in the private chat bridge, safely approving those requests, and retrying idempotent chat reads once.
|
|
83
|
+
|
|
84
|
+
## [0.19.6] — 2026-09-07
|
|
85
|
+
|
|
86
|
+
- Permit named OpenVisio team-state reads in chat-only ACP sessions while continuing to reject mutations, local filesystem access, and execution, fixing live project lookups reported as cancelled.
|
|
87
|
+
|
|
88
|
+
## [0.19.5] — 2026-09-07
|
|
89
|
+
|
|
90
|
+
- Answer pending-ticket questions with fast watcher-owned MCP reads, avoiding model-side project discovery and `list_agents` cancellation failures.
|
|
91
|
+
- Keep Mastra ACP sessions warm per ticket or conversation thread, cache model negotiation, send the static charter once per session, and bound idle reply sessions with LRU eviction.
|
|
92
|
+
|
|
93
|
+
## [0.19.4] — 2026-09-07
|
|
94
|
+
|
|
95
|
+
- Stop promoting read-only reply discovery failures such as `list_agents` into generic intervention blockers; the watcher supplies its known identifier and reserves fail-closed blocker delivery for failed mutations.
|
|
96
|
+
|
|
97
|
+
## [0.19.3] — 2026-09-07
|
|
98
|
+
|
|
99
|
+
- Recover untagged human follow-ups in persistently owned threads during backlog reconciliation, including messages suppressed by the former pre-routing duplicate acknowledgement.
|
|
100
|
+
|
|
101
|
+
## [0.19.2] — 2026-09-07
|
|
102
|
+
|
|
103
|
+
- Preserve recipient ownership after an agent is explicitly tagged in a thread, so later human follow-ups are handled without repeated @mentions; explicit redirects, stand-downs, and other-agent chatter still fail closed.
|
|
104
|
+
|
|
105
|
+
## [0.19.1] — 2026-09-07
|
|
106
|
+
|
|
107
|
+
- Negotiate Codex and OpenCode selections against each ACP session's advertised models, resolving shorthand family names to the closest available effort-qualified or provider-qualified model before work starts.
|
|
108
|
+
- Normalize versioned Claude model names to stable family aliases and configure Claude's native ordered fallback models for unavailable or overloaded selections.
|
|
109
|
+
|
|
110
|
+
## [0.19.0] — 2026-09-07
|
|
111
|
+
|
|
112
|
+
- Run Codex and OpenCode workers as isolated Mastra ACP sessions while preserving their existing local authentication, OpenVisio MCP access, worktree scoping, cancellation, and evidence gates.
|
|
113
|
+
- Persist ticket and conversation context with Mastra Memory and local libSQL; retain the compact JSON graph only as an exact delivery/deduplication ledger.
|
|
114
|
+
- Stop broadcasting working, thinking, and typing presence updates from autonomy workers, eliminating notification noise during long runs.
|
|
115
|
+
- Run up to three independent ticket workers concurrently while serializing tasks that share a mutable worktree; keep reply delivery serialized and cancellation scoped to the matching worker.
|
|
116
|
+
- Include a bounded, credential-redacted failure reason beside each failed Codex MCP call so transport, authorization, throttling, and backend errors are distinguishable.
|
|
117
|
+
|
|
118
|
+
## [0.18.15] — 2026-09-07
|
|
119
|
+
|
|
120
|
+
- Launch Codex ticket cycles and their recovery attempt with the prepared ticket worktree as the actual process directory, rather than relying only on a prompt hint.
|
|
121
|
+
|
|
122
|
+
## [0.18.14] — 2026-09-07
|
|
123
|
+
|
|
124
|
+
- Pause an evidence-gate failure at its resulting ticket revision so the watcher's own blocker update and backlog reconciliation cannot create an infinite retry loop; resume once after a genuine ticket change.
|
|
125
|
+
- Direct assigned coding work to an existing ticket-specific local worktree and keep completion-delivery retries from rerunning repository work.
|
|
126
|
+
|
|
127
|
+
## [0.18.13] — 2026-09-07
|
|
128
|
+
|
|
129
|
+
- Route feature tickets containing words such as “message”, “status”, or “label” to the coding lane unless they begin with an explicit coordination command.
|
|
130
|
+
- Supply exact internal project/ticket argument shapes to assigned-task tool calls and log remote MCP failures with credentials removed.
|
|
131
|
+
|
|
132
|
+
## [0.18.12] — 2026-09-07
|
|
133
|
+
|
|
134
|
+
- Route Codex through a local authenticated MCP bridge that removes credential fields from model-visible schemas and injects them into backend calls outside the model.
|
|
135
|
+
|
|
136
|
+
## [0.18.11] — 2026-09-07
|
|
137
|
+
|
|
138
|
+
- Teach Codex agents to discover deferred OpenVisio MCP actions with native tool search before claiming the server or a ticket lookup is unavailable.
|
|
139
|
+
|
|
140
|
+
## [0.18.10] — 2026-09-07
|
|
141
|
+
|
|
142
|
+
- Make the injected OpenVisio MCP server required for Codex cycles and allow 30 seconds for startup, preventing a failed tool connection from becoming a successful prose-only reply.
|
|
143
|
+
- Keep live assignment and ticket lookups available in watcher-delivered replies so agents resolve task slugs themselves.
|
|
144
|
+
|
|
145
|
+
## [0.18.9] — 2026-09-07
|
|
146
|
+
|
|
147
|
+
- Fail closed on unaddressed human activity fanned out from previously mentioned threads, while recognizing exact full-name mentions and punctuation correctly.
|
|
148
|
+
- Make agents resolve assigned work through the live OpenVisio MCP board before asking teammates for a project or ticket slug.
|
|
149
|
+
- Keep OpenCode fast reply cycles MCP-only with explicit denials for local grep, file, shell, web, and delegation tools, preventing oversized ripgrep JSON records from disrupting chat replies.
|
|
150
|
+
|
|
151
|
+
## [0.18.8] — 2026-09-05
|
|
152
|
+
|
|
153
|
+
- Replace assignment coalescing with independent FIFO cycles, stable-key duplicate suppression, shared backlog/event verification, and authoritative checks before queued work starts.
|
|
154
|
+
- Give reply runners a chat-only workspace configuration; add explicit OpenCode reply permissions and keep thread cancellation effective during recovery.
|
|
155
|
+
- Bound MCP requests and activity calls, discover paginated tool lists, and avoid resetting healthy sessions after late expiry responses.
|
|
156
|
+
- Retain unresolved tool failures across recovery; reject unknown completion states and Codex MCP error results as evidence.
|
|
157
|
+
- Await model process termination before releasing cancelled lanes, and terminate POSIX tool process groups during cancellation/shutdown.
|
|
158
|
+
- Save credentials, replay state, and memory atomically with private permissions. Remove ticket-text authorization shortcuts and unsafe branch-reset/blanket-staging instructions.
|
|
159
|
+
- Preserve complete mention instructions and carry explicit source-thread identity into blocker delivery.
|
|
160
|
+
|
|
161
|
+
## [0.18.7] — 2026-09-04
|
|
162
|
+
|
|
163
|
+
- Claude, Codex, and OpenCode coding cycles now require completed runtime-observed repository actions; assistant prose and a successful process exit can no longer close work by themselves.
|
|
164
|
+
- A progress or intent message no longer ends a coding cycle. The watcher preserves the original request and thread context through one focused continuation, permits a distinct final result after progress, and requires that final result before conversation-originated code work is accepted.
|
|
165
|
+
- Recovery delivery keeps only the latest verified answer, so an earlier promise is never concatenated into the final watcher-owned reply.
|
|
166
|
+
|
|
167
|
+
## [0.18.6] — 2026-09-02
|
|
168
|
+
|
|
169
|
+
- BYO coding prompts now treat an existing local repository as the primary code surface and reserve linked-codebase read/write/branch/commit tools for cases where a repository cannot be obtained locally.
|
|
170
|
+
|
|
171
|
+
## [0.18.5] — 2026-09-01
|
|
172
|
+
|
|
173
|
+
- BYO system prompts now reserve numeric project/task ids for MCP arguments and require the backend's project-scoped ticket slug in every human-facing message, comment, PR description, summary, blocker, and result.
|
|
174
|
+
- Watcher-owned completion reports use canonical uppercase slugs such as `OVS-57`. Older backends that omit a slug fall back to the ticket title instead of exposing or inventing a numeric reference.
|
|
175
|
+
- Verified assignment prompts carry both identities explicitly: the slug for communication and the numeric ids for tool calls, preventing models from copying database ids into conversation.
|
|
176
|
+
|
|
177
|
+
## [0.18.4] — 2026-09-01
|
|
178
|
+
|
|
179
|
+
- Conversation events are now treated as wake-up hints, not ownership. The watcher validates the actual source message and ignores redirects, explicit other-agent recipients, and unaddressed agent-authored chatter before starting a model.
|
|
180
|
+
- A direct stand-down cancels queued or running work for that source thread across Codex, Claude Code, and OpenCode, suppresses stale final delivery, and receives at most one terse confirmation.
|
|
181
|
+
- Coding intent now requires both an action and a concrete repository target, so product discussion containing words such as “feature”, “API”, or “file” cannot accidentally start a full coding cycle.
|
|
182
|
+
- Generic “picked this up” messages were removed. Activity state shows accepted work; the first durable message is a verified result or concrete blocker.
|
|
183
|
+
- Watcher-owned Codex prompts now have one consistent delivery contract: `post_message` is disabled and the watcher performs the authoritative, cancellation-aware thread post.
|
|
184
|
+
- The companion bare-agent frontend path is thread-scoped, fail-closed on ambiguous follow-ups, and revalidates a live conversation before allowing `post_message`.
|
|
185
|
+
|
|
186
|
+
## [0.18.3] — 2026-09-01
|
|
187
|
+
|
|
188
|
+
- BYO watchers now discover and cache the backend MCP `tools/list` response instead of assuming every deployment exposes the same optional tools.
|
|
189
|
+
- A missing `comment_ticket` tool no longer strands verified completions in an endless reconnect retry loop. Completions continue through the verified ticket state and deduplicated project-channel report; blockers fall back to an `update_ticket` description note.
|
|
190
|
+
- Backend prompts no longer advertise absent ticket-comment tools or mistake MCP resource discovery for team actions.
|
|
191
|
+
|
|
192
|
+
## [0.18.2] — 2026-08-31
|
|
193
|
+
|
|
194
|
+
- Backend MCP initialization now supports both Streamable HTTP modes. A successful initialize without `Mcp-Session-Id` is treated as stateless instead of fatal; stateful session expiry still gets one bounded reinitialize and retry.
|
|
195
|
+
- Concurrent startup probes share one initialize promise, and stateless tool 4xx responses no longer cause initialize loops.
|
|
196
|
+
- OpenCode's generated API-key MCP configuration now explicitly disables OAuth discovery and uses a bounded connection timeout, matching the current official remote-MCP configuration.
|
|
197
|
+
- Every OpenCode work and reply lane now gets a private per-agent config directory. The code repository is passed separately with `--dir`, and a higher-precedence runtime config prevents stale shared-workspace credentials from replacing the active agent identity.
|
|
198
|
+
- Backend introductions are watcher-owned for Claude, Codex, and OpenCode. First connection no longer spends a model cycle that can hallucinate relay-only inbox tools.
|
|
199
|
+
- Backend prompts explicitly forbid `get_marching_orders`, `poll_inbox`, and `get_resource`, while failed OpenCode tool events retain a bounded, credential-redacted diagnostic in watcher logs.
|
|
200
|
+
|
|
201
|
+
## [0.18.1] — 2026-08-31
|
|
202
|
+
|
|
203
|
+
- Codex message delivery is now watcher-owned. Guarded cycles cannot call `post_message`; the watcher fetches the real backend thread, recognizes this agent across REST and WebSocket sender shapes, and skips an exact or already-answered reply before rendering.
|
|
204
|
+
- Reconnected activity mentions now pass through the same per-message path as live WebSocket mentions instead of one batched model reply. Stable delivery keys and independent queued replies persist across restarts.
|
|
205
|
+
- BYO agents now maintain a bounded local memory graph keyed by real project, ticket, channel, thread, and message ids. Verified task states, blockers, and deliveries are recalled only for related work so agents do not redo or re-say completed actions.
|
|
206
|
+
- Codex now prefers OpenVisio's authenticated linked-codebase branch, commit, and pull-request MCP tools, avoiding local `git push`. Repositories without that tool path have a one-time scoped fallback: `authorize-pr-push` installs a narrow Codex rule; `push-pr-branch` accepts no arguments and can only push `HEAD` to the matching authorized `agent/*` branch; `revoke-pr-push` removes access.
|
|
207
|
+
- A missing PR-push authorization produces one visible blocker and pauses the ticket. Reconciliation detects the local authorization later and resumes the same ticket without requiring approval text to be copied into the ticket.
|
|
208
|
+
|
|
209
|
+
## [0.18.0] — 2026-08-31
|
|
210
|
+
|
|
211
|
+
- Codex cycles now recover from an expired command-session id by starting a fresh command instead of polling the dead process again. Exact non-fatal Codex model-catalog and stale-process diagnostics no longer appear as agent activity, while genuine tool and cycle failures remain visible.
|
|
212
|
+
- OpenCode BYO cycles now use the CLI's JSON event stream and must show completed repository and ticket actions before the watcher accepts a coding task as successful. Exit code zero and model prose alone are not completion evidence.
|
|
213
|
+
- An OpenCode acknowledgement without work triggers one focused recovery cycle. If evidence is still incomplete, the watcher reports the blocker, releases the de-duplication key, and keeps the ticket eligible for later task events and reconciliation retries.
|
|
214
|
+
- Ticket comments are first-class backend MCP actions again. The watcher adds one persisted, evidence-verified completion comment for every assigned coding handoff, while blockers continue to comment on the ticket immediately.
|
|
215
|
+
- Single-watcher locking now uses atomic file creation and fails closed. WebSocket mentions and reconciliation activity also share a short-lived content signature, preventing one logical message from creating two reply cycles.
|
|
216
|
+
|
|
217
|
+
## [0.17.6] — 2026-08-30
|
|
218
|
+
|
|
219
|
+
- Agent-authored messages now use a first-person voice throughout. Completions say “I finished”, blockers say “I'm blocked”, and introductions rely on the sender identity already displayed by the app instead of restating the agent's name.
|
|
220
|
+
- The shared reply discipline explicitly forbids third-person self-reference in acknowledgements, progress, blockers, results, and routine conversation.
|
|
221
|
+
|
|
222
|
+
## [0.17.5] — 2026-08-30
|
|
223
|
+
|
|
224
|
+
- Successful assigned coding work now produces exactly one runtime-owned project-channel result after the watcher verifies both a review/done ticket handoff and a real GitHub PR URL.
|
|
225
|
+
- Completion delivery mentions the ticket creator when available, survives reconnects through a persisted pending queue, and persists a revision key so duplicate task events cannot repost it.
|
|
226
|
+
- Ticket comments no longer count as channel completion, and the coding model is told not to race the watcher with its own backlog announcement.
|
|
227
|
+
|
|
228
|
+
## [0.17.4] — 2026-08-30
|
|
229
|
+
|
|
230
|
+
- Tickets in review, testing, QA, verification, or approval columns are now settled handoffs for the coding watcher. Reconnect reconciliation clears stale policy pauses and does not spend another model cycle on a PR that is waiting for human review.
|
|
231
|
+
- Moving a ticket back to an actionable column still produces a fresh `task:updated` work cycle.
|
|
232
|
+
|
|
233
|
+
## [0.17.3] — 2026-08-30
|
|
234
|
+
|
|
235
|
+
- Blocker ticket fallbacks no longer quote the channel's approval CTA, preventing the agent's own ticket update from being mistaken for human authorization and immediately releasing the pause.
|
|
236
|
+
|
|
237
|
+
## [0.17.2] — 2026-08-30
|
|
238
|
+
|
|
239
|
+
- Blocker delivery now carries explicit project, ticket, and channel metadata instead of trying to recover ticket identity from model prompt prose. Backlog blockers therefore alert the project channel and update/comment on the correct ticket.
|
|
240
|
+
- Every BYO runtime blocker now has a visible delivery path: policy refusal, timeout, spawn/runner error, failed MCP action, and failed evidence recovery.
|
|
241
|
+
- Push-authorization CTAs include the rejected commit, remote alias, branch, and exact approval wording when available.
|
|
242
|
+
|
|
243
|
+
## [0.17.1] — 2026-08-30
|
|
244
|
+
|
|
245
|
+
- Codex safety-policy rejections are now classified as blocked outcomes instead of successful cycles. The watcher stops recovery/retry churn, persists the paused ticket, and publishes an action-required notice with the rejected command.
|
|
246
|
+
- Policy-blocked tickets resume only after their ticket carries explicit authorization for the repository push, or after they are completed or unassigned.
|
|
247
|
+
- Assigned and reconciled coding tasks now resolve a project activity channel and emit `thinking` followed by a heartbeat-backed `working` state even when no channel mention started the task.
|
|
248
|
+
- Work and reply lanes now own independent activity targets, preventing reply typing from overwriting or clearing a concurrent coding status. Working heartbeats are reduced to one every 20 seconds, while stale thinking and typing indicators expire quickly in the app.
|
|
249
|
+
|
|
250
|
+
All notable changes to `openvisio-agent`. This project adheres to
|
|
251
|
+
[Semantic Versioning](https://semver.org/).
|
|
252
|
+
|
|
253
|
+
## [0.17.0] — 2026-08-30
|
|
254
|
+
|
|
255
|
+
### Changed
|
|
256
|
+
|
|
257
|
+
- Rebuilt the Codex BYO runtime around the documented agent WebSocket contract and a normative state machine in `docs/CODEX_BYO_AGENT_SPEC.md`.
|
|
258
|
+
- `task:assigned` is now the primary pickup signal. Assignment events must pass a fresh `get_ticket` ownership/open-state verification before a cycle starts; `task:updated` remains a compatibility signal.
|
|
259
|
+
- Startup recovery processes one authoritative open ticket per work cycle rather than handing a model an undifferentiated batch.
|
|
260
|
+
- Codex completion and blocker claims are evidence-gated. An incomplete recovery emits `WORK_CYCLE_FAILED`, leaves the ticket retryable, and cannot be treated as done based on model prose.
|
|
261
|
+
|
|
262
|
+
### Fixed
|
|
263
|
+
|
|
264
|
+
- Agent activity now calls authenticated `POST /channels/:id/agent-state` and backs off on HTTP failures. The invalid `agent_status` WebSocket frame has been removed.
|
|
265
|
+
- Codex MCP `post_message` calls now drive the documented typing state.
|
|
266
|
+
- The frontend now consumes `channel:agent:thinking`, `channel:agent:working`, and `channel:agent:typing`, matching the backend protocol.
|
|
267
|
+
|
|
268
|
+
### Added
|
|
269
|
+
|
|
270
|
+
- `npm run certify` is a mandatory pre-release gate covering shipped syntax, behavior tests, frontend typecheck, package contents, diff hygiene, task verification, lane isolation, activity protocol, and completion evidence enforcement.
|
|
271
|
+
|
|
272
|
+
## [0.16.2] — 2026-08-29
|
|
273
|
+
|
|
274
|
+
### Fixed
|
|
275
|
+
|
|
276
|
+
- Completed, closed, resolved, cancelled, and archived tickets are excluded across status fields, timestamps, and decorated board-column names.
|
|
277
|
+
- Processed WebSocket mentions and recovered activity IDs persist across restarts, preventing old mentions from generating fresh unsolicited replies.
|
|
278
|
+
- Backlog-only work updates its ticket with evidence but cannot announce progress or completion in an unrelated channel. Channel results require an explicit source thread.
|
|
279
|
+
|
|
280
|
+
## [0.16.1] — 2026-08-29
|
|
281
|
+
|
|
282
|
+
### Fixed
|
|
283
|
+
|
|
284
|
+
- Multi-mention messages are filtered before starting a model. An agent mentioned in an earlier thank-you now stays silent when a later `@agent` receives the actual request, while explicitly shared requests still reach both agents.
|
|
285
|
+
|
|
286
|
+
## [0.16.0] — 2026-08-29
|
|
287
|
+
|
|
288
|
+
### Added
|
|
289
|
+
|
|
290
|
+
- A single watcher now runs two independent Sol lanes: one serialized repository-work lane and one reply lane. Mentions can be answered immediately while an assigned coding task continues, without starting a second WebSocket watcher or duplicating event delivery.
|
|
291
|
+
- Coding mentions receive one immediate threaded acknowledgement from the reply lane and are queued for execution on the work lane, preventing concurrent edits to the same workspace.
|
|
292
|
+
|
|
293
|
+
## [0.15.2] — 2026-08-29
|
|
294
|
+
|
|
295
|
+
### Fixed
|
|
296
|
+
|
|
297
|
+
- Preserve WebSocket error-envelope details instead of logging every backend rejection as `{}`.
|
|
298
|
+
- Detect backend stages that reject `agent_status` and disable the live-status heartbeat after the first rejection, preventing repeated errors and unnecessary battery/network use during long Codex cycles.
|
|
299
|
+
|
|
300
|
+
## [0.15.1] — 2026-08-29
|
|
301
|
+
|
|
302
|
+
### Changed
|
|
303
|
+
|
|
304
|
+
- Codex now uses `gpt-5.6-sol` for every watcher cycle, including messaging, mentions, coordination, MCP work, backlog recovery, and coding. The Codex lightweight lane is disabled.
|
|
305
|
+
|
|
306
|
+
## [0.15.0] — 2026-08-29
|
|
307
|
+
|
|
308
|
+
### Fixed
|
|
309
|
+
|
|
310
|
+
- Codex coordination now defaults to `gpt-5.6-terra`; Luna is no longer used by default for MCP-dependent watcher cycles. Sol remains the coding model.
|
|
311
|
+
- Codex JSONL output now records the exact OpenVisio MCP tools invoked and reports failed calls without exposing credentials.
|
|
312
|
+
- Assigned-ticket cycles must prove both MCP task interaction (`get_ticket`/`list_tasks` and `update_ticket`) and a repository mutation before they count as complete. Read-only shell inspection no longer satisfies the completion gate.
|
|
313
|
+
- Incomplete Codex cycles receive one focused Sol recovery turn naming the missing MCP or repository actions instead of silently accepting a promise.
|
|
314
|
+
|
|
315
|
+
## [0.14.0] — 2026-08-29
|
|
316
|
+
|
|
317
|
+
### Fixed
|
|
318
|
+
|
|
319
|
+
- Backend/BYO reconciliation now uses the MCP tools that actually exist: `list_agents`, `list_projects`, `list_tasks`, `list_task_types`, and `list_activity`. The backend does not expose `get_marching_orders`, `poll_inbox`, or `comment_ticket`.
|
|
320
|
+
- Assigned non-completed tickets are filtered by the BYO agent's numeric id or identifier and handed directly to the heavy coding lane with task/project metadata.
|
|
321
|
+
- Recent activity mentioning the agent is recovered on start/reconnect and routed to the reply lane without calling nonexistent inbox tools.
|
|
322
|
+
- Removed the backend model-driven startup/daily coordination sweep that could find coding tickets and then publicly say it was unable to code. Zero-model reconciliation replaces it.
|
|
323
|
+
- Backend prompts no longer require nonexistent ticket-comment tools; agents update/move tickets with `update_ticket` and report results in the channel.
|
|
324
|
+
|
|
325
|
+
## [0.13.1] — 2026-08-29
|
|
326
|
+
|
|
327
|
+
### Fixed
|
|
328
|
+
|
|
329
|
+
- Codex completion recovery now catches silent exits and plain-text promises too, not only acknowledgements posted through an MCP message tool. A coding cycle with no repository action retries unless it verified that no task was assigned or reported a concrete blocker.
|
|
330
|
+
|
|
331
|
+
## [0.13.0] — 2026-08-29
|
|
332
|
+
|
|
333
|
+
### Fixed
|
|
334
|
+
|
|
335
|
+
- BYO watchers now recognize task assignments across `agent_id`, camelCase, nested `agent.id`, `assigned_agent`, and wrapped event payload variants.
|
|
336
|
+
- Every process start and WebSocket connection establishes a proper MCP session and reconciles both `poll_inbox` and `get_marching_orders`, recovering mentions, follow-ups, and tasks missed while offline.
|
|
337
|
+
- A zero-model five-minute backlog check discovers pending work without spending model tokens. Unchanged tasks retry after 30 minutes until completed instead of being forgotten after an acknowledgement.
|
|
338
|
+
- Assigned work moves directly into a coding cycle with explicit instructions to start, verify, open a PR, update the ticket, and report evidence rather than promise future work.
|
|
339
|
+
|
|
340
|
+
## [0.12.0] — 2026-08-29
|
|
341
|
+
|
|
342
|
+
### Added
|
|
343
|
+
|
|
344
|
+
- `openvisio-agent stop --name <agent>` unloads launchd/systemd first, terminates every remaining watcher matching that exact agent name, and clears the stale lock.
|
|
345
|
+
|
|
346
|
+
### Fixed
|
|
347
|
+
|
|
348
|
+
- Background installation now removes orphaned manual watchers before loading the replacement service, preventing KeepAlive from repeatedly spawning new conflicting processes.
|
|
349
|
+
- Duplicate-watcher errors point to the new one-command cleanup instead of telling users to chase a PID.
|
|
350
|
+
|
|
351
|
+
## [0.11.1] — 2026-08-29
|
|
352
|
+
|
|
353
|
+
### Fixed
|
|
354
|
+
|
|
355
|
+
- Codex coding cycles no longer ask for a pre-work acknowledgement. The first update must contain verified work or a concrete blocker.
|
|
356
|
+
- Assigned tasks default to the coding lane unless they are explicitly board or messaging operations, preventing vaguely titled implementation tasks from being stranded in coordination.
|
|
357
|
+
- The watcher inspects Codex JSONL activity and runs one focused recovery cycle when Codex posts an acknowledgement but performs no repository action.
|
|
358
|
+
|
|
359
|
+
## [0.11.0] — 2026-08-28
|
|
360
|
+
|
|
361
|
+
### Changed
|
|
362
|
+
|
|
363
|
+
- Route messaging, triage, introductions, catch-up checks, and board movement to a lightweight coordination lane. Claude defaults to Haiku and Codex defaults to `gpt-5.6-luna` there.
|
|
364
|
+
- Reserve Sonnet for Claude coding cycles and `gpt-5.6-sol` for Codex coding cycles. Assigned tasks and mentions with clear repository-work signals route to the coding lane.
|
|
365
|
+
- Improve recall and workspace discipline: consult available history before asking users to repeat context, reuse existing clones, read repository `AGENTS.md`, preserve unrelated work, and close every direct concern with a verified result or explicit blocker.
|
|
366
|
+
- Prefer plain punctuation and avoid em dashes in agent replies.
|
|
367
|
+
|
|
368
|
+
## [0.10.1] — 2026-08-28
|
|
369
|
+
|
|
370
|
+
### Fixed
|
|
371
|
+
|
|
372
|
+
- Codex cycles no longer pass mutually exclusive `--sandbox` and
|
|
373
|
+
`--approve-for-me` flags. Chat-only cycles stay read-only; coding cycles use
|
|
374
|
+
Codex's reviewed workspace-write approval mode.
|
|
375
|
+
- Duplicate-watcher errors explain why launchd/systemd replaces killed PIDs and
|
|
376
|
+
print the exact service-stop and log-tail commands.
|
|
377
|
+
- Background installs no longer record an ephemeral `_npx` cache executable;
|
|
378
|
+
they install and use a stable global `openvisio-agent` binary.
|
|
379
|
+
|
|
380
|
+
## [0.10.0] — 2026-08-28
|
|
381
|
+
|
|
382
|
+
### Added
|
|
383
|
+
|
|
384
|
+
- Codex is now a first-class autonomy runtime via `--agent codex`, using official
|
|
385
|
+
non-interactive `codex exec`, an isolated OpenVisio MCP configuration, and safe
|
|
386
|
+
read-only/workspace-write sandbox modes.
|
|
387
|
+
|
|
388
|
+
### Changed — battery and token efficiency
|
|
389
|
+
|
|
390
|
+
- Claude exits immediately after its one event cycle instead of remaining resident
|
|
391
|
+
until another event arrives. This releases the CLI process, file watchers, memory,
|
|
392
|
+
and idle CPU between tasks.
|
|
393
|
+
- Idle frontend watchers back off from one request every 6 seconds to one per minute
|
|
394
|
+
(with 5-second polling only during recent activity), cutting idle wakeups by ~90%.
|
|
395
|
+
- A frontend service restart no longer spends a model turn on an unconditional
|
|
396
|
+
catch-up sweep. The sweep runs only when the first inbox response contains an
|
|
397
|
+
outstanding task; the daily safety sweep remains.
|
|
398
|
+
- Backend startup catch-up sweeps are capped to once per six hours per agent, so
|
|
399
|
+
launchd/systemd restart loops cannot repeatedly spend a full model cycle.
|
|
400
|
+
|
|
401
|
+
## [0.9.0] — 2026-08-28
|
|
402
|
+
|
|
403
|
+
### Changed — big token-cost reduction
|
|
404
|
+
|
|
405
|
+
- **No more context accumulation across cycles.** The warm Claude session used to
|
|
406
|
+
keep up to 15 independent cycles (`MAX_TURNS=15`), so each new cycle re-billed the
|
|
407
|
+
ENTIRE history of the previous ones (every file read, git output, prior reply) —
|
|
408
|
+
cost grew quadratically. Autonomy cycles are self-contained, so the session now
|
|
409
|
+
recycles after EACH cycle (`MAX_TURNS=1`): a cycle only pays for its own work.
|
|
410
|
+
- **Charter + creds moved to a cached system prompt.** The large static charter
|
|
411
|
+
(toolbox, work ethic, reply discipline) and the AUTH note used to be re-sent inside
|
|
412
|
+
every cycle's user message — never cached. They now ride in the session system
|
|
413
|
+
prompt (`--append-system-prompt`), which Claude prompt-caches, so they're billed
|
|
414
|
+
once and read cheaply on subsequent cycles. Per-cycle messages are now just the
|
|
415
|
+
small event context + instruction. opencode (no system-prompt flag) folds them into
|
|
416
|
+
the message but still never accumulates.
|
|
417
|
+
|
|
418
|
+
Net effect: a routine mention→reply cycle costs a small fraction of what it did before.
|
|
419
|
+
|
|
420
|
+
## [0.8.1] — 2026-08-27
|
|
421
|
+
|
|
422
|
+
### Fixed — opencode agents couldn't call the team tools
|
|
423
|
+
|
|
424
|
+
- The prompts hard-coded Claude Code's tool namespace (`mcp__openvisio-team__post_message`),
|
|
425
|
+
but opencode exposes MCP tools as `openvisio-team_post_message` — so an opencode agent
|
|
426
|
+
fumbled every tool call. Prompt tool references are now runtime-agnostic (bare names +
|
|
427
|
+
a note that the runtime may prefix them; call whatever appears in the tool list).
|
|
428
|
+
Verified end-to-end: opencode loads the openvisio-team MCP and executes its tools
|
|
429
|
+
headlessly via `opencode run … --auto`.
|
|
430
|
+
- REMINDER: an agent only runs on opencode if it was connected with `--agent opencode`
|
|
431
|
+
(the "Runs on" dropdown in the connect modal, or the flag on the CLI). Without it the
|
|
432
|
+
agent runs on Claude Code — check `~/.openvisio/<name>.json` has `"agent": "opencode"`.
|
|
433
|
+
|
|
434
|
+
## [0.8.0] — 2026-08-27
|
|
435
|
+
|
|
436
|
+
### Added — live agent status (thinking / working / typing)
|
|
437
|
+
|
|
438
|
+
- The watcher now broadcasts what it's doing so humans can see an agent pick up and
|
|
439
|
+
act on their message in real time. It sends `{type:'agent_status', channel_id,
|
|
440
|
+
state}` over the WS as it works: **thinking** the instant a mention arrives →
|
|
441
|
+
**working** while the cycle runs (heartbeat every ~9s) → **typing** the moment it
|
|
442
|
+
calls `post_message` → **done** to clear. See `docs/AGENT_STATUS.md` for the wire
|
|
443
|
+
contract the backend fans out as `agent:status`, and the frontend's in-channel
|
|
444
|
+
status line + floating "acting elsewhere" notices.
|
|
445
|
+
|
|
446
|
+
## [0.7.1] — 2026-08-27
|
|
447
|
+
|
|
448
|
+
### Fixed — the REAL cause of duplicate/contradicting messages
|
|
449
|
+
|
|
450
|
+
- **Single-instance lock.** The duplicates were structural, not a prompt problem:
|
|
451
|
+
TWO watchers were running for the same agent (a manual `watch` alongside the
|
|
452
|
+
background launchd/systemd service), each connected to the WS as that agent, so
|
|
453
|
+
BOTH replied to every mention — and being different versions, the two replies
|
|
454
|
+
contradicted. `watch` now takes a pid lock (`~/.openvisio/watch-<slug>.lock`) and
|
|
455
|
+
a second watcher for the same agent refuses to start (stale locks from a dead pid
|
|
456
|
+
are taken over). One agent → one watcher → one reply. NOTE: kill any extra running
|
|
457
|
+
watcher and update the global install; a lock only prevents NEW double-starts.
|
|
458
|
+
- **No invented history (anti-hallucination).** The shared reply-discipline now
|
|
459
|
+
states the agent has NO memory beyond the visible thread + tool results, and must
|
|
460
|
+
never fabricate past events, competitions, results, links, PR numbers or deploy
|
|
461
|
+
URLs — if it has no record of something, say so instead of playing along.
|
|
462
|
+
|
|
463
|
+
## [0.7.0] — 2026-08-27
|
|
464
|
+
|
|
465
|
+
### Added — opencode runtime
|
|
466
|
+
|
|
467
|
+
- **Run agents on opencode, not just Claude Code.** New `--agent claude|opencode`
|
|
468
|
+
flag on `connect`/`watch` (persisted). The cycle runner is now abstracted: Claude
|
|
469
|
+
Code keeps its persistent stream-json warm session; **opencode** runs a headless
|
|
470
|
+
`opencode run <prompt> --auto [--model provider/model]` per cycle. Both honour the
|
|
471
|
+
same event loop, workspace/code flow, intro/sweep, reply-discipline and `/model`
|
|
472
|
+
control.
|
|
473
|
+
- **opencode MCP wiring.** Instead of `claude mcp add`, an opencode agent gets an
|
|
474
|
+
`opencode.json` written into its run cwd declaring the `openvisio-team` server as a
|
|
475
|
+
`{ type: "remote", url, headers }` MCP (Bearer for host agents, x-agent-api-key +
|
|
476
|
+
x-agent-identifier for backend agents). `connect --agent opencode` best-effort
|
|
477
|
+
installs the `opencode` CLI and reminds you to `opencode auth login`; the launchd/
|
|
478
|
+
systemd service PATH now includes opencode's bin dir.
|
|
479
|
+
- **Models are provider/model on opencode.** The default model is left unset (opencode
|
|
480
|
+
uses its own configured default) and the in-chat `/model` command accepts
|
|
481
|
+
`provider/model` ids (e.g. `anthropic/claude-sonnet-4`, `openai/gpt-4o`).
|
|
482
|
+
- Frontend: the "Connect your agent" modal has a **Runs on: Claude Code | opencode**
|
|
483
|
+
dropdown that adds `--agent opencode` to the generated setup command.
|
|
484
|
+
|
|
485
|
+
## [0.6.2] — 2026-08-27
|
|
486
|
+
|
|
487
|
+
### Fixed
|
|
488
|
+
|
|
489
|
+
- **Double / contradicting replies to one mention (real root cause).** The fast-cycle
|
|
490
|
+
prompt told the agent to reply to the injected mention AND *then* `poll_inbox` and
|
|
491
|
+
handle follow-ups — so in a single cycle it answered the mention, polled, re-found
|
|
492
|
+
the very same thread, and answered again with a different take (0.5.1's mention
|
|
493
|
+
de-dupe didn't cover this because it's ONE event → two posts). The fast prompt is
|
|
494
|
+
now strictly either/or: **if a specific mention is given, reply once and STOP — no
|
|
495
|
+
`poll_inbox`**; only cycles with no injected mention poll for follow-ups. The
|
|
496
|
+
mention prompt also says compose-then-post-once (no "post a reply then a better
|
|
497
|
+
version"). Mention de-dupe additionally falls back to a channel+text signature when
|
|
498
|
+
the payload has no message id.
|
|
499
|
+
|
|
500
|
+
## [0.6.1] — 2026-08-27
|
|
501
|
+
|
|
502
|
+
### Added
|
|
503
|
+
|
|
504
|
+
- **Target a specific model tier from chat.** `/model chat <m>` changes only the
|
|
505
|
+
chat/reply model; `/model code <m>` only the code-work model; `/model <m>` still
|
|
506
|
+
sets both. Natural language works too ("switch chat model to haiku"). `/model`
|
|
507
|
+
reports both tiers. Same as the CLI `--model` / `--chat-model`.
|
|
508
|
+
|
|
509
|
+
## [0.6.0] — 2026-08-27
|
|
510
|
+
|
|
511
|
+
### Added — model control (stop burning tokens)
|
|
512
|
+
|
|
513
|
+
- **Configurable model, default `sonnet`.** The agent now spawns Claude Code with an
|
|
514
|
+
explicit `--model` (default **sonnet** — cost-effective) instead of inheriting
|
|
515
|
+
whatever `claude` defaults to (often Opus). Set it with `--model <opus|sonnet|haiku|claude-…>`
|
|
516
|
+
at `connect`/`watch`; persisted to the agent config.
|
|
517
|
+
- **Cheaper chat, capable code (optional).** `--chat-model <m>` runs the lighter
|
|
518
|
+
chat/mention cycles on an even cheaper model while real code work (full/sweep
|
|
519
|
+
cycles) stays on `--model` — e.g. `--model sonnet --chat-model haiku`. The warm
|
|
520
|
+
session is respawned with the right `--model` when a cycle needs a different one.
|
|
521
|
+
- **Change the model live from chat.** An engineer can `@mention` the agent with
|
|
522
|
+
`/model` (reports the current model), `/model sonnet` / `/model opus` /
|
|
523
|
+
`/model claude-…`, or "switch model to haiku" — the watcher switches under the
|
|
524
|
+
hood, persists it, recycles the session, and the agent confirms in-thread. The
|
|
525
|
+
parser is strict (a valid model name after `/model` or the word "model") so
|
|
526
|
+
ordinary messages like "use the model file" don't trigger it.
|
|
527
|
+
|
|
528
|
+
## [0.5.1] — 2026-08-27
|
|
529
|
+
|
|
530
|
+
### Fixed (reply-discipline edge cases seen in the wild)
|
|
531
|
+
|
|
532
|
+
- **Double replies.** `agent:mention` events are now de-duped by message id, so a
|
|
533
|
+
re-delivered mention (reconnect replay / duplicate fan-out) no longer triggers a
|
|
534
|
+
second reply to the same message.
|
|
535
|
+
- **Repeated acknowledgements.** The 0.5.0 "acknowledge first" turned into agents
|
|
536
|
+
posting "On it…" several times for one task. Acknowledgement is now ONCE-only:
|
|
537
|
+
the agent checks the thread/ticket and skips it if it already acknowledged, and
|
|
538
|
+
only posts again when it has something genuinely new (a result/link/blocker).
|
|
539
|
+
- **Answering things meant for another agent.** A new shared REPLY DISCIPLINE block
|
|
540
|
+
(on every chat + code cycle) makes the agent act ONLY on messages addressed to it
|
|
541
|
+
(its @mention, a direct question, or a reply to its own message) and STAY OUT of
|
|
542
|
+
thread chatter or tasks aimed at someone else — fixes an agent jumping on work
|
|
543
|
+
another agent was called for. `.followUps` handling is now gated the same way.
|
|
544
|
+
- **Claiming then walking it back.** The discipline block adds "be sure before you
|
|
545
|
+
speak": verify (call the tool / read the code / check state) BEFORE asserting
|
|
546
|
+
something is possible/done/broken — one clear final answer instead of thinking
|
|
547
|
+
out loud across contradicting messages.
|
|
548
|
+
- **New agent slow to catch mentions.** The startup catch-up sweep now runs at ~12s
|
|
549
|
+
(was 30s) so a freshly-added agent whose WS subscription isn't live yet still
|
|
550
|
+
picks up pending mentions/tasks via the REST `poll_inbox` sweep right away.
|
|
551
|
+
|
|
552
|
+
## [0.5.0] — 2026-08-26
|
|
553
|
+
|
|
554
|
+
### Fixed
|
|
555
|
+
|
|
556
|
+
- **Task assignments are finally caught.** The watcher listened for a `task:assigned`
|
|
557
|
+
event that the backend NEVER sends — a task assigned to an agent actually arrives
|
|
558
|
+
as `task:created` (assigned on create) or `task:updated` (assignee changed), fanned
|
|
559
|
+
out org-wide (docs/WEBSOCKET.md). It now handles both, keeps only agent-assigned
|
|
560
|
+
tasks, filters to THIS agent when the payload carries the agent identifier (else the
|
|
561
|
+
cycle confirms via `get_marching_orders`), and de-dupes by task-id:agent so a noisy
|
|
562
|
+
stream of `task:updated` doesn't re-acknowledge the same assignment.
|
|
563
|
+
|
|
564
|
+
### Added
|
|
565
|
+
|
|
566
|
+
- **Acknowledge before starting.** On an assigned task the agent posts a one-line
|
|
567
|
+
`comment_ticket` ("On it — picking this up now") BEFORE it begins, then does the work
|
|
568
|
+
and reports — so the team sees it's been picked up (workspace etiquette). Baked into
|
|
569
|
+
the task event prompt and `CODE_FULL`.
|
|
570
|
+
- **Introduction on join.** The first time an agent ever connects to a workspace it
|
|
571
|
+
posts one short, friendly intro to the general channel (who it is, that it picks up
|
|
572
|
+
assigned tasks + answers @mentions). One-time, tracked by a marker in `~/.openvisio`.
|
|
573
|
+
- **Daily catch-up sweep.** A sweep runs shortly after startup (covers time offline)
|
|
574
|
+
and once every 24h: it calls `get_marching_orders` + `poll_inbox` and picks up any
|
|
575
|
+
task assigned or mention received while the agent was disconnected — TASKS first.
|
|
576
|
+
Added to BOTH the backend-WS loop and the REST warm loop (whose startup poll
|
|
577
|
+
otherwise marks pre-existing tasks "seen" and would skip offline assignments).
|
|
578
|
+
|
|
579
|
+
## [0.4.0] — 2026-08-26
|
|
580
|
+
|
|
581
|
+
### Changed
|
|
582
|
+
|
|
583
|
+
- **Code mode is the zero-config DEFAULT — no `--workdir` per repo.** An agent lives
|
|
584
|
+
on your laptop and should just work across the whole org's code. It now operates
|
|
585
|
+
from a single WORKSPACE root (default `~/openvisio-workspace`, created on demand),
|
|
586
|
+
finds the repo a task refers to, and **clones it if you don't have it yet** — then
|
|
587
|
+
branches/tests/pushes/opens a PR inside it. Point it at an existing clones folder
|
|
588
|
+
with `--workspace <dir>` (`--workdir` is an alias), or disable code work with
|
|
589
|
+
`--chat-only`. The choice is saved to the agent config so the always-on listener
|
|
590
|
+
reuses it. (Previously code work required passing `--workdir` every time, and a
|
|
591
|
+
bare agent was chat-only — the source of "it said it couldn't check a codebase".)
|
|
592
|
+
- **Agents know their job now.** Every cycle prompt opens with a CHARTER that
|
|
593
|
+
spells out the toolbox and a hard rule: *before you ever say "I can't", check
|
|
594
|
+
the tools you actually hold.* Fixes the "asked if it could check a codebase, it
|
|
595
|
+
said no — then yes once reminded there are tools" failure. Code agents are told
|
|
596
|
+
in plain words they CAN inspect a codebase, clone a repo, branch, and raise a PR.
|
|
597
|
+
- **Work ethic / closing the loop.** The charter mandates finishing the work *in
|
|
598
|
+
this cycle* and reporting back as the final action — `comment_ticket` with the
|
|
599
|
+
branch + PR link + test result, plus a channel reply that `@mentions` the
|
|
600
|
+
requester by exact full name. No more "I'll do X" and stopping; the human should
|
|
601
|
+
never have to remind the agent to circle back.
|
|
602
|
+
- **Real PR workflow for code agents.** `CODE_FULL` now runs the whole flow:
|
|
603
|
+
clone the named repo locally if absent → `git checkout -B agent/<slug>` → edit →
|
|
604
|
+
test → commit → **push the agent's own branch** → **`gh pr create`** → comment
|
|
605
|
+
the ticket + reply tagging the requester. Pushing a branch and opening PRs are
|
|
606
|
+
now allowed; `main`/`master`, force-pushes, merges, `gh repo delete`, and the
|
|
607
|
+
previously-blocked destructive/publish commands stay denied.
|
|
608
|
+
- **Longer code cycles.** A code cycle's watchdog budget is raised from 4 → 15 min
|
|
609
|
+
so a genuine clone → test → push → PR flow finishes instead of being killed
|
|
610
|
+
mid-job (an aborted cycle is itself a "never circled back" failure). Chat-only
|
|
611
|
+
cycles keep the 4-min budget.
|
|
612
|
+
- **Clear mode banner.** The watcher logs whether it's in CODE mode (printing the
|
|
613
|
+
workspace it clones/branches/PRs from) or CHAT-ONLY mode (`--chat-only`), so an
|
|
614
|
+
agent's capability is never a mystery.
|
|
615
|
+
- The backend `AUTH` note is scoped to *not hunting for credentials* only, so it
|
|
616
|
+
no longer reads as "don't use Bash/grep" to a code agent that needs them.
|
|
617
|
+
|
|
618
|
+
## [0.3.7] — 2026-08-26
|
|
619
|
+
|
|
620
|
+
### Changed
|
|
621
|
+
|
|
622
|
+
- **No more polling.** Removed the inbox sweep added in 0.3.5 — the WebSocket
|
|
623
|
+
(`task:assigned` / `agent:mention`) is the only trigger now. (It was also
|
|
624
|
+
posting a spurious threaded "follow-up" on the agent's own message.)
|
|
625
|
+
- **Replies stay in the thread.** On a mention the watcher passes the thread root
|
|
626
|
+
as `parent_id` so the agent replies *inside* that thread instead of starting a
|
|
627
|
+
new top-level message.
|
|
628
|
+
- **Accurate @mentions.** OpenVisio links a mention only when it's the member's
|
|
629
|
+
EXACT full name (`@First Last`). The mention prompt now hands the agent the
|
|
630
|
+
sender's exact display name and tells it to use `@<full name>` so the reply
|
|
631
|
+
actually notifies/links the user (previously `@First` alone rendered as plain
|
|
632
|
+
text).
|
|
633
|
+
- Unrecognized `error` WS frames now log the backend's detail instead of a bare
|
|
634
|
+
"event error".
|
|
635
|
+
|
|
636
|
+
### Note
|
|
637
|
+
|
|
638
|
+
- A thread reply that does NOT @mention the agent fires no WS event, so it isn't
|
|
639
|
+
answered — that requires the backend to dispatch a thread-activity event to
|
|
640
|
+
participant agents (we won't poll for it).
|
|
641
|
+
|
|
642
|
+
## [0.3.6] — 2026-08-26
|
|
643
|
+
|
|
644
|
+
### Fixed
|
|
645
|
+
|
|
646
|
+
- **The real credential fix.** A debug trace revealed the openvisio-team MCP bridge
|
|
647
|
+
authenticates **per tool call**, not per connection: every call needs
|
|
648
|
+
`agent_identifier` + `agent_api_key` as arguments (`post_message` 400s with
|
|
649
|
+
"Missing agent credentials" otherwise). 0.3.5's "tools are already authenticated,
|
|
650
|
+
never provide credentials" was exactly wrong. The watcher now **injects the
|
|
651
|
+
agent's identifier + api_key into every cycle prompt** and instructs the model to
|
|
652
|
+
pass both on every openvisio-team call — so it posts on the first try with no
|
|
653
|
+
shelling around to "find credentials".
|
|
654
|
+
- **Removed the typing pulse.** The backend rejects `{type:'typing'}` from an agent
|
|
655
|
+
connection (it answered every pulse with an `event error`), so it's gone. The
|
|
656
|
+
`sendTyping` capability remains in the WS client for if/when the backend supports
|
|
657
|
+
agent typing.
|
|
658
|
+
|
|
659
|
+
## [0.3.5] — 2026-08-26
|
|
660
|
+
|
|
661
|
+
### Changed
|
|
662
|
+
|
|
663
|
+
- **Replies are now near-immediate.** Debug traces showed the agent burning ~40s
|
|
664
|
+
shelling around (`Bash`/`grep` over `~/.claude`) to "find credentials" before
|
|
665
|
+
posting — even though the openvisio-team MCP tools are authenticated by the
|
|
666
|
+
connection. Every prompt now carries a hard rule: the tools are ALREADY
|
|
667
|
+
authenticated; NEVER look for API keys/tokens/config or run shell to find
|
|
668
|
+
credentials or tools — call the tools directly, act with the fewest calls, and
|
|
669
|
+
post the reply FIRST.
|
|
670
|
+
- **Typing indicator.** On an `agent:mention`, the watcher immediately pulses
|
|
671
|
+
`channel:typing` for that channel over its WS (every 3s until the cycle
|
|
672
|
+
finishes), so the agent shows as typing right away instead of going silent.
|
|
673
|
+
|
|
674
|
+
### Added
|
|
675
|
+
|
|
676
|
+
- **Follows up threads without a mention.** A bounded inbox sweep (every 60s, only
|
|
677
|
+
within 5 min of real activity, skipped while busy) polls for `.followUps` — so
|
|
678
|
+
thread replies the agent is part of get answered even when no `@mention` fires.
|
|
679
|
+
Idle agents spend nothing.
|
|
680
|
+
|
|
681
|
+
## [0.3.4] — 2026-08-26
|
|
682
|
+
|
|
683
|
+
### Changed
|
|
684
|
+
|
|
685
|
+
- **Events now feed their own context into the cycle** instead of relying on
|
|
686
|
+
`poll_inbox` to re-surface them. The `agent:mention` WS payload already carries
|
|
687
|
+
`{ channel_id, message }`, so the cycle prompt now tells the agent exactly which
|
|
688
|
+
channel + message to reply to ("You were @mentioned in channel N: '…' — reply
|
|
689
|
+
there with post_message"). `task:assigned` similarly injects the task title +
|
|
690
|
+
description. This fixes the case where a mention was received over the WS but
|
|
691
|
+
`poll_inbox` returned it empty, so the cycle completed successfully **without
|
|
692
|
+
replying**. Coalesced events accumulate their context into the next cycle.
|
|
693
|
+
|
|
694
|
+
## [0.3.3] — 2026-08-26
|
|
695
|
+
|
|
696
|
+
### Fixed
|
|
697
|
+
|
|
698
|
+
- **A hung cycle no longer silently swallows every later event.** Cycles now have
|
|
699
|
+
a 4-minute backstop timeout: if one never returns a result (e.g. an MCP tool
|
|
700
|
+
stalling on an unreachable bridge), the session is killed, `busy` is released,
|
|
701
|
+
and queued mentions proceed. Before, one stuck cycle left the watcher accepting
|
|
702
|
+
`agent:mention` events but never acting on them.
|
|
703
|
+
|
|
704
|
+
### Added
|
|
705
|
+
|
|
706
|
+
- **`watch --debug`** logs what each cycle actually does — session init + which
|
|
707
|
+
MCP servers loaded, every `→ tool` call, tool errors (`✗`), and assistant text —
|
|
708
|
+
so a silent/non-replying cycle is diagnosable in one run.
|
|
709
|
+
- The WS loop now logs `running <fast|full> cycle…` and `busy — queued …` so it's
|
|
710
|
+
clear whether an event triggered a cycle or was coalesced.
|
|
711
|
+
|
|
712
|
+
## [0.3.2] — 2026-08-25
|
|
713
|
+
|
|
714
|
+
### Changed
|
|
715
|
+
|
|
716
|
+
- **`connect --backend --ws …` now makes the agent always-on by default.** Setup
|
|
717
|
+
installs `openvisio-agent` globally and registers the background listener
|
|
718
|
+
(launchd on macOS, systemd `--user` on Linux) that auto-starts on login and
|
|
719
|
+
survives reboot — so tagging the agent in a channel is caught with no terminal
|
|
720
|
+
open. Previously `connect` left nothing installed (an `npx` run vanished) and the
|
|
721
|
+
WebSocket listener only ran if you manually kept `watch` open. Opt out with
|
|
722
|
+
`--no-service`; pass `--workdir <repo>` to let the always-on listener code on a
|
|
723
|
+
branch. `installService` is now exported for this.
|
|
724
|
+
|
|
725
|
+
## [0.3.1] — 2026-08-24
|
|
726
|
+
|
|
727
|
+
### Fixed
|
|
728
|
+
|
|
729
|
+
- **MCP now registers at USER (global) scope.** `claude mcp add` defaults to
|
|
730
|
+
local (project) scope, so the `openvisio-team` tools were only present in the
|
|
731
|
+
directory `connect` ran in — and re-prompted elsewhere. Both `connect` and
|
|
732
|
+
`connect --backend` now pass `--scope user`, so the tools (with credentials
|
|
733
|
+
baked into the request headers) are available in every project without asking.
|
|
734
|
+
- **`connect` removes any stale `openvisio-team` MCP registration before adding.**
|
|
735
|
+
`claude mcp add` does not overwrite an existing same-named server, so a changed
|
|
736
|
+
`--mcp-url` was silently shadowed by the old entry ("I changed the URL but it's
|
|
737
|
+
stuck on the old one"). Both connect paths now `mcp remove` (user + local scopes)
|
|
738
|
+
first, then add global.
|
|
739
|
+
|
|
740
|
+
## [0.3.0] — 2026-08-24
|
|
741
|
+
|
|
742
|
+
### Added
|
|
743
|
+
|
|
744
|
+
- **Real-time backend autonomy over WebSocket.** A backend agent can now react to
|
|
745
|
+
`task:assigned` and `agent:mention` dispatches the instant the backend pushes
|
|
746
|
+
them, instead of polling.
|
|
747
|
+
- `connect --backend … --ws <wss-url> --mcp-url <url>` — `--ws` is the org's
|
|
748
|
+
API-Gateway WebSocket base (same value as the frontend's
|
|
749
|
+
`NEXT_PUBLIC_BACKEND_WS_URL`); `--mcp-url` registers the `openvisio-team` MCP so
|
|
750
|
+
the agent has tools to ACT on those events. Both are persisted (config +
|
|
751
|
+
`OPENVISIO_AGENT_WS_URL` in the env file).
|
|
752
|
+
- `watch --name <agent>` auto-detects a backend agent and runs the WS loop:
|
|
753
|
+
connects with `?api_key=&identifier=`, sends periodic keepalives, reconnects
|
|
754
|
+
with exponential backoff, and drives ONE Claude cycle per event (a burst of
|
|
755
|
+
mentions coalesces into a single follow-up cycle). `--install` / `--workdir`
|
|
756
|
+
work the same as the REST loop.
|
|
757
|
+
- Requires **Node ≥ 21** (built-in global `WebSocket`); on Node 20 run with
|
|
758
|
+
`--experimental-websocket`. Fails fast with a clear message otherwise.
|
|
759
|
+
|
|
760
|
+
### Changed
|
|
761
|
+
|
|
762
|
+
- The Claude warm-session machinery is now shared by both the REST (`--host`) and
|
|
763
|
+
WebSocket (backend) loops — identical session recycling, guardrails, and prompts.
|
|
764
|
+
|
|
765
|
+
## [0.2.0] — 2026-08-21
|
|
766
|
+
|
|
767
|
+
### Added
|
|
768
|
+
|
|
769
|
+
- **Backend mode** — `connect --backend <url> --key <api-key> --id <identifier>`
|
|
770
|
+
registers an agent created against the OpenVisio org backend ("Connect your
|
|
771
|
+
agent"): verifies the credentials live (`x-agent-api-key` +
|
|
772
|
+
`x-agent-identifier` headers), then saves `~/.openvisio/<agent>.json` and a
|
|
773
|
+
sourceable `~/.openvisio/<agent>.env` (0600). No setup-token exchange — the
|
|
774
|
+
one-time api-key from the create screen IS the credential.
|
|
775
|
+
|
|
776
|
+
## [0.1.0] — 2026-08-12
|
|
777
|
+
|
|
778
|
+
### Added
|
|
779
|
+
|
|
780
|
+
- `connect <ovs_code> --host <url>` — redeems the single-use setup code for the
|
|
781
|
+
agent key, registers the `openvisio-team` MCP server with Claude Code (installing
|
|
782
|
+
Claude Code if missing), and saves a `600`-perm scoped config under `~/.openvisio/`.
|
|
783
|
+
Options: `--name "<agent>"`, `--mcp-url <url>`.
|
|
784
|
+
- `watch --name <agent>` — the event-driven "warm" autonomy loop: cheaply polls the
|
|
785
|
+
inbox (no model spend when idle) and pokes a single persistent Claude Code session
|
|
786
|
+
per new @mention / follow-up / ticket.
|
|
787
|
+
- `--install` — background service (launchd on macOS, systemd `--user` on Linux),
|
|
788
|
+
auto-starts at login.
|
|
789
|
+
- `--workdir <repo>` — opt-in coding mode: file + Bash tools scoped to that git
|
|
790
|
+
repo, branch-only, with a destructive-shell denylist (never pushes or merges).
|
|
791
|
+
- `--help` / `--version`.
|
|
792
|
+
|
|
793
|
+
### Notes
|
|
794
|
+
|
|
795
|
+
- Zero runtime dependencies (Node ≥ 18, uses built-in `fetch`).
|
|
796
|
+
- Replaces the previous `curl … | bash` one-paste installer with a published,
|
|
797
|
+
inspectable package.
|