homegraph 1.5.2 → 1.5.4

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 (242) hide show
  1. package/CHANGELOG.md +156 -0
  2. package/README.md +63 -10
  3. package/dist/addons/dynamic-import.d.ts +18 -0
  4. package/dist/addons/dynamic-import.d.ts.map +1 -0
  5. package/dist/addons/dynamic-import.js +25 -0
  6. package/dist/addons/dynamic-import.js.map +1 -0
  7. package/dist/addons/init-template.d.ts +15 -0
  8. package/dist/addons/init-template.d.ts.map +1 -0
  9. package/dist/addons/init-template.js +290 -0
  10. package/dist/addons/init-template.js.map +1 -0
  11. package/dist/addons/loader.d.ts +18 -0
  12. package/dist/addons/loader.d.ts.map +1 -0
  13. package/dist/addons/loader.js +88 -0
  14. package/dist/addons/loader.js.map +1 -0
  15. package/dist/addons/manager.d.ts +106 -0
  16. package/dist/addons/manager.d.ts.map +1 -0
  17. package/dist/addons/manager.js +437 -0
  18. package/dist/addons/manager.js.map +1 -0
  19. package/dist/addons/paths.d.ts +22 -0
  20. package/dist/addons/paths.d.ts.map +1 -0
  21. package/dist/addons/paths.js +65 -0
  22. package/dist/addons/paths.js.map +1 -0
  23. package/dist/addons/registry.d.ts +38 -0
  24. package/dist/addons/registry.d.ts.map +1 -0
  25. package/dist/addons/registry.js +160 -0
  26. package/dist/addons/registry.js.map +1 -0
  27. package/dist/addons/semver.d.ts +21 -0
  28. package/dist/addons/semver.d.ts.map +1 -0
  29. package/dist/addons/semver.js +79 -0
  30. package/dist/addons/semver.js.map +1 -0
  31. package/dist/addons/types.d.ts +51 -0
  32. package/dist/addons/types.d.ts.map +1 -0
  33. package/dist/addons/types.js +14 -0
  34. package/dist/addons/types.js.map +1 -0
  35. package/dist/addons/validate.d.ts +38 -0
  36. package/dist/addons/validate.d.ts.map +1 -0
  37. package/dist/addons/validate.js +165 -0
  38. package/dist/addons/validate.js.map +1 -0
  39. package/dist/arkui/index.d.ts +4 -0
  40. package/dist/arkui/index.d.ts.map +1 -0
  41. package/dist/arkui/index.js +23 -0
  42. package/dist/arkui/index.js.map +1 -0
  43. package/dist/arkui/migrate-passage.d.ts +28 -0
  44. package/dist/arkui/migrate-passage.d.ts.map +1 -0
  45. package/dist/arkui/migrate-passage.js +310 -0
  46. package/dist/arkui/migrate-passage.js.map +1 -0
  47. package/dist/arkui/migrate-semantics.d.ts +47 -0
  48. package/dist/arkui/migrate-semantics.d.ts.map +1 -0
  49. package/dist/arkui/migrate-semantics.js +229 -0
  50. package/dist/arkui/migrate-semantics.js.map +1 -0
  51. package/dist/arkui/migrate-snapshot.d.ts +79 -0
  52. package/dist/arkui/migrate-snapshot.d.ts.map +1 -0
  53. package/dist/arkui/migrate-snapshot.js +364 -0
  54. package/dist/arkui/migrate-snapshot.js.map +1 -0
  55. package/dist/bin/addon-commands.d.ts +27 -0
  56. package/dist/bin/addon-commands.d.ts.map +1 -0
  57. package/dist/bin/addon-commands.js +254 -0
  58. package/dist/bin/addon-commands.js.map +1 -0
  59. package/dist/bin/fatal-handler.js +2 -2
  60. package/dist/bin/homegraph.js +111 -157
  61. package/dist/bin/homegraph.js.map +1 -1
  62. package/dist/bin/node-version-check.d.ts +6 -15
  63. package/dist/bin/node-version-check.d.ts.map +1 -1
  64. package/dist/bin/node-version-check.js +8 -37
  65. package/dist/bin/node-version-check.js.map +1 -1
  66. package/dist/db/index.d.ts +36 -1
  67. package/dist/db/index.d.ts.map +1 -1
  68. package/dist/db/index.js +92 -6
  69. package/dist/db/index.js.map +1 -1
  70. package/dist/db/migrations.d.ts +1 -1
  71. package/dist/db/migrations.d.ts.map +1 -1
  72. package/dist/db/migrations.js +15 -1
  73. package/dist/db/migrations.js.map +1 -1
  74. package/dist/db/queries.d.ts +42 -0
  75. package/dist/db/queries.d.ts.map +1 -1
  76. package/dist/db/queries.js +177 -10
  77. package/dist/db/queries.js.map +1 -1
  78. package/dist/db/schema.sql +6 -1
  79. package/dist/db/sqlite-adapter.d.ts +7 -3
  80. package/dist/db/sqlite-adapter.d.ts.map +1 -1
  81. package/dist/db/sqlite-adapter.js +44 -3
  82. package/dist/db/sqlite-adapter.js.map +1 -1
  83. package/dist/extraction/extraction-version.d.ts +1 -1
  84. package/dist/extraction/extraction-version.js +1 -1
  85. package/dist/extraction/generated-detection.d.ts +42 -11
  86. package/dist/extraction/generated-detection.d.ts.map +1 -1
  87. package/dist/extraction/generated-detection.js +141 -20
  88. package/dist/extraction/generated-detection.js.map +1 -1
  89. package/dist/extraction/index.d.ts +42 -0
  90. package/dist/extraction/index.d.ts.map +1 -1
  91. package/dist/extraction/index.js +96 -0
  92. package/dist/extraction/index.js.map +1 -1
  93. package/dist/extraction/languages/arkts.d.ts +33 -2
  94. package/dist/extraction/languages/arkts.d.ts.map +1 -1
  95. package/dist/extraction/languages/arkts.js +525 -129
  96. package/dist/extraction/languages/arkts.js.map +1 -1
  97. package/dist/extraction/wasm-runtime-flags.d.ts.map +1 -1
  98. package/dist/extraction/wasm-runtime-flags.js +9 -6
  99. package/dist/extraction/wasm-runtime-flags.js.map +1 -1
  100. package/dist/graph-sources.d.ts +41 -0
  101. package/dist/graph-sources.d.ts.map +1 -0
  102. package/dist/graph-sources.js +82 -0
  103. package/dist/graph-sources.js.map +1 -0
  104. package/dist/index.d.ts +20 -1
  105. package/dist/index.d.ts.map +1 -1
  106. package/dist/index.js +79 -9
  107. package/dist/index.js.map +1 -1
  108. package/dist/installer/index.d.ts.map +1 -1
  109. package/dist/installer/index.js +0 -48
  110. package/dist/installer/index.js.map +1 -1
  111. package/dist/installer/targets/antigravity.js +1 -1
  112. package/dist/installer/targets/antigravity.js.map +1 -1
  113. package/dist/installer/targets/deveco.js +1 -1
  114. package/dist/installer/targets/deveco.js.map +1 -1
  115. package/dist/installer/targets/hermes.d.ts +1 -1
  116. package/dist/installer/targets/hermes.js +2 -2
  117. package/dist/installer/targets/hermes.js.map +1 -1
  118. package/dist/installer/targets/opencode.js +1 -1
  119. package/dist/installer/targets/opencode.js.map +1 -1
  120. package/dist/installer/targets/shared.js +1 -1
  121. package/dist/installer/targets/shared.js.map +1 -1
  122. package/dist/mcp/daemon-paths.d.ts +5 -4
  123. package/dist/mcp/daemon-paths.d.ts.map +1 -1
  124. package/dist/mcp/daemon-paths.js +28 -13
  125. package/dist/mcp/daemon-paths.js.map +1 -1
  126. package/dist/mcp/daemon-registry.d.ts.map +1 -1
  127. package/dist/mcp/daemon-registry.js +4 -1
  128. package/dist/mcp/daemon-registry.js.map +1 -1
  129. package/dist/mcp/daemon.d.ts +1 -1
  130. package/dist/mcp/daemon.js +1 -1
  131. package/dist/mcp/engine.d.ts.map +1 -1
  132. package/dist/mcp/engine.js +12 -3
  133. package/dist/mcp/engine.js.map +1 -1
  134. package/dist/mcp/explore-dedup.d.ts +137 -0
  135. package/dist/mcp/explore-dedup.d.ts.map +1 -0
  136. package/dist/mcp/explore-dedup.js +236 -0
  137. package/dist/mcp/explore-dedup.js.map +1 -0
  138. package/dist/mcp/explore-repeat-guard.d.ts +123 -0
  139. package/dist/mcp/explore-repeat-guard.d.ts.map +1 -0
  140. package/dist/mcp/explore-repeat-guard.js +503 -0
  141. package/dist/mcp/explore-repeat-guard.js.map +1 -0
  142. package/dist/mcp/explore-session-state.d.ts +237 -0
  143. package/dist/mcp/explore-session-state.d.ts.map +1 -0
  144. package/dist/mcp/explore-session-state.js +353 -0
  145. package/dist/mcp/explore-session-state.js.map +1 -0
  146. package/dist/mcp/index.d.ts.map +1 -1
  147. package/dist/mcp/index.js +4 -7
  148. package/dist/mcp/index.js.map +1 -1
  149. package/dist/mcp/proxy.d.ts.map +1 -1
  150. package/dist/mcp/proxy.js +20 -18
  151. package/dist/mcp/proxy.js.map +1 -1
  152. package/dist/mcp/query-pool.d.ts.map +1 -1
  153. package/dist/mcp/query-pool.js +10 -13
  154. package/dist/mcp/query-pool.js.map +1 -1
  155. package/dist/mcp/query-worker.d.ts +1 -1
  156. package/dist/mcp/query-worker.js +1 -1
  157. package/dist/mcp/server-instructions.d.ts +5 -2
  158. package/dist/mcp/server-instructions.d.ts.map +1 -1
  159. package/dist/mcp/server-instructions.js +43 -32
  160. package/dist/mcp/server-instructions.js.map +1 -1
  161. package/dist/mcp/session.d.ts +14 -3
  162. package/dist/mcp/session.d.ts.map +1 -1
  163. package/dist/mcp/session.js +17 -14
  164. package/dist/mcp/session.js.map +1 -1
  165. package/dist/mcp/startup-handshake.d.ts +1 -1
  166. package/dist/mcp/startup-handshake.js +1 -1
  167. package/dist/mcp/tools.d.ts +149 -8
  168. package/dist/mcp/tools.d.ts.map +1 -1
  169. package/dist/mcp/tools.js +4265 -575
  170. package/dist/mcp/tools.js.map +1 -1
  171. package/dist/resolution/callback-synthesizer.d.ts.map +1 -1
  172. package/dist/resolution/callback-synthesizer.js +166 -0
  173. package/dist/resolution/callback-synthesizer.js.map +1 -1
  174. package/dist/resolution/frameworks/arkts-napi.d.ts +14 -0
  175. package/dist/resolution/frameworks/arkts-napi.d.ts.map +1 -1
  176. package/dist/resolution/frameworks/arkts-napi.js +169 -49
  177. package/dist/resolution/frameworks/arkts-napi.js.map +1 -1
  178. package/dist/search/query-utils.d.ts +157 -5
  179. package/dist/search/query-utils.d.ts.map +1 -1
  180. package/dist/search/query-utils.js +1105 -70
  181. package/dist/search/query-utils.js.map +1 -1
  182. package/dist/spec/build/scan.js +1 -1
  183. package/dist/spec/build/scan.js.map +1 -1
  184. package/dist/spec/build/scope-resolver.d.ts +24 -5
  185. package/dist/spec/build/scope-resolver.d.ts.map +1 -1
  186. package/dist/spec/build/scope-resolver.js +76 -10
  187. package/dist/spec/build/scope-resolver.js.map +1 -1
  188. package/dist/spec/config.d.ts +8 -0
  189. package/dist/spec/config.d.ts.map +1 -1
  190. package/dist/spec/config.js +3 -0
  191. package/dist/spec/config.js.map +1 -1
  192. package/dist/spec/evolve/pipeline.d.ts.map +1 -1
  193. package/dist/spec/evolve/pipeline.js +2 -1
  194. package/dist/spec/evolve/pipeline.js.map +1 -1
  195. package/dist/spec/git/commits.d.ts +8 -3
  196. package/dist/spec/git/commits.d.ts.map +1 -1
  197. package/dist/spec/git/commits.js +12 -11
  198. package/dist/spec/git/commits.js.map +1 -1
  199. package/dist/spec/mine/addon/adapter.d.ts +45 -0
  200. package/dist/spec/mine/addon/adapter.d.ts.map +1 -0
  201. package/dist/spec/mine/addon/adapter.js +118 -0
  202. package/dist/spec/mine/addon/adapter.js.map +1 -0
  203. package/dist/spec/mine/addon/render.d.ts +20 -0
  204. package/dist/spec/mine/addon/render.d.ts.map +1 -0
  205. package/dist/spec/mine/addon/render.js +41 -0
  206. package/dist/spec/mine/addon/render.js.map +1 -0
  207. package/dist/spec/mine/addon/types.d.ts +70 -0
  208. package/dist/spec/mine/addon/types.d.ts.map +1 -0
  209. package/dist/spec/mine/addon/types.js +14 -0
  210. package/dist/spec/mine/addon/types.js.map +1 -0
  211. package/dist/spec/mine/generator.d.ts +5 -1
  212. package/dist/spec/mine/generator.d.ts.map +1 -1
  213. package/dist/spec/mine/generator.js +69 -7
  214. package/dist/spec/mine/generator.js.map +1 -1
  215. package/dist/spec/mine/pipeline.d.ts.map +1 -1
  216. package/dist/spec/mine/pipeline.js +5 -1
  217. package/dist/spec/mine/pipeline.js.map +1 -1
  218. package/dist/spec/mine/scanner.d.ts +1 -0
  219. package/dist/spec/mine/scanner.d.ts.map +1 -1
  220. package/dist/spec/mine/scanner.js +1 -1
  221. package/dist/spec/mine/scanner.js.map +1 -1
  222. package/dist/spec/types.d.ts +1 -1
  223. package/dist/spec/types.d.ts.map +1 -1
  224. package/dist/types.d.ts +8 -0
  225. package/dist/types.d.ts.map +1 -1
  226. package/dist/upgrade/index.d.ts +14 -26
  227. package/dist/upgrade/index.d.ts.map +1 -1
  228. package/dist/upgrade/index.js +28 -123
  229. package/dist/upgrade/index.js.map +1 -1
  230. package/dist/upgrade/remove-binary.d.ts +19 -19
  231. package/dist/upgrade/remove-binary.d.ts.map +1 -1
  232. package/dist/upgrade/remove-binary.js +20 -21
  233. package/dist/upgrade/remove-binary.js.map +1 -1
  234. package/dist/upgrade/update-check.d.ts +4 -3
  235. package/dist/upgrade/update-check.d.ts.map +1 -1
  236. package/dist/upgrade/update-check.js +4 -3
  237. package/dist/upgrade/update-check.js.map +1 -1
  238. package/package.json +13 -9
  239. package/dist/telemetry/index.d.ts +0 -143
  240. package/dist/telemetry/index.d.ts.map +0 -1
  241. package/dist/telemetry/index.js +0 -541
  242. package/dist/telemetry/index.js.map +0 -1
@@ -1,541 +0,0 @@
1
- "use strict";
2
- /**
3
- * Anonymous usage telemetry — client side.
4
- *
5
- * The contract for what may be collected lives in docs/design/telemetry.md
6
- * (and user-facing TELEMETRY.md); the ingest endpoint that enforces it is
7
- * public at telemetry-worker/. This module honors four invariants:
8
- *
9
- * 1. Zero hot-path cost: recording is an in-memory increment. Disk writes are
10
- * a tiny synchronous append at process exit (works under `process.exit()`,
11
- * where `beforeExit` never fires); network sends happen opportunistically
12
- * (startup of long-running commands, daemon interval, bounded await at the
13
- * end of install/init) and are fire-and-forget everywhere else.
14
- * 2. Zero stdout: stdio is the MCP protocol channel. Notices and debug output
15
- * go to stderr only.
16
- * 3. Off is off: when disabled, nothing is recorded, nothing is sent, and no
17
- * socket is opened — there is no "opted out" ping. Turning telemetry off
18
- * also deletes any buffered, unsent data.
19
- * 4. Fail silent: offline, endpoint down, disk full — every failure mode is
20
- * silence, never a retry loop, never an error surfaced to the user/agent.
21
- *
22
- * Usage counts aggregate locally into per-day rollups; only *completed* (UTC)
23
- * days are sent, so volume scales with active machines, not with tool calls.
24
- */
25
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
26
- if (k2 === undefined) k2 = k;
27
- var desc = Object.getOwnPropertyDescriptor(m, k);
28
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
29
- desc = { enumerable: true, get: function() { return m[k]; } };
30
- }
31
- Object.defineProperty(o, k2, desc);
32
- }) : (function(o, m, k, k2) {
33
- if (k2 === undefined) k2 = k;
34
- o[k2] = m[k];
35
- }));
36
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
37
- Object.defineProperty(o, "default", { enumerable: true, value: v });
38
- }) : function(o, v) {
39
- o["default"] = v;
40
- });
41
- var __importStar = (this && this.__importStar) || (function () {
42
- var ownKeys = function(o) {
43
- ownKeys = Object.getOwnPropertyNames || function (o) {
44
- var ar = [];
45
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
46
- return ar;
47
- };
48
- return ownKeys(o);
49
- };
50
- return function (mod) {
51
- if (mod && mod.__esModule) return mod;
52
- var result = {};
53
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
54
- __setModuleDefault(result, mod);
55
- return result;
56
- };
57
- })();
58
- Object.defineProperty(exports, "__esModule", { value: true });
59
- exports.Telemetry = exports.TELEMETRY_DOCS = exports.TELEMETRY_ENDPOINT = void 0;
60
- exports.bucketFileCount = bucketFileCount;
61
- exports.bucketDuration = bucketDuration;
62
- exports.recordIndexEvent = recordIndexEvent;
63
- exports.getTelemetry = getTelemetry;
64
- const fs = __importStar(require("fs"));
65
- const path = __importStar(require("path"));
66
- const os = __importStar(require("os"));
67
- const crypto_1 = require("crypto");
68
- exports.TELEMETRY_ENDPOINT = 'https://telemetry.gethomegraph.com/v1/events';
69
- exports.TELEMETRY_DOCS = 'https://github.com/colbymchenry/homegraph/blob/main/TELEMETRY.md';
70
- // v2: dropped the `sqlite_backend` field from the `index` event. Telemetry still
71
- // uses schema v2; the native/wasm split is observable via `homegraph status`
72
- // instead of being reported here. See TELEMETRY.md.
73
- const SCHEMA_VERSION = 2;
74
- const MAX_BUFFER_BYTES = 256 * 1024;
75
- const MAX_EVENTS_PER_REQUEST = 100;
76
- const DEFAULT_FLUSH_TIMEOUT_MS = 1500;
77
- /** A crashed sender's claimed file is merged back after this long. */
78
- const STALE_CLAIM_MS = 60 * 60_000;
79
- /** Coarse buckets — exact counts are deliberately not collected. */
80
- function bucketFileCount(n) {
81
- if (n < 100)
82
- return '<100';
83
- if (n < 1000)
84
- return '100-1k';
85
- if (n < 10000)
86
- return '1k-10k';
87
- return '10k+';
88
- }
89
- function bucketDuration(ms) {
90
- if (ms < 10_000)
91
- return '<10s';
92
- if (ms < 60_000)
93
- return '10-60s';
94
- if (ms < 300_000)
95
- return '1-5m';
96
- return '5m+';
97
- }
98
- /**
99
- * Shared "a full index completed" event (CLI init/index + installer local
100
- * init): language names and coarse buckets only — never paths, file names,
101
- * or exact counts. Structurally typed so callers don't need engine imports.
102
- */
103
- function recordIndexEvent(cg, result) {
104
- try {
105
- const languages = Object.entries(cg.getStats().filesByLanguage)
106
- .filter(([, count]) => count > 0)
107
- .map(([lang]) => lang);
108
- getTelemetry().recordLifecycle('index', {
109
- languages,
110
- file_count_bucket: bucketFileCount(result.filesIndexed),
111
- duration_bucket: bucketDuration(result.durationMs),
112
- });
113
- }
114
- catch {
115
- /* telemetry must never break indexing */
116
- }
117
- }
118
- // One process-level 'exit' listener for ALL instances (in practice: the
119
- // singleton) — N instances must not mean N listeners on process.
120
- const exitInstances = new Set();
121
- let exitListenerRegistered = false;
122
- function registerForExit(instance) {
123
- exitInstances.add(instance);
124
- if (!exitListenerRegistered) {
125
- exitListenerRegistered = true;
126
- // 'exit' fires under process.exit() too (unlike beforeExit); handlers must
127
- // be synchronous — persistSync is a single small file write.
128
- process.on('exit', () => {
129
- for (const i of exitInstances)
130
- i.persistSync();
131
- });
132
- }
133
- }
134
- class Telemetry {
135
- dir;
136
- fetchImpl;
137
- now;
138
- env;
139
- writeStderr;
140
- counts = new Map();
141
- events = [];
142
- installExitHook;
143
- exitHookInstalled = false;
144
- configCache; // undefined = not read yet
145
- intervalHandle = null;
146
- constructor(opts = {}) {
147
- this.dir = opts.dir ?? path.join(os.homedir(), '.homegraph');
148
- this.fetchImpl = opts.fetchImpl ?? globalThis.fetch;
149
- this.now = opts.now ?? (() => new Date());
150
- this.env = opts.env ?? process.env;
151
- this.writeStderr = opts.stderr ?? ((line) => process.stderr.write(line));
152
- this.installExitHook = opts.installExitHook ?? true;
153
- }
154
- // ---------------------------------------------------------------- consent
155
- get configPath() {
156
- return path.join(this.dir, 'telemetry.json');
157
- }
158
- get queuePath() {
159
- return path.join(this.dir, 'telemetry-queue.jsonl');
160
- }
161
- /**
162
- * Resolution order (first match wins) — keep in sync with TELEMETRY.md:
163
- * DO_NOT_TRACK=1 > HOMEGRAPH_TELEMETRY=0|1 > stored config > default on.
164
- */
165
- getStatus() {
166
- const config = this.readConfig();
167
- const machineId = config?.machine_id ?? null;
168
- const dnt = this.env.DO_NOT_TRACK;
169
- if (dnt !== undefined && dnt !== '' && dnt !== '0' && dnt.toLowerCase() !== 'false') {
170
- return { enabled: false, decidedBy: 'DO_NOT_TRACK', machineId, configPath: this.configPath };
171
- }
172
- const forced = this.env.HOMEGRAPH_TELEMETRY;
173
- if (forced !== undefined && forced !== '') {
174
- const on = forced !== '0' && forced.toLowerCase() !== 'false';
175
- return { enabled: on, decidedBy: 'HOMEGRAPH_TELEMETRY', machineId, configPath: this.configPath };
176
- }
177
- if (config) {
178
- return { enabled: config.enabled, decidedBy: 'config', machineId, configPath: this.configPath };
179
- }
180
- return { enabled: true, decidedBy: 'default', machineId, configPath: this.configPath };
181
- }
182
- isEnabled() {
183
- return this.getStatus().enabled;
184
- }
185
- /**
186
- * Persist an explicit user choice (installer toggle or `homegraph
187
- * telemetry on|off`). Turning telemetry off also deletes any buffered,
188
- * unsent data — off means off.
189
- */
190
- setEnabled(enabled, source) {
191
- const existing = this.readConfig();
192
- this.writeConfig({
193
- enabled,
194
- machine_id: existing?.machine_id ?? (0, crypto_1.randomUUID)(),
195
- consent_source: source,
196
- first_run_notice_shown: true,
197
- updated_at: this.now().toISOString(),
198
- });
199
- if (!enabled) {
200
- try {
201
- fs.rmSync(this.queuePath, { force: true });
202
- }
203
- catch { /* fail silent */ }
204
- }
205
- }
206
- /** True once any consent decision (or the first-run notice) is on disk. */
207
- hasStoredChoice() {
208
- return this.readConfig() !== null;
209
- }
210
- // -------------------------------------------------------------- recording
211
- /** In-memory increment — safe on the MCP tool-call hot path. */
212
- recordUsage(kind, name, ok, client) {
213
- if (!this.isEnabled())
214
- return;
215
- const day = this.utcDay();
216
- const cn = client?.name?.slice(0, 64);
217
- const cv = client?.version?.slice(0, 32);
218
- const key = [day, kind, name, cn ?? '', cv ?? ''].join('');
219
- const line = this.counts.get(key);
220
- if (line) {
221
- line.c += 1;
222
- if (!ok)
223
- line.e += 1;
224
- }
225
- else {
226
- const fresh = { v: SCHEMA_VERSION, d: day, k: kind, n: name.slice(0, 64), c: 1, e: ok ? 0 : 1 };
227
- if (cn)
228
- fresh.cn = cn;
229
- if (cv)
230
- fresh.cv = cv;
231
- this.counts.set(key, fresh);
232
- }
233
- this.ensureExitHook();
234
- }
235
- /** install / index / uninstall — buffered like everything else. */
236
- recordLifecycle(event, props) {
237
- if (!this.isEnabled())
238
- return;
239
- this.events.push({ v: SCHEMA_VERSION, ev: event, ts: this.now().toISOString(), props });
240
- this.ensureExitHook();
241
- }
242
- // ---------------------------------------------------------------- sending
243
- /**
244
- * Fire-and-forget send of everything sendable. Never throws, never logs
245
- * above debug. Safe to call at startup of long-running commands.
246
- */
247
- maybeFlush() {
248
- void this.flushNow().catch(() => { });
249
- }
250
- /**
251
- * Drain in-memory state to the buffer, then send completed-day rollups and
252
- * lifecycle events. Bounded by `timeoutMs`; leftovers stay buffered for the
253
- * next process. Awaited only where latency is invisible (install/init).
254
- */
255
- async flushNow(timeoutMs = DEFAULT_FLUSH_TIMEOUT_MS) {
256
- if (!this.isEnabled())
257
- return;
258
- try {
259
- this.persistSync();
260
- this.recoverStaleClaims();
261
- const claim = this.claimQueue();
262
- if (!claim)
263
- return;
264
- const { claimPath, lines } = claim;
265
- const today = this.utcDay();
266
- const sendable = [];
267
- const keep = [];
268
- for (const line of lines) {
269
- if ('ev' in line)
270
- sendable.push(line);
271
- else if (line.d < today)
272
- sendable.push(line);
273
- else
274
- keep.push(line);
275
- }
276
- let failed = [];
277
- if (sendable.length > 0) {
278
- // Consent gate: the one-time notice precedes the FIRST bytes that
279
- // ever leave the machine (and mints the machine id). Recording only
280
- // buffers locally, so it stays silent — this lets the installer show
281
- // its explicit consent toggle before any notice can fire, instead of
282
- // the preAction usage count pre-empting it. An explicit installer/CLI
283
- // choice sets first_run_notice_shown and suppresses this permanently.
284
- this.firstRunNotice();
285
- failed = await this.send(sendable, timeoutMs);
286
- }
287
- // Whatever didn't go out returns to the queue (append — writers may
288
- // have created a fresh queue file while we held the claim).
289
- const back = [...failed, ...keep];
290
- if (back.length > 0)
291
- this.appendLines(back);
292
- try {
293
- fs.rmSync(claimPath, { force: true });
294
- }
295
- catch { /* fail silent */ }
296
- }
297
- catch {
298
- /* fail silent */
299
- }
300
- }
301
- /**
302
- * Periodic flush for long-lived processes (MCP daemon / serve). Unref'd so
303
- * it never keeps the process alive.
304
- */
305
- startInterval(everyMs = 6 * 60 * 60_000) {
306
- if (this.intervalHandle || !this.isEnabled())
307
- return;
308
- this.maybeFlush();
309
- this.intervalHandle = setInterval(() => this.maybeFlush(), everyMs);
310
- this.intervalHandle.unref();
311
- }
312
- stopInterval() {
313
- if (this.intervalHandle) {
314
- clearInterval(this.intervalHandle);
315
- this.intervalHandle = null;
316
- }
317
- }
318
- // -------------------------------------------------------------- internals
319
- utcDay() {
320
- return this.now().toISOString().slice(0, 10);
321
- }
322
- readConfig() {
323
- if (this.configCache !== undefined)
324
- return this.configCache;
325
- try {
326
- const raw = JSON.parse(fs.readFileSync(this.configPath, 'utf8'));
327
- this.configCache = typeof raw.machine_id === 'string' && typeof raw.enabled === 'boolean' ? raw : null;
328
- }
329
- catch {
330
- this.configCache = null;
331
- }
332
- return this.configCache;
333
- }
334
- writeConfig(config) {
335
- try {
336
- fs.mkdirSync(this.dir, { recursive: true, mode: 0o700 });
337
- fs.writeFileSync(this.configPath, JSON.stringify(config, null, 2) + '\n');
338
- this.configCache = config;
339
- }
340
- catch {
341
- /* fail silent */
342
- }
343
- }
344
- /**
345
- * Default-on consent is gated by a one-time stderr notice (interactive
346
- * installs record their choice explicitly and never reach this).
347
- */
348
- firstRunNotice() {
349
- const config = this.readConfig();
350
- if (config?.first_run_notice_shown)
351
- return;
352
- if (!config) {
353
- this.writeConfig({
354
- enabled: true,
355
- machine_id: (0, crypto_1.randomUUID)(),
356
- consent_source: 'default-notice',
357
- first_run_notice_shown: true,
358
- updated_at: this.now().toISOString(),
359
- });
360
- }
361
- else {
362
- this.writeConfig({ ...config, first_run_notice_shown: true, updated_at: this.now().toISOString() });
363
- }
364
- this.writeStderr(`homegraph collects anonymous usage stats (no code, paths, or names) — ` +
365
- `"homegraph telemetry off" or HOMEGRAPH_TELEMETRY=0 disables. Details: ${exports.TELEMETRY_DOCS}\n`);
366
- }
367
- /**
368
- * Synchronous, tiny, exit-safe: drain in-memory deltas to the JSONL queue.
369
- * Runs on `process.on('exit')`, so it must never be async or slow.
370
- */
371
- persistSync() {
372
- if (this.counts.size === 0 && this.events.length === 0)
373
- return;
374
- const lines = [...this.counts.values(), ...this.events];
375
- this.counts.clear();
376
- this.events = [];
377
- // Re-check at persist time: `homegraph telemetry off` mid-process must not
378
- // have its own invocation resurrect the queue file at exit.
379
- if (!this.isEnabled())
380
- return;
381
- this.appendLines(lines);
382
- }
383
- appendLines(lines) {
384
- try {
385
- fs.mkdirSync(this.dir, { recursive: true, mode: 0o700 });
386
- const payload = lines.map((l) => JSON.stringify(l)).join('\n') + '\n';
387
- // Cap the buffer: drop oldest lines first (telemetry is best-effort —
388
- // bounded disk use beats completeness).
389
- let existing = '';
390
- try {
391
- existing = fs.readFileSync(this.queuePath, 'utf8');
392
- }
393
- catch { /* no queue yet */ }
394
- let combined = existing + payload;
395
- if (combined.length > MAX_BUFFER_BYTES) {
396
- combined = combined.slice(combined.length - MAX_BUFFER_BYTES);
397
- combined = combined.slice(combined.indexOf('\n') + 1); // drop the partial first line
398
- }
399
- fs.writeFileSync(this.queuePath, combined);
400
- }
401
- catch {
402
- /* fail silent */
403
- }
404
- }
405
- /**
406
- * Atomically claim the queue for sending (rename). Concurrent processes
407
- * can't double-send; a crash mid-send leaves a claim file that
408
- * `recoverStaleClaims` merges back after an hour.
409
- */
410
- claimQueue() {
411
- const claimPath = path.join(this.dir, `telemetry-queue.sending.${process.pid}.jsonl`);
412
- try {
413
- fs.renameSync(this.queuePath, claimPath);
414
- }
415
- catch {
416
- return null; // no queue, or another process just claimed it
417
- }
418
- const lines = [];
419
- try {
420
- for (const raw of fs.readFileSync(claimPath, 'utf8').split('\n')) {
421
- if (!raw.trim())
422
- continue;
423
- try {
424
- const parsed = JSON.parse(raw);
425
- if (parsed && typeof parsed === 'object' && parsed.v === SCHEMA_VERSION)
426
- lines.push(parsed);
427
- }
428
- catch {
429
- /* skip corrupt line */
430
- }
431
- }
432
- }
433
- catch {
434
- /* unreadable claim — treat as empty; file removed by caller */
435
- }
436
- return { claimPath, lines };
437
- }
438
- recoverStaleClaims() {
439
- try {
440
- const cutoff = this.now().getTime() - STALE_CLAIM_MS;
441
- for (const name of fs.readdirSync(this.dir)) {
442
- if (!name.startsWith('telemetry-queue.sending.'))
443
- continue;
444
- const full = path.join(this.dir, name);
445
- try {
446
- if (fs.statSync(full).mtimeMs < cutoff) {
447
- const content = fs.readFileSync(full, 'utf8');
448
- fs.rmSync(full, { force: true });
449
- if (content.trim())
450
- fs.appendFileSync(this.queuePath, content.endsWith('\n') ? content : content + '\n');
451
- }
452
- }
453
- catch {
454
- /* fail silent */
455
- }
456
- }
457
- }
458
- catch {
459
- /* fail silent */
460
- }
461
- }
462
- /** Returns the lines that did NOT make it out (to be re-queued). */
463
- async send(lines, timeoutMs) {
464
- const config = this.readConfig();
465
- if (!config)
466
- return [];
467
- const events = lines.map((line) => 'ev' in line
468
- ? { event: line.ev, ts: line.ts, props: line.props }
469
- : {
470
- event: 'usage_rollup',
471
- ts: `${line.d}T12:00:00.000Z`,
472
- props: {
473
- kind: line.k,
474
- name: line.n,
475
- count: line.c,
476
- error_count: line.e,
477
- ...(line.cn ? { client_name: line.cn } : {}),
478
- ...(line.cv ? { client_version: line.cv } : {}),
479
- },
480
- });
481
- const envelope = {
482
- machine_id: config.machine_id,
483
- homegraph_version: this.packageVersion(),
484
- os: process.platform,
485
- arch: process.arch,
486
- node_major: parseInt(process.versions.node.split('.')[0] ?? '0', 10),
487
- ci: this.env.CI !== undefined && this.env.CI !== '' && this.env.CI !== '0' && this.env.CI !== 'false',
488
- schema_version: SCHEMA_VERSION,
489
- };
490
- const endpoint = this.env.HOMEGRAPH_TELEMETRY_ENDPOINT || exports.TELEMETRY_ENDPOINT;
491
- for (let i = 0; i < events.length; i += MAX_EVENTS_PER_REQUEST) {
492
- const chunk = events.slice(i, i + MAX_EVENTS_PER_REQUEST);
493
- const body = JSON.stringify({ ...envelope, events: chunk });
494
- this.debug(`POST ${endpoint} (${chunk.length} events)`);
495
- try {
496
- // Any response — 204, 4xx, anything — is final. No retries.
497
- await this.fetchImpl(endpoint, {
498
- method: 'POST',
499
- headers: { 'content-type': 'application/json' },
500
- body,
501
- signal: AbortSignal.timeout(timeoutMs),
502
- });
503
- }
504
- catch (err) {
505
- this.debug(`send failed: ${String(err)}`);
506
- return lines.slice(i); // network failure: re-queue this chunk + the rest
507
- }
508
- }
509
- return [];
510
- }
511
- packageVersion() {
512
- try {
513
- // dist/telemetry/index.js → ../../package.json (same layout in src/ for tests via tsx)
514
- const pkg = JSON.parse(fs.readFileSync(path.join(__dirname, '..', '..', 'package.json'), 'utf8'));
515
- return pkg.version ?? '0.0.0';
516
- }
517
- catch {
518
- return '0.0.0';
519
- }
520
- }
521
- ensureExitHook() {
522
- if (this.exitHookInstalled || !this.installExitHook)
523
- return;
524
- this.exitHookInstalled = true;
525
- registerForExit(this);
526
- }
527
- debug(msg) {
528
- if (this.env.HOMEGRAPH_TELEMETRY_DEBUG === '1') {
529
- this.writeStderr(`[homegraph telemetry] ${msg}\n`);
530
- }
531
- }
532
- }
533
- exports.Telemetry = Telemetry;
534
- // Process-wide singleton — app code goes through this; tests construct their own.
535
- let singleton = null;
536
- function getTelemetry() {
537
- if (!singleton)
538
- singleton = new Telemetry();
539
- return singleton;
540
- }
541
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/telemetry/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwBH,0CAKC;AAED,wCAKC;AAOD,4CAgBC;AA6cD,oCAGC;AAzgBD,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AACzB,mCAAoC;AAEvB,QAAA,kBAAkB,GAAG,8CAA8C,CAAC;AACpE,QAAA,cAAc,GAAG,kEAAkE,CAAC;AAEjG,iFAAiF;AACjF,6EAA6E;AAC7E,oDAAoD;AACpD,MAAM,cAAc,GAAG,CAAC,CAAC;AACzB,MAAM,gBAAgB,GAAG,GAAG,GAAG,IAAI,CAAC;AACpC,MAAM,sBAAsB,GAAG,GAAG,CAAC;AACnC,MAAM,wBAAwB,GAAG,IAAI,CAAC;AACtC,sEAAsE;AACtE,MAAM,cAAc,GAAG,EAAE,GAAG,MAAM,CAAC;AAKnC,oEAAoE;AACpE,SAAgB,eAAe,CAAC,CAAS;IACvC,IAAI,CAAC,GAAG,GAAG;QAAE,OAAO,MAAM,CAAC;IAC3B,IAAI,CAAC,GAAG,IAAI;QAAE,OAAO,QAAQ,CAAC;IAC9B,IAAI,CAAC,GAAG,KAAK;QAAE,OAAO,QAAQ,CAAC;IAC/B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAgB,cAAc,CAAC,EAAU;IACvC,IAAI,EAAE,GAAG,MAAM;QAAE,OAAO,MAAM,CAAC;IAC/B,IAAI,EAAE,GAAG,MAAM;QAAE,OAAO,QAAQ,CAAC;IACjC,IAAI,EAAE,GAAG,OAAO;QAAE,OAAO,MAAM,CAAC;IAChC,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,SAAgB,gBAAgB,CAC9B,EAA+D,EAC/D,MAAoD;IAEpD,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,eAAe,CAAC;aAC5D,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC;aAChC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;QACzB,YAAY,EAAE,CAAC,eAAe,CAAC,OAAO,EAAE;YACtC,SAAS;YACT,iBAAiB,EAAE,eAAe,CAAC,MAAM,CAAC,YAAY,CAAC;YACvD,eAAe,EAAE,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC;SACnD,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,yCAAyC;IAC3C,CAAC;AACH,CAAC;AAqDD,wEAAwE;AACxE,iEAAiE;AACjE,MAAM,aAAa,GAAG,IAAI,GAAG,EAAa,CAAC;AAC3C,IAAI,sBAAsB,GAAG,KAAK,CAAC;AACnC,SAAS,eAAe,CAAC,QAAmB;IAC1C,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC5B,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC5B,sBAAsB,GAAG,IAAI,CAAC;QAC9B,2EAA2E;QAC3E,6DAA6D;QAC7D,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;YACtB,KAAK,MAAM,CAAC,IAAI,aAAa;gBAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QACjD,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,MAAa,SAAS;IACH,GAAG,CAAS;IACZ,SAAS,CAA0B;IACnC,GAAG,CAAa;IAChB,GAAG,CAAoB;IACvB,WAAW,CAAyB;IAE7C,MAAM,GAAG,IAAI,GAAG,EAAqB,CAAC;IACtC,MAAM,GAAgB,EAAE,CAAC;IAChB,eAAe,CAAU;IAClC,iBAAiB,GAAG,KAAK,CAAC;IAC1B,WAAW,CAAgC,CAAC,2BAA2B;IACvE,cAAc,GAA0B,IAAI,CAAC;IAErD,YAAY,OAAyB,EAAE;QACrC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;QAC7D,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,UAAU,CAAC,KAAK,CAAC;QACpD,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;QACnC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACzE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC;IACtD,CAAC;IAED,2EAA2E;IAE3E,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;IAC/C,CAAC;IACD,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAC;IACtD,CAAC;IAED;;;OAGG;IACH,SAAS;QACP,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QACjC,MAAM,SAAS,GAAG,MAAM,EAAE,UAAU,IAAI,IAAI,CAAC;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC;QAClC,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,CAAC,WAAW,EAAE,KAAK,OAAO,EAAE,CAAC;YACpF,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/F,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC;QAC5C,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;YAC1C,MAAM,EAAE,GAAG,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC;YAC9D,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,qBAAqB,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;QACnG,CAAC;QACD,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;QAClG,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;IACzF,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC;IAClC,CAAC;IAED;;;;OAIG;IACH,UAAU,CAAC,OAAgB,EAAE,MAA2B;QACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QACnC,IAAI,CAAC,WAAW,CAAC;YACf,OAAO;YACP,UAAU,EAAE,QAAQ,EAAE,UAAU,IAAI,IAAA,mBAAU,GAAE;YAChD,cAAc,EAAE,MAAM;YACtB,sBAAsB,EAAE,IAAI;YAC5B,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;SACrC,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,IAAI,CAAC;gBAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IAED,2EAA2E;IAC3E,eAAe;QACb,OAAO,IAAI,CAAC,UAAU,EAAE,KAAK,IAAI,CAAC;IACpC,CAAC;IAED,2EAA2E;IAE3E,gEAAgE;IAChE,WAAW,CAAC,IAAe,EAAE,IAAY,EAAE,EAAW,EAAE,MAAmB;QACzE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YAAE,OAAO;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC1B,MAAM,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtC,MAAM,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;YACZ,IAAI,CAAC,EAAE;gBAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,GAAc,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3G,IAAI,EAAE;gBAAE,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC;YACtB,IAAI,EAAE;gBAAE,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC;YACtB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC9B,CAAC;QACD,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAED,mEAAmE;IACnE,eAAe,CAAC,KAAqB,EAAE,KAA8B;QACnE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YAAE,OAAO;QAC9B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QACxF,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAED,2EAA2E;IAE3E;;;OAGG;IACH,UAAU;QACR,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAqB,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,QAAQ,CAAC,YAAoB,wBAAwB;QACzD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YAAE,OAAO;QAC9B,IAAI,CAAC;YACH,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YAChC,IAAI,CAAC,KAAK;gBAAE,OAAO;YACnB,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;YACnC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAiB,EAAE,CAAC;YAClC,MAAM,IAAI,GAAiB,EAAE,CAAC;YAC9B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,IAAI,IAAI,IAAI;oBAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;qBACjC,IAAI,IAAI,CAAC,CAAC,GAAG,KAAK;oBAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;oBACxC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvB,CAAC;YACD,IAAI,MAAM,GAAiB,EAAE,CAAC;YAC9B,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,kEAAkE;gBAClE,oEAAoE;gBACpE,qEAAqE;gBACrE,qEAAqE;gBACrE,sEAAsE;gBACtE,sEAAsE;gBACtE,IAAI,CAAC,cAAc,EAAE,CAAC;gBACtB,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YAChD,CAAC;YACD,oEAAoE;YACpE,4DAA4D;YAC5D,MAAM,IAAI,GAAG,CAAC,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;YAClC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;gBAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YAC5C,IAAI,CAAC;gBAAC,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;QAC5E,CAAC;QAAC,MAAM,CAAC;YACP,iBAAiB;QACnB,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,aAAa,CAAC,UAAkB,CAAC,GAAG,EAAE,GAAG,MAAM;QAC7C,IAAI,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YAAE,OAAO;QACrD,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,OAAO,CAAC,CAAC;QACpE,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;IAC9B,CAAC;IAED,YAAY;QACV,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACnC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,2EAA2E;IAEnE,MAAM;QACZ,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/C,CAAC;IAEO,UAAU;QAChB,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC,WAAW,CAAC;QAC5D,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAe,CAAC;YAC/E,IAAI,CAAC,WAAW,GAAG,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;QACzG,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAC1B,CAAC;QACD,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAEO,WAAW,CAAC,MAAkB;QACpC,IAAI,CAAC;YACH,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACzD,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;YAC1E,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,iBAAiB;QACnB,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,cAAc;QACpB,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QACjC,IAAI,MAAM,EAAE,sBAAsB;YAAE,OAAO;QAC3C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC,WAAW,CAAC;gBACf,OAAO,EAAE,IAAI;gBACb,UAAU,EAAE,IAAA,mBAAU,GAAE;gBACxB,cAAc,EAAE,gBAAgB;gBAChC,sBAAsB,EAAE,IAAI;gBAC5B,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;aACrC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,WAAW,CAAC,EAAE,GAAG,MAAM,EAAE,sBAAsB,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QACtG,CAAC;QACD,IAAI,CAAC,WAAW,CACd,wEAAwE;YACxE,yEAAyE,sBAAc,IAAI,CAC5F,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,WAAW;QACT,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAC/D,MAAM,KAAK,GAAiB,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QACtE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACpB,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,2EAA2E;QAC3E,4DAA4D;QAC5D,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YAAE,OAAO;QAC9B,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAEO,WAAW,CAAC,KAAmB;QACrC,IAAI,CAAC;YACH,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACzD,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;YACtE,sEAAsE;YACtE,wCAAwC;YACxC,IAAI,QAAQ,GAAG,EAAE,CAAC;YAClB,IAAI,CAAC;gBAAC,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;YACxF,IAAI,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;YAClC,IAAI,QAAQ,CAAC,MAAM,GAAG,gBAAgB,EAAE,CAAC;gBACvC,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,gBAAgB,CAAC,CAAC;gBAC9D,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,8BAA8B;YACvF,CAAC;YACD,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,iBAAiB;QACnB,CAAC;IACH,CAAC;IAED;;;;OAIG;IACK,UAAU;QAChB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,2BAA2B,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC;QACtF,IAAI,CAAC;YACH,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC,CAAC,+CAA+C;QAC9D,CAAC;QACD,MAAM,KAAK,GAAiB,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,KAAK,MAAM,GAAG,IAAI,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;oBAAE,SAAS;gBAC1B,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAe,CAAC;oBAC7C,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,CAAC,KAAK,cAAc;wBAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC9F,CAAC;gBAAC,MAAM,CAAC;oBACP,uBAAuB;gBACzB,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,+DAA+D;QACjE,CAAC;QACD,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC9B,CAAC;IAEO,kBAAkB;QACxB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,GAAG,cAAc,CAAC;YACrD,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC5C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,0BAA0B,CAAC;oBAAE,SAAS;gBAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBACvC,IAAI,CAAC;oBACH,IAAI,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,GAAG,MAAM,EAAE,CAAC;wBACvC,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;wBAC9C,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;wBACjC,IAAI,OAAO,CAAC,IAAI,EAAE;4BAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;oBAC3G,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,iBAAiB;gBACnB,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,iBAAiB;QACnB,CAAC;IACH,CAAC;IAED,oEAAoE;IAC5D,KAAK,CAAC,IAAI,CAAC,KAAmB,EAAE,SAAiB;QACvD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QACjC,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAChC,IAAI,IAAI,IAAI;YACV,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE;YACpD,CAAC,CAAC;gBACE,KAAK,EAAE,cAAc;gBACrB,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC,gBAAgB;gBAC7B,KAAK,EAAE;oBACL,IAAI,EAAE,IAAI,CAAC,CAAC;oBACZ,IAAI,EAAE,IAAI,CAAC,CAAC;oBACZ,KAAK,EAAE,IAAI,CAAC,CAAC;oBACb,WAAW,EAAE,IAAI,CAAC,CAAC;oBACnB,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC5C,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAChD;aACF,CACN,CAAC;QACF,MAAM,QAAQ,GAAG;YACf,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,iBAAiB,EAAE,IAAI,CAAC,cAAc,EAAE;YACxC,EAAE,EAAE,OAAO,CAAC,QAAQ;YACpB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC;YACpE,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,OAAO;YACrG,cAAc,EAAE,cAAc;SAC/B,CAAC;QACF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,4BAA4B,IAAI,0BAAkB,CAAC;QAC7E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,sBAAsB,EAAE,CAAC;YAC/D,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,sBAAsB,CAAC,CAAC;YAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YAC5D,IAAI,CAAC,KAAK,CAAC,QAAQ,QAAQ,KAAK,KAAK,CAAC,MAAM,UAAU,CAAC,CAAC;YACxD,IAAI,CAAC;gBACH,4DAA4D;gBAC5D,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE;oBAC7B,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;oBAC/C,IAAI;oBACJ,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC;iBACvC,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,KAAK,CAAC,gBAAgB,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC1C,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,kDAAkD;YAC3E,CAAC;QACH,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAEO,cAAc;QACpB,IAAI,CAAC;YACH,uFAAuF;YACvF,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAyB,CAAC;YAC1H,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IAEO,cAAc;QACpB,IAAI,IAAI,CAAC,iBAAiB,IAAI,CAAC,IAAI,CAAC,eAAe;YAAE,OAAO;QAC5D,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,eAAe,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAEO,KAAK,CAAC,GAAW;QACvB,IAAI,IAAI,CAAC,GAAG,CAAC,yBAAyB,KAAK,GAAG,EAAE,CAAC;YAC/C,IAAI,CAAC,WAAW,CAAC,yBAAyB,GAAG,IAAI,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;CACF;AAnYD,8BAmYC;AAED,kFAAkF;AAClF,IAAI,SAAS,GAAqB,IAAI,CAAC;AAEvC,SAAgB,YAAY;IAC1B,IAAI,CAAC,SAAS;QAAE,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC;IAC5C,OAAO,SAAS,CAAC;AACnB,CAAC"}