viettranx
b676ee1351
refactor: adopt Go 1.26+ standard library modernizations
...
- Use maps.Copy in hooks dispatcher instead of manual map loop
- Remove implicit loop variable capture in router_abort_test (Go 1.26 semantics)
- Use range without index in http_test where index unused
- Use min() builtin in script_test instead of manual min computation
2026-04-23 19:16:08 +07:00
badgerbees and Viet Tran
f5917b0e46
fix(backup): harden tenant restore preview and lookup handling ( #920 )
...
* fix(backup): harden tenant restore preview and lookup handling
* test(pg): fix hook test migration path
* test(ci): stabilize race coverage tests
* fix(hooks): scope GetByID and allow loopback tests
* fix(backup): harden tenant restore replace/new contracts + race-safe SSRF flag
- Replace mode no longer deletes the tenants row (FK safe vs excluded
diagnostic tables: traces, activity_logs, usage_snapshots, spans,
embedding_cache, pairing_requests, paired_devices,
channel_pending_messages, cron_run_logs). Metadata is preserved in place.
- shouldRestoreTable now excludes tenants for both new and replace modes.
- CLI: add validateTenantRestoreFlags guardrail. mode=new requires
--new-tenant-slug and rejects --tenant/--tenant-id; upsert/replace warn
on stray --new-tenant-slug; invalid --mode values rejected. TAB in help
text fixed; flag descriptions clarified.
- HTTP: resolveRestoreTarget rejects tenant_id for mode=new regardless
of tenant_slug (matches CLI contract). New i18n key
MsgRestoreNewModeRejectsTenantID (en/vi/zh).
- security/ssrf: allowLoopbackForTest switched to atomic.Bool so
concurrent reads from outbound dialers are race-safe.
- Polish: vi backup.json key order matches en/zh; TenantRestoreOptions.Mode
doc comment documents upsert/replace/new semantics including clone
behavior for new.
- Tests: unit coverage for validator (12 cases), HTTP guardrails
(3 cases), shouldRestoreTable replace branch. Integration test
tests/integration/tenant_restore_replace_test.go regression-guards
the FK fix using activity_logs seed + DeleteTenantDataForTest helper.
---------
Co-authored-by: Viet Tran <viettranx@gmail.com >
2026-04-16 15:49:50 +07:00
viettranx
3b4004946e
chore: apply go fix syntax upgrades (min/max, switch patterns)
...
Apply Go 1.21+ min/max builtins and improved switch pattern matching
across test files and utilities. No functional changes.
2026-04-15 11:24:57 +07:00
viettranx
1ac08155b0
feat(trace): reliable stop/abort with ctx-aware streams and 2-phase router
...
Makes the Stop button on the traces page actually stop running traces.
Seven-phase implementation across provider HTTP, agent router, trace
persistence, WS events, tool exec, i18n, and integration tests.
- Provider HTTP+SSE ctx-aware: close socket on cancel via CtxBody wrapper
- Router 2-phase abort: CAS state machine, 3s grace, force-mark fallback
- Trace retry: 3 inline retries + 10-max retry queue, stale recovery 10min
- trace.status WS event: real-time UI updates (invalidates query on receive)
- Tool exec: process-group kill (SIGTERM→3s→SIGKILL), Rod page ctx watch
- i18n: 6 abort toast variants in en/vi/zh
- Integration: 9 scenarios, -race clean
Fixes tenant-ctx loss in forceMarkTraceAborted and retry worker broadcast
(caught by code-reviewer: C1/C2). Stale threshold intentionally 10min
because start_time-based; last_span_at migration is a follow-up.
2026-04-14 18:28:31 +07:00
viettranx
8b75e095e9
feat(cancel): add run.cancelled event and fix stop across web UI, desktop, and channels
...
- Add distinct `run.cancelled` agent event to differentiate user-initiated
cancellation from real errors (previously both emitted `run.failed`)
- Fix desktop stop button: wire onStop callback to InputBar, add abort()
function in useChat hook, restore isRunning state on session switch
- Fix web UI: handle run.cancelled without showing error message, preserve
partial streamed content on cancel
- Fix hanging chat.send promise: send {cancelled: true} OK response instead
of silently dropping (was hanging 600s until timeout)
- Fix channel stream cleanup: handle run.cancelled for stream stop + run
context deletion (prevents memory leak) + reaction status clear
- Fix child trace status: cancelled subagent runs now correctly get
TraceStatusCancelled instead of TraceStatusError
- Add run.cancelled to all event consumers: query invalidation, session
detail refresh, trace dialog refresh, gateway activity clearing
2026-03-29 09:00:06 +07:00