@indigoai-us/hq-cloud 6.18.89 → 6.18.91

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.
@@ -0,0 +1,225 @@
1
+ /**
2
+ * Sync-runner self-profile.
3
+ *
4
+ * Once a minute the runner samples its own CPU time and RSS. When CPU use
5
+ * averaged over ten minutes goes above a fraction of one core, or RSS goes
6
+ * above a byte limit, it writes ONE plain stderr line. That part is always on.
7
+ *
8
+ * Capture is opt-in (HQ_SYNC_SELF_PROFILE=1, or `"enabled": true` in
9
+ * `<state dir>/sync-runner-self-profile.json`). With capture on, a trip also
10
+ * writes a local diagnostics folder under `<state dir>/diagnostics/sync-runner/`:
11
+ * a redacted summary JSON and a 60 s CPU profile taken through node:inspector.
12
+ * File paths in both are rewritten relative to the HQ root, and the home folder
13
+ * is shown as `~`. There is no heap snapshot: it would hold tokens and synced
14
+ * file contents. Only the newest three folders are kept. Nothing here sends
15
+ * anything over the network. `hq-sync-runner --diagnostics` prints the redacted
16
+ * summary for a bug report; the profile folder stays on this computer.
17
+ */
18
+ import * as fs from "node:fs";
19
+ import { type WatchedDirectory } from "../watcher.js";
20
+ export declare const SELF_PROFILE_ENV = "HQ_SYNC_SELF_PROFILE";
21
+ export declare const SELF_PROFILE_CPU_CORES_ENV = "HQ_SYNC_SELF_PROFILE_CPU_CORES";
22
+ export declare const SELF_PROFILE_RSS_MB_ENV = "HQ_SYNC_SELF_PROFILE_RSS_MB";
23
+ export declare const SELF_PROFILE_CONFIG_FILE = "sync-runner-self-profile.json";
24
+ export declare const DEFAULT_SELF_PROFILE_CPU_CORES = 0.25;
25
+ export declare const DEFAULT_SELF_PROFILE_RSS_MB = 600;
26
+ export declare const SELF_PROFILE_SAMPLE_INTERVAL_MS = 60000;
27
+ export declare const SELF_PROFILE_CPU_WINDOW_MS: number;
28
+ export declare const SELF_PROFILE_CPU_PROFILE_MS = 60000;
29
+ /** Minimum gap between two warnings, even when usage dips and recovers. */
30
+ export declare const SELF_PROFILE_WARNING_COOLDOWN_MS: number;
31
+ /** Minimum gap between two captures. */
32
+ export declare const SELF_PROFILE_CAPTURE_COOLDOWN_MS: number;
33
+ export declare const SELF_PROFILE_KEEP_CAPTURES = 3;
34
+ export declare const SELF_PROFILE_MAX_CPU_PROFILE_BYTES: number;
35
+ /** Total size cap for every kept capture folder together. */
36
+ export declare const SELF_PROFILE_MAX_TOTAL_BYTES: number;
37
+ export interface SelfProfileConfig {
38
+ captureEnabled: boolean;
39
+ /** CPU threshold as a fraction of one core, averaged over the window. */
40
+ cpuCores: number;
41
+ rssBytes: number;
42
+ }
43
+ export declare function selfProfileConfigPath(stateDir: string): string;
44
+ export declare function selfProfileDiagnosticsDir(stateDir: string): string;
45
+ /**
46
+ * Environment variables win over the config file; anything missing or invalid
47
+ * falls back to the defaults. Capture stays off unless one of them turns it on.
48
+ */
49
+ export declare function resolveSelfProfileConfig(env: NodeJS.ProcessEnv, stateDir: string, readFile?: (file: string) => string): SelfProfileConfig;
50
+ /**
51
+ * Group a watcher path for the per-prefix event rate: two segments, or three
52
+ * under `companies/` so one company's areas stay apart.
53
+ */
54
+ export declare function eventPathPrefix(relativePath: string): string;
55
+ export declare class SelfProfileActivity {
56
+ private readonly now;
57
+ private readonly startedAt;
58
+ private readonly eventsByPrefix;
59
+ private passes;
60
+ constructor(now: () => number);
61
+ recordEvent(relativePath: string): void;
62
+ recordPass(): void;
63
+ snapshot(): {
64
+ minutes: number;
65
+ events: number;
66
+ eventsPerMinuteByPrefix: Record<string, number>;
67
+ passes: number;
68
+ passesPerMinute: number;
69
+ };
70
+ }
71
+ export interface WatchCoverage {
72
+ watchedPathCount: number;
73
+ recursiveRootCount: number;
74
+ watchesWorktrees: boolean;
75
+ watchesNodeModules: boolean;
76
+ watchesNestedGit: boolean;
77
+ /** Up to ten offending paths, relative to the HQ root. */
78
+ examples: string[];
79
+ /** True when the bounded scan under recursive roots stopped early. */
80
+ scanTruncated: boolean;
81
+ }
82
+ /**
83
+ * Report whether any OS watch is on, or (for a recursive watch) above,
84
+ * workspace/worktrees, a node_modules folder, or a nested .git folder. The
85
+ * walk under recursive roots is bounded so a large tree cannot stall the
86
+ * runner while it writes diagnostics.
87
+ */
88
+ export declare function assessWatchCoverage(hqRoot: string, watched: WatchedDirectory[], readDir?: (dir: string) => fs.Dirent[]): WatchCoverage;
89
+ export interface CpuTimes {
90
+ user: number;
91
+ system: number;
92
+ }
93
+ export interface SelfProfileReading {
94
+ /** CPU use averaged over the full window, in cores; null until the window fills. */
95
+ cpuCores: number | null;
96
+ rssBytes: number;
97
+ }
98
+ export type SelfProfileTripReason = "cpu" | "rss" | "cpu+rss";
99
+ /**
100
+ * Pure threshold state. `observe` takes one sample and returns the reading;
101
+ * `trip` reports a reason only when the runner is over a threshold, a warning
102
+ * has not already been given for this episode, and the cooldown has passed.
103
+ */
104
+ export declare class SelfProfileThresholds {
105
+ private readonly config;
106
+ private readonly windowMs;
107
+ private readonly cooldownMs;
108
+ private samples;
109
+ private armed;
110
+ private lastWarnedAt;
111
+ constructor(config: Pick<SelfProfileConfig, "cpuCores" | "rssBytes">, windowMs?: number, cooldownMs?: number);
112
+ observe(at: number, cpu: CpuTimes, rssBytes: number): SelfProfileReading;
113
+ trip(at: number, reading: SelfProfileReading): SelfProfileTripReason | null;
114
+ }
115
+ /** The two local paths every written file is scrubbed of. */
116
+ export interface SelfProfileRedaction {
117
+ hqRoot: string;
118
+ homeDir: string;
119
+ }
120
+ /**
121
+ * Replace every spelling of the HQ root with `<hq>` and of the home folder
122
+ * with `~`. Matching ignores letter case, because macOS and Windows paths do.
123
+ */
124
+ export declare function scrubLocalPaths(text: string, redaction: SelfProfileRedaction): string;
125
+ /**
126
+ * Rewrite a script URL or file path from a CPU profile: inside the HQ root it
127
+ * becomes relative to the root, inside the home folder it starts with `~/`.
128
+ * Non-file URLs such as `node:internal/...` are kept.
129
+ */
130
+ export declare function redactProfilePath(value: string, redaction: SelfProfileRedaction): string;
131
+ /**
132
+ * Copy only the fields DevTools needs from a V8 CPU profile, with every script
133
+ * URL rewritten by `redactProfilePath`. Anything else V8 adds is dropped.
134
+ */
135
+ export declare function redactCpuProfile(profile: unknown, redaction: SelfProfileRedaction): unknown;
136
+ /** The subset of node:inspector's Session the capture uses. */
137
+ export interface InspectorSessionLike {
138
+ connect(): void;
139
+ disconnect(): void;
140
+ post(method: string, callback: (err: Error | null, result?: unknown) => void): void;
141
+ }
142
+ export interface SelfProfileSummaryInputs {
143
+ hqRoot: string;
144
+ watchBackend: string;
145
+ watchMode: string;
146
+ watchedDirectories: WatchedDirectory[];
147
+ activity: ReturnType<SelfProfileActivity["snapshot"]>;
148
+ telemetryEvents: number;
149
+ }
150
+ export interface SelfProfileCaptureOptions {
151
+ stateDir: string;
152
+ reason: SelfProfileTripReason;
153
+ reading: SelfProfileReading;
154
+ config: SelfProfileConfig;
155
+ summary: () => SelfProfileSummaryInputs;
156
+ now: () => number;
157
+ /** Waits out the CPU profile; production uses an unref'd timer. */
158
+ sleep: (ms: number) => Promise<void>;
159
+ createSession?: () => InspectorSessionLike;
160
+ /** Home folder scrubbed from every file; defaults to os.homedir(). */
161
+ homeDir?: string;
162
+ runnerVersion?: string;
163
+ cpuProfileMs?: number;
164
+ maxCpuProfileBytes?: number;
165
+ maxTotalBytes?: number;
166
+ keep?: number;
167
+ readDir?: (dir: string) => fs.Dirent[];
168
+ }
169
+ export interface SelfProfileCaptureResult {
170
+ dir: string;
171
+ files: string[];
172
+ notes: string[];
173
+ }
174
+ /**
175
+ * Keep the newest `keep` capture folders and, within those, delete the oldest
176
+ * until the total fits `maxTotalBytes`. The newest folder is always kept.
177
+ * Folders that are not self-profile captures are left alone.
178
+ */
179
+ export declare function pruneSelfProfileCaptures(diagnosticsDir: string, keep?: number, maxTotalBytes?: number): string[];
180
+ export declare function latestSelfProfileCapture(stateDir: string): string | null;
181
+ /**
182
+ * The redacted summary: counts, rates, thresholds, backend, platform and
183
+ * versions, and paths relative to the HQ root. No absolute paths, file
184
+ * contents, environment values or tokens.
185
+ */
186
+ export declare function buildSelfProfileSummary(options: Pick<SelfProfileCaptureOptions, "reason" | "reading" | "config" | "now" | "runnerVersion" | "readDir">, inputs: SelfProfileSummaryInputs): Record<string, unknown>;
187
+ /**
188
+ * Write one capture folder: a redacted summary and a redacted CPU profile.
189
+ * There is no heap snapshot: a snapshot holds the whole JS heap, including
190
+ * tokens and synced file contents. Everything is local; the folder is pruned
191
+ * to the retention limits before and after writing.
192
+ */
193
+ export declare function captureSelfProfile(options: SelfProfileCaptureOptions): Promise<SelfProfileCaptureResult>;
194
+ export declare function selfProfileWarningLine(reason: SelfProfileTripReason, reading: SelfProfileReading, config: SelfProfileConfig, stateDir: string): string;
195
+ export declare function selfProfileCapturedLine(reason: SelfProfileTripReason, reading: SelfProfileReading, config: SelfProfileConfig, result: SelfProfileCaptureResult): string;
196
+ export interface SelfProfileSamplerOptions {
197
+ config: SelfProfileConfig;
198
+ stateDir: string;
199
+ now: () => number;
200
+ cpuUsage: () => CpuTimes;
201
+ rssBytes: () => number;
202
+ write: (line: string) => void;
203
+ summary: () => SelfProfileSummaryInputs;
204
+ /** Starts the repeating sample; returns a cancel function. */
205
+ every?: (ms: number, run: () => void) => () => void;
206
+ capture?: (options: SelfProfileCaptureOptions) => Promise<SelfProfileCaptureResult>;
207
+ sleep?: (ms: number) => Promise<void>;
208
+ runnerVersion?: string;
209
+ intervalMs?: number;
210
+ captureCooldownMs?: number;
211
+ }
212
+ export interface SelfProfileSampler {
213
+ /** Take one sample now. The timer calls this; tests call it directly. */
214
+ sample(): void;
215
+ /** Resolves when an in-flight capture (if any) settles. */
216
+ idle(): Promise<void>;
217
+ stop(): void;
218
+ }
219
+ export declare function startSelfProfileSampler(options: SelfProfileSamplerOptions): SelfProfileSampler;
220
+ export declare function printSelfProfileDiagnostics(stateDir: string, out: {
221
+ write: (chunk: string) => unknown;
222
+ }, homeDir?: string): number;
223
+ /** The runner's package version, or undefined when package.json is not readable. */
224
+ export declare function readRunnerVersion(): string | undefined;
225
+ //# sourceMappingURL=sync-runner-self-profile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-runner-self-profile.d.ts","sourceRoot":"","sources":["../../src/bin/sync-runner-self-profile.ts"],"names":[],"mappings":"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"}