From d18438dfcdec5ffef41274147c2683835d5515c8 Mon Sep 17 00:00:00 2001 From: renaocheng Date: Mon, 6 Jul 2026 21:17:43 +0800 Subject: [PATCH] fix(vc): preserve meeting event group --- shortcuts/vc/vc_meeting_events.go | 2 ++ shortcuts/vc/vc_meeting_events_test.go | 6 ++++-- skills/lark-vc-agent/SKILL.md | 2 +- .../references/lark-vc-agent-meeting-events.md | 4 ++-- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/shortcuts/vc/vc_meeting_events.go b/shortcuts/vc/vc_meeting_events.go index 9dcc81c7a..bf58c2cce 100644 --- a/shortcuts/vc/vc_meeting_events.go +++ b/shortcuts/vc/vc_meeting_events.go @@ -168,6 +168,7 @@ type meetingEventsEvent struct { EventID string `json:"event_id,omitempty"` EventType string `json:"event_type,omitempty"` EventTime string `json:"event_time,omitempty"` + Group interface{} `json:"group,omitempty"` Actors []meetingEventsIdentity `json:"actors,omitempty"` Payload map[string]interface{} `json:"payload,omitempty"` } @@ -279,6 +280,7 @@ func meetingEventsEventFromPayload(event map[string]interface{}, selfIdentity me EventID: common.GetString(event, "event_id"), EventType: meetingEventType(event), EventTime: meetingEventsTimeString(common.GetString(event, "event_time")), + Group: event["group"], Payload: payload, } out.Actors = eventActors(out.EventType, payload, selfIdentity) diff --git a/shortcuts/vc/vc_meeting_events_test.go b/shortcuts/vc/vc_meeting_events_test.go index dc2fcf379..3aa5476f2 100644 --- a/shortcuts/vc/vc_meeting_events_test.go +++ b/shortcuts/vc/vc_meeting_events_test.go @@ -116,6 +116,7 @@ func participantJoinedEvent() map[string]interface{} { "event_id": "event-1", "event_type": "participant_joined", "event_time": "2026-04-17T08:00:00Z", + "group": "group-1", "payload": map[string]interface{}{ "activity_event_type": "participant_joined", "meeting": map[string]interface{}{ @@ -621,6 +622,7 @@ func TestMeetingEvents_ExecuteJSON(t *testing.T) { `"role":"host"`, `"is_self":true`, `"event_type":"participant_joined"`, + `"group":"group-1"`, `"actors":[`, `"start_time":"2026-04-17T06:35:00Z"`, `"has_more":true`, @@ -834,7 +836,7 @@ func TestMeetingEvents_ExecuteNDJSONIncludesMetadataRow(t *testing.T) { if len(lines) != 2 { t.Fatalf("ndjson lines = %d, want 2: %s", len(lines), stdout.String()) } - if !strings.Contains(lines[0], `"row_type":"event"`) || !strings.Contains(lines[0], `"event_type":"participant_joined"`) { + if !strings.Contains(lines[0], `"row_type":"event"`) || !strings.Contains(lines[0], `"event_type":"participant_joined"`) || !strings.Contains(lines[0], `"group":"group-1"`) { t.Fatalf("first ndjson row should be event: %s", lines[0]) } for _, unwanted := range []string{ @@ -869,7 +871,7 @@ func TestMeetingEventsEventRows_OmitsEmptyEventFields(t *testing.T) { if !ok { t.Fatalf("row type = %T, want map", rows[0]) } - for _, unwanted := range []string{"event_id", "event_time", "actors", "payload"} { + for _, unwanted := range []string{"event_id", "event_time", "group", "actors", "payload"} { if _, exists := row[unwanted]; exists { t.Fatalf("row should omit %q when empty: %#v", unwanted, row) } diff --git a/skills/lark-vc-agent/SKILL.md b/skills/lark-vc-agent/SKILL.md index f31ac0cda..97140f99d 100644 --- a/skills/lark-vc-agent/SKILL.md +++ b/skills/lark-vc-agent/SKILL.md @@ -73,7 +73,7 @@ metadata: - 再根据 `note_id`、`minute_token` 和用户意图,按 [`lark-vc`](../lark-vc/SKILL.md) 的产物决策读取正文、逐字稿或妙记。 - 想看参会人快照:用 `vc meeting get --with-participants`(见 [`lark-vc`](../lark-vc/SKILL.md)) 5. **默认必须使用** **`--page-all`**,除非用户明确要求“只查一页”,或确实需要控制返回体大小。 -6. 命令默认输出结构化事件契约:`meeting`、`identity`、`current_participants`、`events`、`warnings`、`has_more`、`page_token`;`identity` 表示当前读取身份,参会人含 `participant_type`、`role`、`is_self` 和可读 `label`,事件细节保留在 `payload`。 +6. 命令默认输出结构化事件契约:`meeting`、`identity`、`current_participants`、`events`、`warnings`、`has_more`、`page_token`;`identity` 表示当前读取身份,参会人含 `participant_type`、`role`、`is_self` 和可读 `label`,事件保留 `group` 用于聚合分组,细节保留在 `payload`。 7. 输出格式默认优先 `--format pretty`(时间线更易读,并带当前身份与当前名单标签);需要稳定字段做结构化处理时用 `--format json`;需要流式消费事件时用 `--format ndjson`。 8. **必须识别分页信号**:只要响应里出现 `has_more=true`、pretty 里的 `more available`,或返回了非空 `page_token`,就不能把当前结果当作完整事件流;默认应继续分页,或明确告诉用户当前只是部分结果。 9. 保留响应里的 `page_token`,下次增量拉取直接续,不要从头再拉。 diff --git a/skills/lark-vc-agent/references/lark-vc-agent-meeting-events.md b/skills/lark-vc-agent/references/lark-vc-agent-meeting-events.md index 16a329f30..24ab9251c 100644 --- a/skills/lark-vc-agent/references/lark-vc-agent-meeting-events.md +++ b/skills/lark-vc-agent/references/lark-vc-agent-meeting-events.md @@ -110,7 +110,7 @@ lark-cli vc +meeting-events --as user --meeting-id --page-all --format pret ### 5. 输出格式差异 -- `--format json`:结构化契约,顶层包含 `meeting`、`identity`、`current_participants`、`events`、`has_more`、`page_token`。`identity` 表示当前读取身份;参会人身份统一含 `participant_type`、`role`、`is_self`、`label`;每条事件保留 `payload` 便于追溯细节。 +- `--format json`:结构化契约,顶层包含 `meeting`、`identity`、`current_participants`、`events`、`has_more`、`page_token`。`identity` 表示当前读取身份;参会人身份统一含 `participant_type`、`role`、`is_self`、`label`;每条事件保留 `group` 用于聚合分组,保留 `payload` 便于追溯细节。 - `--format pretty`:默认推荐格式,输出当前身份、当前名单和逐条时间线,适合快速理解“发生了什么”。 - `--format ndjson`:输出事件行,并带 metadata 行,适合流式消费。 @@ -161,7 +161,7 @@ lark-cli vc +meeting-events --as user --meeting-id --page-all --format pret | `meeting` | 会议身份与时间状态,包含 `id/topic/meeting_no/start_time/end_time/status` | | `identity` | 当前读取身份,包含 `id/name/participant_type/is_self/label` | | `current_participants` | 服务端当前参会人名单;当参会人缺少姓名或类型为 `unknown` 时,CLI 会用同 ID 的事件 actor 信息补全,不做完整历史 replay | -| `events` | 结构化事件列表;每条事件含 `actors` 和事件细节 `payload` | +| `events` | 结构化事件列表;每条事件含用于聚合分组的 `group`、参与者 `actors` 和事件细节 `payload` | | `warnings` | 非阻断告警列表,例如当前名单补充信息不可用;事件列表本身仍可使用 | | `has_more` | 是否还有下一页 | | `page_token` | 下一页游标 |