@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.
- package/README.md +244 -18
- package/dist/bin/guardian-runner-darwin-amd64 +0 -0
- package/dist/bin/guardian-runner-darwin-arm64 +0 -0
- package/dist/bin/guardian-runner-linux-amd64 +0 -0
- package/dist/bin/guardian-runner-linux-arm64 +0 -0
- package/dist/bin/guardian-runner-windows-amd64.exe +0 -0
- package/dist/bin/guardian-runner-windows-arm64.exe +0 -0
- package/dist/src/abortable-delay.d.ts +10 -0
- package/dist/src/abortable-delay.d.ts.map +1 -0
- package/dist/src/abortable-delay.js +21 -0
- package/dist/src/abortable-delay.js.map +1 -0
- package/dist/src/action-policy.d.ts.map +1 -1
- package/dist/src/action-policy.js +4 -2
- package/dist/src/action-policy.js.map +1 -1
- package/dist/src/activity/adapters/claude.d.ts.map +1 -1
- package/dist/src/activity/adapters/claude.js +28 -2
- package/dist/src/activity/adapters/claude.js.map +1 -1
- package/dist/src/activity/adapters/cline-task.d.ts +7 -0
- package/dist/src/activity/adapters/cline-task.d.ts.map +1 -0
- package/dist/src/activity/adapters/cline-task.js +197 -0
- package/dist/src/activity/adapters/cline-task.js.map +1 -0
- package/dist/src/activity/adapters/cline.d.ts +3 -0
- package/dist/src/activity/adapters/cline.d.ts.map +1 -0
- package/dist/src/activity/adapters/cline.js +102 -0
- package/dist/src/activity/adapters/cline.js.map +1 -0
- package/dist/src/activity/adapters/codex.d.ts.map +1 -1
- package/dist/src/activity/adapters/codex.js +76 -0
- package/dist/src/activity/adapters/codex.js.map +1 -1
- package/dist/src/activity/adapters/copilot-chat.d.ts +3 -0
- package/dist/src/activity/adapters/copilot-chat.d.ts.map +1 -0
- package/dist/src/activity/adapters/copilot-chat.js +176 -0
- package/dist/src/activity/adapters/copilot-chat.js.map +1 -0
- package/dist/src/activity/adapters/copilot.d.ts +2 -1
- package/dist/src/activity/adapters/copilot.d.ts.map +1 -1
- package/dist/src/activity/adapters/copilot.js +173 -2
- package/dist/src/activity/adapters/copilot.js.map +1 -1
- package/dist/src/activity/adapters/cursor.d.ts +3 -0
- package/dist/src/activity/adapters/cursor.d.ts.map +1 -0
- package/dist/src/activity/adapters/cursor.js +86 -0
- package/dist/src/activity/adapters/cursor.js.map +1 -0
- package/dist/src/activity/adapters/factory-droid.d.ts +3 -0
- package/dist/src/activity/adapters/factory-droid.d.ts.map +1 -0
- package/dist/src/activity/adapters/factory-droid.js +126 -0
- package/dist/src/activity/adapters/factory-droid.js.map +1 -0
- package/dist/src/activity/adapters/gemini.d.ts +3 -0
- package/dist/src/activity/adapters/gemini.d.ts.map +1 -0
- package/dist/src/activity/adapters/gemini.js +177 -0
- package/dist/src/activity/adapters/gemini.js.map +1 -0
- package/dist/src/activity/adapters/goose.d.ts +3 -0
- package/dist/src/activity/adapters/goose.d.ts.map +1 -0
- package/dist/src/activity/adapters/goose.js +116 -0
- package/dist/src/activity/adapters/goose.js.map +1 -0
- package/dist/src/activity/adapters/kiro.d.ts +3 -0
- package/dist/src/activity/adapters/kiro.d.ts.map +1 -0
- package/dist/src/activity/adapters/kiro.js +47 -0
- package/dist/src/activity/adapters/kiro.js.map +1 -0
- package/dist/src/activity/adapters/openai-compatible.d.ts.map +1 -1
- package/dist/src/activity/adapters/openai-compatible.js +9 -1
- package/dist/src/activity/adapters/openai-compatible.js.map +1 -1
- package/dist/src/activity/adapters/opencode.d.ts.map +1 -1
- package/dist/src/activity/adapters/opencode.js +108 -1
- package/dist/src/activity/adapters/opencode.js.map +1 -1
- package/dist/src/activity/adapters/zed.d.ts +3 -0
- package/dist/src/activity/adapters/zed.d.ts.map +1 -0
- package/dist/src/activity/adapters/zed.js +134 -0
- package/dist/src/activity/adapters/zed.js.map +1 -0
- package/dist/src/activity/collector.d.ts +43 -1
- package/dist/src/activity/collector.d.ts.map +1 -1
- package/dist/src/activity/collector.js +490 -77
- package/dist/src/activity/collector.js.map +1 -1
- package/dist/src/activity/goose-sqlite-source.d.ts +33 -0
- package/dist/src/activity/goose-sqlite-source.d.ts.map +1 -0
- package/dist/src/activity/goose-sqlite-source.js +274 -0
- package/dist/src/activity/goose-sqlite-source.js.map +1 -0
- package/dist/src/activity/index.d.ts +3 -0
- package/dist/src/activity/index.d.ts.map +1 -1
- package/dist/src/activity/index.js +3 -0
- package/dist/src/activity/index.js.map +1 -1
- package/dist/src/activity/ingest.d.ts +9 -0
- package/dist/src/activity/ingest.d.ts.map +1 -1
- package/dist/src/activity/ingest.js +94 -4
- package/dist/src/activity/ingest.js.map +1 -1
- package/dist/src/activity/json-document-source.d.ts +151 -0
- package/dist/src/activity/json-document-source.d.ts.map +1 -0
- package/dist/src/activity/json-document-source.js +586 -0
- package/dist/src/activity/json-document-source.js.map +1 -0
- package/dist/src/activity/native-capabilities.d.ts.map +1 -1
- package/dist/src/activity/native-capabilities.js +8 -12
- package/dist/src/activity/native-capabilities.js.map +1 -1
- package/dist/src/activity/normalize.d.ts.map +1 -1
- package/dist/src/activity/normalize.js +64 -6
- package/dist/src/activity/normalize.js.map +1 -1
- package/dist/src/activity/opencode-message-tables.d.ts +87 -0
- package/dist/src/activity/opencode-message-tables.d.ts.map +1 -0
- package/dist/src/activity/opencode-message-tables.js +546 -0
- package/dist/src/activity/opencode-message-tables.js.map +1 -0
- package/dist/src/activity/opencode-sqlite-source.d.ts +7 -0
- package/dist/src/activity/opencode-sqlite-source.d.ts.map +1 -1
- package/dist/src/activity/opencode-sqlite-source.js +154 -63
- package/dist/src/activity/opencode-sqlite-source.js.map +1 -1
- package/dist/src/activity/source-reader.d.ts +60 -4
- package/dist/src/activity/source-reader.d.ts.map +1 -1
- package/dist/src/activity/source-reader.js +593 -75
- package/dist/src/activity/source-reader.js.map +1 -1
- package/dist/src/activity/sqlite-connections.d.ts +77 -0
- package/dist/src/activity/sqlite-connections.d.ts.map +1 -0
- package/dist/src/activity/sqlite-connections.js +220 -0
- package/dist/src/activity/sqlite-connections.js.map +1 -0
- package/dist/src/activity/zed-sqlite-source.d.ts +65 -0
- package/dist/src/activity/zed-sqlite-source.d.ts.map +1 -0
- package/dist/src/activity/zed-sqlite-source.js +547 -0
- package/dist/src/activity/zed-sqlite-source.js.map +1 -0
- package/dist/src/agent-action-executor.d.ts +18 -1
- package/dist/src/agent-action-executor.d.ts.map +1 -1
- package/dist/src/agent-action-executor.js +113 -58
- package/dist/src/agent-action-executor.js.map +1 -1
- package/dist/src/agentic-guardian.d.ts.map +1 -1
- package/dist/src/agentic-guardian.js +6 -5
- package/dist/src/agentic-guardian.js.map +1 -1
- package/dist/src/atomic-replace.d.ts +7 -0
- package/dist/src/atomic-replace.d.ts.map +1 -1
- package/dist/src/atomic-replace.js +28 -3
- package/dist/src/atomic-replace.js.map +1 -1
- package/dist/src/bridge-journal.d.ts +32 -0
- package/dist/src/bridge-journal.d.ts.map +1 -0
- package/dist/src/bridge-journal.js +113 -0
- package/dist/src/bridge-journal.js.map +1 -0
- package/dist/src/cli.d.ts +7 -1
- package/dist/src/cli.d.ts.map +1 -1
- package/dist/src/cli.js +534 -50
- package/dist/src/cli.js.map +1 -1
- package/dist/src/collection-notice.d.ts +34 -0
- package/dist/src/collection-notice.d.ts.map +1 -0
- package/dist/src/collection-notice.js +73 -0
- package/dist/src/collection-notice.js.map +1 -0
- package/dist/src/config.d.ts +39 -0
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +187 -36
- package/dist/src/config.js.map +1 -1
- package/dist/src/connection-config.d.ts.map +1 -1
- package/dist/src/connection-config.js +5 -0
- package/dist/src/connection-config.js.map +1 -1
- package/dist/src/content-redaction.d.ts +17 -1
- package/dist/src/content-redaction.d.ts.map +1 -1
- package/dist/src/content-redaction.js +51 -3
- package/dist/src/content-redaction.js.map +1 -1
- package/dist/src/credential-store.d.ts +20 -1
- package/dist/src/credential-store.d.ts.map +1 -1
- package/dist/src/credential-store.js +29 -4
- package/dist/src/credential-store.js.map +1 -1
- package/dist/src/custom-agent-registry.d.ts.map +1 -1
- package/dist/src/custom-agent-registry.js +2 -1
- package/dist/src/custom-agent-registry.js.map +1 -1
- package/dist/src/discovery/adapters/generic.d.ts.map +1 -1
- package/dist/src/discovery/adapters/generic.js +160 -2
- package/dist/src/discovery/adapters/generic.js.map +1 -1
- package/dist/src/discovery/engine.d.ts +7 -1
- package/dist/src/discovery/engine.d.ts.map +1 -1
- package/dist/src/discovery/engine.js +21 -16
- package/dist/src/discovery/engine.js.map +1 -1
- package/dist/src/discovery/known-agent.d.ts +7 -0
- package/dist/src/discovery/known-agent.d.ts.map +1 -1
- package/dist/src/discovery/known-agent.js +9 -4
- package/dist/src/discovery/known-agent.js.map +1 -1
- package/dist/src/discovery/system-evidence.d.ts +40 -1
- package/dist/src/discovery/system-evidence.d.ts.map +1 -1
- package/dist/src/discovery/system-evidence.js +189 -16
- package/dist/src/discovery/system-evidence.js.map +1 -1
- package/dist/src/doctor-check.d.ts +51 -0
- package/dist/src/doctor-check.d.ts.map +1 -0
- package/dist/src/doctor-check.js +174 -0
- package/dist/src/doctor-check.js.map +1 -0
- package/dist/src/enroll.d.ts +86 -0
- package/dist/src/enroll.d.ts.map +1 -0
- package/dist/src/enroll.js +245 -0
- package/dist/src/enroll.js.map +1 -0
- package/dist/src/entry.d.ts +3 -0
- package/dist/src/entry.d.ts.map +1 -0
- package/dist/src/entry.js +14 -0
- package/dist/src/entry.js.map +1 -0
- package/dist/src/event-queue.d.ts +13 -1
- package/dist/src/event-queue.d.ts.map +1 -1
- package/dist/src/event-queue.js +137 -42
- package/dist/src/event-queue.js.map +1 -1
- package/dist/src/event-spool.d.ts +61 -3
- package/dist/src/event-spool.d.ts.map +1 -1
- package/dist/src/event-spool.js +341 -44
- package/dist/src/event-spool.js.map +1 -1
- package/dist/src/generated/phigon/v1/identity_pb.d.ts +7 -0
- package/dist/src/generated/phigon/v1/identity_pb.d.ts.map +1 -1
- package/dist/src/generated/phigon/v1/identity_pb.js +1 -1
- package/dist/src/generated/phigon/v1/identity_pb.js.map +1 -1
- package/dist/src/guardian-containment.d.ts +2 -6
- package/dist/src/guardian-containment.d.ts.map +1 -1
- package/dist/src/guardian-containment.js +12 -63
- package/dist/src/guardian-containment.js.map +1 -1
- package/dist/src/guardian-decision-journal.d.ts.map +1 -1
- package/dist/src/guardian-decision-journal.js +4 -19
- package/dist/src/guardian-decision-journal.js.map +1 -1
- package/dist/src/guardian-managed-exec.d.ts.map +1 -1
- package/dist/src/guardian-managed-exec.js +6 -18
- package/dist/src/guardian-managed-exec.js.map +1 -1
- package/dist/src/guardian-model-bridge.d.ts.map +1 -1
- package/dist/src/guardian-model-bridge.js +2 -1
- package/dist/src/guardian-model-bridge.js.map +1 -1
- package/dist/src/guardian-native.d.ts +0 -1
- package/dist/src/guardian-native.d.ts.map +1 -1
- package/dist/src/guardian-native.js +0 -6
- package/dist/src/guardian-native.js.map +1 -1
- package/dist/src/guardian-process-monitor.d.ts +4 -0
- package/dist/src/guardian-process-monitor.d.ts.map +1 -1
- package/dist/src/guardian-process-monitor.js +82 -26
- package/dist/src/guardian-process-monitor.js.map +1 -1
- package/dist/src/health.d.ts +19 -1
- package/dist/src/health.d.ts.map +1 -1
- package/dist/src/health.js +22 -1
- package/dist/src/health.js.map +1 -1
- package/dist/src/historical-identity-store.d.ts +8 -1
- package/dist/src/historical-identity-store.d.ts.map +1 -1
- package/dist/src/historical-identity-store.js +28 -10
- package/dist/src/historical-identity-store.js.map +1 -1
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/installation.d.ts +2 -0
- package/dist/src/installation.d.ts.map +1 -1
- package/dist/src/installation.js +6 -3
- package/dist/src/installation.js.map +1 -1
- package/dist/src/instance-lock.d.ts +45 -0
- package/dist/src/instance-lock.d.ts.map +1 -0
- package/dist/src/instance-lock.js +243 -0
- package/dist/src/instance-lock.js.map +1 -0
- package/dist/src/machine-command-executor.d.ts +22 -7
- package/dist/src/machine-command-executor.d.ts.map +1 -1
- package/dist/src/machine-command-executor.js +80 -19
- package/dist/src/machine-command-executor.js.map +1 -1
- package/dist/src/node-version.d.ts +8 -0
- package/dist/src/node-version.d.ts.map +1 -0
- package/dist/src/node-version.js +17 -0
- package/dist/src/node-version.js.map +1 -0
- package/dist/src/observer-log.d.ts +50 -0
- package/dist/src/observer-log.d.ts.map +1 -0
- package/dist/src/observer-log.js +141 -0
- package/dist/src/observer-log.js.map +1 -0
- package/dist/src/pair.d.ts +68 -1
- package/dist/src/pair.d.ts.map +1 -1
- package/dist/src/pair.js +204 -65
- package/dist/src/pair.js.map +1 -1
- package/dist/src/private-directory.d.ts +10 -0
- package/dist/src/private-directory.d.ts.map +1 -0
- package/dist/src/private-directory.js +66 -0
- package/dist/src/private-directory.js.map +1 -0
- package/dist/src/process-tree.d.ts +73 -0
- package/dist/src/process-tree.d.ts.map +1 -0
- package/dist/src/process-tree.js +256 -0
- package/dist/src/process-tree.js.map +1 -0
- package/dist/src/proxy.d.ts +68 -0
- package/dist/src/proxy.d.ts.map +1 -0
- package/dist/src/proxy.js +209 -0
- package/dist/src/proxy.js.map +1 -0
- package/dist/src/purge.d.ts +17 -0
- package/dist/src/purge.d.ts.map +1 -0
- package/dist/src/purge.js +84 -0
- package/dist/src/purge.js.map +1 -0
- package/dist/src/remove-machine.d.ts +5 -1
- package/dist/src/remove-machine.d.ts.map +1 -1
- package/dist/src/remove-machine.js +28 -14
- package/dist/src/remove-machine.js.map +1 -1
- package/dist/src/server-authority.d.ts +29 -0
- package/dist/src/server-authority.d.ts.map +1 -0
- package/dist/src/server-authority.js +106 -0
- package/dist/src/server-authority.js.map +1 -0
- package/dist/src/server-clock.d.ts +32 -0
- package/dist/src/server-clock.d.ts.map +1 -0
- package/dist/src/server-clock.js +72 -0
- package/dist/src/server-clock.js.map +1 -0
- package/dist/src/service-command.d.ts +20 -0
- package/dist/src/service-command.d.ts.map +1 -0
- package/dist/src/service-command.js +136 -0
- package/dist/src/service-command.js.map +1 -0
- package/dist/src/service.d.ts +98 -0
- package/dist/src/service.d.ts.map +1 -0
- package/dist/src/service.js +472 -0
- package/dist/src/service.js.map +1 -0
- package/dist/src/stream-client.d.ts +21 -1
- package/dist/src/stream-client.d.ts.map +1 -1
- package/dist/src/stream-client.js +137 -24
- package/dist/src/stream-client.js.map +1 -1
- package/dist/src/stream-state.d.ts +2 -0
- package/dist/src/stream-state.d.ts.map +1 -1
- package/dist/src/stream-state.js +5 -2
- package/dist/src/stream-state.js.map +1 -1
- package/dist/src/system-inspection.d.ts +78 -0
- package/dist/src/system-inspection.d.ts.map +1 -0
- package/dist/src/system-inspection.js +281 -0
- package/dist/src/system-inspection.js.map +1 -0
- package/dist/src/update.d.ts.map +1 -1
- package/dist/src/update.js +9 -3
- package/dist/src/update.js.map +1 -1
- package/dist/src/user-notices.d.ts +64 -0
- package/dist/src/user-notices.d.ts.map +1 -0
- package/dist/src/user-notices.js +141 -0
- package/dist/src/user-notices.js.map +1 -0
- package/package.json +7 -7
- package/dist/src/windows-process.d.ts +0 -7
- package/dist/src/windows-process.d.ts.map +0 -1
- package/dist/src/windows-process.js +0 -18
- package/dist/src/windows-process.js.map +0 -1
package/dist/src/event-queue.js
CHANGED
|
@@ -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((
|
|
53
|
+
const index = this.#events.findIndex((candidate) => candidate.coalesceKey === coalesceKey);
|
|
18
54
|
if (index >= 0) {
|
|
19
|
-
this.#events[index]
|
|
20
|
-
this.#events
|
|
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.
|
|
30
|
-
|
|
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
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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.#
|
|
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.#
|
|
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
|
|
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
|
|
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
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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
|
-
|
|
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
|
-
.
|
|
97
|
-
.slice(0, limit)
|
|
160
|
+
.slice(start, start + limit)
|
|
98
161
|
.map((event) => event.value);
|
|
99
162
|
}
|
|
100
163
|
metrics() {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
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
|
|
116
|
-
utilization:
|
|
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":"
|
|
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
|
-
|
|
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":"
|
|
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"}
|