@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,586 @@
1
+ import { createHash } from "node:crypto";
2
+ import { readFile, readdir, realpath, stat } from "node:fs/promises";
3
+ import { join, relative, resolve, sep } from "node:path";
4
+ const maxDocumentBytes = 32 << 20;
5
+ const maxLiveDocuments = 256;
6
+ const maxTrackedDocuments = 1_024;
7
+ const maxDirectoryDepth = 6;
8
+ // A cursor packs the delivered message count (17 bits) and a 36-bit
9
+ // fingerprint of the last delivered message into one safe integer.
10
+ const maxMessagesPerDocument = (1 << 17) - 1;
11
+ const fingerprintSpace = 2 ** 36;
12
+ // A document unchanged for this long is settled: its final message is
13
+ // complete even without a completion marker (the agent stopped or crashed).
14
+ const settleMilliseconds = 10 * 60_000;
15
+ /**
16
+ * Whether a file was created after `time`. It must also have been modified
17
+ * after it; where the file system records creation times, an older file
18
+ * that was only written to does not count, so it is not uploaded again.
19
+ */
20
+ export function startedAfter(metadata, time) {
21
+ return metadata.mtimeMs > time &&
22
+ (metadata.birthtimeMs <= 0 || metadata.birthtimeMs > time);
23
+ }
24
+ /**
25
+ * Reads agents that keep each conversation as one JSON document rewritten
26
+ * in place (for example `{ messages: [...] }`). A document's cursor holds
27
+ * the number of messages already delivered and a fingerprint of the last
28
+ * one, so new messages are emitted once although the whole file is
29
+ * rewritten. A document whose delivered prefix changed (compaction or a
30
+ * rewind) resumes after the remembered message, or is re-baselined when
31
+ * that message is gone. Unchanged documents are not parsed again.
32
+ */
33
+ export async function scanJSONDocumentSource(source, options) {
34
+ const pattern = new RegExp(source.pathPattern, "u");
35
+ const directoryPattern = source.directoryPattern === undefined
36
+ ? undefined
37
+ : new RegExp(source.directoryPattern, "u");
38
+ const files = [];
39
+ for (const root of source.roots) {
40
+ files.push(...await listDocuments(root, pattern, directoryPattern, options.listings, options.historical));
41
+ }
42
+ files.sort((left, right) => right.modifiedMs - left.modifiedMs || left.path.localeCompare(right.path));
43
+ // The first live scan baselines every tracked document so an old
44
+ // conversation that is resumed later continues from its last message.
45
+ const selected = files.slice(0, options.historical || options.initialScan
46
+ ? maxTrackedDocuments
47
+ : maxLiveDocuments);
48
+ const replayPaths = new Set(options.initialScan && options.replayOnFirstStart && !options.historical
49
+ ? selected.slice(0, options.replaySessions).map((file) => file.path)
50
+ : []);
51
+ const records = [];
52
+ let malformed = 0;
53
+ let oversized = 0;
54
+ let complete = true;
55
+ let remaining = options.maxRecords;
56
+ for (const file of selected) {
57
+ const cursorKey = digest(`json-document-cursor\u0000${file.path}`);
58
+ const versionKey = digest(`json-document-version\u0000${file.path}`);
59
+ const pendingKey = digest(`json-document-pending\u0000${file.path}`);
60
+ const cursor = options.cursors.get(cursorKey);
61
+ const version = documentVersion(file);
62
+ const settled = Date.now() - file.modifiedMs >= settleMilliseconds;
63
+ if (cursor !== undefined &&
64
+ options.cursors.get(versionKey) === version &&
65
+ !(settled && options.cursors.has(pendingKey))) {
66
+ continue;
67
+ }
68
+ if (file.size > maxDocumentBytes) {
69
+ options.cursors.set(versionKey, version);
70
+ oversized++;
71
+ continue;
72
+ }
73
+ // A conversation that began while the observer was stopped is new work.
74
+ const startedWhileStopped = cursor === undefined &&
75
+ options.initialScan &&
76
+ !options.historical &&
77
+ options.newSince !== undefined &&
78
+ file.modifiedMs > options.newSince &&
79
+ await stat(file.path).then((metadata) => startedAfter(metadata, options.newSince ?? 0), () => false);
80
+ const baselineOnly = cursor === undefined &&
81
+ options.initialScan &&
82
+ !options.historical &&
83
+ !replayPaths.has(file.path) &&
84
+ !startedWhileStopped;
85
+ if (remaining <= 0 && !baselineOnly) {
86
+ complete = false;
87
+ continue;
88
+ }
89
+ let messages;
90
+ let identity = file.path;
91
+ try {
92
+ const rootReal = await realpath(file.root);
93
+ const pathReal = await realpath(file.path);
94
+ if (!isWithin(rootReal, pathReal))
95
+ continue;
96
+ const document = readMessages(await readFile(pathReal, "utf8"), source);
97
+ if (document === undefined) {
98
+ options.cursors.set(versionKey, version);
99
+ malformed++;
100
+ continue;
101
+ }
102
+ messages = document.messages.slice(0, maxMessagesPerDocument);
103
+ if (document.sessionId !== undefined) {
104
+ identity = `session\u0000${source.adapterId}\u0000${document.sessionId}`;
105
+ }
106
+ }
107
+ catch (error) {
108
+ if (isTransientError(error))
109
+ continue;
110
+ // The agent rewrites the document in place, so a read can observe a
111
+ // partial write. Its next modification is read again.
112
+ if (error instanceof SyntaxError)
113
+ continue;
114
+ throw error;
115
+ }
116
+ const idField = source.messageIdField;
117
+ // A final message that is still being written is held back and is
118
+ // delivered once it is finished.
119
+ const available = settled
120
+ ? messages.length
121
+ : finishedMessageCount(messages, source.completeFields, source.pendingField);
122
+ let start;
123
+ if (cursor === undefined) {
124
+ if (options.historical || startedWhileStopped)
125
+ start = 0;
126
+ else if (replayPaths.has(file.path)) {
127
+ start = Math.max(0, available - options.maxReplayRecords);
128
+ }
129
+ else if (options.initialScan)
130
+ start = available;
131
+ else
132
+ start = 0;
133
+ }
134
+ else {
135
+ start = resumeIndex(messages, cursor, idField);
136
+ }
137
+ const end = Math.max(start, Math.min(available, start + Math.max(0, remaining)));
138
+ const sourceID = `ses_${digest(identity).slice(0, 32)}`;
139
+ for (let index = start; index < end; index++) {
140
+ records.push({
141
+ adapterId: source.adapterId,
142
+ sourceId: sourceID,
143
+ sourceRecordId: digest(`${identity}\u0000${messageKey(messages[index], index, idField)}`),
144
+ // The document is rewritten as the conversation grows, so its
145
+ // modification time is the newest message's time. Each record keeps
146
+ // its own message time so the raw source record and the events
147
+ // normalized from it carry the same timestamp.
148
+ observedAt: messageTime(messages[index]) ??
149
+ new Date(file.modifiedMs),
150
+ initialReplay: options.historical || replayPaths.has(file.path),
151
+ value: index === 0 && source.firstMessageField !== undefined && isRecord(messages[0])
152
+ ? { ...messages[0], [source.firstMessageField]: true }
153
+ : messages[index],
154
+ });
155
+ }
156
+ remaining -= end - start;
157
+ options.cursors.set(cursorKey, packCursor(messages, end, idField));
158
+ if (end < available) {
159
+ complete = false;
160
+ options.cursors.delete(versionKey);
161
+ }
162
+ else {
163
+ // A held-back unfinished message is read again when the file changes
164
+ // or once the document has settled.
165
+ options.cursors.set(versionKey, version);
166
+ }
167
+ if (available < messages.length)
168
+ options.cursors.set(pendingKey, 1);
169
+ else
170
+ options.cursors.delete(pendingKey);
171
+ }
172
+ return { records, files: selected.length, malformed, oversized, complete };
173
+ }
174
+ export function packCursor(messages, count, idField) {
175
+ return count === 0
176
+ ? 0
177
+ : count * fingerprintSpace +
178
+ fingerprint(messages[count - 1], count - 1, idField);
179
+ }
180
+ /**
181
+ * Index of the first undelivered message. The delivered prefix must still
182
+ * end with the remembered message; if it moved, resume after it; if it is
183
+ * gone the document was rewritten and everything present is treated as
184
+ * already delivered.
185
+ */
186
+ export function resumeIndex(messages, cursor, idField) {
187
+ const count = Math.floor(cursor / fingerprintSpace);
188
+ const last = cursor % fingerprintSpace;
189
+ if (count === 0)
190
+ return 0;
191
+ if (count <= messages.length &&
192
+ fingerprint(messages[count - 1], count - 1, idField) === last) {
193
+ return count;
194
+ }
195
+ for (let index = messages.length - 1; index >= 0; index--) {
196
+ if (fingerprint(messages[index], index, idField) === last)
197
+ return index + 1;
198
+ }
199
+ return messages.length;
200
+ }
201
+ // 2001-09-09 .. 2286-11-20 in epoch milliseconds. Smaller numbers are
202
+ // seconds or counters, not message times.
203
+ const minimumEpochMilliseconds = 1e12;
204
+ const maximumEpochMilliseconds = 1e13;
205
+ /**
206
+ * A message's own time: an epoch-milliseconds `ts` or `timestamp` number
207
+ * (Cline, VS Code chat) or an ISO `timestamp` string.
208
+ */
209
+ function messageTime(message) {
210
+ if (typeof message !== "object" || message === null)
211
+ return undefined;
212
+ const object = message;
213
+ for (const field of ["ts", "timestamp"]) {
214
+ const value = object[field];
215
+ let time;
216
+ if (typeof value === "number" &&
217
+ value >= minimumEpochMilliseconds &&
218
+ value < maximumEpochMilliseconds) {
219
+ time = value;
220
+ }
221
+ else if (typeof value === "string" && value.length <= 64) {
222
+ const parsed = Date.parse(value);
223
+ if (Number.isFinite(parsed))
224
+ time = parsed;
225
+ }
226
+ if (time !== undefined)
227
+ return new Date(time);
228
+ }
229
+ return undefined;
230
+ }
231
+ /**
232
+ * The document's messages, or undefined when the document does not hold a
233
+ * message list. A JSON document that is still being written throws a
234
+ * SyntaxError and is read again after its next change.
235
+ */
236
+ function readMessages(text, source) {
237
+ if (source.documentFormat === "jsonl")
238
+ return { messages: jsonLines(text) };
239
+ const document = source.documentFormat === "mutation-log"
240
+ ? replayMutationLog(text)
241
+ : JSON.parse(text);
242
+ if (source.messagesField === "") {
243
+ return Array.isArray(document) ? { messages: document } : undefined;
244
+ }
245
+ if (!isRecord(document))
246
+ return undefined;
247
+ const messages = document[source.messagesField];
248
+ if (!Array.isArray(messages))
249
+ return undefined;
250
+ const sessionId = source.sessionIdField === undefined
251
+ ? undefined
252
+ : document[source.sessionIdField];
253
+ return typeof sessionId === "string" &&
254
+ sessionId !== "" &&
255
+ sessionId.length <= 128 &&
256
+ !/[\u0000-\u001f\u007f]/u.test(sessionId)
257
+ ? { messages, sessionId }
258
+ : { messages };
259
+ }
260
+ /**
261
+ * One value per line. A final line without its newline is included once it
262
+ * parses: some agents write the separator before each record, not after.
263
+ */
264
+ function jsonLines(text) {
265
+ const lines = text.split("\n");
266
+ const values = [];
267
+ for (const [index, line] of lines.entries()) {
268
+ if (line.trim() === "")
269
+ continue;
270
+ try {
271
+ values.push(JSON.parse(line));
272
+ }
273
+ catch {
274
+ // The final line may still be being written. An earlier damaged line
275
+ // is skipped so it cannot block the rest of the conversation.
276
+ if (index === lines.length - 1)
277
+ break;
278
+ }
279
+ }
280
+ return values;
281
+ }
282
+ const forbiddenPathKeys = new Set(["__proto__", "constructor", "prototype"]);
283
+ /**
284
+ * Rebuilds a VS Code chat session from its operation log: kind 0 is the
285
+ * initial state, 1 sets the value at path `k`, 2 appends `v` to the array
286
+ * at `k` after truncating it to `i`, and 3 deletes the value at `k`. A final
287
+ * line that is still being written ends the replay. Returns undefined for a
288
+ * log that cannot be replayed.
289
+ */
290
+ function replayMutationLog(text) {
291
+ const lines = text.split("\n");
292
+ let state;
293
+ for (const [index, line] of lines.entries()) {
294
+ if (line.trim() === "")
295
+ continue;
296
+ let entry;
297
+ try {
298
+ entry = JSON.parse(line);
299
+ }
300
+ catch {
301
+ if (index === lines.length - 1)
302
+ break;
303
+ return undefined;
304
+ }
305
+ if (!isRecord(entry))
306
+ return undefined;
307
+ if (entry["kind"] === 0) {
308
+ state = entry["v"];
309
+ continue;
310
+ }
311
+ const path = entry["k"];
312
+ if (state === undefined ||
313
+ !Array.isArray(path) ||
314
+ path.length === 0 ||
315
+ path.length > 64 ||
316
+ !path.every((key) => (typeof key === "string" && !forbiddenPathKeys.has(key)) ||
317
+ (typeof key === "number" && Number.isSafeInteger(key) && key >= 0))) {
318
+ return undefined;
319
+ }
320
+ const keys = path;
321
+ const parent = containerAt(state, keys.slice(0, -1));
322
+ const last = keys[keys.length - 1];
323
+ if (parent === undefined || last === undefined)
324
+ return undefined;
325
+ if (entry["kind"] === 1) {
326
+ parent[last] = entry["v"];
327
+ }
328
+ else if (entry["kind"] === 3) {
329
+ delete parent[last];
330
+ }
331
+ else if (entry["kind"] === 2) {
332
+ const current = parent[last] ?? [];
333
+ const values = entry["v"] ?? [];
334
+ const truncate = entry["i"];
335
+ if (!Array.isArray(current) || !Array.isArray(values))
336
+ return undefined;
337
+ if (truncate !== undefined) {
338
+ if (typeof truncate !== "number" ||
339
+ !Number.isSafeInteger(truncate) ||
340
+ truncate < 0) {
341
+ return undefined;
342
+ }
343
+ if (truncate < current.length)
344
+ current.length = truncate;
345
+ }
346
+ for (const value of values)
347
+ current.push(value);
348
+ parent[last] = current;
349
+ }
350
+ else {
351
+ return undefined;
352
+ }
353
+ }
354
+ return state;
355
+ }
356
+ function containerAt(value, path) {
357
+ let current = value;
358
+ for (const key of path) {
359
+ if (typeof current !== "object" || current === null)
360
+ return undefined;
361
+ current = current[key];
362
+ }
363
+ return typeof current === "object" && current !== null
364
+ ? current
365
+ : undefined;
366
+ }
367
+ function finishedMessageCount(messages, completeFields, pendingField) {
368
+ if (pendingField !== undefined &&
369
+ messages.length > 0 &&
370
+ fieldAt(messages.at(-1), pendingField) === true) {
371
+ return messages.length - 1;
372
+ }
373
+ if (completeFields === undefined || completeFields.length === 0) {
374
+ return messages.length;
375
+ }
376
+ const last = messages.at(-1);
377
+ const finished = last === undefined || completeFields.some((field) => {
378
+ const value = fieldAt(last, field);
379
+ return value !== undefined && value !== null && value !== false;
380
+ });
381
+ return finished ? messages.length : messages.length - 1;
382
+ }
383
+ function fieldAt(value, path) {
384
+ let current = value;
385
+ for (const key of path.split(".")) {
386
+ if (!isRecord(current))
387
+ return undefined;
388
+ current = current[key];
389
+ }
390
+ return current;
391
+ }
392
+ function isRecord(value) {
393
+ return typeof value === "object" && value !== null && !Array.isArray(value);
394
+ }
395
+ function messageKey(message, index, idField = "id") {
396
+ const id = fieldAt(message, idField);
397
+ if (typeof id === "number" && Number.isSafeInteger(id))
398
+ return `id:${id}`;
399
+ return typeof id === "string" && id !== "" && id.length <= 256
400
+ ? `id:${id}`
401
+ : `index:${index}`;
402
+ }
403
+ function fingerprint(message, index, idField) {
404
+ const key = messageKey(message, index, idField);
405
+ return Number.parseInt(digest(key.startsWith("id:") ? key : `${key}:${safeJSON(message)}`)
406
+ .slice(0, 9), 16);
407
+ }
408
+ function documentVersion(file) {
409
+ return Number.parseInt(digest(`${file.size}:${file.modifiedMs}`).slice(0, 13), 16);
410
+ }
411
+ function safeJSON(value) {
412
+ try {
413
+ return JSON.stringify(value) ?? "";
414
+ }
415
+ catch {
416
+ return "";
417
+ }
418
+ }
419
+ const nodeListingFileSystem = {
420
+ readdir: async (directory) => (await readdir(directory, { withFileTypes: true }))
421
+ .map((entry) => ({ name: entry.name, directory: entry.isDirectory(), file: entry.isFile() })),
422
+ modifiedMs: async (directory) => (await stat(directory)).mtimeMs,
423
+ metadata: async (file) => {
424
+ const metadata = await stat(file);
425
+ return { modifiedMs: metadata.mtimeMs, size: metadata.size };
426
+ },
427
+ now: () => Date.now(),
428
+ };
429
+ /**
430
+ * Folder listings reused across scans. Adding, removing or renaming an entry
431
+ * changes its folder's modified time, so a folder is listed again only when
432
+ * that time moved. Checking a folder costs about half of listing it, and
433
+ * most folders under an agent's session store never change. A folder that
434
+ * changed within the last two seconds is listed again on the next scan,
435
+ * because coarse file-system clocks can hide a second change in the same
436
+ * tick, and every folder is listed afresh at least every 30 seconds.
437
+ *
438
+ * Folders and documents untouched for ten minutes are cold: they are checked
439
+ * every ten seconds instead of on every scan, so a conversation resumed in a
440
+ * quiet project is noticed within ten seconds while active ones stay live.
441
+ */
442
+ export class DirectoryListingCache {
443
+ static relistAfterMs = 30_000;
444
+ static settleMs = 2_000;
445
+ static coldAfterMs = 10 * 60_000;
446
+ static coldCheckMs = 10_000;
447
+ static maxFolders = 8_192;
448
+ #listings = new Map();
449
+ #files = new Map();
450
+ #fs;
451
+ constructor(fileSystem = nodeListingFileSystem) {
452
+ this.#fs = fileSystem;
453
+ }
454
+ /**
455
+ * The folder's entries. `trustMs` skips even the folder check while the
456
+ * listing is younger than that; history imports use it, since live
457
+ * collection already follows new conversations.
458
+ */
459
+ async list(directory, trustMs = 0) {
460
+ const now = this.#fs.now();
461
+ const cached = this.#listings.get(directory);
462
+ const age = cached === undefined ? Number.POSITIVE_INFINITY : now - cached.listedAt;
463
+ if (cached !== undefined && age < DirectoryListingCache.relistAfterMs) {
464
+ if (age < trustMs)
465
+ return cached.entries;
466
+ if (cached.settled && now - cached.modifiedMs >= DirectoryListingCache.coldAfterMs &&
467
+ now - cached.checkedAt < DirectoryListingCache.coldCheckMs)
468
+ return cached.entries;
469
+ }
470
+ let modifiedMs;
471
+ try {
472
+ modifiedMs = await this.#fs.modifiedMs(directory);
473
+ }
474
+ catch (error) {
475
+ this.#listings.delete(directory);
476
+ throw error;
477
+ }
478
+ if (cached !== undefined && cached.settled && cached.modifiedMs === modifiedMs &&
479
+ age < DirectoryListingCache.relistAfterMs) {
480
+ this.#listings.set(directory, { ...cached, checkedAt: now });
481
+ return cached.entries;
482
+ }
483
+ // Checked before listing: an entry added while listing moves the time on.
484
+ const entries = await this.#fs.readdir(directory);
485
+ this.#listings.delete(directory);
486
+ this.#listings.set(directory, {
487
+ entries,
488
+ modifiedMs,
489
+ listedAt: now,
490
+ checkedAt: now,
491
+ settled: now - modifiedMs >= DirectoryListingCache.settleMs,
492
+ });
493
+ evictOldest(this.#listings);
494
+ return entries;
495
+ }
496
+ /** A document's time and size; a cold document is checked every ten seconds. */
497
+ async metadata(file) {
498
+ const now = this.#fs.now();
499
+ const cached = this.#files.get(file);
500
+ if (cached !== undefined && now - cached.modifiedMs >= DirectoryListingCache.coldAfterMs &&
501
+ now - cached.checkedAt < DirectoryListingCache.coldCheckMs)
502
+ return cached;
503
+ let metadata;
504
+ try {
505
+ metadata = await this.#fs.metadata(file);
506
+ }
507
+ catch (error) {
508
+ this.#files.delete(file);
509
+ throw error;
510
+ }
511
+ this.#files.delete(file);
512
+ this.#files.set(file, { ...metadata, checkedAt: now });
513
+ evictOldest(this.#files);
514
+ return metadata;
515
+ }
516
+ }
517
+ function evictOldest(map) {
518
+ if (map.size <= DirectoryListingCache.maxFolders)
519
+ return;
520
+ const oldest = map.keys().next().value;
521
+ if (oldest !== undefined)
522
+ map.delete(oldest);
523
+ }
524
+ const historyListingTrustMs = DirectoryListingCache.relistAfterMs;
525
+ async function listDocuments(root, pattern, directoryPattern, listings, historical) {
526
+ const result = [];
527
+ // `inRoot` is the folder's `/`-separated path below root, built as the walk
528
+ // descends instead of with path.relative for every entry on every scan.
529
+ const walk = async (directory, inRoot, depth) => {
530
+ if (depth > maxDirectoryDepth)
531
+ return;
532
+ let entries;
533
+ try {
534
+ entries = listings === undefined
535
+ ? await nodeListingFileSystem.readdir(directory)
536
+ : await listings.list(directory, historical ? historyListingTrustMs : 0);
537
+ }
538
+ catch (error) {
539
+ if (isTransientError(error))
540
+ return;
541
+ throw error;
542
+ }
543
+ for (const entry of entries) {
544
+ const relativePath = inRoot === "" ? entry.name : `${inRoot}/${entry.name}`;
545
+ if (entry.directory) {
546
+ if (directoryPattern === undefined || directoryPattern.test(relativePath)) {
547
+ await walk(join(directory, entry.name), relativePath, depth + 1);
548
+ }
549
+ continue;
550
+ }
551
+ if (!entry.file || !pattern.test(relativePath))
552
+ continue;
553
+ const path = join(directory, entry.name);
554
+ try {
555
+ const metadata = listings === undefined
556
+ ? await nodeListingFileSystem.metadata(path)
557
+ : await listings.metadata(path);
558
+ result.push({
559
+ root,
560
+ path,
561
+ modifiedMs: metadata.modifiedMs,
562
+ size: metadata.size,
563
+ });
564
+ }
565
+ catch (error) {
566
+ if (!isTransientError(error))
567
+ throw error;
568
+ }
569
+ }
570
+ };
571
+ await walk(root, "", 0);
572
+ return result;
573
+ }
574
+ function isWithin(root, candidate) {
575
+ const path = relative(resolve(root), resolve(candidate));
576
+ return path === "" || (!path.startsWith(`..${sep}`) && path !== "..");
577
+ }
578
+ function digest(value) {
579
+ return createHash("sha256").update(value).digest("hex");
580
+ }
581
+ function isTransientError(error) {
582
+ return error instanceof Error &&
583
+ "code" in error &&
584
+ ["ENOENT", "EACCES", "EPERM", "ENOTDIR", "EBUSY", "ESTALE"].includes(String(error.code));
585
+ }
586
+ //# sourceMappingURL=json-document-source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-document-source.js","sourceRoot":"","sources":["../../../src/activity/json-document-source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAGzD,MAAM,gBAAgB,GAAG,EAAE,IAAI,EAAE,CAAC;AAClC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,mBAAmB,GAAG,KAAK,CAAC;AAClC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAC5B,oEAAoE;AACpE,mEAAmE;AACnE,MAAM,sBAAsB,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC;AAC7C,MAAM,gBAAgB,GAAG,CAAC,IAAI,EAAE,CAAC;AACjC,sEAAsE;AACtE,4EAA4E;AAC5E,MAAM,kBAAkB,GAAG,EAAE,GAAG,MAAM,CAAC;AAyEvC;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAC1B,QAA4D,EAC5D,IAAY;IAEZ,OAAO,QAAQ,CAAC,OAAO,GAAG,IAAI;QAC5B,CAAC,QAAQ,CAAC,WAAW,IAAI,CAAC,IAAI,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;AAC/D,CAAC;AASD;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,MAA0B,EAC1B,OAAoB;IAQpB,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IACpD,MAAM,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,KAAK,SAAS;QAC5D,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAmB,EAAE,CAAC;IACjC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,gBAAgB,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;IAC5G,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACzB,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAC1E,CAAC;IACF,iEAAiE;IACjE,sEAAsE;IACtE,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAC1B,CAAC,EACD,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,WAAW;QACvC,CAAC,CAAC,mBAAmB;QACrB,CAAC,CAAC,gBAAgB,CACrB,CAAC;IACF,MAAM,WAAW,GAAG,IAAI,GAAG,CACzB,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,kBAAkB,IAAI,CAAC,OAAO,CAAC,UAAU;QACtE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;QACpE,CAAC,CAAC,EAAE,CACP,CAAC;IACF,MAAM,OAAO,GAAmB,EAAE,CAAC;IACnC,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,QAAQ,GAAG,IAAI,CAAC;IACpB,IAAI,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC;IACnC,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,MAAM,CAAC,6BAA6B,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACnE,MAAM,UAAU,GAAG,MAAM,CAAC,8BAA8B,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACrE,MAAM,UAAU,GAAG,MAAM,CAAC,8BAA8B,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACrE,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,IAAI,kBAAkB,CAAC;QACnE,IACE,MAAM,KAAK,SAAS;YACpB,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,OAAO;YAC3C,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,EAC7C,CAAC;YACD,SAAS;QACX,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,GAAG,gBAAgB,EAAE,CAAC;YACjC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACzC,SAAS,EAAE,CAAC;YACZ,SAAS;QACX,CAAC;QACD,wEAAwE;QACxE,MAAM,mBAAmB,GACvB,MAAM,KAAK,SAAS;YACpB,OAAO,CAAC,WAAW;YACnB,CAAC,OAAO,CAAC,UAAU;YACnB,OAAO,CAAC,QAAQ,KAAK,SAAS;YAC9B,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,QAAQ;YAClC,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CACxB,CAAC,QAAQ,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC,EAC3D,GAAG,EAAE,CAAC,KAAK,CACZ,CAAC;QACJ,MAAM,YAAY,GAChB,MAAM,KAAK,SAAS;YACpB,OAAO,CAAC,WAAW;YACnB,CAAC,OAAO,CAAC,UAAU;YACnB,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;YAC3B,CAAC,mBAAmB,CAAC;QACvB,IAAI,SAAS,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACpC,QAAQ,GAAG,KAAK,CAAC;YACjB,SAAS;QACX,CAAC;QACD,IAAI,QAA4B,CAAC;QACjC,IAAI,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3C,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3C,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;gBAAE,SAAS;YAC5C,MAAM,QAAQ,GAAG,YAAY,CAC3B,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,EAChC,MAAM,CACP,CAAC;YACF,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBACzC,SAAS,EAAE,CAAC;gBACZ,SAAS;YACX,CAAC;YACD,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,sBAAsB,CAAC,CAAC;YAC9D,IAAI,QAAQ,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;gBACrC,QAAQ,GAAG,gBAAgB,MAAM,CAAC,SAAS,SAAS,QAAQ,CAAC,SAAS,EAAE,CAAC;YAC3E,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,gBAAgB,CAAC,KAAK,CAAC;gBAAE,SAAS;YACtC,oEAAoE;YACpE,sDAAsD;YACtD,IAAI,KAAK,YAAY,WAAW;gBAAE,SAAS;YAC3C,MAAM,KAAK,CAAC;QACd,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,CAAC,cAAc,CAAC;QACtC,kEAAkE;QAClE,iCAAiC;QACjC,MAAM,SAAS,GAAG,OAAO;YACvB,CAAC,CAAC,QAAQ,CAAC,MAAM;YACjB,CAAC,CAAC,oBAAoB,CAAC,QAAQ,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;QAC/E,IAAI,KAAa,CAAC;QAClB,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,IAAI,OAAO,CAAC,UAAU,IAAI,mBAAmB;gBAAE,KAAK,GAAG,CAAC,CAAC;iBACpD,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACpC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAC5D,CAAC;iBAAM,IAAI,OAAO,CAAC,WAAW;gBAAE,KAAK,GAAG,SAAS,CAAC;;gBAC7C,KAAK,GAAG,CAAC,CAAC;QACjB,CAAC;aAAM,CAAC;YACN,KAAK,GAAG,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QACjD,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAClB,KAAK,EACL,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CACpD,CAAC;QACF,MAAM,QAAQ,GAAG,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QACxD,KAAK,IAAI,KAAK,GAAG,KAAK,EAAE,KAAK,GAAG,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC;YAC7C,OAAO,CAAC,IAAI,CAAC;gBACX,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,QAAQ,EAAE,QAAQ;gBAClB,cAAc,EAAE,MAAM,CACpB,GAAG,QAAQ,SAAS,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,CAClE;gBACD,8DAA8D;gBAC9D,oEAAoE;gBACpE,+DAA+D;gBAC/D,+CAA+C;gBAC/C,UAAU,EAAE,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;oBACtC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;gBAC3B,aAAa,EAAE,OAAO,CAAC,UAAU,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC/D,KAAK,EAAE,KAAK,KAAK,CAAC,IAAI,MAAM,CAAC,iBAAiB,KAAK,SAAS,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;oBACnF,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE;oBACtD,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;aACpB,CAAC,CAAC;QACL,CAAC;QACD,SAAS,IAAI,GAAG,GAAG,KAAK,CAAC;QACzB,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;QACnE,IAAI,GAAG,GAAG,SAAS,EAAE,CAAC;YACpB,QAAQ,GAAG,KAAK,CAAC;YACjB,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACrC,CAAC;aAAM,CAAC;YACN,qEAAqE;YACrE,oCAAoC;YACpC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC3C,CAAC;QACD,IAAI,SAAS,GAAG,QAAQ,CAAC,MAAM;YAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;;YAC/D,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,UAAU,CACxB,QAA4B,EAC5B,KAAa,EACb,OAA2B;IAE3B,OAAO,KAAK,KAAK,CAAC;QAChB,CAAC,CAAC,CAAC;QACH,CAAC,CAAC,KAAK,GAAG,gBAAgB;YACxB,WAAW,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;AAC3D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CACzB,QAA4B,EAC5B,MAAc,EACd,OAA2B;IAE3B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,gBAAgB,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,MAAM,GAAG,gBAAgB,CAAC;IACvC,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAC1B,IACE,KAAK,IAAI,QAAQ,CAAC,MAAM;QACxB,WAAW,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,OAAO,CAAC,KAAK,IAAI,EAC7D,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,KAAK,IAAI,KAAK,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QAC1D,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI;YAAE,OAAO,KAAK,GAAG,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,QAAQ,CAAC,MAAM,CAAC;AACzB,CAAC;AAED,sEAAsE;AACtE,0CAA0C;AAC1C,MAAM,wBAAwB,GAAG,IAAI,CAAC;AACtC,MAAM,wBAAwB,GAAG,IAAI,CAAC;AAEtC;;;GAGG;AACH,SAAS,WAAW,CAAC,OAAgB;IACnC,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IACtE,MAAM,MAAM,GAAG,OAAkC,CAAC;IAClD,KAAK,MAAM,KAAK,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,IAAwB,CAAC;QAC7B,IACE,OAAO,KAAK,KAAK,QAAQ;YACzB,KAAK,IAAI,wBAAwB;YACjC,KAAK,GAAG,wBAAwB,EAChC,CAAC;YACD,IAAI,GAAG,KAAK,CAAC;QACf,CAAC;aAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;YAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACjC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE,IAAI,GAAG,MAAM,CAAC;QAC7C,CAAC;QACD,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;GAIG;AACH,SAAS,YAAY,CACnB,IAAY,EACZ,MAA0B;IAE1B,IAAI,MAAM,CAAC,cAAc,KAAK,OAAO;QAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;IAC5E,MAAM,QAAQ,GAAG,MAAM,CAAC,cAAc,KAAK,cAAc;QACvD,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC;QACzB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC;IAChC,IAAI,MAAM,CAAC,aAAa,KAAK,EAAE,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACtE,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,SAAS,CAAC;IAC1C,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAChD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/C,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,KAAK,SAAS;QACnD,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IACpC,OAAO,OAAO,SAAS,KAAK,QAAQ;QAChC,SAAS,KAAK,EAAE;QAChB,SAAS,CAAC,MAAM,IAAI,GAAG;QACvB,CAAC,wBAAwB,CAAC,IAAI,CAAC,SAAS,CAAC;QAC3C,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE;QACzB,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,SAAS,SAAS,CAAC,IAAY;IAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAc,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;QAC5C,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,SAAS;QACjC,IAAI,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,qEAAqE;YACrE,8DAA8D;YAC9D,IAAI,KAAK,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,MAAM;QACxC,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC;AAE7E;;;;;;GAMG;AACH,SAAS,iBAAiB,CAAC,IAAY;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,KAAc,CAAC;IACnB,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;QAC5C,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,SAAS;QACjC,IAAI,KAAc,CAAC;QACnB,IAAI,CAAC;YACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,KAAK,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,MAAM;YACtC,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QACvC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;YACnB,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QACxB,IACE,KAAK,KAAK,SAAS;YACnB,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;YACpB,IAAI,CAAC,MAAM,KAAK,CAAC;YACjB,IAAI,CAAC,MAAM,GAAG,EAAE;YAChB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAClB,CAAC,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACxD,CAAC,OAAO,GAAG,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CACnE,EACD,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,IAAI,GAAG,IAAoC,CAAC;QAClD,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACrD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACnC,IAAI,MAAM,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QACjE,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QAC5B,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YAChC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;gBAAE,OAAO,SAAS,CAAC;YACxE,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,IACE,OAAO,QAAQ,KAAK,QAAQ;oBAC5B,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC;oBAC/B,QAAQ,GAAG,CAAC,EACZ,CAAC;oBACD,OAAO,SAAS,CAAC;gBACnB,CAAC;gBACD,IAAI,QAAQ,GAAG,OAAO,CAAC,MAAM;oBAAE,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC;YAC3D,CAAC;YACD,KAAK,MAAM,KAAK,IAAI,MAAM;gBAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAChD,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,WAAW,CAClB,KAAc,EACd,IAAkC;IAElC,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI;YAAE,OAAO,SAAS,CAAC;QACtE,OAAO,GAAI,OAA4C,CAAC,GAAG,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI;QACpD,CAAC,CAAC,OAA2C;QAC7C,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,SAAS,oBAAoB,CAC3B,QAA4B,EAC5B,cAA6C,EAC7C,YAAqB;IAErB,IACE,YAAY,KAAK,SAAS;QAC1B,QAAQ,CAAC,MAAM,GAAG,CAAC;QACnB,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,KAAK,IAAI,EAC/C,CAAC;QACD,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IAC7B,CAAC;IACD,IAAI,cAAc,KAAK,SAAS,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChE,OAAO,QAAQ,CAAC,MAAM,CAAC;IACzB,CAAC;IACD,MAAM,IAAI,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7B,MAAM,QAAQ,GAAG,IAAI,KAAK,SAAS,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;QACnE,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACnC,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,CAAC;IAClE,CAAC,CAAC,CAAC;IACH,OAAO,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,OAAO,CAAC,KAAc,EAAE,IAAY;IAC3C,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,OAAO,SAAS,CAAC;QACzC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,UAAU,CACjB,OAAgB,EAChB,KAAa,EACb,OAAO,GAAG,IAAI;IAEd,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACrC,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;QAAE,OAAO,MAAM,EAAE,EAAE,CAAC;IAC1E,OAAO,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,MAAM,IAAI,GAAG;QAC5D,CAAC,CAAC,MAAM,EAAE,EAAE;QACZ,CAAC,CAAC,SAAS,KAAK,EAAE,CAAC;AACvB,CAAC;AAED,SAAS,WAAW,CAClB,OAAgB,EAChB,KAAa,EACb,OAA2B;IAE3B,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAChD,OAAO,MAAM,CAAC,QAAQ,CACpB,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;SAChE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EACd,EAAE,CACH,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,IAAkB;IACzC,OAAO,MAAM,CAAC,QAAQ,CACpB,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EACtD,EAAE,CACH,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAoBD,MAAM,qBAAqB,GAAsB;IAC/C,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC,MAAM,OAAO,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;SAC9E,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC/F,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO;IAChE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACvB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC/D,CAAC;IACD,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;CACtB,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,qBAAqB;IAChC,MAAM,CAAU,aAAa,GAAG,MAAM,CAAC;IACvC,MAAM,CAAU,QAAQ,GAAG,KAAK,CAAC;IACjC,MAAM,CAAU,WAAW,GAAG,EAAE,GAAG,MAAM,CAAC;IAC1C,MAAM,CAAU,WAAW,GAAG,MAAM,CAAC;IACrC,MAAM,CAAU,UAAU,GAAG,KAAK,CAAC;IAC1B,SAAS,GAAG,IAAI,GAAG,EAA4B,CAAC;IAChD,MAAM,GAAG,IAAI,GAAG,EAAwB,CAAC;IACzC,GAAG,CAAoB;IAEhC,YAAY,aAAgC,qBAAqB;QAC/D,IAAI,CAAC,GAAG,GAAG,UAAU,CAAC;IACxB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,IAAI,CAAC,SAAiB,EAAE,OAAO,GAAG,CAAC;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC7C,MAAM,GAAG,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC;QACpF,IAAI,MAAM,KAAK,SAAS,IAAI,GAAG,GAAG,qBAAqB,CAAC,aAAa,EAAE,CAAC;YACtE,IAAI,GAAG,GAAG,OAAO;gBAAE,OAAO,MAAM,CAAC,OAAO,CAAC;YACzC,IAAI,MAAM,CAAC,OAAO,IAAI,GAAG,GAAG,MAAM,CAAC,UAAU,IAAI,qBAAqB,CAAC,WAAW;gBAChF,GAAG,GAAG,MAAM,CAAC,SAAS,GAAG,qBAAqB,CAAC,WAAW;gBAAE,OAAO,MAAM,CAAC,OAAO,CAAC;QACtF,CAAC;QACD,IAAI,UAAkB,CAAC;QACvB,IAAI,CAAC;YACH,UAAU,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACjC,MAAM,KAAK,CAAC;QACd,CAAC;QACD,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,UAAU,KAAK,UAAU;YAC5E,GAAG,GAAG,qBAAqB,CAAC,aAAa,EAAE,CAAC;YAC5C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;YAC7D,OAAO,MAAM,CAAC,OAAO,CAAC;QACxB,CAAC;QACD,0EAA0E;QAC1E,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAClD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACjC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE;YAC5B,OAAO;YACP,UAAU;YACV,QAAQ,EAAE,GAAG;YACb,SAAS,EAAE,GAAG;YACd,OAAO,EAAE,GAAG,GAAG,UAAU,IAAI,qBAAqB,CAAC,QAAQ;SAC5D,CAAC,CAAC;QACH,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5B,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,gFAAgF;IAChF,KAAK,CAAC,QAAQ,CAAC,IAAY;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,MAAM,KAAK,SAAS,IAAI,GAAG,GAAG,MAAM,CAAC,UAAU,IAAI,qBAAqB,CAAC,WAAW;YACtF,GAAG,GAAG,MAAM,CAAC,SAAS,GAAG,qBAAqB,CAAC,WAAW;YAAE,OAAO,MAAM,CAAC;QAC5E,IAAI,QAAwD,CAAC;QAC7D,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACzB,MAAM,KAAK,CAAC;QACd,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACzB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,GAAG,QAAQ,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QACvD,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzB,OAAO,QAAQ,CAAC;IAClB,CAAC;;AAGH,SAAS,WAAW,CAAC,GAAyB;IAC5C,IAAI,GAAG,CAAC,IAAI,IAAI,qBAAqB,CAAC,UAAU;QAAE,OAAO;IACzD,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;IACvC,IAAI,MAAM,KAAK,SAAS;QAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,qBAAqB,GAAG,qBAAqB,CAAC,aAAa,CAAC;AAElE,KAAK,UAAU,aAAa,CAC1B,IAAY,EACZ,OAAe,EACf,gBAAoC,EACpC,QAA2C,EAC3C,UAAmB;IAEnB,MAAM,MAAM,GAAmB,EAAE,CAAC;IAClC,4EAA4E;IAC5E,wEAAwE;IACxE,MAAM,IAAI,GAAG,KAAK,EAAE,SAAiB,EAAE,MAAc,EAAE,KAAa,EAAiB,EAAE;QACrF,IAAI,KAAK,GAAG,iBAAiB;YAAE,OAAO;QACtC,IAAI,OAAkC,CAAC;QACvC,IAAI,CAAC;YACH,OAAO,GAAG,QAAQ,KAAK,SAAS;gBAC9B,CAAC,CAAC,MAAM,qBAAqB,CAAC,OAAO,CAAC,SAAS,CAAC;gBAChD,CAAC,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,gBAAgB,CAAC,KAAK,CAAC;gBAAE,OAAO;YACpC,MAAM,KAAK,CAAC;QACd,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,YAAY,GAAG,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YAC5E,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBACpB,IAAI,gBAAgB,KAAK,SAAS,IAAI,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;oBAC1E,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;gBACnE,CAAC;gBACD,SAAS;YACX,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC;gBAAE,SAAS;YACzD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACzC,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,QAAQ,KAAK,SAAS;oBACrC,CAAC,CAAC,MAAM,qBAAqB,CAAC,QAAQ,CAAC,IAAI,CAAC;oBAC5C,CAAC,CAAC,MAAM,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAClC,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI;oBACJ,IAAI;oBACJ,UAAU,EAAE,QAAQ,CAAC,UAAU;oBAC/B,IAAI,EAAE,QAAQ,CAAC,IAAI;iBACpB,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;oBAAE,MAAM,KAAK,CAAC;YAC5C,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IACF,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IACxB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY,EAAE,SAAiB;IAC/C,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IACzD,OAAO,IAAI,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,EAAE,CAAC,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,MAAM,CAAC,KAAa;IAC3B,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,OAAO,KAAK,YAAY,KAAK;QAC3B,MAAM,IAAI,KAAK;QACf,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAClE,MAAM,CAAE,KAA+B,CAAC,IAAI,CAAC,CAC9C,CAAC;AACN,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"native-capabilities.d.ts","sourceRoot":"","sources":["../../../src/activity/native-capabilities.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG,QAAQ,CAAC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC,CAAC;AAEH,MAAM,MAAM,sBAAsB,GAAG,QAAQ,CAAC;IAC5C,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,SAAS,gBAAgB,EAAE,CAAC;CAC3C,CAAC,CAAC;AAQH,KAAK,cAAc,GAAG,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAE9D,wBAAsB,2BAA2B,CAC/C,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,QAAQ,GAAE,cAAgC,GACzC,OAAO,CAAC,sBAAsB,CAAC,CA8BjC"}
1
+ {"version":3,"file":"native-capabilities.d.ts","sourceRoot":"","sources":["../../../src/activity/native-capabilities.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG,QAAQ,CAAC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC,CAAC;AAEH,MAAM,MAAM,sBAAsB,GAAG,QAAQ,CAAC;IAC5C,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,SAAS,gBAAgB,EAAE,CAAC;CAC3C,CAAC,CAAC;AAQH,KAAK,cAAc,GAAG,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAE9D,wBAAsB,2BAA2B,CAC/C,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,QAAQ,GAAE,cAAgC,GACzC,OAAO,CAAC,sBAAsB,CAAC,CA2BjC"}
@@ -2,24 +2,20 @@ export async function negotiateNativeCapabilities(requested, importer = defaultI
2
2
  const bounded = requested
3
3
  .slice(0, 64)
4
4
  .map((name) => normalizeName(name));
5
- for (const specifier of [
6
- "@phigon/native",
7
- new URL("../../../../native/index.js", import.meta.url).href,
8
- ]) {
9
- try {
10
- const loaded = await importer(specifier);
11
- const module = nativeModule(loaded);
12
- if (module === null)
13
- continue;
5
+ // Only by package name: the observer is published on its own, and a
6
+ // development checkout links the package in (see verify-adapters).
7
+ try {
8
+ const module = nativeModule(await importer("@phigon/native"));
9
+ if (module !== null) {
14
10
  const capabilities = module
15
11
  .negotiateCapabilities(bounded)
16
12
  .slice(0, 64)
17
13
  .map(validateCapability);
18
14
  return { nativeLoaded: true, capabilities };
19
15
  }
20
- catch {
21
- // Try the next packaged or repository-local native binding.
22
- }
16
+ }
17
+ catch {
18
+ // Not installed, or not built for this platform.
23
19
  }
24
20
  return {
25
21
  nativeLoaded: false,