@rynfar/meridian 1.44.1 → 1.45.1

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.
@@ -1,3 +1,27 @@
1
+ // src/env.ts
2
+ function env(suffix) {
3
+ return process.env[`MERIDIAN_${suffix}`] ?? process.env[`CLAUDE_PROXY_${suffix}`];
4
+ }
5
+ function envBool(suffix) {
6
+ const val = env(suffix);
7
+ return val === "1" || val === "true" || val === "yes";
8
+ }
9
+ function resolvePassthrough(defaultValue) {
10
+ const val = env("PASSTHROUGH");
11
+ if (val === "1" || val === "true" || val === "yes")
12
+ return true;
13
+ if (val === "0" || val === "false" || val === "no")
14
+ return false;
15
+ return defaultValue;
16
+ }
17
+ function envInt(suffix, defaultValue) {
18
+ const val = env(suffix);
19
+ if (!val)
20
+ return defaultValue;
21
+ const parsed = parseInt(val, 10);
22
+ return Number.isFinite(parsed) ? parsed : defaultValue;
23
+ }
24
+
1
25
  // src/proxy/models.ts
2
26
  import { exec as execCallback, execFile as execFileCallback } from "child_process";
3
27
  import { existsSync, statSync } from "fs";
@@ -7,14 +31,16 @@ import { promisify } from "util";
7
31
  var exec = promisify(execCallback);
8
32
  var execFile = promisify(execFileCallback);
9
33
  var STUB_SIZE_THRESHOLD = 4096;
34
+ var CANONICAL_FABLE_MODEL = "claude-fable-5";
10
35
  var CANONICAL_OPUS_MODEL = "claude-opus-4-8";
11
36
  var CANONICAL_SONNET_MODEL = "claude-sonnet-4-6";
12
37
  var CANONICAL_HAIKU_MODEL = "claude-haiku-4-5";
13
- function resolveSdkModelDefaults(env = process.env) {
38
+ function resolveSdkModelDefaults(env2 = process.env) {
14
39
  return {
15
- ANTHROPIC_DEFAULT_OPUS_MODEL: env.MERIDIAN_DEFAULT_OPUS_MODEL ?? CANONICAL_OPUS_MODEL,
16
- ANTHROPIC_DEFAULT_SONNET_MODEL: env.MERIDIAN_DEFAULT_SONNET_MODEL ?? CANONICAL_SONNET_MODEL,
17
- ANTHROPIC_DEFAULT_HAIKU_MODEL: env.MERIDIAN_DEFAULT_HAIKU_MODEL ?? CANONICAL_HAIKU_MODEL
40
+ ANTHROPIC_DEFAULT_FABLE_MODEL: env2.MERIDIAN_DEFAULT_FABLE_MODEL ?? CANONICAL_FABLE_MODEL,
41
+ ANTHROPIC_DEFAULT_OPUS_MODEL: env2.MERIDIAN_DEFAULT_OPUS_MODEL ?? CANONICAL_OPUS_MODEL,
42
+ ANTHROPIC_DEFAULT_SONNET_MODEL: env2.MERIDIAN_DEFAULT_SONNET_MODEL ?? CANONICAL_SONNET_MODEL,
43
+ ANTHROPIC_DEFAULT_HAIKU_MODEL: env2.MERIDIAN_DEFAULT_HAIKU_MODEL ?? CANONICAL_HAIKU_MODEL
18
44
  };
19
45
  }
20
46
  var AUTH_STATUS_CACHE_TTL_MS = 60000;
@@ -25,6 +51,9 @@ var cachedAuthStatusAt = 0;
25
51
  var cachedAuthStatusIsFailure = false;
26
52
  var cachedAuthStatusPromise = null;
27
53
  function supports1mContext(model) {
54
+ const override = env("1M_CONTEXT_SUPPORT");
55
+ if (override === "0" || override === "false" || override === "no")
56
+ return false;
28
57
  if (model.includes("4-5") || model.includes("4.5"))
29
58
  return false;
30
59
  return true;
@@ -34,6 +63,11 @@ function mapModelToClaudeModel(model, subscriptionType, agentMode) {
34
63
  return "haiku";
35
64
  const use1m = supports1mContext(model);
36
65
  const isSubagent = agentMode === "subagent";
66
+ if (model.includes("fable")) {
67
+ if (use1m && !isSubagent && !isExtendedContextKnownUnavailable())
68
+ return "fable[1m]";
69
+ return "fable";
70
+ }
37
71
  if (model.includes("opus")) {
38
72
  if (use1m && !isSubagent && !isExtendedContextKnownUnavailable())
39
73
  return "opus[1m]";
@@ -60,6 +94,8 @@ function stripExtendedContext(model) {
60
94
  return "opus";
61
95
  if (model === "sonnet[1m]")
62
96
  return "sonnet";
97
+ if (model === "fable[1m]")
98
+ return "fable";
63
99
  return model;
64
100
  }
65
101
  function hasExtendedContext(model) {
@@ -219,9 +255,9 @@ function tryLegacySdkCliJs(deps) {
219
255
  }
220
256
  }
221
257
  async function resolveClaudeExecutableWithSource(deps = DEFAULT_DEPS) {
222
- const env = tryEnvOverride(deps);
223
- if (env)
224
- return { path: env, source: "env" };
258
+ const env2 = tryEnvOverride(deps);
259
+ if (env2)
260
+ return { path: env2, source: "env" };
225
261
  const bundled = tryBundledBinary(deps);
226
262
  if (bundled)
227
263
  return { path: bundled, source: "bundled" };
@@ -237,9 +273,9 @@ async function resolveClaudeExecutableWithSource(deps = DEFAULT_DEPS) {
237
273
  return null;
238
274
  }
239
275
  function resolveClaudeExecutableSync(deps = DEFAULT_DEPS) {
240
- const env = tryEnvOverride(deps);
241
- if (env)
242
- return { path: env, source: "env" };
276
+ const env2 = tryEnvOverride(deps);
277
+ if (env2)
278
+ return { path: env2, source: "env" };
243
279
  const bundled = tryBundledBinary(deps);
244
280
  if (bundled)
245
281
  return { path: bundled, source: "bundled" };
@@ -276,4 +312,4 @@ function isClosedControllerError(error) {
276
312
  return error.message.includes("Controller is already closed");
277
313
  }
278
314
 
279
- export { resolveSdkModelDefaults, mapModelToClaudeModel, recordExtendedContextUnavailable, stripExtendedContext, hasExtendedContext, getAuthCacheInfo, getClaudeAuthStatusAsync, resolveClaudeExecutableSync, getResolvedClaudeExecutableInfo, resolveClaudeExecutableAsync, isClosedControllerError };
315
+ export { env, envBool, resolvePassthrough, envInt, resolveSdkModelDefaults, mapModelToClaudeModel, recordExtendedContextUnavailable, stripExtendedContext, hasExtendedContext, getAuthCacheInfo, getClaudeAuthStatusAsync, resolveClaudeExecutableSync, getResolvedClaudeExecutableInfo, resolveClaudeExecutableAsync, isClosedControllerError };
@@ -21,6 +21,9 @@ import {
21
21
  themeCss
22
22
  } from "./cli-4rqtm83g.js";
23
23
  import {
24
+ env,
25
+ envBool,
26
+ envInt,
24
27
  getAuthCacheInfo,
25
28
  getClaudeAuthStatusAsync,
26
29
  getResolvedClaudeExecutableInfo,
@@ -29,9 +32,10 @@ import {
29
32
  mapModelToClaudeModel,
30
33
  recordExtendedContextUnavailable,
31
34
  resolveClaudeExecutableAsync,
35
+ resolvePassthrough,
32
36
  resolveSdkModelDefaults,
33
37
  stripExtendedContext
34
- } from "./cli-yeazzt32.js";
38
+ } from "./cli-7bygmvmv.js";
35
39
  import {
36
40
  checkPluginConfigured
37
41
  } from "./cli-je60fevk.js";
@@ -1191,6 +1195,7 @@ __export(exports_sdkFeatures, {
1191
1195
  updateAdapterFeatures: () => updateAdapterFeatures,
1192
1196
  resetAdapterFeatures: () => resetAdapterFeatures,
1193
1197
  getFeaturesForAdapter: () => getFeaturesForAdapter,
1198
+ getExplicitThinking: () => getExplicitThinking,
1194
1199
  getAllFeatureConfigs: () => getAllFeatureConfigs
1195
1200
  });
1196
1201
  import { existsSync as existsSync5, mkdirSync as mkdirSync2, readFileSync as readFileSync4, writeFileSync as writeFileSync2, renameSync as renameSync2 } from "node:fs";
@@ -1241,6 +1246,10 @@ function getFeaturesForAdapter(adapterName) {
1241
1246
  ...userOverrides
1242
1247
  };
1243
1248
  }
1249
+ function getExplicitThinking(adapterName) {
1250
+ const explicit = readConfig()[adapterName]?.thinking;
1251
+ return typeof explicit === "string" && VALID_THINKING_VALUES.has(explicit) ? explicit : undefined;
1252
+ }
1244
1253
  function getAllFeatureConfigs() {
1245
1254
  const adapters = ["opencode", "crush", "forgecode", "pi", "droid", "passthrough", "openai"];
1246
1255
  const result = {};
@@ -2376,16 +2385,16 @@ var Hono = class _Hono {
2376
2385
  }
2377
2386
  throw err;
2378
2387
  }
2379
- #dispatch(request, executionCtx, env, method) {
2388
+ #dispatch(request, executionCtx, env2, method) {
2380
2389
  if (method === "HEAD") {
2381
- return (async () => new Response(null, await this.#dispatch(request, executionCtx, env, "GET")))();
2390
+ return (async () => new Response(null, await this.#dispatch(request, executionCtx, env2, "GET")))();
2382
2391
  }
2383
- const path = this.getPath(request, { env });
2392
+ const path = this.getPath(request, { env: env2 });
2384
2393
  const matchResult = this.router.match(method, path);
2385
2394
  const c = new Context(request, {
2386
2395
  path,
2387
2396
  matchResult,
2388
- env,
2397
+ env: env2,
2389
2398
  executionCtx,
2390
2399
  notFoundHandler: this.#notFoundHandler
2391
2400
  });
@@ -3732,11 +3741,11 @@ import { query } from "@anthropic-ai/claude-agent-sdk";
3732
3741
  // src/proxy/rateLimitStore.ts
3733
3742
  class RateLimitStore {
3734
3743
  entries = new Map;
3735
- record(info) {
3744
+ record(info, observedAt = Date.now()) {
3736
3745
  if (!info || typeof info !== "object")
3737
3746
  return;
3738
3747
  const key = info.rateLimitType ?? "default";
3739
- this.entries.set(key, { ...info, observedAt: Date.now() });
3748
+ this.entries.set(key, { ...info, observedAt });
3740
3749
  }
3741
3750
  getAll() {
3742
3751
  return Array.from(this.entries.values()).sort((a, b) => b.observedAt - a.observedAt);
@@ -3764,22 +3773,27 @@ class UpstreamIdleError extends Error {
3764
3773
  this.sinceLastMs = sinceLastMs;
3765
3774
  }
3766
3775
  }
3767
- async function* guardUpstreamIdle(source, idleMs, onStall) {
3776
+ var realClock = {
3777
+ now: () => Date.now(),
3778
+ setTimeout: (fn, ms) => setTimeout(fn, ms),
3779
+ clearTimeout: (handle) => clearTimeout(handle)
3780
+ };
3781
+ async function* guardUpstreamIdle(source, idleMs, onStall, clock = realClock) {
3768
3782
  if (idleMs <= 0) {
3769
3783
  yield* source;
3770
3784
  return;
3771
3785
  }
3772
3786
  const it = source[Symbol.asyncIterator]();
3773
- let lastAt = Date.now();
3787
+ let lastAt = clock.now();
3774
3788
  try {
3775
3789
  while (true) {
3776
3790
  const nextP = it.next();
3777
3791
  nextP.catch(() => {});
3778
3792
  let timer;
3779
3793
  const idle = new Promise((_, reject) => {
3780
- const remaining = Math.max(0, idleMs - (Date.now() - lastAt));
3781
- timer = setTimeout(() => {
3782
- const sinceLastMs = Date.now() - lastAt;
3794
+ const remaining = Math.max(0, idleMs - (clock.now() - lastAt));
3795
+ timer = clock.setTimeout(() => {
3796
+ const sinceLastMs = clock.now() - lastAt;
3783
3797
  try {
3784
3798
  onStall?.(sinceLastMs);
3785
3799
  } catch {}
@@ -3790,12 +3804,12 @@ async function* guardUpstreamIdle(source, idleMs, onStall) {
3790
3804
  try {
3791
3805
  res = await Promise.race([nextP, idle]);
3792
3806
  } finally {
3793
- if (timer)
3794
- clearTimeout(timer);
3807
+ if (timer !== undefined)
3808
+ clock.clearTimeout(timer);
3795
3809
  }
3796
3810
  if (res.done)
3797
3811
  return;
3798
- lastAt = Date.now();
3812
+ lastAt = clock.now();
3799
3813
  yield res.value;
3800
3814
  }
3801
3815
  } finally {
@@ -3804,6 +3818,33 @@ async function* guardUpstreamIdle(source, idleMs, onStall) {
3804
3818
  }
3805
3819
  }
3806
3820
 
3821
+ // src/proxy/requestAbort.ts
3822
+ function linkRequestAbort(signal) {
3823
+ const controller = new AbortController;
3824
+ let attached = false;
3825
+ const abort = (reason) => {
3826
+ if (!controller.signal.aborted)
3827
+ controller.abort(reason);
3828
+ };
3829
+ const forwardAbort = () => abort(signal.reason);
3830
+ if (signal.aborted) {
3831
+ forwardAbort();
3832
+ } else {
3833
+ signal.addEventListener("abort", forwardAbort, { once: true });
3834
+ attached = true;
3835
+ }
3836
+ return {
3837
+ controller,
3838
+ abort,
3839
+ detach: () => {
3840
+ if (!attached)
3841
+ return;
3842
+ signal.removeEventListener("abort", forwardAbort);
3843
+ attached = false;
3844
+ }
3845
+ };
3846
+ }
3847
+
3807
3848
  // src/proxy/oauthUsage.ts
3808
3849
  var OAUTH_USAGE_URL = "https://api.anthropic.com/api/oauth/usage";
3809
3850
  var OAUTH_BETA_HEADER = "oauth-2025-04-20";
@@ -3949,30 +3990,6 @@ var DEFAULT_PROXY_CONFIG = {
3949
3990
  version: undefined
3950
3991
  };
3951
3992
 
3952
- // src/env.ts
3953
- function env(suffix) {
3954
- return process.env[`MERIDIAN_${suffix}`] ?? process.env[`CLAUDE_PROXY_${suffix}`];
3955
- }
3956
- function envBool(suffix) {
3957
- const val = env(suffix);
3958
- return val === "1" || val === "true" || val === "yes";
3959
- }
3960
- function resolvePassthrough(defaultValue) {
3961
- const val = env("PASSTHROUGH");
3962
- if (val === "1" || val === "true" || val === "yes")
3963
- return true;
3964
- if (val === "0" || val === "false" || val === "no")
3965
- return false;
3966
- return defaultValue;
3967
- }
3968
- function envInt(suffix, defaultValue) {
3969
- const val = env(suffix);
3970
- if (!val)
3971
- return defaultValue;
3972
- const parsed = parseInt(val, 10);
3973
- return Number.isFinite(parsed) ? parsed : defaultValue;
3974
- }
3975
-
3976
3993
  // src/proxy/transform.ts
3977
3994
  function runTransformHook(transforms, hook, ctx, adapterName) {
3978
3995
  return transforms.reduce((acc, transform) => {
@@ -8121,6 +8138,9 @@ function stableStringify(value) {
8121
8138
  const parts = keys.map((k) => `${JSON.stringify(k)}:${stableStringify(value[k])}`);
8122
8139
  return `{${parts.join(",")}}`;
8123
8140
  }
8141
+ function toolUseSignature(name, input) {
8142
+ return `${name}::${stableStringify(input ?? null)}`;
8143
+ }
8124
8144
  function stripMcpPrefix(toolName) {
8125
8145
  if (toolName.startsWith(PASSTHROUGH_MCP_PREFIX)) {
8126
8146
  return toolName.slice(PASSTHROUGH_MCP_PREFIX.length);
@@ -9727,6 +9747,14 @@ function buildModelList(isMaxSubscription, now = Math.floor(Date.now() / 1000))
9727
9747
  display_name: "Claude Opus 4.8",
9728
9748
  context_window: isMaxSubscription ? 1e6 : 200000
9729
9749
  },
9750
+ {
9751
+ id: "claude-fable-5",
9752
+ object: "model",
9753
+ created: now,
9754
+ owned_by: "anthropic",
9755
+ display_name: "Claude Fable 5",
9756
+ context_window: isMaxSubscription ? 1e6 : 200000
9757
+ },
9730
9758
  {
9731
9759
  id: "claude-haiku-4-5",
9732
9760
  object: "model",
@@ -9989,7 +10017,6 @@ var BLOCKED_BUILTIN_TOOLS = [
9989
10017
  "Read",
9990
10018
  "Write",
9991
10019
  "Edit",
9992
- "MultiEdit",
9993
10020
  "Bash",
9994
10021
  "Glob",
9995
10022
  "Grep",
@@ -16565,7 +16592,9 @@ function stripConfigDir(env2) {
16565
16592
  }
16566
16593
  function computePassthroughMaxTurns(resumeSessionId, hasDeferredTools, advisorModel) {
16567
16594
  const hasResume = !!resumeSessionId;
16568
- const base = hasResume && hasDeferredTools ? 4 : 3;
16595
+ const defaultBase = hasResume && hasDeferredTools ? 4 : 3;
16596
+ const configured = envInt("PASSTHROUGH_MAX_TURNS", defaultBase);
16597
+ const base = configured > 0 ? configured : defaultBase;
16569
16598
  const advisorBump = advisorModel ? 3 : 0;
16570
16599
  return base + advisorBump;
16571
16600
  }
@@ -16596,7 +16625,7 @@ function resolveSystemPrompt(systemContext, passthrough, settingSources, codeSys
16596
16625
  return { systemPrompt: "" };
16597
16626
  return {};
16598
16627
  }
16599
- function buildQueryOptions(ctx) {
16628
+ function buildQueryOptions(ctx, abortController) {
16600
16629
  const {
16601
16630
  prompt,
16602
16631
  model,
@@ -16622,6 +16651,7 @@ function buildQueryOptions(ctx) {
16622
16651
  effort,
16623
16652
  thinking,
16624
16653
  taskBudget,
16654
+ outputFormat,
16625
16655
  betas,
16626
16656
  settingSources,
16627
16657
  codeSystemPrompt,
@@ -16644,6 +16674,7 @@ function buildQueryOptions(ctx) {
16644
16674
  cwd: workingDirectory,
16645
16675
  model,
16646
16676
  pathToClaudeCodeExecutable: claudeExecutable,
16677
+ ...abortController ? { abortController } : {},
16647
16678
  ...stream2 ? { includePartialMessages: true } : {},
16648
16679
  permissionMode: "bypassPermissions",
16649
16680
  allowDangerouslySkipPermissions: true,
@@ -16684,6 +16715,7 @@ function buildQueryOptions(ctx) {
16684
16715
  ...effort ? { effort } : {},
16685
16716
  ...thinking ? { thinking } : {},
16686
16717
  ...taskBudget ? { taskBudget } : {},
16718
+ ...outputFormat ? { outputFormat } : {},
16687
16719
  ...betas && betas.length > 0 ? { betas } : {},
16688
16720
  ...maxBudgetUsd && maxBudgetUsd > 0 ? { maxBudgetUsd } : {},
16689
16721
  ...fallbackModel ? { fallbackModel } : {},
@@ -16700,6 +16732,40 @@ function normalizeEffort(value) {
16700
16732
  return typeof value === "string" && VALID_EFFORTS.includes(value) ? value : undefined;
16701
16733
  }
16702
16734
 
16735
+ // src/proxy/structuredOutput.ts
16736
+ function isRecord(value) {
16737
+ return value !== null && typeof value === "object" && !Array.isArray(value);
16738
+ }
16739
+ function parseOutputFormat(outputConfig, tools) {
16740
+ if (outputConfig === undefined)
16741
+ return { ok: true, value: undefined };
16742
+ if (!isRecord(outputConfig)) {
16743
+ return { ok: false, message: "output_config: Expected an object" };
16744
+ }
16745
+ const format = outputConfig.format;
16746
+ if (format === undefined)
16747
+ return { ok: true, value: undefined };
16748
+ if (!isRecord(format)) {
16749
+ return { ok: false, message: "output_config.format: Expected an object" };
16750
+ }
16751
+ if (format.type !== "json_schema") {
16752
+ return { ok: false, message: "output_config.format.type: Only 'json_schema' is supported" };
16753
+ }
16754
+ if (!isRecord(format.schema)) {
16755
+ return { ok: false, message: "output_config.format.schema: Expected a JSON Schema object" };
16756
+ }
16757
+ if (Array.isArray(tools) && tools.length > 0) {
16758
+ return { ok: false, message: "output_config.format: Cannot be combined with tools" };
16759
+ }
16760
+ return {
16761
+ ok: true,
16762
+ value: { type: "json_schema", schema: format.schema }
16763
+ };
16764
+ }
16765
+ function structuredOutputText(value) {
16766
+ return JSON.stringify(value);
16767
+ }
16768
+
16703
16769
  // src/proxy/transforms/registry.ts
16704
16770
  var ADAPTER_TRANSFORMS = {
16705
16771
  opencode: openCodeTransforms,
@@ -17831,6 +17897,8 @@ function createProxyServer(config = {}) {
17831
17897
  }
17832
17898
  const handleMessages = async (c, requestMeta) => {
17833
17899
  const requestStartAt = Date.now();
17900
+ const requestAbort = linkRequestAbort(c.req.raw.signal);
17901
+ let streamOwnsAbortLink = false;
17834
17902
  return withClaudeLogContext({ requestId: requestMeta.requestId, endpoint: requestMeta.endpoint }, async () => {
17835
17903
  const adapter = detectAdapter(c);
17836
17904
  try {
@@ -17851,13 +17919,18 @@ function createProxyServer(config = {}) {
17851
17919
  if (body.messages.length === 0) {
17852
17920
  return c.json({ type: "error", error: { type: "invalid_request_error", message: "messages: Cannot be empty — at least one message is required" } }, 400);
17853
17921
  }
17922
+ const parsedOutputFormat = parseOutputFormat(body.output_config, body.tools);
17923
+ if (!parsedOutputFormat.ok) {
17924
+ return c.json({ type: "error", error: { type: "invalid_request_error", message: parsedOutputFormat.message } }, 400);
17925
+ }
17926
+ const outputFormat = parsedOutputFormat.value;
17854
17927
  const profile = resolveProfile(finalConfig.profiles, finalConfig.defaultProfile, c.req.header("x-meridian-profile") || undefined);
17855
17928
  const authStatus = await getClaudeAuthStatusAsync(profile.id !== "default" ? profile.id : undefined, Object.keys(profile.env).length > 0 ? profile.env : undefined);
17856
17929
  const agentMode = c.req.header("x-opencode-agent-mode") ?? null;
17857
17930
  const requestSource = c.req.header("x-meridian-source")?.slice(0, 64) || undefined;
17858
17931
  const requestedModel = typeof body.model === "string" ? body.model : "sonnet";
17859
17932
  let model = mapModelToClaudeModel(requestedModel, authStatus?.subscriptionType, agentMode);
17860
- const envOverrides = requestedModel.startsWith("claude-opus-") ? { ANTHROPIC_DEFAULT_OPUS_MODEL: requestedModel } : undefined;
17933
+ const envOverrides = requestedModel.startsWith("claude-opus-") ? { ANTHROPIC_DEFAULT_OPUS_MODEL: requestedModel } : requestedModel.startsWith("claude-fable-") ? { ANTHROPIC_DEFAULT_FABLE_MODEL: requestedModel } : requestedModel.startsWith("claude-sonnet-") ? { ANTHROPIC_DEFAULT_SONNET_MODEL: requestedModel } : requestedModel.startsWith("claude-haiku-") ? { ANTHROPIC_DEFAULT_HAIKU_MODEL: requestedModel } : undefined;
17861
17934
  const cwdResolution = resolveSdkWorkingDirectory({
17862
17935
  envOverride: process.env.MERIDIAN_WORKDIR ?? process.env.CLAUDE_PROXY_WORKDIR,
17863
17936
  adapterCwd: adapter.extractWorkingDirectory(body),
@@ -17913,7 +17986,7 @@ function createProxyServer(config = {}) {
17913
17986
  if (betaFilter.stripped.length > 0) {
17914
17987
  plog(`[PROXY] ${requestMeta.requestId} stripped anthropic-beta(s) for Max profile: ${betaFilter.stripped.join(", ")}`);
17915
17988
  }
17916
- const effort = normalizeEffort(effortHeader || body.effort || body.reasoning_effort || body.output_config?.effort);
17989
+ let effort = normalizeEffort(effortHeader || body.effort || body.reasoning_effort || body.output_config?.effort);
17917
17990
  let thinking = body.thinking || undefined;
17918
17991
  if (thinkingHeader !== undefined) {
17919
17992
  try {
@@ -17922,9 +17995,13 @@ function createProxyServer(config = {}) {
17922
17995
  plog(`[PROXY] ${requestMeta.requestId} ignoring malformed x-opencode-thinking header: ${e instanceof Error ? e.message : String(e)}`);
17923
17996
  }
17924
17997
  }
17925
- const { getFeaturesForAdapter: getFeaturesForAdapter2 } = (init_sdkFeatures(), __toCommonJS(exports_sdkFeatures));
17998
+ const { getFeaturesForAdapter: getFeaturesForAdapter2, getExplicitThinking: getExplicitThinking2 } = (init_sdkFeatures(), __toCommonJS(exports_sdkFeatures));
17926
17999
  const sdkFeatures = getFeaturesForAdapter2(adapter.name);
17927
- if (!thinking) {
18000
+ if (getExplicitThinking2(adapter.name) === "disabled") {
18001
+ thinking = { type: "disabled" };
18002
+ effort = undefined;
18003
+ plog(`[PROXY] ${requestMeta.requestId} thinking disabled (per-adapter setting)`);
18004
+ } else if (!thinking) {
17928
18005
  if (sdkFeatures.thinking === "adaptive")
17929
18006
  thinking = { type: "adaptive" };
17930
18007
  else if (sdkFeatures.thinking === "enabled")
@@ -17933,6 +18010,7 @@ function createProxyServer(config = {}) {
17933
18010
  const thinkingBetaStripped = betaFilter.stripped.some((b) => b.startsWith("interleaved-thinking"));
17934
18011
  if (thinkingBetaStripped) {
17935
18012
  thinking = { type: "disabled" };
18013
+ effort = undefined;
17936
18014
  if (betaFilter.stripped.length > 0) {
17937
18015
  plog(`[PROXY] ${requestMeta.requestId} thinking disabled (thinking beta stripped by ${getBetaPolicyFromEnv()} policy)`);
17938
18016
  }
@@ -17943,7 +18021,10 @@ function createProxyServer(config = {}) {
17943
18021
  const agentSessionId = adapter.getSessionId(c);
17944
18022
  const profileSessionId = profile.id !== "default" && agentSessionId ? `${profile.id}:${agentSessionId}` : agentSessionId;
17945
18023
  const profileScopedCwd = profile.id !== "default" ? `${clientWorkingDirectory}::profile=${profile.id}` : clientWorkingDirectory;
17946
- const isIndependentSession = requestSource?.startsWith("fork-") || requestSource?.startsWith("subagent-") || false;
18024
+ const lastMessage = Array.isArray(body.messages) ? body.messages[body.messages.length - 1] : undefined;
18025
+ const lastIsToolResult = Array.isArray(lastMessage?.content) && lastMessage.content.some((b) => b?.type === "tool_result");
18026
+ const isClientDrivenLoop = !agentSessionId && lastIsToolResult;
18027
+ const isIndependentSession = requestSource?.startsWith("fork-") || requestSource?.startsWith("subagent-") || isClientDrivenLoop || false;
17947
18028
  let lineageResult = isIndependentSession ? { type: "diverged" } : lookupSession(profileSessionId, body.messages || [], profileScopedCwd);
17948
18029
  if (lineageResult.type === "undo" && adapter.name === "opencode" && !agentSessionId) {
17949
18030
  lineageResult = { type: "diverged" };
@@ -18053,6 +18134,11 @@ function createProxyServer(config = {}) {
18053
18134
  const passthrough = pipelineCtx.passthrough !== undefined ? pipelineCtx.passthrough : envBool("PASSTHROUGH");
18054
18135
  const settingSources = envBool("LOAD_CONTEXT") || sdkFeatures.claudeMd === "full" ? ["user", "project"] : sdkFeatures.claudeMd === "project" ? ["project"] : pipelineCtx.settingSources ?? [];
18055
18136
  const capturedToolUses = [];
18137
+ const capturedSignatures = new Set;
18138
+ const capturedToolNames = new Set;
18139
+ let sawDuplicateToolUse = false;
18140
+ const toolChoice = body.tool_choice;
18141
+ const forceSingleToolUse = !!toolChoice && (toolChoice.type === "tool" || toolChoice.disable_parallel_tool_use === true);
18056
18142
  const fileChanges = [];
18057
18143
  let passthroughMcp;
18058
18144
  let requestTools = Array.isArray(body.tools) ? body.tools : [];
@@ -18101,6 +18187,8 @@ function createProxyServer(config = {}) {
18101
18187
  hooks: [async (input) => {
18102
18188
  if (input.tool_name === "ToolSearch")
18103
18189
  return {};
18190
+ if (input.tool_name === "StructuredOutput")
18191
+ return {};
18104
18192
  const toolName = stripMcpPrefix(input.tool_name);
18105
18193
  if (hasDeferredTools && coreSet && !coreSet.has(toolName.toLowerCase())) {
18106
18194
  discoveredTools.add(toolName);
@@ -18110,11 +18198,28 @@ function createProxyServer(config = {}) {
18110
18198
  if (toolName.toLowerCase() === "task" && toolInput?.subagent_type && typeof toolInput.subagent_type === "string") {
18111
18199
  toolInput = { ...toolInput, subagent_type: resolveAgentAlias(toolInput.subagent_type) };
18112
18200
  }
18113
- capturedToolUses.push({
18114
- id: input.tool_use_id,
18115
- name: toolName,
18116
- input: toolInput
18117
- });
18201
+ const signature = toolUseSignature(toolName, toolInput);
18202
+ const isExactDuplicate = capturedSignatures.has(signature);
18203
+ const isSameToolRepeat = !isExactDuplicate && capturedToolNames.has(toolName);
18204
+ const exceedsForcedSingle = forceSingleToolUse && capturedToolUses.length >= 1;
18205
+ if (isExactDuplicate) {
18206
+ claudeLog("passthrough.duplicate_tool_use_dropped", { name: toolName });
18207
+ } else if (isSameToolRepeat || exceedsForcedSingle) {
18208
+ sawDuplicateToolUse = true;
18209
+ claudeLog("passthrough.extra_tool_use_dropped", {
18210
+ name: toolName,
18211
+ reason: exceedsForcedSingle ? "forced_single" : "same_tool_repeat"
18212
+ });
18213
+ requestAbort.abort("passthrough single-step complete");
18214
+ } else {
18215
+ capturedSignatures.add(signature);
18216
+ capturedToolNames.add(toolName);
18217
+ capturedToolUses.push({
18218
+ id: input.tool_use_id,
18219
+ name: toolName,
18220
+ input: toolInput
18221
+ });
18222
+ }
18118
18223
  return {
18119
18224
  decision: "block",
18120
18225
  reason: "This tool call has been forwarded to the client for execution. " + "The result will be delivered in a future turn. " + "Do not retry, do not call additional tools, and do not generate further text — end your turn now."
@@ -18133,6 +18238,8 @@ function createProxyServer(config = {}) {
18133
18238
  if (!stream2) {
18134
18239
  const contentBlocks = [];
18135
18240
  let assistantMessages = 0;
18241
+ let hasStructuredOutput = false;
18242
+ let structuredOutput;
18136
18243
  const upstreamStartAt = Date.now();
18137
18244
  let firstChunkAt;
18138
18245
  let currentSessionId;
@@ -18184,6 +18291,7 @@ function createProxyServer(config = {}) {
18184
18291
  effort,
18185
18292
  thinking,
18186
18293
  taskBudget,
18294
+ outputFormat,
18187
18295
  betas,
18188
18296
  settingSources,
18189
18297
  codeSystemPrompt: sdkFeatures.codeSystemPrompt,
@@ -18196,7 +18304,7 @@ function createProxyServer(config = {}) {
18196
18304
  sdkDebug: sdkFeatures.sdkDebug,
18197
18305
  additionalDirectories: sdkFeatures.additionalDirectories ? sdkFeatures.additionalDirectories.split(",").map((d) => d.trim()).filter(Boolean) : undefined,
18198
18306
  advisorModel
18199
- }))) {
18307
+ }, requestAbort.controller))) {
18200
18308
  if (event.type === "rate_limit_event") {
18201
18309
  rateLimitStore.record(event.rate_limit_info);
18202
18310
  }
@@ -18247,6 +18355,7 @@ function createProxyServer(config = {}) {
18247
18355
  effort,
18248
18356
  thinking,
18249
18357
  taskBudget,
18358
+ outputFormat,
18250
18359
  betas,
18251
18360
  settingSources,
18252
18361
  codeSystemPrompt: sdkFeatures.codeSystemPrompt,
@@ -18259,7 +18368,7 @@ function createProxyServer(config = {}) {
18259
18368
  sdkDebug: sdkFeatures.sdkDebug,
18260
18369
  additionalDirectories: sdkFeatures.additionalDirectories ? sdkFeatures.additionalDirectories.split(",").map((d) => d.trim()).filter(Boolean) : undefined,
18261
18370
  advisorModel
18262
- }));
18371
+ }, requestAbort.controller));
18263
18372
  return;
18264
18373
  }
18265
18374
  if (isExtraUsageRequiredError(errMsg) && hasExtendedContext(model)) {
@@ -18313,6 +18422,7 @@ function createProxyServer(config = {}) {
18313
18422
  effort,
18314
18423
  thinking,
18315
18424
  taskBudget,
18425
+ outputFormat,
18316
18426
  betas,
18317
18427
  settingSources,
18318
18428
  codeSystemPrompt: sdkFeatures.codeSystemPrompt,
@@ -18325,7 +18435,7 @@ function createProxyServer(config = {}) {
18325
18435
  sdkDebug: sdkFeatures.sdkDebug,
18326
18436
  additionalDirectories: sdkFeatures.additionalDirectories ? sdkFeatures.additionalDirectories.split(",").map((d) => d.trim()).filter(Boolean) : undefined,
18327
18437
  advisorModel
18328
- }));
18438
+ }, requestAbort.controller));
18329
18439
  return;
18330
18440
  }
18331
18441
  if (isExpiredTokenError(errMsg) && !tokenRefreshed) {
@@ -18373,6 +18483,10 @@ function createProxyServer(config = {}) {
18373
18483
  if (message.session_id) {
18374
18484
  currentSessionId = message.session_id;
18375
18485
  }
18486
+ if (passthrough && sawDuplicateToolUse) {
18487
+ claudeLog("passthrough.loop_break", { mode: "non_stream", assistantMessages, captured: capturedToolUses.length });
18488
+ break;
18489
+ }
18376
18490
  if (message.type === "assistant") {
18377
18491
  assistantMessages += 1;
18378
18492
  if (message.uuid) {
@@ -18418,6 +18532,10 @@ function createProxyServer(config = {}) {
18418
18532
  if (resultUsage) {
18419
18533
  lastUsage = { ...lastUsage, ...resultUsage };
18420
18534
  }
18535
+ if (outputFormat && "structured_output" in message) {
18536
+ hasStructuredOutput = true;
18537
+ structuredOutput = message.structured_output;
18538
+ }
18421
18539
  }
18422
18540
  }
18423
18541
  claudeLog("upstream.completed", {
@@ -18445,14 +18563,40 @@ function createProxyServer(config = {}) {
18445
18563
  error.message = `${error.message}
18446
18564
  Subprocess stderr: ${stderrOutput}`;
18447
18565
  }
18448
- claudeLog("upstream.failed", {
18449
- mode: "non_stream",
18450
- model,
18451
- durationMs: Date.now() - upstreamStartAt,
18452
- error: error instanceof Error ? error.message : String(error),
18453
- ...stderrOutput ? { stderr: stderrOutput } : {}
18566
+ const sdkTerm = extractSdkTermination(error instanceof Error ? error.message : String(error));
18567
+ const canRecoverAsToolUse = passthrough && capturedToolUses.length > 0 && (sdkTerm.reason === "max_turns" || sdkTerm.reason === "aborted");
18568
+ if (canRecoverAsToolUse) {
18569
+ diagnosticLog2.session(`${requestMeta.requestId} sdk_termination_recovered ${formatSdkTermination(sdkTerm, {
18570
+ model,
18571
+ requestSource,
18572
+ isResume,
18573
+ hasDeferredTools,
18574
+ sdkSessionId: resumeSessionId
18575
+ })} captured=${capturedToolUses.length}`, requestMeta.requestId);
18576
+ claudeLog("passthrough.max_turns_recovered", {
18577
+ mode: "non_stream",
18578
+ reason: sdkTerm.reason,
18579
+ captured: capturedToolUses.length
18580
+ });
18581
+ } else {
18582
+ claudeLog("upstream.failed", {
18583
+ mode: "non_stream",
18584
+ model,
18585
+ durationMs: Date.now() - upstreamStartAt,
18586
+ error: error instanceof Error ? error.message : String(error),
18587
+ ...stderrOutput ? { stderr: stderrOutput } : {}
18588
+ });
18589
+ throw error;
18590
+ }
18591
+ }
18592
+ if (outputFormat) {
18593
+ if (!hasStructuredOutput) {
18594
+ throw new Error("Structured output was requested but the SDK returned no structured_output result");
18595
+ }
18596
+ contentBlocks.splice(0, contentBlocks.length, {
18597
+ type: "text",
18598
+ text: structuredOutputText(structuredOutput)
18454
18599
  });
18455
- throw error;
18456
18600
  }
18457
18601
  if (passthrough && capturedToolUses.length > 0) {
18458
18602
  const capturedById = new Map(capturedToolUses.map((tu) => [tu.id, tu]));
@@ -18603,6 +18747,8 @@ Subprocess stderr: ${stderrOutput}`;
18603
18747
  sdkUuidMap.push(null);
18604
18748
  let messageStartEmitted = false;
18605
18749
  let lastUsage;
18750
+ let hasStructuredOutput = false;
18751
+ let structuredOutput;
18606
18752
  const streamedToolUseIds = new Set;
18607
18753
  try {
18608
18754
  let currentSessionId;
@@ -18644,6 +18790,7 @@ Subprocess stderr: ${stderrOutput}`;
18644
18790
  effort,
18645
18791
  thinking,
18646
18792
  taskBudget,
18793
+ outputFormat,
18647
18794
  betas,
18648
18795
  settingSources,
18649
18796
  codeSystemPrompt: sdkFeatures.codeSystemPrompt,
@@ -18656,7 +18803,7 @@ Subprocess stderr: ${stderrOutput}`;
18656
18803
  sdkDebug: sdkFeatures.sdkDebug,
18657
18804
  additionalDirectories: sdkFeatures.additionalDirectories ? sdkFeatures.additionalDirectories.split(",").map((d) => d.trim()).filter(Boolean) : undefined,
18658
18805
  advisorModel
18659
- }))) {
18806
+ }, requestAbort.controller))) {
18660
18807
  if (event.type === "rate_limit_event") {
18661
18808
  rateLimitStore.record(event.rate_limit_info);
18662
18809
  }
@@ -18707,6 +18854,7 @@ Subprocess stderr: ${stderrOutput}`;
18707
18854
  effort,
18708
18855
  thinking,
18709
18856
  taskBudget,
18857
+ outputFormat,
18710
18858
  betas,
18711
18859
  settingSources,
18712
18860
  codeSystemPrompt: sdkFeatures.codeSystemPrompt,
@@ -18719,7 +18867,7 @@ Subprocess stderr: ${stderrOutput}`;
18719
18867
  sdkDebug: sdkFeatures.sdkDebug,
18720
18868
  additionalDirectories: sdkFeatures.additionalDirectories ? sdkFeatures.additionalDirectories.split(",").map((d) => d.trim()).filter(Boolean) : undefined,
18721
18869
  advisorModel
18722
- }));
18870
+ }, requestAbort.controller));
18723
18871
  return;
18724
18872
  }
18725
18873
  if (isExtraUsageRequiredError(errMsg) && hasExtendedContext(model)) {
@@ -18773,6 +18921,7 @@ Subprocess stderr: ${stderrOutput}`;
18773
18921
  effort,
18774
18922
  thinking,
18775
18923
  taskBudget,
18924
+ outputFormat,
18776
18925
  betas,
18777
18926
  settingSources,
18778
18927
  codeSystemPrompt: sdkFeatures.codeSystemPrompt,
@@ -18785,7 +18934,7 @@ Subprocess stderr: ${stderrOutput}`;
18785
18934
  sdkDebug: sdkFeatures.sdkDebug,
18786
18935
  additionalDirectories: sdkFeatures.additionalDirectories ? sdkFeatures.additionalDirectories.split(",").map((d) => d.trim()).filter(Boolean) : undefined,
18787
18936
  advisorModel
18788
- }));
18937
+ }, requestAbort.controller));
18789
18938
  return;
18790
18939
  }
18791
18940
  if (isExpiredTokenError(errMsg) && !tokenRefreshed) {
@@ -18873,6 +19022,15 @@ Subprocess stderr: ${stderrOutput}`;
18873
19022
  if (message.type === "assistant" && message.uuid) {
18874
19023
  sdkUuidMap.push(message.uuid);
18875
19024
  }
19025
+ if (message.type === "result") {
19026
+ const resultUsage = message.usage;
19027
+ if (resultUsage)
19028
+ lastUsage = { ...lastUsage, ...resultUsage };
19029
+ if (outputFormat && "structured_output" in message) {
19030
+ hasStructuredOutput = true;
19031
+ structuredOutput = message.structured_output;
19032
+ }
19033
+ }
18876
19034
  if (message.type === "stream_event") {
18877
19035
  streamEventsSeen += 1;
18878
19036
  if (!firstChunkAt) {
@@ -18886,6 +19044,18 @@ Subprocess stderr: ${stderrOutput}`;
18886
19044
  const event = message.event;
18887
19045
  const eventType = event.type;
18888
19046
  const eventIndex = event.index;
19047
+ if (outputFormat) {
19048
+ if (eventType === "message_start") {
19049
+ const startUsage = event.message?.usage;
19050
+ if (startUsage)
19051
+ lastUsage = { ...lastUsage, ...startUsage };
19052
+ } else if (eventType === "message_delta") {
19053
+ const deltaUsage = event.usage;
19054
+ if (deltaUsage)
19055
+ lastUsage = { ...lastUsage, ...deltaUsage };
19056
+ }
19057
+ continue;
19058
+ }
18889
19059
  if (eventType === "message_start") {
18890
19060
  skipBlockIndices.clear();
18891
19061
  sdkToClientIndex.clear();
@@ -19023,6 +19193,60 @@ data: ${JSON.stringify({ type: "message_stop" })}
19023
19193
  } finally {
19024
19194
  clearInterval(heartbeat);
19025
19195
  }
19196
+ if (outputFormat) {
19197
+ if (!hasStructuredOutput) {
19198
+ throw new Error("Structured output was requested but the SDK returned no structured_output result");
19199
+ }
19200
+ const text = structuredOutputText(structuredOutput);
19201
+ const messageId = `msg_${Date.now()}`;
19202
+ safeEnqueue(encoder.encode(`event: message_start
19203
+ data: ${JSON.stringify({
19204
+ type: "message_start",
19205
+ message: {
19206
+ id: messageId,
19207
+ type: "message",
19208
+ role: "assistant",
19209
+ content: [],
19210
+ model: body.model,
19211
+ stop_reason: null,
19212
+ stop_sequence: null,
19213
+ usage: { input_tokens: lastUsage?.input_tokens ?? 0, output_tokens: 0 }
19214
+ }
19215
+ })}
19216
+
19217
+ `), "structured_message_start");
19218
+ safeEnqueue(encoder.encode(`event: content_block_start
19219
+ data: ${JSON.stringify({
19220
+ type: "content_block_start",
19221
+ index: 0,
19222
+ content_block: { type: "text", text: "" }
19223
+ })}
19224
+
19225
+ `), "structured_block_start");
19226
+ safeEnqueue(encoder.encode(`event: content_block_delta
19227
+ data: ${JSON.stringify({
19228
+ type: "content_block_delta",
19229
+ index: 0,
19230
+ delta: { type: "text_delta", text }
19231
+ })}
19232
+
19233
+ `), "structured_text_delta");
19234
+ safeEnqueue(encoder.encode(`event: content_block_stop
19235
+ data: ${JSON.stringify({ type: "content_block_stop", index: 0 })}
19236
+
19237
+ `), "structured_block_stop");
19238
+ safeEnqueue(encoder.encode(`event: message_delta
19239
+ data: ${JSON.stringify({
19240
+ type: "message_delta",
19241
+ delta: { stop_reason: "end_turn", stop_sequence: null },
19242
+ usage: { output_tokens: lastUsage?.output_tokens ?? 0 }
19243
+ })}
19244
+
19245
+ `), "structured_message_delta");
19246
+ messageStartEmitted = true;
19247
+ eventsForwarded += 5;
19248
+ textEventsForwarded += 1;
19249
+ }
19026
19250
  claudeLog("upstream.completed", {
19027
19251
  mode: "stream",
19028
19252
  model,
@@ -19227,7 +19451,7 @@ Subprocess stderr: ${stderrOutput}`;
19227
19451
  } : classifyError(errMsg);
19228
19452
  claudeLog("proxy.anthropic.error", { error: errMsg, classified: streamErr.type });
19229
19453
  const sdkTerm = extractSdkTermination(errMsg);
19230
- const canRecoverAsToolUse = sdkTerm.reason === "max_turns" && passthrough && capturedToolUses.length > 0 && messageStartEmitted;
19454
+ const canRecoverAsToolUse = (sdkTerm.reason === "max_turns" || sdkTerm.reason === "aborted" && sawDuplicateToolUse) && passthrough && capturedToolUses.length > 0 && messageStartEmitted;
19231
19455
  if (canRecoverAsToolUse) {
19232
19456
  diagnosticLog2.session(`${requestMeta.requestId} sdk_termination_recovered ${formatSdkTermination(sdkTerm, {
19233
19457
  model,
@@ -19374,10 +19598,17 @@ data: ${JSON.stringify({
19374
19598
  } catch {}
19375
19599
  streamClosed = true;
19376
19600
  }
19601
+ } finally {
19602
+ requestAbort.detach();
19377
19603
  }
19604
+ },
19605
+ cancel(reason) {
19606
+ requestAbort.abort(reason);
19607
+ requestAbort.detach();
19378
19608
  }
19379
19609
  });
19380
19610
  const streamSessionId = resumeSessionId || `session_${Date.now()}`;
19611
+ streamOwnsAbortLink = true;
19381
19612
  return new Response(readable, {
19382
19613
  headers: {
19383
19614
  "Content-Type": "text/event-stream",
@@ -19425,6 +19656,9 @@ data: ${JSON.stringify({
19425
19656
  error: classified.type
19426
19657
  });
19427
19658
  return new Response(JSON.stringify({ type: "error", error: { type: classified.type, message: classified.message } }), { status: classified.status, headers: { "Content-Type": "application/json" } });
19659
+ } finally {
19660
+ if (!streamOwnsAbortLink)
19661
+ requestAbort.detach();
19428
19662
  }
19429
19663
  });
19430
19664
  };
@@ -19926,7 +20160,7 @@ async function startProxyServer(config = {}) {
19926
20160
  console.log(`Meridian running at http://${finalConfig.host}:${info.port}`);
19927
20161
  console.log(`Telemetry dashboard: http://${finalConfig.host}:${info.port}/telemetry`);
19928
20162
  const pins = resolveSdkModelDefaults();
19929
- console.log(`Model pins: opus=${pins.ANTHROPIC_DEFAULT_OPUS_MODEL} sonnet=${pins.ANTHROPIC_DEFAULT_SONNET_MODEL} haiku=${pins.ANTHROPIC_DEFAULT_HAIKU_MODEL}`);
20163
+ console.log(`Model pins: fable=${pins.ANTHROPIC_DEFAULT_FABLE_MODEL} opus=${pins.ANTHROPIC_DEFAULT_OPUS_MODEL} sonnet=${pins.ANTHROPIC_DEFAULT_SONNET_MODEL} haiku=${pins.ANTHROPIC_DEFAULT_HAIKU_MODEL}`);
19930
20164
  const claudeInfo = getResolvedClaudeExecutableInfo();
19931
20165
  if (claudeInfo) {
19932
20166
  console.log(`Claude executable: ${claudeInfo.path} (resolved via ${claudeInfo.source})`);
package/dist/cli.js CHANGED
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  startProxyServer
4
- } from "./cli-6rezv582.js";
4
+ } from "./cli-9pcv2qnp.js";
5
5
  import"./cli-cx463q74.js";
6
6
  import"./cli-sry5aqdj.js";
7
7
  import"./cli-4rqtm83g.js";
8
8
  import {
9
9
  resolveClaudeExecutableAsync
10
- } from "./cli-yeazzt32.js";
10
+ } from "./cli-7bygmvmv.js";
11
11
  import"./cli-340h1chz.js";
12
12
  import"./cli-je60fevk.js";
13
13
  import"./cli-1kbcm3yn.js";
@@ -53,7 +53,7 @@ See https://github.com/rynfar/meridian for full documentation.`);
53
53
  process.exit(0);
54
54
  }
55
55
  if (args[0] === "profile") {
56
- const { profileAdd, profileAddOauthToken, profileList, profileRemove, profileSwitch, profileLogin, profileHelp } = await import("./profileCli-xcmmr5w4.js");
56
+ const { profileAdd, profileAddOauthToken, profileList, profileRemove, profileSwitch, profileLogin, profileHelp } = await import("./profileCli-w5gpxkyh.js");
57
57
  const subcommand = args[1];
58
58
  const profileId = args[2];
59
59
  const headless = args.includes("--headless");
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  resolveClaudeExecutableSync
3
- } from "./cli-yeazzt32.js";
3
+ } from "./cli-7bygmvmv.js";
4
4
  import {
5
5
  setSetting
6
6
  } from "./cli-340h1chz.js";
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Model mapping and Claude executable resolution.
3
3
  */
4
- export type ClaudeModel = "sonnet" | "sonnet[1m]" | "opus" | "opus[1m]" | "haiku";
4
+ export type ClaudeModel = "sonnet" | "sonnet[1m]" | "opus" | "opus[1m]" | "haiku" | "fable" | "fable[1m]";
5
5
  /**
6
6
  * Current canonical pins for the `sonnet`/`opus`/`haiku` SDK aliases.
7
7
  *
@@ -18,6 +18,7 @@ export type ClaudeModel = "sonnet" | "sonnet[1m]" | "opus" | "opus[1m]" | "haiku
18
18
  * override via MERIDIAN_DEFAULT_{TYPE}_MODEL (proxy-side) or
19
19
  * ANTHROPIC_DEFAULT_{TYPE}_MODEL (shell env, wins over Meridian's pin).
20
20
  */
21
+ export declare const CANONICAL_FABLE_MODEL = "claude-fable-5";
21
22
  export declare const CANONICAL_OPUS_MODEL = "claude-opus-4-8";
22
23
  export declare const CANONICAL_SONNET_MODEL = "claude-sonnet-4-6";
23
24
  export declare const CANONICAL_HAIKU_MODEL = "claude-haiku-4-5";
@@ -1 +1 @@
1
- {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/proxy/models.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/proxy/models.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/proxy/openai.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/proxy/openai.ts"],"names":[],"mappings":"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"}
@@ -40,6 +40,18 @@ export declare function computeToolSetKey(tools: Array<{
40
40
  input_schema?: unknown;
41
41
  defer_loading?: boolean;
42
42
  }>): string;
43
+ /**
44
+ * Stable semantic signature for a forwarded tool_use: tool name + a
45
+ * key-order-independent serialization of its input. Two tool calls with the
46
+ * same name and the same arguments share a signature even if the SDK assigns
47
+ * them different tool_use ids.
48
+ *
49
+ * Used by the passthrough capture path to tell apart genuine parallel calls
50
+ * (distinct signatures — e.g. get_weather vs get_time) from an SDK internal
51
+ * continuation turn re-emitting a blocked call (identical signature, new id).
52
+ * The former are all forwarded; the latter is a duplicate and dropped.
53
+ */
54
+ export declare function toolUseSignature(name: string, input: unknown): string;
43
55
  /**
44
56
  * Strip the MCP prefix from a tool name to get the OpenCode tool name.
45
57
  * e.g., "mcp__oc__todowrite" → "todowrite"
@@ -1 +1 @@
1
- {"version":3,"file":"passthroughTools.d.ts","sourceRoot":"","sources":["../../src/proxy/passthroughTools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,eAAO,MAAM,oBAAoB,OAAO,CAAA;AACxC,eAAO,MAAM,sBAAsB,cAAmC,CAAA;AA0CtE,wBAAgB,qBAAqB,IAAI,MAAM,CAM9C;AAED;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,GAAG,CAAC;IAAC,aAAa,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,EACjG,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE;;;;EA4DlC;AAqBD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAAC,aAAa,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,GAC9E,MAAM,CASR;AAUD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAKvD;AAUD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC1C,YAAY,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,SAAS,GACtF,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAgCrC"}
1
+ {"version":3,"file":"passthroughTools.d.ts","sourceRoot":"","sources":["../../src/proxy/passthroughTools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,eAAO,MAAM,oBAAoB,OAAO,CAAA;AACxC,eAAO,MAAM,sBAAsB,cAAmC,CAAA;AA0CtE,wBAAgB,qBAAqB,IAAI,MAAM,CAM9C;AAED;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,GAAG,CAAC;IAAC,aAAa,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,EACjG,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE;;;;EA4DlC;AAqBD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAAC,aAAa,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,GAC9E,MAAM,CASR;AAUD;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,CAErE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAKvD;AAUD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC1C,YAAY,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,SAAS,GACtF,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAgCrC"}
@@ -4,7 +4,7 @@
4
4
  * Centralizes the construction of query() options, eliminating duplication
5
5
  * between the streaming and non-streaming paths in server.ts.
6
6
  */
7
- import type { Options, SettingSource } from "@anthropic-ai/claude-agent-sdk";
7
+ import type { Options, OutputFormat, SettingSource } from "@anthropic-ai/claude-agent-sdk";
8
8
  import { createPassthroughMcpServer } from "./passthroughTools";
9
9
  import type { Effort } from "./effort";
10
10
  export interface QueryContext {
@@ -72,6 +72,8 @@ export interface QueryContext {
72
72
  taskBudget?: {
73
73
  total: number;
74
74
  };
75
+ /** Native JSON-schema output contract for the Claude Agent SDK */
76
+ outputFormat?: OutputFormat;
75
77
  /** Beta features to enable */
76
78
  betas?: string[];
77
79
  /** SDK setting sources — controls CLAUDE.md and user settings loading */
@@ -115,5 +117,5 @@ export interface BuildQueryResult {
115
117
  * reports that as its working directory.
116
118
  */
117
119
  export declare function buildCwdNote(sdkCwd: string, clientCwd?: string): string;
118
- export declare function buildQueryOptions(ctx: QueryContext): BuildQueryResult;
120
+ export declare function buildQueryOptions(ctx: QueryContext, abortController?: AbortController): BuildQueryResult;
119
121
  //# sourceMappingURL=query.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/proxy/query.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/proxy/query.ts"],"names":[],"mappings":"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"}
@@ -48,8 +48,12 @@ declare class RateLimitStore {
48
48
  * Record a rate-limit info snapshot.
49
49
  * Last-write-wins per bucket key (rateLimitType). Older entries for the
50
50
  * same key are overwritten — clients should treat the latest as canonical.
51
+ *
52
+ * `observedAt` defaults to the current wall clock but may be supplied
53
+ * explicitly so callers (and tests) can control the capture timestamp used
54
+ * for newest-first ordering in {@link getAll}.
51
55
  */
52
- record(info: SDKRateLimitInfo | undefined | null): void;
56
+ record(info: SDKRateLimitInfo | undefined | null, observedAt?: number): void;
53
57
  /** Snapshot all current entries, newest-first by observedAt. */
54
58
  getAll(): RateLimitEntry[];
55
59
  /** Snapshot a single bucket, or undefined if not yet seen. */
@@ -1 +1 @@
1
- {"version":3,"file":"rateLimitStore.d.ts","sourceRoot":"","sources":["../../src/proxy/rateLimitStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AAEtE,MAAM,WAAW,cAAe,SAAQ,gBAAgB;IACtD,+CAA+C;IAC/C,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,qDAAqD;AACrD,MAAM,MAAM,kBAAkB,GAAG,WAAW,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC,GAAG,SAAS,CAAA;AAE3F,cAAM,cAAc;IAClB,OAAO,CAAC,OAAO,CAAgD;IAE/D;;;;OAIG;IACH,MAAM,CAAC,IAAI,EAAE,gBAAgB,GAAG,SAAS,GAAG,IAAI,GAAG,IAAI;IAMvD,gEAAgE;IAChE,MAAM,IAAI,cAAc,EAAE;IAI1B,8DAA8D;IAC9D,GAAG,CAAC,GAAG,EAAE,kBAAkB,GAAG,cAAc,GAAG,SAAS;IAIxD,2CAA2C;IAC3C,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;;;OAIG;IACH,KAAK,IAAI,IAAI;CAGd;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,gBAAuB,CAAA;AAElD,wCAAwC;AACxC,OAAO,EAAE,cAAc,IAAI,uBAAuB,EAAE,CAAA"}
1
+ {"version":3,"file":"rateLimitStore.d.ts","sourceRoot":"","sources":["../../src/proxy/rateLimitStore.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAA;AAEtE,MAAM,WAAW,cAAe,SAAQ,gBAAgB;IACtD,+CAA+C;IAC/C,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,qDAAqD;AACrD,MAAM,MAAM,kBAAkB,GAAG,WAAW,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC,GAAG,SAAS,CAAA;AAE3F,cAAM,cAAc;IAClB,OAAO,CAAC,OAAO,CAAgD;IAE/D;;;;;;;;OAQG;IACH,MAAM,CAAC,IAAI,EAAE,gBAAgB,GAAG,SAAS,GAAG,IAAI,EAAE,UAAU,GAAE,MAAmB,GAAG,IAAI;IAMxF,gEAAgE;IAChE,MAAM,IAAI,cAAc,EAAE;IAI1B,8DAA8D;IAC9D,GAAG,CAAC,GAAG,EAAE,kBAAkB,GAAG,cAAc,GAAG,SAAS;IAIxD,2CAA2C;IAC3C,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;;;OAIG;IACH,KAAK,IAAI,IAAI;CAGd;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,gBAAuB,CAAA;AAElD,wCAAwC;AACxC,OAAO,EAAE,cAAc,IAAI,uBAAuB,EAAE,CAAA"}
@@ -0,0 +1,8 @@
1
+ export interface RequestAbortLink {
2
+ controller: AbortController;
3
+ abort: (reason?: unknown) => void;
4
+ detach: () => void;
5
+ }
6
+ /** Forward an HTTP request abort into the SDK query lifecycle. */
7
+ export declare function linkRequestAbort(signal: AbortSignal): RequestAbortLink;
8
+ //# sourceMappingURL=requestAbort.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"requestAbort.d.ts","sourceRoot":"","sources":["../../src/proxy/requestAbort.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,eAAe,CAAA;IAC3B,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;IACjC,MAAM,EAAE,MAAM,IAAI,CAAA;CACnB;AAED,kEAAkE;AAClE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,gBAAgB,CAyBtE"}
@@ -36,6 +36,18 @@ export type FeatureConfig = Record<string, Partial<AdapterFeatures>>;
36
36
  * Priority: user config > adapter defaults > global defaults
37
37
  */
38
38
  export declare function getFeaturesForAdapter(adapterName: string): AdapterFeatures;
39
+ /**
40
+ * Returns the thinking value the user has *explicitly* configured for an
41
+ * adapter, or undefined when none is set (i.e. it falls back to defaults).
42
+ *
43
+ * The merged result from getFeaturesForAdapter() can't tell an explicit
44
+ * "disabled" choice apart from the default "disabled" (DEFAULT_FEATURES.thinking
45
+ * is "disabled"). Those two cases must behave differently: an explicit
46
+ * "disabled" is an authoritative "no thinking" instruction that overrides client
47
+ * requests, whereas the default "disabled" is a no-op fallback so clients can
48
+ * still request thinking per-request. See the thinking resolution in server.ts.
49
+ */
50
+ export declare function getExplicitThinking(adapterName: string): AdapterFeatures["thinking"] | undefined;
39
51
  /**
40
52
  * Get the full config for all adapters (for the settings UI).
41
53
  */
@@ -1 +1 @@
1
- {"version":3,"file":"sdkFeatures.d.ts","sourceRoot":"","sources":["../../src/proxy/sdkFeatures.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,eAAe;IAC9B,iFAAiF;IACjF,gBAAgB,EAAE,OAAO,CAAA;IACzB,kFAAkF;IAClF,kBAAkB,EAAE,OAAO,CAAA;IAC3B,4DAA4D;IAC5D,QAAQ,EAAE,KAAK,GAAG,SAAS,GAAG,MAAM,CAAA;IACpC,wDAAwD;IACxD,MAAM,EAAE,OAAO,CAAA;IACf,6CAA6C;IAC7C,QAAQ,EAAE,OAAO,CAAA;IACjB,0DAA0D;IAC1D,QAAQ,EAAE,UAAU,GAAG,SAAS,GAAG,UAAU,CAAA;IAC7C,4CAA4C;IAC5C,mBAAmB,EAAE,OAAO,CAAA;IAC5B,iFAAiF;IACjF,YAAY,EAAE,OAAO,CAAA;IACrB,iDAAiD;IACjD,YAAY,EAAE,MAAM,CAAA;IACpB,2DAA2D;IAC3D,aAAa,EAAE,MAAM,CAAA;IACrB,+CAA+C;IAC/C,QAAQ,EAAE,OAAO,CAAA;IACjB,uEAAuE;IACvE,qBAAqB,EAAE,MAAM,CAAA;CAC9B;AAED,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC,CAAA;AAqFpE;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,eAAe,CAU1E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAOtE;AAKD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC,CAgC5E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI,CAInG;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAI9D"}
1
+ {"version":3,"file":"sdkFeatures.d.ts","sourceRoot":"","sources":["../../src/proxy/sdkFeatures.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,eAAe;IAC9B,iFAAiF;IACjF,gBAAgB,EAAE,OAAO,CAAA;IACzB,kFAAkF;IAClF,kBAAkB,EAAE,OAAO,CAAA;IAC3B,4DAA4D;IAC5D,QAAQ,EAAE,KAAK,GAAG,SAAS,GAAG,MAAM,CAAA;IACpC,wDAAwD;IACxD,MAAM,EAAE,OAAO,CAAA;IACf,6CAA6C;IAC7C,QAAQ,EAAE,OAAO,CAAA;IACjB,0DAA0D;IAC1D,QAAQ,EAAE,UAAU,GAAG,SAAS,GAAG,UAAU,CAAA;IAC7C,4CAA4C;IAC5C,mBAAmB,EAAE,OAAO,CAAA;IAC5B,iFAAiF;IACjF,YAAY,EAAE,OAAO,CAAA;IACrB,iDAAiD;IACjD,YAAY,EAAE,MAAM,CAAA;IACpB,2DAA2D;IAC3D,aAAa,EAAE,MAAM,CAAA;IACrB,+CAA+C;IAC/C,QAAQ,EAAE,OAAO,CAAA;IACjB,uEAAuE;IACvE,qBAAqB,EAAE,MAAM,CAAA;CAC9B;AAED,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC,CAAA;AAqFpE;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,eAAe,CAU1E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,eAAe,CAAC,UAAU,CAAC,GAAG,SAAS,CAKhG;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAOtE;AAKD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC,CAgC5E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI,CAInG;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAI9D"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/proxy/server.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AACtE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,CAAA;AAGvD,YAAY,EACV,SAAS,EACT,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,WAAW,GACZ,MAAM,aAAa,CAAA;AAKpB,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAiCnG,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,oBAAoB,EAEpB,KAAK,aAAa,EAGnB,MAAM,mBAAmB,CAAA;AAG1B,OAAO,EAA+B,iBAAiB,EAAE,mBAAmB,EAAsC,MAAM,iBAAiB,CAAA;AAGzI,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,oBAAoB,EAAE,CAAA;AAChE,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,CAAA;AACjD,YAAY,EAAE,aAAa,EAAE,CAAA;AAiQ7B,wBAAgB,iBAAiB,CAAC,MAAM,GAAE,OAAO,CAAC,WAAW,CAAM,GAAG,WAAW,CA8qFhF;AAWD,wBAAgB,gCAAgC,IAAI,IAAI,CAavD;AAED,wBAAsB,gBAAgB,CAAC,MAAM,GAAE,OAAO,CAAC,WAAW,CAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAmGhG"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/proxy/server.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AACtE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,CAAA;AAGvD,YAAY,EACV,SAAS,EACT,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,WAAW,GACZ,MAAM,aAAa,CAAA;AAKpB,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAkCnG,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,oBAAoB,EAEpB,KAAK,aAAa,EAGnB,MAAM,mBAAmB,CAAA;AAG1B,OAAO,EAA+B,iBAAiB,EAAE,mBAAmB,EAAsC,MAAM,iBAAiB,CAAA;AAGzI,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,oBAAoB,EAAE,CAAA;AAChE,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,CAAA;AACjD,YAAY,EAAE,aAAa,EAAE,CAAA;AAiQ7B,wBAAgB,iBAAiB,CAAC,MAAM,GAAE,OAAO,CAAC,WAAW,CAAM,GAAG,WAAW,CAk8FhF;AAWD,wBAAgB,gCAAgC,IAAI,IAAI,CAavD;AAED,wBAAsB,gBAAgB,CAAC,MAAM,GAAE,OAAO,CAAC,WAAW,CAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAmGhG"}
@@ -24,5 +24,18 @@ export declare class UpstreamIdleError extends Error {
24
24
  readonly sinceLastMs: number;
25
25
  constructor(idleMs: number, sinceLastMs: number);
26
26
  }
27
- export declare function guardUpstreamIdle<T>(source: AsyncIterable<T>, idleMs: number, onStall?: (sinceLastMs: number) => void): AsyncGenerator<T>;
27
+ /** Opaque handle returned by a clock's timer scheduler. */
28
+ type IdleTimerHandle = ReturnType<typeof setTimeout> | number;
29
+ /**
30
+ * Time source the guard depends on. Injectable so tests can drive idle
31
+ * detection deterministically instead of racing the real wall clock. Defaults
32
+ * to the platform clock in production.
33
+ */
34
+ export interface IdleGuardClock {
35
+ now(): number;
36
+ setTimeout(fn: () => void, ms: number): IdleTimerHandle;
37
+ clearTimeout(handle: IdleTimerHandle): void;
38
+ }
39
+ export declare function guardUpstreamIdle<T>(source: AsyncIterable<T>, idleMs: number, onStall?: (sinceLastMs: number) => void, clock?: IdleGuardClock): AsyncGenerator<T>;
40
+ export {};
28
41
  //# sourceMappingURL=streamIdleGuard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"streamIdleGuard.d.ts","sourceRoot":"","sources":["../../src/proxy/streamIdleGuard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;gBAChB,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;CAMhD;AAED,wBAAuB,iBAAiB,CAAC,CAAC,EACxC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,EACxB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,GACtC,cAAc,CAAC,CAAC,CAAC,CA4CnB"}
1
+ {"version":3,"file":"streamIdleGuard.d.ts","sourceRoot":"","sources":["../../src/proxy/streamIdleGuard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;gBAChB,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;CAMhD;AAED,2DAA2D;AAC3D,KAAK,eAAe,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,MAAM,CAAA;AAE7D;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,GAAG,IAAI,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,EAAE,MAAM,IAAI,EAAE,EAAE,EAAE,MAAM,GAAG,eAAe,CAAA;IACvD,YAAY,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAAA;CAC5C;AAQD,wBAAuB,iBAAiB,CAAC,CAAC,EACxC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,EACxB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,EACvC,KAAK,GAAE,cAA0B,GAChC,cAAc,CAAC,CAAC,CAAC,CA4CnB"}
@@ -0,0 +1,21 @@
1
+ import type { OutputFormat } from "@anthropic-ai/claude-agent-sdk";
2
+ export type OutputFormatParseResult = {
3
+ ok: true;
4
+ value: OutputFormat | undefined;
5
+ } | {
6
+ ok: false;
7
+ message: string;
8
+ };
9
+ /**
10
+ * Parse Anthropic's `output_config.format` into the Claude Agent SDK's native
11
+ * structured-output option. Absence is a no-op; malformed or unsupported
12
+ * values are rejected at the HTTP boundary instead of failing in the SDK.
13
+ *
14
+ * Combining `tools` with `output_config.format` is rejected: structured-output
15
+ * mode buffers the SDK's wire events and replaces the response content with the
16
+ * validated result, so a tool_use turn would be swallowed and the client-driven
17
+ * tool loop would never see it.
18
+ */
19
+ export declare function parseOutputFormat(outputConfig: unknown, tools?: unknown): OutputFormatParseResult;
20
+ export declare function structuredOutputText(value: unknown): string;
21
+ //# sourceMappingURL=structuredOutput.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structuredOutput.d.ts","sourceRoot":"","sources":["../../src/proxy/structuredOutput.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAA;AAElE,MAAM,MAAM,uBAAuB,GAC/B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,YAAY,GAAG,SAAS,CAAA;CAAE,GAC7C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAA;AAMlC;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,uBAAuB,CAyBjG;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAE3D"}
package/dist/server.js CHANGED
@@ -11,11 +11,11 @@ import {
11
11
  runObserveHook,
12
12
  runTransformHook,
13
13
  startProxyServer
14
- } from "./cli-6rezv582.js";
14
+ } from "./cli-9pcv2qnp.js";
15
15
  import"./cli-cx463q74.js";
16
16
  import"./cli-sry5aqdj.js";
17
17
  import"./cli-4rqtm83g.js";
18
- import"./cli-yeazzt32.js";
18
+ import"./cli-7bygmvmv.js";
19
19
  import"./cli-340h1chz.js";
20
20
  import"./cli-je60fevk.js";
21
21
  import"./cli-1kbcm3yn.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rynfar/meridian",
3
- "version": "1.44.1",
3
+ "version": "1.45.1",
4
4
  "description": "Local Anthropic API powered by your Claude Max subscription. One subscription, every agent.",
5
5
  "type": "module",
6
6
  "main": "./dist/server.js",
@@ -25,14 +25,14 @@
25
25
  "postbuild": "node scripts/fix-bun-exports.mjs && node --check dist/cli.js && node --check dist/server.js && node -e \"if(!require('fs').existsSync('dist/proxy/server.d.ts'))process.exit(1)\"",
26
26
  "postinstall": "node ./node_modules/@anthropic-ai/claude-code/install.cjs 2>/dev/null || true",
27
27
  "prepublishOnly": "bun run build",
28
- "test": "bun test --path-ignore-patterns '**/*session-store*' --path-ignore-patterns '**/*proxy-async-ops*' --path-ignore-patterns '**/*models-auth-status*' --path-ignore-patterns '**/*proxy-context-usage-store*' --path-ignore-patterns '**/*proxy-passthrough-thinking*' --path-ignore-patterns '**/*session-recovery*' --path-ignore-patterns '**/*models.test*' && bun test src/__tests__/proxy-async-ops.test.ts && bun test src/__tests__/proxy-session-store.test.ts && bun test src/__tests__/session-store-pruning.test.ts && bun test src/__tests__/proxy-session-store-locking.test.ts && bun test src/__tests__/proxy-context-usage-store.test.ts && bun test src/__tests__/models-auth-status.test.ts && bun test src/__tests__/proxy-passthrough-thinking.test.ts && bun test src/__tests__/proxy-session-recovery.test.ts && bun test src/__tests__/models.test.ts",
28
+ "test": "bun test --path-ignore-patterns '**/*session-store*' --path-ignore-patterns '**/*proxy-async-ops*' --path-ignore-patterns '**/*models-auth-status*' --path-ignore-patterns '**/*proxy-context-usage-store*' --path-ignore-patterns '**/*proxy-passthrough-thinking*' --path-ignore-patterns '**/*proxy-thinking-setting*' --path-ignore-patterns '**/*session-recovery*' --path-ignore-patterns '**/*models.test*' && bun test src/__tests__/proxy-async-ops.test.ts && bun test src/__tests__/proxy-session-store.test.ts && bun test src/__tests__/session-store-pruning.test.ts && bun test src/__tests__/proxy-session-store-locking.test.ts && bun test src/__tests__/proxy-context-usage-store.test.ts && bun test src/__tests__/models-auth-status.test.ts && bun test src/__tests__/proxy-passthrough-thinking.test.ts && bun test src/__tests__/proxy-session-recovery.test.ts && bun test src/__tests__/proxy-thinking-setting.test.ts && bun test src/__tests__/models.test.ts",
29
29
  "nix:lock": "bun2nix -o bun.nix",
30
30
  "typecheck": "tsc --noEmit",
31
31
  "proxy:direct": "bun run ./bin/cli.ts"
32
32
  },
33
33
  "dependencies": {
34
34
  "@anthropic-ai/claude-agent-sdk": "^0.2.117",
35
- "@anthropic-ai/claude-code": "^2.1.117",
35
+ "@anthropic-ai/claude-code": "^2.1.198",
36
36
  "jsonc-parser": "^3.3.1",
37
37
  "libsql": "^0.5.29"
38
38
  },