Add manual job trigger controller with duplicate execution guard
POST /api/daemon/trigger/{jobName} triggers any Quartz job immediately. Returns 409 if the job is already executing. GET /api/daemon/trigger/status returns runn...
Temporarily set geolite sync cron to every 2 minutes for testing
Will revert to weekly Sunday 3 AM after confirming sync works.
正确的 Media ObjImgDownload FK 用 Media ObjImg UUID PK 代替复合键
复合 FK( OBJ ID, IMG ID) 引用非 PK 列导致类型 不匹配( uuid vs int) 。 在 OBJ IMG ID 上更改为单 FK 引用 Media ObjImg.ID (UUID PK). (英语).
使用本地查询求取avg解析时间来避免 Hibernate EXTRACT( EXTRACT) 限制
休眠 6 无法将 EXTRACT( EPOCH from...) 应用到时间戳减法 (生产期限类型,而不是TEMPORAL)。 切换到本地 SQL 查询 CockroachDB 处理本地.
Remove old help system, add support nav items
Delete app/help/ and app/components/help/ directories. Add SupportButton to NavTop toolbar and Support menu item to NavPri sidebar navigation.
Add frontend types and API proxy routes
TypeScript interfaces for all support DTOs and 13 API proxy routes forwarding to MediaService for topics, tickets, and reporting endpoints.
添加支持票服务、REST控制器和STOMP中继器
执行支持票系统的MediaService后端: - 支持TopicService:用于Org范围支持主题的 CRUD - 支持指定服务:圆形robin(带有悲观锁),手动接车,管理员指定 - 支助通知服务:NATS代理通知 - 支持TicketService:售票生命周期(创建、状态、优先级、分配、重新分配、升级、费率...
Redesign AI processing toggle as labeled switch with Assistant icon
Replace icon button with a toggle switch using the MUI Assistant icon, labeled "Train AI With This Note". Moved to the left of the save button. Renamed "Create"...
Send session replay data to Kafka when available instead of direct ClickHouse insert
Add deep-linking support to notes page via query param
Support /notes?id={noteId} URL pattern so AI chat source links can navigate directly to a specific note. Opens the note in edit view when the page loads with an...
Include clickable source links in RAG context for AI chat
Update RagClient to embed markdown links in the context sent to the AI model. KB articles link to /kb/{guid}, notes link to /notes?id={noteId}. Instructs the mo...
Add AI processing toggle to notes UI
Add aiProcessingEnabled field to Note types and toggle button in NoteEditor toolbar. Members can enable/disable AI processing per note, which controls whether n...
Remove notes code, moved to KBService
Notes management (controller, service, encryption) has been relocated to KBService where it better aligns with knowledge and content management responsibilities...
Route /api/notes to KBService instead of SecurityService
Notes management has been moved from SecurityService to KBService.
Pass memberId to RAG for note-aware AI chat
Add extractMemberId to SessionHelper. Update RagClient to send memberId in search requests so RAG returns both org KB articles and the member's own AI-enabled n...
Add note embedding support to RAG pipeline
Add NoteEventConsumer for NOTE_EVENTS NATS stream and NoteEmbeddingPipelineService for processing notes. Update Qdrant to store sourceType, memberId, noteId. Se...
Add notes management with RAG integration
Move notes CRUD from SecurityService to KBService. Add note encryption, NATS event publishing for RAG pipeline, and AI processing toggle support. Notes with AI ...
Add AI processing column and note embedding records table
Add AI_PROCESSING_ENABLED column to notes table and create NOTE_EMBEDDING_RECORDS table for tracking note RAG vectorization.
在注释数据模型中添加 AI 处理支持
向 Note 实体、 DTOs 和请求添加 aiProcessioned 字段。 创建用于跟踪的备忘Embedding记录实体和寄存器 注: RAG管道中的矢量化.
Add filter toggle button to notes header
The sidebar collapse button was hidden behind the app's left nav bar. Replaced it with a filter icon toggle in the NotesHeader that is always accessible regardl...
Transparent server-side encryption with stable master key
- Add permanent notes.master-encryption-key to ConfigMap (was generating a random key on each pod restart, making old notes undecryptable) - Always encrypt ...
Clear undecryptable note content and disable encryption flag
When server-side decryption fails (corrupted data or key mismatch), clear the content and set isEncrypted=false on the entity so the note stops showing cipherte...
Decrypt encrypted notes in getAllNotes and searchNotes responses
getAllNotes and searchNotes were returning raw encrypted content for notes with isEncrypted=true. Now decrypts content server-side before returning, matching th...
Use sized avatar variants — medium for profiles/emails, small for nav/lists
Add size parameter to fetchMemberAvatar (defaults to 'sm'). Email signatures, email sending, profile headers, posts, comments, and hex heads now request the med...
Extract plain text from Lexical JSON for note card previews
The note content is now Lexical JSON, not HTML. The preview function was falling back to stripHtml which dumped raw JSON as the preview. Now parses Lexical JSON...
Fix Docker build: add missing @prisma/client and update Prisma version to 7.3.0
Support multi-size photo avatar uploads and crop endpoint
Update uploadPhotoAvatar to accept optional sized variants (fileSm, fileMd, fileLg) stored with suffix naming ({hash}_sm.png, etc). Add PUT /{id}/crop endpoint ...
Add photo crop tool with react-easy-crop and multi-size avatar storage
Replace the old PhotoCropDialog with an interactive crop tool using react-easy-crop. When uploading or editing a photo, users now select a square crop area (wit...
Rebuild with updated shared library (NoteDTO string ID serialization)
将 NoteDTO 长ID作为 JavaScript 精密安全的字符串
CockroachDB 独有的 rowid () ID 超过 JavaScript 的 MAXQ-SAFE INTEGER, 分析为数字时造成精度损失。 添加@ Json 序列化为 将序列器拖到 id 和 userId 字段, 使其序列化为 JSON弦乐.
Rewrite GeoLite sync — correct download URL, streaming hash, batch inserts
- Use MaxMind's current permalink API with HTTP Basic Auth (account-id + license-key) - Streaming SHA-256 instead of Files.readAllBytes (prevents OOM on 100MB+ ...
Forward raw JSON responses in notes API routes to preserve ID precision
CockroachDB unique_rowid() IDs exceed JavaScript's MAX_SAFE_INTEGER. The previous response.json() + NextResponse.json() round-trip caused JSON.parse to convert ...
Improve notes save flow — keep editor open, show actual errors
- Don't close the editor after saving an existing note (only close after creating a new one) - Fix fetchWithAuth to read error.error instead of error.message ...