@uncensoredcode/openbridge 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +117 -0
- package/bin/openbridge.js +10 -0
- package/package.json +85 -0
- package/packages/cli/dist/args.d.ts +30 -0
- package/packages/cli/dist/args.js +160 -0
- package/packages/cli/dist/cli.d.ts +2 -0
- package/packages/cli/dist/cli.js +9 -0
- package/packages/cli/dist/index.d.ts +26 -0
- package/packages/cli/dist/index.js +76 -0
- package/packages/runtime/dist/assistant-protocol.d.ts +34 -0
- package/packages/runtime/dist/assistant-protocol.js +121 -0
- package/packages/runtime/dist/execution/in-process.d.ts +14 -0
- package/packages/runtime/dist/execution/in-process.js +45 -0
- package/packages/runtime/dist/execution/types.d.ts +49 -0
- package/packages/runtime/dist/execution/types.js +20 -0
- package/packages/runtime/dist/index.d.ts +86 -0
- package/packages/runtime/dist/index.js +60 -0
- package/packages/runtime/dist/normalizers/index.d.ts +6 -0
- package/packages/runtime/dist/normalizers/index.js +12 -0
- package/packages/runtime/dist/normalizers/legacy-packet.d.ts +6 -0
- package/packages/runtime/dist/normalizers/legacy-packet.js +131 -0
- package/packages/runtime/dist/output-sanitizer.d.ts +23 -0
- package/packages/runtime/dist/output-sanitizer.js +78 -0
- package/packages/runtime/dist/packet-extractor.d.ts +17 -0
- package/packages/runtime/dist/packet-extractor.js +43 -0
- package/packages/runtime/dist/packet-normalizer.d.ts +21 -0
- package/packages/runtime/dist/packet-normalizer.js +47 -0
- package/packages/runtime/dist/prompt-compiler.d.ts +28 -0
- package/packages/runtime/dist/prompt-compiler.js +301 -0
- package/packages/runtime/dist/protocol.d.ts +44 -0
- package/packages/runtime/dist/protocol.js +165 -0
- package/packages/runtime/dist/provider-failure.d.ts +52 -0
- package/packages/runtime/dist/provider-failure.js +236 -0
- package/packages/runtime/dist/provider.d.ts +40 -0
- package/packages/runtime/dist/provider.js +1 -0
- package/packages/runtime/dist/runtime.d.ts +86 -0
- package/packages/runtime/dist/runtime.js +462 -0
- package/packages/runtime/dist/session-bound-provider.d.ts +52 -0
- package/packages/runtime/dist/session-bound-provider.js +366 -0
- package/packages/runtime/dist/tool-name-aliases.d.ts +5 -0
- package/packages/runtime/dist/tool-name-aliases.js +13 -0
- package/packages/runtime/dist/tools/bash.d.ts +9 -0
- package/packages/runtime/dist/tools/bash.js +157 -0
- package/packages/runtime/dist/tools/edit.d.ts +9 -0
- package/packages/runtime/dist/tools/edit.js +94 -0
- package/packages/runtime/dist/tools/index.d.ts +39 -0
- package/packages/runtime/dist/tools/index.js +27 -0
- package/packages/runtime/dist/tools/list-dir.d.ts +9 -0
- package/packages/runtime/dist/tools/list-dir.js +127 -0
- package/packages/runtime/dist/tools/read.d.ts +9 -0
- package/packages/runtime/dist/tools/read.js +56 -0
- package/packages/runtime/dist/tools/registry.d.ts +15 -0
- package/packages/runtime/dist/tools/registry.js +38 -0
- package/packages/runtime/dist/tools/runtime-path.d.ts +7 -0
- package/packages/runtime/dist/tools/runtime-path.js +22 -0
- package/packages/runtime/dist/tools/search-files.d.ts +9 -0
- package/packages/runtime/dist/tools/search-files.js +149 -0
- package/packages/runtime/dist/tools/text-file.d.ts +32 -0
- package/packages/runtime/dist/tools/text-file.js +101 -0
- package/packages/runtime/dist/tools/workspace-path.d.ts +17 -0
- package/packages/runtime/dist/tools/workspace-path.js +70 -0
- package/packages/runtime/dist/tools/write.d.ts +9 -0
- package/packages/runtime/dist/tools/write.js +59 -0
- package/packages/server/dist/bridge/bridge-model-catalog.d.ts +56 -0
- package/packages/server/dist/bridge/bridge-model-catalog.js +100 -0
- package/packages/server/dist/bridge/bridge-runtime-service.d.ts +61 -0
- package/packages/server/dist/bridge/bridge-runtime-service.js +1386 -0
- package/packages/server/dist/bridge/chat-completions/chat-completion-service.d.ts +127 -0
- package/packages/server/dist/bridge/chat-completions/chat-completion-service.js +1026 -0
- package/packages/server/dist/bridge/index.d.ts +335 -0
- package/packages/server/dist/bridge/index.js +45 -0
- package/packages/server/dist/bridge/live-provider-extraction-canary.d.ts +69 -0
- package/packages/server/dist/bridge/live-provider-extraction-canary.js +186 -0
- package/packages/server/dist/bridge/providers/generic-provider-transport.d.ts +53 -0
- package/packages/server/dist/bridge/providers/generic-provider-transport.js +973 -0
- package/packages/server/dist/bridge/providers/provider-session-resolver.d.ts +17 -0
- package/packages/server/dist/bridge/providers/provider-session-resolver.js +95 -0
- package/packages/server/dist/bridge/providers/provider-streams.d.ts +80 -0
- package/packages/server/dist/bridge/providers/provider-streams.js +844 -0
- package/packages/server/dist/bridge/providers/provider-transport-profile.d.ts +194 -0
- package/packages/server/dist/bridge/providers/provider-transport-profile.js +198 -0
- package/packages/server/dist/bridge/providers/web-provider-transport.d.ts +30 -0
- package/packages/server/dist/bridge/providers/web-provider-transport.js +151 -0
- package/packages/server/dist/bridge/state/file-bridge-state-store.d.ts +36 -0
- package/packages/server/dist/bridge/state/file-bridge-state-store.js +164 -0
- package/packages/server/dist/bridge/stores/local-session-package-store.d.ts +23 -0
- package/packages/server/dist/bridge/stores/local-session-package-store.js +548 -0
- package/packages/server/dist/bridge/stores/provider-store.d.ts +94 -0
- package/packages/server/dist/bridge/stores/provider-store.js +143 -0
- package/packages/server/dist/bridge/stores/session-backed-provider-store.d.ts +7 -0
- package/packages/server/dist/bridge/stores/session-backed-provider-store.js +26 -0
- package/packages/server/dist/bridge/stores/session-package-store.d.ts +286 -0
- package/packages/server/dist/bridge/stores/session-package-store.js +1527 -0
- package/packages/server/dist/bridge/stores/session-store.d.ts +120 -0
- package/packages/server/dist/bridge/stores/session-store.js +139 -0
- package/packages/server/dist/cli/index.d.ts +9 -0
- package/packages/server/dist/cli/index.js +6 -0
- package/packages/server/dist/cli/main.d.ts +2 -0
- package/packages/server/dist/cli/main.js +9 -0
- package/packages/server/dist/cli/run-bridge-server-cli.d.ts +54 -0
- package/packages/server/dist/cli/run-bridge-server-cli.js +371 -0
- package/packages/server/dist/client/bridge-api-client.d.ts +61 -0
- package/packages/server/dist/client/bridge-api-client.js +267 -0
- package/packages/server/dist/client/index.d.ts +11 -0
- package/packages/server/dist/client/index.js +11 -0
- package/packages/server/dist/config/bridge-server-config.d.ts +52 -0
- package/packages/server/dist/config/bridge-server-config.js +118 -0
- package/packages/server/dist/config/index.d.ts +20 -0
- package/packages/server/dist/config/index.js +8 -0
- package/packages/server/dist/http/bridge-api-route-context.d.ts +14 -0
- package/packages/server/dist/http/bridge-api-route-context.js +1 -0
- package/packages/server/dist/http/create-bridge-api-server.d.ts +72 -0
- package/packages/server/dist/http/create-bridge-api-server.js +225 -0
- package/packages/server/dist/http/index.d.ts +5 -0
- package/packages/server/dist/http/index.js +5 -0
- package/packages/server/dist/http/parse-request.d.ts +6 -0
- package/packages/server/dist/http/parse-request.js +27 -0
- package/packages/server/dist/http/register-bridge-api-routes.d.ts +7 -0
- package/packages/server/dist/http/register-bridge-api-routes.js +17 -0
- package/packages/server/dist/http/routes/admin-routes.d.ts +7 -0
- package/packages/server/dist/http/routes/admin-routes.js +135 -0
- package/packages/server/dist/http/routes/chat-completions-route.d.ts +7 -0
- package/packages/server/dist/http/routes/chat-completions-route.js +49 -0
- package/packages/server/dist/http/routes/health-routes.d.ts +6 -0
- package/packages/server/dist/http/routes/health-routes.js +7 -0
- package/packages/server/dist/http/routes/message-routes.d.ts +7 -0
- package/packages/server/dist/http/routes/message-routes.js +7 -0
- package/packages/server/dist/index.d.ts +85 -0
- package/packages/server/dist/index.js +28 -0
- package/packages/server/dist/security/bridge-auth.d.ts +9 -0
- package/packages/server/dist/security/bridge-auth.js +41 -0
- package/packages/server/dist/security/cors-policy.d.ts +5 -0
- package/packages/server/dist/security/cors-policy.js +34 -0
- package/packages/server/dist/security/index.d.ts +16 -0
- package/packages/server/dist/security/index.js +12 -0
- package/packages/server/dist/security/redact-sensitive-values.d.ts +19 -0
- package/packages/server/dist/security/redact-sensitive-values.js +67 -0
- package/packages/server/dist/shared/api-schema.d.ts +133 -0
- package/packages/server/dist/shared/api-schema.js +1 -0
- package/packages/server/dist/shared/bridge-api-error.d.ts +17 -0
- package/packages/server/dist/shared/bridge-api-error.js +19 -0
- package/packages/server/dist/shared/index.d.ts +7 -0
- package/packages/server/dist/shared/index.js +7 -0
- package/packages/server/dist/shared/output.d.ts +5 -0
- package/packages/server/dist/shared/output.js +14 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const clientModule: {
|
|
2
|
+
BridgeApiHttpError: typeof import("./bridge-api-client.ts").BridgeApiHttpError;
|
|
3
|
+
buildHealthUrl: (baseUrl: string) => string;
|
|
4
|
+
buildSessionMessageUrl: (baseUrl: string, sessionId: string) => string;
|
|
5
|
+
checkBridgeHealth: (input: import("./bridge-api-client.ts").CheckBridgeHealthInput) => Promise<import("../index.ts").BridgeHealthResponse>;
|
|
6
|
+
createBridgeChatCompletion: (input: import("./bridge-api-client.ts").CreateBridgeChatCompletionInput) => Promise<import("../index.ts").BridgeChatCompletionResponse>;
|
|
7
|
+
DEFAULT_BRIDGE_API_BASE_URL: string;
|
|
8
|
+
sendBridgeMessage: (input: import("./bridge-api-client.ts").SendBridgeMessageInput) => Promise<import("../index.ts").BridgeMessageResponse>;
|
|
9
|
+
streamBridgeChatCompletion: (input: import("./bridge-api-client.ts").StreamBridgeChatCompletionInput) => Promise<AsyncIterable<string>>;
|
|
10
|
+
};
|
|
11
|
+
export type { BridgeApiClientFetch, BridgeApiHttpError, CheckBridgeHealthInput, CreateBridgeChatCompletionInput, SendBridgeMessageInput, StreamBridgeChatCompletionInput } from "./bridge-api-client.ts";
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { bridgeApiClientModule } from "./bridge-api-client.js";
|
|
2
|
+
export const clientModule = {
|
|
3
|
+
BridgeApiHttpError: bridgeApiClientModule.BridgeApiHttpError,
|
|
4
|
+
buildHealthUrl: bridgeApiClientModule.buildHealthUrl,
|
|
5
|
+
buildSessionMessageUrl: bridgeApiClientModule.buildSessionMessageUrl,
|
|
6
|
+
checkBridgeHealth: bridgeApiClientModule.checkBridgeHealth,
|
|
7
|
+
createBridgeChatCompletion: bridgeApiClientModule.createBridgeChatCompletion,
|
|
8
|
+
DEFAULT_BRIDGE_API_BASE_URL: bridgeApiClientModule.DEFAULT_BRIDGE_API_BASE_URL,
|
|
9
|
+
sendBridgeMessage: bridgeApiClientModule.sendBridgeMessage,
|
|
10
|
+
streamBridgeChatCompletion: bridgeApiClientModule.streamBridgeChatCompletion
|
|
11
|
+
};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
declare const bridgeServerConfigSchema: z.ZodObject<{
|
|
3
|
+
host: z.ZodString;
|
|
4
|
+
port: z.ZodCoercedNumber<unknown>;
|
|
5
|
+
stateRoot: z.ZodString;
|
|
6
|
+
runtimeRoot: z.ZodString;
|
|
7
|
+
sessionVaultPath: z.ZodOptional<z.ZodString>;
|
|
8
|
+
sessionVaultKeyPath: z.ZodOptional<z.ZodString>;
|
|
9
|
+
defaultProvider: z.ZodNullable<z.ZodString>;
|
|
10
|
+
defaultModel: z.ZodNullable<z.ZodString>;
|
|
11
|
+
maxSteps: z.ZodCoercedNumber<unknown>;
|
|
12
|
+
authToken: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
13
|
+
corsOrigins: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
14
|
+
}, z.core.$strip>;
|
|
15
|
+
type BridgeServerConfig = z.infer<typeof bridgeServerConfigSchema>;
|
|
16
|
+
type BridgeServerConfigOverrides = Partial<{
|
|
17
|
+
host: string;
|
|
18
|
+
port: number | string;
|
|
19
|
+
stateRoot: string;
|
|
20
|
+
runtimeRoot: string;
|
|
21
|
+
sessionVaultPath: string;
|
|
22
|
+
sessionVaultKeyPath: string;
|
|
23
|
+
defaultProvider: string | null;
|
|
24
|
+
defaultModel: string | null;
|
|
25
|
+
maxSteps: number | string;
|
|
26
|
+
authToken: string | null;
|
|
27
|
+
corsOrigins: string[] | string;
|
|
28
|
+
}>;
|
|
29
|
+
declare function loadBridgeServerConfig(env?: NodeJS.ProcessEnv, overrides?: BridgeServerConfigOverrides): BridgeServerConfig;
|
|
30
|
+
declare function getBridgeServerStartupWarnings(config: BridgeServerConfig): string[];
|
|
31
|
+
declare function isLocalBridgeHost(host: string): boolean;
|
|
32
|
+
declare function isWildcardCorsOrigins(value: string[] | undefined): boolean;
|
|
33
|
+
export declare const bridgeServerConfigModule: {
|
|
34
|
+
bridgeServerConfigSchema: z.ZodObject<{
|
|
35
|
+
host: z.ZodString;
|
|
36
|
+
port: z.ZodCoercedNumber<unknown>;
|
|
37
|
+
stateRoot: z.ZodString;
|
|
38
|
+
runtimeRoot: z.ZodString;
|
|
39
|
+
sessionVaultPath: z.ZodOptional<z.ZodString>;
|
|
40
|
+
sessionVaultKeyPath: z.ZodOptional<z.ZodString>;
|
|
41
|
+
defaultProvider: z.ZodNullable<z.ZodString>;
|
|
42
|
+
defaultModel: z.ZodNullable<z.ZodString>;
|
|
43
|
+
maxSteps: z.ZodCoercedNumber<unknown>;
|
|
44
|
+
authToken: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
45
|
+
corsOrigins: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
46
|
+
}, z.core.$strip>;
|
|
47
|
+
loadBridgeServerConfig: typeof loadBridgeServerConfig;
|
|
48
|
+
getBridgeServerStartupWarnings: typeof getBridgeServerStartupWarnings;
|
|
49
|
+
isLocalBridgeHost: typeof isLocalBridgeHost;
|
|
50
|
+
isWildcardCorsOrigins: typeof isWildcardCorsOrigins;
|
|
51
|
+
};
|
|
52
|
+
export type { BridgeServerConfig, BridgeServerConfigOverrides };
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import os from "node:os";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
const DEFAULT_HOST = "127.0.0.1";
|
|
5
|
+
const DEFAULT_PORT = 4318;
|
|
6
|
+
const DEFAULT_MAX_STEPS = 8;
|
|
7
|
+
const DEFAULT_APP_STATE_DIR_NAME = ".bridge";
|
|
8
|
+
const DEFAULT_BRIDGE_APP_DIR_NAME = "server";
|
|
9
|
+
const nonNegativeIntegerSchema = z.coerce.number().int().min(0);
|
|
10
|
+
const positiveIntegerSchema = z.coerce.number().int().min(1);
|
|
11
|
+
const bridgeServerConfigSchema = z.object({
|
|
12
|
+
host: z.string().trim().min(1),
|
|
13
|
+
port: nonNegativeIntegerSchema.max(65535),
|
|
14
|
+
stateRoot: z.string().trim().min(1),
|
|
15
|
+
runtimeRoot: z.string().trim().min(1),
|
|
16
|
+
sessionVaultPath: z.string().trim().min(1).optional(),
|
|
17
|
+
sessionVaultKeyPath: z.string().trim().min(1).optional(),
|
|
18
|
+
defaultProvider: z.string().trim().min(1).nullable(),
|
|
19
|
+
defaultModel: z.string().trim().min(1).nullable(),
|
|
20
|
+
maxSteps: positiveIntegerSchema,
|
|
21
|
+
authToken: z.string().trim().min(1).nullable().optional(),
|
|
22
|
+
corsOrigins: z.array(z.string().trim().min(1)).optional()
|
|
23
|
+
});
|
|
24
|
+
function loadBridgeServerConfig(env = process.env, overrides = {}) {
|
|
25
|
+
return bridgeServerConfigSchema.parse({
|
|
26
|
+
host: trimOrNull(overrides.host) ?? trimOrNull(env.BRIDGE_SERVER_HOST) ?? DEFAULT_HOST,
|
|
27
|
+
port: overrides.port ?? env.BRIDGE_SERVER_PORT ?? DEFAULT_PORT,
|
|
28
|
+
stateRoot: resolveStateRoot(env, overrides),
|
|
29
|
+
runtimeRoot: resolveRuntimeRoot(env, overrides),
|
|
30
|
+
sessionVaultPath: resolveSessionVaultPath(env, overrides),
|
|
31
|
+
sessionVaultKeyPath: resolveSessionVaultKeyPath(env, overrides),
|
|
32
|
+
defaultProvider: trimOrNull(overrides.defaultProvider ?? undefined) ?? trimOrNull(env.BRIDGE_PROVIDER),
|
|
33
|
+
defaultModel: trimOrNull(overrides.defaultModel ?? undefined) ?? trimOrNull(env.BRIDGE_MODEL),
|
|
34
|
+
maxSteps: overrides.maxSteps ?? env.BRIDGE_MAX_STEPS ?? DEFAULT_MAX_STEPS,
|
|
35
|
+
authToken: trimOrNull(overrides.authToken ?? undefined) ??
|
|
36
|
+
trimOrNull(env.BRIDGE_AUTH_TOKEN) ??
|
|
37
|
+
undefined,
|
|
38
|
+
corsOrigins: resolveCorsOrigins(overrides.corsOrigins ?? env.BRIDGE_CORS_ORIGINS)
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
function getBridgeServerStartupWarnings(config) {
|
|
42
|
+
const warnings = [];
|
|
43
|
+
if (!trimOrNull(config.authToken ?? undefined)) {
|
|
44
|
+
warnings.push("Bridge auth token is not configured; non-health endpoints accept unauthenticated local requests.");
|
|
45
|
+
}
|
|
46
|
+
if (!isLocalBridgeHost(config.host)) {
|
|
47
|
+
warnings.push(`Bridge is binding to non-local host '${config.host}'; this may expose the server beyond localhost.`);
|
|
48
|
+
}
|
|
49
|
+
if (isWildcardCorsOrigins(config.corsOrigins)) {
|
|
50
|
+
warnings.push("Bridge CORS is set to allow any origin; use wildcard CORS only when explicitly needed.");
|
|
51
|
+
}
|
|
52
|
+
return warnings;
|
|
53
|
+
}
|
|
54
|
+
function isLocalBridgeHost(host) {
|
|
55
|
+
const normalized = host.trim().toLowerCase();
|
|
56
|
+
return (normalized === "localhost" ||
|
|
57
|
+
normalized === "::1" ||
|
|
58
|
+
normalized === "[::1]" ||
|
|
59
|
+
normalized.endsWith(".localhost") ||
|
|
60
|
+
/^127(?:\.\d{1,3}){3}$/.test(normalized));
|
|
61
|
+
}
|
|
62
|
+
function isWildcardCorsOrigins(value) {
|
|
63
|
+
return Boolean(value?.includes("*"));
|
|
64
|
+
}
|
|
65
|
+
function resolveStateRoot(env, overrides) {
|
|
66
|
+
const explicit = trimOrNull(overrides.stateRoot) ?? trimOrNull(env.BRIDGE_STATE_ROOT);
|
|
67
|
+
if (explicit) {
|
|
68
|
+
return path.resolve(explicit);
|
|
69
|
+
}
|
|
70
|
+
return path.resolve(process.cwd(), ".bridge-server");
|
|
71
|
+
}
|
|
72
|
+
function resolveRuntimeRoot(env, overrides) {
|
|
73
|
+
return path.resolve(trimOrNull(overrides.runtimeRoot) ?? trimOrNull(env.BRIDGE_RUNTIME_ROOT) ?? process.cwd());
|
|
74
|
+
}
|
|
75
|
+
function resolveSessionVaultPath(env, overrides) {
|
|
76
|
+
const explicit = trimOrNull(overrides.sessionVaultPath) ?? trimOrNull(env.BRIDGE_SESSION_VAULT_PATH);
|
|
77
|
+
if (explicit) {
|
|
78
|
+
return path.resolve(explicit);
|
|
79
|
+
}
|
|
80
|
+
return path.join(resolveDefaultBridgeAppRoot(env), "session-vault");
|
|
81
|
+
}
|
|
82
|
+
function resolveSessionVaultKeyPath(env, overrides) {
|
|
83
|
+
const explicit = trimOrNull(overrides.sessionVaultKeyPath) ?? trimOrNull(env.BRIDGE_SESSION_VAULT_KEY_PATH);
|
|
84
|
+
if (explicit) {
|
|
85
|
+
return path.resolve(explicit);
|
|
86
|
+
}
|
|
87
|
+
return path.join(resolveDefaultBridgeAppRoot(env), "keys", "session-vault.key");
|
|
88
|
+
}
|
|
89
|
+
function resolveCorsOrigins(value) {
|
|
90
|
+
if (Array.isArray(value)) {
|
|
91
|
+
const normalized = value.map((entry) => entry.trim()).filter(Boolean);
|
|
92
|
+
return normalized.length > 0 ? normalized : undefined;
|
|
93
|
+
}
|
|
94
|
+
const raw = value?.trim();
|
|
95
|
+
if (!raw) {
|
|
96
|
+
return undefined;
|
|
97
|
+
}
|
|
98
|
+
const normalized = raw
|
|
99
|
+
.split(",")
|
|
100
|
+
.map((entry) => entry.trim())
|
|
101
|
+
.filter(Boolean);
|
|
102
|
+
return normalized.length > 0 ? normalized : undefined;
|
|
103
|
+
}
|
|
104
|
+
function trimOrNull(value) {
|
|
105
|
+
const trimmed = value?.trim();
|
|
106
|
+
return trimmed ? trimmed : null;
|
|
107
|
+
}
|
|
108
|
+
function resolveDefaultBridgeAppRoot(env) {
|
|
109
|
+
const homeDir = trimOrNull(env.HOME) ?? os.homedir();
|
|
110
|
+
return path.resolve(homeDir, DEFAULT_APP_STATE_DIR_NAME, DEFAULT_BRIDGE_APP_DIR_NAME);
|
|
111
|
+
}
|
|
112
|
+
export const bridgeServerConfigModule = {
|
|
113
|
+
bridgeServerConfigSchema,
|
|
114
|
+
loadBridgeServerConfig,
|
|
115
|
+
getBridgeServerStartupWarnings,
|
|
116
|
+
isLocalBridgeHost,
|
|
117
|
+
isWildcardCorsOrigins
|
|
118
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export declare const configModule: {
|
|
2
|
+
bridgeServerConfigSchema: import("zod").ZodObject<{
|
|
3
|
+
host: import("zod").ZodString;
|
|
4
|
+
port: import("zod").ZodCoercedNumber<unknown>;
|
|
5
|
+
stateRoot: import("zod").ZodString;
|
|
6
|
+
runtimeRoot: import("zod").ZodString;
|
|
7
|
+
sessionVaultPath: import("zod").ZodOptional<import("zod").ZodString>;
|
|
8
|
+
sessionVaultKeyPath: import("zod").ZodOptional<import("zod").ZodString>;
|
|
9
|
+
defaultProvider: import("zod").ZodNullable<import("zod").ZodString>;
|
|
10
|
+
defaultModel: import("zod").ZodNullable<import("zod").ZodString>;
|
|
11
|
+
maxSteps: import("zod").ZodCoercedNumber<unknown>;
|
|
12
|
+
authToken: import("zod").ZodOptional<import("zod").ZodNullable<import("zod").ZodString>>;
|
|
13
|
+
corsOrigins: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
|
|
14
|
+
}, import("zod/v4/core").$strip>;
|
|
15
|
+
getBridgeServerStartupWarnings: (config: import("./bridge-server-config.ts").BridgeServerConfig) => string[];
|
|
16
|
+
isLocalBridgeHost: (host: string) => boolean;
|
|
17
|
+
isWildcardCorsOrigins: (value: string[] | undefined) => boolean;
|
|
18
|
+
loadBridgeServerConfig: (env?: NodeJS.ProcessEnv, overrides?: import("./bridge-server-config.ts").BridgeServerConfigOverrides) => import("./bridge-server-config.ts").BridgeServerConfig;
|
|
19
|
+
};
|
|
20
|
+
export type { BridgeServerConfig, BridgeServerConfigOverrides } from "./bridge-server-config.ts";
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { bridgeServerConfigModule } from "./bridge-server-config.js";
|
|
2
|
+
export const configModule = {
|
|
3
|
+
bridgeServerConfigSchema: bridgeServerConfigModule.bridgeServerConfigSchema,
|
|
4
|
+
getBridgeServerStartupWarnings: bridgeServerConfigModule.getBridgeServerStartupWarnings,
|
|
5
|
+
isLocalBridgeHost: bridgeServerConfigModule.isLocalBridgeHost,
|
|
6
|
+
isWildcardCorsOrigins: bridgeServerConfigModule.isWildcardCorsOrigins,
|
|
7
|
+
loadBridgeServerConfig: bridgeServerConfigModule.loadBridgeServerConfig
|
|
8
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { BridgeRuntimeService, ProviderStore, SessionPackageStore, SessionStore } from "../bridge/index.ts";
|
|
2
|
+
import type { BridgeServerConfig } from "../config/index.ts";
|
|
3
|
+
type BridgeApiRouteContext = {
|
|
4
|
+
config: BridgeServerConfig;
|
|
5
|
+
service: BridgeRuntimeService;
|
|
6
|
+
providerStore: ProviderStore;
|
|
7
|
+
sessionPackageStore: SessionPackageStore;
|
|
8
|
+
sessionStore: SessionStore;
|
|
9
|
+
onInternalError?: (error: unknown, request: {
|
|
10
|
+
method: string;
|
|
11
|
+
url: string;
|
|
12
|
+
}) => void;
|
|
13
|
+
};
|
|
14
|
+
export type { BridgeApiRouteContext };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { Server } from "node:http";
|
|
2
|
+
import type { BridgeServerConfig } from "../config/index.ts";
|
|
3
|
+
declare const createBridgeRuntimeService: (dependencies: import("../bridge/bridge-runtime-service.ts").BridgeRuntimeServiceDependencies) => {
|
|
4
|
+
respond(request: import("../index.ts").BridgeMessageRequest, pathSessionId?: string): Promise<import("../index.ts").BridgeMessageResponse>;
|
|
5
|
+
execute(request: {
|
|
6
|
+
sessionId: string;
|
|
7
|
+
input: string;
|
|
8
|
+
providerId: string;
|
|
9
|
+
modelId: string;
|
|
10
|
+
metadata?: Record<string, unknown>;
|
|
11
|
+
toolProfile?: import("../index.ts").BridgeApiToolProfile;
|
|
12
|
+
sessionHistory?: import("@uncensoredcode/openbridge/runtime").BridgeSessionTurn[];
|
|
13
|
+
persistSession?: boolean;
|
|
14
|
+
}): Promise<import("../index.ts").BridgeMessageResponse>;
|
|
15
|
+
completeChatCompletionPacket(request: {
|
|
16
|
+
sessionId: string;
|
|
17
|
+
providerId: string;
|
|
18
|
+
modelId: string;
|
|
19
|
+
messages: import("@uncensoredcode/openbridge/runtime").CompiledProviderMessage[];
|
|
20
|
+
tools: import("../shared/api-schema.ts").BridgeChatCompletionTool[];
|
|
21
|
+
toolChoice?: import("../index.ts").BridgeChatCompletionRequest["tool_choice"];
|
|
22
|
+
continuation: boolean;
|
|
23
|
+
toolFollowUp: boolean;
|
|
24
|
+
metadata?: Record<string, unknown>;
|
|
25
|
+
persistSession?: boolean;
|
|
26
|
+
}): Promise<{
|
|
27
|
+
packet: import("@uncensoredcode/openbridge/runtime").AssistantResponse;
|
|
28
|
+
providerBindingReused: boolean;
|
|
29
|
+
}>;
|
|
30
|
+
streamChatCompletionPacket(request: {
|
|
31
|
+
sessionId: string;
|
|
32
|
+
providerId: string;
|
|
33
|
+
modelId: string;
|
|
34
|
+
messages: import("@uncensoredcode/openbridge/runtime").CompiledProviderMessage[];
|
|
35
|
+
tools: import("../shared/api-schema.ts").BridgeChatCompletionTool[];
|
|
36
|
+
toolChoice?: import("../index.ts").BridgeChatCompletionRequest["tool_choice"];
|
|
37
|
+
continuation: boolean;
|
|
38
|
+
toolFollowUp: boolean;
|
|
39
|
+
metadata?: Record<string, unknown>;
|
|
40
|
+
persistSession?: boolean;
|
|
41
|
+
}): Promise<{
|
|
42
|
+
content: AsyncIterable<import("../bridge/providers/provider-streams.ts").ProviderStreamFragment>;
|
|
43
|
+
packet: Promise<import("@uncensoredcode/openbridge/runtime").AssistantResponse>;
|
|
44
|
+
providerBindingReused: boolean;
|
|
45
|
+
}>;
|
|
46
|
+
streamChatCompletion(request: {
|
|
47
|
+
sessionId: string;
|
|
48
|
+
input: string;
|
|
49
|
+
providerId: string;
|
|
50
|
+
modelId: string;
|
|
51
|
+
metadata?: Record<string, unknown>;
|
|
52
|
+
toolProfile?: import("../index.ts").BridgeApiToolProfile;
|
|
53
|
+
sessionHistory?: import("@uncensoredcode/openbridge/runtime").BridgeSessionTurn[];
|
|
54
|
+
persistSession?: boolean;
|
|
55
|
+
}): Promise<AsyncIterable<string>>;
|
|
56
|
+
};
|
|
57
|
+
type BridgeApiServerLogger = {
|
|
58
|
+
warn(message: string): void;
|
|
59
|
+
error(message: string): void;
|
|
60
|
+
};
|
|
61
|
+
type BridgeApiServerOptions = {
|
|
62
|
+
config?: BridgeServerConfig;
|
|
63
|
+
service?: ReturnType<typeof createBridgeRuntimeService>;
|
|
64
|
+
logger?: BridgeApiServerLogger;
|
|
65
|
+
};
|
|
66
|
+
declare function createBridgeApiServer(options?: BridgeApiServerOptions): Server<typeof import("node:http").IncomingMessage, typeof import("node:http").ServerResponse>;
|
|
67
|
+
declare function startBridgeApiServer(options?: BridgeApiServerOptions): Promise<Server<typeof import("node:http").IncomingMessage, typeof import("node:http").ServerResponse>>;
|
|
68
|
+
export declare const createBridgeApiServerModule: {
|
|
69
|
+
createBridgeApiServer: typeof createBridgeApiServer;
|
|
70
|
+
startBridgeApiServer: typeof startBridgeApiServer;
|
|
71
|
+
};
|
|
72
|
+
export type { BridgeApiServerLogger, BridgeApiServerOptions };
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import Fastify from "fastify";
|
|
3
|
+
import { bridgeModule } from "../bridge/index.js";
|
|
4
|
+
import { providerTransportProfileModule } from "../bridge/providers/provider-transport-profile.js";
|
|
5
|
+
import { localSessionPackageStoreModule } from "../bridge/stores/local-session-package-store.js";
|
|
6
|
+
import { sessionBackedProviderStoreModule } from "../bridge/stores/session-backed-provider-store.js";
|
|
7
|
+
import { configModule } from "../config/index.js";
|
|
8
|
+
import { securityModule } from "../security/index.js";
|
|
9
|
+
import { bridgeApiErrorModule } from "../shared/bridge-api-error.js";
|
|
10
|
+
import { registerBridgeApiRoutesModule } from "./register-bridge-api-routes.js";
|
|
11
|
+
const { createBridgeRuntimeService, createInMemorySessionStore } = bridgeModule;
|
|
12
|
+
const { resolveProviderTransportProfile } = providerTransportProfileModule;
|
|
13
|
+
const { createSessionBackedProviderStore } = sessionBackedProviderStoreModule;
|
|
14
|
+
const { createLocalSessionPackageStore } = localSessionPackageStoreModule;
|
|
15
|
+
const { loadBridgeServerConfig } = configModule;
|
|
16
|
+
const { isBridgeApiError } = bridgeApiErrorModule;
|
|
17
|
+
const { formatBridgeServerErrorLog, isAuthorizedBridgeRequest, requiresBridgeAuth, resolveCorsOrigin, sanitizeBridgeApiErrorPayload } = securityModule;
|
|
18
|
+
const { registerBridgeApiRoutes } = registerBridgeApiRoutesModule;
|
|
19
|
+
const BRIDGE_API_BODY_LIMIT_BYTES = 10 * 1024 * 1024;
|
|
20
|
+
function createBridgeApiServer(options = {}) {
|
|
21
|
+
const { app, server } = createBridgeApiApp(options);
|
|
22
|
+
void app.ready((error) => {
|
|
23
|
+
if (error) {
|
|
24
|
+
const logger = options.logger ?? defaultBridgeApiServerLogger;
|
|
25
|
+
logger.error(formatBridgeServerErrorLog(error));
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
return server;
|
|
29
|
+
}
|
|
30
|
+
async function startBridgeApiServer(options = {}) {
|
|
31
|
+
const { app, config } = createBridgeApiApp(options);
|
|
32
|
+
await app.listen({
|
|
33
|
+
host: config.host,
|
|
34
|
+
port: config.port
|
|
35
|
+
});
|
|
36
|
+
return app.server;
|
|
37
|
+
}
|
|
38
|
+
function createBridgeApiApp(options = {}) {
|
|
39
|
+
const config = options.config ?? loadBridgeServerConfig();
|
|
40
|
+
const logger = options.logger ?? defaultBridgeApiServerLogger;
|
|
41
|
+
const sessionPackageStore = createLocalSessionPackageStore({
|
|
42
|
+
vaultPath: config.sessionVaultPath ?? path.join(config.stateRoot, "session-vault"),
|
|
43
|
+
keyPath: config.sessionVaultKeyPath ?? path.join(config.stateRoot, "keys", "session-vault.key")
|
|
44
|
+
});
|
|
45
|
+
const providerStore = createSessionBackedProviderStore(sessionPackageStore);
|
|
46
|
+
const sessionStore = createInMemorySessionStore();
|
|
47
|
+
const service = options.service ??
|
|
48
|
+
createBridgeRuntimeService({
|
|
49
|
+
config,
|
|
50
|
+
loadProvider(providerId) {
|
|
51
|
+
return providerStore.get(providerId);
|
|
52
|
+
},
|
|
53
|
+
sessionPackageStore
|
|
54
|
+
});
|
|
55
|
+
const app = Fastify({
|
|
56
|
+
logger: false,
|
|
57
|
+
bodyLimit: BRIDGE_API_BODY_LIMIT_BYTES
|
|
58
|
+
});
|
|
59
|
+
for (const warning of collectInstalledProviderWarnings(config, providerStore.list())) {
|
|
60
|
+
logger.warn(warning);
|
|
61
|
+
}
|
|
62
|
+
app.addHook("onRequest", async (request, reply) => {
|
|
63
|
+
setCorsHeaders(request, reply, config);
|
|
64
|
+
reply.header("Cache-Control", "no-store");
|
|
65
|
+
if (request.method === "OPTIONS" || !requiresBridgeAuth(request, config.authToken)) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
if (isAuthorizedBridgeRequest(request.headers, config.authToken)) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
reply.header("WWW-Authenticate", 'Bearer realm="bridge-server"');
|
|
72
|
+
await writeJson(reply, 401, {
|
|
73
|
+
error: {
|
|
74
|
+
code: "unauthorized",
|
|
75
|
+
message: "Bridge authorization failed."
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
app.options("*", async (_request, reply) => {
|
|
80
|
+
reply.code(204).send();
|
|
81
|
+
});
|
|
82
|
+
registerBridgeApiRoutes(app, {
|
|
83
|
+
config,
|
|
84
|
+
service,
|
|
85
|
+
providerStore,
|
|
86
|
+
sessionPackageStore,
|
|
87
|
+
sessionStore,
|
|
88
|
+
onInternalError(error, request) {
|
|
89
|
+
logger.error(formatBridgeServerErrorLog(error, {
|
|
90
|
+
method: request.method,
|
|
91
|
+
url: request.url
|
|
92
|
+
}));
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
app.setNotFoundHandler(async (_request, reply) => {
|
|
96
|
+
await writeJson(reply, 404, {
|
|
97
|
+
error: {
|
|
98
|
+
code: "not_found",
|
|
99
|
+
message: "Route not found."
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
app.setErrorHandler(async (error, _request, reply) => {
|
|
104
|
+
if (isBridgeApiError(error)) {
|
|
105
|
+
if (shouldLogBridgeApiError(error)) {
|
|
106
|
+
logger.warn(formatBridgeServerErrorLog(error, {
|
|
107
|
+
method: _request.method,
|
|
108
|
+
url: _request.url
|
|
109
|
+
}));
|
|
110
|
+
}
|
|
111
|
+
const safeError = sanitizeBridgeApiErrorPayload(error);
|
|
112
|
+
await writeJson(reply, error.statusCode, {
|
|
113
|
+
error: {
|
|
114
|
+
code: safeError.code,
|
|
115
|
+
message: safeError.message,
|
|
116
|
+
details: safeError.details
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
if (isInvalidJsonBodyError(error)) {
|
|
122
|
+
await writeJson(reply, 400, {
|
|
123
|
+
error: {
|
|
124
|
+
code: "invalid_json",
|
|
125
|
+
message: "Request body must contain valid JSON."
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
if (isRequestBodyTooLargeError(error)) {
|
|
131
|
+
await writeJson(reply, 413, {
|
|
132
|
+
error: {
|
|
133
|
+
code: "request_too_large",
|
|
134
|
+
message: "Request body exceeds the bridge server upload limit."
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
logger.error(formatBridgeServerErrorLog(error, {
|
|
140
|
+
method: _request.method,
|
|
141
|
+
url: _request.url
|
|
142
|
+
}));
|
|
143
|
+
await writeJson(reply, 500, {
|
|
144
|
+
error: {
|
|
145
|
+
code: "internal_error",
|
|
146
|
+
message: "Internal bridge server error."
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
return {
|
|
151
|
+
app,
|
|
152
|
+
config,
|
|
153
|
+
server: app.server
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
function setCorsHeaders(request, reply, config) {
|
|
157
|
+
const allowedOrigin = resolveCorsOrigin(request.headers.origin, config.corsOrigins);
|
|
158
|
+
if (!allowedOrigin) {
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
if (allowedOrigin === "*") {
|
|
162
|
+
reply.header("Access-Control-Allow-Origin", "*");
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
reply.header("Access-Control-Allow-Origin", allowedOrigin);
|
|
166
|
+
reply.header("Vary", "Origin");
|
|
167
|
+
}
|
|
168
|
+
reply.header("Access-Control-Allow-Headers", "Authorization, Content-Type, X-Bridge-Token");
|
|
169
|
+
reply.header("Access-Control-Allow-Methods", "GET,POST,PUT,PATCH,DELETE,OPTIONS");
|
|
170
|
+
}
|
|
171
|
+
async function writeJson(reply, statusCode, value) {
|
|
172
|
+
await reply.code(statusCode).send(value);
|
|
173
|
+
}
|
|
174
|
+
function isInvalidJsonBodyError(error) {
|
|
175
|
+
return (typeof error === "object" &&
|
|
176
|
+
error !== null &&
|
|
177
|
+
"code" in error &&
|
|
178
|
+
(error.code === "FST_ERR_CTP_INVALID_JSON_BODY" || error.code === "FST_ERR_CTP_EMPTY_JSON_BODY"));
|
|
179
|
+
}
|
|
180
|
+
function isRequestBodyTooLargeError(error) {
|
|
181
|
+
return (typeof error === "object" &&
|
|
182
|
+
error !== null &&
|
|
183
|
+
"code" in error &&
|
|
184
|
+
error.code === "FST_ERR_CTP_BODY_TOO_LARGE");
|
|
185
|
+
}
|
|
186
|
+
const defaultBridgeApiServerLogger = {
|
|
187
|
+
warn(message) {
|
|
188
|
+
console.warn(message);
|
|
189
|
+
},
|
|
190
|
+
error(message) {
|
|
191
|
+
console.error(message);
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
function collectInstalledProviderWarnings(config, providers) {
|
|
195
|
+
const warnings = [];
|
|
196
|
+
const providersById = new Map(providers.map((provider) => [provider.id, provider]));
|
|
197
|
+
if (config.defaultProvider && providers.length > 0) {
|
|
198
|
+
const defaultProvider = providersById.get(config.defaultProvider);
|
|
199
|
+
if (!defaultProvider) {
|
|
200
|
+
warnings.push(`Bridge default provider '${config.defaultProvider}' is not installed.`);
|
|
201
|
+
}
|
|
202
|
+
else if (!resolveProviderTransportProfile(defaultProvider)) {
|
|
203
|
+
warnings.push(`Bridge default provider '${defaultProvider.id}' is not runnable; unsupported kind '${defaultProvider.kind}' or missing transport config.`);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
for (const provider of providers) {
|
|
207
|
+
if (!provider.enabled) {
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
if (resolveProviderTransportProfile(provider)) {
|
|
211
|
+
continue;
|
|
212
|
+
}
|
|
213
|
+
warnings.push(`Provider '${provider.id}' is enabled but not runnable; unsupported kind '${provider.kind}' or missing transport config.`);
|
|
214
|
+
}
|
|
215
|
+
return warnings;
|
|
216
|
+
}
|
|
217
|
+
function shouldLogBridgeApiError(error) {
|
|
218
|
+
return (error.statusCode >= 500 ||
|
|
219
|
+
error.code.startsWith("provider_") ||
|
|
220
|
+
error.code === "provider_unavailable");
|
|
221
|
+
}
|
|
222
|
+
export const createBridgeApiServerModule = {
|
|
223
|
+
createBridgeApiServer,
|
|
224
|
+
startBridgeApiServer
|
|
225
|
+
};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare const httpModule: {
|
|
2
|
+
createBridgeApiServer: (options?: import("./create-bridge-api-server.ts").BridgeApiServerOptions) => import("node:http").Server<typeof import("node:http").IncomingMessage, typeof import("node:http").ServerResponse>;
|
|
3
|
+
startBridgeApiServer: (options?: import("./create-bridge-api-server.ts").BridgeApiServerOptions) => Promise<import("node:http").Server<typeof import("node:http").IncomingMessage, typeof import("node:http").ServerResponse>>;
|
|
4
|
+
};
|
|
5
|
+
export type { BridgeApiServerLogger, BridgeApiServerOptions } from "./create-bridge-api-server.ts";
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { ZodError } from "zod";
|
|
2
|
+
import { bridgeApiErrorModule } from "../shared/bridge-api-error.js";
|
|
3
|
+
const { BridgeApiError } = bridgeApiErrorModule;
|
|
4
|
+
function parseRequest(schema, value) {
|
|
5
|
+
try {
|
|
6
|
+
return schema.parse(value);
|
|
7
|
+
}
|
|
8
|
+
catch (error) {
|
|
9
|
+
if (error instanceof ZodError) {
|
|
10
|
+
throw new BridgeApiError({
|
|
11
|
+
statusCode: 400,
|
|
12
|
+
code: "invalid_request",
|
|
13
|
+
message: "Request validation failed.",
|
|
14
|
+
details: {
|
|
15
|
+
issues: error.issues.map((issue) => ({
|
|
16
|
+
path: issue.path.length > 0 ? issue.path.join(".") : "$",
|
|
17
|
+
message: issue.message
|
|
18
|
+
}))
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
throw error;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export const parseRequestModule = {
|
|
26
|
+
parseRequest
|
|
27
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { FastifyInstance } from "fastify";
|
|
2
|
+
import type { BridgeApiRouteContext } from "./bridge-api-route-context.ts";
|
|
3
|
+
declare function registerBridgeApiRoutes(app: FastifyInstance, context: BridgeApiRouteContext): void;
|
|
4
|
+
export declare const registerBridgeApiRoutesModule: {
|
|
5
|
+
registerBridgeApiRoutes: typeof registerBridgeApiRoutes;
|
|
6
|
+
};
|
|
7
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { adminRoutesModule } from "./routes/admin-routes.js";
|
|
2
|
+
import { chatCompletionsRouteModule } from "./routes/chat-completions-route.js";
|
|
3
|
+
import { healthRoutesModule } from "./routes/health-routes.js";
|
|
4
|
+
import { messageRoutesModule } from "./routes/message-routes.js";
|
|
5
|
+
const { registerAdminRoutes } = adminRoutesModule;
|
|
6
|
+
const { registerChatCompletionRoute } = chatCompletionsRouteModule;
|
|
7
|
+
const { registerHealthRoutes } = healthRoutesModule;
|
|
8
|
+
const { registerMessageRoutes } = messageRoutesModule;
|
|
9
|
+
function registerBridgeApiRoutes(app, context) {
|
|
10
|
+
registerHealthRoutes(app);
|
|
11
|
+
registerAdminRoutes(app, context);
|
|
12
|
+
registerChatCompletionRoute(app, context);
|
|
13
|
+
registerMessageRoutes(app, context);
|
|
14
|
+
}
|
|
15
|
+
export const registerBridgeApiRoutesModule = {
|
|
16
|
+
registerBridgeApiRoutes
|
|
17
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { FastifyInstance } from "fastify";
|
|
2
|
+
import type { BridgeApiRouteContext } from "../bridge-api-route-context.ts";
|
|
3
|
+
declare function registerAdminRoutes(app: FastifyInstance, context: BridgeApiRouteContext): void;
|
|
4
|
+
export declare const adminRoutesModule: {
|
|
5
|
+
registerAdminRoutes: typeof registerAdminRoutes;
|
|
6
|
+
};
|
|
7
|
+
export {};
|