@indigoai-us/hq-cli 5.345.52 → 5.345.54

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,14 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [5.345.54] — 2026-10-08
6
+ - Prevents `hq` commands run outside an HQ tree on Windows from hanging while searching parent directories for an HQ root.
7
+
8
+ ## [5.345.53] — 2026-10-08
9
+ - Starter plan-limit notices quote 3 integrations when the server sends no integration limit, up from 1. The setup guide, pricing skill, and agents-and-team skill now say Starter includes 3 integrations (connected apps).
10
+
11
+ - `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.
12
+
5
13
  ## [5.345.52] — 2026-10-08
6
14
  - Improves recovery from disk-full sync failures by using the updated hq-cloud rescue staging flow.
7
15
 
@@ -323,7 +323,7 @@ HQ/
323
323
  HQ has three plans: **Starter**, **HQ Workforce** ($500/month per workspace), and
324
324
  **Enterprise**.
325
325
 
326
- Starter is free. It holds up to 5 members and includes 1 integration. MCP,
326
+ Starter is free. It holds up to 5 members and includes 3 integrations. MCP,
327
327
  Atlas, and telemetry are not included. Everything else — knowledge, projects,
328
328
  policies, workers, secrets, vault storage, `hq deploy`, and `hq share` — works
329
329
  the same as on the paid plans.
@@ -29,7 +29,7 @@ Run `hq whoami` and `hq companies list`, and read the "Owner context" block.
29
29
  3. **Their plan, when the flow depends on it.** Check it as
30
30
  `skills/pricing.md` says; never guess it. Inviting people, sharing a
31
31
  connected app and sharing a key are included in every plan (within
32
- Starter's limits of 5 people, 1 connected app and 10 keys). Hosted agents,
32
+ Starter's limits of 5 people, 3 connected apps and 10 keys). Hosted agents,
33
33
  Slack agents included, are not part of Starter: they need HQ Workforce
34
34
  ($500 a month for the company), and then each agent is $100 a month on
35
35
  top. If HQ refuses something or quotes a price, pass that answer on.
@@ -36,7 +36,7 @@ often empty; when it is empty it tells you nothing about the plan.
36
36
  **Starter, free.** For a company getting started:
37
37
 
38
38
  - up to 5 people (invitations not yet accepted count toward the 5)
39
- - 1 connected app
39
+ - 3 connected apps
40
40
  - 10 keys
41
41
  - 10 GB of files and 500 site deploys
42
42
  - no hosted agents (see "Agents" below)
@@ -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)))
@@ -56,9 +56,9 @@ export interface PlanLimitStatus {
56
56
  export declare const STARTER_MEMBER_TARGET = 5;
57
57
  /**
58
58
  * Starter integration cap quoted when the server did not send a limit.
59
- * One: Starter includes a single integration (US-020 owner decision 11).
59
+ * Three: Starter includes three integrations. Matches the hq-pro server limit.
60
60
  */
61
- export declare const STARTER_INTEGRATION_TARGET = 1;
61
+ export declare const STARTER_INTEGRATION_TARGET = 3;
62
62
  /** Starter secret cap quoted when the server did not send a secrets.limit. */
63
63
  export declare const STARTER_SECRET_TARGET = 10;
64
64
  /** Starter agent cap quoted when the server did not send an agents.limit. */
@@ -44,9 +44,9 @@ export const PLAN_LIMIT_REASONS = [
44
44
  export const STARTER_MEMBER_TARGET = 5;
45
45
  /**
46
46
  * Starter integration cap quoted when the server did not send a limit.
47
- * One: Starter includes a single integration (US-020 owner decision 11).
47
+ * Three: Starter includes three integrations. Matches the hq-pro server limit.
48
48
  */
49
- export const STARTER_INTEGRATION_TARGET = 1;
49
+ export const STARTER_INTEGRATION_TARGET = 3;
50
50
  /** Starter secret cap quoted when the server did not send a secrets.limit. */
51
51
  export const STARTER_SECRET_TARGET = 10;
52
52
  /** Starter agent cap quoted when the server did not send an agents.limit. */
@@ -1,5 +1,11 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
1
3
  import type { ModulesManifest, ModuleDefinition, ModuleLock, SyncState } from '../types.js';
2
- export declare function findHqRoot(): string;
4
+ export declare function findHqRoot(options?: {
5
+ cwd?: string;
6
+ pathApi?: Pick<typeof path, 'dirname' | 'join'>;
7
+ existsSync?: typeof fs.existsSync;
8
+ }): string;
3
9
  /**
4
10
  * Resolve the manifest path for a given HQ root.
5
11
  *
@@ -5,15 +5,23 @@ import { parseUserYaml } from './user-yaml-error.js';
5
5
  const MANIFEST_FILE = 'modules.yaml';
6
6
  const LOCK_FILE = 'modules.lock';
7
7
  const STATE_FILE = '.hq-sync-state.json';
8
- export function findHqRoot() {
9
- let dir = process.cwd();
10
- while (dir !== '/') {
11
- if (fs.existsSync(path.join(dir, '.claude')) || fs.existsSync(path.join(dir, 'workers'))) {
8
+ export function findHqRoot(options = {}) {
9
+ const cwd = options.cwd ?? process.cwd();
10
+ const pathApi = options.pathApi ?? path;
11
+ const existsSync = options.existsSync ?? fs.existsSync;
12
+ let dir = cwd;
13
+ while (true) {
14
+ const parent = pathApi.dirname(dir);
15
+ // Check the fixed point before looking for markers so POSIX keeps its
16
+ // existing behavior of never checking `/` itself.
17
+ if (parent === dir)
18
+ break;
19
+ if (existsSync(pathApi.join(dir, '.claude')) || existsSync(pathApi.join(dir, 'workers'))) {
12
20
  return dir;
13
21
  }
14
- dir = path.dirname(dir);
22
+ dir = parent;
15
23
  }
16
- return process.cwd();
24
+ return cwd;
17
25
  }
18
26
  /**
19
27
  * Resolve the manifest path for a given HQ root.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@indigoai-us/hq-cli",
3
- "version": "5.345.52",
3
+ "version": "5.345.54",
4
4
  "description": "HQ by Indigo management CLI — modules and cloud sync",
5
5
  "main": "dist/index.js",
6
6
  "bin": {