Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
18fa39b
fix(researcher): pin the outbound fetch to the validated address (WAL…
nikola0x0 Sep 22, 2026
03507ed
fix(researcher): settle on unusable responses, fall back across valid…
nikola0x0 Sep 23, 2026
3acf6ac
fix(server): rebuild a register when Enoki drops the sponsorship
ducnmm Sep 23, 2026
1b01309
fix(researcher): let a hung connect fall through to the next address …
nikola0x0 Sep 23, 2026
8f0aa85
fix(sidecar): stop resetting the Walrus client on every lease read
ducnmm Sep 23, 2026
5b27683
fix(server): retry certify readback and spare the attempt budget on l…
ducnmm Sep 24, 2026
c495e2c
fix(server): steer uncommitted uploads onto a free wallet
ducnmm Sep 25, 2026
25ba0fb
fix(server): run seal off the upload sidecar process
ducnmm Sep 28, 2026
22fd223
merge(dev): bring origin/dev into fix/enoki-not-found-rebuild-register
ducnmm Sep 28, 2026
592d563
test(server): give the rate-limit fixture a seal sidecar url
ducnmm Sep 28, 2026
94b7080
feat(server): skip request rate limits for one benchmark owner
ducnmm Sep 28, 2026
7a4219e
fix(server): resume a dropped upload on the same journal
ducnmm Sep 29, 2026
222e5bc
fix(server): surface a metadata failure instead of the stale sweep
ducnmm Sep 29, 2026
2f4a485
feat(server): give hosted MCP its own rate limit
ducnmm Sep 29, 2026
f81d839
feat(server): finish a certified blob before starting a new upload
ducnmm Sep 29, 2026
fbcb2b8
fix(researcher): fall through when a connect fails synchronously (WAL…
hien-p Sep 29, 2026
21fbf26
feat(server): dispatch wallet work only when a signing key is free
ducnmm Sep 29, 2026
80be27d
fix(server): restore the Apalis wallet worker
ducnmm Sep 29, 2026
7dc54df
fix(server): retry a deadlocked test migration
ducnmm Sep 29, 2026
aa39884
fix(server): stop prefetching a batch of wallet uploads
ducnmm Sep 29, 2026
25bc993
revert(server): prefetch wallet uploads again
ducnmm Sep 29, 2026
0ea8ac5
feat(server): sign metadata while the next upload runs
ducnmm Sep 29, 2026
8589da4
revert(server): sign metadata while the next upload runs
ducnmm Sep 29, 2026
f235a17
feat(server): sign metadata while the next upload runs
ducnmm Sep 30, 2026
09750ae
fix(server): take the upload lock after the wallet slot
ducnmm Sep 30, 2026
79f241e
revert(server): take the upload lock after the wallet slot
ducnmm Sep 30, 2026
2716cdd
docs(bench): establish isolated pinned dev burst workflow
hien-p Sep 30, 2026
13291ac
Merge pull request #984 from MystenLabs/nikolale/walm-682-researcher-…
harrymove-ctrl Sep 30, 2026
90f9545
test(server): gate one dev benchmark owner out of write-path rate buc…
hien-p Sep 30, 2026
57dca7d
fix(server): admit uploads before lock checkout and preserve outage r…
hien-p Sep 30, 2026
1ecf1e5
test(server): gate staging benchmark owner separately
hien-p Sep 30, 2026
fb323e9
fix(server): define staging benchmark gate predicate
hien-p Sep 30, 2026
e898fa8
Recover committed metadata transfers after lost sidecar responses
hien-p Sep 30, 2026
fe4bfca
Measure upload phases and sidecar event loop delays
hien-p Sep 30, 2026
ded7e5a
fix(sidecar): isolate blob metadata encoding from request event loop
hien-p Sep 30, 2026
0f52364
fix(server): park a relay outage instead of burning upload retries
ducnmm Sep 30, 2026
f581043
fix(server): stamp a missing agent id instead of failing the receipt
ducnmm Oct 1, 2026
204e580
fix(sidecar): sign metadata when the memory owner is the upload wallet
hien-p Oct 1, 2026
6f90c31
fix(sidecar): retry a dropped connection on the Seal account read
hien-p Oct 1, 2026
9e9a10c
Merge fix/enoki-not-found-rebuild-register (PR #997) into PR #1055
hien-p Oct 1, 2026
4facc0d
fix(sidecar): retry a dropped connection during Seal encrypt
hien-p Oct 1, 2026
12c4b25
fix(server): claim the least-loaded wallet before steering an upload …
hien-p Oct 1, 2026
b759a3a
fix(server): let staging exempt a configured list of bench owners
hien-p Oct 1, 2026
83bad8e
fix(app): Back to Console dialog copy + keep the new key in view afte…
nikola0x0 Oct 1, 2026
dc09039
chore(server): drop benchmark owner exemptions and test scaffolding
hien-p Oct 1, 2026
567f3cf
test(sidecar): time the seal-listener check against the block, not wo…
hien-p Oct 1, 2026
f55d848
test(server): retry a deadlocked migration replay when building a tes…
hien-p Oct 1, 2026
1ee7801
Merge pull request #1055 from MystenLabs/harry/dev-isolated-burst-202…
harrymove-ctrl Oct 1, 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
7 changes: 4 additions & 3 deletions apps/app/src/index.css
Original file line number Diff line number Diff line change
Expand Up @@ -7978,8 +7978,9 @@ h1, h2, h3 {
background: #000000;
overflow: clip;
/* /keys auto-scrolls here (WALM-675); offset by .dashboard-nav's sticky
height so the card header/Add key button don't land under the nav. */
scroll-margin-top: 128px;
height plus a gap, so the card's top edge isn't flush under the nav
(WALM-743). */
scroll-margin-top: calc(128px + 24px);
}

.dash-page .dashboard-keys-card .card-header {
Expand Down Expand Up @@ -8109,7 +8110,7 @@ h1, h2, h3 {
}

.dash-page .dashboard-keys-card {
scroll-margin-top: 92px;
scroll-margin-top: calc(92px + 16px);
}

.setup-classic-nav .nav-inner,
Expand Down
42 changes: 34 additions & 8 deletions apps/app/src/pages/Dashboard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import { Card } from '../components/Card'
import SecurityDeleteSection from '../components/SecurityDeleteSection'
import { SecretValueInput } from '../components/SecretValueInput'
import { config } from '../config'
import { accountReadyCopy } from '../utils/accountReadyCopy'
import { getAnalyticsErrorType, trackEvent } from '../utils/analytics'
import { apiGet } from '../utils/api'
import { fetchAccountIdForOwner, fetchObjectJson, publicKeyToHex } from '../utils/suiClientCompat'
Expand Down Expand Up @@ -307,6 +308,11 @@ export default function Dashboard({
// Revoke has no one-time secret to protect, so its dialog can open
// immediately — same direct-reset reasoning as justMintedKey above.
const [justRemovedKeys, setJustRemovedKeys] = useState(false)
// What the dialog reports for a /keys action (WALM-743). Captured when the
// action succeeds: the add-key form resets its label and the revoke
// confirm state clears before the dialog opens.
const [mintedKeyLabel, setMintedKeyLabel] = useState('')
const [removedKeyCount, setRemovedKeyCount] = useState(0)

// WalletSigner adapter — wraps dapp-kit hooks into SDK's WalletSigner interface
const walletSigner = useMemo<WalletSigner | null>(() => {
Expand Down Expand Up @@ -473,6 +479,16 @@ export default function Dashboard({
scrollToDelegateKeys()
}, [autoScrollToKeys, isKeyListLoading, scrollToDelegateKeys])

// A first mint in this browser also saves the key, which mounts the SDK
// credentials card above the delegate keys section and pushes the one-time
// key block off screen (WALM-743). Bring the block back into view once it
// renders, so the user sees the key they must copy now.
const newKeyBlockRef = useRef<HTMLDivElement>(null)
useEffect(() => {
if (!newPrivateKey) return
newKeyBlockRef.current?.scrollIntoView({ behavior: 'smooth', block: 'center' })
}, [newPrivateKey])

// Two distinct Console arrivals gate the same dialog: a key action
// (mint or revoke) from /keys (fromKeys), or a brand-new account that
// just finished /setup after coming from Console's "Set up"
Expand All @@ -483,6 +499,15 @@ export default function Dashboard({
config.consoleUrl && !accountReadyDismissed && !removeKeysConfirm &&
((fromKeys && ((justMintedKey && !newPrivateKey) || justRemovedKeys)) || fromConsoleSetup)
)
// Mint and revoke clear each other's flag, so the latest key action picks
// the copy. A /setup arrival with no /keys action keeps the new-account copy.
const accountReadyDialogCopy = accountReadyCopy(
justRemovedKeys
? { kind: 'revoke', count: removedKeyCount }
: fromKeys && justMintedKey
? { kind: 'mint', label: mintedKeyLabel }
: null
)
const dismissAccountReadyDialog = useCallback(() => {
setAccountReadyDismissed(true)
setFromConsoleSetup(false)
Expand Down Expand Up @@ -684,6 +709,7 @@ export default function Dashboard({

const delegatePublicKeyHex = bytesToHex(delegate.publicKey)
setNewPrivateKey(delegate.privateKey)
setMintedKeyLabel(trimmedLabel)
setDelegateKeys(delegate.privateKey, delegatePublicKeyHex, effectiveAccountObjectId!)
closeAddKeyForm()
setNewKeyLabel('New key')
Expand Down Expand Up @@ -775,6 +801,7 @@ export default function Dashboard({
// can already be true from an earlier dismissed dialog, in which
// case setting it to true again wouldn't change the dependency
// and an effect-based reset would silently no-op.
setRemovedKeyCount(publicKeyHexes.length)
setJustRemovedKeys(true)
setJustMintedKey(false)
setAccountReadyDismissed(false)
Expand Down Expand Up @@ -1395,7 +1422,11 @@ const result = await generateText({
</div>
)}
{newPrivateKey && (
<div className="dashboard-key-ready-block" data-analytics-sensitive="new-delegate-private-key">
<div
ref={newKeyBlockRef}
className="dashboard-key-ready-block"
data-analytics-sensitive="new-delegate-private-key"
>
<div className="warning-box dashboard-key-ready-warning">
<TriangleAlert className="dashboard-key-ready-warning-icon" size={24} strokeWidth={2.3} aria-hidden="true" />
<p>
Expand Down Expand Up @@ -1758,14 +1789,9 @@ const result = await generateText({
aria-describedby="dashboard-account-ready-description"
>
<div className="dashboard-confirm-copy dashboard-account-ready-body">
{/* "Your account is ready" reads oddly after a revoke. */}
<h3 id="dashboard-account-ready-title">
{justRemovedKeys ? 'Your keys are updated' : 'Your account is ready'}
</h3>
<h3 id="dashboard-account-ready-title">{accountReadyDialogCopy.title}</h3>
<p id="dashboard-account-ready-description">
{justRemovedKeys
? 'Head back to Walrus Console to see the change.'
: 'Finish connecting your account in Walrus Console.'}
{accountReadyDialogCopy.description}
</p>
</div>
<div className="dashboard-confirm-actions dashboard-account-ready-actions">
Expand Down
26 changes: 26 additions & 0 deletions apps/app/src/utils/accountReadyCopy.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { describe, expect, it } from 'vitest'
import { accountReadyCopy } from './accountReadyCopy'

describe('accountReadyCopy', () => {
it('names the minted key and points at Connected agents', () => {
expect(accountReadyCopy({ kind: 'mint', label: 'cli' })).toEqual({
title: '"cli" is ready',
description: 'Head back to Walrus Console. It will show up under Connected agents.',
})
})

it('counts the removed keys', () => {
expect(accountReadyCopy({ kind: 'revoke', count: 1 }).title).toBe('Key removed')
expect(accountReadyCopy({ kind: 'revoke', count: 3 }).title).toBe('3 keys removed')
expect(accountReadyCopy({ kind: 'revoke', count: 3 }).description).toBe(
'Head back to Walrus Console to see the change.',
)
})

it('keeps the new-account copy for a Set up arrival', () => {
expect(accountReadyCopy(null)).toEqual({
title: 'Your account is ready',
description: 'Finish connecting your account in Walrus Console.',
})
})
})
36 changes: 36 additions & 0 deletions apps/app/src/utils/accountReadyCopy.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
/**
* Copy for the dashboard's Back to Console dialog (WALM-675, WALM-743).
*
* The dialog opens for three Console arrivals, and each needs its own words:
* a user who minted or revoked a key from /keys is already linked, so the
* new-account "Finish connecting" copy reads wrong for them. Mint and revoke
* copy lines up with Console's return banner ("N agents added/removed",
* COMG-1093).
*/
export type LastKeyAction =
| { kind: 'mint'; label: string }
| { kind: 'revoke'; count: number }

export interface AccountReadyCopy {
title: string
description: string
}

export function accountReadyCopy(action: LastKeyAction | null): AccountReadyCopy {
if (action?.kind === 'mint') {
return {
title: `"${action.label}" is ready`,
description: 'Head back to Walrus Console. It will show up under Connected agents.',
}
}
if (action?.kind === 'revoke') {
return {
title: action.count === 1 ? 'Key removed' : `${action.count} keys removed`,
description: 'Head back to Walrus Console to see the change.',
}
}
return {
title: 'Your account is ready',
description: 'Finish connecting your account in Walrus Console.',
}
}
Loading
Loading