@yancyyu/openhermit 1.6.25 → 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 -77
- package/bin/hermit.mjs +151 -62
- package/dist-renderer/assets/{ProjectEditorOverlay-CZ1LI0pd.js → ProjectEditorOverlay-BBwYdXPv.js} +1 -1
- package/dist-renderer/assets/{TeamGraphOverlay-DvyxOPvU.js → TeamGraphOverlay-DVq8rt6_.js} +1 -1
- package/dist-renderer/assets/{_basePickBy-D8IKEBh4.js → _basePickBy-ZbF0pKvS.js} +1 -1
- package/dist-renderer/assets/{_baseUniq-BDBpSAHY.js → _baseUniq-BBLBOeXc.js} +1 -1
- package/dist-renderer/assets/{arc-CZagJLek.js → arc-wGaEgkCf.js} +1 -1
- package/dist-renderer/assets/{architectureDiagram-VXUJARFQ-Cq083Uu6.js → architectureDiagram-VXUJARFQ-BpMkdC35.js} +1 -1
- package/dist-renderer/assets/{blockDiagram-VD42YOAC-CIEANvSv.js → blockDiagram-VD42YOAC-C8Z1xhG4.js} +1 -1
- package/dist-renderer/assets/{c4Diagram-YG6GDRKO-Ca4h_BlA.js → c4Diagram-YG6GDRKO-CJmlw9LA.js} +1 -1
- package/dist-renderer/assets/channel-DJUrwVrK.js +1 -0
- package/dist-renderer/assets/{chunk-4BX2VUAB-DW9HjNgA.js → chunk-4BX2VUAB-CHPHiRPP.js} +1 -1
- package/dist-renderer/assets/{chunk-55IACEB6-BddOEwBk.js → chunk-55IACEB6-DyVohOQb.js} +1 -1
- package/dist-renderer/assets/{chunk-B4BG7PRW-Cmu8IjLN.js → chunk-B4BG7PRW-p5bffh_R.js} +1 -1
- package/dist-renderer/assets/{chunk-DI55MBZ5-BU7nEH8e.js → chunk-DI55MBZ5-BnfGPSUu.js} +1 -1
- package/dist-renderer/assets/{chunk-FMBD7UC4-BZNeq0CB.js → chunk-FMBD7UC4-B6SCKseX.js} +1 -1
- package/dist-renderer/assets/{chunk-QN33PNHL-DMb3gYzN.js → chunk-QN33PNHL-L12RvLBR.js} +1 -1
- package/dist-renderer/assets/{chunk-QZHKN3VN-8wSSvqz0.js → chunk-QZHKN3VN-DeH1Kxge.js} +1 -1
- package/dist-renderer/assets/{chunk-TZMSLE5B-B4OLgw45.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-CS9moNeT.js → cose-bilkent-S5V4N54A-BtzoT5fu.js} +1 -1
- package/dist-renderer/assets/{dagre-6UL2VRFP-3pzdMwjZ.js → dagre-6UL2VRFP-CBBvuoUD.js} +1 -1
- package/dist-renderer/assets/{diagram-PSM6KHXK-CGTnMY5C.js → diagram-PSM6KHXK-Be9BAKws.js} +1 -1
- package/dist-renderer/assets/{diagram-QEK2KX5R-Cyzp8dOw.js → diagram-QEK2KX5R-BDS4PI_i.js} +1 -1
- package/dist-renderer/assets/{diagram-S2PKOQOG-D_5SvdXI.js → diagram-S2PKOQOG-2Rameaq7.js} +1 -1
- package/dist-renderer/assets/{erDiagram-Q2GNP2WA-bWPYfs9c.js → erDiagram-Q2GNP2WA-CSIzCEZD.js} +1 -1
- package/dist-renderer/assets/{flowDiagram-NV44I4VS-C5z47CKB.js → flowDiagram-NV44I4VS-ForEIVM5.js} +1 -1
- package/dist-renderer/assets/{ganttDiagram-JELNMOA3-eye9Cv6S.js → ganttDiagram-JELNMOA3-BJrli_xr.js} +1 -1
- package/dist-renderer/assets/{gitGraphDiagram-V2S2FVAM-DekQZoF8.js → gitGraphDiagram-V2S2FVAM-C_4GuLno.js} +1 -1
- package/dist-renderer/assets/{graph-kNnl-9Fl.js → graph-B1EAT_gw.js} +1 -1
- package/dist-renderer/assets/index-CWpFqEvz.css +1 -0
- package/dist-renderer/assets/{index-hGBnMHVl.js → index-DOA_jbYb.js} +1 -1
- package/dist-renderer/assets/{index-ATiHUmmE.js → index-DR602dwJ.js} +1 -1
- package/dist-renderer/assets/{index-CrOkTuIK.js → index-DYdseEwc.js} +532 -532
- package/dist-renderer/assets/{index-CnxDIJh8.js → index-Dwr5wu5x.js} +1 -1
- package/dist-renderer/assets/{index-CI2l57ID.js → index-eKRmS5kI.js} +1 -1
- package/dist-renderer/assets/{index-DB0k9yRL.js → index-k4tnOFC5.js} +1 -1
- package/dist-renderer/assets/{infoDiagram-HS3SLOUP-D3ilrGOS.js → infoDiagram-HS3SLOUP-DjI0uaMz.js} +1 -1
- package/dist-renderer/assets/{journeyDiagram-XKPGCS4Q-BOCG2Rrk.js → journeyDiagram-XKPGCS4Q-jQ6Thae-.js} +1 -1
- package/dist-renderer/assets/{kanban-definition-3W4ZIXB7-hZ03nCkx.js → kanban-definition-3W4ZIXB7-CKw6InbL.js} +1 -1
- package/dist-renderer/assets/{layout-D5Mqy2My.js → layout-Dad20y3V.js} +1 -1
- package/dist-renderer/assets/{linear-Clp9OpXU.js → linear-vMgo_2Cv.js} +1 -1
- package/dist-renderer/assets/{mindmap-definition-VGOIOE7T-D-w-qhNz.js → mindmap-definition-VGOIOE7T-DYp6YoHL.js} +1 -1
- package/dist-renderer/assets/{pieDiagram-ADFJNKIX-D9K0-ecY.js → pieDiagram-ADFJNKIX-BytBecG9.js} +1 -1
- package/dist-renderer/assets/{quadrantDiagram-AYHSOK5B-B2f19Ki3.js → quadrantDiagram-AYHSOK5B-RUaspLsc.js} +1 -1
- package/dist-renderer/assets/{requirementDiagram-UZGBJVZJ-VezNpCaU.js → requirementDiagram-UZGBJVZJ-rR2B1Use.js} +1 -1
- package/dist-renderer/assets/{sankeyDiagram-TZEHDZUN-BpHjEoR9.js → sankeyDiagram-TZEHDZUN-BJi5qYhq.js} +1 -1
- package/dist-renderer/assets/{sequenceDiagram-WL72ISMW-Tdb7IZ4t.js → sequenceDiagram-WL72ISMW-BM-wggUb.js} +1 -1
- package/dist-renderer/assets/{stateDiagram-FKZM4ZOC-BNA5Q-zz.js → stateDiagram-FKZM4ZOC-BqmcVjnj.js} +1 -1
- package/dist-renderer/assets/{stateDiagram-v2-4FDKWEC3-w_4GEN2a.js → stateDiagram-v2-4FDKWEC3-By3JDVbB.js} +1 -1
- package/dist-renderer/assets/{timeline-definition-IT6M3QCI-BghtWMWY.js → timeline-definition-IT6M3QCI-szH0GUyk.js} +1 -1
- package/dist-renderer/assets/{treemap-GDKQZRPO-BVquWjHf.js → treemap-GDKQZRPO-BCMlh-Ex.js} +1 -1
- package/dist-renderer/assets/{xychartDiagram-PRI3JC2R-BSV5wEDU.js → xychartDiagram-PRI3JC2R-dwDpvw0w.js} +1 -1
- package/dist-renderer/index.html +2 -2
- package/package.json +2 -2
- package/src/main/server.ts +52 -12
- package/src/renderer/api/httpClient.ts +1 -1
- package/src/renderer/components/runtime/ProviderRuntimeSettingsDialog.tsx +2 -0
- package/src/renderer/components/settings/sections/AdvancedSection.tsx +2 -0
- package/src/renderer/components/settings/sections/CliStatusSection.tsx +2 -0
- package/src/renderer/components/settings/sections/HarnessSection.tsx +11 -0
- package/src/renderer/components/settings/sections/PlatformsSection.tsx +10 -2
- package/src/renderer/components/team/TeamDetailView.tsx +53 -42
- package/src/renderer/components/team/TeamListView.tsx +54 -31
- package/src/renderer/components/team/dialogs/CreateTeamDialog.tsx +123 -0
- package/src/renderer/components/team/dialogs/EditTeamDialog.tsx +98 -2
- package/src/renderer/utils/openHermitEvents.ts +9 -0
- package/src/shared/types/team.ts +5 -0
- package/dist-renderer/assets/channel-CqQK8EX1.js +0 -1
- package/dist-renderer/assets/classDiagram-2ON5EDUG-9A3Cg8IA.js +0 -1
- package/dist-renderer/assets/classDiagram-v2-WZHVMYZB-9A3Cg8IA.js +0 -1
- package/dist-renderer/assets/clone-Bnr-WjeU.js +0 -1
- package/dist-renderer/assets/index-C4x095x4.css +0 -1
|
@@ -54,6 +54,9 @@ import PlatformManualForm from './PlatformManualForm';
|
|
|
54
54
|
|
|
55
55
|
import type { Project, TeamCreateRequest } from '@shared/types';
|
|
56
56
|
import type { CcAgentType } from '@shared/types/ccConnect';
|
|
57
|
+
import type { GlobalProvider } from '@shared/types/providers';
|
|
58
|
+
|
|
59
|
+
import { providersApi } from '@renderer/api/providers';
|
|
57
60
|
|
|
58
61
|
export interface ActiveTeamRef {
|
|
59
62
|
teamName: string;
|
|
@@ -252,6 +255,10 @@ export const CreateTeamDialog = ({
|
|
|
252
255
|
const [projectsLoading, setProjectsLoading] = useState(false);
|
|
253
256
|
const [projectsError, setProjectsError] = useState<string | null>(null);
|
|
254
257
|
|
|
258
|
+
// ── Global providers ─────────────────────────────────────────────────
|
|
259
|
+
const [globalProviders, setGlobalProviders] = useState<GlobalProvider[]>([]);
|
|
260
|
+
const [selectedProviderRef, setSelectedProviderRef] = useState<string | null>(null);
|
|
261
|
+
|
|
255
262
|
// ── Errors / submission ──────────────────────────────────────────────
|
|
256
263
|
const [localError, setLocalError] = useState<string | null>(null);
|
|
257
264
|
const [isSubmitting, setIsSubmitting] = useState(false);
|
|
@@ -273,6 +280,28 @@ export const CreateTeamDialog = ({
|
|
|
273
280
|
: selectedProjectPath.trim()
|
|
274
281
|
: customCwd.trim();
|
|
275
282
|
|
|
283
|
+
const compatibleProviders = useMemo(
|
|
284
|
+
() =>
|
|
285
|
+
globalProviders.filter(
|
|
286
|
+
(p) =>
|
|
287
|
+
!p.agent_types || p.agent_types.length === 0 || p.agent_types.includes(selectedHarness)
|
|
288
|
+
),
|
|
289
|
+
[globalProviders, selectedHarness]
|
|
290
|
+
);
|
|
291
|
+
|
|
292
|
+
const selectProviderRef = (providerName: string) => {
|
|
293
|
+
setSelectedProviderRef((prev) => (prev === providerName ? null : providerName));
|
|
294
|
+
};
|
|
295
|
+
|
|
296
|
+
// Clear selected provider when harness changes and it's no longer compatible
|
|
297
|
+
useEffect(() => {
|
|
298
|
+
setSelectedProviderRef((prev) => {
|
|
299
|
+
if (!prev) return prev;
|
|
300
|
+
const compatible = new Set(compatibleProviders.map((p) => p.name));
|
|
301
|
+
return compatible.has(prev) ? prev : null;
|
|
302
|
+
});
|
|
303
|
+
}, [compatibleProviders]);
|
|
304
|
+
|
|
276
305
|
const conflictingTeam = useMemo(() => {
|
|
277
306
|
if (!activeTeams?.length || !effectiveCwd) return null;
|
|
278
307
|
const norm = normalizePath(effectiveCwd);
|
|
@@ -309,6 +338,23 @@ export const CreateTeamDialog = ({
|
|
|
309
338
|
};
|
|
310
339
|
}, [open]);
|
|
311
340
|
|
|
341
|
+
// ── Load global providers on open ────────────────────────────────────
|
|
342
|
+
useEffect(() => {
|
|
343
|
+
if (!open) return;
|
|
344
|
+
let cancelled = false;
|
|
345
|
+
void (async () => {
|
|
346
|
+
try {
|
|
347
|
+
const result = await providersApi.list();
|
|
348
|
+
if (!cancelled) setGlobalProviders(result.providers ?? []);
|
|
349
|
+
} catch {
|
|
350
|
+
if (!cancelled) setGlobalProviders([]);
|
|
351
|
+
}
|
|
352
|
+
})();
|
|
353
|
+
return () => {
|
|
354
|
+
cancelled = true;
|
|
355
|
+
};
|
|
356
|
+
}, [open]);
|
|
357
|
+
|
|
312
358
|
// ── Auto-select default project path ─────────────────────────────────
|
|
313
359
|
useEffect(() => {
|
|
314
360
|
if (!open || cwdMode !== 'project' || selectedProjectPath) return;
|
|
@@ -337,6 +383,7 @@ export const CreateTeamDialog = ({
|
|
|
337
383
|
setFieldErrors({});
|
|
338
384
|
setIsSubmitting(false);
|
|
339
385
|
setConflictDismissed(false);
|
|
386
|
+
setSelectedProviderRef(null);
|
|
340
387
|
};
|
|
341
388
|
|
|
342
389
|
// ── Platform selection ───────────────────────────────────────────────
|
|
@@ -402,6 +449,7 @@ export const CreateTeamDialog = ({
|
|
|
402
449
|
harness: selectedHarness,
|
|
403
450
|
platform: selectedPlatform || 'bridge',
|
|
404
451
|
platformOptions: {},
|
|
452
|
+
providerRefs: selectedProviderRef ? [selectedProviderRef] : undefined,
|
|
405
453
|
};
|
|
406
454
|
await onCreate(request);
|
|
407
455
|
onOpenTeam(request.teamName, effectiveCwd || undefined);
|
|
@@ -527,6 +575,81 @@ export const CreateTeamDialog = ({
|
|
|
527
575
|
projectsError={projectsError}
|
|
528
576
|
fieldError={fieldErrors.cwd}
|
|
529
577
|
/>
|
|
578
|
+
|
|
579
|
+
{/* Provider selection */}
|
|
580
|
+
<div className="rounded-lg border border-[var(--color-border-subtle)] bg-white/[0.02] p-3">
|
|
581
|
+
<div className="flex items-start justify-between gap-3">
|
|
582
|
+
<div>
|
|
583
|
+
<p className="text-xs font-medium text-[var(--color-text)]">Provider(可选)</p>
|
|
584
|
+
<p className="mt-1 text-[11px] leading-relaxed text-[var(--color-text-muted)]">
|
|
585
|
+
留空时使用本机 {AGENT_TYPE_LABELS[selectedHarness] ?? selectedHarness}{' '}
|
|
586
|
+
默认配置和登录状态。 只有需要给该团队指定模型供应商时,才绑定下面的全局
|
|
587
|
+
Provider。
|
|
588
|
+
</p>
|
|
589
|
+
</div>
|
|
590
|
+
{selectedProviderRef ? (
|
|
591
|
+
<button
|
|
592
|
+
type="button"
|
|
593
|
+
className="shrink-0 rounded-md border border-[var(--color-border)] px-2 py-1 text-[11px] text-[var(--color-text-muted)] hover:bg-white/5"
|
|
594
|
+
onClick={() => setSelectedProviderRef(null)}
|
|
595
|
+
>
|
|
596
|
+
使用本机默认
|
|
597
|
+
</button>
|
|
598
|
+
) : null}
|
|
599
|
+
</div>
|
|
600
|
+
|
|
601
|
+
<div className="mt-3 space-y-2">
|
|
602
|
+
{compatibleProviders.length > 0 ? (
|
|
603
|
+
compatibleProviders.map((provider) => {
|
|
604
|
+
const checked = selectedProviderRef === provider.name;
|
|
605
|
+
const endpoint =
|
|
606
|
+
provider.endpoints?.[selectedHarness] ?? provider.base_url ?? '默认端点';
|
|
607
|
+
const model =
|
|
608
|
+
provider.agent_models?.[selectedHarness] ??
|
|
609
|
+
provider.model ??
|
|
610
|
+
provider.models?.[0]?.model ??
|
|
611
|
+
'未指定模型';
|
|
612
|
+
return (
|
|
613
|
+
<button
|
|
614
|
+
key={provider.name}
|
|
615
|
+
type="button"
|
|
616
|
+
onClick={() => selectProviderRef(provider.name)}
|
|
617
|
+
className={`w-full rounded-lg border px-3 py-2 text-left transition-colors ${
|
|
618
|
+
checked
|
|
619
|
+
? 'border-indigo-400/60 bg-indigo-500/10'
|
|
620
|
+
: 'border-[var(--color-border-subtle)] bg-black/10 hover:border-[var(--color-border)] hover:bg-white/[0.04]'
|
|
621
|
+
}`}
|
|
622
|
+
>
|
|
623
|
+
<div className="flex items-center justify-between gap-3">
|
|
624
|
+
<div className="min-w-0">
|
|
625
|
+
<p className="truncate text-xs font-medium text-[var(--color-text)]">
|
|
626
|
+
{provider.name}
|
|
627
|
+
</p>
|
|
628
|
+
<p className="mt-0.5 truncate text-[11px] text-[var(--color-text-muted)]">
|
|
629
|
+
{model} · {endpoint}
|
|
630
|
+
</p>
|
|
631
|
+
</div>
|
|
632
|
+
<span
|
|
633
|
+
className={`shrink-0 rounded-full px-2 py-0.5 text-[10px] ${
|
|
634
|
+
checked
|
|
635
|
+
? 'bg-indigo-400/20 text-indigo-200'
|
|
636
|
+
: 'bg-white/5 text-[var(--color-text-muted)]'
|
|
637
|
+
}`}
|
|
638
|
+
>
|
|
639
|
+
{checked ? '已绑定' : '可绑定'}
|
|
640
|
+
</span>
|
|
641
|
+
</div>
|
|
642
|
+
</button>
|
|
643
|
+
);
|
|
644
|
+
})
|
|
645
|
+
) : (
|
|
646
|
+
<div className="rounded-md border border-dashed border-[var(--color-border)] px-3 py-3 text-xs text-[var(--color-text-muted)]">
|
|
647
|
+
暂无适用于 {AGENT_TYPE_LABELS[selectedHarness] ?? selectedHarness} 的全局
|
|
648
|
+
Provider。 可先在「设置 → Harness 配置」中添加;不添加也会使用本机默认登录态。
|
|
649
|
+
</div>
|
|
650
|
+
)}
|
|
651
|
+
</div>
|
|
652
|
+
</div>
|
|
530
653
|
</div>
|
|
531
654
|
)}
|
|
532
655
|
|
|
@@ -15,6 +15,8 @@ import {
|
|
|
15
15
|
import { Loader2, Trash2 } from 'lucide-react';
|
|
16
16
|
|
|
17
17
|
import type { ResolvedTeamMember } from '@shared/types';
|
|
18
|
+
import type { CcAgentType } from '@shared/types/ccConnect';
|
|
19
|
+
import type { GlobalProvider } from '@shared/types/providers';
|
|
18
20
|
|
|
19
21
|
interface EditTeamDialogProps {
|
|
20
22
|
open: boolean;
|
|
@@ -32,6 +34,8 @@ interface EditTeamDialogProps {
|
|
|
32
34
|
currentManagedSources?: string;
|
|
33
35
|
currentDisabledCommands?: string[];
|
|
34
36
|
currentPlatformAllowFrom?: Record<string, string>;
|
|
37
|
+
currentProviderRefs?: string[];
|
|
38
|
+
globalProviders?: GlobalProvider[];
|
|
35
39
|
currentMembers: ResolvedTeamMember[];
|
|
36
40
|
leadMember?: ResolvedTeamMember | null;
|
|
37
41
|
resolvedMemberColorMap?: ReadonlyMap<string, string>;
|
|
@@ -44,8 +48,6 @@ interface EditTeamDialogProps {
|
|
|
44
48
|
onSaved: () => Promise<void> | void;
|
|
45
49
|
onRestartTeam?: () => Promise<void> | void;
|
|
46
50
|
onDeleteTeam?: () => void;
|
|
47
|
-
/** Deprecated in cc-connect mode: edit team no longer restarts runtime. */
|
|
48
|
-
onSaveAndRestart?: unknown;
|
|
49
51
|
}
|
|
50
52
|
|
|
51
53
|
const PERMISSION_MODE_OPTIONS = [
|
|
@@ -71,9 +73,13 @@ export const EditTeamDialog = ({
|
|
|
71
73
|
currentManagedSources = '*',
|
|
72
74
|
currentDisabledCommands = [],
|
|
73
75
|
currentPlatformAllowFrom = {},
|
|
76
|
+
currentProviderRefs = [],
|
|
77
|
+
globalProviders = [],
|
|
78
|
+
isTeamAlive = false,
|
|
74
79
|
isTeamProvisioning = false,
|
|
75
80
|
onClose,
|
|
76
81
|
onSaved,
|
|
82
|
+
onRestartTeam,
|
|
77
83
|
onDeleteTeam,
|
|
78
84
|
}: EditTeamDialogProps): React.JSX.Element => {
|
|
79
85
|
const [name, setName] = useState(currentName);
|
|
@@ -90,6 +96,7 @@ export const EditTeamDialog = ({
|
|
|
90
96
|
currentDisabledCommands.join(', ')
|
|
91
97
|
);
|
|
92
98
|
const [feishuAllowFrom, setFeishuAllowFrom] = useState(currentPlatformAllowFrom.feishu ?? '*');
|
|
99
|
+
const [providerRefs, setProviderRefs] = useState<string>(currentProviderRefs[0] ?? '');
|
|
93
100
|
const [saving, setSaving] = useState(false);
|
|
94
101
|
const [error, setError] = useState<string | null>(null);
|
|
95
102
|
|
|
@@ -107,6 +114,7 @@ export const EditTeamDialog = ({
|
|
|
107
114
|
setManagedSources(currentManagedSources);
|
|
108
115
|
setDisabledCommandsInput(currentDisabledCommands.join(', '));
|
|
109
116
|
setFeishuAllowFrom(currentPlatformAllowFrom.feishu ?? '*');
|
|
117
|
+
setProviderRefs(currentProviderRefs[0] ?? '');
|
|
110
118
|
setError(null);
|
|
111
119
|
}, [
|
|
112
120
|
open,
|
|
@@ -122,6 +130,7 @@ export const EditTeamDialog = ({
|
|
|
122
130
|
currentManagedSources,
|
|
123
131
|
currentDisabledCommands,
|
|
124
132
|
currentPlatformAllowFrom,
|
|
133
|
+
currentProviderRefs,
|
|
125
134
|
]);
|
|
126
135
|
|
|
127
136
|
const clearError = (): void => setError(null);
|
|
@@ -160,6 +169,7 @@ export const EditTeamDialog = ({
|
|
|
160
169
|
managedSources: managedSources.trim() || undefined,
|
|
161
170
|
disabledCommands,
|
|
162
171
|
platformAllowFrom: feishu ? { feishu } : {},
|
|
172
|
+
providerRefs: providerRefs ? [providerRefs] : [],
|
|
163
173
|
});
|
|
164
174
|
await Promise.resolve(onSaved());
|
|
165
175
|
onClose();
|
|
@@ -171,6 +181,18 @@ export const EditTeamDialog = ({
|
|
|
171
181
|
})();
|
|
172
182
|
};
|
|
173
183
|
|
|
184
|
+
const compatibleProviders = globalProviders.filter(
|
|
185
|
+
(provider) =>
|
|
186
|
+
!provider.agent_types ||
|
|
187
|
+
provider.agent_types.length === 0 ||
|
|
188
|
+
(provider.agent_types as string[]).includes(agentType)
|
|
189
|
+
);
|
|
190
|
+
|
|
191
|
+
const toggleProviderRef = (providerName: string): void => {
|
|
192
|
+
clearError();
|
|
193
|
+
setProviderRefs((prev) => (prev === providerName ? '' : providerName));
|
|
194
|
+
};
|
|
195
|
+
|
|
174
196
|
return (
|
|
175
197
|
<Dialog open={open} onOpenChange={(nextOpen) => !nextOpen && onClose()}>
|
|
176
198
|
<DialogContent className="max-w-2xl">
|
|
@@ -340,6 +362,80 @@ export const EditTeamDialog = ({
|
|
|
340
362
|
/>
|
|
341
363
|
</div>
|
|
342
364
|
|
|
365
|
+
<div className="rounded-lg border border-[var(--color-border-subtle)] bg-white/[0.02] p-3">
|
|
366
|
+
<div className="flex items-start justify-between gap-3">
|
|
367
|
+
<div>
|
|
368
|
+
<p className="text-xs font-medium text-[var(--color-text)]">Provider(可选)</p>
|
|
369
|
+
<p className="mt-1 text-[11px] leading-relaxed text-[var(--color-text-muted)]">
|
|
370
|
+
留空时使用本机 {AGENT_TYPE_LABELS[agentType as CcAgentType] ?? agentType}{' '}
|
|
371
|
+
默认配置和登录状态。 只有需要给该团队指定模型供应商时,才绑定下面的全局
|
|
372
|
+
Provider。
|
|
373
|
+
</p>
|
|
374
|
+
</div>
|
|
375
|
+
{providerRefs ? (
|
|
376
|
+
<button
|
|
377
|
+
type="button"
|
|
378
|
+
className="shrink-0 rounded-md border border-[var(--color-border)] px-2 py-1 text-[11px] text-[var(--color-text-muted)] hover:bg-white/5"
|
|
379
|
+
onClick={() => setProviderRefs('')}
|
|
380
|
+
>
|
|
381
|
+
使用本机默认
|
|
382
|
+
</button>
|
|
383
|
+
) : null}
|
|
384
|
+
</div>
|
|
385
|
+
|
|
386
|
+
<div className="mt-3 space-y-2">
|
|
387
|
+
{compatibleProviders.length > 0 ? (
|
|
388
|
+
compatibleProviders.map((provider) => {
|
|
389
|
+
const checked = providerRefs === provider.name;
|
|
390
|
+
const at = agentType as CcAgentType;
|
|
391
|
+
const endpoint = provider.endpoints?.[at] ?? provider.base_url ?? '默认端点';
|
|
392
|
+
const model =
|
|
393
|
+
provider.agent_models?.[at] ??
|
|
394
|
+
provider.model ??
|
|
395
|
+
provider.models?.[0]?.model ??
|
|
396
|
+
'未指定模型';
|
|
397
|
+
return (
|
|
398
|
+
<button
|
|
399
|
+
key={provider.name}
|
|
400
|
+
type="button"
|
|
401
|
+
onClick={() => toggleProviderRef(provider.name)}
|
|
402
|
+
className={`w-full rounded-lg border px-3 py-2 text-left transition-colors ${
|
|
403
|
+
checked
|
|
404
|
+
? 'border-indigo-400/60 bg-indigo-500/10'
|
|
405
|
+
: 'border-[var(--color-border-subtle)] bg-black/10 hover:border-[var(--color-border)] hover:bg-white/[0.04]'
|
|
406
|
+
}`}
|
|
407
|
+
>
|
|
408
|
+
<div className="flex items-center justify-between gap-3">
|
|
409
|
+
<div className="min-w-0">
|
|
410
|
+
<p className="truncate text-xs font-medium text-[var(--color-text)]">
|
|
411
|
+
{provider.name}
|
|
412
|
+
</p>
|
|
413
|
+
<p className="mt-0.5 truncate text-[11px] text-[var(--color-text-muted)]">
|
|
414
|
+
{model} · {endpoint}
|
|
415
|
+
</p>
|
|
416
|
+
</div>
|
|
417
|
+
<span
|
|
418
|
+
className={`shrink-0 rounded-full px-2 py-0.5 text-[10px] ${
|
|
419
|
+
checked
|
|
420
|
+
? 'bg-indigo-400/20 text-indigo-200'
|
|
421
|
+
: 'bg-white/5 text-[var(--color-text-muted)]'
|
|
422
|
+
}`}
|
|
423
|
+
>
|
|
424
|
+
{checked ? '已绑定' : '可绑定'}
|
|
425
|
+
</span>
|
|
426
|
+
</div>
|
|
427
|
+
</button>
|
|
428
|
+
);
|
|
429
|
+
})
|
|
430
|
+
) : (
|
|
431
|
+
<div className="rounded-md border border-dashed border-[var(--color-border)] px-3 py-3 text-xs text-[var(--color-text-muted)]">
|
|
432
|
+
暂无适用于 {AGENT_TYPE_LABELS[agentType as CcAgentType] ?? agentType} 的全局
|
|
433
|
+
Provider。 可先在「设置 → Harness 配置」中添加;不添加也会使用本机默认登录态。
|
|
434
|
+
</div>
|
|
435
|
+
)}
|
|
436
|
+
</div>
|
|
437
|
+
</div>
|
|
438
|
+
|
|
343
439
|
<div>
|
|
344
440
|
<label className="mb-1 block text-xs font-medium text-[var(--color-text-secondary)]">
|
|
345
441
|
平台访问控制(Feishu 允许的用户)
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export const OPEN_HERMIT_EVENTS = {
|
|
2
|
+
providersChanged: 'openhermit:providers-changed',
|
|
3
|
+
teamsChanged: 'openhermit:teams-changed',
|
|
4
|
+
runtimeRestarted: 'openhermit:runtime-restarted',
|
|
5
|
+
} as const;
|
|
6
|
+
|
|
7
|
+
export function emitOpenHermitEvent(eventName: string): void {
|
|
8
|
+
window.dispatchEvent(new Event(eventName));
|
|
9
|
+
}
|
package/src/shared/types/team.ts
CHANGED
|
@@ -66,6 +66,7 @@ export interface TeamUpdateConfigRequest {
|
|
|
66
66
|
leadModel?: string;
|
|
67
67
|
leadEffort?: EffortLevel;
|
|
68
68
|
leadWorkflow?: string;
|
|
69
|
+
providerRefs?: string[];
|
|
69
70
|
}
|
|
70
71
|
|
|
71
72
|
export interface TeamSummaryMember {
|
|
@@ -992,6 +993,8 @@ export interface TeamViewSnapshot {
|
|
|
992
993
|
workDir?: string;
|
|
993
994
|
permissionMode?: string;
|
|
994
995
|
settings?: Record<string, unknown>;
|
|
996
|
+
providerRefs?: string[];
|
|
997
|
+
globalProviders?: import('./providers').GlobalProvider[];
|
|
995
998
|
}
|
|
996
999
|
|
|
997
1000
|
export type EffortLevel = 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max';
|
|
@@ -1394,6 +1397,8 @@ export interface TeamCreateRequest {
|
|
|
1394
1397
|
platform?: string;
|
|
1395
1398
|
/** Platform-specific options (app_id, app_secret, allow_from, share_session, etc.) */
|
|
1396
1399
|
platformOptions?: Record<string, string | boolean>;
|
|
1400
|
+
/** Provider names to bind to the team project in cc-connect. */
|
|
1401
|
+
providerRefs?: string[];
|
|
1397
1402
|
}
|
|
1398
1403
|
|
|
1399
1404
|
export interface TeamCreateConfigRequest {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a6 as o,a7 as n}from"./index-CrOkTuIK.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-Cmu8IjLN.js";import{_ as i}from"./index-CrOkTuIK.js";import"./chunk-FMBD7UC4-BZNeq0CB.js";import"./chunk-55IACEB6-BddOEwBk.js";import"./chunk-QN33PNHL-DMb3gYzN.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-Cmu8IjLN.js";import{_ as i}from"./index-CrOkTuIK.js";import"./chunk-FMBD7UC4-BZNeq0CB.js";import"./chunk-55IACEB6-BddOEwBk.js";import"./chunk-QN33PNHL-DMb3gYzN.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-BDBpSAHY.js";var e=4;function a(o){return r(o,e)}export{a as c};
|