Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
92 commits
Select commit Hold shift + click to select a range
79cd6fc
docs: show recall() scoringWeights on SKILL.md (WALM-616)
HoangDucBach Sep 11, 2026
89e29ac
docs: define ScoringWeights on SKILL.md (WALM-616)
HoangDucBach Sep 11, 2026
7aec019
fix(relayer): restart a failed same-key job on the insert-race path t…
nikola0x0 Sep 24, 2026
25656ad
fix(sdk): say what the relayer last reported when a remember wait tim…
nikola0x0 Sep 24, 2026
8df38e5
fix(python-sdk): say what the relayer last reported when a remember w…
nikola0x0 Sep 24, 2026
85c3348
fix(python-sdk): say the retry reuses the job only on the same client…
nikola0x0 Sep 24, 2026
aa42596
feat(sdk): listMemories() pages every memory without a query (WALM-388)
nikola0x0 Sep 24, 2026
82e5549
fix(relayer): report the paid-recovery state a same-key retry actuall…
nikola0x0 Sep 25, 2026
f8a0e05
fix(sdk): tell a timed-out remember wait to keep waiting on the job i…
nikola0x0 Sep 25, 2026
619b83d
fix(sdk): reject bad mock page sizes and honor recent recall (#1167)
ducnmm Oct 12, 2026
6a70580
fix(sdk): treat a remember options object as options and fix job stat…
ducnmm Oct 12, 2026
6626a71
fix: reject blank text, treat [::1] as local, and pin weekday dates (…
ducnmm Oct 12, 2026
7ff02e2
Merge branch 'dev' into nikola0x0/WALM-670
nikola0x0 Oct 12, 2026
a6fd852
fix(server): return each blob once in recall (WALM-594)
HoangDucBach Sep 8, 2026
0eae8f2
fix(server): refill recall limit after collapsing duplicate blobs
HoangDucBach Sep 9, 2026
73b13e6
fix(server): grow recall over-fetch by duplicate factor, cap at 4x
HoangDucBach Sep 9, 2026
d02d2e1
Merge pull request #887 from MystenLabs/wyner/walm-594-bug-memwal_rec…
HoangDucBach Oct 12, 2026
d9aa053
fix(sdk): throw when positional recall gets a namespace string (WALM-…
HoangDucBach Sep 8, 2026
3ea2895
fix(sdk): point recall TypeError at a call shape both APIs share
HoangDucBach Sep 9, 2026
68a446a
Merge pull request #877 from MystenLabs/wyner/walm-161-sdk-recall-pos…
HoangDucBach Oct 12, 2026
1c8c15f
fix(sdk): add default condition to exports map and place types first …
harrymove-ctrl Oct 12, 2026
3c978cf
fix(mcp): bind /connect/mcp consent to the local bridge (#368) (#370)
ducnmm Oct 12, 2026
d11abe9
Merge pull request #1020 from MystenLabs/nikolale/walm-388-no-operati…
nikola0x0 Oct 12, 2026
433e32b
Merge pull request #1015 from MystenLabs/nikola0x0/WALM-670
nikola0x0 Oct 12, 2026
fb00610
fix(sdk): retain lowest-distance hits under high-relevance-only token…
harrymove-ctrl Oct 12, 2026
e8c7b94
Merge pull request #1183 from MystenLabs/fix/issue-1103-recall-token-…
harrymove-ctrl Oct 12, 2026
c00f95b
Merge pull request #1181 from MystenLabs/fix/issue-1143-exports-default
harrymove-ctrl Oct 12, 2026
988b8c7
fix(sdk): clamp polling delay to deadline and ensure boundary poll ch…
harrymove-ctrl Oct 12, 2026
0df5033
fix(server,sdk): scope remember idempotency keys per namespace (WALM-…
hien-p Oct 12, 2026
9404306
fix(sdk): derive and forward idempotencyKey in rememberBulk (Fixes #1…
harrymove-ctrl Oct 12, 2026
e27b691
fix(python-sdk): anchor memory system instruction to start of prompt …
harrymove-ctrl Oct 12, 2026
b0b93ed
fix(python-sdk): support HTTP-date Retry-After and prevent float over…
harrymove-ctrl Oct 12, 2026
bde9bbd
fix(python-sdk): retry transport errors and bound polls by deadline i…
harrymove-ctrl Oct 12, 2026
f883381
fix(sdk): validate recall maxTokens and preserve matching total (Fixe…
harrymove-ctrl Oct 12, 2026
ba1485e
fix(sdk): warn on recall failure in withMemWal and add onRecallError …
harrymove-ctrl Oct 12, 2026
18393d6
fix(python-sdk): wrap docstring and tighten mock-compat TypeError ins…
harrymove-ctrl Oct 12, 2026
219f6b0
fix(python-sdk): fix ruff import sorting/unused imports and document …
harrymove-ctrl Oct 12, 2026
644cb10
fix(python-sdk): support LangChain multimodal system message, copy mo…
harrymove-ctrl Oct 12, 2026
b940979
fix(sdk): validate bulk idempotencyKey on MemWalMock and skip prefix …
harrymove-ctrl Oct 12, 2026
ad444ed
test(python-sdk): freeze time in HTTP-date retry test to eliminate su…
harrymove-ctrl Oct 12, 2026
1a5d17e
fix(python-sdk): derive content idempotency key in remember (Fixes #1…
harrymove-ctrl Oct 12, 2026
60cfabd
Merge pull request #1176 from MystenLabs/fix_idempotency_keys_namespace
harrymove-ctrl Oct 12, 2026
ad186db
Merge pull request #899 from MystenLabs/wyner/walm-616-bug-recall-can…
harrymove-ctrl Oct 12, 2026
e933327
fix(sdk): reject an empty namespace at construction
harrymove-ctrl Oct 12, 2026
5528724
fix(sdk): require a 32-byte Ed25519 seed at construction
harrymove-ctrl Oct 12, 2026
7ba3fc1
fix(sdk): reject a malformed listNamespaces cursor in the mock
harrymove-ctrl Oct 12, 2026
9a18ccc
fix(chatbot): rate-limit unauthenticated guest user creation (WALM-415)
HoangDucBach Aug 31, 2026
2e2883f
fix(chatbot): consume guest rate limit in authorize and wait for Redi…
HoangDucBach Sep 7, 2026
e1fa438
fix(chatbot): reconnect Redis and map guest limiter through Auth.js
HoangDucBach Sep 9, 2026
61f861b
Merge pull request #840 from MystenLabs/wyner/walm-415-bug-unauthenti…
HoangDucBach Oct 13, 2026
77e79d0
Merge pull request #1189 from MystenLabs/fix/issue-1159-python-mid-tu…
harrymove-ctrl Oct 13, 2026
1632092
Merge pull request #1191 from MystenLabs/fix/issue-1151-python-retry-…
harrymove-ctrl Oct 13, 2026
9bb64aa
Merge pull request #1192 from MystenLabs/fix/issue-1000-python-wait-t…
harrymove-ctrl Oct 13, 2026
be8e005
Merge pull request #1208 from MystenLabs/fix/issue-1200-key-length
harrymove-ctrl Oct 13, 2026
144f59f
Merge pull request #1206 from MystenLabs/fix/issue-1203-mock-cursor
harrymove-ctrl Oct 13, 2026
64f8079
Merge pull request #1205 from MystenLabs/fix/issue-1204-empty-namespace
harrymove-ctrl Oct 13, 2026
2900db8
Merge pull request #1199 from MystenLabs/fix/issue-1094-python-derive…
harrymove-ctrl Oct 13, 2026
406ffdc
Merge pull request #1194 from MystenLabs/fix/issue-1118-withmemwal-re…
harrymove-ctrl Oct 13, 2026
1c82a59
Merge pull request #1193 from MystenLabs/fix/issue-1068-recall-max-to…
harrymove-ctrl Oct 13, 2026
07064f7
Merge pull request #1188 from MystenLabs/fix/issue-1080-bulk-idempote…
harrymove-ctrl Oct 13, 2026
d3ddfc2
Merge pull request #1187 from MystenLabs/fix/issue-1081-wait-for-reme…
harrymove-ctrl Oct 13, 2026
a084460
fix(sdk): default account and manual helpers to a gRPC Sui client (WA…
nikola0x0 Oct 13, 2026
ffea69b
Merge pull request #1221 from MystenLabs/nikola0x0/GH-164
nikola0x0 Oct 13, 2026
d00ae1d
fix(sdk): reject unsafe remember job ids (WALM-833)
ducnmm Oct 14, 2026
91ce5c9
fix(sdk): stop preflights from consuming recall's abort budget (WALM-…
harrymove-ctrl Oct 14, 2026
8c29491
fix(mcp): mint a fresh delegate key on forced login (WALM-645) (#946)
harrymove-ctrl Oct 14, 2026
56c807c
fix(sdk): surface a failed auto-save from flush (#1209)
harrymove-ctrl Oct 14, 2026
5218032
fix(sdk): preserve matching total under recall maxDistance filter (Fi…
harrymove-ctrl Oct 14, 2026
dd00818
fix(mcp): derive remember idempotency key from resolved namespace (Fi…
harrymove-ctrl Oct 14, 2026
6bd3310
fix(mcp): validate hex input in hexToBytes and support uppercase 0X (…
harrymove-ctrl Oct 14, 2026
5d94673
fix(python-sdk): redact IPv6, 0.0.0.0, and localhost subdomains in er…
harrymove-ctrl Oct 14, 2026
2bccdbb
fix(python-sdk): support uppercase 0X prefix in normalize_private_key…
harrymove-ctrl Oct 14, 2026
4a51990
fix(sdk): validate accountId in MemWal.create and MemWalManual.create…
harrymove-ctrl Oct 14, 2026
d865354
fix(sdk): validate limit is a positive integer in recall, recallManua…
harrymove-ctrl Oct 14, 2026
aa582ee
fix(sdk): attach SEAL session and timeout in MemWalManual.restore (Fi…
harrymove-ctrl Oct 14, 2026
6f20ea8
fix(python-sdk): expose created_at and score in RecallMemory and Reca…
harrymove-ctrl Oct 14, 2026
de6d6b7
fix(sdk): suppress recall and auto-save on tool execution steps (Fixe…
harrymove-ctrl Oct 14, 2026
783a763
fix(python-sdk): suppress recall and auto-save on tool execution step…
harrymove-ctrl Oct 14, 2026
812039b
feat(app): land the Sept 2026 dashboard branch on dev (#1169)
ducnmm Oct 15, 2026
6cfac38
docs: add a guide for importing existing agent memory (#1197)
ducnmm Oct 15, 2026
11d8016
fix(sdk): drop the dead Walrus import and split recallManual results …
ducnmm Oct 15, 2026
002539d
fix(server): hold back migration 025 until the next release (#1225)
nikola0x0 Oct 15, 2026
1a17c24
fix(indexer): decode checkpoints carrying the Validity expiration (WA…
ducnmm Oct 15, 2026
15ccba1
fix(oauth): don't burn the session when Sui is unavailable (WALM-605)…
harrymove-ctrl Oct 15, 2026
53cc8dc
docs: list requestTimeoutMs and the accepted key formats (#1231)
harrymove-ctrl Oct 15, 2026
557424a
fix(sdk): reject an invalid analyze date in the mock (#1229)
harrymove-ctrl Oct 15, 2026
23a7d80
fix(sdk): reject an invalid recall query, limit, or weight (#1228)
harrymove-ctrl Oct 15, 2026
34e520f
fix(sdk): reject a non-array bulk status id list (#1226)
harrymove-ctrl Oct 15, 2026
7da6330
fix(sdk): reject a non-finite recall maxDistance (#1227)
harrymove-ctrl Oct 16, 2026
0b802ce
fix(sdk): reject an object passed as remember text (#1230)
harrymove-ctrl Oct 16, 2026
c59e679
fix(sdk): turn an empty or non-JSON 2xx body into an SDK error (#1207)
harrymove-ctrl Oct 16, 2026
256ac7f
fix(relayer): refresh the Walrus price when the payment split is shor…
ducnmm Oct 16, 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: 14 additions & 3 deletions SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -150,9 +150,9 @@ const stored = await memwal.waitForRememberJob(accepted.job_id, {

| Method | Description | Returns |
|---|---|---|
| `remember(text, namespace?)` | Accept one memory job immediately | `{ job_id, status }` |
| `remember(text, namespaceOrOptions?, options?)` | Accept one memory job immediately. A plain object in the namespace slot is options (`{ idempotencyKey }`), not a namespace | `{ job_id, status }` |
| `rememberAndWait(text, namespace?, opts?)` | Store one memory and wait for completion | `{ id, job_id, blob_id, owner, namespace }` |
| `recall({ query, limit?, topK?, namespace?, maxDistance? })` *(preferred)* or `recall(query, limit?, namespace?)` | Semantic search for memories | `{ results: [{ blob_id, text, distance }], total }` |
| `recall({ query, limit?, topK?, namespace?, maxDistance?, sort?, scoringWeights? })` *(preferred)* or `recall(query, limit?, namespace?)` | Semantic search for memories | `{ results: [{ blob_id, text, distance }], total }` |
| `analyze(text, namespace?)` | Extract facts and accept one memory job per fact | `{ job_ids, facts, fact_count, status, owner }` |
| `analyzeAndWait(text, namespace?, opts?)` | Extract facts and wait for all fact jobs to complete | `{ results, facts, total, succeeded, failed, owner }` |
| `restore(namespace, limit?)` | Rebuild missing index entries from Walrus | `{ restored, skipped, failed, total, namespace, owner, truncated }` |
Expand Down Expand Up @@ -208,9 +208,19 @@ interface RecallOptions {
topK?: number; // alias of limit; if both are set, topK wins
namespace?: string;
maxDistance?: number;
sort?: "relevance" | "recent";
scoringWeights?: ScoringWeights; // sent as scoring_weights; omit to keep cosine order
}

interface ScoringWeights {
semantic?: number; // default 1
recency?: number; // default 0
recencyHalfLifeDays?: number; // default 30
importance?: number; // default 0
}

// `topK` and `limit` are aliases for the same value; if both are provided, `topK` takes precedence.
// `sort: "recent"` is newest-wins (over-fetch then write-time). `scoringWeights` only re-ranks the cosine window.

interface RememberBulkAcceptedResult {
job_ids: string[];
Expand All @@ -236,6 +246,7 @@ interface AnalyzeResult {
interface RememberBulkStatusItem {
job_id: string;
status: "pending" | "running" | "uploaded" | "done" | "failed" | "not_found";
namespace?: string; // present when the job row exists; omitted for not_found
blob_id?: string;
error?: string;
}
Expand Down Expand Up @@ -574,7 +585,7 @@ Lifecycle hooks run automatically:
| `health()` returns error | Check relayer URL is correct and reachable |
| `recall()` returns empty | Verify namespace matches what was used in `remember()` |
| `recall()` returns unrelated filler | Recall is top-K without a default relevance threshold; filter by `distance`, for example `distance < 0.8`, and calibrate the cutoff against your data |
| `401 Unauthorized` | Usually wrong `MEMWAL_PRIVATE_KEY`, key not registered on the account, account ID mismatch, or staging/mainnet mismatch. Check `.env.local` and dashboard credentials |
| `401 Unauthorized` | Usually wrong `MEMWAL_PRIVATE_KEY`, key not registered on the account, account ID mismatch (a wallet address is not a MemWal account ID), or staging/mainnet mismatch. Check `.env.local` and dashboard credentials |
| SDK import errors | Run `pnpm add @mysten-incubation/memwal` — check Node.js ≥ 18 |
| Manual client errors | Install peer deps: `@mysten/sui @mysten/seal @mysten/walrus` |
| Direct Sui reads fail or examples look stale | Prefer `SuiGrpcClient` from `@mysten/sui/grpc`; JSON-RPC snippets using `SuiClient` / `getFullnodeUrl` may be stale |
Expand Down
167 changes: 85 additions & 82 deletions apps/app/src/index.css
Original file line number Diff line number Diff line change
Expand Up @@ -14827,6 +14827,22 @@ body:has(.signin-proposed) {
overflow: hidden;
background: #000000;
color: #faf8f5;
/* The artboard is 966 tall, but the laptop tile ends near 857. Fit to
880 so the empty tail does not shrink the page. Centered when shorter
than the window. From 1.9:1 upward the size stays what it is at 1.9
for this width, and the page scrolls. Spare width pulls the laptop
until 100px stays clipped. */
--signin-frame-height: 880px;
--signin-scale: min(100vw / 1440px, 100vh / var(--signin-frame-height));
--signin-stage-left: calc(100vw - 1440px * var(--signin-scale));
--signin-pull: max(0px, min(var(--signin-stage-left), 191px * var(--signin-scale) - 100px));
--signin-frame-top: max(0px, (100vh - var(--signin-frame-height) * var(--signin-scale)) / 2);
}

@media (min-width: 720px) and (aspect-ratio >= 1.9) {
.signin-proposed {
--signin-scale: calc(100vw / (1.9 * var(--signin-frame-height)));
}
}

.signin-fit {
Expand All @@ -14836,8 +14852,11 @@ body:has(.signin-proposed) {
}

.signin-fit--desktop {
width: min(100vw, calc(100vh * 1440 / 966));
height: min(100vh, calc(100vw * 966 / 1440));
width: 100vw;
height: calc(var(--signin-frame-height) * var(--signin-scale));
margin-top: var(--signin-frame-top);
margin-left: 0;
margin-right: 0;
}

.signin-fit--mobile {
Expand All @@ -14857,9 +14876,9 @@ body:has(.signin-proposed) {
}

.signin-stage--desktop {
width: 1440px;
width: calc(100vw / var(--signin-scale));
height: 966px;
transform: scale(calc(100cqw / 1440px));
transform: scale(var(--signin-scale));
}

.signin-stage--mobile {
Expand Down Expand Up @@ -14928,7 +14947,32 @@ body:has(.signin-proposed) {
display: none;
}

.signin-scroll {
height: 100%;
overflow: hidden;
}

.signin-sheet {
position: relative;
display: flow-root;
width: 100%;
min-height: 100%;
overflow: clip;
}

@media (min-width: 720px) {
.signin-proposed {
align-items: stretch;
justify-content: flex-start;
}

.signin-scroll {
display: block;
width: 100%;
height: 100%;
overflow: hidden;
}

.signin-stage--desktop {
background: transparent;
}
Expand All @@ -14938,108 +14982,67 @@ body:has(.signin-proposed) {
display: none;
}

.signin-fit--desktop {
z-index: 1;
}

.signin-glow--pin {
display: block;
position: fixed;
position: absolute;
z-index: 0;
top: calc(var(--signin-frame-top) - 252px * var(--signin-scale));
left: calc(var(--signin-stage-left) - var(--signin-pull) - 187px * var(--signin-scale));
width: calc(1814px * var(--signin-scale));
height: calc(776px * var(--signin-scale));
background-image: url('/signin/glow-desktop.png');
}

.signin-fit--desktop {
z-index: 1;
}

.signin-logo--pin {
display: block;
position: fixed;
top: 28px;
position: absolute;
top: calc(var(--signin-frame-top) + 28px * var(--signin-scale));
left: calc(50px * var(--signin-scale));
z-index: 30;
width: calc(117px * min(100cqw, 100cqh * 1440 / 966) / 1440px);
height: calc(53.929px * min(100cqw, 100cqh * 1440 / 966) / 1440px);
width: calc(117px * var(--signin-scale));
height: calc(53.929px * var(--signin-scale));
}

/* The stage spans the viewport. Slide the laptop group toward the right,
then back left by the spare width so more of the clipped screen shows. */
.signin-stage--desktop .signin-hero {
position: absolute;
inset: 0;
translate: calc((var(--signin-stage-left) - var(--signin-pull)) / var(--signin-scale)) 0;
}

/* Same ellipse as Figma, but outside the stage so the blur is not cut off
at the stage edge and the purple continues into the right corner. */
.signin-bloom--pin {
display: block;
position: fixed;
position: absolute;
z-index: 0;
width: calc(368px * min(100cqw, 100cqh * 1440 / 966) / 1440px);
height: calc(480px * min(100cqw, 100cqh * 1440 / 966) / 1440px);
top: calc(
(100cqh - min(100cqh, 100cqw * 966 / 1440)) / 2
+ 224px * min(100cqw, 100cqh * 1440 / 966) / 1440px
);
top: calc(var(--signin-frame-top) + 224px * var(--signin-scale));
left: calc(var(--signin-stage-left) - var(--signin-pull) + 882px * var(--signin-scale));
width: calc(368px * var(--signin-scale));
height: calc(480px * var(--signin-scale));
border-radius: 50%;
background: linear-gradient(to bottom, #2f43cb, #9550c2);
filter: blur(calc(387px * min(100cqw, 100cqh * 1440 / 966) / 1440px));
filter: blur(calc(387px * var(--signin-scale)));
pointer-events: none;
}
}

/* Pin right only while the window is at least as tall as a 14-inch fullscreen
(1512×982). The spare width there is about 48px, so the laptop still meets
the edge. */
@media (min-width: 720px) and (aspect-ratio <= 1512 / 982) {
.signin-fit--desktop {
margin-left: auto;
}

.signin-glow--pin {
top: calc(-252px * 100cqw / 1440px);
left: calc(-187px * 100cqw / 1440px);
width: calc(1814px * 100cqw / 1440px);
height: calc(776px * 100cqw / 1440px);
}

.signin-logo--pin {
left: calc(
(100cqw - min(100cqw, 100cqh * 1440 / 966))
+ 50px * min(100cqw, 100cqh * 1440 / 966) / 1440px
);
}

.signin-bloom--pin {
left: calc(
(100cqw - min(100cqw, 100cqh * 1440 / 966))
+ 882px * min(100cqw, 100cqh * 1440 / 966) / 1440px
);
}
}

/* Shorter than a 14-inch window: grow the whole stage to the window width
so the laptop meets the right edge. The bottom of the artboard clips. */
@media (min-width: 720px) and (aspect-ratio > 1512 / 982) {
.signin-proposed {
align-items: flex-start;
}

.signin-fit--desktop {
width: 100vw;
height: calc(100vw * 966 / 1440);
margin-left: 0;
}

.signin-glow--pin {
top: calc(-252px * 100cqw / 1440px);
left: calc(-187px * 100cqw / 1440px);
width: calc(1814px * 100cqw / 1440px);
height: calc(776px * 100cqw / 1440px);
}

.signin-logo--pin {
top: calc(28px * 100cqw / 1440px);
left: calc(50px * 100cqw / 1440px);
width: calc(117px * 100cqw / 1440px);
height: calc(53.929px * 100cqw / 1440px);
@media (min-width: 720px) and (aspect-ratio >= 1.9) {
.signin-scroll {
overflow-x: hidden;
overflow-y: auto;
scrollbar-width: none;
}

.signin-bloom--pin {
top: calc(224px * 100cqw / 1440px);
left: calc(882px * 100cqw / 1440px);
width: calc(368px * 100cqw / 1440px);
height: calc(480px * 100cqw / 1440px);
filter: blur(calc(387px * 100cqw / 1440px));
.signin-scroll::-webkit-scrollbar {
display: none;
width: 0;
height: 0;
}
}

Expand Down
Loading
Loading