@epoch-agent/protocol 0.27.0 → 0.28.0

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/dist/index.d.ts CHANGED
@@ -3328,6 +3328,21 @@ interface CustomCommandDef {
3328
3328
  * 而引擎侧手里只有这张表。拆成两个类型(一个给 UI、一个给引擎)迟早漂移。
3329
3329
  */
3330
3330
  prompt: string;
3331
+ /**
3332
+ * frontmatter 的 `displayName`:**给人看**的称呼(2026-10-10)。缺省 = 屏幕上印 {@link name}。
3333
+ *
3334
+ * 判据逐字同角色那一格(`AgentRole.displayName`,`agent-role.ts`):`name` 一个字节
3335
+ * 都不动 —— 它仍是用户敲的那个 `/xxx`、服务端认命令的那个 key、同名合并的 key;
3336
+ * 这一格只是屏幕上的称呼。插件命令的名字**一定带 `<插件名>:` 前缀**
3337
+ * (`aione:bailing_daily_report`),那是两个标识拼起来的,不是一个人的叫法。
3338
+ *
3339
+ * 键名用驼峰而不是本文件其余键的连字符(`argument-hint`):连字符那几个是对齐
3340
+ * 同类工具的既有写法,而这一格别家没有,没有可对齐的;同一个插件的作者在
3341
+ * `plugin.json` 和角色 md 上写的都是 `displayName`,三处一个词。
3342
+ *
3343
+ * ⚠️ **缺省回落发生在消费侧**,判据同 `AgentRole.displayName` 末节。
3344
+ */
3345
+ displayName?: string;
3331
3346
  /** frontmatter 的 `description`,必填 —— `/help` 和补全面板里显示的那行 */
3332
3347
  description: string;
3333
3348
  /** frontmatter 的 `argument-hint`,例如 `[scope]`。只用于展示 */
@@ -4830,6 +4845,13 @@ type AgentEvent =
4830
4845
  type: 'steer';
4831
4846
  text: string;
4832
4847
  parts?: EpochContentPart[];
4848
+ /**
4849
+ * 发送方在 `POST /messages` 里给的编号(2026-10-10)。**引擎从不填它** —— 是
4850
+ * Hub 往网线上扇出时按「交给引擎的先后」贴上的(`server/src/hub.ts` 的 `drive()`)。
4851
+ * 发送方拿它认出「这句插话是我那条」,把本地乐观上屏的那份换到这一帧的位置。
4852
+ * 判据在 `WireSendMessageRequest.clientMessageId` 上。
4853
+ */
4854
+ clientMessageId?: string;
4833
4855
  }
4834
4856
  /** 运行中出错(随后会有一个 finish: 'error') */
4835
4857
  | {
@@ -7054,6 +7076,38 @@ type WireHubEvent =
7054
7076
  id: string;
7055
7077
  text: string;
7056
7078
  autoSend: boolean;
7079
+ }
7080
+ /**
7081
+ * 这一轮的用户消息 —— **一轮开跑那一刻**广播(2026-10-10)。
7082
+ *
7083
+ * ## 治的是什么
7084
+ *
7085
+ * 同一段会话开在两处(电脑上的窗口 + 手机,或者两个标签页),在一处发的那条,
7086
+ * 另一处在这之前**根本收不到**:`drive()` 只扇出引擎产出的事件,跑到一半插的话
7087
+ * 有引擎发的 `steer`,而开轮那一条谁都没发。另一处于是看到模型的回答、看到标题
7088
+ * 变了,正文里却没有那条问题。
7089
+ *
7090
+ * ## 时机:开跑时,不是收下时
7091
+ *
7092
+ * 由 `beginTurn()` 在 `session-state: running` 之后、`drive()` 之前发。排队的那几条
7093
+ * 各在**自己开跑时**才发 —— 收下时就发的话,它会被画进上一轮的中间。
7094
+ * 被正在跑的那一轮拉走的(插进本轮)**不走这一帧**,那一条由引擎发 `steer`;
7095
+ * 两帧讲的是两件事,一条消息只会有其中一帧。
7096
+ *
7097
+ * ## 载荷照 `steer`
7098
+ *
7099
+ * `text` 是文本投影(`contentToText()`,同落盘那一列),`parts` 只在有图片 / 文件时
7100
+ * 出现。内容是**斜杠命令展开之后**的那份 —— 和刷新之后历史里显示的是同一份。
7101
+ *
7102
+ * ⚠️ **发送方自己会再收到一遍。** 它在发出那一刻已经乐观上屏了,收到这一帧时拿
7103
+ * `clientMessageId` 认出这是自己那条、别再画一次。
7104
+ */
7105
+ | {
7106
+ type: 'user-message';
7107
+ text: string;
7108
+ parts?: EpochContentPart[];
7109
+ /** 发送方在 `POST /messages` 里给的编号,原样带回;没给就缺席(判据在 `WireSendMessageRequest.clientMessageId` 上) */
7110
+ clientMessageId?: string;
7057
7111
  };
7058
7112
  /** 信封里能装的所有东西 */
7059
7113
  type WireEvent = WireAgentEvent | WireHubEvent;
@@ -9394,6 +9448,49 @@ interface WireSendMessageRequest {
9394
9448
  * 缺席 = 这一条没有附件。**不写进下面那份必填清单**,同 `role`。
9395
9449
  */
9396
9450
  attachments?: readonly string[];
9451
+ /**
9452
+ * 这一条**按哪条自定义命令发**(2026-10-10):面板上挑中、挂成 chip 的那条命令名,
9453
+ * 不带斜杠。给了它,{@link message} 里装的就**只是参数**(可以为空、可以多行)。
9454
+ *
9455
+ * ## 为什么不拼成 `/name 参数` 一行字发
9456
+ *
9457
+ * 那一行要过服务端「这是不是一条命令」的判定(`server/src/commands.ts` 的
9458
+ * `parseSlashInput`),而那道判定**只认单行** —— 多行输入里第一行是 `/foo`,
9459
+ * 它按「一段以斜杠开头的文字」放行,这在用户**手打**的时候是对的(贴一段
9460
+ * `/etc/hosts` 再接着问)。挂着 chip 时用户已经明确挑了命令,没有意图可猜:
9461
+ * 参数里一换行,命令就悄悄不生效、而 chip 已经随着发送消失了。
9462
+ * 名字单独走这一格,那道判定在这条路上就压根不跑。
9463
+ *
9464
+ * ## ⚠️ 认不出来的名字是 400 `unknown-command`,这一条不发出去
9465
+ *
9466
+ * 判据逐字照上面 `role`:用户显式挑了一条命令,按普通消息发出去的话模型收到的
9467
+ * 只是一串参数,而屏幕上没有任何区别。手打的 `/xxx` 认不出来时照旧当普通文本 ——
9468
+ * 那是另一条路、另一种意图。
9469
+ *
9470
+ * 不是字符串 / 空串 = 当没给,同 `role`。缺席 = 这一条不是用 chip 挑的命令
9471
+ * (手打的 `/xxx` 仍走 `message` 那一行字的判定)。
9472
+ */
9473
+ command?: string;
9474
+ /**
9475
+ * 发送方给这一条起的编号(2026-10-10)—— **服务端不解读,原样带回**。
9476
+ *
9477
+ * 带回到两处:这一条自己开一轮时,贴在 Hub 事件 `user-message` 上;被正在跑的那一轮
9478
+ * 拉走时,贴在引擎那帧 `steer` 上。发送方在发出那一刻已经乐观上屏了,拿这个编号认出
9479
+ * 「这条回执是我那条」—— 开轮的不再画第二遍,插话的把本地那份换到事件流给的位置。
9480
+ *
9481
+ * ## 为什么要发送方自己起,而不是服务端起了在 202 里回
9482
+ *
9483
+ * 事件流那一帧可能**比 202 先到**(`hub.start()` 同步发帧,回包在它之后才写),
9484
+ * 服务端起的号发送方那时还不认得。自己起的号在乐观上屏那一刻就在手上,没有先后问题。
9485
+ *
9486
+ * ## 为什么不按条数、不按文字认
9487
+ *
9488
+ * 条数:两处几乎同一瞬间各发一条时会认错。文字:广播的是斜杠命令**展开之后**、
9489
+ * `@` 引用**附上之后**的内容,和发送方屏幕上那一行对不上。
9490
+ *
9491
+ * 不是字符串、空串、超过 128 个字符 = 当没给(这一条照常发,只是回执上不带编号)。
9492
+ */
9493
+ clientMessageId?: string;
9397
9494
  }
9398
9495
  declare const WIRE_SEND_MESSAGE_FIELDS: WireFields<WireSendMessageRequest>;
9399
9496
  /**
@@ -10317,6 +10414,14 @@ declare const WIRE_REWIND_RESPONSE_FIELDS: WireFields<WireRewindResponse>;
10317
10414
  interface WireCustomCommand {
10318
10415
  /** 命令名,不带斜杠。子目录用 `:` 连接(`commands/git/commit.md` → `git:commit`) */
10319
10416
  name: string;
10417
+ /**
10418
+ * frontmatter 的 `displayName`(`CustomCommandDef.displayName`,2026-10-10)。
10419
+ * **没写的命令这个键缺席**,判据同下面 `argumentHint`;回落到 `name` 在界面那一侧做。
10420
+ *
10421
+ * ⚠️ 它**只进屏幕**:面板那一行的标题、选中之后输入框里那枚 chip。发消息时
10422
+ * 带的仍是 `name`(`WireSendMessageRequest.command`)—— 服务端只认它。
10423
+ */
10424
+ displayName?: string;
10320
10425
  /** frontmatter 的 `description`。面板上名字后面那一行 */
10321
10426
  description: string;
10322
10427
  /**
package/dist/index.js CHANGED
@@ -844,7 +844,8 @@ var HUB_EVENT_TYPES = /* @__PURE__ */ new Set([
844
844
  "sessions-changed",
845
845
  "session-title-changed",
846
846
  "plugins-changed",
847
- "host-compose"
847
+ "host-compose",
848
+ "user-message"
848
849
  ]);
849
850
  function isWireHubEvent(event) {
850
851
  return HUB_EVENT_TYPES.has(event.type);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@epoch-agent/protocol",
3
- "version": "0.27.0",
3
+ "version": "0.28.0",
4
4
  "private": false,
5
5
  "description": "epoch-agent 契约层:工具 / 事件 / 权限 / 插件的类型定义,零运行时依赖",
6
6
  "repository": {