* feat(session): make commit two-phase with async memory extraction
Session commit now returns immediately after archiving messages (Phase 1).
Summary generation and memory extraction (Phase 2) run in the background
via asyncio.create_task(), returning a task_id for polling progress.
- Add get_task() API across all client layers for querying background task status
- get_session() auto-creates session if it does not exist
- Remove wait parameter and telemetry from commit endpoint
- Add .done completion marker to archive directories
- Update docs (EN/ZH) and tests for new two-phase flow
* feat(session): add .meta.json persistence and auto_create control for get_session
SessionService.get() now defaults to auto_create=False, raising NotFoundError
for missing sessions. A new SessionMeta dataclass tracks created_at, updated_at,
message_count, commit_count, memories_extracted (by category), last_commit_at,
and cumulative llm_token_usage. Meta is persisted to .meta.json and updated on
add_message, commit Phase 1 (message clear), and commit Phase 2 completion
(token usage, memory counts via bind_telemetry). All client layers
(local/async/sync/HTTP) and API docs updated accordingly.
* fix: remove session vectorize
* support commit for openclaw-plugin (#902)
Made-with: Cursor
* fix: reuse latest archive overview in session context
Thread the latest completed archive overview into archive summary generation and memory extraction, and simplify search context assembly to current messages plus the latest archive overview.
Co-Authored-By: Claude Opus 4.6
* refactor: session overview
---------
Co-authored-by: AutoCoder <wulf234@163.com>
* docs: add memory extractor templating and update mechanism optimization design document
- Add bilingual (English/Chinese) design document for memory templating system
- Include YAML-based MemoryTypeRegistry with 8 built-in types
- Detail ReAct 3+1 phase flow with pre-fetch optimization
- Describe 3-operation Schema: write/edit/delete
- Document RoocodePatch SEARCH/REPLACE format
- Explain dual-mode design: simple mode vs template mode
- Cover pre-fetch optimization: ls directories + read .abstract.md/.overview.md + search once
- Include merge operations: patch, sum, avg, immutable
- Address #578: allow custom prompt template addition and specification
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: add memory templating system with ReAct orchestrator
- Add YAML-configurable memory schemas (cards, events, entities, etc.)
- Implement MemoryReAct with tool use (read/find/ls)
- Add schema-driven memory operations (write_uris/edit_uris/delete_uris)
- Implement memory patch handler for incremental updates
- Add comprehensive test suite
* refactor: memory extractor templating system with ReAct orchestrator
## Summary
Implement memory templating system (GitHub Issue #578) - a complete
rewrite of the memory extractor subsystem to support YAML-configurable
memory types instead of hardcoded categories.
## Key Changes
### Architecture
- Replace hardcoded 8 memory types with YAML-configurable schema system
- Add MemoryTypeRegistry to load memory type definitions from YAML files
- Dynamic Pydantic model generation from schema for type safety
- Field-level merge operations: PATCH, SUM, IMMUTABLE
### Memory Extraction Flow
- Implement ReAct orchestrator for single-pass memory updates
- MemoryUpdater for applying operations to storage
- Memory tools (read, search, ls) for ReAct loop
- Stable JSON parser with 5-layer fault tolerance
### File Naming & Storage
- Semantic filenames from template ({topic}.md instead of random IDs)
- Two memory modes: simple mode and template mode
- MEMORY_FIELDS HTML comment for structured metadata
### Configuration
- 9 YAML templates in openviking/prompts/templates/memory/
- memory_config.py for memory system configuration
- Dual-threshold compact upload mechanism in design doc
### Deletions
- Remove old memory_content.py, memory_data.py, memory_operations.py
- Remove memory_types.py, memory_utils.py, memory_patch.py
- Remove corresponding old test files
### Updated Components
- VLM backends (litellm, openai, volcengine) for new interfaces
- Session and service core integration
- Test suite for new architecture
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: pass ctx/user/session_id in commit_async for memory extraction
## Summary
Fix missing parameters in commit_async() when calling extract_long_term_memories().
The synchronous commit() method correctly passes these parameters, but the async
version was missing them, causing memory extraction to be skipped.
## Changes
- Pass user=self.user, session_id=self.session_id, ctx=self.ctx
in commit_async() when calling extract_long_term_memories()
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: convert FindResult to dict before returning from search tool
## Summary
Fix JSON serialization error by converting FindResult object to dict
using its to_dict() method before returning from MemorySearchTool.
## Changes
- In MemorySearchTool.execute(), return search_result.to_dict()
instead of search_result directly
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: swap None check before accessing final_operations in memory_react
Also rename schema_models.py to schema_model_generator.py for clarity.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: add edit_overview support and optimize memory registry initialization
- Add edit_overview_operations to MemoryUpdater for updating .overview.md files
- Optimize MemoryTypeRegistry initialization in SessionCompressorV2 (load once)
- Various memory templating system improvements
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: remove unnecessary indent in JSON schema output
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* docs: add markdown link format hint to overview field description
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat: add pre-fetch search based on user messages in conversation
Also fix duplicate line in system prompt.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* rebase
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* feat(retrieve): add provenance metadata to search results
Adds an opt-in `include_provenance` parameter to the search/find API
endpoints. When enabled, the response includes a `provenance` array
with per-query retrieval details: which directories were traversed,
which tier (L0/L1/L2) each result came from, match reasons, and the
full thinking trace.
The internal data was already being collected in MatchedContext.level,
MatchedContext.context_type, and QueryResult.thinking_trace. This
change surfaces it through the API for retrieval observability, which
the README lists as a core design goal ("Visualized Retrieval
Trajectory").
Backward compatible: defaults to false, existing clients see no change.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* docs: add provenance feature screenshot
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Matt Van Horn <455140+mvanhorn@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* feat(cli): add ov doctor diagnostic command
Adds a new `ov doctor` command that validates all OpenViking subsystems
and reports actionable diagnostics without requiring a running server.
Checks: config file, Python version, native vector engine (PersistStore),
AGFS, embedding provider, VLM provider, and disk space. Each check is
isolated so one failure doesn't block others, and every failure includes
a specific fix suggestion.
This addresses a real pain point: when the native engine is missing from
a pip wheel (e.g., Python 3.13), the only feedback is 50+ ERROR log
lines with no actionable guidance. `ov doctor` catches this immediately:
Native Engine: FAIL No compatible engine variant
Fix: pip install openviking --upgrade --force-reinstall
Alt: Use vectordb.backend = "volcengine" instead of "local"
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* docs: add ov doctor screenshot examples
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix(doctor): reuse resolve_config_path and drop hardcoded OPENAI_API_KEY fallback
Address review feedback from @qin-ctx:
- Replace _CONFIG_SEARCH_PATHS and _find_config() with resolve_config_path()
from config_loader.py to avoid two sources of truth for config discovery
- Remove hardcoded OPENAI_API_KEY env var fallback from embedding and VLM
checks - only check the api_key field in config
- Renumber inline comments in rust_cli.py (1/2/3 matching docstring)
---------
Co-authored-by: Matt Van Horn <455140+mvanhorn@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Explain the incremental update behavior when calling `add_resource()` repeatedly for the same URI. Describe the trigger conditions, semantic stage optimizations, and filesystem/index synchronization process.
- Add OpenAIRerankClient using standard flat request/response format
compatible with DashScope compatible-api and other OpenAI/Cohere-style
rerank APIs (no input/output wrappers)
- Fix silent data corruption: add index bounds-checking so out-of-bounds
or missing index returns None with a warning
- Add provider allow-list validation in RerankConfig ('vikingdb'|'openai')
- Remove unnecessary getattr() in RerankClient.from_config()
- Update ov.conf.example: keep vikingdb (doubao) as primary rerank config,
add rerank_openai_example section for DashScope qwen3-rerank
- Update docs (en/zh): add OpenAI-compatible provider example alongside
existing volcengine example in configuration guide and schema
- Add 24 tests covering success, edge cases, and factory dispatch
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
VikingDBObserver.count() was called without RequestContext, falling back
to account_id="default" and filtering out vectors from other tenants.
Thread ctx from the HTTP router through ObserverService and VikingDBObserver
so each tenant only sees their own vector count.
Closes#786
Credit-To: jackjin1997
* feat: enable minimax embedding and adapt to separate query/document parameter configuration
* feat: enable minimax embedding and adapt to separate query/document parameter configuration
---------
Co-authored-by: xiaogang.zhou <xiaogang.zhou@bytedance.com>
SDK HTTP client now supports account and user parameters so root key
holders can access tenant-scoped data APIs without being rejected by
the server explicit-tenant requirement.
Co-Authored-By: Claude Opus 4.6
* feat(vlm): add custom HTTP headers support for OpenAI-compatible backends
Add extra_headers configuration option for VLM models to support custom
HTTP headers (e.g., HTTP-Referer, X-Title) when using OpenAI-compatible
providers like OpenRouter.
Changes:
- VLMBase extracts extra_headers from config
- OpenAIVLM passes extra_headers as default_headers to OpenAI client
- VLMConfig supports extra_headers in providers config
- Add tests for extra_headers functionality
- Update configuration docs (zh/en) and example config
Co-Authored-By: KorenKrita <KorenKrita@gmail.com>
* style: fix ruff formatting issues in test file
* cr fix: add extra_headers field to VLMConfig and clean up example
- Add extra_headers: Optional[Dict[str, str]] field to VLMConfig
- Migrate extra_headers to providers structure in _migrate_legacy_config
- Remove confusing example-only keys from ov.conf.example
- Add test for flat extra_headers config style
Co-Authored-By: KorenKrita <KorenKrita@gmail.com>
* style: fix ruff formatting in test file
Format long assertion lines to pass CI checks.
Co-Authored-By: KorenKrita <KorenKrita@gmail.com>
* feat(resource): add watch interval support for resource monitoring
implement resource watch functionality that allows automatic monitoring and re-processing of resources at specified intervals. key features include:
- add watch_interval parameter to resource APIs
- create watch scheduler service for task execution
- handle conflict detection for active watch tasks
- provide watch status query capability
- include comprehensive tests and examples
the watch feature enables periodic automatic updates of resources without manual intervention, improving data freshness for frequently changing content
* feat(resources): add watch status tracking and improve resource processing
- Implement get_watch_status API for tracking resource watch status
- Add immediate persistence for first-time resource additions
- Improve file change detection with size comparison
- Refactor watch scheduler with better concurrency control
- Add test coverage for watch status and resource processing
- Remove unused watch manager references and clean up code
* refactor: improve code style and fix minor issues
- Simplify logging by removing redundant data copying
- Fix syntax errors in docstrings and string literals
- Add new fields to EmbeddingMsg class
- Improve line wrapping and formatting
- Update watch task storage URIs to use hidden files
* refactor(embedding_msg): simplify EmbeddingMsg constructor by removing unused fields
Remove media_uri, media_mime_type and id parameters as they are not used in the implementation
* feat(watch): add backup task recovery and simplify permission check
Add test case for recovering tasks from backup storage when primary is missing
Remove require_owner parameter from _check_permission as it's redundant with the existing role-based checks
* feat(resources): add watch_interval support for resource updates
Add watch_interval parameter to enable periodic resource updates. When target is specified, watch_interval > 0 creates/updates a watch task, while <= 0 disables it. Also simplify resource moving logic in ResourceProcessor by using direct mv operation.
* refactor(watch): remove deprecated get_watch_status functionality
remove get_watch_status method and related tests, update examples to use direct task access
update watch manager to use ConflictError for URI conflicts and include original_role in tasks
add validation for watch_interval requiring target URI
* fix(resource_service): validate watch interval before processing resource
Move watch interval validation earlier in the flow to fail fast when 'to' parameter is missing
* refactor(resource_processor): remove redundant temp_uri assignment
* feat(storage): add transaction support with journal, undo, and crash recovery
Implement a full transaction system for VikingFS storage operations including
write-ahead journal, path locking, undo/rollback, context manager API, and
crash recovery. Includes comprehensive tests and documentation.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* test(transaction): add e2e rollback tests for mv and multi-step operations
Add end-to-end tests covering rollback scenarios that were missing:
- mv rollback: file moved back to original location on failure
- mv commit: file persists at new location
- Multi-step rollback: mkdir + write + mkdir all reversed in order
- Partial step rollback: only completed entries are reversed
- Nested directory rollback: child removed before parent
- Best-effort rollback: single step failure does not block others
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* feat(storage): add transaction support with path locking and journal
Implement transaction system for VikingFS with ACID-like guarantees:
- TransactionManager with configurable lock timeout and journal-based recovery
- PathLock supporting point, subtree, and mv lock modes
- Refactor VikingFS mv to use cp+rm to prevent lock files from being carried
- Fix stale lock detection returning false for missing lock files
- Update ragas eval to use LangchainLLMWrapper
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* fix: tests
* fix(transaction): fix rollback and race condition bugs
- Reconstruct RequestContext from undo params for vectordb_delete/update_uri
rollback (previously skipped silently due to missing ctx)
- Serialize ctx fields into undo params in rm/mv operations
- Fix Phase 1 undo path to target archive dir instead of session root
- Remove Phase 2 fs_write_new undo (overwrites are idempotent, checkpoint
handles recovery)
- Add ancestor SUBTREE recheck after lock creation in acquire_subtree
- Move _collect_uris inside TransactionContext in rm/mv to close race window
- Log journal persistence failures instead of silently swallowing
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* refactor(transaction): make TransactionManager required and rewrite tests with real backends
Remove all optional/fallback code paths where tx_manager could be None. get_transaction_manager()
now raises RuntimeError if not initialized. Fix undo rollback to reconstruct ctx for vectordb_upsert
and use correct agent_id default. Replace mock-based transaction tests with integration tests using
real AGFS and VectorDB backends.
* refactor(transaction): make rollback fully async and unify session commit path
- Convert execute_rollback/rollback_entry to async, removing sync run_async wrappers
- Unify Session.commit() to delegate to commit_async(), removing duplicate phase methods
- Fix SUBTREE lock to conflict with ancestor SUBTREE locks (was previously missing)
- Fix mv lock mode: directory moves now use SUBTREE on both source and destination
- Replace deprecated asyncio.get_event_loop() with get_running_loop()
- Remove max_parallel_locks config option
- Update docs (en/zh) and tests to match new async rollback signatures
* fix: tests
* refactor(transaction): simplify session commit and add redo-based crash recovery
Session commit no longer wraps archive phase in a transaction. Phase 2 uses
redo semantics so crashed memory-extraction can be replayed from archive.
PathLock stale-lock cleanup no longer redundantly re-checks timeout.
Semantic processor vectorization runs concurrently via asyncio.gather.
* fix: transaction
* fix: UserIdentifier
* refactor(transaction): replace undo-based transaction manager with lightweight lock + redo-log
Remove the heavyweight TransactionManager/Journal/UndoEntry system (~4000 lines) and
replace it with a simpler architecture: LockManager for path locking, LockContext as
the async context manager, LockHandle/LockOwner protocol, and a RedoLog for crash
recovery of session_memory operations. VikingFS rm/mv now use inline error handling
instead of rollback semantics. Updated docs, observers, and tests accordingly.
Co-Authored-By: Claude Opus 4.6
* fix(transaction): remove checkpoint dead code, fix TOCTOU race, clarify mv lock param
- Remove unused _write_checkpoint/_write_checkpoint_async/_read_checkpoint
from Session (superseded by redo-log)
- Re-resolve URI inside lock in resource_processor Phase 3.5 to prevent
concurrent add_resource calls from resolving to the same final_uri
- Rename acquire_mv dst_path to dst_parent_path with docstring to clarify
that callers pass the destination parent directory
* fix: path
* fix: resource lock
* fix: test
* docs: update
* fix: tests
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* feat(embedder): Gemini Embedding 2 multimodal support (text + image/video/audio/PDF)
Native text + multimodal (image, video, audio, PDF) embedding via `gemini-embedding-2-preview` (google-genai 1.67.0). Additive provider pattern — Volcengine remains the default; Gemini is opt-in via `provider: "gemini"` in `ov.conf`.
- **Model**: `gemini-embedding-2-preview`
- **Input**: text, image, video, audio, PDF (17 MIME types)
- **Output dimension**: 128–3072 (default: **3072**, recommended: 768 / 1536 / 3072)
- **Input token limit**: **8,192 tokens**
- **Supported MIME types**: `image/jpeg`, `image/png`, `image/gif`, `image/webp`, `audio/mpeg`, `audio/mp3`, `audio/wav`, `audio/ogg`, `audio/flac`, `video/mp4`, `video/mpeg`, `video/mov`, `video/avi`, `video/webm`, `video/wmv`, `video/3gpp`, `application/pdf`
- Gemini Embedding 2 Multimodal Support: Introduced a new GeminiDenseEmbedder to support native text and multimodal (image, video, audio, PDF) embedding using the gemini-embedding-2-preview model. This is an opt-in provider via configuration.
- Extended Queue Pipeline for Multimodal Content: The EmbeddingMsg now carries media_uri and media_mime_type to facilitate multimodal content processing. The TextEmbeddingHandler.on_dequeue() method was updated to read raw bytes from viking_fs and call embed_multimodal() when applicable.
- End-to-End Configuration and Security: The EmbeddingConfig now registers the 'gemini' provider with a task_type field. A critical security validation was added to ensure media_uri matches context_data['uri'] before file reads, preventing forged queue messages from accessing arbitrary files. If validation fails or multimodal embedding fails, it falls back to text embedding.
- Multimodal Content Representation: A new ModalContent dataclass was introduced to represent media references, including MIME type, URI, and optional raw data, enabling the Vectorize object to encapsulate both text and media for embedding
* feat: Add asynchronous batch embedding with concurrency control to Gemini embedder.
* Reduce scope to use GeminiDenseEmbedder as only text embed
Add POST /sessions/{session_id}/used API to record actually used
contexts and skills, enabling active_count tracking on commit.
Overhaul all plugin installation docs: simplify to npm global install,
add OpenClaw >= 2026.3.12 compatibility warning, expand troubleshooting
and configuration reference.
Co-Authored-By: Claude Opus 4.6
* feat(embedding): add voyage dense embedder
Add first-class Voyage dense embedding support with a dedicated embedder,
provider validation, model-aware default dimensions, and focused tests.
Keep the configuration surface intentionally narrow:
- use the existing dimension field and map it to Voyage's
output_dimension request field
- do not expose Voyage-only output_dtype
- do not expose query/document mode until OpenViking has separate
index/query embedder configuration
This keeps the PR aligned with the current OpenViking architecture,
which stores and retrieves dense float vectors through a single dense
embedder configuration.
Verification:
- .venv/bin/python -m pytest tests/unit/test_voyage_embedder.py tests/unit/test_embedding_config_voyage.py --noconftest -o addopts='' -q
- .venv/bin/python -m pytest tests/misc/test_config_validation.py -o addopts='' -q
- .venv/bin/ruff check openviking/models/embedder/voyage_embedders.py openviking_cli/utils/config/embedding_config.py tests/unit/test_embedding_config_voyage.py tests/unit/test_voyage_embedder.py
* refactor(embedder): inline Voyage extra body
Remove the trivial Voyage-specific helper and inline the output_dimension payload construction at the two call sites.
This keeps the request shape unchanged while making the embedder implementation more direct.
- Add 'ollama' as a supported embedding provider
- Ollama runs locally via OpenAI-compatible API, no API key required
- Allow OpenAI provider to work without api_key when api_base is set
(supports local OpenAI-compatible servers like vLLM, LocalAI)
- Add configuration example and tests for Ollama provider
This enables fully local embedding deployment without cloud API keys.
* feat: add --sender parameter to chat commands
- Add --sender option to Python CLI chat command
- Add --sender option to Rust CLI chat command
- Pass sender ID through to channels
- Display sender in interactive mode header
- Update langfuse integration for compatibility
* fix: align default sender ID to "user" for consistency
Align default sender ID in SingleTurnChannel from "default" to "user" to
match ChatChannel's default, ensuring consistent sender identification
across interactive and single-turn chat modes.
* style: add trailing comma for consistency
* fix: align Rust CLI default sender to "user"
Change Rust CLI's default sender from "cli_user" to "user" to match
Python side (ChatChannel and SingleTurnChannel), ensuring consistent
default sender identification across both Rust and Python CLI tools.
* fix: pass through total_tokens in langfuse usage conversion
When converting from old usage format (prompt_tokens/completion_tokens/total_tokens)
to usage_details format, also pass through total_tokens as 'total' field if
it's available in the usage dict.
* fix: protect langfuse.flush() with try/except
Wrap self.langfuse.flush() calls in try/except blocks to prevent
flush failures from discarding successfully obtained LLM responses.
- In success path: flush() failure only logs debug message
- In error path: flush() failure silently ignored (already in error handling)
* fix: disable langfuse propagate_attributes to fix generator error
Temporarily disable langfuse propagate_attributes context manager to fix
RuntimeError: generator didn't stop after throw(). The context manager
had exception handling issues when exceptions were thrown inside the block.
This preserves the API while avoiding the runtime error.
* fix: properly implement langfuse propagate_attributes without generator error
Reimplement propagate_attributes with manual __enter__/__exit__ management to
avoid the 'generator didn't stop after throw()' error. Key changes:
- Use local variable to avoid name shadowing with the method
- Only catch exceptions when entering the context manager
- Let inner block exceptions propagate normally
- Always exit the context manager in finally block
- Restore session_id/user_id propagation to langfuse
* fix: correct Volcengine sparse/hybrid embedder and update sparse model docs
修复火山引擎 Sparse/Hybrid Embedder 并更新 Sparse 模型文档
**Bug fixes / 问题修复:**
- Fix `Ark()` init crash when `api_base` is None by only passing `base_url` when set
修复 `api_base` 为 None 时 `Ark()` 初始化崩溃问题,仅在有值时传入 `base_url`
- Fix `VolcengineSparseEmbedder.embed()` using `response.data[0]` — the multimodal
API always returns a single object, not a list
修复 `embed()` 错误使用 `response.data[0]`,multimodal API 始终返回单个对象而非列表
- Fix `embed_batch()` for sparse and hybrid embedders: the multimodal API input array
is for multi-modal inputs of a single sample, not batching; delegate to `embed()` per text
修复 Sparse/Hybrid 的 `embed_batch()`:multimodal API 的 input 数组是单样本多模态输入,
不支持 batch,改为逐条调用 `embed()`
**Docs / 文档:**
- Update sparse model from `bm25-sparse-v1` to `doubao-embedding-vision-250615` in EN/ZH docs
中英文文档中 sparse 模型由 `bm25-sparse-v1` 更新为 `doubao-embedding-vision-250615`
- Add note that Volcengine sparse embedding is supported from `doubao-embedding-vision-250615`
and only supports text input
新增说明:火山引擎 Sparse embedding 从 `doubao-embedding-vision-250615` 起支持,仅支持文本输入
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs: remove text-only restriction note from sparse embedding docs
文档:移除 Sparse embedding 中仅支持文本输入的限制说明
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: define a system path for future deployment
* feat: define a system path for future deployment
* fix: golang downgrade to 1.19
* fix: golang downgrade to 1.19, and change doc
* docs: change model recommendation
* fix: golang downgrade to 1.19, and change doc
* fix: mv test files
* fix: loguru
---------
Co-authored-by: openviking <openviking@example.com>
* feat: remove python cli and disable python -m openviking
* feat: ls, tree, find, search, grep all use --node-limit as the result limiting arg
* feat: add ls -n
* feat: update agfs to support grep -n
* feat: update agfs to support grep -n
* docs: cancel modify
---------
Co-authored-by: openviking <openviking@example.com>
- Python HTTP client reads `timeout` from ovcli.conf when using default value,
with priority: SDK explicit param > ovcli.conf > default 60.0
- Rust CLI: replace unused `user` field with `agent_id`, send X-OpenViking-Agent
header to align with Python client behavior
- Rust CLI: read `timeout` from ovcli.conf and pass to reqwest client
- Move timeout documentation from configuration guide to API overview
- Update examples and ovcli.conf.example with timeout field
Closes#306
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* feat: wrap log configs in LogConfig, add log rotation, fix empty file creation
- Create new LogConfig class to wrap all log-related configuration
- Update OpenVikingConfig to use nested log config instead of separate fields
- Add log rotation support with TimedRotatingFileHandler in logger.py
- Add configure_uvicorn_logging to make uvicorn use OpenViking's logging config
- Fix empty file being created in current directory by properly handling log.output=file in logging_init.py
- Update examples/ov.conf.example to use new nested log config structure
- Update __init__.py to export LogConfig and initialize_openviking_config
* docs: help to configure log and workspace
* feat: break change, remove is_leaf scalar and use level instead
* feat: break change, remove is_leaf scalar and use level instead
* feat: rust cli add-resource support zip
---------
Co-authored-by: openviking <openviking@example.com>
* feat(session): add parts support to HTTP API add_message endpoint
- Add optional 'parts' parameter to AddMessageRequest
- Support two modes: simple (content string) and parts (array)
- Update LocalClient and HTTP Client for consistency
- Update Chinese and English documentation
This enables HTTP API clients to store full Part information
(TextPart, ContextPart, ToolPart) instead of just text content,
achieving feature parity with the Python SDK.
* fix(storage): wrap AGFSClientError as FileNotFoundError in read_file
When reading a non-existent file, agfs.read() raises AGFSClientError
which was not being caught by Session.load()'s exception handler.
This caused the server to return 422 errors instead of gracefully
handling missing session files.
Now read_file() catches all exceptions from agfs.read() and re-raises
them as FileNotFoundError, ensuring consistent error handling across
the codebase.
* fix(storage): distinguish error types in VikingFS read operations
Map AGFSClientError to appropriate Python exceptions (FileNotFoundError,
PermissionError, IOError) instead of always raising FileNotFoundError.
This allows callers to handle file-not-found vs network errors differently.
* fix(client): restore read params and refactor part conversion
- Restore offset/limit parameters in HTTPClient and LocalClient read()
methods that were accidentally removed
- Extract part_from_dict() to openviking/message/part.py to reduce
code duplication between LocalClient and sessions router