feat(app-catalog): add taOSr1 service (R1 -> taOS PA bridge, LXC) - #2181
feat(app-catalog): add taOSr1 service (R1 -> taOS PA bridge, LXC)#2181jaylfc wants to merge 1 commit into
Conversation
Registers the taOSr1 app in the catalog: a service that provisions an LXC running the taOSr1 shim (github.com/jaylfc/taOSr1). The shim relays R1 push-to-talk to the taOS agent-as-a-model surface (/v1/chat/completions) and streams replies back. Exposes a 3-slot UI for assigning taOS agents. Pattern copied from gitea-lxc (backend: lxc, ui_port, state_paths, health_check). Depends on taOS PR #2176 (turn slice) + the shim repo. Slot-assignment UI details pending @taOS-dev design input (msg 1659).
|
Warning Review limit reached
Next review available in: 22 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (2)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
PR Summary by QodoRegister taOSr1 LXC service in the app catalog
AI Description
Diagram
High-Level Assessment
Files changed (2)
|
|
Good manifest, and it tracks the BLOCKER: a private LAN IP in a public repo- name: taos_base_url
default: "http://192.168.6.123:6969"
Drop the default entirely, or use a documentation placeholder ( Two omissions that break the 3-slot requirement1. No ui_port: 3000
ui_path: "/"Add the equivalent ( 2. No Your four questions, answered from the code1. Type. 2. Install method, and who creates the container. 3. The 3 slots — and this is the important answer: THE PLATFORM HAS NO SLOT CONCEPT. I grepped the catalog: there is no Worth saying plainly: that makes taOSr1 the first app to assign agents to itself. If it works well it probably deserves promoting to a platform-level pattern later, but do not try to build the generic version now. Build the specific one, and tell me what the platform should have offered. 4. Catalog PR. Where you have put it is right: Also confirm
Fix the IP, add the two fields, and this is close. |
Code Review by Qodo
1. LXC install path incompatible
|
| id: taosr1 | ||
| name: taOSr1 | ||
| type: service | ||
| category: agent-bridge | ||
| version: 0.1.0 | ||
| backend: lxc | ||
| description: "Rabbit R1 push-to-talk bridge to the taOS Personal Agent (PA). Provisions an LXC running the taOSr1 shim, which relays R1 utterances to the taOS agent-as-a-model surface (/v1/chat/completions) and streams replies back. Three agent slots let you assign which taOS agents answer on the R1." | ||
| homepage: https://github.com/jaylfc/taOSr1 | ||
| license: MIT |
There was a problem hiding this comment.
1. Readme not updated for taosr1 📜 Skill insight § Compliance
This PR adds a new catalog manifest (app-catalog/services/taosr1/manifest.yaml) but does not update README.md accordingly (or otherwise document-review gate it). This violates the doc-gate requirement for catalog manifest changes and can leave user-facing docs out of sync with the shipped catalog.
Agent Prompt
## Issue description
A new catalog manifest was added under `app-catalog/`, but the PR does not update `README.md` as required by the doc-gate rule (or otherwise indicate doc review via a `Docs-Reviewed:` commit trailer).
## Issue Context
This PR introduces a new catalog entry for `taosr1`.
## Fix Focus Areas
- app-catalog/services/taosr1/manifest.yaml[1-9]
- README.md[223-225]
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
| requires: | ||
| ram_mb: 256 | ||
| disk_mb: 200 | ||
| ports: [7901] | ||
| inputs: | ||
| - name: taos_base_url | ||
| label: "taOS controller URL" | ||
| type: url | ||
| required: true | ||
| default: "http://192.168.6.123:6969" | ||
| description: "The taOS controller the shim relays to (agent-as-a-model surface)." | ||
| - name: consent_key | ||
| label: "Agent-model consent key" | ||
| type: secret | ||
| required: true | ||
| description: "Consent key minted by the owner (taOS /api/agent-model-keys)." | ||
|
|
||
| install: | ||
| method: lxc | ||
| image: images:debian/bookworm | ||
| memory_limit: "256MiB" | ||
| cpu_limit: 1 | ||
| ports: | ||
| http: 7901 | ||
| # The shim + a tiny slot-assignment UI run inside the container. | ||
| repo: https://github.com/jaylfc/taOSr1 | ||
| service_name: taosr1 |
There was a problem hiding this comment.
2. Lxc install path incompatible 🐞 Bug ≡ Correctness
The new taosr1 manifest declares install.method: lxc, but the backend LXC install route requires admin_password and calls a Gitea-specific LXCInstaller that hardcodes Gitea setup and proxies to container port 3000, so taosr1 cannot be installed or routed correctly. The Store UI also does not send any manifest inputs (taos_base_url/consent_key), so even a successful install would have no way to configure the shim from the catalog inputs.
Agent Prompt
### Issue description
`app-catalog/services/taosr1/manifest.yaml` declares an LXC-backed service, but taOS’s current LXC install path (`backend == "lxc"`) requires `admin_password` and uses `LXCInstaller`, which is Gitea-specific (installs gitea, creates `git` user, proxies to `127.0.0.1:3000`). This makes `taosr1` installs fail (400 due to missing `admin_password`) or provision the wrong software/port, and it also means required manifest inputs (`taos_base_url`, `consent_key`) are never sent from the Store UI and never reach the installer.
### Issue Context
- The Store frontend currently posts `{ app_id, target_remote, variant_id? }` only; it does not collect or submit `requires.inputs` values.
- The backend `backend == "lxc"` branch enforces `admin_password` and forwards only `admin_password/taos_username/taos_email` to `LXCInstaller`.
- `LXCInstaller` is coded specifically for Gitea and proxies to container port 3000.
### Fix Focus Areas
- app-catalog/services/taosr1/manifest.yaml[11-42]
- tinyagentos/routes/store_install.py[453-506]
- tinyagentos/installers/lxc_installer.py[165-330]
- desktop/src/apps/StoreApp/index.tsx[430-435]
### What to change
- Either:
1) Introduce a *generic* `LXCServiceInstaller` that:
- Reads container internal port(s) from `install.ports` (e.g. `http: 7901`) instead of hardcoding 3000.
- Uses `install.repo` (and/or a declared install command/script) to install and start the taosr1 shim inside the container.
- Uses `install.service_name` for systemd management (start/stop) and migration.
- Accepts and applies `requires.inputs` values (e.g. writes config under `/etc/taosr1/` in `state_paths`).
- Installs any packages needed for health checks if health checks are used.
2) Or create a taosr1-specific install method (e.g. `method: script` or a new `method: taosr1-lxc`) with a matching installer implementation.
- Update the Store UI + backend install request contract so users can provide `requires.inputs` at install time (or explicitly move these inputs into a post-install configuration flow, and remove `required: true` if they are not actually supplied at install).
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
| slots: 3 | ||
| slot_assignments: | ||
| # Populated by the user in the app UI; each slot maps to a taOS agent id. | ||
| # The shim reads these and routes R1 push-to-talk per active slot. | ||
| method: taos_agent_picker | ||
|
|
There was a problem hiding this comment.
3. Slot metadata discarded 🐞 Bug ≡ Correctness
The taosr1 manifest adds top-level slots and slot_assignments, but the catalog loader (AppManifest.from_dict) does not preserve unknown manifest keys, so these fields are dropped and cannot be used by the API/UI. Any slot-based UX driven from manifest metadata will therefore not work.
Agent Prompt
### Issue description
`app-catalog/services/taosr1/manifest.yaml` introduces `slots` and `slot_assignments`, but `tinyagentos.registry.AppManifest.from_dict` only copies an explicit allowlist of fields and does not include these keys. As a result, `slots` metadata is silently discarded when the catalog loads, and it cannot be surfaced to `/api/store/catalog` or any UI.
### Issue Context
The manifest is intended to describe a 3-slot agent assignment UI, but the backend’s manifest model currently cannot represent these new fields.
### Fix Focus Areas
- app-catalog/services/taosr1/manifest.yaml[47-52]
- tinyagentos/registry.py[24-81]
- tinyagentos/routes/store.py[149-167]
### What to change
- Extend `AppManifest` to include `slots: int = 0` and `slot_assignments: dict = field(default_factory=dict)` (or a single `ui`/`extensions` dict, if you prefer namespacing).
- Populate these fields in `from_dict`.
- Add the fields to the `/api/store/catalog` and `/api/store/app/{app_id}` responses (and any frontend TS types) if the Store/UI needs them for rendering.
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
| - name: taos_base_url | ||
| label: "taOS controller URL" | ||
| type: url | ||
| required: true | ||
| default: "http://192.168.6.123:6969" | ||
| description: "The taOS controller the shim relays to (agent-as-a-model surface)." |
There was a problem hiding this comment.
4. Private ip default url 🐞 Bug ⚙ Maintainability
taos_base_url defaults to http://192.168.6.123:6969, which is a deployment-specific private LAN address and is likely to be wrong outside the author’s network. This increases the chance users install with a non-working default and end up with a broken bridge until they manually correct it.
Agent Prompt
### Issue description
The taosr1 manifest ships an environment-specific private-LAN default (`192.168.6.123`) for `taos_base_url`. Catalog defaults should be broadly valid or omitted.
### Issue Context
Other service manifests with required inputs (e.g. gitea-lxc’s `admin_password`) do not hardcode site-local network defaults.
### Fix Focus Areas
- app-catalog/services/taosr1/manifest.yaml[16-21]
- app-catalog/services/gitea-lxc/manifest.yaml[16-20]
### What to change
- Remove the `default:` value, or replace it with a documented generic placeholder (e.g. `http://<controller-host>:6969`) that forces explicit configuration.
- If there is a known stable controller address in taOS deployments, set the default to that documented value instead.
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
| description: "Consent key minted by the owner (taOS /api/agent-model-keys)." | ||
|
|
||
| install: | ||
| method: lxc |
There was a problem hiding this comment.
CRITICAL: LXCInstaller is hardcoded for Gitea — this manifest cannot install the taOSr1 shim
The LXCInstaller (tinyagentos/installers/lxc_installer.py) is hardcoded to deploy Gitea: it downloads the Gitea binary, writes gitea.service, creates /etc/gitea/, runs gitea migrate, and creates a git admin user. It ignores this manifest's repo, service_name, ui_port (7901), and state_paths. A store install of taosr1 will produce a running Gitea container on port 3000, not the taOSr1 shim.
Additionally, the LXC install path requires admin_password in the request body (store_install.py:454), but the manifest does not declare it as an input. The store UI will not prompt for it, and installation will fail with 400 admin_password is required for LXC installs.
Reply with @kilocode-bot fix it to have Kilo Code address this issue.
Code Review SummaryStatus: 1 Issue Found | Recommendation: Address before merge Overview
Issue Details (click to expand)CRITICAL
Files Reviewed (2 files)
Fix these issues in Kilo Cloud Reviewed by step-3.7-flash · Input: 165.3K · Output: 30.8K · Cached: 5.4M |
|
@hognek this one joins your batch, fix-forward on this branch. It is the R1 bridge's catalog entry and it has been stalled since 00:45.
Do not touch the repo: field or the LXC provisioning shape; that design is settled. |
Registers the taOSr1 app in the catalog as a
servicewithbackend: lxc, provisioning an LXC that runs the taOSr1 shim (github.com/jaylfc/taOSr1). The shim relays Rabbit R1 push-to-talk to the taOS agent-as-a-model surface (/v1/chat/completions, consent key) and streams replies back. Exposes a 3-slot UI for assigning taOS agents.Pattern copied from gitea-lxc (backend: lxc, ui_port, state_paths, lifecycle.health_check).
Depends on:
Open questions for @taOS-dev (msg 1659): slot-assignment UI design + whether the platform renders slots from a manifest field or I bundle a SPA. Holding the SPA until that's settled.