@moxt-ai/mobius 0.0.25 → 0.0.27
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/agent-catalog/publish-agent-catalog.js +3 -3
- package/dist/agent-catalog/publish-agent-catalog.js.map +1 -1
- package/dist/cli.js +1194 -205
- package/dist/cli.js.map +4 -4
- package/dist/index.js +1186 -204
- package/dist/index.js.map +4 -4
- package/dist/network/environment-proxy.d.ts +1 -0
- package/dist/network/environment-proxy.d.ts.map +1 -1
- package/dist/network/environment-proxy.js +47 -0
- package/dist/network/environment-proxy.js.map +1 -1
- package/dist/prompt-artifact-resolver.d.ts.map +1 -1
- package/dist/prompt-artifact-resolver.js +7 -4
- package/dist/prompt-artifact-resolver.js.map +1 -1
- package/dist/relay-connection/connect.d.ts.map +1 -1
- package/dist/relay-connection/connect.js +19 -14
- package/dist/relay-connection/connect.js.map +1 -1
- package/dist/relay-connection/diagnostics.d.ts +11 -0
- package/dist/relay-connection/diagnostics.d.ts.map +1 -0
- package/dist/relay-connection/diagnostics.js +122 -0
- package/dist/relay-connection/diagnostics.js.map +1 -0
- package/dist/relay-connection/liveness.d.ts +1 -1
- package/dist/relay-connection/liveness.d.ts.map +1 -1
- package/dist/relay-connection/liveness.js +2 -1
- package/dist/relay-connection/liveness.js.map +1 -1
- package/dist/relay-connection/runtime-authentication.d.ts +3 -0
- package/dist/relay-connection/runtime-authentication.d.ts.map +1 -0
- package/dist/relay-connection/runtime-authentication.js +14 -0
- package/dist/relay-connection/runtime-authentication.js.map +1 -0
- package/dist/relay-connection/session-event-outbox.d.ts +34 -3
- package/dist/relay-connection/session-event-outbox.d.ts.map +1 -1
- package/dist/relay-connection/session-event-outbox.js +404 -13
- package/dist/relay-connection/session-event-outbox.js.map +1 -1
- package/dist/run-daemon.d.ts.map +1 -1
- package/dist/run-daemon.js +437 -151
- package/dist/run-daemon.js.map +1 -1
- package/dist/runtime.js +1186 -204
- package/dist/runtime.js.map +4 -4
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"environment-proxy.d.ts","sourceRoot":"","sources":["../../src/network/environment-proxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"environment-proxy.d.ts","sourceRoot":"","sources":["../../src/network/environment-proxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAK3C,eAAO,MAAM,0BAA0B,mBAA0B,CAAC;AAmClE,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAa3F"}
|
|
@@ -1,3 +1,50 @@
|
|
|
1
1
|
import { EnvHttpProxyAgent } from "undici";
|
|
2
|
+
const configuredHttpProxy = process.env["http_proxy"] ?? process.env["HTTP_PROXY"] ?? "";
|
|
3
|
+
const configuredHttpsProxy = process.env["https_proxy"] ?? process.env["HTTPS_PROXY"] ?? configuredHttpProxy;
|
|
2
4
|
export const environmentProxyDispatcher = new EnvHttpProxyAgent();
|
|
5
|
+
function bypassesProxy(target) {
|
|
6
|
+
const noProxy = process.env["no_proxy"] ?? process.env["NO_PROXY"] ?? "";
|
|
7
|
+
if (noProxy === "*") {
|
|
8
|
+
return true;
|
|
9
|
+
}
|
|
10
|
+
const hostname = target.hostname.replace(/^\[|\]$/gu, "").toLowerCase();
|
|
11
|
+
const defaultPort = target.protocol === "wss:" || target.protocol === "https:" ? 443 : 80;
|
|
12
|
+
const port = Number.parseInt(target.port, 10) || defaultPort;
|
|
13
|
+
for (const rawEntry of noProxy.split(/[,\s]/u)) {
|
|
14
|
+
if (rawEntry.length === 0) {
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
const parsed = rawEntry.match(/^(.+):(\d+)$/u);
|
|
18
|
+
const entryHostname = (parsed?.[1] ?? rawEntry).replace(/^\*?\./u, "").toLowerCase();
|
|
19
|
+
const entryPort = parsed?.[2] === undefined ? 0 : Number.parseInt(parsed[2], 10);
|
|
20
|
+
if (entryPort !== 0 && entryPort !== port) {
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
if (hostname === entryHostname || hostname.endsWith(`.${entryHostname}`)) {
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
function sanitizedProxyOrigin(proxyUrl) {
|
|
30
|
+
try {
|
|
31
|
+
return new URL(proxyUrl).origin;
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return "configured-invalid-url";
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export function describeEnvironmentProxyRoute(target) {
|
|
38
|
+
if (bypassesProxy(target)) {
|
|
39
|
+
return { proxyRoute: "direct" };
|
|
40
|
+
}
|
|
41
|
+
const proxyUrl = target.protocol === "wss:" || target.protocol === "https:" ? configuredHttpsProxy : configuredHttpProxy;
|
|
42
|
+
if (proxyUrl.length === 0) {
|
|
43
|
+
return { proxyRoute: "direct" };
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
proxyOrigin: sanitizedProxyOrigin(proxyUrl),
|
|
47
|
+
proxyRoute: "proxy",
|
|
48
|
+
};
|
|
49
|
+
}
|
|
3
50
|
//# sourceMappingURL=environment-proxy.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"environment-proxy.js","sourceRoot":"","sources":["../../src/network/environment-proxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAE3C,MAAM,CAAC,MAAM,0BAA0B,GAAG,IAAI,iBAAiB,EAAE,CAAC"}
|
|
1
|
+
{"version":3,"file":"environment-proxy.js","sourceRoot":"","sources":["../../src/network/environment-proxy.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-artifact-resolver.d.ts","sourceRoot":"","sources":["../src/prompt-artifact-resolver.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG5E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"prompt-artifact-resolver.d.ts","sourceRoot":"","sources":["../src/prompt-artifact-resolver.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG5E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAUhD,qBAAa,mBAAoB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,YAAY,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,EAIpE;CACJ;AAED,qBAAa,uBAAuB;IAChC,QAAQ,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC;IACxC,QAAQ,CAAC,SAAS,EAAE,SAAS,cAAc,EAAE,CAAC;IAE9C,YAAY,MAAM,EAAE,SAAS,WAAW,EAAE,EAAE,SAAS,EAAE,SAAS,cAAc,EAAE,EAG/E;CACJ;AAED,MAAM,WAAW,qBAAqB;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC;IACxC,QAAQ,CAAC,SAAS,EAAE,SAAS,cAAc,EAAE,CAAC;IAC9C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC9B;AAwLD,wBAAsB,sBAAsB,CACxC,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,qBAAqB,EAC9B,MAAM,EAAE,WAAW,GACpB,OAAO,CAAC,uBAAuB,CAAC,CAmDlC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import { fetch } from "undici";
|
|
3
3
|
import { environmentProxyDispatcher } from "./network/environment-proxy.js";
|
|
4
|
+
import { relayHttpEndpoint, runtimeAuthorization } from "./relay-connection/runtime-authentication.js";
|
|
4
5
|
const ARTIFACT_SCHEME = "mobius-artifact:";
|
|
5
6
|
const ARTIFACT_DOWNLOAD_TIMEOUT_MILLISECONDS = 20_000;
|
|
6
7
|
const MAX_AGENT_IMAGE_BASE64_LENGTH = 4_000_000;
|
|
@@ -65,8 +66,7 @@ function parseReference(resource) {
|
|
|
65
66
|
return new PromptArtifactReference(artifactId, byteLength, sha256, resource);
|
|
66
67
|
}
|
|
67
68
|
function downloadUrl(config, command, reference) {
|
|
68
|
-
const url =
|
|
69
|
-
url.protocol = url.protocol === "wss:" ? "https:" : "http:";
|
|
69
|
+
const url = relayHttpEndpoint(config.relayUrl);
|
|
70
70
|
let channelPath = "";
|
|
71
71
|
if (url.pathname.endsWith("/daemon")) {
|
|
72
72
|
channelPath = url.pathname.slice(0, -"/daemon".length);
|
|
@@ -79,7 +79,6 @@ function downloadUrl(config, command, reference) {
|
|
|
79
79
|
channelPath = `${url.pathname.slice(0, -runtimePath.length)}/channels/${encodeURIComponent(config.channelId)}`;
|
|
80
80
|
}
|
|
81
81
|
url.pathname = `${channelPath}/sessions/${encodeURIComponent(command.sessionId)}/commands/${encodeURIComponent(command.commandId)}/artifacts/${encodeURIComponent(reference.artifactId)}/content`;
|
|
82
|
-
url.searchParams.delete("liveness");
|
|
83
82
|
return url;
|
|
84
83
|
}
|
|
85
84
|
async function responseBytes(response, expectedByteLength, signal) {
|
|
@@ -130,7 +129,11 @@ async function download(config, command, reference, signal) {
|
|
|
130
129
|
try {
|
|
131
130
|
response = await fetch(downloadUrl(config, command, reference), {
|
|
132
131
|
dispatcher: environmentProxyDispatcher,
|
|
133
|
-
headers: {
|
|
132
|
+
headers: {
|
|
133
|
+
accept: reference.resource.mimeType,
|
|
134
|
+
"accept-encoding": "identity",
|
|
135
|
+
...runtimeAuthorization(config.relayUrl),
|
|
136
|
+
},
|
|
134
137
|
signal: requestSignal,
|
|
135
138
|
});
|
|
136
139
|
if (!response.ok) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-artifact-resolver.js","sourceRoot":"","sources":["../src/prompt-artifact-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAG/B,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"prompt-artifact-resolver.js","sourceRoot":"","sources":["../src/prompt-artifact-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../src/relay-connection/connect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../src/relay-connection/connect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAwBnC,wBAAgB,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,CAsF9E"}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import { WebSocket } from "undici";
|
|
2
2
|
import { environmentProxyDispatcher } from "../network/environment-proxy.js";
|
|
3
|
+
import { runtimeAuthorization } from "./runtime-authentication.js";
|
|
3
4
|
const CONNECTION_TIMEOUT_MILLISECONDS = 15_000;
|
|
4
5
|
class RelayConnectionError extends Error {
|
|
5
6
|
code;
|
|
6
|
-
|
|
7
|
+
diagnosticDetails;
|
|
8
|
+
constructor(code, message, diagnosticDetails = {}, options = {}) {
|
|
7
9
|
super(message, options);
|
|
8
10
|
this.code = code;
|
|
11
|
+
this.diagnosticDetails = diagnosticDetails;
|
|
9
12
|
this.name = "RelayConnectionError";
|
|
10
13
|
}
|
|
11
14
|
}
|
|
@@ -13,12 +16,8 @@ export function connectRelay(url, signal) {
|
|
|
13
16
|
signal.throwIfAborted();
|
|
14
17
|
return new Promise((resolve, reject) => {
|
|
15
18
|
const endpoint = new URL(url);
|
|
16
|
-
const headers =
|
|
17
|
-
|
|
18
|
-
const runtimeCredential = endpoint.searchParams.get("token") ?? "";
|
|
19
|
-
endpoint.searchParams.delete("token");
|
|
20
|
-
headers["authorization"] = `Bearer ${runtimeCredential}`;
|
|
21
|
-
}
|
|
19
|
+
const headers = runtimeAuthorization(endpoint);
|
|
20
|
+
endpoint.searchParams.delete("token");
|
|
22
21
|
const socket = new WebSocket(endpoint, {
|
|
23
22
|
dispatcher: environmentProxyDispatcher,
|
|
24
23
|
headers,
|
|
@@ -43,14 +42,18 @@ export function connectRelay(url, signal) {
|
|
|
43
42
|
};
|
|
44
43
|
const onAbort = () => {
|
|
45
44
|
fail(new RelayConnectionError("relay_connection_cancelled", "Relay connection was cancelled", {
|
|
46
|
-
|
|
47
|
-
}));
|
|
45
|
+
cancellation: "requested",
|
|
46
|
+
}, { cause: signal.reason }));
|
|
48
47
|
};
|
|
49
|
-
const onClose = () => {
|
|
50
|
-
fail(new RelayConnectionError("relay_connection_closed", "Relay connection closed before it was ready"
|
|
48
|
+
const onClose = (event) => {
|
|
49
|
+
fail(new RelayConnectionError("relay_connection_closed", "Relay connection closed before it was ready", {
|
|
50
|
+
closeCode: event.code.toString(),
|
|
51
|
+
closeReason: event.reason,
|
|
52
|
+
}));
|
|
51
53
|
};
|
|
52
|
-
const onError = () => {
|
|
53
|
-
|
|
54
|
+
const onError = (event) => {
|
|
55
|
+
const cause = Reflect.get(event, "error");
|
|
56
|
+
fail(new RelayConnectionError("relay_connection_failed", "Relay connection failed", {}, { cause: cause ?? event }));
|
|
54
57
|
};
|
|
55
58
|
const onOpen = () => {
|
|
56
59
|
if (finished) {
|
|
@@ -61,7 +64,9 @@ export function connectRelay(url, signal) {
|
|
|
61
64
|
resolve(socket);
|
|
62
65
|
};
|
|
63
66
|
function onTimeout() {
|
|
64
|
-
fail(new RelayConnectionError("relay_connection_timeout", "Relay connection timed out"
|
|
67
|
+
fail(new RelayConnectionError("relay_connection_timeout", "Relay connection timed out", {
|
|
68
|
+
timeoutMilliseconds: CONNECTION_TIMEOUT_MILLISECONDS.toString(),
|
|
69
|
+
}));
|
|
65
70
|
}
|
|
66
71
|
signal.addEventListener("abort", onAbort, { once: true });
|
|
67
72
|
socket.addEventListener("close", onClose, { once: true });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/relay-connection/connect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEnC,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/relay-connection/connect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { AuditStore } from "../audit/audit-store.ts";
|
|
2
|
+
export declare class RelayConnectionDiagnostics {
|
|
3
|
+
#private;
|
|
4
|
+
constructor(audit: AuditStore, channelId: string, relayUrl: URL);
|
|
5
|
+
readonly catalogFailed: (failure: unknown) => void;
|
|
6
|
+
readonly connectionClosed: (connectionEpoch: number, code: number, reason: string, source: string) => void;
|
|
7
|
+
readonly connectionFailed: (connectionEpoch: number, failure: unknown, source: string) => void;
|
|
8
|
+
readonly connectionOpened: (connectionEpoch: number) => void;
|
|
9
|
+
readonly heartbeatTimedOut: (connectionEpoch: number, heartbeatId: string, timeoutMilliseconds: number) => void;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=diagnostics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../src/relay-connection/diagnostics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAgD1D,qBAAa,0BAA0B;;IAQnC,YAAY,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAK9D;IAED,QAAQ,CAAC,aAAa,YAAa,OAAO,KAAG,IAAI,CAI/C;IAEF,QAAQ,CAAC,gBAAgB,oBAAqB,MAAM,QAAQ,MAAM,UAAU,MAAM,UAAU,MAAM,KAAG,IAAI,CAkBvG;IAEF,QAAQ,CAAC,gBAAgB,oBAAqB,MAAM,WAAW,OAAO,UAAU,MAAM,KAAG,IAAI,CAa3F;IAEF,QAAQ,CAAC,gBAAgB,oBAAqB,MAAM,KAAG,IAAI,CAWzD;IAEF,QAAQ,CAAC,iBAAiB,oBAAqB,MAAM,eAAe,MAAM,uBAAuB,MAAM,KAAG,IAAI,CAa5G;CAqBL"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { describeEnvironmentProxyRoute } from "../network/environment-proxy.js";
|
|
2
|
+
const MAX_DIAGNOSTIC_TEXT_LENGTH = 256;
|
|
3
|
+
function sanitizeDiagnosticText(value) {
|
|
4
|
+
const printable = Array.from(value, (character) => {
|
|
5
|
+
const code = character.charCodeAt(0);
|
|
6
|
+
return code < 32 || code === 127 ? " " : character;
|
|
7
|
+
}).join("");
|
|
8
|
+
const withoutSecrets = printable
|
|
9
|
+
.replace(/([?&](?:access_token|authorization|credential|key|secret|token)=)[^&\s]*/giu, "$1[redacted]")
|
|
10
|
+
.replace(/(?:https?|wss?):\/\/[^\s)]+/giu, (encodedUrl) => {
|
|
11
|
+
try {
|
|
12
|
+
return new URL(encodedUrl).origin;
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return "[redacted-url]";
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
return withoutSecrets.slice(0, MAX_DIAGNOSTIC_TEXT_LENGTH);
|
|
19
|
+
}
|
|
20
|
+
function addFailureDetails(details, failure) {
|
|
21
|
+
let current = failure;
|
|
22
|
+
for (let depth = 0; depth < 3 && current instanceof Error; depth += 1) {
|
|
23
|
+
const prefix = depth === 0 ? "failure" : `cause${depth.toString()}`;
|
|
24
|
+
details[`${prefix}Name`] = current.name;
|
|
25
|
+
details[`${prefix}Message`] = sanitizeDiagnosticText(current.message);
|
|
26
|
+
const code = Reflect.get(current, "code");
|
|
27
|
+
if (typeof code === "string" || typeof code === "number") {
|
|
28
|
+
details[`${prefix}Code`] = String(code);
|
|
29
|
+
}
|
|
30
|
+
const statusCode = Reflect.get(current, "statusCode");
|
|
31
|
+
if (typeof statusCode === "string" || typeof statusCode === "number") {
|
|
32
|
+
details[`${prefix}StatusCode`] = String(statusCode);
|
|
33
|
+
}
|
|
34
|
+
const diagnosticDetails = Reflect.get(current, "diagnosticDetails");
|
|
35
|
+
if (typeof diagnosticDetails === "object" && diagnosticDetails !== null) {
|
|
36
|
+
for (const [key, value] of Object.entries(diagnosticDetails)) {
|
|
37
|
+
if (typeof value === "string") {
|
|
38
|
+
details[key] = sanitizeDiagnosticText(value);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
current = current.cause;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export class RelayConnectionDiagnostics {
|
|
46
|
+
#audit;
|
|
47
|
+
#channelId;
|
|
48
|
+
#lastClosedEpoch = 0;
|
|
49
|
+
#lastFailedEpoch = 0;
|
|
50
|
+
#relayOrigin;
|
|
51
|
+
#route;
|
|
52
|
+
constructor(audit, channelId, relayUrl) {
|
|
53
|
+
this.#audit = audit;
|
|
54
|
+
this.#channelId = channelId;
|
|
55
|
+
this.#relayOrigin = relayUrl.origin;
|
|
56
|
+
this.#route = describeEnvironmentProxyRoute(relayUrl);
|
|
57
|
+
}
|
|
58
|
+
catalogFailed = (failure) => {
|
|
59
|
+
const details = { ...this.#route, relayOrigin: this.#relayOrigin };
|
|
60
|
+
addFailureDetails(details, failure);
|
|
61
|
+
this.#record("agent_catalog_publish_failed", "catalog", details, true);
|
|
62
|
+
};
|
|
63
|
+
connectionClosed = (connectionEpoch, code, reason, source) => {
|
|
64
|
+
if (this.#lastClosedEpoch === connectionEpoch) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
this.#lastClosedEpoch = connectionEpoch;
|
|
68
|
+
this.#record("relay_connection_closed", connectionEpoch.toString(), {
|
|
69
|
+
closeCode: code.toString(),
|
|
70
|
+
closeReason: sanitizeDiagnosticText(reason),
|
|
71
|
+
connectionEpoch: connectionEpoch.toString(),
|
|
72
|
+
relayOrigin: this.#relayOrigin,
|
|
73
|
+
source,
|
|
74
|
+
...this.#route,
|
|
75
|
+
}, true);
|
|
76
|
+
};
|
|
77
|
+
connectionFailed = (connectionEpoch, failure, source) => {
|
|
78
|
+
if (this.#lastFailedEpoch === connectionEpoch) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
this.#lastFailedEpoch = connectionEpoch;
|
|
82
|
+
const details = {
|
|
83
|
+
connectionEpoch: connectionEpoch.toString(),
|
|
84
|
+
relayOrigin: this.#relayOrigin,
|
|
85
|
+
source,
|
|
86
|
+
...this.#route,
|
|
87
|
+
};
|
|
88
|
+
addFailureDetails(details, failure);
|
|
89
|
+
this.#record("relay_connection_failed", connectionEpoch.toString(), details, true);
|
|
90
|
+
};
|
|
91
|
+
connectionOpened = (connectionEpoch) => {
|
|
92
|
+
this.#record("relay_connection_opened", connectionEpoch.toString(), {
|
|
93
|
+
connectionEpoch: connectionEpoch.toString(),
|
|
94
|
+
relayOrigin: this.#relayOrigin,
|
|
95
|
+
...this.#route,
|
|
96
|
+
}, false);
|
|
97
|
+
};
|
|
98
|
+
heartbeatTimedOut = (connectionEpoch, heartbeatId, timeoutMilliseconds) => {
|
|
99
|
+
this.#record("relay_heartbeat_timed_out", connectionEpoch.toString(), {
|
|
100
|
+
connectionEpoch: connectionEpoch.toString(),
|
|
101
|
+
heartbeatId,
|
|
102
|
+
relayOrigin: this.#relayOrigin,
|
|
103
|
+
timeoutMilliseconds: timeoutMilliseconds.toString(),
|
|
104
|
+
...this.#route,
|
|
105
|
+
}, true);
|
|
106
|
+
};
|
|
107
|
+
#record = (event, commandId, details, warning) => {
|
|
108
|
+
this.#audit.record({
|
|
109
|
+
commandId,
|
|
110
|
+
details,
|
|
111
|
+
event,
|
|
112
|
+
sessionId: this.#channelId,
|
|
113
|
+
});
|
|
114
|
+
const encoded = JSON.stringify({ channelId: this.#channelId, event, ...details });
|
|
115
|
+
if (warning) {
|
|
116
|
+
process.stderr.write(`Mobius relay diagnostic ${encoded}\n`);
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
process.stdout.write(`Mobius relay diagnostic ${encoded}\n`);
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=diagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/relay-connection/diagnostics.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAEhF,MAAM,0BAA0B,GAAG,GAAG,CAAC;AAEvC,SAAS,sBAAsB,CAAC,KAAa;IACzC,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,EAAE;QAC9C,MAAM,IAAI,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACrC,OAAO,IAAI,GAAG,EAAE,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;IACvD,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,MAAM,cAAc,GAAG,SAAS;SAC3B,OAAO,CAAC,6EAA6E,EAAE,cAAc,CAAC;SACtG,OAAO,CAAC,gCAAgC,EAAE,CAAC,UAAU,EAAE,EAAE;QACtD,IAAI,CAAC;YACD,OAAO,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,gBAAgB,CAAC;QAC5B,CAAC;IACL,CAAC,CAAC,CAAC;IACP,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,0BAA0B,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,iBAAiB,CAAC,OAA+B,EAAE,OAAgB;IACxE,IAAI,OAAO,GAAG,OAAO,CAAC;IACtB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,IAAI,OAAO,YAAY,KAAK,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpE,MAAM,MAAM,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC;QACpE,OAAO,CAAC,GAAG,MAAM,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;QACxC,OAAO,CAAC,GAAG,MAAM,SAAS,CAAC,GAAG,sBAAsB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACtE,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1C,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,OAAO,CAAC,GAAG,MAAM,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC5C,CAAC;QACD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACtD,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;YACnE,OAAO,CAAC,GAAG,MAAM,YAAY,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;QACxD,CAAC;QACD,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;QACpE,IAAI,OAAO,iBAAiB,KAAK,QAAQ,IAAI,iBAAiB,KAAK,IAAI,EAAE,CAAC;YACtE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBAC3D,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;oBAC5B,OAAO,CAAC,GAAG,CAAC,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;gBACjD,CAAC;YACL,CAAC;QACL,CAAC;QACD,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC;IAC5B,CAAC;AACL,CAAC;AAED,MAAM,OAAO,0BAA0B;IAC1B,MAAM,CAAa;IACnB,UAAU,CAAS;IAC5B,gBAAgB,GAAG,CAAC,CAAC;IACrB,gBAAgB,GAAG,CAAC,CAAC;IACZ,YAAY,CAAS;IACrB,MAAM,CAAmC;IAElD,YAAY,KAAiB,EAAE,SAAiB,EAAE,QAAa;QAC3D,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC;QACpC,IAAI,CAAC,MAAM,GAAG,6BAA6B,CAAC,QAAQ,CAAC,CAAC;IAC1D,CAAC;IAEQ,aAAa,GAAG,CAAC,OAAgB,EAAQ,EAAE;QAChD,MAAM,OAAO,GAA2B,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3F,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO,CAAC,8BAA8B,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IAC3E,CAAC,CAAC;IAEO,gBAAgB,GAAG,CAAC,eAAuB,EAAE,IAAY,EAAE,MAAc,EAAE,MAAc,EAAQ,EAAE;QACxG,IAAI,IAAI,CAAC,gBAAgB,KAAK,eAAe,EAAE,CAAC;YAC5C,OAAO;QACX,CAAC;QACD,IAAI,CAAC,gBAAgB,GAAG,eAAe,CAAC;QACxC,IAAI,CAAC,OAAO,CACR,yBAAyB,EACzB,eAAe,CAAC,QAAQ,EAAE,EAC1B;YACI,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE;YAC1B,WAAW,EAAE,sBAAsB,CAAC,MAAM,CAAC;YAC3C,eAAe,EAAE,eAAe,CAAC,QAAQ,EAAE;YAC3C,WAAW,EAAE,IAAI,CAAC,YAAY;YAC9B,MAAM;YACN,GAAG,IAAI,CAAC,MAAM;SACjB,EACD,IAAI,CACP,CAAC;IACN,CAAC,CAAC;IAEO,gBAAgB,GAAG,CAAC,eAAuB,EAAE,OAAgB,EAAE,MAAc,EAAQ,EAAE;QAC5F,IAAI,IAAI,CAAC,gBAAgB,KAAK,eAAe,EAAE,CAAC;YAC5C,OAAO;QACX,CAAC;QACD,IAAI,CAAC,gBAAgB,GAAG,eAAe,CAAC;QACxC,MAAM,OAAO,GAA2B;YACpC,eAAe,EAAE,eAAe,CAAC,QAAQ,EAAE;YAC3C,WAAW,EAAE,IAAI,CAAC,YAAY;YAC9B,MAAM;YACN,GAAG,IAAI,CAAC,MAAM;SACjB,CAAC;QACF,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO,CAAC,yBAAyB,EAAE,eAAe,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IACvF,CAAC,CAAC;IAEO,gBAAgB,GAAG,CAAC,eAAuB,EAAQ,EAAE;QAC1D,IAAI,CAAC,OAAO,CACR,yBAAyB,EACzB,eAAe,CAAC,QAAQ,EAAE,EAC1B;YACI,eAAe,EAAE,eAAe,CAAC,QAAQ,EAAE;YAC3C,WAAW,EAAE,IAAI,CAAC,YAAY;YAC9B,GAAG,IAAI,CAAC,MAAM;SACjB,EACD,KAAK,CACR,CAAC;IACN,CAAC,CAAC;IAEO,iBAAiB,GAAG,CAAC,eAAuB,EAAE,WAAmB,EAAE,mBAA2B,EAAQ,EAAE;QAC7G,IAAI,CAAC,OAAO,CACR,2BAA2B,EAC3B,eAAe,CAAC,QAAQ,EAAE,EAC1B;YACI,eAAe,EAAE,eAAe,CAAC,QAAQ,EAAE;YAC3C,WAAW;YACX,WAAW,EAAE,IAAI,CAAC,YAAY;YAC9B,mBAAmB,EAAE,mBAAmB,CAAC,QAAQ,EAAE;YACnD,GAAG,IAAI,CAAC,MAAM;SACjB,EACD,IAAI,CACP,CAAC;IACN,CAAC,CAAC;IAEO,OAAO,GAAG,CACf,KAAa,EACb,SAAiB,EACjB,OAAyC,EACzC,OAAgB,EACZ,EAAE;QACN,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;YACf,SAAS;YACT,OAAO;YACP,KAAK;YACL,SAAS,EAAE,IAAI,CAAC,UAAU;SAC7B,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;QAClF,IAAI,OAAO,EAAE,CAAC;YACV,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,OAAO,IAAI,CAAC,CAAC;YAC7D,OAAO;QACX,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,OAAO,IAAI,CAAC,CAAC;IACjE,CAAC,CAAC;CACL"}
|
|
@@ -2,7 +2,7 @@ import { type RuntimeHeartbeatAckEvent } from "@moxt-ai/mobius-protocol";
|
|
|
2
2
|
import type { DaemonTimer } from "./timer.ts";
|
|
3
3
|
export interface RelayLivenessTransport {
|
|
4
4
|
readonly send: (message: string) => void;
|
|
5
|
-
readonly unresponsive: () => void;
|
|
5
|
+
readonly unresponsive: (heartbeatId: string, timeoutMilliseconds: number) => void;
|
|
6
6
|
}
|
|
7
7
|
export declare class RelayConnectionLiveness {
|
|
8
8
|
#private;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"liveness.d.ts","sourceRoot":"","sources":["../../src/relay-connection/liveness.ts"],"names":[],"mappings":"AAEA,OAAO,EAGH,KAAK,wBAAwB,EAChC,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAuB,WAAW,EAAE,MAAM,YAAY,CAAC;AA+BnE,MAAM,WAAW,sBAAsB;IACnC,QAAQ,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,QAAQ,CAAC,YAAY,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"liveness.d.ts","sourceRoot":"","sources":["../../src/relay-connection/liveness.ts"],"names":[],"mappings":"AAEA,OAAO,EAGH,KAAK,wBAAwB,EAChC,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAuB,WAAW,EAAE,MAAM,YAAY,CAAC;AA+BnE,MAAM,WAAW,sBAAsB;IACnC,QAAQ,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,QAAQ,CAAC,YAAY,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,KAAK,IAAI,CAAC;CACrF;AAED,qBAAa,uBAAuB;;IAKhC,YAAY,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,sBAAsB,EAGhE;IAED,QAAQ,CAAC,WAAW,UAAW,wBAAwB,KAAG,IAAI,CAW5D;IAEF,QAAQ,CAAC,KAAK,QAAO,IAAI,CAYvB;IAEF,QAAQ,CAAC,KAAK,QAAO,IAAI,CAYvB;CAoCL"}
|
|
@@ -75,9 +75,10 @@ export class RelayConnectionLiveness {
|
|
|
75
75
|
if (!(this.#state instanceof AwaitingHeartbeatAckState)) {
|
|
76
76
|
throw new Error("Heartbeat timeout occurred in an invalid state");
|
|
77
77
|
}
|
|
78
|
+
const heartbeatId = this.#state.heartbeatId;
|
|
78
79
|
this.#state.timeout.cancel();
|
|
79
80
|
this.#state = new FinishedRelayLivenessState();
|
|
80
|
-
this.#transport.unresponsive();
|
|
81
|
+
this.#transport.unresponsive(heartbeatId, HEARTBEAT_ACK_TIMEOUT_MILLISECONDS);
|
|
81
82
|
};
|
|
82
83
|
#sendHeartbeat = () => {
|
|
83
84
|
if (this.#state instanceof WaitingForHeartbeatState) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"liveness.js","sourceRoot":"","sources":["../../src/relay-connection/liveness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EACH,2BAA2B,EAC3B,sBAAsB,GAEzB,MAAM,0BAA0B,CAAC;AAIlC,MAAM,kCAAkC,GAAG,MAAM,CAAC;AAClD,MAAM,+BAA+B,GAAG,MAAM,CAAC;AAE/C,MAAe,kBAAkB;CAAG;AAEpC,MAAM,6BAA8B,SAAQ,kBAAkB;CAAG;AAEjE,MAAM,yBAA0B,SAAQ,kBAAkB;IAC7C,WAAW,CAAS;IACpB,OAAO,CAAsB;IAEtC,YAAY,WAAmB,EAAE,OAA4B;QACzD,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3B,CAAC;CACJ;AAED,MAAM,wBAAyB,SAAQ,kBAAkB;IAC5C,QAAQ,CAAsB;IAEvC,YAAY,QAA6B;QACrC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC7B,CAAC;CACJ;AAED,MAAM,0BAA2B,SAAQ,kBAAkB;CAAG;AAO9D,MAAM,OAAO,uBAAuB;IACvB,MAAM,CAAc;IACpB,UAAU,CAAyB;IAC5C,MAAM,GAAuB,IAAI,6BAA6B,EAAE,CAAC;IAEjE,YAAY,KAAkB,EAAE,SAAiC;QAC7D,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;IAChC,CAAC;IAEQ,WAAW,GAAG,CAAC,KAA+B,EAAQ,EAAE;QAC7D,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,YAAY,yBAAyB,CAAC,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAClE,CAAC;QACD,IAAI,KAAK,CAAC,WAAW,KAAK,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;YAChD,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QAC7B,IAAI,CAAC,MAAM,GAAG,IAAI,wBAAwB,CACtC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,+BAA+B,CAAC,CAC7E,CAAC;IACN,CAAC,CAAC;IAEO,KAAK,GAAG,GAAS,EAAE;QACxB,IAAI,IAAI,CAAC,MAAM,YAAY,yBAAyB,EAAE,CAAC;YACnD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACjC,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,YAAY,wBAAwB,EAAE,CAAC;YACzD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QAClC,CAAC;aAAM,IACH,CAAC,CAAC,IAAI,CAAC,MAAM,YAAY,6BAA6B,CAAC;YACvD,CAAC,CAAC,IAAI,CAAC,MAAM,YAAY,0BAA0B,CAAC,EACtD,CAAC;YACC,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QACpD,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,0BAA0B,EAAE,CAAC;IACnD,CAAC,CAAC;IAEO,KAAK,GAAG,GAAS,EAAE;QACxB,IAAI,IAAI,CAAC,MAAM,YAAY,6BAA6B,EAAE,CAAC;YACvD,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,OAAO;QACX,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,YAAY,yBAAyB,IAAI,IAAI,CAAC,MAAM,YAAY,wBAAwB,EAAE,CAAC;YACtG,OAAO;QACX,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,YAAY,0BAA0B,EAAE,CAAC;YACpD,OAAO;QACX,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IACpD,CAAC,CAAC;IAEO,cAAc,GAAG,GAAS,EAAE;QACjC,IAAI,IAAI,CAAC,MAAM,YAAY,0BAA0B,EAAE,CAAC;YACpD,OAAO;QACX,CAAC;QACD,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,YAAY,yBAAyB,CAAC,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACtE,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QAC7B,IAAI,CAAC,MAAM,GAAG,IAAI,0BAA0B,EAAE,CAAC;QAC/C,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"liveness.js","sourceRoot":"","sources":["../../src/relay-connection/liveness.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-authentication.d.ts","sourceRoot":"","sources":["../../src/relay-connection/runtime-authentication.ts"],"names":[],"mappings":"AAIA,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAGpF;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,GAAG,GAAG,GAAG,CAKpD"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
function runtimeCredential(relayUrl) {
|
|
2
|
+
return relayUrl.searchParams.get("token") ?? "";
|
|
3
|
+
}
|
|
4
|
+
export function runtimeAuthorization(relayUrl) {
|
|
5
|
+
const credential = runtimeCredential(relayUrl);
|
|
6
|
+
return credential.length === 0 ? {} : { authorization: `Bearer ${credential}` };
|
|
7
|
+
}
|
|
8
|
+
export function relayHttpEndpoint(relayUrl) {
|
|
9
|
+
const endpoint = new URL(relayUrl);
|
|
10
|
+
endpoint.protocol = endpoint.protocol === "wss:" ? "https:" : "http:";
|
|
11
|
+
endpoint.search = "";
|
|
12
|
+
return endpoint;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=runtime-authentication.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-authentication.js","sourceRoot":"","sources":["../../src/relay-connection/runtime-authentication.ts"],"names":[],"mappings":"AAAA,SAAS,iBAAiB,CAAC,QAAa;IACpC,OAAO,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,QAAa;IAC9C,MAAM,UAAU,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC/C,OAAO,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,UAAU,EAAE,EAAE,CAAC;AACpF,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,QAAa;IAC3C,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;IACnC,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;IACtE,QAAQ,CAAC,MAAM,GAAG,EAAE,CAAC;IACrB,OAAO,QAAQ,CAAC;AACpB,CAAC"}
|
|
@@ -1,4 +1,28 @@
|
|
|
1
|
-
import { type SessionEventAcknowledgement, type SessionEventRejection } from "@moxt-ai/mobius-protocol";
|
|
1
|
+
import { type RuntimeDelivery, type SessionEventAcknowledgement, type SessionEventRejection } from "@moxt-ai/mobius-protocol";
|
|
2
|
+
export interface SessionEventOutboxLimits {
|
|
3
|
+
readonly criticalEventBytes: number;
|
|
4
|
+
readonly criticalEventCount: number;
|
|
5
|
+
readonly runtimeDeliveryBytes: number;
|
|
6
|
+
readonly runtimeDeliveryCount: number;
|
|
7
|
+
readonly standardEventBytes: number;
|
|
8
|
+
readonly standardEventCount: number;
|
|
9
|
+
}
|
|
10
|
+
export declare class SessionEventOutboxCapacityError extends Error {
|
|
11
|
+
readonly code = "session_event_outbox_full";
|
|
12
|
+
constructor();
|
|
13
|
+
}
|
|
14
|
+
export declare class RuntimeDeliveryInboxCapacityError extends Error {
|
|
15
|
+
readonly code = "runtime_delivery_inbox_full";
|
|
16
|
+
constructor();
|
|
17
|
+
}
|
|
18
|
+
export declare class StoredRuntimeDelivery {
|
|
19
|
+
readonly deliveryId: string;
|
|
20
|
+
readonly duplicate: boolean;
|
|
21
|
+
readonly payload: string;
|
|
22
|
+
readonly sessionId: string;
|
|
23
|
+
readonly state: string;
|
|
24
|
+
constructor(deliveryId: string, sessionId: string, payload: string, state: string, duplicate: boolean);
|
|
25
|
+
}
|
|
2
26
|
export type DaemonExecutionState = "cancelled" | "dispatching" | "failed" | "running" | "succeeded";
|
|
3
27
|
export type DaemonExecutionReceipt = Readonly<{
|
|
4
28
|
attemptId: string;
|
|
@@ -8,14 +32,21 @@ export type DaemonExecutionReceipt = Readonly<{
|
|
|
8
32
|
}>;
|
|
9
33
|
export declare class SessionEventOutbox {
|
|
10
34
|
#private;
|
|
11
|
-
constructor(path: string);
|
|
35
|
+
constructor(path: string, limits?: SessionEventOutboxLimits);
|
|
12
36
|
readonly claimExecution: (commandId: string, sessionId: string, commandJson: string) => DaemonExecutionReceipt;
|
|
13
37
|
readonly transitionExecution: (commandId: string, state: DaemonExecutionState) => void;
|
|
14
38
|
readonly isTerminalExecution: (commandId: string, sessionId: string) => boolean;
|
|
15
|
-
readonly acknowledge: (acknowledgement: SessionEventAcknowledgement) =>
|
|
39
|
+
readonly acknowledge: (acknowledgement: SessionEventAcknowledgement) => boolean;
|
|
16
40
|
readonly quarantine: (rejection: SessionEventRejection) => boolean;
|
|
17
41
|
readonly close: () => void;
|
|
18
42
|
readonly enqueue: (sessionId: string, payload: string, attemptId?: string | null) => string;
|
|
43
|
+
readonly enqueueCritical: (sessionId: string, payload: string, attemptId?: string) => string;
|
|
44
|
+
readonly claimRuntimeDelivery: (delivery: RuntimeDelivery) => StoredRuntimeDelivery;
|
|
45
|
+
readonly markRuntimeDeliveryCommitted: (deliveryId: string, sessionId: string) => boolean;
|
|
46
|
+
readonly markRuntimeDeliveryProcessed: (deliveryId: string, sessionId: string) => boolean;
|
|
47
|
+
readonly runtimeDeliveries: () => readonly StoredRuntimeDelivery[];
|
|
19
48
|
readonly pending: () => readonly string[];
|
|
49
|
+
readonly pendingBatch: (limit: number) => readonly string[];
|
|
50
|
+
readonly pendingSourceHeads: (limit: number, excludedEventIds: readonly string[], excludedSourceKeys: readonly string[]) => readonly string[];
|
|
20
51
|
}
|
|
21
52
|
//# sourceMappingURL=session-event-outbox.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-event-outbox.d.ts","sourceRoot":"","sources":["../../src/relay-connection/session-event-outbox.ts"],"names":[],"mappings":"AAIA,OAAO,
|
|
1
|
+
{"version":3,"file":"session-event-outbox.d.ts","sourceRoot":"","sources":["../../src/relay-connection/session-event-outbox.ts"],"names":[],"mappings":"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"}
|