feat: Stream consumer groups UI

- stream.ts: streamGroups, streamConsumers, streamGroupCreate, streamGroupDestroy, streamAck
- IPC: redis:streamGroups, streamConsumers, streamGroupCreate, streamGroupDestroy, streamAck
- Preload bridge + types for all new methods
- StreamEditor.vue: collapsible consumer groups panel
  - XINFO GROUPS table with name/consumers/pending/last-delivered-id
  - Click group to expand XINFO CONSUMERS
  - Create group dialog (name, start ID, MKSTREAM)
  - Destroy group with confirm
- i18n keys (zh-CN + en)
- P1 complete!
This commit is contained in:
2026-07-07 21:22:12 +08:00
parent 00c11d4dfe
commit cdadfbe5e4
8 changed files with 379 additions and 4 deletions
+11
View File
@@ -105,6 +105,17 @@ const electronAPI = {
ipcRenderer.invoke('redis:streamTrim', id, key, maxLen),
streamDel: (id: string, key: string, ids: string[]): Promise<number> =>
ipcRenderer.invoke('redis:streamDel', id, key, ids),
// Stream consumer groups
streamGroups: (id: string, key: string): Promise<any[]> =>
ipcRenderer.invoke('redis:streamGroups', id, key),
streamConsumers: (id: string, key: string, group: string): Promise<any[]> =>
ipcRenderer.invoke('redis:streamConsumers', id, key, group),
streamGroupCreate: (id: string, key: string, group: string, startId: string, mkstream: boolean): Promise<any> =>
ipcRenderer.invoke('redis:streamGroupCreate', id, key, group, startId, mkstream),
streamGroupDestroy: (id: string, key: string, group: string): Promise<number> =>
ipcRenderer.invoke('redis:streamGroupDestroy', id, key, group),
streamAck: (id: string, key: string, group: string, ids: string[]): Promise<number> =>
ipcRenderer.invoke('redis:streamAck', id, key, group, ids),
// Key ops
renameKey: (id: string, oldKey: string, newKey: string): Promise<void> =>
ipcRenderer.invoke('redis:renameKey', id, oldKey, newKey),