Skip to content

Commit 3826412

Browse files
sawkasebastiangeraldes
authored andcommitted
First Cut at a new ProcessViewer Widget (wavetermdev#3137)
1 parent ffe93c7 commit 3826412

17 files changed

Lines changed: 2160 additions & 6 deletions

File tree

frontend/app/block/block.tsx

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
import {
22
BlockComponentModel2,
3-
BlockNodeModel,
43
BlockProps,
54
FullBlockProps,
65
FullSubBlockProps,
76
SubBlockProps,
87
} from "@/app/block/blocktypes";
9-
import type { TabModel } from "@/app/store/tab-model";
108
import { useTabModel } from "@/app/store/tab-model";
119
import { AiFileDiffViewModel } from "@/app/view/aifilediff/aifilediff";
1210
import { LauncherViewModel } from "@/app/view/launcher/launcher";
1311
import { PreviewModel } from "@/app/view/preview/preview-model";
12+
import { ProcessViewerViewModel } from "@/app/view/processviewer/processviewer";
1413
import { TreeViewModel } from "@/app/view/treeview/treeview-model";
1514
import { NotesViewModel } from "@/app/view/notes/notes-model";
1615
import { TodoViewModel } from "@/app/view/todo/todo-model";
@@ -33,10 +32,8 @@ import { TermHistoryViewModel } from "@/view/term/termhistory-model";
3332
import { WaveAiModel } from "@/view/waveai/waveai";
3433
import { WebViewModel } from "@/view/webview/webview";
3534
import clsx from "clsx";
36-
import { atom, useAtomValue } from "jotai";
35+
import { useAtomValue } from "jotai";
3736
import { memo, Suspense, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
38-
import { QuickTipsViewModel } from "../view/quicktipsview/quicktipsview";
39-
import { WaveConfigViewModel } from "../view/waveconfig/waveconfig-model";
4037
import "./block.scss";
4138
import { BlockFrame } from "./blockframe";
4239
import { blockViewToIcon, blockViewToName } from "./blockutil";
@@ -57,6 +54,7 @@ BlockRegistry.set("treeview", TreeViewModel);
5754
BlockRegistry.set("notes", NotesViewModel);
5855
BlockRegistry.set("todo", TodoViewModel);
5956
BlockRegistry.set("termhistory", TermHistoryViewModel);
57+
BlockRegistry.set("processviewer", ProcessViewerViewModel);
6058

6159
function makeViewModel(blockId: string, blockView: string, nodeModel: BlockNodeModel, tabModel: TabModel): ViewModel {
6260
const ctor = BlockRegistry.get(blockView);
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
// Copyright 2026, Command Line Inc.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
import { BlockNodeModel } from "@/app/block/blocktypes";
5+
import type { TabModel } from "@/app/store/tab-model";
6+
import { AiFileDiffViewModel } from "@/app/view/aifilediff/aifilediff";
7+
import { LauncherViewModel } from "@/app/view/launcher/launcher";
8+
import { PreviewModel } from "@/app/view/preview/preview-model";
9+
import { ProcessViewerViewModel } from "@/app/view/processviewer/processviewer";
10+
import { SysinfoViewModel } from "@/app/view/sysinfo/sysinfo";
11+
import { TsunamiViewModel } from "@/app/view/tsunami/tsunami";
12+
import { VDomModel } from "@/app/view/vdom/vdom-model";
13+
import { WaveEnv } from "@/app/waveenv/waveenv";
14+
import { atom } from "jotai";
15+
import { QuickTipsViewModel } from "../view/quicktipsview/quicktipsview";
16+
import { WaveConfigViewModel } from "../view/waveconfig/waveconfig-model";
17+
import { blockViewToIcon, blockViewToName } from "./blockutil";
18+
import { HelpViewModel } from "@/view/helpview/helpview";
19+
import { TermViewModel } from "@/view/term/term-model";
20+
import { WaveAiModel } from "@/view/waveai/waveai";
21+
import { WebViewModel } from "@/view/webview/webview";
22+
23+
const BlockRegistry: Map<string, ViewModelClass> = new Map();
24+
BlockRegistry.set("term", TermViewModel);
25+
BlockRegistry.set("preview", PreviewModel);
26+
BlockRegistry.set("web", WebViewModel);
27+
BlockRegistry.set("waveai", WaveAiModel);
28+
BlockRegistry.set("cpuplot", SysinfoViewModel);
29+
BlockRegistry.set("sysinfo", SysinfoViewModel);
30+
BlockRegistry.set("vdom", VDomModel);
31+
BlockRegistry.set("tips", QuickTipsViewModel);
32+
BlockRegistry.set("help", HelpViewModel);
33+
BlockRegistry.set("launcher", LauncherViewModel);
34+
BlockRegistry.set("tsunami", TsunamiViewModel);
35+
BlockRegistry.set("aifilediff", AiFileDiffViewModel);
36+
BlockRegistry.set("waveconfig", WaveConfigViewModel);
37+
BlockRegistry.set("processviewer", ProcessViewerViewModel);
38+
39+
function makeDefaultViewModel(viewType: string): ViewModel {
40+
const viewModel: ViewModel = {
41+
viewType: viewType,
42+
viewIcon: atom(blockViewToIcon(viewType)),
43+
viewName: atom(blockViewToName(viewType)),
44+
preIconButton: atom(null),
45+
endIconButtons: atom(null),
46+
viewComponent: null,
47+
};
48+
return viewModel;
49+
}
50+
51+
function makeViewModel(
52+
blockId: string,
53+
blockView: string,
54+
nodeModel: BlockNodeModel,
55+
tabModel: TabModel,
56+
waveEnv: WaveEnv
57+
): ViewModel {
58+
const ctor = BlockRegistry.get(blockView);
59+
if (ctor != null) {
60+
return new ctor({ blockId, nodeModel, tabModel, waveEnv });
61+
}
62+
return makeDefaultViewModel(blockView);
63+
}
64+
65+
export { makeViewModel };

frontend/app/block/blockutil.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@ export function blockViewToIcon(view: string): string {
7272
if (view == "tips") {
7373
return "lightbulb";
7474
}
75+
if (view == "processviewer") {
76+
return "microchip";
77+
}
7578
return "square";
7679
}
7780

@@ -97,6 +100,9 @@ export function blockViewToName(view: string): string {
97100
if (view == "tips") {
98101
return "Tips";
99102
}
103+
if (view == "processviewer") {
104+
return "Processes";
105+
}
100106
return view;
101107
}
102108

frontend/app/store/wshclientapi.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -587,6 +587,18 @@ class RpcApiType {
587587
return client.wshRpcCall("remotemkdir", data, opts);
588588
}
589589

590+
// command "remoteprocesslist" [call]
591+
RemoteProcessListCommand(client: WshClient, data: CommandRemoteProcessListData, opts?: RpcOpts): Promise<ProcessListResponse> {
592+
if (this.mockClient) return this.mockClient.mockWshRpcCall(client, "remoteprocesslist", data, opts);
593+
return client.wshRpcCall("remoteprocesslist", data, opts);
594+
}
595+
596+
// command "remoteprocesssignal" [call]
597+
RemoteProcessSignalCommand(client: WshClient, data: CommandRemoteProcessSignalData, opts?: RpcOpts): Promise<void> {
598+
if (this.mockClient) return this.mockClient.mockWshRpcCall(client, "remoteprocesssignal", data, opts);
599+
return client.wshRpcCall("remoteprocesssignal", data, opts);
600+
}
601+
590602
// command "remotereconnecttojobmanager" [call]
591603
RemoteReconnectToJobManagerCommand(client: WshClient, data: CommandRemoteReconnectToJobManagerData, opts?: RpcOpts): Promise<CommandRemoteReconnectToJobManagerRtnData> {
592604
return client.wshRpcCall("remotereconnecttojobmanager", data, opts);

0 commit comments

Comments
 (0)