Commit Graph

249 Commits

Author SHA1 Message Date
Ruslan Bakiev
6d1bface33 Update frontend submodule with Telegram avatar loading fix 2026-03-12 18:34:31 +07:00
Ruslan Bakiev
030ce1e0df Update frontend submodule with Schedule-X Temporal fix 2026-03-12 18:08:54 +07:00
Ruslan Bakiev
ae7e453969 Update frontend submodule to include routing and calendar fixes 2026-03-12 18:05:53 +07:00
Ruslan Bakiev
b78f49171c Update frontend submodule after removing GigaChat path 2026-03-12 17:33:43 +07:00
Ruslan Bakiev
762ec0b56f Update frontend submodule after model fallback removal 2026-03-12 17:24:19 +07:00
Ruslan Bakiev
42de04c1f6 Use Postgres state DB for Telegram profile updates 2026-03-12 17:15:36 +07:00
Ruslan Bakiev
64e0d7565f Track Telegram avatar changes in telegram backend state DB 2026-03-12 16:53:16 +07:00
Ruslan Bakiev
44f4e9d90d Update backend_worker submodule after Vault-based Hatchet fix 2026-03-12 15:39:53 +07:00
Ruslan Bakiev
a2dd7b0e76 Update backend_worker submodule with Hatchet endpoint pin 2026-03-12 15:26:39 +07:00
Ruslan Bakiev
39cf198e11 fix(vault): auto-init when not initialized, then unseal 2026-03-10 21:03:25 +07:00
Ruslan Bakiev
2722aa860d fix(vault): use proven GL vault entrypoint for auto-unseal 2026-03-10 20:55:23 +07:00
Ruslan Bakiev
bb2fab8b40 fix(vault): properly use VAULT_UNSEAL_KEY from env 2026-03-10 20:49:57 +07:00
Ruslan Bakiev
8eec280b9d fix(vault): read unseal key from init.json fallback 2026-03-10 20:41:51 +07:00
Ruslan Bakiev
08a31383f0 fix(vault): auto-init and auto-unseal on first start 2026-03-10 20:32:37 +07:00
Ruslan Bakiev
9283ab436f chore: update frontend submodule 2026-03-10 20:22:58 +07:00
Ruslan Bakiev
25623b8f65 feat(vault): auto-unseal on container start via VAULT_UNSEAL_KEY env 2026-03-10 20:10:35 +07:00
Ruslan Bakiev
29309419bf chore: update frontend submodule (add preact) 2026-03-10 19:42:43 +07:00
Ruslan Bakiev
035f24387b chore: update frontend submodule (Schedule-X calendar) 2026-03-10 19:32:15 +07:00
Ruslan Bakiev
2ca1e75651 chore(repo): split frontend backend backend_worker into submodules 2026-03-09 10:23:40 +07:00
Ruslan Bakiev
e96b57a55f refactor(pilot-chat): stream native ai sdk reasoning parts 2026-03-09 09:47:32 +07:00
Ruslan Bakiev
c2cf4e6dd8 fix(backend): configure prisma datasource and client generator 2026-03-08 20:56:08 +07:00
Ruslan Bakiev
ad0f61fa8d fix(backend): set DATABASE_URL for prisma generate in docker build 2026-03-08 20:47:48 +07:00
Ruslan Bakiev
22e04e0a34 chore: clean up workspace and fix backend prisma build 2026-03-08 20:31:32 +07:00
Ruslan Bakiev
f1cf90adc7 add vault bootstrap for services and vault deploy app 2026-03-08 19:37:02 +07:00
Ruslan Bakiev
e4870ce669 add backend hatchet worker for calendar predue sync 2026-03-08 19:15:30 +07:00
Ruslan Bakiev
0df426d5d6 refactor pilot chat api contract and typed ai-sdk flow 2026-03-08 19:04:04 +07:00
Ruslan Bakiev
7d1bed0d67 refactor chat delivery to graphql + hatchet services 2026-03-08 18:55:58 +07:00
Ruslan Bakiev
fe4bd59248 refactor(whisper): use shared whisper service instead of local model
Replace @xenova/transformers in-process model with HTTP calls to shared
whisper-asr-webservice container (http://whisper:9000). Converts PCM16
samples to WAV and sends to /asr endpoint. Env: WHISPER_URL.
2026-03-07 10:51:40 +07:00
Ruslan Bakiev
12af9979ab feat(crm): add deal create/update controls with status and payment 2026-02-27 09:44:15 +07:00
Ruslan Bakiev
881a8c6d39 feat(workspace): use selects for quick event date/time controls 2026-02-26 15:50:06 +07:00
Ruslan Bakiev
b2a948889e fix(workspace): restore quick-menu handlers for events and docs 2026-02-26 14:45:54 +07:00
Ruslan Bakiev
aae2a03340 fix(contacts): keep unread inbound-only while refreshing outbound preview 2026-02-26 12:27:06 +07:00
Ruslan Bakiev
0a470d3922 feat(calendar): show contact avatars on event cards 2026-02-26 12:18:14 +07:00
Ruslan Bakiev
5063dfdecf Trigger frontend webhook redeploy 2026-02-26 11:49:03 +07:00
Ruslan Bakiev
a0ff1d00f6 Hydrate Telegram avatars on demand in frontend API 2026-02-26 11:43:47 +07:00
Ruslan Bakiev
97fb67f68c Fetch Telegram avatars via API when webhook has no photo 2026-02-26 11:22:57 +07:00
Ruslan Bakiev
6bae0300c8 Cache Telegram avatars locally and refresh avatar file ids 2026-02-26 10:59:44 +07:00
Ruslan Bakiev
ba3e5f7cac Fix Telegram contact avatars in CRM list 2026-02-26 10:41:27 +07:00
Ruslan Bakiev
0f87586e81 fix: OUT messages no longer create unread status + handle Telegram read receipts
Only inbound (IN) messages determine hasUnread in getContacts(). Telegram
read_business_message events are now parsed and processed to auto-mark
contacts as read for the entire team.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 14:53:55 +07:00
Ruslan Bakiev
6291797bb6 chore: upgrade Prisma 7, LangChain 1.x, Tailwind 4.2, Vue 3.5.29 and other deps
- Prisma 6 → 7: new prisma-client generator, prisma.config.ts, PrismaPg adapter, updated all imports
- LangChain 0.x → 1.x: @langchain/core, langgraph, openai
- Tailwind 4.1 → 4.2.1, daisyUI 5.5.19, Vue 3.5.29, ai 6.0.99, zod 4.3.6
- Fix MessageDirection bug in crm-updates.ts (OUTBOUND → OUT)
- Add server/generated to .gitignore

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 09:27:26 +07:00
Ruslan Bakiev
f4891e6932 fix: replace prisma.$use with $extends for Prisma 6 compatibility
prisma.$use middleware API was removed in Prisma 6. Switched to
$extends query hooks which is the supported approach.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 09:08:20 +07:00
Ruslan Bakiev
5c29cde13d refactor: remove manual upsertClientTimelineEntry from GraphQL resolvers
CalendarEvent and FeedCard timeline entries are now handled by Prisma
middleware automatically. Document timeline entry is inlined since
WorkspaceDocument stores contactId in scope field, not on the model.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 09:04:04 +07:00
Ruslan Bakiev
693a96cffd feat: auto-create ClientTimelineEntry via Prisma middleware
CalendarEvent and FeedCard now automatically get a ClientTimelineEntry
when created/updated with a contactId. This ensures events created by
the agent (or any other code path) appear in the contact timeline
without needing explicit upsertClientTimelineEntry calls.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 09:01:30 +07:00
Ruslan Bakiev
bf7f4ae933 feat: broadcast pilot agent traces via WebSocket for live status on reconnect
Agent trace logs are now stored in-memory (pilotRunStore) and broadcast
through the existing /ws/crm-updates WebSocket channel. When a client
reconnects, it receives a pilot.catchup with all accumulated logs so the
user sees agent progress even after page reload. Three new WS event
types: pilot.trace, pilot.finished, pilot.catchup.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 08:45:32 +07:00
Ruslan Bakiev
b830f3728c fix: show action label (Показать/Скрыть) instead of status in inbox settings
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 08:28:52 +07:00
Ruslan Bakiev
5ff7dc8d65 chore: update instructions submodule to latest
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 08:21:04 +07:00
Ruslan Bakiev
7d647bef25 fix: disable context picker mode after selecting a scope
When a context scope is picked via the pipette, the picker mode now
turns off automatically since the selection is done and shows as a chip.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 08:18:45 +07:00
Ruslan Bakiev
9b6e8291fe fix: waveform not rendering on voice messages after thread switch
The call wave sync watcher fired before DOM was updated (flush: 'pre'),
so ref callbacks hadn't registered host elements yet. Changed to
flush: 'post' so WaveSurfer instances are created after DOM refs exist.
Also fixed getCallItem to read from clientTimelineItems (source of truth)
instead of visibleThreadItems which could be stale.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 08:17:17 +07:00
Ruslan Bakiev
6e3763a5fd fix: refetch contacts after hiding inbox, redirect to most recent chat
After hiding a contact inbox, the contacts list now refetches immediately
so the hidden contact disappears reactively. When the current contact is
removed from the list, the selection jumps to the most recently active
contact (by lastContactAt) instead of the first item in the current sort.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 07:56:10 +07:00
Ruslan Bakiev
292d587fe1 debug(calendar): add console.warn to GSAP zoom animation functions
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 07:32:33 +07:00