* fix: keep cron trigger once when editing only the script body
* test: cover cron trigger once preservation on script edit
* test: clean up temp script fixture in cron edit once test
The test leaked the mkdtemp directory under os.tmpdir. Remove it in a
finally block so repeated runs do not accumulate temp fixtures.
Fixes#120226
* test: prove trigger.once survives script edit via real gateway store
* fix(cron): preserve trigger metadata on script edits
Validate trigger script input before any Gateway lookup, retain existing trigger metadata during script-only edits, and replace mock-only handler coverage with isolated CLI-to-Gateway persistence proof.
Co-authored-by: Anuj Bolewar <bolewara@gmail.com>
* test(cron): normalize trigger-script rejection cases
Keep the table rows type-stable so the cron edit regression suite passes test type checking.
Co-authored-by: Anuj Bolewar <bolewara@gmail.com>
* style(cron): format trigger preservation tests
Co-authored-by: Anuj Bolewar <bolewara@gmail.com>
---------
Co-authored-by: Peter Steinberger <steipete@gmail.com>
Persist inherited per-agent order references, collapse equivalent auth-provider state keys onto the canonical provider, and clear every equivalent persisted key. Make auth-order validation and display alias-aware while leaving separate OAuth runtime-cache behavior unchanged.
Fixes#119233
Co-authored-by: Peter Steinberger <steipete@gmail.com>
* fix(gateway): flush trailing chat deltas
Keep the fixed-deadline wake-up on the existing chat run record so terminal, abort, and shutdown cleanup cancel it at the lifecycle owner. Normalize voice runs onto their unique per-turn ID instead of compensating for a stale client alias downstream.
Fixes#119557
Co-authored-by: Serghei <43180231+xyrolle@users.noreply.github.com>
* test(gateway): drop obsolete delta length assertions
Remove stale fixtures and assertions for the write-only chat delta length field deleted by the owner-boundary repair.
Co-authored-by: Serghei <43180231+xyrolle@users.noreply.github.com>
* fix(gateway): preserve chat run state type contract
Keep the optional delta length field and its cleanup semantics in the exported ChatRunState closure without restoring runtime writes.
Co-authored-by: Serghei <43180231+xyrolle@users.noreply.github.com>
* refactor(gateway): hide chat delta timer from SDK shape
Keep the trailing wake physically on each run record while exposing it only through internal state-module accessors, preserving the public ChatRunState closure.
Co-authored-by: Serghei <43180231+xyrolle@users.noreply.github.com>
* refactor(gateway): narrow chat delta timer access
Use one Gateway-internal record accessor so the run-owned timer remains outside the public ChatRunState shape without extra state maps.
Co-authored-by: Serghei <43180231+xyrolle@users.noreply.github.com>
* refactor(gateway): keep chat timer casts private
Keep the run-owned timer invisible to the generated Plugin SDK closure by using module-private casts in each owning Gateway module.
Co-authored-by: Serghei <43180231+xyrolle@users.noreply.github.com>
---------
Co-authored-by: Peter Steinberger <steipete@gmail.com>
* fix(imessage): harden remote Mac transport
Route SSH-backed iMessage actions through JSON-RPC, preserve remote database paths, and stage outbound files on the Messages Mac with bounded cleanup. Keep local action semantics intact while failing closed on ambiguous wrappers and surfacing the remaining imsg v0.13.4 limits.
* fix(imessage): remove test-only exports
Require the unified declaration cache to contain every production Plugin SDK declaration before accepting or stamping it. Matching partial v4 stamps are now stale and rebuild instead of failing later in the canonical declaration writer.
Route persisted session turns through the existing identity-checked writer while keeping memory-only provenance reads non-materializing. Rejected turns no longer create agent database state through provenance or empty cursor bookkeeping.
Fixes#119220
Co-authored-by: Peter Steinberger <steipete@gmail.com>
Co-authored-by: ruel225 <ruel225@users.noreply.github.com>
* fix(plugins): keep OpenCode Go bundled
* fix(plugins): mark OpenCode Go dist bundled
* fix(docs): show OpenCode Go as bundled
* fix(release): defer bundled plugin publication
* fix(ui): hide inert task-suggestion chips and strip bidi controls
- render no suggestion card for operators who can neither accept nor dismiss (matches TUI behavior)
- strip RTL/bidi control characters from chip title, summary, project path, and instructions before rendering
- document the git-checkout requirement for spawn_task project directories (gateway enforcement landed in #120940)
* fix(ui): gate task-suggestion actions on negotiated gateway methods
Mirror the TUI capability rule: accept requires the taskSuggestions.accept method plus operator.admin, dismiss requires taskSuggestions.dismiss plus operator.write. List-only gateways render no chip; e2e fixtures now advertise the mutation methods they exercise, and a new regression proves a pending suggestion renders no chip when only listing is advertised. Addresses the ClawSweeper P2 on this PR.