@indigoai-us/hq-cli 5.167.0 → 5.169.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.
Files changed (37) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/dist/command-catalog.generated.d.ts +88 -1
  3. package/dist/command-catalog.generated.js +112 -1
  4. package/dist/commands/daemon.d.ts +2 -0
  5. package/dist/commands/daemon.js +79 -22
  6. package/dist/commands/lanes.js +146 -31
  7. package/dist/commands/mesh.js +13 -19
  8. package/dist/commands/outpost-pruner.d.ts +3 -0
  9. package/dist/commands/outpost-pruner.js +125 -0
  10. package/dist/lib/daemon/catalog.d.ts +11 -1
  11. package/dist/lib/daemon/catalog.js +31 -6
  12. package/dist/lib/daemon/install.d.ts +7 -0
  13. package/dist/lib/daemon/install.js +18 -2
  14. package/dist/lib/daemon/legacy.js +6 -1
  15. package/dist/lib/daemon/machine-type.d.ts +4 -1
  16. package/dist/lib/daemon/machine-type.js +29 -9
  17. package/dist/lib/daemon/migrate.js +2 -2
  18. package/dist/lib/daemon/remote-control.d.ts +32 -9
  19. package/dist/lib/daemon/remote-control.js +55 -11
  20. package/dist/lib/daemon/run.d.ts +6 -0
  21. package/dist/lib/daemon/run.js +43 -2
  22. package/dist/lib/daemon/tools.d.ts +52 -0
  23. package/dist/lib/daemon/tools.js +95 -0
  24. package/dist/lib/daemon/updater.d.ts +23 -15
  25. package/dist/lib/daemon/updater.js +97 -60
  26. package/dist/lib/lanes/mesh-events.d.ts +4 -0
  27. package/dist/lib/lanes/mesh-events.js +72 -4
  28. package/dist/lib/lanes/outpost-pruner-install.d.ts +37 -0
  29. package/dist/lib/lanes/outpost-pruner-install.js +226 -0
  30. package/dist/lib/lanes/outpost-worktree-pruner-flag.d.ts +19 -0
  31. package/dist/lib/lanes/outpost-worktree-pruner-flag.js +76 -0
  32. package/dist/lib/lanes/outpost-worktree-pruner.d.ts +60 -0
  33. package/dist/lib/lanes/outpost-worktree-pruner.js +1135 -0
  34. package/dist/lib/mesh/live/session-events-client.js +3 -2
  35. package/dist/lib/mesh/project-board.d.ts +7 -0
  36. package/dist/lib/mesh/project-board.js +29 -1
  37. package/package.json +1 -1
@@ -0,0 +1,76 @@
1
+ import { loadCachedTokens } from "@indigoai-us/hq-cloud";
2
+ import { createFlagClient } from "@indigoai-us/hq-flags-client";
3
+ export const OUTPOST_WORKTREE_PRUNER_FLAG = "outpost.worktree-pruner";
4
+ export const OUTPOST_WORKTREE_PRUNER_FLAG_FALLBACK = false;
5
+ export const OUTPOST_WORKTREE_PRUNER_FLAG_TIMEOUT_MS = 5_000;
6
+ /**
7
+ * Read the company-scoped rollout flag with bounded I/O. Missing endpoint,
8
+ * company identity, registry row, cached token, or registry availability all
9
+ * leave destructive pruning disabled.
10
+ */
11
+ function errorClass(error) {
12
+ return error instanceof Error ? error.name : "UnknownError";
13
+ }
14
+ function reportFlagFailure(error) {
15
+ process.stderr.write(`${JSON.stringify({
16
+ event: "outpost.worktree_pruner.flag_read_failed",
17
+ flag: OUTPOST_WORKTREE_PRUNER_FLAG,
18
+ error: errorClass(error),
19
+ fallback: OUTPOST_WORKTREE_PRUNER_FLAG_FALLBACK,
20
+ })}\n`);
21
+ }
22
+ export async function outpostWorktreePrunerEnabled(dependencies = {}) {
23
+ const env = dependencies.env ?? process.env;
24
+ const endpoint = env.HQ_FLAGS_API_URL?.trim() || "";
25
+ const companyUid = env.HQ_COMPANY_UID?.trim() || "";
26
+ if (!endpoint || !companyUid) {
27
+ process.stderr.write(`${JSON.stringify({
28
+ event: "outpost.worktree_pruner.flag_config_missing",
29
+ flag: OUTPOST_WORKTREE_PRUNER_FLAG,
30
+ missing: [
31
+ ...(!endpoint ? ["HQ_FLAGS_API_URL"] : []),
32
+ ...(!companyUid ? ["HQ_COMPANY_UID"] : []),
33
+ ],
34
+ fallback: OUTPOST_WORKTREE_PRUNER_FLAG_FALLBACK,
35
+ })}\n`);
36
+ return OUTPOST_WORKTREE_PRUNER_FLAG_FALLBACK;
37
+ }
38
+ const companySlug = env.HQ_COMPANY_SLUG?.trim() || "";
39
+ let client;
40
+ let enabled = OUTPOST_WORKTREE_PRUNER_FLAG_FALLBACK;
41
+ let failed = false;
42
+ let reported = false;
43
+ const reportFailure = (error) => {
44
+ failed = true;
45
+ if (reported)
46
+ return;
47
+ reported = true;
48
+ (dependencies.reportFailure ?? reportFlagFailure)(error);
49
+ };
50
+ try {
51
+ client = (dependencies.createClient ?? createFlagClient)({
52
+ endpoint,
53
+ companyUid,
54
+ ...(companySlug ? { companyIdentifiers: [companySlug] } : {}),
55
+ getToken: dependencies.getToken ?? (() => loadCachedTokens()?.idToken ?? ""),
56
+ refreshIntervalMs: 0,
57
+ requestTimeoutMs: OUTPOST_WORKTREE_PRUNER_FLAG_TIMEOUT_MS,
58
+ onError: reportFailure,
59
+ });
60
+ await client.ready();
61
+ enabled = client.isEnabled(OUTPOST_WORKTREE_PRUNER_FLAG, {
62
+ fallback: OUTPOST_WORKTREE_PRUNER_FLAG_FALLBACK,
63
+ });
64
+ }
65
+ catch (error) {
66
+ reportFailure(error);
67
+ }
68
+ try {
69
+ client?.close();
70
+ }
71
+ catch (error) {
72
+ reportFailure(error);
73
+ }
74
+ return failed ? OUTPOST_WORKTREE_PRUNER_FLAG_FALLBACK : enabled;
75
+ }
76
+ //# sourceMappingURL=outpost-worktree-pruner-flag.js.map
@@ -0,0 +1,60 @@
1
+ /** Safe, host-local cleanup for terminal HQ worktrees on outposts. */
2
+ export type PrunerTrigger = "pressure" | "daily" | "manual";
3
+ export interface OutpostWorktreePrunerOptions {
4
+ hqRoot: string;
5
+ trigger: PrunerTrigger;
6
+ dryRun: boolean;
7
+ featureEnabled: boolean;
8
+ minAgeDays: number;
9
+ now?: number;
10
+ /** Test seam. Production uses /proc. */
11
+ processRoot?: string;
12
+ /** Test seam. Production safely resolves and runs `pnpm store prune`. */
13
+ runPackageStorePrune?: () => PackageStorePruneResult;
14
+ /** Test seam for the storage threshold; production reads filesystem stats. */
15
+ readDiskUsedPercent?: (hqRoot: string) => number | null;
16
+ /** Test seam for classifying inaccessible /proc entries by owner. */
17
+ processUserId?: number;
18
+ /** Test seam for /proc reads; production uses the host filesystem. */
19
+ processPathReader?: ProcessPathReader;
20
+ }
21
+ export interface ProcessPathReader {
22
+ readdirSync(path: string): string[];
23
+ readlinkSync(path: string): string;
24
+ uid(path: string): number;
25
+ }
26
+ export interface PackageStorePruneResult {
27
+ attempted: boolean;
28
+ reason?: string;
29
+ bytes_freed?: number;
30
+ }
31
+ export interface OutpostWorktreePrunerResult {
32
+ event: "outpost.worktree_pruner.run";
33
+ trigger: PrunerTrigger;
34
+ dry_run: boolean;
35
+ feature_enabled: boolean;
36
+ skipped?: string;
37
+ pressure_percent?: number;
38
+ min_age_days: number;
39
+ candidates: string[];
40
+ removed: Array<{
41
+ path: string;
42
+ bytes_freed: number;
43
+ }>;
44
+ kept: Array<{
45
+ path: string;
46
+ reason: string;
47
+ }>;
48
+ bytes_freed: number;
49
+ bytes_freed_basis: "statfs_available_byte_delta";
50
+ package_store: PackageStorePruneResult;
51
+ }
52
+ /**
53
+ * Prune only registered worktrees beneath workspace/worktrees after every
54
+ * local, git, age, and liveness check has passed. The function never shells
55
+ * out to rm and never follows symlinks while estimating or checking age.
56
+ */
57
+ export declare function runOutpostWorktreePruner(options: OutpostWorktreePrunerOptions): OutpostWorktreePrunerResult;
58
+ export declare const OUTPOST_WORKTREE_PRUNER_DEFAULT_MIN_AGE_DAYS = 14;
59
+ export declare const OUTPOST_WORKTREE_PRUNER_PRESSURE_THRESHOLD_PERCENT = 78;
60
+ //# sourceMappingURL=outpost-worktree-pruner.d.ts.map