@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
@@ -1,53 +1,94 @@
1
+ /**
2
+ * Collection pauses once a byte-budgeted queue holds this share of its
3
+ * budget. Events can be up to 1 MiB each, so the event count alone lets a
4
+ * slow server fill the budget first; the rest is room for a scan already
5
+ * under way.
6
+ */
7
+ const byteBackpressureRatio = 0.75;
8
+ /** Whether a queue still has room by bytes for another collection pass. */
9
+ export function hasByteHeadroom(metrics) {
10
+ return (metrics.bytes === undefined ||
11
+ metrics.byteCapacity === undefined ||
12
+ metrics.bytes < metrics.byteCapacity * byteBackpressureRatio);
13
+ }
1
14
  export class BoundedEventQueue {
2
15
  #capacity;
16
+ // Queued events are #events[#head..], ordered by sequence. The stream
17
+ // acknowledges every event and pumps after each acknowledgement, so
18
+ // acknowledge, metrics and pendingAfter work from the ends of the queue
19
+ // and acknowledged events are released by advancing #head; a full queue
20
+ // drains in linear rather than quadratic time.
3
21
  #events = [];
22
+ #head = 0;
4
23
  #dropped = 0;
5
24
  #coalesced = 0;
6
25
  #acknowledged = 0n;
26
+ // Sum of the `bytes` of the queued events (#events[#head..]).
27
+ #bytes = 0;
7
28
  constructor(capacity = 2048) {
8
29
  if (!Number.isSafeInteger(capacity) || capacity < 1) {
9
30
  throw new Error("Event queue capacity must be a positive integer.");
10
31
  }
11
32
  this.#capacity = capacity;
12
33
  }
13
- enqueue(value, sequence, coalesceKey) {
34
+ enqueue(value, sequence, coalesceKey, bytes = 0) {
14
35
  if (sequence <= this.#acknowledged)
15
36
  return;
37
+ const event = {
38
+ value,
39
+ sequence,
40
+ ...(coalesceKey === undefined ? {} : { coalesceKey }),
41
+ ...(bytes === 0 ? {} : { bytes }),
42
+ };
43
+ if (coalesceKey === undefined && this.#size() < this.#capacity) {
44
+ const last = this.#last();
45
+ if (last === undefined || last.sequence <= sequence) {
46
+ this.#events.push(event);
47
+ this.#bytes += bytes;
48
+ return;
49
+ }
50
+ }
51
+ this.#compact();
16
52
  if (coalesceKey !== undefined) {
17
- const index = this.#events.findIndex((event) => event.coalesceKey === coalesceKey);
53
+ const index = this.#events.findIndex((candidate) => candidate.coalesceKey === coalesceKey);
18
54
  if (index >= 0) {
19
- this.#events[index] = { value, sequence, coalesceKey };
20
- this.#events.sort((left, right) => left.sequence < right.sequence ? -1 : 1);
55
+ this.#bytes += bytes - (this.#events[index]?.bytes ?? 0);
56
+ this.#events[index] = event;
57
+ this.#events.sort((left, right) => left.sequence < right.sequence ? -1 : left.sequence > right.sequence ? 1 : 0);
21
58
  this.#coalesced++;
22
59
  return;
23
60
  }
24
61
  }
25
62
  if (this.#events.length >= this.#capacity) {
26
- this.#events.shift();
63
+ this.#bytes -= this.#events.shift()?.bytes ?? 0;
27
64
  this.#dropped++;
28
65
  }
29
- this.#events.push({
30
- value,
31
- sequence,
32
- ...(coalesceKey === undefined ? {} : { coalesceKey }),
33
- });
66
+ this.#events.splice(this.#firstAfter(sequence), 0, event);
67
+ this.#bytes += bytes;
34
68
  }
35
69
  canEnqueue(coalesceKey) {
36
- return (this.#events.length < this.#capacity ||
37
- (coalesceKey !== undefined &&
38
- this.#events.some((event) => event.coalesceKey === coalesceKey)));
70
+ if (this.#size() < this.#capacity)
71
+ return true;
72
+ if (coalesceKey === undefined)
73
+ return false;
74
+ for (let index = this.#head; index < this.#events.length; index++) {
75
+ if (this.#events[index]?.coalesceKey === coalesceKey)
76
+ return true;
77
+ }
78
+ return false;
39
79
  }
40
80
  acknowledge(throughSequence) {
41
81
  if (throughSequence <= this.#acknowledged)
42
82
  return;
43
83
  this.#acknowledged = throughSequence;
44
- this.#events = this.#events.filter((event) => event.sequence > throughSequence);
84
+ this.#removeThrough(throughSequence);
45
85
  }
46
86
  discard(sequence) {
87
+ this.#compact();
47
88
  const index = this.#events.findIndex((event) => event.sequence === sequence);
48
89
  if (index < 0)
49
90
  return false;
50
- this.#events.splice(index, 1);
91
+ this.#bytes -= this.#events.splice(index, 1)[0]?.bytes ?? 0;
51
92
  this.#dropped++;
52
93
  return true;
53
94
  }
@@ -56,15 +97,18 @@ export class BoundedEventQueue {
56
97
  throw new Error("Acknowledged sequence must not be negative.");
57
98
  }
58
99
  this.#acknowledged = throughSequence;
59
- this.#events = this.#events.filter((event) => event.sequence > throughSequence);
100
+ this.#removeThrough(throughSequence);
60
101
  }
61
102
  pending() {
62
- return this.#events.map((event) => event.value);
103
+ return this.#events.slice(this.#head).map((event) => event.value);
63
104
  }
64
105
  entries() {
65
- return this.#events.map((event) => Object.freeze({ ...event }));
106
+ return this.#events
107
+ .slice(this.#head)
108
+ .map((event) => Object.freeze({ ...event }));
66
109
  }
67
110
  replacePending(replace) {
111
+ this.#compact();
68
112
  this.#events = this.#events.map((event) => ({
69
113
  ...event,
70
114
  value: replace(event.value),
@@ -74,46 +118,58 @@ export class BoundedEventQueue {
74
118
  if (source.#capacity !== this.#capacity) {
75
119
  throw new Error("Event queue replacement capacity does not match.");
76
120
  }
77
- this.#events = source.#events.map((event) => ({ ...event }));
121
+ this.#events = source.#events
122
+ .slice(source.#head)
123
+ .map((event) => ({ ...event }));
124
+ this.#head = 0;
78
125
  this.#dropped = source.#dropped;
79
126
  this.#coalesced = source.#coalesced;
80
127
  this.#acknowledged = source.#acknowledged;
128
+ this.#bytes = source.#bytes;
81
129
  }
82
- latestSequence() {
83
- let latest;
84
- for (const event of this.#events) {
85
- if (latest === undefined || event.sequence > latest) {
86
- latest = event.sequence;
87
- }
130
+ /** Stored size of the queued events. */
131
+ queuedBytes() {
132
+ return this.#bytes;
133
+ }
134
+ /** Replace the stored sizes of the queued events, oldest first. */
135
+ reweigh(bytes) {
136
+ this.#compact();
137
+ if (bytes.length !== this.#events.length) {
138
+ throw new Error("Event queue sizes do not match the queued events.");
88
139
  }
89
- return latest;
140
+ this.#events = this.#events.map((event, index) => {
141
+ const size = bytes[index] ?? 0;
142
+ return {
143
+ value: event.value,
144
+ sequence: event.sequence,
145
+ ...(event.coalesceKey === undefined ? {} : { coalesceKey: event.coalesceKey }),
146
+ ...(size === 0 ? {} : { bytes: size }),
147
+ };
148
+ });
149
+ this.#bytes = bytes.reduce((total, size) => total + size, 0);
150
+ }
151
+ latestSequence() {
152
+ return this.#last()?.sequence;
90
153
  }
91
154
  pendingAfter(sequence, limit = this.#capacity) {
92
155
  if (!Number.isSafeInteger(limit) || limit < 1) {
93
156
  return [];
94
157
  }
158
+ const start = this.#firstAfter(sequence);
95
159
  return this.#events
96
- .filter((event) => event.sequence > sequence)
97
- .slice(0, limit)
160
+ .slice(start, start + limit)
98
161
  .map((event) => event.value);
99
162
  }
100
163
  metrics() {
101
- let oldestSequence;
102
- let latestSequence;
103
- for (const event of this.#events) {
104
- if (oldestSequence === undefined ||
105
- event.sequence < oldestSequence) {
106
- oldestSequence = event.sequence;
107
- }
108
- if (latestSequence === undefined ||
109
- event.sequence > latestSequence) {
110
- latestSequence = event.sequence;
111
- }
112
- }
164
+ const depth = this.#size();
165
+ const oldestSequence = depth === 0
166
+ ? undefined
167
+ : this.#events[this.#head]?.sequence;
168
+ const latestSequence = this.#last()?.sequence;
113
169
  return Object.freeze({
114
170
  capacity: this.#capacity,
115
- depth: this.#events.length,
116
- utilization: this.#events.length / this.#capacity,
171
+ depth,
172
+ utilization: depth / this.#capacity,
117
173
  dropped: this.#dropped,
118
174
  coalesced: this.#coalesced,
119
175
  acknowledged: this.#acknowledged,
@@ -121,5 +177,44 @@ export class BoundedEventQueue {
121
177
  ...(latestSequence === undefined ? {} : { latestSequence }),
122
178
  });
123
179
  }
180
+ #size() {
181
+ return this.#events.length - this.#head;
182
+ }
183
+ #last() {
184
+ return this.#size() === 0 ? undefined : this.#events.at(-1);
185
+ }
186
+ /** Index of the first queued event with a sequence above `sequence`. */
187
+ #firstAfter(sequence) {
188
+ let low = this.#head;
189
+ let high = this.#events.length;
190
+ while (low < high) {
191
+ const middle = (low + high) >>> 1;
192
+ if ((this.#events[middle]?.sequence ?? 0n) <= sequence) {
193
+ low = middle + 1;
194
+ }
195
+ else {
196
+ high = middle;
197
+ }
198
+ }
199
+ return low;
200
+ }
201
+ #removeThrough(sequence) {
202
+ const head = this.#firstAfter(sequence);
203
+ for (let index = this.#head; index < head; index++) {
204
+ this.#bytes -= this.#events[index]?.bytes ?? 0;
205
+ }
206
+ this.#head = head;
207
+ // Release acknowledged events once they are half of the backing array,
208
+ // which keeps the copy amortized to constant work per event.
209
+ if (this.#head > 0 && this.#head * 2 >= this.#events.length) {
210
+ this.#compact();
211
+ }
212
+ }
213
+ #compact() {
214
+ if (this.#head === 0)
215
+ return;
216
+ this.#events = this.#events.slice(this.#head);
217
+ this.#head = 0;
218
+ }
124
219
  }
125
220
  //# sourceMappingURL=event-queue.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"event-queue.js","sourceRoot":"","sources":["../../src/event-queue.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"event-queue.js","sourceRoot":"","sources":["../../src/event-queue.ts"],"names":[],"mappings":"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"}
@@ -1,14 +1,62 @@
1
1
  import { type EventEnvelope } from "./generated/phigon/v1/telemetry_pb.js";
2
- import { BoundedEventQueue } from "./event-queue.js";
2
+ import { BoundedEventQueue, type QueueMetrics } from "./event-queue.js";
3
+ /**
4
+ * What `restore` did instead of loading the spool as it was:
5
+ * - `other_machine`: an earlier pairing's spool, moved to `directory`.
6
+ * - `damaged`: a spool that could not be read, moved to `directory`.
7
+ * - `over_capacity`: more events than the queue holds; the newest were kept
8
+ * and `dropped` of the oldest were left out.
9
+ */
10
+ export type SpoolRestoreNotice = Readonly<{
11
+ reason: "other_machine" | "damaged";
12
+ directory: string;
13
+ }> | Readonly<{
14
+ reason: "over_capacity";
15
+ dropped: number;
16
+ }>;
3
17
  /**
4
18
  * An encrypted append-only delivery spool. The in-memory queue remains the hot
5
19
  * path, while this log makes unacknowledged events recoverable after an
6
20
  * observer restart without writing prompt or tool content as plaintext.
21
+ *
22
+ * Records are group-committed: they are buffered and written with one
23
+ * flushed append at most 100 ms later, or at once by `flush`. An event is
24
+ * durable only after a flush, so a source checkpoint may move past an event
25
+ * only after `flush` returns (the collector's `flushDelivery`). Events the
26
+ * server already acknowledged are safe either way, and a lost
27
+ * acknowledgement or discard record only sends an event again.
7
28
  */
8
29
  export declare class FileBackedEventQueue extends BoundedEventQueue<EventEnvelope> {
9
30
  #private;
10
- constructor(dataDirectory: string, capacity?: number);
11
- restore(tenantID: string, machineID: string, credential: string): void;
31
+ constructor(dataDirectory: string, capacity?: number, maxBytes?: number);
32
+ /**
33
+ * Writes every buffered record with one flushed append. Throws when the
34
+ * spool cannot be written; the records stay buffered and the next write
35
+ * retries them.
36
+ */
37
+ flush(): void;
38
+ /**
39
+ * Adds the spool's size by bytes: the stored size of the unacknowledged
40
+ * events, which is what a compaction keeps, and the budget it must fit.
41
+ */
42
+ metrics(): QueueMetrics;
43
+ /**
44
+ * Loads the spool for this machine. None of these stops the observer, and
45
+ * the returned notice says which one happened:
46
+ * - A spool that an earlier pairing of this data directory left for
47
+ * another machine cannot be delivered as this one: it is moved aside
48
+ * with its stream cursor.
49
+ * - A spool that is too large to read safely, or holds a record that does
50
+ * not verify before its last line, is moved aside on its own and the
51
+ * queue starts empty. Its events were written before their sources'
52
+ * checkpoints moved, so they are not read again; the moved copy keeps
53
+ * them for an administrator.
54
+ * - A spool with more events than the queue holds, as after lowering
55
+ * PHIGON_ACTIVITY_QUEUE_CAPACITY, keeps the newest events, as a full
56
+ * queue does while running. The control plane records the skipped
57
+ * sequence numbers as a gap.
58
+ */
59
+ restore(tenantID: string, machineID: string, credential: string): SpoolRestoreNotice | undefined;
12
60
  enqueue(value: EventEnvelope, sequence: bigint, coalesceKey?: string): void;
13
61
  acknowledge(throughSequence: bigint): void;
14
62
  discard(sequence: bigint): boolean;
@@ -16,4 +64,14 @@ export declare class FileBackedEventQueue extends BoundedEventQueue<EventEnvelop
16
64
  replacePending(replace: (value: EventEnvelope) => EventEnvelope): void;
17
65
  }
18
66
  export declare function clearEventSpool(dataDirectory: string): void;
67
+ /**
68
+ * Moves what an earlier pairing of this data directory left behind out of
69
+ * the way, so a computer paired again as a new machine starts with an empty
70
+ * queue instead of refusing to read the old one. The encrypted spool, the
71
+ * stream cursor and `extraFiles` (such as the old credential, the only key
72
+ * that can still decrypt that spool) go to `retired-pairings/<time>-<machine>/`.
73
+ * Only the newest few pairings are kept. Returns that directory, or
74
+ * undefined when there was nothing to move.
75
+ */
76
+ export declare function retirePairingState(dataDirectory: string, machineID: string | undefined, extraFiles?: readonly string[]): string | undefined;
19
77
  //# sourceMappingURL=event-spool.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"event-spool.d.ts","sourceRoot":"","sources":["../../src/event-spool.ts"],"names":[],"mappings":"AAoBA,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAoCrD;;;;GAIG;AACH,qBAAa,oBAAqB,SAAQ,iBAAiB,CAAC,aAAa,CAAC;;gBAO5D,aAAa,EAAE,MAAM,EAAE,QAAQ,SAAO;IAMlD,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAgD7D,OAAO,CACd,KAAK,EAAE,aAAa,EACpB,QAAQ,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,MAAM,GACnB,IAAI;IAeE,WAAW,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI;IAO1C,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAUlC,qBAAqB,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI;IAMpD,cAAc,CACrB,OAAO,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,aAAa,GAC/C,IAAI;CA+KR;AAED,wBAAgB,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAkB3D"}
1
+ {"version":3,"file":"event-spool.d.ts","sourceRoot":"","sources":["../../src/event-spool.ts"],"names":[],"mappings":"AAuBA,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAoBxE;;;;;;GAMG;AACH,MAAM,MAAM,kBAAkB,GAC1B,QAAQ,CAAC;IAAE,MAAM,EAAE,eAAe,GAAG,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,GACpE,QAAQ,CAAC;IAAE,MAAM,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AA8B3D;;;;;;;;;;;GAWG;AACH,qBAAa,oBAAqB,SAAQ,iBAAiB,CAAC,aAAa,CAAC;;gBAqBtE,aAAa,EAAE,MAAM,EACrB,QAAQ,SAAO,EACf,QAAQ,SAAuB;IAejC;;;;OAIG;IACH,KAAK,IAAI,IAAI;IAuBb;;;OAGG;IACM,OAAO,IAAI,YAAY;IAQhC;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CACL,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,kBAAkB,GAAG,SAAS;IAwExB,OAAO,CACd,KAAK,EAAE,aAAa,EACpB,QAAQ,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,MAAM,GACnB,IAAI;IAuBE,WAAW,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI;IAO1C,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAUlC,qBAAqB,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI;IAMpD,cAAc,CACrB,OAAO,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,aAAa,GAC/C,IAAI;CA6RR;AAED,wBAAgB,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAE3D;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,UAAU,GAAE,SAAS,MAAM,EAAO,GACjC,MAAM,GAAG,SAAS,CAQpB"}