@dotobokuri/fleet-console 1.62.0 → 1.64.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 (67) hide show
  1. package/README.md +1 -0
  2. package/dist/cli.mjs +571 -96
  3. package/dist/client/assets/{_baseUniq-B6CLI4cf.js → _baseUniq-DurhRkUz.js} +1 -1
  4. package/dist/client/assets/{arc-r3CRqUQ5.js → arc-CRs5BdYr.js} +1 -1
  5. package/dist/client/assets/{architectureDiagram-Q4EWVU46-CJfgw2eJ.js → architectureDiagram-Q4EWVU46-Djo8uCUV.js} +1 -1
  6. package/dist/client/assets/{blockDiagram-DXYQGD6D-CkBuOBUs.js → blockDiagram-DXYQGD6D-hQdc3yPb.js} +1 -1
  7. package/dist/client/assets/{c4Diagram-AHTNJAMY-Ln5TenJL.js → c4Diagram-AHTNJAMY-Czv6wUeb.js} +1 -1
  8. package/dist/client/assets/channel-DluRfcgW.js +1 -0
  9. package/dist/client/assets/{chunk-4BX2VUAB-BiYTw90k.js → chunk-4BX2VUAB-DXjqdOUQ.js} +1 -1
  10. package/dist/client/assets/{chunk-4TB4RGXK-nPQaGu1w.js → chunk-4TB4RGXK-vvWT5R7G.js} +1 -1
  11. package/dist/client/assets/{chunk-55IACEB6-BU2oCJkl.js → chunk-55IACEB6-DMDBDn4n.js} +1 -1
  12. package/dist/client/assets/{chunk-EDXVE4YY-Ej7y6KOv.js → chunk-EDXVE4YY-CvZM4UpD.js} +1 -1
  13. package/dist/client/assets/{chunk-FMBD7UC4-hOkBpfhE.js → chunk-FMBD7UC4-BArng_V9.js} +1 -1
  14. package/dist/client/assets/{chunk-OYMX7WX6-Cv43HwvT.js → chunk-OYMX7WX6-DwNWyoK7.js} +1 -1
  15. package/dist/client/assets/{chunk-QZHKN3VN-Bi7AEJxb.js → chunk-QZHKN3VN--guvcrYz.js} +1 -1
  16. package/dist/client/assets/{chunk-YZCP3GAM-CBwmJdga.js → chunk-YZCP3GAM-BqxZQZyX.js} +1 -1
  17. package/dist/client/assets/classDiagram-6PBFFD2Q-CwNh44Lk.js +1 -0
  18. package/dist/client/assets/classDiagram-v2-HSJHXN6E-CwNh44Lk.js +1 -0
  19. package/dist/client/assets/clone-ClWdaAWG.js +1 -0
  20. package/dist/client/assets/{cose-bilkent-S5V4N54A-ERDn7bly.js → cose-bilkent-S5V4N54A-BMg_LOnu.js} +1 -1
  21. package/dist/client/assets/{dagre-KV5264BT-DapcbnEu.js → dagre-KV5264BT-Dr7w5bQR.js} +1 -1
  22. package/dist/client/assets/{diagram-5BDNPKRD-DbRBVaVH.js → diagram-5BDNPKRD-B3mTbXqP.js} +1 -1
  23. package/dist/client/assets/{diagram-G4DWMVQ6-CLP0MwBH.js → diagram-G4DWMVQ6-qb3u5_YF.js} +1 -1
  24. package/dist/client/assets/{diagram-MMDJMWI5-BMZ9AsEI.js → diagram-MMDJMWI5-CBBgto41.js} +1 -1
  25. package/dist/client/assets/{diagram-TYMM5635-DtPPkZ2y.js → diagram-TYMM5635-Cmo3cjOQ.js} +1 -1
  26. package/dist/client/assets/{erDiagram-SMLLAGMA-DIvbhhTb.js → erDiagram-SMLLAGMA-HeqZPhtI.js} +1 -1
  27. package/dist/client/assets/{flowDiagram-DWJPFMVM-C_R3RpTk.js → flowDiagram-DWJPFMVM-C34ZouQN.js} +1 -1
  28. package/dist/client/assets/{ganttDiagram-T4ZO3ILL-eaIqpHsY.js → ganttDiagram-T4ZO3ILL-BL2_YoJe.js} +1 -1
  29. package/dist/client/assets/{gitGraphDiagram-UUTBAWPF-CYCsHY_E.js → gitGraphDiagram-UUTBAWPF-DSC8Gr0E.js} +1 -1
  30. package/dist/client/assets/{graph-HfvOsgk2.js → graph-C4jsVwYI.js} +1 -1
  31. package/dist/client/assets/index-BuMY4qU-.js +465 -0
  32. package/dist/client/assets/index-DxjgOu3C.css +1 -0
  33. package/dist/client/assets/{infoDiagram-42DDH7IO-rmDH5YRZ.js → infoDiagram-42DDH7IO-BX_lYqHx.js} +1 -1
  34. package/dist/client/assets/{ishikawaDiagram-UXIWVN3A-EAZO3mIY.js → ishikawaDiagram-UXIWVN3A-CsXWVwyY.js} +1 -1
  35. package/dist/client/assets/{journeyDiagram-VCZTEJTY-4vWYlXOF.js → journeyDiagram-VCZTEJTY-ETPWVMNg.js} +1 -1
  36. package/dist/client/assets/{kanban-definition-6JOO6SKY-CkkSfsbD.js → kanban-definition-6JOO6SKY-m7hLIKgZ.js} +1 -1
  37. package/dist/client/assets/{layout-DWbhbrdO.js → layout-DrRXjJzL.js} +1 -1
  38. package/dist/client/assets/{linear-BjRBsqi0.js → linear-DzDd2m9j.js} +1 -1
  39. package/dist/client/assets/{mermaid.core-RuG-kUU2.js → mermaid.core-BHkit2JY.js} +4 -4
  40. package/dist/client/assets/{min-D--jZrv5.js → min-DtwEer1D.js} +1 -1
  41. package/dist/client/assets/{mindmap-definition-QFDTVHPH-fLwhQBcX.js → mindmap-definition-QFDTVHPH-BO-uheb7.js} +1 -1
  42. package/dist/client/assets/{pieDiagram-DEJITSTG-DJkWnAQK.js → pieDiagram-DEJITSTG-B_4VqNKt.js} +1 -1
  43. package/dist/client/assets/{quadrantDiagram-34T5L4WZ-Kd4q9kEz.js → quadrantDiagram-34T5L4WZ-HhtqXdkD.js} +1 -1
  44. package/dist/client/assets/{requirementDiagram-MS252O5E-Bgrtq8Kh.js → requirementDiagram-MS252O5E-CSotIpLH.js} +1 -1
  45. package/dist/client/assets/{sankeyDiagram-XADWPNL6-BW9BdQ-8.js → sankeyDiagram-XADWPNL6-a8krBcEy.js} +1 -1
  46. package/dist/client/assets/{sequenceDiagram-FGHM5R23-KpgcxIJb.js → sequenceDiagram-FGHM5R23-D9Tlp8oT.js} +1 -1
  47. package/dist/client/assets/{stateDiagram-FHFEXIEX-CNaCHtL2.js → stateDiagram-FHFEXIEX-CbEP_Jmm.js} +1 -1
  48. package/dist/client/assets/stateDiagram-v2-QKLJ7IA2-B9iCjiGH.js +1 -0
  49. package/dist/client/assets/{timeline-definition-GMOUNBTQ-MGPKEXGI.js → timeline-definition-GMOUNBTQ-CxAJtY22.js} +1 -1
  50. package/dist/client/assets/{vennDiagram-DHZGUBPP-bDOCVDJ1.js → vennDiagram-DHZGUBPP-BSTXi411.js} +1 -1
  51. package/dist/client/assets/{wardley-RL74JXVD-DuvLJQPg.js → wardley-RL74JXVD-BipCMOcx.js} +1 -1
  52. package/dist/client/assets/{wardleyDiagram-NUSXRM2D-BdBIEtIl.js → wardleyDiagram-NUSXRM2D-BudrJ8a1.js} +1 -1
  53. package/dist/client/assets/{xychartDiagram-5P7HB3ND-vycMI6c3.js → xychartDiagram-5P7HB3ND-BYlMZf2g.js} +1 -1
  54. package/dist/client/index.html +2 -2
  55. package/dist/fleet-plugins/ledger/routes.mjs +265 -12
  56. package/dist/fleet-plugins/quota/routes.mjs +265 -12
  57. package/dist/fleet-plugins/scuttlebutt/routes.mjs +545 -79
  58. package/dist/fleet-plugins/terminal/routes.mjs +1150 -237
  59. package/dist/fleet.mjs +954 -300
  60. package/package.json +1 -1
  61. package/dist/client/assets/channel-DBCxCWtI.js +0 -1
  62. package/dist/client/assets/classDiagram-6PBFFD2Q-QQSWiJjR.js +0 -1
  63. package/dist/client/assets/classDiagram-v2-HSJHXN6E-QQSWiJjR.js +0 -1
  64. package/dist/client/assets/clone-vom5rXcJ.js +0 -1
  65. package/dist/client/assets/index-C2erdgSj.css +0 -1
  66. package/dist/client/assets/index-CrEYBugN.js +0 -465
  67. package/dist/client/assets/stateDiagram-v2-QKLJ7IA2-D3k4sLJ4.js +0 -1
package/dist/fleet.mjs CHANGED
@@ -4,10 +4,10 @@ import os3__default, { tmpdir } from 'node:os';
4
4
  import * as path24 from 'node:path';
5
5
  import path24__default, { join, resolve, relative, sep } from 'node:path';
6
6
  import * as fs9 from 'node:fs';
7
- import fs9__default, { mkdirSync, mkdtempSync, writeFileSync, rmSync, chmodSync, renameSync, readdirSync, lstatSync, existsSync, realpathSync, accessSync, constants as constants$1, openSync, closeSync, readFileSync } from 'node:fs';
7
+ import fs9__default, { mkdirSync, mkdtempSync, writeFileSync, rmSync, chmodSync, renameSync, readdirSync, existsSync, lstatSync, accessSync, constants as constants$1, realpathSync, openSync, closeSync, readFileSync } from 'node:fs';
8
8
  import crypto9, { randomUUID as randomUUID$1, createHash as createHash$1 } from 'node:crypto';
9
9
  import http from 'node:http';
10
- import { spawn, execFileSync } from 'node:child_process';
10
+ import { spawn, execFileSync, execFile as execFile$1 } from 'node:child_process';
11
11
  import { builtinModules, createRequire } from 'node:module';
12
12
  import { fileURLToPath, pathToFileURL } from 'node:url';
13
13
  import * as fs32 from 'fs';
@@ -1536,6 +1536,40 @@ var init_check = __esm({
1536
1536
  init_registry2();
1537
1537
  }
1538
1538
  });
1539
+
1540
+ // cli/update/check-report.ts
1541
+ var check_report_exports = {};
1542
+ __export(check_report_exports, {
1543
+ runFleetUpdateCheck: () => runFleetUpdateCheck
1544
+ });
1545
+ async function runFleetUpdateCheck(io) {
1546
+ const release = readFleetCliRelease();
1547
+ if (release.channel === "local") {
1548
+ io.stdout.write(`Fleet is running from a local development build (v${release.version}) \u2014 nothing to update here.
1549
+ `);
1550
+ return 0;
1551
+ }
1552
+ const result = await checkUpdateStatus(release, { forceRefresh: true }).catch(() => ({ status: "unavailable" }));
1553
+ if (result.status === "current") {
1554
+ io.stdout.write(`Fleet is already on the latest version (v${release.version}).
1555
+ `);
1556
+ return 0;
1557
+ }
1558
+ if (result.status === "update") {
1559
+ io.stdout.write(`A newer Fleet version is available: v${result.latest} (installed v${release.version}).
1560
+ Run fleet update to install it.
1561
+ `);
1562
+ return 0;
1563
+ }
1564
+ io.stdout.write("Could not reach the npm registry to check for updates.\n");
1565
+ return 1;
1566
+ }
1567
+ var init_check_report = __esm({
1568
+ "cli/update/check-report.ts"() {
1569
+ init_release();
1570
+ init_check();
1571
+ }
1572
+ });
1539
1573
  async function stopRunningConsoleBeforeUpdate(io, deps = {}) {
1540
1574
  const env = deps.env ?? process.env;
1541
1575
  const siblingCliPath = deps.siblingCliPath ?? resolveSiblingConsoleCliPath();
@@ -21905,8 +21939,8 @@ function isClaudeTextBlock(block) {
21905
21939
  }
21906
21940
  function claudeSkillNameFromBody(text) {
21907
21941
  const breakAt = text.indexOf("\n");
21908
- const firstLine = breakAt === -1 ? text : text.slice(0, breakAt);
21909
- const directory = firstLine.slice(CLAUDE_SKILL_BODY_PREFIX.length).trim();
21942
+ const firstLine2 = breakAt === -1 ? text : text.slice(0, breakAt);
21943
+ const directory = firstLine2.slice(CLAUDE_SKILL_BODY_PREFIX.length).trim();
21910
21944
  const segments = directory.split("/").filter((segment) => segment.length > 0);
21911
21945
  return segments[segments.length - 1] ?? "";
21912
21946
  }
@@ -22188,12 +22222,12 @@ var benchmarks_default = {
22188
22222
  };
22189
22223
  var models_default = {
22190
22224
  version: 1,
22191
- updatedAt: "2026-08-15T00:00:00Z",
22225
+ updatedAt: "2026-08-17T00:00:00Z",
22192
22226
  providers: {
22193
22227
  codex: {
22194
22228
  name: "Codex",
22195
22229
  defaultModel: "gpt-5.6-sol",
22196
- source: "codex app-server model/list (codex-cli 0.147.0, 2026-08-11 \u2014 ultra advertised for sol/sol-wm/terra, luna stops at max) for model/effort/service-tier; contextWindow=272000 is codex debug models context_window/max_context_window (codex-cli 0.146.0, 2026-08-02)",
22230
+ source: "codex app-server model/list (codex-cli 0.147.0, observed 2026-08-11) for model/effort/service-tier and the unsuffixed 272000 defaults; Fleet catalog effort ladders are capped at max because harness launch capabilities are not model rungs; 2026-08-17 production Codex live observations added explicit 512K (524288) and explicit 1M (1000000) variants on the same upstream bases",
22197
22231
  models: [
22198
22232
  {
22199
22233
  modelId: "gpt-5.6-sol",
@@ -22207,8 +22241,7 @@ var models_default = {
22207
22241
  "medium",
22208
22242
  "high",
22209
22243
  "xhigh",
22210
- "max",
22211
- "ultra"
22244
+ "max"
22212
22245
  ]
22213
22246
  },
22214
22247
  aliases: [
@@ -22230,8 +22263,7 @@ var models_default = {
22230
22263
  "medium",
22231
22264
  "high",
22232
22265
  "xhigh",
22233
- "max",
22234
- "ultra"
22266
+ "max"
22235
22267
  ]
22236
22268
  },
22237
22269
  aliases: [
@@ -22251,8 +22283,7 @@ var models_default = {
22251
22283
  "medium",
22252
22284
  "high",
22253
22285
  "xhigh",
22254
- "max",
22255
- "ultra"
22286
+ "max"
22256
22287
  ]
22257
22288
  },
22258
22289
  aliases: [
@@ -22274,8 +22305,7 @@ var models_default = {
22274
22305
  "medium",
22275
22306
  "high",
22276
22307
  "xhigh",
22277
- "max",
22278
- "ultra"
22308
+ "max"
22279
22309
  ]
22280
22310
  },
22281
22311
  aliases: [
@@ -22324,6 +22354,264 @@ var models_default = {
22324
22354
  "gpt-5.6-luna-fast"
22325
22355
  ],
22326
22356
  benchmarkKey: "gpt-5.6-luna"
22357
+ },
22358
+ {
22359
+ modelId: "gpt-5.6-sol-512k",
22360
+ name: "GPT-5.6-Sol-512K",
22361
+ capabilityClass: "flagship",
22362
+ providerModelId: "gpt-5.6-sol",
22363
+ contextWindow: 524288,
22364
+ effort: {
22365
+ supported: true,
22366
+ levels: [
22367
+ "low",
22368
+ "medium",
22369
+ "high",
22370
+ "xhigh",
22371
+ "max"
22372
+ ]
22373
+ },
22374
+ aliases: [
22375
+ "gpt-5.6-sol-512k"
22376
+ ],
22377
+ benchmarkKey: "gpt-5.6-sol"
22378
+ },
22379
+ {
22380
+ modelId: "gpt-5.6-sol-512k-fast",
22381
+ name: "GPT-5.6-Sol-512K-Fast",
22382
+ capabilityClass: "flagship",
22383
+ providerModelId: "gpt-5.6-sol",
22384
+ serviceTier: "priority",
22385
+ contextWindow: 524288,
22386
+ effort: {
22387
+ supported: true,
22388
+ levels: [
22389
+ "low",
22390
+ "medium",
22391
+ "high",
22392
+ "xhigh",
22393
+ "max"
22394
+ ]
22395
+ },
22396
+ aliases: [
22397
+ "gpt-5.6-sol-512k-fast"
22398
+ ],
22399
+ benchmarkKey: "gpt-5.6-sol"
22400
+ },
22401
+ {
22402
+ modelId: "gpt-5.6-luna-512k",
22403
+ name: "GPT-5.6-Luna-512K",
22404
+ capabilityClass: "light",
22405
+ providerModelId: "gpt-5.6-luna",
22406
+ contextWindow: 524288,
22407
+ effort: {
22408
+ supported: true,
22409
+ levels: [
22410
+ "low",
22411
+ "medium",
22412
+ "high",
22413
+ "xhigh",
22414
+ "max"
22415
+ ]
22416
+ },
22417
+ aliases: [
22418
+ "gpt-5.6-luna-512k"
22419
+ ],
22420
+ benchmarkKey: "gpt-5.6-luna"
22421
+ },
22422
+ {
22423
+ modelId: "gpt-5.6-luna-512k-fast",
22424
+ name: "GPT-5.6-Luna-512K-Fast",
22425
+ capabilityClass: "light",
22426
+ providerModelId: "gpt-5.6-luna",
22427
+ serviceTier: "priority",
22428
+ contextWindow: 524288,
22429
+ effort: {
22430
+ supported: true,
22431
+ levels: [
22432
+ "low",
22433
+ "medium",
22434
+ "high",
22435
+ "xhigh",
22436
+ "max"
22437
+ ]
22438
+ },
22439
+ aliases: [
22440
+ "gpt-5.6-luna-512k-fast"
22441
+ ],
22442
+ benchmarkKey: "gpt-5.6-luna"
22443
+ },
22444
+ {
22445
+ modelId: "gpt-5.6-terra-512k",
22446
+ name: "GPT-5.6-Terra-512K",
22447
+ capabilityClass: "standard",
22448
+ providerModelId: "gpt-5.6-terra",
22449
+ contextWindow: 524288,
22450
+ effort: {
22451
+ supported: true,
22452
+ levels: [
22453
+ "low",
22454
+ "medium",
22455
+ "high",
22456
+ "xhigh",
22457
+ "max"
22458
+ ]
22459
+ },
22460
+ aliases: [
22461
+ "gpt-5.6-terra-512k"
22462
+ ],
22463
+ benchmarkKey: "gpt-5.6-terra"
22464
+ },
22465
+ {
22466
+ modelId: "gpt-5.6-terra-512k-fast",
22467
+ name: "GPT-5.6-Terra-512K-Fast",
22468
+ capabilityClass: "standard",
22469
+ providerModelId: "gpt-5.6-terra",
22470
+ serviceTier: "priority",
22471
+ contextWindow: 524288,
22472
+ effort: {
22473
+ supported: true,
22474
+ levels: [
22475
+ "low",
22476
+ "medium",
22477
+ "high",
22478
+ "xhigh",
22479
+ "max"
22480
+ ]
22481
+ },
22482
+ aliases: [
22483
+ "gpt-5.6-terra-512k-fast"
22484
+ ],
22485
+ benchmarkKey: "gpt-5.6-terra"
22486
+ },
22487
+ {
22488
+ modelId: "gpt-5.6-sol-1m",
22489
+ name: "GPT-5.6-Sol-1M",
22490
+ capabilityClass: "flagship",
22491
+ providerModelId: "gpt-5.6-sol",
22492
+ contextWindow: 1e6,
22493
+ effort: {
22494
+ supported: true,
22495
+ levels: [
22496
+ "low",
22497
+ "medium",
22498
+ "high",
22499
+ "xhigh",
22500
+ "max"
22501
+ ]
22502
+ },
22503
+ aliases: [
22504
+ "gpt-5.6-sol-1m"
22505
+ ],
22506
+ benchmarkKey: "gpt-5.6-sol"
22507
+ },
22508
+ {
22509
+ modelId: "gpt-5.6-sol-1m-fast",
22510
+ name: "GPT-5.6-Sol-1M-Fast",
22511
+ capabilityClass: "flagship",
22512
+ providerModelId: "gpt-5.6-sol",
22513
+ serviceTier: "priority",
22514
+ contextWindow: 1e6,
22515
+ effort: {
22516
+ supported: true,
22517
+ levels: [
22518
+ "low",
22519
+ "medium",
22520
+ "high",
22521
+ "xhigh",
22522
+ "max"
22523
+ ]
22524
+ },
22525
+ aliases: [
22526
+ "gpt-5.6-sol-1m-fast"
22527
+ ],
22528
+ benchmarkKey: "gpt-5.6-sol"
22529
+ },
22530
+ {
22531
+ modelId: "gpt-5.6-luna-1m",
22532
+ name: "GPT-5.6-Luna-1M",
22533
+ capabilityClass: "light",
22534
+ providerModelId: "gpt-5.6-luna",
22535
+ contextWindow: 1e6,
22536
+ effort: {
22537
+ supported: true,
22538
+ levels: [
22539
+ "low",
22540
+ "medium",
22541
+ "high",
22542
+ "xhigh",
22543
+ "max"
22544
+ ]
22545
+ },
22546
+ aliases: [
22547
+ "gpt-5.6-luna-1m"
22548
+ ],
22549
+ benchmarkKey: "gpt-5.6-luna"
22550
+ },
22551
+ {
22552
+ modelId: "gpt-5.6-luna-1m-fast",
22553
+ name: "GPT-5.6-Luna-1M-Fast",
22554
+ capabilityClass: "light",
22555
+ providerModelId: "gpt-5.6-luna",
22556
+ serviceTier: "priority",
22557
+ contextWindow: 1e6,
22558
+ effort: {
22559
+ supported: true,
22560
+ levels: [
22561
+ "low",
22562
+ "medium",
22563
+ "high",
22564
+ "xhigh",
22565
+ "max"
22566
+ ]
22567
+ },
22568
+ aliases: [
22569
+ "gpt-5.6-luna-1m-fast"
22570
+ ],
22571
+ benchmarkKey: "gpt-5.6-luna"
22572
+ },
22573
+ {
22574
+ modelId: "gpt-5.6-terra-1m",
22575
+ name: "GPT-5.6-Terra-1M",
22576
+ capabilityClass: "standard",
22577
+ providerModelId: "gpt-5.6-terra",
22578
+ contextWindow: 1e6,
22579
+ effort: {
22580
+ supported: true,
22581
+ levels: [
22582
+ "low",
22583
+ "medium",
22584
+ "high",
22585
+ "xhigh",
22586
+ "max"
22587
+ ]
22588
+ },
22589
+ aliases: [
22590
+ "gpt-5.6-terra-1m"
22591
+ ],
22592
+ benchmarkKey: "gpt-5.6-terra"
22593
+ },
22594
+ {
22595
+ modelId: "gpt-5.6-terra-1m-fast",
22596
+ name: "GPT-5.6-Terra-1M-Fast",
22597
+ capabilityClass: "standard",
22598
+ providerModelId: "gpt-5.6-terra",
22599
+ serviceTier: "priority",
22600
+ contextWindow: 1e6,
22601
+ effort: {
22602
+ supported: true,
22603
+ levels: [
22604
+ "low",
22605
+ "medium",
22606
+ "high",
22607
+ "xhigh",
22608
+ "max"
22609
+ ]
22610
+ },
22611
+ aliases: [
22612
+ "gpt-5.6-terra-1m-fast"
22613
+ ],
22614
+ benchmarkKey: "gpt-5.6-terra"
22327
22615
  }
22328
22616
  ]
22329
22617
  },
@@ -22807,8 +23095,7 @@ var GATEWAY_REASONING_EFFORTS = [
22807
23095
  "medium",
22808
23096
  "high",
22809
23097
  "xhigh",
22810
- "max",
22811
- "ultra"
23098
+ "max"
22812
23099
  ];
22813
23100
  var GatewayEffortUpstreamModelIdsSchema = external_exports.partialRecord(
22814
23101
  external_exports.enum(GATEWAY_REASONING_EFFORTS),
@@ -23235,8 +23522,7 @@ var ANTHROPIC_EFFORT_RUNGS = /* @__PURE__ */ new Set([
23235
23522
  "medium",
23236
23523
  "high",
23237
23524
  "xhigh",
23238
- "max",
23239
- "ultra"
23525
+ "max"
23240
23526
  ]);
23241
23527
  function freezeGatewayModelEffort(effort) {
23242
23528
  if (!effort?.supported) return UNSUPPORTED_GATEWAY_MODEL_EFFORT;
@@ -33957,11 +34243,10 @@ var GENERAL_PURPOSE_AGENT_PROMPT = [
33957
34243
  ].join("\n");
33958
34244
  var FLEET_PLUGIN_NAME = "fleet";
33959
34245
  function exposedEffortLadder(modelId, ladder, exposure) {
33960
- const deliverable = ladder.filter((rung) => rung !== "ultra");
33961
34246
  const chosen = exposure?.[modelId];
33962
- if (chosen === void 0 || chosen.length === 0) return deliverable;
33963
- const narrowed = deliverable.filter((rung) => chosen.includes(rung));
33964
- return narrowed.length > 0 ? narrowed : deliverable;
34247
+ if (chosen === void 0 || chosen.length === 0) return ladder;
34248
+ const narrowed = ladder.filter((rung) => chosen.includes(rung));
34249
+ return narrowed.length > 0 ? narrowed : ladder;
33965
34250
  }
33966
34251
  function buildGatewayCustomAgents(exposed, exposure) {
33967
34252
  const agents = {};
@@ -37201,9 +37486,9 @@ async function writeAtomic(filePath, content, paths) {
37201
37486
  await rename(tempPath, filePath);
37202
37487
  }
37203
37488
  function summarizeWikiEntry(body2) {
37204
- const firstLine = body2.split(/\r?\n/).map((line) => line.trim()).find((line) => line.length > 0);
37205
- if (!firstLine) return "";
37206
- return normalizeSummaryWhitespace(firstLine).slice(0, 160);
37489
+ const firstLine2 = body2.split(/\r?\n/).map((line) => line.trim()).find((line) => line.length > 0);
37490
+ if (!firstLine2) return "";
37491
+ return normalizeSummaryWhitespace(firstLine2).slice(0, 160);
37207
37492
  }
37208
37493
  function normalizeSummaryWhitespace(value) {
37209
37494
  return value.replace(/\s+/g, " ").trim();
@@ -46969,9 +47254,11 @@ var AUTH_CLI_OPTIONS = Object.keys(AUTH_CLI_DEFINITIONS).map((value) => ({
46969
47254
  label: AUTH_CLI_DEFINITIONS[value].label
46970
47255
  }));
46971
47256
  async function runAuthLoginFlow(argv, io, deps) {
46972
- const selectedCli = parseAuthCliId(argv[0]) ?? await promptForCli();
46973
- if (!selectedCli) return cancelAuthCommand();
46974
- const definition = AUTH_CLI_DEFINITIONS[selectedCli];
47257
+ const selectedCli = resolveAuthCliId(argv[0], io);
47258
+ if (selectedCli === "invalid") return 1;
47259
+ const chosen = selectedCli ?? await promptForCli();
47260
+ if (!chosen) return cancelAuthCommand();
47261
+ const definition = AUTH_CLI_DEFINITIONS[chosen];
46975
47262
  const apiKey = await Ce({
46976
47263
  message: `Enter the ${definition.shortName} API key`,
46977
47264
  mask: "*"
@@ -46996,6 +47283,15 @@ function getAuthCliOptions() {
46996
47283
  function parseAuthCliId(value) {
46997
47284
  return value !== void 0 && value in AUTH_CLI_DEFINITIONS ? value : void 0;
46998
47285
  }
47286
+ function resolveAuthCliId(value, io) {
47287
+ if (value === void 0) return void 0;
47288
+ const parsed = parseAuthCliId(value);
47289
+ if (parsed) return parsed;
47290
+ io.stderr.write(`Unknown fleet auth provider: ${value}
47291
+ Use kimi or opencode.
47292
+ `);
47293
+ return "invalid";
47294
+ }
46999
47295
  async function promptForCli() {
47000
47296
  const selected = await xe({
47001
47297
  message: "Select an authentication provider",
@@ -47049,12 +47345,14 @@ async function listAuthProviders(io, deps) {
47049
47345
  return 0;
47050
47346
  }
47051
47347
  async function logoutAuthProvider(argv, io, deps) {
47052
- const selectedCli = parseAuthCliId(argv[0]) ?? await promptForLogoutCli();
47053
- if (!selectedCli) {
47348
+ const selectedCli = resolveAuthCliId(argv[0], io);
47349
+ if (selectedCli === "invalid") return 1;
47350
+ const chosen = selectedCli ?? await promptForLogoutCli();
47351
+ if (!chosen) {
47054
47352
  me("Authentication cancelled.");
47055
47353
  return 1;
47056
47354
  }
47057
- const definition = AUTH_CLI_DEFINITIONS[selectedCli];
47355
+ const definition = AUTH_CLI_DEFINITIONS[chosen];
47058
47356
  await deps.authService.deleteApiKey(definition.providerId);
47059
47357
  io.stdout.write(`${definition.label} signed out.
47060
47358
  `);
@@ -47121,6 +47419,14 @@ var ASCII_FLEET_BANNER = [
47121
47419
 
47122
47420
  // cli/cli-args.ts
47123
47421
  init_release();
47422
+ function isFleetVersionArg(value) {
47423
+ return value === "--version" || value === "-v" || value === "version";
47424
+ }
47425
+ function buildFleetVersionText(release = readFleetCliRelease()) {
47426
+ return `@dotobokuri/fleet-console ${release.version} (${release.channel})
47427
+ Claude Code version: fleet cli --version
47428
+ `;
47429
+ }
47124
47430
  var HELP_BANNER_INDENT = " ";
47125
47431
  function buildFleetHelpText(options = {}) {
47126
47432
  const release = options.release ?? readFleetCliRelease();
@@ -47137,16 +47443,23 @@ function buildFleetHelpText(options = {}) {
47137
47443
  ` ${command("fleet cli", colorEnabled)} ${dim("[claude args...]", colorEnabled)}`,
47138
47444
  ` ${command("fleet console", colorEnabled)} ${dim("[start|stop|restart|status] [--help]", colorEnabled)}`,
47139
47445
  ` ${command("fleet auth", colorEnabled)} ${dim("login|list|logout", colorEnabled)}`,
47140
- ` ${command("fleet update", colorEnabled)}`,
47446
+ ` ${command("fleet update", colorEnabled)} ${dim("[--check]", colorEnabled)}`,
47447
+ ` ${command("fleet version", colorEnabled)}`,
47448
+ ` ${command("fleet doctor", colorEnabled)}`,
47449
+ ` ${command("fleet status", colorEnabled)}`,
47141
47450
  "",
47142
47451
  section("COMMANDS", colorEnabled),
47143
47452
  ` ${command("cli", colorEnabled)} ${dim("Launch Claude Code through the thin Fleet gateway (synonym of bare fleet).", colorEnabled)}`,
47144
47453
  ` ${command("console", colorEnabled)} ${dim("Manage the local Fleet Console server.", colorEnabled)}`,
47145
47454
  ` ${command("auth", colorEnabled)} ${dim("Manage AI Gateway provider authentication.", colorEnabled)}`,
47146
47455
  ` ${command("update", colorEnabled)} ${dim("Update the Fleet Console package (owns fleet and fleet-console).", colorEnabled)}`,
47456
+ ` ${command("version", colorEnabled)} ${dim("Print the Fleet package version and exit.", colorEnabled)}`,
47457
+ ` ${command("doctor", colorEnabled)} ${dim("Report install, PATH, auth, and Console health without changing anything.", colorEnabled)}`,
47458
+ ` ${command("status", colorEnabled)} ${dim("Show the local Fleet Console server status (same as fleet console status).", colorEnabled)}`,
47147
47459
  "",
47148
47460
  section("OPTIONS", colorEnabled),
47149
47461
  ` ${option("-h, --help", colorEnabled)} ${dim("Show this help message and exit.", colorEnabled)}`,
47462
+ ` ${option("-v, --version", colorEnabled)} ${dim("Print the Fleet package version and exit.", colorEnabled)}`,
47150
47463
  ` ${dim("Unrecognized arguments are passed through to Claude Code.", colorEnabled)}`,
47151
47464
  ""
47152
47465
  ];
@@ -47154,6 +47467,196 @@ function buildFleetHelpText(options = {}) {
47154
47467
  return colorEnabled ? text : stripAnsi(text);
47155
47468
  }
47156
47469
 
47470
+ // cli/doctor.ts
47471
+ init_src();
47472
+ init_release();
47473
+ var DESKTOP_PROTOCOL_VERSION = 1;
47474
+ var DESKTOP_RESOURCE_ROOT_ENV = "FLEET_CONSOLE_RESOURCE_ROOT";
47475
+ var DESKTOP_OWNER_ID_ENV = "FLEET_CONSOLE_OWNER_ID";
47476
+ var DESKTOP_OWNER_KIND_ENV = "FLEET_CONSOLE_OWNER_KIND";
47477
+ var DESKTOP_PROTOCOL_VERSION_ENV = "FLEET_CONSOLE_PROTOCOL_VERSION";
47478
+ var DESKTOP_RESOURCE_ROOT_MARKER = ".fleet-console-resource-root";
47479
+ var DESKTOP_DEVELOPMENT_ENV = "FLEET_CONSOLE_DESKTOP_DEVELOPMENT";
47480
+ var LOCK_DIR_NAME3 = "fleet-console";
47481
+ var LOCK_FILE_NAME = "console.lock";
47482
+ var CONSOLE_DATA_DIR_NAME = "console";
47483
+ var CONSOLE_STATE_FILE_NAME = "state.json";
47484
+ var CONSOLE_SETTINGS_FILE_NAME = "settings.json";
47485
+ var CONSOLE_CAPTURES_DIR_NAME = "captures";
47486
+ function isDesktopDevelopmentEnvironment(env) {
47487
+ return env[DESKTOP_DEVELOPMENT_ENV] === "1";
47488
+ }
47489
+ function resolveCanonicalStableConsolePaths(input) {
47490
+ const dir = input.consoleDirOverride ?? path24__default.join(input.tmpDir, `${LOCK_DIR_NAME3}-${input.uid}-stable`);
47491
+ const dataDir = input.consoleDirOverride ?? path24__default.join(input.fleetDataDir, CONSOLE_DATA_DIR_NAME);
47492
+ return {
47493
+ dir,
47494
+ lockFile: path24__default.join(dir, LOCK_FILE_NAME),
47495
+ dataDir,
47496
+ stateFile: path24__default.join(dataDir, CONSOLE_STATE_FILE_NAME),
47497
+ settingsFile: path24__default.join(dataDir, CONSOLE_SETTINGS_FILE_NAME),
47498
+ capturesDir: path24__default.join(dataDir, CONSOLE_CAPTURES_DIR_NAME)
47499
+ };
47500
+ }
47501
+ function resolveCanonicalLocalConsolePaths(input) {
47502
+ const dir = path24__default.join(path24__default.resolve(input.packageRoot, "..", ".."), ".fleet", CONSOLE_DATA_DIR_NAME);
47503
+ return {
47504
+ dir,
47505
+ lockFile: path24__default.join(dir, LOCK_FILE_NAME),
47506
+ dataDir: dir,
47507
+ stateFile: path24__default.join(dir, CONSOLE_STATE_FILE_NAME),
47508
+ settingsFile: path24__default.join(dir, CONSOLE_SETTINGS_FILE_NAME),
47509
+ capturesDir: path24__default.join(dir, CONSOLE_CAPTURES_DIR_NAME)
47510
+ };
47511
+ }
47512
+ function isDesktopResourceRootMarkerValid(content) {
47513
+ return content.trim() === String(DESKTOP_PROTOCOL_VERSION);
47514
+ }
47515
+
47516
+ // core/host/desktop-protocol.ts
47517
+ function readDesktopProtocolEnvironment(env = process.env, deps = {}) {
47518
+ const resourceRoot = env[DESKTOP_RESOURCE_ROOT_ENV];
47519
+ const ownerId = env[DESKTOP_OWNER_ID_ENV];
47520
+ const ownerKind = env[DESKTOP_OWNER_KIND_ENV];
47521
+ const protocolVersion = env[DESKTOP_PROTOCOL_VERSION_ENV];
47522
+ const values = [resourceRoot, ownerId, ownerKind, protocolVersion];
47523
+ if (values.every((value) => value === void 0)) return null;
47524
+ if (values.some((value) => !value)) throw new Error("desktop_protocol_environment_incomplete");
47525
+ if (ownerKind !== "desktop") throw new Error("desktop_owner_kind_invalid");
47526
+ if (!isSafeOwnerId(ownerId)) throw new Error("desktop_owner_id_invalid");
47527
+ if (protocolVersion !== String(DESKTOP_PROTOCOL_VERSION)) throw new Error("desktop_protocol_version_unsupported");
47528
+ const resolvedRoot = isDesktopDevelopmentEnvironment2(env) ? validateDesktopDevelopmentResourceRoot(resourceRoot) : validateDesktopResourceRoot(resourceRoot, deps.expectedPackageRoot);
47529
+ return { owner: { kind: "desktop", id: ownerId, protocolVersion: DESKTOP_PROTOCOL_VERSION }, resourceRoot: resolvedRoot };
47530
+ }
47531
+ function isDesktopDevelopmentEnvironment2(env = process.env) {
47532
+ return isDesktopDevelopmentEnvironment(env);
47533
+ }
47534
+ function validateDesktopResourceRoot(root, expectedPackageRoot = resolveDesktopProtocolPackageRoot()) {
47535
+ if (!path24__default.isAbsolute(root)) throw new Error("desktop_resource_root_not_absolute");
47536
+ const resolvedRoot = fs9__default.realpathSync(root);
47537
+ const expectedRoot = fs9__default.realpathSync(expectedPackageRoot);
47538
+ if (resolvedRoot !== expectedRoot) throw new Error("desktop_resource_root_invalid");
47539
+ const markerPath = path24__default.join(resolvedRoot, DESKTOP_RESOURCE_ROOT_MARKER);
47540
+ const marker = fs9__default.readFileSync(markerPath, "utf8");
47541
+ if (!isDesktopResourceRootMarkerValid(marker)) throw new Error("desktop_resource_root_marker_invalid");
47542
+ return resolvedRoot;
47543
+ }
47544
+ function validateDesktopDevelopmentResourceRoot(root) {
47545
+ if (!path24__default.isAbsolute(root)) throw new Error("desktop_resource_root_not_absolute");
47546
+ let resolvedRoot;
47547
+ try {
47548
+ resolvedRoot = fs9__default.realpathSync(root);
47549
+ } catch {
47550
+ throw new Error("desktop_development_resource_root_invalid");
47551
+ }
47552
+ const expectedRoot = fs9__default.realpathSync(resolveDesktopProtocolPackageRoot());
47553
+ if (resolvedRoot !== expectedRoot) throw new Error("desktop_development_resource_root_invalid");
47554
+ return resolvedRoot;
47555
+ }
47556
+ function resolveDesktopProtocolPackageRoot() {
47557
+ const requireFromHere = createRequire(import.meta.url);
47558
+ for (const candidate of ["../package.json", "../../package.json"]) {
47559
+ try {
47560
+ return path24__default.dirname(requireFromHere.resolve(candidate));
47561
+ } catch (error51) {
47562
+ if (error51.code !== "MODULE_NOT_FOUND") throw error51;
47563
+ }
47564
+ }
47565
+ throw new Error("fleet_console_package_json_not_found");
47566
+ }
47567
+ function isSafeOwnerId(value) {
47568
+ return value.length > 0 && value.length <= 256 && /^[A-Za-z0-9._-]+$/.test(value);
47569
+ }
47570
+ function readFleetConsoleRelease(env = process.env) {
47571
+ const desktop = readDesktopProtocolEnvironment(env);
47572
+ if (desktop) return readReleaseAt(desktop.resourceRoot, readPackageChannel(desktop.resourceRoot));
47573
+ const requireFromHere = createRequire(import.meta.url);
47574
+ const packageJsonPath = resolvePackageJsonPath(requireFromHere);
47575
+ const packageRoot = path24__default.dirname(packageJsonPath);
47576
+ return readReleaseAt(packageRoot, readPackageChannel(packageRoot, requireFromHere), requireFromHere);
47577
+ }
47578
+ function readPackageChannel(packageRoot, requireFromHere = createRequire(import.meta.url)) {
47579
+ const pkg = requireFromHere(path24__default.join(packageRoot, "package.json"));
47580
+ return pkg.private === true ? "local" : "stable";
47581
+ }
47582
+ function readReleaseAt(packageRoot, channel, requireFromHere = createRequire(import.meta.url)) {
47583
+ const packageJsonPath = path24__default.join(packageRoot, "package.json");
47584
+ const pkg = requireFromHere(packageJsonPath);
47585
+ return { channel, version: pkg.version ?? "", packageRoot };
47586
+ }
47587
+ function resolvePackageJsonPath(requireFromHere) {
47588
+ for (const candidate of ["../package.json", "../../package.json"]) {
47589
+ try {
47590
+ return requireFromHere.resolve(candidate);
47591
+ } catch (error51) {
47592
+ if (error51.code !== "MODULE_NOT_FOUND") throw error51;
47593
+ }
47594
+ }
47595
+ throw new Error("fleet_console_package_json_not_found");
47596
+ }
47597
+
47598
+ // core/host/paths.ts
47599
+ var CONSOLE_RUNTIME_DIR_NAME = "console";
47600
+ var CONSOLE_DATA_DIR_NAME2 = "console";
47601
+ var CONSOLE_STATE_FILE_NAME2 = "state.json";
47602
+ var CONSOLE_SETTINGS_FILE_NAME2 = "settings.json";
47603
+ var CONSOLE_DATA_DIR_ENV = "FLEET_CONSOLE_DATA_DIR";
47604
+ var LEGACY_CONSOLE_DATA_DIR_ENV = "FLEET_CONSOLE_DIR";
47605
+ function readConsoleDirOverride(env) {
47606
+ return env[CONSOLE_DATA_DIR_ENV] ?? env[LEGACY_CONSOLE_DATA_DIR_ENV];
47607
+ }
47608
+ function createConsolePaths(deps = {}) {
47609
+ const env = deps.env ?? process.env;
47610
+ const base = readConsoleDirOverride(env) ?? defaultConsoleBaseDir(deps);
47611
+ return { dir: base, lockFile: path24__default.join(base, "console.lock") };
47612
+ }
47613
+ function createConsoleDataPaths(deps = {}) {
47614
+ const dir = defaultConsoleDataBaseDir(deps);
47615
+ return {
47616
+ dir,
47617
+ stateFile: path24__default.join(dir, CONSOLE_STATE_FILE_NAME2),
47618
+ settingsFile: path24__default.join(dir, CONSOLE_SETTINGS_FILE_NAME2)
47619
+ };
47620
+ }
47621
+ function defaultConsoleBaseDir(deps) {
47622
+ let release;
47623
+ const channel = deps.channel ?? (release = readFleetConsoleRelease()).channel;
47624
+ if (channel === "local") {
47625
+ const packageRoot = deps.packageRoot ?? (release ??= readFleetConsoleRelease()).packageRoot;
47626
+ return localConsoleDir(packageRoot);
47627
+ }
47628
+ const uid = deps.uid ?? (typeof process.getuid === "function" ? process.getuid() : 0);
47629
+ return resolveCanonicalStableConsolePaths({
47630
+ tmpDir: os3__default.tmpdir(),
47631
+ uid,
47632
+ fleetDataDir: getFleetDataDir()
47633
+ }).dir;
47634
+ }
47635
+ function defaultConsoleDataBaseDir(deps) {
47636
+ if (deps.fleetDataDir !== void 0) {
47637
+ return path24__default.join(deps.fleetDataDir, CONSOLE_DATA_DIR_NAME2);
47638
+ }
47639
+ const env = deps.env ?? process.env;
47640
+ const override = readConsoleDirOverride(env);
47641
+ if (override) {
47642
+ return override;
47643
+ }
47644
+ let release;
47645
+ const channel = deps.channel ?? (release = readFleetConsoleRelease()).channel;
47646
+ if (channel === "local") {
47647
+ const packageRoot = deps.packageRoot ?? (release ??= readFleetConsoleRelease()).packageRoot;
47648
+ return localConsoleDir(packageRoot);
47649
+ }
47650
+ return resolveCanonicalStableConsolePaths({
47651
+ tmpDir: os3__default.tmpdir(),
47652
+ uid: typeof process.getuid === "function" ? process.getuid() : 0,
47653
+ fleetDataDir: getFleetDataDir()
47654
+ }).dataDir;
47655
+ }
47656
+ function localConsoleDir(packageRoot) {
47657
+ return path24__default.join(path24__default.resolve(packageRoot, "..", ".."), ".fleet", CONSOLE_RUNTIME_DIR_NAME);
47658
+ }
47659
+
47157
47660
  // core/host/console-lifecycle.ts
47158
47661
  init_src();
47159
47662
  var SPAWN_GRACE_MS = 250;
@@ -47269,6 +47772,9 @@ function createConsoleHealthClient(deps = {}) {
47269
47772
  }
47270
47773
  return { probe };
47271
47774
  }
47775
+
47776
+ // core/host/console-lifecycle.ts
47777
+ init_release();
47272
47778
  var LOCK_DIR_MODE = 448;
47273
47779
  var LOCK_FILE_MODE = 384;
47274
47780
  function createConsoleLock(deps = {}) {
@@ -47370,192 +47876,6 @@ function createConsoleLock(deps = {}) {
47370
47876
  }
47371
47877
  return { ensureLockDir, readLock: readLock2, writeLock, removeLock, assertLockModes, assertTrustedLock };
47372
47878
  }
47373
- var DESKTOP_PROTOCOL_VERSION = 1;
47374
- var DESKTOP_RESOURCE_ROOT_ENV = "FLEET_CONSOLE_RESOURCE_ROOT";
47375
- var DESKTOP_OWNER_ID_ENV = "FLEET_CONSOLE_OWNER_ID";
47376
- var DESKTOP_OWNER_KIND_ENV = "FLEET_CONSOLE_OWNER_KIND";
47377
- var DESKTOP_PROTOCOL_VERSION_ENV = "FLEET_CONSOLE_PROTOCOL_VERSION";
47378
- var DESKTOP_RESOURCE_ROOT_MARKER = ".fleet-console-resource-root";
47379
- var DESKTOP_DEVELOPMENT_ENV = "FLEET_CONSOLE_DESKTOP_DEVELOPMENT";
47380
- var LOCK_DIR_NAME3 = "fleet-console";
47381
- var LOCK_FILE_NAME = "console.lock";
47382
- var CONSOLE_DATA_DIR_NAME = "console";
47383
- var CONSOLE_STATE_FILE_NAME = "state.json";
47384
- var CONSOLE_SETTINGS_FILE_NAME = "settings.json";
47385
- var CONSOLE_CAPTURES_DIR_NAME = "captures";
47386
- function isDesktopDevelopmentEnvironment(env) {
47387
- return env[DESKTOP_DEVELOPMENT_ENV] === "1";
47388
- }
47389
- function resolveCanonicalStableConsolePaths(input) {
47390
- const dir = input.consoleDirOverride ?? path24__default.join(input.tmpDir, `${LOCK_DIR_NAME3}-${input.uid}-stable`);
47391
- const dataDir = input.consoleDirOverride ?? path24__default.join(input.fleetDataDir, CONSOLE_DATA_DIR_NAME);
47392
- return {
47393
- dir,
47394
- lockFile: path24__default.join(dir, LOCK_FILE_NAME),
47395
- dataDir,
47396
- stateFile: path24__default.join(dataDir, CONSOLE_STATE_FILE_NAME),
47397
- settingsFile: path24__default.join(dataDir, CONSOLE_SETTINGS_FILE_NAME),
47398
- capturesDir: path24__default.join(dataDir, CONSOLE_CAPTURES_DIR_NAME)
47399
- };
47400
- }
47401
- function resolveCanonicalLocalConsolePaths(input) {
47402
- const dir = path24__default.join(path24__default.resolve(input.packageRoot, "..", ".."), ".fleet", CONSOLE_DATA_DIR_NAME);
47403
- return {
47404
- dir,
47405
- lockFile: path24__default.join(dir, LOCK_FILE_NAME),
47406
- dataDir: dir,
47407
- stateFile: path24__default.join(dir, CONSOLE_STATE_FILE_NAME),
47408
- settingsFile: path24__default.join(dir, CONSOLE_SETTINGS_FILE_NAME),
47409
- capturesDir: path24__default.join(dir, CONSOLE_CAPTURES_DIR_NAME)
47410
- };
47411
- }
47412
- function isDesktopResourceRootMarkerValid(content) {
47413
- return content.trim() === String(DESKTOP_PROTOCOL_VERSION);
47414
- }
47415
-
47416
- // core/host/desktop-protocol.ts
47417
- function readDesktopProtocolEnvironment(env = process.env, deps = {}) {
47418
- const resourceRoot = env[DESKTOP_RESOURCE_ROOT_ENV];
47419
- const ownerId = env[DESKTOP_OWNER_ID_ENV];
47420
- const ownerKind = env[DESKTOP_OWNER_KIND_ENV];
47421
- const protocolVersion = env[DESKTOP_PROTOCOL_VERSION_ENV];
47422
- const values = [resourceRoot, ownerId, ownerKind, protocolVersion];
47423
- if (values.every((value) => value === void 0)) return null;
47424
- if (values.some((value) => !value)) throw new Error("desktop_protocol_environment_incomplete");
47425
- if (ownerKind !== "desktop") throw new Error("desktop_owner_kind_invalid");
47426
- if (!isSafeOwnerId(ownerId)) throw new Error("desktop_owner_id_invalid");
47427
- if (protocolVersion !== String(DESKTOP_PROTOCOL_VERSION)) throw new Error("desktop_protocol_version_unsupported");
47428
- const resolvedRoot = isDesktopDevelopmentEnvironment2(env) ? validateDesktopDevelopmentResourceRoot(resourceRoot) : validateDesktopResourceRoot(resourceRoot, deps.expectedPackageRoot);
47429
- return { owner: { kind: "desktop", id: ownerId, protocolVersion: DESKTOP_PROTOCOL_VERSION }, resourceRoot: resolvedRoot };
47430
- }
47431
- function isDesktopDevelopmentEnvironment2(env = process.env) {
47432
- return isDesktopDevelopmentEnvironment(env);
47433
- }
47434
- function validateDesktopResourceRoot(root, expectedPackageRoot = resolveDesktopProtocolPackageRoot()) {
47435
- if (!path24__default.isAbsolute(root)) throw new Error("desktop_resource_root_not_absolute");
47436
- const resolvedRoot = fs9__default.realpathSync(root);
47437
- const expectedRoot = fs9__default.realpathSync(expectedPackageRoot);
47438
- if (resolvedRoot !== expectedRoot) throw new Error("desktop_resource_root_invalid");
47439
- const markerPath = path24__default.join(resolvedRoot, DESKTOP_RESOURCE_ROOT_MARKER);
47440
- const marker = fs9__default.readFileSync(markerPath, "utf8");
47441
- if (!isDesktopResourceRootMarkerValid(marker)) throw new Error("desktop_resource_root_marker_invalid");
47442
- return resolvedRoot;
47443
- }
47444
- function validateDesktopDevelopmentResourceRoot(root) {
47445
- if (!path24__default.isAbsolute(root)) throw new Error("desktop_resource_root_not_absolute");
47446
- let resolvedRoot;
47447
- try {
47448
- resolvedRoot = fs9__default.realpathSync(root);
47449
- } catch {
47450
- throw new Error("desktop_development_resource_root_invalid");
47451
- }
47452
- const expectedRoot = fs9__default.realpathSync(resolveDesktopProtocolPackageRoot());
47453
- if (resolvedRoot !== expectedRoot) throw new Error("desktop_development_resource_root_invalid");
47454
- return resolvedRoot;
47455
- }
47456
- function resolveDesktopProtocolPackageRoot() {
47457
- const requireFromHere = createRequire(import.meta.url);
47458
- for (const candidate of ["../package.json", "../../package.json"]) {
47459
- try {
47460
- return path24__default.dirname(requireFromHere.resolve(candidate));
47461
- } catch (error51) {
47462
- if (error51.code !== "MODULE_NOT_FOUND") throw error51;
47463
- }
47464
- }
47465
- throw new Error("fleet_console_package_json_not_found");
47466
- }
47467
- function isSafeOwnerId(value) {
47468
- return value.length > 0 && value.length <= 256 && /^[A-Za-z0-9._-]+$/.test(value);
47469
- }
47470
- function readFleetConsoleRelease(env = process.env) {
47471
- const desktop = readDesktopProtocolEnvironment(env);
47472
- if (desktop) return readReleaseAt(desktop.resourceRoot, readPackageChannel(desktop.resourceRoot));
47473
- const requireFromHere = createRequire(import.meta.url);
47474
- const packageJsonPath = resolvePackageJsonPath(requireFromHere);
47475
- const packageRoot = path24__default.dirname(packageJsonPath);
47476
- return readReleaseAt(packageRoot, readPackageChannel(packageRoot, requireFromHere), requireFromHere);
47477
- }
47478
- function readPackageChannel(packageRoot, requireFromHere = createRequire(import.meta.url)) {
47479
- const pkg = requireFromHere(path24__default.join(packageRoot, "package.json"));
47480
- return pkg.private === true ? "local" : "stable";
47481
- }
47482
- function readReleaseAt(packageRoot, channel, requireFromHere = createRequire(import.meta.url)) {
47483
- const packageJsonPath = path24__default.join(packageRoot, "package.json");
47484
- const pkg = requireFromHere(packageJsonPath);
47485
- return { channel, version: pkg.version ?? "", packageRoot };
47486
- }
47487
- function resolvePackageJsonPath(requireFromHere) {
47488
- for (const candidate of ["../package.json", "../../package.json"]) {
47489
- try {
47490
- return requireFromHere.resolve(candidate);
47491
- } catch (error51) {
47492
- if (error51.code !== "MODULE_NOT_FOUND") throw error51;
47493
- }
47494
- }
47495
- throw new Error("fleet_console_package_json_not_found");
47496
- }
47497
-
47498
- // core/host/paths.ts
47499
- var CONSOLE_RUNTIME_DIR_NAME = "console";
47500
- var CONSOLE_DATA_DIR_NAME2 = "console";
47501
- var CONSOLE_STATE_FILE_NAME2 = "state.json";
47502
- var CONSOLE_SETTINGS_FILE_NAME2 = "settings.json";
47503
- var CONSOLE_DATA_DIR_ENV = "FLEET_CONSOLE_DATA_DIR";
47504
- var LEGACY_CONSOLE_DATA_DIR_ENV = "FLEET_CONSOLE_DIR";
47505
- function readConsoleDirOverride(env) {
47506
- return env[CONSOLE_DATA_DIR_ENV] ?? env[LEGACY_CONSOLE_DATA_DIR_ENV];
47507
- }
47508
- function createConsolePaths(deps = {}) {
47509
- const env = deps.env ?? process.env;
47510
- const base = readConsoleDirOverride(env) ?? defaultConsoleBaseDir(deps);
47511
- return { dir: base, lockFile: path24__default.join(base, "console.lock") };
47512
- }
47513
- function createConsoleDataPaths(deps = {}) {
47514
- const dir = defaultConsoleDataBaseDir(deps);
47515
- return {
47516
- dir,
47517
- stateFile: path24__default.join(dir, CONSOLE_STATE_FILE_NAME2),
47518
- settingsFile: path24__default.join(dir, CONSOLE_SETTINGS_FILE_NAME2)
47519
- };
47520
- }
47521
- function defaultConsoleBaseDir(deps) {
47522
- let release;
47523
- const channel = deps.channel ?? (release = readFleetConsoleRelease()).channel;
47524
- if (channel === "local") {
47525
- const packageRoot = deps.packageRoot ?? (release ??= readFleetConsoleRelease()).packageRoot;
47526
- return localConsoleDir(packageRoot);
47527
- }
47528
- const uid = deps.uid ?? (typeof process.getuid === "function" ? process.getuid() : 0);
47529
- return resolveCanonicalStableConsolePaths({
47530
- tmpDir: os3__default.tmpdir(),
47531
- uid,
47532
- fleetDataDir: getFleetDataDir()
47533
- }).dir;
47534
- }
47535
- function defaultConsoleDataBaseDir(deps) {
47536
- if (deps.fleetDataDir !== void 0) {
47537
- return path24__default.join(deps.fleetDataDir, CONSOLE_DATA_DIR_NAME2);
47538
- }
47539
- const env = deps.env ?? process.env;
47540
- const override = readConsoleDirOverride(env);
47541
- if (override) {
47542
- return override;
47543
- }
47544
- let release;
47545
- const channel = deps.channel ?? (release = readFleetConsoleRelease()).channel;
47546
- if (channel === "local") {
47547
- const packageRoot = deps.packageRoot ?? (release ??= readFleetConsoleRelease()).packageRoot;
47548
- return localConsoleDir(packageRoot);
47549
- }
47550
- return resolveCanonicalStableConsolePaths({
47551
- tmpDir: os3__default.tmpdir(),
47552
- uid: typeof process.getuid === "function" ? process.getuid() : 0,
47553
- fleetDataDir: getFleetDataDir()
47554
- }).dataDir;
47555
- }
47556
- function localConsoleDir(packageRoot) {
47557
- return path24__default.join(path24__default.resolve(packageRoot, "..", ".."), ".fleet", CONSOLE_RUNTIME_DIR_NAME);
47558
- }
47559
47879
 
47560
47880
  // sdk/operations/launch-variants.ts
47561
47881
  function readLaunchVariantGroups(value) {
@@ -48765,8 +49085,6 @@ function isNormalFace(face) {
48765
49085
  const style = face.style.toLocaleLowerCase();
48766
49086
  return NORMAL_FACE_MARKERS.some((marker) => style.includes(marker));
48767
49087
  }
48768
-
48769
- // core/host/system-fonts-routes.ts
48770
49088
  var SYSTEM_FONTS_PATH = "/api/v1/settings/fonts/system";
48771
49089
  var SYSTEM_FONTS_API_CATALOG = [
48772
49090
  {
@@ -49203,7 +49521,16 @@ function withSecurityHeaders(headers) {
49203
49521
  };
49204
49522
  }
49205
49523
 
49206
- // core/host/sse.ts
49524
+ // core/host/http-infra.ts
49525
+ var CONSOLE_SECURITY_HEADERS = {
49526
+ "Content-Security-Policy": "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob: https://img.shields.io; font-src 'self' data:; connect-src 'self' ws: wss: https://api.github.com; object-src 'none'; base-uri 'none'",
49527
+ "X-Content-Type-Options": "nosniff",
49528
+ "Referrer-Policy": "no-referrer",
49529
+ "Cache-Control": "no-store"
49530
+ };
49531
+ function withSecurityHeaders2(headers = {}) {
49532
+ return { ...CONSOLE_SECURITY_HEADERS, ...headers };
49533
+ }
49207
49534
  var SSE_KEEPALIVE_INTERVAL_MS = 3e4;
49208
49535
  function encodeSseData(event, data) {
49209
49536
  return `event: ${event}
@@ -50516,6 +50843,9 @@ var CLAUDE_GATEWAY_TURN_KEYS = Object.freeze([
50516
50843
  "abortController",
50517
50844
  "stderr"
50518
50845
  ]);
50846
+ var CLAUDE_GATEWAY_SESSION_KEYS = Object.freeze(
50847
+ CLAUDE_GATEWAY_TURN_KEYS.filter((key) => key !== "prompt")
50848
+ );
50519
50849
 
50520
50850
  // ../../packages/core-agent/src/claude/launch-env.ts
50521
50851
  var CLAUDE_GATEWAY_MODEL_CACHE_RELPATH = "cache/gateway-models.json";
@@ -50576,6 +50906,32 @@ async function createIsolatedClaudeConfigDir(tempRoot = tmpdir()) {
50576
50906
  }
50577
50907
  };
50578
50908
  }
50909
+ function readVendorContextUsage(response) {
50910
+ if (typeof response !== "object" || response === null) return null;
50911
+ const usage4 = response;
50912
+ if (typeof usage4.totalTokens !== "number" || typeof usage4.maxTokens !== "number") return null;
50913
+ const rows = Array.isArray(usage4.categories) ? usage4.categories : [];
50914
+ const memory = Array.isArray(usage4.memoryFiles) ? usage4.memoryFiles : [];
50915
+ const mcp = Array.isArray(usage4.mcpTools) ? usage4.mcpTools : [];
50916
+ return {
50917
+ total: usage4.totalTokens,
50918
+ max: usage4.maxTokens,
50919
+ model: typeof usage4.model === "string" ? usage4.model : "",
50920
+ compactAt: usage4.isAutoCompactEnabled === true && typeof usage4.autoCompactThreshold === "number" ? usage4.autoCompactThreshold : null,
50921
+ categories: rows.flatMap((row) => {
50922
+ const entry = row;
50923
+ return typeof entry?.name === "string" && typeof entry.tokens === "number" ? [{ name: entry.name, tokens: entry.tokens, deferred: entry.isDeferred === true }] : [];
50924
+ }),
50925
+ memoryFiles: memory.flatMap((row) => {
50926
+ const entry = row;
50927
+ return typeof entry?.path === "string" && typeof entry.tokens === "number" ? [{ path: entry.path, tokens: entry.tokens }] : [];
50928
+ }),
50929
+ mcpTools: mcp.flatMap((row) => {
50930
+ const entry = row;
50931
+ return typeof entry?.name === "string" && typeof entry.tokens === "number" ? [{ name: entry.name, server: typeof entry.serverName === "string" ? entry.serverName : "", tokens: entry.tokens }] : [];
50932
+ })
50933
+ };
50934
+ }
50579
50935
  function runVendorQuery(input) {
50580
50936
  const run = query({
50581
50937
  prompt: input.prompt,
@@ -50583,6 +50939,14 @@ function runVendorQuery(input) {
50583
50939
  });
50584
50940
  let closed = false;
50585
50941
  return {
50942
+ async getContextUsage() {
50943
+ if (closed || typeof run.getContextUsage !== "function") return null;
50944
+ try {
50945
+ return readVendorContextUsage(await run.getContextUsage());
50946
+ } catch {
50947
+ return null;
50948
+ }
50949
+ },
50586
50950
  [Symbol.asyncIterator]() {
50587
50951
  const iterator = run[Symbol.asyncIterator]();
50588
50952
  return {
@@ -50603,6 +50967,111 @@ function runVendorQuery(input) {
50603
50967
  }
50604
50968
  };
50605
50969
  }
50970
+ var VendorInputQueue = class {
50971
+ pending = [];
50972
+ waiting = null;
50973
+ closed = false;
50974
+ push(message) {
50975
+ if (this.closed) return;
50976
+ const waiting = this.waiting;
50977
+ if (waiting) {
50978
+ this.waiting = null;
50979
+ waiting({ done: false, value: message });
50980
+ return;
50981
+ }
50982
+ this.pending.push(message);
50983
+ }
50984
+ close() {
50985
+ if (this.closed) return;
50986
+ this.closed = true;
50987
+ const waiting = this.waiting;
50988
+ if (waiting) {
50989
+ this.waiting = null;
50990
+ waiting({ done: true, value: void 0 });
50991
+ }
50992
+ }
50993
+ [Symbol.asyncIterator]() {
50994
+ return {
50995
+ next: async () => {
50996
+ if (this.pending.length > 0) return { done: false, value: this.pending.shift() };
50997
+ if (this.closed) return { done: true, value: void 0 };
50998
+ return await new Promise((resolve3) => {
50999
+ this.waiting = resolve3;
51000
+ });
51001
+ }
51002
+ };
51003
+ }
51004
+ };
51005
+ function vendorUserMessage(text) {
51006
+ return {
51007
+ type: "user",
51008
+ session_id: "",
51009
+ message: { role: "user", content: [{ type: "text", text }] },
51010
+ parent_tool_use_id: null
51011
+ };
51012
+ }
51013
+ function runVendorSession(input) {
51014
+ const queue = new VendorInputQueue();
51015
+ const run = query({
51016
+ prompt: queue,
51017
+ options: input.options
51018
+ });
51019
+ let closed = false;
51020
+ return {
51021
+ send(text) {
51022
+ if (closed) return;
51023
+ queue.push(vendorUserMessage(text));
51024
+ },
51025
+ async interrupt() {
51026
+ if (closed || typeof run.interrupt !== "function") return;
51027
+ await run.interrupt();
51028
+ },
51029
+ async stopTask(taskId) {
51030
+ if (closed) return;
51031
+ if (typeof run.stopTask !== "function") {
51032
+ throw new TypeError("This Claude Agent SDK build has no stopTask control request.");
51033
+ }
51034
+ await run.stopTask(taskId);
51035
+ },
51036
+ async backgroundTasks(toolUseId) {
51037
+ if (closed) return false;
51038
+ if (typeof run.backgroundTasks !== "function") {
51039
+ throw new TypeError("This Claude Agent SDK build has no background_tasks control request.");
51040
+ }
51041
+ return await run.backgroundTasks(toolUseId);
51042
+ },
51043
+ async getContextUsage() {
51044
+ if (closed || typeof run.getContextUsage !== "function") return null;
51045
+ try {
51046
+ return readVendorContextUsage(await run.getContextUsage());
51047
+ } catch {
51048
+ return null;
51049
+ }
51050
+ },
51051
+ [Symbol.asyncIterator]() {
51052
+ const iterator = run[Symbol.asyncIterator]();
51053
+ return {
51054
+ async next() {
51055
+ const result = await iterator.next();
51056
+ return result.done === true ? { done: true, value: void 0 } : { done: false, value: result.value };
51057
+ }
51058
+ };
51059
+ },
51060
+ close() {
51061
+ if (closed) return;
51062
+ closed = true;
51063
+ queue.close();
51064
+ try {
51065
+ if (typeof run.close === "function") run.close();
51066
+ else {
51067
+ const closing = run.return?.(void 0);
51068
+ if (closing !== void 0) void closing.catch(() => void 0);
51069
+ }
51070
+ } catch {
51071
+ }
51072
+ }
51073
+ };
51074
+ }
50606
51075
 
50607
51076
  // ../../packages/core-agent/src/claude/sdk.ts
50608
51077
  var NATIVE_MODEL_ALIASES = /* @__PURE__ */ new Set(["sonnet", "opus", "opus[1m]", "haiku", "fable", "fable[1m]"]);
@@ -50614,79 +51083,135 @@ async function createClaudeGatewaySdk(options) {
50614
51083
  const configDir = options.home?.kind === "shared" ? createSharedClaudeConfigHome(options.home.configDir) : await createIsolatedClaudeConfigDir(options.tempRoot);
50615
51084
  let disposed = false;
50616
51085
  let active = null;
51086
+ const reserveSlot = (kind) => {
51087
+ if (disposed) throw new Error("This Claude gateway SDK instance has been disposed.");
51088
+ if (active) {
51089
+ throw new Error(kind === "turn" ? "A turn is already running on this instance. Await it, or create another instance." : "A turn or session is already running on this instance. Close it, or create another instance.");
51090
+ }
51091
+ const reservation = { close: () => void 0 };
51092
+ active = reservation;
51093
+ return reservation;
51094
+ };
51095
+ const prepareLaunch = async () => {
51096
+ await configDir.writeModelCache({ baseUrl, models: catalogModels, fetchedAt: Date.now() });
51097
+ return claudeGatewayLaunchEnv(inherited, {
51098
+ baseUrl,
51099
+ configDir: configDir.path,
51100
+ homeKind: options.home?.kind === "shared" ? "shared" : "isolated"
51101
+ });
51102
+ };
51103
+ const vendorRunOptions = (request, model, env) => ({
51104
+ env,
51105
+ model,
51106
+ ...request.systemPrompt === void 0 ? {} : { systemPrompt: vendorSystemPrompt(request.systemPrompt) },
51107
+ // 패키지가 스스로 지어내는 지시는 없다 — 여기 실리는 것은 전부 호출자가 고른 것이고,
51108
+ // 고르지 않으면 아무것도 붙지 않는다. 두 기본값이 그 규율을 구조로 만든다:
51109
+ // `settingSources: []`가 사용자·프로젝트 설정과 CLAUDE.md를 끄고, `strictMcpConfig`가
51110
+ // 그와 별개인 ambient .mcp.json·플러그인 MCP를 막는다.
51111
+ settingSources: options.settingSources ? [...options.settingSources] : [],
51112
+ strictMcpConfig: options.allowAmbientMcpServers !== true,
51113
+ // 플러그인의 MCP 선언은 읽지 않는다 — 좌표는 호출자가 이미 소유한다.
51114
+ ...options.plugins && options.plugins.length > 0 ? { plugins: options.plugins.map((plugin) => ({ type: "local", path: plugin.path, skipMcpDiscovery: true })) } : {},
51115
+ // `--settings`와 같은 자리다. flag 소스로 병합되므로 사용자·프로젝트 설정을 대체하지 않는다.
51116
+ // skillOverrides와 ultracode만 연다 — settings 전체를 열면 호출자가 쓰지 않은 지시가 들어온다.
51117
+ ...vendorFlagSettings(options),
51118
+ ...request.effort === void 0 ? {} : { effort: request.effort },
51119
+ ...request.cwd === void 0 ? {} : { cwd: request.cwd },
51120
+ ...request.resume === void 0 ? {} : { resume: request.resume },
51121
+ ...request.maxTurns === void 0 ? {} : { maxTurns: request.maxTurns },
51122
+ ...request.maxBudgetUsd === void 0 ? {} : { maxBudgetUsd: request.maxBudgetUsd },
51123
+ ...request.tools === void 0 ? {} : { tools: [...request.tools] },
51124
+ ...request.allowedTools === void 0 ? {} : { allowedTools: [...request.allowedTools] },
51125
+ ...request.disallowedTools === void 0 ? {} : { disallowedTools: [...request.disallowedTools] },
51126
+ ...request.permissionMode === void 0 ? {} : { permissionMode: request.permissionMode },
51127
+ ...request.canUseTool === void 0 ? {} : { canUseTool: vendorCanUseTool(request.canUseTool) },
51128
+ ...request.mcpServers === void 0 && request.servedMcpServers === void 0 ? {} : { mcpServers: { ...request.mcpServers, ...vendorServedMcpServers(request.servedMcpServers) } },
51129
+ ...request.includePartialMessages === void 0 ? {} : { includePartialMessages: request.includePartialMessages },
51130
+ ...request.abortController === void 0 ? {} : { abortController: request.abortController },
51131
+ ...request.stderr === void 0 ? {} : { stderr: request.stderr }
51132
+ });
50617
51133
  const sdk = {
50618
51134
  configDir: configDir.path,
50619
51135
  models: Object.freeze(accepted.map((entry) => entry.id)),
50620
51136
  async startTurn(turn) {
50621
- if (disposed) throw new Error("This Claude gateway SDK instance has been disposed.");
50622
- if (active) throw new Error("A turn is already running on this instance. Await it, or create another instance.");
50623
- assertKnownTurnKeys(turn);
50624
- if (typeof turn.prompt !== "string" || turn.prompt.length === 0) {
50625
- throw new TypeError("turn.prompt must be a non-empty string.");
50626
- }
50627
- const model = resolveTurnModel(turn.model, accepted);
50628
- await configDir.writeModelCache({ baseUrl, models: catalogModels, fetchedAt: Date.now() });
50629
- const env = claudeGatewayLaunchEnv(inherited, {
50630
- baseUrl,
50631
- configDir: configDir.path,
50632
- homeKind: options.home?.kind === "shared" ? "shared" : "isolated"
50633
- });
50634
- const run = runVendorQuery({
50635
- prompt: turn.prompt,
50636
- options: {
50637
- env,
50638
- model,
50639
- ...turn.systemPrompt === void 0 ? {} : { systemPrompt: vendorSystemPrompt(turn.systemPrompt) },
50640
- // 패키지가 스스로 지어내는 지시는 없다 — 여기 실리는 것은 전부 호출자가 고른 것이고,
50641
- // 고르지 않으면 아무것도 붙지 않는다. 두 기본값이 그 규율을 구조로 만든다:
50642
- // `settingSources: []`가 사용자·프로젝트 설정과 CLAUDE.md를 끄고, `strictMcpConfig`가
50643
- // 그와 별개인 ambient .mcp.json·플러그인 MCP를 막는다.
50644
- settingSources: options.settingSources ? [...options.settingSources] : [],
50645
- strictMcpConfig: options.allowAmbientMcpServers !== true,
50646
- // 플러그인의 MCP 선언은 읽지 않는다 — 좌표는 호출자가 이미 소유한다.
50647
- ...options.plugins && options.plugins.length > 0 ? { plugins: options.plugins.map((plugin) => ({ type: "local", path: plugin.path, skipMcpDiscovery: true })) } : {},
50648
- // `--settings`와 같은 자리다. flag 소스로 병합되므로 사용자·프로젝트 설정을 대체하지 않는다.
50649
- ...options.skillOverrides && Object.keys(options.skillOverrides).length > 0 ? { settings: { skillOverrides: { ...options.skillOverrides } } } : {},
50650
- ...turn.effort === void 0 ? {} : { effort: turn.effort },
50651
- ...turn.cwd === void 0 ? {} : { cwd: turn.cwd },
50652
- ...turn.resume === void 0 ? {} : { resume: turn.resume },
50653
- ...turn.maxTurns === void 0 ? {} : { maxTurns: turn.maxTurns },
50654
- ...turn.maxBudgetUsd === void 0 ? {} : { maxBudgetUsd: turn.maxBudgetUsd },
50655
- ...turn.tools === void 0 ? {} : { tools: [...turn.tools] },
50656
- ...turn.allowedTools === void 0 ? {} : { allowedTools: [...turn.allowedTools] },
50657
- ...turn.disallowedTools === void 0 ? {} : { disallowedTools: [...turn.disallowedTools] },
50658
- ...turn.permissionMode === void 0 ? {} : { permissionMode: turn.permissionMode },
50659
- ...turn.canUseTool === void 0 ? {} : { canUseTool: vendorCanUseTool(turn.canUseTool) },
50660
- ...turn.mcpServers === void 0 && turn.servedMcpServers === void 0 ? {} : { mcpServers: { ...turn.mcpServers, ...vendorServedMcpServers(turn.servedMcpServers) } },
50661
- ...turn.includePartialMessages === void 0 ? {} : { includePartialMessages: turn.includePartialMessages },
50662
- ...turn.abortController === void 0 ? {} : { abortController: turn.abortController },
50663
- ...turn.stderr === void 0 ? {} : { stderr: turn.stderr }
51137
+ const reservation = reserveSlot("turn");
51138
+ try {
51139
+ assertKnownTurnKeys(turn);
51140
+ if (typeof turn.prompt !== "string" || turn.prompt.length === 0) {
51141
+ throw new TypeError("turn.prompt must be a non-empty string.");
51142
+ }
51143
+ const model = resolveTurnModel(turn.model, accepted);
51144
+ const env = await prepareLaunch();
51145
+ const run = runVendorQuery({
51146
+ prompt: turn.prompt,
51147
+ options: vendorRunOptions(turn, model, env)
51148
+ });
51149
+ const release = () => {
51150
+ if (active === tracked) active = null;
51151
+ };
51152
+ const tracked = {
51153
+ [Symbol.asyncIterator]() {
51154
+ const iterator = run[Symbol.asyncIterator]();
51155
+ return {
51156
+ async next() {
51157
+ const result = await iterator.next();
51158
+ if (result.done === true) release();
51159
+ return result;
51160
+ }
51161
+ };
51162
+ },
51163
+ close() {
51164
+ try {
51165
+ run.close();
51166
+ } finally {
51167
+ release();
51168
+ }
51169
+ },
51170
+ getContextUsage: () => run.getContextUsage()
51171
+ };
51172
+ if (active !== reservation) {
51173
+ run.close();
51174
+ throw new Error("This Claude gateway SDK instance has been disposed.");
50664
51175
  }
50665
- });
50666
- const release = () => {
50667
- if (active === tracked) active = null;
50668
- };
50669
- const tracked = {
50670
- [Symbol.asyncIterator]() {
50671
- const iterator = run[Symbol.asyncIterator]();
50672
- return {
50673
- async next() {
50674
- const result = await iterator.next();
50675
- if (result.done === true) release();
50676
- return result;
51176
+ active = tracked;
51177
+ return tracked;
51178
+ } catch (error51) {
51179
+ if (active === reservation) active = null;
51180
+ throw error51;
51181
+ }
51182
+ },
51183
+ async openSession(request) {
51184
+ const reservation = reserveSlot("session");
51185
+ try {
51186
+ assertKnownSessionKeys(request);
51187
+ const model = resolveTurnModel(request.model, accepted);
51188
+ const env = await prepareLaunch();
51189
+ const session = runVendorSession({ options: vendorRunOptions(request, model, env) });
51190
+ const tracked = {
51191
+ send: (text) => session.send(text),
51192
+ interrupt: () => session.interrupt(),
51193
+ stopTask: (taskId) => session.stopTask(taskId),
51194
+ backgroundTasks: (toolUseId) => session.backgroundTasks(toolUseId),
51195
+ getContextUsage: () => session.getContextUsage(),
51196
+ [Symbol.asyncIterator]: () => session[Symbol.asyncIterator](),
51197
+ close() {
51198
+ try {
51199
+ session.close();
51200
+ } finally {
51201
+ if (active === tracked) active = null;
50677
51202
  }
50678
- };
50679
- },
50680
- close() {
50681
- try {
50682
- run.close();
50683
- } finally {
50684
- release();
50685
51203
  }
51204
+ };
51205
+ if (active !== reservation) {
51206
+ session.close();
51207
+ throw new Error("This Claude gateway SDK instance has been disposed.");
50686
51208
  }
50687
- };
50688
- active = tracked;
50689
- return tracked;
51209
+ active = tracked;
51210
+ return tracked;
51211
+ } catch (error51) {
51212
+ if (active === reservation) active = null;
51213
+ throw error51;
51214
+ }
50690
51215
  },
50691
51216
  async dispose() {
50692
51217
  if (disposed) return;
@@ -50768,6 +51293,14 @@ function vendorCanUseTool(canUseTool) {
50768
51293
  }
50769
51294
  };
50770
51295
  }
51296
+ function vendorFlagSettings(options) {
51297
+ const settings2 = {};
51298
+ if (options.skillOverrides && Object.keys(options.skillOverrides).length > 0) {
51299
+ settings2.skillOverrides = { ...options.skillOverrides };
51300
+ }
51301
+ if (options.ultracode === true) settings2.ultracode = true;
51302
+ return Object.keys(settings2).length > 0 ? { settings: settings2 } : {};
51303
+ }
50771
51304
  function vendorSystemPrompt(systemPrompt) {
50772
51305
  const text = systemPrompt?.text;
50773
51306
  if (typeof text !== "string" || text.length === 0) {
@@ -50785,6 +51318,14 @@ function assertKnownTurnKeys(turn) {
50785
51318
  );
50786
51319
  }
50787
51320
  }
51321
+ function assertKnownSessionKeys(request) {
51322
+ const unknown2 = Object.keys(request).filter((key) => !CLAUDE_GATEWAY_SESSION_KEYS.includes(key));
51323
+ if (unknown2.length > 0) {
51324
+ throw new TypeError(
51325
+ `Unsupported session option(s): ${unknown2.join(", ")}. Only an instruction the caller authored may reach the child, through systemPrompt; every other instruction channel is closed, so those options do not exist. A session receives its prompts through send(), never as an option.`
51326
+ );
51327
+ }
51328
+ }
50788
51329
  function vendorServedMcpServers(servers) {
50789
51330
  if (!servers?.length) return {};
50790
51331
  return Object.fromEntries(servers.map((server) => [server.name, {
@@ -51603,17 +52144,6 @@ function toMetadata(item) {
51603
52144
  };
51604
52145
  }
51605
52146
 
51606
- // core/host/security-headers.ts
51607
- var CONSOLE_SECURITY_HEADERS = {
51608
- "Content-Security-Policy": "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob: https://img.shields.io; font-src 'self' data:; connect-src 'self' ws: wss: https://api.github.com; object-src 'none'; base-uri 'none'",
51609
- "X-Content-Type-Options": "nosniff",
51610
- "Referrer-Policy": "no-referrer",
51611
- "Cache-Control": "no-store"
51612
- };
51613
- function withSecurityHeaders2(headers = {}) {
51614
- return { ...CONSOLE_SECURITY_HEADERS, ...headers };
51615
- }
51616
-
51617
52147
  // core/host/codex/gateway.ts
51618
52148
  var CODEX_BASE = "/console/codex";
51619
52149
  var ALLOWED_METHODS = /* @__PURE__ */ new Set(["GET", "HEAD", "POST"]);
@@ -57055,7 +57585,6 @@ function createConsoleStalePolicy(deps = {}) {
57055
57585
  // core/host/console-lifecycle.ts
57056
57586
  var FIXED_HOST = "127.0.0.1";
57057
57587
  var HELP_BANNER_INDENT2 = " ";
57058
- var DEFAULT_HELP_RELEASE = "local";
57059
57588
  function parseConsoleCliMode(argv) {
57060
57589
  if (argv.length === 0) return "start";
57061
57590
  const [first, ...rest] = argv;
@@ -57082,7 +57611,8 @@ Run 'fleet console --help' for usage.`);
57082
57611
  }
57083
57612
  function buildConsoleHelpText(options = {}) {
57084
57613
  const colorEnabled = resolveColorEnabled(options);
57085
- const subtitle = `Fleet Console \xB7 ${options.release ?? DEFAULT_HELP_RELEASE}`;
57614
+ const release = options.release ?? formatConsoleHelpRelease();
57615
+ const subtitle = `Fleet Console \xB7 ${release}`;
57086
57616
  const lines = [
57087
57617
  ...ASCII_FLEET_BANNER.map(
57088
57618
  (line, index) => `${HELP_BANNER_INDENT2}${paint(GRADIENT_COLORS[index] ?? FLEET_COMMAND, line, colorEnabled)}`
@@ -57115,6 +57645,10 @@ function buildConsoleHelpText(options = {}) {
57115
57645
  const text = lines.join("\n");
57116
57646
  return colorEnabled ? text : stripAnsi(text);
57117
57647
  }
57648
+ function formatConsoleHelpRelease() {
57649
+ const release = readFleetCliRelease();
57650
+ return `${release.version} \xB7 ${release.channel}`;
57651
+ }
57118
57652
  function createConsoleDaemonLifecycle(deps = {}) {
57119
57653
  const env = deps.env ?? V2.env;
57120
57654
  const childEnv = env.FLEET_CONSOLE_NO_SYSTEM_CA === "1" ? env : withNodeSystemCa(env);
@@ -57265,11 +57799,108 @@ function resolveDefaultServerModulePath2() {
57265
57799
  return fileURLToPath(import.meta.url);
57266
57800
  }
57267
57801
 
57802
+ // cli/doctor.ts
57803
+ var CLAUDE_COMMAND = "claude";
57804
+ var SEMVER_PATTERN = /(\d+\.\d+\.\d+)/;
57805
+ var VERSION_PROBE_TIMEOUT_MS = 5e3;
57806
+ var DOCTOR_HELP_TEXT = `fleet doctor \u2014 Diagnose Fleet
57807
+
57808
+ Usage:
57809
+ fleet doctor
57810
+ `;
57811
+ async function dispatchDoctorCommand(argv, io, deps) {
57812
+ const extra = argv[1];
57813
+ if (extra === "--help" || extra === "-h") {
57814
+ io.stdout.write(DOCTOR_HELP_TEXT);
57815
+ return 0;
57816
+ }
57817
+ if (extra !== void 0) {
57818
+ io.stderr.write(`Unknown fleet doctor command: ${extra}
57819
+ `);
57820
+ io.stdout.write(DOCTOR_HELP_TEXT);
57821
+ return 1;
57822
+ }
57823
+ io.stdout.write(`${await buildFleetDoctorText(deps)}
57824
+ `);
57825
+ return 0;
57826
+ }
57827
+ async function buildFleetDoctorText(deps) {
57828
+ const env = deps.env ?? process.env;
57829
+ const release = deps.release ?? readFleetCliRelease();
57830
+ const dataDir = deps.dataDir ?? getFleetDataDir(env);
57831
+ const lockFile = deps.lockFile ?? createConsolePaths({ env }).lockFile;
57832
+ const resolveBinary2 = deps.resolveBinary ?? ((command2, processEnv) => resolvePathBinary(command2, processEnv));
57833
+ const runVersion = deps.runVersion ?? execFileVersion;
57834
+ const readConsoleStatus = deps.readConsoleStatus ?? runConsoleStatus;
57835
+ const signedIn = new Set(await deps.authService.listProviderIds());
57836
+ const binary = await describeClaudeBinary(resolveBinary2(CLAUDE_COMMAND, env), runVersion);
57837
+ const consoleLine = await readConsoleStatusLine(readConsoleStatus);
57838
+ return [
57839
+ formatRow("package", `@dotobokuri/fleet-console ${release.version} (${release.channel})`),
57840
+ formatRow("data", dataDir),
57841
+ formatRow("binary", binary),
57842
+ formatRow("kimi", signedIn.has(AUTH_CLI_DEFINITIONS.kimi.providerId) ? "signed in" : "signed out"),
57843
+ formatRow("opencode", signedIn.has(AUTH_CLI_DEFINITIONS.opencode.providerId) ? "signed in" : "signed out"),
57844
+ formatRow("console", stripConsolePrefix(consoleLine)),
57845
+ formatRow("lock", lockFile)
57846
+ ].join("\n");
57847
+ }
57848
+ async function describeClaudeBinary(resolved, runVersion) {
57849
+ if (!resolved) return `${CLAUDE_COMMAND} (not on PATH)`;
57850
+ const displayPath = displayBinaryPath(resolved);
57851
+ try {
57852
+ const output = await runVersion(resolved.bin, [...resolved.prefixArgs, "--version"]);
57853
+ const version2 = output.match(SEMVER_PATTERN)?.[1];
57854
+ return version2 ? `${displayPath} ${version2}` : `${displayPath} (version unknown)`;
57855
+ } catch {
57856
+ return `${displayPath} (version unknown)`;
57857
+ }
57858
+ }
57859
+ function displayBinaryPath(resolved) {
57860
+ const shim = [...resolved.prefixArgs].reverse().map((arg) => arg.trim()).find((arg) => {
57861
+ const lower = arg.toLowerCase();
57862
+ return lower.endsWith(".cmd") || lower.endsWith(".bat");
57863
+ });
57864
+ return shim ?? resolved.bin;
57865
+ }
57866
+ function execFileVersion(bin, args) {
57867
+ return new Promise((resolve3, reject) => {
57868
+ execFile$1(bin, [...args], { timeout: VERSION_PROBE_TIMEOUT_MS }, (error51, stdout, stderr) => {
57869
+ if (error51) {
57870
+ reject(error51);
57871
+ return;
57872
+ }
57873
+ resolve3(`${stdout}${stderr}`);
57874
+ });
57875
+ });
57876
+ }
57877
+ function formatRow(key, value) {
57878
+ return `${key.padEnd(10)}${value}`;
57879
+ }
57880
+ async function readConsoleStatusLine(readConsoleStatus) {
57881
+ try {
57882
+ return firstLine(await readConsoleStatus());
57883
+ } catch (error51) {
57884
+ const reason = error51 instanceof Error ? error51.message : String(error51);
57885
+ return `unreadable (${firstLine(reason)})`;
57886
+ }
57887
+ }
57888
+ function firstLine(text) {
57889
+ return text.split("\n")[0] ?? text;
57890
+ }
57891
+ function stripConsolePrefix(line) {
57892
+ return line.replace(/^Fleet Console server:\s*/, "");
57893
+ }
57894
+
57895
+ // cli/fleet-dispatch.ts
57896
+ init_release();
57897
+
57268
57898
  // cli/update/dispatcher.ts
57269
57899
  var UPDATE_HELP_TEXT = `fleet update \u2014 Update Fleet
57270
57900
 
57271
57901
  Usage:
57272
57902
  fleet update
57903
+ fleet update --check
57273
57904
  `;
57274
57905
  async function dispatchUpdateCommand(argv, io, options = {}) {
57275
57906
  const command2 = argv[1];
@@ -57277,6 +57908,16 @@ async function dispatchUpdateCommand(argv, io, options = {}) {
57277
57908
  io.stdout.write(UPDATE_HELP_TEXT);
57278
57909
  return 0;
57279
57910
  }
57911
+ if (command2 === "--check") {
57912
+ if (argv[2] !== void 0) {
57913
+ io.stderr.write(`Unknown fleet update option: ${argv[2]}
57914
+ `);
57915
+ io.stdout.write(UPDATE_HELP_TEXT);
57916
+ return 1;
57917
+ }
57918
+ const { runFleetUpdateCheck: runFleetUpdateCheck2 } = await Promise.resolve().then(() => (init_check_report(), check_report_exports));
57919
+ return runFleetUpdateCheck2(io);
57920
+ }
57280
57921
  if (command2 !== void 0) {
57281
57922
  io.stderr.write(`Unknown fleet update command: ${command2}
57282
57923
  `);
@@ -57294,10 +57935,15 @@ function classifyFleetArgv(argv) {
57294
57935
  if (command2 === "update") return { kind: "update", argv };
57295
57936
  if (command2 === "auth") return { kind: "auth", argv };
57296
57937
  if (command2 === "console") return { kind: "console", consoleArgv: argv.slice(1) };
57938
+ if (command2 === "doctor") return { kind: "doctor", argv };
57939
+ if (command2 === "status") return { kind: "console", consoleArgv: ["status", ...argv.slice(1)] };
57297
57940
  const passthroughArgv = command2 === "cli" ? argv.slice(1) : argv;
57298
57941
  if (passthroughArgv[0] === "--help" || passthroughArgv[0] === "-h") {
57299
57942
  return { kind: "help", passthroughArgs: passthroughArgv.slice(1) };
57300
57943
  }
57944
+ if (command2 !== "cli" && isFleetVersionArg(passthroughArgv[0])) {
57945
+ return { kind: "version" };
57946
+ }
57301
57947
  return { kind: "passthrough", passthroughArgs: [...passthroughArgv] };
57302
57948
  }
57303
57949
  async function dispatchFleetArgv(argv, options) {
@@ -57315,11 +57961,15 @@ async function dispatchFleetArgv(argv, options) {
57315
57961
  if (dispatch.kind === "auth") {
57316
57962
  return await auth(dispatch.argv, io, createInfra());
57317
57963
  }
57964
+ if (dispatch.kind === "doctor") {
57965
+ return await dispatchDoctorCommand(dispatch.argv, io, { env, authService: createInfra().authService });
57966
+ }
57318
57967
  if (dispatch.kind === "console") {
57319
57968
  try {
57320
57969
  const mode = parseConsoleCliMode(dispatch.consoleArgv);
57321
57970
  if (mode === "help") {
57322
- io.stdout.write(`${buildConsoleHelpText({ env, isTTY: io.stdout.isTTY })}
57971
+ const release = readFleetCliRelease();
57972
+ io.stdout.write(`${buildConsoleHelpText({ env, isTTY: io.stdout.isTTY, release: `${release.version} \xB7 ${release.channel}` })}
57323
57973
  `);
57324
57974
  return 0;
57325
57975
  }
@@ -57355,6 +58005,10 @@ ${await runConsoleStatus()}
57355
58005
  io.stdout.write(buildFleetHelpText({ env, isTTY: io.stdout.isTTY }));
57356
58006
  return 0;
57357
58007
  }
58008
+ if (dispatch.kind === "version") {
58009
+ io.stdout.write(buildFleetVersionText());
58010
+ return 0;
58011
+ }
57358
58012
  await runAppImpl({ passthroughArgs: dispatch.passthroughArgs });
57359
58013
  return 0;
57360
58014
  }