memwal 0.2.2.dev4__tar.gz → 0.2.2.dev5__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {memwal-0.2.2.dev4 → memwal-0.2.2.dev5}/CHANGELOG.md +11 -11
- {memwal-0.2.2.dev4 → memwal-0.2.2.dev5}/PKG-INFO +1 -1
- {memwal-0.2.2.dev4 → memwal-0.2.2.dev5}/memwal/__init__.py +1 -1
- {memwal-0.2.2.dev4 → memwal-0.2.2.dev5}/pyproject.toml +1 -1
- {memwal-0.2.2.dev4 → memwal-0.2.2.dev5}/.gitignore +0 -0
- {memwal-0.2.2.dev4 → memwal-0.2.2.dev5}/README.md +0 -0
- {memwal-0.2.2.dev4 → memwal-0.2.2.dev5}/examples/.env.example +0 -0
- {memwal-0.2.2.dev4 → memwal-0.2.2.dev5}/examples/.gitignore +0 -0
- {memwal-0.2.2.dev4 → memwal-0.2.2.dev5}/examples/async_remember_demo.py +0 -0
- {memwal-0.2.2.dev4 → memwal-0.2.2.dev5}/examples/interactive_demo.py +0 -0
- {memwal-0.2.2.dev4 → memwal-0.2.2.dev5}/examples/verify_credentials.py +0 -0
- {memwal-0.2.2.dev4 → memwal-0.2.2.dev5}/memwal/client.py +0 -0
- {memwal-0.2.2.dev4 → memwal-0.2.2.dev5}/memwal/compatibility.py +0 -0
- {memwal-0.2.2.dev4 → memwal-0.2.2.dev5}/memwal/middleware.py +0 -0
- {memwal-0.2.2.dev4 → memwal-0.2.2.dev5}/memwal/mock.py +0 -0
- {memwal-0.2.2.dev4 → memwal-0.2.2.dev5}/memwal/types.py +0 -0
- {memwal-0.2.2.dev4 → memwal-0.2.2.dev5}/memwal/utils.py +0 -0
- {memwal-0.2.2.dev4 → memwal-0.2.2.dev5}/notebooks/walrus_memory_python_sdk.ipynb +0 -0
- {memwal-0.2.2.dev4 → memwal-0.2.2.dev5}/run_tests.py +0 -0
- {memwal-0.2.2.dev4 → memwal-0.2.2.dev5}/tests/__init__.py +0 -0
- {memwal-0.2.2.dev4 → memwal-0.2.2.dev5}/tests/test_ask_validation.py +0 -0
- {memwal-0.2.2.dev4 → memwal-0.2.2.dev5}/tests/test_auth_rejected_message.py +0 -0
- {memwal-0.2.2.dev4 → memwal-0.2.2.dev5}/tests/test_blank_text.py +0 -0
- {memwal-0.2.2.dev4 → memwal-0.2.2.dev5}/tests/test_client.py +0 -0
- {memwal-0.2.2.dev4 → memwal-0.2.2.dev5}/tests/test_destroy_and_cancel_shield.py +0 -0
- {memwal-0.2.2.dev4 → memwal-0.2.2.dev5}/tests/test_empty_namespace.py +0 -0
- {memwal-0.2.2.dev4 → memwal-0.2.2.dev5}/tests/test_env_presets.py +0 -0
- {memwal-0.2.2.dev4 → memwal-0.2.2.dev5}/tests/test_forget.py +0 -0
- {memwal-0.2.2.dev4 → memwal-0.2.2.dev5}/tests/test_integration.py +0 -0
- {memwal-0.2.2.dev4 → memwal-0.2.2.dev5}/tests/test_json_body.py +0 -0
- {memwal-0.2.2.dev4 → memwal-0.2.2.dev5}/tests/test_list_namespaces.py +0 -0
- {memwal-0.2.2.dev4 → memwal-0.2.2.dev5}/tests/test_middleware.py +0 -0
- {memwal-0.2.2.dev4 → memwal-0.2.2.dev5}/tests/test_missing_response_fields.py +0 -0
- {memwal-0.2.2.dev4 → memwal-0.2.2.dev5}/tests/test_mock.py +0 -0
- {memwal-0.2.2.dev4 → memwal-0.2.2.dev5}/tests/test_nonfinite_validation.py +0 -0
- {memwal-0.2.2.dev4 → memwal-0.2.2.dev5}/tests/test_normalize_server_url.py +0 -0
- {memwal-0.2.2.dev4 → memwal-0.2.2.dev5}/tests/test_polling_delay.py +0 -0
- {memwal-0.2.2.dev4 → memwal-0.2.2.dev5}/tests/test_recall_validation.py +0 -0
- {memwal-0.2.2.dev4 → memwal-0.2.2.dev5}/tests/test_recall_weights.py +0 -0
- {memwal-0.2.2.dev4 → memwal-0.2.2.dev5}/tests/test_remember_derived_key.py +0 -0
- {memwal-0.2.2.dev4 → memwal-0.2.2.dev5}/tests/test_retry_after_http_date.py +0 -0
- {memwal-0.2.2.dev4 → memwal-0.2.2.dev5}/tests/test_signing.py +0 -0
- {memwal-0.2.2.dev4 → memwal-0.2.2.dev5}/tests/test_transport_retry.py +0 -0
|
@@ -23,8 +23,8 @@ Unreleased.
|
|
|
23
23
|
|
|
24
24
|
### Fixed
|
|
25
25
|
|
|
26
|
-
- `with_memwal_*` gains `save_mode` and confirmable saves: `memwal_wait_for_saves` (async and sync) polls every job the middleware enqueued, and restores the job ids if that poll raises so a retry can still confirm them. (
|
|
27
|
-
- `wait_for_remember_jobs` chunks its status reads to the relayer's 20-id `MAX_BULK_ITEMS` cap. Above it the relayer answers a non-transient 400, so a wait over 21+ jobs raised on every attempt and could never confirm — reachable from `save_mode="remember"` after 21 turns, or from two fat `analyze` extracts.
|
|
26
|
+
- `with_memwal_*` gains `save_mode` and confirmable saves: `memwal_wait_for_saves` (async and sync) polls every job the middleware enqueued, and restores the job ids if that poll raises so a retry can still confirm them. (#410, #411, #412)
|
|
27
|
+
- `wait_for_remember_jobs` chunks its status reads to the relayer's 20-id `MAX_BULK_ITEMS` cap. Above it the relayer answers a non-transient 400, so a wait over 21+ jobs raised on every attempt and could never confirm — reachable from `save_mode="remember"` after 21 turns, or from two fat `analyze` extracts.
|
|
28
28
|
|
|
29
29
|
- Save confirmation preserves unconfirmed job IDs when an async wait is cancelled or a synchronous wait is interrupted, then propagates the cancellation or interrupt. (#1303)
|
|
30
30
|
- Reject explicitly empty namespaces instead of silently writing to the default namespace. (#1265)
|
|
@@ -45,7 +45,7 @@ Unreleased.
|
|
|
45
45
|
|
|
46
46
|
### Added
|
|
47
47
|
|
|
48
|
-
- `get_remember_status(job_id)` on `MemWal` and `MemWalSync` returns `RememberJobStatus` from `GET /api/remember/{job_id}`, accepting 200 and 404 like the TypeScript SDK. (
|
|
48
|
+
- `get_remember_status(job_id)` on `MemWal` and `MemWalSync` returns `RememberJobStatus` from `GET /api/remember/{job_id}`, accepting 200 and 404 like the TypeScript SDK. (#1096)
|
|
49
49
|
- `RecallMemory` and `RecallManualHit` include `created_at` and `score`. (#1178)
|
|
50
50
|
- `RecallParams` accepts `scoring_weights` and `sort`. `recall()` forwards them on `POST /api/recall`. (#1062)
|
|
51
51
|
|
|
@@ -53,18 +53,18 @@ Unreleased.
|
|
|
53
53
|
|
|
54
54
|
- The default `server_url` is `https://relayer.memory.walrus.xyz`, matching the TypeScript SDK. `env="local"` still selects `http://127.0.0.1:8000`. (#1064)
|
|
55
55
|
- `remember` derives an idempotency key from the namespace and text inside a 30-minute bucket, matching the TypeScript SDK. A retry inside that window reuses the job. An explicit `idempotency_key` still wins. `remember_bulk_async` still sends no key. (#1094)
|
|
56
|
-
- `get_remember_status` and `wait_for_remember_job` reject a job id outside `[A-Za-z0-9_-]+` before the request. `.`, `..`, a backslash, and encoded dot-dot used to pass a denylist and be rewritten after signing. An empty id used to call `GET /api/remember/` and raise `json.JSONDecodeError`. An unparseable 404 is `not_found` / `MemWalRememberJobNotFound`, not a JSON error. `uuid.UUID` is coerced with `str()`. Valid UUID job ids are unchanged. (
|
|
56
|
+
- `get_remember_status` and `wait_for_remember_job` reject a job id outside `[A-Za-z0-9_-]+` before the request. `.`, `..`, a backslash, and encoded dot-dot used to pass a denylist and be rewritten after signing. An empty id used to call `GET /api/remember/` and raise `json.JSONDecodeError`. An unparseable 404 is `not_found` / `MemWalRememberJobNotFound`, not a JSON error. `uuid.UUID` is coerced with `str()`. Valid UUID job ids are unchanged. (#1100, #1216)
|
|
57
57
|
- `remember`, `remember_bulk`, `analyze`, and `embed` reject whitespace-only text before the request. A blank body used to be accepted and then sit until the caller timed out. (#1129)
|
|
58
58
|
- A 401 `AUTH_REJECTED` now says a wallet address is not a MemWal account ID. (#1132)
|
|
59
|
-
- `wait_for_remember_jobs` / `remember_bulk_and_wait` no longer return a batch they could not read as if it were still uploading. When every status poll is rate-limited, the wait makes one confirming read and raises `MemWalRateLimited` (`status` 429, `job_ids`, `retry_after`) if that is refused too. An item still unsettled at the deadline names its last known status, or says no read got through. (
|
|
60
|
-
- A job the bulk status response omits stays pending and is asked about again. It used to drop out and settle as `timeout`.
|
|
59
|
+
- `wait_for_remember_jobs` / `remember_bulk_and_wait` no longer return a batch they could not read as if it were still uploading. When every status poll is rate-limited, the wait makes one confirming read and raises `MemWalRateLimited` (`status` 429, `job_ids`, `retry_after`) if that is refused too. An item still unsettled at the deadline names its last known status, or says no read got through. (#967)
|
|
60
|
+
- A job the bulk status response omits stays pending and is asked about again. It used to drop out and settle as `timeout`.
|
|
61
61
|
- `wait_for_remember_job` retries a transport error and stops at the caller's deadline. `Retry-After` may be a number of seconds or an HTTP date. (#1000, #1151)
|
|
62
|
-
- `MemWalRememberJobTimeout` carries `last_status`, `server_error` and `last_refusal`, and its message names the relayer's last reported state. Under upload congestion a job stays `running` for up to ~25 minutes while the relayer retries, and the timeout used to hide that, so a job that was still retrying looked dead. (
|
|
63
|
-
- A `max_distance` filter keeps the relayer's matching `total` instead of replacing it with the number of rows left.
|
|
62
|
+
- `MemWalRememberJobTimeout` carries `last_status`, `server_error` and `last_refusal`, and its message names the relayer's last reported state. Under upload congestion a job stays `running` for up to ~25 minutes while the relayer retries, and the timeout used to hide that, so a job that was still retrying looked dead. (#966)
|
|
63
|
+
- A `max_distance` filter keeps the relayer's matching `total` instead of replacing it with the number of rows left.
|
|
64
64
|
- Middleware does not recall or auto-save on a tool-execution step. A later tool step reuses the cached recall. `flush()` raises when a background save failed, and `on_save_error` runs. The memory instruction is anchored at the start of the prompt. (#1107, #1117, #1159)
|
|
65
65
|
- `normalize_private_key` accepts an uppercase `0X` prefix. Error text redacts IPv6, `0.0.0.0`, and `localhost` subdomains. (#1172, #1161)
|
|
66
|
-
- Grow `wait_for_remember_job` / `wait_for_remember_jobs` poll delay 1.5× from the caller interval (floor 100ms) toward a 5s cap, with an immediate first poll. Backoff is disabled above the cap.
|
|
67
|
-
- A 429 during a remember-job wait is reported on the timeout. Retry-After is still clamped to the caller's remaining budget, and that remainder still buys one status read.
|
|
66
|
+
- Grow `wait_for_remember_job` / `wait_for_remember_jobs` poll delay 1.5× from the caller interval (floor 100ms) toward a 5s cap, with an immediate first poll. Backoff is disabled above the cap.
|
|
67
|
+
- A 429 during a remember-job wait is reported on the timeout. Retry-After is still clamped to the caller's remaining budget, and that remainder still buys one status read.
|
|
68
68
|
|
|
69
69
|
## 0.1.11
|
|
70
70
|
|
|
@@ -84,7 +84,7 @@ Unreleased.
|
|
|
84
84
|
|
|
85
85
|
- HTTP 503 with `x-auth-error: AUTH_UPSTREAM_UNAVAILABLE` is reported as a retryable credential-verification outage, not a sign-in failure. Other 503s keep the generic sanitized body.
|
|
86
86
|
- `remember_bulk_async` rejects an empty `items` list before the request and raises when the relayer returns a `job_ids` length that does not match the batch.
|
|
87
|
-
- restore `truncated` docs now match
|
|
87
|
+
- restore `truncated` docs now match the relayer’s retryable-incomplete semantics.
|
|
88
88
|
- Warn when `server_url` uses plaintext `http://` against a non-localhost host, matching the TypeScript SDK `normalizeServerUrl` guard. Localhost, `127.0.0.1`, `::1`, and `*.localhost` are exempt; invalid URLs are left for the HTTP client to surface. The warning logs only scheme, host, and port so URL userinfo is not written to logs.
|
|
89
89
|
|
|
90
90
|
## 0.1.8
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: memwal
|
|
3
|
-
Version: 0.2.2.
|
|
3
|
+
Version: 0.2.2.dev5
|
|
4
4
|
Summary: Python SDK for Walrus Memory — Privacy-first AI memory with Ed25519 signing
|
|
5
5
|
Project-URL: Homepage, https://memory.walrus.xyz
|
|
6
6
|
Project-URL: Documentation, https://memory.walrus.xyz
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|