diff --git a/shortcuts/vc/vc_meeting_events.go b/shortcuts/vc/vc_meeting_events.go index 76c4a3517..641322deb 100644 --- a/shortcuts/vc/vc_meeting_events.go +++ b/shortcuts/vc/vc_meeting_events.go @@ -176,6 +176,7 @@ type meetingEventsEvent struct { func buildMeetingEventsOutput(data map[string]interface{}, events []interface{}, currentRoster []interface{}, identity meetingEventsIdentity, warnings ...string) meetingEventsOutput { output := meetingEventsOutput{ + Meeting: meetingEventsMeetingFromPayload(nil), Identity: identity, HasMore: common.GetBool(data, "has_more"), PageToken: common.GetString(data, "page_token"), @@ -191,8 +192,8 @@ func buildMeetingEventsOutput(data map[string]interface{}, events []interface{}, continue } payload := common.GetMap(event, "payload") - if output.Meeting.ID == "" { - output.Meeting = meetingEventsMeetingFromPayload(common.GetMap(payload, "meeting")) + if meeting := common.GetMap(payload, "meeting"); meeting != nil { + output.Meeting = meetingEventsMeetingFromPayload(meeting) } output.Events = append(output.Events, meetingEventsEventFromPayload(event, output.Identity)) } diff --git a/shortcuts/vc/vc_meeting_events_test.go b/shortcuts/vc/vc_meeting_events_test.go index a02659e01..3a9e771d7 100644 --- a/shortcuts/vc/vc_meeting_events_test.go +++ b/shortcuts/vc/vc_meeting_events_test.go @@ -747,6 +747,31 @@ func TestMeetingEvents_ExecuteJSON_OngoingMeetingOmitsEndTime(t *testing.T) { } } +func TestBuildMeetingEventsOutput_UsesLatestMeetingSnapshot(t *testing.T) { + out := buildMeetingEventsOutput(map[string]interface{}{}, []interface{}{ + participantJoinedEventOngoing(), + participantJoinedEvent(), + }, nil, meetingEventsIdentity{}) + + if got := out.Meeting.Status; got != "ended" { + t.Fatalf("meeting status = %q, want ended", got) + } + if got := out.Meeting.EndTime; got != "2026-04-17T07:35:00Z" { + t.Fatalf("meeting end_time = %q, want latest ended snapshot", got) + } + if got := len(out.Events); got != 2 { + t.Fatalf("events len = %d, want 2", got) + } +} + +func TestBuildMeetingEventsOutput_EmptyEventsHasUnknownMeetingStatus(t *testing.T) { + out := buildMeetingEventsOutput(map[string]interface{}{}, nil, nil, meetingEventsIdentity{}) + + if got := out.Meeting.Status; got != "unknown" { + t.Fatalf("meeting status = %q, want unknown", got) + } +} + func TestMeetingEvents_ExecuteNDJSONIncludesMetadataRow(t *testing.T) { f, stdout, _, reg := cmdutil.TestFactory(t, defaultConfig()) reg.Register(meetingEventsStub([]interface{}{participantJoinedEvent()}, true, "1710000000000000000")) 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 8717d2658..46832f0a9 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 @@ -286,7 +286,7 @@ lark-cli vc +meeting-events \ | `--meeting-id is required` | 未传入 `--meeting-id` | 传入长数字 `meeting.id` | | `10005 bot is not in meeting` | 使用应用身份读取,但应用机器人从未真实入会该会议;或会议已结束但应用机器人从未在会中出现过 | 如果 `meeting_id` 来自用户身份发现,改回 `--as user`;如果确实要应用身份读取,先让应用机器人入会或确认它曾参会后再用 `--as bot`。**如果只是想看参会人快照,改用 `lark-cli vc meeting get --params '{"meeting_id":""}' --with-participants`** | | 用户身份无权限 / 不可见 | 当前用户不是该会议的可见参与者,或 `meeting_id` 不是从用户身份路径获得 | 不要反复执行 `auth login`。先确认 `meeting_id` 是否来自 `+meeting-list-active --as user`;如果用户明确要切到应用身份,再通过 `+meeting-list-active --as bot --user-id ` 获取应用身份可读的 `meeting_id`,或在用户明确同意后让应用机器人入会,再用 `+meeting-events --as bot` 读取 | -| `20001 meeting_status_MEETING_END` | 会议已结束且已超出后端允许的 5 分钟宽限窗口 | 本接口不再适合继续拉取事件。先用 `lark-cli vc +notes --meeting-ids ` 获取会议产物信息,再根据 `note_display_type` / `note_id` / `minute_token` 和用户意图选择纪要正文、逐字稿或妙记;参会人请用 `lark-cli vc meeting get --params '{"meeting_id":""}' --with-participants` | +| `20001 meeting_status_MEETING_END` | 会议已结束且已超出后端允许的 5 分钟宽限窗口 | 本接口不再适合继续拉取事件。先用 `lark-cli vc +detail --meeting-ids ` 获取会议产物信息,再根据 `note_display_type` / `note_id` / `minute_token` 和用户意图选择纪要正文、逐字稿或妙记;参会人请用 `lark-cli vc meeting get --params '{"meeting_id":""}' --with-participants` | | `20002 meeting not exist` | `meeting_id` 错误,或会议实例当前已不可获取(常见于把 9 位会议号当 meeting_id 传) | 确认传入的是长数字 `meeting_id`,不是 9 位会议号 | | 应用身份权限不足 | 应用权限、租户安装、权限可访问的数据范围或 VC Agent privilege 未配置完整 | 不要执行 `auth login`。以 CLI 返回的 metadata / error envelope 为准确认缺失权限;检查应用发布/安装,以及开放平台“权限可访问的数据范围”:选择“按条件筛选”,条件为“会议的归属者 包含 与应用的可用范围一致”;仍失败再排查内测 privilege / 灰度 | | `HTTP 404` / `HTTP 500` | 服务端当前无法找到或处理该会议实例 | 换一个正在进行且 bot 可见的 meeting_id,或排查后端问题 |