Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
71 commits
Select commit Hold shift + click to select a range
72a6cb8
feat(remote): Task 1 - remote-pairing schema and OS-vault credential …
manhnguyen24-dev Sep 14, 2026
3cfb9c5
feat(remote): Task 2 - remote settings, core contracts, and connectio…
manhnguyen24-dev Sep 14, 2026
f213c71
fix(remote): delete vault credential before the connection row in rem…
manhnguyen24-dev Sep 14, 2026
cf0e71c
feat(remote): Task 3 - Telegram Bot API client and adapter lifecycle
manhnguyen24-dev Sep 14, 2026
9463848
fix(remote): answer_callback records delivery failure like send/edit
manhnguyen24-dev Sep 14, 2026
1a0d5f7
feat(remote): Task 4 - one-tap pairing and principal authorization
manhnguyen24-dev Sep 14, 2026
403bae0
fix(remote): serialize consume()'s check-then-act with an asyncio.Lock
manhnguyen24-dev Sep 14, 2026
efdd846
feat(remote): Task 5 - Desktop API and lazy runtime lifecycle
manhnguyen24-dev Sep 14, 2026
8711b1e
docs(remote): spec rich Telegram responses, live status, and settings
manhnguyen24-dev Sep 14, 2026
bcc4ef1
feat(remote): Tasks 6-9 WIP - inbound/outbound/gates/actions
manhnguyen24-dev Sep 14, 2026
8ee2fcd
chore: gitignore .worktrees/ for local worktree isolation
manhnguyen24-dev Sep 14, 2026
2860991
feat(remote): add HTML rendering layer for Telegram cards
manhnguyen24-dev Sep 14, 2026
c2ceacc
fix(remote): escape dynamic button labels in 3 formatting builders
manhnguyen24-dev Sep 14, 2026
97a96f5
feat(remote): send HTML parse mode and native typing indicator
manhnguyen24-dev Sep 14, 2026
67d51bd
fix(remote): cover indicate_typing's transport and malformed-response…
manhnguyen24-dev Sep 14, 2026
107e959
feat(remote): add notify_scope preference and active-pairing cache
manhnguyen24-dev Sep 14, 2026
cef32da
fix(remote): clear active-pairing cache on /unpair (AC-10)
manhnguyen24-dev Sep 14, 2026
957d594
feat(remote): live status card, typing indicator, and done/error cards
manhnguyen24-dev Sep 14, 2026
1b2059e
fix(remote): address review findings in status-lifecycle diff
manhnguyen24-dev Sep 14, 2026
7983ca0
fix(remote): harden status lifecycle and cross-origin delivery
manhnguyen24-dev Sep 14, 2026
c2dcc2b
feat(remote): add Full diff and Tool log drill-down
manhnguyen24-dev Sep 14, 2026
5f488ec
fix(remote): resolve package type diagnostics
manhnguyen24-dev Sep 14, 2026
653c162
docs(remote): spec decidable approvals, remote control, and live acti…
manhnguyen24-dev Sep 15, 2026
bb8f10c
fix(remote): rewrite command help text and pairing copy for clarity
manhnguyen24-dev Sep 15, 2026
4507fd3
fix(remote): log tracebacks for failed inbound action handling
manhnguyen24-dev Sep 15, 2026
3a090f4
fix(remote): include the agent's actual reply text in the done card
manhnguyen24-dev Sep 15, 2026
c096110
fix(remote): stop test_disabled_start_does_not_import_telegram leakin…
manhnguyen24-dev Sep 15, 2026
0cb39a1
feat(remote): add advisory-only permission severity derivation
manhnguyen24-dev Sep 15, 2026
8d6761d
feat(remote): render permission cards with the real command and severity
manhnguyen24-dev Sep 15, 2026
8185cb1
feat(remote): permission cards render the real command and severity
manhnguyen24-dev Sep 15, 2026
0ece6e1
fix(remote): permission cards accept 'always' and actually resolve
manhnguyen24-dev Sep 15, 2026
4d0ff92
docs(remote): update gates.py's module docstring for the AC-28/AC-47 …
manhnguyen24-dev Sep 15, 2026
91de167
fix(dev): make run_dev.py's process supervision work on Windows
manhnguyen24-dev Sep 15, 2026
5456e3c
feat(remote): add permission-mode control, bypass excluded
manhnguyen24-dev Sep 15, 2026
e6eb1e8
feat(remote): add lead-agent control
manhnguyen24-dev Sep 15, 2026
010b36b
feat(remote): add model control via the registry
manhnguyen24-dev Sep 15, 2026
7dbdaf3
feat(remote): settings card renders mode/model/agent as buttons, bypa…
manhnguyen24-dev Sep 15, 2026
635eb6e
feat(remote): wire /settings command with mode/model/agent switching
manhnguyen24-dev Sep 15, 2026
7aaf20f
feat(remote): add health diagnostics and file-diff reads
manhnguyen24-dev Sep 15, 2026
48fc340
feat(remote): render health and changes cards
manhnguyen24-dev Sep 15, 2026
a6935ca
feat(remote): wire /health command
manhnguyen24-dev Sep 15, 2026
d61db9b
feat(remote): wire /changes command with on-demand diff drill-down
manhnguyen24-dev Sep 15, 2026
f03d302
docs(remote): add Phase 3 (health/changes) implementation plan
manhnguyen24-dev Sep 15, 2026
9217800
feat(remote): add remote_pairings.response_mode column
manhnguyen24-dev Sep 15, 2026
6821131
feat(remote): add response-mode control
manhnguyen24-dev Sep 15, 2026
cccd86d
feat(remote): settings card shows and toggles response mode
manhnguyen24-dev Sep 15, 2026
f612776
feat(remote): wire response-mode toggle into /settings
manhnguyen24-dev Sep 15, 2026
8569f0f
docs(remote): add Phase 5 (live mode) implementation plan
manhnguyen24-dev Sep 15, 2026
2797d88
feat(remote): add the live-mode rolling activity window (AC-56)
manhnguyen24-dev Sep 15, 2026
2d243b4
feat(remote): add the shared live-mode edit budget (AC-57)
manhnguyen24-dev Sep 15, 2026
0b342b3
feat(remote): add render_live_status_card for live-mode turns (AC-56)
manhnguyen24-dev Sep 15, 2026
bf6d63b
feat(remote): thread response_mode from the pairing into each new tur…
manhnguyen24-dev Sep 15, 2026
14a52d5
feat(remote): wire live-mode activity observation and throttled edits…
manhnguyen24-dev Sep 15, 2026
80262ad
feat(remote): advertise settings/health/changes in the command menu (…
manhnguyen24-dev Sep 15, 2026
d5a5a5e
docs(remote): add AC-53 (providers read-only) implementation plan
manhnguyen24-dev Sep 15, 2026
41cefc7
feat(remote): count configured providers for /settings (AC-53)
manhnguyen24-dev Sep 15, 2026
440c7a6
feat(remote): show configured provider count on the settings card (AC…
manhnguyen24-dev Sep 15, 2026
27a355e
feat(remote): wire the configured-provider count into /settings (AC-53)
manhnguyen24-dev Sep 15, 2026
57faf07
test(remote): add the AC-53 provider-read-only inspection test
manhnguyen24-dev Sep 15, 2026
f0cc230
docs(remote): add AC-54 (onboarding) implementation plan
manhnguyen24-dev Sep 15, 2026
e208055
feat(remote): add render_onboarding_card for the first-run pairing me…
manhnguyen24-dev Sep 15, 2026
7216b7b
feat(remote): add onboarding capability tokens (setup/health/start) (…
manhnguyen24-dev Sep 15, 2026
8f15653
feat(remote): send the onboarding card on a successful pairing (AC-54)
manhnguyen24-dev Sep 15, 2026
ad813ce
fix(remote): list /settings, /health, /changes in the /help text
manhnguyen24-dev Sep 15, 2026
b929cb4
feat(remote): add clear_history to the Telegram adapter
manhnguyen24-dev Sep 15, 2026
7d336d1
feat(remote): add /clear to delete this bot's recent messages
manhnguyen24-dev Sep 15, 2026
8d28ccc
feat(remote): advertise /clear in the command menu
manhnguyen24-dev Sep 15, 2026
7407719
feat(remote): add pairing codes, session history, and usage-footer fixes
manhnguyen24-dev Sep 17, 2026
12376de
Merge remote-tracking branch 'origin/main' into feature/remote-telegr…
manhnguyen24-dev Sep 18, 2026
29c216e
fix(remote): align response_mode's default with the deliberate live-m…
manhnguyen24-dev Sep 18, 2026
d5a9974
fix(remote): re-stage the migration renumbering content that never la…
manhnguyen24-dev Sep 18, 2026
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
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -281,3 +281,6 @@ desktop/EvoFlux.key.pub
MiMo-Code/
# Local dev state.
/.local/

.superpowers/
.worktrees/
6 changes: 5 additions & 1 deletion app/agent/outbound_redaction.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,11 @@

OutboundDataPolicy = Literal["block", "redact", "off"]
OutboundPiiPolicy = Literal["off", "standard", "strict"]
OutboundChannel = Literal["model", "web", "mcp", "other"]
#: ``remote`` is the phone-facing Telegram channel (a later task). Its
#: policy is selected explicitly by the caller rather than inherited from
#: the ambient sandbox state the other channels default to, because a
#: remote message is addressed to a device outside the sandboxed run.
OutboundChannel = Literal["model", "web", "mcp", "other", "remote"]


@dataclass(frozen=True)
Expand Down
17 changes: 17 additions & 0 deletions app/api/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
from app.api.routes.observability import router as observability_router
from app.api.routes.plugins import router as plugins_router
from app.api.routes.quote import router as quote_router
from app.api.routes.remote import router as remote_router
from app.api.routes.scheduler import router as scheduler_router
from app.api.routes.settings import router as settings_router
from app.api.routes.skills import router as skills_router
Expand Down Expand Up @@ -147,6 +148,18 @@ async def _start_optional_services(app: FastAPI, process_started: float) -> None
logger.error("optional_service_start_failed service=scheduler error={}", exc)
_log_startup_timing("scheduler", phase_started, process_started)

phase_started = perf_counter()
try:
# Lazy by design (AC-1): with no enabled, credentialed remote
# connection this imports nothing under app.remote.telegram and
# starts no task — see app/remote/runtime.py.
from app.remote.runtime import remote_runtime

await remote_runtime.start()
except Exception as exc: # noqa: BLE001
logger.error("optional_service_start_failed service=remote error={}", exc)
_log_startup_timing("remote", phase_started, process_started)

phase_started = perf_counter()
try:
from app.core.db import async_session_factory
Expand Down Expand Up @@ -297,6 +310,9 @@ async def lifespan(app: FastAPI):
await dream_scheduler.stop()
await task_scheduler.stop()
await team_manager.stop()
from app.remote.runtime import remote_runtime

await remote_runtime.stop()
from app.conductor import conductor_service

await conductor_service.stop()
Expand Down Expand Up @@ -391,6 +407,7 @@ def create_app() -> FastAPI:
app.include_router(mcp_router, prefix="/api/mcp", tags=["mcp"])
app.include_router(plugins_router, prefix="/api/plugins", tags=["plugins"])
app.include_router(settings_router, prefix="/api/settings", tags=["settings"])
app.include_router(remote_router, prefix="/api/remote", tags=["remote"])
app.include_router(auth_router, prefix="/api/auth", tags=["auth"])
app.include_router(dream_router, prefix="/api", tags=["dream"])
app.include_router(
Expand Down
Loading