@getpaseo/server 0.1.71 → 0.1.73
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/dist/server/server/agent/agent-archive.d.ts +11 -0
- package/dist/server/server/agent/agent-archive.d.ts.map +1 -0
- package/dist/server/server/agent/agent-archive.js +16 -0
- package/dist/server/server/agent/agent-archive.js.map +1 -0
- package/dist/server/server/agent/agent-manager.d.ts.map +1 -1
- package/dist/server/server/agent/agent-manager.js +3 -23
- package/dist/server/server/agent/agent-manager.js.map +1 -1
- package/dist/server/server/agent/agent-response-loop.d.ts.map +1 -1
- package/dist/server/server/agent/agent-response-loop.js +2 -1
- package/dist/server/server/agent/agent-response-loop.js.map +1 -1
- package/dist/server/server/agent/create-agent-title.d.ts +8 -0
- package/dist/server/server/agent/create-agent-title.d.ts.map +1 -0
- package/dist/server/server/agent/create-agent-title.js +29 -0
- package/dist/server/server/agent/create-agent-title.js.map +1 -0
- package/dist/server/server/agent/import-sessions.d.ts +20 -1
- package/dist/server/server/agent/import-sessions.d.ts.map +1 -1
- package/dist/server/server/agent/import-sessions.js +101 -0
- package/dist/server/server/agent/import-sessions.js.map +1 -1
- package/dist/server/server/agent/provider-launch-config.d.ts.map +1 -1
- package/dist/server/server/agent/provider-launch-config.js +1 -0
- package/dist/server/server/agent/provider-launch-config.js.map +1 -1
- package/dist/server/server/agent/provider-registry.d.ts.map +1 -1
- package/dist/server/server/agent/provider-registry.js +2 -1
- package/dist/server/server/agent/provider-registry.js.map +1 -1
- package/dist/server/server/agent/providers/codex/app-server-transport.d.ts +25 -0
- package/dist/server/server/agent/providers/codex/app-server-transport.d.ts.map +1 -0
- package/dist/server/server/agent/providers/codex/app-server-transport.js +183 -0
- package/dist/server/server/agent/providers/codex/app-server-transport.js.map +1 -0
- package/dist/server/server/agent/providers/codex/test-utils/fake-app-server.d.ts +31 -0
- package/dist/server/server/agent/providers/codex/test-utils/fake-app-server.d.ts.map +1 -0
- package/dist/server/server/agent/providers/codex/test-utils/fake-app-server.js +172 -0
- package/dist/server/server/agent/providers/codex/test-utils/fake-app-server.js.map +1 -0
- package/dist/server/server/agent/providers/codex-app-server-agent.d.ts +1 -21
- package/dist/server/server/agent/providers/codex-app-server-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/codex-app-server-agent.js +2 -171
- package/dist/server/server/agent/providers/codex-app-server-agent.js.map +1 -1
- package/dist/server/server/agent/providers/opencode/runtime.d.ts +27 -0
- package/dist/server/server/agent/providers/opencode/runtime.d.ts.map +1 -0
- package/dist/server/server/agent/providers/opencode/runtime.js +5 -0
- package/dist/server/server/agent/providers/opencode/runtime.js.map +1 -0
- package/dist/server/server/agent/providers/opencode/server-manager.d.ts +55 -0
- package/dist/server/server/agent/providers/opencode/server-manager.d.ts.map +1 -0
- package/dist/server/server/agent/providers/opencode/server-manager.js +255 -0
- package/dist/server/server/agent/providers/opencode/server-manager.js.map +1 -0
- package/dist/server/server/agent/providers/opencode/test-server-manager.d.ts +22 -0
- package/dist/server/server/agent/providers/opencode/test-server-manager.d.ts.map +1 -0
- package/dist/server/server/agent/providers/opencode/test-server-manager.js +28 -0
- package/dist/server/server/agent/providers/opencode/test-server-manager.js.map +1 -0
- package/dist/server/server/agent/providers/opencode/test-utils/test-opencode-runtime.d.ts +75 -0
- package/dist/server/server/agent/providers/opencode/test-utils/test-opencode-runtime.d.ts.map +1 -0
- package/dist/server/server/agent/providers/opencode/test-utils/test-opencode-runtime.js +169 -0
- package/dist/server/server/agent/providers/opencode/test-utils/test-opencode-runtime.js.map +1 -0
- package/dist/server/server/agent/providers/opencode-agent.d.ts +38 -36
- package/dist/server/server/agent/providers/opencode-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/opencode-agent.js +556 -267
- package/dist/server/server/agent/providers/opencode-agent.js.map +1 -1
- package/dist/server/server/agent/providers/pi-direct-agent.d.ts +8 -3
- package/dist/server/server/agent/providers/pi-direct-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/pi-direct-agent.js +44 -34
- package/dist/server/server/agent/providers/pi-direct-agent.js.map +1 -1
- package/dist/server/server/bootstrap.d.ts +2 -0
- package/dist/server/server/bootstrap.d.ts.map +1 -1
- package/dist/server/server/bootstrap.js +45 -8
- package/dist/server/server/bootstrap.js.map +1 -1
- package/dist/server/server/checkout/status-projection.d.ts +19 -0
- package/dist/server/server/checkout/status-projection.d.ts.map +1 -0
- package/dist/server/server/checkout/status-projection.js +98 -0
- package/dist/server/server/checkout/status-projection.js.map +1 -0
- package/dist/server/server/file-explorer/service.d.ts.map +1 -1
- package/dist/server/server/file-explorer/service.js +84 -67
- package/dist/server/server/file-explorer/service.js.map +1 -1
- package/dist/server/server/paseo-worktree-service.d.ts +2 -1
- package/dist/server/server/paseo-worktree-service.d.ts.map +1 -1
- package/dist/server/server/paseo-worktree-service.js +30 -3
- package/dist/server/server/paseo-worktree-service.js.map +1 -1
- package/dist/server/server/push/notifications.d.ts +9 -0
- package/dist/server/server/push/notifications.d.ts.map +1 -0
- package/dist/server/server/push/notifications.js +15 -0
- package/dist/server/server/push/notifications.js.map +1 -0
- package/dist/server/server/push/push-service.d.ts +1 -2
- package/dist/server/server/push/push-service.d.ts.map +1 -1
- package/dist/server/server/relay-transport.d.ts +7 -1
- package/dist/server/server/relay-transport.d.ts.map +1 -1
- package/dist/server/server/relay-transport.js +10 -5
- package/dist/server/server/relay-transport.js.map +1 -1
- package/dist/server/server/session.d.ts +1 -17
- package/dist/server/server/session.d.ts.map +1 -1
- package/dist/server/server/session.js +24 -233
- package/dist/server/server/session.js.map +1 -1
- package/dist/server/server/websocket/runtime-metrics.d.ts +71 -0
- package/dist/server/server/websocket/runtime-metrics.d.ts.map +1 -0
- package/dist/server/server/websocket/runtime-metrics.js +148 -0
- package/dist/server/server/websocket/runtime-metrics.js.map +1 -0
- package/dist/server/server/websocket-server.d.ts +4 -21
- package/dist/server/server/websocket-server.d.ts.map +1 -1
- package/dist/server/server/websocket-server.js +28 -137
- package/dist/server/server/websocket-server.js.map +1 -1
- package/dist/server/server/workspace-directory.d.ts +0 -2
- package/dist/server/server/workspace-directory.d.ts.map +1 -1
- package/dist/server/server/workspace-directory.js +9 -26
- package/dist/server/server/workspace-directory.js.map +1 -1
- package/dist/server/shared/agent-state-bucket.d.ts +13 -0
- package/dist/server/shared/agent-state-bucket.d.ts.map +1 -0
- package/dist/server/shared/agent-state-bucket.js +41 -0
- package/dist/server/shared/agent-state-bucket.js.map +1 -0
- package/dist/server/shared/connection-offer.d.ts +6 -6
- package/dist/server/shared/connection-offer.js +1 -1
- package/dist/server/shared/connection-offer.js.map +1 -1
- package/dist/server/shared/git-remote.d.ts +16 -0
- package/dist/server/shared/git-remote.d.ts.map +1 -0
- package/dist/server/shared/git-remote.js +72 -0
- package/dist/server/shared/git-remote.js.map +1 -0
- package/dist/server/utils/checkout-git.d.ts +1 -0
- package/dist/server/utils/checkout-git.d.ts.map +1 -1
- package/dist/server/utils/checkout-git.js +3 -0
- package/dist/server/utils/checkout-git.js.map +1 -1
- package/dist/server/utils/github-remote.d.ts +3 -7
- package/dist/server/utils/github-remote.d.ts.map +1 -1
- package/dist/server/utils/github-remote.js +4 -70
- package/dist/server/utils/github-remote.js.map +1 -1
- package/dist/server/utils/run-git-command.d.ts.map +1 -1
- package/dist/server/utils/run-git-command.js +1 -0
- package/dist/server/utils/run-git-command.js.map +1 -1
- package/dist/src/server/agent/provider-launch-config.js +1 -0
- package/dist/src/server/agent/provider-launch-config.js.map +1 -1
- package/package.json +5 -5
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { WSOutboundMessage } from "../messages.js";
|
|
2
|
+
export interface WebSocketRuntimeCounters {
|
|
3
|
+
connectedAwaitingHello: number;
|
|
4
|
+
helloResumed: number;
|
|
5
|
+
helloNew: number;
|
|
6
|
+
pendingDisconnected: number;
|
|
7
|
+
sessionDisconnectedWaitingReconnect: number;
|
|
8
|
+
sessionSocketDisconnectedAttached: number;
|
|
9
|
+
sessionCleanup: number;
|
|
10
|
+
validationFailed: number;
|
|
11
|
+
binaryBeforeHelloRejected: number;
|
|
12
|
+
pendingMessageRejectedBeforeHello: number;
|
|
13
|
+
missingConnectionForMessage: number;
|
|
14
|
+
unexpectedHelloOnActiveConnection: number;
|
|
15
|
+
relayExternalSocketAttached: number;
|
|
16
|
+
originRejected: number;
|
|
17
|
+
hostRejected: number;
|
|
18
|
+
}
|
|
19
|
+
export interface WebSocketRuntimeMetricsSnapshot {
|
|
20
|
+
windowMs: number;
|
|
21
|
+
counters: WebSocketRuntimeCounters;
|
|
22
|
+
inboundMessageTypesTop: Array<[string, number]>;
|
|
23
|
+
inboundSessionRequestTypesTop: Array<[string, number]>;
|
|
24
|
+
outboundMessageTypesTop: Array<[string, number]>;
|
|
25
|
+
outboundSessionMessageTypesTop: Array<[string, number]>;
|
|
26
|
+
outboundAgentStreamTypesTop: Array<[string, number]>;
|
|
27
|
+
outboundAgentStreamAgentsTop: Array<[string, number]>;
|
|
28
|
+
outboundBinaryFrameTypesTop: Array<[string, number]>;
|
|
29
|
+
bufferedAmount: {
|
|
30
|
+
p95: number;
|
|
31
|
+
max: number;
|
|
32
|
+
};
|
|
33
|
+
latency: Array<{
|
|
34
|
+
type: string;
|
|
35
|
+
count: number;
|
|
36
|
+
minMs: number;
|
|
37
|
+
maxMs: number;
|
|
38
|
+
p50Ms: number;
|
|
39
|
+
totalMs: number;
|
|
40
|
+
}>;
|
|
41
|
+
}
|
|
42
|
+
type Clock = () => number;
|
|
43
|
+
export declare class WebSocketRuntimeMetricsWindow {
|
|
44
|
+
private readonly clock;
|
|
45
|
+
private windowStartedAt;
|
|
46
|
+
private readonly counters;
|
|
47
|
+
private readonly inboundMessageCounts;
|
|
48
|
+
private readonly inboundSessionRequestCounts;
|
|
49
|
+
private readonly outboundMessageCounts;
|
|
50
|
+
private readonly outboundSessionMessageCounts;
|
|
51
|
+
private readonly outboundAgentStreamCounts;
|
|
52
|
+
private readonly outboundAgentStreamByAgentCounts;
|
|
53
|
+
private readonly outboundBinaryFrameCounts;
|
|
54
|
+
private readonly bufferedAmountSamples;
|
|
55
|
+
private readonly requestLatencies;
|
|
56
|
+
constructor(clock?: Clock);
|
|
57
|
+
incrementCounter(counter: keyof WebSocketRuntimeCounters): void;
|
|
58
|
+
recordInboundMessage(type: string): void;
|
|
59
|
+
recordInboundSessionRequest(type: string): void;
|
|
60
|
+
recordOutboundMessage(message: WSOutboundMessage, bufferedAmount?: number): void;
|
|
61
|
+
recordOutboundBinaryFrame(bufferedAmount?: number): void;
|
|
62
|
+
recordRequestLatency(type: string, durationMs: number): void;
|
|
63
|
+
snapshotAndReset(): WebSocketRuntimeMetricsSnapshot;
|
|
64
|
+
private recordOutboundAgentStreamMessage;
|
|
65
|
+
private recordBufferedAmount;
|
|
66
|
+
private computeLatencyStats;
|
|
67
|
+
private computeBufferedAmountStats;
|
|
68
|
+
private reset;
|
|
69
|
+
}
|
|
70
|
+
export {};
|
|
71
|
+
//# sourceMappingURL=runtime-metrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-metrics.d.ts","sourceRoot":"","sources":["../../../../src/server/websocket/runtime-metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
export class WebSocketRuntimeMetricsWindow {
|
|
2
|
+
constructor(clock = Date.now) {
|
|
3
|
+
this.clock = clock;
|
|
4
|
+
this.counters = createRuntimeCounters();
|
|
5
|
+
this.inboundMessageCounts = new Map();
|
|
6
|
+
this.inboundSessionRequestCounts = new Map();
|
|
7
|
+
this.outboundMessageCounts = new Map();
|
|
8
|
+
this.outboundSessionMessageCounts = new Map();
|
|
9
|
+
this.outboundAgentStreamCounts = new Map();
|
|
10
|
+
this.outboundAgentStreamByAgentCounts = new Map();
|
|
11
|
+
this.outboundBinaryFrameCounts = new Map();
|
|
12
|
+
this.bufferedAmountSamples = [];
|
|
13
|
+
this.requestLatencies = new Map();
|
|
14
|
+
this.windowStartedAt = this.clock();
|
|
15
|
+
}
|
|
16
|
+
incrementCounter(counter) {
|
|
17
|
+
this.counters[counter] += 1;
|
|
18
|
+
}
|
|
19
|
+
recordInboundMessage(type) {
|
|
20
|
+
incrementCount(this.inboundMessageCounts, type);
|
|
21
|
+
}
|
|
22
|
+
recordInboundSessionRequest(type) {
|
|
23
|
+
incrementCount(this.inboundSessionRequestCounts, type);
|
|
24
|
+
}
|
|
25
|
+
recordOutboundMessage(message, bufferedAmount) {
|
|
26
|
+
if (message.type !== "session") {
|
|
27
|
+
incrementCount(this.outboundMessageCounts, message.type);
|
|
28
|
+
this.recordBufferedAmount(bufferedAmount);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
incrementCount(this.outboundMessageCounts, "session_message");
|
|
32
|
+
incrementCount(this.outboundSessionMessageCounts, message.message.type);
|
|
33
|
+
if (message.message.type === "agent_stream") {
|
|
34
|
+
this.recordOutboundAgentStreamMessage(message.message.payload);
|
|
35
|
+
}
|
|
36
|
+
this.recordBufferedAmount(bufferedAmount);
|
|
37
|
+
}
|
|
38
|
+
recordOutboundBinaryFrame(bufferedAmount) {
|
|
39
|
+
incrementCount(this.outboundBinaryFrameCounts, "binary");
|
|
40
|
+
this.recordBufferedAmount(bufferedAmount);
|
|
41
|
+
}
|
|
42
|
+
recordRequestLatency(type, durationMs) {
|
|
43
|
+
let latencies = this.requestLatencies.get(type);
|
|
44
|
+
if (!latencies) {
|
|
45
|
+
latencies = [];
|
|
46
|
+
this.requestLatencies.set(type, latencies);
|
|
47
|
+
}
|
|
48
|
+
latencies.push(durationMs);
|
|
49
|
+
}
|
|
50
|
+
snapshotAndReset() {
|
|
51
|
+
const now = this.clock();
|
|
52
|
+
const snapshot = {
|
|
53
|
+
windowMs: Math.max(0, now - this.windowStartedAt),
|
|
54
|
+
counters: { ...this.counters },
|
|
55
|
+
inboundMessageTypesTop: getTopCounts(this.inboundMessageCounts, 12),
|
|
56
|
+
inboundSessionRequestTypesTop: getTopCounts(this.inboundSessionRequestCounts, 20),
|
|
57
|
+
outboundMessageTypesTop: getTopCounts(this.outboundMessageCounts, 12),
|
|
58
|
+
outboundSessionMessageTypesTop: getTopCounts(this.outboundSessionMessageCounts, 20),
|
|
59
|
+
outboundAgentStreamTypesTop: getTopCounts(this.outboundAgentStreamCounts, 20),
|
|
60
|
+
outboundAgentStreamAgentsTop: getTopCounts(this.outboundAgentStreamByAgentCounts, 20),
|
|
61
|
+
outboundBinaryFrameTypesTop: getTopCounts(this.outboundBinaryFrameCounts, 12),
|
|
62
|
+
bufferedAmount: this.computeBufferedAmountStats(),
|
|
63
|
+
latency: this.computeLatencyStats(),
|
|
64
|
+
};
|
|
65
|
+
this.reset(now);
|
|
66
|
+
return snapshot;
|
|
67
|
+
}
|
|
68
|
+
recordOutboundAgentStreamMessage(payload) {
|
|
69
|
+
const { agentId, event } = payload;
|
|
70
|
+
const eventType = event.type === "timeline" ? `timeline:${event.item.type}` : event.type;
|
|
71
|
+
incrementCount(this.outboundAgentStreamCounts, eventType);
|
|
72
|
+
incrementCount(this.outboundAgentStreamByAgentCounts, agentId);
|
|
73
|
+
}
|
|
74
|
+
recordBufferedAmount(bufferedAmount) {
|
|
75
|
+
if (typeof bufferedAmount !== "number") {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
this.bufferedAmountSamples.push(bufferedAmount);
|
|
79
|
+
}
|
|
80
|
+
computeLatencyStats() {
|
|
81
|
+
const stats = [];
|
|
82
|
+
for (const [type, latencies] of this.requestLatencies) {
|
|
83
|
+
if (latencies.length === 0)
|
|
84
|
+
continue;
|
|
85
|
+
const sortedLatencies = [...latencies].sort((a, b) => a - b);
|
|
86
|
+
const count = sortedLatencies.length;
|
|
87
|
+
const minMs = Math.round(sortedLatencies[0]);
|
|
88
|
+
const maxMs = Math.round(sortedLatencies[count - 1]);
|
|
89
|
+
const p50Ms = Math.round(sortedLatencies[Math.floor(count / 2)]);
|
|
90
|
+
const totalMs = Math.round(sortedLatencies.reduce((sum, value) => sum + value, 0));
|
|
91
|
+
stats.push({ type, count, minMs, maxMs, p50Ms, totalMs });
|
|
92
|
+
}
|
|
93
|
+
stats.sort((a, b) => b.totalMs - a.totalMs);
|
|
94
|
+
return stats.slice(0, 15);
|
|
95
|
+
}
|
|
96
|
+
computeBufferedAmountStats() {
|
|
97
|
+
if (this.bufferedAmountSamples.length === 0) {
|
|
98
|
+
return { p95: 0, max: 0 };
|
|
99
|
+
}
|
|
100
|
+
const samples = [...this.bufferedAmountSamples].sort((a, b) => a - b);
|
|
101
|
+
const p95Index = Math.ceil(samples.length * 0.95) - 1;
|
|
102
|
+
return {
|
|
103
|
+
p95: samples[p95Index] ?? 0,
|
|
104
|
+
max: samples[samples.length - 1] ?? 0,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
reset(windowStartedAt) {
|
|
108
|
+
for (const counter of Object.keys(this.counters)) {
|
|
109
|
+
this.counters[counter] = 0;
|
|
110
|
+
}
|
|
111
|
+
this.inboundMessageCounts.clear();
|
|
112
|
+
this.inboundSessionRequestCounts.clear();
|
|
113
|
+
this.outboundMessageCounts.clear();
|
|
114
|
+
this.outboundSessionMessageCounts.clear();
|
|
115
|
+
this.outboundAgentStreamCounts.clear();
|
|
116
|
+
this.outboundAgentStreamByAgentCounts.clear();
|
|
117
|
+
this.outboundBinaryFrameCounts.clear();
|
|
118
|
+
this.bufferedAmountSamples.length = 0;
|
|
119
|
+
this.requestLatencies.clear();
|
|
120
|
+
this.windowStartedAt = windowStartedAt;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
function createRuntimeCounters() {
|
|
124
|
+
return {
|
|
125
|
+
connectedAwaitingHello: 0,
|
|
126
|
+
helloResumed: 0,
|
|
127
|
+
helloNew: 0,
|
|
128
|
+
pendingDisconnected: 0,
|
|
129
|
+
sessionDisconnectedWaitingReconnect: 0,
|
|
130
|
+
sessionSocketDisconnectedAttached: 0,
|
|
131
|
+
sessionCleanup: 0,
|
|
132
|
+
validationFailed: 0,
|
|
133
|
+
binaryBeforeHelloRejected: 0,
|
|
134
|
+
pendingMessageRejectedBeforeHello: 0,
|
|
135
|
+
missingConnectionForMessage: 0,
|
|
136
|
+
unexpectedHelloOnActiveConnection: 0,
|
|
137
|
+
relayExternalSocketAttached: 0,
|
|
138
|
+
originRejected: 0,
|
|
139
|
+
hostRejected: 0,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
function incrementCount(map, key) {
|
|
143
|
+
map.set(key, (map.get(key) ?? 0) + 1);
|
|
144
|
+
}
|
|
145
|
+
function getTopCounts(map, limit) {
|
|
146
|
+
return [...map.entries()].sort((a, b) => b[1] - a[1]).slice(0, limit);
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=runtime-metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-metrics.js","sourceRoot":"","sources":["../../../../src/server/websocket/runtime-metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,7 @@ import type { HostnamesConfig } from "./hostnames.js";
|
|
|
15
15
|
import { Session, type SessionLifecycleIntent } from "./session.js";
|
|
16
16
|
import type { AgentProviderRuntimeSettingsMap, ProviderOverride } from "./agent/provider-launch-config.js";
|
|
17
17
|
import type { WorkspaceGitService } from "./workspace-git-service.js";
|
|
18
|
+
import { type PushNotificationSender } from "./push/notifications.js";
|
|
18
19
|
import type { ScriptHealthState } from "./script-health-monitor.js";
|
|
19
20
|
import type { ScriptRouteStore } from "./script-proxy.js";
|
|
20
21
|
import type { WorkspaceScriptRuntimeStore } from "./workspace-script-runtime-store.js";
|
|
@@ -66,7 +67,7 @@ export declare class VoiceAssistantWebSocketServer {
|
|
|
66
67
|
private readonly paseoHome;
|
|
67
68
|
private readonly daemonConfigStore;
|
|
68
69
|
private readonly pushTokenStore;
|
|
69
|
-
private readonly
|
|
70
|
+
private readonly pushNotificationSender;
|
|
70
71
|
private readonly mcpBaseUrl;
|
|
71
72
|
private speech;
|
|
72
73
|
private terminalManager;
|
|
@@ -86,23 +87,13 @@ export declare class VoiceAssistantWebSocketServer {
|
|
|
86
87
|
private onLifecycleIntent;
|
|
87
88
|
private onBranchChanged;
|
|
88
89
|
private serverCapabilities;
|
|
89
|
-
private
|
|
90
|
-
private readonly runtimeCounters;
|
|
91
|
-
private readonly inboundMessageCounts;
|
|
92
|
-
private readonly inboundSessionRequestCounts;
|
|
93
|
-
private readonly outboundMessageCounts;
|
|
94
|
-
private readonly outboundSessionMessageCounts;
|
|
95
|
-
private readonly outboundAgentStreamCounts;
|
|
96
|
-
private readonly outboundAgentStreamByAgentCounts;
|
|
97
|
-
private readonly outboundBinaryFrameCounts;
|
|
98
|
-
private readonly bufferedAmountSamples;
|
|
99
|
-
private readonly requestLatencies;
|
|
90
|
+
private readonly runtimeMetrics;
|
|
100
91
|
private runtimeMetricsInterval;
|
|
101
92
|
private unsubscribeSpeechReadiness;
|
|
102
93
|
private unsubscribeDaemonConfigChange;
|
|
103
94
|
constructor(server: HTTPServer, logger: pino.Logger, serverId: string, agentManager: AgentManager, agentStorage: AgentStorage, downloadTokenStore: DownloadTokenStore, paseoHome: string, daemonConfigStore: DaemonConfigStore, mcpBaseUrl: string | null, wsConfig: WebSocketServerConfig, auth?: DaemonAuthConfig, speech?: SpeechService | null, terminalManager?: TerminalManager | null, dictation?: {
|
|
104
95
|
finalTimeoutMs?: number;
|
|
105
|
-
}, agentProviderRuntimeSettings?: AgentProviderRuntimeSettingsMap, providerOverrides?: Record<string, ProviderOverride>, isDev?: boolean, daemonVersion?: string, onLifecycleIntent?: (intent: SessionLifecycleIntent) => void, projectRegistry?: ProjectRegistry, workspaceRegistry?: WorkspaceRegistry, chatService?: FileBackedChatService, loopService?: LoopService, scheduleService?: ScheduleService, checkoutDiffManager?: CheckoutDiffManager, scriptRouteStore?: ScriptRouteStore | null, scriptRuntimeStore?: WorkspaceScriptRuntimeStore | null, onBranchChanged?: (workspaceId: string, oldBranch: string | null, newBranch: string | null) => void, getDaemonTcpPort?: () => number | null, getDaemonTcpHost?: () => string | null, resolveScriptHealth?: (hostname: string) => ScriptHealthState | null, workspaceGitService?: WorkspaceGitService, github?: GitHubService);
|
|
96
|
+
}, agentProviderRuntimeSettings?: AgentProviderRuntimeSettingsMap, providerOverrides?: Record<string, ProviderOverride>, isDev?: boolean, daemonVersion?: string, onLifecycleIntent?: (intent: SessionLifecycleIntent) => void, projectRegistry?: ProjectRegistry, workspaceRegistry?: WorkspaceRegistry, chatService?: FileBackedChatService, loopService?: LoopService, scheduleService?: ScheduleService, checkoutDiffManager?: CheckoutDiffManager, scriptRouteStore?: ScriptRouteStore | null, scriptRuntimeStore?: WorkspaceScriptRuntimeStore | null, onBranchChanged?: (workspaceId: string, oldBranch: string | null, newBranch: string | null) => void, getDaemonTcpPort?: () => number | null, getDaemonTcpHost?: () => string | null, resolveScriptHealth?: (hostname: string) => ScriptHealthState | null, workspaceGitService?: WorkspaceGitService, github?: GitHubService, pushNotificationSender?: PushNotificationSender);
|
|
106
97
|
private assignOptionalServices;
|
|
107
98
|
private createWebSocketServer;
|
|
108
99
|
private startRuntimeMetricsInterval;
|
|
@@ -140,17 +131,9 @@ export declare class VoiceAssistantWebSocketServer {
|
|
|
140
131
|
private handleRawMessageError;
|
|
141
132
|
private decodeRawMessagePayloadForError;
|
|
142
133
|
private incrementRuntimeCounter;
|
|
143
|
-
private incrementCount;
|
|
144
134
|
private recordInboundMessageType;
|
|
145
135
|
private recordInboundSessionRequestType;
|
|
146
|
-
private recordOutboundMessage;
|
|
147
|
-
private recordOutboundAgentStreamMessage;
|
|
148
|
-
private recordOutboundBinaryFrame;
|
|
149
|
-
private recordBufferedAmount;
|
|
150
136
|
private recordRequestLatency;
|
|
151
|
-
private getTopCounts;
|
|
152
|
-
private computeLatencyStats;
|
|
153
|
-
private computeBufferedAmountStats;
|
|
154
137
|
private collectSessionRuntimeMetrics;
|
|
155
138
|
private flushRuntimeMetrics;
|
|
156
139
|
private getClientActivityState;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket-server.d.ts","sourceRoot":"","sources":["../../../src/server/websocket-server.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAmB,MAAM,IAAI,UAAU,EAAE,MAAM,MAAM,CAAC;AAGlE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAClF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,mBAAmB,EAAuB,MAAM,4BAA4B,CAAC;AAC3F,OAAO,KAAK,EAAE,iBAAiB,EAAuB,MAAM,0BAA0B,CAAC;AAEvF,OAAO,
|
|
1
|
+
{"version":3,"file":"websocket-server.d.ts","sourceRoot":"","sources":["../../../src/server/websocket-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,11 +10,12 @@ import { ProviderSnapshotManager } from "./agent/provider-snapshot-manager.js";
|
|
|
10
10
|
import { buildProviderRegistry, createClientsFromRegistry } from "./agent/provider-registry.js";
|
|
11
11
|
import { buildWorkspaceGitMetadataFromSnapshot } from "./workspace-git-metadata.js";
|
|
12
12
|
import { PushTokenStore } from "./push/token-store.js";
|
|
13
|
-
import {
|
|
13
|
+
import { createPushNotificationSender } from "./push/notifications.js";
|
|
14
14
|
import { computeNotificationPlan } from "./agent-attention-policy.js";
|
|
15
15
|
import { buildAgentAttentionNotificationPayload, findLatestPermissionRequest, } from "../shared/agent-attention-notification.js";
|
|
16
16
|
import { createGitHubService } from "../services/github-service.js";
|
|
17
17
|
import { extractWsBearerProtocol, extractWsBearerToken, isBearerTokenValid, } from "./auth.js";
|
|
18
|
+
import { WebSocketRuntimeMetricsWindow, } from "./websocket/runtime-metrics.js";
|
|
18
19
|
const WS_CLOSE_DAEMON_AUTH_FAILED = 4401;
|
|
19
20
|
function createFallbackWorkspaceGitSnapshot(cwd) {
|
|
20
21
|
return {
|
|
@@ -201,40 +202,14 @@ function requireWebSocketServices(params) {
|
|
|
201
202
|
* WebSocket server that only accepts sockets + parses/forwards messages to the session layer.
|
|
202
203
|
*/
|
|
203
204
|
export class VoiceAssistantWebSocketServer {
|
|
204
|
-
constructor(server, logger, serverId, agentManager, agentStorage, downloadTokenStore, paseoHome, daemonConfigStore, mcpBaseUrl, wsConfig, auth, speech, terminalManager, dictation, agentProviderRuntimeSettings, providerOverrides, isDev, daemonVersion, onLifecycleIntent, projectRegistry, workspaceRegistry, chatService, loopService, scheduleService, checkoutDiffManager, scriptRouteStore, scriptRuntimeStore, onBranchChanged, getDaemonTcpPort, getDaemonTcpHost, resolveScriptHealth, workspaceGitService, github) {
|
|
205
|
+
constructor(server, logger, serverId, agentManager, agentStorage, downloadTokenStore, paseoHome, daemonConfigStore, mcpBaseUrl, wsConfig, auth, speech, terminalManager, dictation, agentProviderRuntimeSettings, providerOverrides, isDev, daemonVersion, onLifecycleIntent, projectRegistry, workspaceRegistry, chatService, loopService, scheduleService, checkoutDiffManager, scriptRouteStore, scriptRuntimeStore, onBranchChanged, getDaemonTcpPort, getDaemonTcpHost, resolveScriptHealth, workspaceGitService, github, pushNotificationSender) {
|
|
205
206
|
this.pendingConnections = new Map();
|
|
206
207
|
this.sessions = new Map();
|
|
207
208
|
this.externalSessionsByKey = new Map();
|
|
208
209
|
this.voiceSpeakHandlers = new Map();
|
|
209
210
|
this.voiceCallerContexts = new Map();
|
|
210
211
|
this.workspaceSetupSnapshots = new Map();
|
|
211
|
-
this.
|
|
212
|
-
this.runtimeCounters = {
|
|
213
|
-
connectedAwaitingHello: 0,
|
|
214
|
-
helloResumed: 0,
|
|
215
|
-
helloNew: 0,
|
|
216
|
-
pendingDisconnected: 0,
|
|
217
|
-
sessionDisconnectedWaitingReconnect: 0,
|
|
218
|
-
sessionSocketDisconnectedAttached: 0,
|
|
219
|
-
sessionCleanup: 0,
|
|
220
|
-
validationFailed: 0,
|
|
221
|
-
binaryBeforeHelloRejected: 0,
|
|
222
|
-
pendingMessageRejectedBeforeHello: 0,
|
|
223
|
-
missingConnectionForMessage: 0,
|
|
224
|
-
unexpectedHelloOnActiveConnection: 0,
|
|
225
|
-
relayExternalSocketAttached: 0,
|
|
226
|
-
originRejected: 0,
|
|
227
|
-
hostRejected: 0,
|
|
228
|
-
};
|
|
229
|
-
this.inboundMessageCounts = new Map();
|
|
230
|
-
this.inboundSessionRequestCounts = new Map();
|
|
231
|
-
this.outboundMessageCounts = new Map();
|
|
232
|
-
this.outboundSessionMessageCounts = new Map();
|
|
233
|
-
this.outboundAgentStreamCounts = new Map();
|
|
234
|
-
this.outboundAgentStreamByAgentCounts = new Map();
|
|
235
|
-
this.outboundBinaryFrameCounts = new Map();
|
|
236
|
-
this.bufferedAmountSamples = [];
|
|
237
|
-
this.requestLatencies = new Map();
|
|
212
|
+
this.runtimeMetrics = new WebSocketRuntimeMetricsWindow();
|
|
238
213
|
this.runtimeMetricsInterval = null;
|
|
239
214
|
this.unsubscribeSpeechReadiness = null;
|
|
240
215
|
this.unsubscribeDaemonConfigChange = null;
|
|
@@ -306,7 +281,8 @@ export class VoiceAssistantWebSocketServer {
|
|
|
306
281
|
});
|
|
307
282
|
const pushLogger = this.logger.child({ module: "push" });
|
|
308
283
|
this.pushTokenStore = new PushTokenStore(pushLogger, join(paseoHome, "push-tokens.json"));
|
|
309
|
-
this.
|
|
284
|
+
this.pushNotificationSender =
|
|
285
|
+
pushNotificationSender ?? createPushNotificationSender(pushLogger, this.pushTokenStore);
|
|
310
286
|
this.agentManager.setAgentAttentionCallback((params) => {
|
|
311
287
|
void this.broadcastAgentAttention(params).catch((err) => {
|
|
312
288
|
this.logger.warn({ err, agentId: params.agentId }, "Failed to broadcast agent attention");
|
|
@@ -397,7 +373,7 @@ export class VoiceAssistantWebSocketServer {
|
|
|
397
373
|
// WebSocket.OPEN = 1
|
|
398
374
|
if (ws.readyState === 1) {
|
|
399
375
|
ws.send(payload);
|
|
400
|
-
this.recordOutboundMessage(message, ws);
|
|
376
|
+
this.runtimeMetrics.recordOutboundMessage(message, ws.bufferedAmount);
|
|
401
377
|
}
|
|
402
378
|
}
|
|
403
379
|
}
|
|
@@ -489,7 +465,7 @@ export class VoiceAssistantWebSocketServer {
|
|
|
489
465
|
}
|
|
490
466
|
try {
|
|
491
467
|
ws.send(JSON.stringify(message));
|
|
492
|
-
this.recordOutboundMessage(message, ws);
|
|
468
|
+
this.runtimeMetrics.recordOutboundMessage(message, ws.bufferedAmount);
|
|
493
469
|
}
|
|
494
470
|
catch (err) {
|
|
495
471
|
this.logger.warn({ err }, "ws_send_failed");
|
|
@@ -501,7 +477,7 @@ export class VoiceAssistantWebSocketServer {
|
|
|
501
477
|
}
|
|
502
478
|
try {
|
|
503
479
|
ws.send(frame);
|
|
504
|
-
this.recordOutboundBinaryFrame(ws);
|
|
480
|
+
this.runtimeMetrics.recordOutboundBinaryFrame(ws.bufferedAmount);
|
|
505
481
|
}
|
|
506
482
|
catch (err) {
|
|
507
483
|
this.logger.warn({ err }, "ws_send_binary_failed");
|
|
@@ -1106,83 +1082,16 @@ export class VoiceAssistantWebSocketServer {
|
|
|
1106
1082
|
return { rawPayload, parsedPayload };
|
|
1107
1083
|
}
|
|
1108
1084
|
incrementRuntimeCounter(counter) {
|
|
1109
|
-
this.
|
|
1110
|
-
}
|
|
1111
|
-
incrementCount(map, key) {
|
|
1112
|
-
map.set(key, (map.get(key) ?? 0) + 1);
|
|
1085
|
+
this.runtimeMetrics.incrementCounter(counter);
|
|
1113
1086
|
}
|
|
1114
1087
|
recordInboundMessageType(type) {
|
|
1115
|
-
this.
|
|
1088
|
+
this.runtimeMetrics.recordInboundMessage(type);
|
|
1116
1089
|
}
|
|
1117
1090
|
recordInboundSessionRequestType(type) {
|
|
1118
|
-
this.
|
|
1119
|
-
}
|
|
1120
|
-
recordOutboundMessage(message, ws) {
|
|
1121
|
-
if (message.type !== "session") {
|
|
1122
|
-
this.incrementCount(this.outboundMessageCounts, message.type);
|
|
1123
|
-
this.recordBufferedAmount(ws);
|
|
1124
|
-
return;
|
|
1125
|
-
}
|
|
1126
|
-
this.incrementCount(this.outboundMessageCounts, "session_message");
|
|
1127
|
-
this.incrementCount(this.outboundSessionMessageCounts, message.message.type);
|
|
1128
|
-
if (message.message.type === "agent_stream") {
|
|
1129
|
-
this.recordOutboundAgentStreamMessage(message.message.payload);
|
|
1130
|
-
}
|
|
1131
|
-
this.recordBufferedAmount(ws);
|
|
1132
|
-
}
|
|
1133
|
-
recordOutboundAgentStreamMessage(payload) {
|
|
1134
|
-
const { agentId, event } = payload;
|
|
1135
|
-
const eventType = event.type === "timeline" ? `timeline:${event.item.type}` : event.type;
|
|
1136
|
-
this.incrementCount(this.outboundAgentStreamCounts, eventType);
|
|
1137
|
-
this.incrementCount(this.outboundAgentStreamByAgentCounts, agentId);
|
|
1138
|
-
}
|
|
1139
|
-
recordOutboundBinaryFrame(ws) {
|
|
1140
|
-
this.incrementCount(this.outboundBinaryFrameCounts, "binary");
|
|
1141
|
-
this.recordBufferedAmount(ws);
|
|
1142
|
-
}
|
|
1143
|
-
recordBufferedAmount(ws) {
|
|
1144
|
-
if (typeof ws.bufferedAmount !== "number") {
|
|
1145
|
-
return;
|
|
1146
|
-
}
|
|
1147
|
-
this.bufferedAmountSamples.push(ws.bufferedAmount);
|
|
1091
|
+
this.runtimeMetrics.recordInboundSessionRequest(type);
|
|
1148
1092
|
}
|
|
1149
1093
|
recordRequestLatency(type, durationMs) {
|
|
1150
|
-
|
|
1151
|
-
if (!latencies) {
|
|
1152
|
-
latencies = [];
|
|
1153
|
-
this.requestLatencies.set(type, latencies);
|
|
1154
|
-
}
|
|
1155
|
-
latencies.push(durationMs);
|
|
1156
|
-
}
|
|
1157
|
-
getTopCounts(map, limit) {
|
|
1158
|
-
return [...map.entries()].sort((a, b) => b[1] - a[1]).slice(0, limit);
|
|
1159
|
-
}
|
|
1160
|
-
computeLatencyStats() {
|
|
1161
|
-
const stats = [];
|
|
1162
|
-
for (const [type, latencies] of this.requestLatencies) {
|
|
1163
|
-
if (latencies.length === 0)
|
|
1164
|
-
continue;
|
|
1165
|
-
latencies.sort((a, b) => a - b);
|
|
1166
|
-
const count = latencies.length;
|
|
1167
|
-
const minMs = Math.round(latencies[0]);
|
|
1168
|
-
const maxMs = Math.round(latencies[count - 1]);
|
|
1169
|
-
const p50Ms = Math.round(latencies[Math.floor(count / 2)]);
|
|
1170
|
-
const totalMs = Math.round(latencies.reduce((sum, v) => sum + v, 0));
|
|
1171
|
-
stats.push({ type, count, minMs, maxMs, p50Ms, totalMs });
|
|
1172
|
-
}
|
|
1173
|
-
stats.sort((a, b) => b.totalMs - a.totalMs);
|
|
1174
|
-
return stats.slice(0, 15);
|
|
1175
|
-
}
|
|
1176
|
-
computeBufferedAmountStats() {
|
|
1177
|
-
if (this.bufferedAmountSamples.length === 0) {
|
|
1178
|
-
return { p95: 0, max: 0 };
|
|
1179
|
-
}
|
|
1180
|
-
const samples = [...this.bufferedAmountSamples].sort((a, b) => a - b);
|
|
1181
|
-
const p95Index = Math.ceil(samples.length * 0.95) - 1;
|
|
1182
|
-
return {
|
|
1183
|
-
p95: samples[p95Index] ?? 0,
|
|
1184
|
-
max: samples[samples.length - 1] ?? 0,
|
|
1185
|
-
};
|
|
1094
|
+
this.runtimeMetrics.recordRequestLatency(type, durationMs);
|
|
1186
1095
|
}
|
|
1187
1096
|
collectSessionRuntimeMetrics() {
|
|
1188
1097
|
const uniqueConnections = new Set(this.externalSessionsByKey.values());
|
|
@@ -1207,18 +1116,15 @@ export class VoiceAssistantWebSocketServer {
|
|
|
1207
1116
|
};
|
|
1208
1117
|
}
|
|
1209
1118
|
flushRuntimeMetrics(options) {
|
|
1210
|
-
const
|
|
1211
|
-
const windowMs = Math.max(0, now - this.runtimeWindowStartedAt);
|
|
1119
|
+
const runtimeMetrics = this.runtimeMetrics.snapshotAndReset();
|
|
1212
1120
|
const activeConnections = new Set(this.sessions.values()).size;
|
|
1213
1121
|
const activeSockets = this.sessions.size;
|
|
1214
1122
|
const pendingConnections = this.pendingConnections.size;
|
|
1215
1123
|
const reconnectGraceSessions = [...this.externalSessionsByKey.values()].filter((connection) => connection.sockets.size === 0 && connection.externalDisconnectCleanupTimeout !== null).length;
|
|
1216
1124
|
const sessionMetrics = this.collectSessionRuntimeMetrics();
|
|
1217
|
-
const latencyStats = this.computeLatencyStats();
|
|
1218
|
-
const bufferedAmountStats = this.computeBufferedAmountStats();
|
|
1219
1125
|
const agentSnapshot = this.agentManager.getMetricsSnapshot();
|
|
1220
1126
|
this.logger.info({
|
|
1221
|
-
windowMs,
|
|
1127
|
+
windowMs: runtimeMetrics.windowMs,
|
|
1222
1128
|
final: Boolean(options?.final),
|
|
1223
1129
|
sessions: {
|
|
1224
1130
|
activeConnections,
|
|
@@ -1229,32 +1135,19 @@ export class VoiceAssistantWebSocketServer {
|
|
|
1229
1135
|
activeSockets,
|
|
1230
1136
|
pendingConnections,
|
|
1231
1137
|
},
|
|
1232
|
-
counters:
|
|
1233
|
-
inboundMessageTypesTop:
|
|
1234
|
-
inboundSessionRequestTypesTop:
|
|
1235
|
-
outboundMessageTypesTop:
|
|
1236
|
-
outboundSessionMessageTypesTop:
|
|
1237
|
-
outboundAgentStreamTypesTop:
|
|
1238
|
-
outboundAgentStreamAgentsTop:
|
|
1239
|
-
outboundBinaryFrameTypesTop:
|
|
1240
|
-
bufferedAmount:
|
|
1138
|
+
counters: runtimeMetrics.counters,
|
|
1139
|
+
inboundMessageTypesTop: runtimeMetrics.inboundMessageTypesTop,
|
|
1140
|
+
inboundSessionRequestTypesTop: runtimeMetrics.inboundSessionRequestTypesTop,
|
|
1141
|
+
outboundMessageTypesTop: runtimeMetrics.outboundMessageTypesTop,
|
|
1142
|
+
outboundSessionMessageTypesTop: runtimeMetrics.outboundSessionMessageTypesTop,
|
|
1143
|
+
outboundAgentStreamTypesTop: runtimeMetrics.outboundAgentStreamTypesTop,
|
|
1144
|
+
outboundAgentStreamAgentsTop: runtimeMetrics.outboundAgentStreamAgentsTop,
|
|
1145
|
+
outboundBinaryFrameTypesTop: runtimeMetrics.outboundBinaryFrameTypesTop,
|
|
1146
|
+
bufferedAmount: runtimeMetrics.bufferedAmount,
|
|
1241
1147
|
runtime: sessionMetrics,
|
|
1242
|
-
latency:
|
|
1148
|
+
latency: runtimeMetrics.latency,
|
|
1243
1149
|
agents: agentSnapshot,
|
|
1244
1150
|
}, "ws_runtime_metrics");
|
|
1245
|
-
for (const counter of Object.keys(this.runtimeCounters)) {
|
|
1246
|
-
this.runtimeCounters[counter] = 0;
|
|
1247
|
-
}
|
|
1248
|
-
this.inboundMessageCounts.clear();
|
|
1249
|
-
this.inboundSessionRequestCounts.clear();
|
|
1250
|
-
this.outboundMessageCounts.clear();
|
|
1251
|
-
this.outboundSessionMessageCounts.clear();
|
|
1252
|
-
this.outboundAgentStreamCounts.clear();
|
|
1253
|
-
this.outboundAgentStreamByAgentCounts.clear();
|
|
1254
|
-
this.outboundBinaryFrameCounts.clear();
|
|
1255
|
-
this.bufferedAmountSamples.length = 0;
|
|
1256
|
-
this.requestLatencies.clear();
|
|
1257
|
-
this.runtimeWindowStartedAt = now;
|
|
1258
1151
|
}
|
|
1259
1152
|
getClientActivityState(session) {
|
|
1260
1153
|
const activity = session.getClientActivity();
|
|
@@ -1297,11 +1190,9 @@ export class VoiceAssistantWebSocketServer {
|
|
|
1297
1190
|
nowMs,
|
|
1298
1191
|
});
|
|
1299
1192
|
if (plan.shouldPush) {
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
void this.pushService.sendPush(tokens, notification);
|
|
1304
|
-
}
|
|
1193
|
+
void this.pushNotificationSender.send(notification).catch((err) => {
|
|
1194
|
+
this.logger.warn({ err, agentId: params.agentId }, "Failed to send push notification");
|
|
1195
|
+
});
|
|
1305
1196
|
}
|
|
1306
1197
|
for (const [clientIndex, { ws }] of clientEntries.entries()) {
|
|
1307
1198
|
const shouldNotify = clientIndex === plan.inAppRecipientIndex;
|