@indigoai-us/hq-cli 5.190.0 → 5.191.0
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.191.0] — 2026-09-25
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
|
|
9
|
+
- `hq agents provision` now rejects an invalid `--slug` before sending the agent create request.
|
|
10
|
+
|
|
5
11
|
## [5.190.0] — 2026-09-25
|
|
6
12
|
|
|
7
13
|
### Added
|
|
@@ -19,6 +25,12 @@
|
|
|
19
25
|
- `hq bot promote` accepts server-signed upload URLs without SSE headers when the bucket supplies encryption. SSE header names are checked case-insensitively, and any supplied encryption must be a complete SSE-KMS pair.
|
|
20
26
|
- Company slug lookup errors now point to the supported `hq sources entities` command.
|
|
21
27
|
|
|
28
|
+
### Added
|
|
29
|
+
|
|
30
|
+
- QMD native-binding startup failures after sync can emit an actionable warning
|
|
31
|
+
when the `qmd.reindex-startup-warning` hq-flags canary is enabled. The flag
|
|
32
|
+
defaults off, and sync still succeeds when indexing cannot run.
|
|
33
|
+
|
|
22
34
|
## [5.189.0] — 2026-09-25
|
|
23
35
|
|
|
24
36
|
### Added
|
package/dist/commands/agents.js
CHANGED
|
@@ -55,6 +55,8 @@ export const VALID_PROVIDERS = new Set(["codex", "grok", "claude", "agents-v2"])
|
|
|
55
55
|
export const VALID_AUTH_MODES = new Set(["subscription", "apiKey"]);
|
|
56
56
|
/** Customer-facing agent size keys served by hq-pro's authoritative catalog. */
|
|
57
57
|
export const VALID_AGENT_SIZE_KEYS = new Set(["basic", "power", "dev"]);
|
|
58
|
+
// Keep cloud agent create slugs aligned with hq-pro-agents POST /v1/agents.
|
|
59
|
+
const AGENT_SLUG_PATTERN = /^[a-z0-9][a-z0-9-]{0,62}$/;
|
|
58
60
|
const CLAUDE_PROVISION_COMMAND = "hq agents provision <name> --provider agents-v2 --model claude-opus-5-5";
|
|
59
61
|
const CLAUDE_API_KEY_ARGS = "--auth-mode apiKey --api-key-env <VAR>";
|
|
60
62
|
function claudeProvisionGuidance() {
|
|
@@ -1281,6 +1283,12 @@ export function registerAgentsCommand(program) {
|
|
|
1281
1283
|
.addHelpText("after", `\n${claudeProvisionGuidance()}\n`)
|
|
1282
1284
|
.action(async function (name, opts) {
|
|
1283
1285
|
try {
|
|
1286
|
+
const slug = opts.slug ?? slugifyAgentName(name);
|
|
1287
|
+
if (!AGENT_SLUG_PATTERN.test(slug)) {
|
|
1288
|
+
console.error(chalk.red("Agent slug must start with a lowercase letter or digit, contain only lowercase letters, digits, and hyphens, and be at most 63 characters. " +
|
|
1289
|
+
"Update --slug or the agent name."));
|
|
1290
|
+
process.exit(1);
|
|
1291
|
+
}
|
|
1284
1292
|
// Both of these previously fell back to their default on an
|
|
1285
1293
|
// unrecognised value, silently provisioning a billable box the operator
|
|
1286
1294
|
// did not ask for. They now exit(1) instead — see parseEnumOption.
|
|
@@ -1341,7 +1349,6 @@ export function registerAgentsCommand(program) {
|
|
|
1341
1349
|
// Every path confirms hq-pro's company-specific quote. Omission still
|
|
1342
1350
|
// leaves the POST size implicit, preserving the server-side default.
|
|
1343
1351
|
confirmAgentCreateQuoteOrExit(quotedSize, opts.yes, opts.json);
|
|
1344
|
-
const slug = opts.slug ?? slugifyAgentName(name);
|
|
1345
1352
|
try {
|
|
1346
1353
|
const result = await provisionAgent(token, {
|
|
1347
1354
|
companyUid,
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { type EmbedLockDependencies } from "../search-index/embed-lock.js";
|
|
2
2
|
import { type LoadGateDependencies } from "../search-index/load-gate.js";
|
|
3
3
|
import { type UtilityIo } from "./common.js";
|
|
4
|
+
export declare const QMD_REINDEX_STARTUP_WARNING_FLAG = "qmd.reindex-startup-warning";
|
|
5
|
+
export declare const QMD_REINDEX_STARTUP_WARNING_FLAG_FALLBACK = false;
|
|
4
6
|
export type QmdReindexOptions = UtilityIo & {
|
|
5
7
|
cwd?: string;
|
|
6
8
|
/** Test seams; default to the real search-index implementations. */
|
|
@@ -17,6 +19,8 @@ export type QmdReindexOptions = UtilityIo & {
|
|
|
17
19
|
embedLockDependencies?: EmbedLockDependencies;
|
|
18
20
|
/** Test seams for the host load gate consulted while the embed lock is held. */
|
|
19
21
|
loadGateDependencies?: LoadGateDependencies;
|
|
22
|
+
/** Test seam for the hq-flags-gated warning on qmd native startup failures. */
|
|
23
|
+
startupFailureWarningsEnabled?: () => boolean;
|
|
20
24
|
};
|
|
21
25
|
export declare function qmdReindexAfterSync(args?: string[], options?: QmdReindexOptions): number;
|
|
22
26
|
//# sourceMappingURL=qmd-reindex-after-sync.d.ts.map
|
|
@@ -15,7 +15,14 @@ import { reconcileCollections, resolveQmdBin, resolveQmdHome, runQmd } from "../
|
|
|
15
15
|
import { applyIndexSizeLimit } from "../search-index/max-doc-bytes.js";
|
|
16
16
|
import { defaultEmbedLockDependencies, runWithEmbedLock, } from "../search-index/embed-lock.js";
|
|
17
17
|
import { LoadGateConfigurationError, checkEmbedLoad, defaultLoadGateDependencies, recordSuccessfulEmbed, } from "../search-index/load-gate.js";
|
|
18
|
+
import { resolveProcessFlagGate } from "../flag-registry.js";
|
|
19
|
+
import { isQmdNativeBindingError, QMD_NATIVE_BINDING_REMEDY, } from "../../utils/qmd-native-binding-error.js";
|
|
18
20
|
import { ioFor, line } from "./common.js";
|
|
21
|
+
export const QMD_REINDEX_STARTUP_WARNING_FLAG = "qmd.reindex-startup-warning";
|
|
22
|
+
export const QMD_REINDEX_STARTUP_WARNING_FLAG_FALLBACK = false;
|
|
23
|
+
function qmdStartupFailureWarningsEnabled() {
|
|
24
|
+
return resolveProcessFlagGate(QMD_REINDEX_STARTUP_WARNING_FLAG, { fallback: QMD_REINDEX_STARTUP_WARNING_FLAG_FALLBACK }, () => QMD_REINDEX_STARTUP_WARNING_FLAG_FALLBACK);
|
|
25
|
+
}
|
|
19
26
|
export function qmdReindexAfterSync(args = [], options = {}) {
|
|
20
27
|
let hqRoot = "";
|
|
21
28
|
let embed = false;
|
|
@@ -42,6 +49,15 @@ export function qmdReindexAfterSync(args = [], options = {}) {
|
|
|
42
49
|
const run = options.run ?? ((argv, opts) => runQmd(argv, opts));
|
|
43
50
|
const sizeLimit = options.sizeLimit ?? ((root) => applyIndexSizeLimit(root));
|
|
44
51
|
const { stderr } = ioFor(options);
|
|
52
|
+
let startupFailureWarningShown = false;
|
|
53
|
+
const warnOnNativeStartupFailure = (error) => {
|
|
54
|
+
if (startupFailureWarningShown ||
|
|
55
|
+
!isQmdNativeBindingError(error) ||
|
|
56
|
+
!(options.startupFailureWarningsEnabled ?? qmdStartupFailureWarningsEnabled)())
|
|
57
|
+
return;
|
|
58
|
+
startupFailureWarningShown = true;
|
|
59
|
+
line(stderr, `hq: search index was not updated after sync; ${QMD_NATIVE_BINDING_REMEDY}`);
|
|
60
|
+
};
|
|
45
61
|
// Every qmd interaction is best-effort: the shell suffixed each with `|| true`.
|
|
46
62
|
try {
|
|
47
63
|
reconcile(hqRoot, { bin });
|
|
@@ -62,7 +78,8 @@ export function qmdReindexAfterSync(args = [], options = {}) {
|
|
|
62
78
|
try {
|
|
63
79
|
run(["update"], { bin, cwd: hqRoot });
|
|
64
80
|
}
|
|
65
|
-
catch {
|
|
81
|
+
catch (error) {
|
|
82
|
+
warnOnNativeStartupFailure(error);
|
|
66
83
|
/* never fail a sync on index freshness */
|
|
67
84
|
}
|
|
68
85
|
if (embed) {
|
|
@@ -91,6 +108,7 @@ export function qmdReindexAfterSync(args = [], options = {}) {
|
|
|
91
108
|
catch (error) {
|
|
92
109
|
if (error instanceof LoadGateConfigurationError)
|
|
93
110
|
line(stderr, `hq: ${error.message}`);
|
|
111
|
+
warnOnNativeStartupFailure(error);
|
|
94
112
|
/* embeddings are deferred-cost and optional */
|
|
95
113
|
}
|
|
96
114
|
}
|