Skip to content

release: promote 1.0.0-beta.36 to master - #1736

Merged
jaylfc merged 15 commits into
masterfrom
dev
Jul 8, 2026
Merged

release: promote 1.0.0-beta.36 to master#1736
jaylfc merged 15 commits into
masterfrom
dev

Conversation

@jaylfc

@jaylfc jaylfc commented Jul 8, 2026

Copy link
Copy Markdown
Owner

Promotes dev to master for the 1.0.0-beta.36 release.

Ships since beta.35:

Tag v1.0.0-beta.36 on the resulting master SHA after merge.

Summary by CodeRabbit

  • New Features

    • Added per-agent slash commands, including scoped commands in group chats and a new agent-specific endpoint.
    • Expanded torrent support with tracker, scrape, and metadata URL handling plus web seed support.
    • SearXNG now uses JSON-formatted search output by default.
  • Bug Fixes

    • Resolved chat initialization loading issues and an RK3588 install/startup problem.
    • Fixed secret file handling to regenerate invalid values and keep them owner-only.
    • Improved slash-command behavior for generic and framework-specific agents.
  • Changed

    • Updated licensing to dual-license AGPL-3.0-or-later with a commercial option.

hognek and others added 15 commits July 7, 2026 02:03
… groups

- Add slash_commands to all 10 frameworks that were missing them
  (generic, agent_zero, ironclaw, microclaw, moltics, nanoclaw,
   nullclaw, picoclaw, shibaclaw, zeroclaw) — every framework
  now exposes at least /help.
- New endpoint GET /api/agents/{slug}/slash-commands returns
  a single agent's command list, keyed by slug.
- SlashMenu: accept optional scopedAgent prop; when set, only
  show commands for that agent with the header visible.
- MessagesApp: in group channels (3+ members), slash menu only
  opens for @agentname / pattern — bare / no longer shows all
  agents' commands. In DMs, leading / still opens the single
  agent's menu as before.
- Add SlashMenu scopedAgent test + 3 backend agent-specific
  slash-command endpoint tests.

Fixes #840
… endpoint docstring

- MessagesApp.tsx: move slash block (isDm/showSlash/slashAgent/slashQuery)
  below currentChannel declaration to fix TDZ; anchor @token/ regex with ^;
  guard isDm against 0/1-member degenerate channels (=== 2 instead of <= 2)
- test_routes_framework.py: update test_framework_without_slash_commands
  assertion — generic now includes /help as a built-in slash command
- framework.py: fix agent_slash_commands docstring — unknown agent returns
  404, not empty command list (matching actual behavior)
First self-contained slice of the taOSnet Phase-2 client work. Decides whether a
model's weights may be redistributed over the swarm, so the catalog-publish CLI
can set each variant's license_allows_redistribution flag (which the download
client already requires before touching the swarm).

Conservative by default: restrictive markers (non-commercial, research, gated,
S-Lab) force False; an explicit allow-list covers permissive + RAIL + Gemma +
Llama-community licences; everything else defaults False for human review.
Covers every licence string currently in app-catalog/models.
…not env vars

SearXNG only reads SEARXNG_SETTINGS_PATH and SEARXNG_DISABLE_ETC_SETTINGS
— there is no generic SEARXNG_* nested override (the __ pattern is Home
Assistant, not SearXNG).  The previous env-var approach did nothing.

Instead, seed a real settings.yml with use_default_settings:true,
search.formats:[html,json], and a per-install generated server.secret_key
via a new config_files mechanism in the Docker installer.  The file is
bind-mounted as ./settings.yml:/etc/searxng/settings.yml:ro so it
overrides the default settings.yml inside the named config volume.

Fixes #969
fix(chat): TS2448 TDZ + generic /help test + endpoint docstring
feat(taosnet): license-eligibility classifier
Closed-swarm client plumbing in torrent_downloader.py: inject the node's
account-bound passkey into the private tracker announce, add BEP-19 web seeds,
implement torrent_url metadata fetch, and disable DHT session-wide (taOSnet is
a private authenticated mesh). New pure helpers in taosnet/torrent_client.py
(announce/scrape/metadata URLs). Passkey acquisition + 401 re-announce stay
with the caller (DownloadManager, has account context) and land next.
…losed swarm

The doc still described the original open-swarm design (opentracker on
tinyagentos.com, a home seedbox, DHT bootstrap). taOSnet shipped closed and
account-authenticated. Add a Current state section (passkey, private tracker on
taos.my, VPS+GDrive seedbox, HF web-seed fallback, DHT off, license-eligibility
gate) and point at the authoritative live contract in docs/taosnet.md. The
original design is kept below for history.
feat(taosnet): client passkey + web-seed + torrent_url wiring, DHT off
docs(taosnet): reconcile design doc with the shipped closed swarm
…, and clean up manifest

CRITICAL: Validate config_files[*].path against traversal — reject absolute
paths, '..' components, and symlink escapes outside app_dir. Validate entry
shape (dict with path+content) with clear ValueError messages instead of
bare KeyError/TypeError. Persist secret_key in .secret_key file so
re-installs don't silently rotate SearXNG's secret.

SUGGESTION: Remove redundant named volume config:/etc/searxng from manifest
since settings.yml is bind-mounted. Fix brittle key_val prefix-slice parse
in tests — use split() instead.

6 new tests: missing-path, missing-content, absolute-path, dotdot-path,
symlink-escape, secret-key-persistence. All 29 installer+catalog tests pass.
fix(searxng): enable JSON output format via settings.yml bind mount, not env vars
…fix (#1730, #1732) (#1733)

* fix(install-rknpu): bump rkllama pin to restore --preload (#1730)

The beta.35 rkllama pin (d92668e) had dropped --preload upstream, but the
generated rkllama.service still passes --preload, so rkllama failed to start
with 'unrecognized arguments: --preload' on a fresh install, blocking RKLLM
entirely. Bump the pin to 02ef2a6, which restores the --preload startup flag
(jaylfc/rkllama#1, validated on RK3588 by @mandresve), so the systemd unit's
preload of the embedding/reranker/query-expansion models works again.

Reported by @mandresve (#1730).

* fix(install-rknpu): pin rkllama with --preload restore + context-overflow fix (#1730, #1732)

Bump to 5e38bd2, which bundles two rkllama fixes: restore the --preload startup
flag (jaylfc/rkllama#1) so the generated service starts (#1730), and a
pre-flight context-length guard + fail-safe worker-EOF handling so an
over-long prompt returns a clean HTTP 400 instead of crashing the worker with
an EOFError (jaylfc/rkllama#3, #1732). Both reported by @mandresve.
…pp secret (#1734)

Fold on #1724 (searxng config_files). The per-app .secret_key signs sessions,
so write it owner-only (0600) instead of the default 0644, and regenerate it
if a prior write left it empty or not 64 hex chars, so an install never
substitutes a blank secret_key into the mounted config.
Ships the mandresve RK3588 regression fixes (#1730, #1732) plus SearXNG
JSON output (#969), chat TDZ fix (#1720), per-app secret 0600 perms
(#1734), and the AGPL-3.0 + commercial dual-license (#1721).
@qodo-code-review

Copy link
Copy Markdown

Qodo reviews are paused for this user.

Troubleshooting steps vary by plan Learn more →

On a Teams plan?
Reviews resume once this user has a paid seat and their Git account is linked in Qodo.
Link Git account →

Using GitHub Enterprise Server, GitLab Self-Managed, or Bitbucket Data Center?
These require an Enterprise plan - Contact us
Contact us →

@github-actions

github-actions Bot commented Jul 8, 2026

Copy link
Copy Markdown

👋 Thanks for the PR! This one targets master, which is our
stable branch (it's what live installs track). Please retarget it to
dev — click Edit next to the PR title and change the base
branch dropdown from master to dev. Your commits and any review
carry over, nothing is lost.

See CONTRIBUTING.md for the branch model.

@jaylfc
jaylfc merged commit 3c0a4d0 into master Jul 8, 2026
15 of 16 checks passed
@github-project-automation github-project-automation Bot moved this from Todo to Done in TinyAgentOS Roadmap Jul 8, 2026
@gitar-bot

gitar-bot Bot commented Jul 8, 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 8, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: bc654ed7-76b5-49ab-aa49-8bdd59e27973

📥 Commits

Reviewing files that changed from the base of the PR and between 9b69fa5 and 1d07247.

⛔ Files ignored due to path filters (2)
  • desktop/package-lock.json is excluded by !**/package-lock.json
  • uv.lock is excluded by !**/*.lock
📒 Files selected for processing (23)
  • CHANGELOG.md
  • app-catalog/services/searxng/manifest.yaml
  • desktop/package.json
  • desktop/src/apps/MessagesApp.tsx
  • desktop/src/apps/chat/SlashMenu.tsx
  • desktop/src/apps/chat/__tests__/SlashMenu.test.tsx
  • docs/design/model-torrent-mesh.md
  • pyproject.toml
  • scripts/install-rknpu.sh
  • tests/taosnet/test_license_eligibility.py
  • tests/taosnet/test_torrent_client.py
  • tests/taosnet/test_torrent_downloader_taosnet.py
  • tests/test_framework_slash_commands.py
  • tests/test_installers.py
  • tests/test_routes_framework.py
  • tinyagentos/__init__.py
  • tinyagentos/frameworks.py
  • tinyagentos/installers/docker_installer.py
  • tinyagentos/routes/framework.py
  • tinyagentos/taosnet/__init__.py
  • tinyagentos/taosnet/license_eligibility.py
  • tinyagentos/taosnet/torrent_client.py
  • tinyagentos/torrent_downloader.py

📝 Walkthrough

Walkthrough

This PR bundles a per-agent slash-command feature (backend endpoint, framework registry, MessagesApp/SlashMenu scoping), DockerInstaller support for declarative config files with secret-key templating and path validation, new taOSnet modules (license eligibility, torrent client URL builders), torrent downloader passkey/web-seed wiring, a design doc update, and release version/changelog bumps plus an rkllama installer ref pin.

Changes

Per-agent slash command scoping

Layer / File(s) Summary
Backend framework registry and per-agent endpoint
tinyagentos/frameworks.py, tinyagentos/routes/framework.py, tests/test_framework_slash_commands.py, tests/test_routes_framework.py
Adds help slash_commands to generic and multiple framework entries, a new /api/agents/{slug}/slash-commands endpoint (404 on unknown agent), and tests validating both.
Frontend scoped slash menu
desktop/src/apps/MessagesApp.tsx, desktop/src/apps/chat/SlashMenu.tsx, desktop/src/apps/chat/__tests__/SlashMenu.test.tsx
MessagesApp parses DM / vs group @agent / triggers into slashAgent/slashQuery and passes scopedAgent to SlashMenu, which filters rows/headers to the scoped agent; adds a test for the scoped filtering behavior.

Secure per-app config file generation

Layer / File(s) Summary
DockerInstaller _write_config_files implementation
tinyagentos/installers/docker_installer.py
Adds _write_config_files writing manifest-declared config files with path-traversal checks, per-app .secret_key generation/repair (0600 perms), and {secret_key} templating; wires the call into install() before compose generation.
DockerInstaller config file tests
tests/test_installers.py
Adds tests for file creation, secret substitution/persistence, permission checks, regeneration on empty key, no-op with no config_files, and rejection of malformed/traversal paths.
SearXNG manifest adoption
app-catalog/services/searxng/manifest.yaml
Replaces the config volume mount with a read-only settings.yml bind and a config_files generator enabling JSON output, secret_key, and bind_address.

taOSnet torrent client and license eligibility

Layer / File(s) Summary
License eligibility module and tests
tinyagentos/taosnet/license_eligibility.py, tests/taosnet/test_license_eligibility.py
Adds normalize_license, license_allows_redistribution, classify_manifest, and PERMISSIVE_LICENSES, with tests covering allow/deny lists, normalization, and scanning model manifests.
Torrent client URL builders
tinyagentos/taosnet/torrent_client.py, tinyagentos/taosnet/__init__.py, tests/taosnet/test_torrent_client.py
Adds announce_url, scrape_url, torrent_metadata_url, and _segment percent-encoding/validation, a taosnet module docstring, and URL-format/encoding/validation tests.
Torrent downloader passkey/web-seed wiring
tinyagentos/torrent_downloader.py, tests/taosnet/test_torrent_downloader_taosnet.py
Disables session DHT, adds _params_from_torrent_url for HTTP .torrent fetch, extends _build_params/download to accept passkey and web_seeds, and adds corresponding downloader tests.
Design doc update
docs/design/model-torrent-mesh.md
Updates the design doc to "partially superseded" status describing the currently implemented closed, authenticated swarm, passkey flow, and license eligibility rules.

Release housekeeping

Layer / File(s) Summary
Version bump and changelog
CHANGELOG.md, desktop/package.json, pyproject.toml, tinyagentos/__init__.py
Bumps version to 1.0.0-beta.36 across package files and adds a changelog entry documenting fixes, secret-file permission hardening, and licensing change.
RKNPU installer ref pin
scripts/install-rknpu.sh
Updates the default/documented TAOS_RKLLAMA_REF fallback commit used when installing rkllama.

Estimated code review effort: 3 (Moderate) | ~30 minutes

Sequence Diagram(s)

sequenceDiagram
  participant User
  participant MessagesApp
  participant SlashMenu
  participant FrameworkAPI

  User->>MessagesApp: type "`@tom` /help"
  MessagesApp->>MessagesApp: parse slashAgent, slashQuery, showSlash
  MessagesApp->>SlashMenu: render(scopedAgent=slashAgent)
  SlashMenu->>SlashMenu: buildRows(scopedAgent) filters to single agent
  MessagesApp->>FrameworkAPI: GET /api/agents/tom/slash-commands
  FrameworkAPI-->>MessagesApp: {tom: [{name, description}, ...]}
Loading
sequenceDiagram
  participant TorrentDownloader
  participant Tracker
  participant HTTPClient

  TorrentDownloader->>TorrentDownloader: _build_params(source, passkey, web_seeds)
  alt source is torrent URL
    TorrentDownloader->>HTTPClient: GET .torrent metadata
    HTTPClient-->>TorrentDownloader: torrent bytes
  end
  TorrentDownloader->>Tracker: announce with passkey tracker URL
  TorrentDownloader->>TorrentDownloader: add web_seeds to url_seeds
  TorrentDownloader-->>TorrentDownloader: download(...) returns TorrentTask
Loading

Possibly related issues

Possibly related PRs

  • jaylfc/taOS#1703: Implements the same per-agent chat slash-command scoping via MessagesApp/SlashMenu (scopedAgent + @agent / parsing) and the same GET /api/agents/{slug}/slash-commands plus FRAMEWORKS wiring.
  • jaylfc/taOS#1724: Changes the SearXNG install to bind-mount a generated settings.yml and adds/verifies DockerInstaller._write_config_files with {secret_key} templating and path-safe config seeding.
  • jaylfc/taOS#1728: Adds/validates the same taosnet/torrent_client.py URL builders and extends torrent_downloader.py to accept passkey/web_seeds and disable DHT.

Suggested reviewers: kilo-code-bot

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch dev

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.

404, unknown framework → empty command list.
"""
config = getattr(request.app.state, "config", None)
agents = getattr(config, "agents", []) if config else []

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

SUGGESTION: config.agents may be None, raising TypeError

agents = getattr(config, "agents", []) if config else [] only substitutes [] when config itself is falsy. If request.app.state.config is set but its agents attribute is None, next((...) for a in None) raises TypeError and the endpoint 500s. Use getattr(config, "agents", []) or [], and consider guarding a.get("name") for non-dict entries.


Reply with @kilocode-bot fix it to have Kilo Code address this issue.

``torrent_url`` instead of a magnet."""
import httpx

resp = httpx.get(url, timeout=30.0, follow_redirects=True)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

WARNING: Untrusted torrent_url fetched with redirects and no size/validity guard

This fetches a manifest-supplied URL with follow_redirects=True, no max response size, and feeds resp.content straight into lt.bdecode/lt.torrent_info on line 195. A corrupt, non-torrent, oversized, or redirect-to-internal response raises an uncaught exception or can exhaust memory instead of failing cleanly. Validate the content type, cap resp.content size, and wrap the decode in try/except that raises TorrentError.


Reply with @kilocode-bot fix it to have Kilo Code address this issue.

const isDm = agentMembers.length === 1;
let agentMembers = members.filter((m) => m !== "user" && commands[m]);
// When scopedAgent is set, only show commands for that agent.
if (scopedAgent && agentMembers.includes(scopedAgent)) {

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

SUGGESTION: Unknown scopedAgent silently falls back to all agents' commands

When scopedAgent is set but is not present in agentMembers (e.g. a typo'd @handle /), the guard is skipped and the menu shows every agent's commands instead of an empty set. Consider treating an unrecognised scoped agent as an empty result so the @agent / affordance stays predictable.


Reply with @kilocode-bot fix it to have Kilo Code address this issue.

// slash menu. In a group channel (3+ members), the user must prefix
// with "@agentname /" so we know which agent's commands to show.
const isDm = (currentChannel?.members?.length ?? 0) === 2;
const showSlash = isDm ? input.startsWith("/") : /^@\S+\s+\//.test(input);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

SUGGESTION: Group slash trigger requires a space before / (@agent /); @agent/ won't open the menu

showSlash (and slashAgent on line 1432) anchor the regex on /^@\S+\s+\//, so @agent/help (no space between handle and slash) does not open the scoped menu. Allowing an optional space between the handle and / would be more forgiving for users.


Reply with @kilocode-bot fix it to have Kilo Code address this issue.

@kilo-code-bot

kilo-code-bot Bot commented Jul 8, 2026

Copy link
Copy Markdown

Code Review Summary

Status: 4 Issues Found | Recommendation: Address before merge

Overview

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

WARNING

File Line Issue
tinyagentos/torrent_downloader.py 193 _params_from_torrent_url fetches a manifest-supplied URL with follow_redirects=True, no size cap, and feeds the body straight into lt.bdecode/lt.torrent_info (line 195) with no error handling; corrupt/oversized/redirect responses crash the download task.

SUGGESTION

File Line Issue
tinyagentos/routes/framework.py 135 config.agents may be None (only substituted when config is falsy) → TypeError/500; use getattr(config, "agents", []) or [].
desktop/src/apps/chat/SlashMenu.tsx 102 Unknown scopedAgent (typo'd @handle /) silently falls back to showing every agent's commands instead of an empty set.
desktop/src/apps/MessagesApp.tsx 1430 Group slash trigger requires a space before / (@agent /); @agent/ does not open the scoped menu.
Files Reviewed (23 files)
  • desktop/src/apps/MessagesApp.tsx
  • desktop/src/apps/chat/SlashMenu.tsx
  • desktop/src/apps/chat/__tests__/SlashMenu.test.tsx
  • tests/test_framework_slash_commands.py
  • tinyagentos/frameworks.py
  • tinyagentos/routes/framework.py
  • tests/test_routes_framework.py
  • tests/taosnet/test_license_eligibility.py
  • tinyagentos/taosnet/__init__.py
  • tinyagentos/taosnet/license_eligibility.py
  • app-catalog/services/searxng/manifest.yaml
  • tests/test_installers.py
  • tinyagentos/installers/docker_installer.py
  • tests/taosnet/test_torrent_client.py
  • tests/taosnet/test_torrent_downloader_taosnet.py
  • tinyagentos/taosnet/torrent_client.py
  • tinyagentos/torrent_downloader.py
  • docs/design/model-torrent-mesh.md
  • scripts/install-rknpu.sh
  • CHANGELOG.md
  • desktop/package.json / desktop/package-lock.json
  • pyproject.toml / tinyagentos/__init__.py / uv.lock

Fix these issues in Kilo Cloud


Reviewed by hy3-20260706:free · Input: 106.3K · Output: 26.1K · Cached: 1M

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

Labels

None yet

Projects

Development

Successfully merging this pull request may close these issues.

2 participants