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"...
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...
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...
将 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 ...
Open notes directly on click, derive categories from data, remove encryption
- Click a note to open it directly in the editor instead of making a separate API call that was failing - Derive categories and tags from loaded notes data in...
Use OTKPreAuthFilter attributes instead of re-validating OTK in NotesController
The OTKPreAuthFilter already consumes and validates the OTK, storing the session data in request attributes. NotesController was trying to re-validate the alrea...
Explicitly forward visitor IP to downstream services
ForwardedHeaderFilter consumes X-Forwarded-For from the incoming request, so when APIService forwards to SecurityService via RestTemplate the header is missing....
Resolve notes page load failure and replace Quill editor with Lexical
Add missing runtime/dynamic exports to all notes API routes to enable proper OTK authentication. Replace React Quill WYSIWYG editor with the same Lexical-based ...
Forward visitor IP/User-Agent to backend, add duration unit picker
apiProxy: Now forwards X-Forwarded-For and User-Agent from the original visitor so backend logs the real client info instead of the Next.js server. AccessBlock...
Remove RoleRightsSyncRunner — rights are added manually for existing orgs
The underlying bug in **************** (detached entity issue) has been fixed in kamo-shared-library. New rights for existing roles will be added manually via S...
在创建角色权利时使用管理下的角色参考
继Repository.save()之后,当地角色Admin/角色Everyone 变量可以脱离持久性背景。 创建 RoleRights () 正在将 OrgRoleRight 条目添加到离散对象中, 这些对象从来没有 级联在之后的保存。 现在检索管理的角色引用 在初始保存后从 stained Org.getRoles...
Restore permission gate on AccessBlockManager
Re-adds the MANAGE_ACCESS_RULES permission check that was incorrectly removed. The underlying issue (admin roles missing new rights) is fixed by KamoInitializer...
Remove full-component permission gate from AccessBlockManager
New rights aren't assigned to any role yet, blocking all users. Other security settings tabs (API Access, OAuth2, System Debug) don't have permission gates — fo...
Remove GD check from ****************
The sed command that added the god-mode bypass incorrectly inserted it into all methods containing sessionData, not just hasRight. This caused 'return true' (bo...
Initialize god mode state synchronously from localStorage
isGodMode was initialized as false and only loaded from localStorage in a useEffect (after first render), so checkRight() returned false on initial render even ...
Allow god-mode-active users to bypass right checks in checkRight
New security rights aren't assigned to any role yet, causing all users to be denied. God-mode-active users now pass all checkRight() calls.
Allow god-eligible users to bypass access security permission checks
New rights (MANAGE_ACCESS_RULES, VIEW_ACCESS_LOGS, etc.) aren't granted to any existing role yet, so all users get Forbidden. God-eligible users (GD=true in ses...
Move AccessEnforcementFilter to scanned package, revert ComponentScan
The widened @ComponentScan caused a corsFilter bean conflict between CorsConfig and WebConfig. Moved the filter into com.kamo.api.app.config (already scanned by...
Add Redis connection config to K8s configmap
APIService pod was failing to start because spring-boot-starter-data-redis auto-configuration couldn't connect to Redis at localhost:6379. Points to redis.kamo....
Show KB nav item unconditionally in sidebar
Removed the isKnowledgeBase feature gate so KB always displays, matching the previous NavTop behavior.
删除跟随鼠标编码器的渐变MeshBackground orbs
蓝色和紫色的梯度圈是由 GradientMeshBackground组件跟踪鼠标位置.
防止密码输入在步骤过渡时丢下第一个按键
焦点投票循环是呼叫设置 每50msSelection Rang(0,长度) 用于 1.2s,它选择了任意键入字符,因此替换了下一个键盘 这个 现在跟踪用户输入,只选择用于浏览器自动填充的文本.
Replace broken Anthropic, OpenRouter, and xAI logo SVGs
The original files were 404 placeholders (14 bytes). Replaced with proper SVG logos from Simple Icons.
替换已破损的 Anthropic、 OpenRouter 和 xAI 标识 SVGs
Kamo-Internal中的原始文件有404个占位符(14字节). 从简单图标取而代之的是适当的 SVG 标志 .
Update calendar, contact, and integration ID types from Long to UUID
Calendar entities, contact sub-entities, and ContactIntegration IDs are now UUID. Updates all services, controllers, and DAV endpoints.
Resolve remaining Long/UUID type mismatches in controllers and beans
Fixes LeadVendorController, LeadMarketController, LeadImportController, ImagingController, AccountController, MediaStreamController, POSController, MemberContro...
解决服务和DTO中剩余的长/UID类型不匹配问题
纠正商务服务、组织服务、 外部代理服务, Img*服务, 领导*服务, 领导服务器服务, Image Service, 以及所有 POS 的 DTO. 杰克逊对象节点.put () 现在使用的呼叫 .toString () 对于UUID 值.
Include required fields in create book payload
The backend DTO requires isOrgDefault, isOrgLevel, and isVisible fields — sending only name caused a 415 Unsupported Media Type.
Prevent recipient popover from flashing at top-left corner
The popover initialized at position {0,0} and repositioned in a useEffect (after paint), causing a visible fly-in from the top-left. Fixed by using useLayoutEf...
Portal all overlays out of tool window stacking context
ToolWindowShell applies `transform: translateY(0)` which creates a CSS stacking context. This caused all `position: fixed` overlays (autocomplete dropdown, popo...
Fix autocomplete — infinite loop, missing API, auth
Three root causes fixed: 1. Infinite re-render loop: existingEmails was a new array reference every render, causing the search useEffect to re-fire endlessl...
Fix untyped recipient inputs and match Subject field styling
- Fixed drag handler blocking input focus by skipping preventDefault when clicking on INPUT elements or buttons - Rewired RecipientField from Tailwind classes...
Integrate recipient fields into tool window composer
The previous commit added the recipient components but modified the wrong composer (MessageComposer.tsx). This integrates RecipientField into MessageTool.tsx — ...
Add book buttons per source, remove redundant manage icon
- Remove redundant "+" manage sources icon from sources view header (already accessible via bottom "Manage Contact Sources" button) - Add "Add book" icon butt...