@phigon/observer 8.1.0 → 8.3.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 (309) hide show
  1. package/README.md +244 -18
  2. package/dist/bin/guardian-runner-darwin-amd64 +0 -0
  3. package/dist/bin/guardian-runner-darwin-arm64 +0 -0
  4. package/dist/bin/guardian-runner-linux-amd64 +0 -0
  5. package/dist/bin/guardian-runner-linux-arm64 +0 -0
  6. package/dist/bin/guardian-runner-windows-amd64.exe +0 -0
  7. package/dist/bin/guardian-runner-windows-arm64.exe +0 -0
  8. package/dist/src/abortable-delay.d.ts +10 -0
  9. package/dist/src/abortable-delay.d.ts.map +1 -0
  10. package/dist/src/abortable-delay.js +21 -0
  11. package/dist/src/abortable-delay.js.map +1 -0
  12. package/dist/src/action-policy.d.ts.map +1 -1
  13. package/dist/src/action-policy.js +4 -2
  14. package/dist/src/action-policy.js.map +1 -1
  15. package/dist/src/activity/adapters/claude.d.ts.map +1 -1
  16. package/dist/src/activity/adapters/claude.js +28 -2
  17. package/dist/src/activity/adapters/claude.js.map +1 -1
  18. package/dist/src/activity/adapters/cline-task.d.ts +7 -0
  19. package/dist/src/activity/adapters/cline-task.d.ts.map +1 -0
  20. package/dist/src/activity/adapters/cline-task.js +197 -0
  21. package/dist/src/activity/adapters/cline-task.js.map +1 -0
  22. package/dist/src/activity/adapters/cline.d.ts +3 -0
  23. package/dist/src/activity/adapters/cline.d.ts.map +1 -0
  24. package/dist/src/activity/adapters/cline.js +102 -0
  25. package/dist/src/activity/adapters/cline.js.map +1 -0
  26. package/dist/src/activity/adapters/codex.d.ts.map +1 -1
  27. package/dist/src/activity/adapters/codex.js +76 -0
  28. package/dist/src/activity/adapters/codex.js.map +1 -1
  29. package/dist/src/activity/adapters/copilot-chat.d.ts +3 -0
  30. package/dist/src/activity/adapters/copilot-chat.d.ts.map +1 -0
  31. package/dist/src/activity/adapters/copilot-chat.js +176 -0
  32. package/dist/src/activity/adapters/copilot-chat.js.map +1 -0
  33. package/dist/src/activity/adapters/copilot.d.ts +2 -1
  34. package/dist/src/activity/adapters/copilot.d.ts.map +1 -1
  35. package/dist/src/activity/adapters/copilot.js +173 -2
  36. package/dist/src/activity/adapters/copilot.js.map +1 -1
  37. package/dist/src/activity/adapters/cursor.d.ts +3 -0
  38. package/dist/src/activity/adapters/cursor.d.ts.map +1 -0
  39. package/dist/src/activity/adapters/cursor.js +86 -0
  40. package/dist/src/activity/adapters/cursor.js.map +1 -0
  41. package/dist/src/activity/adapters/factory-droid.d.ts +3 -0
  42. package/dist/src/activity/adapters/factory-droid.d.ts.map +1 -0
  43. package/dist/src/activity/adapters/factory-droid.js +126 -0
  44. package/dist/src/activity/adapters/factory-droid.js.map +1 -0
  45. package/dist/src/activity/adapters/gemini.d.ts +3 -0
  46. package/dist/src/activity/adapters/gemini.d.ts.map +1 -0
  47. package/dist/src/activity/adapters/gemini.js +177 -0
  48. package/dist/src/activity/adapters/gemini.js.map +1 -0
  49. package/dist/src/activity/adapters/goose.d.ts +3 -0
  50. package/dist/src/activity/adapters/goose.d.ts.map +1 -0
  51. package/dist/src/activity/adapters/goose.js +116 -0
  52. package/dist/src/activity/adapters/goose.js.map +1 -0
  53. package/dist/src/activity/adapters/kiro.d.ts +3 -0
  54. package/dist/src/activity/adapters/kiro.d.ts.map +1 -0
  55. package/dist/src/activity/adapters/kiro.js +47 -0
  56. package/dist/src/activity/adapters/kiro.js.map +1 -0
  57. package/dist/src/activity/adapters/openai-compatible.d.ts.map +1 -1
  58. package/dist/src/activity/adapters/openai-compatible.js +9 -1
  59. package/dist/src/activity/adapters/openai-compatible.js.map +1 -1
  60. package/dist/src/activity/adapters/opencode.d.ts.map +1 -1
  61. package/dist/src/activity/adapters/opencode.js +108 -1
  62. package/dist/src/activity/adapters/opencode.js.map +1 -1
  63. package/dist/src/activity/adapters/zed.d.ts +3 -0
  64. package/dist/src/activity/adapters/zed.d.ts.map +1 -0
  65. package/dist/src/activity/adapters/zed.js +134 -0
  66. package/dist/src/activity/adapters/zed.js.map +1 -0
  67. package/dist/src/activity/collector.d.ts +43 -1
  68. package/dist/src/activity/collector.d.ts.map +1 -1
  69. package/dist/src/activity/collector.js +490 -77
  70. package/dist/src/activity/collector.js.map +1 -1
  71. package/dist/src/activity/goose-sqlite-source.d.ts +33 -0
  72. package/dist/src/activity/goose-sqlite-source.d.ts.map +1 -0
  73. package/dist/src/activity/goose-sqlite-source.js +274 -0
  74. package/dist/src/activity/goose-sqlite-source.js.map +1 -0
  75. package/dist/src/activity/index.d.ts +3 -0
  76. package/dist/src/activity/index.d.ts.map +1 -1
  77. package/dist/src/activity/index.js +3 -0
  78. package/dist/src/activity/index.js.map +1 -1
  79. package/dist/src/activity/ingest.d.ts +9 -0
  80. package/dist/src/activity/ingest.d.ts.map +1 -1
  81. package/dist/src/activity/ingest.js +94 -4
  82. package/dist/src/activity/ingest.js.map +1 -1
  83. package/dist/src/activity/json-document-source.d.ts +151 -0
  84. package/dist/src/activity/json-document-source.d.ts.map +1 -0
  85. package/dist/src/activity/json-document-source.js +586 -0
  86. package/dist/src/activity/json-document-source.js.map +1 -0
  87. package/dist/src/activity/native-capabilities.d.ts.map +1 -1
  88. package/dist/src/activity/native-capabilities.js +8 -12
  89. package/dist/src/activity/native-capabilities.js.map +1 -1
  90. package/dist/src/activity/normalize.d.ts.map +1 -1
  91. package/dist/src/activity/normalize.js +64 -6
  92. package/dist/src/activity/normalize.js.map +1 -1
  93. package/dist/src/activity/opencode-message-tables.d.ts +87 -0
  94. package/dist/src/activity/opencode-message-tables.d.ts.map +1 -0
  95. package/dist/src/activity/opencode-message-tables.js +546 -0
  96. package/dist/src/activity/opencode-message-tables.js.map +1 -0
  97. package/dist/src/activity/opencode-sqlite-source.d.ts +7 -0
  98. package/dist/src/activity/opencode-sqlite-source.d.ts.map +1 -1
  99. package/dist/src/activity/opencode-sqlite-source.js +154 -63
  100. package/dist/src/activity/opencode-sqlite-source.js.map +1 -1
  101. package/dist/src/activity/source-reader.d.ts +60 -4
  102. package/dist/src/activity/source-reader.d.ts.map +1 -1
  103. package/dist/src/activity/source-reader.js +593 -75
  104. package/dist/src/activity/source-reader.js.map +1 -1
  105. package/dist/src/activity/sqlite-connections.d.ts +77 -0
  106. package/dist/src/activity/sqlite-connections.d.ts.map +1 -0
  107. package/dist/src/activity/sqlite-connections.js +220 -0
  108. package/dist/src/activity/sqlite-connections.js.map +1 -0
  109. package/dist/src/activity/zed-sqlite-source.d.ts +65 -0
  110. package/dist/src/activity/zed-sqlite-source.d.ts.map +1 -0
  111. package/dist/src/activity/zed-sqlite-source.js +547 -0
  112. package/dist/src/activity/zed-sqlite-source.js.map +1 -0
  113. package/dist/src/agent-action-executor.d.ts +18 -1
  114. package/dist/src/agent-action-executor.d.ts.map +1 -1
  115. package/dist/src/agent-action-executor.js +113 -58
  116. package/dist/src/agent-action-executor.js.map +1 -1
  117. package/dist/src/agentic-guardian.d.ts.map +1 -1
  118. package/dist/src/agentic-guardian.js +6 -5
  119. package/dist/src/agentic-guardian.js.map +1 -1
  120. package/dist/src/atomic-replace.d.ts +7 -0
  121. package/dist/src/atomic-replace.d.ts.map +1 -1
  122. package/dist/src/atomic-replace.js +28 -3
  123. package/dist/src/atomic-replace.js.map +1 -1
  124. package/dist/src/bridge-journal.d.ts +32 -0
  125. package/dist/src/bridge-journal.d.ts.map +1 -0
  126. package/dist/src/bridge-journal.js +113 -0
  127. package/dist/src/bridge-journal.js.map +1 -0
  128. package/dist/src/cli.d.ts +7 -1
  129. package/dist/src/cli.d.ts.map +1 -1
  130. package/dist/src/cli.js +534 -50
  131. package/dist/src/cli.js.map +1 -1
  132. package/dist/src/collection-notice.d.ts +34 -0
  133. package/dist/src/collection-notice.d.ts.map +1 -0
  134. package/dist/src/collection-notice.js +73 -0
  135. package/dist/src/collection-notice.js.map +1 -0
  136. package/dist/src/config.d.ts +39 -0
  137. package/dist/src/config.d.ts.map +1 -1
  138. package/dist/src/config.js +187 -36
  139. package/dist/src/config.js.map +1 -1
  140. package/dist/src/connection-config.d.ts.map +1 -1
  141. package/dist/src/connection-config.js +5 -0
  142. package/dist/src/connection-config.js.map +1 -1
  143. package/dist/src/content-redaction.d.ts +17 -1
  144. package/dist/src/content-redaction.d.ts.map +1 -1
  145. package/dist/src/content-redaction.js +51 -3
  146. package/dist/src/content-redaction.js.map +1 -1
  147. package/dist/src/credential-store.d.ts +20 -1
  148. package/dist/src/credential-store.d.ts.map +1 -1
  149. package/dist/src/credential-store.js +29 -4
  150. package/dist/src/credential-store.js.map +1 -1
  151. package/dist/src/custom-agent-registry.d.ts.map +1 -1
  152. package/dist/src/custom-agent-registry.js +2 -1
  153. package/dist/src/custom-agent-registry.js.map +1 -1
  154. package/dist/src/discovery/adapters/generic.d.ts.map +1 -1
  155. package/dist/src/discovery/adapters/generic.js +160 -2
  156. package/dist/src/discovery/adapters/generic.js.map +1 -1
  157. package/dist/src/discovery/engine.d.ts +7 -1
  158. package/dist/src/discovery/engine.d.ts.map +1 -1
  159. package/dist/src/discovery/engine.js +21 -16
  160. package/dist/src/discovery/engine.js.map +1 -1
  161. package/dist/src/discovery/known-agent.d.ts +7 -0
  162. package/dist/src/discovery/known-agent.d.ts.map +1 -1
  163. package/dist/src/discovery/known-agent.js +9 -4
  164. package/dist/src/discovery/known-agent.js.map +1 -1
  165. package/dist/src/discovery/system-evidence.d.ts +40 -1
  166. package/dist/src/discovery/system-evidence.d.ts.map +1 -1
  167. package/dist/src/discovery/system-evidence.js +189 -16
  168. package/dist/src/discovery/system-evidence.js.map +1 -1
  169. package/dist/src/doctor-check.d.ts +51 -0
  170. package/dist/src/doctor-check.d.ts.map +1 -0
  171. package/dist/src/doctor-check.js +174 -0
  172. package/dist/src/doctor-check.js.map +1 -0
  173. package/dist/src/enroll.d.ts +86 -0
  174. package/dist/src/enroll.d.ts.map +1 -0
  175. package/dist/src/enroll.js +245 -0
  176. package/dist/src/enroll.js.map +1 -0
  177. package/dist/src/entry.d.ts +3 -0
  178. package/dist/src/entry.d.ts.map +1 -0
  179. package/dist/src/entry.js +14 -0
  180. package/dist/src/entry.js.map +1 -0
  181. package/dist/src/event-queue.d.ts +13 -1
  182. package/dist/src/event-queue.d.ts.map +1 -1
  183. package/dist/src/event-queue.js +137 -42
  184. package/dist/src/event-queue.js.map +1 -1
  185. package/dist/src/event-spool.d.ts +61 -3
  186. package/dist/src/event-spool.d.ts.map +1 -1
  187. package/dist/src/event-spool.js +341 -44
  188. package/dist/src/event-spool.js.map +1 -1
  189. package/dist/src/generated/phigon/v1/identity_pb.d.ts +7 -0
  190. package/dist/src/generated/phigon/v1/identity_pb.d.ts.map +1 -1
  191. package/dist/src/generated/phigon/v1/identity_pb.js +1 -1
  192. package/dist/src/generated/phigon/v1/identity_pb.js.map +1 -1
  193. package/dist/src/guardian-containment.d.ts +2 -6
  194. package/dist/src/guardian-containment.d.ts.map +1 -1
  195. package/dist/src/guardian-containment.js +12 -63
  196. package/dist/src/guardian-containment.js.map +1 -1
  197. package/dist/src/guardian-decision-journal.d.ts.map +1 -1
  198. package/dist/src/guardian-decision-journal.js +4 -19
  199. package/dist/src/guardian-decision-journal.js.map +1 -1
  200. package/dist/src/guardian-managed-exec.d.ts.map +1 -1
  201. package/dist/src/guardian-managed-exec.js +6 -18
  202. package/dist/src/guardian-managed-exec.js.map +1 -1
  203. package/dist/src/guardian-model-bridge.d.ts.map +1 -1
  204. package/dist/src/guardian-model-bridge.js +2 -1
  205. package/dist/src/guardian-model-bridge.js.map +1 -1
  206. package/dist/src/guardian-native.d.ts +0 -1
  207. package/dist/src/guardian-native.d.ts.map +1 -1
  208. package/dist/src/guardian-native.js +0 -6
  209. package/dist/src/guardian-native.js.map +1 -1
  210. package/dist/src/guardian-process-monitor.d.ts +4 -0
  211. package/dist/src/guardian-process-monitor.d.ts.map +1 -1
  212. package/dist/src/guardian-process-monitor.js +82 -26
  213. package/dist/src/guardian-process-monitor.js.map +1 -1
  214. package/dist/src/health.d.ts +19 -1
  215. package/dist/src/health.d.ts.map +1 -1
  216. package/dist/src/health.js +22 -1
  217. package/dist/src/health.js.map +1 -1
  218. package/dist/src/historical-identity-store.d.ts +8 -1
  219. package/dist/src/historical-identity-store.d.ts.map +1 -1
  220. package/dist/src/historical-identity-store.js +28 -10
  221. package/dist/src/historical-identity-store.js.map +1 -1
  222. package/dist/src/index.d.ts +2 -0
  223. package/dist/src/index.d.ts.map +1 -1
  224. package/dist/src/index.js +2 -0
  225. package/dist/src/index.js.map +1 -1
  226. package/dist/src/installation.d.ts +2 -0
  227. package/dist/src/installation.d.ts.map +1 -1
  228. package/dist/src/installation.js +6 -3
  229. package/dist/src/installation.js.map +1 -1
  230. package/dist/src/instance-lock.d.ts +45 -0
  231. package/dist/src/instance-lock.d.ts.map +1 -0
  232. package/dist/src/instance-lock.js +243 -0
  233. package/dist/src/instance-lock.js.map +1 -0
  234. package/dist/src/machine-command-executor.d.ts +22 -7
  235. package/dist/src/machine-command-executor.d.ts.map +1 -1
  236. package/dist/src/machine-command-executor.js +80 -19
  237. package/dist/src/machine-command-executor.js.map +1 -1
  238. package/dist/src/node-version.d.ts +8 -0
  239. package/dist/src/node-version.d.ts.map +1 -0
  240. package/dist/src/node-version.js +17 -0
  241. package/dist/src/node-version.js.map +1 -0
  242. package/dist/src/observer-log.d.ts +50 -0
  243. package/dist/src/observer-log.d.ts.map +1 -0
  244. package/dist/src/observer-log.js +141 -0
  245. package/dist/src/observer-log.js.map +1 -0
  246. package/dist/src/pair.d.ts +68 -1
  247. package/dist/src/pair.d.ts.map +1 -1
  248. package/dist/src/pair.js +204 -65
  249. package/dist/src/pair.js.map +1 -1
  250. package/dist/src/private-directory.d.ts +10 -0
  251. package/dist/src/private-directory.d.ts.map +1 -0
  252. package/dist/src/private-directory.js +66 -0
  253. package/dist/src/private-directory.js.map +1 -0
  254. package/dist/src/process-tree.d.ts +73 -0
  255. package/dist/src/process-tree.d.ts.map +1 -0
  256. package/dist/src/process-tree.js +256 -0
  257. package/dist/src/process-tree.js.map +1 -0
  258. package/dist/src/proxy.d.ts +68 -0
  259. package/dist/src/proxy.d.ts.map +1 -0
  260. package/dist/src/proxy.js +209 -0
  261. package/dist/src/proxy.js.map +1 -0
  262. package/dist/src/purge.d.ts +17 -0
  263. package/dist/src/purge.d.ts.map +1 -0
  264. package/dist/src/purge.js +84 -0
  265. package/dist/src/purge.js.map +1 -0
  266. package/dist/src/remove-machine.d.ts +5 -1
  267. package/dist/src/remove-machine.d.ts.map +1 -1
  268. package/dist/src/remove-machine.js +28 -14
  269. package/dist/src/remove-machine.js.map +1 -1
  270. package/dist/src/server-authority.d.ts +29 -0
  271. package/dist/src/server-authority.d.ts.map +1 -0
  272. package/dist/src/server-authority.js +106 -0
  273. package/dist/src/server-authority.js.map +1 -0
  274. package/dist/src/server-clock.d.ts +32 -0
  275. package/dist/src/server-clock.d.ts.map +1 -0
  276. package/dist/src/server-clock.js +72 -0
  277. package/dist/src/server-clock.js.map +1 -0
  278. package/dist/src/service-command.d.ts +20 -0
  279. package/dist/src/service-command.d.ts.map +1 -0
  280. package/dist/src/service-command.js +136 -0
  281. package/dist/src/service-command.js.map +1 -0
  282. package/dist/src/service.d.ts +98 -0
  283. package/dist/src/service.d.ts.map +1 -0
  284. package/dist/src/service.js +472 -0
  285. package/dist/src/service.js.map +1 -0
  286. package/dist/src/stream-client.d.ts +21 -1
  287. package/dist/src/stream-client.d.ts.map +1 -1
  288. package/dist/src/stream-client.js +137 -24
  289. package/dist/src/stream-client.js.map +1 -1
  290. package/dist/src/stream-state.d.ts +2 -0
  291. package/dist/src/stream-state.d.ts.map +1 -1
  292. package/dist/src/stream-state.js +5 -2
  293. package/dist/src/stream-state.js.map +1 -1
  294. package/dist/src/system-inspection.d.ts +78 -0
  295. package/dist/src/system-inspection.d.ts.map +1 -0
  296. package/dist/src/system-inspection.js +281 -0
  297. package/dist/src/system-inspection.js.map +1 -0
  298. package/dist/src/update.d.ts.map +1 -1
  299. package/dist/src/update.js +9 -3
  300. package/dist/src/update.js.map +1 -1
  301. package/dist/src/user-notices.d.ts +64 -0
  302. package/dist/src/user-notices.d.ts.map +1 -0
  303. package/dist/src/user-notices.js +141 -0
  304. package/dist/src/user-notices.js.map +1 -0
  305. package/package.json +7 -7
  306. package/dist/src/windows-process.d.ts +0 -7
  307. package/dist/src/windows-process.d.ts.map +0 -1
  308. package/dist/src/windows-process.js +0 -18
  309. package/dist/src/windows-process.js.map +0 -1
@@ -3,19 +3,91 @@ import { execFile } from "node:child_process";
3
3
  import { constants } from "node:fs";
4
4
  import { access, stat } from "node:fs/promises";
5
5
  import { homedir } from "node:os";
6
- import { basename, delimiter, join } from "node:path";
6
+ import { basename, delimiter, join, win32 } from "node:path";
7
7
  import { promisify } from "node:util";
8
8
  import { observedProcessKey } from "./process-identity.js";
9
+ import { guardianRunnerPath } from "../guardian-native.js";
9
10
  const execFileAsync = promisify(execFile);
10
11
  const executableNamePattern = /^[a-zA-Z0-9._+-]{1,128}$/;
11
12
  const versionPattern = /\bv?\d+\.\d+(?:\.\d+)?(?:[-+][0-9A-Za-z.-]+)?\b/;
13
+ const maxCachedExecutableProbes = 64;
14
+ /**
15
+ * Remembers which agent CLIs are installed between discovery passes.
16
+ * Finding one walks PATH and runs its `--version`, which starts the agent's
17
+ * own runtime; discovery runs every few seconds, while installs change
18
+ * rarely. A found CLI is probed again when its file changes or after
19
+ * `foundTtlMs` (npm shims stay unchanged across upgrades); an absent one, or
20
+ * one whose version could not be read, is probed again after `missingTtlMs`.
21
+ */
22
+ export class ExecutableProbeCache {
23
+ #entries = new Map();
24
+ #foundTtlMs;
25
+ #missingTtlMs;
26
+ #clock;
27
+ constructor(options = {}) {
28
+ this.#foundTtlMs = options.foundTtlMs ?? 5 * 60_000;
29
+ this.#missingTtlMs = options.missingTtlMs ?? 60_000;
30
+ this.#clock = options.clock ?? Date.now;
31
+ }
32
+ async lookup(key) {
33
+ const cached = this.#entries.get(key);
34
+ if (cached === undefined)
35
+ return undefined;
36
+ const age = this.#clock() - cached.checkedAt;
37
+ if (age < 0 || age >= cached.ttlMs)
38
+ return undefined;
39
+ if (cached.executablePath === undefined)
40
+ return { value: cached.value };
41
+ try {
42
+ const metadata = await stat(cached.executablePath);
43
+ if (metadata.size !== cached.size ||
44
+ metadata.mtimeMs !== cached.modifiedMs) {
45
+ return undefined;
46
+ }
47
+ }
48
+ catch {
49
+ return undefined;
50
+ }
51
+ return { value: cached.value };
52
+ }
53
+ async remember(key, value, executablePath) {
54
+ const checkedAt = this.#clock();
55
+ const ttlMs = value === null || value.version === ""
56
+ ? this.#missingTtlMs
57
+ : this.#foundTtlMs;
58
+ let entry = { checkedAt, ttlMs, value };
59
+ if (executablePath !== null) {
60
+ try {
61
+ const metadata = await stat(executablePath);
62
+ entry = {
63
+ ...entry,
64
+ executablePath,
65
+ size: metadata.size,
66
+ modifiedMs: metadata.mtimeMs,
67
+ };
68
+ }
69
+ catch {
70
+ return;
71
+ }
72
+ }
73
+ this.#entries.delete(key);
74
+ this.#entries.set(key, entry);
75
+ if (this.#entries.size > maxCachedExecutableProbes) {
76
+ const oldest = this.#entries.keys().next().value;
77
+ if (oldest !== undefined)
78
+ this.#entries.delete(oldest);
79
+ }
80
+ }
81
+ }
12
82
  export class SystemEvidenceProvider {
13
83
  #platform;
14
84
  #environment;
85
+ #executableCache;
15
86
  #processes;
16
- constructor(platform = process.platform, environment = process.env) {
87
+ constructor(platform = process.platform, environment = process.env, executableCache) {
17
88
  this.#platform = platform;
18
89
  this.#environment = environment;
90
+ this.#executableCache = executableCache;
19
91
  }
20
92
  listProcesses() {
21
93
  this.#processes ??= this.#readProcesses();
@@ -30,20 +102,29 @@ export class SystemEvidenceProvider {
30
102
  };
31
103
  }
32
104
  }
105
+ const cacheKey = JSON.stringify([
106
+ this.#platform,
107
+ this.#environmentValue("PATH") ?? "",
108
+ this.#environmentValue("PATHEXT") ?? "",
109
+ candidates,
110
+ ]);
33
111
  try {
112
+ const cached = await this.#executableCache?.lookup(cacheKey);
113
+ if (cached !== undefined)
114
+ return { status: "ok", value: cached.value };
34
115
  for (const candidate of candidates) {
35
116
  const executablePath = await this.#findExecutable(candidate);
36
117
  if (executablePath === null)
37
118
  continue;
38
- return {
39
- status: "ok",
40
- value: {
41
- executableName: normalizedExecutableName(candidate),
42
- executablePathDigest: digest(executablePath),
43
- version: await readVersion(executablePath),
44
- },
119
+ const value = {
120
+ executableName: normalizedExecutableName(candidate),
121
+ executablePathDigest: digest(executablePath),
122
+ version: await readVersion(executablePath),
45
123
  };
124
+ await this.#executableCache?.remember(cacheKey, value, executablePath);
125
+ return { status: "ok", value };
46
126
  }
127
+ await this.#executableCache?.remember(cacheKey, null, null);
47
128
  return { status: "ok", value: null };
48
129
  }
49
130
  catch (error) {
@@ -123,13 +204,15 @@ export class SystemEvidenceProvider {
123
204
  return probeFailure(error, "Process inspection");
124
205
  }
125
206
  }
126
- async #findExecutable(candidate) {
127
- const environmentValue = (name) => this.#environment[name] ?? (this.#platform === "win32"
207
+ #environmentValue(name) {
208
+ return this.#environment[name] ?? (this.#platform === "win32"
128
209
  ? Object.entries(this.#environment).find(([key]) => key.toUpperCase() === name)?.[1]
129
210
  : undefined);
130
- const pathValue = environmentValue("PATH") ?? "";
211
+ }
212
+ async #findExecutable(candidate) {
213
+ const pathValue = this.#environmentValue("PATH") ?? "";
131
214
  const extensions = this.#platform === "win32"
132
- ? (environmentValue("PATHEXT") ?? ".EXE;.CMD;.BAT")
215
+ ? (this.#environmentValue("PATHEXT") ?? ".EXE;.CMD;.BAT")
133
216
  .split(";")
134
217
  .filter(Boolean)
135
218
  : [""];
@@ -154,7 +237,51 @@ export class SystemEvidenceProvider {
154
237
  return null;
155
238
  }
156
239
  }
240
+ // Set once the native helper is found missing (for example, a source
241
+ // checkout built without Go); PowerShell is used from then on.
242
+ let nativeProcessListingMissing = false;
243
+ /**
244
+ * Windows processes, listed by the bundled native helper in tens of
245
+ * milliseconds. PowerShell's Win32_Process query, which costs 0.3-1 s (most
246
+ * of it PowerShell start-up), is the fallback when the helper is missing or
247
+ * fails. Both report the same IDs, names and start times, and paths are
248
+ * normalized (see windowsPathIdentity) before identities are derived. Each
249
+ * listing is one short-lived process with a timeout, so nothing outlives
250
+ * the observer.
251
+ */
157
252
  async function readWindowsProcesses() {
253
+ return listWindowsProcesses(nativeProcessListingMissing ? undefined : runNativeProcessListing, runPowerShellProcessListing);
254
+ }
255
+ export async function listWindowsProcesses(native, powerShell) {
256
+ if (native !== undefined) {
257
+ try {
258
+ return windowsProcessEvidence(nativeProcessValues(await native()));
259
+ }
260
+ catch {
261
+ // A crashed, timed-out or unreadable helper is retried next pass.
262
+ }
263
+ }
264
+ const parsed = JSON.parse(await powerShell());
265
+ return windowsProcessEvidence(Array.isArray(parsed) ? parsed : [parsed]);
266
+ }
267
+ export async function runNativeProcessListing() {
268
+ try {
269
+ const { stdout } = await execFileAsync(guardianRunnerPath(), ["__processes"], {
270
+ timeout: 5_000,
271
+ maxBuffer: 8 << 20,
272
+ encoding: "utf8",
273
+ windowsHide: true,
274
+ });
275
+ return stdout;
276
+ }
277
+ catch (error) {
278
+ if (isNodeError(error) && error.code === "ENOENT") {
279
+ nativeProcessListingMissing = true;
280
+ }
281
+ throw error;
282
+ }
283
+ }
284
+ export async function runPowerShellProcessListing() {
158
285
  const script = [
159
286
  "Get-CimInstance Win32_Process",
160
287
  "Select-Object ProcessId,CreationDate,ExecutablePath,Name",
@@ -166,8 +293,34 @@ async function readWindowsProcesses() {
166
293
  encoding: "utf8",
167
294
  windowsHide: true,
168
295
  });
296
+ return stdout;
297
+ }
298
+ /**
299
+ * The native listing in Win32_Process's shape. PowerShell serializes
300
+ * CreationDate as `/Date(<Unix ms>)/`; the helper reports those milliseconds,
301
+ * so rebuilding the string keeps process identities unchanged.
302
+ */
303
+ export function nativeProcessValues(stdout) {
169
304
  const parsed = JSON.parse(stdout);
170
- const values = Array.isArray(parsed) ? parsed : [parsed];
305
+ if (!Array.isArray(parsed)) {
306
+ throw new Error("Native process listing is invalid.");
307
+ }
308
+ return parsed.map((value) => {
309
+ if (typeof value !== "object" || value === null)
310
+ return undefined;
311
+ const entry = value;
312
+ const created = entry["created_ms"];
313
+ return {
314
+ ProcessId: entry["pid"],
315
+ Name: entry["name"],
316
+ CreationDate: typeof created === "number" && Number.isSafeInteger(created) && created > 0
317
+ ? `/Date(${created})/`
318
+ : undefined,
319
+ ExecutablePath: entry["path"],
320
+ };
321
+ });
322
+ }
323
+ function windowsProcessEvidence(values) {
171
324
  const processes = [];
172
325
  for (const value of values) {
173
326
  if (typeof value !== "object" ||
@@ -185,7 +338,7 @@ async function readWindowsProcesses() {
185
338
  ? value.ExecutablePath
186
339
  : value.Name;
187
340
  const startedAt = processStartDate(value.CreationDate);
188
- const executablePathDigest = digest(rawPath);
341
+ const executablePathDigest = digest(windowsPathIdentity(rawPath));
189
342
  const processKey = observedProcessKey("win32", value.ProcessId, value.CreationDate, executablePathDigest);
190
343
  if (startedAt === undefined || processKey === undefined)
191
344
  continue;
@@ -199,6 +352,23 @@ async function readWindowsProcesses() {
199
352
  }
200
353
  return processes;
201
354
  }
355
+ /**
356
+ * One spelling of a Windows executable path, so a process has the same
357
+ * identity whichever listing found it. Win32_Process reports the path the
358
+ * process was started with (`C:\windows\Explorer.EXE`,
359
+ * `C:\Program Files\Git\bin\..\usr\bin\bash.exe`); the native helper reports
360
+ * the file's own path (`C:\Windows\explorer.exe`). Windows paths are
361
+ * case-insensitive, so case, `.` and `..` segments and a `\\?\` prefix are
362
+ * removed. A path reached through a junction still differs from its target.
363
+ */
364
+ export function windowsPathIdentity(path) {
365
+ let value = path;
366
+ if (/^\\\\\?\\UNC\\/iu.test(value))
367
+ value = `\\\\${value.slice(8)}`;
368
+ else if (value.startsWith("\\\\?\\"))
369
+ value = value.slice(4);
370
+ return win32.normalize(value).toLowerCase();
371
+ }
202
372
  async function readVersion(executablePath) {
203
373
  try {
204
374
  // npm exposes .cmd shims on Windows, which execFile cannot launch.
@@ -210,7 +380,10 @@ async function readVersion(executablePath) {
210
380
  if (script !== undefined)
211
381
  await access(script, constants.F_OK);
212
382
  const execution = execFileAsync(script === undefined ? executablePath : "powershell.exe", script === undefined ? ["--version"] : ["-NoProfile", "-NonInteractive", "-File", script, "--version"], {
213
- timeout: 5_000,
383
+ // Starting PowerShell alone can take several seconds on a busy or
384
+ // closely monitored computer, as for the PowerShell process listing.
385
+ // A probe result is cached, so a slow start is paid once per CLI.
386
+ timeout: script === undefined ? 5_000 : 15_000,
214
387
  maxBuffer: 4_096,
215
388
  encoding: "utf8",
216
389
  windowsHide: true,
@@ -1 +1 @@
1
- {"version":3,"file":"system-evidence.js","sourceRoot":"","sources":["../../../src/discovery/system-evidence.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"system-evidence.js","sourceRoot":"","sources":["../../../src/discovery/system-evidence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import type { ObserverConfig } from "./config.js";
2
+ import { type ObserverConsentHealth } from "./health.js";
3
+ import { type InstanceLockHolder } from "./instance-lock.js";
4
+ /**
5
+ * Exit codes of `doctor --check`, for device management scripts. The first
6
+ * failing check, in this order, decides the code.
7
+ */
8
+ export declare const doctorCheckExitCodes: Readonly<{
9
+ ok: 0;
10
+ notPaired: 3;
11
+ consentMissing: 4;
12
+ notRunning: 5;
13
+ deliveryStale: 6;
14
+ controlPlaneUnreachable: 7;
15
+ }>;
16
+ export declare const defaultMaxDeliveryAgeMinutes = 15;
17
+ export type DoctorCheckName = "paired" | "consent" | "running" | "delivery" | "control_plane";
18
+ export type DoctorCheck = Readonly<{
19
+ name: DoctorCheckName;
20
+ status: "pass" | "fail" | "skip";
21
+ detail: string;
22
+ }>;
23
+ export type DoctorCheckReport = Readonly<{
24
+ ok: boolean;
25
+ exitCode: number;
26
+ observerVersion: string;
27
+ dataDirectory: string;
28
+ controlPlaneOrigin: string;
29
+ maxDeliveryAgeMinutes: number;
30
+ /** How this computer consented, when it is paired with this server. */
31
+ consent?: ObserverConsentHealth;
32
+ checks: readonly DoctorCheck[];
33
+ checkedAt: string;
34
+ }>;
35
+ export type DoctorCheckOptions = Readonly<{
36
+ config: ObserverConfig;
37
+ observerVersion: string;
38
+ maxDeliveryAgeMinutes?: number;
39
+ now?: () => Date;
40
+ fetcher?: typeof fetch;
41
+ inspectLock?: (dataDirectory: string) => Promise<InstanceLockHolder>;
42
+ probeTimeoutMs?: number;
43
+ }>;
44
+ /**
45
+ * Checks, without sending any activity, that this computer is paired with
46
+ * current consent, that an observer is running, that the workspace has
47
+ * confirmed delivery recently, and that the control plane answers.
48
+ */
49
+ export declare function runDoctorCheck(options: DoctorCheckOptions): Promise<DoctorCheckReport>;
50
+ export declare function formatDoctorCheck(report: DoctorCheckReport): string;
51
+ //# sourceMappingURL=doctor-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor-check.d.ts","sourceRoot":"","sources":["../../src/doctor-check.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,EAAiB,KAAK,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAgB,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAI3E;;;GAGG;AACH,eAAO,MAAM,oBAAoB;;;;;;;EAO/B,CAAC;AAEH,eAAO,MAAM,4BAA4B,KAAK,CAAC;AAG/C,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,eAAe,CAAC;AAE9F,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC;IACjC,IAAI,EAAE,eAAe,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC;IACvC,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,uEAAuE;IACvE,OAAO,CAAC,EAAE,qBAAqB,CAAC;IAChC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC,CAAC;AAUH,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAC;IACxC,MAAM,EAAE,cAAc,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IACvB,WAAW,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACrE,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC,CAAC;AAEH;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA8F5F;AAgDD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAgBnE"}
@@ -0,0 +1,174 @@
1
+ import { FileCredentialStore } from "./credential-store.js";
2
+ import { consentHealth } from "./health.js";
3
+ import { InstanceLock } from "./instance-lock.js";
4
+ import { OBSERVER_CONSENT_POLICY_VERSION } from "./pair.js";
5
+ import { StreamStateStore } from "./stream-state.js";
6
+ /**
7
+ * Exit codes of `doctor --check`, for device management scripts. The first
8
+ * failing check, in this order, decides the code.
9
+ */
10
+ export const doctorCheckExitCodes = Object.freeze({
11
+ ok: 0,
12
+ notPaired: 3,
13
+ consentMissing: 4,
14
+ notRunning: 5,
15
+ deliveryStale: 6,
16
+ controlPlaneUnreachable: 7,
17
+ });
18
+ export const defaultMaxDeliveryAgeMinutes = 15;
19
+ const probeTimeoutMs = 5_000;
20
+ const exitCodeFor = Object.freeze({
21
+ paired: doctorCheckExitCodes.notPaired,
22
+ consent: doctorCheckExitCodes.consentMissing,
23
+ running: doctorCheckExitCodes.notRunning,
24
+ delivery: doctorCheckExitCodes.deliveryStale,
25
+ control_plane: doctorCheckExitCodes.controlPlaneUnreachable,
26
+ });
27
+ /**
28
+ * Checks, without sending any activity, that this computer is paired with
29
+ * current consent, that an observer is running, that the workspace has
30
+ * confirmed delivery recently, and that the control plane answers.
31
+ */
32
+ export async function runDoctorCheck(options) {
33
+ const { config } = options;
34
+ const now = (options.now ?? (() => new Date()))();
35
+ const maxAge = options.maxDeliveryAgeMinutes ?? defaultMaxDeliveryAgeMinutes;
36
+ const checks = [];
37
+ let credential = null;
38
+ try {
39
+ credential = await new FileCredentialStore(config.dataDirectory).load();
40
+ if (credential === null) {
41
+ checks.push(fail("paired", "This computer is not paired. Run phigon-observer pair with a code from Connect machine."));
42
+ }
43
+ else if (credential.controlPlaneOrigin !== config.controlPlaneUrl.origin) {
44
+ checks.push(fail("paired", `This computer is paired with ${credential.controlPlaneOrigin}, but the observer is set up for ${config.controlPlaneUrl.origin}.`));
45
+ credential = null;
46
+ }
47
+ else {
48
+ checks.push(pass("paired", `Paired as machine ${credential.machineId} with ${credential.controlPlaneOrigin}.`));
49
+ }
50
+ }
51
+ catch (error) {
52
+ checks.push(fail("paired", error instanceof Error ? error.message : "Stored pairing data could not be read."));
53
+ }
54
+ const consent = credential === null ? undefined : consentHealth(credential);
55
+ if (credential === null || consent === undefined) {
56
+ checks.push(skip("consent", "Needs pairing first."));
57
+ }
58
+ else if (credential.consentProfile === undefined ||
59
+ credential.consentPolicyVersion !== OBSERVER_CONSENT_POLICY_VERSION) {
60
+ // A company's consent is stored only with its profile, so this is an
61
+ // owner's consent from before profiles, or from an older policy.
62
+ checks.push(fail("consent", "The owner's consent is missing or out of date. Pair again with --consent-profile metadata or --consent-profile full."));
63
+ }
64
+ else {
65
+ const when = credential.consentedAt === undefined ? "" : ` on ${credential.consentedAt}`;
66
+ checks.push(pass("consent", consent.source === "company"
67
+ ? `Your company consented for this computer to the ${credential.consentProfile} profile${consent.enrollmentCodeLabel === undefined ? " with an enrollment code" : ` with the enrollment code "${consent.enrollmentCodeLabel}"`}${when}.`
68
+ : `The owner consented to the ${credential.consentProfile} profile${when}.`));
69
+ }
70
+ try {
71
+ const holder = await (options.inspectLock ?? ((directory) => InstanceLock.inspect(directory)))(config.dataDirectory);
72
+ checks.push(holder.running
73
+ ? pass("running", `An observer is running with this data directory${holder.pid === undefined ? "" : ` (process ${holder.pid})`}.`)
74
+ : fail("running", "No observer is running with this data directory. Start it with phigon-observer service install, or run phigon-observer run."));
75
+ }
76
+ catch {
77
+ checks.push(fail("running", "Could not tell whether an observer is running: its lock file could not be read."));
78
+ }
79
+ if (credential === null) {
80
+ checks.push(skip("delivery", "Needs pairing first."));
81
+ }
82
+ else {
83
+ try {
84
+ const state = await new StreamStateStore(config.dataDirectory).load(credential.machineId);
85
+ const confirmedAt = Date.parse(state.updatedAt);
86
+ const minutes = Math.floor((now.getTime() - confirmedAt) / 60_000);
87
+ if (confirmedAt <= 0) {
88
+ checks.push(fail("delivery", "The workspace has not confirmed any delivery from this computer yet."));
89
+ }
90
+ else if (minutes > maxAge) {
91
+ checks.push(fail("delivery", `Nothing has been delivered to the workspace for ${minutes} minutes (last confirmed ${state.updatedAt}).`));
92
+ }
93
+ else {
94
+ checks.push(pass("delivery", `The workspace last confirmed delivery ${Math.max(0, minutes)} minutes ago.`));
95
+ }
96
+ }
97
+ catch {
98
+ checks.push(fail("delivery", "The stored stream checkpoint could not be read."));
99
+ }
100
+ }
101
+ checks.push(await probeControlPlane(config.controlPlaneUrl, options.fetcher ?? fetch, options.probeTimeoutMs ?? probeTimeoutMs));
102
+ const failed = checks.find((check) => check.status === "fail");
103
+ return Object.freeze({
104
+ ok: failed === undefined,
105
+ exitCode: failed === undefined ? doctorCheckExitCodes.ok : exitCodeFor[failed.name],
106
+ observerVersion: options.observerVersion,
107
+ dataDirectory: config.dataDirectory,
108
+ controlPlaneOrigin: config.controlPlaneUrl.origin,
109
+ maxDeliveryAgeMinutes: maxAge,
110
+ ...(consent === undefined ? {} : { consent }),
111
+ checks: Object.freeze(checks),
112
+ checkedAt: now.toISOString(),
113
+ });
114
+ }
115
+ /** GET /healthz, through the configured proxy and the pinned authority. */
116
+ async function probeControlPlane(url, fetcher, timeoutMs) {
117
+ const endpoint = new URL("/healthz", url);
118
+ const started = performance.now();
119
+ try {
120
+ const response = await fetcher(endpoint, {
121
+ method: "GET",
122
+ headers: { Accept: "application/json" },
123
+ redirect: "error",
124
+ signal: AbortSignal.timeout(timeoutMs),
125
+ });
126
+ await response.body?.cancel().catch(() => undefined);
127
+ if (!response.ok) {
128
+ return fail("control_plane", `The control plane at ${url.origin} answered HTTP ${response.status}.`);
129
+ }
130
+ return pass("control_plane", `The control plane at ${url.origin} answered in ${Math.round(performance.now() - started)} ms.`);
131
+ }
132
+ catch (error) {
133
+ const reason = error instanceof Error && error.name === "TimeoutError"
134
+ ? `no answer within ${Math.round(timeoutMs / 1_000)} seconds`
135
+ : errorCode(error) ?? "the connection failed";
136
+ return fail("control_plane", `Could not reach the control plane at ${url.origin} (${reason}).`);
137
+ }
138
+ }
139
+ /** A system error code such as ENOTFOUND or a certificate error, never a message with data. */
140
+ function errorCode(error) {
141
+ for (let current = error, depth = 0; current instanceof Error && depth < 4; depth++) {
142
+ const code = current.code;
143
+ if (typeof code === "string" && /^[A-Z0-9_]{2,64}$/u.test(code))
144
+ return code;
145
+ current = current.cause;
146
+ }
147
+ return undefined;
148
+ }
149
+ function pass(name, detail) {
150
+ return Object.freeze({ name, status: "pass", detail });
151
+ }
152
+ function fail(name, detail) {
153
+ return Object.freeze({ name, status: "fail", detail });
154
+ }
155
+ function skip(name, detail) {
156
+ return Object.freeze({ name, status: "skip", detail });
157
+ }
158
+ export function formatDoctorCheck(report) {
159
+ const labels = {
160
+ paired: "Pairing",
161
+ consent: "Consent",
162
+ running: "Observer",
163
+ delivery: "Delivery",
164
+ control_plane: "Control plane",
165
+ };
166
+ return [
167
+ report.ok
168
+ ? "Phigon observer check passed."
169
+ : `Phigon observer check found a problem (exit code ${report.exitCode}).`,
170
+ ...report.checks.map((check) => `${check.status === "pass" ? "ok " : check.status === "fail" ? "FAIL" : "skip"} ${labels[check.name].padEnd(13)} ${check.detail}`),
171
+ "",
172
+ ].join("\n");
173
+ }
174
+ //# sourceMappingURL=doctor-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor-check.js","sourceRoot":"","sources":["../../src/doctor-check.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAgC,MAAM,uBAAuB,CAAC;AAC1F,OAAO,EAAE,aAAa,EAA8B,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,YAAY,EAA2B,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,+BAA+B,EAAE,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,CAAC;IAChD,EAAE,EAAE,CAAC;IACL,SAAS,EAAE,CAAC;IACZ,cAAc,EAAE,CAAC;IACjB,UAAU,EAAE,CAAC;IACb,aAAa,EAAE,CAAC;IAChB,uBAAuB,EAAE,CAAC;CAC3B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,4BAA4B,GAAG,EAAE,CAAC;AAC/C,MAAM,cAAc,GAAG,KAAK,CAAC;AAuB7B,MAAM,WAAW,GAA8C,MAAM,CAAC,MAAM,CAAC;IAC3E,MAAM,EAAE,oBAAoB,CAAC,SAAS;IACtC,OAAO,EAAE,oBAAoB,CAAC,cAAc;IAC5C,OAAO,EAAE,oBAAoB,CAAC,UAAU;IACxC,QAAQ,EAAE,oBAAoB,CAAC,aAAa;IAC5C,aAAa,EAAE,oBAAoB,CAAC,uBAAuB;CAC5D,CAAC,CAAC;AAYH;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAA2B;IAC9D,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAC3B,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;IAClD,MAAM,MAAM,GAAG,OAAO,CAAC,qBAAqB,IAAI,4BAA4B,CAAC;IAC7E,MAAM,MAAM,GAAkB,EAAE,CAAC;IAEjC,IAAI,UAAU,GAAmC,IAAI,CAAC;IACtD,IAAI,CAAC;QACH,UAAU,GAAG,MAAM,IAAI,mBAAmB,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,EAAE,CAAC;QACxE,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,yFAAyF,CAAC,CAAC,CAAC;QACzH,CAAC;aAAM,IAAI,UAAU,CAAC,kBAAkB,KAAK,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC;YAC3E,MAAM,CAAC,IAAI,CAAC,IAAI,CACd,QAAQ,EACR,gCAAgC,UAAU,CAAC,kBAAkB,oCAAoC,MAAM,CAAC,eAAe,CAAC,MAAM,GAAG,CAClI,CAAC,CAAC;YACH,UAAU,GAAG,IAAI,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,qBAAqB,UAAU,CAAC,SAAS,SAAS,UAAU,CAAC,kBAAkB,GAAG,CAAC,CAAC,CAAC;QAClH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,wCAAwC,CAAC,CAAC,CAAC;IACjH,CAAC;IAED,MAAM,OAAO,GAAG,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IAC5E,IAAI,UAAU,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QACjD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,sBAAsB,CAAC,CAAC,CAAC;IACvD,CAAC;SAAM,IACL,UAAU,CAAC,cAAc,KAAK,SAAS;QACvC,UAAU,CAAC,oBAAoB,KAAK,+BAA+B,EACnE,CAAC;QACD,qEAAqE;QACrE,iEAAiE;QACjE,MAAM,CAAC,IAAI,CAAC,IAAI,CACd,SAAS,EACT,sHAAsH,CACvH,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,GAAG,UAAU,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,UAAU,CAAC,WAAW,EAAE,CAAC;QACzF,MAAM,CAAC,IAAI,CAAC,IAAI,CACd,SAAS,EACT,OAAO,CAAC,MAAM,KAAK,SAAS;YAC1B,CAAC,CAAC,mDAAmD,UAAU,CAAC,cAAc,WAC5E,OAAO,CAAC,mBAAmB,KAAK,SAAS,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,8BAA8B,OAAO,CAAC,mBAAmB,GACpI,GAAG,IAAI,GAAG;YACV,CAAC,CAAC,8BAA8B,UAAU,CAAC,cAAc,WAAW,IAAI,GAAG,CAC9E,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QACrH,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO;YACxB,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,kDAAkD,MAAM,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC;YAClI,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,6HAA6H,CAAC,CAAC,CAAC;IACtJ,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,iFAAiF,CAAC,CAAC,CAAC;IAClH,CAAC;IAED,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,sBAAsB,CAAC,CAAC,CAAC;IACxD,CAAC;SAAM,CAAC;QACN,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,IAAI,gBAAgB,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YAC1F,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAChD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,WAAW,CAAC,GAAG,MAAM,CAAC,CAAC;YACnE,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;gBACrB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,sEAAsE,CAAC,CAAC,CAAC;YACxG,CAAC;iBAAM,IAAI,OAAO,GAAG,MAAM,EAAE,CAAC;gBAC5B,MAAM,CAAC,IAAI,CAAC,IAAI,CACd,UAAU,EACV,mDAAmD,OAAO,4BAA4B,KAAK,CAAC,SAAS,IAAI,CAC1G,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,yCAAyC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC;YAC9G,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,iDAAiD,CAAC,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,MAAM,iBAAiB,CAAC,MAAM,CAAC,eAAe,EAAE,OAAO,CAAC,OAAO,IAAI,KAAK,EAAE,OAAO,CAAC,cAAc,IAAI,cAAc,CAAC,CAAC,CAAC;IAEjI,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IAC/D,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,EAAE,EAAE,MAAM,KAAK,SAAS;QACxB,QAAQ,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC;QACnF,eAAe,EAAE,OAAO,CAAC,eAAe;QACxC,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,kBAAkB,EAAE,MAAM,CAAC,eAAe,CAAC,MAAM;QACjD,qBAAqB,EAAE,MAAM;QAC7B,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;QAC7C,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;QAC7B,SAAS,EAAE,GAAG,CAAC,WAAW,EAAE;KAC7B,CAAC,CAAC;AACL,CAAC;AAED,2EAA2E;AAC3E,KAAK,UAAU,iBAAiB,CAAC,GAAQ,EAAE,OAAqB,EAAE,SAAiB;IACjF,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAClC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE;YACvC,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;YACvC,QAAQ,EAAE,OAAO;YACjB,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC;SACvC,CAAC,CAAC;QACH,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACrD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC,eAAe,EAAE,wBAAwB,GAAG,CAAC,MAAM,kBAAkB,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QACvG,CAAC;QACD,OAAO,IAAI,CAAC,eAAe,EAAE,wBAAwB,GAAG,CAAC,MAAM,gBAAgB,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAChI,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc;YACpE,CAAC,CAAC,oBAAoB,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,UAAU;YAC7D,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,uBAAuB,CAAC;QAChD,OAAO,IAAI,CAAC,eAAe,EAAE,wCAAwC,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC;IAClG,CAAC;AACH,CAAC;AAED,+FAA+F;AAC/F,SAAS,SAAS,CAAC,KAAc;IAC/B,KAAK,IAAI,OAAO,GAAY,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,OAAO,YAAY,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QAC7F,MAAM,IAAI,GAAI,OAAiC,CAAC,IAAI,CAAC;QACrD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QAC7E,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC;IAC1B,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,IAAI,CAAC,IAAqB,EAAE,MAAc;IACjD,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,IAAI,CAAC,IAAqB,EAAE,MAAc;IACjD,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,IAAI,CAAC,IAAqB,EAAE,MAAc;IACjD,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAyB;IACzD,MAAM,MAAM,GAA8C;QACxD,MAAM,EAAE,SAAS;QACjB,OAAO,EAAE,SAAS;QAClB,OAAO,EAAE,UAAU;QACnB,QAAQ,EAAE,UAAU;QACpB,aAAa,EAAE,eAAe;KAC/B,CAAC;IACF,OAAO;QACL,MAAM,CAAC,EAAE;YACP,CAAC,CAAC,+BAA+B;YACjC,CAAC,CAAC,oDAAoD,MAAM,CAAC,QAAQ,IAAI;QAC3E,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAC7B,GAAG,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACtI,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}