Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 74 additions & 0 deletions loopx/control_plane/status/attention_projection.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
"""Status attention projections inside the `status` bounded context."""

from __future__ import annotations

from typing import Any

from ..todos.contract import (
TODO_TASK_CLASS_ADVANCEMENT,
TODO_TASK_CLASS_MONITOR,
)
from ..todos.todo_summary import (
normalize_todo_text,
open_todo_items,
todo_item_is_actionable_open,
)
from ..work_items.attention_queue import (
build_attention_queue_projection as _build_attention_queue_projection,
)
from ..work_items.autonomous_candidates import (
MAX_AUTONOMOUS_TODO_CANDIDATES,
autonomous_backlog_candidates as _autonomous_backlog_candidates,
autonomous_monitor_candidates as _autonomous_monitor_candidates,
)


MONITOR_SIGNAL_WAITING_ON = "monitor_signal"
MAX_AUTONOMOUS_BACKLOG_CANDIDATES = MAX_AUTONOMOUS_TODO_CANDIDATES


def autonomous_backlog_candidates(
items: list[dict[str, Any]],
*,
limit: int = MAX_AUTONOMOUS_BACKLOG_CANDIDATES,
) -> dict[str, Any] | None:
return _autonomous_backlog_candidates(
items,
open_todo_items=open_todo_items,
todo_item_is_actionable_open=todo_item_is_actionable_open,
normalize_todo_text=normalize_todo_text,
advancement_task_class=TODO_TASK_CLASS_ADVANCEMENT,
limit=limit,
)


def autonomous_monitor_candidates(
items: list[dict[str, Any]],
*,
limit: int = MAX_AUTONOMOUS_BACKLOG_CANDIDATES,
) -> dict[str, Any] | None:
return _autonomous_monitor_candidates(
items,
open_todo_items=open_todo_items,
todo_item_is_actionable_open=todo_item_is_actionable_open,
normalize_todo_text=normalize_todo_text,
monitor_task_class=TODO_TASK_CLASS_MONITOR,
monitor_signal_waiting_on=MONITOR_SIGNAL_WAITING_ON,
limit=limit,
)


def build_attention_queue_projection(
*,
items: list[dict[str, Any]],
goal_id_filter: str | None,
autonomous_backlog_candidates: dict[str, Any] | None,
autonomous_monitor_candidates: dict[str, Any] | None,
) -> dict[str, Any]:
return _build_attention_queue_projection(
items=items,
goal_id_filter=goal_id_filter,
autonomous_backlog_candidates=autonomous_backlog_candidates,
autonomous_monitor_candidates=autonomous_monitor_candidates,
monitor_signal_waiting_on=MONITOR_SIGNAL_WAITING_ON,
)
35 changes: 13 additions & 22 deletions loopx/status.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,6 @@
)
from .control_plane.work_items.autonomous_candidates import (
MAX_AUTONOMOUS_TODO_CANDIDATES as _MAX_AUTONOMOUS_TODO_CANDIDATES,
autonomous_backlog_candidates as _autonomous_backlog_candidates_read_model,
autonomous_monitor_candidates as _autonomous_monitor_candidates_read_model,
)
from .control_plane.agents.agent_lane_recommendation import (
compact_agent_lane_recommendation as _compact_agent_lane_recommendation_read_model,
Expand Down Expand Up @@ -103,7 +101,6 @@
from .control_plane.work_items.attention_queue import (
AttentionQueueContext,
build_attention_queue as _build_attention_queue_read_model,
build_attention_queue_projection as _build_attention_queue_projection_read_model,
merge_global_registry_findings as _merge_global_registry_findings_read_model,
)
from .control_plane.work_items.attention_routing import (
Expand Down Expand Up @@ -319,8 +316,6 @@
)
from .control_plane.todos.contract import (
TODO_STATUS_OPEN,
TODO_TASK_CLASS_ADVANCEMENT,
TODO_TASK_CLASS_MONITOR,
TODO_TASK_CLASS_USER_GATE,
normalize_todo_status,
normalize_todo_task_class as normalize_todo_task_class,
Expand Down Expand Up @@ -2212,31 +2207,24 @@ def autonomous_backlog_candidates(
*,
limit: int = MAX_AUTONOMOUS_BACKLOG_CANDIDATES,
) -> dict[str, Any] | None:
return _autonomous_backlog_candidates_read_model(
items,
open_todo_items=open_todo_items,
todo_item_is_actionable_open=todo_item_is_actionable_open,
normalize_todo_text=normalize_todo_text,
advancement_task_class=TODO_TASK_CLASS_ADVANCEMENT,
limit=limit,
from .control_plane.status.attention_projection import (
autonomous_backlog_candidates as _autonomous_backlog_candidates,
)

return _autonomous_backlog_candidates(items, limit=limit)


def autonomous_monitor_candidates(
items: list[dict[str, Any]],
*,
limit: int = MAX_AUTONOMOUS_BACKLOG_CANDIDATES,
) -> dict[str, Any] | None:
return _autonomous_monitor_candidates_read_model(
items,
open_todo_items=open_todo_items,
todo_item_is_actionable_open=todo_item_is_actionable_open,
normalize_todo_text=normalize_todo_text,
monitor_task_class=TODO_TASK_CLASS_MONITOR,
monitor_signal_waiting_on=MONITOR_SIGNAL_WAITING_ON,
limit=limit,
from .control_plane.status.attention_projection import (
autonomous_monitor_candidates as _autonomous_monitor_candidates,
)

return _autonomous_monitor_candidates(items, limit=limit)


def build_attention_queue_projection(
*,
Expand All @@ -2245,12 +2233,15 @@ def build_attention_queue_projection(
autonomous_backlog_candidates: dict[str, Any] | None,
autonomous_monitor_candidates: dict[str, Any] | None,
) -> dict[str, Any]:
return _build_attention_queue_projection_read_model(
from .control_plane.status.attention_projection import (
build_attention_queue_projection as _build_attention_queue_projection,
)

return _build_attention_queue_projection(
items=items,
goal_id_filter=goal_id_filter,
autonomous_backlog_candidates=autonomous_backlog_candidates,
autonomous_monitor_candidates=autonomous_monitor_candidates,
monitor_signal_waiting_on=MONITOR_SIGNAL_WAITING_ON,
)


Expand Down