sibyl-memory-cli 0.3.3__tar.gz → 0.3.5__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sibyl-memory-cli
3
- Version: 0.3.3
3
+ Version: 0.3.5
4
4
  Summary: Command-line interface for the Sibyl Memory Plugin. `sibyl init` activates, `sibyl upgrade` runs the staker / subscription flow, `sibyl status` shows current tier and DB stats, `sibyl whoami` gives a one-line account summary, `sibyl devices` lists active devices and supports per-device revoke.
5
5
  Author-email: "SIBYL, Sibyl Labs LLC" <sibyl@sibyllabs.org>
6
6
  License: MIT
@@ -48,32 +48,34 @@ sibyl health Run the SibylMemoryProvider self-check (schema versi
48
48
  ```bash
49
49
  $ sibyl init
50
50
 
51
- Sibyl Memory Plugin · activation
51
+ activation · three paths · pick whichever fits your device
52
52
 
53
- Session: a1b2c3d4…e5f6
54
- Opening: https://sibyllabs.org/plugin/activate?session=a1b2c3d4-…
53
+ Session a1b2c3d4…e5f6
54
+ Code 1 2 3 4 5 6 (use this in the email panel)
55
+ Opening https://auth.sibyllabs.org/a1b2c3d4-…
55
56
 
56
- Sign in with your wallet in the browser. This terminal will pick up automatically.
57
+ desktop wallet · email + code · or send USDC from any mobile wallet
58
+ this terminal will pick up automatically when you bind.
57
59
 
58
- ⠹ waiting for browser activation … 9:42 left
60
+ ⠹ watching the network for your bind … 9:42 left
59
61
  ```
60
62
 
61
- The browser opens. Sign a SIWE message with your wallet. The terminal picks up the moment the binding lands. Credentials are written to `~/.sibyl-memory/credentials.json` at mode 0600.
63
+ The browser opens to a dedicated short-URL auth subdomain (`auth.sibyllabs.org/<session-uuid>`). Pick a wallet from the EIP-6963 picker (Rabby / MetaMask / Coinbase Wallet / Frame / Brave / Rainbow), enter email + 6-digit code, or send a unique sub-cent USDC amount from any mobile wallet on Base. The terminal picks up the moment any of the three paths binds. Credentials are written to `~/.sibyl-memory/credentials.json` at mode 0600.
62
64
 
63
65
  ## Upgrade
64
66
 
65
67
  ```bash
66
68
  $ sibyl upgrade
67
69
 
68
- Sibyl Memory Plugin · upgrade
70
+ upgrade · lift the 2 MB free-tier cap
69
71
 
70
72
  Account a1b2c3d4…e5f6
71
73
  Current tier FREE
72
74
  Opening https://sibyllabs.org/plugin/upgrade?session=…
73
75
 
74
- Two paths in your browser:
75
- 1. Stake $SIBYL on Base (free unlimited if you qualify)
76
- 2. Subscribe in USDC (monthly / quarterly / annual)
76
+ two paths in the browser:
77
+ 1. stake $SIBYL on Base (free unlimited if you qualify)
78
+ 2. subscribe in USDC (monthly / quarterly / annual)
77
79
  ```
78
80
 
79
81
  In the browser:
@@ -113,10 +115,12 @@ For internal testing only:
113
115
 
114
116
  ```bash
115
117
  SIBYL_API_BASE=https://staging.api.sibyllabs.org sibyl init
116
- SIBYL_ACTIVATE_BASE=https://staging.sibyllabs.org/plugin/activate sibyl init
118
+ SIBYL_ACTIVATE_BASE=https://staging.auth.sibyllabs.org sibyl init
117
119
  SIBYL_UPGRADE_BASE=https://staging.sibyllabs.org/plugin/upgrade sibyl upgrade
118
120
  ```
119
121
 
122
+ `SIBYL_ACTIVATE_BASE` accepts both subdomain form (`https://auth.example.org` → path-based session URL: `https://auth.example.org/<uuid>`) and legacy path form (`https://example.org/plugin/activate` → query-based: `?session=<uuid>`). The CLI auto-detects from the hostname.
123
+
120
124
  ## Security
121
125
 
122
126
  - `credentials.json` is written atomically at mode 0600.
@@ -22,32 +22,34 @@ sibyl health Run the SibylMemoryProvider self-check (schema versi
22
22
  ```bash
23
23
  $ sibyl init
24
24
 
25
- Sibyl Memory Plugin · activation
25
+ activation · three paths · pick whichever fits your device
26
26
 
27
- Session: a1b2c3d4…e5f6
28
- Opening: https://sibyllabs.org/plugin/activate?session=a1b2c3d4-…
27
+ Session a1b2c3d4…e5f6
28
+ Code 1 2 3 4 5 6 (use this in the email panel)
29
+ Opening https://auth.sibyllabs.org/a1b2c3d4-…
29
30
 
30
- Sign in with your wallet in the browser. This terminal will pick up automatically.
31
+ desktop wallet · email + code · or send USDC from any mobile wallet
32
+ this terminal will pick up automatically when you bind.
31
33
 
32
- ⠹ waiting for browser activation … 9:42 left
34
+ ⠹ watching the network for your bind … 9:42 left
33
35
  ```
34
36
 
35
- The browser opens. Sign a SIWE message with your wallet. The terminal picks up the moment the binding lands. Credentials are written to `~/.sibyl-memory/credentials.json` at mode 0600.
37
+ The browser opens to a dedicated short-URL auth subdomain (`auth.sibyllabs.org/<session-uuid>`). Pick a wallet from the EIP-6963 picker (Rabby / MetaMask / Coinbase Wallet / Frame / Brave / Rainbow), enter email + 6-digit code, or send a unique sub-cent USDC amount from any mobile wallet on Base. The terminal picks up the moment any of the three paths binds. Credentials are written to `~/.sibyl-memory/credentials.json` at mode 0600.
36
38
 
37
39
  ## Upgrade
38
40
 
39
41
  ```bash
40
42
  $ sibyl upgrade
41
43
 
42
- Sibyl Memory Plugin · upgrade
44
+ upgrade · lift the 2 MB free-tier cap
43
45
 
44
46
  Account a1b2c3d4…e5f6
45
47
  Current tier FREE
46
48
  Opening https://sibyllabs.org/plugin/upgrade?session=…
47
49
 
48
- Two paths in your browser:
49
- 1. Stake $SIBYL on Base (free unlimited if you qualify)
50
- 2. Subscribe in USDC (monthly / quarterly / annual)
50
+ two paths in the browser:
51
+ 1. stake $SIBYL on Base (free unlimited if you qualify)
52
+ 2. subscribe in USDC (monthly / quarterly / annual)
51
53
  ```
52
54
 
53
55
  In the browser:
@@ -87,10 +89,12 @@ For internal testing only:
87
89
 
88
90
  ```bash
89
91
  SIBYL_API_BASE=https://staging.api.sibyllabs.org sibyl init
90
- SIBYL_ACTIVATE_BASE=https://staging.sibyllabs.org/plugin/activate sibyl init
92
+ SIBYL_ACTIVATE_BASE=https://staging.auth.sibyllabs.org sibyl init
91
93
  SIBYL_UPGRADE_BASE=https://staging.sibyllabs.org/plugin/upgrade sibyl upgrade
92
94
  ```
93
95
 
96
+ `SIBYL_ACTIVATE_BASE` accepts both subdomain form (`https://auth.example.org` → path-based session URL: `https://auth.example.org/<uuid>`) and legacy path form (`https://example.org/plugin/activate` → query-based: `?session=<uuid>`). The CLI auto-detects from the hostname.
97
+
94
98
  ## Security
95
99
 
96
100
  - `credentials.json` is written atomically at mode 0600.
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "sibyl-memory-cli"
7
- version = "0.3.3"
7
+ version = "0.3.5"
8
8
  description = "Command-line interface for the Sibyl Memory Plugin. `sibyl init` activates, `sibyl upgrade` runs the staker / subscription flow, `sibyl status` shows current tier and DB stats, `sibyl whoami` gives a one-line account summary, `sibyl devices` lists active devices and supports per-device revoke."
9
9
  authors = [{ name = "SIBYL, Sibyl Labs LLC", email = "sibyl@sibyllabs.org" }]
10
10
  license = { text = "MIT" }
@@ -58,8 +58,16 @@ DEFAULT_DB_PATH = Path("~/.sibyl-memory/memory.db").expanduser()
58
58
  DEFAULT_TIER_CACHE_PATH = Path("~/.sibyl-memory/tier_cache.json").expanduser()
59
59
 
60
60
  POLL_INTERVAL_SEC = 3
61
- INIT_TIMEOUT_SEC = 10 * 60 # 10 minutes for /init activation
62
- UPGRADE_TIMEOUT_SEC = 15 * 60 # 15 minutes for upgrade — wallet ux can be slow
61
+ # v0.3.5 fix: the CLI no longer carries its own activation deadline. The
62
+ # server's /session-init response includes pairing_ttl_seconds — the CLI
63
+ # polls until that timestamp, deferring to the server as the single source
64
+ # of truth. The constants below are fallbacks only, used when session-init
65
+ # fails to return a value (network error, schema drift). Drift between CLI
66
+ # and server is now impossible by construction; the prior 10min/15min
67
+ # silent-success gap can't recur because there is no CLI-side number to
68
+ # diverge from the server's.
69
+ INIT_TIMEOUT_FALLBACK_SEC = 30 * 60 # used only if session-init returns no TTL
70
+ UPGRADE_TIMEOUT_SEC = 30 * 60 # upgrade flow uses local constant — no server handshake to defer to
63
71
 
64
72
  # ---- Color / output ----------------------------------------------------
65
73
 
@@ -254,8 +262,16 @@ def cmd_init(args: argparse.Namespace) -> int:
254
262
  # Pre-register the session + pairing code hash with the server.
255
263
  # The code itself never leaves the user's machine until they type it
256
264
  # into the browser.
265
+ #
266
+ # v0.3.5: capture pairing_ttl_seconds from the response and use it as
267
+ # the activation deadline. Server is the single source of truth — if
268
+ # the server-side TTL ever changes, the CLI adopts the new value
269
+ # automatically without a re-publish. INIT_TIMEOUT_FALLBACK_SEC only
270
+ # applies when the call fails entirely (network error) or the response
271
+ # is missing the field (schema drift).
272
+ pairing_ttl_seconds = None
257
273
  try:
258
- http_request(
274
+ init_resp = http_request(
259
275
  "POST",
260
276
  "/api/plugin/session-init",
261
277
  body={
@@ -269,11 +285,17 @@ def cmd_init(args: argparse.Namespace) -> int:
269
285
  },
270
286
  timeout=10.0,
271
287
  )
288
+ if isinstance(init_resp, dict):
289
+ v = init_resp.get("pairing_ttl_seconds")
290
+ if isinstance(v, (int, float)) and v > 0:
291
+ pairing_ttl_seconds = int(v)
272
292
  except HttpError as e:
273
293
  # Non-fatal: SIWE path doesn't need the pairing code. If session-init
274
294
  # fails the user can still complete SIWE. Surface the warning.
275
295
  print(yellow(f"Warning: session-init failed ({e.status}). Wallet path still works; email path may not."))
276
296
 
297
+ activation_window_sec = pairing_ttl_seconds if pairing_ttl_seconds else INIT_TIMEOUT_FALLBACK_SEC
298
+
277
299
  print()
278
300
  print(a.section_header("activation", subtitle="three paths · pick whichever fits your device"))
279
301
  print()
@@ -293,7 +315,7 @@ def cmd_init(args: argparse.Namespace) -> int:
293
315
  pass
294
316
 
295
317
  # Poll /api/plugin/check
296
- deadline = time.time() + INIT_TIMEOUT_SEC
318
+ deadline = time.time() + activation_window_sec
297
319
  last_status = ""
298
320
  spinner = "⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏"
299
321
  spin_i = 0
@@ -370,7 +392,12 @@ def cmd_init(args: argparse.Namespace) -> int:
370
392
 
371
393
  print()
372
394
  print(a.err_line("Activation timed out."))
373
- print(a.dim(" Re-run `sibyl init` to try again."))
395
+ print(a.dim(" Re-run `sibyl init --force` to try again."))
396
+ print()
397
+ print(a.dim(" If your browser already showed 'Activation successful',"))
398
+ print(a.dim(" your bind landed server-side but didn't reach this terminal."))
399
+ print(a.dim(" Running `sibyl init --force` again will start a fresh handshake;"))
400
+ print(a.dim(" bind through the same browser to write credentials locally."))
374
401
  return 1
375
402
 
376
403
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sibyl-memory-cli
3
- Version: 0.3.3
3
+ Version: 0.3.5
4
4
  Summary: Command-line interface for the Sibyl Memory Plugin. `sibyl init` activates, `sibyl upgrade` runs the staker / subscription flow, `sibyl status` shows current tier and DB stats, `sibyl whoami` gives a one-line account summary, `sibyl devices` lists active devices and supports per-device revoke.
5
5
  Author-email: "SIBYL, Sibyl Labs LLC" <sibyl@sibyllabs.org>
6
6
  License: MIT
@@ -48,32 +48,34 @@ sibyl health Run the SibylMemoryProvider self-check (schema versi
48
48
  ```bash
49
49
  $ sibyl init
50
50
 
51
- Sibyl Memory Plugin · activation
51
+ activation · three paths · pick whichever fits your device
52
52
 
53
- Session: a1b2c3d4…e5f6
54
- Opening: https://sibyllabs.org/plugin/activate?session=a1b2c3d4-…
53
+ Session a1b2c3d4…e5f6
54
+ Code 1 2 3 4 5 6 (use this in the email panel)
55
+ Opening https://auth.sibyllabs.org/a1b2c3d4-…
55
56
 
56
- Sign in with your wallet in the browser. This terminal will pick up automatically.
57
+ desktop wallet · email + code · or send USDC from any mobile wallet
58
+ this terminal will pick up automatically when you bind.
57
59
 
58
- ⠹ waiting for browser activation … 9:42 left
60
+ ⠹ watching the network for your bind … 9:42 left
59
61
  ```
60
62
 
61
- The browser opens. Sign a SIWE message with your wallet. The terminal picks up the moment the binding lands. Credentials are written to `~/.sibyl-memory/credentials.json` at mode 0600.
63
+ The browser opens to a dedicated short-URL auth subdomain (`auth.sibyllabs.org/<session-uuid>`). Pick a wallet from the EIP-6963 picker (Rabby / MetaMask / Coinbase Wallet / Frame / Brave / Rainbow), enter email + 6-digit code, or send a unique sub-cent USDC amount from any mobile wallet on Base. The terminal picks up the moment any of the three paths binds. Credentials are written to `~/.sibyl-memory/credentials.json` at mode 0600.
62
64
 
63
65
  ## Upgrade
64
66
 
65
67
  ```bash
66
68
  $ sibyl upgrade
67
69
 
68
- Sibyl Memory Plugin · upgrade
70
+ upgrade · lift the 2 MB free-tier cap
69
71
 
70
72
  Account a1b2c3d4…e5f6
71
73
  Current tier FREE
72
74
  Opening https://sibyllabs.org/plugin/upgrade?session=…
73
75
 
74
- Two paths in your browser:
75
- 1. Stake $SIBYL on Base (free unlimited if you qualify)
76
- 2. Subscribe in USDC (monthly / quarterly / annual)
76
+ two paths in the browser:
77
+ 1. stake $SIBYL on Base (free unlimited if you qualify)
78
+ 2. subscribe in USDC (monthly / quarterly / annual)
77
79
  ```
78
80
 
79
81
  In the browser:
@@ -113,10 +115,12 @@ For internal testing only:
113
115
 
114
116
  ```bash
115
117
  SIBYL_API_BASE=https://staging.api.sibyllabs.org sibyl init
116
- SIBYL_ACTIVATE_BASE=https://staging.sibyllabs.org/plugin/activate sibyl init
118
+ SIBYL_ACTIVATE_BASE=https://staging.auth.sibyllabs.org sibyl init
117
119
  SIBYL_UPGRADE_BASE=https://staging.sibyllabs.org/plugin/upgrade sibyl upgrade
118
120
  ```
119
121
 
122
+ `SIBYL_ACTIVATE_BASE` accepts both subdomain form (`https://auth.example.org` → path-based session URL: `https://auth.example.org/<uuid>`) and legacy path form (`https://example.org/plugin/activate` → query-based: `?session=<uuid>`). The CLI auto-detects from the hostname.
123
+
120
124
  ## Security
121
125
 
122
126
  - `credentials.json` is written atomically at mode 0600.