@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.
- package/dist/cli.mjs +35 -11
- package/dist/client/assets/{_baseUniq-Dvbxpxj-.js → _baseUniq-6rANA-_q.js} +1 -1
- package/dist/client/assets/{arc-Cqerxs8I.js → arc-tzTBQuJE.js} +1 -1
- package/dist/client/assets/{architectureDiagram-Q4EWVU46-gNhmCKnU.js → architectureDiagram-Q4EWVU46-B4MzTga_.js} +1 -1
- package/dist/client/assets/{blockDiagram-DXYQGD6D-CM5HRpKC.js → blockDiagram-DXYQGD6D-BSkil4Kq.js} +1 -1
- package/dist/client/assets/{c4Diagram-AHTNJAMY-DxLhQuvg.js → c4Diagram-AHTNJAMY-Dwq5nIR_.js} +1 -1
- package/dist/client/assets/channel-DGrgEBwr.js +1 -0
- package/dist/client/assets/{chunk-4BX2VUAB-HX6C_GAC.js → chunk-4BX2VUAB-BGefUfmP.js} +1 -1
- package/dist/client/assets/{chunk-4TB4RGXK-CoBQUhS4.js → chunk-4TB4RGXK-DBUtBigu.js} +1 -1
- package/dist/client/assets/{chunk-55IACEB6-DWsWxGBm.js → chunk-55IACEB6-BLF4uUa8.js} +1 -1
- package/dist/client/assets/{chunk-EDXVE4YY-BXNRu1M4.js → chunk-EDXVE4YY-Cc41I6y_.js} +1 -1
- package/dist/client/assets/{chunk-FMBD7UC4-DzKgP1_A.js → chunk-FMBD7UC4-C8PUZ57p.js} +1 -1
- package/dist/client/assets/{chunk-OYMX7WX6-aqXdvKUD.js → chunk-OYMX7WX6-CYos7ODp.js} +1 -1
- package/dist/client/assets/{chunk-QZHKN3VN-BbMqaUb0.js → chunk-QZHKN3VN-I4gCcbsX.js} +1 -1
- package/dist/client/assets/{chunk-YZCP3GAM-D8Mo0nv8.js → chunk-YZCP3GAM-CO0vuwK9.js} +1 -1
- package/dist/client/assets/classDiagram-6PBFFD2Q-CKhx9oUH.js +1 -0
- package/dist/client/assets/classDiagram-v2-HSJHXN6E-CKhx9oUH.js +1 -0
- package/dist/client/assets/clone-BODjA13N.js +1 -0
- package/dist/client/assets/{cose-bilkent-S5V4N54A-BOuVjjXz.js → cose-bilkent-S5V4N54A-BjXxkeBn.js} +1 -1
- package/dist/client/assets/{dagre-KV5264BT-BdUFzAj_.js → dagre-KV5264BT-DKVbTDmI.js} +1 -1
- package/dist/client/assets/{diagram-5BDNPKRD-C0iFrsGo.js → diagram-5BDNPKRD-C1as30xl.js} +1 -1
- package/dist/client/assets/{diagram-G4DWMVQ6-CGxGeQZt.js → diagram-G4DWMVQ6-B_G7-yDL.js} +1 -1
- package/dist/client/assets/{diagram-MMDJMWI5-Dex5uqlA.js → diagram-MMDJMWI5-B2srczqP.js} +1 -1
- package/dist/client/assets/{diagram-TYMM5635-O48PEpaS.js → diagram-TYMM5635-pYQydnR9.js} +1 -1
- package/dist/client/assets/{erDiagram-SMLLAGMA-B7PGw3YA.js → erDiagram-SMLLAGMA-AcmG-sIC.js} +1 -1
- package/dist/client/assets/{flowDiagram-DWJPFMVM-CCXWJIMw.js → flowDiagram-DWJPFMVM-BRvh-u54.js} +1 -1
- package/dist/client/assets/{ganttDiagram-T4ZO3ILL-B26RghpR.js → ganttDiagram-T4ZO3ILL-CuyxaGr-.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-UUTBAWPF-BJsjMn6A.js → gitGraphDiagram-UUTBAWPF-BWFXSUkW.js} +1 -1
- package/dist/client/assets/{graph-DuEL0RWH.js → graph-BFw4pMat.js} +1 -1
- package/dist/client/assets/index-DD3oRP6t.css +1 -0
- package/dist/client/assets/index-qutkoA_F.js +451 -0
- package/dist/client/assets/{infoDiagram-42DDH7IO-D32dz1SM.js → infoDiagram-42DDH7IO-CgrEFkpl.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-UXIWVN3A-4YPQjln0.js → ishikawaDiagram-UXIWVN3A-C1PYBJVn.js} +1 -1
- package/dist/client/assets/{journeyDiagram-VCZTEJTY-BSvi22HM.js → journeyDiagram-VCZTEJTY-BHC_QZyQ.js} +1 -1
- package/dist/client/assets/{kanban-definition-6JOO6SKY-SozOXS7m.js → kanban-definition-6JOO6SKY-BTQZjl-H.js} +1 -1
- package/dist/client/assets/{layout-CNXntIRV.js → layout-LyiAOink.js} +1 -1
- package/dist/client/assets/{linear-9RZPFtO4.js → linear-BWduiQJJ.js} +1 -1
- package/dist/client/assets/{mermaid.core-kwH-UxKY.js → mermaid.core-B2Lf_dRe.js} +4 -4
- package/dist/client/assets/{min-BdN2p8Q_.js → min-BS4WshjZ.js} +1 -1
- package/dist/client/assets/{mindmap-definition-QFDTVHPH-H-3dJmH9.js → mindmap-definition-QFDTVHPH-uBQw-Rcf.js} +1 -1
- package/dist/client/assets/{pieDiagram-DEJITSTG-CspzYvcs.js → pieDiagram-DEJITSTG-Daco6XeA.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-34T5L4WZ-D1C7e3-s.js → quadrantDiagram-34T5L4WZ-phmU55Tk.js} +1 -1
- package/dist/client/assets/{requirementDiagram-MS252O5E-BJwKRtMi.js → requirementDiagram-MS252O5E-D7WmHJB1.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-XADWPNL6-7oc42Z3P.js → sankeyDiagram-XADWPNL6-QmItdHVw.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-FGHM5R23-TP5H_DnF.js → sequenceDiagram-FGHM5R23-B-Wgp5TP.js} +1 -1
- package/dist/client/assets/{stateDiagram-FHFEXIEX-BWnrNgJY.js → stateDiagram-FHFEXIEX-J7H1J8u1.js} +1 -1
- package/dist/client/assets/stateDiagram-v2-QKLJ7IA2-D0qZOg43.js +1 -0
- package/dist/client/assets/{timeline-definition-GMOUNBTQ-xXFvCsrr.js → timeline-definition-GMOUNBTQ-BI_kLbxz.js} +1 -1
- package/dist/client/assets/{vennDiagram-DHZGUBPP-D5unm_iH.js → vennDiagram-DHZGUBPP-Do5nm7Eq.js} +1 -1
- package/dist/client/assets/{wardley-RL74JXVD-B-eT02rs.js → wardley-RL74JXVD-DvA1fdMU.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-NUSXRM2D-BTQ1Yqmb.js → wardleyDiagram-NUSXRM2D-BrigyBQU.js} +1 -1
- package/dist/client/assets/{xychartDiagram-5P7HB3ND-Bialvg0l.js → xychartDiagram-5P7HB3ND-B0Inv_Uf.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/fleet-plugins/repository/routes.mjs +216 -11
- package/dist/fleet-plugins/skills/routes.mjs +35 -11
- package/dist/fleet-plugins/terminal/routes.mjs +83 -61
- package/package.json +1 -1
- package/dist/client/assets/channel-DKkQpLWI.js +0 -1
- package/dist/client/assets/classDiagram-6PBFFD2Q-CQurO5ix.js +0 -1
- package/dist/client/assets/classDiagram-v2-HSJHXN6E-CQurO5ix.js +0 -1
- package/dist/client/assets/clone-IodjsAGU.js +0 -1
- package/dist/client/assets/index-Dj775lUe.css +0 -1
- package/dist/client/assets/index-r6rDZQCs.js +0 -451
- 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,
|
|
12
|
-
ctx.registerRouter(normalizePath(
|
|
11
|
+
function registerRouter(ctx, path9, handler) {
|
|
12
|
+
ctx.registerRouter(normalizePath(path9), handler);
|
|
13
13
|
}
|
|
14
|
-
function normalizePath(
|
|
15
|
-
if (
|
|
16
|
-
return
|
|
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
|
|
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 (!
|
|
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
|
|
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 (!
|
|
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
|
|
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 (!
|
|
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-
|
|
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/
|
|
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/
|
|
16443
|
-
{ modelId: "opencode-go/kimi-
|
|
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
|
|
16452
|
-
{ modelId: "composer-2.5", name: "Composer 2.5
|
|
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
|
}
|