@yancyyu/openhermit 1.6.26 → 1.6.28

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 (74) hide show
  1. package/README.md +132 -80
  2. package/bin/hermit.mjs +2 -2
  3. package/dist-renderer/assets/{ProjectEditorOverlay-Byepdwo2.js → ProjectEditorOverlay-A4DZTvSy.js} +1 -1
  4. package/dist-renderer/assets/{TeamGraphOverlay-vvWu-2c9.js → TeamGraphOverlay-Ba5njic5.js} +1 -1
  5. package/dist-renderer/assets/{_basePickBy-DfsmMgXN.js → _basePickBy-BvnK-OC1.js} +1 -1
  6. package/dist-renderer/assets/{_baseUniq-Bve-IKz5.js → _baseUniq-DmFYXx9G.js} +1 -1
  7. package/dist-renderer/assets/{arc-4cbkhagw.js → arc-DX4ZQFY4.js} +1 -1
  8. package/dist-renderer/assets/{architectureDiagram-VXUJARFQ-CC9i0bMK.js → architectureDiagram-VXUJARFQ-DfYr3vEN.js} +1 -1
  9. package/dist-renderer/assets/{blockDiagram-VD42YOAC-BjFruJ65.js → blockDiagram-VD42YOAC-DuXdVeWn.js} +1 -1
  10. package/dist-renderer/assets/{c4Diagram-YG6GDRKO-CrYzsQC1.js → c4Diagram-YG6GDRKO-Bw2nixXe.js} +1 -1
  11. package/dist-renderer/assets/channel-Pre42N5O.js +1 -0
  12. package/dist-renderer/assets/{chunk-4BX2VUAB-Bb9MCt7J.js → chunk-4BX2VUAB-DLiNGQoE.js} +1 -1
  13. package/dist-renderer/assets/{chunk-55IACEB6-BpOVOXVa.js → chunk-55IACEB6-B1L_8VIF.js} +1 -1
  14. package/dist-renderer/assets/{chunk-B4BG7PRW-GtEiO-7n.js → chunk-B4BG7PRW-DaZMWKGk.js} +1 -1
  15. package/dist-renderer/assets/{chunk-DI55MBZ5-BRlzcOEj.js → chunk-DI55MBZ5-ku-dflJG.js} +1 -1
  16. package/dist-renderer/assets/{chunk-FMBD7UC4-DcvMVOZx.js → chunk-FMBD7UC4-DV-mF1dP.js} +1 -1
  17. package/dist-renderer/assets/{chunk-QN33PNHL-B9pkjVpd.js → chunk-QN33PNHL-ByGcDFQ0.js} +1 -1
  18. package/dist-renderer/assets/{chunk-QZHKN3VN-DzHPSm01.js → chunk-QZHKN3VN-7dv-Min8.js} +1 -1
  19. package/dist-renderer/assets/{chunk-TZMSLE5B-BU9c0Hcn.js → chunk-TZMSLE5B-WdXL5fTu.js} +1 -1
  20. package/dist-renderer/assets/classDiagram-2ON5EDUG-CdJsTJsj.js +1 -0
  21. package/dist-renderer/assets/classDiagram-v2-WZHVMYZB-CdJsTJsj.js +1 -0
  22. package/dist-renderer/assets/clone-BjQBiNfj.js +1 -0
  23. package/dist-renderer/assets/{cose-bilkent-S5V4N54A-BqOg0x3V.js → cose-bilkent-S5V4N54A-CNcsvqPl.js} +1 -1
  24. package/dist-renderer/assets/{dagre-6UL2VRFP-C9JTWefj.js → dagre-6UL2VRFP-DBNx4qqx.js} +1 -1
  25. package/dist-renderer/assets/{diagram-PSM6KHXK-ljleG6ui.js → diagram-PSM6KHXK-BfVlT6sT.js} +1 -1
  26. package/dist-renderer/assets/{diagram-QEK2KX5R-BbV-WSTr.js → diagram-QEK2KX5R-HvVjs0K6.js} +1 -1
  27. package/dist-renderer/assets/{diagram-S2PKOQOG-CKi3DFby.js → diagram-S2PKOQOG-DYb_KnWS.js} +1 -1
  28. package/dist-renderer/assets/{erDiagram-Q2GNP2WA-D3HE7b-j.js → erDiagram-Q2GNP2WA-Ba-IgI5G.js} +1 -1
  29. package/dist-renderer/assets/{flowDiagram-NV44I4VS-C2yLRmM0.js → flowDiagram-NV44I4VS-2iDN8Kpj.js} +1 -1
  30. package/dist-renderer/assets/{ganttDiagram-JELNMOA3-XEV4KtUf.js → ganttDiagram-JELNMOA3-Byjf8Fa3.js} +1 -1
  31. package/dist-renderer/assets/{gitGraphDiagram-V2S2FVAM-ufaCCg7c.js → gitGraphDiagram-V2S2FVAM-DbKvfZ_j.js} +1 -1
  32. package/dist-renderer/assets/{graph-BzPvdBp0.js → graph-Enirf-f8.js} +1 -1
  33. package/dist-renderer/assets/{index-BprOls_t.js → index-AjxP_rE_.js} +1 -1
  34. package/dist-renderer/assets/index-BIOJremZ.css +1 -0
  35. package/dist-renderer/assets/{index-DHq6dXy7.js → index-COZPUWJW.js} +1 -1
  36. package/dist-renderer/assets/{index-Cr91T9ef.js → index-ChR1D6ZF.js} +1 -1
  37. package/dist-renderer/assets/{index-DUIDxnaf.js → index-CtlzGepK.js} +1 -1
  38. package/dist-renderer/assets/{index-A5CMVuXA.js → index-DY1zqsb6.js} +538 -538
  39. package/dist-renderer/assets/{index-yNYjzR2R.js → index-DdhqolqE.js} +1 -1
  40. package/dist-renderer/assets/{infoDiagram-HS3SLOUP-DKP5zgHc.js → infoDiagram-HS3SLOUP-D6uicwz1.js} +1 -1
  41. package/dist-renderer/assets/{journeyDiagram-XKPGCS4Q-Omd7tmzE.js → journeyDiagram-XKPGCS4Q-DqwZsXlQ.js} +1 -1
  42. package/dist-renderer/assets/{kanban-definition-3W4ZIXB7-D7yw9yIY.js → kanban-definition-3W4ZIXB7-fCDVhVUm.js} +1 -1
  43. package/dist-renderer/assets/{layout-DZxAqFuM.js → layout-CPFgj98r.js} +1 -1
  44. package/dist-renderer/assets/{linear-BXWJygRB.js → linear-CYiQ7Y3M.js} +1 -1
  45. package/dist-renderer/assets/{mindmap-definition-VGOIOE7T-BfJ09SBb.js → mindmap-definition-VGOIOE7T-D31dS2KE.js} +1 -1
  46. package/dist-renderer/assets/{pieDiagram-ADFJNKIX-BYaLQhXj.js → pieDiagram-ADFJNKIX-BOsCJfds.js} +1 -1
  47. package/dist-renderer/assets/{quadrantDiagram-AYHSOK5B-DeA0B1fw.js → quadrantDiagram-AYHSOK5B-CYTVQCfr.js} +1 -1
  48. package/dist-renderer/assets/{requirementDiagram-UZGBJVZJ-DnFWn7-v.js → requirementDiagram-UZGBJVZJ-CODCFpkt.js} +1 -1
  49. package/dist-renderer/assets/{sankeyDiagram-TZEHDZUN-L9bek20k.js → sankeyDiagram-TZEHDZUN-Z4ce9ZtZ.js} +1 -1
  50. package/dist-renderer/assets/{sequenceDiagram-WL72ISMW-BBmcJUXb.js → sequenceDiagram-WL72ISMW-CmS9TxhW.js} +1 -1
  51. package/dist-renderer/assets/{stateDiagram-FKZM4ZOC-DrwPQvTq.js → stateDiagram-FKZM4ZOC-o9k-ns3q.js} +1 -1
  52. package/dist-renderer/assets/{stateDiagram-v2-4FDKWEC3-BOUQrTH6.js → stateDiagram-v2-4FDKWEC3-CxHMyEt1.js} +1 -1
  53. package/dist-renderer/assets/{timeline-definition-IT6M3QCI-Dldh9vsj.js → timeline-definition-IT6M3QCI-B6T3zrde.js} +1 -1
  54. package/dist-renderer/assets/{treemap-GDKQZRPO-BsGSs8-P.js → treemap-GDKQZRPO-CVd5GNDw.js} +1 -1
  55. package/dist-renderer/assets/{xychartDiagram-PRI3JC2R-BsR_bj-d.js → xychartDiagram-PRI3JC2R-CleBrdqc.js} +1 -1
  56. package/dist-renderer/index.html +2 -2
  57. package/package.json +1 -1
  58. package/src/main/server.ts +137 -8
  59. package/src/main/services/session-intelligence/SessionUsageParser.ts +446 -0
  60. package/src/main/services/session-intelligence/UsageTelemetryService.ts +237 -0
  61. package/src/renderer/api/httpClient.ts +1 -1
  62. package/src/renderer/components/dashboard/DashboardView.tsx +6 -105
  63. package/src/renderer/components/settings/SettingsTabs.tsx +2 -2
  64. package/src/renderer/components/settings/sections/TaskBusSection.tsx +463 -83
  65. package/src/renderer/components/team/TeamDetailView.tsx +40 -20
  66. package/src/renderer/components/team/TeamListView.tsx +35 -21
  67. package/src/renderer/components/team/dialogs/CreateTeamDialog.tsx +10 -7
  68. package/src/renderer/components/team/dialogs/EditTeamDialog.tsx +9 -6
  69. package/src/shared/types/team.ts +5 -0
  70. package/dist-renderer/assets/channel-BMMyVRy4.js +0 -1
  71. package/dist-renderer/assets/classDiagram-2ON5EDUG-Dz1VG1T3.js +0 -1
  72. package/dist-renderer/assets/classDiagram-v2-WZHVMYZB-Dz1VG1T3.js +0 -1
  73. package/dist-renderer/assets/clone-COsIIGZQ.js +0 -1
  74. package/dist-renderer/assets/index-CWpFqEvz.css +0 -1
@@ -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
- setDeleteConfirmOpen(false);
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
- <Tooltip>
2156
- <TooltipTrigger asChild>
2157
- <Button
2158
- variant="ghost"
2159
- size="sm"
2160
- className="h-7 gap-1 px-2 text-xs text-red-400 hover:bg-red-500/10 hover:text-red-300"
2161
- onClick={handleDeleteTeam}
2162
- >
2163
- <Trash2 size={12} />
2164
- </Button>
2165
- </TooltipTrigger>
2166
- <TooltipContent side="bottom">删除团队</TooltipContent>
2167
- </Tooltip>
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={teamName !== 'default' ? handleDeleteTeam : undefined}
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 open={deleteConfirmOpen} onOpenChange={setDeleteConfirmOpen}>
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 variant="destructive" size="sm" onClick={confirmDeleteTeam}>
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: `确定删除团队“${teamDisplayName}”吗?此操作会同步删除 cc-connect 项目并移除本地团队数据。`,
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={() => openTeamTab(team.teamName, team.projectPath)}
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
- <Tooltip>
1177
- <TooltipTrigger asChild>
1178
- <button
1179
- type="button"
1180
- 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"
1181
- onClick={(e) =>
1182
- handleDeleteTeam(team.teamName, !!team.pendingCreate, e)
1183
- }
1184
- >
1185
- <Trash2 size={14} />
1186
- </button>
1187
- </TooltipTrigger>
1188
- <TooltipContent side="bottom">删除团队</TooltipContent>
1189
- </Tooltip>
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) => !p.agent_types || p.agent_types.length === 0 || p.agent_types.includes(selectedHarness)
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
- 只有需要给该团队指定模型供应商时,才绑定下面的全局 Provider。
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 = provider.endpoints?.[selectedHarness] ?? provider.base_url ?? '默认端点';
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} 的全局 Provider。
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 || provider.agent_types.length === 0 || (provider.agent_types as string[]).includes(agentType)
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
- 只有需要给该团队指定模型供应商时,才绑定下面的全局 Provider。
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} 的全局 Provider。
430
- 可先在「设置 → Harness 配置」中添加;不添加也会使用本机默认登录态。
432
+ 暂无适用于 {AGENT_TYPE_LABELS[agentType as CcAgentType] ?? agentType} 的全局
433
+ Provider。 可先在「设置 → Harness 配置」中添加;不添加也会使用本机默认登录态。
431
434
  </div>
432
435
  )}
433
436
  </div>
@@ -166,6 +166,11 @@ export interface TaskBusConfig {
166
166
  password?: string;
167
167
  db?: number;
168
168
  };
169
+ telemetry?: {
170
+ enabled: boolean;
171
+ /** Data source platform. Currently only 'claudecode'. */
172
+ platform: 'claudecode';
173
+ };
169
174
  }
170
175
 
171
176
  export interface TaskDispatchPayload {
@@ -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};