claudish 9.3.0 → 9.3.2

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 (2) hide show
  1. package/dist/index.js +56 -21
  2. package/package.json +5 -5
package/dist/index.js CHANGED
@@ -715,7 +715,7 @@ var init_onepassword_config = __esm(() => {
715
715
  });
716
716
 
717
717
  // src/version.ts
718
- var VERSION = "9.3.0";
718
+ var VERSION = "9.3.2";
719
719
 
720
720
  // src/logger.ts
721
721
  import { appendFile, existsSync as existsSync2, mkdirSync, readdirSync, unlinkSync, writeFileSync as writeFileSync2 } from "fs";
@@ -34445,7 +34445,7 @@ class ComposedHandler {
34445
34445
  requestPayload = this.provider.transformPayload(requestPayload, claudeRequest);
34446
34446
  }
34447
34447
  const endpoint = this.provider.getEndpoint(this.targetModel);
34448
- const headers = await this.provider.getHeaders();
34448
+ const headers = await this.provider.getHeaders(payload);
34449
34449
  const serialized = this.provider.serializeBody?.(requestPayload);
34450
34450
  headers["Content-Type"] = serialized?.contentType ?? "application/json";
34451
34451
  log(`[${this.provider.displayName}] Calling API: ${endpoint}`);
@@ -34515,7 +34515,7 @@ class ComposedHandler {
34515
34515
  log(`[${this.provider.displayName}] Parameter rejected \u2014 retrying: ${recovery.note}`);
34516
34516
  requestPayload = recovery.payload;
34517
34517
  const retrySerialized = this.provider.serializeBody?.(requestPayload);
34518
- const retryHeaders = await this.provider.getHeaders();
34518
+ const retryHeaders = await this.provider.getHeaders(payload);
34519
34519
  retryHeaders["Content-Type"] = retrySerialized?.contentType ?? "application/json";
34520
34520
  const retryResp = await fetch(endpoint, {
34521
34521
  method: "POST",
@@ -34536,7 +34536,7 @@ class ComposedHandler {
34536
34536
  log(`[${this.provider.displayName}] Got 401, forcing auth refresh and retrying`);
34537
34537
  try {
34538
34538
  await this.provider.forceRefreshAuth();
34539
- const retryHeaders = await this.provider.getHeaders();
34539
+ const retryHeaders = await this.provider.getHeaders(payload);
34540
34540
  retryHeaders["Content-Type"] = serialized?.contentType ?? "application/json";
34541
34541
  const retryInit = this.provider.getRequestInit?.() || {};
34542
34542
  const retryResp = await fetch(endpoint, {
@@ -35695,21 +35695,31 @@ var init_ollamacloud = __esm(() => {
35695
35695
  init_probe_discovery();
35696
35696
  });
35697
35697
 
35698
- // src/providers/transport/openai-codex.ts
35698
+ // src/providers/transport/conversation-key.ts
35699
35699
  import { createHash as createHash5, randomBytes as randomBytes6 } from "crypto";
35700
- var FALLBACK_CONVERSATION_KEY, OpenAICodexTransport;
35700
+ function conversationKey(claudeRequest) {
35701
+ const sessionId = extractSessionId(claudeRequest);
35702
+ if (!sessionId)
35703
+ return `claudish_${FALLBACK_CONVERSATION_KEY}`;
35704
+ return `claudish_${createHash5("sha256").update(sessionId).digest("hex").slice(0, 32)}`;
35705
+ }
35706
+ var FALLBACK_CONVERSATION_KEY;
35707
+ var init_conversation_key = __esm(() => {
35708
+ init_harness();
35709
+ FALLBACK_CONVERSATION_KEY = randomBytes6(16).toString("hex");
35710
+ });
35711
+
35712
+ // src/providers/transport/openai-codex.ts
35713
+ var OpenAICodexTransport;
35701
35714
  var init_openai_codex = __esm(() => {
35702
35715
  init_codex_api_format();
35703
35716
  init_model_catalog();
35704
35717
  init_authority();
35705
35718
  init_billing_probe();
35706
- init_harness();
35719
+ init_conversation_key();
35707
35720
  init_openai();
35708
- FALLBACK_CONVERSATION_KEY = randomBytes6(16).toString("hex");
35709
35721
  OpenAICodexTransport = class OpenAICodexTransport extends OpenAIProviderTransport {
35710
35722
  cachedAuth = null;
35711
- cachedCacheKeyFor;
35712
- cachedCacheKey = "";
35713
35723
  async refreshAuth() {
35714
35724
  try {
35715
35725
  this.cachedAuth = await credentials.getRequestAuth("openai-codex", { model: "" });
@@ -35744,14 +35754,7 @@ var init_openai_codex = __esm(() => {
35744
35754
  return this.cachedAuth?.transformPayload?.(normalizedPayload) ?? normalizedPayload;
35745
35755
  }
35746
35756
  resolvePromptCacheKey(claudeRequest) {
35747
- const sessionId = extractSessionId(claudeRequest);
35748
- if (!sessionId)
35749
- return `claudish_${FALLBACK_CONVERSATION_KEY}`;
35750
- if (this.cachedCacheKeyFor !== sessionId) {
35751
- this.cachedCacheKeyFor = sessionId;
35752
- this.cachedCacheKey = `claudish_${createHash5("sha256").update(sessionId).digest("hex").slice(0, 32)}`;
35753
- }
35754
- return this.cachedCacheKey;
35757
+ return conversationKey(claudeRequest);
35755
35758
  }
35756
35759
  getContextWindow() {
35757
35760
  return lookupModelForProvider(this.modelName, this.name) ?? 0;
@@ -35759,6 +35762,21 @@ var init_openai_codex = __esm(() => {
35759
35762
  };
35760
35763
  });
35761
35764
 
35765
+ // src/providers/transport/opencode-zen.ts
35766
+ var OpenCodeZenTransport;
35767
+ var init_opencode_zen = __esm(() => {
35768
+ init_conversation_key();
35769
+ init_openai();
35770
+ OpenCodeZenTransport = class OpenCodeZenTransport extends OpenAIProviderTransport {
35771
+ async getHeaders(claudeRequest) {
35772
+ return {
35773
+ ...await super.getHeaders(),
35774
+ "x-opencode-session": conversationKey(claudeRequest)
35775
+ };
35776
+ }
35777
+ };
35778
+ });
35779
+
35762
35780
  // src/providers/transport/vertex-oauth.ts
35763
35781
  function parseVertexModel(modelId) {
35764
35782
  const parts = modelId.split("/");
@@ -35899,6 +35917,7 @@ var init_provider_profiles = __esm(() => {
35899
35917
  init_ollamacloud();
35900
35918
  init_openai_codex();
35901
35919
  init_openai();
35920
+ init_opencode_zen();
35902
35921
  init_vertex_oauth();
35903
35922
  geminiProfile = {
35904
35923
  createHandler(ctx) {
@@ -36020,7 +36039,7 @@ var init_provider_profiles = __esm(() => {
36020
36039
  const isGoProvider = ctx.provider.name === "opencode-zen-go";
36021
36040
  if (ctx.modelName.toLowerCase().startsWith("gpt-")) {
36022
36041
  const responsesProvider = { ...ctx.provider, apiPath: "/v1/responses" };
36023
- const transport = new OpenAIProviderTransport(responsesProvider, ctx.modelName, zenApiKey);
36042
+ const transport = new OpenCodeZenTransport(responsesProvider, ctx.modelName, zenApiKey);
36024
36043
  const adapter = new CodexAPIFormat(ctx.modelName);
36025
36044
  const handler = new ComposedHandler(transport, ctx.targetModel, ctx.modelName, ctx.port, {
36026
36045
  adapter,
@@ -36030,7 +36049,7 @@ var init_provider_profiles = __esm(() => {
36030
36049
  log(`[Proxy] Created OpenCode Zen${isGoProvider ? " Go" : ""} (Responses API composed): ${ctx.modelName}`);
36031
36050
  return handler;
36032
36051
  }
36033
- const transport = new OpenAIProviderTransport(ctx.provider, ctx.modelName, zenApiKey);
36052
+ const transport = new OpenCodeZenTransport(ctx.provider, ctx.modelName, zenApiKey);
36034
36053
  const adapter = new OpenAIAPIFormat(ctx.modelName);
36035
36054
  const handler = new ComposedHandler(transport, ctx.targetModel, ctx.modelName, ctx.port, {
36036
36055
  adapter,
@@ -40394,6 +40413,8 @@ function teamSlotIdleSeconds(teamSessionId) {
40394
40413
  return null;
40395
40414
  const out = {};
40396
40415
  for (const slotId of run.processes.keys()) {
40416
+ if (!run.isRunning(slotId))
40417
+ continue;
40397
40418
  const idle = run.idleMsFor(slotId);
40398
40419
  if (idle !== null)
40399
40420
  out[slotId] = Math.round(idle / 1000);
@@ -40406,6 +40427,8 @@ function teamSlotActivity(teamSessionId) {
40406
40427
  return null;
40407
40428
  const out = {};
40408
40429
  for (const slotId of run.processes.keys()) {
40430
+ if (!run.isRunning(slotId))
40431
+ continue;
40409
40432
  const activity = run.activityFor(slotId);
40410
40433
  if (activity !== null)
40411
40434
  out[slotId] = activity;
@@ -40418,6 +40441,8 @@ function teamSlotLiveBytes(teamSessionId) {
40418
40441
  return null;
40419
40442
  const out = {};
40420
40443
  for (const slotId of run.processes.keys()) {
40444
+ if (!run.isRunning(slotId))
40445
+ continue;
40421
40446
  const bytes = run.liveBytesFor(slotId);
40422
40447
  if (bytes !== null)
40423
40448
  out[slotId] = bytes;
@@ -40730,7 +40755,6 @@ async function startModels(sessionPath, opts = {}) {
40730
40755
  return;
40731
40756
  captureFinalized = true;
40732
40757
  absorb(slotReducer.end());
40733
- slotReducer.dispose();
40734
40758
  outputStream.end();
40735
40759
  };
40736
40760
  proc.stdout?.on("end", finalizeCapture);
@@ -40762,12 +40786,21 @@ async function startModels(sessionPath, opts = {}) {
40762
40786
  const completionPromise = new Promise((resolve) => {
40763
40787
  let exitCode = null;
40764
40788
  let resolved = false;
40789
+ const settleReducer = () => {
40790
+ if (!reducer)
40791
+ return;
40792
+ const state = statusCache.models[anonId]?.state;
40793
+ const failed = state === "FAILED" || state === "EMPTY";
40794
+ reducer.settle(failed && cancelledSlots.has(anonId) ? "cancelled" : state === "COMPLETED" ? "completed" : state === "TIMEOUT" ? "timeout" : "failed");
40795
+ reducer.dispose();
40796
+ };
40765
40797
  const finish = () => {
40766
40798
  if (resolved)
40767
40799
  return;
40768
40800
  if (statusCache.models[anonId].state === "TIMEOUT") {
40769
40801
  resolved = true;
40770
40802
  reconcileTimedOutOutput(anonId, byteCount, stdoutTail, stderr);
40803
+ settleReducer();
40771
40804
  resolve();
40772
40805
  return;
40773
40806
  }
@@ -40822,6 +40855,7 @@ async function startModels(sessionPath, opts = {}) {
40822
40855
  error: undefined
40823
40856
  });
40824
40857
  }
40858
+ settleReducer();
40825
40859
  opts.onStatusChange?.(anonId, statusCache.models[anonId]);
40826
40860
  resolve();
40827
40861
  };
@@ -40877,6 +40911,7 @@ async function startModels(sessionPath, opts = {}) {
40877
40911
  idleMsFor: (slotId) => runtimes.get(slotId)?.getIdleMs() ?? null,
40878
40912
  activityFor: (slotId) => runtimes.get(slotId)?.getActivity() ?? null,
40879
40913
  liveBytesFor: (slotId) => runtimes.get(slotId)?.getByteCount() ?? null,
40914
+ isRunning: (slotId) => statusCache.models[slotId]?.state === "RUNNING",
40880
40915
  cancelledSlots
40881
40916
  });
40882
40917
  const done = (async () => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claudish",
3
- "version": "9.3.0",
3
+ "version": "9.3.2",
4
4
  "description": "Run Claude Code with any model - OpenRouter, Ollama, LM Studio & local models",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -60,10 +60,10 @@
60
60
  "ai"
61
61
  ],
62
62
  "optionalDependencies": {
63
- "@claudish/magmux-darwin-arm64": "9.3.0",
64
- "@claudish/magmux-darwin-x64": "9.3.0",
65
- "@claudish/magmux-linux-arm64": "9.3.0",
66
- "@claudish/magmux-linux-x64": "9.3.0"
63
+ "@claudish/magmux-darwin-arm64": "9.3.2",
64
+ "@claudish/magmux-darwin-x64": "9.3.2",
65
+ "@claudish/magmux-linux-arm64": "9.3.2",
66
+ "@claudish/magmux-linux-x64": "9.3.2"
67
67
  },
68
68
  "author": "Jack Rudenko <i@madappgang.com>",
69
69
  "license": "MIT",