Commit Graph
1912 Commits
Author SHA1 Message Date
viettranx bfd65828a6 feat(web): add merge hint to CLI and MCP user credentials dialogs
Both dialogs now show an amber callout explaining that chat users
(Telegram, Discord, etc.) must be merged into a tenant user via
Contacts page before they can have per-user credentials.
i18n: en/vi/zh for both cli-credentials and mcp namespaces.
2026-04-02 15:18:06 +07:00
viettranx 5bad031908 fix(web): align CLI user credentials picker with MCP pattern
Replace raw Combobox + useUserPicker with UserPickerCombobox
component (source="tenant_user") to match MCP user credentials
dialog. Both systems use the same runtime user ID from context.
2026-04-02 15:15:36 +07:00
viettranx ddc5964b85 feat(web): replace user ID text input with Combobox user picker in CLI user credentials
Use existing useUserPicker hook + Combobox component to search
contacts + tenant_users instead of manual UUID entry.
Supports allowCustom for IDs not in the search results.
2026-04-02 15:10:30 +07:00
viettranx 79dce7e523 Merge branch 'hotfix/secure-cli-lookup-ambiguous-column' into dev 2026-04-02 15:02:43 +07:00
viettranx 9c92dead74 fix(web): force remount KG entity detail dialog on entity change
Add key={viewEntity?.id} to prevent stale relations/traversal data
when switching between entities without closing the dialog.
2026-04-02 15:01:20 +07:00
viettranx 19d8faf28f refactor(knowledge-graph): minor UI and handler adjustments 2026-04-02 14:58:03 +07:00
viettranx 3da84fcded fix(web): prevent tool card overflow during streaming
Add min-w-0 to ActiveRunZone flex content container.
Without it, long tool results (e.g. SQL output) push beyond viewport
creating horizontal scroll. MergedToolGroup already had this fix.
2026-04-02 14:57:58 +07:00
Viet Tran c5bfbc96a6 fix(secure-cli): resolve ambiguous column in LookupByBinary JOIN query (#641)
LookupByBinary uses LEFT JOIN with secure_cli_user_credentials but
SELECT columns lacked table alias prefix, causing PostgreSQL error:
"column reference 'id' is ambiguous (SQLSTATE 42702)"

This silently broke ALL credentialed CLI exec — commands fell through
to regular shell exec without injected env vars.

Fix: use b.-prefixed column names for JOIN queries.
Also add diagnostic logging to lookupCredentialedBinary for future debugging.
2026-04-02 14:57:53 +07:00
viettranx 10cd911dc7 feat(secure-cli): check-binary endpoint, agent select dropdown, fix ambiguous column
Backend:
- Add POST /v1/cli-credentials/check-binary to resolve binary via exec.LookPath
- Security: safeBinaryNameRe regex prevents filesystem probing
- Fix ambiguous column in LookupByBinary LEFT JOIN (secureCLISelectColsAliased)
- Add diagnostic logging to lookupCredentialedBinary

Frontend:
- Replace agent ID text input with Select dropdown (reuse useAgents hook)
- Add Check Binary button next to binary name (auto-fills resolved path)
- Add binary path hint explaining auto-detection from PATH
- Update i18n keys (en/vi/zh) for new UI elements
2026-04-02 14:57:50 +07:00
viettranx ec05c80e90 fix(secure-cli): resolve ambiguous column in LookupByBinary JOIN query
LookupByBinary uses LEFT JOIN with secure_cli_user_credentials but
SELECT columns lacked table alias prefix, causing PostgreSQL error:
"column reference 'id' is ambiguous (SQLSTATE 42702)"

This silently broke ALL credentialed CLI exec — commands fell through
to regular shell exec without injected env vars.

Fix: use b.-prefixed column names for JOIN queries.
Also add diagnostic logging to lookupCredentialedBinary for future debugging.
2026-04-02 14:56:49 +07:00
viettranx 0370cabdc9 chore: stabilize main branch with dev workflow + PR guidelines
- Set dev as default branch, protect main (owner-only merge)
- Add CI trigger for PRs targeting dev
- Add PR template with checklist and branch targeting guide
- Add CONTRIBUTING.md with branch strategy and review criteria
- Update README clone command to use -b main for stable
2026-04-02 12:36:30 +07:00
viettranx 62724780b8 feat(web): show richer context in traces list (agent, user, source, input preview)
Traces list Name column now displays agent display name, user label,
source type badge (Direct/Group/Cron/Team/Web), channel badge, and
truncated input preview — making it easy to identify which chat each
trace belongs to.
2026-04-02 12:15:09 +07:00
Huy Doanandviettranx 040ac31156 feat(web): add Brave Search API key to tools config UI (#627)
* feat(web): add Brave Search API key to tools config UI

Expose `web.brave.api_key` in the Web Search settings with password input,
strip masked values on save, and show the field only when Brave Search is
enabled. Add en/vi/zh strings for label, tooltip, placeholder, and managed key.

* refactor(web): extract isSecret to shared utility and fix mobile input font-size

DRY: move duplicated isSecret() from providers-section and tools-web-section
into lib/secret.ts. Add text-base md:text-sm to number inputs for iOS
Safari auto-zoom prevention.

---------

Co-authored-by: viettranx <viettranx@gmail.com>
2026-04-02 12:07:21 +07:00
viettranx 6baef0fb9c fix(telegram): add /reactions to bot menu commands
Register /reactions in DefaultMenuCommands() so it appears in
Telegram's command autocomplete menu after deploy.
2026-04-02 12:05:25 +07:00
viettranx a1323e0d1d feat(telegram): remap reaction emojis and add /reactions command
Remap status reaction emojis for clarity (tool: 🔥→✍, error: 😱→💔)
and reduce overlap between statuses. Add /reactions command to show
emoji legend table to users.
2026-04-02 12:02:12 +07:00
Huy Doan 173f1cea53 fix(cli-credentials): show existing env keys on edit and support merge/remove (#629)
fix(cli-credentials): show existing env keys on edit and support merge/remove

- Expose env_keys on secure CLI list/get and per-user credential list (values stay hidden)
- PUT merges env with stored secrets: empty value keeps existing, removed keys dropped
- Generic error messages to prevent env key enumeration
- Audit logging for user credential set/delete
- DRY: reuse envKeysFromDecryptedJSON helper
- Client-side env key name validation (en/vi/zh i18n)
2026-04-02 11:59:49 +07:00
viettranx 899c8eb0b4 fix(skills): fix dep detection false positives and all-or-nothing install
- Filter Python stdlib modules at scan time to prevent false positives
  when the runtime checker fails (e.g. pip:argparse, pip:sys)
- Install pip/npm packages one-by-one instead of batch so partial
  success is preserved when one package fails
- Persist missing deps to DB after install via StoreMissingDeps() so
  reload reflects actual state instead of stale data
- Use explicit master tenant context in handleInstallDeps for
  consistency with rescanAndUpdate()
2026-04-02 11:42:14 +07:00
viettranx ecf6463d98 fix(summon): preserve user's custom display_name during summon/regenerate
Previously, finishSummon() and RegenerateAgent() unconditionally overwrote
display_name with the LLM-extracted name from IDENTITY.md. Now if the user
already set a custom name, it is preserved and IDENTITY.md Name field is
synced to match — keeping UI label and agent self-identity consistent.
2026-04-02 11:04:56 +07:00
viettranx 9d74e39625 fix(telegram): stop auto-linking @mentions to t.me profile URLs
LLM @mentions are not necessarily Telegram usernames. Auto-wrapping
them in <a href="https://t.me/..."> caused unwanted profile cards.
Keep placeholder protection for italic conversion, restore as plain text.
2026-04-02 10:55:41 +07:00
viettranx 1a2d5789d3 fix(ui): show group names in permission scope dropdown
Replace raw scope strings (e.g. group:nta7-goclaw:-5101523...) with
human-readable group names by fetching delivery targets from
channel_contacts via heartbeat.targets API. Scope labels are also
resolved in the permissions list display.
2026-04-02 10:37:19 +07:00
viettranx 3e4d614aa1 feat(media): add Veo 3.1 Lite video generation with image-to-video support (#638)
- Switch default Gemini video model to veo-3.1-lite-generate-preview (50% cheaper)
- Add image_path tool param for image-to-video generation (Gemini Veo only)
- Add resolution and generate_audio as per-provider chain params in UI
- Support dual response formats (Veo 3.1 generatedVideos + Veo 3.0 generatedSamples)
- Gracefully skip image-to-video on providers that don't support it (MiniMax, chat)
- Split create_video into per-provider files (gemini, minimax, chat) for maintainability
2026-04-02 10:33:35 +07:00
viettranx 14c375e33b fix(media): update native provider API defaults and UI schema
- OpenAI image default: dall-e-3 → gpt-image-1.5 (dall-e-3 deprecated May 12)
- DashScope: add missing 4:3 and 3:4 aspect ratio mappings
- UI: remove stale MiniMax size/prompt_optimizer params (backend uses aspect_ratio since #630)
2026-04-02 09:53:01 +07:00
viettranx 83bcb16597 refactor(channels): extract health model and modularize UI components
Post-merge cleanup for #634 channel health diagnostics:

Backend:
- Extract health types, ClassifyChannelError, mergeChannelHealth,
  buildRemediation into internal/channels/health.go
- Fix case-true anti-pattern → default in Slack config
- Remove duplicate connection-refused case in ClassifyChannelError
- Remove unused _ bool param from BaseChannel.setHealth
- Fix snapshot.Enabled == false → !snapshot.Enabled

Web UI:
- Extract channel status utilities to channels-status-utils.ts
- Extract ChannelDiagnosticsCard from channel-detail-page.tsx
- Extract ChannelAttentionPanel from system-health-card.tsx

Desktop UI:
- Extract shared getChannelStatusDisplay() to utils/channel-status.ts
- Add explicit stopped state case for visual consistency with web UI
- Add missing vi/zh locale keys for new health status states
2026-04-02 09:45:41 +07:00
Tai Nguyen b5c4d1de2a fix bug can not create image with minimax provider (#630) 2026-04-02 09:35:21 +07:00
Kai (Tam Nhu) Tran 4cd7b0a8d4 feat: add actionable channel health diagnostics and remediation (#634)
* feat: add channel health diagnostics

* fix(channels): harden startup failure reporting

- sanitize operator-facing failure details instead of exposing raw upstream errors

- keep registered channel instances failed during reload/startup errors and clean up pre-registration failure entries

- stop Telegram warning states from reporting running=true after polling or startup failures

* feat(channels-ui): surface actionable health diagnostics

- expand channel and overview views with richer health summaries, remediation hints, and failure history

- refine the channel dashboard layout so diagnostics are easier to scan instead of reading a wall of text

- keep shared web and desktop channel types aligned with the new health payload

* fix(web): harden channel health diagnostics states

- treat enabled channels without backend status as checking instead of stopped\n- align fallback remediation and overview attention synthesis with channel reality\n- localize diagnostics copy and reject invalid channel detail tabs\n\nRefs #628\nRefs #633

* docs(pr-assets): add channel diagnostics visual review pack
2026-04-02 09:30:11 +07:00
viettranx abcb9614bc feat(providers): allow provider_type changes on update with SSRF re-validation
Remove blanket rejection of provider_type on update. Instead, when
provider_type changes, re-validate the existing api_base against the
new type to prevent SSRF via ACP→non-ACP type switch.

This enables provider type changes in onboarding/setup flows while
maintaining security: ACP providers skip URL validation, so switching
from ACP to another type now forces URL re-validation.
2026-04-02 08:49:54 +07:00
Kai (Tam Nhu) Tranandviettranx 9fd9e1f47b fix(providers): recover Codex text from responses completion events (#631)
* fix(providers): recover Codex text from responses completion events

* fix(providers): honor Codex phase-aware response assembly

* refactor(providers): extract Codex stream state to separate file

Split codexMessageStreamState and related types/methods from codex.go
(457 lines) into codex_stream_state.go to comply with 200-line file
size guideline. Fix redundant nil check in registerMessageItem. Add
clarifying comment on reconcileCompleted edge case.

---------

Co-authored-by: viettranx <viettranx@gmail.com>
2026-04-02 08:47:26 +07:00
Thieu Nguyen c84f4ac905 docs: sync API endpoint documentation with codebase (#632)
Add ~55 undocumented REST endpoints and ~30 undocumented WS methods.
Remove 14 stale entries (custom tools HTTP, sessions HTTP, delegations WS).
New sections: tenants, system-configs, edition, TTS, browser, zalo, export/import.
2026-04-02 08:24:08 +07:00
viettranx 3266a66299 feat(workspace): split sharing UI - separate Memory & KG from Workspace
Reorganize workspace sharing section to distinguish shared workspace
from memory/knowledge graph sharing controls.
2026-04-02 08:23:19 +07:00
viettranx fbcff96a49 feat(pending-messages): add topic suffix to group titles
Show topic/thread context in pending messages group titles for clarity.
2026-04-02 08:23:17 +07:00
viettranx 99f4679876 feat(contacts-page): add topic badge, filter, and thread_id display
Add topic filtering and display thread_id column on contacts page.
Show topic badge in contact listing for better organization.
2026-04-02 08:23:16 +07:00
viettranx 7291f31364 feat(cron-ui): move advanced settings inline to overview tab
Refactor cron detail page to consolidate settings in overview tab.
Remove separate advanced dialog, simplifying navigation and reducing layout complexity.
2026-04-02 08:23:14 +07:00
viettranx ab0e2051a6 refactor(heartbeat): simplify and optimize heartbeat store operations
Clean up heartbeat query logic and improve query efficiency across
PostgreSQL and SQLite implementations.
2026-04-02 08:23:11 +07:00
viettranx e682c53f73 feat(heartbeat): reformat delivery layout with channel and chat ID
Improve layout in heartbeat delivery list with 140px channel column
and flexible chat ID column for better readability.
2026-04-02 08:23:09 +07:00
viettranx b663d92fa4 fix(cron): skip loadClaimedJob for manual runs
Allow manual job runs even when job is disabled by checking job ID before
claiming. Prevents skipping manually triggered executions.
2026-04-02 08:23:07 +07:00
viettranx c48639369b fix(cron): apply timezone to all schedule kinds, not just cron
Move TZ application before schedule kind switch in MergeCronSchedule.
Ensure timezone applies consistently to cron, every, and at expressions.
2026-04-02 08:23:05 +07:00
viettranx 7d5c670708 feat(channels): add thread support to all channel handlers
Pass threadID and threadType to EnsureContact across all channel integrations:
- Discord, Feishu, Slack, Telegram, WhatsApp, Zalo
- Include General topic in contact collection
2026-04-02 08:23:03 +07:00
viettranx ac3af93df5 feat(contacts): implement thread_id persistence in PG and SQLite stores
- Update UpsertContact to handle threadID and threadType
- Strip username from sender_id compound key
- Implement in both PostgreSQL and SQLite backends
2026-04-02 08:23:01 +07:00
viettranx bf98a32e9b feat(store): add thread support to contact model and collector
- Add threadID and threadType to ContactCollector.EnsureContact
- Update ContactStore.UpsertContact signature
- Update Contact type in web UI
2026-04-02 08:22:57 +07:00
viettranx 670000651d feat(sqlite): add thread_id columns to contacts schema
Update SQLite schema to include thread_id and thread_type columns.
2026-04-02 08:22:54 +07:00
viettranx 5d632a522e feat(db): add migration 35 for contact thread_id columns
Add thread_id, thread_type columns to track forum topics and threaded conversations.
2026-04-02 08:22:53 +07:00
viettranx 28aa667c77 refactor(cron): redesigned run history with cleaner layout + status icons
- StatusIcon component with CheckCircle2/XCircle for visual feedback
- Compact timeline layout: icon, timestamp, duration badge, summary, tokens, status
- Error messages in monospace <pre> blocks with error-specific styling
- Mobile: duration + tokens move to expanded section
- Hide pagination when single page
2026-04-01 23:24:48 +07:00
viettranx cac3974e7c feat(cron): delivery UI with Select dropdowns + targets fetching
- Replace free-text Input with Select for Channel + To fields
- Fetch delivery targets via HEARTBEAT_TARGETS RPC
- Populate To options based on selected Channel
- Fallback to Input when no targets available
2026-04-01 23:24:44 +07:00
viettranx 4a0d938452 fix(ui): combobox dropdown auto-focus only on user interaction
- Check relatedTarget and document.hasFocus() to distinguish user-initiated focus
- Prevent programmatic focus from opening dropdown unintentionally
2026-04-01 23:24:40 +07:00
viettranx 523b084478 fix(telegram): retry pairing message without thread ID on hidden topic
- Handle 'thread not found' error when forum General topic is hidden/deleted
- Retry without messageThreadID for graceful fallback to main chat
2026-04-01 23:24:38 +07:00
viettranx 2f97d58c83 feat(heartbeat): support topic suffix in delivery targets
- Use array_to_string([5:]) in PG to capture full chatId with topic:N suffix
- Add extractSessionKeyTail() for SQLite forum group support
- Join on base chatId for contact display name resolution
2026-04-01 23:24:36 +07:00
viettranx 8ba4bd7c4a fix(cron): RunJob NULL-safe comparison and timezone persistence
- Use IS DISTINCT FROM instead of != for NULL handling in RunJob claim
- Always apply patch TZ (empty = UTC default). Callers send full schedule
2026-04-01 23:24:33 +07:00
viettranx 04dc34e32c fix(schema): exempt multi-action tools from OpenAI strict mode
Strict mode forces ALL properties to be required, causing models to
send ~13 empty params per tool call on multi-action tools like
team_tasks (17 actions, 16 params). This wastes ~200-300 output tokens
per call.

- Add IsMultiActionSchema() to detect tools with action+enum pattern
- Per-tool strict decision in CleanToolSchemas (exempt multi-action)
- Extract normalizeWithProfile() for per-tool profile overrides
- Add per-action param guide to team_tasks description
- Fix schema/impl mismatches: file_id→path, add task_type property
- Gate param guide on policy (lite edition only sees allowed actions)
2026-04-01 22:00:05 +07:00
viettranx 43232c6189 fix(heartbeat): clarify HEARTBEAT_OK decision criteria to suppress "no news" responses
Model was delivering formatted "nothing new" status updates instead of using
HEARTBEAT_OK because instructions were ambiguous about what "nothing to deliver"
means. Now explicitly states: "A no news summary is NOT worth delivering."
2026-04-01 21:16:44 +07:00
viettranx da240a5e09 fix: pool validation false positive + OAuth step advancement + pool routing sync (#583, #594)
- Skip disabled providers in pool graph validation to prevent false
  "member already exists" errors when stale pool configs linger (#583)
- Add retry logic (3 attempts, 1s delay) in setup wizard OAuth flow
  to handle backend commit race condition (#594)
- Reset chatgpt_oauth_routing in agent other_config when provider
  changes, with amber warning in UI (#583)
- Add 3 pool validation tests for disabled provider scenarios
- Add providerChangedWarning i18n key (en/vi/zh)
2026-04-01 19:31:02 +07:00