Merge remote-tracking branch 'origin/main' into feat/export-service

This commit is contained in:
yxx
2026-09-04 10:59:52 +08:00
39 changed files with 554 additions and 879 deletions
+2
View File
@@ -1000,6 +1000,8 @@ class TranscriptionJob(Contract):
class IndexStatus(Contract):
total_notes: int = 0
total_blocks: int = 0
status: Literal["idle", "queued", "running", "failed"] = "idle"
pending_jobs: int = 0
active_job_id: str | None = None
+7
View File
@@ -127,6 +127,13 @@ from app.services.attachment_service import attachment_path
router = APIRouter(prefix="/api")
@router.get("/permissions/policy", tags=["Permissions"])
async def get_permission_policy() -> dict[str, str]:
from app.agent.permissions import KNOWN_PERMISSIONS
return {permission: container.permissions.policy.mode_for(permission).value
for permission in sorted(KNOWN_PERMISSIONS)}
async def mcp_call_async(operation):
"""Even registry reads can wait on lifecycle locks; keep all MCP work off the event loop."""
try:
+4 -1
View File
@@ -126,9 +126,12 @@ async def rebuild(request: IndexRebuildRequest) -> IndexJob:
def get_status() -> IndexStatus:
counts = repository.stats()
if _active_job_id is not None:
return IndexStatus(status="running", pending_jobs=0, active_job_id=_active_job_id)
return IndexStatus(status="running", pending_jobs=0, active_job_id=_active_job_id,
total_notes=counts["notes"], total_blocks=counts["blocks"])
return IndexStatus(
total_notes=counts["notes"], total_blocks=counts["blocks"],
status="failed" if _last_error else "idle",
pending_jobs=0,
last_completed_at=_last_completed_at,
@@ -0,0 +1,31 @@
import asyncio
from fastapi.testclient import TestClient
from app.main import app
from app.container import container
from app.agent.permissions import PermissionMode
from app.services.note_service import create_note
def test_index_status_returns_real_counts():
with TestClient(app) as client:
initial = client.get('/api/index/status').json()
assert (initial['total_notes'], initial['total_blocks']) == (0, 0)
note = asyncio.run(create_note(title='Real note', markdown='# Real note\n\ncontent', folder=None, tags=[]))
result = client.get('/api/index/status').json()
assert result['total_notes'] == 1
assert result['total_blocks'] == len(note.blocks)
def test_permissions_endpoint_reads_effective_backend_policy():
policy = container.permissions.policy
original = policy.mode_for('attachments.read')
try:
policy.set_rule('attachments.read', PermissionMode.deny)
with TestClient(app) as client:
response = client.get('/api/permissions/policy')
assert response.status_code == 200
assert response.json()['attachments.read'] == 'deny'
finally:
policy.set_rule('attachments.read', original)