@dotobokuri/fleet-console 1.61.0 → 1.62.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 (68) hide show
  1. package/README.md +1 -1
  2. package/dist/cli.mjs +182 -11
  3. package/dist/client/assets/{_baseUniq-9W447fNf.js → _baseUniq-B6CLI4cf.js} +1 -1
  4. package/dist/client/assets/{arc-hoitnVWi.js → arc-r3CRqUQ5.js} +1 -1
  5. package/dist/client/assets/{architectureDiagram-Q4EWVU46-DYd58Vfc.js → architectureDiagram-Q4EWVU46-CJfgw2eJ.js} +1 -1
  6. package/dist/client/assets/{blockDiagram-DXYQGD6D-kuFqPdP_.js → blockDiagram-DXYQGD6D-CkBuOBUs.js} +1 -1
  7. package/dist/client/assets/{c4Diagram-AHTNJAMY-C7n41zCn.js → c4Diagram-AHTNJAMY-Ln5TenJL.js} +1 -1
  8. package/dist/client/assets/channel-DBCxCWtI.js +1 -0
  9. package/dist/client/assets/{chunk-4BX2VUAB-DrHeb54-.js → chunk-4BX2VUAB-BiYTw90k.js} +1 -1
  10. package/dist/client/assets/{chunk-4TB4RGXK-DFjT6kwT.js → chunk-4TB4RGXK-nPQaGu1w.js} +1 -1
  11. package/dist/client/assets/{chunk-55IACEB6-DxEzuA7W.js → chunk-55IACEB6-BU2oCJkl.js} +1 -1
  12. package/dist/client/assets/{chunk-EDXVE4YY-aAlF0YEo.js → chunk-EDXVE4YY-Ej7y6KOv.js} +1 -1
  13. package/dist/client/assets/{chunk-FMBD7UC4-DwqRMFL1.js → chunk-FMBD7UC4-hOkBpfhE.js} +1 -1
  14. package/dist/client/assets/{chunk-OYMX7WX6-DCkUlaRi.js → chunk-OYMX7WX6-Cv43HwvT.js} +1 -1
  15. package/dist/client/assets/{chunk-QZHKN3VN-B1Dx8Zhl.js → chunk-QZHKN3VN-Bi7AEJxb.js} +1 -1
  16. package/dist/client/assets/{chunk-YZCP3GAM-J2bgJmn-.js → chunk-YZCP3GAM-CBwmJdga.js} +1 -1
  17. package/dist/client/assets/classDiagram-6PBFFD2Q-QQSWiJjR.js +1 -0
  18. package/dist/client/assets/classDiagram-v2-HSJHXN6E-QQSWiJjR.js +1 -0
  19. package/dist/client/assets/clone-vom5rXcJ.js +1 -0
  20. package/dist/client/assets/{cose-bilkent-S5V4N54A-BxzLzyJp.js → cose-bilkent-S5V4N54A-ERDn7bly.js} +1 -1
  21. package/dist/client/assets/{dagre-KV5264BT-D1ixDJxZ.js → dagre-KV5264BT-DapcbnEu.js} +1 -1
  22. package/dist/client/assets/{diagram-5BDNPKRD-DZPIz1Pa.js → diagram-5BDNPKRD-DbRBVaVH.js} +1 -1
  23. package/dist/client/assets/{diagram-G4DWMVQ6-Pbcr-a5H.js → diagram-G4DWMVQ6-CLP0MwBH.js} +1 -1
  24. package/dist/client/assets/{diagram-MMDJMWI5-CBssBmPY.js → diagram-MMDJMWI5-BMZ9AsEI.js} +1 -1
  25. package/dist/client/assets/{diagram-TYMM5635-cVQUs6jp.js → diagram-TYMM5635-DtPPkZ2y.js} +1 -1
  26. package/dist/client/assets/{erDiagram-SMLLAGMA-ChMSAXos.js → erDiagram-SMLLAGMA-DIvbhhTb.js} +1 -1
  27. package/dist/client/assets/{flowDiagram-DWJPFMVM-FEIrU5mu.js → flowDiagram-DWJPFMVM-C_R3RpTk.js} +1 -1
  28. package/dist/client/assets/{ganttDiagram-T4ZO3ILL-D6ELHTJY.js → ganttDiagram-T4ZO3ILL-eaIqpHsY.js} +1 -1
  29. package/dist/client/assets/{gitGraphDiagram-UUTBAWPF-DTJ6HgV4.js → gitGraphDiagram-UUTBAWPF-CYCsHY_E.js} +1 -1
  30. package/dist/client/assets/{graph-uscjDdHm.js → graph-HfvOsgk2.js} +1 -1
  31. package/dist/client/assets/index-C2erdgSj.css +1 -0
  32. package/dist/client/assets/index-CrEYBugN.js +465 -0
  33. package/dist/client/assets/{infoDiagram-42DDH7IO-C2AlA___.js → infoDiagram-42DDH7IO-rmDH5YRZ.js} +1 -1
  34. package/dist/client/assets/{ishikawaDiagram-UXIWVN3A-BZGfIhBp.js → ishikawaDiagram-UXIWVN3A-EAZO3mIY.js} +1 -1
  35. package/dist/client/assets/{journeyDiagram-VCZTEJTY-DnGNMdvj.js → journeyDiagram-VCZTEJTY-4vWYlXOF.js} +1 -1
  36. package/dist/client/assets/{kanban-definition-6JOO6SKY-BkuplZGR.js → kanban-definition-6JOO6SKY-CkkSfsbD.js} +1 -1
  37. package/dist/client/assets/{layout-BBayH8iU.js → layout-DWbhbrdO.js} +1 -1
  38. package/dist/client/assets/{linear-BQvaHed0.js → linear-BjRBsqi0.js} +1 -1
  39. package/dist/client/assets/{mermaid.core-CO0f3d6Y.js → mermaid.core-RuG-kUU2.js} +4 -4
  40. package/dist/client/assets/{min-B610GdeY.js → min-D--jZrv5.js} +1 -1
  41. package/dist/client/assets/{mindmap-definition-QFDTVHPH-gwkhgCyj.js → mindmap-definition-QFDTVHPH-fLwhQBcX.js} +1 -1
  42. package/dist/client/assets/{pieDiagram-DEJITSTG-DYU2zgk8.js → pieDiagram-DEJITSTG-DJkWnAQK.js} +1 -1
  43. package/dist/client/assets/{quadrantDiagram-34T5L4WZ-B5Vkk65i.js → quadrantDiagram-34T5L4WZ-Kd4q9kEz.js} +1 -1
  44. package/dist/client/assets/{requirementDiagram-MS252O5E-D4EcF7kq.js → requirementDiagram-MS252O5E-Bgrtq8Kh.js} +1 -1
  45. package/dist/client/assets/{sankeyDiagram-XADWPNL6-DFk-RMV4.js → sankeyDiagram-XADWPNL6-BW9BdQ-8.js} +1 -1
  46. package/dist/client/assets/{sequenceDiagram-FGHM5R23-B-beo9e0.js → sequenceDiagram-FGHM5R23-KpgcxIJb.js} +1 -1
  47. package/dist/client/assets/{stateDiagram-FHFEXIEX-VDT0TOd7.js → stateDiagram-FHFEXIEX-CNaCHtL2.js} +1 -1
  48. package/dist/client/assets/stateDiagram-v2-QKLJ7IA2-D3k4sLJ4.js +1 -0
  49. package/dist/client/assets/{timeline-definition-GMOUNBTQ-By4DMNqG.js → timeline-definition-GMOUNBTQ-MGPKEXGI.js} +1 -1
  50. package/dist/client/assets/{vennDiagram-DHZGUBPP-DzlBrijd.js → vennDiagram-DHZGUBPP-bDOCVDJ1.js} +1 -1
  51. package/dist/client/assets/{wardley-RL74JXVD-BHSHTMU6.js → wardley-RL74JXVD-DuvLJQPg.js} +1 -1
  52. package/dist/client/assets/{wardleyDiagram-NUSXRM2D-COB-cWHQ.js → wardleyDiagram-NUSXRM2D-BdBIEtIl.js} +1 -1
  53. package/dist/client/assets/{xychartDiagram-5P7HB3ND-C-GVSBHd.js → xychartDiagram-5P7HB3ND-vycMI6c3.js} +1 -1
  54. package/dist/client/index.html +2 -2
  55. package/dist/fleet-plugins/ledger/routes.mjs +19834 -428
  56. package/dist/fleet-plugins/quota/routes.mjs +206 -3
  57. package/dist/fleet-plugins/scuttlebutt/routes.mjs +182 -11
  58. package/dist/fleet-plugins/terminal/routes.mjs +7016 -5834
  59. package/dist/fleet.mjs +6317 -5874
  60. package/package.json +2 -2
  61. package/dist/client/assets/channel-D2TsEFjE.js +0 -1
  62. package/dist/client/assets/classDiagram-6PBFFD2Q-DhjJiPic.js +0 -1
  63. package/dist/client/assets/classDiagram-v2-HSJHXN6E-DhjJiPic.js +0 -1
  64. package/dist/client/assets/clone-DwVC2-Mi.js +0 -1
  65. package/dist/client/assets/index-DMjY1OQ0.js +0 -465
  66. package/dist/client/assets/index-Ec4RaE0g.css +0 -1
  67. package/dist/client/assets/stateDiagram-v2-QKLJ7IA2-wHPBl_p1.js +0 -1
  68. /package/{AGENTS.md → CLAUDE.md} +0 -0
@@ -18530,6 +18530,115 @@ var models_default = {
18530
18530
  }
18531
18531
  ]
18532
18532
  }
18533
+ },
18534
+ pricing: {
18535
+ source: "openrouter",
18536
+ observedAt: "2026-08-16T00:00:00Z",
18537
+ models: {
18538
+ "openai/gpt-5.6-sol": {
18539
+ inputCostPerToken: 5e-6,
18540
+ outputCostPerToken: 3e-5,
18541
+ cacheReadInputTokenCost: 5e-7,
18542
+ cacheCreationInputTokenCost: 625e-8,
18543
+ aliases: [
18544
+ "gpt-5.6-sol"
18545
+ ]
18546
+ },
18547
+ "openai/gpt-5.6-terra": {
18548
+ inputCostPerToken: 1e-6,
18549
+ outputCostPerToken: 6e-6,
18550
+ cacheReadInputTokenCost: 1e-7,
18551
+ cacheCreationInputTokenCost: 125e-8,
18552
+ aliases: [
18553
+ "gpt-5.6-terra"
18554
+ ]
18555
+ },
18556
+ "openai/gpt-5.6-luna": {
18557
+ inputCostPerToken: 1e-7,
18558
+ outputCostPerToken: 6e-7,
18559
+ cacheReadInputTokenCost: 1e-8,
18560
+ cacheCreationInputTokenCost: 125e-9,
18561
+ aliases: [
18562
+ "gpt-5.6-luna"
18563
+ ]
18564
+ },
18565
+ "x-ai/grok-4.5": {
18566
+ inputCostPerToken: 2e-6,
18567
+ outputCostPerToken: 6e-6,
18568
+ cacheReadInputTokenCost: 3e-7,
18569
+ aliases: [
18570
+ "grok-4.5"
18571
+ ]
18572
+ },
18573
+ "x-ai/grok-4.6": {
18574
+ inputCostPerToken: 2e-6,
18575
+ outputCostPerToken: 6e-6,
18576
+ cacheReadInputTokenCost: 5e-7,
18577
+ aliases: [
18578
+ "grok-4.6"
18579
+ ]
18580
+ },
18581
+ "anthropic/claude-opus-5": {
18582
+ inputCostPerToken: 5e-6,
18583
+ outputCostPerToken: 25e-6,
18584
+ cacheReadInputTokenCost: 5e-7,
18585
+ cacheCreationInputTokenCost: 625e-8,
18586
+ aliases: [
18587
+ "claude-opus-5"
18588
+ ]
18589
+ },
18590
+ "anthropic/claude-fable-5": {
18591
+ inputCostPerToken: 1e-5,
18592
+ outputCostPerToken: 5e-5,
18593
+ cacheReadInputTokenCost: 1e-6,
18594
+ cacheCreationInputTokenCost: 125e-7,
18595
+ aliases: [
18596
+ "claude-fable-5"
18597
+ ]
18598
+ },
18599
+ "moonshotai/kimi-k3": {
18600
+ inputCostPerToken: 3e-6,
18601
+ outputCostPerToken: 15e-6,
18602
+ cacheReadInputTokenCost: 3e-7,
18603
+ aliases: [
18604
+ "k3",
18605
+ "kimi-k3"
18606
+ ]
18607
+ },
18608
+ "qwen/qwen3.8-max": {
18609
+ inputCostPerToken: 2e-6,
18610
+ outputCostPerToken: 6e-6,
18611
+ cacheReadInputTokenCost: 25e-8,
18612
+ cacheCreationInputTokenCost: 25e-7,
18613
+ aliases: [
18614
+ "qwen3.8-max"
18615
+ ]
18616
+ },
18617
+ "deepseek/deepseek-v4-flash": {
18618
+ inputCostPerToken: 14e-8,
18619
+ outputCostPerToken: 28e-8,
18620
+ cacheReadInputTokenCost: 28e-10,
18621
+ aliases: [
18622
+ "deepseek-v4-flash"
18623
+ ]
18624
+ },
18625
+ "deepseek/deepseek-v4-pro": {
18626
+ inputCostPerToken: 435e-9,
18627
+ outputCostPerToken: 87e-8,
18628
+ cacheReadInputTokenCost: 3625e-12,
18629
+ aliases: [
18630
+ "deepseek-v4-pro"
18631
+ ]
18632
+ },
18633
+ "z-ai/glm-5.2": {
18634
+ inputCostPerToken: 14e-7,
18635
+ outputCostPerToken: 44e-7,
18636
+ cacheReadInputTokenCost: 26e-8,
18637
+ aliases: [
18638
+ "glm-5.2"
18639
+ ]
18640
+ }
18641
+ }
18533
18642
  }
18534
18643
  };
18535
18644
  var KIMI_AUTH_PROVIDER_ID = "Claude Code with Moonshot Kimi";
@@ -18594,6 +18703,18 @@ var GatewayBenchmarksRegistrySchema = external_exports.object({
18594
18703
  sources: external_exports.record(external_exports.string().min(1), GatewayBenchmarkSourceSchema),
18595
18704
  models: external_exports.record(external_exports.string().min(1), GatewayBenchmarkModelEntrySchema)
18596
18705
  }).strict();
18706
+ var GatewayModelPricingSchema = external_exports.object({
18707
+ inputCostPerToken: external_exports.number().nonnegative(),
18708
+ outputCostPerToken: external_exports.number().nonnegative(),
18709
+ cacheReadInputTokenCost: external_exports.number().nonnegative(),
18710
+ cacheCreationInputTokenCost: external_exports.number().nonnegative().optional(),
18711
+ aliases: external_exports.array(external_exports.string().min(1)).min(1)
18712
+ }).strict();
18713
+ var GatewayPricingRegistrySchema = external_exports.object({
18714
+ source: external_exports.literal("openrouter"),
18715
+ observedAt: external_exports.iso.datetime(),
18716
+ models: external_exports.record(external_exports.string().min(1), GatewayModelPricingSchema)
18717
+ }).strict();
18597
18718
  var GatewayModelEntrySchema = external_exports.object({
18598
18719
  modelId: external_exports.string().min(1),
18599
18720
  name: external_exports.string().min(1),
@@ -18624,7 +18745,8 @@ var GatewayModelsRegistrySchema = external_exports.object({
18624
18745
  kimi: GatewayProviderSchema,
18625
18746
  opencode: GatewayProviderSchema,
18626
18747
  xai: GatewayProviderSchema
18627
- }).strict()
18748
+ }).strict(),
18749
+ pricing: GatewayPricingRegistrySchema
18628
18750
  }).strict();
18629
18751
  var UNSUPPORTED_GATEWAY_MODEL_EFFORT = Object.freeze({ supported: false });
18630
18752
  var benchmarksRegistry = parseGatewayBenchmarksRegistry(benchmarks_default);
@@ -18648,6 +18770,15 @@ var registry2 = (() => {
18648
18770
  return parsed;
18649
18771
  })();
18650
18772
  registry2.updatedAt;
18773
+ registry2.pricing.observedAt;
18774
+ Object.freeze(
18775
+ Object.fromEntries(
18776
+ Object.entries(registry2.pricing.models).map(([modelId, pricing]) => [
18777
+ modelId,
18778
+ Object.freeze({ ...pricing, aliases: Object.freeze([...pricing.aliases]) })
18779
+ ])
18780
+ )
18781
+ );
18651
18782
  Object.entries(benchmarksRegistry.sources).map(([sourceId, source]) => `${sourceId}:${source.observedAt}`).sort().join("|");
18652
18783
  Object.freeze(
18653
18784
  Object.fromEntries(
@@ -19091,6 +19222,9 @@ async function postJson(fetchImpl, url2, headers) {
19091
19222
  function expired(error51) {
19092
19223
  return error51 instanceof ProviderHttpError && (error51.statusCode === 401 || error51.statusCode === 403) ? { status: "expired" } : null;
19093
19224
  }
19225
+ function providerHttpStatus(error51) {
19226
+ return error51 instanceof ProviderHttpError ? error51.statusCode : void 0;
19227
+ }
19094
19228
  function sanitizeProviderError(error51) {
19095
19229
  if (error51 instanceof ProviderResponseTooLargeError) return "Provider response too large";
19096
19230
  if (error51 instanceof DOMException && error51.name === "AbortError") return "Provider request timed out";
@@ -19634,6 +19768,71 @@ async function fetchKimiUsage(deps = {}) {
19634
19768
  throw error51;
19635
19769
  }
19636
19770
  }
19771
+ var OPENCODE_AUTH_PROVIDER_ID = "Claude Code with OpenCode Go";
19772
+ var OPENCODE_GO_API_BASE_URL = "https://opencode.ai/zen/go";
19773
+ var OPENCODE_GO_USAGE_URL = `${OPENCODE_GO_API_BASE_URL}/v1/usage`;
19774
+ var OPENCODE_SESSION_MS = 5 * HOUR_MS;
19775
+ var OPENCODE_MONTH_MS = 30 * 24 * HOUR_MS;
19776
+ var WINDOWS = [
19777
+ { field: "rolling", id: "session", durationMs: OPENCODE_SESSION_MS },
19778
+ { field: "weekly", id: "weekly", durationMs: WEEK_MS },
19779
+ { field: "monthly", id: "cycle", durationMs: OPENCODE_MONTH_MS }
19780
+ ];
19781
+ function windowPercent(row) {
19782
+ const value = row.percent;
19783
+ if (typeof value !== "number" || !Number.isFinite(value)) return void 0;
19784
+ return percent(value);
19785
+ }
19786
+ function parseOpencodeUsage(payload) {
19787
+ const usage4 = object2(object2(payload)?.usage);
19788
+ if (!usage4) return null;
19789
+ const windows = [];
19790
+ for (const spec of WINDOWS) {
19791
+ const row = object2(usage4[spec.field]);
19792
+ if (!row) return null;
19793
+ const usedPercent = windowPercent(row);
19794
+ if (usedPercent === void 0) return null;
19795
+ const resetsAt = safeTimestamp(row.resetsAt);
19796
+ const period = windowPeriod(spec.durationMs, "catalog", resetsAt);
19797
+ windows.push({
19798
+ id: spec.id,
19799
+ usedPercent,
19800
+ ...resetsAt !== void 0 ? { resetsAt } : {},
19801
+ ...period ? { period } : {}
19802
+ });
19803
+ }
19804
+ return {
19805
+ windows,
19806
+ cycleDays: Math.round(OPENCODE_MONTH_MS / 864e5)
19807
+ };
19808
+ }
19809
+ async function fetchOpencodeUsage(deps = {}) {
19810
+ if (deps.authService === void 0) {
19811
+ throw new Error("authService is required to probe OpenCode Go usage; pass it via createAiGatewayQuotaCollectors");
19812
+ }
19813
+ const apiKey = await deps.authService.getApiKey(OPENCODE_AUTH_PROVIDER_ID);
19814
+ if (!apiKey) return { status: "signed_out" };
19815
+ try {
19816
+ const usage4 = parseOpencodeUsage(await getJson(
19817
+ deps.fetch ?? fetch,
19818
+ OPENCODE_GO_USAGE_URL,
19819
+ { Authorization: `Bearer ${apiKey}`, Accept: "application/json" }
19820
+ ));
19821
+ if (!usage4) throw new Error("Provider response invalid");
19822
+ return {
19823
+ status: "ok",
19824
+ plan: "Go",
19825
+ cycleDays: usage4.cycleDays,
19826
+ windows: usage4.windows,
19827
+ fetchedAt: (deps.now ?? Date.now)()
19828
+ };
19829
+ } catch (error51) {
19830
+ if (providerHttpStatus(error51) === 403) return { status: "no_subscription" };
19831
+ const result = expired(error51);
19832
+ if (result) return result;
19833
+ throw error51;
19834
+ }
19835
+ }
19637
19836
  var XAI_OIDC_ISSUER = "https://auth.x.ai";
19638
19837
  var XAI_CLI_REFRESH_URL = "https://auth.x.ai/oauth2/token";
19639
19838
  var XAI_CLI_DEFAULT_CLIENT_ID = "b1a00492-073a-47ea-816f-4c329264a828";
@@ -19921,6 +20120,7 @@ function createAiGatewayQuotaCollectors(deps) {
19921
20120
  fetchCodex: () => fetchCodexUsage(providerDeps),
19922
20121
  fetchCursor: () => fetchCursorUsage(providerDeps),
19923
20122
  fetchKimi: () => fetchKimiUsage(providerDeps),
20123
+ fetchOpencode: () => fetchOpencodeUsage(providerDeps),
19924
20124
  fetchXai: () => fetchXaiUsage(providerDeps)
19925
20125
  };
19926
20126
  }
@@ -19934,6 +20134,7 @@ function createQuotaService(deps) {
19934
20134
  codex: deps.fetchCodex,
19935
20135
  cursor: deps.fetchCursor,
19936
20136
  kimi: deps.fetchKimi,
20137
+ opencode: deps.fetchOpencode,
19937
20138
  xai: deps.fetchXai ?? (async () => ({ status: "signed_out" }))
19938
20139
  };
19939
20140
  const cache = /* @__PURE__ */ new Map();
@@ -19977,11 +20178,12 @@ function createQuotaService(deps) {
19977
20178
  }
19978
20179
  return {
19979
20180
  async getSummary(options = {}) {
19980
- const [claude, codex, cursor, kimi, xai] = await Promise.all([
20181
+ const [claude, codex, cursor, kimi, opencode, xai] = await Promise.all([
19981
20182
  load("claude", options.force === true || options.forceProvider === "claude"),
19982
20183
  load("codex", options.force === true || options.forceProvider === "codex"),
19983
20184
  load("cursor", options.force === true || options.forceProvider === "cursor"),
19984
20185
  load("kimi", options.force === true || options.forceProvider === "kimi"),
20186
+ load("opencode", options.force === true || options.forceProvider === "opencode"),
19985
20187
  load("xai", options.force === true || options.forceProvider === "xai")
19986
20188
  ]);
19987
20189
  return {
@@ -19990,6 +20192,7 @@ function createQuotaService(deps) {
19990
20192
  codex: withRisk(codex),
19991
20193
  cursor: withRisk(cursor),
19992
20194
  kimi: withRisk(kimi),
20195
+ opencode: withRisk(opencode),
19993
20196
  xai: withRisk(xai)
19994
20197
  }
19995
20198
  };
@@ -20856,7 +21059,7 @@ messageDesc(cursorAgentFile, 70);
20856
21059
  new Set(REASONING_EFFORTS);
20857
21060
 
20858
21061
  // ../fleet-plugins/quota/provider-order.ts
20859
- var PROVIDER_ORDER_DEFAULT = ["claude", "codex", "xai", "cursor", "kimi"];
21062
+ var PROVIDER_ORDER_DEFAULT = ["claude", "codex", "xai", "cursor", "opencode", "kimi"];
20860
21063
  function isProviderId(value) {
20861
21064
  return PROVIDER_ORDER_DEFAULT.includes(value);
20862
21065
  }
@@ -18207,6 +18207,115 @@ var models_default = {
18207
18207
  }
18208
18208
  ]
18209
18209
  }
18210
+ },
18211
+ pricing: {
18212
+ source: "openrouter",
18213
+ observedAt: "2026-08-16T00:00:00Z",
18214
+ models: {
18215
+ "openai/gpt-5.6-sol": {
18216
+ inputCostPerToken: 5e-6,
18217
+ outputCostPerToken: 3e-5,
18218
+ cacheReadInputTokenCost: 5e-7,
18219
+ cacheCreationInputTokenCost: 625e-8,
18220
+ aliases: [
18221
+ "gpt-5.6-sol"
18222
+ ]
18223
+ },
18224
+ "openai/gpt-5.6-terra": {
18225
+ inputCostPerToken: 1e-6,
18226
+ outputCostPerToken: 6e-6,
18227
+ cacheReadInputTokenCost: 1e-7,
18228
+ cacheCreationInputTokenCost: 125e-8,
18229
+ aliases: [
18230
+ "gpt-5.6-terra"
18231
+ ]
18232
+ },
18233
+ "openai/gpt-5.6-luna": {
18234
+ inputCostPerToken: 1e-7,
18235
+ outputCostPerToken: 6e-7,
18236
+ cacheReadInputTokenCost: 1e-8,
18237
+ cacheCreationInputTokenCost: 125e-9,
18238
+ aliases: [
18239
+ "gpt-5.6-luna"
18240
+ ]
18241
+ },
18242
+ "x-ai/grok-4.5": {
18243
+ inputCostPerToken: 2e-6,
18244
+ outputCostPerToken: 6e-6,
18245
+ cacheReadInputTokenCost: 3e-7,
18246
+ aliases: [
18247
+ "grok-4.5"
18248
+ ]
18249
+ },
18250
+ "x-ai/grok-4.6": {
18251
+ inputCostPerToken: 2e-6,
18252
+ outputCostPerToken: 6e-6,
18253
+ cacheReadInputTokenCost: 5e-7,
18254
+ aliases: [
18255
+ "grok-4.6"
18256
+ ]
18257
+ },
18258
+ "anthropic/claude-opus-5": {
18259
+ inputCostPerToken: 5e-6,
18260
+ outputCostPerToken: 25e-6,
18261
+ cacheReadInputTokenCost: 5e-7,
18262
+ cacheCreationInputTokenCost: 625e-8,
18263
+ aliases: [
18264
+ "claude-opus-5"
18265
+ ]
18266
+ },
18267
+ "anthropic/claude-fable-5": {
18268
+ inputCostPerToken: 1e-5,
18269
+ outputCostPerToken: 5e-5,
18270
+ cacheReadInputTokenCost: 1e-6,
18271
+ cacheCreationInputTokenCost: 125e-7,
18272
+ aliases: [
18273
+ "claude-fable-5"
18274
+ ]
18275
+ },
18276
+ "moonshotai/kimi-k3": {
18277
+ inputCostPerToken: 3e-6,
18278
+ outputCostPerToken: 15e-6,
18279
+ cacheReadInputTokenCost: 3e-7,
18280
+ aliases: [
18281
+ "k3",
18282
+ "kimi-k3"
18283
+ ]
18284
+ },
18285
+ "qwen/qwen3.8-max": {
18286
+ inputCostPerToken: 2e-6,
18287
+ outputCostPerToken: 6e-6,
18288
+ cacheReadInputTokenCost: 25e-8,
18289
+ cacheCreationInputTokenCost: 25e-7,
18290
+ aliases: [
18291
+ "qwen3.8-max"
18292
+ ]
18293
+ },
18294
+ "deepseek/deepseek-v4-flash": {
18295
+ inputCostPerToken: 14e-8,
18296
+ outputCostPerToken: 28e-8,
18297
+ cacheReadInputTokenCost: 28e-10,
18298
+ aliases: [
18299
+ "deepseek-v4-flash"
18300
+ ]
18301
+ },
18302
+ "deepseek/deepseek-v4-pro": {
18303
+ inputCostPerToken: 435e-9,
18304
+ outputCostPerToken: 87e-8,
18305
+ cacheReadInputTokenCost: 3625e-12,
18306
+ aliases: [
18307
+ "deepseek-v4-pro"
18308
+ ]
18309
+ },
18310
+ "z-ai/glm-5.2": {
18311
+ inputCostPerToken: 14e-7,
18312
+ outputCostPerToken: 44e-7,
18313
+ cacheReadInputTokenCost: 26e-8,
18314
+ aliases: [
18315
+ "glm-5.2"
18316
+ ]
18317
+ }
18318
+ }
18210
18319
  }
18211
18320
  };
18212
18321
  var GATEWAY_PROVIDERS = ["codex", "xai", "cursor", "opencode", "kimi"];
@@ -18269,6 +18378,18 @@ var GatewayBenchmarksRegistrySchema = external_exports.object({
18269
18378
  sources: external_exports.record(external_exports.string().min(1), GatewayBenchmarkSourceSchema),
18270
18379
  models: external_exports.record(external_exports.string().min(1), GatewayBenchmarkModelEntrySchema)
18271
18380
  }).strict();
18381
+ var GatewayModelPricingSchema = external_exports.object({
18382
+ inputCostPerToken: external_exports.number().nonnegative(),
18383
+ outputCostPerToken: external_exports.number().nonnegative(),
18384
+ cacheReadInputTokenCost: external_exports.number().nonnegative(),
18385
+ cacheCreationInputTokenCost: external_exports.number().nonnegative().optional(),
18386
+ aliases: external_exports.array(external_exports.string().min(1)).min(1)
18387
+ }).strict();
18388
+ var GatewayPricingRegistrySchema = external_exports.object({
18389
+ source: external_exports.literal("openrouter"),
18390
+ observedAt: external_exports.iso.datetime(),
18391
+ models: external_exports.record(external_exports.string().min(1), GatewayModelPricingSchema)
18392
+ }).strict();
18272
18393
  var GatewayModelEntrySchema = external_exports.object({
18273
18394
  modelId: external_exports.string().min(1),
18274
18395
  name: external_exports.string().min(1),
@@ -18299,7 +18420,8 @@ var GatewayModelsRegistrySchema = external_exports.object({
18299
18420
  kimi: GatewayProviderSchema,
18300
18421
  opencode: GatewayProviderSchema,
18301
18422
  xai: GatewayProviderSchema
18302
- }).strict()
18423
+ }).strict(),
18424
+ pricing: GatewayPricingRegistrySchema
18303
18425
  }).strict();
18304
18426
  var UNSUPPORTED_GATEWAY_MODEL_EFFORT = Object.freeze({ supported: false });
18305
18427
  var benchmarksRegistry = parseGatewayBenchmarksRegistry(benchmarks_default);
@@ -18323,6 +18445,15 @@ var registry2 = (() => {
18323
18445
  return parsed;
18324
18446
  })();
18325
18447
  var GATEWAY_MODELS_UPDATED_AT = registry2.updatedAt;
18448
+ registry2.pricing.observedAt;
18449
+ Object.freeze(
18450
+ Object.fromEntries(
18451
+ Object.entries(registry2.pricing.models).map(([modelId, pricing]) => [
18452
+ modelId,
18453
+ Object.freeze({ ...pricing, aliases: Object.freeze([...pricing.aliases]) })
18454
+ ])
18455
+ )
18456
+ );
18326
18457
  Object.entries(benchmarksRegistry.sources).map(([sourceId, source]) => `${sourceId}:${source.observedAt}`).sort().join("|");
18327
18458
  Object.freeze(
18328
18459
  Object.fromEntries(
@@ -19522,6 +19653,7 @@ var CLAUDE_GATEWAY_TURN_KEYS = Object.freeze([
19522
19653
  "allowedTools",
19523
19654
  "disallowedTools",
19524
19655
  "permissionMode",
19656
+ "canUseTool",
19525
19657
  "mcpServers",
19526
19658
  "servedMcpServers",
19527
19659
  "includePartialMessages",
@@ -19537,8 +19669,10 @@ function claudeGatewayLaunchEnv(inherited, options) {
19537
19669
  if (value !== void 0) env[key] = value;
19538
19670
  }
19539
19671
  env.ANTHROPIC_BASE_URL = options.baseUrl;
19540
- env.CLAUDE_CONFIG_DIR = options.configDir;
19541
- env.CLAUDE_SECURESTORAGE_CONFIG_DIR = "";
19672
+ if (options.homeKind !== "shared") {
19673
+ env.CLAUDE_CONFIG_DIR = options.configDir;
19674
+ env.CLAUDE_SECURESTORAGE_CONFIG_DIR = "";
19675
+ }
19542
19676
  env.CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY = "1";
19543
19677
  env.ENABLE_TOOL_SEARCH = "true";
19544
19678
  env.CLAUDE_CODE_AUTO_COMPACT_WINDOW ??= "1000000";
@@ -19553,6 +19687,18 @@ function claudeGatewayModelCache(options) {
19553
19687
  }
19554
19688
 
19555
19689
  // ../../packages/core-agent/src/claude/config-dir.ts
19690
+ function createSharedClaudeConfigHome(configDir) {
19691
+ if (typeof configDir !== "string" || !path3__default.isAbsolute(configDir)) {
19692
+ throw new TypeError("A shared Claude config home requires an absolute config directory path.");
19693
+ }
19694
+ return {
19695
+ path: configDir,
19696
+ async writeModelCache() {
19697
+ },
19698
+ async dispose() {
19699
+ }
19700
+ };
19701
+ }
19556
19702
  async function createIsolatedClaudeConfigDir(tempRoot = tmpdir()) {
19557
19703
  const root = await mkdtemp(path3__default.join(tempRoot, "core-agent-claude-"));
19558
19704
  const cachePath = path3__default.join(root, CLAUDE_GATEWAY_MODEL_CACHE_RELPATH);
@@ -19609,7 +19755,7 @@ async function createClaudeGatewaySdk(options) {
19609
19755
  const accepted = resolveModels(options.models);
19610
19756
  const catalogModels = accepted.filter((entry) => entry.kind === "catalog").map((entry) => entry.model);
19611
19757
  const inherited = options.env ?? process.env;
19612
- const configDir = await createIsolatedClaudeConfigDir(options.tempRoot);
19758
+ const configDir = options.home?.kind === "shared" ? createSharedClaudeConfigHome(options.home.configDir) : await createIsolatedClaudeConfigDir(options.tempRoot);
19613
19759
  let disposed = false;
19614
19760
  let active = null;
19615
19761
  const sdk = {
@@ -19624,19 +19770,27 @@ async function createClaudeGatewaySdk(options) {
19624
19770
  }
19625
19771
  const model = resolveTurnModel(turn.model, accepted);
19626
19772
  await configDir.writeModelCache({ baseUrl, models: catalogModels, fetchedAt: Date.now() });
19627
- const env = claudeGatewayLaunchEnv(inherited, { baseUrl, configDir: configDir.path });
19773
+ const env = claudeGatewayLaunchEnv(inherited, {
19774
+ baseUrl,
19775
+ configDir: configDir.path,
19776
+ homeKind: options.home?.kind === "shared" ? "shared" : "isolated"
19777
+ });
19628
19778
  const run = runVendorQuery({
19629
19779
  prompt: turn.prompt,
19630
19780
  options: {
19631
19781
  env,
19632
19782
  model,
19633
19783
  ...turn.systemPrompt === void 0 ? {} : { systemPrompt: vendorSystemPrompt(turn.systemPrompt) },
19634
- // 패키지가 스스로 지어내는 지시는 없다. systemPrompt는 호출자가 것을 그대로 옮긴
19635
- // 것뿐이고, 주지 않으면 아무것도 붙지 않는다. `settingSources: []`는 사용자·프로젝트 설정과
19636
- // CLAUDE.md를 끄고, `strictMcpConfig`는 그와 별개인 ambient .mcp.json을 막는다 — 둘 다
19637
- // 세워야 호출자가 쓰지 않은 지시가 새지 않는다.
19638
- settingSources: [],
19639
- strictMcpConfig: true,
19784
+ // 패키지가 스스로 지어내는 지시는 없다 여기 실리는 것은 전부 호출자가 고른 것이고,
19785
+ // 고르지 않으면 아무것도 붙지 않는다. 기본값이 규율을 구조로 만든다:
19786
+ // `settingSources: []`가 사용자·프로젝트 설정과 CLAUDE.md를 끄고, `strictMcpConfig`가
19787
+ // 그와 별개인 ambient .mcp.json·플러그인 MCP를 막는다.
19788
+ settingSources: options.settingSources ? [...options.settingSources] : [],
19789
+ strictMcpConfig: options.allowAmbientMcpServers !== true,
19790
+ // 플러그인의 MCP 선언은 읽지 않는다 — 좌표는 호출자가 이미 소유한다.
19791
+ ...options.plugins && options.plugins.length > 0 ? { plugins: options.plugins.map((plugin) => ({ type: "local", path: plugin.path, skipMcpDiscovery: true })) } : {},
19792
+ // `--settings`와 같은 자리다. flag 소스로 병합되므로 사용자·프로젝트 설정을 대체하지 않는다.
19793
+ ...options.skillOverrides && Object.keys(options.skillOverrides).length > 0 ? { settings: { skillOverrides: { ...options.skillOverrides } } } : {},
19640
19794
  ...turn.effort === void 0 ? {} : { effort: turn.effort },
19641
19795
  ...turn.cwd === void 0 ? {} : { cwd: turn.cwd },
19642
19796
  ...turn.resume === void 0 ? {} : { resume: turn.resume },
@@ -19646,6 +19800,7 @@ async function createClaudeGatewaySdk(options) {
19646
19800
  ...turn.allowedTools === void 0 ? {} : { allowedTools: [...turn.allowedTools] },
19647
19801
  ...turn.disallowedTools === void 0 ? {} : { disallowedTools: [...turn.disallowedTools] },
19648
19802
  ...turn.permissionMode === void 0 ? {} : { permissionMode: turn.permissionMode },
19803
+ ...turn.canUseTool === void 0 ? {} : { canUseTool: vendorCanUseTool(turn.canUseTool) },
19649
19804
  ...turn.mcpServers === void 0 && turn.servedMcpServers === void 0 ? {} : { mcpServers: { ...turn.mcpServers, ...vendorServedMcpServers(turn.servedMcpServers) } },
19650
19805
  ...turn.includePartialMessages === void 0 ? {} : { includePartialMessages: turn.includePartialMessages },
19651
19806
  ...turn.abortController === void 0 ? {} : { abortController: turn.abortController },
@@ -19741,6 +19896,22 @@ function resolveTurnModel(requested, accepted) {
19741
19896
  }
19742
19897
  return entry.id;
19743
19898
  }
19899
+ function vendorCanUseTool(canUseTool) {
19900
+ return async (toolName, input, options) => {
19901
+ try {
19902
+ const decision = await canUseTool(toolName, input, {
19903
+ toolUseId: typeof options.toolUseID === "string" ? options.toolUseID : "",
19904
+ signal: options.signal instanceof AbortSignal ? options.signal : new AbortController().signal
19905
+ });
19906
+ if (decision.behavior === "allow") {
19907
+ return decision.updatedInput === void 0 ? { behavior: "allow", updatedInput: input } : { behavior: "allow", updatedInput: { ...decision.updatedInput } };
19908
+ }
19909
+ return { behavior: "deny", message: decision.message };
19910
+ } catch (error51) {
19911
+ return { behavior: "deny", message: error51 instanceof Error ? error51.message : String(error51) };
19912
+ }
19913
+ };
19914
+ }
19744
19915
  function vendorSystemPrompt(systemPrompt) {
19745
19916
  const text = systemPrompt?.text;
19746
19917
  if (typeof text !== "string" || text.length === 0) {