luplo.core.backend.remote

RemoteBackend — implements the Backend Protocol via HTTP calls.

Used by CLI and MCP server when running in Remote mode (lp init --remote). All operations are forwarded to the luplo HTTP server.

Classes

RemoteBackend

Backend that delegates to a luplo HTTP server.

Module Contents

class luplo.core.backend.remote.RemoteBackend(base_url: str, token: str = '')

Backend that delegates to a luplo HTTP server.

Parameters:
  • base_url – Server URL (e.g. https://luplo.mycompany.com).

  • token – Bearer token for authentication.

async close() None

Close the HTTP client.

async create_project(*, id: str, name: str, description: str | None = None) luplo.core.models.Project
async get_project(id: str) luplo.core.models.Project | None
async list_projects() list[luplo.core.models.Project]
async create_item(data: luplo.core.models.ItemCreate) luplo.core.models.Item
async get_item(id: str, *, project_id: str | None = None) luplo.core.models.Item | None
async list_items(project_id: str, *, item_type: str | None = None, system_id: str | None = None, work_unit_id: str | None = None, include_deleted: bool = False, limit: int = 100, offset: int = 0) list[luplo.core.models.Item]
async delete_item(id: str, *, actor_id: str) None
async impact(item_id: str, project_id: str, *, depth: int = 5) luplo.core.impact.ImpactResult
async search(query: str, project_id: str, *, item_types: list[str] | None = None, system_ids: list[str] | None = None, limit: int = 10, tsquery: str | None = None) list[luplo.core.models.SearchResult]
abstractmethod add_capture(*, text: str, created_by: str | None = None, summary: str | None = None, sensitivity_hint: str = 'none', signals: dict[str, Any] | None = None) luplo.core.models.Capture
Async:

abstractmethod list_captures(*, review_state: str | None = None, include_discarded: bool = False, include_redacted: bool = False, since: datetime.datetime | None = None, until: datetime.datetime | None = None, limit: int = 100) list[luplo.core.models.Capture]
Async:

abstractmethod get_capture(capture_id: str) luplo.core.models.Capture | None
Async:

abstractmethod search_captures(*, query: str | None = None, review_state: str | None = None, include_discarded: bool = False, include_redacted: bool = False, since: datetime.datetime | None = None, until: datetime.datetime | None = None, limit: int = 50) list[luplo.core.models.Capture]
Async:

abstractmethod set_capture_state(capture_id: str, *, review_state: str, actor_id: str | None = None) luplo.core.models.Capture
Async:

abstractmethod discard_capture(capture_id: str, *, actor_id: str | None = None) luplo.core.models.Capture
Async:

abstractmethod redact_capture(capture_id: str, *, redacted_by: str | None = None) luplo.core.models.Capture
Async:

abstractmethod annotate_capture(capture_id: str, *, summary: str | None = None, sensitivity_hint: str | None = None, signals: dict[str, Any] | None = None) luplo.core.models.Capture
Async:

abstractmethod promote_capture_to_item(capture_id: str, data: luplo.core.models.ItemCreate) tuple[luplo.core.models.Capture, luplo.core.models.Item]
Async:

async open_work_unit(*, id: str, project_id: str, title: str, description: str | None = None, system_ids: list[str] | None = None, created_by: str | None = None, context: dict[str, Any] | None = None) luplo.core.models.WorkUnit
async close_work_unit(id: str, *, actor_id: str) luplo.core.models.WorkUnit
async archive_work_unit(*, id: str, archived_by: str, replaced_by_wu_id: str) luplo.core.models.WorkUnit
async find_existing_import_wu(*, project_id: str, content_hash_set: tuple[str, Ellipsis]) luplo.core.models.WorkUnit | None

Look up an existing import work_unit by content hash set.

Sends project_id plus a repeated content_hash query parameter (sorted client-side for determinism). 404 maps to None so callers can treat “no match” the same way local mode does.

async query_history(*, project_id: str | None = None, item_id: str | None = None, since: datetime.datetime | None = None, semantic_impacts: list[str] | None = None, limit: int = 50) list[luplo.core.models.HistoryEntry]
abstractmethod add_idea(*, project_id: str, work_unit_id: str, text: str, created_by: str | None = None) luplo.core.models.Idea
Async:

abstractmethod list_ideas(*, work_unit_id: str, project_id: str | None = None, limit: int = 100, include_redacted: bool = False) list[luplo.core.models.Idea]
Async:

abstractmethod search_ideas(*, project_id: str, query: str | None = None, tsquery: str | None = None, work_unit_id: str | None = None, author: str | None = None, since: datetime.datetime | None = None, until: datetime.datetime | None = None, include_redacted: bool = False, limit: int = 50) list[luplo.core.models.Idea]
Async:

abstractmethod get_idea(idea_id: str, *, project_id: str | None = None) luplo.core.models.Idea | None
Async:

abstractmethod redact_idea(*, idea_id: str, redacted_by: str, project_id: str | None = None) tuple[luplo.core.models.Idea, bool]
Async: