@indigoai-us/hq-cli 5.345.162 → 5.345.164

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.
Files changed (35) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/dist/command-catalog.generated.d.ts +341 -1
  3. package/dist/command-catalog.generated.js +422 -1
  4. package/dist/command-registration-plan.d.ts +6 -0
  5. package/dist/command-registration-plan.js +1 -0
  6. package/dist/commands/billing-usage.d.ts +16 -2
  7. package/dist/commands/billing-usage.js +63 -9
  8. package/dist/commands/billing.d.ts +34 -0
  9. package/dist/commands/billing.js +108 -1
  10. package/dist/commands/deploy-domains.d.ts +53 -0
  11. package/dist/commands/deploy-domains.js +802 -0
  12. package/dist/commands/feedback-triage.d.ts +67 -0
  13. package/dist/commands/feedback-triage.js +294 -0
  14. package/dist/commands/feedback.d.ts +13 -1
  15. package/dist/commands/feedback.js +32 -8
  16. package/dist/lib/billing/billing-status-lines.d.ts +14 -0
  17. package/dist/lib/billing/billing-status-lines.js +43 -0
  18. package/dist/lib/billing/usage-only.d.ts +18 -0
  19. package/dist/lib/billing/usage-only.js +18 -1
  20. package/dist/lib/doctor/checks/sync-runtime.d.ts +34 -0
  21. package/dist/lib/doctor/checks/sync-runtime.js +217 -8
  22. package/dist/lib/doctor/fix/apply.js +1 -0
  23. package/dist/lib/doctor/fix/refresh-sync-outcome.d.ts +4 -1
  24. package/dist/lib/doctor/fix/refresh-sync-outcome.js +15 -0
  25. package/dist/lib/doctor/fix/refresh-sync-progress.d.ts +42 -0
  26. package/dist/lib/doctor/fix/refresh-sync-progress.js +100 -0
  27. package/dist/lib/doctor/json-output.d.ts +7 -0
  28. package/dist/lib/doctor/json-output.js +8 -1
  29. package/dist/lib/doctor/types.d.ts +1 -1
  30. package/dist/lib/doctor/types.js +1 -0
  31. package/dist/lib/mesh/live/daemon/work-subscribe.d.ts +1 -1
  32. package/dist/lib/mesh/live/daemon/work-subscribe.js +121 -38
  33. package/dist/lib/mesh/live/paths.d.ts +1 -0
  34. package/dist/lib/mesh/live/paths.js +1 -0
  35. package/package.json +7 -7
package/CHANGELOG.md CHANGED
@@ -2,6 +2,39 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [5.345.164] — 2026-10-23
6
+ - `hq billing status` and `hq billing usage --card` now show trial usage against the $500 trial cap, the $10 included usage, the spend limit and a prompt to add a card when usage passes the included amount. The plan line says "unavailable right now" instead of guessing Starter, invoice-billed companies read as a flat plan billed by invoice, and a failed read of a scheduled switch is reported.
7
+ - `hq deploy domains` refuses a name that is really an IPv4 address. Inputs such as `1.2`, `0x7f.1` and `1.2.3.4` were rewritten to an address and accepted; a numeric last label is now refused before any request.
8
+ - `hq deploy domains buy`: when the domain is registered but the card charge does not complete, the output now prints the order's idempotency key and says to run the same command again with it to retry the charge. It no longer says that HQ billing follows up, which nothing did.
9
+ - `--company` that matches the folder's link in a different case is accepted, and the link's slug is sent.
10
+ - `hq doctor` now says which cloud call the sync receiver was refused on. `sync.runtime.receiver-permission` breaks its count down by call class (the per-device queue credentials from `POST /v1/sync/subscribe`, the subscribe call itself, the latency metric, or the object pull after a change event) and gives the matching next step, instead of one bare count. A new `sync.runtime.pull-access-denied` check warns when the same vault key was refused on two or more pulls in the hour and names the repeatedly refused keys (relative keys only, at most 10, with the runner's latest reason tag; a key refused once is counted but not named). In a session locked to companies, only keys from those companies are named and the rest are counted, so doctor never prints another company's file names from the machine-wide sync log; a refusal with no company label is shown as `unknown` with no lookup command. The warning gives the `hq files acl` command to compare the stored grant with the key the pull looked up. Before this, every automated client-health report for a refused receiver carried only a count and could not be acted on (feedback_cd56a501 and 27 linked reports).
11
+ - A stale sync journal whose `hq doctor --fix` pull ended offline, timed out, or hit a server 5xx is no longer reported as unrepaired by the client-health hook: doctor JSON leaves those rows out for 15 minutes after the attempt and lists them under `transientRefreshSyncCheckIds`, so the next SessionStart retries the pull instead of filing a report. A pull the service refused (4xx) or that failed for another reason is still reported. The `--fix` progress file records each journal's pull outcome as additive fields (still version 2, so an older CLI sharing the same HQ root keeps reading it, and an outcome value this CLI does not know is dropped rather than failing `--fix`); a journal that has failed transiently for more than 24 hours is reported again.
12
+ - `hq-hook bridge-plan` now also lists bridged helpers: `derive-trigger-facts`
13
+ appears when its flag `hook-engine-port-derive-trigger-facts` is `shadow` or
14
+ `on`. master-hook.sh passes the plan to the policy injector, which then runs
15
+ its fact helper through `hq-hook bridge derive-trigger-facts` instead of
16
+ bash (US-008). The flag defaults to off, the kill switch still forces bash,
17
+ and `hq-hook --self-check` reports the list as `helper_bridge_ports`. The
18
+ engine version is now 0.3.0.
19
+ - `hq-hook run policy-enforcement-gate` is the first hook port master-hook.sh
20
+ can bridge (US-022, flag `hook-engine-port-policy-enforcement-gate`, default
21
+ off). It answers the gate's allow paths without starting a process: no
22
+ session id, no session state, a PostToolUse with no state, an event the gate
23
+ does not handle, and a PreToolUse that is not outbound, matches no gate
24
+ policy and has no requirement to merge. For a Bash PreToolUse it writes the
25
+ same pre-tool pass stamp the bash gate writes. Every other case (outbound
26
+ tools and commands, gate policies, requirement merges, receipts,
27
+ UserPromptSubmit, non-ASCII input, jq not found on PATH, anything it cannot
28
+ parse) exits 75, and
29
+ the bridge runs the bash gate. The port never blocks.
30
+ - HQ Sync now reacts to secure real-time wake notifications on macOS, so shared
31
+ vault changes can start syncing within seconds without frequent polling.
32
+
33
+ ## [5.345.163] — 2026-10-23
34
+ - New `hq deploy domains` manages custom domains on a deployed app from the installed CLI, using the same hq-deploy routes as the desktop Deployments panel. `list`, `add <domain>`, `refresh <domain>` and `remove <domain>` take `--app <name or id>`, or use the app linked to the folder (`.hq/project.json`, or the older `hq-deploy.json`; `--path` picks the folder). Domains are checked before any request: hostname labels only (no URL, path, port or `@`), and an internationalized name is sent as punycode. A folder link that names no company needs `--company`, and a `--company` that differs from the link is refused. `add` names the app and company, shows the add-on price from `GET /v1/pricing`, and asks for approval (or `--yes`) before anything is added, then prints the DNS records to create, the guidance for a bare domain, and the billing link when the company has no card. `refresh` exits 2 while the domain is not live, so scripts can poll. `remove` names the app and company, asks for approval (or `--yes`), and says when the billing removal is queued for retry. Member, entitlement and billing errors print plain messages, and every command takes `--json`.
35
+ - New `hq deploy domains search <query>` and `hq deploy domains buy <domain> --price <usd> --registrant-file <path>` buy a domain for the company through hq-pro's domain purchase routes. `buy` names the company that pays and shows the first-year price and the published renewal and refund terms, and asks for approval (or `--yes`). It sends one idempotency key per order and only the documented registrant fields. Whenever the outcome is not known (a network error, a server error, a pending registration), it prints the key and says to re-run with `--idempotency-key` instead of starting a new order. Buying stays unavailable until the server has registrar credentials; until then the command says nothing was charged.
36
+ - Add `hq feedback list` (untriaged by default, or `--mine` / `--assignee <person>`), `hq feedback triage <id> --kind --area --summary [--duplicate-of <id>]` and `hq feedback close <id> --reason <text> [--wont-fix]` for staff triage. `hq feedback assign` now also takes the person as a positional argument (`--to` still works), and every one of these commands supports `--json`.
37
+
5
38
  ## [5.345.162] — 2026-10-23
6
39
  - `hq agent inbox` no longer reports malformed server responses as a verified empty inbox. Invalid JSON or a missing/non-array `messages` field keeps `source: "local-mirror"` and a privacy-safe warning. Mixed responses retain usable messages with `source: "server-partial"` and an incomplete-result warning; only `source: "server"` certifies completeness. Human output also says when an empty result is unverified. Reads still never send replies or acknowledgments.
7
40
  - The bundled sync engine now uses hq-cloud 6.18.100, the current npm `latest`.
@@ -4605,18 +4605,133 @@ export declare const COMMAND_CATALOG: readonly [{
4605
4605
  readonly hidden: false;
4606
4606
  readonly helpOption: true;
4607
4607
  readonly helpCommand: false;
4608
- readonly usage: "[options] <id>";
4608
+ readonly usage: "[options] <id> [person]";
4609
4609
  readonly helpText: readonly [];
4610
4610
  readonly arguments: readonly [{
4611
4611
  readonly name: "id";
4612
4612
  readonly required: true;
4613
4613
  readonly variadic: false;
4614
4614
  readonly description: "Feedback id (feedback_<uuid>)";
4615
+ }, {
4616
+ readonly name: "person";
4617
+ readonly required: false;
4618
+ readonly variadic: false;
4619
+ readonly description: "New assignee: an email address or a prs_ uid";
4615
4620
  }];
4616
4621
  readonly options: readonly [{
4617
4622
  readonly flags: "--to <assignee>";
4618
4623
  readonly description: "New assignee: an email address or a prs_ uid";
4619
4624
  readonly hidden: false;
4625
+ }, {
4626
+ readonly flags: "--json";
4627
+ readonly description: "Print the result as JSON";
4628
+ readonly hidden: false;
4629
+ }];
4630
+ readonly subcommands: readonly [];
4631
+ }, {
4632
+ readonly name: "list";
4633
+ readonly description: "List feedback: untriaged (default), yours, or one person's";
4634
+ readonly aliases: readonly [];
4635
+ readonly hidden: false;
4636
+ readonly helpOption: true;
4637
+ readonly helpCommand: false;
4638
+ readonly usage: "[options]";
4639
+ readonly helpText: readonly [];
4640
+ readonly arguments: readonly [];
4641
+ readonly options: readonly [{
4642
+ readonly flags: "--untriaged";
4643
+ readonly description: "Items nobody has triaged yet (the default)";
4644
+ readonly hidden: false;
4645
+ }, {
4646
+ readonly flags: "--mine";
4647
+ readonly description: "Items assigned to you";
4648
+ readonly hidden: false;
4649
+ }, {
4650
+ readonly flags: "--assignee <person>";
4651
+ readonly description: "Items assigned to this email address or prs_ uid";
4652
+ readonly hidden: false;
4653
+ }, {
4654
+ readonly flags: "--status <status>";
4655
+ readonly description: "Only items with this status";
4656
+ readonly hidden: false;
4657
+ }, {
4658
+ readonly flags: "--limit <n>";
4659
+ readonly description: "Stop after this many items (default 50)";
4660
+ readonly hidden: false;
4661
+ }, {
4662
+ readonly flags: "--all";
4663
+ readonly description: "Fetch every page";
4664
+ readonly hidden: false;
4665
+ }, {
4666
+ readonly flags: "--json";
4667
+ readonly description: "Print { items, count } as JSON";
4668
+ readonly hidden: false;
4669
+ }];
4670
+ readonly subcommands: readonly [];
4671
+ }, {
4672
+ readonly name: "triage";
4673
+ readonly description: "Label a feedback item with its kind, area and summary, or mark it a duplicate";
4674
+ readonly aliases: readonly [];
4675
+ readonly hidden: false;
4676
+ readonly helpOption: true;
4677
+ readonly helpCommand: false;
4678
+ readonly usage: "[options] <id>";
4679
+ readonly helpText: readonly [];
4680
+ readonly arguments: readonly [{
4681
+ readonly name: "id";
4682
+ readonly required: true;
4683
+ readonly variadic: false;
4684
+ readonly description: "Feedback id (feedback_<uuid>)";
4685
+ }];
4686
+ readonly options: readonly [{
4687
+ readonly flags: "--kind <kind>";
4688
+ readonly description: "One of bug, feature, question";
4689
+ readonly hidden: false;
4690
+ }, {
4691
+ readonly flags: "--area <area>";
4692
+ readonly description: "Product area, for example sync or desktop";
4693
+ readonly hidden: false;
4694
+ }, {
4695
+ readonly flags: "--summary <text>";
4696
+ readonly description: "One-line triage summary (at most 2000 characters)";
4697
+ readonly hidden: false;
4698
+ }, {
4699
+ readonly flags: "--duplicate-of <id>";
4700
+ readonly description: "Mark this item a duplicate of another feedback id";
4701
+ readonly hidden: false;
4702
+ }, {
4703
+ readonly flags: "--json";
4704
+ readonly description: "Print the updated item as JSON";
4705
+ readonly hidden: false;
4706
+ }];
4707
+ readonly subcommands: readonly [];
4708
+ }, {
4709
+ readonly name: "close";
4710
+ readonly description: "Close a feedback item as resolved (or won't fix) with a reason";
4711
+ readonly aliases: readonly [];
4712
+ readonly hidden: false;
4713
+ readonly helpOption: true;
4714
+ readonly helpCommand: false;
4715
+ readonly usage: "[options] <id>";
4716
+ readonly helpText: readonly [];
4717
+ readonly arguments: readonly [{
4718
+ readonly name: "id";
4719
+ readonly required: true;
4720
+ readonly variadic: false;
4721
+ readonly description: "Feedback id (feedback_<uuid>)";
4722
+ }];
4723
+ readonly options: readonly [{
4724
+ readonly flags: "--reason <text>";
4725
+ readonly description: "Why it is closed: the fix, PR or version, or the decision";
4726
+ readonly hidden: false;
4727
+ }, {
4728
+ readonly flags: "--wont-fix";
4729
+ readonly description: "Close as won't fix instead of resolved";
4730
+ readonly hidden: false;
4731
+ }, {
4732
+ readonly flags: "--json";
4733
+ readonly description: "Print the updated item as JSON";
4734
+ readonly hidden: false;
4620
4735
  }];
4621
4736
  readonly subcommands: readonly [];
4622
4737
  }];
@@ -19250,6 +19365,231 @@ export declare const COMMAND_CATALOG: readonly [{
19250
19365
  }];
19251
19366
  readonly subcommands: readonly [];
19252
19367
  }];
19368
+ }, {
19369
+ readonly name: "domains";
19370
+ readonly description: "Manage custom domains on your deployed apps, and buy domains";
19371
+ readonly aliases: readonly [];
19372
+ readonly hidden: false;
19373
+ readonly helpOption: true;
19374
+ readonly helpCommand: true;
19375
+ readonly usage: "[options] [command]";
19376
+ readonly helpText: readonly [{
19377
+ readonly position: "after";
19378
+ readonly text: "\nadd, remove and buy ask for approval in an interactive terminal. Without one (a script, CI, or a Windows shell that does not report a terminal, such as Git Bash under mintty), pass --yes.";
19379
+ }];
19380
+ readonly arguments: readonly [];
19381
+ readonly options: readonly [];
19382
+ readonly subcommands: readonly [{
19383
+ readonly name: "list";
19384
+ readonly description: "List the custom domains on an app";
19385
+ readonly aliases: readonly [];
19386
+ readonly hidden: false;
19387
+ readonly helpOption: true;
19388
+ readonly helpCommand: false;
19389
+ readonly usage: "[options]";
19390
+ readonly helpText: readonly [];
19391
+ readonly arguments: readonly [];
19392
+ readonly options: readonly [{
19393
+ readonly flags: "--app <app>";
19394
+ readonly description: "app id, subdomain or name (default: the app linked to this folder)";
19395
+ readonly hidden: false;
19396
+ }, {
19397
+ readonly flags: "--path <dir>";
19398
+ readonly description: "folder linked to the app (default: current folder)";
19399
+ readonly hidden: false;
19400
+ }, {
19401
+ readonly flags: "--company <slug>";
19402
+ readonly description: "use this company instead of the linked or active company";
19403
+ readonly hidden: false;
19404
+ }, {
19405
+ readonly flags: "--json";
19406
+ readonly description: "print machine-readable JSON";
19407
+ readonly hidden: false;
19408
+ }];
19409
+ readonly subcommands: readonly [];
19410
+ }, {
19411
+ readonly name: "add";
19412
+ readonly description: "Link a custom domain to an app and print the DNS records to create";
19413
+ readonly aliases: readonly [];
19414
+ readonly hidden: false;
19415
+ readonly helpOption: true;
19416
+ readonly helpCommand: false;
19417
+ readonly usage: "[options] <domain>";
19418
+ readonly helpText: readonly [];
19419
+ readonly arguments: readonly [{
19420
+ readonly name: "domain";
19421
+ readonly required: true;
19422
+ readonly variadic: false;
19423
+ readonly description: "";
19424
+ }];
19425
+ readonly options: readonly [{
19426
+ readonly flags: "--env <name>";
19427
+ readonly description: "environment to serve";
19428
+ readonly hidden: false;
19429
+ readonly defaultValue: "production";
19430
+ }, {
19431
+ readonly flags: "--yes";
19432
+ readonly description: "add without a prompt (the domain can add a monthly charge)";
19433
+ readonly hidden: false;
19434
+ }, {
19435
+ readonly flags: "--app <app>";
19436
+ readonly description: "app id, subdomain or name (default: the app linked to this folder)";
19437
+ readonly hidden: false;
19438
+ }, {
19439
+ readonly flags: "--path <dir>";
19440
+ readonly description: "folder linked to the app (default: current folder)";
19441
+ readonly hidden: false;
19442
+ }, {
19443
+ readonly flags: "--company <slug>";
19444
+ readonly description: "use this company instead of the linked or active company";
19445
+ readonly hidden: false;
19446
+ }, {
19447
+ readonly flags: "--json";
19448
+ readonly description: "print machine-readable JSON";
19449
+ readonly hidden: false;
19450
+ }];
19451
+ readonly subcommands: readonly [];
19452
+ }, {
19453
+ readonly name: "refresh";
19454
+ readonly description: "Check DNS validation and start serving once the certificate is issued (exits 2 while not live)";
19455
+ readonly aliases: readonly [];
19456
+ readonly hidden: false;
19457
+ readonly helpOption: true;
19458
+ readonly helpCommand: false;
19459
+ readonly usage: "[options] <domain>";
19460
+ readonly helpText: readonly [];
19461
+ readonly arguments: readonly [{
19462
+ readonly name: "domain";
19463
+ readonly required: true;
19464
+ readonly variadic: false;
19465
+ readonly description: "";
19466
+ }];
19467
+ readonly options: readonly [{
19468
+ readonly flags: "--app <app>";
19469
+ readonly description: "app id, subdomain or name (default: the app linked to this folder)";
19470
+ readonly hidden: false;
19471
+ }, {
19472
+ readonly flags: "--path <dir>";
19473
+ readonly description: "folder linked to the app (default: current folder)";
19474
+ readonly hidden: false;
19475
+ }, {
19476
+ readonly flags: "--company <slug>";
19477
+ readonly description: "use this company instead of the linked or active company";
19478
+ readonly hidden: false;
19479
+ }, {
19480
+ readonly flags: "--json";
19481
+ readonly description: "print machine-readable JSON";
19482
+ readonly hidden: false;
19483
+ }];
19484
+ readonly subcommands: readonly [];
19485
+ }, {
19486
+ readonly name: "remove";
19487
+ readonly description: "Unlink a custom domain from an app";
19488
+ readonly aliases: readonly [];
19489
+ readonly hidden: false;
19490
+ readonly helpOption: true;
19491
+ readonly helpCommand: false;
19492
+ readonly usage: "[options] <domain>";
19493
+ readonly helpText: readonly [];
19494
+ readonly arguments: readonly [{
19495
+ readonly name: "domain";
19496
+ readonly required: true;
19497
+ readonly variadic: false;
19498
+ readonly description: "";
19499
+ }];
19500
+ readonly options: readonly [{
19501
+ readonly flags: "--env <name>";
19502
+ readonly description: "pick the environment when the domain points at more than one";
19503
+ readonly hidden: false;
19504
+ }, {
19505
+ readonly flags: "--yes";
19506
+ readonly description: "remove without a prompt";
19507
+ readonly hidden: false;
19508
+ }, {
19509
+ readonly flags: "--app <app>";
19510
+ readonly description: "app id, subdomain or name (default: the app linked to this folder)";
19511
+ readonly hidden: false;
19512
+ }, {
19513
+ readonly flags: "--path <dir>";
19514
+ readonly description: "folder linked to the app (default: current folder)";
19515
+ readonly hidden: false;
19516
+ }, {
19517
+ readonly flags: "--company <slug>";
19518
+ readonly description: "use this company instead of the linked or active company";
19519
+ readonly hidden: false;
19520
+ }, {
19521
+ readonly flags: "--json";
19522
+ readonly description: "print machine-readable JSON";
19523
+ readonly hidden: false;
19524
+ }];
19525
+ readonly subcommands: readonly [];
19526
+ }, {
19527
+ readonly name: "search";
19528
+ readonly description: "Check whether a domain can be bought, and its price";
19529
+ readonly aliases: readonly [];
19530
+ readonly hidden: false;
19531
+ readonly helpOption: true;
19532
+ readonly helpCommand: false;
19533
+ readonly usage: "[options] <query>";
19534
+ readonly helpText: readonly [];
19535
+ readonly arguments: readonly [{
19536
+ readonly name: "query";
19537
+ readonly required: true;
19538
+ readonly variadic: false;
19539
+ readonly description: "";
19540
+ }];
19541
+ readonly options: readonly [{
19542
+ readonly flags: "--company <slug>";
19543
+ readonly description: "use this company instead of the active company";
19544
+ readonly hidden: false;
19545
+ }, {
19546
+ readonly flags: "--json";
19547
+ readonly description: "print machine-readable JSON";
19548
+ readonly hidden: false;
19549
+ }];
19550
+ readonly subcommands: readonly [];
19551
+ }, {
19552
+ readonly name: "buy";
19553
+ readonly description: "Buy a domain for the company (owner or admin)";
19554
+ readonly aliases: readonly [];
19555
+ readonly hidden: false;
19556
+ readonly helpOption: true;
19557
+ readonly helpCommand: false;
19558
+ readonly usage: "[options] <domain>";
19559
+ readonly helpText: readonly [];
19560
+ readonly arguments: readonly [{
19561
+ readonly name: "domain";
19562
+ readonly required: true;
19563
+ readonly variadic: false;
19564
+ readonly description: "";
19565
+ }];
19566
+ readonly options: readonly [{
19567
+ readonly flags: "--price <usd>";
19568
+ readonly description: "first-year price shown by 'hq deploy domains search'";
19569
+ readonly hidden: false;
19570
+ }, {
19571
+ readonly flags: "--registrant-file <path>";
19572
+ readonly description: "JSON file with the registrant contact";
19573
+ readonly hidden: false;
19574
+ }, {
19575
+ readonly flags: "--idempotency-key <key>";
19576
+ readonly description: "retry an earlier order that did not finish";
19577
+ readonly hidden: false;
19578
+ }, {
19579
+ readonly flags: "--company <slug>";
19580
+ readonly description: "use this company instead of the active company";
19581
+ readonly hidden: false;
19582
+ }, {
19583
+ readonly flags: "--yes";
19584
+ readonly description: "buy without a prompt";
19585
+ readonly hidden: false;
19586
+ }, {
19587
+ readonly flags: "--json";
19588
+ readonly description: "print machine-readable JSON";
19589
+ readonly hidden: false;
19590
+ }];
19591
+ readonly subcommands: readonly [];
19592
+ }];
19253
19593
  }];
19254
19594
  }, {
19255
19595
  readonly name: "staff";