@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.
Files changed (75) hide show
  1. package/README.md +127 -77
  2. package/bin/hermit.mjs +151 -62
  3. package/dist-renderer/assets/{ProjectEditorOverlay-CZ1LI0pd.js → ProjectEditorOverlay-BBwYdXPv.js} +1 -1
  4. package/dist-renderer/assets/{TeamGraphOverlay-DvyxOPvU.js → TeamGraphOverlay-DVq8rt6_.js} +1 -1
  5. package/dist-renderer/assets/{_basePickBy-D8IKEBh4.js → _basePickBy-ZbF0pKvS.js} +1 -1
  6. package/dist-renderer/assets/{_baseUniq-BDBpSAHY.js → _baseUniq-BBLBOeXc.js} +1 -1
  7. package/dist-renderer/assets/{arc-CZagJLek.js → arc-wGaEgkCf.js} +1 -1
  8. package/dist-renderer/assets/{architectureDiagram-VXUJARFQ-Cq083Uu6.js → architectureDiagram-VXUJARFQ-BpMkdC35.js} +1 -1
  9. package/dist-renderer/assets/{blockDiagram-VD42YOAC-CIEANvSv.js → blockDiagram-VD42YOAC-C8Z1xhG4.js} +1 -1
  10. package/dist-renderer/assets/{c4Diagram-YG6GDRKO-Ca4h_BlA.js → c4Diagram-YG6GDRKO-CJmlw9LA.js} +1 -1
  11. package/dist-renderer/assets/channel-DJUrwVrK.js +1 -0
  12. package/dist-renderer/assets/{chunk-4BX2VUAB-DW9HjNgA.js → chunk-4BX2VUAB-CHPHiRPP.js} +1 -1
  13. package/dist-renderer/assets/{chunk-55IACEB6-BddOEwBk.js → chunk-55IACEB6-DyVohOQb.js} +1 -1
  14. package/dist-renderer/assets/{chunk-B4BG7PRW-Cmu8IjLN.js → chunk-B4BG7PRW-p5bffh_R.js} +1 -1
  15. package/dist-renderer/assets/{chunk-DI55MBZ5-BU7nEH8e.js → chunk-DI55MBZ5-BnfGPSUu.js} +1 -1
  16. package/dist-renderer/assets/{chunk-FMBD7UC4-BZNeq0CB.js → chunk-FMBD7UC4-B6SCKseX.js} +1 -1
  17. package/dist-renderer/assets/{chunk-QN33PNHL-DMb3gYzN.js → chunk-QN33PNHL-L12RvLBR.js} +1 -1
  18. package/dist-renderer/assets/{chunk-QZHKN3VN-8wSSvqz0.js → chunk-QZHKN3VN-DeH1Kxge.js} +1 -1
  19. package/dist-renderer/assets/{chunk-TZMSLE5B-B4OLgw45.js → chunk-TZMSLE5B-BWnjzSlI.js} +1 -1
  20. package/dist-renderer/assets/classDiagram-2ON5EDUG-blc3DrH7.js +1 -0
  21. package/dist-renderer/assets/classDiagram-v2-WZHVMYZB-blc3DrH7.js +1 -0
  22. package/dist-renderer/assets/clone-BftjWakJ.js +1 -0
  23. package/dist-renderer/assets/{cose-bilkent-S5V4N54A-CS9moNeT.js → cose-bilkent-S5V4N54A-BtzoT5fu.js} +1 -1
  24. package/dist-renderer/assets/{dagre-6UL2VRFP-3pzdMwjZ.js → dagre-6UL2VRFP-CBBvuoUD.js} +1 -1
  25. package/dist-renderer/assets/{diagram-PSM6KHXK-CGTnMY5C.js → diagram-PSM6KHXK-Be9BAKws.js} +1 -1
  26. package/dist-renderer/assets/{diagram-QEK2KX5R-Cyzp8dOw.js → diagram-QEK2KX5R-BDS4PI_i.js} +1 -1
  27. package/dist-renderer/assets/{diagram-S2PKOQOG-D_5SvdXI.js → diagram-S2PKOQOG-2Rameaq7.js} +1 -1
  28. package/dist-renderer/assets/{erDiagram-Q2GNP2WA-bWPYfs9c.js → erDiagram-Q2GNP2WA-CSIzCEZD.js} +1 -1
  29. package/dist-renderer/assets/{flowDiagram-NV44I4VS-C5z47CKB.js → flowDiagram-NV44I4VS-ForEIVM5.js} +1 -1
  30. package/dist-renderer/assets/{ganttDiagram-JELNMOA3-eye9Cv6S.js → ganttDiagram-JELNMOA3-BJrli_xr.js} +1 -1
  31. package/dist-renderer/assets/{gitGraphDiagram-V2S2FVAM-DekQZoF8.js → gitGraphDiagram-V2S2FVAM-C_4GuLno.js} +1 -1
  32. package/dist-renderer/assets/{graph-kNnl-9Fl.js → graph-B1EAT_gw.js} +1 -1
  33. package/dist-renderer/assets/index-CWpFqEvz.css +1 -0
  34. package/dist-renderer/assets/{index-hGBnMHVl.js → index-DOA_jbYb.js} +1 -1
  35. package/dist-renderer/assets/{index-ATiHUmmE.js → index-DR602dwJ.js} +1 -1
  36. package/dist-renderer/assets/{index-CrOkTuIK.js → index-DYdseEwc.js} +532 -532
  37. package/dist-renderer/assets/{index-CnxDIJh8.js → index-Dwr5wu5x.js} +1 -1
  38. package/dist-renderer/assets/{index-CI2l57ID.js → index-eKRmS5kI.js} +1 -1
  39. package/dist-renderer/assets/{index-DB0k9yRL.js → index-k4tnOFC5.js} +1 -1
  40. package/dist-renderer/assets/{infoDiagram-HS3SLOUP-D3ilrGOS.js → infoDiagram-HS3SLOUP-DjI0uaMz.js} +1 -1
  41. package/dist-renderer/assets/{journeyDiagram-XKPGCS4Q-BOCG2Rrk.js → journeyDiagram-XKPGCS4Q-jQ6Thae-.js} +1 -1
  42. package/dist-renderer/assets/{kanban-definition-3W4ZIXB7-hZ03nCkx.js → kanban-definition-3W4ZIXB7-CKw6InbL.js} +1 -1
  43. package/dist-renderer/assets/{layout-D5Mqy2My.js → layout-Dad20y3V.js} +1 -1
  44. package/dist-renderer/assets/{linear-Clp9OpXU.js → linear-vMgo_2Cv.js} +1 -1
  45. package/dist-renderer/assets/{mindmap-definition-VGOIOE7T-D-w-qhNz.js → mindmap-definition-VGOIOE7T-DYp6YoHL.js} +1 -1
  46. package/dist-renderer/assets/{pieDiagram-ADFJNKIX-D9K0-ecY.js → pieDiagram-ADFJNKIX-BytBecG9.js} +1 -1
  47. package/dist-renderer/assets/{quadrantDiagram-AYHSOK5B-B2f19Ki3.js → quadrantDiagram-AYHSOK5B-RUaspLsc.js} +1 -1
  48. package/dist-renderer/assets/{requirementDiagram-UZGBJVZJ-VezNpCaU.js → requirementDiagram-UZGBJVZJ-rR2B1Use.js} +1 -1
  49. package/dist-renderer/assets/{sankeyDiagram-TZEHDZUN-BpHjEoR9.js → sankeyDiagram-TZEHDZUN-BJi5qYhq.js} +1 -1
  50. package/dist-renderer/assets/{sequenceDiagram-WL72ISMW-Tdb7IZ4t.js → sequenceDiagram-WL72ISMW-BM-wggUb.js} +1 -1
  51. package/dist-renderer/assets/{stateDiagram-FKZM4ZOC-BNA5Q-zz.js → stateDiagram-FKZM4ZOC-BqmcVjnj.js} +1 -1
  52. package/dist-renderer/assets/{stateDiagram-v2-4FDKWEC3-w_4GEN2a.js → stateDiagram-v2-4FDKWEC3-By3JDVbB.js} +1 -1
  53. package/dist-renderer/assets/{timeline-definition-IT6M3QCI-BghtWMWY.js → timeline-definition-IT6M3QCI-szH0GUyk.js} +1 -1
  54. package/dist-renderer/assets/{treemap-GDKQZRPO-BVquWjHf.js → treemap-GDKQZRPO-BCMlh-Ex.js} +1 -1
  55. package/dist-renderer/assets/{xychartDiagram-PRI3JC2R-BSV5wEDU.js → xychartDiagram-PRI3JC2R-dwDpvw0w.js} +1 -1
  56. package/dist-renderer/index.html +2 -2
  57. package/package.json +2 -2
  58. package/src/main/server.ts +52 -12
  59. package/src/renderer/api/httpClient.ts +1 -1
  60. package/src/renderer/components/runtime/ProviderRuntimeSettingsDialog.tsx +2 -0
  61. package/src/renderer/components/settings/sections/AdvancedSection.tsx +2 -0
  62. package/src/renderer/components/settings/sections/CliStatusSection.tsx +2 -0
  63. package/src/renderer/components/settings/sections/HarnessSection.tsx +11 -0
  64. package/src/renderer/components/settings/sections/PlatformsSection.tsx +10 -2
  65. package/src/renderer/components/team/TeamDetailView.tsx +53 -42
  66. package/src/renderer/components/team/TeamListView.tsx +54 -31
  67. package/src/renderer/components/team/dialogs/CreateTeamDialog.tsx +123 -0
  68. package/src/renderer/components/team/dialogs/EditTeamDialog.tsx +98 -2
  69. package/src/renderer/utils/openHermitEvents.ts +9 -0
  70. package/src/shared/types/team.ts +5 -0
  71. package/dist-renderer/assets/channel-CqQK8EX1.js +0 -1
  72. package/dist-renderer/assets/classDiagram-2ON5EDUG-9A3Cg8IA.js +0 -1
  73. package/dist-renderer/assets/classDiagram-v2-WZHVMYZB-9A3Cg8IA.js +0 -1
  74. package/dist-renderer/assets/clone-Bnr-WjeU.js +0 -1
  75. 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
+ }
@@ -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};