Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
4dd5873
fix(sidecar): durable-upload crash-recovery tag never matched the rec…
hien-p Aug 14, 2026
c16f64d
test(sdk): live e2e suite against the relayer
nikola0x0 Aug 18, 2026
abae31b
ci(sdk): unit test and e2e workflow against the dev relayer
nikola0x0 Aug 18, 2026
e2fb815
test(sdk): drop e2e coverage for two unserved SDK contracts
nikola0x0 Aug 18, 2026
43b5f77
ci(sdk): run the e2e suite against dev, staging and production
nikola0x0 Aug 18, 2026
e54b521
fix(mcp): resolve credentials per project and warn before replacing a…
nikola0x0 Aug 19, 2026
f566d7d
fix(mcp): make the replacement notice testable and stop the success p…
nikola0x0 Aug 19, 2026
83f1e91
fix(mcp): stop `login` deleting credentials before the new ones exist
nikola0x0 Aug 19, 2026
3611ec0
docs(mcp): document credential locations, and warn before the browser…
nikola0x0 Aug 19, 2026
1559809
test(mcp): correct the portability note on the credential sandbox
nikola0x0 Aug 19, 2026
e3fe618
fix(noter): stop bouncing authenticated users off /note and dropping …
hien-p Aug 18, 2026
804e717
fix(noter): migrate the client-side Enoki registration flow off depre…
hien-p Aug 18, 2026
7dcd911
test(noter): add Playwright e2e suite and CI job
hien-p Aug 18, 2026
b33dbfd
fix(ci): merge duplicate noter-checks job that broke the QA workflow
hien-p Aug 18, 2026
0ba4f97
fix(noter): stop dapp-kit's sign hook from resolving move calls via d…
hien-p Aug 19, 2026
8e63ad9
test(noter): harden e2e fixtures and unstick CI playwright install
ducnmm Aug 20, 2026
161dcc5
Merge pull request #684 from MystenLabs/fix/noter-grpc-auth-e2e
ducnmm Aug 20, 2026
a300db7
chore: drop changesets to avoid a double bump on main
ducnmm Aug 21, 2026
3b41378
Merge pull request #641 from MystenLabs/fix/reconcile-blob-tag-mismatch
ducnmm Aug 21, 2026
302b9bd
Merge pull request #679 from MystenLabs/nikolale/walm-353-e2e-test-js…
ducnmm Aug 21, 2026
03defa1
fix(frontend): WALM-326 scope the dashboard no-key notice to this bro…
HoangDucBach Aug 21, 2026
b3302fe
fix(mcp): resolve credentials from parent directories, and stop logou…
nikola0x0 Aug 21, 2026
79487b8
fix(sdk): accept a bech32 suiprivkey delegate key, not just hex (#721)
ducnmm Aug 21, 2026
ef7c689
fix(server): make storage quota admission atomic with insertion (#720)
harrymove-ctrl Aug 21, 2026
9d4ef0f
fix: point empty 401s at memwal_login (#702)
ducnmm Aug 21, 2026
f3d82a4
Merge pull request #701 from MystenLabs/nikolale/walm-361-credential-…
nikola0x0 Aug 21, 2026
caff567
WALM-295/296/297: owner-scoped memory read API + bearer token auth fo…
harrymove-ctrl Aug 21, 2026
5a159fd
chore(github): add bug and feature issue forms
ducnmm Aug 22, 2026
83aec29
fix(oauth): persist the client loopback redirect URI (GH #619)
ducnmm Aug 22, 2026
1856269
fix(sponsor): restore pending binding after sidecar execute failure (…
ducnmm Aug 22, 2026
72ea759
fix(relayer): restore timeouts, oauth authorize cap, analyze idempotency
ducnmm Aug 22, 2026
45b0ad8
fix(mcp): require a registered delegate before opening a session
ducnmm Aug 22, 2026
01481ee
fix(mcp): fail non-TTY login and single-flight memwal_login
ducnmm Aug 22, 2026
49327dc
fix(mcp): serialize SSE POSTs so concurrent recall cannot hang the br…
ducnmm Aug 23, 2026
1cabcfc
Merge pull request #732 from MystenLabs/chore/github-issue-forms
HoangDucBach Aug 24, 2026
cc22cb7
Merge pull request #733 from MystenLabs/fix/gh-619-oauth-loopback-red…
HoangDucBach Aug 24, 2026
b595dda
Merge pull request #734 from MystenLabs/fix/gh-617-sponsor-execute-re…
HoangDucBach Aug 24, 2026
9fec268
Merge pull request #745 from MystenLabs/fix/mcp-concurrent-recall
HoangDucBach Aug 24, 2026
3ca3d11
fix(analyze): forget releases idempotency keys and importance updates…
ducnmm Aug 24, 2026
c0c75be
Merge pull request #738 from MystenLabs/fix/mcp-login-tty-singleflight
HoangDucBach Aug 24, 2026
225d42d
Merge pull request #735 from MystenLabs/fix/mcp-session-auth-429
HoangDucBach Aug 24, 2026
e34b8d9
Merge pull request #736 from MystenLabs/fix/relayer-restore-oauth-ana…
HoangDucBach Aug 24, 2026
e5ae9e0
fix(bench): retry Cloudflare HTML in the live latency check (#756)
ducnmm Aug 24, 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: 0 additions & 7 deletions .changeset/gh-571-clock-drift-error.md

This file was deleted.

109 changes: 109 additions & 0 deletions .github/ISSUE_TEMPLATE/bug.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
name: Bug report
description: Something is broken. We need a repro, environment, and versions.
title: "[Bug] "
labels: ["bug"]
body:
- type: markdown
attributes:
value: |
Thanks for the report. Incomplete issues (no repro, no environment) are closed.

Do not paste delegate private keys, mnemonics, or other secrets.

If this is a security finding, use a [private advisory](https://github.com/MystenLabs/MemWal/security/advisories/new) instead of this form.

- type: dropdown
id: surface
attributes:
label: Surface
description: Where did you hit this?
options:
- TypeScript SDK (@mysten-incubation/memwal)
- Python SDK (memwal)
- MCP (@mysten-incubation/memwal-mcp)
- Relayer / hosted API
- Dashboard / Console (memory.walrus.xyz)
- Developer Playground
- OpenClaw plugin
- Example app (chatbot, noter, researcher)
- Docs
- Other
validations:
required: true

- type: dropdown
id: network
attributes:
label: Network
options:
- Mainnet (relayer.memory.walrus.xyz)
- Staging (relayer-staging.memory.walrus.xyz)
- Local / self-hosted
- Not sure
validations:
required: true

- type: input
id: version
attributes:
label: Package version
description: The package or binary version you actually ran, not "latest".
placeholder: "@mysten-incubation/memwal@0.0.x or memwal-mcp@0.0.x"
validations:
required: true

- type: textarea
id: what-happened
attributes:
label: What happened?
description: One or two sentences. What did you do, and what broke?
placeholder: memwal_analyze reported 3 blob_ids but restore shows 6 blobs in a fresh namespace.
validations:
required: true

- type: textarea
id: reproduce
attributes:
label: Steps to reproduce
description: Commands, tool calls, or UI clicks another person can follow.
placeholder: |
1. Create a fresh namespace.
2. Call memwal_analyze with text X.
3. Call memwal_restore / memwal_recall on that namespace.
validations:
required: true

- type: textarea
id: expected
attributes:
label: Expected
placeholder: Analyze writes N blobs and reports N blob_ids. Recall returns each fact once.
validations:
required: true

- type: textarea
id: actual
attributes:
label: Actual
placeholder: Tool reports 3 blob_ids. restore total=6. recall returns each fact twice.
validations:
required: true

- type: textarea
id: logs
attributes:
label: Logs or error text
description: Paste the error or tool response. Redact keys. Leave blank if none.
render: shell
validations:
required: false

- type: checkboxes
id: confirm
attributes:
label: Checks
options:
- label: I searched existing issues and this is not a duplicate.
required: true
- label: This report contains no private keys, mnemonics, or other secrets.
required: true
14 changes: 14 additions & 0 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
blank_issues_enabled: false
contact_links:
- name: Docs and troubleshooting
url: https://docs.wal.app/walrus-memory/troubleshooting/overview
about: 401s, login, empty recall, and MCP setup. Check here before filing a bug.
- name: Search existing issues
url: https://github.com/MystenLabs/MemWal/issues?q=is%3Aissue
about: Many requests (list, forget, timestamps, pagination) already have an issue.
- name: Walrus Discord
url: https://discord.gg/walrusprotocol
about: Questions and builder support that are not a bug or a feature request.
- name: Report a security vulnerability
url: https://github.com/MystenLabs/MemWal/security/advisories/new
about: Private advisory. Do not file a public issue for security findings.
63 changes: 63 additions & 0 deletions .github/ISSUE_TEMPLATE/feature.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
name: Feature request
description: Ask for a new capability. Search existing issues first. Duplicates are closed.
title: "[Feature] "
labels: ["enhancement"]
body:
- type: markdown
attributes:
value: |
Feature requests without a concrete problem are closed.

Search existing issues first. Requests for namespace listing, forget/delete, timestamps, and recall pagination already have threads. Comment there instead of opening a new issue.

- type: dropdown
id: surface
attributes:
label: Surface
options:
- TypeScript SDK (@mysten-incubation/memwal)
- Python SDK (memwal)
- MCP (@mysten-incubation/memwal-mcp)
- Relayer / hosted API
- Dashboard / Console (memory.walrus.xyz)
- Developer Playground
- OpenClaw plugin
- Docs
- Other
validations:
required: true

- type: textarea
id: problem
attributes:
label: Problem
description: What can you not do today? A real workload beats a wishlist.
placeholder: After an agent reset, stale memories keep winning recall. There is no way to stop a fact from being recalled.
validations:
required: true

- type: textarea
id: proposal
attributes:
label: What would you like?
description: The smallest change that would unblock you.
placeholder: An owner-scoped forget(memory_id) that stops the fact from appearing in recall.
validations:
required: true

- type: textarea
id: workaround
attributes:
label: Workaround today
description: What you do instead, if anything. Optional.
placeholder: Rotate the namespace prefix and abandon the old one.
validations:
required: false

- type: checkboxes
id: confirm
attributes:
label: Checks
options:
- label: I searched existing issues and this is not a duplicate.
required: true
187 changes: 187 additions & 0 deletions .github/workflows/test-sdk.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,187 @@
name: Test JS SDK

on:
pull_request:
paths:
- 'packages/sdk/**'
- '.github/workflows/test-sdk.yml'
push:
branches:
- main
- staging
- dev
paths:
- 'packages/sdk/**'
- '.github/workflows/test-sdk.yml'
workflow_dispatch:
inputs:
target_environment:
description: Benchmark environment to run the authenticated e2e suite against
required: true
type: choice
default: dev
options:
- dev
- staging
- production
schedule:
# Catches relayer drift with no code change to trigger it. Offset 30
# minutes from test-python-sdk.yml (17 9 * * 1) so the two weekly suites
# don't write through the shared bench account at the same time.
- cron: '47 9 * * 1'

concurrency:
group: test-sdk-${{ github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}

permissions:
contents: read

jobs:
unit:
name: Unit / Node ${{ matrix.node-version }}
runs-on: ubuntu-latest
timeout-minutes: 10

strategy:
fail-fast: false
matrix:
# 22 is what the rest of CI runs on; 24 is the active LTS.
node-version: ['22', '24']

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup pnpm
uses: pnpm/action-setup@v4

- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: pnpm

- name: Install deps
run: pnpm install --frozen-lockfile

- name: Typecheck, build and unit tests
run: pnpm --filter @mysten-incubation/memwal test

e2e:
name: E2E / ${{ github.event_name == 'workflow_dispatch' && inputs.target_environment || (github.ref_name == 'main' && 'production' || github.ref_name == 'staging' && 'staging' || 'dev') }} relayer
runs-on: ubuntu-latest
needs: unit
timeout-minutes: 30

# Each long-lived branch tests the deployment it corresponds to. Pull
# requests are excluded because environment secrets are withheld from fork
# PRs, and every authenticated run writes real memories.
if: >-
github.event_name == 'workflow_dispatch' ||
github.event_name == 'schedule' ||
(github.event_name == 'push' &&
(github.ref_name == 'dev' ||
github.ref_name == 'staging' ||
github.ref_name == 'main'))

# Reuses the credentials benchmark-live.yml and test-python-sdk.yml already
# rely on, so this needs no new secrets. Safe to share: the benchmark
# writes to the `benchmark` namespace while these tests use a per-run
# `sdk-e2e-<random>`.
#
# main maps to benchmark-production, so a push to main writes real
# memories through the live Walrus pipeline on the production benchmark
# account. That is intentional, and the per-run namespace is what keeps it
# contained — never point this job at an account holding user data, and
# never relax the namespace isolation in live.e2e.mjs.
environment:
name: benchmark-${{ github.event_name == 'workflow_dispatch' && inputs.target_environment || (github.ref_name == 'main' && 'production' || github.ref_name == 'staging' && 'staging' || 'dev') }}

env:
# Which deployment this run targets. Mirrors the `environment:` name
# above so error messages and the run summary can name it.
ENVIRONMENT_NAME: benchmark-${{ github.event_name == 'workflow_dispatch' && inputs.target_environment || (github.ref_name == 'main' && 'production' || github.ref_name == 'staging' && 'staging' || 'dev') }}
# BENCH_DELEGATE_KEY is the delegate private key the SDK signs with,
# which test/e2e/live.e2e.mjs reads as MEMWAL_PRIVATE_KEY.
MEMWAL_PRIVATE_KEY: ${{ secrets.BENCH_DELEGATE_KEY }}
MEMWAL_ACCOUNT_ID: ${{ secrets.BENCH_ACCOUNT_ID }}
# Public URL, set per environment (docs/relayer/benchmark-ci-setup.md).
# Deliberately NOT defaulted: with three environments in play, a literal
# fallback would silently run the production job against whichever
# relayer the default names. A missing variable fails the job instead.
MEMWAL_SERVER_URL: ${{ vars.BENCH_SERVER_URL }}

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup pnpm
uses: pnpm/action-setup@v4

- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: '22'
cache: pnpm

- name: Install deps
run: pnpm install --frozen-lockfile

- name: Build
run: pnpm --filter @mysten-incubation/memwal build

- name: Check credentials
id: config
shell: bash
run: |
set -euo pipefail

# Without the credentials the suite skips every authenticated test,
# and the job would report success having never exercised the
# relayer beyond /health. Without the URL there is no safe guess to
# fall back on. Fail instead of reporting a green run that proved
# nothing, or running the wrong deployment.
missing=0
for name in MEMWAL_PRIVATE_KEY MEMWAL_ACCOUNT_ID MEMWAL_SERVER_URL; do
if [ -z "${!name:-}" ]; then
echo "::error::${name} is empty — set BENCH_DELEGATE_KEY / BENCH_ACCOUNT_ID / BENCH_SERVER_URL on the ${ENVIRONMENT_NAME} environment."
missing=1
fi
done
if [ "$missing" -ne 0 ]; then
exit 1
fi
echo "authenticated=true" >> "$GITHUB_OUTPUT"

- name: E2E tests
id: e2e
working-directory: packages/sdk
run: |
node --test \
--test-reporter=spec --test-reporter-destination=stdout \
--test-reporter=junit --test-reporter-destination=e2e-results.xml \
"test/e2e/live.e2e.mjs"

- name: Write run summary
if: always()
run: |
{
echo "## JS SDK e2e"
echo
echo "| Field | Value |"
echo "| --- | --- |"
echo "| Environment | \`${ENVIRONMENT_NAME}\` |"
echo "| Relayer | \`${MEMWAL_SERVER_URL:-<unset>}\` |"
echo "| Authenticated | ${{ steps.config.outputs.authenticated }} |"
echo "| Result | ${{ steps.e2e.outcome }} |"
} >> "$GITHUB_STEP_SUMMARY"

- name: Upload e2e results
if: always()
uses: actions/upload-artifact@v4
with:
name: js-sdk-e2e-${{ env.ENVIRONMENT_NAME }}-${{ github.run_id }}
path: packages/sdk/e2e-results.xml
if-no-files-found: warn
retention-days: 14
Loading
Loading