mirror of
https://github.com/lobehub/lobe-chat.git
synced 2026-06-13 19:20:04 +00:00
ccb33fa48c56fbbc65eccec263c0fa753fc13e28
16 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
ccb33fa48c |
✨ feat: workspace backend service slice (#15560)
Backend-only slice of the workspace feature (server routers/services, database models with workspaceId threading, openapi middleware, business/server stubs, const/types). Excludes all UI (features/routes/store/hooks). Deploys dark behind the workspace feature flag. Includes open-source stub fixes: workspaceCreds router stub, ChargeParams workspaceId, usage.ts null-coalesce, DBMessageItem.workspaceId. Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com> |
||
|
|
65ba086685 |
🐛 fix(agent-documents): render system docs in editor (#15462)
* 🐛 fix(agent-documents): render system docs in editor * ✨ feat(agent-documents): autosave highlight editor with safe unmount flush Add debounced autosave to the non-markdown highlight editor and a StrictMode-safe unmount flush via queueMicrotask, plus a beforeunload guard against dirty buffers. * ✅ test: fix agent document PR type checks |
||
|
|
bab3ff4a7a | 🐛 fix: reduce agent document context latency (#15436) | ||
|
|
d3b6f74672 |
♻️ refactor(agent-document): derive category server-side, drop frontend predicates (#15076)
* ♻️ refactor(agent-document): derive category + tab flags server-side Add `category: 'skill' | 'document' | 'web'` plus `isFolder` / `isSkillBundle` / `isSkillIndex` to `AgentDocumentWithRules` as server- computed fields and inject them through `projectDocuments` so every endpoint returning the agent-document shape gets them for free. Drop the matching frontend categorization predicates (`isSkillBundleItem`, `isSkillIndexItem`, `isManagedSkillItem`, `isFolderItem`) and the duplicated `FOLDER_FILE_TYPE` / `SKILL_*` / `AGENT_SKILL_TEMPLATE_ID` constants from `src/features/AgentDocumentsExplorer/types.ts`. The remaining relationship helpers (`hasSkillIndexChild`, `isOrphanSkillBundleItem`, `isProtectedManagedSkillItem`) now read the server-derived flags directly. UI callers (`AgentDocumentsGroup`, `DocumentExplorerTree`, `useDocumentTreeOps`, `canDrop`, `pendingDocument`) switch to the new fields. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * ♻️ refactor(agent-document): consolidate skill taxonomy constants in db schemas Move SKILL_BUNDLE_FILE_TYPE, SKILL_INDEX_FILE_TYPE, AGENT_SKILL_TEMPLATE_ID (and the related SKILL_MANAGEMENT_SOURCE / SKILL_INDEX_FILENAME) into packages/database/src/schemas/file.ts alongside DOCUMENT_FOLDER_TYPE — that file is already the source of truth for the fileType column values, and having the constants there lets deriveAgentDocumentFields import them instead of re-declaring local copies. src/server/services/skillManagement/constants.ts now re-exports from the database package, so existing call sites (skillManagementService, the agent-signal VFS providers, integration tests, etc.) keep their imports unchanged. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * 🐛 fix(deepseek): satisfy thinking input type when disabling reasoning `ChatStreamPayload['thinking']` now requires `budget_tokens` even when `type: 'disabled'`. The generateObject test passed a bare `{ type: 'disabled' }` input and broke `tsgo --noEmit` on CI. Pass `budget_tokens: 0` in the input — the runtime still strips `budget_tokens` from the disabled payload (see `index.ts` line 161 in `buildDeepSeekAnthropicPayload`), so the assertion stays as `{ type: 'disabled' }`. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com> |
||
|
|
395eb8598c | ✨ feat(agent-signal,prompts,database): self-review now proposal actions to briefs, and automatically execute actions (#14583) | ||
|
|
aa3d245cfd | ♻️ refactor(server,prompts,builtin-tool-skill-maintainer): correct context passing, skill format, chained (#14397) | ||
|
|
9fff5fccf0 | ✨ feat(app,server,agent-signal,cli): new policy for Skill management running inside of Agent Signal (#14281) | ||
|
|
d5511a6af2 | ✨ feat(cli,server,database): now agent document can be used as vfs, offer fs compatible output (#14222) | ||
|
|
043d2a81fb |
✨ feat(agent): add floating chat panel and workspace improvements (#13887)
* ✨ feat(FloatingChatPanel): add single-instance mount guard * ✨ feat(FloatingChatPanel): add inner ChatBody layout * ✨ feat(FloatingChatPanel): add reusable floating conversation panel * ✅ test(FloatingChatPanel): add props wiring smoke tests * Refactor agent topic and page routes * Restore topic page routing for floating chat panel * ✨ feat(FloatingChatPanel): enhance ChatBody and TopicItem for improved routing and styling - Updated ChatBody to maintain scroll ownership while hiding overflow. - Refactored TopicItem to correctly highlight active topics based on routing context. - Added tests for TopicItem to ensure correct active state behavior. - Introduced static styles for FloatingChatPanel to manage layout overflow. Signed-off-by: Innei <tukon479@gmail.com> * chore: help to merge & rebase * chore: align merge with canary — drop pkg.pr.new ui, adopt canary useMenu, remove NotebookButton * ✨ feat: add ViewSwitcher component and update localization for chat views - Introduced a new ViewSwitcher component to toggle between chat, page, and task views in the conversation header. - Updated English and Chinese localization files to include new labels for the view switcher options. - Refactored the conversation header to integrate the ViewSwitcher, enhancing the user interface for better navigation. Signed-off-by: Innei <tukon479@gmail.com> * fix: update @lobehub/ui to version 5.9.1 and refactor FloatingChatPanel to use FloatingSheet component - Updated the @lobehub/ui dependency in package.json to version 5.9.1. - Refactored FloatingChatPanel to utilize the new FloatingSheet component, enhancing its layout and state management. - Introduced a new ChatLayout component for better organization of chat-related UI elements. - Adjusted routing configuration to incorporate the new ChatLayout for agent chat pages. Signed-off-by: Innei <tukon479@gmail.com> * feat: add TopicCanvas and TitleSection components for topic management - Introduced TopicCanvas component to serve as a document canvas for topics, integrating an editor and title section. - Added TitleSection component for managing topic titles and emojis, enhancing user interaction with a dedicated UI. - Updated FloatingChatPanel to accommodate the new TopicCanvas, ensuring a cohesive layout in the topic page. - Enhanced tests to verify the integration of TopicCanvas within the topic page route. Signed-off-by: Innei <tukon479@gmail.com> * ✨ feat(agent-page): bind documentId to URL and introduce HeaderSlot - Add nested /agent/:aid/:topicId/page/:docId route with PageRedirect for bare /page - Introduce useAutoCreateTopicDocument with module-level inflight de-dup - Lift Portal + WorkingSidebar to (chat) layout; keep ChatHeader in left column - Sidebar document clicks on page route navigate to /page/:docId instead of opening Portal - Add HeaderSlot (context + createPortal) as a reusable header injection point - Mount AutoSaveHint via HeaderSlot; register Files hotkey scope in TopicCanvas so Cmd+S triggers manual save - Sync desktopRouter.config.tsx and desktopRouter.config.desktop.tsx - Extend RecentlyViewed plugin to round-trip optional docId segment * Use topic titles for auto-created page documents * Add page-agent init gating and runtime diagnostics * Support current-topic agent documents * Implement Active Topic Document and Disabled Tool Call Filtering - Introduced ActiveTopicDocumentContextInjector to inject context for active topic documents into user messages. - Added DisabledToolCallFilter to remove historical tool calls for disabled tools in the current runtime scope. - Updated MessagesEngine to utilize the new context injectors and filters. - Enhanced tests to verify the correct injection of active topic document context and filtering of disabled tool calls. This update improves the handling of document editing contexts and tool management in the conversation flow. Signed-off-by: Innei <tukon479@gmail.com> * feat: enhance agent document management with LiteXML operations - Updated API names for clarity, changing 'patchDocument' to 'modifyNodes'. - Introduced LiteXML operation schema for document modifications. - Implemented new mutation for modifying document nodes via LiteXML. - Enhanced document retrieval methods to support format options (XML, Markdown, Both). - Added support for editor data snapshots and normalization of diff nodes. - Improved document history management to handle editor data with diff nodes. - Created tests for new features and ensured existing functionality remains intact. Signed-off-by: Innei <tukon479@gmail.com> * 🐛 fix: apply agent document xml edits directly * Refine document cache invalidation and editor hydration * 🐛 fix: stabilize agent topic hydration * fix: update @lobehub/editor dependency version and clean up test mocks Signed-off-by: Innei <tukon479@gmail.com> * Potential fix for pull request finding 'Useless assignment to local variable' Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com> * 🐛 fix(document): preserve pending diff nodes through save path Skip normalizeEditorDataDiffNodes on every autosave so diff nodes awaiting user review survive persistence. Normalization now runs only on explicit Accept/Reject via DiffAllToolbar. Also flip headless litexml ops to delay:true to match the new review flow. * 🐛 fix(agent): detect agent sub-route from URL params not cached topic isInAgentSubRoute used routeTopicId (with activeTopicId fallback) as its base path. On /agent/:aid/profile with a cached activeTopicId, the base became /agent/:aid/:cachedTopicId which pathname cannot startsWith, so sub-route detection returned false and sidebar topic clicks only called switchTopic without routing back to chat — users stayed stuck on profile. Derive the sub-route base from params.topicId directly so stale store state cannot mask the check. routeTopicId export keeps the fallback for sidebar highlighting. * 🐛 fix(page): repair topic page document recovery * 🐛 fix(page-agent): block tool calls when page editor is not mounted scope is topic-bound not route-bound, so navigating from /agent/.../Page to /agent/... keeps scope==='page' and PageAgentIdentifier stayed in the injected plugin list. The LLM could still call initPage / modifyNodes / etc. against a stale editor reference, returning misleading success (e.g. nodeCount=0). Two layers of guard: - PageAgentExecutor wraps `invoke` and returns a structured PAGE_EDITOR_NOT_MOUNTED / kind: 'replan' result when the runtime editor is not mounted, pointing the LLM at lobe-agent-documents. - streamingExecutor drops PageAgentIdentifier from the tool set via the new `composeEnabledTools` pipeline when scope==='page' and the page-agent runtime is not ready. Also extract the tool-set composition (inject merge + runtime drops) out of the ~320-line internal_createAgentState into `mecha/toolSetComposer`, with unit tests. * 🐛 fix(chat): unify message stream for /agent/:topicId and /page/:docId Before this change a page-scoped conversation (FloatingChatPanel with scope='page' in the /Page route) partitioned the client message store by scope, so /agent/:topicId and /agent/:topicId/page/:docId each built their own messagesMap slot and SWR cache — but the TRPC getMessages endpoint ignores scope and returned the same messages for both, producing duplicate fetches and a visible message-history split between the two surfaces. Fixes by keeping scope='page' as a capability/surfacing marker only: - messageMapKey: collapse 'page' to the default scope early in toMessageMapContext, so threadId/groupId still win and only the main/page pair actually unifies. - useFetchMessages: build the SWR key from identity fields (agentId, groupId, threadId, topicId) instead of the full ConversationContext, so scope no longer partitions the cache. agentConfigResolver/streamingExecutor/composeEnabledTools still read scope='page' from operation.context for PageAgent injection and initialContext.pageEditor wiring — the capability layer is unchanged. Also fix two pre-existing test regressions surfaced by re-running the impacted suites: - streamingExecutor page-editor initialContext test now mocks pageAgentRuntime.isReady() (required since the PageAgent editor-ready guard landed). - FloatingChatPanel default shell props test updated to match the [180,320,520,800] snap points introduced in |
||
|
|
4e5db98ffc |
♻️ refactor(agent-documents): fix title/documentId flow + split Inspector per action (#13940)
- extract H1 from markdown content as document title (stripped from content) - use title verbatim as filename (no extension); simplify dedup to `-2`, `-3` - AgentDocumentModel.create accepts optional title; falls back to filename - ExecutionRuntime createDocument returns documents.id (not agentDocuments.id) as state.documentId so the portal can resolve the row for openDocument - sidebar DocumentItem prefers title over filename - split AgentDocumentsInspector into 11 per-apiName components (Notebook pattern) - tests: filename util (13), ExecutionRuntime wiring (5), updated model + service Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|
|
75b55edca1 |
✨ feat: promote agent documents as primary workspace panel (#13924)
* ♻️ refactor: adopt Notebook list + EditorCanvas for agent documents The agent working sidebar previously used a FileTree directory view and a hand-rolled Markdown+TextArea editor with manual save. Agent documents already back onto the canonical `documents` table via an FK, so they can reuse the exact same rendering surface as Notebook. - AgentDocumentsGroup: replace FileTree with a flat card list styled after Portal/Notebook/DocumentItem (icon + title + description + delete). - AgentDocumentEditorPanel: drop the bespoke draft/save/segmented view logic; mount the shared <EditorCanvas documentId={doc.documentId} sourceType="notebook" /> inside an EditorProvider so auto-save and rich editing are handled by useDocumentStore. * ✨ feat: promote agent documents as the primary workspace panel - Replace the agent-document sidebar with a Notebook-style list: pill filter (All/Docs/Web), per-item createdAt, globe icon for sourceType=web. - Add a stable panel header "Resources" with a close button (small size, consistent with other chat header actions); no border divider. - Wire clicks to the shared Portal Document view via openDocument(), retiring the inline AgentDocumentEditorPanel. - Portal/Document/Header now resolves title directly from documentId via documentService.getDocumentById + a skeleton loading state. - Portal top-right close icon switched to `X`. - Layout: move AgentWorkingSidebar to the rightmost position; auto-collapse the left navigation sidebar while Portal is open (PortalAutoCollapse). - Header: remove dead NotebookButton, drop the Notebook menu item; add a WorkingPanelToggle visible only when the working panel is collapsed. - ProgressSection hides itself when the topic has no GTD todos. - Builtin tool list removes Notebook; migrate CreateDocument Render and Streaming renderers to builtin-tool-agent-documents (notebook package kept for legacy rendering of historical tool calls). - agent_documents list UI now reads from a separate SWR key (documentsList) so the agent-store context mapping doesn't strip documentId/sourceType/createdAt from the UI payload. - i18n: add workingPanel.resources.filter.{all,documents,web}, viewMode.{list,tree}, and the expanded empty-state copy; zh-CN translations seeded for preview. - New local-testing reference: agent-browser-login (inject better-auth cookie for authenticated agent-browser sessions). * update * 🐛 fix: satisfy tsc strict i18next keys, remove duplicate getDocumentById, coerce showLeftPanel * ♻️ refactor: graduate agent working panel out of labs |
||
|
|
c046d042f5 |
✨ feat: associate web crawl documents with agent documents (#13893)
* ✨ feat: associate web crawl documents with agent documents - Add `associate` method to AgentDocumentModel for linking existing documents - Add `associateDocument` to AgentDocumentsService, TRPC router, and client service - Update web browsing executor to associate crawled pages with agent after notebook save - Add server-side crawl-to-agent-document persistence in webBrowsing runtime - Add `findOrCreateFolder` to DocumentModel for folder hierarchy support - Extract `DOCUMENT_FOLDER_TYPE` constant from hardcoded 'custom/folder' strings - Add tests for associate, findOrCreateFolder, and service layer Fixes LOBE-7242 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * 🐛 fix: log errors in web crawl agent document association Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * ♻️ refactor: add onCrawlComplete callback to WebBrowsingExecutionRuntime Replace monkey-patching of crawlMultiPages with a proper onCrawlComplete callback in the runtime constructor options. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * ♻️ refactor: move document save logic into WebBrowsingExecutionRuntime Replace onCrawlComplete callback with documentService dependency injection. The runtime now directly handles createDocument + associateDocument internally. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * ♻️ refactor: pass per-call context to documentService via crawlMultiPages Add WebBrowsingDocumentContext (topicId, agentId) as a parameter to crawlMultiPages, which flows through to documentService methods. This allows a singleton runtime with per-call context on the client side. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * 🐛 fix: enforce document ownership in associate and match root folders by null parentId - associate: verify documentId belongs to current user before creating link - findOrCreateFolder: add parentId IS NULL condition for root-level lookup Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> |
||
|
|
4f56868545 |
🐛 fix: allow templates to specify policyLoad so default docs are fully injected (#13672)
* 🐛 fix: allow templates to specify policyLoad so default docs are fully injected All documents were hardcoded to PolicyLoad.PROGRESSIVE on creation, causing CLAW template docs (IDENTITY, SOUL, BOOTSTRAP, AGENTS) to be progressively disclosed instead of fully injected into context. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * 🐛 fix: forward policyLoad through upsertDocument and persist on update - Add policyLoad to UpsertDocumentParams and pass it through to model - Add policyLoad param to update() so upsert's existing-document path writes the value instead of silently discarding it - Ensures re-running template init migrates pre-existing docs to ALWAYS Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * ♻️ refactor: change update() to use named params object instead of positional args Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * ♻️ refactor: change create() and upsert() to use named params object Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * ✅ test: improve agentDocuments test coverage to 99% Add tests for uncovered branches: - normalizeLoadRule default branch (unknown rule) - explicit 'always' rule match - by-time-range with NaN dates - resolveDocumentLoadPosition fallback paths - composeToolPolicyUpdate with existing context values - upsert create path for new filenames - getAgentContext empty docs path Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * 🐛 fix: preserve policyLoad when copying documents Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * ✅ fix: align test assertion with refactored create() params object signature Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> |
||
|
|
5b03f009ee |
🐛 fix(agentDocuments): add progressive disclosure PolicyLoad mode (#13571)
--------- Co-authored-by: Arvin Xu <arvinxx@ArvindeMacBook-Pro.local> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> Co-authored-by-agent: Claude Opus 4.6 (1M context) <noreply@anthropic.com> |
||
|
|
14cd81b624 |
✨ feat(cli): add migrate openclaw command (#13566)
* ✨ feat(cli): add `migrate openclaw` command for importing OpenClaw workspace Add a new CLI command `lh migrate openclaw` that imports all files from the OpenClaw workspace (~/.openclaw/workspace) as agent documents into the LobeHub inbox agent. Supports --source, --agent-id, --slug, --dry-run, and --yes options. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * ♻️ refactor(cli): restructure migrate as directory for future providers Refactor `migrate` command from a single file to a directory structure (`migrate/index.ts` + `migrate/openclaw.ts`) to support future migration sources like ChatGPT, Claude, Codex, etc. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * 🐛 fix(cli): remove unnecessary `as any` casts in migrate openclaw Use proper TrpcClient type instead of casting to any. Extract resolveInboxAgentId helper with correct typing. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * ♻️ refactor(cli): migrate openclaw creates a new "OpenClaw" agent by default Instead of importing into the inbox, the default behavior now creates a dedicated "OpenClaw" agent and imports workspace files as its documents. Use --agent-id to import into an existing agent instead. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * ✨ feat(cli): restore --agent-id and --slug options for migrate openclaw Support three modes: --agent-id (by ID), --slug (by slug, e.g. "inbox"), or default (create a new "OpenClaw" agent). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * ✨ feat(cli): print agent URL after migrate openclaw completes Show a clickable link (e.g. https://app.lobehub.com/agent/<id>) at the end of the import so users can open the agent directly. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * ✨ feat(cli): check login state early in migrate openclaw Verify authentication before scanning files so users get a clear "Run 'lh login' first" message upfront instead of after confirmation. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * ✨ feat(cli): read agent name, description, avatar from OpenClaw workspace Parse IDENTITY.md (or SOUL.md) for Name, Creature/Vibe/Description, and Emoji fields to populate the new agent's title, description, and avatar instead of hardcoding "OpenClaw". Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * 💄 style(cli): show emoji + name instead of agent ID in migrate output Display the agent avatar emoji and title throughout the migrate flow (confirmation, creation, importing). The agent ID only appears in the final URL. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * 🐛 fix(cli): exclude .venv from openclaw workspace scan Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * 🔧 chore(cli): expand excluded dirs/files for openclaw workspace scan Filter out IDE configs, VCS dirs, OS artifacts, dependency dirs, Python caches, build outputs, env files, and other common non-content items. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * update version * ✨ feat(cli): use `ignore` package for gitignore-based file filtering & improve output - Replace hardcoded EXCLUDED_NAMES set with `ignore` package (gitignore syntax) - Respect workspace .gitignore if present, plus comprehensive default rules - Cover all common languages/tools: Python, Ruby, Rust, Go, Java, .NET, etc. - Improve final output: friendlier completion message with agent name + URL Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * ✅ test(cli): add tests for migrate openclaw command Cover profile parsing, file filtering (gitignore + default rules), dry-run, agent resolution (--agent-id, --slug, default create), confirmation flow, error handling, and output formatting. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * ✨ feat(cli): filter placeholder emoji and binary/database files - Skip avatar values like (待定), _(待定)_, TBD, N/A, etc. - Add ignore rules for database files (*.sqlite, *.db, *.mdb, etc.), images, media, fonts, lock files, and compiled binaries - Runtime binary detection: check first 8KB for null bytes and skip binary files that slip through the extension filter - Add tests for placeholder emoji filtering, binary skip, and db exclusion Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * ✨ feat(api,cli): support optional createdAt for agent document upsert Thread an optional `createdAt` parameter through all layers: - Model: AgentDocumentModel.create/upsert accept optional createdAt, set both createdAt and updatedAt on documents + agent_documents rows - Service: UpsertDocumentParams includes createdAt - Router: agentDocument.upsertDocument accepts optional z.date() - CLI: migrate openclaw passes file mtime as createdAt to preserve original file timestamps Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * 💄 style(cli): add npx usage hint to auth error message Show 'npx -y @lobehub/cli login' alongside 'lh login' so users who haven't installed the CLI globally know how to authenticate. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * update version * ✨ feat(api,cli): support optional updatedAt for agent document upsert Add updatedAt alongside createdAt through all layers. When both are provided, updatedAt is used independently; when only createdAt is given, updatedAt falls back to createdAt. CLI now passes file birthtime as createdAt and mtime as updatedAt. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * 🐛 fix(cli): use os.homedir() for default source & wrap file reads in try - Replace process.env.HOME || '~' with os.homedir() so the default --source path resolves correctly on Windows and when HOME is unset - Move fs.readFileSync/statSync inside the try block so a single unreadable file doesn't abort the entire migration Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> |
||
|
|
efd99850df | ✨ feat(agentDocuments): added agent documents impl, and tools (#13093) |