@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 +8 -0
- package/assets/bot-workers/setup/context/USER-GUIDE.md +1 -1
- package/assets/bot-workers/setup/skills/agents-and-team.md +1 -1
- package/assets/bot-workers/setup/skills/pricing.md +1 -1
- package/dist/commands/meetings.js +36 -1
- package/dist/lib/billing/plan-lock.d.ts +2 -2
- package/dist/lib/billing/plan-lock.js +2 -2
- package/dist/utils/manifest.d.ts +7 -1
- package/dist/utils/manifest.js +14 -6
- package/package.json +1 -1
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
|
|
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,
|
|
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
|
-
-
|
|
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
|
|
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
|
-
*
|
|
59
|
+
* Three: Starter includes three integrations. Matches the hq-pro server limit.
|
|
60
60
|
*/
|
|
61
|
-
export declare const STARTER_INTEGRATION_TARGET =
|
|
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
|
-
*
|
|
47
|
+
* Three: Starter includes three integrations. Matches the hq-pro server limit.
|
|
48
48
|
*/
|
|
49
|
-
export const STARTER_INTEGRATION_TARGET =
|
|
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. */
|
package/dist/utils/manifest.d.ts
CHANGED
|
@@ -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(
|
|
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
|
*
|
package/dist/utils/manifest.js
CHANGED
|
@@ -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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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 =
|
|
22
|
+
dir = parent;
|
|
15
23
|
}
|
|
16
|
-
return
|
|
24
|
+
return cwd;
|
|
17
25
|
}
|
|
18
26
|
/**
|
|
19
27
|
* Resolve the manifest path for a given HQ root.
|