mirror of
https://github.com/agentscope-ai/ReMe.git
synced 2026-09-30 01:52:29 +00:00
* feat(config): add comprehensive job definitions for vault operations - Add utility jobs like version, search, traverse, list, read, stat - Include file operations like move, delete, upload, download - Add daily workspace management jobs: daily_list, daily_resolve, daily_reindex - Update descriptions to reflect vault-based operations instead of working_dir - Add proper section headers and documentation for each job category refactor(steps): reorganize step modules and remove demo steps - Move steps into categorized packages: common, crud, frontmatter, daily, jobs - Remove demo steps (DemoEchoStep1, DemoEchoStep2, StreamDemoStep1, StreamDemoStep2) - Add new steps: InitStep for vault initialization, TraverseStep for graph traversal - Update __init__.py to auto-import all step modules - Organize imports by functionality (common, CRUD operations, frontmatter, daily) feat(vault): implement vault-centric file operations and configuration - Change default config to use vault_dir instead of working_dir - Add environment variable support for embedding configuration - Implement file watcher with lite backend for daily/digest directories - Update search step to use 'name' instead of 'title' from frontmatter - Create ResourceEntry schema for tracking uploaded assets docs(steps): add comprehensive documentation for all step categories - Document file-I/O split by blast radius (crud vs frontmatter packages) - Add detailed descriptions for each step category and functionality - Explain the purpose and usage patterns for different types of file operations - Provide clear parameter documentation for all new job configurations * fix(config): correct vault directory path and remove unused job configurations - Fix vault_dir from 'vaultd' to 'vault' in default configuration - Remove deprecated traverse and list job configurations - Remove unused tag tooling configurations - Remove background watch_file job configuration refactor(steps): remove unused jobs module import - Comment out jobs module import in steps/__init__.py - This removes unused synchronizer and digester step registrations refactor(tests): update import path and add pylint directive - Update ResourceEntry import from reme4.schema to reme4.schema.resource_meta - Add pylint disable directive for unused argument in test datetime mocks * efactor(steps): remove unused modules from __all__ - Remove "background" module from __all__ list - Remove "jobs" module from __all__ list - These modules were no longer being used in the steps package * feat(config): update vault directory structure and remove file watcher - Change vault_dir reference from ./vault to ./vault in CLI example - Add daily_dir, digest_dir, and resource_dir configuration options - Remove file_watcher component configuration as it's no longer needed - Update comment to reflect correct module name (reme4vault) refactor(steps): add background step and remove deprecated init step - Import and register background step module - Remove deprecated InitStep from common steps - Update __all__ export list to include background step refactor(reindex): improve reindex step to scan vault directly - Update docstring to reflect vault scanning instead of watcher sync - Replace file watcher stop/start logic with direct vault path walking - Add support for suffix filtering during reindex operation - Use index_changes job to process found files refactor(wikilink_utils): enhance inbound source lookup with link scope - Import LinkScopeEnum for proper type handling - Update get_inlinks call to use ALL scope for virtual targets - Improve documentation for reverse-index lookup behavior test(refactor): clean up test suite removing deprecated functionality - Remove test_init_job and test_demo_job unit tests - Update help job assertion to check for literal command format - Change test directory from .reme to vault in CRUD tests - Remove init and demo job calls from integration test BREAKING CHANGE: Removes file_watcher component and init step * style(steps): fix import formatting in __init__.py Add proper spacing in the background module import statement to maintain consistent code style and readability. * refactor(config): change default vault directory from vault to .reme Default dev config now points vault_dir at ./.reme so `python -m reme4 start` can be run from the repo root and exercise the full atomic-tool surface against the seeded test data. BREAKING CHANGE: The default vault directory has been changed from 'vault' to '.reme' in the configuration. * docs(reme4_report): fix markdown formatting and remove extra content * refactor(file_parser): delegate wikilink extraction to WikilinkHandler * fix(search): handle empty query case gracefully - Replace assertion with conditional check for empty query - Set response success to false when query is empty - Return error message instead of throwing assertion error - Maintain existing validation for other parameters
72 lines
2.6 KiB
Python
72 lines
2.6 KiB
Python
"""``file_stat`` — peek at file metadata under the vault without copying it.
|
|
|
|
Cheap inspection alternative to ``file_download``: the agent gets
|
|
size, mtime, mime type, and (for markdown files) the parsed
|
|
frontmatter — enough to decide whether to download / parse / skip
|
|
without paying the copy cost.
|
|
|
|
Returns a uniform envelope:
|
|
|
|
{exists, type, size, mtime, ctime, mime, frontmatter}
|
|
|
|
``exists=False`` short-circuits everything else to ``None``. ``type``
|
|
is ``"file"`` / ``"dir"`` (covers event workspace probes too).
|
|
``frontmatter`` is populated only for ``.md`` files and only when
|
|
parsing succeeds — schema validity is a lint concern.
|
|
|
|
``path`` accepts a file path or directory path relative to the vault.
|
|
Joined with ``file_store.vault_path`` and inspected on disk.
|
|
"""
|
|
|
|
import mimetypes
|
|
from datetime import datetime
|
|
from pathlib import Path
|
|
|
|
import frontmatter
|
|
|
|
from ..base_step import BaseStep
|
|
|
|
from ...components import R
|
|
|
|
|
|
@R.register("stat_step")
|
|
class StatStep(BaseStep):
|
|
"""Return metadata for a file or directory under the vault."""
|
|
|
|
async def execute(self):
|
|
assert self.context is not None
|
|
path: str = self.context.get("path", "") or ""
|
|
assert path, "path is required"
|
|
|
|
target = (Path(self.file_store.vault_path or ".") / path).resolve()
|
|
if not target.exists():
|
|
self.context.response.success = False
|
|
self.context.response.answer = f"stat: {path} not found"
|
|
self.context.response.metadata.update({"path": path, "exists": False})
|
|
return
|
|
|
|
st = target.stat()
|
|
payload: dict = {
|
|
"path": path,
|
|
"absolute_path": str(target),
|
|
"exists": True,
|
|
"type": "dir" if target.is_dir() else "file",
|
|
"mtime": datetime.fromtimestamp(st.st_mtime).isoformat(),
|
|
"ctime": datetime.fromtimestamp(st.st_ctime).isoformat(),
|
|
}
|
|
if target.is_file():
|
|
payload["size"] = st.st_size
|
|
payload["mime"] = mimetypes.guess_type(target.name)[0] or "application/octet-stream"
|
|
if target.suffix == ".md":
|
|
try:
|
|
meta = dict(frontmatter.loads(target.read_text(encoding="utf-8")).metadata)
|
|
except Exception:
|
|
meta = {}
|
|
payload["frontmatter"] = meta
|
|
answer = f"stat: {path} (file, {st.st_size} bytes)"
|
|
else:
|
|
answer = f"stat: {path} (dir)"
|
|
|
|
self.context.response.success = True
|
|
self.context.response.answer = answer
|
|
self.context.response.metadata.update(payload)
|