@dotobokuri/fleet-console 1.30.0 → 1.31.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 (64) hide show
  1. package/dist/cli.mjs +35 -11
  2. package/dist/client/assets/{_baseUniq-Dvbxpxj-.js → _baseUniq-6rANA-_q.js} +1 -1
  3. package/dist/client/assets/{arc-Cqerxs8I.js → arc-tzTBQuJE.js} +1 -1
  4. package/dist/client/assets/{architectureDiagram-Q4EWVU46-gNhmCKnU.js → architectureDiagram-Q4EWVU46-B4MzTga_.js} +1 -1
  5. package/dist/client/assets/{blockDiagram-DXYQGD6D-CM5HRpKC.js → blockDiagram-DXYQGD6D-BSkil4Kq.js} +1 -1
  6. package/dist/client/assets/{c4Diagram-AHTNJAMY-DxLhQuvg.js → c4Diagram-AHTNJAMY-Dwq5nIR_.js} +1 -1
  7. package/dist/client/assets/channel-DGrgEBwr.js +1 -0
  8. package/dist/client/assets/{chunk-4BX2VUAB-HX6C_GAC.js → chunk-4BX2VUAB-BGefUfmP.js} +1 -1
  9. package/dist/client/assets/{chunk-4TB4RGXK-CoBQUhS4.js → chunk-4TB4RGXK-DBUtBigu.js} +1 -1
  10. package/dist/client/assets/{chunk-55IACEB6-DWsWxGBm.js → chunk-55IACEB6-BLF4uUa8.js} +1 -1
  11. package/dist/client/assets/{chunk-EDXVE4YY-BXNRu1M4.js → chunk-EDXVE4YY-Cc41I6y_.js} +1 -1
  12. package/dist/client/assets/{chunk-FMBD7UC4-DzKgP1_A.js → chunk-FMBD7UC4-C8PUZ57p.js} +1 -1
  13. package/dist/client/assets/{chunk-OYMX7WX6-aqXdvKUD.js → chunk-OYMX7WX6-CYos7ODp.js} +1 -1
  14. package/dist/client/assets/{chunk-QZHKN3VN-BbMqaUb0.js → chunk-QZHKN3VN-I4gCcbsX.js} +1 -1
  15. package/dist/client/assets/{chunk-YZCP3GAM-D8Mo0nv8.js → chunk-YZCP3GAM-CO0vuwK9.js} +1 -1
  16. package/dist/client/assets/classDiagram-6PBFFD2Q-CKhx9oUH.js +1 -0
  17. package/dist/client/assets/classDiagram-v2-HSJHXN6E-CKhx9oUH.js +1 -0
  18. package/dist/client/assets/clone-BODjA13N.js +1 -0
  19. package/dist/client/assets/{cose-bilkent-S5V4N54A-BOuVjjXz.js → cose-bilkent-S5V4N54A-BjXxkeBn.js} +1 -1
  20. package/dist/client/assets/{dagre-KV5264BT-BdUFzAj_.js → dagre-KV5264BT-DKVbTDmI.js} +1 -1
  21. package/dist/client/assets/{diagram-5BDNPKRD-C0iFrsGo.js → diagram-5BDNPKRD-C1as30xl.js} +1 -1
  22. package/dist/client/assets/{diagram-G4DWMVQ6-CGxGeQZt.js → diagram-G4DWMVQ6-B_G7-yDL.js} +1 -1
  23. package/dist/client/assets/{diagram-MMDJMWI5-Dex5uqlA.js → diagram-MMDJMWI5-B2srczqP.js} +1 -1
  24. package/dist/client/assets/{diagram-TYMM5635-O48PEpaS.js → diagram-TYMM5635-pYQydnR9.js} +1 -1
  25. package/dist/client/assets/{erDiagram-SMLLAGMA-B7PGw3YA.js → erDiagram-SMLLAGMA-AcmG-sIC.js} +1 -1
  26. package/dist/client/assets/{flowDiagram-DWJPFMVM-CCXWJIMw.js → flowDiagram-DWJPFMVM-BRvh-u54.js} +1 -1
  27. package/dist/client/assets/{ganttDiagram-T4ZO3ILL-B26RghpR.js → ganttDiagram-T4ZO3ILL-CuyxaGr-.js} +1 -1
  28. package/dist/client/assets/{gitGraphDiagram-UUTBAWPF-BJsjMn6A.js → gitGraphDiagram-UUTBAWPF-BWFXSUkW.js} +1 -1
  29. package/dist/client/assets/{graph-DuEL0RWH.js → graph-BFw4pMat.js} +1 -1
  30. package/dist/client/assets/index-DD3oRP6t.css +1 -0
  31. package/dist/client/assets/index-qutkoA_F.js +451 -0
  32. package/dist/client/assets/{infoDiagram-42DDH7IO-D32dz1SM.js → infoDiagram-42DDH7IO-CgrEFkpl.js} +1 -1
  33. package/dist/client/assets/{ishikawaDiagram-UXIWVN3A-4YPQjln0.js → ishikawaDiagram-UXIWVN3A-C1PYBJVn.js} +1 -1
  34. package/dist/client/assets/{journeyDiagram-VCZTEJTY-BSvi22HM.js → journeyDiagram-VCZTEJTY-BHC_QZyQ.js} +1 -1
  35. package/dist/client/assets/{kanban-definition-6JOO6SKY-SozOXS7m.js → kanban-definition-6JOO6SKY-BTQZjl-H.js} +1 -1
  36. package/dist/client/assets/{layout-CNXntIRV.js → layout-LyiAOink.js} +1 -1
  37. package/dist/client/assets/{linear-9RZPFtO4.js → linear-BWduiQJJ.js} +1 -1
  38. package/dist/client/assets/{mermaid.core-kwH-UxKY.js → mermaid.core-B2Lf_dRe.js} +4 -4
  39. package/dist/client/assets/{min-BdN2p8Q_.js → min-BS4WshjZ.js} +1 -1
  40. package/dist/client/assets/{mindmap-definition-QFDTVHPH-H-3dJmH9.js → mindmap-definition-QFDTVHPH-uBQw-Rcf.js} +1 -1
  41. package/dist/client/assets/{pieDiagram-DEJITSTG-CspzYvcs.js → pieDiagram-DEJITSTG-Daco6XeA.js} +1 -1
  42. package/dist/client/assets/{quadrantDiagram-34T5L4WZ-D1C7e3-s.js → quadrantDiagram-34T5L4WZ-phmU55Tk.js} +1 -1
  43. package/dist/client/assets/{requirementDiagram-MS252O5E-BJwKRtMi.js → requirementDiagram-MS252O5E-D7WmHJB1.js} +1 -1
  44. package/dist/client/assets/{sankeyDiagram-XADWPNL6-7oc42Z3P.js → sankeyDiagram-XADWPNL6-QmItdHVw.js} +1 -1
  45. package/dist/client/assets/{sequenceDiagram-FGHM5R23-TP5H_DnF.js → sequenceDiagram-FGHM5R23-B-Wgp5TP.js} +1 -1
  46. package/dist/client/assets/{stateDiagram-FHFEXIEX-BWnrNgJY.js → stateDiagram-FHFEXIEX-J7H1J8u1.js} +1 -1
  47. package/dist/client/assets/stateDiagram-v2-QKLJ7IA2-D0qZOg43.js +1 -0
  48. package/dist/client/assets/{timeline-definition-GMOUNBTQ-xXFvCsrr.js → timeline-definition-GMOUNBTQ-BI_kLbxz.js} +1 -1
  49. package/dist/client/assets/{vennDiagram-DHZGUBPP-D5unm_iH.js → vennDiagram-DHZGUBPP-Do5nm7Eq.js} +1 -1
  50. package/dist/client/assets/{wardley-RL74JXVD-B-eT02rs.js → wardley-RL74JXVD-DvA1fdMU.js} +1 -1
  51. package/dist/client/assets/{wardleyDiagram-NUSXRM2D-BTQ1Yqmb.js → wardleyDiagram-NUSXRM2D-BrigyBQU.js} +1 -1
  52. package/dist/client/assets/{xychartDiagram-5P7HB3ND-Bialvg0l.js → xychartDiagram-5P7HB3ND-B0Inv_Uf.js} +1 -1
  53. package/dist/client/index.html +2 -2
  54. package/dist/fleet-plugins/repository/routes.mjs +216 -11
  55. package/dist/fleet-plugins/skills/routes.mjs +35 -11
  56. package/dist/fleet-plugins/terminal/routes.mjs +83 -61
  57. package/package.json +1 -1
  58. package/dist/client/assets/channel-DKkQpLWI.js +0 -1
  59. package/dist/client/assets/classDiagram-6PBFFD2Q-CQurO5ix.js +0 -1
  60. package/dist/client/assets/classDiagram-v2-HSJHXN6E-CQurO5ix.js +0 -1
  61. package/dist/client/assets/clone-IodjsAGU.js +0 -1
  62. package/dist/client/assets/index-Dj775lUe.css +0 -1
  63. package/dist/client/assets/index-r6rDZQCs.js +0 -451
  64. package/dist/client/assets/stateDiagram-v2-QKLJ7IA2-Cmp8tobq.js +0 -1
@@ -8,12 +8,12 @@ import fs2 from 'fs/promises';
8
8
  function definePlugin(definition) {
9
9
  return definition;
10
10
  }
11
- function registerRouter(ctx, path8, handler) {
12
- ctx.registerRouter(normalizePath(path8), handler);
11
+ function registerRouter(ctx, path9, handler) {
12
+ ctx.registerRouter(normalizePath(path9), handler);
13
13
  }
14
- function normalizePath(path8) {
15
- if (path8.length === 0 || path8 === "/") return "/";
16
- return path8;
14
+ function normalizePath(path9) {
15
+ if (path9.length === 0 || path9 === "/") return "/";
16
+ return path9;
17
17
  }
18
18
 
19
19
  // ../../packages/core-process/src/hidden.ts
@@ -587,10 +587,207 @@ async function handleRepositoryCommitFile(req, res, ctx) {
587
587
  throw error;
588
588
  }
589
589
  }
590
+
591
+ // ../fleet-plugins/repository/server/compare.ts
592
+ function isPlainObject4(value) {
593
+ return typeof value === "object" && value !== null && !Array.isArray(value);
594
+ }
595
+ var FULL_REF_PREFIXES = ["refs/heads/", "refs/remotes/", "refs/tags/"];
596
+ var FORBIDDEN_REF_CHARS = /[\\~^:?*\[]/;
597
+ function hasWhitespaceOrControlChar(value) {
598
+ for (const ch of value) {
599
+ const code = ch.codePointAt(0);
600
+ if (code === void 0 || code <= 32 || code === 127) return true;
601
+ }
602
+ return /\s/.test(value);
603
+ }
604
+ function isSafeCompareRef(value) {
605
+ if (value === "HEAD") return true;
606
+ if (REF_RE.test(value)) return true;
607
+ if (!FULL_REF_PREFIXES.some((prefix) => value.startsWith(prefix))) return false;
608
+ if (hasWhitespaceOrControlChar(value) || FORBIDDEN_REF_CHARS.test(value)) return false;
609
+ if (value.includes("..") || value.includes("@{") || value.includes("//")) return false;
610
+ if (value.endsWith("/") || value.endsWith(".")) return false;
611
+ for (const component of value.split("/")) {
612
+ if (component.startsWith(".") || component.endsWith(".lock")) return false;
613
+ }
614
+ return true;
615
+ }
616
+ function isUnknownRevisionError(error) {
617
+ if (!(error instanceof GitExecutorError)) return false;
618
+ if (error.code !== "non_zero_exit") return false;
619
+ return error.stderr.includes("unknown revision") || error.stderr.includes("bad revision");
620
+ }
621
+ function isNoMergeBaseError(error) {
622
+ if (!(error instanceof GitExecutorError)) return false;
623
+ if (error.code !== "non_zero_exit") return false;
624
+ return error.stderr.includes("no merge base");
625
+ }
626
+ async function handleRepositoryCompare(req, res, ctx) {
627
+ if (req.method !== "POST") {
628
+ ctx.host.http.writeJson(res, 405, { error: "Method not allowed" });
629
+ return;
630
+ }
631
+ if (!ctx.host.security.isTerminalAuthorized(req)) {
632
+ ctx.host.http.writeJson(res, 401, { error: "unauthorized" });
633
+ return;
634
+ }
635
+ const body = await ctx.host.http.readJsonBody(req);
636
+ if (!isPlainObject4(body) || "subPath" in body) {
637
+ ctx.host.http.writeJson(res, 400, { error: "invalid_request" });
638
+ return;
639
+ }
640
+ const theaterId = body.theaterId;
641
+ if (typeof theaterId !== "string") {
642
+ ctx.host.http.writeJson(res, 400, { error: "invalid_request" });
643
+ return;
644
+ }
645
+ const { base, head } = body;
646
+ if (typeof base !== "string" || typeof head !== "string" || !isSafeCompareRef(base) || !isSafeCompareRef(head)) {
647
+ ctx.host.http.writeJson(res, 400, { error: "invalid_ref" });
648
+ return;
649
+ }
650
+ if (base === head) {
651
+ ctx.host.http.writeJson(res, 400, { error: "invalid_request" });
652
+ return;
653
+ }
654
+ const theaterPath = ctx.host.paths.resolveTheaterPath(theaterId);
655
+ if (!theaterPath) {
656
+ ctx.host.http.writeJson(res, 404, { error: "theater_not_found" });
657
+ return;
658
+ }
659
+ let cwdResult;
660
+ try {
661
+ cwdResult = await resolveGitCwd(theaterPath, body.repoRel);
662
+ } catch (error) {
663
+ if (error instanceof InvalidRepoError) {
664
+ ctx.host.http.writeJson(res, 400, { error: error.code });
665
+ return;
666
+ }
667
+ throw error;
668
+ }
669
+ const { gitCwd } = cwdResult;
670
+ const range = `${base}...${head}`;
671
+ try {
672
+ const [mergeBaseResult, nameStatusResult, numstatResult] = await Promise.all([
673
+ // 비교 컨텍스트 표기용 — 실패하면 응답에서 생략한다
674
+ runGit(["merge-base", "--end-of-options", base, head], { cwd: gitCwd }).catch(() => null),
675
+ runGit(["diff", "--relative", "--name-status", "--diff-filter=MADRT", "-M", "--end-of-options", range, "--", "."], { cwd: gitCwd }),
676
+ runGit(["diff", "--relative", "--numstat", "--diff-filter=MADRT", "-M", "--end-of-options", range, "--", "."], { cwd: gitCwd })
677
+ ]);
678
+ const mergeBase = mergeBaseResult?.stdout.trim().slice(0, 9);
679
+ ctx.host.http.writeJson(res, 200, {
680
+ files: parseDiffFileList(nameStatusResult.stdout, numstatResult.stdout),
681
+ ...mergeBase ? { mergeBase } : {},
682
+ ...nameStatusResult.truncated || numstatResult.truncated ? { truncated: true } : {}
683
+ });
684
+ } catch (error) {
685
+ if (error instanceof GitExecutorError) {
686
+ if (error.code === "no_git_repo" || error.code === "git_unavailable") {
687
+ ctx.host.http.writeJson(res, 422, { error: error.code });
688
+ return;
689
+ }
690
+ if (isNoMergeBaseError(error)) {
691
+ ctx.host.http.writeJson(res, 400, { error: "no_merge_base" });
692
+ return;
693
+ }
694
+ if (isUnknownRevisionError(error)) {
695
+ ctx.host.http.writeJson(res, 400, { error: "unknown_ref" });
696
+ return;
697
+ }
698
+ ctx.host.http.writeJson(res, 500, { error: "git_failed" });
699
+ return;
700
+ }
701
+ throw error;
702
+ }
703
+ }
704
+ function isPlainObject5(value) {
705
+ return typeof value === "object" && value !== null && !Array.isArray(value);
706
+ }
707
+ function resolveLiteralFilePath2(gitCwd, rawPath) {
708
+ const relativePath = path4.normalize(rawPath);
709
+ const resolved = path4.resolve(gitCwd, relativePath);
710
+ if (relativePath === ".." || relativePath.startsWith(".." + path4.sep) || !resolved.startsWith(gitCwd + path4.sep)) return null;
711
+ return relativePath;
712
+ }
713
+ function literalPathspec3(relativePath) {
714
+ return `:(literal)${relativePath}`;
715
+ }
716
+ async function handleRepositoryCompareFile(req, res, ctx) {
717
+ if (req.method !== "POST") {
718
+ ctx.host.http.writeJson(res, 405, { error: "Method not allowed" });
719
+ return;
720
+ }
721
+ if (!ctx.host.security.isTerminalAuthorized(req)) {
722
+ ctx.host.http.writeJson(res, 401, { error: "unauthorized" });
723
+ return;
724
+ }
725
+ const body = await ctx.host.http.readJsonBody(req);
726
+ if (!isPlainObject5(body) || "subPath" in body || typeof body.theaterId !== "string" || typeof body.base !== "string" || typeof body.head !== "string" || typeof body.filePath !== "string") {
727
+ ctx.host.http.writeJson(res, 400, { error: "invalid_request" });
728
+ return;
729
+ }
730
+ if (!isSafeCompareRef(body.base) || !isSafeCompareRef(body.head)) {
731
+ ctx.host.http.writeJson(res, 400, { error: "invalid_ref" });
732
+ return;
733
+ }
734
+ if (!body.filePath) {
735
+ ctx.host.http.writeJson(res, 400, { error: "invalid_file_path" });
736
+ return;
737
+ }
738
+ if (body.oldPath !== void 0 && (typeof body.oldPath !== "string" || !body.oldPath)) {
739
+ ctx.host.http.writeJson(res, 400, { error: "invalid_file_path" });
740
+ return;
741
+ }
742
+ const theaterPath = ctx.host.paths.resolveTheaterPath(body.theaterId);
743
+ if (!theaterPath) {
744
+ ctx.host.http.writeJson(res, 404, { error: "theater_not_found" });
745
+ return;
746
+ }
747
+ let cwdResult;
748
+ try {
749
+ cwdResult = await resolveGitCwd(theaterPath, body.repoRel);
750
+ } catch (error) {
751
+ if (error instanceof InvalidRepoError) {
752
+ ctx.host.http.writeJson(res, 400, { error: error.code });
753
+ return;
754
+ }
755
+ throw error;
756
+ }
757
+ const relativePath = resolveLiteralFilePath2(cwdResult.gitCwd, body.filePath);
758
+ const oldPath = typeof body.oldPath === "string" ? resolveLiteralFilePath2(cwdResult.gitCwd, body.oldPath) : void 0;
759
+ if (!relativePath || body.oldPath !== void 0 && !oldPath) {
760
+ ctx.host.http.writeJson(res, 403, { error: "path_outside_theater" });
761
+ return;
762
+ }
763
+ const range = `${body.base}...${body.head}`;
764
+ try {
765
+ const result = await runGit(oldPath ? ["diff", "--unified=3", "-M", "--end-of-options", range, "--", literalPathspec3(oldPath), literalPathspec3(relativePath)] : ["diff", "--unified=3", "-M", "--end-of-options", range, "--", literalPathspec3(relativePath)], { cwd: cwdResult.gitCwd });
766
+ ctx.host.http.writeJson(res, 200, { content: result.stdout, ...result.truncated ? { truncated: true } : {} });
767
+ } catch (error) {
768
+ if (error instanceof GitExecutorError) {
769
+ if (error.code === "no_git_repo" || error.code === "git_unavailable") {
770
+ ctx.host.http.writeJson(res, 422, { error: error.code });
771
+ return;
772
+ }
773
+ if (isNoMergeBaseError(error)) {
774
+ ctx.host.http.writeJson(res, 400, { error: "no_merge_base" });
775
+ return;
776
+ }
777
+ if (isUnknownRevisionError(error)) {
778
+ ctx.host.http.writeJson(res, 400, { error: "unknown_ref" });
779
+ return;
780
+ }
781
+ ctx.host.http.writeJson(res, 500, { error: "git_failed" });
782
+ return;
783
+ }
784
+ throw error;
785
+ }
786
+ }
590
787
  var WORKTREE_SHA_RE = /^[0-9a-f]{40}$/;
591
788
  var CANONICAL_REF_RE = /^refs\/(?:heads|remotes|tags)\//;
592
789
  var REF_METACHAR_RE = /[~^:?*\[\\\s\x00-\x1f\x7f]/;
593
- function isPlainObject4(value) {
790
+ function isPlainObject6(value) {
594
791
  return typeof value === "object" && value !== null && !Array.isArray(value);
595
792
  }
596
793
  function isCanonicalRepositoryRef(ref) {
@@ -715,7 +912,7 @@ async function handleRepositoryLog(req, res, ctx) {
715
912
  return;
716
913
  }
717
914
  const body = await ctx.host.http.readJsonBody(req);
718
- if (!isPlainObject4(body) || "subPath" in body) {
915
+ if (!isPlainObject6(body) || "subPath" in body) {
719
916
  ctx.host.http.writeJson(res, 400, { error: "invalid_request" });
720
917
  return;
721
918
  }
@@ -872,7 +1069,7 @@ var HARD_CAP_DEPTH = 8;
872
1069
  var NESTED_BRANCH_CAP = 64;
873
1070
  var SCAN_VISIT_BUDGET = 1e4;
874
1071
  var DEFAULT_DEPTH = 3;
875
- function isPlainObject5(value) {
1072
+ function isPlainObject7(value) {
876
1073
  return typeof value === "object" && value !== null && !Array.isArray(value);
877
1074
  }
878
1075
  async function resolveRepoBranch(repoDir) {
@@ -961,7 +1158,7 @@ async function handleRepositoryRepos(req, res, ctx) {
961
1158
  return;
962
1159
  }
963
1160
  const body = await ctx.host.http.readJsonBody(req);
964
- if (!isPlainObject5(body) || typeof body.theaterId !== "string") {
1161
+ if (!isPlainObject7(body) || typeof body.theaterId !== "string") {
965
1162
  ctx.host.http.writeJson(res, 400, { error: "invalid_request" });
966
1163
  return;
967
1164
  }
@@ -1011,7 +1208,7 @@ async function handleRepositoryRepos(req, res, ctx) {
1011
1208
  const result = { repos, ...truncated ? { truncated: true } : {} };
1012
1209
  ctx.host.http.writeJson(res, 200, result);
1013
1210
  }
1014
- function isPlainObject6(value) {
1211
+ function isPlainObject8(value) {
1015
1212
  return typeof value === "object" && value !== null && !Array.isArray(value);
1016
1213
  }
1017
1214
  async function handleRepositoryWorktrees(req, res, ctx) {
@@ -1024,7 +1221,7 @@ async function handleRepositoryWorktrees(req, res, ctx) {
1024
1221
  return;
1025
1222
  }
1026
1223
  const body = await ctx.host.http.readJsonBody(req);
1027
- if (!isPlainObject6(body) || "subPath" in body || typeof body.theaterId !== "string") {
1224
+ if (!isPlainObject8(body) || "subPath" in body || typeof body.theaterId !== "string") {
1028
1225
  ctx.host.http.writeJson(res, 400, { error: "invalid_request" });
1029
1226
  return;
1030
1227
  }
@@ -1125,6 +1322,14 @@ var routes_default = definePlugin({
1125
1322
  await handleRepositoryCommitFile(req, res, ctx);
1126
1323
  return true;
1127
1324
  });
1325
+ registerRouter(ctx, "compare", async ({ req, res }) => {
1326
+ await handleRepositoryCompare(req, res, ctx);
1327
+ return true;
1328
+ });
1329
+ registerRouter(ctx, "compare-file", async ({ req, res }) => {
1330
+ await handleRepositoryCompareFile(req, res, ctx);
1331
+ return true;
1332
+ });
1128
1333
  }
1129
1334
  });
1130
1335
 
@@ -16387,7 +16387,7 @@ function withHidden(options) {
16387
16387
  // ../../packages/core-unified-agent/models.json
16388
16388
  var models_default = {
16389
16389
  version: 1,
16390
- updatedAt: "2026-07-20T00:00:00Z",
16390
+ updatedAt: "2026-07-21T00:00:00Z",
16391
16391
  providers: {
16392
16392
  claude: {
16393
16393
  name: "Claude Code",
@@ -16432,15 +16432,19 @@ var models_default = {
16432
16432
  },
16433
16433
  "opencode-go": {
16434
16434
  name: "OpenCode Go",
16435
- defaultModel: "opencode-go/glm-5.1",
16435
+ defaultModel: "opencode-go/deepseek-v4-flash",
16436
16436
  models: [
16437
16437
  { modelId: "opencode-go/deepseek-v4-flash", name: "DeepSeek V4 Flash", effort: { supported: false } },
16438
16438
  { modelId: "opencode-go/deepseek-v4-pro", name: "DeepSeek V4 Pro", effort: { supported: false } },
16439
- { modelId: "opencode-go/glm-5", name: "GLM-5", effort: { supported: false } },
16440
- { modelId: "opencode-go/glm-5.1", name: "GLM-5.1", effort: { supported: false } },
16441
16439
  { modelId: "opencode-go/glm-5.2", name: "GLM-5.2", effort: { supported: false } },
16442
- { modelId: "opencode-go/kimi-k2.6", name: "Kimi K2.6 (3x limits)", effort: { supported: false } },
16443
- { modelId: "opencode-go/kimi-k2.7-code", name: "Kimi K2.7 Code", effort: { supported: false } }
16440
+ { modelId: "opencode-go/grok-4.5", name: "Grok 4.5", effort: { supported: false } },
16441
+ { modelId: "opencode-go/kimi-k3", name: "Kimi K3", effort: { supported: false } },
16442
+ { modelId: "opencode-go/kimi-k2.7-code", name: "Kimi K2.7 Code", effort: { supported: false } },
16443
+ { modelId: "opencode-go/mimo-v2.5", name: "MiMo V2.5", effort: { supported: false } },
16444
+ { modelId: "opencode-go/mimo-v2.5-pro", name: "MiMo V2.5 Pro", effort: { supported: false } },
16445
+ { modelId: "opencode-go/minimax-m3", name: "MiniMax M3", effort: { supported: false } },
16446
+ { modelId: "opencode-go/qwen3.7-max", name: "Qwen3.7 Max", effort: { supported: false } },
16447
+ { modelId: "opencode-go/qwen3.7-plus", name: "Qwen3.7 Plus", effort: { supported: false } }
16444
16448
  ]
16445
16449
  },
16446
16450
  cursor: {
@@ -16448,14 +16452,34 @@ var models_default = {
16448
16452
  defaultModel: "auto",
16449
16453
  models: [
16450
16454
  { modelId: "auto", name: "Auto", effort: { supported: false } },
16451
- { modelId: "composer-2.5-fast", name: "Composer 2.5 Fast", description: "Cursor Composer 2.5 (fast variant, default upstream)", effort: { supported: false } },
16452
- { modelId: "composer-2.5", name: "Composer 2.5", description: "Cursor Composer 2.5 (standard variant)", effort: { supported: false } },
16455
+ { modelId: "composer-2.5", name: "Composer 2.5", effort: { supported: false } },
16456
+ { modelId: "composer-2.5-fast", name: "Composer 2.5 Fast", effort: { supported: false } },
16457
+ { modelId: "gpt-5.6-sol", name: "GPT-5.6 Sol", spawnModelTemplate: "gpt-5.6-sol-{effort}", effort: { supported: true, levels: ["low", "medium", "high", "xhigh", "max"], default: "medium" } },
16458
+ { modelId: "gpt-5.6-sol-fast", name: "GPT-5.6 Sol Fast", spawnModelTemplate: "gpt-5.6-sol-{effort}-fast", effort: { supported: true, levels: ["low", "medium", "high", "xhigh", "max"], default: "medium" } },
16459
+ { modelId: "gpt-5.6-sol-none", name: "GPT-5.6 Sol None", effort: { supported: false } },
16460
+ { modelId: "gpt-5.6-sol-none-fast", name: "GPT-5.6 Sol None Fast", effort: { supported: false } },
16461
+ { modelId: "gpt-5.6-luna", name: "GPT-5.6 Luna", spawnModelTemplate: "gpt-5.6-luna-{effort}", effort: { supported: true, levels: ["low", "medium", "high", "xhigh", "max"], default: "medium" } },
16462
+ { modelId: "gpt-5.6-luna-fast", name: "GPT-5.6 Luna Fast", spawnModelTemplate: "gpt-5.6-luna-{effort}-fast", effort: { supported: true, levels: ["low", "medium", "high", "xhigh", "max"], default: "medium" } },
16463
+ { modelId: "gpt-5.6-luna-none", name: "GPT-5.6 Luna None", effort: { supported: false } },
16464
+ { modelId: "gpt-5.6-luna-none-fast", name: "GPT-5.6 Luna None Fast", effort: { supported: false } },
16465
+ { modelId: "gpt-5.6-terra", name: "GPT-5.6 Terra", spawnModelTemplate: "gpt-5.6-terra-{effort}", effort: { supported: true, levels: ["low", "medium", "high", "xhigh", "max"], default: "medium" } },
16466
+ { modelId: "gpt-5.6-terra-fast", name: "GPT-5.6 Terra Fast", spawnModelTemplate: "gpt-5.6-terra-{effort}-fast", effort: { supported: true, levels: ["low", "medium", "high", "xhigh", "max"], default: "medium" } },
16467
+ { modelId: "gpt-5.6-terra-none", name: "GPT-5.6 Terra None", effort: { supported: false } },
16468
+ { modelId: "gpt-5.6-terra-none-fast", name: "GPT-5.6 Terra None Fast", effort: { supported: false } },
16469
+ { modelId: "cursor-grok-4.5", name: "Cursor Grok 4.5", spawnModelTemplate: "cursor-grok-4.5-{effort}", effort: { supported: true, levels: ["low", "medium", "high"], default: "high" } },
16470
+ { modelId: "cursor-grok-4.5-fast", name: "Cursor Grok 4.5 Fast", spawnModelTemplate: "cursor-grok-4.5-{effort}-fast", effort: { supported: true, levels: ["low", "medium", "high"], default: "high" } },
16471
+ { modelId: "claude-opus-4-8", name: "Claude Opus 4.8", spawnModelTemplate: "claude-opus-4-8-{effort}", effort: { supported: true, levels: ["low", "medium", "high", "xhigh", "max"], default: "high" } },
16472
+ { modelId: "claude-opus-4-8-fast", name: "Claude Opus 4.8 Fast", spawnModelTemplate: "claude-opus-4-8-{effort}-fast", effort: { supported: true, levels: ["low", "medium", "high", "xhigh", "max"], default: "high" } },
16473
+ { modelId: "claude-opus-4-8-thinking", name: "Claude Opus 4.8 Thinking", spawnModelTemplate: "claude-opus-4-8-thinking-{effort}", effort: { supported: true, levels: ["low", "medium", "high", "xhigh", "max"], default: "xhigh" } },
16474
+ { modelId: "claude-opus-4-8-thinking-fast", name: "Claude Opus 4.8 Thinking Fast", spawnModelTemplate: "claude-opus-4-8-thinking-{effort}-fast", effort: { supported: true, levels: ["low", "medium", "high", "xhigh", "max"], default: "xhigh" } },
16475
+ { modelId: "claude-sonnet-5", name: "Claude Sonnet 5", spawnModelTemplate: "claude-sonnet-5-{effort}", effort: { supported: true, levels: ["low", "medium", "high", "xhigh", "max"], default: "high" } },
16476
+ { modelId: "claude-sonnet-5-thinking", name: "Claude Sonnet 5 Thinking", spawnModelTemplate: "claude-sonnet-5-thinking-{effort}", effort: { supported: true, levels: ["low", "medium", "high", "xhigh", "max"], default: "xhigh" } },
16477
+ { modelId: "claude-fable-5", name: "Claude Fable 5", description: "NO ZDR per cursor-agent model list", spawnModelTemplate: "claude-fable-5-{effort}", effort: { supported: true, levels: ["low", "medium", "high", "xhigh", "max"], default: "high" } },
16478
+ { modelId: "claude-fable-5-thinking", name: "Claude Fable 5 Thinking", description: "NO ZDR per cursor-agent model list", spawnModelTemplate: "claude-fable-5-thinking-{effort}", effort: { supported: true, levels: ["low", "medium", "high", "xhigh", "max"], default: "xhigh" } },
16453
16479
  { modelId: "gemini-3.1-pro", name: "Gemini 3.1 Pro", effort: { supported: false } },
16454
- { modelId: "gemini-3-flash", name: "Gemini 3 Flash", effort: { supported: false } },
16455
16480
  { modelId: "gemini-3.5-flash", name: "Gemini 3.5 Flash", effort: { supported: false } },
16456
16481
  { modelId: "kimi-k2.7-code", name: "Kimi K2.7 Code", effort: { supported: false } },
16457
- { modelId: "glm-5.2", name: "GLM 5.2", spawnModelTemplate: "glm-5.2-{effort}", effort: { supported: true, levels: ["high", "max"], default: "max" } },
16458
- { modelId: "claude-opus-4-8-thinking", name: "Claude Opus 4.8 Thinking", spawnModelTemplate: "claude-opus-4-8-thinking-{effort}", effort: { supported: true, levels: ["low", "medium", "high", "xhigh", "max"], default: "xhigh" } }
16482
+ { modelId: "glm-5.2", name: "GLM 5.2", spawnModelTemplate: "glm-5.2-{effort}", effort: { supported: true, levels: ["high", "max"], default: "max" } }
16459
16483
  ]
16460
16484
  }
16461
16485
  }