@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.
Files changed (145) hide show
  1. package/README.md +117 -0
  2. package/bin/openbridge.js +10 -0
  3. package/package.json +85 -0
  4. package/packages/cli/dist/args.d.ts +30 -0
  5. package/packages/cli/dist/args.js +160 -0
  6. package/packages/cli/dist/cli.d.ts +2 -0
  7. package/packages/cli/dist/cli.js +9 -0
  8. package/packages/cli/dist/index.d.ts +26 -0
  9. package/packages/cli/dist/index.js +76 -0
  10. package/packages/runtime/dist/assistant-protocol.d.ts +34 -0
  11. package/packages/runtime/dist/assistant-protocol.js +121 -0
  12. package/packages/runtime/dist/execution/in-process.d.ts +14 -0
  13. package/packages/runtime/dist/execution/in-process.js +45 -0
  14. package/packages/runtime/dist/execution/types.d.ts +49 -0
  15. package/packages/runtime/dist/execution/types.js +20 -0
  16. package/packages/runtime/dist/index.d.ts +86 -0
  17. package/packages/runtime/dist/index.js +60 -0
  18. package/packages/runtime/dist/normalizers/index.d.ts +6 -0
  19. package/packages/runtime/dist/normalizers/index.js +12 -0
  20. package/packages/runtime/dist/normalizers/legacy-packet.d.ts +6 -0
  21. package/packages/runtime/dist/normalizers/legacy-packet.js +131 -0
  22. package/packages/runtime/dist/output-sanitizer.d.ts +23 -0
  23. package/packages/runtime/dist/output-sanitizer.js +78 -0
  24. package/packages/runtime/dist/packet-extractor.d.ts +17 -0
  25. package/packages/runtime/dist/packet-extractor.js +43 -0
  26. package/packages/runtime/dist/packet-normalizer.d.ts +21 -0
  27. package/packages/runtime/dist/packet-normalizer.js +47 -0
  28. package/packages/runtime/dist/prompt-compiler.d.ts +28 -0
  29. package/packages/runtime/dist/prompt-compiler.js +301 -0
  30. package/packages/runtime/dist/protocol.d.ts +44 -0
  31. package/packages/runtime/dist/protocol.js +165 -0
  32. package/packages/runtime/dist/provider-failure.d.ts +52 -0
  33. package/packages/runtime/dist/provider-failure.js +236 -0
  34. package/packages/runtime/dist/provider.d.ts +40 -0
  35. package/packages/runtime/dist/provider.js +1 -0
  36. package/packages/runtime/dist/runtime.d.ts +86 -0
  37. package/packages/runtime/dist/runtime.js +462 -0
  38. package/packages/runtime/dist/session-bound-provider.d.ts +52 -0
  39. package/packages/runtime/dist/session-bound-provider.js +366 -0
  40. package/packages/runtime/dist/tool-name-aliases.d.ts +5 -0
  41. package/packages/runtime/dist/tool-name-aliases.js +13 -0
  42. package/packages/runtime/dist/tools/bash.d.ts +9 -0
  43. package/packages/runtime/dist/tools/bash.js +157 -0
  44. package/packages/runtime/dist/tools/edit.d.ts +9 -0
  45. package/packages/runtime/dist/tools/edit.js +94 -0
  46. package/packages/runtime/dist/tools/index.d.ts +39 -0
  47. package/packages/runtime/dist/tools/index.js +27 -0
  48. package/packages/runtime/dist/tools/list-dir.d.ts +9 -0
  49. package/packages/runtime/dist/tools/list-dir.js +127 -0
  50. package/packages/runtime/dist/tools/read.d.ts +9 -0
  51. package/packages/runtime/dist/tools/read.js +56 -0
  52. package/packages/runtime/dist/tools/registry.d.ts +15 -0
  53. package/packages/runtime/dist/tools/registry.js +38 -0
  54. package/packages/runtime/dist/tools/runtime-path.d.ts +7 -0
  55. package/packages/runtime/dist/tools/runtime-path.js +22 -0
  56. package/packages/runtime/dist/tools/search-files.d.ts +9 -0
  57. package/packages/runtime/dist/tools/search-files.js +149 -0
  58. package/packages/runtime/dist/tools/text-file.d.ts +32 -0
  59. package/packages/runtime/dist/tools/text-file.js +101 -0
  60. package/packages/runtime/dist/tools/workspace-path.d.ts +17 -0
  61. package/packages/runtime/dist/tools/workspace-path.js +70 -0
  62. package/packages/runtime/dist/tools/write.d.ts +9 -0
  63. package/packages/runtime/dist/tools/write.js +59 -0
  64. package/packages/server/dist/bridge/bridge-model-catalog.d.ts +56 -0
  65. package/packages/server/dist/bridge/bridge-model-catalog.js +100 -0
  66. package/packages/server/dist/bridge/bridge-runtime-service.d.ts +61 -0
  67. package/packages/server/dist/bridge/bridge-runtime-service.js +1386 -0
  68. package/packages/server/dist/bridge/chat-completions/chat-completion-service.d.ts +127 -0
  69. package/packages/server/dist/bridge/chat-completions/chat-completion-service.js +1026 -0
  70. package/packages/server/dist/bridge/index.d.ts +335 -0
  71. package/packages/server/dist/bridge/index.js +45 -0
  72. package/packages/server/dist/bridge/live-provider-extraction-canary.d.ts +69 -0
  73. package/packages/server/dist/bridge/live-provider-extraction-canary.js +186 -0
  74. package/packages/server/dist/bridge/providers/generic-provider-transport.d.ts +53 -0
  75. package/packages/server/dist/bridge/providers/generic-provider-transport.js +973 -0
  76. package/packages/server/dist/bridge/providers/provider-session-resolver.d.ts +17 -0
  77. package/packages/server/dist/bridge/providers/provider-session-resolver.js +95 -0
  78. package/packages/server/dist/bridge/providers/provider-streams.d.ts +80 -0
  79. package/packages/server/dist/bridge/providers/provider-streams.js +844 -0
  80. package/packages/server/dist/bridge/providers/provider-transport-profile.d.ts +194 -0
  81. package/packages/server/dist/bridge/providers/provider-transport-profile.js +198 -0
  82. package/packages/server/dist/bridge/providers/web-provider-transport.d.ts +30 -0
  83. package/packages/server/dist/bridge/providers/web-provider-transport.js +151 -0
  84. package/packages/server/dist/bridge/state/file-bridge-state-store.d.ts +36 -0
  85. package/packages/server/dist/bridge/state/file-bridge-state-store.js +164 -0
  86. package/packages/server/dist/bridge/stores/local-session-package-store.d.ts +23 -0
  87. package/packages/server/dist/bridge/stores/local-session-package-store.js +548 -0
  88. package/packages/server/dist/bridge/stores/provider-store.d.ts +94 -0
  89. package/packages/server/dist/bridge/stores/provider-store.js +143 -0
  90. package/packages/server/dist/bridge/stores/session-backed-provider-store.d.ts +7 -0
  91. package/packages/server/dist/bridge/stores/session-backed-provider-store.js +26 -0
  92. package/packages/server/dist/bridge/stores/session-package-store.d.ts +286 -0
  93. package/packages/server/dist/bridge/stores/session-package-store.js +1527 -0
  94. package/packages/server/dist/bridge/stores/session-store.d.ts +120 -0
  95. package/packages/server/dist/bridge/stores/session-store.js +139 -0
  96. package/packages/server/dist/cli/index.d.ts +9 -0
  97. package/packages/server/dist/cli/index.js +6 -0
  98. package/packages/server/dist/cli/main.d.ts +2 -0
  99. package/packages/server/dist/cli/main.js +9 -0
  100. package/packages/server/dist/cli/run-bridge-server-cli.d.ts +54 -0
  101. package/packages/server/dist/cli/run-bridge-server-cli.js +371 -0
  102. package/packages/server/dist/client/bridge-api-client.d.ts +61 -0
  103. package/packages/server/dist/client/bridge-api-client.js +267 -0
  104. package/packages/server/dist/client/index.d.ts +11 -0
  105. package/packages/server/dist/client/index.js +11 -0
  106. package/packages/server/dist/config/bridge-server-config.d.ts +52 -0
  107. package/packages/server/dist/config/bridge-server-config.js +118 -0
  108. package/packages/server/dist/config/index.d.ts +20 -0
  109. package/packages/server/dist/config/index.js +8 -0
  110. package/packages/server/dist/http/bridge-api-route-context.d.ts +14 -0
  111. package/packages/server/dist/http/bridge-api-route-context.js +1 -0
  112. package/packages/server/dist/http/create-bridge-api-server.d.ts +72 -0
  113. package/packages/server/dist/http/create-bridge-api-server.js +225 -0
  114. package/packages/server/dist/http/index.d.ts +5 -0
  115. package/packages/server/dist/http/index.js +5 -0
  116. package/packages/server/dist/http/parse-request.d.ts +6 -0
  117. package/packages/server/dist/http/parse-request.js +27 -0
  118. package/packages/server/dist/http/register-bridge-api-routes.d.ts +7 -0
  119. package/packages/server/dist/http/register-bridge-api-routes.js +17 -0
  120. package/packages/server/dist/http/routes/admin-routes.d.ts +7 -0
  121. package/packages/server/dist/http/routes/admin-routes.js +135 -0
  122. package/packages/server/dist/http/routes/chat-completions-route.d.ts +7 -0
  123. package/packages/server/dist/http/routes/chat-completions-route.js +49 -0
  124. package/packages/server/dist/http/routes/health-routes.d.ts +6 -0
  125. package/packages/server/dist/http/routes/health-routes.js +7 -0
  126. package/packages/server/dist/http/routes/message-routes.d.ts +7 -0
  127. package/packages/server/dist/http/routes/message-routes.js +7 -0
  128. package/packages/server/dist/index.d.ts +85 -0
  129. package/packages/server/dist/index.js +28 -0
  130. package/packages/server/dist/security/bridge-auth.d.ts +9 -0
  131. package/packages/server/dist/security/bridge-auth.js +41 -0
  132. package/packages/server/dist/security/cors-policy.d.ts +5 -0
  133. package/packages/server/dist/security/cors-policy.js +34 -0
  134. package/packages/server/dist/security/index.d.ts +16 -0
  135. package/packages/server/dist/security/index.js +12 -0
  136. package/packages/server/dist/security/redact-sensitive-values.d.ts +19 -0
  137. package/packages/server/dist/security/redact-sensitive-values.js +67 -0
  138. package/packages/server/dist/shared/api-schema.d.ts +133 -0
  139. package/packages/server/dist/shared/api-schema.js +1 -0
  140. package/packages/server/dist/shared/bridge-api-error.d.ts +17 -0
  141. package/packages/server/dist/shared/bridge-api-error.js +19 -0
  142. package/packages/server/dist/shared/index.d.ts +7 -0
  143. package/packages/server/dist/shared/index.js +7 -0
  144. package/packages/server/dist/shared/output.d.ts +5 -0
  145. 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,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,5 @@
1
+ import { createBridgeApiServerModule } from "./create-bridge-api-server.js";
2
+ export const httpModule = {
3
+ createBridgeApiServer: createBridgeApiServerModule.createBridgeApiServer,
4
+ startBridgeApiServer: createBridgeApiServerModule.startBridgeApiServer
5
+ };
@@ -0,0 +1,6 @@
1
+ import { type z, type ZodTypeAny } from "zod";
2
+ declare function parseRequest<TSchema extends ZodTypeAny>(schema: TSchema, value: unknown): z.output<TSchema>;
3
+ export declare const parseRequestModule: {
4
+ parseRequest: typeof parseRequest;
5
+ };
6
+ export {};
@@ -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 {};