cade-cli 0.15.6__tar.gz → 0.15.7__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {cade_cli-0.15.6 → cade_cli-0.15.7}/PKG-INFO +1 -1
- {cade_cli-0.15.6 → cade_cli-0.15.7}/pyproject.toml +1 -1
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cade_mcp_local/resources.py +1 -1
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/cli/commands/mem.py +138 -5
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/ui/session.py +10 -4
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/ui/slash.py +1 -1
- {cade_cli-0.15.6 → cade_cli-0.15.7}/.gitignore +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/LICENSE +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/README.md +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cade_mcp_local/__init__.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cade_mcp_local/__main__.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cade_mcp_local/_metadata.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cade_mcp_local/config.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cade_mcp_local/errors.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cade_mcp_local/server.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cade_mcp_local/tools/__init__.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cade_mcp_local/tools/_read_cache.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cade_mcp_local/tools/agents.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cade_mcp_local/tools/context.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cade_mcp_local/tools/filesystem.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cade_mcp_local/tools/git.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cade_mcp_local/tools/notifications.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cade_mcp_local/tools/questions.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cade_mcp_local/tools/results.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cade_mcp_local/tools/schemas.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cade_mcp_local/tools/search.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cade_mcp_local/tools/shell.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cade_mcp_local/tools/snippets.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cade_mcp_local/tools/tasks.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cade_mcp_local/tools/web_fetch.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cade_mcp_local/tools/web_search.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cade_mcp_local/utils.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cade_mcp_local/web/__init__.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cade_mcp_local/web/arcade_client.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cade_mcp_local/web/cache.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cade_mcp_local/web/extract.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cade_mcp_local/web/markdown.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cade_mcp_local/web/preapproved.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cade_mcp_local/web/prompts.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cade_mcp_local/web/scrape.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cade_mcp_local/web/search/__init__.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cade_mcp_local/web/search/arcade.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cade_mcp_local/web/search/base.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cade_mcp_local/web/search/http.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/__init__.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/ai/__init__.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/ai/prompts.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/cli/__init__.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/cli/app.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/cli/auth.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/cli/commands/__init__.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/cli/commands/account.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/cli/commands/agents.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/cli/commands/auth.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/cli/commands/chat.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/cli/commands/cron.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/cli/commands/hooks.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/cli/commands/mcp.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/cli/commands/serve.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/cli/commands/tasks.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/cli/commands/thread.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/cli/commands/tools.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/cli/onboarding.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/core/__init__.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/core/agent.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/core/comms.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/core/config.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/core/constants.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/core/errors.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/core/frozen.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/core/git.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/core/inbox.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/core/logging.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/core/memory.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/core/model_specs.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/core/names.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/core/paths.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/core/runtime.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/core/secrets.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/core/spawn.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/core/types.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/execution/__init__.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/execution/context_window.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/execution/mcp_schema_index.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/execution/orchestrator.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/execution/parallel.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/execution/tool_result_store.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/execution/tool_schema_cache.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/hooks/__init__.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/hooks/config.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/hooks/engine.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/hooks/executors/__init__.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/hooks/executors/callback.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/hooks/executors/command.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/hooks/executors/http.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/hooks/executors/prompt.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/hooks/executors/ssrf_guard.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/hooks/matchers.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/hooks/registry.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/hooks/types.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/providers/__init__.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/providers/anthropic.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/providers/base.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/providers/ollama.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/providers/openai.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/serve/__init__.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/serve/adapters/__init__.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/serve/adapters/base.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/serve/adapters/desktop.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/serve/adapters/registry.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/serve/adapters/stub.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/serve/adapters/telegram.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/serve/allowlist.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/serve/chunker.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/serve/commands.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/serve/config.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/serve/cron.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/serve/daemon.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/serve/elicitation.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/serve/format.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/serve/install.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/serve/lock.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/serve/observability.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/serve/owner.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/serve/progress_sink.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/serve/router.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/serve/secrets.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/serve/services.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/serve/sinks.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/serve/worker.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/storage/__init__.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/storage/threads.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/tasks/__init__.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/tasks/lock.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/tasks/scheduler.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/tasks/store.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/tasks/types.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/templates/login_failed.html +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/templates/login_success.html +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/templates/serve/launchd.plist.tmpl +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/templates/serve/serve.toml.example +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/templates/serve/systemd.service.tmpl +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/templates/styles.css +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/tools/__init__.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/tools/manager/__init__.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/tools/manager/_request_ctx.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/tools/manager/base.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/tools/manager/composite.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/tools/manager/config.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/tools/manager/mcp.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/tools/search/__init__.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/tools/search/discovered.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/tools/search/scoring.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/tools/search/service.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/ui/__init__.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/ui/completion.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/ui/display.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/ui/elicitation.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/ui/input.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/voice/__init__.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/voice/audio.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/voice/cleanup.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/voice/session.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/voice/stt.py +0 -0
- {cade_cli-0.15.6 → cade_cli-0.15.7}/src/cadecoder/voice/tts.py +0 -0
|
@@ -116,7 +116,7 @@ def register_resources(app: MCPApp, instructions: str) -> None:
|
|
|
116
116
|
title="cade mem sources (active persona)",
|
|
117
117
|
description=(
|
|
118
118
|
"JSON listing of memory sources registered for the active persona "
|
|
119
|
-
"(equivalent to `cade mem
|
|
119
|
+
"(equivalent to `cade mem sources`). Read each call so the listing "
|
|
120
120
|
"reflects sources added after server start."
|
|
121
121
|
),
|
|
122
122
|
mime_type="application/json",
|
|
@@ -10,7 +10,7 @@ from __future__ import annotations
|
|
|
10
10
|
|
|
11
11
|
import os
|
|
12
12
|
from pathlib import Path
|
|
13
|
-
from typing import Any
|
|
13
|
+
from typing import Annotated, Any
|
|
14
14
|
|
|
15
15
|
import typer
|
|
16
16
|
from rich.console import Console
|
|
@@ -53,14 +53,19 @@ def _apply_memory_env() -> Path:
|
|
|
53
53
|
def _load_librarian_app() -> Any:
|
|
54
54
|
"""Import and return librarian's Typer app (lazy, after the env is set).
|
|
55
55
|
|
|
56
|
-
The app is rebranded under ``cade mem``:
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
56
|
+
The app is rebranded under ``cade mem``:
|
|
57
|
+
|
|
58
|
+
* the low-level ``index`` group becomes a top-level ``update`` command (the
|
|
59
|
+
former ``index build``);
|
|
60
|
+
* a cade-native ``status`` command reports the current agent's memory under
|
|
61
|
+
"Agent Memory" branding;
|
|
62
|
+
* ``list`` shows the agent's memory **documents** (what users expect from
|
|
63
|
+
"list"), while the source-directory listing moves to ``sources``.
|
|
60
64
|
"""
|
|
61
65
|
from librarian.cli import app
|
|
62
66
|
|
|
63
67
|
_remap_index_to_update(app)
|
|
68
|
+
_remap_list_to_docs(app)
|
|
64
69
|
_add_status_command(app)
|
|
65
70
|
return app
|
|
66
71
|
|
|
@@ -97,6 +102,52 @@ def _remap_index_to_update(app: Any) -> None:
|
|
|
97
102
|
)(build_callback)
|
|
98
103
|
|
|
99
104
|
|
|
105
|
+
def _remap_list_to_docs(app: Any) -> None:
|
|
106
|
+
"""Make ``cade mem list`` show memory *documents*, not source directories.
|
|
107
|
+
|
|
108
|
+
librarian's top-level ``list`` lists registered source directories — a
|
|
109
|
+
power-user concept. Under ``cade mem``, "list" should show what's actually
|
|
110
|
+
in the agent's memory (its indexed documents, including anything the agent
|
|
111
|
+
saved via ``Memory_*`` tools). So the source listing moves to
|
|
112
|
+
``cade mem sources`` and ``list`` is replaced by a cade-native command that
|
|
113
|
+
renders documents with the same output (and flags) as the in-chat
|
|
114
|
+
``/mem list``.
|
|
115
|
+
|
|
116
|
+
Power users keep librarian's ``cade mem docs list`` (``--source`` /
|
|
117
|
+
``--format`` / ``paths``) untouched.
|
|
118
|
+
|
|
119
|
+
Idempotent: safe to call more than once on the same app singleton.
|
|
120
|
+
"""
|
|
121
|
+
if "sources" in _command_names(app):
|
|
122
|
+
return # already remapped
|
|
123
|
+
|
|
124
|
+
commands = list(app.registered_commands)
|
|
125
|
+
list_sources_callback = next(
|
|
126
|
+
(
|
|
127
|
+
rc.callback
|
|
128
|
+
for rc in commands
|
|
129
|
+
if (rc.name or getattr(rc.callback, "__name__", "")) == "list"
|
|
130
|
+
),
|
|
131
|
+
None,
|
|
132
|
+
)
|
|
133
|
+
if list_sources_callback is None:
|
|
134
|
+
return # librarian build without a top-level `list` — leave as-is
|
|
135
|
+
|
|
136
|
+
# Drop the original top-level `list` (sources), re-register it as `sources`,
|
|
137
|
+
# and install the cade-native document listing as `list`.
|
|
138
|
+
app.registered_commands = [
|
|
139
|
+
rc for rc in commands if (rc.name or getattr(rc.callback, "__name__", "")) != "list"
|
|
140
|
+
]
|
|
141
|
+
app.command(
|
|
142
|
+
name="sources",
|
|
143
|
+
help="List the source directories that feed this agent's memory.",
|
|
144
|
+
)(list_sources_callback)
|
|
145
|
+
app.command(
|
|
146
|
+
name="list",
|
|
147
|
+
help="List the documents stored in this agent's memory.",
|
|
148
|
+
)(_cade_mem_list)
|
|
149
|
+
|
|
150
|
+
|
|
100
151
|
def _add_status_command(app: Any) -> None:
|
|
101
152
|
"""Register the cade-native ``status`` command (idempotent)."""
|
|
102
153
|
if "status" in _command_names(app):
|
|
@@ -161,6 +212,86 @@ def _mem_status() -> None:
|
|
|
161
212
|
out.print(table)
|
|
162
213
|
|
|
163
214
|
|
|
215
|
+
def _mem_list(*, json_output: bool = False, limit: int = 50) -> None:
|
|
216
|
+
"""Render the documents stored in the current agent's memory.
|
|
217
|
+
|
|
218
|
+
The single source of truth for both ``cade mem list`` (CLI) and the in-chat
|
|
219
|
+
``/mem list`` command, so the two surfaces always agree. Reads the agent's
|
|
220
|
+
index directly via ``Database(db_path=...)`` (no env / no HOME side effects)
|
|
221
|
+
so it never clobbers a long-lived session, mirroring ``_read_memory_stats``.
|
|
222
|
+
|
|
223
|
+
Args:
|
|
224
|
+
json_output: Emit a JSON array (id/title/path/type) to stdout instead of
|
|
225
|
+
a table — for scripting and piping.
|
|
226
|
+
limit: Maximum number of documents to display.
|
|
227
|
+
"""
|
|
228
|
+
import json
|
|
229
|
+
|
|
230
|
+
from rich.console import Console as _Console
|
|
231
|
+
from rich.table import Table
|
|
232
|
+
|
|
233
|
+
runtime = get_runtime()
|
|
234
|
+
memory_dir = ensure_memory_dir(runtime.persona_name)
|
|
235
|
+
db_path = memory_dir / ".librarian" / "index.db"
|
|
236
|
+
|
|
237
|
+
out = _Console()
|
|
238
|
+
|
|
239
|
+
documents: list[Any] = []
|
|
240
|
+
if db_path.exists():
|
|
241
|
+
try:
|
|
242
|
+
from librarian.storage.database import Database
|
|
243
|
+
|
|
244
|
+
documents = Database(db_path=str(db_path)).list_documents()
|
|
245
|
+
except Exception as exc: # noqa: BLE001
|
|
246
|
+
if json_output:
|
|
247
|
+
print("[]")
|
|
248
|
+
else:
|
|
249
|
+
out.print(f"[red]Could not read this agent's memory:[/red] {exc}")
|
|
250
|
+
return
|
|
251
|
+
|
|
252
|
+
if json_output:
|
|
253
|
+
payload = [
|
|
254
|
+
{
|
|
255
|
+
"id": doc.id,
|
|
256
|
+
"title": doc.title,
|
|
257
|
+
"path": doc.path,
|
|
258
|
+
"type": doc.asset_type.value if getattr(doc, "asset_type", None) else "text",
|
|
259
|
+
}
|
|
260
|
+
for doc in documents[:limit]
|
|
261
|
+
]
|
|
262
|
+
print(json.dumps(payload, indent=2, default=str))
|
|
263
|
+
return
|
|
264
|
+
|
|
265
|
+
if not documents:
|
|
266
|
+
out.print(
|
|
267
|
+
"[dim]No documents in this agent's memory yet — add docs or run 'cade mem update'.[/dim]"
|
|
268
|
+
)
|
|
269
|
+
return
|
|
270
|
+
|
|
271
|
+
home = str(Path.home())
|
|
272
|
+
table = Table(
|
|
273
|
+
title=f"Agent Memory — {len(documents)} document(s)",
|
|
274
|
+
show_header=True,
|
|
275
|
+
header_style="bold cyan",
|
|
276
|
+
)
|
|
277
|
+
table.add_column("ID", style="dim", width=4)
|
|
278
|
+
table.add_column("Title", style="green", max_width=44)
|
|
279
|
+
table.add_column("Path", style="blue", overflow="fold")
|
|
280
|
+
for doc in documents[:limit]:
|
|
281
|
+
table.add_row(str(doc.id), doc.title or "Untitled", doc.path.replace(home, "~"))
|
|
282
|
+
out.print(table)
|
|
283
|
+
if len(documents) > limit:
|
|
284
|
+
out.print(f"[dim]Showing {limit} of {len(documents)}. Use --limit to see more.[/dim]")
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
def _cade_mem_list(
|
|
288
|
+
json_output: Annotated[bool, typer.Option("--json", help="Output as JSON")] = False,
|
|
289
|
+
limit: Annotated[int, typer.Option("--limit", "-l", help="Max documents to show")] = 50,
|
|
290
|
+
) -> None:
|
|
291
|
+
"""List the documents stored in this agent's memory."""
|
|
292
|
+
_mem_list(json_output=json_output, limit=limit)
|
|
293
|
+
|
|
294
|
+
|
|
164
295
|
def _run_mem(args: list[str]) -> int:
|
|
165
296
|
"""Run librarian's CLI in-process, branded as ``cade mem``.
|
|
166
297
|
|
|
@@ -248,7 +379,9 @@ def mem_command(ctx: typer.Context) -> None:
|
|
|
248
379
|
__all__ = (
|
|
249
380
|
"MEM_CONTEXT_SETTINGS",
|
|
250
381
|
"_apply_memory_env",
|
|
382
|
+
"_cade_mem_list",
|
|
251
383
|
"_load_librarian_app",
|
|
384
|
+
"_mem_list",
|
|
252
385
|
"_run_mem",
|
|
253
386
|
"_warm_memory",
|
|
254
387
|
"mem_command",
|
|
@@ -884,10 +884,10 @@ class ChatSession:
|
|
|
884
884
|
console.print("[cyan]Switching to voice mode — keeping this conversation…[/cyan]")
|
|
885
885
|
|
|
886
886
|
async def _handle_mem_command(self, cmd: str) -> None:
|
|
887
|
-
"""Handle /mem (
|
|
887
|
+
"""Handle /mem (status), /mem list (documents), and /mem search <query>.
|
|
888
888
|
|
|
889
|
-
The
|
|
890
|
-
so the Agent Memory experience is identical in both surfaces.
|
|
889
|
+
The status and list views reuse the same renderers as the ``cade mem``
|
|
890
|
+
CLI so the Agent Memory experience is identical in both surfaces.
|
|
891
891
|
"""
|
|
892
892
|
parts = cmd.split(None, 2)
|
|
893
893
|
sub = parts[1] if len(parts) >= 2 else "status"
|
|
@@ -898,6 +898,12 @@ class ChatSession:
|
|
|
898
898
|
_mem_status()
|
|
899
899
|
return
|
|
900
900
|
|
|
901
|
+
if sub in ("list", "ls", "docs"):
|
|
902
|
+
from cadecoder.cli.commands.mem import _mem_list
|
|
903
|
+
|
|
904
|
+
_mem_list()
|
|
905
|
+
return
|
|
906
|
+
|
|
901
907
|
if sub == "search" and len(parts) >= 3:
|
|
902
908
|
query = parts[2]
|
|
903
909
|
try:
|
|
@@ -913,7 +919,7 @@ class ChatSession:
|
|
|
913
919
|
)
|
|
914
920
|
return
|
|
915
921
|
|
|
916
|
-
console.print("[dim]Usage: /mem [status] | /mem search <query>[/dim]")
|
|
922
|
+
console.print("[dim]Usage: /mem [status] | /mem list | /mem search <query>[/dim]")
|
|
917
923
|
|
|
918
924
|
@staticmethod
|
|
919
925
|
def _print_mem_search_results(result: object) -> None:
|
|
@@ -51,7 +51,7 @@ SLASH_COMMANDS: tuple[SlashCommand, ...] = (
|
|
|
51
51
|
("list", "add", "remove", "enable", "disable"),
|
|
52
52
|
),
|
|
53
53
|
SlashCommand("/hooks", " …", "Manage lifecycle hooks", ("list", "reload")),
|
|
54
|
-
SlashCommand("/mem", " …", "Search/manage memory", ("status", "search")),
|
|
54
|
+
SlashCommand("/mem", " …", "Search/manage memory", ("status", "list", "search")),
|
|
55
55
|
SlashCommand("/notify", " <msg>", "Send a push notification"),
|
|
56
56
|
SlashCommand("/pwd", "", "Show current directory", hidden=True),
|
|
57
57
|
SlashCommand("/cd", " <path>", "Change directory", hidden=True),
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|