@yancyyu/openhermit 1.6.37 → 1.6.39

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 (205) hide show
  1. package/dist-renderer/assets/ProjectEditorOverlay-krO5vQxX.js +58 -0
  2. package/dist-renderer/assets/{TeamGraphOverlay-DYT3bwFR.js → TeamGraphOverlay-DqhQzcTr.js} +1 -1
  3. package/dist-renderer/assets/{_basePickBy-Dbt_EU-e.js → _basePickBy-B7kSYPxr.js} +1 -1
  4. package/dist-renderer/assets/{_baseUniq-DWo68sXI.js → _baseUniq-CnjxqwAk.js} +1 -1
  5. package/dist-renderer/assets/{arc-DXH1iZQK.js → arc-CLeZuINP.js} +1 -1
  6. package/dist-renderer/assets/{architectureDiagram-VXUJARFQ-cjffS2Qr.js → architectureDiagram-VXUJARFQ-QKtqaqdY.js} +1 -1
  7. package/dist-renderer/assets/{blockDiagram-VD42YOAC-BKdZF02Y.js → blockDiagram-VD42YOAC-BqdrzO_f.js} +1 -1
  8. package/dist-renderer/assets/{c4Diagram-YG6GDRKO-CN27pqaI.js → c4Diagram-YG6GDRKO-gwPlCxDC.js} +1 -1
  9. package/dist-renderer/assets/channel-DpMHF50r.js +1 -0
  10. package/dist-renderer/assets/{chunk-4BX2VUAB-CXPCI7g_.js → chunk-4BX2VUAB-C6XLurL4.js} +1 -1
  11. package/dist-renderer/assets/{chunk-55IACEB6-BGAXQZRC.js → chunk-55IACEB6-Ds6quhEP.js} +1 -1
  12. package/dist-renderer/assets/{chunk-B4BG7PRW-TPDaA_KQ.js → chunk-B4BG7PRW-5UlA1_e9.js} +1 -1
  13. package/dist-renderer/assets/{chunk-DI55MBZ5-D1ADe_tq.js → chunk-DI55MBZ5-ywFrqIsY.js} +1 -1
  14. package/dist-renderer/assets/{chunk-FMBD7UC4-Beimtg3a.js → chunk-FMBD7UC4-C7ifUA17.js} +1 -1
  15. package/dist-renderer/assets/{chunk-QN33PNHL-OjNBu854.js → chunk-QN33PNHL-BxGCo80U.js} +1 -1
  16. package/dist-renderer/assets/{chunk-QZHKN3VN-DinqvbH8.js → chunk-QZHKN3VN-B2CuaZs6.js} +1 -1
  17. package/dist-renderer/assets/{chunk-TZMSLE5B-BfFtlPSZ.js → chunk-TZMSLE5B-Ds1hInvp.js} +1 -1
  18. package/dist-renderer/assets/classDiagram-2ON5EDUG-CBYCBVRl.js +1 -0
  19. package/dist-renderer/assets/classDiagram-v2-WZHVMYZB-CBYCBVRl.js +1 -0
  20. package/dist-renderer/assets/clone-DcMF6Psb.js +1 -0
  21. package/dist-renderer/assets/{cose-bilkent-S5V4N54A-D9z9Dgt7.js → cose-bilkent-S5V4N54A-Cz1GVtLp.js} +1 -1
  22. package/dist-renderer/assets/{dagre-6UL2VRFP-n1g-DhEE.js → dagre-6UL2VRFP-BrmR-P4h.js} +1 -1
  23. package/dist-renderer/assets/{diagram-PSM6KHXK-BvxFq-BE.js → diagram-PSM6KHXK-DbNjC5Rg.js} +1 -1
  24. package/dist-renderer/assets/{diagram-QEK2KX5R-wVnJuwza.js → diagram-QEK2KX5R-qkRX5_Mq.js} +1 -1
  25. package/dist-renderer/assets/{diagram-S2PKOQOG-B707WJQw.js → diagram-S2PKOQOG-CyL5rCv2.js} +1 -1
  26. package/dist-renderer/assets/{erDiagram-Q2GNP2WA-C-_1dGHs.js → erDiagram-Q2GNP2WA-Dox3-bA5.js} +1 -1
  27. package/dist-renderer/assets/{flowDiagram-NV44I4VS-CMTSi3H6.js → flowDiagram-NV44I4VS-BtkaxlDL.js} +1 -1
  28. package/dist-renderer/assets/{ganttDiagram-JELNMOA3-DZ0bNrAA.js → ganttDiagram-JELNMOA3-Dhy_d9GK.js} +1 -1
  29. package/dist-renderer/assets/{gitGraphDiagram-V2S2FVAM-DNVfGooQ.js → gitGraphDiagram-V2S2FVAM-B5XRhIQA.js} +1 -1
  30. package/dist-renderer/assets/{graph-865j_tM_.js → graph-CsoEwUhS.js} +1 -1
  31. package/dist-renderer/assets/{index-C_F9N5x-.js → index-BWPWmJNo.js} +1 -1
  32. package/dist-renderer/assets/{index-LwDIsXJN.js → index-Bu2R-Se7.js} +586 -740
  33. package/dist-renderer/assets/index-CnWV3BhG.css +32 -0
  34. package/dist-renderer/assets/{index-DuUaf8at.js → index-D-3KgskL.js} +1 -1
  35. package/dist-renderer/assets/{index-BTx1nc4T.js → index-DGEBzLNT.js} +1 -1
  36. package/dist-renderer/assets/{index-2EW-eu3q.js → index-NhHNs2Oo.js} +1 -1
  37. package/dist-renderer/assets/{index-4dEMStJj.js → index-h17WuEyf.js} +1 -1
  38. package/dist-renderer/assets/{infoDiagram-HS3SLOUP-CyqtElLq.js → infoDiagram-HS3SLOUP-hMGmNojH.js} +1 -1
  39. package/dist-renderer/assets/{journeyDiagram-XKPGCS4Q-BvjQ0Hm0.js → journeyDiagram-XKPGCS4Q-DXV2rBDl.js} +1 -1
  40. package/dist-renderer/assets/{kanban-definition-3W4ZIXB7-CJJ-k0zT.js → kanban-definition-3W4ZIXB7-Bf99WLRy.js} +1 -1
  41. package/dist-renderer/assets/{layout-CnV6rQAG.js → layout-C3XWrpwo.js} +1 -1
  42. package/dist-renderer/assets/{linear-Cw3UQgyX.js → linear-OEEcn8KN.js} +1 -1
  43. package/dist-renderer/assets/{mindmap-definition-VGOIOE7T-C5tDaGSK.js → mindmap-definition-VGOIOE7T-Dpi3S2x4.js} +1 -1
  44. package/dist-renderer/assets/{pieDiagram-ADFJNKIX-CiIpPsau.js → pieDiagram-ADFJNKIX-xTPPhtNx.js} +1 -1
  45. package/dist-renderer/assets/{quadrantDiagram-AYHSOK5B-C3gtowNj.js → quadrantDiagram-AYHSOK5B-euniyDlz.js} +1 -1
  46. package/dist-renderer/assets/{requirementDiagram-UZGBJVZJ-CXBTrAnU.js → requirementDiagram-UZGBJVZJ-D9Uiw4kF.js} +1 -1
  47. package/dist-renderer/assets/{sankeyDiagram-TZEHDZUN-wziX77xG.js → sankeyDiagram-TZEHDZUN-CySU4nED.js} +1 -1
  48. package/dist-renderer/assets/{sequenceDiagram-WL72ISMW-sYqopcrj.js → sequenceDiagram-WL72ISMW-JVGpET6V.js} +1 -1
  49. package/dist-renderer/assets/splashScene-D0YB9uxm.js +17 -0
  50. package/dist-renderer/assets/{stateDiagram-FKZM4ZOC-Bl1-0_Cp.js → stateDiagram-FKZM4ZOC-B2FY5qqi.js} +1 -1
  51. package/dist-renderer/assets/stateDiagram-v2-4FDKWEC3-DcoMiR8H.js +1 -0
  52. package/dist-renderer/assets/{timeline-definition-IT6M3QCI-CIRjJUBo.js → timeline-definition-IT6M3QCI-DmycNUUe.js} +1 -1
  53. package/dist-renderer/assets/{treemap-GDKQZRPO-CVPuNe1n.js → treemap-GDKQZRPO-DPq4gZuB.js} +1 -1
  54. package/dist-renderer/assets/{xychartDiagram-PRI3JC2R-3nT9yHwp.js → xychartDiagram-PRI3JC2R-J6VVJzRq.js} +1 -1
  55. package/dist-renderer/index.html +20 -53
  56. package/package.json +25 -18
  57. package/src/main/ipc/extensions.ts +30 -50
  58. package/src/main/server.ts +890 -247
  59. package/src/main/services/extensions/ExtensionFacadeService.ts +4 -56
  60. package/src/main/services/extensions/catalog/PluginCatalogService.ts +4 -2
  61. package/src/main/services/extensions/library/McpLibraryService.ts +243 -0
  62. package/src/main/services/session-intelligence/ConversationTelemetryService.ts +1101 -0
  63. package/src/main/services/session-intelligence/LocalSessionScanner.ts +512 -0
  64. package/src/main/services/session-intelligence/SessionUsageParser.ts +4 -4
  65. package/src/main/services/session-intelligence/UsageTelemetryService.ts +14 -1
  66. package/src/main/services/system-manager/SystemManagerConfigService.ts +122 -0
  67. package/src/main/services/system-manager/SystemManagerPtyService.ts +233 -0
  68. package/src/main/services/system-manager/WorkflowPromptService.ts +75 -0
  69. package/src/main/services/teams-mvp/TaskDispatchService.ts +32 -8
  70. package/src/main/services/teams-mvp/TeamProvisioningService.ts +39 -2
  71. package/src/main/services/teams-mvp/TeamWorkspaceService.ts +22 -4
  72. package/src/main/utils/teamProjectResolution.ts +15 -0
  73. package/src/renderer/App.tsx +8 -4
  74. package/src/renderer/api/httpClient.ts +174 -38
  75. package/src/renderer/api/providers.ts +23 -2
  76. package/src/renderer/assets/participant-avatars/01.svg +3 -0
  77. package/src/renderer/assets/participant-avatars/02.svg +3 -0
  78. package/src/renderer/assets/participant-avatars/03.svg +3 -0
  79. package/src/renderer/assets/participant-avatars/04.svg +3 -0
  80. package/src/renderer/assets/participant-avatars/05.svg +3 -0
  81. package/src/renderer/assets/participant-avatars/06.svg +3 -0
  82. package/src/renderer/assets/participant-avatars/07.svg +3 -0
  83. package/src/renderer/assets/participant-avatars/08.svg +3 -0
  84. package/src/renderer/assets/participant-avatars/09.svg +3 -0
  85. package/src/renderer/assets/participant-avatars/10.svg +3 -0
  86. package/src/renderer/assets/participant-avatars/11.svg +3 -0
  87. package/src/renderer/assets/participant-avatars/12.svg +3 -0
  88. package/src/renderer/assets/participant-avatars/13.svg +3 -0
  89. package/src/renderer/components/common/TerminalPane.tsx +213 -0
  90. package/src/renderer/components/dashboard/DashboardView.tsx +9 -36
  91. package/src/renderer/components/extensions/ExtensionStoreView.tsx +12 -221
  92. package/src/renderer/components/extensions/ExtensionsSubTabTrigger.tsx +1 -1
  93. package/src/renderer/components/extensions/mcp/McpLibraryEnableDialog.tsx +305 -0
  94. package/src/renderer/components/extensions/mcp/McpLibraryEntryDialog.tsx +418 -0
  95. package/src/renderer/components/extensions/mcp/McpLibraryPanel.tsx +404 -0
  96. package/src/renderer/components/extensions/plugins/PluginCard.tsx +10 -2
  97. package/src/renderer/components/extensions/plugins/PluginsPanel.tsx +40 -22
  98. package/src/renderer/components/extensions/skills/SkillsLibraryPanel.tsx +335 -0
  99. package/src/renderer/components/layout/PaneContent.tsx +8 -1
  100. package/src/renderer/components/layout/Sidebar.tsx +11 -54
  101. package/src/renderer/components/layout/SortableTab.tsx +20 -31
  102. package/src/renderer/components/layout/TabBar.tsx +1 -1
  103. package/src/renderer/components/layout/TabContextMenu.tsx +1 -1
  104. package/src/renderer/components/runtime/ProviderRuntimeSettingsDialog.tsx +768 -157
  105. package/src/renderer/components/schedules/SchedulesView.tsx +51 -462
  106. package/src/renderer/components/schedules/calendar/CalendarDayView.tsx +173 -0
  107. package/src/renderer/components/schedules/calendar/CalendarEventBlock.tsx +113 -0
  108. package/src/renderer/components/schedules/calendar/CalendarHeader.tsx +148 -0
  109. package/src/renderer/components/schedules/calendar/CalendarMonthView.tsx +142 -0
  110. package/src/renderer/components/schedules/calendar/CalendarWeekView.tsx +219 -0
  111. package/src/renderer/components/schedules/calendar/ScheduleCalendarBoard.tsx +41 -0
  112. package/src/renderer/components/schedules/calendar/TeamGanttView.tsx +405 -0
  113. package/src/renderer/components/schedules/calendar/computeOccurrences.ts +234 -0
  114. package/src/renderer/components/schedules/calendar/index.ts +2 -0
  115. package/src/renderer/components/schedules/calendar/types.ts +44 -0
  116. package/src/renderer/components/settings/SettingsTabs.tsx +50 -55
  117. package/src/renderer/components/settings/SettingsView.tsx +30 -35
  118. package/src/renderer/components/settings/components/SettingsSectionHeader.tsx +5 -1
  119. package/src/renderer/components/settings/components/SettingsSelect.tsx +5 -3
  120. package/src/renderer/components/settings/components/SettingsToggle.tsx +2 -2
  121. package/src/renderer/components/settings/sections/AdvancedSection.tsx +11 -42
  122. package/src/renderer/components/settings/sections/CliStatusSection.tsx +71 -112
  123. package/src/renderer/components/settings/sections/ConfigEditorDialog.tsx +1 -1
  124. package/src/renderer/components/settings/sections/GeneralSection.tsx +11 -3
  125. package/src/renderer/components/settings/sections/HarnessSection.tsx +18 -14
  126. package/src/renderer/components/settings/sections/PlatformsSection.tsx +3 -3
  127. package/src/renderer/components/settings/sections/TaskBusSection.tsx +33 -40
  128. package/src/renderer/components/settings/sections/index.ts +0 -1
  129. package/src/renderer/components/sidebar/SidebarSessions.tsx +182 -4
  130. package/src/renderer/components/sidebar/SidebarTaskItem.tsx +4 -4
  131. package/src/renderer/components/sidebar/WorkspaceBrowser.tsx +39 -4
  132. package/src/renderer/components/splash/splashScene.ts +121 -929
  133. package/src/renderer/components/system-manager/FolderBrowser.tsx +163 -0
  134. package/src/renderer/components/system-manager/SystemManagerView.tsx +351 -0
  135. package/src/renderer/components/tasks/TasksView.tsx +112 -134
  136. package/src/renderer/components/team/CcSessionsSection.tsx +431 -89
  137. package/src/renderer/components/team/CollapsibleTeamSection.tsx +17 -32
  138. package/src/renderer/components/team/TeamDetailView.tsx +325 -114
  139. package/src/renderer/components/team/TeamListView.tsx +108 -123
  140. package/src/renderer/components/team/dialogs/CreateTaskDialog.tsx +2 -2
  141. package/src/renderer/components/team/dialogs/CreateTeamDialog.tsx +84 -306
  142. package/src/renderer/components/team/dialogs/EditTeamDialog.tsx +259 -342
  143. package/src/renderer/components/team/dialogs/GlobalTaskDetailDialog.tsx +1 -1
  144. package/src/renderer/components/team/dialogs/LaunchTeamDialog.tsx +17 -15
  145. package/src/renderer/components/team/dialogs/PlatformBindingDialog.tsx +221 -0
  146. package/src/renderer/components/team/dialogs/PlatformManualForm.tsx +7 -0
  147. package/src/renderer/components/team/dialogs/PlatformSetupQR.tsx +1 -1
  148. package/src/renderer/components/team/dialogs/RuntimeConfigDialog.tsx +361 -0
  149. package/src/renderer/components/team/dialogs/platformMeta.ts +122 -11
  150. package/src/renderer/components/team/dialogs/useTeamEditForm.ts +17 -5
  151. package/src/renderer/components/team/kanban/KanbanBoard.tsx +9 -9
  152. package/src/renderer/components/team/members/MemberCard.tsx +14 -47
  153. package/src/renderer/components/team/members/MemberDetailDialog.tsx +3 -95
  154. package/src/renderer/components/team/members/MemberDetailStats.tsx +50 -65
  155. package/src/renderer/components/team/messages/MessageComposer.tsx +8 -110
  156. package/src/renderer/components/team/messages/MessagesPanel.tsx +131 -114
  157. package/src/renderer/components/team/schedule/ScheduleStatusBadge.tsx +2 -2
  158. package/src/renderer/components/team/tools/AddMcpInline.tsx +57 -0
  159. package/src/renderer/components/team/tools/AddSkillInline.tsx +61 -0
  160. package/src/renderer/components/team/tools/McpChip.tsx +45 -0
  161. package/src/renderer/components/team/tools/SkillChip.tsx +35 -0
  162. package/src/renderer/components/team/tools/ToolsSection.tsx +556 -0
  163. package/src/renderer/hooks/useExtensionsTabState.ts +3 -114
  164. package/src/renderer/index.css +39 -22
  165. package/src/renderer/index.html +17 -50
  166. package/src/renderer/store/index.ts +2 -1
  167. package/src/renderer/store/slices/scheduleSlice.ts +1 -1
  168. package/src/renderer/store/slices/teamSlice.ts +45 -168
  169. package/src/renderer/utils/claudeCodeOnlyProviders.ts +3 -10
  170. package/src/renderer/utils/memberHelpers.ts +5 -17
  171. package/src/renderer/utils/openCodeRuntimeDeliveryDiagnostics.ts +4 -2
  172. package/src/renderer/utils/providerSlashCommands.ts +0 -5
  173. package/src/renderer/utils/scheduleFormatters.ts +3 -1
  174. package/src/renderer/utils/teamMessageFiltering.ts +14 -1
  175. package/src/renderer/utils/teamModelAvailability.ts +18 -2
  176. package/src/shared/types/api.ts +121 -2
  177. package/src/shared/types/ccConnect.ts +2 -0
  178. package/src/shared/types/extensions/api.ts +9 -0
  179. package/src/shared/types/extensions/index.ts +4 -0
  180. package/src/shared/types/extensions/mcp.ts +41 -0
  181. package/src/shared/types/index.ts +3 -0
  182. package/src/shared/types/systemManager.ts +49 -0
  183. package/src/shared/types/team.ts +29 -0
  184. package/src/shared/types/terminal.ts +4 -2
  185. package/src/shared/utils/extensionNormalizers.ts +29 -0
  186. package/src/shared/utils/providerExtensionCapabilities.ts +2 -2
  187. package/dist-renderer/assets/ProjectEditorOverlay-Va_Vz-zz.js +0 -52
  188. package/dist-renderer/assets/channel-5dJIx68e.js +0 -1
  189. package/dist-renderer/assets/classDiagram-2ON5EDUG-BMGXWJ2d.js +0 -1
  190. package/dist-renderer/assets/classDiagram-v2-WZHVMYZB-BMGXWJ2d.js +0 -1
  191. package/dist-renderer/assets/clone-D7FWfGY9.js +0 -1
  192. package/dist-renderer/assets/index-B2z_IyRH.css +0 -1
  193. package/dist-renderer/assets/splashScene-C8lWNnm4.js +0 -1
  194. package/dist-renderer/assets/stateDiagram-v2-4FDKWEC3-DOYYvDbi.js +0 -1
  195. package/src/main/services/extensions/catalog/GlamaMcpEnrichmentService.ts +0 -190
  196. package/src/main/services/extensions/catalog/McpCatalogAggregator.ts +0 -150
  197. package/src/main/services/extensions/catalog/OfficialMcpRegistryService.ts +0 -381
  198. package/src/main/services/extensions/install/McpInstallService.ts +0 -407
  199. package/src/main/services/extensions/state/McpInstallationStateService.ts +0 -42
  200. package/src/renderer/components/extensions/mcp/McpServerCard.tsx +0 -314
  201. package/src/renderer/components/extensions/mcp/McpServerDetailDialog.tsx +0 -765
  202. package/src/renderer/components/extensions/mcp/McpServersPanel.tsx +0 -593
  203. package/src/renderer/components/extensions/skills/SkillDetailDialog.tsx +0 -372
  204. package/src/renderer/components/extensions/skills/SkillImportDialog.tsx +0 -343
  205. package/src/renderer/components/extensions/skills/SkillsPanel.tsx +0 -659
@@ -5,30 +5,30 @@
5
5
  /* Theme CSS Custom Properties */
6
6
 
7
7
  :root {
8
- /* Dark theme (default) - Midnight Slate palette (cool indigo undertone) */
9
- --color-surface: #12131a;
10
- /* Main background — deep midnight */
11
- --color-surface-raised: #1c1d26;
12
- /* Active/Selected items — cool slate */
13
- --color-surface-overlay: #1c1d26;
8
+ /* Dark theme (default) - Phosphor Green terminal palette */
9
+ --color-surface: #0a0a0f;
10
+ /* Main background — CRT black */
11
+ --color-surface-raised: #121318;
12
+ /* Active/Selected items — terminal surface */
13
+ --color-surface-overlay: #121318;
14
14
  /* Overlay surfaces */
15
- --color-surface-sidebar: #0c0d13;
16
- /* Sidebar — deepest navy-black */
17
- --color-border: rgba(148, 163, 184, 0.07);
18
- /* Borders — slate-tinted */
19
- --color-border-subtle: rgba(148, 163, 184, 0.05);
15
+ --color-surface-sidebar: #060609;
16
+ /* Sidebar — deepest black */
17
+ --color-border: rgba(74, 222, 128, 0.07);
18
+ /* Borders — phosphor green-tinted */
19
+ --color-border-subtle: rgba(74, 222, 128, 0.04);
20
20
  /* Subtle borders */
21
- --color-border-emphasis: rgba(148, 163, 184, 0.12);
21
+ --color-border-emphasis: rgba(74, 222, 128, 0.14);
22
22
  /* Emphasis borders */
23
- --color-text: #f1f5f9;
24
- --color-text-secondary: #94a3b8;
25
- --color-text-muted: #64748b;
26
- --color-accent: #818cf8;
27
- /* Accent — indigo-400, visible on dark surfaces */
23
+ --color-text: #c8cdd8;
24
+ --color-text-secondary: #7a8190;
25
+ --color-text-muted: #4f5564;
26
+ --color-accent: #4ade80;
27
+ /* Accent — phosphor green */
28
28
  /* Scrollbar colors */
29
- --scrollbar-thumb: rgba(148, 163, 184, 0.15);
30
- --scrollbar-thumb-hover: rgba(148, 163, 184, 0.25);
31
- --scrollbar-thumb-active: rgba(148, 163, 184, 0.35);
29
+ --scrollbar-thumb: rgba(74, 222, 128, 0.12);
30
+ --scrollbar-thumb-hover: rgba(74, 222, 128, 0.22);
31
+ --scrollbar-thumb-active: rgba(74, 222, 128, 0.32);
32
32
  /* Search highlights */
33
33
  --highlight-bg: rgba(202, 138, 4, 0.7);
34
34
  --highlight-bg-inactive: rgba(113, 63, 18, 0.5);
@@ -797,14 +797,31 @@ body {
797
797
  height: 100%;
798
798
  overflow: hidden;
799
799
  font-family:
800
- -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell',
801
- 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
800
+ 'Agave', 'JetBrains Mono', 'Menlo', 'Monaco', 'Consolas',
801
+ -apple-system, BlinkMacSystemFont, 'Segoe UI', monospace;
802
802
  -webkit-font-smoothing: antialiased;
803
803
  -moz-osx-font-smoothing: grayscale;
804
804
  background-color: var(--color-surface);
805
805
  color: var(--color-text);
806
806
  }
807
807
 
808
+ /* Agave font face — yume-style monospace */
809
+ @font-face {
810
+ font-family: 'Agave';
811
+ src: url('/fonts/Agave-Regular.ttf') format('truetype');
812
+ font-weight: 400;
813
+ font-style: normal;
814
+ font-display: swap;
815
+ }
816
+
817
+ @font-face {
818
+ font-family: 'Agave';
819
+ src: url('/fonts/Agave-Bold.ttf') format('truetype');
820
+ font-weight: 700;
821
+ font-style: normal;
822
+ font-display: swap;
823
+ }
824
+
808
825
  body.theme-transitioning {
809
826
  transition:
810
827
  background-color 0.2s ease,
@@ -101,7 +101,7 @@
101
101
  />
102
102
  <title>Hermit</title>
103
103
  <style>
104
- /* Splash: animated gradient background */
104
+ /* Splash: clean dark terminal */
105
105
  #splash {
106
106
  position: fixed;
107
107
  inset: 0;
@@ -112,36 +112,11 @@
112
112
  justify-content: center;
113
113
  overflow: hidden;
114
114
  isolation: isolate;
115
- background: linear-gradient(
116
- 180deg,
117
- #0c0d13 0%,
118
- #1a1535 20%,
119
- #1e1245 35%,
120
- #231740 50%,
121
- #1a1535 65%,
122
- #151230 80%,
123
- #0c0d13 100%
124
- );
125
- background-size: 100% 300%;
126
- animation: splash-bg 6s ease infinite;
127
- transition:
128
- opacity 0.42s ease-out,
129
- filter 0.42s ease-out;
115
+ background: #0a0a0f;
116
+ transition: opacity 0.35s ease-out;
130
117
  }
131
118
  #splash.splash-exiting {
132
119
  opacity: 0;
133
- filter: blur(8px);
134
- }
135
- @keyframes splash-bg {
136
- 0% {
137
- background-position: 50% 0%;
138
- }
139
- 50% {
140
- background-position: 50% 100%;
141
- }
142
- 100% {
143
- background-position: 50% 0%;
144
- }
145
120
  }
146
121
  #splash-noise {
147
122
  position: absolute;
@@ -153,19 +128,14 @@
153
128
  z-index: 0;
154
129
  }
155
130
  #splash-enhanced-canvas {
156
- position: absolute;
157
- inset: 0;
158
- width: 100%;
159
- height: 100%;
160
- pointer-events: none;
161
- z-index: 1;
162
- opacity: 0;
163
- animation: splash-canvas-in 0.62s ease-out 0.08s forwards;
131
+ display: none;
164
132
  }
165
- @keyframes splash-canvas-in {
166
- to {
167
- opacity: 1;
168
- }
133
+ @keyframes splash-term-in {
134
+ to { opacity: 1; }
135
+ }
136
+ @keyframes splash-cursor-blink {
137
+ 0%, 100% { opacity: 1; }
138
+ 50% { opacity: 0; }
169
139
  }
170
140
  #splash-logo,
171
141
  #splash-copy {
@@ -173,10 +143,7 @@
173
143
  z-index: 3;
174
144
  }
175
145
  #splash-logo {
176
- margin-bottom: 18px;
177
- animation:
178
- splash-breathe 3s ease-in-out infinite,
179
- splash-glow 3s ease-in-out infinite;
146
+ display: none;
180
147
  }
181
148
  #splash-copy {
182
149
  display: flex;
@@ -208,13 +175,13 @@
208
175
  #splash-text {
209
176
  font-family:
210
177
  ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace;
211
- font-size: 15px;
212
- font-weight: 500;
213
- letter-spacing: 0.05em;
214
- color: #a1a1aa;
215
- text-shadow: 0 0 22px rgba(129, 140, 248, 0.26);
178
+ font-size: 13px;
179
+ font-weight: 400;
180
+ letter-spacing: 0.02em;
181
+ color: rgba(148, 163, 184, 0.6);
216
182
  }
217
183
  #splash-tagline {
184
+ display: none;
218
185
  margin-top: 7px;
219
186
  font-family:
220
187
  ui-sans-serif,
@@ -464,7 +431,7 @@
464
431
  />
465
432
  </svg>
466
433
  <div id="splash-copy">
467
- <div id="splash-text">Hermit</div>
434
+ <div id="splash-text">🦀 hermit</div>
468
435
  <div id="splash-tagline"><span>把复杂工作交给团队。</span></div>
469
436
  <div id="splash-loading-hint">正在启动...</div>
470
437
  </div>
@@ -240,6 +240,7 @@ export function initializeNotificationListeners(): () => void {
240
240
  const SESSION_REFRESH_DEBOUNCE_MS = 150;
241
241
  const PROJECT_REFRESH_DEBOUNCE_MS = 300;
242
242
  const TEAM_REFRESH_THROTTLE_MS = 800;
243
+ const TEAM_MESSAGE_REFRESH_THROTTLE_MS = 150;
243
244
  const TEAM_PRESENCE_REFRESH_THROTTLE_MS = 400;
244
245
  const TEAM_MEMBER_SPAWN_REFRESH_THROTTLE_MS = 500;
245
246
  const TEAM_LIST_REFRESH_THROTTLE_MS = 2000;
@@ -297,7 +298,7 @@ export function initializeNotificationListeners(): () => void {
297
298
  const timer = setTimeout(() => {
298
299
  teamMessageRefreshTimers.delete(teamName);
299
300
  void refreshTrackedTeamMessages(teamName);
300
- }, TEAM_REFRESH_THROTTLE_MS);
301
+ }, TEAM_MESSAGE_REFRESH_THROTTLE_MS);
301
302
  teamMessageRefreshTimers.set(teamName, timer);
302
303
  };
303
304
  const buildToolActivityTimerKey = (
@@ -161,7 +161,7 @@ export const createScheduleSlice: StateCreator<AppState, [], [], ScheduleSlice>
161
161
  startedAt: now,
162
162
  executionStartedAt: now,
163
163
  retryCount: 0,
164
- summary: '正在触发 cc-connect runtime...',
164
+ summary: '正在触发运行时...',
165
165
  },
166
166
  ...(state.scheduleRuns[id] ?? []),
167
167
  ],
@@ -2020,7 +2020,12 @@ export interface TeamSlice {
2020
2020
  fetchTeams: () => Promise<void>;
2021
2021
  fetchAllTasks: () => Promise<void>;
2022
2022
  openTeamsTab: () => void;
2023
- openTeamTab: (teamName: string, projectPath?: string, taskId?: string) => void;
2023
+ openSystemManager: () => Promise<void>;
2024
+ openTeamTab: (
2025
+ teamName: string,
2026
+ projectPath?: string,
2027
+ options?: { taskId?: string; displayName?: string }
2028
+ ) => void;
2024
2029
  clearKanbanFilter: () => void;
2025
2030
  ensureTeamGraphSlotAssignments: (
2026
2031
  teamName: string,
@@ -2726,7 +2731,21 @@ export const createTeamSlice: StateCreator<AppState, [], [], TeamSlice> = (set,
2726
2731
  });
2727
2732
  },
2728
2733
 
2729
- openTeamTab: (teamName: string, projectPath?: string, _taskId?: string) => {
2734
+ openSystemManager: async () => {
2735
+ const manager = await unwrapIpc('team:ensureSystemManager', () =>
2736
+ api.teams.ensureSystemManager()
2737
+ );
2738
+ await get().fetchTeams();
2739
+ get().openTeamTab(manager.teamName, manager.projectPath || manager.workDir, {
2740
+ displayName: manager.displayName,
2741
+ });
2742
+ },
2743
+
2744
+ openTeamTab: (
2745
+ teamName: string,
2746
+ projectPath?: string,
2747
+ options?: { taskId?: string; displayName?: string }
2748
+ ) => {
2730
2749
  if (!teamName.trim()) {
2731
2750
  return;
2732
2751
  }
@@ -2749,7 +2768,8 @@ export const createTeamSlice: StateCreator<AppState, [], [], TeamSlice> = (set,
2749
2768
  const teamSummary = state.teamByName[teamName];
2750
2769
  const selectedTeamDisplayName =
2751
2770
  state.selectedTeamName === teamName ? state.selectedTeamData?.config.name : undefined;
2752
- const displayName = teamSummary?.displayName || selectedTeamDisplayName || teamName;
2771
+ const displayName =
2772
+ options?.displayName || teamSummary?.displayName || selectedTeamDisplayName || teamName;
2753
2773
 
2754
2774
  const allTabs = state.getAllPaneTabs();
2755
2775
  const existing = allTabs.find((tab) => tab.type === 'team' && tab.teamName === teamName);
@@ -3674,12 +3694,10 @@ export const createTeamSlice: StateCreator<AppState, [], [], TeamSlice> = (set,
3674
3694
  page.messages
3675
3695
  );
3676
3696
  const preserveLoadedOlderTail =
3677
- current.olderHydrated &&
3678
- Array.isArray(retainedOlderTail) &&
3679
- retainedOlderTail.length > 0;
3697
+ Array.isArray(retainedOlderTail) && retainedOlderTail.length > 0;
3680
3698
  const nextCanonical = headChanged
3681
3699
  ? preserveLoadedOlderTail
3682
- ? mergeTeamMessages(retainedOlderTail, page.messages)
3700
+ ? mergeTeamMessages(page.messages, retainedOlderTail)
3683
3701
  : page.messages
3684
3702
  : current.canonicalMessages;
3685
3703
  const nextOptimistic = pruneOptimisticMessages(current.optimisticMessages, nextCanonical);
@@ -4368,6 +4386,7 @@ export const createTeamSlice: StateCreator<AppState, [], [], TeamSlice> = (set,
4368
4386
  clearTeamScopedTransientState(teamName);
4369
4387
  set((state) => ({
4370
4388
  ...collectTeamScopedStateRemovals(state, teamName),
4389
+ ...buildTeamScopedProgressTombstones(state, teamName, nowIso()),
4371
4390
  teams: state.teams.filter((team) => team.teamName !== teamName),
4372
4391
  selectedTeamName: state.selectedTeamName === teamName ? null : state.selectedTeamName,
4373
4392
  selectedTeamData: state.selectedTeamName === teamName ? null : state.selectedTeamData,
@@ -4430,118 +4449,20 @@ export const createTeamSlice: StateCreator<AppState, [], [], TeamSlice> = (set,
4430
4449
  },
4431
4450
 
4432
4451
  createTeam: async (request: TeamCreateRequest) => {
4433
- // Ensure provisioning progress subscription is active (defensive).
4434
- get().subscribeProvisioningProgress();
4435
4452
  invalidateTeamLocalStateEpoch(request.teamName);
4436
4453
  clearPendingReplyRefreshTimer(request.teamName);
4437
4454
  clearPendingReplyRefreshWaits(request.teamName);
4438
4455
  clearTeamScopedTransientState(request.teamName);
4439
4456
 
4440
- // Establish a per-team floor so late events from a previous run can't override UI.
4441
- const floor = nowIso();
4442
- set((state) => ({
4443
- provisioningStartedAtFloorByTeam: {
4444
- ...state.provisioningStartedAtFloorByTeam,
4445
- [request.teamName]: floor,
4446
- },
4447
- }));
4448
-
4449
- // Clear stale provisioning runs for this team so the banner starts fresh
4450
- set((state) => {
4451
- const cleaned = { ...state.provisioningRuns };
4452
- for (const [runId, run] of Object.entries(cleaned)) {
4453
- if (run.teamName === request.teamName) {
4454
- delete cleaned[runId];
4455
- }
4456
- }
4457
- const nextErrors = { ...state.provisioningErrorByTeam };
4458
- delete nextErrors[request.teamName];
4459
- const nextSpawnStatuses = { ...state.memberSpawnStatusesByTeam };
4460
- delete nextSpawnStatuses[request.teamName];
4461
- const nextSpawnSnapshots = { ...state.memberSpawnSnapshotsByTeam };
4462
- delete nextSpawnSnapshots[request.teamName];
4463
- const nextRuntime = { ...state.teamAgentRuntimeByTeam };
4464
- delete nextRuntime[request.teamName];
4465
- const nextActiveTools = { ...state.activeToolsByTeam };
4466
- delete nextActiveTools[request.teamName];
4467
- const nextFinishedVisible = { ...state.finishedVisibleByTeam };
4468
- delete nextFinishedVisible[request.teamName];
4469
- const nextToolHistory = { ...state.toolHistoryByTeam };
4470
- delete nextToolHistory[request.teamName];
4471
- const nextRuntimeRunIdByTeam = { ...state.currentRuntimeRunIdByTeam };
4472
- const previousRuntimeRunId = nextRuntimeRunIdByTeam[request.teamName];
4473
- delete nextRuntimeRunIdByTeam[request.teamName];
4474
- const nextIgnoredRuntimeRunIds = previousRuntimeRunId
4475
- ? {
4476
- ...state.ignoredRuntimeRunIds,
4477
- [previousRuntimeRunId]: request.teamName,
4478
- }
4479
- : state.ignoredRuntimeRunIds;
4480
- const visibleLoadingResets = collectTeamScopedVisibleLoadingResets(state, request.teamName);
4481
- return {
4482
- provisioningRuns: cleaned,
4483
- provisioningErrorByTeam: nextErrors,
4484
- memberSpawnStatusesByTeam: nextSpawnStatuses,
4485
- memberSpawnSnapshotsByTeam: nextSpawnSnapshots,
4486
- teamAgentRuntimeByTeam: nextRuntime,
4487
- activeToolsByTeam: nextActiveTools,
4488
- finishedVisibleByTeam: nextFinishedVisible,
4489
- toolHistoryByTeam: nextToolHistory,
4490
- currentRuntimeRunIdByTeam: nextRuntimeRunIdByTeam,
4491
- ignoredProvisioningRunIds: state.ignoredProvisioningRunIds,
4492
- ignoredRuntimeRunIds: nextIgnoredRuntimeRunIds,
4493
- ...visibleLoadingResets,
4494
- };
4495
- });
4496
-
4497
- // Optimistic progress entry: ensures banner shows even if IPC progress is delayed/missed.
4498
- const pendingRunId = `pending:${request.teamName}:${Date.now()}`;
4499
- set((state) => ({
4500
- provisioningRuns: {
4501
- ...state.provisioningRuns,
4502
- [pendingRunId]: {
4503
- runId: pendingRunId,
4504
- teamName: request.teamName,
4505
- state: 'spawning',
4506
- message: '正在启动 Claude CLI 进程...',
4507
- startedAt: floor,
4508
- updatedAt: floor,
4509
- },
4510
- },
4511
- currentProvisioningRunIdByTeam: {
4512
- ...state.currentProvisioningRunIdByTeam,
4513
- [request.teamName]: pendingRunId,
4514
- },
4515
- // Synthetic card for the team list — visible until fetchTeams() picks up the real team.
4516
- provisioningSnapshotByTeam: {
4517
- ...state.provisioningSnapshotByTeam,
4518
- [request.teamName]: {
4519
- teamName: request.teamName,
4520
- displayName: request.displayName || request.teamName,
4521
- description: request.description || '',
4522
- color: request.color,
4523
- memberCount: request.members.length,
4524
- members: request.members.map((m) => ({ name: m.name, role: m.role })),
4525
- taskCount: 0,
4526
- lastActivity: null,
4527
- projectPath: request.cwd || undefined,
4528
- },
4529
- },
4530
- }));
4531
- // Initialize per-team tool approval settings based on skipPermissions flag
4532
- const initialSettings: ToolApprovalSettings =
4533
- request.skipPermissions === false
4534
- ? DEFAULT_TOOL_APPROVAL_SETTINGS
4535
- : { ...DEFAULT_TOOL_APPROVAL_SETTINGS, autoAllowAll: true };
4536
- saveToolApprovalSettingsForTeam(request.teamName, initialSettings);
4537
- set({ toolApprovalSettings: initialSettings });
4538
4457
  try {
4539
4458
  if (typeof api.teams.createTeam !== 'function') {
4540
4459
  throw new Error(
4541
4460
  'Current preload version does not support team:create. Restart the dev app.'
4542
4461
  );
4543
4462
  }
4544
- const response = await unwrapIpc('team:create', () => api.teams.createTeam(request));
4463
+
4464
+ // Just create the team config — no provisioning, no launching.
4465
+ await unwrapIpc('team:create', () => api.teams.createTeam(request));
4545
4466
 
4546
4467
  // Persist per-team launch params (model, effort, limit context)
4547
4468
  const baseModel = extractBaseModel(request.model, request.providerId);
@@ -4554,55 +4475,21 @@ export const createTeamSlice: StateCreator<AppState, [], [], TeamSlice> = (set,
4554
4475
  limitContext: request.limitContext ?? false,
4555
4476
  };
4556
4477
  saveLaunchParams(request.teamName, params);
4557
- set((state) => ({
4558
- launchParamsByTeam: {
4559
- ...state.launchParamsByTeam,
4560
- [request.teamName]: params,
4561
- },
4562
- }));
4563
4478
 
4564
- set((state) => {
4565
- const nextRuns = { ...state.provisioningRuns };
4566
- const pendingRun = nextRuns[pendingRunId];
4567
- const realProgressAlreadyExists = response.runId in nextRuns;
4568
- if (pendingRun) {
4569
- delete nextRuns[pendingRunId];
4570
- // Only use pending data as fallback if real progress events haven't arrived yet.
4571
- // This prevents overwriting real progress (e.g. 'assembling') with stale pending data ('spawning')
4572
- // when the invoke response arrives before IPC progress events.
4573
- if (!realProgressAlreadyExists) {
4574
- nextRuns[response.runId] = { ...pendingRun, runId: response.runId };
4575
- }
4576
- }
4577
- return {
4578
- provisioningRuns: nextRuns,
4579
- currentProvisioningRunIdByTeam: {
4580
- ...state.currentProvisioningRunIdByTeam,
4581
- [request.teamName]: response.runId,
4582
- },
4583
- currentRuntimeRunIdByTeam: {
4584
- ...state.currentRuntimeRunIdByTeam,
4585
- [request.teamName]: response.runId,
4586
- },
4587
- };
4588
- });
4589
- try {
4590
- await get().getProvisioningStatus(response.runId);
4591
- } catch {
4592
- // ignore — polling below will retry
4593
- }
4479
+ // Initialize per-team tool approval settings based on skipPermissions flag
4480
+ const initialSettings: ToolApprovalSettings =
4481
+ request.skipPermissions === false
4482
+ ? DEFAULT_TOOL_APPROVAL_SETTINGS
4483
+ : { ...DEFAULT_TOOL_APPROVAL_SETTINGS, autoAllowAll: true };
4484
+ saveToolApprovalSettingsForTeam(request.teamName, initialSettings);
4485
+
4486
+ // Refresh team list to pick up the new team
4594
4487
  void get().fetchTeams();
4595
- if (get().selectedTeamName === request.teamName) {
4596
- void get().selectTeam(request.teamName, { allowReloadWhileProvisioning: true });
4597
- }
4598
4488
  window.setTimeout(() => {
4599
4489
  void get().fetchTeams();
4600
- if (get().selectedTeamName === request.teamName) {
4601
- void get().selectTeam(request.teamName, { allowReloadWhileProvisioning: true });
4602
- }
4603
4490
  }, 1200);
4604
- void pollProvisioningStatus(get, response.runId);
4605
- return response.runId;
4491
+
4492
+ return request.teamName;
4606
4493
  } catch (error) {
4607
4494
  const message =
4608
4495
  error instanceof IpcError
@@ -4610,22 +4497,12 @@ export const createTeamSlice: StateCreator<AppState, [], [], TeamSlice> = (set,
4610
4497
  : error instanceof Error
4611
4498
  ? error.message
4612
4499
  : 'Failed to create team';
4613
- set((state) => {
4614
- const nextRuns = { ...state.provisioningRuns };
4615
- delete nextRuns[pendingRunId];
4616
- const nextCurrentRunIdByTeam = { ...state.currentProvisioningRunIdByTeam };
4617
- if (nextCurrentRunIdByTeam[request.teamName] === pendingRunId) {
4618
- delete nextCurrentRunIdByTeam[request.teamName];
4619
- }
4620
- return {
4621
- provisioningRuns: nextRuns,
4622
- currentProvisioningRunIdByTeam: nextCurrentRunIdByTeam,
4623
- provisioningErrorByTeam: {
4624
- ...state.provisioningErrorByTeam,
4625
- [request.teamName]: message,
4626
- },
4627
- };
4628
- });
4500
+ set((state) => ({
4501
+ provisioningErrorByTeam: {
4502
+ ...state.provisioningErrorByTeam,
4503
+ [request.teamName]: message,
4504
+ },
4505
+ }));
4629
4506
  throw error;
4630
4507
  }
4631
4508
  },
@@ -12,9 +12,7 @@ export function filterMainScreenCliProviders<
12
12
  providerId: CliProviderId;
13
13
  },
14
14
  >(providers: readonly T[]): T[] {
15
- return providers.filter((provider) =>
16
- ['anthropic', 'codex', 'gemini', 'opencode'].includes(provider.providerId)
17
- );
15
+ return providers.filter((provider) => ['anthropic', 'codex'].includes(provider.providerId));
18
16
  }
19
17
 
20
18
  function createClaudeCodeProviderFromCliStatus(status: CliInstallationStatus): CliProviderStatus {
@@ -110,17 +108,12 @@ export function normalizeCreateLaunchProviderForUi(
110
108
  providerId: TeamProviderId | undefined,
111
109
  _multimodelEnabled: boolean
112
110
  ): TeamProviderId {
113
- return providerId === 'anthropic' ||
114
- providerId === 'codex' ||
115
- providerId === 'gemini' ||
116
- providerId === 'opencode'
117
- ? providerId
118
- : 'anthropic';
111
+ return providerId === 'anthropic' || providerId === 'codex' ? providerId : 'anthropic';
119
112
  }
120
113
 
121
114
  export function isCreateLaunchProviderDisabled(
122
115
  providerId: TeamProviderId,
123
116
  _multimodelEnabled: boolean
124
117
  ): boolean {
125
- return !['anthropic', 'codex', 'gemini', 'opencode'].includes(providerId);
118
+ return !['anthropic', 'codex'].includes(providerId);
126
119
  }
@@ -46,15 +46,9 @@ function hashStringToIndex(str: string): number {
46
46
  export function agentAvatarUrl(name: string, size = 64): string {
47
47
  void size;
48
48
  const normalized = name.trim().toLowerCase();
49
- if (isLeadMemberName(normalized)) {
50
- return LEAD_PARTICIPANT_AVATAR_URL;
51
- }
52
49
 
53
- // Temporarily disabled external avatar API.
54
- // return `https://robohash.org/${encodeURIComponent(name)}?size=${size}x${size}`;
55
- return getParticipantAvatarUrlByIndex(
56
- hashStringToIndex(normalized) % PARTICIPANT_AVATAR_URLS.length
57
- );
50
+ // DiceBear adventurer avatars deterministic per name, no API key needed
51
+ return `https://api.dicebear.com/9.x/adventurer/svg?seed=${encodeURIComponent(normalized)}&backgroundColor=c0aede,d1d4f9,ffd5dc,ffdfbf,b6e3f4,c1f0c1`;
58
52
  }
59
53
 
60
54
  export const STATUS_DOT_COLORS: Record<MemberStatus, string> = {
@@ -804,22 +798,16 @@ export function buildMemberAvatarMap(members: readonly MemberAvatarInput[]): Map
804
798
  const teammateMembers = activeMembers.filter((member) => !isLeadMember(member));
805
799
 
806
800
  for (const [index, member] of leadMembers.entries()) {
807
- map.set(member.name, index === 0 ? LEAD_PARTICIPANT_AVATAR_URL : agentAvatarUrl(member.name));
801
+ map.set(member.name, agentAvatarUrl(member.name));
808
802
  }
809
803
 
810
804
  for (const [index, member] of teammateMembers.entries()) {
811
- map.set(
812
- member.name,
813
- getParticipantAvatarUrlByIndex(1 + (index % (PARTICIPANT_AVATAR_URLS.length - 1)))
814
- );
805
+ map.set(member.name, agentAvatarUrl(member.name));
815
806
  }
816
807
 
817
808
  for (const member of members) {
818
809
  if (!map.has(member.name)) {
819
- map.set(
820
- member.name,
821
- isLeadMember(member) ? LEAD_PARTICIPANT_AVATAR_URL : agentAvatarUrl(member.name)
822
- );
810
+ map.set(member.name, agentAvatarUrl(member.name));
823
811
  }
824
812
  }
825
813
 
@@ -17,6 +17,8 @@ interface OpenCodeRuntimeDeliveryDiagnostics {
17
17
  debugDetails: OpenCodeRuntimeDeliveryDebugDetails | null;
18
18
  }
19
19
 
20
+ const FAILED_WARNING =
21
+ 'OpenCode runtime delivery failed. Message was saved to inbox, but live delivery did not complete.';
20
22
  const PENDING_WARNING =
21
23
  'OpenCode runtime delivery is still being checked. Message was saved and will be retried if needed.';
22
24
 
@@ -33,7 +35,7 @@ export function buildOpenCodeRuntimeDeliveryDiagnostics(
33
35
  const isFailed = runtimeDelivery.delivered === false;
34
36
  if (isFailed) {
35
37
  return {
36
- warning: null,
38
+ warning: FAILED_WARNING,
37
39
  debugDetails: {
38
40
  messageId: result.messageId,
39
41
  providerId: runtimeDelivery.providerId,
@@ -64,7 +66,7 @@ export function buildOpenCodeRuntimeDeliveryDiagnostics(
64
66
  debugDetails: {
65
67
  messageId: result.messageId,
66
68
  providerId: runtimeDelivery.providerId,
67
- delivered: null,
69
+ delivered: typeof runtimeDelivery.delivered === 'boolean' ? runtimeDelivery.delivered : null,
68
70
  responsePending: true,
69
71
  responseState: runtimeDelivery.responseState ?? null,
70
72
  ledgerStatus: runtimeDelivery.ledgerStatus ?? null,
@@ -39,11 +39,6 @@ const CODEX_SLASH_COMMAND_SUGGESTIONS: readonly KnownSlashCommandDefinition[] =
39
39
  command: '/status',
40
40
  description: 'Show session configuration and token usage.',
41
41
  },
42
- {
43
- name: 'mcp',
44
- command: '/mcp',
45
- description: 'List configured MCP tools for this session.',
46
- },
47
42
  {
48
43
  name: 'mention',
49
44
  command: '/mention',
@@ -8,8 +8,10 @@ export function formatNextRun(isoString?: string): string {
8
8
  if (!isoString) return '暂无';
9
9
  try {
10
10
  const date = new Date(isoString);
11
+ const ts = date.getTime();
12
+ if (!Number.isFinite(ts)) return isoString;
11
13
  const now = Date.now();
12
- const diffMs = date.getTime() - now;
14
+ const diffMs = ts - now;
13
15
 
14
16
  if (diffMs < 0) return '已逾期';
15
17
 
@@ -70,7 +70,20 @@ export function filterTeamMessages(
70
70
  const summary = getSanitizedInboxMessageSummary(m).toLowerCase();
71
71
  const from = (m.from ?? '').toLowerCase();
72
72
  const to = (m.to ?? '').toLowerCase();
73
- return text.includes(q) || summary.includes(q) || from.includes(q) || to.includes(q);
73
+ const sessionTitle = (m.session?.title ?? '').toLowerCase();
74
+ const sessionUserName = (m.session?.userName ?? '').toLowerCase();
75
+ const sessionChatName = (m.session?.chatName ?? '').toLowerCase();
76
+ const sessionKey = (m.session?.key ?? '').toLowerCase();
77
+ return (
78
+ text.includes(q) ||
79
+ summary.includes(q) ||
80
+ from.includes(q) ||
81
+ to.includes(q) ||
82
+ sessionTitle.includes(q) ||
83
+ sessionUserName.includes(q) ||
84
+ sessionChatName.includes(q) ||
85
+ sessionKey.includes(q)
86
+ );
74
87
  });
75
88
  }
76
89