Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
af582d9
feat(extensions): add minimal static authoring checks and guide
Lucas1479 Oct 20, 2026
4818e2e
docs(extensions): record approved plan and first preview validation
Lucas1479 Oct 20, 2026
1840c8e
fix(extensions): clarify authoring checks and preserve current contracts
Lucas1479 Oct 20, 2026
36ae482
feat(extensions): add executable author contracts and four-owner qual…
Lucas1479 Oct 20, 2026
f00623a
feat(extensions): add catalog downloads and durable security admission
Lucas1479 Oct 20, 2026
a7aab2b
fix(extensions): distinguish desired and running security feedback
Lucas1479 Oct 20, 2026
a6fd0c9
fix(extensions): retain running security warning after settings loss
Lucas1479 Oct 20, 2026
39ed76f
docs(extensions): record S1 transport and power-loss recovery qualifi…
Lucas1479 Oct 20, 2026
24d410e
feat(extensions): add catalog browsing and manual update journeys
Lucas1479 Oct 20, 2026
41e4836
fix(extensions): preserve voice roles in catalog presentation
Lucas1479 Oct 20, 2026
a78399d
fix(extensions): require explicit catalog safety recovery
Lucas1479 Oct 20, 2026
e579f09
docs(extensions): record S2 store UI and real plugin qualification
Lucas1479 Oct 20, 2026
c1aa9f0
fix(extensions): ship static checker and qualify store release paths
Lucas1479 Oct 21, 2026
3ea67e4
test(extensions): exercise Notes MCP in shipping store journeys
Lucas1479 Oct 21, 2026
ebcfd00
test(extensions): select enabled Pi through release shell settings
Lucas1479 Oct 21, 2026
ee45e33
test(extensions): isolate Pi registration from real model credentials
Lucas1479 Oct 21, 2026
febff4b
docs(extensions): record S3 local qualification and publication gates
Lucas1479 Oct 21, 2026
b3a1827
test(extensions): qualify source archives and shipping failure recovery
Lucas1479 Oct 21, 2026
f5ea6d4
test(extensions): handle idle download progress in failure probe
Lucas1479 Oct 21, 2026
457b1fe
test(extensions): add operator-driven native confirmation qualification
Lucas1479 Oct 21, 2026
52c15c9
docs(extensions): record isolated qualification and external review b…
Lucas1479 Oct 21, 2026
0c8150c
fix(deps): update Pillow and certifi with headless Qwen packaging
Lucas1479 Oct 21, 2026
51c8363
test(pi): keep MCP authority fixtures independent of SDK cold imports
Lucas1479 Oct 21, 2026
59c379a
fix(deps): declare upstream re-exports without lint exclusions
Lucas1479 Oct 21, 2026
c5aa032
docs(extensions): close local Pi and dependency blockers with r2 evid…
Lucas1479 Oct 21, 2026
7a6389c
docs(extensions): link independent dependency draft PR 252
Lucas1479 Oct 21, 2026
c44799e
test(extensions): connect catalog publication to the desktop lifecycle
Lucas1479 Oct 21, 2026
cff27e2
docs(extensions): record complete local store publication roundtrip
Lucas1479 Oct 21, 2026
394dca6
docs(extensions): record successful dependency PR CI snapshot
Lucas1479 Oct 21, 2026
341df15
test(extensions): connect submission revision and live delivery checks
Lucas1479 Oct 22, 2026
6dcec45
test(extensions): support standalone publisher qualification
Lucas1479 Oct 22, 2026
9e3938c
docs(extensions): record lightweight submission workflow qualification
Lucas1479 Oct 22, 2026
af56e72
Merge main into extension community preview
Lucas1479 Oct 22, 2026
ed61b86
test(extensions): qualify main integration without occupying develope…
Lucas1479 Oct 22, 2026
2c44286
fix(extensions): address store audit and preserve locked source inputs
Lucas1479 Oct 22, 2026
016b0e0
Merge UI and icon mainline into plugin store prototype
Lucas1479 Oct 22, 2026
ae4a146
fix(extensions): qualify combined UI and packaged manifest versions
Lucas1479 Oct 22, 2026
25276b0
Merge bundled dictionary mainline into plugin store prototype
Lucas1479 Oct 22, 2026
e0f7e9b
test(extensions): scope shipping controls and record integration gates
Lucas1479 Oct 22, 2026
1e564d3
test(smoke): retain artifact drawer focus across mode changes
Lucas1479 Oct 22, 2026
cd3f36f
fix(deps): update OpenTelemetry API and retain lifecycle failure evid…
Lucas1479 Oct 22, 2026
04f9115
docs(extensions): record integrated desktop and publication qualifica…
Lucas1479 Oct 22, 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
4 changes: 4 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -585,3 +585,7 @@ ENABLE_JAPANESE_USER_DICTIONARY=true
# Experimental Japanese contextual readings
ENABLE_JAPANESE_CONTEXT_READING=false
# END GENERATED CONFIG: tts_japanese_reading

# BEGIN GENERATED CONFIG: desktop_extensions
# Extension downloads
# END GENERATED CONFIG: desktop_extensions
83 changes: 83 additions & 0 deletions .github/workflows/python-windows.yml
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,26 @@ jobs:
- name: Verify environment
run: uv run --locked --no-sync python tools/verify_python_environment.py --profile ci

- name: Check the minimal extension authoring environment
shell: bash
run: |
uv export --locked --only-group extension-authoring --no-emit-project --no-header --output-file tools/requirements-extension-authoring.txt
git diff --exit-code -- tools/requirements-extension-authoring.txt
python -m venv build/extension-authoring-env
build/extension-authoring-env/Scripts/python.exe -m pip install --require-hashes -r tools/requirements-extension-authoring.txt
build/extension-authoring-env/Scripts/python.exe -I tools/extension_package.py profile --format text
for package in examples/extensions/*/src/*/amadeus-extension.json; do
build/extension-authoring-env/Scripts/python.exe -I tools/extension_package.py check-package "$(dirname "$package")" --format text
done
# Build only the repository reference packages using the locked Host build tools.
# The minimal checker environment itself remains free of build/runtime dependencies.
for project in examples/extensions/*/pyproject.toml; do
uv build --wheel --offline --no-build-isolation --python .venv/Scripts/python.exe --out-dir build/extension-examples "$(dirname "$project")"
done
for wheel in build/extension-examples/*.whl; do
build/extension-authoring-env/Scripts/python.exe -I tools/extension_package.py check-wheel "$wheel" --format text
done

- name: Check source and architecture views
# bash (not pwsh): Actions runs bash with -e, so a ruff failure must
# fail the step instead of being masked by the next command's exit 0.
Expand All @@ -103,10 +123,35 @@ jobs:
npm ci
npm run build

- name: Run offline extension author journeys
run: >-
uv run --locked --no-sync python -X utf8 tools/probes/extension_author_journey.py

- name: Run plugin store UI journey with real reference wheels
shell: pwsh
run: |
$authorRun = Get-ChildItem -LiteralPath build/extension-author-journey -Directory | Sort-Object LastWriteTime -Descending | Select-Object -First 1
if (!$authorRun) { throw 'Author journey wheel directory is missing' }
$wheelDirectory = Join-Path $authorRun.FullName 'wheels'
uv run --locked --no-sync python -X utf8 tools/probes/extension_catalog_journey.py --execute --store-ui --wheels $wheelDirectory
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }

- name: Prepare shipping-shell extension fixture
shell: pwsh
run: |
$authorRun = Get-ChildItem -LiteralPath build/extension-author-journey -Directory | Sort-Object LastWriteTime -Descending | Select-Object -First 1
if (!$authorRun) { throw 'Author journey wheel directory is missing' }
$prepared = uv run --locked --no-sync python -X utf8 tools/probes/extension_catalog_journey.py --execute --store-ui --prepare-only --failure-fixture --wheels (Join-Path $authorRun.FullName 'wheels')
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
$fixture = ($prepared | ConvertFrom-Json).fixture
if (!$fixture) { throw 'Release fixture was not prepared' }
Add-Content -LiteralPath $env:GITHUB_ENV -Value "EXTENSION_RELEASE_FIXTURE=$fixture"

- name: Run Electron model-less smoke
run: >-
uv run --locked --no-sync python -X utf8 tools\smoke_electron_model_less.py
--report-dir build\electron-smoke
--extension-fixture "${{ env.EXTENSION_RELEASE_FIXTURE }}" --extension-failures

- uses: actions/setup-dotnet@v5
with:
Expand All @@ -123,15 +168,53 @@ jobs:
uv run --locked --no-sync python -X utf8 tools\smoke_electron_model_less.py
--packaged-executable electron\build\win-unpacked\amadeus-desktop.exe
--report-dir build\electron-packaged-smoke
--extension-fixture "${{ env.EXTENSION_RELEASE_FIXTURE }}" --extension-failures

- uses: actions/checkout@v7
with:
repository: Code-Amadeus/Amadeus-Extensions
ref: e2fc0e93fa7cfd9bf98e378cac6e158f14181b9a
path: build/catalog-demo-protocol
fetch-depth: 0
persist-credentials: false
- uses: actions/checkout@v7
with:
ref: 1840c8e4f646992ddaebea3139c8895f29743a8f
path: build/catalog-demo-host
fetch-depth: 0
persist-credentials: false
- name: Qualify packaged catalog publication and recovery roundtrip
shell: pwsh
run: |
python -m venv build/catalog-demo-checker
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
build/catalog-demo-checker/Scripts/python.exe -m pip install --require-hashes -r build/catalog-demo-host/tools/requirements-extension-authoring.txt
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
$authorRun = Get-ChildItem -LiteralPath build/extension-author-journey -Directory | Sort-Object LastWriteTime -Descending | Select-Object -First 1
if (!$authorRun) { throw 'Author journey wheels missing' }
uv run --locked --no-sync python -X utf8 tools/probes/extension_store_demo.py --execute --protocol-repo build/catalog-demo-protocol --checker-host build/catalog-demo-host --checker-python build/catalog-demo-checker/Scripts/python.exe --wheels (Join-Path $authorRun.FullName 'wheels') --packaged-executable electron/build/win-unpacked/amadeus-desktop.exe --report-dir build/catalog-publication-smoke
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }

- name: Upload Electron smoke diagnostics
if: failure()
uses: actions/upload-artifact@v6
with:
name: electron-model-less-smoke-${{ github.run_id }}
path: |
build/extension-author-journey/**/report.json
build/extension-author-journey/**/*-report.json
build/extension-author-journey/**/*.log
build/extension-catalog-journey/**/report.json
build/extension-catalog-journey/**/*-runtime.json
build/extension-catalog-journey/**/*.png
build/extension-catalog-journey/**/*.log
build/electron-smoke/**
build/electron-packaged-smoke/**
build/catalog-publication-smoke/**/report.json
build/catalog-publication-smoke/**/*-report.json
build/catalog-publication-smoke/**/publication.json
build/catalog-publication-smoke/**/result.json
build/catalog-publication-smoke/**/*.png
if-no-files-found: ignore

# Preserve the branch-protection check name. A failed, cancelled or skipped
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/source-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ on:
- electron/package.json
- electron/package-lock.json
- scripts/**
- wallpaper/**
- electron/scripts/build-windows-wallpaper.cjs
- tools/build_source_release.py
- tools/stage_japanese_dictionary.py
- tools/probes/verify_bundled_dictionary.py
Expand Down
7 changes: 7 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -139,3 +139,10 @@ Change the canonical SDK/schema/validator in Amadeus-Extensions first, then
update the recorded source commit, wheel and checksums together. Do not edit
pinned copies in place; provenance checks reject drift. These scopes do not
change the AGPL-3.0 license of Host implementation code.

## Extension authors

Use [the author guide](docs/extension_authoring.md) for the small static-checker
environment; it does not require the full Host dependencies. Plugins use the
standalone SDK or their native MCP/Skill/theme contracts, not private Host
imports. Catalog review and runtime support are separate decisions.
30 changes: 28 additions & 2 deletions LICENSES/provenance.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
"assets/audio/sfx",
"vendor/aec-audio-processing",
"vendor/extension-sdk",
"vendor/extension-catalog",
"vendor/qwen-asr"
],
"components": [
Expand Down Expand Up @@ -85,11 +86,18 @@
"id": "japanese-pronunciation",
"name": "Optional Japanese pronunciation dictionary",
"category": "external-runtime-data",
"paths": ["assets/text/ja/english/**"],
"paths": [
"assets/text/ja/english/**"
],
"source_url": "https://github.com/RVC-Boss/GPT-SoVITS",
"source_revision": "1b47ca07ef43a284e0b8bd7f29d3e1e3ff76082a; userdict.csv blob 2be580b461185ce18c9000d9ec6c8032623e17fd; Amadeus corrections recorded in tools/data/japanese_dictionary_source.json",
"license_expression": "AGPL-3.0 AND MIT AND BSD-2-Clause",
"license_evidence": ["LICENSES/JAPANESE-DICTIONARY.md", "LICENSES/GPT-SoVITS-MIT.txt", "LICENSES/CMUdict-BSD-2-Clause.txt", "LICENSE"],
"license_evidence": [
"LICENSES/JAPANESE-DICTIONARY.md",
"LICENSES/GPT-SoVITS-MIT.txt",
"LICENSES/CMUdict-BSD-2-Clause.txt",
"LICENSE"
],
"modified": true,
"release_action": "exclude",
"gate_status": "ready",
Expand Down Expand Up @@ -484,6 +492,24 @@
"gate_status": "ready",
"notes": "Unchanged model assets are optional external runtime data. Exact hashes and the upstream MIT notice (Copyright (c) 2026 Aivis Project) are retained; exact training-data provenance is not established. No model publication is authorized by this record."
},
{
"id": "amadeus-extension-catalog",
"name": "Amadeus curated catalog policy and reader fixtures",
"category": "vendored-source",
"paths": [
"vendor/extension-catalog/**"
],
"source_url": "https://github.com/Code-Amadeus/Amadeus-Extensions",
"source_revision": "58d3892d55c6a7ec6f8626153f503291bb10ab9a (local experimental branch; publication pending)",
"license_expression": "Apache-2.0",
"license_evidence": [
"vendor/extension-catalog/LICENSE"
],
"modified": false,
"release_action": "include",
"gate_status": "ready",
"notes": "Exact byte copies pinned in server/extensions/catalog-source.json. Separate from the unchanged manifest/SDK pin. Merge protocol catalog before publishing a Host release that requires this revision."
},
{
"id": "qwen-asr",
"name": "Qwen-ASR 0.0.6 (demo dependency separated)",
Expand Down
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -1026,6 +1026,8 @@ automatic rights to character, model, reference-audio, or external asset packs.
- [Aqua-TTS](https://github.com/Lucas1479/Aqua-TTS): an MIT-licensed low-latency GPT-SoVITS v3 inference runtime. Amadeus does not require Aqua to start today.
- [Amadeus SpriteForge](https://github.com/Code-Amadeus/Amadeus-SpriteForge): public **0.1.0 Source Alpha** for local sprite inspection, behavior-graph editing, and KTX2 character-pack preview/export. Licensed under AGPL-3.0-only; generation services are separate from the Amadeus runtime.
- [Experimental extension Host profile](docs/extension_host_profile_v0.1.md): the implemented local-wheel TTS/MCP/Skill/theme subset, package application lifecycle, Agent binding and current limits. This is not a stable SDK or a full extension protocol conformance claim.
- [Extension authoring](docs/extension_authoring.md): minimal static checks, local wheel examples and the implemented Host support boundary.
- [Experimental plugin catalog](docs/extension_catalog.md): browse, install and manually update exact reviewed artifacts; public publication and independent review remain pending. See the [release checklist](docs/verification/extensions/store-v1.md).
- [AUIP](https://github.com/Code-Amadeus/AUIP): the experimental application-session / typed-action protocol implemented in Amadeus. The separate repository documents its status and public implementation entry points; a separately versioned SDK and conformance suite are not yet published.
- [GPT-SoVITS](https://github.com/RVC-Boss/GPT-SoVITS): the embedded speech-synthesis inference foundation.
- [OpenClaw](https://github.com/openclaw/openclaw): an optional external Work gateway.
Expand Down
2 changes: 2 additions & 0 deletions README_ZH.md
Original file line number Diff line number Diff line change
Expand Up @@ -907,6 +907,8 @@ Amadeus 第一方源码和修改依据
- [GPT-SoVITS](https://github.com/RVC-Boss/GPT-SoVITS):内嵌语音合成推理基础。
- [OpenClaw](https://github.com/openclaw/openclaw):可选外部 Work gateway。
- [实验性扩展 Host profile](docs/extension_host_profile_v0.1.md):已实现的本地 wheel TTS/MCP/Skill/主题子集、包应用生命周期、Agent 绑定与当前限制;不是稳定 SDK,也不声明完整扩展协议一致性。
- [插件作者入口](docs/extension_authoring.md):最小静态检查环境、现有 wheel 示例、Host 支持范围与运行验收边界。
- [实验性插件目录](docs/extension_catalog.md):浏览、安装和手动更新具体产物;正式目录发布与独立审核仍待完成,资格边界见[发布检查表](docs/verification/extensions/store-v1.md)。

<details>
<summary>Star History</summary>
Expand Down
35 changes: 18 additions & 17 deletions ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,25 +36,27 @@ change to Amadeus's product identity.

## Active directions

### A complete horizontal extension entry
### Community extension authoring and a curated catalog

The Host already has a read-only Capability Catalog that projects Providers,
MCP servers, Skills, and AUIP apps without replacing their native contracts.
Settings can manage MCP connections and display shared Provider capabilities.
The experimental Host already installs local wheels for TTS, MCP, Agent Skills
and data-only themes through one manager in Settings. Configuration, encrypted
credentials, package revisions and native-owner activation are implemented.

The next useful product step is a coherent extension entry that can:
The experimental branch implements the author checker, four reference journeys,
curated catalog rules, trusted downloads, durable safety decisions, browsing and
manual updates. The same installer serves local and catalog wheels. Source and
packaged-shell qualification is recorded in the [store release checklist](docs/verification/extensions/store-v1.md).
A public catalog still requires independent artifact review, repository governance
and a separate release decision. External-author evidence remains pending; reference
packages do not complete that qualification.

- show installation identity, compatibility, health, enablement, and the exact
Provider or product surface that consumes each contribution;
- add, configure, disable, and remove supported out-of-tree contributions
without requiring users to find several settings files;
- keep secrets in Host-owned bindings and retain each Provider, MCP, Skill, or
AUIP runtime as the authority for its native payload;
- prove at least two real out-of-tree adapters before allowing trusted Python
entry-point discovery.
Catalog admission policy is separate from runtime contracts. New types retain
native owners; an older client must disable unsupported packages without losing
compatible catalog entries or understood safety updates. Installing a package
never grants Main Chat direct MCP/Skill execution authority.

This direction does not grant plugins action authority and does not attach MCP
tools or Skill prompts directly to Main Chat.
See [authoring](docs/extension_authoring.md) and the
[implemented Host profile](docs/extension_host_profile_v0.1.md).

### Source Alpha setup and diagnosability

Expand Down Expand Up @@ -145,8 +147,7 @@ runtime path.

## Later, after Alpha evidence

- remote extension catalogs, package signatures, automatic updates, rollback,
and marketplace-style discovery;
- package signatures, automatic updates and rollback;
- broader public SDK surfaces beyond contracts already exercised by external
adapters;
- platform-specific wallpaper implementations outside Windows;
Expand Down
2 changes: 2 additions & 0 deletions THIRD_PARTY_NOTICES.md
Original file line number Diff line number Diff line change
Expand Up @@ -207,3 +207,5 @@ source commits, adaptations and wheel/source SHA-256 values are recorded in
pending upstream main acceptance. Authored `examples/extensions/` code is MIT-0
under its LICENSE, as recorded in `LICENSES/provenance.json`. These scoped grants
do not relicense the Host or external voices, models, artwork or dependencies.

The curated catalog policy under `vendor/extension-catalog/` is an unmodified Apache-2.0 copy from Amadeus-Extensions, pinned independently in `server/extensions/catalog-source.json`. Its source revision is currently on the local experimental branch; publish the protocol revision before releasing this Host integration.
33 changes: 33 additions & 0 deletions config/catalog/desktop/extensions.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
{
"id": "desktop_extensions",
"title": {
"en-US": "Extension downloads",
"zh-CN": "插件下载"
},
"description": {
"en-US": "Only wheel downloads use this mirror. The index always comes from the official repository.",
"zh-CN": "镜像只用于下载 wheel,目录索引始终来自官方仓库。"
},
"desktop": true,
"apply": "frontend",
"config": {
"AMADEUS_EXTENSION_ARTIFACT_MIRROR": {
"type": "url",
"title": {
"en-US": "Artifact mirror base URL",
"zh-CN": "产物镜像根地址"
},
"description": {
"en-US": "Optional HTTPS directory serving <sha256>/<wheel filename>. Empty uses the original artifact URL.",
"zh-CN": "可选 HTTPS 目录,按 <sha256>/<wheel 文件名> 提供文件。留空使用原始下载地址。"
},
"default": "",
"scope": "desktop",
"schemes": [
"https"
],
"allow_empty": true,
"max_length": 2048
}
}
}
Loading
Loading