nookplot-runtime 0.5.131__tar.gz → 0.5.132__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.
Files changed (81) hide show
  1. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/PKG-INFO +1 -1
  2. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/nookplot_runtime/client.py +14 -0
  3. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/pyproject.toml +1 -1
  4. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/tests/test_client.py +34 -0
  5. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/.gitignore +0 -0
  6. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/README.md +0 -0
  7. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/SKILL.md +0 -0
  8. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/nookplot_runtime/__init__.py +0 -0
  9. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/nookplot_runtime/action_catalog.py +0 -0
  10. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/nookplot_runtime/action_catalog_generated.py +0 -0
  11. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/nookplot_runtime/api_sub_categories.py +0 -0
  12. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/nookplot_runtime/artifact_embeddings.py +0 -0
  13. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/nookplot_runtime/autonomous.py +0 -0
  14. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/nookplot_runtime/cognitive_workspace.py +0 -0
  15. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/nookplot_runtime/content_safety.py +0 -0
  16. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/nookplot_runtime/conversation/__init__.py +0 -0
  17. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/nookplot_runtime/conversation/compaction_memory.py +0 -0
  18. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/nookplot_runtime/conversation/conversation_log_store.py +0 -0
  19. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/nookplot_runtime/conversation/conversation_memory.py +0 -0
  20. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/nookplot_runtime/conversation/model_limits.py +0 -0
  21. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/nookplot_runtime/cro.py +0 -0
  22. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/nookplot_runtime/default_guardrails.py +0 -0
  23. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/nookplot_runtime/doom_loop.py +0 -0
  24. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/nookplot_runtime/embedding_exchange.py +0 -0
  25. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/nookplot_runtime/evaluator.py +0 -0
  26. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/nookplot_runtime/events.py +0 -0
  27. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/nookplot_runtime/formatters.py +0 -0
  28. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/nookplot_runtime/goal_loop.py +0 -0
  29. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/nookplot_runtime/guardrails.py +0 -0
  30. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/nookplot_runtime/hooks.py +0 -0
  31. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/nookplot_runtime/knowledge_context.py +0 -0
  32. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/nookplot_runtime/manifest.py +0 -0
  33. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/nookplot_runtime/manifest_activation_hook.py +0 -0
  34. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/nookplot_runtime/mining.py +0 -0
  35. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/nookplot_runtime/profiles.py +0 -0
  36. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/nookplot_runtime/query_segmentation.py +0 -0
  37. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/nookplot_runtime/sandbox.py +0 -0
  38. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/nookplot_runtime/signal_action_map.py +0 -0
  39. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/nookplot_runtime/surplus_inference.py +0 -0
  40. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/nookplot_runtime/types.py +0 -0
  41. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/nookplot_runtime/usdc_budget.py +0 -0
  42. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/nookplot_runtime/wake_up_stack.py +0 -0
  43. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/nookplot_runtime/x402.py +0 -0
  44. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/requirements.lock +0 -0
  45. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/tests/__init__.py +0 -0
  46. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/tests/conversation/__init__.py +0 -0
  47. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/tests/conversation/test_compaction_memory.py +0 -0
  48. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/tests/helpers/__init__.py +0 -0
  49. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/tests/helpers/mock_runtime.py +0 -0
  50. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/tests/test_api_marketplace.py +0 -0
  51. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/tests/test_api_sub_categories.py +0 -0
  52. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/tests/test_autonomous_action_dispatch.py +0 -0
  53. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/tests/test_autonomous_dedup.py +0 -0
  54. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/tests/test_autonomous_doom_loop.py +0 -0
  55. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/tests/test_autonomous_guardrails.py +0 -0
  56. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/tests/test_autonomous_hooks.py +0 -0
  57. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/tests/test_autonomous_lifecycle.py +0 -0
  58. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/tests/test_autonomous_loaded_skill_refs.py +0 -0
  59. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/tests/test_autonomous_mining_track.py +0 -0
  60. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/tests/test_bounty_create.py +0 -0
  61. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/tests/test_content_safety.py +0 -0
  62. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/tests/test_doom_loop.py +0 -0
  63. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/tests/test_economy_surplus_branch.py +0 -0
  64. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/tests/test_external_mcp_tools.py +0 -0
  65. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/tests/test_get_available_actions.py +0 -0
  66. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/tests/test_goal_loop.py +0 -0
  67. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/tests/test_guardrails.py +0 -0
  68. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/tests/test_hooks.py +0 -0
  69. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/tests/test_latent_space.py +0 -0
  70. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/tests/test_manifest_activation_hook.py +0 -0
  71. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/tests/test_mining.py +0 -0
  72. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/tests/test_pack_gating.py +0 -0
  73. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/tests/test_profiles.py +0 -0
  74. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/tests/test_query_segmentation.py +0 -0
  75. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/tests/test_sandbox.py +0 -0
  76. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/tests/test_signal_action_map.py +0 -0
  77. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/tests/test_surplus_inference.py +0 -0
  78. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/tests/test_usdc_budget.py +0 -0
  79. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/tests/test_wake_up_stack.py +0 -0
  80. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/tests/test_workspace_opportunity.py +0 -0
  81. {nookplot_runtime-0.5.131 → nookplot_runtime-0.5.132}/tests/test_x402.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nookplot-runtime
3
- Version: 0.5.131
3
+ Version: 0.5.132
4
4
  Summary: Python Agent Runtime SDK for Nookplot — persistent connection, events, memory bridge, and economy for AI agents on Base
5
5
  Project-URL: Homepage, https://nookplot.com
6
6
  Project-URL: Repository, https://github.com/nookprotocol
@@ -6219,6 +6219,20 @@ class NookplotRuntime:
6219
6219
  self._heartbeat_interval = heartbeat_interval_ms / 1000.0
6220
6220
  self._rpc_url = rpc_url
6221
6221
 
6222
+ # Fail fast on the surplus-without-key footgun (mirrors the TS runtime +
6223
+ # CLI validateConfig). Surplus inference signs each x402 payment with the
6224
+ # agent's OWN key, so an API-key-only agent would construct fine but raise
6225
+ # a keyless SurplusError on the FIRST inference call — deep in the
6226
+ # autonomous loop, easily mistaken for an outage. Per-call
6227
+ # `inference_source` overrides are still validated at call time.
6228
+ if inference_source == "surplus" and not private_key:
6229
+ raise ValueError(
6230
+ "NookplotRuntime: inference_source is 'surplus' but no private_key was "
6231
+ "provided. Surplus pays per call in USDC via x402 and REQUIRES a local "
6232
+ "signing key. Pass private_key, or set inference_source to 'platform' to "
6233
+ "route inference through the gateway."
6234
+ )
6235
+
6222
6236
  self._http = _HttpClient(
6223
6237
  gateway_url,
6224
6238
  api_key,
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "nookplot-runtime"
7
- version = "0.5.131"
7
+ version = "0.5.132"
8
8
  description = "Python Agent Runtime SDK for Nookplot — persistent connection, events, memory bridge, and economy for AI agents on Base"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -381,3 +381,37 @@ def test_inbox_message_parsing() -> None:
381
381
  assert msg.from_address == "0xAAA"
382
382
  assert msg.from_name == "Agent A"
383
383
  assert msg.read_at is None
384
+
385
+
386
+ # ============================================================
387
+ # Constructor — surplus fail-fast guard
388
+ # ============================================================
389
+ # Mirrors the TS runtime + CLI validateConfig: inference_source="surplus"
390
+ # REQUIRES a local signing key, else every inference call would raise a keyless
391
+ # SurplusError deep in the autonomous loop (easily mistaken for an outage).
392
+ # Fail fast at construction instead. The call-time keyless behavior is covered
393
+ # in test_economy_surplus_branch.py (which builds _HttpClient directly, BELOW
394
+ # this top-level guard — so per-call overrides still validate at call time).
395
+
396
+
397
+ def test_surplus_without_private_key_raises() -> None:
398
+ """inference_source='surplus' + no private_key → ValueError at construction."""
399
+ with pytest.raises(ValueError, match="inference_source is 'surplus'"):
400
+ NookplotRuntime(GATEWAY_URL, API_KEY, inference_source="surplus")
401
+
402
+
403
+ @pytest.mark.asyncio
404
+ async def test_surplus_with_private_key_constructs() -> None:
405
+ """inference_source='surplus' WITH a private_key constructs fine."""
406
+ runtime = NookplotRuntime(
407
+ GATEWAY_URL, API_KEY, private_key="0x" + "ab" * 32, inference_source="surplus"
408
+ )
409
+ assert runtime._private_key is not None
410
+ await runtime._http.close()
411
+
412
+
413
+ @pytest.mark.asyncio
414
+ async def test_platform_without_private_key_constructs() -> None:
415
+ """Default/platform source needs no key (gateway-metered / read-only agent)."""
416
+ runtime = NookplotRuntime(GATEWAY_URL, API_KEY, inference_source="platform")
417
+ await runtime._http.close()