Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
c88dda1
feat(python-sdk): add Python SDK with async client, signing, and AI m…
hien-p Apr 7, 2026
7a91c6c
Merge remote-tracking branch 'origin/dev' into feat/python-sdk-memwal
hien-p May 6, 2026
0318a0b
feat(python-sdk): sync with TS SDK async API (PR #121 / ENG-1406+1408)
hien-p May 6, 2026
a35778e
Merge remote-tracking branch 'origin/dev' into feat/python-sdk-memwal
hien-p May 8, 2026
2a8a5cc
feat: add sidecar upload diagnostics
May 16, 2026
2c825ac
chore: log sidecar runtime state
May 16, 2026
2a90cdc
Fix Walrus sidecar stale state handling
May 18, 2026
cfbbca3
Add existing delegate key import to setup
May 18, 2026
9471689
feat: add relayer observability and metrics
May 18, 2026
d4032db
docs(mcp): add how-it-works + changelog, expand quick-start & reference
hien-p May 18, 2026
6667168
docs(openclaw): add Changelog card to overview
hien-p May 18, 2026
79a5dc9
Merge pull request #163 from MystenLabs/main
ducnmm May 18, 2026
1a1d5a2
Merge pull request #162 from MystenLabs/docs/restructure-mcp-page
ducnmm May 18, 2026
efcc1b9
Merge pull request #161 from MystenLabs/feature/mem-31-add-relayer-ob…
ducnmm May 18, 2026
944f00a
feat(python-sdk): add PyPI release workflow
May 18, 2026
09cef54
feat(mcp): configurable default memory namespace
hien-p May 18, 2026
5686c2b
feat(python-sdk): env presets + full SDK docs + changelog
hien-p May 18, 2026
2ec55b3
Merge pull request #80 from MystenLabs/feat/python-sdk-memwal
ducnmm May 18, 2026
db42aaf
Merge pull request #165 from MystenLabs/feat/mcp-default-namespace
ducnmm May 18, 2026
bbf787b
perf(server): race walrus aggregator reads
May 18, 2026
c8a3029
Feat: Composite-scoring recall ranker (recency signal) (#168)
hungtranphamminh May 19, 2026
5fcc977
chore(ci): wait after benchmark remember phase
May 19, 2026
17ea770
fix(app): refine delegate key import setup
May 19, 2026
f863069
docs: add Nautilus TEE relayer deployment template
May 19, 2026
16892ee
Merge remote-tracking branch 'origin/dev' into chore/python-sdk-release
hien-p May 19, 2026
90e59b5
Merge pull request #164 from MystenLabs/chore/python-sdk-release
harrymove-ctrl May 19, 2026
47a1f6f
Feat: Pin prompt versions in benchmark run artifacts (#169)
hungtranphamminh May 19, 2026
6946981
Merge pull request #171 from MystenLabs/feature/mem-51-add-nautilus-t…
ducnmm May 19, 2026
6170bed
Merge pull request #170 from MystenLabs/feature/mem-46-dashboard-user…
ducnmm May 19, 2026
8db8aee
Merge pull request #166 from MystenLabs/feature/eng-1768-walrus-recal…
ducnmm May 19, 2026
9ab6eca
test(python-sdk): update signing tests to canonical 6-part message fo…
hien-p May 19, 2026
261fc1d
Merge pull request #172 from MystenLabs/fix/python-sdk-signing-test-f…
harrymove-ctrl May 19, 2026
9b38a38
docs: clarify TEE deployment pattern
May 19, 2026
0c67c64
Feat: extract.v2 — relax fact-extraction scope to both parties (#173)
hungtranphamminh May 20, 2026
80e6cd9
Improve sidecar upload recovery diagnostics
May 20, 2026
9f3fa8d
Merge remote-tracking branch 'origin/dev' into improve-sidecar-upload…
May 20, 2026
d97142a
Remove unrelated setup wizard change
May 20, 2026
2b45f9d
Fix upload recovery retry handling
May 20, 2026
1176c40
Merge pull request #175 from MystenLabs/feature/mem-51-add-nautilus-t…
ducnmm May 20, 2026
e5b98ca
Merge pull request #174 from MystenLabs/improve-sidecar-upload-recovery
ducnmm May 20, 2026
05f2568
feat(seal): default to Mysten committee aggregator
hien-p May 20, 2026
d74fd0f
Feat: MEM-54 — per-fact importance signal end-to-end + extract.v3 (#177)
hungtranphamminh May 20, 2026
5db484d
test(seal): cover legacy independent threshold
hien-p May 20, 2026
ae28740
chore(seal): keep SDK manual defaults unchanged
hien-p May 20, 2026
5bf97ff
docs(seal): clarify default config scope
May 21, 2026
933a0b2
Merge pull request #176 from MystenLabs/feat/default-seal-mysten-comm…
ducnmm May 21, 2026
1fd4d91
fix(python-sdk): align GET signing and use seal sessions
hien-p May 21, 2026
904f512
test(python-sdk): align integration tests with async remember
hien-p May 21, 2026
ab9fa73
fix(server): mark single remember jobs failed on recovery enqueue errors
hien-p May 21, 2026
acec445
test(server): add live remember terminal-state check
hien-p May 21, 2026
5a92871
Feat: MEM-57 — pre-extraction dedup context (Mem0 v3 pattern) + extra…
hungtranphamminh May 21, 2026
3b99984
test(python-sdk): mock SEAL session prereqs in middleware tests
jasong-03 May 21, 2026
10b7fc4
fix(server): persist remember handoff failures
hien-p May 21, 2026
cda4cea
test(server): isolate remember job db setup
hien-p May 21, 2026
5b1398d
Merge pull request #180 from MystenLabs/fix/remember-job-terminal-enq…
ducnmm May 21, 2026
b2d4b12
Merge pull request #179 from MystenLabs/fix/python-sdk-session-get-pa…
jasong-03 May 21, 2026
e7dee7f
Merge pull request #181 from MystenLabs/dev
ducnmm May 21, 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
6 changes: 6 additions & 0 deletions .github/workflows/benchmark-live.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,10 @@ on:
description: Remember runs
required: false
default: '3'
post_remember_sleep_secs:
description: Seconds to wait after remember before recall phases
required: false
default: '30'
cold_runs:
description: Cold-path runs
required: false
Expand Down Expand Up @@ -67,6 +71,7 @@ jobs:
QUERY: ${{ github.event.inputs.query || 'benchmark memory' }}
LIMIT: ${{ github.event.inputs.limit || '5' }}
REMEMBER_RUNS: ${{ github.event.inputs.remember_runs || '3' }}
POST_REMEMBER_SLEEP_SECS: ${{ github.event.inputs.post_remember_sleep_secs || '30' }}
COLD_RUNS: ${{ github.event.inputs.cold_runs || '3' }}
WARM_RUNS: ${{ github.event.inputs.warm_runs || '10' }}
BENCH_DELEGATE_KEY: ${{ secrets.BENCH_DELEGATE_KEY }}
Expand Down Expand Up @@ -113,6 +118,7 @@ jobs:
--namespace "$NAMESPACE" \
--limit "$LIMIT" \
--remember-runs "$REMEMBER_RUNS" \
--post-remember-sleep-secs "$POST_REMEMBER_SLEEP_SECS" \
--cold-runs "$COLD_RUNS" \
--warm-runs "$WARM_RUNS" \
--output benchmark-results/memory-api.json \
Expand Down
182 changes: 182 additions & 0 deletions .github/workflows/release-python-sdk.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,182 @@
name: Release Python SDK

on:
push:
branches:
- main
- staging
- dev
paths:
- 'packages/python-sdk-memwal/**'
- '.github/workflows/release-python-sdk.yml'
workflow_dispatch:
inputs:
release_channel:
description: "Release channel to use for a manual run from this ref"
required: true
default: dev
type: choice
options:
- dev
- staging
- current

concurrency: ${{ github.workflow }}-${{ github.ref }}

jobs:
release:
name: Build & Publish
runs-on: ubuntu-latest
permissions:
contents: write
id-token: write

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

- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: "3.11"

- name: Install dependencies
run: |
python -m pip install --upgrade pip build
python -m pip install -e "packages/python-sdk-memwal[dev]"

- name: Prepare package version
id: version
env:
RELEASE_CHANNEL: ${{ inputs.release_channel || 'current' }}
run: |
python <<'PY'
import json
import os
import re
import urllib.error
import urllib.request
from pathlib import Path

package = "memwal"
ref_name = os.environ["GITHUB_REF_NAME"]
event_name = os.environ["GITHUB_EVENT_NAME"]
release_channel = os.environ.get("RELEASE_CHANNEL", "current")
branch = (
release_channel
if event_name == "workflow_dispatch" and release_channel != "current"
else ref_name
)
pkg_dir = Path("packages/python-sdk-memwal")
pyproject = pkg_dir / "pyproject.toml"
init_file = pkg_dir / "memwal" / "__init__.py"

text = pyproject.read_text()
match = re.search(r'^version = "([^"]+)"', text, re.MULTILINE)
if not match:
raise SystemExit("Could not find project.version in pyproject.toml")

base_version = match.group(1)

def pypi_versions() -> list[str]:
try:
with urllib.request.urlopen(
f"https://pypi.org/pypi/{package}/json",
timeout=20,
) as response:
payload = json.load(response)
except urllib.error.HTTPError as err:
if err.code == 404:
return []
raise
return list(payload.get("releases", {}).keys())

versions = pypi_versions()
publish = branch in {"main", "staging", "dev"}

if branch == "main":
version = base_version
elif branch == "staging":
pattern = re.compile(rf"^{re.escape(base_version)}rc(\d+)$")
latest = max(
(int(m.group(1)) for v in versions if (m := pattern.match(v))),
default=-1,
)
version = f"{base_version}rc{latest + 1}"
elif branch == "dev":
pattern = re.compile(rf"^{re.escape(base_version)}\.dev(\d+)$")
latest = max(
(int(m.group(1)) for v in versions if (m := pattern.match(v))),
default=-1,
)
version = f"{base_version}.dev{latest + 1}"
else:
version = base_version

exists = version in versions

pyproject.write_text(
re.sub(
r'^version = "[^"]+"',
f'version = "{version}"',
text,
count=1,
flags=re.MULTILINE,
)
)
init_file.write_text(
re.sub(
r'^__version__ = "[^"]+"',
f'__version__ = "{version}"',
init_file.read_text(),
count=1,
flags=re.MULTILINE,
)
)

with open(os.environ["GITHUB_OUTPUT"], "a", encoding="utf-8") as output:
output.write(f"version={version}\n")
output.write(f"publish={str(publish).lower()}\n")
output.write(f"exists={str(exists).lower()}\n")

print(
f"Prepared {package} {version} "
f"(ref={ref_name}, channel={branch}, publish={publish}, exists={exists})"
)
PY

- name: Run tests
working-directory: packages/python-sdk-memwal
run: python -m pytest tests/test_signing.py tests/test_client.py tests/test_middleware.py -q

- name: Build package
working-directory: packages/python-sdk-memwal
run: python -m build

- name: Publish to PyPI
if: steps.version.outputs.publish == 'true' && steps.version.outputs.exists != 'true'
uses: pypa/gh-action-pypi-publish@release/v1
with:
packages-dir: packages/python-sdk-memwal/dist
print-hash: true

- name: Skip existing version
if: steps.version.outputs.publish == 'true' && steps.version.outputs.exists == 'true'
run: echo "memwal ${{ steps.version.outputs.version }} already exists on PyPI; skipping publish"

- name: Create GitHub Release
if: github.ref == 'refs/heads/main' && steps.version.outputs.exists != 'true'
uses: actions/github-script@v7
with:
script: |
const version = '${{ steps.version.outputs.version }}';
const tag = `memwal-python@${version}`;
await github.rest.repos.createRelease({
owner: context.repo.owner,
repo: context.repo.repo,
tag_name: tag,
name: tag,
body: `Release memwal Python SDK v${version}`,
draft: false,
prerelease: false,
});
9 changes: 9 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -123,3 +123,12 @@ railway-*.md
# Personal/internal planning notes — never include in repo
plans/
.local-plans/

# Benchmark archives + working analysis notes
# Kept locally under
# /Users/toiancom/WorkProjects/memwal/whole-system-documents/benchmark-archive/
# instead — see that README. Result JSONs are large (~10-25MB per run),
# add no value to source-tree clones, and have already lived their
# reviewable life in past PRs.
services/server/review/
claudedocs/
26 changes: 26 additions & 0 deletions apps/app/src/index.css
Original file line number Diff line number Diff line change
Expand Up @@ -1286,6 +1286,32 @@ h1, h2, h3 {
box-shadow: 2px 2px 0 #000000;
}

.setup-import-textarea {
box-shadow: var(--neo-shadow);
}

.setup-import-textarea:focus {
box-shadow: var(--neo-shadow);
}

.setup-import-button {
width: 100%;
justify-content: center;
border-radius: 12px;
box-shadow: var(--neo-shadow);
transition: transform 0.15s, box-shadow 0.15s;
}

.setup-import-button:hover:not(:disabled) {
transform: translate(-2px, -2px);
box-shadow: 5px 5px 0 #000000;
}

.setup-import-button:active:not(:disabled) {
transform: translate(2px, 2px);
box-shadow: 1px 1px 0 #000000;
}

/* ========== Spinner ========== */

.spinner {
Expand Down
Loading
Loading