@uncensoredcode/openbridge 0.1.2 → 0.1.3

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uncensoredcode/openbridge",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "description": "OpenBridge runtime, server, and CLI for bridging AI providers through a unified interface.",
5
5
  "packageManager": "bun@1.3.11",
6
6
  "type": "module",
@@ -1,10 +1,17 @@
1
1
  import crypto from "node:crypto";
2
+ import path from "node:path";
2
3
  import { bridgeRuntime } from "@uncensoredcode/openbridge/runtime";
4
+ import { providerSessionResolverModule } from "./providers/provider-session-resolver.js";
3
5
  import { webProviderTransportModule } from "./providers/web-provider-transport.js";
4
6
  import { fileBridgeStateStoreModule } from "./state/file-bridge-state-store.js";
7
+ import { localSessionPackageStoreModule } from "./stores/local-session-package-store.js";
8
+ import { sessionBackedProviderStoreModule } from "./stores/session-backed-provider-store.js";
5
9
  const { classifyProviderTransportError, formatProviderFailureMessage } = bridgeRuntime;
6
- const { collectProviderTransportCompletion } = webProviderTransportModule;
10
+ const { createBridgeProviderSessionResolver } = providerSessionResolverModule;
11
+ const { collectProviderTransportCompletionWithResolver } = webProviderTransportModule;
7
12
  const { FileBridgeStateStore } = fileBridgeStateStoreModule;
13
+ const { createLocalSessionPackageStore } = localSessionPackageStoreModule;
14
+ const { createSessionBackedProviderStore } = sessionBackedProviderStoreModule;
8
15
  const DEFAULT_LIVE_CANARY_PROMPT = "Reply with exactly OK.";
9
16
  const DEFAULT_LIVE_CANARY_EXPECTED_SUBSTRING = "OK";
10
17
  async function runLiveProviderExtractionCanary(input) {
@@ -15,7 +22,7 @@ async function runLiveProviderExtractionCanary(input) {
15
22
  const requestId = input.requestId ?? `live-canary:${crypto.randomUUID()}`;
16
23
  const startedAt = (input.now ?? Date.now)();
17
24
  const stateStore = new FileBridgeStateStore(input.stateRoot ?? input.config.stateRoot);
18
- const collectCompletion = input.collectCompletion ?? collectProviderTransportCompletion;
25
+ const collectCompletion = input.collectCompletion ?? createLiveProviderCompletionCollector(input.config, stateStore);
19
26
  try {
20
27
  const result = await collectCompletion(stateStore, {
21
28
  lane: "main",
@@ -178,6 +185,18 @@ function readExpectedSubstring(value) {
178
185
  }
179
186
  return expectedSubstring;
180
187
  }
188
+ function createLiveProviderCompletionCollector(config, stateStore) {
189
+ const sessionPackageStore = createLocalSessionPackageStore({
190
+ vaultPath: config.sessionVaultPath ?? path.join(stateStore.rootDir, "session-vault"),
191
+ keyPath: config.sessionVaultKeyPath ?? path.join(stateStore.rootDir, "keys", "session-vault.key")
192
+ });
193
+ const providerStore = createSessionBackedProviderStore(sessionPackageStore);
194
+ const providerSessionResolver = createBridgeProviderSessionResolver({
195
+ sessionPackageStore,
196
+ stateStore
197
+ });
198
+ return async (_stateStore, request) => collectProviderTransportCompletionWithResolver(providerSessionResolver, request, (providerId) => providerStore.get(providerId));
199
+ }
181
200
  export const liveProviderExtractionCanaryModule = {
182
201
  DEFAULT_LIVE_CANARY_PROMPT,
183
202
  DEFAULT_LIVE_CANARY_EXPECTED_SUBSTRING,
@@ -166,7 +166,7 @@ async function ensureConversationBinding(request, profile, session, prompt) {
166
166
  parentId: ""
167
167
  });
168
168
  const payload = await readJsonResponse(bootstrapResponse, request.providerId, "bootstrap");
169
- const conversationId = extractFirstString(payload, profile.bootstrap.conversationIdPath);
169
+ const conversationId = extractBootstrapConversationId(payload, profile.bootstrap.conversationIdPath);
170
170
  if (!conversationId) {
171
171
  throw new ProviderFailure({
172
172
  kind: "permanent",
@@ -652,6 +652,27 @@ function extractFirstString(payload, path) {
652
652
  }
653
653
  return "";
654
654
  }
655
+ function extractBootstrapConversationId(payload, configuredPath) {
656
+ const candidates = [configuredPath];
657
+ if (configuredPath.endsWith(".chat_session.id")) {
658
+ candidates.push(configuredPath.replace(/\.chat_session\.id$/, ".id"));
659
+ }
660
+ if (configuredPath.endsWith(".chat_session_id")) {
661
+ candidates.push(configuredPath.replace(/\.chat_session_id$/, ".id"));
662
+ }
663
+ for (const path of ["data.biz_data.id", "data.id", "id"]) {
664
+ if (!candidates.includes(path)) {
665
+ candidates.push(path);
666
+ }
667
+ }
668
+ for (const path of candidates) {
669
+ const value = extractFirstString(payload, path);
670
+ if (value) {
671
+ return value;
672
+ }
673
+ }
674
+ return "";
675
+ }
655
676
  function extractFirstNumber(payload, path) {
656
677
  for (const value of extractPathValues(payload, path.split(".").filter(Boolean))) {
657
678
  if (typeof value === "number" && Number.isFinite(value)) {
@@ -23,8 +23,10 @@ declare class WebProviderTransport implements ProviderTransport {
23
23
  }>;
24
24
  }
25
25
  declare function collectProviderTransportCompletion(stateStore: FileBridgeStateStore, request: ProviderTransportRequest): Promise<CollectedProviderTransportCompletion>;
26
+ declare function collectProviderTransportCompletionWithResolver(providerSessionResolver: BridgeProviderSessionResolver, request: ProviderTransportRequest, loadProvider: (providerId: string) => ProviderRecord | null): Promise<CollectedProviderTransportCompletion>;
26
27
  export declare const webProviderTransportModule: {
27
28
  WebProviderTransport: typeof WebProviderTransport;
28
29
  collectProviderTransportCompletion: typeof collectProviderTransportCompletion;
30
+ collectProviderTransportCompletionWithResolver: typeof collectProviderTransportCompletionWithResolver;
29
31
  };
30
32
  export type { StreamingProviderTransport, WebProviderTransport };
@@ -147,5 +147,6 @@ function summarizeProviderContent(value, maxLength = 320) {
147
147
  }
148
148
  export const webProviderTransportModule = {
149
149
  WebProviderTransport,
150
- collectProviderTransportCompletion
150
+ collectProviderTransportCompletion,
151
+ collectProviderTransportCompletionWithResolver
151
152
  };
@@ -515,7 +515,7 @@ function inferDeepSeekConversationTransport(selectedRequest, value) {
515
515
  headers: bootstrapHeaders,
516
516
  body: {}
517
517
  },
518
- conversationIdPath: "data.biz_data.chat_session.id"
518
+ conversationIdPath: "data.biz_data.id"
519
519
  },
520
520
  preflight: {
521
521
  request: {