Repository navigation
Releases: Lazarus-coder/echo-assistant
Release list
Echo v0.1.0-alpha.6 · proactive research & restrained awareness
Echo v0.1.0-alpha.6 — proactive research, and a quieter kind of awareness
Two lines of work land in this release: Echo can now research things it noticed you need — read-only, budgeted, cancellable — and it can hold a restrained sense of who you're talking to. Plus the product now keeps a written record of why it is shaped the way it is.
Download
| File | What it is |
|---|---|
| Echo-0.1.0-alpha.6-macos.dmg | macOS installer — universal binary (Apple Silicon + Intel), macOS 13+; Echo.app + installer + uninstaller + README. Runtime dependencies are bundled (MCP SDK + PDF.js) — installing works offline |
| Echo-0.1.0-alpha.6-macos.zip | same payload as a zip, if you prefer |
| echo-assistant-0.1.0-alpha.6.tar.gz | source tarball (any platform, Node ≥ 22.13 + npm; ./install.sh runs npm ci for you) |
| SHA256SUMS / SHA256SUMS-macos | checksums — shasum -a 256 -c SHA256SUMS-macos |
What's new
Noticing a need, then studying it — under supervision
- Discovery (
lib/discovery.mjs): background research is a separate switch you turn on explicitly. Echo finds candidate goals in new conversations, always citing the real user message, records what's missing (institution / programme / cycle / category / stage), de-duplicates, and keeps inferred cases for a seven-day confirmation window. An explicit completion message can close the matching goal and stop its reminders. Discovery is capped at 20 model calls per day; preparation at two attempts per goal and five per rolling 24 hours. - Research reuses the existing harness (
lib/research.mjs): searches, web pages, PDFs, explicitly attached documents and selected folders inside the enabled workspace — with a read-only tool allowlist, bounded calls and time, and no background Shell, MCP, or external writes. Runs keep their records, evidence, budgets and cancellation like any other run. - Deadlines are checked item by item (
lib/deadlines.mjs): the quoted source text, the identity it applies to, the full date, when it was checked, and any conflict are all kept. Only member-confirmed official domains may support a "verified" date, and a date-only source never implies a precise time or timezone. - Durable follow-up: date and source watches run together, failures retry, successful checks update the watch, footer-only changes are filtered out, milestones distinguish approaching / due-today / overdue, and stale evidence is withheld instead of being delivered.
A restrained sense of relationships
Expand Memory → 相处方式 to pick a tone (subtle by default, warm, direct) and whether you prefer listening or practical help. You may optionally keep a preferred name, communication boundaries and short notes for up to 12 people, hand-maintained. Echo uses at most three matching people when you mention them, or when a short follow-up refers to the immediately preceding message; current requests always outrank saved preferences.
What it deliberately does not do: no emotion profiles, no mood reminders, no psychological inference from your screen. lib/relationships.mjs stores only what you wrote.
Isolation, where untrusted input arrives
lib/pdf.mjs parses PDFs in a worker thread with the viewer and scripting layer off, capped at 5 MB / 40 pages / 15 seconds per document, so a malformed file can't stall the service. (Scanned PDFs without a text layer are reported as unreadable rather than guessed at.)
The product now explains itself
docs/product-journey.md records every phase of shaping this product from the very first request to now: what was decided, why, what was rejected — plus ten principles that carried across phases, and the open gaps. It is required to be updated with every release: the packager refuses to build when its 覆盖版本 line lags behind package.json.
Requirements changed
Node ≥ 22.13 (was 20) — required by the PDF.js parser. ./install.sh and the DMG installer both check it and explain what to do. Runtime dependencies are now @modelcontextprotocol/sdk + pdfjs-dist, both pinned in package-lock.json and bundled inside the DMG (46 MB) so a drag-install still needs no network.
Verification
- Frozen evaluator: 98/98 (
node tests/selftest.mjs) — unchanged design invariants, nothing loosened - Regression suites: all green (
npm run test:regressions), now including relationships (×4), discovery, commitment-research, research (×2) and proactive UI — 65 new checks in the proactive area alone - Packaging: source tarball →
npm ci→ evaluator passes inside it; DMG mounted → installed into a temporaryHOME→ evaluator passes from the installed copy →echo.envasserted mode 600 → bundled MCP dependency present - Every asset re-downloaded from this page and checksum-verified before this note was published
Known limitations (kept honest)
Research quality and miss rate have not been evaluated against real usage — no productivity claim is made. Nothing connects automatically to your browser, mail or calendar, and nothing is checked while the Mac is asleep. Approvals remain the safety net for anything that writes or runs; read them. Screen Recording is still granted once per app identity — install from the DMG rather than rebuilding to avoid being asked again. Interfaces and data formats may still change during alpha — back up data/ before upgrading.
Echo v0.1.0-alpha.5 · from talking to doing (workspace harness, commitments, MCP SDK)
Echo v0.1.0-alpha.5 — from talking to doing
Echo grew hands — carefully. This release adds a controlled workspace execution layer, a run harness with human approvals, commitment tracking, and moves MCP onto the official SDK. Dependencies now ship inside the DMG, so installing no longer requires fetching anything.
Download
| File | What it is |
|---|---|
| Echo-0.1.0-alpha.5-macos.dmg | macOS installer — universal binary (Apple Silicon + Intel), macOS 13+; Echo.app + installer + uninstaller + README. Includes locked runtime dependencies — installing works offline |
| Echo-0.1.0-alpha.5-macos.zip | same payload as a zip, if you prefer |
| echo-assistant-0.1.0-alpha.5.tar.gz | source tarball (any platform, Node ≥ 20 + npm: ./install.sh runs npm ci for you) |
| SHA256SUMS / SHA256SUMS-macos | checksums — shasum -a 256 -c SHA256SUMS-macos |
What's new
Workspace harness — doing, with permission
- Workspace execution (
lib/workspace.mjs): file reads/writes and command runs scoped to a validated workspace root — path-escape checks, 1 MB read / 2 MB output caps, serialized writes, and abort propagation that reaches the child process. - Run orchestration (
lib/harness.mjs): every task becomes a run underdata/runs/<id>/run.jsonwith a real state machine (completed / failed / cancelled / interrupted). Anything that writes, runs, or leaves the machine goes through an approval — single-use, survives a failed attempt so you can retry with the error visible, and cannot be re-approved once the run is terminal. Restarting Echo never replays finished work; in-flight approvals expire cleanly as interrupted. - Cancellation end to end: stopping a run propagates through search, the gateway's hosted search, image generation (before and during the asset download), web fetches (body and DNS), and local file writes — each with its own regression case. Cancelled work makes no further network requests and never leaves a partial file.
Commitment tracking
lib/commitments.mjs reads conversations for things you said you would do — not the assistant's to-do list, yours — and keeps them with a background worker and an API. It is the same idea as the follow-up ledger in proactive mode, but first-class, inspectable, and editable.
MCP on the official SDK
The hand-rolled JSON-RPC client is gone: lib/mcp.mjs now uses @modelcontextprotocol/sdk (stdio + Streamable HTTP, pinned to 1.32.1 via package-lock.json). That means standards-compliant transports, but it also means the app has one runtime dependency — and this release treats that as a packaging problem, not the user's problem:
./install.shrunsnpm ci --omit=dev --ignore-scriptsbefore touching the service, and refuses to proceed if the dependency install fails;- the DMG bundles
node_modules(16 MB dmg), so a drag-and-install works offline; the packaging script asserts the vendored dependency actually imports and that the installed copy contains it; - the source tarball must contain
package-lock.json— the packager now refuses to publish without it.
Also
lib/attention.mjs: quiet hours / local-date logic shared instead of duplicated across features.- Front end and menu bar grew the surfaces for runs, approvals, artifacts, goals and commitments; mini window and menu-bar states kept in sync.
Verification
- Frozen evaluator: 98/98 (still the same 98 design invariants — the new work did not loosen a single one)
- Regression suites: 12 files, all green (
npm run test:regressions) — frontend, backend, companion, commitments (API + logic), agency, workspace, MCP, harness ×3, cancellation - Packaging: source tarball extracted →
npm ci→ evaluator passes inside it; DMG mounted → installed into a temporaryHOME→ evaluator passes from the installed copy →echo.envasserted mode 600 → vendored MCP dependency present - Every asset re-downloaded from this page and checksum-verified
Known limitations
Unchanged from alpha.4: Screen Recording is granted once per app identity (roads: install from the DMG, don't rebuild); scrape search can be rate-limited by its engines; video / ASR / TTS depend on your endpoint; retrieval is lexical plus an entity graph; the app is unsigned (macOS asks once — right-click → Open). Approvals are the safety net for the new execution features: read them before approving, especially anything that writes files or runs commands. Interfaces and data formats may still change during alpha — back up data/ before upgrading.
Echo v0.1.0-alpha.4 · less interruption (bubbles don't repeat, permissions don't nag)
Echo v0.1.0-alpha.4 — less interruption
A small release that exists because of one piece of feedback: "it asks for permission again every time, and the interruptions are too much." Both halves were real bugs, and both are fixed.
Download
| File | What it is |
|---|---|
| Echo-0.1.0-alpha.4-macos.dmg | macOS installer — universal binary (Apple Silicon + Intel), macOS 13+; Echo.app + double-click installer + uninstaller + README (中文/EN) |
| Echo-0.1.0-alpha.4-macos.zip | same payload as a zip, if you prefer |
| echo-assistant-0.1.0-alpha.4.tar.gz | source tarball (any platform, needs Node ≥ 20) |
| SHA256SUMS / SHA256SUMS-macos | checksums — shasum -a 256 -c SHA256SUMS-macos |
What was wrong, and what changed
1. The same bubble kept coming back
When a bubble auto-faded after 12 seconds it stayed in the server's pending queue, so the next poll (every 20 seconds) floated it again — the same card, over and over. Now:
- auto-fade marks the bubble
expired— it never reappears, and it does not count toward the "you kept ignoring me" back-off (you didn't reject it, you just didn't look); /api/companion/pendingacceptssince=<timestamp>, and the menu-bar app only asks for bubbles created after it started — so restarting Echo no longer resurrects old cards.
2. macOS kept asking for Screen Recording
Screen Recording is granted per app identity. The menu-bar app was running from a path that got rebuilt during development, and an unsigned binary that changes is — as far as macOS is concerned — a different app. Fixes:
- the app now installs to a fixed path (
~/Library/Application Support/Echo/Echo.app) with a fixed bundle id, ad-hoc signed by the installer and by the packaging script; ./install.shskips rebuilding the binary when an installed app is present (rebuilding is what triggers the re-prompt; the docs now say so plainly);- Echo never initiates a permission dialog: without the grant it skips captures, logs that fact, and shows a single
⚠️ item in the menu — nothing pops up until you click it.
3. Quiet by default
Screen awareness and companion mode are both off in this release's defaults (they had been switched on during testing). Turn either on from Settings or the menu-bar menu when you actually want it.
Verification
- Offline suite: 98/98 — including three new lifecycle checks: an expired bubble is not re-presented, expiry does not feed the dismiss back-off, and
pending?since=filters correctly. - Live suite: 104/104 (
--live). - The DMG is verified by its own build script: mount → install into a temporary
HOME→ run the evaluator from the installed copy → assertecho.envis mode 600.
Read the longer story in docs/permissions.md (§2b–2c) and the iteration log (docs/rsi-log.md).
Everything else is unchanged from alpha.3: companion mode, prompt polish (⌘⇧P), layered memory with explainable forgetting, proactive bandit loop, BYOK onboarding, pluggable search. Interfaces and data formats may still change during alpha — back up data/ before upgrading.
Echo v0.1.0-alpha.3 · companion mode & prompt polish
Echo v0.1.0-alpha.3 — companion mode & prompt polish
Download
| File | What it is |
|---|---|
| Echo-0.1.0-alpha.3-macos.dmg | macOS installer — universal binary (Apple Silicon + Intel), macOS 13+; Echo.app + double-click installer + uninstaller + README (中文/EN) |
| Echo-0.1.0-alpha.3-macos.zip | same payload as a zip, if you prefer |
| echo-assistant-0.1.0-alpha.3.tar.gz | source tarball (any platform, needs Node ≥ 20) |
| SHA256SUMS / SHA256SUMS-macos | checksums — shasum -a 256 -c SHA256SUMS-macos |
What's new
Companion mode (opt-in, off by default)
Proactive agency is about timing; companion mode is about presence. Turn it on and Echo watches along with you — capture frequency goes from minutes to seconds — and occasionally floats a bubble in the corner of your screen. Not a notification, not a window that steals focus: a small card that fades on its own unless you hover. Click it and a small chat window opens on that exact topic, with its own conversation you can keep talking in.
Scenarios, each with its own voice: chatting (reads the thread, judges tone/relationship, offers a copyable line) · watching a film or video (watches along as a friend — one feeling, one piece of trivia, no lecture) · working (one concrete suggestion: next step, easy-to-miss detail, number to double-check) · writing code (an API detail, an edge case, a shorter way).
Discipline that keeps it from becoming a nag:
- Change detection first — if the screen looks the same as the last frame, nothing is sent to the model at all. That is what makes watching every 20 seconds affordable and what stops it repeating itself.
- Budget, gap, back-off — bubbles per hour, a minimum gap between them, and three dismissals in a row silence it for a while.
- Never steals focus — bubbles expire on their own, hover pauses the timer, and the menu bar has an instant pause 30 minutes.
- Same privacy posture as screen awareness — on-device OCR, text only, screenshots deleted after analysis, block-list respected, opt-in only.
Bubbles carry their own reasoning: the card is one line, and the conversation it opens starts with why it thought that was worth saying. Opening and dismissing both feed the self-report.
Prompt polish (⌘⇧P)
Type the half-sentence you actually have — "那个部署脚本老是超时,帮我看看" — and hit polish. A small chain-of-thought pass reads the conversation tail, the recalled facts that genuinely overlap your draft, and what you're doing right now, then guesses your intent, lists the gaps, and rewrites the request at a usable granularity. Modes: expand / keep / tighten. You see the intent, the gaps and the assumptions (all editable) and either replace your draft or send directly.
Your input is never silently rewritten, and it will not invent objects: if the draft is too vague it asks you what to look at instead of guessing from memory. A deterministic guard re-runs without memory if a memory-only name ever leaks into the text.
Fixes
pausedUntilwas compared as a string against a timestamp — pausing companion mode (and the automatic back-off) did nothing at all. Now: a paused frame returnsskipped: paused.- Throttled companion frames polluted the change-detection baseline — a frame skipped for budget/gap used to become the comparison baseline, so the same screen (e.g. sitting in a chat window) was permanently judged "unchanged" and never got another chance. Only frames actually judged by the model update the baseline now.
- Multi-file Swift build (
main.swift) and unbuffered stdout so launchd logs land in real time. - Missing README anchors, plus repo metadata in English.
Verification
- Offline suite: 95/95 (
node tests/selftest.mjs— sandboxed, own data dir + config) - Live suite: 104/104 (
--live: real chat, search, vision, image generation, entity graph, event replay) - New J track (11 checks) covers the companion pipeline end to end: change detection without a model call, budget, gap, per-scenario switches, dismiss back-off, pause, bubble→conversation, and metrics.
- The macOS package is verified by the build script itself: mount the DMG → install into a temporary
HOME→ run the evaluator from the installed copy → assertecho.envis mode 600.
Known limitations (unchanged)
Screen Recording must be granted once from the menu-bar icon; scrape search can be rate-limited (circuit breaker cools down and hands off); video / ASR / TTS depend on your endpoint; retrieval is lexical plus an entity graph (no embeddings); the app is unsigned, so macOS asks once — right-click → Open, or strip the quarantine flag yourself. Interfaces and data formats may still change during alpha — back up data/ before upgrading.
Echo v0.1.0-alpha.2 · BYOK, pluggable search, memory profiles
Download
| File | What it is |
|---|---|
| Echo-0.1.0-alpha.2-macos.dmg | macOS installer — universal binary (Apple Silicon + Intel), macOS 13+; Echo.app (menu-bar icon, own icon and bundle id) + double-click installer + uninstaller + README (中文/EN) |
| Echo-0.1.0-alpha.2-macos.zip | same payload as a zip, if you prefer |
| echo-assistant-0.1.0-alpha.2.tar.gz | source tarball (any platform, needs Node ≥ 20) |
| SHA256SUMS / SHA256SUMS-macos | checksums — shasum -a 256 -c SHA256SUMS-macos |
The macOS installer puts everything in ~/Library/Application Support/Echo (app + data + logs, all plain files), registers two launchd agents (service + menu-bar icon), asks for your endpoint/key (skippable — there is a browser wizard), and only removes its quarantine flag after asking you. Uninstall = double-click Uninstall Echo.command (it asks before deleting data).
The app is unsigned, so macOS asks once before it can run — right-click → Open, or remove the quarantine flag yourself. For scripted installs: --target DIR --no-launchd --no-open --yes, plus OPENAI_BASE_URL / OPENAI_API_KEY / ECHO_PASSWORD env vars.
Roadmap (including planned computer use): see the repo front page → Roadmap.
What's new in alpha.2 — modular, BYOK-first
Alpha.1 worked, but it showed its author's fingerprints: a vendor gateway baked in as the default, a hard-coded search stack, and no guided setup. Alpha.2 moves all of that into configuration and a first-run wizard, so the same code runs on anyone's endpoint and anyone's search service.
Bring your own everything
- No vendor default.
upstream.baseUrlstarts empty; keys live only indata/echo.env(mode 600) andconfig.jsonrecords which environment variable to read, never a secret. - Six-step onboarding: endpoint preset (OpenAI · Aliyun Bailian · DeepSeek · Moonshot · OpenRouter · Ollama · custom) → test & fetch models → default / utility / image model → memory profile → search chain → permissions (residency,
swiftc, bind, optional password, screen-recording test). - Re-runnable from Settings → 引导与权限; skippable entirely if you prefer editing
data/echo.envyourself.
Search is a chain you configure
none · scrape · gateway · tavily · brave · bocha · searxng · custom — ticked providers are tried in order, and a failure hands off to the next one. Keys come from environment variables named in the provider catalog. The circuit breaker (cool-down after a captcha or repeated failures) is visible in the self-report and in ./bin/echo search.
Memory has profiles
off (stateless) · light (facts only) · standard (facts + Dream + proactivity) · deep (standard + screen awareness). Choosing a profile writes the concrete knobs, so "profile" and "values" can never disagree.
Permissions are documented and checkable
GET /api/permissions reports endpoint status, launchd residency, swiftc, bind address and data directory; POST /api/permissions/screen-test actually attempts a capture to tell you whether Screen Recording is granted. Full guide: docs/permissions.md.
Fixes
- Choosing a memory profile had no effect (the preset patch was merged into the wrong section).
- Stored API keys could not be cleared (
writeEnvValuesskipped empty values;""now means delete). install.shno longer defaults to a specific vendor gateway.- Settings PATCH responses crashed when the onboarding state helper was referenced from module scope.
Verification
tests/selftest.mjs grew a new track (H — modularity & onboarding, 17 checks): provider-catalog completeness, "no vendor default" invariant, onboarding writes keys to echo.env with 0600 and nothing secret into config.json, profile expansion, none actually removing the web tools, and image_gen disappearing when no image model is configured. Offline suite: 69/69.
Install
tar -xzf echo-assistant-0.1.0-alpha.2.tar.gz
cd echo-assistant-0.1.0-alpha.2 && ./install.shThen open http://127.0.0.1:8787 and follow the wizard. Verify the download with:
shasum -a 256 -c SHA256SUMSKnown limitations (unchanged)
Screen Recording must be granted once from the menu-bar icon; scrape search can be rate-limited by its engines (it cools down and hands off); video / ASR / TTS depend on your endpoint exposing them; retrieval is lexical plus an entity graph (no embeddings); interfaces and data formats may still change during alpha — back up data/ before upgrading.
Rebuilt the same day (same version): fixed a self-test assertion that assumed an existing local config — a fresh clone now runs node tests/selftest.mjs to 69/69 — and removed an internal product name from a code comment. No functional change.
Echo v0.1.0-alpha.1 · 跑在自己 Mac 上的私人对话窗口
v0.1.0-alpha.1
第一个公开 alpha。功能完整可用、日常已经在用,但接口与数据格式仍可能变;升级前请备份
data/。
这是什么
跑在你自己 Mac 上的私人对话窗口:调你自己的 OpenAI 兼容 API(已在阿里云 token plan 网关验证),长期常驻、局域网可用、状态栏有图标。零第三方依赖(只用 Node 内置模块 + 一个本地编译的 Swift 菜单栏 App),所有数据都是 data/ 下的明文文件。
本版能力
分层记忆与可解释遗忘
- L0 工作记忆(屏幕活动,TTL 90 分钟)→ L1 事实(强度 = 重要度 × 使用增益 × 时间衰减)→ L2
MEMORY.md(每次对话注入,可手改)→ L3 归档与实体图。 - 命中强化(间隔重复)、久用不到淡出(可复活)、超容量按强度淘汰;每次遗忘都写进
memory/forgetting.md,说明忘了什么、为什么、依据哪个数字。 - Dream(定时 + 手动):重写核心记忆、调和事实、明确遗忘过期项、复活误淡项、产出跟进事项与主动话题、刷新实体图、留审计快照。
主动服务(可测量的闭环)
- 固定主对话跨模型连续;Thompson 采样 bandit 选开口类型,奖励 = 你 6 小时内是否接住(未回应按 0 结算);门槛随表现自适应;台账按 EV 排序挑跟进事项;静默时段 / 每日预算 / 最小间隔 / 连续未回应降速。
- 离线回放显示比固定策略高 31–51% 的被接住率(模拟值);真实接住率在自报告里可见。
屏幕感知(默认关,隐私优先)
- 菜单栏 App 采集 + Apple Vision 本地 OCR,默认只把文字发模型;原始截图分析完即删。
- 锁屏、键鼠空闲自动跳过;屏蔽名单默认空,由你自己填;识别到敏感内容只记"在处理敏感信息"。
- 屏幕工作记忆只用于当下判断,不做可回看的录像库。
对话与多模态(按网关实测适配)
- 流式输出、思考过程折叠、工具调用步骤可见、来源 chips、重新生成、编辑重发、会话置顶/导出、令牌用量、深浅色、移动端适配。
- 模型 13 个(千问 / DeepSeek / 智谱,带视觉标记)、
auto路由;图片输入(粘贴/拖拽/上传,客户端压边);出图工具image_gen(结果落盘本地,OSS 链接会过期)。 - 搜索:360/Bing 抓取(完整浏览器头 + 熔断冷却)→ 阿里云托管
web_search(tool_choice:"required"+ 关思考,实测 3–8s 带 sources)。
工程与安全
- 磁盘预算:截图 200MB / 3 天、生成图片 300MB / 60 天,超 80% 从最旧删;最近对话引用到的图片永不删;每 6 小时自动维护。
- 模型降级链、上下文预算 + 滚动摘要、
metrics.jsonl自报告(P50/P95、工具成功率、失败 Top、接住率)。 - 免登录(本机自用)默认;
./bin/echo auth on可开口令验证。写操作要求自定义请求头(防跨站打额度);web_fetch有 SSRF 防护;渲染白名单转义。 - 隐私兜底:界面一键"全部忘掉"(清空记忆,或连会话一起),并在遗忘日志留一条可解释记录。
自测
node tests/selftest.mjs:60 项断言,冻结判据,隔离沙箱(自己的数据目录与配置),覆盖安全不变量、记忆/遗忘数学、存储预算、决策算法、真实链路。--live会真的调用模型。
安装
tar -xzf echo-assistant-0.1.0-alpha.1.tar.gz
cd echo-assistant-0.1.0-alpha.1
./install.sh # 凭据 → 口令(可跳过) → launchd 常驻 → 编译状态栏图标
./bin/echo status要求:macOS + Node ≥ 20(用了内置 fetch / 顶层 await);屏幕感知与状态栏需要 Xcode Command Line Tools(swiftc)。API Key 从你的登录 shell 读取(或手动贴入),写在 data/echo.env(0600)。
已知限制
- 屏幕录制授权:首次需在「系统设置 → 隐私与安全性 → 屏幕录制」里勾选 EchoBar(菜单栏图标里有一键跳转)。
- 抓取搜索会被第三方限流:360/Bing 会把人机校验招呼上(本机 IP 被限流后 10 分钟内自动熔断、转托管搜索)。
- 语音 ASR / TTS、视频生成:该网关未开放(实测返回空响应 / InternalError /
url error),配置里预留。 - 检索是词法的(BM25 + 实体加权),无向量检索;实体图无双时态;bandit 无上下文特征;屏幕是定时快照而非事件流。
- 接口与数据格式在 alpha 期间可能变;无自动迁移脚本,升级前备份
data/。
校验
shasum -a 256 -c SHA256SUMS发布件由 git archive 生成,只含 git 跟踪文件;打包脚本会在临时目录解包并跑一遍离线自测,同时断言包内不含 data/、凭据与构建产物。