@janole/ai-sdk-provider-codex-asp 0.2.2 → 0.2.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/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  `@janole/ai-sdk-provider-codex-asp` is a [Vercel AI SDK](https://ai-sdk.dev/) v6 custom provider for the Codex App Server Protocol.
4
4
 
5
- Status: POC feature-complete for language model usage. Currently tested with [codex-cli](https://github.com/openai/codex/releases/tag/rust-v0.105.0) 0.105.0.
5
+ Status: POC feature-complete for language model usage. Currently tested with [codex-cli](https://github.com/openai/codex/releases/tag/rust-v0.106.0) 0.106.0.
6
6
 
7
7
  - `LanguageModelV3` provider implementation
8
8
  - Streaming (`streamText`) and non-streaming (`generateText`)
package/dist/index.cjs CHANGED
@@ -274,6 +274,7 @@ var AppServerClient = class {
274
274
  // src/client/transport-persistent.ts
275
275
  var PersistentTransport = class {
276
276
  pool;
277
+ signal;
277
278
  worker = null;
278
279
  pendingInitializeId = null;
279
280
  initializeIntercepted = false;
@@ -282,9 +283,10 @@ var PersistentTransport = class {
282
283
  closeListeners = /* @__PURE__ */ new Set();
283
284
  constructor(settings) {
284
285
  this.pool = settings.pool;
286
+ this.signal = settings.signal;
285
287
  }
286
288
  async connect() {
287
- this.worker = this.pool.acquire();
289
+ this.worker = await this.pool.acquire(stripUndefined({ signal: this.signal }));
288
290
  await this.worker.ensureConnected();
289
291
  }
290
292
  disconnect() {
@@ -724,6 +726,7 @@ var CodexWorker = class {
724
726
  var CodexWorkerPool = class {
725
727
  workers;
726
728
  shutdownCalled = false;
729
+ waiters = [];
727
730
  constructor(settings) {
728
731
  const size = settings.poolSize ?? 1;
729
732
  const idleTimeoutMs = settings.idleTimeoutMs ?? 3e5;
@@ -735,7 +738,7 @@ var CodexWorkerPool = class {
735
738
  })
736
739
  );
737
740
  }
738
- acquire() {
741
+ async acquire(options) {
739
742
  if (this.shutdownCalled) {
740
743
  throw new CodexProviderError("Worker pool has been shut down.");
741
744
  }
@@ -743,20 +746,61 @@ var CodexWorkerPool = class {
743
746
  (w) => w.state === "idle" || w.state === "disconnected"
744
747
  );
745
748
  if (!worker) {
746
- throw new CodexProviderError(
747
- "All workers are busy. Try again later or increase poolSize."
748
- );
749
+ if (options?.signal?.aborted) {
750
+ throw new CodexProviderError("Worker acquisition aborted while waiting.");
751
+ }
752
+ return new Promise((resolve, reject) => {
753
+ const waiter = {
754
+ resolve,
755
+ reject,
756
+ signal: options?.signal,
757
+ abortHandler: void 0
758
+ };
759
+ if (waiter.signal) {
760
+ waiter.abortHandler = () => {
761
+ this.removeWaiter(waiter);
762
+ waiter.reject(new CodexProviderError("Worker acquisition aborted while waiting."));
763
+ };
764
+ waiter.signal.addEventListener("abort", waiter.abortHandler, { once: true });
765
+ }
766
+ this.waiters.push(waiter);
767
+ });
749
768
  }
750
769
  worker.acquire();
751
770
  return worker;
752
771
  }
753
772
  release(worker) {
754
- worker.release();
773
+ const waiter = this.waiters.shift();
774
+ if (waiter) {
775
+ this.clearWaiterAbortHandler(waiter);
776
+ waiter.resolve(worker);
777
+ } else {
778
+ worker.release();
779
+ }
755
780
  }
756
781
  async shutdown() {
757
782
  this.shutdownCalled = true;
783
+ while (this.waiters.length > 0) {
784
+ const waiter = this.waiters.shift();
785
+ this.clearWaiterAbortHandler(waiter);
786
+ waiter.reject(new CodexProviderError("Worker pool has been shut down."));
787
+ }
758
788
  await Promise.all(this.workers.map((w) => w.shutdown()));
759
789
  }
790
+ removeWaiter(target) {
791
+ const index = this.waiters.indexOf(target);
792
+ if (index >= 0) {
793
+ this.waiters.splice(index, 1);
794
+ }
795
+ }
796
+ /** Remove the abort listener so it doesn't fire after the waiter is already served. */
797
+ clearWaiterAbortHandler(waiter) {
798
+ if (!waiter.signal || !waiter.abortHandler) {
799
+ return;
800
+ }
801
+ waiter.signal.removeEventListener("abort", waiter.abortHandler);
802
+ waiter.abortHandler = void 0;
803
+ }
760
804
  };
761
805
 
762
806
  // src/dynamic-tools.ts
@@ -886,7 +930,7 @@ var DynamicToolsDispatcher = class {
886
930
  // package.json
887
931
  var package_default = {
888
932
  name: "@janole/ai-sdk-provider-codex-asp",
889
- version: "0.2.2"};
933
+ version: "0.2.3"};
890
934
 
891
935
  // src/package-info.ts
892
936
  var PACKAGE_NAME = package_default.name;
@@ -1555,7 +1599,7 @@ var CodexLanguageModel = class {
1555
1599
  });
1556
1600
  }
1557
1601
  doStream(options) {
1558
- const transport = this.config.providerSettings.transportFactory ? this.config.providerSettings.transportFactory() : this.config.providerSettings.transport?.type === "websocket" ? new WebSocketTransport(this.config.providerSettings.transport.websocket) : new StdioTransport(this.config.providerSettings.transport?.stdio);
1602
+ const transport = this.config.providerSettings.transportFactory ? this.config.providerSettings.transportFactory(options.abortSignal) : this.config.providerSettings.transport?.type === "websocket" ? new WebSocketTransport(this.config.providerSettings.transport.websocket) : new StdioTransport(this.config.providerSettings.transport?.stdio);
1559
1603
  const packetLogger = this.config.providerSettings.debug?.logPackets === true ? this.config.providerSettings.debug.logger ?? ((packet) => {
1560
1604
  if (packet.direction === "inbound") {
1561
1605
  console.debug("[codex packet]", packet.message);
@@ -1969,7 +2013,7 @@ function createCodexAppServer(settings = {}) {
1969
2013
  });
1970
2014
  }
1971
2015
  const persistentPool = persistentPoolHandle?.pool ?? null;
1972
- const effectiveTransportFactory = persistentPool ? () => new PersistentTransport({ pool: persistentPool }) : baseTransportFactory;
2016
+ const effectiveTransportFactory = persistentPool ? (signal) => new PersistentTransport(stripUndefined({ pool: persistentPool, signal })) : baseTransportFactory;
1973
2017
  const resolvedSettings = Object.freeze(stripUndefined({
1974
2018
  defaultModel: settings.defaultModel,
1975
2019
  experimentalApi: settings.experimentalApi,