Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
e8cfb93
Merge pull request #1 from wavetermdev/main
somatothing Mar 24, 2026
1a655e8
feat: add 5 financial/DeFi widgets in frontend/widgets/ directory
Copilot Mar 24, 2026
5a5da16
fix: address code review issues - dedicated history tabs and position…
Copilot Mar 24, 2026
13a207d
feat: attach DeFi widgets to main app - launcher entries, mock env bl…
Copilot Mar 25, 2026
4e7153b
Add AI-Assisted Code Editor widget
Copilot Mar 25, 2026
db1ce2a
feat: add Container Manager widget
Copilot Mar 25, 2026
63e2bc8
Add Shell Programmable Workflows widget
Copilot Mar 25, 2026
55f2687
Add ML Model Training & Evaluation widget
Copilot Mar 25, 2026
9cb3d41
feat: add 5 new widgets - codeeditor, containers, shellworkflow, mlmo…
Copilot Mar 25, 2026
1228ac1
docs: add REALTIME_DATA_TODO.md — live data migration plan for all 10…
Copilot Mar 25, 2026
323d614
Changes before error encountered
Copilot Mar 25, 2026
22a5abc
refactor(widgets): replace mock/demo data with real production integr…
Copilot Mar 25, 2026
0258996
refactor(widgets): address code review - clarity and docs
Copilot Mar 25, 2026
9af4869
fix(widgets): remove all Math.random() simulation from widget models
Copilot Mar 26, 2026
9867e75
feat(widgets): add on-chain price reads, arb engine, Balancer & Morph…
Copilot Mar 26, 2026
bdbd0d6
fix(widgets): correct Balancer ETH/USDC pool ID address spelling
Copilot Mar 26, 2026
b1222a6
fix(widgets): remove all mock data - empty initial states, drop MOCK_…
Copilot Mar 26, 2026
16aadad
fix(ammliquidity): wire Balancer subgraph liquidity hooks, remove all…
Copilot Mar 26, 2026
7641e83
fix(widgets): wire live data pipelines — remove all remaining mock ge…
Copilot Mar 26, 2026
74b4dcc
Apply all 12 reviewer fixes: balancer price formula, arb profit/pct, …
Copilot Mar 26, 2026
765e332
ammliquidity: use CoinGecko token icon images; balancer: replace The …
Copilot Mar 27, 2026
f25653a
Merge pull request #3 from somatothing/copilot/add-widgets-for-tradin…
somatothing Mar 27, 2026
e7c22ed
Merge branch 'main' into main
somatothing Mar 27, 2026
4f2ce76
ci: deploy preview app to GitHub Pages at /preview/
Copilot Mar 27, 2026
9df4aed
ci: use npx --no-install for preview build step
Copilot Mar 27, 2026
5f29b1d
Merge pull request #4 from somatothing/copilot/deploy-to-pages
somatothing Mar 27, 2026
3c57849
fix: correct Vite base path and asset hrefs for GitHub Pages deployment
Copilot Mar 27, 2026
23da598
Merge pull request #5 from somatothing/copilot/fix-white-page-deployment
somatothing Mar 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .github/workflows/deploy-docsite.yml
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,9 @@ jobs:
timeout_minutes: 5
- name: Build docsite
run: task docsite:build:public
- name: Build preview app
run: npx --no-install vite build --base /${{ github.event.repository.name }}/preview/ --outDir ../../docs/build/preview
working-directory: frontend/preview
- name: Upload Build Artifact
# Only upload the build artifact when pushed to the main branch
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
Expand Down
5 changes: 5 additions & 0 deletions frontend/app/block/block.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ import { atom, useAtomValue } from "jotai";
import { memo, Suspense, useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
import { QuickTipsViewModel } from "../view/quicktipsview/quicktipsview";
import { WaveConfigViewModel } from "../view/waveconfig/waveconfig-model";
import { WIDGET_REGISTRY_ENTRIES } from "@/widgets/index";
import "./block.scss";
import { BlockEnv } from "./blockenv";
import { BlockFrame } from "./blockframe";
Expand All @@ -54,6 +55,10 @@ BlockRegistry.set("launcher", LauncherViewModel);
BlockRegistry.set("tsunami", TsunamiViewModel);
BlockRegistry.set("aifilediff", AiFileDiffViewModel);
BlockRegistry.set("waveconfig", WaveConfigViewModel);
// Register financial/DeFi widgets (defined in frontend/widgets/)
for (const [viewType, cls] of WIDGET_REGISTRY_ENTRIES) {
BlockRegistry.set(viewType, cls);
}

function makeViewModel(
blockId: string,
Expand Down
14 changes: 7 additions & 7 deletions frontend/preview/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="color-scheme" content="dark" />
<title>Wave Preview Server</title>
<link rel="icon" type="image/png" href="/logos/wave-logo-256.png" />
<link rel="stylesheet" href="/fontawesome/css/fontawesome.min.css" />
<link rel="stylesheet" href="/fontawesome/css/brands.min.css" />
<link rel="stylesheet" href="/fontawesome/css/solid.min.css" />
<link rel="stylesheet" href="/fontawesome/css/sharp-solid.min.css" />
<link rel="stylesheet" href="/fontawesome/css/sharp-regular.min.css" />
<link rel="stylesheet" href="/fontawesome/css/custom-icons.min.css" />
<link rel="icon" type="image/png" href="./logos/wave-logo-256.png" />
<link rel="stylesheet" href="./fontawesome/css/fontawesome.min.css" />
<link rel="stylesheet" href="./fontawesome/css/brands.min.css" />
<link rel="stylesheet" href="./fontawesome/css/solid.min.css" />
<link rel="stylesheet" href="./fontawesome/css/sharp-solid.min.css" />
<link rel="stylesheet" href="./fontawesome/css/sharp-regular.min.css" />
<link rel="stylesheet" href="./fontawesome/css/custom-icons.min.css" />
</head>
<body class="init" data-colorscheme="dark">
<div id="main" class="flex flex-col w-full h-full"></div>
Expand Down
72 changes: 71 additions & 1 deletion frontend/preview/mock/mockwaveenv.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,16 @@ export const PreviewWorkspaceId = crypto.randomUUID();
export const PreviewClientId = crypto.randomUUID();
export const WebBlockId = crypto.randomUUID();
export const SysinfoBlockId = crypto.randomUUID();
export const TradingAlgoBotBlockId = crypto.randomUUID();
export const ArbitrageBotBlockId = crypto.randomUUID();
export const DeFiLendingBlockId = crypto.randomUUID();
export const FlashLoanBlockId = crypto.randomUUID();
export const AmmLiquidityBlockId = crypto.randomUUID();
export const CodeEditorBlockId = crypto.randomUUID();
export const ContainersBlockId = crypto.randomUUID();
export const ShellWorkflowBlockId = crypto.randomUUID();
export const MLModelBlockId = crypto.randomUUID();
export const WidgetBuilderBlockId = crypto.randomUUID();

// What works "out of the box" in the mock environment (no MockEnv overrides needed):
//
Expand Down Expand Up @@ -388,7 +398,7 @@ export function makeMockWaveEnv(mockEnv?: MockEnv): MockWaveEnv {
oid: PreviewTabId,
version: 1,
name: "Preview Tab",
blockids: [WebBlockId, SysinfoBlockId],
blockids: [WebBlockId, SysinfoBlockId, TradingAlgoBotBlockId, ArbitrageBotBlockId, DeFiLendingBlockId, FlashLoanBlockId, AmmLiquidityBlockId, CodeEditorBlockId, ContainersBlockId, ShellWorkflowBlockId, MLModelBlockId, WidgetBuilderBlockId],
meta: {},
} as Tab,
[`block:${WebBlockId}`]: {
Expand All @@ -410,6 +420,66 @@ export function makeMockWaveEnv(mockEnv?: MockEnv): MockWaveEnv {
"graph:numpoints": 90,
},
} as Block,
[`block:${TradingAlgoBotBlockId}`]: {
otype: "block",
oid: TradingAlgoBotBlockId,
version: 1,
meta: { view: "tradingalgobot" },
} as Block,
[`block:${ArbitrageBotBlockId}`]: {
otype: "block",
oid: ArbitrageBotBlockId,
version: 1,
meta: { view: "arbitragebot" },
} as Block,
[`block:${DeFiLendingBlockId}`]: {
otype: "block",
oid: DeFiLendingBlockId,
version: 1,
meta: { view: "defilending" },
} as Block,
[`block:${FlashLoanBlockId}`]: {
otype: "block",
oid: FlashLoanBlockId,
version: 1,
meta: { view: "flashloan" },
} as Block,
[`block:${AmmLiquidityBlockId}`]: {
otype: "block",
oid: AmmLiquidityBlockId,
version: 1,
meta: { view: "ammliquidity" },
} as Block,
[`block:${CodeEditorBlockId}`]: {
otype: "block",
oid: CodeEditorBlockId,
version: 1,
meta: { view: "codeeditor" },
} as Block,
[`block:${ContainersBlockId}`]: {
otype: "block",
oid: ContainersBlockId,
version: 1,
meta: { view: "containers" },
} as Block,
[`block:${ShellWorkflowBlockId}`]: {
otype: "block",
oid: ShellWorkflowBlockId,
version: 1,
meta: { view: "shellworkflow" },
} as Block,
[`block:${MLModelBlockId}`]: {
otype: "block",
oid: MLModelBlockId,
version: 1,
meta: { view: "mlmodel" },
} as Block,
[`block:${WidgetBuilderBlockId}`]: {
otype: "block",
oid: WidgetBuilderBlockId,
version: 1,
meta: { view: "widgetbuilder" },
} as Block,
};
const defaultAtoms: Partial<GlobalAtomsType> = {
uiContext: atom({ windowid: PreviewWindowId, activetabid: PreviewTabId } as UIContext),
Expand Down
124 changes: 124 additions & 0 deletions frontend/preview/previews/defi-widgets.preview.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
// Copyright 2026, Command Line Inc.
// SPDX-License-Identifier: Apache-2.0

import { Block } from "@/app/block/block";
import * as React from "react";
import { makeMockNodeModel } from "../mock/mock-node-model";
import {
AmmLiquidityBlockId,
ArbitrageBotBlockId,
CodeEditorBlockId,
ContainersBlockId,
DeFiLendingBlockId,
FlashLoanBlockId,
MLModelBlockId,
ShellWorkflowBlockId,
TradingAlgoBotBlockId,
WidgetBuilderBlockId,
} from "../mock/mockwaveenv";

type WidgetEntry = {
label: string;
blockId: string;
width: string;
height: string;
};

const WIDGETS: WidgetEntry[] = [
{
label: "Trading Algobot — Hyperliquid + ONNX/Joblib ML",
blockId: TradingAlgoBotBlockId,
width: "1100px",
height: "640px",
},
{
label: "Arbitrage Bot — Triangular Arb on Arbitrum + ML",
blockId: ArbitrageBotBlockId,
width: "1100px",
height: "580px",
},
{
label: "DeFi Lending — Supply / Borrow / Collateral Swap Repay + ML",
blockId: DeFiLendingBlockId,
width: "1100px",
height: "640px",
},
{
label: "Flash Loan — Arbitrage Portfolio Rebalancer",
blockId: FlashLoanBlockId,
width: "1100px",
height: "620px",
},
{
label: "AMM Liquidity Pools — Uniswap V3 / Camelot / Curve / Balancer",
blockId: AmmLiquidityBlockId,
width: "1100px",
height: "640px",
},
{
label: "Code Editor — AI-Assisted, Multi-Language + Autocompletion",
blockId: CodeEditorBlockId,
width: "1100px",
height: "660px",
},
{
label: "Containers — Docker/K8s Manager with Logs, Metrics, Shell Exec",
blockId: ContainersBlockId,
width: "1100px",
height: "640px",
},
{
label: "Shell Workflows — Programmable Button-Triggered Pipelines",
blockId: ShellWorkflowBlockId,
width: "1100px",
height: "640px",
},
{
label: "ML Model — Training / Eval / Retrain (GBM, LR, NN, RF, NumpyLogistics) + ONNX/Joblib",
blockId: MLModelBlockId,
width: "1100px",
height: "680px",
},
{
label: "Widget Builder — AI Chat + Storage + DB Query + HTTP Station",
blockId: WidgetBuilderBlockId,
width: "1100px",
height: "660px",
},
];

function WidgetPreviewBlock({ entry }: { entry: WidgetEntry }) {
const nodeModel = React.useMemo(
() =>
makeMockNodeModel({
nodeId: `preview-${entry.blockId}-node`,
blockId: entry.blockId,
innerRect: { width: entry.width, height: entry.height },
}),
[entry.blockId]
);

return (
<div className="flex w-full max-w-[1160px] flex-col gap-2 px-6">
<div className="text-xs text-muted font-mono">{entry.label}</div>
<div className="rounded-md border border-border bg-panel p-4">
<div style={{ height: entry.height, width: "100%" }}>
<Block preview={false} nodeModel={nodeModel} />
</div>
</div>
</div>
);
}

export default function DeFiWidgetsPreview() {
return (
<div className="flex flex-col gap-12 py-8 items-center w-full">
<div className="text-sm text-foreground font-mono font-semibold">
DeFi / Financial + Platform Widgets — Preview
</div>
{WIDGETS.map((entry) => (
<WidgetPreviewBlock key={entry.blockId} entry={entry} />
))}
</div>
);
}
Loading