@yancyyu/openhermit 1.6.26 → 1.6.27
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/README.md +127 -81
- package/dist-renderer/assets/{ProjectEditorOverlay-Byepdwo2.js → ProjectEditorOverlay-BBwYdXPv.js} +1 -1
- package/dist-renderer/assets/{TeamGraphOverlay-vvWu-2c9.js → TeamGraphOverlay-DVq8rt6_.js} +1 -1
- package/dist-renderer/assets/{_basePickBy-DfsmMgXN.js → _basePickBy-ZbF0pKvS.js} +1 -1
- package/dist-renderer/assets/{_baseUniq-Bve-IKz5.js → _baseUniq-BBLBOeXc.js} +1 -1
- package/dist-renderer/assets/{arc-4cbkhagw.js → arc-wGaEgkCf.js} +1 -1
- package/dist-renderer/assets/{architectureDiagram-VXUJARFQ-CC9i0bMK.js → architectureDiagram-VXUJARFQ-BpMkdC35.js} +1 -1
- package/dist-renderer/assets/{blockDiagram-VD42YOAC-BjFruJ65.js → blockDiagram-VD42YOAC-C8Z1xhG4.js} +1 -1
- package/dist-renderer/assets/{c4Diagram-YG6GDRKO-CrYzsQC1.js → c4Diagram-YG6GDRKO-CJmlw9LA.js} +1 -1
- package/dist-renderer/assets/channel-DJUrwVrK.js +1 -0
- package/dist-renderer/assets/{chunk-4BX2VUAB-Bb9MCt7J.js → chunk-4BX2VUAB-CHPHiRPP.js} +1 -1
- package/dist-renderer/assets/{chunk-55IACEB6-BpOVOXVa.js → chunk-55IACEB6-DyVohOQb.js} +1 -1
- package/dist-renderer/assets/{chunk-B4BG7PRW-GtEiO-7n.js → chunk-B4BG7PRW-p5bffh_R.js} +1 -1
- package/dist-renderer/assets/{chunk-DI55MBZ5-BRlzcOEj.js → chunk-DI55MBZ5-BnfGPSUu.js} +1 -1
- package/dist-renderer/assets/{chunk-FMBD7UC4-DcvMVOZx.js → chunk-FMBD7UC4-B6SCKseX.js} +1 -1
- package/dist-renderer/assets/{chunk-QN33PNHL-B9pkjVpd.js → chunk-QN33PNHL-L12RvLBR.js} +1 -1
- package/dist-renderer/assets/{chunk-QZHKN3VN-DzHPSm01.js → chunk-QZHKN3VN-DeH1Kxge.js} +1 -1
- package/dist-renderer/assets/{chunk-TZMSLE5B-BU9c0Hcn.js → chunk-TZMSLE5B-BWnjzSlI.js} +1 -1
- package/dist-renderer/assets/classDiagram-2ON5EDUG-blc3DrH7.js +1 -0
- package/dist-renderer/assets/classDiagram-v2-WZHVMYZB-blc3DrH7.js +1 -0
- package/dist-renderer/assets/clone-BftjWakJ.js +1 -0
- package/dist-renderer/assets/{cose-bilkent-S5V4N54A-BqOg0x3V.js → cose-bilkent-S5V4N54A-BtzoT5fu.js} +1 -1
- package/dist-renderer/assets/{dagre-6UL2VRFP-C9JTWefj.js → dagre-6UL2VRFP-CBBvuoUD.js} +1 -1
- package/dist-renderer/assets/{diagram-PSM6KHXK-ljleG6ui.js → diagram-PSM6KHXK-Be9BAKws.js} +1 -1
- package/dist-renderer/assets/{diagram-QEK2KX5R-BbV-WSTr.js → diagram-QEK2KX5R-BDS4PI_i.js} +1 -1
- package/dist-renderer/assets/{diagram-S2PKOQOG-CKi3DFby.js → diagram-S2PKOQOG-2Rameaq7.js} +1 -1
- package/dist-renderer/assets/{erDiagram-Q2GNP2WA-D3HE7b-j.js → erDiagram-Q2GNP2WA-CSIzCEZD.js} +1 -1
- package/dist-renderer/assets/{flowDiagram-NV44I4VS-C2yLRmM0.js → flowDiagram-NV44I4VS-ForEIVM5.js} +1 -1
- package/dist-renderer/assets/{ganttDiagram-JELNMOA3-XEV4KtUf.js → ganttDiagram-JELNMOA3-BJrli_xr.js} +1 -1
- package/dist-renderer/assets/{gitGraphDiagram-V2S2FVAM-ufaCCg7c.js → gitGraphDiagram-V2S2FVAM-C_4GuLno.js} +1 -1
- package/dist-renderer/assets/{graph-BzPvdBp0.js → graph-B1EAT_gw.js} +1 -1
- package/dist-renderer/assets/{index-yNYjzR2R.js → index-DOA_jbYb.js} +1 -1
- package/dist-renderer/assets/{index-DUIDxnaf.js → index-DR602dwJ.js} +1 -1
- package/dist-renderer/assets/{index-A5CMVuXA.js → index-DYdseEwc.js} +532 -532
- package/dist-renderer/assets/{index-DHq6dXy7.js → index-Dwr5wu5x.js} +1 -1
- package/dist-renderer/assets/{index-BprOls_t.js → index-eKRmS5kI.js} +1 -1
- package/dist-renderer/assets/{index-Cr91T9ef.js → index-k4tnOFC5.js} +1 -1
- package/dist-renderer/assets/{infoDiagram-HS3SLOUP-DKP5zgHc.js → infoDiagram-HS3SLOUP-DjI0uaMz.js} +1 -1
- package/dist-renderer/assets/{journeyDiagram-XKPGCS4Q-Omd7tmzE.js → journeyDiagram-XKPGCS4Q-jQ6Thae-.js} +1 -1
- package/dist-renderer/assets/{kanban-definition-3W4ZIXB7-D7yw9yIY.js → kanban-definition-3W4ZIXB7-CKw6InbL.js} +1 -1
- package/dist-renderer/assets/{layout-DZxAqFuM.js → layout-Dad20y3V.js} +1 -1
- package/dist-renderer/assets/{linear-BXWJygRB.js → linear-vMgo_2Cv.js} +1 -1
- package/dist-renderer/assets/{mindmap-definition-VGOIOE7T-BfJ09SBb.js → mindmap-definition-VGOIOE7T-DYp6YoHL.js} +1 -1
- package/dist-renderer/assets/{pieDiagram-ADFJNKIX-BYaLQhXj.js → pieDiagram-ADFJNKIX-BytBecG9.js} +1 -1
- package/dist-renderer/assets/{quadrantDiagram-AYHSOK5B-DeA0B1fw.js → quadrantDiagram-AYHSOK5B-RUaspLsc.js} +1 -1
- package/dist-renderer/assets/{requirementDiagram-UZGBJVZJ-DnFWn7-v.js → requirementDiagram-UZGBJVZJ-rR2B1Use.js} +1 -1
- package/dist-renderer/assets/{sankeyDiagram-TZEHDZUN-L9bek20k.js → sankeyDiagram-TZEHDZUN-BJi5qYhq.js} +1 -1
- package/dist-renderer/assets/{sequenceDiagram-WL72ISMW-BBmcJUXb.js → sequenceDiagram-WL72ISMW-BM-wggUb.js} +1 -1
- package/dist-renderer/assets/{stateDiagram-FKZM4ZOC-DrwPQvTq.js → stateDiagram-FKZM4ZOC-BqmcVjnj.js} +1 -1
- package/dist-renderer/assets/{stateDiagram-v2-4FDKWEC3-BOUQrTH6.js → stateDiagram-v2-4FDKWEC3-By3JDVbB.js} +1 -1
- package/dist-renderer/assets/{timeline-definition-IT6M3QCI-Dldh9vsj.js → timeline-definition-IT6M3QCI-szH0GUyk.js} +1 -1
- package/dist-renderer/assets/{treemap-GDKQZRPO-BsGSs8-P.js → treemap-GDKQZRPO-BCMlh-Ex.js} +1 -1
- package/dist-renderer/assets/{xychartDiagram-PRI3JC2R-BsR_bj-d.js → xychartDiagram-PRI3JC2R-dwDpvw0w.js} +1 -1
- package/dist-renderer/index.html +1 -1
- package/package.json +1 -1
- package/src/main/server.ts +17 -5
- package/src/renderer/api/httpClient.ts +1 -1
- package/src/renderer/components/team/TeamDetailView.tsx +40 -20
- package/src/renderer/components/team/TeamListView.tsx +35 -21
- package/src/renderer/components/team/dialogs/CreateTeamDialog.tsx +10 -7
- package/src/renderer/components/team/dialogs/EditTeamDialog.tsx +9 -6
- package/dist-renderer/assets/channel-BMMyVRy4.js +0 -1
- package/dist-renderer/assets/classDiagram-2ON5EDUG-Dz1VG1T3.js +0 -1
- package/dist-renderer/assets/classDiagram-v2-WZHVMYZB-Dz1VG1T3.js +0 -1
- package/dist-renderer/assets/clone-COsIIGZQ.js +0 -1
package/src/main/server.ts
CHANGED
|
@@ -682,7 +682,17 @@ app.patch<{ Body: Record<string, unknown> }>('/api/cc-settings', async (request)
|
|
|
682
682
|
app.post('/api/cc-restart', async () => {
|
|
683
683
|
try {
|
|
684
684
|
await cc.restart();
|
|
685
|
-
|
|
685
|
+
// Wait for cc-connect to come back (restart only signals, process respawns async)
|
|
686
|
+
for (let i = 0; i < 30; i++) {
|
|
687
|
+
await new Promise((r) => setTimeout(r, 1000));
|
|
688
|
+
try {
|
|
689
|
+
await cc.listProjects();
|
|
690
|
+
return { ok: true };
|
|
691
|
+
} catch {
|
|
692
|
+
/* not back yet */
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
return reply500(new Error('cc-connect did not come back within 30s'));
|
|
686
696
|
} catch (err) {
|
|
687
697
|
return reply500(err);
|
|
688
698
|
}
|
|
@@ -764,7 +774,9 @@ app.get('/api/teams', async () => {
|
|
|
764
774
|
};
|
|
765
775
|
})
|
|
766
776
|
);
|
|
767
|
-
return summaries.filter(
|
|
777
|
+
return summaries.filter(
|
|
778
|
+
(team) => team.pendingDelete !== true && team.teamName !== 'my-project'
|
|
779
|
+
);
|
|
768
780
|
} catch {
|
|
769
781
|
return [];
|
|
770
782
|
}
|
|
@@ -807,7 +819,7 @@ app.post('/api/teams/create', async (request, reply) => {
|
|
|
807
819
|
}
|
|
808
820
|
|
|
809
821
|
// Bind provider refs if specified
|
|
810
|
-
const providerRefs = Array.isArray(body.providerRefs) ? body.providerRefs as string[] : [];
|
|
822
|
+
const providerRefs = Array.isArray(body.providerRefs) ? (body.providerRefs as string[]) : [];
|
|
811
823
|
if (providerRefs.length > 0) {
|
|
812
824
|
try {
|
|
813
825
|
await cc.setProviderRefs(name, providerRefs);
|
|
@@ -1050,8 +1062,8 @@ app.delete<{ Params: { name: string }; Querystring: { deleteFiles?: string } }>(
|
|
|
1050
1062
|
'/api/teams/:name',
|
|
1051
1063
|
async (request, reply) => {
|
|
1052
1064
|
const teamName = request.params.name;
|
|
1053
|
-
if (teamName === 'default') {
|
|
1054
|
-
return reply.code(403).send({ error: '
|
|
1065
|
+
if (teamName === 'default' || teamName === 'my-project') {
|
|
1066
|
+
return reply.code(403).send({ error: '该团队不可删除' });
|
|
1055
1067
|
}
|
|
1056
1068
|
try {
|
|
1057
1069
|
let restartRequired = false;
|
|
@@ -278,7 +278,7 @@ export class HttpAPIClient implements ElectronAPI {
|
|
|
278
278
|
try {
|
|
279
279
|
const res = await fetch(`${this.baseUrl}${path}`, {
|
|
280
280
|
method: 'DELETE',
|
|
281
|
-
headers: { 'Content-Type': 'application/json' },
|
|
281
|
+
headers: body ? { 'Content-Type': 'application/json' } : undefined,
|
|
282
282
|
body: body ? JSON.stringify(body) : undefined,
|
|
283
283
|
signal: controller.signal,
|
|
284
284
|
});
|
|
@@ -67,6 +67,7 @@ import {
|
|
|
67
67
|
Plus,
|
|
68
68
|
Terminal,
|
|
69
69
|
Trash2,
|
|
70
|
+
Loader2,
|
|
70
71
|
Users,
|
|
71
72
|
} from 'lucide-react';
|
|
72
73
|
import { useShallow } from 'zustand/react/shallow';
|
|
@@ -1065,6 +1066,7 @@ export const TeamDetailView = ({
|
|
|
1065
1066
|
|
|
1066
1067
|
const [sendDialogOpen, setSendDialogOpen] = useState(false);
|
|
1067
1068
|
const [deleteConfirmOpen, setDeleteConfirmOpen] = useState(false);
|
|
1069
|
+
const [deleting, setDeleting] = useState(false);
|
|
1068
1070
|
const [trashOpen, setTrashOpen] = useState(false);
|
|
1069
1071
|
const [sendDialogRecipient, setSendDialogRecipient] = useState<string | undefined>(undefined);
|
|
1070
1072
|
const [sendDialogDefaultText, setSendDialogDefaultText] = useState<string | undefined>(undefined);
|
|
@@ -1824,20 +1826,25 @@ export const TeamDetailView = ({
|
|
|
1824
1826
|
}, []);
|
|
1825
1827
|
|
|
1826
1828
|
const confirmDeleteTeam = useCallback((): void => {
|
|
1827
|
-
|
|
1829
|
+
setDeleting(true);
|
|
1828
1830
|
void (async () => {
|
|
1829
1831
|
try {
|
|
1830
1832
|
const result = await deleteTeam(teamName);
|
|
1831
1833
|
if (result.restartRequired) {
|
|
1832
1834
|
await api.ccSettings.restart();
|
|
1833
1835
|
}
|
|
1836
|
+
await fetchTeams();
|
|
1837
|
+
setDeleteConfirmOpen(false);
|
|
1834
1838
|
if (tabId) closeTab(tabId);
|
|
1835
1839
|
openTeamsTab();
|
|
1836
1840
|
} catch (err) {
|
|
1837
1841
|
console.error('Failed to delete team:', err);
|
|
1842
|
+
setDeleteConfirmOpen(false);
|
|
1843
|
+
} finally {
|
|
1844
|
+
setDeleting(false);
|
|
1838
1845
|
}
|
|
1839
1846
|
})();
|
|
1840
|
-
}, [teamName, deleteTeam, openTeamsTab, closeTab, tabId]);
|
|
1847
|
+
}, [teamName, deleteTeam, openTeamsTab, closeTab, tabId, fetchTeams]);
|
|
1841
1848
|
|
|
1842
1849
|
const handleCreateTask = (
|
|
1843
1850
|
subject: string,
|
|
@@ -2151,20 +2158,20 @@ export const TeamDetailView = ({
|
|
|
2151
2158
|
{isTeamProvisioning ? '团队仍在编排中,暂时无法编辑' : '编辑团队'}
|
|
2152
2159
|
</TooltipContent>
|
|
2153
2160
|
</Tooltip>
|
|
2154
|
-
{teamName !== 'default' && (
|
|
2155
|
-
|
|
2156
|
-
|
|
2157
|
-
|
|
2158
|
-
|
|
2159
|
-
|
|
2160
|
-
|
|
2161
|
-
|
|
2162
|
-
|
|
2163
|
-
|
|
2164
|
-
|
|
2165
|
-
|
|
2166
|
-
|
|
2167
|
-
|
|
2161
|
+
{teamName !== 'default' && teamName !== 'my-project' && (
|
|
2162
|
+
<Tooltip>
|
|
2163
|
+
<TooltipTrigger asChild>
|
|
2164
|
+
<Button
|
|
2165
|
+
variant="ghost"
|
|
2166
|
+
size="sm"
|
|
2167
|
+
className="h-7 gap-1 px-2 text-xs text-red-400 hover:bg-red-500/10 hover:text-red-300"
|
|
2168
|
+
onClick={handleDeleteTeam}
|
|
2169
|
+
>
|
|
2170
|
+
<Trash2 size={12} />
|
|
2171
|
+
</Button>
|
|
2172
|
+
</TooltipTrigger>
|
|
2173
|
+
<TooltipContent side="bottom">删除团队</TooltipContent>
|
|
2174
|
+
</Tooltip>
|
|
2168
2175
|
)}
|
|
2169
2176
|
</div>
|
|
2170
2177
|
</div>
|
|
@@ -2657,7 +2664,9 @@ export const TeamDetailView = ({
|
|
|
2657
2664
|
void fetchTeams();
|
|
2658
2665
|
void selectTeam(teamName);
|
|
2659
2666
|
}}
|
|
2660
|
-
onDeleteTeam={
|
|
2667
|
+
onDeleteTeam={
|
|
2668
|
+
teamName !== 'default' && teamName !== 'my-project' ? handleDeleteTeam : undefined
|
|
2669
|
+
}
|
|
2661
2670
|
onRestartTeam={handleRestartTeamFromEdit}
|
|
2662
2671
|
/>
|
|
2663
2672
|
|
|
@@ -2695,7 +2704,12 @@ export const TeamDetailView = ({
|
|
|
2695
2704
|
</DialogContent>
|
|
2696
2705
|
</Dialog>
|
|
2697
2706
|
|
|
2698
|
-
<Dialog
|
|
2707
|
+
<Dialog
|
|
2708
|
+
open={deleteConfirmOpen}
|
|
2709
|
+
onOpenChange={(v) => {
|
|
2710
|
+
if (!deleting) setDeleteConfirmOpen(v);
|
|
2711
|
+
}}
|
|
2712
|
+
>
|
|
2699
2713
|
<DialogContent className="max-w-sm">
|
|
2700
2714
|
<DialogHeader>
|
|
2701
2715
|
<DialogTitle>删除团队</DialogTitle>
|
|
@@ -2708,8 +2722,14 @@ export const TeamDetailView = ({
|
|
|
2708
2722
|
<Button variant="ghost" size="sm" onClick={() => setDeleteConfirmOpen(false)}>
|
|
2709
2723
|
取消
|
|
2710
2724
|
</Button>
|
|
2711
|
-
<Button
|
|
2712
|
-
|
|
2725
|
+
<Button
|
|
2726
|
+
variant="destructive"
|
|
2727
|
+
size="sm"
|
|
2728
|
+
onClick={confirmDeleteTeam}
|
|
2729
|
+
disabled={deleting}
|
|
2730
|
+
>
|
|
2731
|
+
{deleting && <Loader2 size={14} className="mr-1.5 animate-spin" />}
|
|
2732
|
+
删除并重启
|
|
2713
2733
|
</Button>
|
|
2714
2734
|
</DialogFooter>
|
|
2715
2735
|
</DialogContent>
|
|
@@ -43,6 +43,7 @@ import {
|
|
|
43
43
|
Download,
|
|
44
44
|
FolderOpen,
|
|
45
45
|
GitBranch,
|
|
46
|
+
Loader2,
|
|
46
47
|
Play,
|
|
47
48
|
RotateCcw,
|
|
48
49
|
Search,
|
|
@@ -276,6 +277,7 @@ export const TeamListView = (): React.JSX.Element => {
|
|
|
276
277
|
const [copyData, setCopyData] = useState<TeamCopyData | null>(null);
|
|
277
278
|
const [searchQuery, setSearchQuery] = useState('');
|
|
278
279
|
const [filter, setFilter] = useState<TeamListFilterState>(EMPTY_TEAM_FILTER);
|
|
280
|
+
const [deletingTeamName, setDeletingTeamName] = useState<string | null>(null);
|
|
279
281
|
const [aliveTeams, setAliveTeams] = useState<string[]>([]);
|
|
280
282
|
const {
|
|
281
283
|
teams,
|
|
@@ -533,25 +535,28 @@ export const TeamListView = (): React.JSX.Element => {
|
|
|
533
535
|
}
|
|
534
536
|
const confirmed = await confirm({
|
|
535
537
|
title: '删除团队',
|
|
536
|
-
message:
|
|
537
|
-
confirmLabel: '
|
|
538
|
+
message: `确定删除团队”${teamDisplayName}”吗?此操作会同步删除 cc-connect 项目并移除本地团队数据。`,
|
|
539
|
+
confirmLabel: '删除并重启',
|
|
538
540
|
cancelLabel: '取消',
|
|
539
541
|
variant: 'danger',
|
|
540
542
|
});
|
|
541
543
|
if (confirmed) {
|
|
544
|
+
setDeletingTeamName(teamName);
|
|
542
545
|
try {
|
|
543
546
|
const result = await deleteTeam(teamName);
|
|
544
547
|
if (result.restartRequired) {
|
|
545
548
|
await api.ccSettings.restart();
|
|
546
|
-
emitOpenHermitEvent(OPEN_HERMIT_EVENTS.runtimeRestarted);
|
|
547
549
|
}
|
|
550
|
+
await fetchTeams();
|
|
548
551
|
} catch (err) {
|
|
549
552
|
console.error('Failed to delete team:', err);
|
|
553
|
+
} finally {
|
|
554
|
+
setDeletingTeamName(null);
|
|
550
555
|
}
|
|
551
556
|
}
|
|
552
557
|
})();
|
|
553
558
|
},
|
|
554
|
-
[deleteTeam, teams]
|
|
559
|
+
[deleteTeam, teams, fetchTeams]
|
|
555
560
|
);
|
|
556
561
|
|
|
557
562
|
const handleRestoreTeam = useCallback(
|
|
@@ -1101,6 +1106,7 @@ export const TeamListView = (): React.JSX.Element => {
|
|
|
1101
1106
|
const matchesCurrentProject = currentProjectPath
|
|
1102
1107
|
? teamMatchesProjectSelection(team, currentProjectPath)
|
|
1103
1108
|
: false;
|
|
1109
|
+
const isDeleting = deletingTeamName === team.teamName;
|
|
1104
1110
|
return (
|
|
1105
1111
|
<div
|
|
1106
1112
|
key={team.teamName}
|
|
@@ -1108,14 +1114,22 @@ export const TeamListView = (): React.JSX.Element => {
|
|
|
1108
1114
|
tabIndex={0}
|
|
1109
1115
|
className="group relative flex cursor-pointer flex-col overflow-hidden rounded-lg border border-l-[3px] border-[var(--color-border)] bg-[var(--color-surface)] p-4 hover:bg-[var(--color-surface-raised)]"
|
|
1110
1116
|
style={teamColorSet ? { borderLeftColor: teamColorSet.border } : undefined}
|
|
1111
|
-
onClick={
|
|
1117
|
+
onClick={
|
|
1118
|
+
isDeleting ? undefined : () => openTeamTab(team.teamName, team.projectPath)
|
|
1119
|
+
}
|
|
1112
1120
|
onKeyDown={(e) => {
|
|
1113
1121
|
if (e.key === 'Enter' || e.key === ' ') {
|
|
1114
1122
|
e.preventDefault();
|
|
1115
|
-
openTeamTab(team.teamName, team.projectPath);
|
|
1123
|
+
if (!isDeleting) openTeamTab(team.teamName, team.projectPath);
|
|
1116
1124
|
}
|
|
1117
1125
|
}}
|
|
1118
1126
|
>
|
|
1127
|
+
{isDeleting && (
|
|
1128
|
+
<div className="absolute inset-0 z-20 flex items-center justify-center gap-2 bg-black/60 text-sm text-white">
|
|
1129
|
+
<Loader2 size={16} className="animate-spin" />
|
|
1130
|
+
删除并重启中…
|
|
1131
|
+
</div>
|
|
1132
|
+
)}
|
|
1119
1133
|
<div className="flex flex-1 flex-col">
|
|
1120
1134
|
<div className="flex items-start justify-between gap-2">
|
|
1121
1135
|
<div className="flex min-w-0 flex-1 items-center gap-2">
|
|
@@ -1172,21 +1186,21 @@ export const TeamListView = (): React.JSX.Element => {
|
|
|
1172
1186
|
<TooltipContent side="bottom">复制团队</TooltipContent>
|
|
1173
1187
|
</Tooltip>
|
|
1174
1188
|
)}
|
|
1175
|
-
{team.teamName !== 'default' && (
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1189
|
+
{team.teamName !== 'default' && team.teamName !== 'my-project' && (
|
|
1190
|
+
<Tooltip>
|
|
1191
|
+
<TooltipTrigger asChild>
|
|
1192
|
+
<button
|
|
1193
|
+
type="button"
|
|
1194
|
+
className="shrink-0 rounded p-1 text-[var(--color-text-muted)] opacity-0 transition-opacity hover:bg-red-500/10 hover:text-red-300 group-hover:opacity-100"
|
|
1195
|
+
onClick={(e) =>
|
|
1196
|
+
handleDeleteTeam(team.teamName, !!team.pendingCreate, e)
|
|
1197
|
+
}
|
|
1198
|
+
>
|
|
1199
|
+
<Trash2 size={14} />
|
|
1200
|
+
</button>
|
|
1201
|
+
</TooltipTrigger>
|
|
1202
|
+
<TooltipContent side="bottom">删除团队</TooltipContent>
|
|
1203
|
+
</Tooltip>
|
|
1190
1204
|
)}
|
|
1191
1205
|
</div>
|
|
1192
1206
|
</div>
|
|
@@ -283,13 +283,14 @@ export const CreateTeamDialog = ({
|
|
|
283
283
|
const compatibleProviders = useMemo(
|
|
284
284
|
() =>
|
|
285
285
|
globalProviders.filter(
|
|
286
|
-
(p) =>
|
|
286
|
+
(p) =>
|
|
287
|
+
!p.agent_types || p.agent_types.length === 0 || p.agent_types.includes(selectedHarness)
|
|
287
288
|
),
|
|
288
289
|
[globalProviders, selectedHarness]
|
|
289
290
|
);
|
|
290
291
|
|
|
291
292
|
const selectProviderRef = (providerName: string) => {
|
|
292
|
-
setSelectedProviderRef((prev) => prev === providerName ? null : providerName);
|
|
293
|
+
setSelectedProviderRef((prev) => (prev === providerName ? null : providerName));
|
|
293
294
|
};
|
|
294
295
|
|
|
295
296
|
// Clear selected provider when harness changes and it's no longer compatible
|
|
@@ -581,8 +582,9 @@ export const CreateTeamDialog = ({
|
|
|
581
582
|
<div>
|
|
582
583
|
<p className="text-xs font-medium text-[var(--color-text)]">Provider(可选)</p>
|
|
583
584
|
<p className="mt-1 text-[11px] leading-relaxed text-[var(--color-text-muted)]">
|
|
584
|
-
留空时使用本机 {AGENT_TYPE_LABELS[selectedHarness] ?? selectedHarness}
|
|
585
|
-
只有需要给该团队指定模型供应商时,才绑定下面的全局
|
|
585
|
+
留空时使用本机 {AGENT_TYPE_LABELS[selectedHarness] ?? selectedHarness}{' '}
|
|
586
|
+
默认配置和登录状态。 只有需要给该团队指定模型供应商时,才绑定下面的全局
|
|
587
|
+
Provider。
|
|
586
588
|
</p>
|
|
587
589
|
</div>
|
|
588
590
|
{selectedProviderRef ? (
|
|
@@ -600,7 +602,8 @@ export const CreateTeamDialog = ({
|
|
|
600
602
|
{compatibleProviders.length > 0 ? (
|
|
601
603
|
compatibleProviders.map((provider) => {
|
|
602
604
|
const checked = selectedProviderRef === provider.name;
|
|
603
|
-
const endpoint =
|
|
605
|
+
const endpoint =
|
|
606
|
+
provider.endpoints?.[selectedHarness] ?? provider.base_url ?? '默认端点';
|
|
604
607
|
const model =
|
|
605
608
|
provider.agent_models?.[selectedHarness] ??
|
|
606
609
|
provider.model ??
|
|
@@ -641,8 +644,8 @@ export const CreateTeamDialog = ({
|
|
|
641
644
|
})
|
|
642
645
|
) : (
|
|
643
646
|
<div className="rounded-md border border-dashed border-[var(--color-border)] px-3 py-3 text-xs text-[var(--color-text-muted)]">
|
|
644
|
-
暂无适用于 {AGENT_TYPE_LABELS[selectedHarness] ?? selectedHarness} 的全局
|
|
645
|
-
可先在「设置 → Harness 配置」中添加;不添加也会使用本机默认登录态。
|
|
647
|
+
暂无适用于 {AGENT_TYPE_LABELS[selectedHarness] ?? selectedHarness} 的全局
|
|
648
|
+
Provider。 可先在「设置 → Harness 配置」中添加;不添加也会使用本机默认登录态。
|
|
646
649
|
</div>
|
|
647
650
|
)}
|
|
648
651
|
</div>
|
|
@@ -183,12 +183,14 @@ export const EditTeamDialog = ({
|
|
|
183
183
|
|
|
184
184
|
const compatibleProviders = globalProviders.filter(
|
|
185
185
|
(provider) =>
|
|
186
|
-
!provider.agent_types ||
|
|
186
|
+
!provider.agent_types ||
|
|
187
|
+
provider.agent_types.length === 0 ||
|
|
188
|
+
(provider.agent_types as string[]).includes(agentType)
|
|
187
189
|
);
|
|
188
190
|
|
|
189
191
|
const toggleProviderRef = (providerName: string): void => {
|
|
190
192
|
clearError();
|
|
191
|
-
setProviderRefs((prev) => prev === providerName ? '' : providerName);
|
|
193
|
+
setProviderRefs((prev) => (prev === providerName ? '' : providerName));
|
|
192
194
|
};
|
|
193
195
|
|
|
194
196
|
return (
|
|
@@ -365,8 +367,9 @@ export const EditTeamDialog = ({
|
|
|
365
367
|
<div>
|
|
366
368
|
<p className="text-xs font-medium text-[var(--color-text)]">Provider(可选)</p>
|
|
367
369
|
<p className="mt-1 text-[11px] leading-relaxed text-[var(--color-text-muted)]">
|
|
368
|
-
留空时使用本机 {AGENT_TYPE_LABELS[agentType as CcAgentType] ?? agentType}
|
|
369
|
-
只有需要给该团队指定模型供应商时,才绑定下面的全局
|
|
370
|
+
留空时使用本机 {AGENT_TYPE_LABELS[agentType as CcAgentType] ?? agentType}{' '}
|
|
371
|
+
默认配置和登录状态。 只有需要给该团队指定模型供应商时,才绑定下面的全局
|
|
372
|
+
Provider。
|
|
370
373
|
</p>
|
|
371
374
|
</div>
|
|
372
375
|
{providerRefs ? (
|
|
@@ -426,8 +429,8 @@ export const EditTeamDialog = ({
|
|
|
426
429
|
})
|
|
427
430
|
) : (
|
|
428
431
|
<div className="rounded-md border border-dashed border-[var(--color-border)] px-3 py-3 text-xs text-[var(--color-text-muted)]">
|
|
429
|
-
暂无适用于 {AGENT_TYPE_LABELS[agentType as CcAgentType] ?? agentType} 的全局
|
|
430
|
-
可先在「设置 → Harness 配置」中添加;不添加也会使用本机默认登录态。
|
|
432
|
+
暂无适用于 {AGENT_TYPE_LABELS[agentType as CcAgentType] ?? agentType} 的全局
|
|
433
|
+
Provider。 可先在「设置 → Harness 配置」中添加;不添加也会使用本机默认登录态。
|
|
431
434
|
</div>
|
|
432
435
|
)}
|
|
433
436
|
</div>
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a6 as o,a7 as n}from"./index-A5CMVuXA.js";const t=(a,r)=>o.lang.round(n.parse(a)[r]);export{t as c};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as a,c as s,a as e,C as t}from"./chunk-B4BG7PRW-GtEiO-7n.js";import{_ as i}from"./index-A5CMVuXA.js";import"./chunk-FMBD7UC4-DcvMVOZx.js";import"./chunk-55IACEB6-BpOVOXVa.js";import"./chunk-QN33PNHL-B9pkjVpd.js";import"./splashScene-C8lWNnm4.js";var u={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{u as diagram};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as a,c as s,a as e,C as t}from"./chunk-B4BG7PRW-GtEiO-7n.js";import{_ as i}from"./index-A5CMVuXA.js";import"./chunk-FMBD7UC4-DcvMVOZx.js";import"./chunk-55IACEB6-BpOVOXVa.js";import"./chunk-QN33PNHL-B9pkjVpd.js";import"./splashScene-C8lWNnm4.js";var u={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{u as diagram};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{b as r}from"./_baseUniq-Bve-IKz5.js";var e=4;function a(o){return r(o,e)}export{a as c};
|