@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
@@ -0,0 +1,86 @@
1
+ import type { ObserverConfig } from "./config.js";
2
+ import { type CredentialStore } from "./credential-store.js";
3
+ import { type ConsentProfile, type PairResult } from "./pair.js";
4
+ /**
5
+ * Enrollment with a company's reusable enrollment code. Unlike pairing, the
6
+ * company gives consent for its computers: nobody at this computer is
7
+ * asked, the server answers with the profile the company chose, and that
8
+ * profile limits collection exactly as an owner's choice does.
9
+ *
10
+ * The code itself is never printed, logged or stored.
11
+ */
12
+ /** The environment variable device management scripts pass the code in. */
13
+ export declare const enrollmentCodeVariable = "PHIGON_ENROLLMENT_CODE";
14
+ /**
15
+ * Exit codes of `pair` with an enrollment code, for device management
16
+ * scripts. Any other failure exits with 1.
17
+ */
18
+ export declare const enrollmentExitCodes: Readonly<{
19
+ /** The server is busy, unavailable or unreachable: run it again later. */
20
+ retryLater: 20;
21
+ /** Expired, revoked, used up or outdated: the company needs a new code. */
22
+ newCodeNeeded: 21;
23
+ /** Not an enrollment code, or cut short. */
24
+ invalidCode: 22;
25
+ /** This computer enrolled with this code before and was removed since. */
26
+ alreadyUsed: 23;
27
+ /** This computer is already connected to the workspace. */
28
+ alreadyConnected: 24;
29
+ }>;
30
+ /** A failed enrollment: a plain sentence, the server's code and an exit code. */
31
+ export declare class EnrollmentError extends Error {
32
+ readonly code: string;
33
+ readonly exitCode: number;
34
+ constructor(message: string, code: string, exitCode: number);
35
+ }
36
+ /**
37
+ * Retries for a busy server (HTTP 429 or 503): a few attempts, each after
38
+ * the server's Retry-After plus a little jitter so a fleet behind one
39
+ * address does not come back at the same second, within a bounded total.
40
+ */
41
+ export declare const enrollmentRetry: Readonly<{
42
+ attempts: 4;
43
+ defaultWaitMs: 30000;
44
+ maxWaitMs: 120000;
45
+ totalWaitMs: 300000;
46
+ jitterMs: 10000;
47
+ }>;
48
+ /**
49
+ * Checks an enrollment code's shape before it is sent, so a mistyped code
50
+ * costs no request. Errors never repeat the code.
51
+ */
52
+ export declare function checkedEnrollmentCode(value: string): string;
53
+ /** The consent the company gave, as the server reported it. */
54
+ export type CompanyConsent = Readonly<{
55
+ source: "company";
56
+ profile: ConsentProfile;
57
+ policyVersion: string;
58
+ grantedAt?: string;
59
+ enrollmentCodeId?: string;
60
+ enrollmentCodeLabel?: string;
61
+ }>;
62
+ export type EnrollResult = PairResult & Readonly<{
63
+ consent: CompanyConsent;
64
+ }>;
65
+ export type EnrollOptions = Readonly<{
66
+ config: ObserverConfig;
67
+ code: string;
68
+ displayName?: string;
69
+ observerVersion?: string;
70
+ credentialStore?: CredentialStore;
71
+ fetcher?: typeof fetch;
72
+ /** Called before each retry of a busy server, with the wait. */
73
+ onRetry?: (waitMs: number, attempt: number) => void;
74
+ sleep?: (ms: number) => Promise<void>;
75
+ random?: () => number;
76
+ }>;
77
+ /**
78
+ * Enrolls this computer with a company's enrollment code through
79
+ * `POST /v1/machines/enroll`, and stores the machine credential with the
80
+ * company's consent. A computer already paired with this server sends its
81
+ * stored key and keeps its machine; its consent moves to the company's.
82
+ */
83
+ export declare function enrollMachine(options: EnrollOptions): Promise<EnrollResult>;
84
+ /** Retry-After in seconds or as an HTTP date, within the retry bounds. */
85
+ export declare function retryAfterMs(header: string | null, now?: number): number;
86
+ //# sourceMappingURL=enroll.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enroll.d.ts","sourceRoot":"","sources":["../../src/enroll.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAQL,KAAK,cAAc,EAEnB,KAAK,UAAU,EAChB,MAAM,WAAW,CAAC;AAGnB;;;;;;;GAOG;AAEH,2EAA2E;AAC3E,eAAO,MAAM,sBAAsB,2BAA2B,CAAC;AAE/D;;;GAGG;AACH,eAAO,MAAM,mBAAmB;IAC9B,0EAA0E;;IAE1E,2EAA2E;;IAE3E,4CAA4C;;IAE5C,0EAA0E;;IAE1E,2DAA2D;;EAE3D,CAAC;AAeH,iFAAiF;AACjF,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAEd,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;CAM5D;AAED;;;;GAIG;AACH,eAAO,MAAM,eAAe;;;;;;EAM1B,CAAC;AAIH;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAiB3D;AAED,+DAA+D;AAC/D,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC;IACpC,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE,cAAc,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,CAAC,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,QAAQ,CAAC;IAAE,OAAO,EAAE,cAAc,CAAA;CAAE,CAAC,CAAC;AAI9E,MAAM,MAAM,aAAa,GAAG,QAAQ,CAAC;IACnC,MAAM,EAAE,cAAc,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IACvB,gEAAgE;IAChE,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC;CACvB,CAAC,CAAC;AAEH;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAkCjF;AAuID,0EAA0E;AAC1E,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,GAAE,MAAmB,GAAG,MAAM,CASpF"}
@@ -0,0 +1,245 @@
1
+ import { arch, hostname } from "node:os";
2
+ import { setTimeout as delay } from "node:timers/promises";
3
+ import { redactSecrets } from "./content-redaction.js";
4
+ import { maxEnrollmentCodeLabelLength, } from "./credential-store.js";
5
+ import { OBSERVER_CONSENT_POLICY_VERSION, apiError, connectMachine, credentialRejected, isConnectedMachine, normalizedOperatingSystem, } from "./pair.js";
6
+ import { plainText } from "./user-notices.js";
7
+ /**
8
+ * Enrollment with a company's reusable enrollment code. Unlike pairing, the
9
+ * company gives consent for its computers: nobody at this computer is
10
+ * asked, the server answers with the profile the company chose, and that
11
+ * profile limits collection exactly as an owner's choice does.
12
+ *
13
+ * The code itself is never printed, logged or stored.
14
+ */
15
+ /** The environment variable device management scripts pass the code in. */
16
+ export const enrollmentCodeVariable = "PHIGON_ENROLLMENT_CODE";
17
+ /**
18
+ * Exit codes of `pair` with an enrollment code, for device management
19
+ * scripts. Any other failure exits with 1.
20
+ */
21
+ export const enrollmentExitCodes = Object.freeze({
22
+ /** The server is busy, unavailable or unreachable: run it again later. */
23
+ retryLater: 20,
24
+ /** Expired, revoked, used up or outdated: the company needs a new code. */
25
+ newCodeNeeded: 21,
26
+ /** Not an enrollment code, or cut short. */
27
+ invalidCode: 22,
28
+ /** This computer enrolled with this code before and was removed since. */
29
+ alreadyUsed: 23,
30
+ /** This computer is already connected to the workspace. */
31
+ alreadyConnected: 24,
32
+ });
33
+ const exitCodeForServerCode = Object.freeze({
34
+ rate_limited: enrollmentExitCodes.retryLater,
35
+ rate_limit_unavailable: enrollmentExitCodes.retryLater,
36
+ enrollment_unavailable: enrollmentExitCodes.retryLater,
37
+ enrollment_code_expired: enrollmentExitCodes.newCodeNeeded,
38
+ enrollment_code_revoked: enrollmentExitCodes.newCodeNeeded,
39
+ enrollment_code_used_up: enrollmentExitCodes.newCodeNeeded,
40
+ enrollment_code_outdated: enrollmentExitCodes.newCodeNeeded,
41
+ invalid_enrollment_code: enrollmentExitCodes.invalidCode,
42
+ enrollment_code_already_used: enrollmentExitCodes.alreadyUsed,
43
+ installation_already_paired: enrollmentExitCodes.alreadyConnected,
44
+ });
45
+ /** A failed enrollment: a plain sentence, the server's code and an exit code. */
46
+ export class EnrollmentError extends Error {
47
+ code;
48
+ exitCode;
49
+ constructor(message, code, exitCode) {
50
+ super(message);
51
+ this.name = "EnrollmentError";
52
+ this.code = code;
53
+ this.exitCode = exitCode;
54
+ }
55
+ }
56
+ /**
57
+ * Retries for a busy server (HTTP 429 or 503): a few attempts, each after
58
+ * the server's Retry-After plus a little jitter so a fleet behind one
59
+ * address does not come back at the same second, within a bounded total.
60
+ */
61
+ export const enrollmentRetry = Object.freeze({
62
+ attempts: 4,
63
+ defaultWaitMs: 30_000,
64
+ maxWaitMs: 120_000,
65
+ totalWaitMs: 300_000,
66
+ jitterMs: 10_000,
67
+ });
68
+ const codePattern = /^phe_[A-Za-z0-9_-]{32}$/u;
69
+ /**
70
+ * Checks an enrollment code's shape before it is sent, so a mistyped code
71
+ * costs no request. Errors never repeat the code.
72
+ */
73
+ export function checkedEnrollmentCode(value) {
74
+ const code = value.trim();
75
+ if (!code.startsWith("phe_")) {
76
+ throw new EnrollmentError("This is not an enrollment code: enrollment codes start with phe_. For a one-time pairing code from Connect machine, use --code instead.", "invalid_enrollment_code", enrollmentExitCodes.invalidCode);
77
+ }
78
+ if (!codePattern.test(code)) {
79
+ throw new EnrollmentError("This enrollment code is not valid. Check that it was copied in full, or ask your administrator for a new one.", "invalid_enrollment_code", enrollmentExitCodes.invalidCode);
80
+ }
81
+ return code;
82
+ }
83
+ /**
84
+ * Enrolls this computer with a company's enrollment code through
85
+ * `POST /v1/machines/enroll`, and stores the machine credential with the
86
+ * company's consent. A computer already paired with this server sends its
87
+ * stored key and keeps its machine; its consent moves to the company's.
88
+ */
89
+ export async function enrollMachine(options) {
90
+ const code = checkedEnrollmentCode(options.code);
91
+ const endpoint = new URL("/v1/machines/enroll", options.config.controlPlaneUrl);
92
+ const fetcher = options.fetcher ?? fetch;
93
+ const version = reportableVersion(options.observerVersion);
94
+ const connected = await connectMachine({
95
+ config: options.config,
96
+ endpoint,
97
+ fetcher,
98
+ ...(options.credentialStore === undefined ? {} : { credentialStore: options.credentialStore }),
99
+ exchange: (installationID, existingCredential) => exchangeWithRetries(options, fetcher, endpoint, {
100
+ enrollment_code: code,
101
+ installation_id: installationID,
102
+ display_name: options.displayName?.trim() || hostname(),
103
+ hostname: hostname(),
104
+ operating_system: normalizedOperatingSystem(),
105
+ architecture: arch(),
106
+ ...(version === undefined ? {} : { observer_version: version }),
107
+ ...(existingCredential === undefined ? {} : { existing_credential: existingCredential }),
108
+ }),
109
+ evidence: (enrolled, at) => ({
110
+ consentProfile: enrolled.consent.profile,
111
+ consentPolicyVersion: enrolled.consent.policyVersion,
112
+ consentedAt: enrolled.consent.grantedAt ?? at,
113
+ consentSource: "company",
114
+ ...(enrolled.consent.enrollmentCodeId === undefined
115
+ ? {}
116
+ : { enrollmentCodeId: enrolled.consent.enrollmentCodeId }),
117
+ ...(enrolled.consent.enrollmentCodeLabel === undefined
118
+ ? {}
119
+ : { enrollmentCodeLabel: enrolled.consent.enrollmentCodeLabel }),
120
+ }),
121
+ });
122
+ return Object.freeze({ ...connected.result, consent: connected.paired.consent });
123
+ }
124
+ async function exchangeWithRetries(options, fetcher, endpoint, body) {
125
+ const sleep = options.sleep ?? ((ms) => delay(ms));
126
+ const random = options.random ?? Math.random;
127
+ let waited = 0;
128
+ for (let attempt = 1;; attempt++) {
129
+ const outcome = await exchangeEnrollment(fetcher, endpoint, body);
130
+ if (!("retryAfterMs" in outcome))
131
+ return outcome;
132
+ const waitMs = Math.round(outcome.retryAfterMs + random() * enrollmentRetry.jitterMs);
133
+ if (attempt >= enrollmentRetry.attempts || waited + waitMs > enrollmentRetry.totalWaitMs) {
134
+ return { error: outcome.error, credentialRejected: false };
135
+ }
136
+ options.onRetry?.(waitMs, attempt);
137
+ await sleep(waitMs);
138
+ waited += waitMs;
139
+ }
140
+ }
141
+ async function exchangeEnrollment(fetcher, endpoint, body) {
142
+ let response;
143
+ try {
144
+ response = await fetcher(endpoint, {
145
+ method: "POST",
146
+ headers: {
147
+ "Content-Type": "application/json",
148
+ Accept: "application/json",
149
+ },
150
+ body: JSON.stringify(body),
151
+ redirect: "error",
152
+ signal: AbortSignal.timeout(15_000),
153
+ });
154
+ }
155
+ catch (error) {
156
+ throw new EnrollmentError(error instanceof Error && error.name === "TimeoutError"
157
+ ? `Enrollment timed out while contacting ${endpoint.origin}. Run the same command again; within 10 minutes it gets the same machine back.`
158
+ : `Could not reach ${endpoint.origin}. Check the network and the control-plane address, then try again.`, "unreachable", enrollmentExitCodes.retryLater);
159
+ }
160
+ if (!response.ok) {
161
+ const failure = await apiError(response);
162
+ const code = failure.code ?? `http_${response.status}`;
163
+ const error = new EnrollmentError(serverSentence(failure.message) ?? `Enrollment failed with HTTP ${response.status}. Try again later.`, code, exitCodeForServerCode[code] ??
164
+ (response.status >= 500 ? enrollmentExitCodes.retryLater : 1));
165
+ if (response.status === 429 || response.status === 503) {
166
+ return { error, retryAfterMs: retryAfterMs(response.headers.get("retry-after")) };
167
+ }
168
+ return { error, credentialRejected: credentialRejected(response.status, failure) };
169
+ }
170
+ let value;
171
+ try {
172
+ value = await response.json();
173
+ }
174
+ catch {
175
+ // A truncated response may contain a credential; parser errors must not
176
+ // print fragments. The server answers a repeat with the same machine.
177
+ throw new EnrollmentError("The enrollment response was incomplete. Run the same command again within 10 minutes and keep the data directory; the server answers with the same machine.", "invalid_response", enrollmentExitCodes.retryLater);
178
+ }
179
+ const consent = companyConsent(value);
180
+ if (!isConnectedMachine(value) || consent === undefined) {
181
+ throw new EnrollmentError("The control plane returned an enrollment this observer cannot use. Update the observer, then enroll again.", "invalid_response", 1);
182
+ }
183
+ return { paired: { machine: value.machine, credential: value.credential, consent } };
184
+ }
185
+ /**
186
+ * The company's consent from an enrollment response. A consent this
187
+ * observer cannot honour exactly, such as a newer policy version, is
188
+ * refused rather than stored.
189
+ */
190
+ function companyConsent(value) {
191
+ if (typeof value !== "object" || value === null || !("consent" in value))
192
+ return undefined;
193
+ const consent = value.consent;
194
+ if (typeof consent !== "object" ||
195
+ consent === null ||
196
+ !("source" in consent) || consent.source !== "company" ||
197
+ !("profile" in consent) || (consent.profile !== "metadata" && consent.profile !== "full") ||
198
+ !("policy_version" in consent) || consent.policy_version !== OBSERVER_CONSENT_POLICY_VERSION) {
199
+ return undefined;
200
+ }
201
+ const grantedAt = "granted_at" in consent && typeof consent.granted_at === "string" &&
202
+ Number.isFinite(Date.parse(consent.granted_at))
203
+ ? new Date(consent.granted_at).toISOString()
204
+ : undefined;
205
+ const codeId = "enrollment_code_id" in consent && typeof consent.enrollment_code_id === "string" &&
206
+ /^[0-9A-Fa-f-]{1,64}$/u.test(consent.enrollment_code_id)
207
+ ? consent.enrollment_code_id
208
+ : undefined;
209
+ const label = "enrollment_code_label" in consent && typeof consent.enrollment_code_label === "string"
210
+ ? plainText(consent.enrollment_code_label, maxEnrollmentCodeLabelLength)
211
+ : "";
212
+ return Object.freeze({
213
+ source: "company",
214
+ profile: consent.profile,
215
+ policyVersion: consent.policy_version,
216
+ ...(grantedAt === undefined ? {} : { grantedAt }),
217
+ ...(codeId === undefined ? {} : { enrollmentCodeId: codeId }),
218
+ ...(label === "" ? {} : { enrollmentCodeLabel: label }),
219
+ });
220
+ }
221
+ /** The server's plain sentence, one bounded line with any secret removed. */
222
+ function serverSentence(message) {
223
+ if (message === undefined)
224
+ return undefined;
225
+ const sentence = plainText(redactSecrets(message), 300);
226
+ return sentence === "" ? undefined : sentence;
227
+ }
228
+ /** Retry-After in seconds or as an HTTP date, within the retry bounds. */
229
+ export function retryAfterMs(header, now = Date.now()) {
230
+ let wait = enrollmentRetry.defaultWaitMs;
231
+ const value = header?.trim() ?? "";
232
+ if (/^\d{1,6}$/u.test(value)) {
233
+ wait = Number(value) * 1_000;
234
+ }
235
+ else if (value !== "" && Number.isFinite(Date.parse(value))) {
236
+ wait = Date.parse(value) - now;
237
+ }
238
+ return Math.min(enrollmentRetry.maxWaitMs, Math.max(1_000, wait));
239
+ }
240
+ /** Printable ASCII of at most 64 bytes, as the server accepts. */
241
+ function reportableVersion(version) {
242
+ const value = version?.trim() ?? "";
243
+ return /^[!-~]{1,64}$/u.test(value) ? value : undefined;
244
+ }
245
+ //# sourceMappingURL=enroll.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enroll.js","sourceRoot":"","sources":["../../src/enroll.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=entry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry.d.ts","sourceRoot":"","sources":["../../src/entry.ts"],"names":[],"mappings":""}
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env node
2
+ // The command's entry point. It checks the Node.js version before loading
3
+ // the rest of the observer, which an older Node.js may not be able to load.
4
+ import { nodeVersionProblem } from "./node-version.js";
5
+ const problem = nodeVersionProblem(process.versions.node);
6
+ if (problem === undefined) {
7
+ const { run } = await import("./cli.js");
8
+ process.exitCode = await run(process.argv.slice(2));
9
+ }
10
+ else {
11
+ process.stderr.write(`${problem}\n`);
12
+ process.exitCode = 1;
13
+ }
14
+ //# sourceMappingURL=entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry.js","sourceRoot":"","sources":["../../src/entry.ts"],"names":[],"mappings":";AAEA,0EAA0E;AAC1E,4EAA4E;AAC5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC1D,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;IAC1B,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;IACzC,OAAO,CAAC,QAAQ,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACtD,CAAC;KAAM,CAAC;IACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAC;IACrC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC"}
@@ -7,16 +7,24 @@ export type QueueMetrics = Readonly<{
7
7
  acknowledged: bigint;
8
8
  oldestSequence?: bigint;
9
9
  latestSequence?: bigint;
10
+ /** Stored size of the queued events, for a queue with a byte budget. */
11
+ bytes?: number;
12
+ /** The byte budget. A queue at its budget refuses new events. */
13
+ byteCapacity?: number;
10
14
  }>;
15
+ /** Whether a queue still has room by bytes for another collection pass. */
16
+ export declare function hasByteHeadroom(metrics: QueueMetrics): boolean;
11
17
  export type QueuedEvent<T> = Readonly<{
12
18
  value: T;
13
19
  sequence: bigint;
14
20
  coalesceKey?: string;
21
+ /** Stored size of the event, when the queue keeps a byte budget. */
22
+ bytes?: number;
15
23
  }>;
16
24
  export declare class BoundedEventQueue<T> {
17
25
  #private;
18
26
  constructor(capacity?: number);
19
- enqueue(value: T, sequence: bigint, coalesceKey?: string): void;
27
+ enqueue(value: T, sequence: bigint, coalesceKey?: string, bytes?: number): void;
20
28
  canEnqueue(coalesceKey?: string): boolean;
21
29
  acknowledge(throughSequence: bigint): void;
22
30
  discard(sequence: bigint): boolean;
@@ -25,6 +33,10 @@ export declare class BoundedEventQueue<T> {
25
33
  entries(): readonly QueuedEvent<T>[];
26
34
  replacePending(replace: (value: T) => T): void;
27
35
  protected replaceState(source: BoundedEventQueue<T>): void;
36
+ /** Stored size of the queued events. */
37
+ protected queuedBytes(): number;
38
+ /** Replace the stored sizes of the queued events, oldest first. */
39
+ protected reweigh(bytes: readonly number[]): void;
28
40
  latestSequence(): bigint | undefined;
29
41
  pendingAfter(sequence: bigint, limit?: number): readonly T[];
30
42
  metrics(): QueueMetrics;
@@ -1 +1 @@
1
- {"version":3,"file":"event-queue.d.ts","sourceRoot":"","sources":["../../src/event-queue.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,QAAQ,CAAC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC,CAAC;AAEH,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,QAAQ,CAAC;IACpC,KAAK,EAAE,CAAC,CAAC;IACT,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC,CAAC;AAEH,qBAAa,iBAAiB,CAAC,CAAC;;gBAOlB,QAAQ,SAAO;IAO3B,OAAO,CACL,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,MAAM,GACnB,IAAI;IA0BP,UAAU,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO;IAQzC,WAAW,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI;IAQ1C,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAUlC,qBAAqB,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI;IAUpD,OAAO,IAAI,SAAS,CAAC,EAAE;IAIvB,OAAO,IAAI,SAAS,WAAW,CAAC,CAAC,CAAC,EAAE;IAIpC,cAAc,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,IAAI;IAO9C,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,IAAI;IAU1D,cAAc,IAAI,MAAM,GAAG,SAAS;IAUpC,YAAY,CACV,QAAQ,EAAE,MAAM,EAChB,KAAK,SAAiB,GACrB,SAAS,CAAC,EAAE;IAUf,OAAO,IAAI,YAAY;CA4BxB"}
1
+ {"version":3,"file":"event-queue.d.ts","sourceRoot":"","sources":["../../src/event-queue.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,QAAQ,CAAC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC,CAAC;AAUH,2EAA2E;AAC3E,wBAAgB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAM9D;AAED,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,QAAQ,CAAC;IACpC,KAAK,EAAE,CAAC,CAAC;IACT,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC,CAAC;AAEH,qBAAa,iBAAiB,CAAC,CAAC;;gBAelB,QAAQ,SAAO;IAO3B,OAAO,CACL,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,MAAM,EACpB,KAAK,SAAI,GACR,IAAI;IAuCP,UAAU,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO;IASzC,WAAW,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI;IAM1C,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAWlC,qBAAqB,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI;IAQpD,OAAO,IAAI,SAAS,CAAC,EAAE;IAIvB,OAAO,IAAI,SAAS,WAAW,CAAC,CAAC,CAAC,EAAE;IAMpC,cAAc,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,IAAI;IAQ9C,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,IAAI;IAc1D,wCAAwC;IACxC,SAAS,CAAC,WAAW,IAAI,MAAM;IAI/B,mEAAmE;IACnE,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI;IAiBjD,cAAc,IAAI,MAAM,GAAG,SAAS;IAIpC,YAAY,CACV,QAAQ,EAAE,MAAM,EAChB,KAAK,SAAiB,GACrB,SAAS,CAAC,EAAE;IAUf,OAAO,IAAI,YAAY;CA2DxB"}