Skip to content

feat(app-catalog): add taOSr1 service (R1 -> taOS PA bridge, LXC) - #2181

Open
jaylfc wants to merge 1 commit into
devfrom
feat/taosr1-appstore-entry
Open

feat(app-catalog): add taOSr1 service (R1 -> taOS PA bridge, LXC)#2181
jaylfc wants to merge 1 commit into
devfrom
feat/taosr1-appstore-entry

Conversation

@jaylfc

@jaylfc jaylfc commented Jul 28, 2026

Copy link
Copy Markdown
Owner

Registers the taOSr1 app in the catalog as a service with backend: 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.

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).
@gitar-bot

gitar-bot Bot commented Jul 28, 2026

Copy link
Copy Markdown

Important

You are using the Gitar free plan. Upgrade to unlock code review, CI analysis, auto-apply, custom automations, and more.

Gitar

@coderabbitai

coderabbitai Bot commented Jul 28, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@jaylfc, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 22 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

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 configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: d3138c09-3157-4a88-b86f-414efbf7285e

📥 Commits

Reviewing files that changed from the base of the PR and between 630177b and bf2706b.

📒 Files selected for processing (2)
  • app-catalog/catalog.yaml
  • app-catalog/services/taosr1/manifest.yaml
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/taosr1-appstore-entry

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@qodo-code-review

Copy link
Copy Markdown

PR Summary by Qodo

Register taOSr1 LXC service in the app catalog

✨ Enhancement ⚙️ Configuration changes 🕐 10-20 Minutes

Grey Divider

AI Description

• Add taOSr1 as a new catalog service entry (Rabbit R1 → taOS PA bridge).
• Introduce an LXC-backed service manifest with health check, UI port, and persisted state paths.
• Define required inputs (controller URL, consent key) and 3 agent-assignment slots.
Diagram

graph TD
  catalog["app-catalog/catalog.yaml"] --> manifest["app-catalog/services/taosr1/manifest.yaml"] --> lxc["LXC backend"] --> container["taosr1 LXC"] --> shim["taOSr1 shim"]
  rabbit{{"Rabbit R1"}} --> shim --> taos{{"taOS agent-model API"}}
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Use a Docker backend instead of LXC
  • ➕ Often simpler packaging/distribution story for a shim + UI
  • ➕ Potentially easier to run outside LXC-capable environments
  • ➖ Inconsistent with existing app-catalog patterns you’re explicitly following (e.g., gitea-lxc)
  • ➖ May reduce isolation semantics or require additional platform work if Docker backend isn’t first-class
2. Platform-rendered slots (manifest-driven) vs bundling a custom SPA
  • ➕ Consistent UX across services for slot assignment
  • ➕ Less UI surface to maintain inside the container
  • ➖ Requires clear platform support/contract for slot rendering and persistence
  • ➖ May limit richer workflows if slot assignment needs custom behavior
3. Move environment defaults out of the manifest
  • ➕ Avoids shipping environment-specific defaults (e.g., controller IP) in a global catalog
  • ➕ Encourages explicit configuration at install time
  • ➖ Slightly more friction for first-time setup/testing
  • ➖ May require additional documentation or UI hints

Recommendation: Keep the LXC-based approach since it matches the established app-catalog pattern (and the manifest already encodes the needed lifecycle and persistence hooks). For the 3-slot assignment UI, prefer a platform-rendered slots model if the platform team confirms manifest-driven slot rendering; otherwise bundling a minimal SPA inside the container is a reasonable fallback. Consider removing/neutralizing the hardcoded controller URL default if this catalog is shared across environments.

Files changed (2) +64 / -0

Enhancement (1) +58 / -0
manifest.yamlAdd taosr1 LXC service manifest (inputs, health check, slots) +58/-0

Add taosr1 LXC service manifest (inputs, health check, slots)

• Introduces a new LXC-backed service manifest that provisions a Debian Bookworm container from the 'jaylfc/taOSr1' repo. Defines required inputs (taOS base URL, consent key), UI/health-check wiring, persisted state paths, and a 3-slot agent assignment model.

app-catalog/services/taosr1/manifest.yaml

Other (1) +6 / -0
catalog.yamlRegister taosr1 in the global app catalog +6/-0

Register taosr1 in the global app catalog

• Adds a new 'taosr1' entry of type 'service' under the 'agent-bridge' category. Provides name, version, and a user-facing description referencing the Rabbit R1 → taOS PA bridge and three agent slots.

app-catalog/catalog.yaml

@jaylfc

jaylfc commented Jul 28, 2026

Copy link
Copy Markdown
Owner Author

Good manifest, and it tracks the gitea-lxc precedent closely. One blocker, two omissions that would break Jay's stated requirement, and the answers to the four design questions you asked me.

BLOCKER: a private LAN IP in a public repo

- name: taos_base_url
  default: "http://192.168.6.123:6969"

app-catalog/ is in the public jaylfc/taOS repo. That is a standing rule: never commit IP addresses or environment-specific config to a public repo. It is also wrong on its own terms, since every other user of this app has a different controller address, so the default is useless to them and leaks our topology.

Drop the default entirely, or use a documentation placeholder (http://taos.local:6969). Make the field required: true with no default and let the install prompt fill it. I spent part of tonight closing .gitignore holes after key material reached a PR, so I am not waving an IP through.

Two omissions that break the 3-slot requirement

1. No ui_port / ui_path. Jay's requirement is that "the app installed to select which agents are attached to the 3 slots". Your comment says the slot UI runs inside the container, but without these fields the service-proxy layer has nothing to forward to, so the UI is unreachable and he installs something he cannot configure. gitea-lxc declares:

  ui_port: 3000
  ui_path: "/"

Add the equivalent (ui_port: 7901), plus display_name and icon if you want it to present properly on the desktop.

2. No lifecycle.health_check. His words were "installed and running". gitea-lxc has health_check: "curl -sf http://localhost:3000/api/healthz". Give the shim a health endpoint and declare it, otherwise "running" is unverifiable and you will be asserting it rather than proving it.

Your four questions, answered from the code

1. Type. service — your lean was right, and gitea-lxc confirms it (type: service, backend: lxc).

2. Install method, and who creates the container. method: lxc, and the platform creates it, not your script. tinyagentos/installers/lxc_installer.py drives it from manifest fields: image, memory_limit, cpu_limit, ports, service_name, state_paths, plus the proxy fields above. You declare the container; you never call incus yourself. That matches your instinct not to hand-create one.

3. The 3 slots — and this is the important answer: THE PLATFORM HAS NO SLOT CONCEPT. I grepped the catalog: there is no slots field, no agent-picker the platform renders, and no existing app doing agent assignment. So there is nothing to match and no pattern to follow. You build the slot UI yourself, served from inside the container and exposed through ui_port/ui_path, exactly as gitea serves its own UI.

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: app-catalog/services/taosr1/manifest.yaml plus the catalog.yaml entry, in-repo, no staging path. category: agent-bridge is a new category and I am fine with it, since none of the existing ones fit.

Also confirm

consent_key is type: secret, which is right. Confirm it is resolved through the secrets layer at install and lands in the container as a file or env var rather than being written into a config file in plaintext. That is the same key I minted at 0600 precisely so it never sits in the clear.

Fix the IP, add the two fields, and this is close.

@qodo-code-review

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (3) 📘 Rule violations (0) 📜 Skill insights (1)

Context used
✅ Compliance rules (platform): 35 rules

Grey Divider


Action required

1. LXC install path incompatible 🐞 Bug ≡ Correctness
Description
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.
Code

app-catalog/services/taosr1/manifest.yaml[R11-37]

+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
Relevance

⭐⭐⭐ High

PR439 explicitly avoids shipping manifests with install-path issues; would likely reject broken LXC
manifest.

PR-#439

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
taosr1 declares an LXC install and required inputs but does not declare/provide admin_password.
The backend LXC install handler rejects missing admin_password and always runs a Gitea-specific
installer that proxies to container port 3000. The Store UI POST body omits all manifest inputs, so
taos_base_url/consent_key cannot be delivered to any installer/config step.

app-catalog/services/taosr1/manifest.yaml[11-37]
tinyagentos/routes/store_install.py[453-486]
tinyagentos/installers/lxc_installer.py[165-306]
desktop/src/apps/StoreApp/index.tsx[430-435]
app-catalog/services/gitea-lxc/manifest.yaml[11-20]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### 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



Remediation recommended

2. Slot metadata discarded 🐞 Bug ≡ Correctness
Description
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.
Code

app-catalog/services/taosr1/manifest.yaml[R47-52]

+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
+
Relevance

⭐⭐⭐ High

Team previously updated AppManifest schema for new keys (category), so likely to preserve new
manifest fields.

PR-#247

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The manifest declares slots/slot_assignments, but AppManifest.from_dict only stores a fixed
set of keys (requires/install/etc.) and has no fields for these additions, so they are not retained
in loaded manifests.

app-catalog/services/taosr1/manifest.yaml[47-52]
tinyagentos/registry.py[24-81]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### 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


3. README not updated for taosr1 📜 Skill insight § Compliance
Description
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.
Code

app-catalog/services/taosr1/manifest.yaml[R1-9]

+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
Relevance

⭐⭐ Medium

No historical evidence of enforced README “doc-gate” for app-catalog manifest additions.

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
PR Compliance ID 2185416 requires README.md updates when manifests under app-catalog/ are
added/removed. The PR adds app-catalog/services/taosr1/manifest.yaml, while README.md still
reflects the existing App Store documentation section without any corresponding update for this new
catalog addition.

app-catalog/services/taosr1/manifest.yaml[1-9]
README.md[223-225]
Skill: taos-development-skill

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## 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



Informational

4. Private IP default URL 🐞 Bug ⚙ Maintainability
Description
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.
Code

app-catalog/services/taosr1/manifest.yaml[R16-21]

+    - 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)."
Relevance

⭐⭐⭐ High

Repo accepts removing personal/deployment-specific values (e.g., sanitize email placeholders in
docs).

PR-#248

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The taosr1 manifest hardcodes a specific 192.168.* address as the default controller URL, whereas
other manifests use required inputs without embedding site-local network addresses as defaults.

app-catalog/services/taosr1/manifest.yaml[16-21]
app-catalog/services/gitea-lxc/manifest.yaml[16-20]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### 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


Grey Divider

Qodo Logo

Comment on lines +1 to +9
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

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remediation recommended

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

Comment on lines +11 to +37
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

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

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

Comment on lines +47 to +52
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

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remediation recommended

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

Comment on lines +16 to +21
- 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)."

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Informational

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

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@kilo-code-bot

kilo-code-bot Bot commented Jul 28, 2026

Copy link
Copy Markdown

Code Review Summary

Status: 1 Issue Found | Recommendation: Address before merge

Overview

Severity Count
CRITICAL 1
WARNING 0
SUGGESTION 0
Issue Details (click to expand)

CRITICAL

File Line Issue
app-catalog/services/taosr1/manifest.yaml 29 LXCInstaller is hardcoded for Gitea — this manifest cannot install the taOSr1 shim. The installer ignores repo, service_name, ui_port, and state_paths; it installs Gitea instead. Also missing admin_password input required by the LXC install flow, so the store UI will not prompt for it and installation fails with 400.
Files Reviewed (2 files)
  • app-catalog/catalog.yaml
  • app-catalog/services/taosr1/manifest.yaml - 1 issue

Fix these issues in Kilo Cloud


Reviewed by step-3.7-flash · Input: 165.3K · Output: 30.8K · Cached: 5.4M

@jaylfc

jaylfc commented Jul 28, 2026

Copy link
Copy Markdown
Owner Author

@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.

  1. doc-gate is red: run the gate locally and fix whatever drift it names.
  2. Adjudicate the qodo (3 bugs) and kilo (1 issue) findings against the manifest; fix the real ones, state which are false positives and why.
  3. POLICY, non-negotiable: the manifest ships a hardcoded LAN IP as the taos_base_url default. Env-specific addresses do not go in the public catalog. Drop the default entirely (the field is required, the install UI collects it) or default to a placeholder like http://taos.local:6969.

Do not touch the repo: field or the LXC provisioning shape; that design is settled.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant