Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
97 commits
Select commit Hold shift + click to select a range
8e96f5c
feat(observability): add OpenObserve self-hosted observability PoC
jasong-03 Jun 4, 2026
7145fa0
fix(relayer): classify Enoki balance::split ENotEnough as gas-pool fa…
jasong-03 Jun 4, 2026
1d7c5d0
docs(relayer): fix gas-pool runbook for Sui style guide
jasong-03 Jun 4, 2026
8b480f9
fix(relayer): retry gas-pool failures across the pool before aborting
jasong-03 Jun 4, 2026
9b2f833
docs(relayer): full Sui style-guide compliance for gas-pool runbook
jasong-03 Jun 4, 2026
3ee1277
docs(relayer): add frontmatter description/keywords, unquote title
jasong-03 Jun 5, 2026
73915b4
feat(relayer): push Prometheus metrics to OpenObserve via remote_write
jasong-03 Jun 5, 2026
34aa396
fix(server): retry invalidated Enoki wallet txs
Jun 6, 2026
b64e696
feat(observability): export relayer telemetry via OTLP
Jun 8, 2026
2f11752
fix(server): use rust 1.88 builder image
Jun 8, 2026
637c03f
fix(observability): use blocking OTLP http exporter
Jun 8, 2026
9f222ba
fix(server): bound apalis startup migrations
Jun 8, 2026
517d525
fix(observability): use OTLP JSON over HTTP
Jun 8, 2026
45f6338
fix(observability): annotate HTTP spans with OTEL semantics
Jun 8, 2026
0cb5e36
Merge pull request #251 from MystenLabs/codex/fix-enoki-walrus-upload…
ducnmm Jun 8, 2026
ddc1b49
Merge pull request #230 from MystenLabs/feature/walm-81-openobserve-o…
ducnmm Jun 8, 2026
841818f
fix(relayer): harden gas-pool retry classification
Jun 8, 2026
86c528d
Add standalone status service
Jun 8, 2026
b8b3c19
Merge pull request #231 from MystenLabs/feature/walm-88-enoki-gas-poo…
ducnmm Jun 8, 2026
a67314b
Polish status page layout
Jun 8, 2026
44648f3
Add status history storage
Jun 8, 2026
3418c58
Merge remote-tracking branch 'origin/dev' into codex/walm-99-status-page
Jun 8, 2026
d3268d6
Add status history tabs
Jun 8, 2026
4d91f25
Match Statuspage routes and feeds
Jun 8, 2026
d440f03
Match Statuspage incident typography
Jun 8, 2026
9e43e05
Lower WAL balance alert threshold to 2 WAL
Jun 9, 2026
cd48587
Fix set-metadata result pattern for usize return
Jun 9, 2026
ce094e2
Fix namespace reuse in set-metadata low WAL alert
Jun 9, 2026
7a3e047
feat(status): manual incident management
DalenMax Jun 9, 2026
8e0f954
fix(status): address code review findings
DalenMax Jun 9, 2026
66d8e56
feat(mcp): make memory tools agentic, add remember_bulk + health
UyLeQuoc Jun 9, 2026
8f09b01
feat(mcp): add automatic-memory plugin (Claude Code, Codex, Cursor, A…
UyLeQuoc Jun 9, 2026
2d632fe
docs(mcp): per-provider setup pages, consolidate overview
UyLeQuoc Jun 9, 2026
27d25f0
docs(mcp): fix Sui style guide violations
UyLeQuoc Jun 9, 2026
1453580
Merge pull request #253 from MystenLabs/codex/wallet-low-wal-threshol…
ducnmm Jun 10, 2026
6f3065b
Merge pull request #257 from MystenLabs/uyle/walm-94-mcp-behavior-imp…
ducnmm Jun 10, 2026
bd7ea9d
fix(mcp): ship plugin .mcp.json (was excluded by root gitignore)
UyLeQuoc Jun 10, 2026
92cddae
Merge pull request #259 from MystenLabs/uyle/fix-plugin-ship-mcp-json
UyLeQuoc Jun 10, 2026
ac4cad0
docs(skills): update setup skill (plugin install, 8 tools)
UyLeQuoc Jun 10, 2026
c5de5a3
Merge pull request #260 from MystenLabs/uyle/fix-plugin-npx-latest
ducnmm Jun 10, 2026
9854ca1
refactor(relayer): split sidecar-server.ts monolith into modules (WAL…
Jun 10, 2026
aca20cd
docs(specs): WALM-110 indexer gRPC migration design
DalenMax Jun 10, 2026
6bc5034
docs(specs): address WALM-110 review findings
DalenMax Jun 10, 2026
69fcdce
feat(indexer): add EventSource trait and domain types
DalenMax Jun 10, 2026
c17c14a
refactor(indexer): extract JsonRpcEventSource from main.rs
DalenMax Jun 10, 2026
aeb2272
chore(indexer): add sui-rpc, tonic, and grpc feature flag
DalenMax Jun 10, 2026
51e0673
feat(indexer): add GrpcEventSource using sui-rpc LedgerService
DalenMax Jun 10, 2026
b720613
feat(indexer): add AccountCreatedExtractor with JSON and BCS paths
DalenMax Jun 10, 2026
09a620a
feat(indexer): add IndexerApp with transaction boundary and graceful …
DalenMax Jun 10, 2026
7a250b3
test(indexer): add extractor and IndexerApp unit tests
DalenMax Jun 10, 2026
7395a9f
test(indexer): add gRPC connectivity smoke test
DalenMax Jun 10, 2026
0b7ea9b
fix(mcp): SSE heartbeat watchdog — recover from silently dead relayer…
xogdg Jun 10, 2026
3b37c84
docs(sdk): add @mysten/* peer dependency version matrix (#254)
Jun 11, 2026
f574108
fix(relayer): congestion-aware retry + saturation alert for Walrus up…
Jun 11, 2026
2b5a1d0
Merge pull request #263 from MystenLabs/henrynguyen/issue-254-sdk-ver…
ducnmm Jun 11, 2026
be53d36
Merge pull request #262 from MystenLabs/henrynguyen/walm-105-relayer-…
ducnmm Jun 11, 2026
ef235a6
test(indexer): add production e2e test script with Postgres + testnet
DalenMax Jun 11, 2026
937db2c
chore(indexer): update Cargo.lock for grpc dependencies
DalenMax Jun 11, 2026
7731185
docs(sdk): cookbook for multi-tenant server apps (#246)
Jun 11, 2026
de0cc64
fix(indexer): drain backlog without sleep, advance cursor past parse …
Jun 11, 2026
353448c
chore(indexer): drop internal gRPC migration design doc
Jun 11, 2026
1a0b5ae
Merge pull request #264 from MystenLabs/feature/walm-110-indexer
ducnmm Jun 11, 2026
6e40a83
fix(indexer): treat 5xx/429/408 RPC responses as transient, not fatal
Jun 11, 2026
3aa3282
Merge pull request #267 from MystenLabs/feature/walm-110-indexer
ducnmm Jun 11, 2026
8512d25
docs(sdk): fix style-guide violations in multi-tenant cookbook
Jun 11, 2026
1a2249c
Merge pull request #265 from MystenLabs/henrynguyen/docs-multitenant-…
ducnmm Jun 11, 2026
ddbdb34
Merge branch 'dev' into codex/walm-99-status-page
DalenMax Jun 11, 2026
83140df
fix(status): remove Admin link from footer
DalenMax Jun 11, 2026
e5a1143
fix(status): auto-set resolvedAt when transitioning to resolved
DalenMax Jun 11, 2026
df81d44
fix(status): threshold-based bucket status matching Statuspage.io
DalenMax Jun 11, 2026
a8636e6
fix(status): temporarily show only Walrus Memory Relayer component
DalenMax Jun 11, 2026
00e6de9
fix(status): incident days always show last N days with current status
DalenMax Jun 11, 2026
a241206
fix(status): reverse Past Incidents order — most recent day at top
DalenMax Jun 11, 2026
0f8af38
fix(status): align Past Incidents bucket logic with threshold-based s…
DalenMax Jun 11, 2026
3d3cd69
fix(status): admin updates now reflect on main page immediately
DalenMax Jun 11, 2026
8cd8e09
feat(status): show full incident update history on main page
DalenMax Jun 11, 2026
1958eec
docs(skills): client routing, terminal-first setup, remote MCP self-s…
UyLeQuoc Jun 11, 2026
b3f758b
fix(relayer): ground MCP tool results with walruscan links
UyLeQuoc Jun 11, 2026
9d5f2f2
chore(mcp): revert version to 0.0.5, fold 0.0.6 changelog into 0.0.5
UyLeQuoc Jun 11, 2026
e507f2c
chore(mcp): consolidate unreleased 0.0.6 into 0.0.5, fold in SSE watc…
Jun 11, 2026
c80ded8
docs(mcp): trim 0.0.5 changelog to concise, user-facing entries
Jun 11, 2026
71d0cc8
Merge pull request #261 from xogdg/fix/sse-heartbeat-watchdog
ducnmm Jun 11, 2026
65dacce
docs(sdk): warn against copying example accountId in quickstarts
Jun 11, 2026
f87a942
docs(sdk): add Cloudflare Workers guide
Jun 11, 2026
318999e
docs(sdk): correct why the default entry is lighter on Workers
Jun 11, 2026
f28d058
docs(sdk): use measured Workers bundle numbers, not estimates
Jun 11, 2026
301bbb6
chore(observability): harden otel collector config and compose limits
Jun 12, 2026
8b47f10
feat(observability): make collector deployable as a Railway service
Jun 12, 2026
81f926d
fix(observability): pin collector to an existing contrib tag (0.154.0)
Jun 12, 2026
fbc91bf
docs(sdk): fix style-guide audit violations
Jun 12, 2026
8d933e7
fix(server): bind [::] so the relayer is reachable on Railway's IPv6 …
Jun 12, 2026
95c1c40
docs(observability): correct Railway private host for the metrics target
Jun 12, 2026
3229326
feat(status): monitor and display staging + production relayers
DalenMax Jun 12, 2026
764e7f1
Merge pull request #274 from MystenLabs/chore/otel-collector-hardening
ducnmm Jun 12, 2026
c8cc0b8
Merge pull request #270 from MystenLabs/docs/cf-workers-and-quickstar…
ducnmm Jun 12, 2026
ae70f43
Merge pull request #269 from MystenLabs/uyle/walm-113-mcp-setup-skill…
ducnmm Jun 12, 2026
cf2e109
Merge pull request #268 from MystenLabs/codex/walm-99-status-page
ducnmm Jun 12, 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
17 changes: 17 additions & 0 deletions .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"name": "memwal-plugins",
"owner": {
"name": "Mysten Labs"
},
"metadata": {
"description": "Official MemWal plugins for Claude Code and Codex."
},
"plugins": [
{
"name": "memwal",
"source": "./packages/mcp/plugin",
"description": "Automatic Walrus Memory — proactive recall and durable-fact saving via the MemWal MCP + lifecycle hooks.",
"version": "0.0.5"
}
]
}
19 changes: 19 additions & 0 deletions .codex-plugin/marketplace.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"name": "memwal-plugins",
"interface": {
"displayName": "MemWal Plugins"
},
"plugins": [
{
"name": "memwal",
"source": {
"source": "local",
"path": "./packages/mcp/plugin"
},
"policy": {
"installation": "AVAILABLE"
},
"category": "Productivity"
}
]
}
17 changes: 17 additions & 0 deletions .cursor-plugin/marketplace.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"name": "memwal-plugins",
"owner": {
"name": "Mysten Labs"
},
"metadata": {
"description": "Official MemWal plugins for Cursor"
},
"plugins": [
{
"name": "memwal",
"source": "./packages/mcp/plugin",
"description": "Automatic Walrus Memory — proactive recall and durable-fact saving via the MemWal MCP + lifecycle hooks.",
"version": "0.0.5"
}
]
}
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,8 @@ railway-*.md

# Per-developer MCP client config (user paths)
.mcp.json
# ...but the marketplace plugin must ship its own MCP config
!packages/mcp/plugin/.mcp.json

# Personal/internal planning notes — never include in repo
plans/
Expand All @@ -132,3 +134,6 @@ plans/
# reviewable life in past PRs.
services/server/review/
claudedocs/

# Temp File
temp/
96 changes: 77 additions & 19 deletions apps/app/public/skills/setup
Original file line number Diff line number Diff line change
Expand Up @@ -22,17 +22,24 @@ user explicitly asks for developer integration.

## Setup Rules

1. First decide whether you have local shell and filesystem access.
2. If you can edit local user config files, do the setup yourself after showing
1. Identify the AI client first. ChatGPT (or another client that cannot run a
local MCP command but supports custom connector headers) uses the Remote
MCP section below. Every other client (Claude Desktop, Claude Code, Cursor,
Codex, other local apps) uses the Local MCP Server section.
2. Decide whether you have local shell and filesystem access.
3. If you can edit local user config files, do the setup yourself after showing
the config you will add.
3. If you cannot edit local files, give the user exact commands/config to paste
and wait for their result.
4. Preserve existing MCP servers. Merge the `memwal` server; do not replace the
4. If you cannot edit local files yourself, prefer giving the user ONE terminal
command to paste (for example a `claude mcp add ...` or login command) over
raw JSON/TOML to hand-edit. Fall back to a config block only when no command
exists for that client; then state the exact file path and merge the
`memwal` entry, never replace the whole file.
5. Preserve existing MCP servers. Merge the `memwal` server; do not replace the
whole config.
5. Never print or expose values from `~/.memwal/credentials.json`.
6. Tell the user to fully quit and reopen the AI client after config changes.
7. Stop at the first real blocker and report the exact failure.
8. Keep the final status short. Do not repeat full config blocks or terminal
6. Never print or expose values from `~/.memwal/credentials.json`.
7. Tell the user to fully quit and reopen the AI client after config changes.
8. Stop at the first real blocker and report the exact failure.
9. Keep the final status short. Do not repeat full config blocks or terminal
commands after setup succeeds unless the user must copy/paste them manually.

## Requirements
Expand All @@ -45,6 +52,8 @@ node -v

Walrus Memory MCP requires Node.js 20 or newer. If Node is missing or older
than 20, ask the user to install Node.js 20+ from https://nodejs.org/ and stop.
The Remote MCP path needs Node.js only once, for the login step on the user's
computer.

The user signs in through the browser with Google/zkLogin or a Sui-compatible
wallet. The sign-in flow writes persistent credentials to:
Expand Down Expand Up @@ -117,6 +126,9 @@ Edit `~/.cursor/mcp.json` and merge:

### Claude Desktop

Use the config file below. Claude Desktop's Settings > Connectors UI only
supports OAuth remote servers and does not work for Walrus Memory.

Edit:

- macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
Expand Down Expand Up @@ -157,7 +169,17 @@ cwd = "/Users/YOUR_USERNAME"

### Claude Code

Run:
Preferred: install the Walrus Memory plugin. It bundles the same MCP server
plus lifecycle hooks that make memory automatic. Run inside Claude Code:

```text
/plugin marketplace add MystenLabs/MemWal
/plugin install memwal@memwal-plugins
```

Then restart Claude Code.

MCP-only alternative:

```bash
claude mcp add --scope user memwal -- npx -y @mysten-incubation/memwal-mcp
Expand Down Expand Up @@ -185,7 +207,11 @@ seconds while `npx` fetches the package.

## Verify Tools

Ask the AI client:
Fastest check: ask the client to call `memwal_health`. A healthy reply proves
the server is reachable. If health succeeds but memory tools return 401,
credentials are missing; run the login.

Then ask the AI client:

```text
What MCP tools do you have available?
Expand All @@ -194,9 +220,11 @@ What MCP tools do you have available?
Expected Walrus Memory tools:

- `memwal_remember`
- `memwal_remember_bulk`
- `memwal_recall`
- `memwal_analyze`
- `memwal_restore`
- `memwal_health`
- `memwal_login`
- `memwal_logout`

Expand Down Expand Up @@ -224,11 +252,23 @@ Use memwal_recall to search for: "setup verification succeeded"
If the tools support a `namespace` argument, use a setup-only namespace such as
`setup-verification`.

## ChatGPT and Remote MCP
## Remote MCP (ChatGPT and other header-capable clients)

Some clients connect to a remote MCP server URL instead of running a local
command. Use this path only when the client supports custom request headers.
ChatGPT (developer mode) supports this today.

ChatGPT custom MCP apps use remote MCP servers, not a local `npx` stdio config.
Prerequisite: credentials must already exist. Have the user run the login once
on their computer (see Recommended Login). The Remote MCP path needs Node.js
only for that one step.

Use remote MCP only when the client supports custom headers:
For ChatGPT:

1. Settings > Connectors > enable Developer mode.
2. Add a connector with URL `https://relayer.memory.walrus.xyz/api/mcp`.
3. Add the two headers shown in the template below.

For config-file clients that support remote servers with headers, merge:

```json
{
Expand All @@ -244,11 +284,21 @@ Use remote MCP only when the client supports custom headers:
}
```

The values come from `~/.memwal/credentials.json` after login. Treat the bearer
token like an API key. Do not save it in a repo file or print it in chat.
To fill the placeholders, have the USER open the credentials file themselves:

If the client cannot attach required headers, explain the blocker and suggest a
local MCP client such as Cursor, Claude Desktop, Claude Code, or Codex.
```bash
cat ~/.memwal/credentials.json
```

`delegatePrivateKey` is the Bearer token; `accountId` is the
`x-memwal-account-id` value. The user pastes them directly into the connector
settings, never into the chat. You (the agent) must not read or print this
file. Treat the bearer token like an API key and never save it in a repo file.

If the client cannot attach custom headers, remote MCP is not available for it
today. Tell the user which clients are supported (ChatGPT developer mode,
Claude Desktop, Claude Code, Cursor, Codex) and offer to set one of those up
instead. Do not re-run this skill for the same client.

## Troubleshooting

Expand All @@ -259,6 +309,7 @@ local MCP client such as Cursor, Claude Desktop, Claude Code, or Codex.
| No Walrus Memory tools after restart | Check the MCP config path and fully restart the client. |
| Only `memwal_login` works | Credentials are missing. Run `memwal_login` or `npx -y @mysten-incubation/memwal-mcp login --prod`. |
| Memory tools return 401 | The delegate key may be stale or revoked. Run `npx -y @mysten-incubation/memwal-mcp login --prod` again. |
| `memwal_recall` returns nothing although memories were saved before | Run `memwal_restore <namespace>` to rebuild the search index from Walrus, then retry the recall. |
| Sign out | Run `npx -y @mysten-incubation/memwal-mcp --logout`. This removes local credentials but does not revoke the delegate key. |

## Final Report
Expand All @@ -277,12 +328,19 @@ window is not enough.
Login: succeeded.
Config: <path changed>.
After reopening, ask: "What MCP tools do you have available?"

Memory is automatic from here: the assistant saves durable facts and recalls
them as you chat. There is no sync schedule to configure. Try:
- "What do you remember about me?"
- "Remember that I prefer short answers."
```

Rules for the final response:

- Put the restart instruction before verification details.
- Keep it under 8 lines if there is no blocker.
- Keep it under 14 lines if there is no blocker.
- Offer at most 3 starter prompts.
- Never state storage sizes or explorer links that the tools did not return.
- Do not include the full TOML/JSON config again after it has already been
applied.
- Do not include long verification prompts before the restart. After restart,
Expand Down
4 changes: 4 additions & 0 deletions apps/status/.dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
node_modules
dist
.env.local
.DS_Store
24 changes: 24 additions & 0 deletions apps/status/.env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Walrus Memory Status service

# Runtime targets probed by the Node service. Browser clients call same-origin
# /api/status, so this does not require relayer CORS changes.
STATUS_RELAYER_PRODUCTION_URL=https://relayer.memory.walrus.xyz
STATUS_RELAYER_STAGING_URL=https://relayer-staging.memory.walrus.xyz
# Backward-compatible fallback used only if STATUS_RELAYER_PRODUCTION_URL is unset.
# STATUS_RELAYER_URL=https://relayer.memory.walrus.xyz
STATUS_HEALTH_PATH=/health
STATUS_REQUEST_TIMEOUT_MS=8000
STATUS_POLL_INTERVAL_MS=60000
STATUS_HISTORY_DAYS=90

# Optional Postgres history storage. Without this, the service still serves
# live checks but cannot retain historical uptime.
DATABASE_URL=postgres://memwal_status:memwal_status_secret@127.0.0.1:5433/memwal_status

# Optional links rendered on the page.
STATUS_SUI_STATUS_URL=https://status.sui.io/
STATUS_WALRUS_URL=https://www.walrus.xyz/

# Optional admin API key for incident management endpoints.
# If set, POST / PATCH / DELETE /api/incidents* require X-Admin-API-Key header.
STATUS_ADMIN_API_KEY=
3 changes: 3 additions & 0 deletions apps/status/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
dist
node_modules
.env.local
39 changes: 39 additions & 0 deletions apps/status/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# ============================================================
# Walrus Memory Status — standalone status service
# Build context: repo root (Railway Root Directory = /)
# ============================================================

FROM node:22-alpine AS builder

RUN corepack enable && corepack prepare pnpm@9.12.3 --activate

WORKDIR /app

COPY package.json pnpm-workspace.yaml pnpm-lock.yaml ./
COPY apps/status/package.json ./apps/status/

RUN pnpm install --frozen-lockfile

COPY apps/status/ ./apps/status/

RUN pnpm --filter @memwal/status build

FROM node:22-alpine AS runtime

WORKDIR /app/apps/status

COPY --from=builder /app/node_modules /app/node_modules
COPY --from=builder /app/apps/status/node_modules ./node_modules
COPY --from=builder /app/apps/status/dist ./dist
COPY --from=builder /app/apps/status/package.json ./package.json
COPY --from=builder /app/apps/status/server.mjs ./server.mjs

ENV NODE_ENV=production
ENV PORT=3000
ENV STATUS_RELAYER_PRODUCTION_URL=https://relayer.memory.walrus.xyz
ENV STATUS_RELAYER_STAGING_URL=https://relayer-staging.memory.walrus.xyz
ENV STATUS_POLL_INTERVAL_MS=60000
ENV STATUS_HISTORY_DAYS=90
EXPOSE 3000

CMD ["node", "server.mjs"]
Loading
Loading