Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
497c3b1
Harden bridge lockbox settlement spine
FlowmemoryAI May 13, 2026
d132f4e
Build bridge relayer credit handoff smoke
FlowmemoryAI May 13, 2026
19eb0ef
Expand FlowChain workbench live console
FlowmemoryAI May 13, 2026
55cbbc8
Extend local control plane API
FlowmemoryAI May 13, 2026
82dd8fd
Add FlowChain local wallet envelopes
FlowmemoryAI May 13, 2026
7f6a44c
Add full L1 HQ integration status
FlowmemoryAI May 13, 2026
40d9ac9
Add FlowChain local node runtime
FlowmemoryAI May 13, 2026
13da1e7
Add FlowRouter control-plane signal handoff
FlowmemoryAI May 13, 2026
a588ad9
Merge remote-tracking branch 'origin/agent/full-l1-contracts' into in…
FlowmemoryAI May 13, 2026
29e48a2
Merge remote-tracking branch 'origin/agent/full-l1-crypto-wallet' int…
FlowmemoryAI May 13, 2026
727d873
Merge remote-tracking branch 'origin/agent/full-l1-runtime' into inte…
FlowmemoryAI May 13, 2026
71c130b
Merge remote-tracking branch 'origin/agent/full-l1-control-plane' int…
FlowmemoryAI May 13, 2026
0c35fba
Merge remote-tracking branch 'origin/agent/full-l1-bridge' into integ…
FlowmemoryAI May 13, 2026
e02def6
Merge remote-tracking branch 'origin/agent/full-l1-workbench' into in…
FlowmemoryAI May 13, 2026
fec5cd1
Merge remote-tracking branch 'origin/agent/full-l1-hardware' into int…
FlowmemoryAI May 13, 2026
bab430f
Merge remote-tracking branch 'origin/agent/full-l1-hq-integration' in…
FlowmemoryAI May 13, 2026
623d6ba
Fix full L1 integration smoke
FlowmemoryAI May 13, 2026
e20676f
Stabilize control-plane bridge count assertion
FlowmemoryAI May 13, 2026
acb9d7e
Merge main into full L1 integration
FlowmemoryAI May 13, 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
15 changes: 15 additions & 0 deletions apps/dashboard/public/data/flowchain-bridge-test-deposit.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"schema": "flowmemory.bridge_deposit.v0",
"depositId": "0x7e3a7f7ab7dc9b07d762c1f2fce315cf0c08f1a7e854b4dbcb2359efcb9cb269",
"sourceChainId": 84532,
"sourceContract": "0x1111111111111111111111111111111111111111",
"txHash": "0x2222222222222222222222222222222222222222222222222222222222222222",
"logIndex": 0,
"token": "0x3333333333333333333333333333333333333333",
"amount": "20000000",
"sender": "0x4444444444444444444444444444444444444444",
"flowchainRecipient": "0x5555555555555555555555555555555555555555555555555555555555555555",
"nonce": "1",
"metadataHash": "0x6666666666666666666666666666666666666666666666666666666666666666",
"status": "observed"
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,26 +29,28 @@
"uriHint": "fixture://artifact/demo/001"
}
},
"balanceTransfers": {},
"baseAnchors": {
"0xd1112ed01fdf86d0caa079d7668a5c3e0482f6da36d8831f1e12a21bf2a77885": {
"0x7dd81dfdeac346efaef81a3d62e064ab7b5ec4f00f2e2c0fd19745d876ae438d": {
"agentAccountRoot": "0xcf31230bfff347f79e19a55f4d1ff5fa486b0b1ad4754ce22b93de4b259a3ca7",
"anchorId": "0xd1112ed01fdf86d0caa079d7668a5c3e0482f6da36d8831f1e12a21bf2a77885",
"anchorId": "0x7dd81dfdeac346efaef81a3d62e064ab7b5ec4f00f2e2c0fd19745d876ae438d",
"appchainChainId": "flowmemory-local-devnet-v0",
"artifactAvailabilityProofRoot": "0xfb4b693c45014aae0947f35696e9d864e7b26ac6fd39c1df5edb3e0dcf9bd928",
"artifactCommitmentRoot": "0xb772a9f7273032fd3ba2da8b6476d4715bbbafbd2a7eed21ecd0d558bde3beab",
"balanceTransferRoot": "0x9b6e249f769a93bc9f34a90156e028d1a830badcd8ccdc5b1487d512cdbf0a6d",
"blockRangeEnd": 1,
"blockRangeStart": 1,
"challengeRoot": "0x16da3d2bf2dcd801bc5deb3987dc01342cb957031ad01408ea77bf5d1583656f",
"faucetRecordRoot": "0x2277503a52fab3f9e49b40debfb7d641abee75cf268aa56da403fdcf4fad6cee",
"finalityReceiptRoot": "0x990b60fd5f91eb725b65d36a1324e00be255daaa4bc0fbbe163343c3934b120a",
"finalityReceiptRoot": "0xb2d8234d12f255669267722c21a3841257ca49f304863a7145e7e708a47b3132",
"finalityStatus": "local-placeholder",
"localTestUnitBalanceRoot": "0x167041ef195b5dde2d2cade6ecb26c9a0a596e9ed21ff7bfb02d33c9d2be8d15",
"memoryCellRoot": "0x1b4e91099dd8d867201bd880437197ae6c031e538341aaa3cd2046e5706a2c25",
"modelPassportRoot": "0x326aa6b0b372d29d24d747fe0879adfd7aaea206373b24ae2ab77d56357e9529",
"operatorKeyReferenceRoot": "0x8457aa3ed0f4238834a8f3925f25ccca805828d8427c3ef67590a45659b22a40",
"previousAnchorId": "0x0000000000000000000000000000000000000000000000000000000000000000",
"rootfieldStateRoot": "0xb72a851dca1103410484e3272945bae5e87fc39b8f32f77d2991959b60d3bfbf",
"stateRoot": "0xd4bf806a2f91cd8255b2c55db91cb59c9f941d9ec92614dcb86dbd926184630c",
"stateRoot": "0x01313a55fdb9736570aa707b5ebf030fc1bf4212df721f7bb17612ad5de2502a",
"verifierModuleRoot": "0xd6ddd8a2d0f5812d64679656c69983a2e0aecd36bd36199d900245658ae4626c",
"verifierReportRoot": "0x4facd21e55423e182eba87355482a35daa93f53190fbd3a8d2969f9d55bc5373",
"workReceiptRoot": "0x8b3ef5650c9eea2f608ad9c7cb73df3c289fc0ac72ed04f46e6ae4bce0a1f023"
Expand Down Expand Up @@ -88,7 +90,7 @@
"finalizedBy": "operator:local-demo",
"receiptId": "receipt:demo:001",
"rootfieldId": "rootfield:demo:alpha",
"stateRoot": "0x2cff83eaf83ea3ae2e9b248ca6ac2b32e23fa3f9ca067c4a9c93e72ef5679d33"
"stateRoot": "0x9a04c063ceb652a89bcdeba147cc36ceeecce9e8a0c6161a5d13b6363a9b5af2"
}
},
"genesisConfig": {
Expand Down Expand Up @@ -121,10 +123,11 @@
"agentAccountRoot": "0xcf31230bfff347f79e19a55f4d1ff5fa486b0b1ad4754ce22b93de4b259a3ca7",
"artifactAvailabilityProofRoot": "0xfb4b693c45014aae0947f35696e9d864e7b26ac6fd39c1df5edb3e0dcf9bd928",
"artifactCommitmentRoot": "0xb772a9f7273032fd3ba2da8b6476d4715bbbafbd2a7eed21ecd0d558bde3beab",
"baseAnchorRoot": "0x0f455d919de2d313e88c276b687975249bf3ce53c9cedc27c012a85bcbf0b946",
"balanceTransferRoot": "0x9b6e249f769a93bc9f34a90156e028d1a830badcd8ccdc5b1487d512cdbf0a6d",
"baseAnchorRoot": "0x50b8b39f15d742afe3efbffc0754fd2956464462de9677e79e00a4736ced8dba",
"challengeRoot": "0x16da3d2bf2dcd801bc5deb3987dc01342cb957031ad01408ea77bf5d1583656f",
"faucetRecordRoot": "0x2277503a52fab3f9e49b40debfb7d641abee75cf268aa56da403fdcf4fad6cee",
"finalityReceiptRoot": "0x990b60fd5f91eb725b65d36a1324e00be255daaa4bc0fbbe163343c3934b120a",
"finalityReceiptRoot": "0xb2d8234d12f255669267722c21a3841257ca49f304863a7145e7e708a47b3132",
"importedObservationRoot": "0x99cb1b939d5a09f800f72e4c5a2b92988571126e1f6f93549f4893b3f7de7880",
"importedVerifierReportRoot": "0x6070b1015f000dd509c7b276d2ad68d8a9d188ef1a961c2f573346eb75ea5ad7",
"localTestUnitBalanceRoot": "0x167041ef195b5dde2d2cade6ecb26c9a0a596e9ed21ff7bfb02d33c9d2be8d15",
Expand Down Expand Up @@ -190,7 +193,7 @@
}
},
"schema": "flowmemory.dashboard_state.local_devnet.v0",
"stateRoot": "0x55cab7c41a999da527bdd026a772edb5e4804b070014cccc72622e09ce3e699f",
"stateRoot": "0x00ab998a4d1f28200177680699c941b06ee536c0b70a1b35e20849de241740c0",
"verifierModules": {
"verifier:local-demo": {
"active": true,
Expand Down
24 changes: 13 additions & 11 deletions apps/dashboard/public/data/flowchain-local-devnet-state.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
"genesisHash": "0x0f23c892cbd2d00c10839d97ddab833698a83f8df8d6df27ceac03cfdd4b7bc9",
"nextBlockNumber": 3,
"logicalTime": 1778688002,
"parentHash": "0xeca4065a019501355c54c1d7ecc4859e4be6355c9ccaa2ce7188822bebc88c82",
"parentHash": "0x6fc3297759b76c4c907d7590525390ae77af11a1db76c6383fb016a289e2600b",
"operatorKeyReferences": {
"operator-key:local-devnet:alpha": {
"schema": "flowmemory.local_devnet.operator_key_reference.v0",
Expand Down Expand Up @@ -81,6 +81,7 @@
"noValue": true
}
},
"balanceTransfers": {},
"modelPassports": {
"model:demo:local-alpha": {
"modelPassportId": "model:demo:local-alpha",
Expand Down Expand Up @@ -127,7 +128,7 @@
"finalityStatus": "finalized",
"challengeCount": 1,
"finalizedAtBlock": 1,
"stateRoot": "0x2cff83eaf83ea3ae2e9b248ca6ac2b32e23fa3f9ca067c4a9c93e72ef5679d33"
"stateRoot": "0x9a04c063ceb652a89bcdeba147cc36ceeecce9e8a0c6161a5d13b6363a9b5af2"
}
},
"artifactCommitments": {
Expand Down Expand Up @@ -185,12 +186,12 @@
"importedObservations": {},
"importedVerifierReports": {},
"baseAnchors": {
"0xd1112ed01fdf86d0caa079d7668a5c3e0482f6da36d8831f1e12a21bf2a77885": {
"anchorId": "0xd1112ed01fdf86d0caa079d7668a5c3e0482f6da36d8831f1e12a21bf2a77885",
"0x7dd81dfdeac346efaef81a3d62e064ab7b5ec4f00f2e2c0fd19745d876ae438d": {
"anchorId": "0x7dd81dfdeac346efaef81a3d62e064ab7b5ec4f00f2e2c0fd19745d876ae438d",
"appchainChainId": "flowmemory-local-devnet-v0",
"blockRangeStart": 1,
"blockRangeEnd": 1,
"stateRoot": "0xd4bf806a2f91cd8255b2c55db91cb59c9f941d9ec92614dcb86dbd926184630c",
"stateRoot": "0x01313a55fdb9736570aa707b5ebf030fc1bf4212df721f7bb17612ad5de2502a",
"workReceiptRoot": "0x8b3ef5650c9eea2f608ad9c7cb73df3c289fc0ac72ed04f46e6ae4bce0a1f023",
"verifierReportRoot": "0x4facd21e55423e182eba87355482a35daa93f53190fbd3a8d2969f9d55bc5373",
"rootfieldStateRoot": "0xb72a851dca1103410484e3272945bae5e87fc39b8f32f77d2991959b60d3bfbf",
Expand All @@ -199,10 +200,11 @@
"agentAccountRoot": "0xcf31230bfff347f79e19a55f4d1ff5fa486b0b1ad4754ce22b93de4b259a3ca7",
"localTestUnitBalanceRoot": "0x167041ef195b5dde2d2cade6ecb26c9a0a596e9ed21ff7bfb02d33c9d2be8d15",
"faucetRecordRoot": "0x2277503a52fab3f9e49b40debfb7d641abee75cf268aa56da403fdcf4fad6cee",
"balanceTransferRoot": "0x9b6e249f769a93bc9f34a90156e028d1a830badcd8ccdc5b1487d512cdbf0a6d",
"modelPassportRoot": "0x326aa6b0b372d29d24d747fe0879adfd7aaea206373b24ae2ab77d56357e9529",
"memoryCellRoot": "0x1b4e91099dd8d867201bd880437197ae6c031e538341aaa3cd2046e5706a2c25",
"challengeRoot": "0x16da3d2bf2dcd801bc5deb3987dc01342cb957031ad01408ea77bf5d1583656f",
"finalityReceiptRoot": "0x990b60fd5f91eb725b65d36a1324e00be255daaa4bc0fbbe163343c3934b120a",
"finalityReceiptRoot": "0xb2d8234d12f255669267722c21a3841257ca49f304863a7145e7e708a47b3132",
"artifactAvailabilityProofRoot": "0xfb4b693c45014aae0947f35696e9d864e7b26ac6fd39c1df5edb3e0dcf9bd928",
"verifierModuleRoot": "0xd6ddd8a2d0f5812d64679656c69983a2e0aecd36bd36199d900245658ae4626c",
"previousAnchorId": "0x0000000000000000000000000000000000000000000000000000000000000000",
Expand Down Expand Up @@ -309,13 +311,13 @@
"error": null
}
],
"stateRoot": "0xd4bf806a2f91cd8255b2c55db91cb59c9f941d9ec92614dcb86dbd926184630c",
"blockHash": "0x78c6b0c6b56eae99d2d693878a2239620c713cff50fcb94ba6df3fc6ed08be56"
"stateRoot": "0x01313a55fdb9736570aa707b5ebf030fc1bf4212df721f7bb17612ad5de2502a",
"blockHash": "0xb2251f1db0005e7e665f849a1f0bc2de35f65b263cb4d7aaa870f73f9551eb5c"
},
{
"schema": "flowmemory.local_devnet.block.v0",
"blockNumber": 2,
"parentHash": "0x78c6b0c6b56eae99d2d693878a2239620c713cff50fcb94ba6df3fc6ed08be56",
"parentHash": "0xb2251f1db0005e7e665f849a1f0bc2de35f65b263cb4d7aaa870f73f9551eb5c",
"logicalTime": 1778688001,
"txIds": [
"0x8f719c880f17b5d4fb6d9efd54ac276d0dd8050d11c2c7870c36a79b66bc49d7"
Expand All @@ -327,8 +329,8 @@
"error": null
}
],
"stateRoot": "0x55cab7c41a999da527bdd026a772edb5e4804b070014cccc72622e09ce3e699f",
"blockHash": "0xeca4065a019501355c54c1d7ecc4859e4be6355c9ccaa2ce7188822bebc88c82"
"stateRoot": "0x00ab998a4d1f28200177680699c941b06ee536c0b70a1b35e20849de241740c0",
"blockHash": "0x6fc3297759b76c4c907d7590525390ae77af11a1db76c6383fb016a289e2600b"
}
],
"pendingTxs": []
Expand Down
14 changes: 7 additions & 7 deletions apps/dashboard/public/data/flowmemory-dashboard-v0.json
Original file line number Diff line number Diff line change
Expand Up @@ -1993,11 +1993,11 @@
],
"devnetBlocks": [
{
"id": "0x78c6b0c6b56eae99d2d693878a2239620c713cff50fcb94ba6df3fc6ed08be56",
"id": "0xb2251f1db0005e7e665f849a1f0bc2de35f65b263cb4d7aaa870f73f9551eb5c",
"blockNumber": 1,
"blockHash": "0x78c6b0c6b56eae99d2d693878a2239620c713cff50fcb94ba6df3fc6ed08be56",
"blockHash": "0xb2251f1db0005e7e665f849a1f0bc2de35f65b263cb4d7aaa870f73f9551eb5c",
"parentHash": "0x0f23c892cbd2d00c10839d97ddab833698a83f8df8d6df27ceac03cfdd4b7bc9",
"stateRoot": "0xd4bf806a2f91cd8255b2c55db91cb59c9f941d9ec92614dcb86dbd926184630c",
"stateRoot": "0x01313a55fdb9736570aa707b5ebf030fc1bf4212df721f7bb17612ad5de2502a",
"receiptsRoot": "0x2f98caf4b28b2209cdf1f9beb1c23f8732c538657cc7a1d8855878b5400efabd",
"timestamp": "2026-05-13T16:00:00.000Z",
"observationCount": 8,
Expand All @@ -2015,11 +2015,11 @@
}
},
{
"id": "0xeca4065a019501355c54c1d7ecc4859e4be6355c9ccaa2ce7188822bebc88c82",
"id": "0x6fc3297759b76c4c907d7590525390ae77af11a1db76c6383fb016a289e2600b",
"blockNumber": 2,
"blockHash": "0xeca4065a019501355c54c1d7ecc4859e4be6355c9ccaa2ce7188822bebc88c82",
"parentHash": "0x78c6b0c6b56eae99d2d693878a2239620c713cff50fcb94ba6df3fc6ed08be56",
"stateRoot": "0x55cab7c41a999da527bdd026a772edb5e4804b070014cccc72622e09ce3e699f",
"blockHash": "0x6fc3297759b76c4c907d7590525390ae77af11a1db76c6383fb016a289e2600b",
"parentHash": "0xb2251f1db0005e7e665f849a1f0bc2de35f65b263cb4d7aaa870f73f9551eb5c",
"stateRoot": "0x00ab998a4d1f28200177680699c941b06ee536c0b70a1b35e20849de241740c0",
"receiptsRoot": "0xa0407b9a8a55106d549e0f19b92fceaa7f7a25697e94ebf8a1fa74af7b9168f4",
"timestamp": "2026-05-13T16:00:01.000Z",
"observationCount": 8,
Expand Down
5 changes: 5 additions & 0 deletions apps/dashboard/scripts/sync-fixtures.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,11 @@ const fixtureCopies = [
source: resolve(repoRoot, "fixtures/launch-core/generated/devnet/dashboard-state.json"),
destination: resolve(destinationDir, "flowchain-local-devnet-dashboard-state.json"),
},
{
label: "FlowChain bridge test deposit",
source: resolve(repoRoot, "fixtures/bridge/base-sepolia-mock-deposit.json"),
destination: resolve(destinationDir, "flowchain-bridge-test-deposit.json"),
},
];

mkdirSync(destinationDir, { recursive: true });
Expand Down
2 changes: 1 addition & 1 deletion apps/dashboard/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ export default function App() {
return (
<AppShell data={data} canaryData={canaryData} workbench={workbench}>
<Routes>
<Route path="/" element={<WorkbenchView data={data} workbench={workbench} />} />
<Route path="/" element={<WorkbenchView data={data} workbench={workbench} onRefresh={() => setVersion((current) => current + 1)} />} />
<Route path="/overview" element={<OverviewView data={data} />} />
<Route path="/canary" element={<CanaryDeploymentView data={canaryData} />} />
<Route path="/flowmemory" element={<FlowMemoryView data={data} />} />
Expand Down
7 changes: 7 additions & 0 deletions apps/dashboard/src/styles.css
Original file line number Diff line number Diff line change
Expand Up @@ -289,6 +289,13 @@ small {
min-width: min(520px, 100%);
}

.workbench-header-actions {
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
gap: 10px;
align-items: center;
}

.filter-row {
display: grid;
grid-template-columns: minmax(240px, 1fr) 150px;
Expand Down
26 changes: 20 additions & 6 deletions apps/dashboard/src/views/WorkbenchView.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { useMemo, useState } from "react";
import { Activity, Database, Network, PlayCircle, Search, Server, Terminal } from "lucide-react";
import { Activity, Database, Network, PlayCircle, RefreshCw, Search, Server, Terminal } from "lucide-react";
import { EmptyState } from "../components/EmptyState";
import { HashValue } from "../components/HashValue";
import { ProvenanceLine } from "../components/ProvenanceLine";
Expand All @@ -10,6 +10,12 @@ import { WORKBENCH_SECTIONS, type WorkbenchRecord, type WorkbenchSectionKey, typ

const DEFAULT_SECTION: WorkbenchSectionKey = "nodeStatus";

interface WorkbenchViewProps {
data: DashboardData;
workbench: WorkbenchSnapshot;
onRefresh?: () => void;
}

function displayValue(value: string) {
if (value.startsWith("0x") && value.length > 18) {
return <HashValue value={value} trim="medium" />;
Expand All @@ -35,7 +41,7 @@ function missingStateDetail(activeDefinition: (typeof WORKBENCH_SECTIONS)[number
return `${activeDefinition.missingService} did not provide records for ${activeDefinition.expectedEndpoint}. Run ${activeDefinition.missingCommand} locally, then refresh this dashboard.`;
}

export function WorkbenchView({ data, workbench }: { data: DashboardData; workbench: WorkbenchSnapshot }) {
export function WorkbenchView({ data, workbench, onRefresh }: WorkbenchViewProps) {
const [activeSection, setActiveSection] = useState<WorkbenchSectionKey>(DEFAULT_SECTION);
const [query, setQuery] = useState("");
const [actionResult, setActionResult] = useState<string | null>(null);
Expand Down Expand Up @@ -69,10 +75,18 @@ export function WorkbenchView({ data, workbench }: { data: DashboardData; workbe
title="Local explorer workbench"
detail="Usable browser surface for inspecting the private/local L1 testnet shape. It probes the local control-plane API when available and otherwise renders deterministic committed fixtures; value-bearing wallet flows are not included."
action={
<label className="search-box">
<Search size={16} aria-hidden="true" />
<input value={query} onChange={(event) => setQuery(event.target.value)} placeholder="Search current workbench view" />
</label>
<div className="workbench-header-actions">
<label className="search-box">
<Search size={16} aria-hidden="true" />
<input value={query} onChange={(event) => setQuery(event.target.value)} placeholder="Search current workbench view" />
</label>
{onRefresh ? (
<button className="button" type="button" onClick={onRefresh} title="Refresh local workbench data">
<RefreshCw size={15} aria-hidden="true" />
Refresh
</button>
) : null}
</div>
}
/>

Expand Down
Loading
Loading