@seawork/server 1.0.19 → 1.0.20-rc.1

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 (61) hide show
  1. package/dist/scripts/supervisor-entrypoint.js +169 -0
  2. package/dist/scripts/supervisor-entrypoint.js.map +1 -1
  3. package/dist/scripts/supervisor.js +60 -10
  4. package/dist/scripts/supervisor.js.map +1 -1
  5. package/dist/server/client/daemon-client.d.ts +27 -1
  6. package/dist/server/client/daemon-client.d.ts.map +1 -1
  7. package/dist/server/client/daemon-client.js +45 -2
  8. package/dist/server/client/daemon-client.js.map +1 -1
  9. package/dist/server/server/agent/agent-manager.d.ts.map +1 -1
  10. package/dist/server/server/agent/agent-manager.js +58 -3
  11. package/dist/server/server/agent/agent-manager.js.map +1 -1
  12. package/dist/server/server/agent/agent-sdk-types.d.ts +1 -0
  13. package/dist/server/server/agent/agent-sdk-types.d.ts.map +1 -1
  14. package/dist/server/server/agent/providers/claude-agent.d.ts.map +1 -1
  15. package/dist/server/server/agent/providers/claude-agent.js +27 -9
  16. package/dist/server/server/agent/providers/claude-agent.js.map +1 -1
  17. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts.map +1 -1
  18. package/dist/server/server/agent/providers/codex-app-server-agent.js +20 -5
  19. package/dist/server/server/agent/providers/codex-app-server-agent.js.map +1 -1
  20. package/dist/server/server/bootstrap.d.ts.map +1 -1
  21. package/dist/server/server/bootstrap.js +10 -0
  22. package/dist/server/server/bootstrap.js.map +1 -1
  23. package/dist/server/server/crash-report.d.ts +12 -0
  24. package/dist/server/server/crash-report.d.ts.map +1 -0
  25. package/dist/server/server/crash-report.js +217 -0
  26. package/dist/server/server/crash-report.js.map +1 -0
  27. package/dist/server/server/editor-targets.d.ts +3 -1
  28. package/dist/server/server/editor-targets.d.ts.map +1 -1
  29. package/dist/server/server/editor-targets.js +51 -2
  30. package/dist/server/server/editor-targets.js.map +1 -1
  31. package/dist/server/server/exports.d.ts +1 -0
  32. package/dist/server/server/exports.d.ts.map +1 -1
  33. package/dist/server/server/exports.js +5 -0
  34. package/dist/server/server/exports.js.map +1 -1
  35. package/dist/server/server/index.js +20 -2
  36. package/dist/server/server/index.js.map +1 -1
  37. package/dist/server/server/latency-proxy.d.ts +39 -0
  38. package/dist/server/server/latency-proxy.d.ts.map +1 -0
  39. package/dist/server/server/latency-proxy.js +148 -0
  40. package/dist/server/server/latency-proxy.js.map +1 -0
  41. package/dist/server/server/latency-tracker.d.ts +120 -0
  42. package/dist/server/server/latency-tracker.d.ts.map +1 -0
  43. package/dist/server/server/latency-tracker.js +253 -0
  44. package/dist/server/server/latency-tracker.js.map +1 -0
  45. package/dist/server/server/session.d.ts +1 -0
  46. package/dist/server/server/session.d.ts.map +1 -1
  47. package/dist/server/server/session.js +13 -1
  48. package/dist/server/server/session.js.map +1 -1
  49. package/dist/server/shared/messages.d.ts +540 -0
  50. package/dist/server/shared/messages.d.ts.map +1 -1
  51. package/dist/server/shared/messages.js +26 -0
  52. package/dist/server/shared/messages.js.map +1 -1
  53. package/dist/src/server/bug-report-redact.js +145 -0
  54. package/dist/src/server/bug-report-redact.js.map +1 -0
  55. package/dist/src/server/crash-report.js +217 -0
  56. package/dist/src/server/crash-report.js.map +1 -0
  57. package/dist/src/server/daemon-version.js +22 -0
  58. package/dist/src/server/daemon-version.js.map +1 -0
  59. package/dist/src/server/package-version.js +46 -0
  60. package/dist/src/server/package-version.js.map +1 -0
  61. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import type pino from "pino";
2
+ /**
3
+ * Local transparent CONNECT proxy used in latency debug mode.
4
+ *
5
+ * It does NOT decrypt TLS, so HTTP boundaries are invisible. Each upstream
6
+ * connection is timestamped at two TCP-level boundaries:
7
+ * - first client→upstream byte (`providerRequestSentAt`): when the
8
+ * provider SDK puts its TLS ClientHello on the wire, after queueing /
9
+ * DNS / connection pool overhead inside the SDK.
10
+ * - first upstream→client byte (`gatewayFirstByteAt`): the upstream's
11
+ * TLS ServerHello — NOT the gateway HTTP TTFB. The span between these
12
+ * two timestamps is TLS handshake RTT; gateway processing and model
13
+ * generation are then bundled into the remaining "ServerHello →
14
+ * turn_completed" interval. The UI labels these as `tls` and `model`.
15
+ *
16
+ * Attribution: the proxy hands the two timestamps to LatencyTracker, which
17
+ * only records them when there is exactly one active turn (so we never
18
+ * misattribute under concurrent turns). See latency-tracker.ts.
19
+ *
20
+ * Only started when the daemon was launched with SEAWORK_LATENCY_PROXY=1;
21
+ * kept running for the lifetime of the daemon process.
22
+ */
23
+ export declare class LatencyProxy {
24
+ private readonly logger;
25
+ private server;
26
+ private port;
27
+ constructor(logger: pino.Logger);
28
+ start(): Promise<number>;
29
+ getProxyUrl(): string | null;
30
+ stop(): Promise<void>;
31
+ private handleConnect;
32
+ }
33
+ /**
34
+ * Lazy-start a single shared proxy and return its URL. Subsequent calls
35
+ * resolve to the same instance. Safe to call from any provider hook.
36
+ */
37
+ export declare function ensureLatencyProxyUrl(logger: pino.Logger): Promise<string>;
38
+ export declare function getLatencyProxyUrlSync(): string | null;
39
+ //# sourceMappingURL=latency-proxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"latency-proxy.d.ts","sourceRoot":"","sources":["../../../src/server/latency-proxy.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAI7B;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,YAAY;IAIX,OAAO,CAAC,QAAQ,CAAC,MAAM;IAHnC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,IAAI,CAAuB;gBAEN,MAAM,EAAE,IAAI,CAAC,MAAM;IAE1C,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAqC9B,WAAW,IAAI,MAAM,GAAG,IAAI;IAItB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B,OAAO,CAAC,aAAa;CAsDtB;AAKD;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAWhF;AAED,wBAAgB,sBAAsB,IAAI,MAAM,GAAG,IAAI,CAEtD"}
@@ -0,0 +1,148 @@
1
+ import { createServer } from "node:http";
2
+ import { connect } from "node:net";
3
+ import { latencyTracker } from "./latency-tracker.js";
4
+ /**
5
+ * Local transparent CONNECT proxy used in latency debug mode.
6
+ *
7
+ * It does NOT decrypt TLS, so HTTP boundaries are invisible. Each upstream
8
+ * connection is timestamped at two TCP-level boundaries:
9
+ * - first client→upstream byte (`providerRequestSentAt`): when the
10
+ * provider SDK puts its TLS ClientHello on the wire, after queueing /
11
+ * DNS / connection pool overhead inside the SDK.
12
+ * - first upstream→client byte (`gatewayFirstByteAt`): the upstream's
13
+ * TLS ServerHello — NOT the gateway HTTP TTFB. The span between these
14
+ * two timestamps is TLS handshake RTT; gateway processing and model
15
+ * generation are then bundled into the remaining "ServerHello →
16
+ * turn_completed" interval. The UI labels these as `tls` and `model`.
17
+ *
18
+ * Attribution: the proxy hands the two timestamps to LatencyTracker, which
19
+ * only records them when there is exactly one active turn (so we never
20
+ * misattribute under concurrent turns). See latency-tracker.ts.
21
+ *
22
+ * Only started when the daemon was launched with SEAWORK_LATENCY_PROXY=1;
23
+ * kept running for the lifetime of the daemon process.
24
+ */
25
+ export class LatencyProxy {
26
+ constructor(logger) {
27
+ this.logger = logger;
28
+ this.server = null;
29
+ this.port = null;
30
+ }
31
+ async start() {
32
+ if (this.port !== null)
33
+ return this.port;
34
+ const server = createServer();
35
+ server.on("connect", (req, clientSocket, head) => {
36
+ this.handleConnect(req, clientSocket, head);
37
+ });
38
+ // Plain HTTP is uncommon for gateways but handle it defensively so a
39
+ // misrouted SDK request doesn't hang.
40
+ server.on("request", (_req, res) => {
41
+ res.writeHead(501, { "content-type": "text/plain" });
42
+ res.end("latency-proxy: only HTTPS CONNECT supported");
43
+ });
44
+ server.on("error", (err) => {
45
+ this.logger.warn({ err }, "latency-proxy server error");
46
+ });
47
+ await new Promise((resolve, reject) => {
48
+ server.once("error", reject);
49
+ server.listen({ host: "127.0.0.1", port: 0 }, () => {
50
+ server.off("error", reject);
51
+ resolve();
52
+ });
53
+ });
54
+ const address = server.address();
55
+ if (!address || typeof address === "string") {
56
+ throw new Error("latency-proxy: failed to acquire listening port");
57
+ }
58
+ this.server = server;
59
+ this.port = address.port;
60
+ this.logger.info({ port: this.port }, "latency-proxy listening");
61
+ return this.port;
62
+ }
63
+ getProxyUrl() {
64
+ return this.port === null ? null : `http://127.0.0.1:${this.port}`;
65
+ }
66
+ async stop() {
67
+ const server = this.server;
68
+ if (!server)
69
+ return;
70
+ await new Promise((resolve) => server.close(() => resolve()));
71
+ this.server = null;
72
+ this.port = null;
73
+ }
74
+ handleConnect(req, clientSocket, head) {
75
+ const target = req.url ?? "";
76
+ const [hostname, portStr] = target.split(":");
77
+ const port = Number(portStr) || 443;
78
+ if (!hostname) {
79
+ clientSocket.destroy();
80
+ return;
81
+ }
82
+ let requestSentAt;
83
+ let firstByteAt;
84
+ const flushIfReady = () => {
85
+ if (requestSentAt !== undefined && firstByteAt !== undefined) {
86
+ latencyTracker.recordProxyTiming({
87
+ requestSent: requestSentAt,
88
+ firstByte: firstByteAt,
89
+ });
90
+ }
91
+ };
92
+ const upstream = connect({ host: hostname, port }, () => {
93
+ clientSocket.write("HTTP/1.1 200 Connection Established\r\n\r\n");
94
+ if (head && head.length > 0) {
95
+ if (requestSentAt === undefined)
96
+ requestSentAt = Date.now();
97
+ upstream.write(head);
98
+ }
99
+ });
100
+ clientSocket.on("data", (chunk) => {
101
+ if (requestSentAt === undefined && chunk.length > 0) {
102
+ requestSentAt = Date.now();
103
+ }
104
+ upstream.write(chunk);
105
+ });
106
+ upstream.on("data", (chunk) => {
107
+ if (firstByteAt === undefined && chunk.length > 0) {
108
+ firstByteAt = Date.now();
109
+ flushIfReady();
110
+ }
111
+ clientSocket.write(chunk);
112
+ });
113
+ const cleanup = (err) => {
114
+ if (err) {
115
+ this.logger.debug({ err, hostname, port }, "latency-proxy tunnel error");
116
+ }
117
+ clientSocket.destroy();
118
+ upstream.destroy();
119
+ };
120
+ clientSocket.on("end", () => upstream.end());
121
+ upstream.on("end", () => clientSocket.end());
122
+ clientSocket.on("error", cleanup);
123
+ upstream.on("error", cleanup);
124
+ }
125
+ }
126
+ let sharedProxy = null;
127
+ let startingPromise = null;
128
+ /**
129
+ * Lazy-start a single shared proxy and return its URL. Subsequent calls
130
+ * resolve to the same instance. Safe to call from any provider hook.
131
+ */
132
+ export async function ensureLatencyProxyUrl(logger) {
133
+ if (sharedProxy?.getProxyUrl())
134
+ return sharedProxy.getProxyUrl();
135
+ if (!startingPromise) {
136
+ const proxy = new LatencyProxy(logger.child({ component: "latency-proxy" }));
137
+ startingPromise = proxy.start().then(() => {
138
+ sharedProxy = proxy;
139
+ return proxy;
140
+ });
141
+ }
142
+ const proxy = await startingPromise;
143
+ return proxy.getProxyUrl();
144
+ }
145
+ export function getLatencyProxyUrlSync() {
146
+ return sharedProxy?.getProxyUrl() ?? null;
147
+ }
148
+ //# sourceMappingURL=latency-proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"latency-proxy.js","sourceRoot":"","sources":["../../../src/server/latency-proxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAqC,MAAM,WAAW,CAAC;AAC5E,OAAO,EAAE,OAAO,EAAe,MAAM,UAAU,CAAC;AAGhD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,OAAO,YAAY;IAIvB,YAA6B,MAAmB;QAAnB,WAAM,GAAN,MAAM,CAAa;QAHxC,WAAM,GAAkB,IAAI,CAAC;QAC7B,SAAI,GAAkB,IAAI,CAAC;IAEgB,CAAC;IAEpD,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC;QACzC,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;QAE9B,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE;YAC/C,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,YAAsB,EAAE,IAAI,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,qEAAqE;QACrE,sCAAsC;QACtC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;YACjC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAAC;YACrD,GAAG,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACzB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,4BAA4B,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QAEH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC1C,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC7B,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE;gBACjD,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBAC5B,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;QACjC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACrE,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,yBAAyB,CAAC,CAAC;QACjE,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,oBAAoB,IAAI,CAAC,IAAI,EAAE,CAAC;IACrE,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACpE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAEO,aAAa,CAAC,GAAoB,EAAE,YAAoB,EAAE,IAAY;QAC5E,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC;QAC7B,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC;QACpC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,YAAY,CAAC,OAAO,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QAED,IAAI,aAAiC,CAAC;QACtC,IAAI,WAA+B,CAAC;QACpC,MAAM,YAAY,GAAG,GAAG,EAAE;YACxB,IAAI,aAAa,KAAK,SAAS,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;gBAC7D,cAAc,CAAC,iBAAiB,CAAC;oBAC/B,WAAW,EAAE,aAAa;oBAC1B,SAAS,EAAE,WAAW;iBACvB,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,QAAQ,GAAG,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE;YACtD,YAAY,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;YAClE,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,IAAI,aAAa,KAAK,SAAS;oBAAE,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC5D,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACvB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YAChC,IAAI,aAAa,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpD,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC7B,CAAC;YACD,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;QACH,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YAC5B,IAAI,WAAW,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAClD,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACzB,YAAY,EAAE,CAAC;YACjB,CAAC;YACD,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,CAAC,GAAW,EAAE,EAAE;YAC9B,IAAI,GAAG,EAAE,CAAC;gBACR,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,4BAA4B,CAAC,CAAC;YAC3E,CAAC;YACD,YAAY,CAAC,OAAO,EAAE,CAAC;YACvB,QAAQ,CAAC,OAAO,EAAE,CAAC;QACrB,CAAC,CAAC;QACF,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC;QAC7C,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC;QAC7C,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAClC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAChC,CAAC;CACF;AAED,IAAI,WAAW,GAAwB,IAAI,CAAC;AAC5C,IAAI,eAAe,GAAiC,IAAI,CAAC;AAEzD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,MAAmB;IAC7D,IAAI,WAAW,EAAE,WAAW,EAAE;QAAE,OAAO,WAAW,CAAC,WAAW,EAAY,CAAC;IAC3E,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC;QAC7E,eAAe,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;YACxC,WAAW,GAAG,KAAK,CAAC;YACpB,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;IACL,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC;IACpC,OAAO,KAAK,CAAC,WAAW,EAAY,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,OAAO,WAAW,EAAE,WAAW,EAAE,IAAI,IAAI,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,120 @@
1
+ import type { LatencyBreakdown } from "../shared/messages.js";
2
+ /**
3
+ * Per-turn latency tracker. Active only when the user has enabled latency
4
+ * debug mode on the client (which causes `clientSentAt` to be set on the
5
+ * outgoing `send_agent_message_request`).
6
+ *
7
+ * Trackers are keyed by `turnId` because:
8
+ * - one agent can be replaced/cancelled and a new turnId issued before the
9
+ * old one finishes, so agentId is not unique-per-turn;
10
+ * - the wire `turn_completed` event carries turnId, letting the client
11
+ * attach the breakdown to exactly the right assistant message.
12
+ *
13
+ * Proxy attribution (providerRequestSentAt / gatewayFirstByteAt) is only
14
+ * recorded when there is exactly one active turn at the moment a CONNECT
15
+ * arrives. With multiple concurrent turns the proxy cannot distinguish which
16
+ * turn a given socket belongs to (loopback gives us no useful 5-tuple
17
+ * information), so we leave those two timestamps undefined rather than
18
+ * misattribute them. The client renders a partial breakdown in that case.
19
+ */
20
+ declare class LatencyTracker {
21
+ private readonly turns;
22
+ /** agentId → turnId for currently-tracked turns. */
23
+ private readonly agentToTurn;
24
+ /**
25
+ * Per-agent staging area: timestamps captured before the provider has
26
+ * issued a turnId (session-level receive + dispatch). When agent-manager
27
+ * receives the turnId back from `startTurn`, it calls `promotePending` to
28
+ * move the staged entry under that turnId. Dropped if startTurn fails.
29
+ */
30
+ private readonly pendingByAgent;
31
+ /**
32
+ * Map of agentId → set of in-flight turnIds (foreground + autonomous),
33
+ * including debug-off turns that do not get a per-turn entry. Needed
34
+ * because the global CONNECT proxy carries traffic from every spawned
35
+ * provider CLI: if a debug-off turn is in flight alongside a single
36
+ * debug-on turn, the proxy must not attribute the debug-off turn's
37
+ * CONNECT to the debug-on turn.
38
+ *
39
+ * Indexed by agentId so close/refresh teardown can sweep all turns
40
+ * (foreground + autonomous) belonging to one agent in a single call.
41
+ *
42
+ * Bookkeeping is idempotent: synthetic terminal events fired before any
43
+ * real turn_started (e.g. startTurn() throwing) are no-ops, and turns
44
+ * that vanish without a terminal event can be force-cleared via
45
+ * `forceEndAgentTurns` without skewing the count for other live turns.
46
+ */
47
+ private readonly agentActiveTurns;
48
+ private globalActiveTurnCount;
49
+ beginPending(agentId: string, clientSentAt: number, daemonReceivedAt: number): void;
50
+ markPendingDispatched(agentId: string, at?: number): void;
51
+ /**
52
+ * Move the staged entry for `agentId` to a turnId-keyed slot once the
53
+ * provider has issued a turnId. No-op if no pending entry exists (debug
54
+ * mode was off for this turn).
55
+ */
56
+ promotePending(agentId: string, turnId: string): void;
57
+ dropPending(agentId: string): void;
58
+ /**
59
+ * Record proxy-observed gateway timing. The proxy supplies its own
60
+ * timestamps and the tracker decides whether attribution is safe (i.e.
61
+ * unambiguous single in-flight turn). Concurrent turns → silently ignored.
62
+ */
63
+ recordProxyTiming(at: {
64
+ requestSent: number;
65
+ firstByte: number;
66
+ }): void;
67
+ /**
68
+ * Account for a turn entering the in-flight pool, regardless of whether it
69
+ * carries per-turn latency tracking. Used by the proxy concurrency gate so
70
+ * debug-off turns cannot get their CONNECTs misattributed to a single
71
+ * debug-on turn. No-op if turnId is empty.
72
+ *
73
+ * Should be called as early as the agent-manager learns about the turnId
74
+ * (right after `await agent.session.startTurn(...)` returns), not waiting
75
+ * for the provider's `turn_started` event — the provider's first CONNECT
76
+ * can fire inside that window and the proxy timing must already see the
77
+ * turn counted to avoid being silently dropped. The `turn_started` event
78
+ * still calls this method later; the Set keeps it idempotent.
79
+ */
80
+ noteTurnStarted(agentId: string, turnId: string | null | undefined): void;
81
+ /**
82
+ * Mirror of `noteTurnStarted` for terminal events. Idempotent — terminal
83
+ * events fired without a matching `noteTurnStarted` (e.g. synthetic
84
+ * turn_failed from a `startTurn` rejection that never produced a real
85
+ * turn_started) are no-ops and cannot decrement the count for another
86
+ * live turn.
87
+ */
88
+ noteTurnEnded(agentId: string, turnId: string | null | undefined): void;
89
+ /**
90
+ * Force-clear all in-flight entries for an agent whose terminal events
91
+ * will not flow through handleStreamEvent (closeAgent / session refresh
92
+ * paths that unsubscribe before dispatching). Covers:
93
+ * - turns counted in agentActiveTurns (turn_started already fired);
94
+ * - promoted-but-not-yet-started entries in `turns` (pending → promoted
95
+ * by startTurn returning a turnId, but turn_started not yet seen — a
96
+ * real window between agent-manager.ts promote and the provider's
97
+ * first event);
98
+ * - pendingByAgent entries (never reached promotion).
99
+ */
100
+ forceEndAgentTurns(agentId: string): void;
101
+ /**
102
+ * Pull and clear the breakdown for a completed turn. Stamps
103
+ * `turnCompletedAt`. Returns undefined if no tracker is active for the turn.
104
+ */
105
+ complete(turnId: string, at?: number): LatencyBreakdown | undefined;
106
+ /** Drop without producing a breakdown (turn_failed / turn_canceled). */
107
+ drop(turnId: string): void;
108
+ /** Resolve agent → currently tracked turnId, if any. */
109
+ turnIdForAgent(agentId: string): string | undefined;
110
+ isActive(turnId: string): boolean;
111
+ activeCount(): number;
112
+ /** Total in-flight turn count across all agents (foreground + autonomous),
113
+ * including debug-off turns. Exposed for tests; the proxy concurrency
114
+ * gate reads it via recordProxyTiming internally. */
115
+ globalCount(): number;
116
+ }
117
+ export declare const latencyTracker: LatencyTracker;
118
+ export declare function summarizeBreakdown(b: LatencyBreakdown): Record<string, number | undefined>;
119
+ export {};
120
+ //# sourceMappingURL=latency-tracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"latency-tracker.d.ts","sourceRoot":"","sources":["../../../src/server/latency-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D;;;;;;;;;;;;;;;;;GAiBG;AACH,cAAM,cAAc;IAClB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAuC;IAC7D,oDAAoD;IACpD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6B;IACzD;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAuC;IACtE;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAkC;IACnE,OAAO,CAAC,qBAAqB,CAAK;IAElC,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,IAAI;IAInF,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,GAAE,MAAmB,GAAG,IAAI;IAMrE;;;;OAIG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAQrD,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIlC;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAuBvE;;;;;;;;;;;;OAYG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI;IAazE;;;;;;OAMG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI;IAUvE;;;;;;;;;;OAUG;IACH,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAsBzC;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,GAAE,MAAmB,GAAG,gBAAgB,GAAG,SAAS;IAc/E,wEAAwE;IACxE,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAU1B,wDAAwD;IACxD,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAInD,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAIjC,WAAW,IAAI,MAAM;IAIrB;;0DAEsD;IACtD,WAAW,IAAI,MAAM;CAGtB;AAED,eAAO,MAAM,cAAc,gBAAuB,CAAC;AAEnD,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CA+B1F"}
@@ -0,0 +1,253 @@
1
+ /**
2
+ * Per-turn latency tracker. Active only when the user has enabled latency
3
+ * debug mode on the client (which causes `clientSentAt` to be set on the
4
+ * outgoing `send_agent_message_request`).
5
+ *
6
+ * Trackers are keyed by `turnId` because:
7
+ * - one agent can be replaced/cancelled and a new turnId issued before the
8
+ * old one finishes, so agentId is not unique-per-turn;
9
+ * - the wire `turn_completed` event carries turnId, letting the client
10
+ * attach the breakdown to exactly the right assistant message.
11
+ *
12
+ * Proxy attribution (providerRequestSentAt / gatewayFirstByteAt) is only
13
+ * recorded when there is exactly one active turn at the moment a CONNECT
14
+ * arrives. With multiple concurrent turns the proxy cannot distinguish which
15
+ * turn a given socket belongs to (loopback gives us no useful 5-tuple
16
+ * information), so we leave those two timestamps undefined rather than
17
+ * misattribute them. The client renders a partial breakdown in that case.
18
+ */
19
+ class LatencyTracker {
20
+ constructor() {
21
+ this.turns = new Map();
22
+ /** agentId → turnId for currently-tracked turns. */
23
+ this.agentToTurn = new Map();
24
+ /**
25
+ * Per-agent staging area: timestamps captured before the provider has
26
+ * issued a turnId (session-level receive + dispatch). When agent-manager
27
+ * receives the turnId back from `startTurn`, it calls `promotePending` to
28
+ * move the staged entry under that turnId. Dropped if startTurn fails.
29
+ */
30
+ this.pendingByAgent = new Map();
31
+ /**
32
+ * Map of agentId → set of in-flight turnIds (foreground + autonomous),
33
+ * including debug-off turns that do not get a per-turn entry. Needed
34
+ * because the global CONNECT proxy carries traffic from every spawned
35
+ * provider CLI: if a debug-off turn is in flight alongside a single
36
+ * debug-on turn, the proxy must not attribute the debug-off turn's
37
+ * CONNECT to the debug-on turn.
38
+ *
39
+ * Indexed by agentId so close/refresh teardown can sweep all turns
40
+ * (foreground + autonomous) belonging to one agent in a single call.
41
+ *
42
+ * Bookkeeping is idempotent: synthetic terminal events fired before any
43
+ * real turn_started (e.g. startTurn() throwing) are no-ops, and turns
44
+ * that vanish without a terminal event can be force-cleared via
45
+ * `forceEndAgentTurns` without skewing the count for other live turns.
46
+ */
47
+ this.agentActiveTurns = new Map();
48
+ this.globalActiveTurnCount = 0;
49
+ }
50
+ beginPending(agentId, clientSentAt, daemonReceivedAt) {
51
+ this.pendingByAgent.set(agentId, { clientSentAt, daemonReceivedAt });
52
+ }
53
+ markPendingDispatched(agentId, at = Date.now()) {
54
+ const entry = this.pendingByAgent.get(agentId);
55
+ if (!entry)
56
+ return;
57
+ entry.daemonDispatchedAt = at;
58
+ }
59
+ /**
60
+ * Move the staged entry for `agentId` to a turnId-keyed slot once the
61
+ * provider has issued a turnId. No-op if no pending entry exists (debug
62
+ * mode was off for this turn).
63
+ */
64
+ promotePending(agentId, turnId) {
65
+ const entry = this.pendingByAgent.get(agentId);
66
+ if (!entry)
67
+ return;
68
+ this.pendingByAgent.delete(agentId);
69
+ this.turns.set(turnId, entry);
70
+ this.agentToTurn.set(agentId, turnId);
71
+ }
72
+ dropPending(agentId) {
73
+ this.pendingByAgent.delete(agentId);
74
+ }
75
+ /**
76
+ * Record proxy-observed gateway timing. The proxy supplies its own
77
+ * timestamps and the tracker decides whether attribution is safe (i.e.
78
+ * unambiguous single in-flight turn). Concurrent turns → silently ignored.
79
+ */
80
+ recordProxyTiming(at) {
81
+ // Attribution must satisfy BOTH:
82
+ // 1. exactly one debug-tracked turn is in flight (so we know which
83
+ // entry to write to), AND
84
+ // 2. globalActiveCount === 1 (no debug-off turn is concurrently
85
+ // sending CONNECTs through the same proxy).
86
+ // Either condition failing means we cannot safely tell which turn
87
+ // produced this socket; drop the sample.
88
+ const debugTracked = this.turns.size + this.pendingByAgent.size;
89
+ if (debugTracked !== 1 || this.globalActiveTurnCount !== 1)
90
+ return;
91
+ const onlyEntry = this.turns.size === 1
92
+ ? this.turns.values().next().value
93
+ : this.pendingByAgent.values().next().value;
94
+ if (!onlyEntry)
95
+ return;
96
+ if (onlyEntry.providerRequestSentAt === undefined) {
97
+ onlyEntry.providerRequestSentAt = at.requestSent;
98
+ }
99
+ if (onlyEntry.gatewayFirstByteAt === undefined) {
100
+ onlyEntry.gatewayFirstByteAt = at.firstByte;
101
+ }
102
+ }
103
+ /**
104
+ * Account for a turn entering the in-flight pool, regardless of whether it
105
+ * carries per-turn latency tracking. Used by the proxy concurrency gate so
106
+ * debug-off turns cannot get their CONNECTs misattributed to a single
107
+ * debug-on turn. No-op if turnId is empty.
108
+ *
109
+ * Should be called as early as the agent-manager learns about the turnId
110
+ * (right after `await agent.session.startTurn(...)` returns), not waiting
111
+ * for the provider's `turn_started` event — the provider's first CONNECT
112
+ * can fire inside that window and the proxy timing must already see the
113
+ * turn counted to avoid being silently dropped. The `turn_started` event
114
+ * still calls this method later; the Set keeps it idempotent.
115
+ */
116
+ noteTurnStarted(agentId, turnId) {
117
+ if (!turnId)
118
+ return;
119
+ let set = this.agentActiveTurns.get(agentId);
120
+ if (!set) {
121
+ set = new Set();
122
+ this.agentActiveTurns.set(agentId, set);
123
+ }
124
+ if (!set.has(turnId)) {
125
+ set.add(turnId);
126
+ this.globalActiveTurnCount += 1;
127
+ }
128
+ }
129
+ /**
130
+ * Mirror of `noteTurnStarted` for terminal events. Idempotent — terminal
131
+ * events fired without a matching `noteTurnStarted` (e.g. synthetic
132
+ * turn_failed from a `startTurn` rejection that never produced a real
133
+ * turn_started) are no-ops and cannot decrement the count for another
134
+ * live turn.
135
+ */
136
+ noteTurnEnded(agentId, turnId) {
137
+ if (!turnId)
138
+ return;
139
+ const set = this.agentActiveTurns.get(agentId);
140
+ if (!set)
141
+ return;
142
+ if (set.delete(turnId)) {
143
+ this.globalActiveTurnCount -= 1;
144
+ }
145
+ if (set.size === 0)
146
+ this.agentActiveTurns.delete(agentId);
147
+ }
148
+ /**
149
+ * Force-clear all in-flight entries for an agent whose terminal events
150
+ * will not flow through handleStreamEvent (closeAgent / session refresh
151
+ * paths that unsubscribe before dispatching). Covers:
152
+ * - turns counted in agentActiveTurns (turn_started already fired);
153
+ * - promoted-but-not-yet-started entries in `turns` (pending → promoted
154
+ * by startTurn returning a turnId, but turn_started not yet seen — a
155
+ * real window between agent-manager.ts promote and the provider's
156
+ * first event);
157
+ * - pendingByAgent entries (never reached promotion).
158
+ */
159
+ forceEndAgentTurns(agentId) {
160
+ const set = this.agentActiveTurns.get(agentId);
161
+ if (set) {
162
+ for (const turnId of set) {
163
+ if (this.turns.has(turnId))
164
+ this.drop(turnId);
165
+ }
166
+ this.globalActiveTurnCount -= set.size;
167
+ this.agentActiveTurns.delete(agentId);
168
+ }
169
+ // Also sweep a promoted-but-not-started entry: agent-manager.promotePending
170
+ // populates `agentToTurn` synchronously after startTurn returns, but the
171
+ // provider's `turn_started` (which would add it to agentActiveTurns) can
172
+ // arrive on a later tick. Without this, a refresh/close in that window
173
+ // would leave a stale entry in `turns`/`agentToTurn` that a later turn
174
+ // could collide with.
175
+ const promotedTurnId = this.agentToTurn.get(agentId);
176
+ if (promotedTurnId && this.turns.has(promotedTurnId)) {
177
+ this.drop(promotedTurnId);
178
+ }
179
+ this.dropPending(agentId);
180
+ }
181
+ /**
182
+ * Pull and clear the breakdown for a completed turn. Stamps
183
+ * `turnCompletedAt`. Returns undefined if no tracker is active for the turn.
184
+ */
185
+ complete(turnId, at = Date.now()) {
186
+ const entry = this.turns.get(turnId);
187
+ if (!entry)
188
+ return undefined;
189
+ entry.turnCompletedAt = at;
190
+ this.turns.delete(turnId);
191
+ for (const [agentId, t] of this.agentToTurn) {
192
+ if (t === turnId) {
193
+ this.agentToTurn.delete(agentId);
194
+ break;
195
+ }
196
+ }
197
+ return entry;
198
+ }
199
+ /** Drop without producing a breakdown (turn_failed / turn_canceled). */
200
+ drop(turnId) {
201
+ this.turns.delete(turnId);
202
+ for (const [agentId, t] of this.agentToTurn) {
203
+ if (t === turnId) {
204
+ this.agentToTurn.delete(agentId);
205
+ break;
206
+ }
207
+ }
208
+ }
209
+ /** Resolve agent → currently tracked turnId, if any. */
210
+ turnIdForAgent(agentId) {
211
+ return this.agentToTurn.get(agentId);
212
+ }
213
+ isActive(turnId) {
214
+ return this.turns.has(turnId);
215
+ }
216
+ activeCount() {
217
+ return this.turns.size;
218
+ }
219
+ /** Total in-flight turn count across all agents (foreground + autonomous),
220
+ * including debug-off turns. Exposed for tests; the proxy concurrency
221
+ * gate reads it via recordProxyTiming internally. */
222
+ globalCount() {
223
+ return this.globalActiveTurnCount;
224
+ }
225
+ }
226
+ export const latencyTracker = new LatencyTracker();
227
+ export function summarizeBreakdown(b) {
228
+ return {
229
+ networkUpMs: b.clientSentAt !== undefined && b.daemonReceivedAt !== undefined
230
+ ? b.daemonReceivedAt - b.clientSentAt
231
+ : undefined,
232
+ daemonDispatchMs: b.daemonReceivedAt !== undefined && b.daemonDispatchedAt !== undefined
233
+ ? b.daemonDispatchedAt - b.daemonReceivedAt
234
+ : undefined,
235
+ providerOverheadMs: b.daemonDispatchedAt !== undefined && b.providerRequestSentAt !== undefined
236
+ ? b.providerRequestSentAt - b.daemonDispatchedAt
237
+ : undefined,
238
+ // TLS handshake RTT — the proxy cannot see HTTP boundaries inside the
239
+ // CONNECT tunnel, so this is ClientHello→ServerHello, not gateway TTFB.
240
+ tlsHandshakeMs: b.providerRequestSentAt !== undefined && b.gatewayFirstByteAt !== undefined
241
+ ? b.gatewayFirstByteAt - b.providerRequestSentAt
242
+ : undefined,
243
+ modelToDoneMs: b.gatewayFirstByteAt !== undefined && b.turnCompletedAt !== undefined
244
+ ? b.turnCompletedAt - b.gatewayFirstByteAt
245
+ : undefined,
246
+ totalMs: b.clientSentAt !== undefined && b.turnCompletedAt !== undefined
247
+ ? b.turnCompletedAt - b.clientSentAt
248
+ : b.daemonReceivedAt !== undefined && b.turnCompletedAt !== undefined
249
+ ? b.turnCompletedAt - b.daemonReceivedAt
250
+ : undefined,
251
+ };
252
+ }
253
+ //# sourceMappingURL=latency-tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"latency-tracker.js","sourceRoot":"","sources":["../../../src/server/latency-tracker.ts"],"names":[],"mappings":"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"}
@@ -414,6 +414,7 @@ export declare class Session {
414
414
  openEditorTarget(options: {
415
415
  editorId: EditorTargetId;
416
416
  path: string;
417
+ filePath?: string;
417
418
  }): Promise<void>;
418
419
  private handleListAvailableEditorsRequest;
419
420
  private handleOpenInEditorRequest;