@indigoai-us/hq-cli 5.345.51 → 5.345.53

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 CHANGED
@@ -2,6 +2,12 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [5.345.53] — 2026-10-08
6
+ - `hq meetings live` now also lists live meetings you were invited to but did not record, such as a standup a teammate's notetaker is recording, so you can read their live transcript.
7
+
8
+ ## [5.345.52] — 2026-10-08
9
+ - Improves recovery from disk-full sync failures by using the updated hq-cloud rescue staging flow.
10
+
5
11
  ## [5.345.51] — 2026-10-08
6
12
 
7
13
  - Multi-company session locking now defaults on across native CLI readers; an explicit false flag value remains the kill switch.
@@ -107,6 +107,40 @@ function liveBotTime(bot) {
107
107
  .filter(Number.isFinite);
108
108
  return times.length > 0 ? Math.max(...times) : Number.NEGATIVE_INFINITY;
109
109
  }
110
+ /**
111
+ * Live meetings in this company the caller may read but did not record.
112
+ *
113
+ * `/v1/bot/list` returns only the caller's own notetakers, so a meeting a
114
+ * coworker recorded never appears there. The meetings API lists the live
115
+ * meetings the caller is an attendee of. An older server ignores `view=live`
116
+ * and answers with the ordinary meeting list, which has no `bots`, and any
117
+ * failure here leaves the caller's own list unchanged.
118
+ */
119
+ async function fetchAttendedLiveBots(token, companyId) {
120
+ try {
121
+ const res = await vaultApiFetch({ token, path: "/v1/meetings", query: { companyId, view: "live" } });
122
+ if (!res.ok)
123
+ return [];
124
+ const data = (await res.json());
125
+ return Array.isArray(data.bots) ? data.bots : [];
126
+ }
127
+ catch {
128
+ return [];
129
+ }
130
+ }
131
+ /** The caller's own bots first; attended meetings they did not record added after. */
132
+ function mergeLiveMeetingBots(own, attended) {
133
+ const seen = new Set(own.map(liveBotId).filter((id) => Boolean(id)));
134
+ const merged = [...own];
135
+ for (const bot of attended) {
136
+ const id = liveBotId(bot);
137
+ if (!id || seen.has(id))
138
+ continue;
139
+ seen.add(id);
140
+ merged.push(bot);
141
+ }
142
+ return merged;
143
+ }
110
144
  /** Select bots intended for the default `meetings live` listing. */
111
145
  function selectLiveMeetingBots(bots, companyId, includeAll, now = new Date()) {
112
146
  const companyBots = bots.filter((bot) => bot.companyId === companyId);
@@ -390,7 +424,8 @@ export function registerMeetingsCommand(program) {
390
424
  if (!res.ok)
391
425
  await failLiveResponse(res);
392
426
  const data = (await res.json());
393
- const bots = Array.isArray(data.bots) ? data.bots : [];
427
+ const ownBots = Array.isArray(data.bots) ? data.bots : [];
428
+ const bots = mergeLiveMeetingBots(ownBots, await fetchAttendedLiveBots(token, companyId));
394
429
  const visible = selectLiveMeetingBots(bots, companyId, opts.all === true);
395
430
  const readable = await mapWithConcurrency(visible, LIVE_LIST_SNAPSHOT_CONCURRENCY, async (bot) => {
396
431
  if (!LIVE_SNAPSHOT_STATUSES.has(normalizedLiveBotStatus(bot)))