## 变更说明 / What this changes 新增官方 Agent 条目「MiMo 模型余量检测」,以不可变 source pointer 形态收录,内容仓库为 `desirecore-agent/mimo-model-quota-monitor`。 - `agents/mimo-model-quota-monitor/entry.json` 指向已发布提交 `911c0a226346a8157f07d5218207f16e32ea82e0`。 - `agents/mimo-model-quota-monitor/catalog-metadata.v1.json`:provenance、MIT 许可证证据、合规审查(`reviewedRef` 与内容 ref 一致),`availability: installable`。 - `requiredClientVersion: 10.0.156`:依赖该版本起的调度完成判据、调度权限上限与内嵌浏览器操作记录修复。 - `manifest.json`:Agent 计数与更新日期。 Agent 做什么:按计划(默认每小时)读取小米 MiMo 开放平台 Token Plan 余量,结构化写入 `latest.json` 与每轮一份历史文件,在余量偏低、消耗过快、即将重置或登录失效时提醒。只读、不执行命令;遇到验证码或短信验证时停下请人处理;登录凭据只经 DesireCore 加密凭据存储的占位符注入。 Adds the official "MiMo model quota monitor" Agent as an immutable source pointer to `desirecore-agent/mimo-model-quota-monitor` at commit `911c0a226346a8157f07d5218207f16e32ea82e0`, with a bilingual catalog sidecar (provenance, MIT license evidence, compliance review with `reviewedRef` equal to the content ref, `availability: installable`) and `requiredClientVersion: 10.0.156`. The Agent reads the Xiaomi MiMo Token Plan quota on a schedule, writes structured results, and alerts on low quota, fast burn, upcoming reset or an expired login. It is read-only, runs no shell commands, stops for CAPTCHA or SMS verification, and receives credentials only through DesireCore's encrypted credential placeholders. ## 校验 / Validation - `uv run --quiet scripts/catalog/validate_catalog_metadata.py --require-complete`:0 error(既有条目的 warning 未变)。 - 条目目录内所有 40 位十六进制值只有一个,即上面的提交号(`source.ref`、`provenance.content.ref`、`governance.compliance.reviewedRef` 三处一致)。 - 内容仓库:`agent.json` 通过 agentConfigSchema;`SKILL.md` frontmatter 通过技能 Schema;`HEARTBEAT.md` 被判为实质为空(心跳不会白调模型);结果与账号 Schema 用样例和反例校验,共 19 项通过。 - 内容仓库共两个提交(首版 + SOP 失败分支表更新),不含账号标识、手机号或凭据。Git 提交元数据中的维护者邮箱是 DesireCore 组织所有公开提交一致使用的公开身份邮箱。 `validate_catalog_metadata.py --require-complete` reports 0 errors; the entry directory contains exactly one 40-hex value, the pinned commit, in all three places; the content repository passes agent config, skill frontmatter, heartbeat and result/account schema checks (19 checks) and has two commits (initial release plus the SOP failure-branch update) without account identifiers or credentials. ## 真机验证 / Real-device verification 在 DesireCore dev 构建(10.0.156 之后的 dev,含 #2863/#2865/#2869)上安装本提交的内容,智能路由旗舰档,两个账号各一个每小时定时巡检,连续观察四轮: | 轮次 | 结果 | 说明 | |---|---|---| | 账号 2 · 20:30 | ok | 经接口取到数据,`latest.json` 与本轮 history 文件通过 `result.schema.json`,history 先写、关闭会话、`latest.json` 最后写 | | 账号 1 · 21:00 | blocked(`platform_unavailable`) | 本机网络间歇断连期间内置浏览器开不了会话;如实落盘,未新建浏览器环境、未反复填表,首轮不提醒 | | 账号 2 · 21:30 | 失败 | 同一次断网里浏览器开不了会话,且 AI 审批上游持续 502,写 `latest.json` 被拒;平台按完成判据续跑一次后记为失败(已写入使用说明「已知限制」) | | 账号 1 · 22:00 | blocked,已提醒 | 连续第二轮 `platform_unavailable`,按告警规则 `notify=true`、告警项 `blocked:platform_unavailable` | 四轮都没有执行任何命令,没有非预期工具调用,没有写出 `mimo-quota/` 与平台 Plan 目录以外的文件;每轮的结果文件都通过 Schema 校验。浏览器宿主把导航失败统一报成 `BROWSER_HOST_EXECUTION_FAILED` 的问题已在主仓 #2871 修复(10.0.157 起提供 `BROWSER_NAVIGATION_*` 闭集错误码),本提交的 SOP 失败分支表已随之更新:网络类失败按码重试一次、页面跳转顶替(ABORTED)先看停留页再分流、越出授权范围(ORIGIN_NOT_GRANTED / SCHEME_DENIED)不新建 space。旧客户端上这些码不会出现,条目行为退回原有兜底,不受影响。 Installed this commit's content on a DesireCore dev build (dev after 10.0.156, including #2863/#2865/#2869) with smart routing at the flagship tier and one hourly schedule per account, and observed four runs. Account 2 at 20:30 read the data through the API; `latest.json` and the per-run history file passed `result.schema.json`, with history written first, the session closed, and `latest.json` written last. During a local network outage, account 1 at 21:00 could not open a browser session and recorded `blocked` / `platform_unavailable` without creating environments or retrying the login, and without notifying on the first round; account 2 at 21:30 hit the same outage plus sustained 502s from the AI approval upstream, so its `latest.json` write was denied and the run was recorded as failed after one platform continuation (now listed under known limitations); account 1 at 22:00 was the second consecutive `platform_unavailable` and notified with `blocked:platform_unavailable`. No run executed a command, called an unexpected tool, or wrote outside `mimo-quota/` and the platform Plan directory, and every result file passed schema validation. The browser host reporting all navigation failures as `BROWSER_HOST_EXECUTION_FAILED` was fixed in the main repository in #2871 (closed-set `BROWSER_NAVIGATION_*` codes from 10.0.157), and the SOP in this commit was updated accordingly: network-class failures retry once by code, a navigation replaced by a page jump (ABORTED) inspects the landed page before branching, and out-of-grant targets (ORIGIN_NOT_GRANTED / SCHEME_DENIED) never create a new space. On older clients these codes simply do not appear and the entry falls back to the previous behavior.
DesireCore Market
DesireCore 官方市场仓库,存放官方维护的 Agent/Team/Skill 定义,以及经过整理的第三方 Skill 入口。
Repository Shape
.
├── manifest.json # Market metadata, supported locales, aggregate stats
├── categories.json # Category registry and localized labels
├── builtin-skills.json # Built-in local SKILL.md skills
├── agents/
│ ├── desirecore/
│ │ └── agent.json
│ └── <agent-listing>/
│ ├── agent.json
│ ├── catalog-metadata.v1.json
│ └── USAGE.md # Optional usage notes (USAGE.<locale>.md for variants)
├── teams/
│ └── <team>/
│ └── entry.json
└── skills/
├── <local-skill>/
│ ├── SKILL.md
│ └── SKILL.<locale>.md
└── <external-entry>/
└── entry.json
The market currently contains:
5Agents:desirecore,dingtalk-workspace,feishu-orchestrator,invoice-organizer,wecom-assistant1Team:contract-review-team40local built-in skills withSKILL.md29external skill entries withentry.json69publishable skills in total (SKILL.md+entry.json)
Skill Sources
Local built-in skills are installable from this repository and must be listed in builtin-skills.json:
baidu-poi-search, ccgp-gov-procurement, clone-agent, cnipa-patent-search, code-intelligence,
configuring-compute, create-agent, creditchina-query, dashscope-image-gen, delete-agent,
dev-environment-setup, discover-agent, docx, frontend-design, guizang-ppt,
image-to-image, mail-operations, manage-skills, manage-teams, markdown,
minimax-music-gen, minimax-video-gen, multi-source-sentiment, nodejs-runtime, pdf, pptx,
presentation-forge, python-runtime, registering-services, s3-storage-operations, skill-creator,
tech-diagram, tianyancha-risk, update-agent, using-services, web-access, workflow, workforce-optimization,
xiaomi-tts, xlsx
builtin-skills.json#retired lists old built-in Skill IDs that clients may safely retire during
startup. Clients only remove copies tracked in skills.lock as market/bundled content whose
SKILL.md hash still matches the installed record; manually installed or locally modified copies
are preserved. An ID must not appear in both skills and retired.
External entries are marketplace pointers to Git/Web/ZIP sources:
agent-reach, ai-news-radar, amap-jsapi-skill, baoyu-skills, dingtalk-api,
dingtalk-cli, flyai-skill, follow-builders, humanizer, humanizer-zh,
ian-xiaohei-illustrations, impeccable, karpathy-guidelines, khazix-skills,
larksuite-cli, last30days, luckin-my-coffee, marketingskills,
mattpocock-skills, minimax-image-gen, minimax-tts, mt-paotui-for-client,
netease-skills, nuwa-skill, taste-skill, watch, watchless,
wechatpay-skills, wecom-cli
Data Formats
Local Skill (skills/<id>/SKILL.md)
Local skills use YAML frontmatter plus Markdown body. The top-level name must equal the directory slug. Display strings live in metadata.i18n.
---
name: web-access
description: >-
Use this skill when ...
version: 2.0.1
type: procedural
risk_level: low
status: enabled
metadata:
author: desirecore
updated_at: '2026-05-05'
i18n:
default_locale: en-US
source_locale: zh-CN
locales: [zh-CN, en-US]
zh-CN:
name: 联网访问
short_desc: 联网搜索、网页抓取、登录态浏览器访问
body: ./SKILL.zh-CN.md
translated_by: human
en-US:
name: Web Access
short_desc: Web search, page fetching, logged-in browser access
body: ./SKILL.md
source_hash: sha256:...
translated_by: human
market:
category: research
channel: latest
maintainer:
name: DesireCore Official
verified: true
---
External Entry (skills/<id>/entry.json)
External entries point to upstream packages or repositories. They are counted in manifest.stats.totalSkills but are not included in builtin-skills.json.
{
"id": "example-skill",
"name": "Example Skill",
"category": "development",
"icon": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">...</svg>",
"tags": ["example"],
"maintainer": {
"name": "Example",
"verified": false,
"account": "example",
"url": "https://github.com/example/example-skill"
},
"stewardship": "community",
"license": "MIT",
"redistribution": "allowed",
"source": {
"kind": "git",
"repoUrl": "https://github.com/example/example-skill.git",
"repoBranch": "main"
}
}
Team Listing (teams/<id>/entry.json)
A Team is a group of Agents with a supervisor. It is published as a fork pointer
only: the team body (team.json, members.json, shared/) always stays in the
upstream team repository, and the catalog registers just "what it is and where to
fork it from". Installation forks that repository and installs the declared members;
updates are a git pull on the fork. Because both actions are Git actions,
source.kind must be git and source.repoUrl is required — zip and web cannot
express either one — and a Team deliberately has no installPolicy /
updatePolicy pair: it is always market-initiated fork plus repository-driven update.
teams/<id>/ therefore holds exactly entry.json plus the sidecar. There is no
inline form; a team.json in the catalog is rejected.
{
"id": "example-team",
"name": "Example Team",
"category": "development",
"tags": ["example"],
"latestVersion": "0.1.0",
"maintainer": {
"name": "Example",
"verified": false,
"account": "example",
"url": "https://github.com/example"
},
"stewardship": "community",
"license": "MIT",
"redistribution": "source-pointer-only",
"source": {
"kind": "git",
"repoUrl": "https://github.com/example/example-team.git",
"repoBranch": "main",
"ref": "0123456789abcdef0123456789abcdef01234567"
},
"requiredClientVersion": "10.0.0",
"avatar": { "t": "示", "bg": "linear-gradient(135deg, #5856D6, #3634A3)" },
"supervisorName": "Example Supervisor",
"supervisorAgentId": "example-lead",
"memberCount": 3,
"memberNames": ["Example Member One", "Example Member Two"]
}
A Team card is rendered from avatar, not from icon. The client's runtime
projection marketTeamSchema requires avatar and has no icon property at all —
the same is true of marketAgentSchema, while only marketSkillSchema exposes
icon. The entry contract inherits icon from the shared common properties, so it
is accepted, but it can never reach a card. The validator therefore requires icon
on Skill listings only, and warns when an Agent or Team listing declares one.
redistribution stays source-pointer-only for a Team even under a permissive
license: the market never ships the team body, it only points at the repository the
client forks. The license governs what a fork may do; redistribution describes how
the content is delivered, and for teams that is always "fetch from upstream".
supervisorName, supervisorAgentId, memberCount, memberNames and
requiredSkills are display metadata declared by the publisher. They may drift from
the upstream repository, so installation, permissions and member resolution must read
the forked team.json / members.json instead. Teams are counted in
manifest.stats.totalTeams, which the client keeps optional: a catalog with no teams
may omit it, and once the key is present it must be exact.
Catalog metadata sidecar (catalog-metadata.v1.json)
The versioned catalog metadata contract is stored at one fixed path next to each legacy item:
agents/<id>/catalog-metadata.v1.json
teams/<id>/catalog-metadata.v1.json
skills/<id>/catalog-metadata.v1.json
Legacy agent.json, SKILL.md, and entry.json files remain the compatibility
surface for older clients. New clients merge the sidecar through a deterministic
adapter. Any field repeated in both files must have the same value; the validator
rejects drift rather than choosing one copy silently.
Agent listings support exactly one of agents/<slug>/agent.json (inline metadata)
or agents/<slug>/entry.json (an external pointer), alongside the sidecar. Missing
or simultaneous primary files are rejected. For a pointer, entry.id and sidecar
identity.id use the catalog directory slug and identity.kind is agent; the
upstream AgentFS agent.json.id remains its own UUID and must not be rewritten.
An agent listing may also carry an optional USAGE.md next to agent.json. The
client renders it as a separate "Usage" section on the agent detail page, kept
apart from fullDesc (which is persona text and also enters the agent's runtime
context). Localized variants use USAGE.<locale>.md, resolved through the same
fallback chain as the i18n block: requested locale, then i18n.source_locale,
then i18n.default_locale, then the unsuffixed file. Its scope is what a reader
needs before installing — prerequisites, authorization steps, capability and
safety boundaries — not full documentation; clients truncate overlong content.
Longer material belongs in a skill's references/ directory, which the agent
loads on demand. Listings without the file are unaffected and render no section.
Relative image references do not render on the detail page, so keep USAGE.md
text-only. See ADR-143 in the DesireCore repository.
Agent pointers first pass the complete raw client contract in
schemas/market-agent-entry.client.schema.json,
exported from marketAgentEntrySchema in the DesireCore repository at commit
18bbb86f62e1288b1f945209bed74ec72620a9d4. The schema's $comment records the
source blob as well. Refresh this generated snapshot from the TypeScript export
when changing client compatibility; do not replace it with permissive sidecar
validation. Version fields keep their original types and the client's supported
format. Installation/update policies must either both be absent (effective
market/market) or form a complete supported pair; the sidecar must preserve
that effective pair.
Agent pointer latestVersion maps to sidecar release.version; optional
requiredClientVersion, installPolicy, and updatePolicy must agree with the
sidecar compatibility/spec fields. Pointer source fields must describe the same
artifact as provenance.content, and maintainer maps to upstreamMaintainer.
An installable Agent pointer must itself pin source.ref (Git) or source.sha256
(Web/ZIP); an immutable ref supplied only by the sidecar cannot pin a mutable
entry. Existing immutable-source, license, governance-review and complete-coverage
checks still apply. Agent pointers do not receive the built-in Skill exceptions.
Agent 目录必须在 agent.json 内联元数据和 entry.json 外部指针中二选一,并提供 sidecar。
Pointer 原始 JSON 先通过固定客户端提交导出的完整 Schema;版本类型与格式、来源路径和策略组合不能由 sidecar 掩盖。
Pointer 的目录 slug、entry.id、sidecar identity.id 必须一致;上游 AgentFS 的 UUID 不改写。
安装/更新策略双缺省时有效值仍是 market/market,sidecar 不得将其改成系统条目。
latestVersion、最低客户端版本和安装/更新策略须与 sidecar 对齐;来源必须是同一个制品。
可安装指针自身必须固定 Git ref 或 Web/ZIP 摘要,不能只在 sidecar 宣称不可变版本。
现有许可、治理审查、不可变来源和完整覆盖门禁继续有效,不适用内置 Skill 的宽松例外。
Team listings are pointer-only, so teams/<slug>/ carries exactly entry.json plus
the sidecar; an inline team.json is rejected. Team pointers first pass the complete
raw client contract in
schemas/market-team-entry.client.schema.json,
exported from marketTeamEntrySchema the same way as the Agent snapshot; its
$comment records the source commit and blob. entry.id, the directory slug and
sidecar identity.id must agree, identity.kind is team, and latestVersion maps
to release.version. supervisorName, supervisorAgentId, memberCount,
memberNames, requiredSkills and requiredClientVersion are compared symmetrically:
the sidecar may neither drop a fact the pointer declares nor invent one it omits,
because the client reads the pointer and a version gate that exists only in the
sidecar would not gate anything. Pointer source fields must describe the same
artifact as provenance.content, and an installable Team pointer must itself pin a
full-SHA source.ref — a tag is not a reproducible pin, because a tag can be moved
to a different commit after the listing is reviewed.
团队条目只有指针形态:teams/<slug>/ 仅放 entry.json 与 sidecar,目录内出现 team.json 直接判非法。
Pointer 原始 JSON 先通过由 marketTeamEntrySchema 导出的完整客户端 Schema;
source.kind 恒为 git 且必须有 repoUrl,团队没有 installPolicy / updatePolicy 组合。
目录 slug、entry.id、sidecar identity.id 必须一致,identity.kind 为 team。
展示字段与最低客户端版本双向比对:sidecar 既不得丢弃指针声明的事实,也不得凭空补上指针没有的事实。
可安装团队指针自身必须固定完整 SHA 的 source.ref,tag 或分支不算可复现锁定。
The sidecar records source-owned presentation, release, timestamp, content
provenance, governance, compatibility, and type-specific facts. It deliberately
cannot declare catalogSourceId, catalog commit/path/trust, effective official
status, installation state, device state, health, URLs discovered at runtime, or
syncedAt. DesireCore injects trusted catalog provenance and runtime facts.
license.evidencePath, compliance.licenseEvidencePath and compliance.noticePath
resolve differently by item shape, because the schema constrains only the string
form. Vendored content (built-in Skills, inline Agents) ships inside this repository,
so the path is relative to the catalog item directory and the file must actually be
there — a missing file is an error. A pointer distributes nothing, so its evidence
can only be inside the upstream snapshot at the pinned revision; the validator cannot
read that offline, so it warns when such a claim is made against an unpinned pointer.
Pin source.ref to a full commit SHA and the claim becomes falsifiable by anyone who
fetches it.
Time facts are explicit known/unknown values. A known day uses
YYYY-MM-DD with precision: "day"; a known second uses an RFC 3339 UTC value
ending in Z with precision: "second". Never use the current date, clone time,
or synchronization time to fill an unknown catalog or release timestamp.
Collection children stay in their parent's sidecar. Each child declares the
canonical skill + parentId + id identity and its own release fact; a collection
parent may have an unknown version, and a child version must not be inferred from
the parent.
The strict source schema is
schemas/catalog-metadata.v1.schema.json.
Categories
Valid category slugs are declared in categories.json:
productivity, development, business, creative, design, media,
communication, research, data, management
Validation
Run these checks before submitting changes:
# Full market + i18n validation
uv run scripts/i18n/validate-i18n.py
# Catalog sidecar validator unit tests and standalone validation
uv run scripts/catalog/test_validate_catalog_metadata.py
uv run scripts/catalog/test_collection_generator.py
uv run scripts/catalog/validate_catalog_metadata.py
# Translation freshness check
uv run scripts/i18n/translate.py --check
# Verify pinned collection children without changing entry.json (network required;
# mutable collections are reported and skipped because their output is not reproducible)
uv run scripts/gen-collection-children.py --check
# Optional network check for entry.json source URLs
uv run scripts/i18n/validate-i18n.py --online
The validators check market stats, category references, builtin-skills.json,
entry.json structure, sidecar schema and legacy consistency, immutable source
evidence, collection identity, i18n completeness, and translation freshness.
Human-locked translations (translated_by: human) must keep source_hash
aligned after manual review. During a data migration,
scripts/catalog/validate_catalog_metadata.py --require-complete additionally
requires one sidecar for every top-level Agent, Team and Skill.
Detailed i18n guidance is in docs/I18N.md.
License
MIT License. See LICENSE.