evolcore 0.0.35 → 0.0.36
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +31 -0
- package/README.md +6 -0
- package/bin/install-codex-managed-hooks.mjs +20 -3
- package/dist/agents/baseagent-availability.js +1 -1
- package/dist/agents/baseagent.js +88 -0
- package/dist/agents/claude-runner.js +59 -12
- package/dist/agents/codex/app-server-client.js +18 -1
- package/dist/agents/codex-runner.js +262 -21
- package/dist/agents/ecagent-runner.js +47 -11
- package/dist/agents/gemini-runner.js +36 -12
- package/dist/aun/aid/client.js +4 -3
- package/dist/aun/aid/control-aid.js +270 -8
- package/dist/aun/aid/identity.js +6 -3
- package/dist/aun/aid/ownership-operation.js +58 -0
- package/dist/aun/aid/store.js +1 -0
- package/dist/aun/group/fs-download.js +67 -2
- package/dist/aun/group/history.js +20 -5
- package/dist/aun/group/operations.js +8 -2
- package/dist/aun/menu/client.js +39 -2
- package/dist/aun/menu/transport.js +1 -1
- package/dist/aun/msg/history.js +43 -4
- package/dist/aun/msg/managed-operation.js +30 -53
- package/dist/aun/msg/p2p.js +51 -15
- package/dist/aun/outbox.js +4 -0
- package/dist/channels/aun.js +260 -73
- package/dist/channels/daemon.js +6 -4
- package/dist/channels/feishu.js +3 -0
- package/dist/cli/agent-command.js +161 -223
- package/dist/cli/agent-create.js +190 -223
- package/dist/cli/agent.js +3 -1
- package/dist/cli/aid-bind-command.js +53 -0
- package/dist/cli/aun-commands.js +384 -91
- package/dist/cli/bench.js +1 -1
- package/dist/cli/cli-argv.js +74 -0
- package/dist/cli/daemon-commands.js +105 -74
- package/dist/cli/diag.js +1 -1
- package/dist/cli/fs-command.js +18 -19
- package/dist/cli/getmeta-command.js +159 -6
- package/dist/cli/index.js +6 -12
- package/dist/cli/init-channel.js +8 -55
- package/dist/cli/init.js +125 -218
- package/dist/cli/queue-command.js +11 -8
- package/dist/cli/restart-monitor.js +134 -48
- package/dist/cli/session-command.js +1 -1
- package/dist/cli/stats.js +7 -5
- package/dist/cli/thread-command.js +103 -30
- package/dist/cli/trigger-command.js +1 -1
- package/dist/cli/watch-msg-diag.js +1 -0
- package/dist/config/access-policy.js +2 -2
- package/dist/config/boot-log.js +14 -11
- package/dist/config/config-field-policy.js +9 -1
- package/dist/config/config-manager.js +176 -90
- package/dist/config/config-operation-service.js +7 -14
- package/dist/config/contact-book-store.js +142 -26
- package/dist/config/contact-book.js +4 -2
- package/dist/config/lifecycle.js +1 -1
- package/dist/config/owner-config.js +96 -0
- package/dist/config/peer-role-resolver.js +12 -18
- package/dist/config/providers-config.js +382 -0
- package/dist/config/providers-import.js +74 -0
- package/dist/config/providers-management.js +328 -0
- package/dist/config/providers.js +22 -0
- package/dist/config/resolved-config-op.js +17 -14
- package/dist/config/snapshot.js +28 -16
- package/dist/config-store.js +18 -14
- package/dist/core/agent-ipc-registration.js +21 -63
- package/dist/core/agent-runtime.js +16 -5
- package/dist/core/auth/agent-delegation.js +199 -25
- package/dist/core/auth/auth-gateway.js +44 -2
- package/dist/core/auth/authorization-denial.js +1 -1
- package/dist/core/auth/debug-context.js +2 -1
- package/dist/core/auth/delegation-authorization.js +2 -2
- package/dist/core/auth/delegation-diagnostics.js +4 -1
- package/dist/core/auth/operation-authorizer.js +10 -1
- package/dist/core/auth/operation-catalog.js +19 -1
- package/dist/core/bootstrap-service.js +43 -20
- package/dist/core/channel-loader.js +0 -1
- package/dist/core/channel-runtime.js +30 -4
- package/dist/core/command/agent-control.js +196 -37
- package/dist/core/command/cli-intent-parser.js +60 -4
- package/dist/core/command/command-handler.js +212 -60
- package/dist/core/command/connect-menu.js +1 -0
- package/dist/core/command/diag-service.js +5 -4
- package/dist/core/command/file-search.js +368 -0
- package/dist/core/command/menu-catalog.js +2 -1
- package/dist/core/command/menu-handler.js +292 -107
- package/dist/core/command/menu-protocol.js +23 -0
- package/dist/core/command/role-menu.js +7 -19
- package/dist/core/command/skill-slash.js +130 -25
- package/dist/core/command/slash-handler.js +101 -53
- package/dist/core/command/topic-slash.js +16 -5
- package/dist/core/daemon-bootstrap.js +7 -1
- package/dist/core/daemon-control.js +19 -1
- package/dist/core/daemon-lifecycle.js +2 -1
- package/dist/core/event-catalog.js +2 -0
- package/dist/core/evolagent-registry.js +13 -2
- package/dist/core/evolagent.js +3 -6
- package/dist/core/handoff/ipc-registration.js +2 -2
- package/dist/core/handoff/runtime.js +40 -6
- package/dist/core/handoff/store.js +1 -0
- package/dist/core/inference/text-inference.js +95 -6
- package/dist/core/ipc-registration.js +43 -24
- package/dist/core/memory/consolidation-context.js +4 -1
- package/dist/core/memory/consolidation.js +25 -14
- package/dist/core/message/aun-ipc-sender.js +296 -88
- package/dist/core/message/aun-request-registry.js +226 -0
- package/dist/core/message/create-status.js +33 -4
- package/dist/core/message/message-bridge.js +62 -13
- package/dist/core/message/message-log.js +0 -1
- package/dist/core/message/message-queue.js +4 -1
- package/dist/core/message/message-utils.js +8 -1
- package/dist/core/message/peer-mode.js +17 -9
- package/dist/core/message/response-engine.js +266 -124
- package/dist/core/message/retry-scheduler.js +11 -8
- package/dist/core/model/catalog-service.js +60 -18
- package/dist/core/model/model-catalog.js +112 -9
- package/dist/core/model/model-fallback.js +94 -26
- package/dist/core/ownership/owner-resolver.js +687 -0
- package/dist/core/permission/approval-gateway.js +196 -62
- package/dist/core/permission/ec-command-parser.js +138 -25
- package/dist/core/permission/filesystem-approval-scope.js +141 -0
- package/dist/core/permission/protected-paths.js +14 -1
- package/dist/core/permission/sandbox-runtime.js +171 -18
- package/dist/core/permission/tool-policy.js +13 -2
- package/dist/core/role/runtime-policy.js +3 -4
- package/dist/core/session/session-idle-monitor.js +10 -8
- package/dist/core/session/session-manager.js +72 -45
- package/dist/core/session/session-mapper.js +18 -7
- package/dist/core/session/session-renew.js +5 -4
- package/dist/core/session/session-title.js +2 -1
- package/dist/core/session/session-turn-coordinator.js +4 -2
- package/dist/core/skill/index-generator.js +2 -16
- package/dist/core/task/task-recovery-service.js +15 -2
- package/dist/core/thread/command-parser.js +28 -13
- package/dist/core/thread/index.js +1 -0
- package/dist/core/thread/ipc-operation.js +11 -8
- package/dist/core/thread/thread-operation.js +79 -44
- package/dist/core/thread/thread-route.js +54 -6
- package/dist/core/thread/thread-service.js +236 -45
- package/dist/core/thread/topic-id.js +248 -0
- package/dist/eck/kit-renderer.js +1 -1
- package/dist/eck/message-renderer.js +12 -2
- package/dist/index.js +50 -27
- package/dist/ipc.js +59 -6
- package/dist/paths.js +1 -0
- package/dist/product.js +1 -0
- package/dist/response-system/engines/v1/proactive-flow.js +10 -3
- package/dist/stats/db.js +8 -0
- package/dist/stats/writer.js +26 -4
- package/dist/trigger/authorization.js +48 -3
- package/dist/trigger/feedback.js +28 -10
- package/dist/trigger/ipc-service.js +86 -10
- package/dist/trigger/local-files.js +55 -23
- package/dist/trigger/scheduler.js +57 -11
- package/dist/trigger/system-definitions.js +1 -0
- package/dist/trigger/validation.js +44 -15
- package/dist/utils/aid-bind.js +17 -297
- package/dist/utils/avatar-upload.js +16 -4
- package/dist/utils/cross-platform.js +109 -34
- package/dist/utils/ecweb-supervisor.js +1 -1
- package/dist/utils/ecweb-utils.js +8 -1
- package/dist/utils/error-utils.js +44 -6
- package/dist/utils/instance-registry.js +12 -2
- package/dist/utils/npm-ops.js +102 -27
- package/dist/utils/package-version-info.js +72 -27
- package/dist/utils/restart-safety.js +50 -0
- package/dist/utils/upgrade-jobs.js +304 -0
- package/dist/utils/windows-autostart.js +17 -10
- package/kits/docs/INDEX.md +5 -0
- package/kits/docs/aun/ABILITY_CALLING.md +239 -0
- package/kits/docs/evolcore/INDEX.md +14 -3
- package/kits/docs/evolcore/agent-create.md +55 -141
- package/kits/docs/evolcore/agent.md +38 -16
- package/kits/docs/evolcore/aid.md +34 -0
- package/kits/docs/evolcore/config.md +20 -1
- package/kits/docs/evolcore/event.md +2 -2
- package/kits/docs/evolcore/fs.md +18 -2
- package/kits/docs/evolcore/group-collaboration.md +13 -246
- package/kits/docs/evolcore/group.md +2 -1
- package/kits/docs/evolcore/memory-consolidation-batches.md +1 -1
- package/kits/docs/evolcore/menu-protocol.md +65 -1
- package/kits/docs/evolcore/msg.md +64 -2
- package/kits/docs/evolcore/skill.md +86 -0
- package/kits/docs/evolcore/stats.md +6 -0
- package/kits/docs/evolcore/task.md +2 -0
- package/kits/docs/evolcore/thread-chain.md +145 -51
- package/kits/docs/evolcore/trigger.md +48 -3
- package/kits/eck_manifest.json +21 -0
- package/kits/eck_message_manifest.json +4 -4
- package/kits/migrations/migrate-role-config-v5.mjs +20 -7
- package/kits/rules/01-overview.md +2 -1
- package/kits/rules/03-identity.md +3 -1
- package/kits/rules/04-relation.md +1 -1
- package/kits/rules/07-memory-and-thread.md +1 -1
- package/kits/schemas/_meta.json +16 -1
- package/kits/schemas/agent-config.schema.13.json +44 -2
- package/kits/schemas/contact-book.schema.3.json +5 -0
- package/kits/schemas/daemon.schema.6.json +3 -1
- package/kits/schemas/daemon.schema.8.json +329 -0
- package/kits/schemas/defaults.schema.5.json +39 -3
- package/kits/schemas/providers.schema.1.json +76 -0
- package/kits/schemas/relation-config.schema.9.json +5 -1
- package/kits/skills/.switches.json +28 -0
- package/kits/skills/aid-ability/SKILL.md +214 -0
- package/kits/skills/ec-agent-create/SKILL.md +162 -0
- package/kits/skills/ec-group/SKILL.md +2 -1
- package/kits/skills/ec-group-collaboration/SKILL.md +228 -0
- package/kits/skills/ec-identity/SKILL.md +143 -0
- package/kits/skills/ec-skill/scripts/cli.mjs +36 -3
- package/kits/skills/ec-skill/scripts/skill.mjs +202 -15
- package/kits/skills/ec-trigger/SKILL.md +167 -0
- package/kits/skills/ec-trigger/references/examples.md +153 -0
- package/kits/skills/thread-ops/SKILL.md +108 -420
- package/kits/templates/message-fragments/thread-context.md +1 -2
- package/kits/templates/message-fragments/trigger-thread-check.md +1 -1
- package/kits/templates/roles/member.json +1 -1
- package/kits/templates/roles/visitor.json +1 -0
- package/kits/templates/system-fragments/bootstrap.md +1 -0
- package/kits/templates/system-fragments/channel.md +2 -1
- package/kits/templates/system-fragments/commands.md +5 -4
- package/kits/templates/system-fragments/identity.md +2 -0
- package/kits/templates/system-fragments/session.md +1 -1
- package/kits/templates/system-fragments/venue.md +1 -1
- package/package.json +4 -3
|
@@ -1,492 +1,180 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: thread-ops
|
|
3
3
|
description: >-
|
|
4
|
-
话题链(Thread Chain
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
决策权归 agent 自己、无等齐原语靠主动查询合并。
|
|
12
|
-
适用场景:需要另一个 agent 输入 / 收到任务委托需代为联系第三方("你帮我问一下 X"、
|
|
13
|
-
"转告 Y"、"去查 Z 那边的情况")/ 作为中间人需要向当前对端以外转发请求或查询 /
|
|
14
|
-
需要总结 / 整理当前话题的场景。
|
|
4
|
+
话题链(Thread Chain)与话题总结。
|
|
5
|
+
**以下两种消息必须先加载本 skill 再处理**:① 消息开头是
|
|
6
|
+
「‹【跨话题上下文】来源话题:…›」(你跨话题发出的消息,对端回复了);
|
|
7
|
+
② 消息开头是「‹【跨话题复查】来源话题:…›」(复查通知)。
|
|
8
|
+
也用于:要联系当前对端/当前群以外的对象("帮我问一下 X"、"转告 Y"、"去查 Z")、
|
|
9
|
+
处理收到的委托、汇报回来源话题。
|
|
10
|
+
用户说"总结一下话题""总结话题""更新一下摘要""summarize this topic"时同样加载。
|
|
15
11
|
license: MIT
|
|
16
12
|
---
|
|
17
13
|
|
|
18
14
|
# `thread-ops` 操作规程
|
|
19
15
|
|
|
20
|
-
|
|
16
|
+
**核心价值是时序语义,不是命令清单**:`--help` 讲参数,本 skill 讲什么时候用、返回后会发生什么、下一步做什么。
|
|
21
17
|
|
|
22
|
-
|
|
18
|
+
## 一、必须加载的时机
|
|
23
19
|
|
|
24
|
-
|
|
20
|
+
**两种唤醒消息**(开头就是判据,逐字比对):
|
|
25
21
|
|
|
26
|
-
|
|
27
|
-
|
|
22
|
+
1. `‹【跨话题上下文】来源话题:<id> · 对端:<AID> · 发送于:… · 复查:<trig…|无> → self:…›`
|
|
23
|
+
——你此前跨话题发出的消息,对端回复了。**有 ⚠️ 空洞提示就先回查来源话题再转达**。
|
|
24
|
+
2. `‹【跨话题复查】来源话题:<id> · 对端:<AID> · 发送于:… · 复查:<trig…> → self:…›`
|
|
25
|
+
——周期复查到期,你在目标话题里被唤醒。
|
|
28
26
|
|
|
29
|
-
|
|
27
|
+
**业务动作**:要联系当前对端/当前群以外的对象;受人所托去问第三方;要汇报回来源话题;并发问多方。
|
|
30
28
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
## 二、加载判据:何时必须加载本 skill
|
|
34
|
-
|
|
35
|
-
### 必须加载(L2 跨 agent 委派)
|
|
36
|
-
|
|
37
|
-
以下任一条件成立时加载:
|
|
38
|
-
|
|
39
|
-
1. **收到话题链消息**:上下文注入了"当前任务来源 = 话题 X / 对端 Y"
|
|
40
|
-
2. **收到任务委托、需要转去联系第三方**:对方(人或 agent)让你去问另一个人或 agent,完成任务的下一步需要联系当前对端以外的对象——先加载本 skill,再按流程 A 操作
|
|
41
|
-
3. **需要给当前对端以外的对象发消息**:只凭当前会话直发会被拒绝,必须走话题
|
|
42
|
-
4. **需要委托另一个 agent**:判断当前任务需要对方的输入
|
|
43
|
-
5. **并发问多方**:同时向 C 和 D 发出委托,等两个都回后再汇总
|
|
44
|
-
6. **要汇报回来源话题**:任务完成,需要回复到来源话题
|
|
45
|
-
|
|
46
|
-
> 判据 2 和 3 不依赖是否已有话题链注入:只要任务需要联系当前对端/当前群以外的对象,就直接按下方流程 A 操作。
|
|
47
|
-
|
|
48
|
-
**为什么必须加载 skill(反直觉的关键点)**:
|
|
49
|
-
|
|
50
|
-
- **发出即结束**(反直觉):`ec msg send --thread T2` 返回后,当前 turn 立刻终止,不阻塞等待
|
|
51
|
-
- **Trigger 是唤醒信号,不是执行脚本**(新概念):到期时提醒检查对端是否回复,不保证对端已回、不强制回复、不指示执行任何操作;收到 Trigger 通知后,agent 自主决定下一步
|
|
52
|
-
- **决策权在自己**(与 handoff 完全相反):要不要回、何时回、回什么,完全自主
|
|
53
|
-
- **无"等齐"原语**(分支合并的核心):想合并多方回复,就在各自 turn 里主动用 `ec thread history` 查另一话题
|
|
29
|
+
**不需要**:改名/改标签/改状态、读历史、看摘要。这些是纯查询,`--help` 足够。
|
|
54
30
|
|
|
55
|
-
###
|
|
31
|
+
### 四条反直觉的语义
|
|
56
32
|
|
|
57
|
-
|
|
33
|
+
- **发出即结束**:`ec msg send --thread T2` 返回后当前 turn 立刻终止,不阻塞等回复。
|
|
34
|
+
- **复查是唤醒信号,不是执行脚本**:到期只投递一条通知,不保证对端已回,不携带操作命令。
|
|
35
|
+
- **决策权在自己**:要不要回、何时回、回什么,全自主。
|
|
36
|
+
- **无"等齐"原语**:想等多方回复,就在各自 turn 里用 `ec thread history` 主动读另一话题。
|
|
58
37
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
---
|
|
62
|
-
|
|
63
|
-
## 三、核心概念速查
|
|
38
|
+
## 二、核心概念
|
|
64
39
|
|
|
65
40
|
| 概念 | 定义 |
|
|
66
41
|
|---|---|
|
|
67
|
-
|
|
|
68
|
-
| threadId |
|
|
69
|
-
|
|
|
70
|
-
|
|
|
71
|
-
|
|
|
72
|
-
|
|
|
73
|
-
| 基础传播单元 |
|
|
42
|
+
| 话题 | agent 与对端之间一条独立的讨论线;消息必须发在某个话题上 |
|
|
43
|
+
| threadId | 跨端统一标识。话题 `thread-<ms>-<seq4>-<rand4>`;主话题 `main:<aidA>:<aidB>`(两种顺序等价,输出为字典序规范形态) |
|
|
44
|
+
| 双端结构 | 同一 threadId 在双方各有一个本地会话 |
|
|
45
|
+
| 跨话题路由 | 在会话 A 上 `send --thread T`,消息实际从话题 T 的会话发出 |
|
|
46
|
+
| 跨话题复查 | `--check-every` 创建;每 N 分钟向**目标话题**投递通知,不新建会话 |
|
|
47
|
+
| 来源/目标话题 | 来源 = 发起委托处(对端 A);目标 = 被委托执行处(对端 C)。复查通知投递在目标话题 |
|
|
48
|
+
| 基础传播单元 | A 委托 B → B 问 C → C 回 B → B 回 A |
|
|
74
49
|
|
|
75
|
-
|
|
50
|
+
**两个写法陷阱**:
|
|
51
|
+
- `ec thread list` 打印的 `<AID>/thread-…` 和主会话的 `/main` 都是**展示形式**,不能直接当 `--thread` 值。
|
|
52
|
+
`--thread` 必须是**裸 threadId**;主会话没有可用 threadId,要跨话题就得先 `ec thread create`。
|
|
53
|
+
- 话题名是本端概念,两端可能不同;threadId 才是统一标识。
|
|
76
54
|
|
|
77
|
-
##
|
|
55
|
+
## 三、流程
|
|
78
56
|
|
|
79
|
-
###
|
|
57
|
+
### A. 发起跨话题委托(核心)
|
|
80
58
|
|
|
81
|
-
|
|
59
|
+
场景:B 在话题 T1(与 A 对话)中,判断需要问 C;或**在群里被要求私聊某位群成员**(群不是一对一关系,必须新建话题)。
|
|
82
60
|
|
|
83
61
|
```bash
|
|
84
|
-
#
|
|
85
|
-
ec
|
|
86
|
-
|
|
87
|
-
# 第二步:找到某 agent 的所有真实对端(过滤内部 daemon 话题)
|
|
88
|
-
ec thread peers --self <selfAid>
|
|
89
|
-
|
|
90
|
-
# 第三步:列出与某对端的所有话题(含消息统计和摘要)
|
|
91
|
-
ec thread list <peer> --self <selfAid>
|
|
92
|
-
# 输出包含:话题名、创建/活跃时间、消息(24h/总计)、最后消息截断、摘要
|
|
93
|
-
|
|
94
|
-
# 第四步:翻页(页脚自动给出完整翻页命令)
|
|
95
|
-
ec thread list <peer> --self <selfAid> --page 2 --limit 10 --sort recent
|
|
62
|
+
# 1. 找或建与 C 的话题
|
|
63
|
+
ec thread list <C的AID>
|
|
64
|
+
ec thread create <C的AID> --name '项目进度查询' # 没有合适话题时;返回裸 threadId
|
|
96
65
|
|
|
97
|
-
#
|
|
98
|
-
ec
|
|
66
|
+
# 2. 发消息,--check-every 一步搞定复查(跨话题必填:5m / 30m / 2h / 1d)
|
|
67
|
+
ec msg send '项目当前进度如何?' --thread <裸threadId> --check-every 5m
|
|
99
68
|
|
|
100
|
-
#
|
|
101
|
-
SINCE=$(python3 -c "import time; print(int((time.time()-7*86400)*1000))")
|
|
102
|
-
ec thread history <peer>/<threadId> --self <selfAid> --after $SINCE --limit 100
|
|
69
|
+
# 3. 本 turn 结束,不阻塞
|
|
103
70
|
```
|
|
104
71
|
|
|
105
|
-
|
|
72
|
+
- 不手写 `from/to`,由话题推断。
|
|
73
|
+
- 副作用:本端写 thread-inbox + 创建复查。回执里 `trigger_id` 要记住,后面靠它取消。
|
|
74
|
+
- 每 5 分钟向 T2 投递一条复查通知;C 若已回复,通知到达时 T2 上下文里就有 C 的回复。
|
|
106
75
|
|
|
107
|
-
###
|
|
76
|
+
### B. 处理收到的委托
|
|
108
77
|
|
|
109
|
-
|
|
78
|
+
你收到的是**普通消息**,不带话题链注入(上下文只注入在发送方的目标话题里)。处理完自行决定回不回:
|
|
110
79
|
|
|
111
80
|
```bash
|
|
112
|
-
|
|
113
|
-
ec thread list <C的AID>
|
|
114
|
-
# 如果有合适的话题(如 T2),记下 threadId
|
|
115
|
-
# 如果没有,新建:
|
|
116
|
-
ec thread create <C的AID> --name '项目进度查询'
|
|
117
|
-
# 返回:{ threadId: "thread-xxx", ... }
|
|
118
|
-
|
|
119
|
-
# 步骤 2:发消息(--check-every 一步搞定复查)
|
|
120
|
-
ec msg send '项目当前进度如何?' --thread <T2的threadId> --check-every 5m
|
|
121
|
-
# --check-every 跨话题时必填(如 5m / 30m / 2h),周期唤醒直到显式 cancel
|
|
122
|
-
# 返回:{ message_id: "m-yyy", ... }
|
|
123
|
-
# 副作用:本端写入 thread-inbox + 创建周期复查 Trigger(kind=thread-check)
|
|
124
|
-
|
|
125
|
-
# 步骤 3:当前 turn 结束
|
|
126
|
-
# B 在 T1 的这个 turn 到此为止,不阻塞等待 C 的回复
|
|
81
|
+
ec msg send '进度 70%,预计下周完成' # 不带 --thread,发在当前话题
|
|
127
82
|
```
|
|
128
83
|
|
|
129
|
-
|
|
130
|
-
- `ec msg send --thread T2 --check-every 5m` 返回后,当前 turn **立刻结束**
|
|
131
|
-
- 消息从 B 与 C 的话题 T2 发出到达 C
|
|
132
|
-
- 5 分钟后,Trigger 唤醒 T2 的新 turn(在 B 侧)
|
|
133
|
-
- 如果 C 在此之前已回复,新 turn 的上下文里会包含 C 的回复
|
|
134
|
-
|
|
135
|
-
---
|
|
136
|
-
|
|
137
|
-
### 流程 B:处理收到的委托
|
|
84
|
+
同话题追问也不带 `--thread`,同样不建复查。
|
|
138
85
|
|
|
139
|
-
|
|
86
|
+
### C. 被唤醒后怎么决策(两种唤醒共用)
|
|
140
87
|
|
|
141
|
-
|
|
142
|
-
```
|
|
143
|
-
当前任务来源:话题 thread-xxx,对端 b.agentid.cn
|
|
144
|
-
```
|
|
88
|
+
**目标话题不用查**——对话就在上下文里。只需回查来源话题的空洞期:
|
|
145
89
|
|
|
146
90
|
```bash
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
# 步骤 2:决定是否回复
|
|
150
|
-
# 情况 A:直接回复 B(在当前话题 T2 上)
|
|
151
|
-
ec msg send '进度 70%,预计下周完成'
|
|
152
|
-
# 不带 --thread,消息发在当前话题上
|
|
153
|
-
# 托管会话中不需要指定 from 和 to,系统推断
|
|
154
|
-
|
|
155
|
-
# 情况 B:不回复,什么都不做,turn 结束
|
|
91
|
+
ec thread history <来源peer>/<来源threadId> --after <发送于的时间戳>
|
|
156
92
|
```
|
|
157
93
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
### 流程 C:Trigger 到期后的处理
|
|
163
|
-
|
|
164
|
-
**场景**:5 分钟后,Trigger 唤醒 B 在 T2 的新 turn。
|
|
94
|
+
按顺序判断:
|
|
95
|
+
1. 来源话题有"取消任务"等新指示?→ 按新指示办,再决定下一步。
|
|
96
|
+
2. 对端已给最终答案?→ **删除复查 + 回来源话题汇报**。
|
|
97
|
+
3. 对端还在处理?→ 调整周期,或什么都不做。
|
|
165
98
|
|
|
166
99
|
```bash
|
|
167
|
-
|
|
168
|
-
ec
|
|
169
|
-
#
|
|
170
|
-
|
|
171
|
-
# 步骤 2A:C 已回复 → 处理回复,汇报回 A
|
|
172
|
-
ec msg send 'C 回复:进度 70%' --thread <T1的threadId> --check-every 30m
|
|
173
|
-
# 汇报回 A 也是跨话题发送,同样必填 --check-every
|
|
174
|
-
|
|
175
|
-
# 步骤 2B:C 还没回 → 决定下一步
|
|
176
|
-
# 选项 1:继续等 → 什么都不做,原 Trigger 下个周期会再次唤醒
|
|
177
|
-
# (如需调整频率:ec trigger update <triggerId> --every 5m)
|
|
178
|
-
# 选项 2:放弃等待,直接回 A
|
|
179
|
-
ec msg send 'C 暂无回复' --thread <T1的threadId> --check-every 30m
|
|
180
|
-
|
|
181
|
-
# 选项 3:什么都不做,turn 结束
|
|
100
|
+
ec trigger delete <trig_id> # 完成:删除,不留残留
|
|
101
|
+
ec trigger update <trig_id> --every 30m # 放宽
|
|
102
|
+
ec msg send 'C 回复:进度 70%' --thread <来源threadId> --check-every 30m # 汇报(跨话题,复查必填)
|
|
182
103
|
```
|
|
183
104
|
|
|
184
|
-
**关键点**:
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
105
|
+
**关键点**:
|
|
106
|
+
- **结束复查一律用 `ec trigger delete`,不要用 `ec trigger cancel`**:cancel 只是 disable,定义和调度状态仍留在磁盘上,积多了就是一堆永不触发的死 Trigger。delete 会清掉定时器、事件订阅、调度游标和 limit 状态。
|
|
107
|
+
- Trigger 只认 **id**(`trig_…`),用名称会报 not found。
|
|
108
|
+
- **收到复查通知后不要再用 `--check-every` 发新消息**——那会套出第二个复查,越滚越多。要延长就 `ec trigger update`。
|
|
109
|
+
- 信封头 `复查:无` = 复查没建成,不会有周期提醒;需要跟进就自己 `ec trigger create`。
|
|
110
|
+
- 发送失败(暂时性)→ 保留复查下次再试;(永久性,如拉黑)→ 删除复查并回来源话题说明联系不上。
|
|
189
111
|
|
|
190
|
-
|
|
112
|
+
### D. 并发委托多方
|
|
191
113
|
|
|
192
114
|
```bash
|
|
193
|
-
# 步骤 1:同时发出两条委托,各自创建周期复查 Trigger(--check-every 一步搞定)
|
|
194
115
|
ec msg send '技术评估' --thread <T2> --check-every 10m
|
|
195
116
|
ec msg send '产品评估' --thread <T3> --check-every 10m
|
|
196
|
-
# turn
|
|
197
|
-
|
|
198
|
-
# 10 分钟后,T2 和 T3 各自触发新 turn
|
|
199
|
-
|
|
200
|
-
# 在 T2 的 turn 里(C 已回复):
|
|
201
|
-
# 检查 D 是否也回了
|
|
202
|
-
ec thread history <D的AID>/<T3> --limit 5
|
|
203
|
-
# 如果 D 还没回,turn 结束,等 T3 的 turn
|
|
204
|
-
|
|
205
|
-
# 在 T3 的 turn 里(D 已回复):
|
|
206
|
-
# 检查 C 是否也回了
|
|
207
|
-
ec thread history <C的AID>/<T2> --limit 5
|
|
208
|
-
# C 也回了,合并结果
|
|
209
|
-
ec msg send '综合评估:技术……产品……' --thread <T1> --check-every 30m
|
|
210
|
-
```
|
|
211
|
-
|
|
212
|
-
**关键点**:没有"等齐"原语。想合并就在后到的 turn 里主动读另一话题,手动判断是否齐全。
|
|
213
|
-
|
|
214
|
-
---
|
|
215
|
-
|
|
216
|
-
### 流程 E:追问(同话题多轮)
|
|
217
|
-
|
|
218
|
-
**场景**:C 第一次回复不够详细,B 继续追问。
|
|
219
|
-
|
|
220
|
-
```bash
|
|
221
|
-
# S2B 收到 C 的第一次回复:"卡在 Redis 并发问题"
|
|
222
|
-
# B 判断需要更多细节
|
|
223
|
-
|
|
224
|
-
ec msg send 'Redis 并发问题影响范围多大?'
|
|
225
|
-
# 不带 --thread,继续在当前话题上
|
|
226
|
-
# 同话题追问无需 --check-every(不跨话题,不创建复查 Trigger)
|
|
227
|
-
|
|
228
|
-
# C 再次回复后,触发新 turn
|
|
229
|
-
# B 整合两轮对话,回 A
|
|
230
|
-
ec msg send 'C 反馈:Redis 问题影响……' --thread <T1>
|
|
117
|
+
# 之后在每个先到的 turn 里,用 ec thread history 读另一话题,齐了再合并回 T1
|
|
118
|
+
ec msg send '综合评估:……' --thread <T1> --check-every 30m
|
|
231
119
|
```
|
|
232
120
|
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
### 流程 F:话题历史查询
|
|
121
|
+
### E. 查询与维护命令
|
|
236
122
|
|
|
237
123
|
```bash
|
|
238
|
-
#
|
|
239
|
-
ec thread
|
|
240
|
-
|
|
241
|
-
#
|
|
242
|
-
ec thread
|
|
243
|
-
|
|
244
|
-
# 读当前话题的历史
|
|
245
|
-
ec thread history current --limit 20
|
|
246
|
-
|
|
247
|
-
# 读另一个话题的历史(跨话题只读)
|
|
248
|
-
ec thread history <peer>/<threadId> --limit 50
|
|
249
|
-
|
|
250
|
-
# 按时间过滤(查看空洞期消息)
|
|
251
|
-
ec thread history <peer>/<threadId> --after <timestamp>
|
|
252
|
-
```
|
|
253
|
-
|
|
254
|
-
---
|
|
255
|
-
|
|
256
|
-
### 流程 G:修改话题属性
|
|
257
|
-
|
|
258
|
-
```bash
|
|
259
|
-
ec thread rename current '新名称'
|
|
260
|
-
ec thread label current '开发'
|
|
261
|
-
ec thread status current in_progress
|
|
262
|
-
# 状态值:pending | in_progress | completed | archived
|
|
263
|
-
```
|
|
264
|
-
|
|
265
|
-
---
|
|
266
|
-
|
|
267
|
-
### 流程 H:Trigger 操作(跨话题跟进场景)
|
|
268
|
-
|
|
269
|
-
#### 场景一:对端回复时的 Trigger 决策
|
|
270
|
-
|
|
271
|
-
当你在某个话题被对端唤醒,跨会话上下文注入里会带上关联的复查 Trigger:
|
|
272
|
-
|
|
273
|
-
```
|
|
274
|
-
‹跨会话上下文 · 来源话题:thread-T1 · 对端:alice.agentid.cn · 发送于:...›
|
|
275
|
-
🔔 复查 Trigger:trig_1791765199642_5371c8ff(尚未触发/待处理)
|
|
276
|
-
【原消息内容】
|
|
277
|
-
```
|
|
278
|
-
|
|
279
|
-
**操作流程**:
|
|
280
|
-
|
|
281
|
-
1. **判断对端回复是否完整**:
|
|
282
|
-
- 如果对端已给最终答案 → 继续第 2 步
|
|
283
|
-
- 如果对端还在处理中 → 保留 trigger,本次不操作
|
|
284
|
-
|
|
285
|
-
2. **检查来源话题是否有新指示**(如果系统提示有空洞期消息):
|
|
286
|
-
```bash
|
|
287
|
-
ec thread history <来源peer>/<来源threadId> --after <timestamp>
|
|
288
|
-
```
|
|
289
|
-
- 如果来源话题有"取消任务"等新指示 → 处理后取消 trigger
|
|
290
|
-
- 如果来源话题无新消息 → 继续第 3 步
|
|
291
|
-
|
|
292
|
-
3. **决定 Trigger 操作**:
|
|
293
|
-
- **任务完成** → 取消 trigger(用 **id**,即上面注入的 `trig_…`;用名称会报 trigger not found):
|
|
294
|
-
```bash
|
|
295
|
-
ec trigger cancel trig_1791765199642_5371c8ff
|
|
296
|
-
```
|
|
297
|
-
|
|
298
|
-
- **需要加快跟进** → 调整周期:
|
|
299
|
-
```bash
|
|
300
|
-
ec trigger update trig_1791765199642_5371c8ff --every 30m
|
|
301
|
-
```
|
|
302
|
-
|
|
303
|
-
#### 场景二:Trigger 触发时的主动复查
|
|
304
|
-
|
|
305
|
-
当 trigger 定期触发时,你会被唤醒并看到 trigger 的 prompt(信封头标注 `Trigger 复查 · 话题:... ← 来源:...`):
|
|
306
|
-
|
|
307
|
-
```
|
|
308
|
-
【Trigger 复查】话题 thread-T2(对端 C)
|
|
309
|
-
这是周期复查:每 5m 唤醒一次,直到你显式结束它。
|
|
310
|
-
|
|
311
|
-
请检查该话题的最新进度,根据情况:继续等待、调整周期(ec trigger update trig_1791765199642_5371c8ff --every <时长>)或结束复查(ec trigger cancel trig_1791765199642_5371c8ff)。
|
|
312
|
-
|
|
313
|
-
参考命令:
|
|
314
|
-
ec thread history <C的AID>/thread-T2 --limit 10
|
|
315
|
-
ec thread history <来源peer>/thread-T1 --after <timestamp>
|
|
316
|
-
ec trigger cancel trig_1791765199642_5371c8ff
|
|
317
|
-
ec trigger update trig_1791765199642_5371c8ff --every <时长>
|
|
318
|
-
Trigger id:trig_1791765199642_5371c8ff
|
|
319
|
-
Trigger 名称:check-<目标threadId>-from-<来源threadId>-<唯一后缀>
|
|
124
|
+
ec thread peers --self <selfAid> # 有哪些真实对端
|
|
125
|
+
ec thread list <peer> --self <selfAid> [--page 2] # 话题列表(含摘要、消息数)
|
|
126
|
+
ec thread history <threadId> --limit 20 # 读历史
|
|
127
|
+
ec thread history <threadId> --after <ts> --limit 50 # 只读增量(空洞期)
|
|
128
|
+
ec thread rename|label|status current '…'|'…'|in_progress # 状态:pending|in_progress|completed|archived
|
|
320
129
|
```
|
|
321
130
|
|
|
322
|
-
|
|
131
|
+
### F. 总结话题
|
|
323
132
|
|
|
324
|
-
|
|
325
|
-
```bash
|
|
326
|
-
ec thread history <目标peer>/<目标threadId> --limit 10
|
|
327
|
-
```
|
|
133
|
+
触发词:"总结一下话题""总结话题""给这个话题写个总结""更新一下摘要""summarize this topic"——**直接执行,不要反问总结什么**。
|
|
328
134
|
|
|
329
|
-
|
|
330
|
-
```bash
|
|
331
|
-
ec thread history <来源peer>/<来源threadId> --after <上次检查时间>
|
|
332
|
-
```
|
|
333
|
-
|
|
334
|
-
3. **根据检查结果决策**:
|
|
335
|
-
- **目标话题有回复** → 处理回复,判断是否取消 trigger(同场景一)
|
|
336
|
-
- **来源话题有新指示**(如"别管了")→ 通知目标话题,取消 trigger
|
|
337
|
-
- **两边都无更新** → 保留 trigger 继续等待
|
|
338
|
-
- **发现会话不可用** → 回复来源话题说联系不上,取消 trigger
|
|
339
|
-
|
|
340
|
-
4. **错误处理**:
|
|
341
|
-
- 发送消息失败(暂时性)→ 保留 trigger,下次再试
|
|
342
|
-
- 发送消息失败(永久性,如拉黑)→ 取消 trigger,回复来源话题
|
|
343
|
-
|
|
344
|
-
---
|
|
345
|
-
|
|
346
|
-
### 流程 I:总结话题("总结一下话题")
|
|
347
|
-
|
|
348
|
-
**触发词**:用户说"总结一下话题""总结话题""给这个话题写个总结""这个话题总结一下"
|
|
349
|
-
"更新一下摘要""summarize this topic" 时,**直接执行下面的序列**,不要反问"总结什么"。
|
|
350
|
-
|
|
351
|
-
**核心两步**:① 拿到"上次总结覆盖到哪"→ ② 读那之后的增量 → ③ 写新摘要。
|
|
352
|
-
`--name` **必填**:总结时往往正好把主题想清楚,一次命令同时写摘要 + 改标题;
|
|
353
|
-
确实要保留原标题时显式传 `--name -`(显式表达意图,比省略更难被忽略)。
|
|
354
|
-
`summary show` 会打印 `coveredThroughTs`(覆盖游标),它就是你读增量的起点。
|
|
355
|
-
`summary set` 会自动把游标推进到当时话题的最新一条,你不用管。
|
|
356
|
-
|
|
357
|
-
**情形 A:在当前话题内总结**(对话就在上下文里,不用读历史)
|
|
135
|
+
核心:**先拿覆盖游标 → 读增量 → 再写**。`summary set` 会把游标推进到当时最新一条,所以**必须先读完增量**,否则被跳过的消息下次不会再返回。
|
|
358
136
|
|
|
359
137
|
```bash
|
|
360
|
-
#
|
|
138
|
+
# 当前话题内总结(增量就是本轮对话,不用读历史)
|
|
361
139
|
ec thread summary show current
|
|
140
|
+
ec thread summary set current '<100字以内摘要>' --name '动词短语描述的核心动作'
|
|
141
|
+
# --name 必填;不想改名显式传 --name -
|
|
142
|
+
# 多人协作同一话题时加 --if-rev <上一步的rev> 防覆盖
|
|
362
143
|
|
|
363
|
-
#
|
|
364
|
-
#
|
|
365
|
-
|
|
366
|
-
ec thread
|
|
367
|
-
ec thread summary set
|
|
368
|
-
# 多人协作同一话题时带 CAS 防覆盖
|
|
369
|
-
ec thread summary set current '写好的摘要内容' --name '标题' --if-rev <步骤1的rev>
|
|
370
|
-
```
|
|
371
|
-
|
|
372
|
-
**情形 B:从别的话题(或别处)总结某话题**(需要读增量)
|
|
373
|
-
|
|
374
|
-
```bash
|
|
375
|
-
# 1. 看上次摘要 + 覆盖游标
|
|
376
|
-
ec thread summary show <peer>/<threadId>
|
|
377
|
-
# 输出中 coveredThroughTs 是上次覆盖到的时间戳;没有该字段说明是首次/旧摘要,需全量读
|
|
378
|
-
|
|
379
|
-
# 2. 读游标之后的增量(首次总结则省略 --after,全量读)
|
|
380
|
-
ec thread history <peer>/<threadId> --after <coveredThroughTs> --limit 50
|
|
381
|
-
|
|
382
|
-
# 3. 增量较多时往回翻页(history 支持 before 逆序分页)
|
|
383
|
-
ec thread history <peer>/<threadId> --before <本页最早一条的ts> --limit 50
|
|
384
|
-
# 翻到覆盖游标之前即可停;注意 before 是闭区间,用 <最早ts - 1> 避免边界重复
|
|
385
|
-
|
|
386
|
-
# 4. 读完增量后写摘要(游标自动推进到现在);--name 必填,不改名传 -
|
|
387
|
-
ec thread summary set <peer>/<threadId> '写好的摘要内容' --name '新名称'
|
|
144
|
+
# 从别处总结某话题:必须读增量
|
|
145
|
+
ec thread summary show <threadId> # 取 coveredThroughTs
|
|
146
|
+
ec thread history <threadId> --after <coveredThroughTs> --limit 50 # 首次总结则省略 --after 全量读
|
|
147
|
+
ec thread history <threadId> --before <本页最早ts-1> --limit 50 # 增量多时往回翻(before 闭区间)
|
|
148
|
+
ec thread summary set <threadId> '<摘要>' --name '新名称'
|
|
388
149
|
```
|
|
389
150
|
|
|
390
|
-
|
|
391
|
-
|
|
151
|
+
**摘要规范**:100 字以内,`[谁]做了[什么],结果[什么],遗留[什么]`;写给下次的自己看,不是给对端。
|
|
152
|
+
**命名规范**:≤20 字、动词短语,别用"你好""话题会话";话题方向变了就顺手改名。
|
|
392
153
|
|
|
393
|
-
|
|
394
|
-
此时从最新往回翻,一直翻到你认为已覆盖的开头,再写摘要。
|
|
154
|
+
**主动做(不等用户开口)**:阶段完成 → 写摘要;方向重大转向 → 改名 + 摘要;即将跨去别处 → 先记状态;转 `completed` 前 → 写最终摘要。
|
|
395
155
|
|
|
396
|
-
|
|
397
|
-
从它之后读既不多读(省 token)也不少读(不漏消息)。翻页用 `--before`,天然支持"往回看"。
|
|
398
|
-
|
|
399
|
-
**话题名称命名规范**(由 `summary set --name` 一并写入,不必单独跑 rename):
|
|
400
|
-
- 名称应反映话题的核心主题,不超过20字
|
|
401
|
-
- 避免使用创建时的随机短语("你好"、"话题会话"),改为有意义的描述
|
|
402
|
-
- 好的名称示例:"skill 索引热更新 bug 修复"、"manifest 注入与 CLAUDE.md 冗余问题"
|
|
403
|
-
- 名称是本端的,对端可能有不同名称,这是正常的
|
|
404
|
-
|
|
405
|
-
**摘要写作规范**:
|
|
406
|
-
- 摘要应在100字以内,概括话题的背景、进展和结果
|
|
407
|
-
- 格式:[谁]做了[什么],结果是[什么],遗留[什么](如有)
|
|
408
|
-
- 摘要是给下次进入该话题时快速恢复上下文用的,不是给对端看的
|
|
409
|
-
- 示例:"leiliang 要求安装 fetch 技能,tl3 完成依赖下载和链路验证,技能安装完成。"
|
|
410
|
-
|
|
411
|
-
#### 何时顺手做(不等用户开口)
|
|
412
|
-
|
|
413
|
-
用户明确说"总结"时按上面序列执行。此外以下时机**主动**做,不要等对端问:
|
|
414
|
-
|
|
415
|
-
| 时机 | 操作 |
|
|
416
|
-
|---|---|
|
|
417
|
-
| 话题名称仍是创建时的随机短语("你好"、"话题会话"等)时 | 更新名称 |
|
|
418
|
-
| 一个明确的任务或阶段完成时 | 写入/更新摘要 |
|
|
419
|
-
| 话题方向发生重大转变(原来讨论A,现在转向B) | 更新名称 + 摘要 |
|
|
420
|
-
| 即将离开话题去处理其他事(跨话题路由前) | 写入摘要,记录当前状态 |
|
|
421
|
-
| 话题进入 completed 状态前 | 写入最终摘要,记录成果 |
|
|
422
|
-
| 下次被唤醒时发现摘要是"未总结" | 回顾历史后补写摘要 |
|
|
423
|
-
|
|
424
|
-
---
|
|
425
|
-
|
|
426
|
-
### 流程 J:生成 agent 工作报告
|
|
427
|
-
|
|
428
|
-
**场景**:需要总结某 agent 与某对端最近一段时间的工作内容。
|
|
156
|
+
### G. 生成工作报告
|
|
429
157
|
|
|
430
158
|
```bash
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
SINCE=$(python3 -c "import time; print(int((time.time()-7*86400)*1000))")
|
|
435
|
-
|
|
436
|
-
# 第一步:列出所有话题(含消息统计)
|
|
437
|
-
ec thread list $PEER --self $SELF --limit 100
|
|
438
|
-
|
|
439
|
-
# 第二步:对24h消息数>0或总消息数较多的话题,读取最近消息
|
|
440
|
-
ec thread history $PEER/<threadId> --self $SELF --after $SINCE --limit 50
|
|
441
|
-
|
|
442
|
-
# 第三步:查看每个话题的 summary
|
|
443
|
-
ec thread summary show $PEER/<threadId> --self $SELF
|
|
159
|
+
ec thread list <peer> --self <selfAid> --limit 100
|
|
160
|
+
ec thread history <peer>/<threadId> --self <selfAid> --after <起始ts> --limit 50
|
|
161
|
+
ec thread summary show <peer>/<threadId> --self <selfAid>
|
|
444
162
|
```
|
|
445
163
|
|
|
446
|
-
|
|
447
|
-
1. **时间范围**:报告覆盖的时间段
|
|
448
|
-
2. **话题总览**:共多少话题,活跃话题数(24h有消息)
|
|
449
|
-
3. **逐话题摘要**:按活跃时间排序,每个话题一段,包含:
|
|
450
|
-
- 话题名称和时间范围
|
|
451
|
-
- 主要内容(从 summary 或消息读取)
|
|
452
|
-
- 完成状态
|
|
453
|
-
4. **结论**:主要完成了什么,有什么遗留
|
|
454
|
-
|
|
455
|
-
---
|
|
456
|
-
|
|
457
|
-
## 五、常见错误
|
|
458
|
-
|
|
459
|
-
| 错误码 | 含义 | 处理 |
|
|
460
|
-
|---|---|---|
|
|
461
|
-
| `TOPIC_NOT_FOUND` | `--thread` 指定的话题在本端不存在 | 先 `ec thread create` 新建 |
|
|
462
|
-
| `TOPIC_CONFLICT` | 创建时名称与已有话题重名 | 换名字,或直接使用已有话题 |
|
|
463
|
-
| `TOPIC_BUSY` | 话题有正在执行的任务,无法删除 | 等任务完成后再删除 |
|
|
464
|
-
|
|
465
|
-
---
|
|
466
|
-
|
|
467
|
-
## 六、不应该做的事
|
|
468
|
-
|
|
469
|
-
1. **不要在发送消息后阻塞等待回复**:`send --thread T2` 返回后 turn 就结束了,回复会触发新 turn。
|
|
470
|
-
|
|
471
|
-
2. **不要忘记创建 Trigger**:如果不创建,对端不回复时你永远不会知道。分支合并场景必须用 Trigger。
|
|
472
|
-
|
|
473
|
-
3. **不要在托管会话中手动指定 from 和 to**:`ec msg send '文本' --thread T2` 就够了。
|
|
164
|
+
结构:时间范围 → 话题总览(总数/活跃数)→ 逐话题摘要(名称、时间、内容、状态)→ 结论与遗留。
|
|
474
165
|
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
5. **不要期望话题名双端一致**:话题名是本端概念,threadId 才是跨端统一标识符。
|
|
478
|
-
|
|
479
|
-
6. **不要在并发场景期望"等齐"原语**:想合并就在后到的 turn 里用 `ec thread history` 主动读。
|
|
480
|
-
|
|
481
|
-
---
|
|
482
|
-
|
|
483
|
-
## 七、加载本 skill 后 agent 应该明白的七条核心点
|
|
484
|
-
|
|
485
|
-
1. **话题是路由单位**:消息必须发在某个话题上,不带 `--thread` 时发在当前话题。
|
|
486
|
-
2. **跨话题路由不阻塞**:`send --thread T2` 返回后当前 turn 立刻结束,不等回复。
|
|
487
|
-
3. **Trigger 是唤醒信号,不是执行脚本**:到期时提醒检查,不指示执行任何操作,不保证对端已回复。
|
|
488
|
-
4. **决策权在自己**:收到委托要不要回、何时回、回什么,完全自主判断。
|
|
489
|
-
5. **分支合并靠主动查询**:想等多个对端都回,就在各自 turn 里用 `ec thread history` 读另一话题。
|
|
490
|
-
6. **from/to 托管会话中不需要**:会话唯一确定对端,命令简化为 `ec msg send '文本' --thread T`。
|
|
491
|
-
7. **话题名是本端的**:对端可能改名,threadId 才是跨端统一标识。
|
|
166
|
+
## 四、禁忌与错误
|
|
492
167
|
|
|
168
|
+
| 错误码 | 处理 |
|
|
169
|
+
|---|---|
|
|
170
|
+
| `TOPIC_NOT_FOUND` | 先 `ec thread create`;也检查是不是带了 `<AID>/` 前缀或用了 `/main` |
|
|
171
|
+
| `TOPIC_CONFLICT` | 换名字,或直接用已有话题 |
|
|
172
|
+
| `TOPIC_BUSY` | 有任务在跑,等完成再删 |
|
|
173
|
+
|
|
174
|
+
**不要**:
|
|
175
|
+
1. 发完阻塞等回复——turn 已结束,回复会触发新 turn。
|
|
176
|
+
2. 漏掉 `--check-every`——跨话题不发复查,对端不回你永远不会知道。
|
|
177
|
+
3. 托管会话里手写 `from/to`。
|
|
178
|
+
4. 把复查通知当"强制回复"或执行脚本。
|
|
179
|
+
5. 在复查 turn 里再 `--check-every`(会套娃)。
|
|
180
|
+
6. 期望"等齐"原语,或期望话题名两端一致。
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
‹【跨话题上下文】来源话题:{{threadContextOriginThreadId}}{{?threadContextOriginPeer}} · 对端:{{threadContextOriginPeer}}{{/}}{{?threadContextTime}} · 发送于:{{threadContextTime}}{{/}} · 复查:{{threadContextTriggerId}} → self:{{selfAid}}›
|
|
2
2
|
{{?threadContextGapHasNewMessages}}⚠️ 来源话题在发送后已有 {{threadContextGapCount}} 条新消息{{?threadContextGapRange}}({{threadContextGapRange}}){{/}} —— 处理前建议先回查该话题的空洞期消息。
|
|
3
3
|
{{/}}{{?threadContextGapError}}⚠️ 无法检测来源话题的空洞期消息({{threadContextGapError}})—— 如需确认,请手动执行 ec thread history 回查该话题。
|
|
4
|
-
{{/}}{{?threadContextTriggerId}}🔔 复查 Trigger:{{threadContextTriggerId}}(尚未触发/待处理)
|
|
5
4
|
{{/}}
|
|
6
5
|
{{content}}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
‹【跨话题复查】来源话题:{{triggerMsgLabel_originThreadId}}{{?triggerMsgLabel_originPeer}} · 对端:{{triggerMsgLabel_originPeer}}{{/}}{{?triggerMsgFirstSentTime}} · 发送于:{{triggerMsgFirstSentTime}}{{/}} · 复查:{{triggerMsgId}} → self:{{selfAid}}›
|
|
2
2
|
{{content}}
|
|
@@ -67,7 +67,7 @@
|
|
|
67
67
|
"ec.fs.ls": { "allow": true, "scopes": ["relation"], "constraints": { "groupOnly": true, "currentRelationOnly": true, "targetCurrentAgentOnly": true } },
|
|
68
68
|
"ec.fs.stat": { "allow": true, "scopes": ["relation"], "constraints": { "groupOnly": true, "currentRelationOnly": true, "targetCurrentAgentOnly": true } },
|
|
69
69
|
"ec.fs.lstat": { "allow": true, "scopes": ["relation"], "constraints": { "groupOnly": true, "currentRelationOnly": true, "targetCurrentAgentOnly": true } },
|
|
70
|
-
"ec.fs.cat": { "allow": true, "scopes": ["relation"], "constraints": { "
|
|
70
|
+
"ec.fs.cat": { "allow": true, "scopes": ["relation"], "constraints": { "currentRelationOnly": true, "targetCurrentAgentOnly": true } },
|
|
71
71
|
"ec.fs.find": { "allow": true, "scopes": ["relation"], "constraints": { "groupOnly": true, "currentRelationOnly": true, "targetCurrentAgentOnly": true } },
|
|
72
72
|
"ec.fs.df": { "allow": true, "scopes": ["relation"], "constraints": { "groupOnly": true, "currentRelationOnly": true, "targetCurrentAgentOnly": true } },
|
|
73
73
|
"ec.fs.getfacl": { "allow": true, "scopes": ["relation"], "constraints": { "groupOnly": true, "currentRelationOnly": true, "targetCurrentAgentOnly": true } },
|
|
@@ -69,6 +69,7 @@
|
|
|
69
69
|
"ec.aid.agentmd.get": { "allow": true, "scopes": ["relation"] },
|
|
70
70
|
"ec.aid.agentmd.put": { "allow": false },
|
|
71
71
|
"ec.aid.avatar": { "allow": false },
|
|
72
|
+
"ec.fs.cat": { "allow": true, "scopes": ["relation"], "constraints": { "privateOnly": true, "currentRelationOnly": true, "targetCurrentAgentOnly": true } },
|
|
72
73
|
"ec.fs.*": { "allow": false },
|
|
73
74
|
"ec.handoff.*": { "allow": false },
|
|
74
75
|
"ec.queue.*": { "allow": false },
|