sgme-zcode · git:20261102.cbe83bb · 2026-11-02 · sha256 6e226286704e9610
sgme-zcode git:20261102.cbe83bbB
Immutable. This exact content never changes and is served at /api/v1/blob/6e226286704e9610.
---
name: sgme-zcode
description: ZCode 的 SGME(拾光记忆)官方适配器。当对话涉及「以前/上次/还记得/历史事实」、要求记住某事、需要关怀信号/角色扮演、读写 SGME 记忆/知识/技能、触发提炼或画像注入、补导入历史会话时使用。接入标记:SGME-ONBOARDING-v2。不适用于与 SGME 无关的通用问答。
---
# SGME 接入纪律(SGME-ONBOARDING-v2 · ZCode)
你(ZCode)已接入长期记忆引擎 SGME(ShiGuang Memory Engine)。职责:把会话提炼成标签化记忆,按场景注入回来,让你不再失忆。
> 本技能是 SGME 官方适配器(源码 `adapters/zcode/`;本目录为部署副本,由 `install.py` 同步,可随时重建)。
> **能力面 = CLI 命令面**:下方矩阵 54 个基准能力一个不少。
> **优先用本会话已挂载的 MCP 工具**(`mcp__sgme__*`,由 `~/.zcode/cli/config.json` 的 `sgme` server 提供);无 MCP 或要脚本化时再走 CLI。
> 本机 agent_id = `zcode`(服务端已注册)——不要借用其它 agent 的 key。
## 服务发现(找不到 SGME 时按序)
1. 环境变量 `SGME_HTTP_URL` / `SGME_BASE_URL`、`SGME_MCP_URL`
2. 同目录部署配置 `scripts/client.env`(`install.py` 写入)
3. 本机身份文件 `~/.sgme/zcode-agent.json`(`http`/`mcp`/`agent_id`)
4. **ZCode 自己的 MCP 配置 `~/.zcode/cli/config.json` 的 `sgme` server**——install.py 注册后自动继承地址与密钥
5. `~/.sgme/install.json`(SGME 通用服务发现清单)
6. 回环默认 `http://127.0.0.1:9910`(MCP 同主机端口 +3 `/mcp`)
7. 探测 `GET /v1/health`;仍失败 → 报告「SGME 未发现」
端点自检:`python scripts/sgme_client.py env-info`(不打印密钥)。
## 接口与鉴权
| 项 | 值 |
|---|---|
| HTTP / MCP | 见上「服务发现」 |
| 请求头 | `X-API-Key` |
| agent_id | `zcode`(服务端已注册,溯源打标用) |
| agent 能力面 | 密钥按序解析:`SGME_ZCODE_KEY` → 部署副本 `scripts/.env` → `~/.sgme/zcode-agent.json` → `~/.zcode/cli/config.json` 的 `sgme` server → `SGME_AGENT_KEY`(兜底) |
| 写侧/管理 | `SGME_ADMIN_KEY`(`skill_put`/`skill_delete`/`skill_rename` 服务端强制) |
| 自检 | `python scripts/selfcheck.py` |
密钥只读、不硬编码、不回显、不写入对话。
> ⚠️ **本机已知坑**:`SGME_AGENT_KEY` 在本机环境里可能是**其它 agent 的 key**
> (实测绑定 `agent_id=dsh`)。因此它被降为**最后兜底**;正常路径走
> `SGME_ZCODE_KEY`(install.py 注册 `agt_*` key 后写入部署副本 `scripts/.env`)。
> 若发现写入的记忆 agent_tag 不对,先跑 `env-info` 看密钥来源。
## 使用纪律(五条铁律)
1. **每轮对话结束 `append` 当前轮次**——同一会话同一 `session_key`(建议 `zcode-<日期>-<项目>`,如 `zcode-20260926-sgme`)。
2. **会话结束 `refine-trigger`**(永远 async)。
3. **对话开始 `inject` 取画像 / `search` 检索相关记忆**。
4. **主动关怀靠消费信号**:`signal-pull` → `signal-claim` → 关怀 → `signal-ack`。可选 `care_watch.py pull` 轮询。
5. **对话开始(或用户指定角色)`role-list` → `role-assemble`**——换皮不换芯。
## 强制查询
涉及用户/项目历史事实(之前/以前/上次/还记得…),必须先 `search` 再回答;查不到如实说「记忆库中未找到」。
## 写入格式
`append` content 首行必须是 `# {ISO时间戳} {role}`(客户端自动生成)。
## 批量提炼纪律
≥20 文件分批(每批 ≤20)+ 批间 30–60 秒;429 不立即重试;永远 async。
## 三池主动登记
用户要办的事 → `demand-create --project-id <大写英文>`;创意 → `idea-add`;立项 → `project-register`(`project_id` **一律大写**)。
## 通信渠道(兜底铁律)
任何主动消息(关怀/提醒/告警)无论是否发到其它通道,**必须在当前会话也发一条**,直到用户明确取消。
## 事件对接
事件三类:`care_*` / `memory_updated` / `anomaly_warn`。接法:SSE `GET /v1/events/stream`(`subscriber_id=zcode`)、游标 `events-pull`、`signal-pull`。
## 历史会话补导入(ZCode 特有)
ZCode 主会话存于本机 `~/.zcode/cli/db/db.sqlite`(`import_history.py` 只读打开):
```bash
python <repo>/adapters/zcode/import_history.py --dry-run # 预览候选会话
python <repo>/adapters/zcode/import_history.py # 全量补导入(已导入自动跳过)
python <repo>/adapters/zcode/import_history.py --refine # 导完触发异步提炼
```
幂等可重跑(`session_key=zcode-<sess_id>` 已存在即整段跳过);只取 user/assistant 的 text 分片;≥20 文件遵守批量提炼纪律。
## 能力矩阵(优先 MCP;CLI 兜底)
HTTP 层零依赖;MCP 层需 mcp 库,用 `<project-root>/.venv/Scripts/python.exe scripts/sgme_client.py …`。
核对:`sgme_client.py capabilities`。
| # | 能力 | 层 | 命令(或 MCP 同名工具) |
|---|---|---|---|
| 1 | agent_onboarding | MCP | `agent-onboarding` |
| 2 | append | HTTP | `append --session <key> --text "……"` |
| 3 | inject | HTTP | `inject --mode daily\|coding\|work\|full` |
| 4 | search | HTTP | `search "<query>" --scopes memory,skills,wiki` |
| 5 | answer | HTTP | `answer "<问题>"` |
| 6 | wiki_search | HTTP | `wiki-search "<q>"` |
| 7 | wiki_pages | HTTP | `wiki-pages` |
| 8 | wiki_page | HTTP | `wiki-page <page_id>` |
| 9 | wiki_page_add | HTTP | `wiki-page-add --title … --content …` |
| 10 | wiki_page_update | HTTP | `wiki-page-update --page-id … --content …` |
| 11 | wiki_evolve_trigger | MCP | `wiki-evolve-trigger` |
| 12 | memory_get | HTTP | `memory-get <id>` |
| 13 | memory_reject | HTTP | `memory-reject <id> --reason …` |
| 14 | memory_unreject | HTTP | `memory-unreject <id>` |
| 15 | refine_trigger | MCP | `refine-trigger` |
| 16 | refine_batch | MCP | `refine-batch` |
| 17 | refine_status | MCP | `refine-status` |
| 18 | review_list | MCP | `review-list --limit 50 [--offset 0] [--dimension <维度>]` |
| 19 | review_approve | MCP | `review-approve <id> [--note …]` |
| 20 | review_reject | MCP | `review-reject <id> --reason …` |
| 21 | review_auto_resolve | MCP | `review-auto-resolve --days 7` |
| 22 | stats | MCP | `stats` |
| 23 | health | HTTP | `health` |
| 24 | config_get | MCP | `config-get` |
| 25 | config_update | MCP | `config-update` |
| 26 | idea_add | MCP | `idea-add` |
| 27 | demand_create | MCP | `demand-create` |
| 28 | project_register | MCP | `project-register` |
| 29 | signal_pull | MCP | `signal-pull` |
| 30 | signal_claim | MCP | `signal-claim` |
| 31 | signal_ack | MCP | `signal-ack` |
| 32 | signal_clear | MCP | `signal-clear` |
| 33 | role_list | MCP | `role-list` |
| 34 | role_assemble | MCP | `role-assemble` |
| 35 | role_active_get | MCP | `role-active-get` |
| 36 | role_active_set | MCP | `role-active-set` |
| 37 | persona_fill | MCP | `persona-fill` |
| 38 | guard_reply | MCP | `guard-reply <role_id> "<reply>" [--session-id <sid>]` |
| 39 | skill_search | HTTP | `skill-search` |
| 40 | skill_digest | HTTP | `skill-digest` |
| 41 | skill_get | HTTP | `skill-get` |
| 42 | skill_materialize | HTTP | `skill-materialize`(返回 path + sha256;落盘在服务端文件系统,跨机改用包通道 `fetch <name> <dest_dir>`) |
| 43 | skill_list | HTTP | `skill-list` |
| 44 | skill_coldstart | HTTP | `skill-coldstart` |
| 45 | skill_put | MCP | `skill-put` |
| 46 | skill_delete | MCP | `skill-delete` |
| 47 | skill_rename | MCP | `skill-rename` |
| 48 | credential_list | HTTP | `credential-list` |
| 49 | credential_get | HTTP | `credential-get <name>`(⚠️ 值不得进入对话正文——标准姿势 sgme_cred.py run 注入) |
| 50 | skill_catalog_version | HTTP | `skill-catalog-version`(两级缓存第 1 级,<100 字节) |
| 51 | skill_manifest | HTTP | `skill-manifest <name>`(package_sha256 + 附件清单 files[]) |
| 52 | skill_file_get | HTTP | `skill-file-get <name> <relpath>`(文本回原文;二进制只回摘要) |
| 53 | skill_file_put | HTTP | `skill-file-put <name> <relpath> --file <path>`(白名单目录;需管理员 Key) |
| 54 | skill_lint | HTTP | `skill-lint <name> --file <path>`(只校验不入库;需管理员 Key) |
扩展命令:`fetch <name> <dest_dir>`(跨机取技能完整包:两级缓存(目录版本短路 + package_sha256 比对,命中零下载)→ 未命中才下载 → MANIFEST 校验 → 安全解包;失败不留残件) / `events-pull` / `events-after` / `wiki-raw` / `capabilities` / `env-info` / `mcp <tool> k=v …`。
## 主动关怀守护(可选,默认不启用)
ZCode 是会话型 agent(无常驻进程);需要时手动跑或挂系统定时任务:
```bash
python scripts/care_watch.py pull # 拉一次未消费关怀信号
python scripts/care_watch.py claim <event_id> # 认领(关怀前)
python scripts/care_watch.py ack <event_id> acked # 消费回执
```
有输出(非「暂无」)时:claim → 关怀主人 → ack;认领失败 = 已被其它 agent 消费,跳过即可。