awnode 0.3.6__tar.gz → 0.3.7__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 (88) hide show
  1. {awnode-0.3.6 → awnode-0.3.7}/PKG-INFO +1 -1
  2. {awnode-0.3.6 → awnode-0.3.7}/awnode/__init__.py +1 -1
  3. {awnode-0.3.6 → awnode-0.3.7}/awnode/_doctor.py +32 -5
  4. awnode-0.3.7/awnode/data/family.json +1571 -0
  5. {awnode-0.3.6 → awnode-0.3.7}/awnode/hub.py +248 -30
  6. awnode-0.3.7/awnode/memory_probe.py +148 -0
  7. {awnode-0.3.6 → awnode-0.3.7}/awnode/server.py +20 -0
  8. {awnode-0.3.6 → awnode-0.3.7}/docs/aither-manifest.json +4 -4
  9. {awnode-0.3.6 → awnode-0.3.7}/pyproject.toml +1 -1
  10. awnode-0.3.7/tests/test_hub_family.py +72 -0
  11. awnode-0.3.7/tests/test_memory_probe.py +83 -0
  12. {awnode-0.3.6 → awnode-0.3.7}/.github/workflows/publish.yml +0 -0
  13. {awnode-0.3.6 → awnode-0.3.7}/.gitignore +0 -0
  14. {awnode-0.3.6 → awnode-0.3.7}/CLAUDE.md +0 -0
  15. {awnode-0.3.6 → awnode-0.3.7}/Dockerfile +0 -0
  16. {awnode-0.3.6 → awnode-0.3.7}/LICENSE +0 -0
  17. {awnode-0.3.6 → awnode-0.3.7}/README.md +0 -0
  18. {awnode-0.3.6 → awnode-0.3.7}/_smoke_check.py +0 -0
  19. {awnode-0.3.6 → awnode-0.3.7}/aither-constellation.js +0 -0
  20. {awnode-0.3.6 → awnode-0.3.7}/aither-manifest.json +0 -0
  21. {awnode-0.3.6 → awnode-0.3.7}/awnode/__main__.py +0 -0
  22. {awnode-0.3.6 → awnode-0.3.7}/awnode/aithernet_presence.py +0 -0
  23. {awnode-0.3.6 → awnode-0.3.7}/awnode/cli.py +0 -0
  24. {awnode-0.3.6 → awnode-0.3.7}/awnode/comfyui_setup.py +0 -0
  25. {awnode-0.3.6 → awnode-0.3.7}/awnode/components/__init__.py +0 -0
  26. {awnode-0.3.6 → awnode-0.3.7}/awnode/components/autorig.yaml +0 -0
  27. {awnode-0.3.6 → awnode-0.3.7}/awnode/components/canvas.yaml +0 -0
  28. {awnode-0.3.6 → awnode-0.3.7}/awnode/components/comfyui-3d.yaml +0 -0
  29. {awnode-0.3.6 → awnode-0.3.7}/awnode/components/comfyui.yaml +0 -0
  30. {awnode-0.3.6 → awnode-0.3.7}/awnode/components/design.yaml +0 -0
  31. {awnode-0.3.6 → awnode-0.3.7}/awnode/components/iris.yaml +0 -0
  32. {awnode-0.3.6 → awnode-0.3.7}/awnode/components/muse.yaml +0 -0
  33. {awnode-0.3.6 → awnode-0.3.7}/awnode/components/sd-webui.yaml +0 -0
  34. {awnode-0.3.6 → awnode-0.3.7}/awnode/extensions.py +0 -0
  35. {awnode-0.3.6 → awnode-0.3.7}/awnode/license.py +0 -0
  36. {awnode-0.3.6 → awnode-0.3.7}/awnode/mcp_server.py +0 -0
  37. {awnode-0.3.6 → awnode-0.3.7}/awnode/proxy.py +0 -0
  38. {awnode-0.3.6 → awnode-0.3.7}/awnode/rea_sidecar_bridge.py +0 -0
  39. {awnode-0.3.6 → awnode-0.3.7}/awnode/service_install.py +0 -0
  40. {awnode-0.3.6 → awnode-0.3.7}/awnode/sync.py +0 -0
  41. {awnode-0.3.6 → awnode-0.3.7}/awnode/tools/__init__.py +0 -0
  42. {awnode-0.3.6 → awnode-0.3.7}/awnode/tools/_http.py +0 -0
  43. {awnode-0.3.6 → awnode-0.3.7}/awnode/tools/_scopes.py +0 -0
  44. {awnode-0.3.6 → awnode-0.3.7}/awnode/tools/commands.py +0 -0
  45. {awnode-0.3.6 → awnode-0.3.7}/awnode/tools/context.py +0 -0
  46. {awnode-0.3.6 → awnode-0.3.7}/awnode/tools/documents.py +0 -0
  47. {awnode-0.3.6 → awnode-0.3.7}/awnode/tools/embeddings.py +0 -0
  48. {awnode-0.3.6 → awnode-0.3.7}/awnode/tools/extensions.py +0 -0
  49. {awnode-0.3.6 → awnode-0.3.7}/awnode/tools/filesystem.py +0 -0
  50. {awnode-0.3.6 → awnode-0.3.7}/awnode/tools/fleet_host.py +0 -0
  51. {awnode-0.3.6 → awnode-0.3.7}/awnode/tools/fleet_verbs.py +0 -0
  52. {awnode-0.3.6 → awnode-0.3.7}/awnode/tools/generation.py +0 -0
  53. {awnode-0.3.6 → awnode-0.3.7}/awnode/tools/git_tools.py +0 -0
  54. {awnode-0.3.6 → awnode-0.3.7}/awnode/tools/http_client.py +0 -0
  55. {awnode-0.3.6 → awnode-0.3.7}/awnode/tools/knowledge.py +0 -0
  56. {awnode-0.3.6 → awnode-0.3.7}/awnode/tools/memory.py +0 -0
  57. {awnode-0.3.6 → awnode-0.3.7}/awnode/tools/mermaid.py +0 -0
  58. {awnode-0.3.6 → awnode-0.3.7}/awnode/tools/notebooks.py +0 -0
  59. {awnode-0.3.6 → awnode-0.3.7}/awnode/tools/orchestrator.py +0 -0
  60. {awnode-0.3.6 → awnode-0.3.7}/awnode/tools/search.py +0 -0
  61. {awnode-0.3.6 → awnode-0.3.7}/awnode/update_check.py +0 -0
  62. {awnode-0.3.6 → awnode-0.3.7}/dist_validate/aithernode-0.1.0-py3-none-any.whl +0 -0
  63. {awnode-0.3.6 → awnode-0.3.7}/docker-entrypoint.sh +0 -0
  64. {awnode-0.3.6 → awnode-0.3.7}/docs/aither-constellation.js +0 -0
  65. {awnode-0.3.6 → awnode-0.3.7}/docs/index.html +0 -0
  66. {awnode-0.3.6 → awnode-0.3.7}/docs/llms.txt +0 -0
  67. {awnode-0.3.6 → awnode-0.3.7}/packaging/aithernode-stub/README.md +0 -0
  68. {awnode-0.3.6 → awnode-0.3.7}/packaging/aithernode-stub/pyproject.toml +0 -0
  69. {awnode-0.3.6 → awnode-0.3.7}/tests/test_aithernet_presence.py +0 -0
  70. {awnode-0.3.6 → awnode-0.3.7}/tests/test_awnix_host_install.py +0 -0
  71. {awnode-0.3.6 → awnode-0.3.7}/tests/test_chat_endpoint_auth.py +0 -0
  72. {awnode-0.3.6 → awnode-0.3.7}/tests/test_component_image_env.py +0 -0
  73. {awnode-0.3.6 → awnode-0.3.7}/tests/test_connect_browser_join.py +0 -0
  74. {awnode-0.3.6 → awnode-0.3.7}/tests/test_custom_backend.py +0 -0
  75. {awnode-0.3.6 → awnode-0.3.7}/tests/test_extension_contract.py +0 -0
  76. {awnode-0.3.6 → awnode-0.3.7}/tests/test_fleet_host_tools.py +0 -0
  77. {awnode-0.3.6 → awnode-0.3.7}/tests/test_fleet_verbs_tools.py +0 -0
  78. {awnode-0.3.6 → awnode-0.3.7}/tests/test_hub_error_cooldown.py +0 -0
  79. {awnode-0.3.6 → awnode-0.3.7}/tests/test_mcp_api_compat.py +0 -0
  80. {awnode-0.3.6 → awnode-0.3.7}/tests/test_mcp_mode_reprobe.py +0 -0
  81. {awnode-0.3.6 → awnode-0.3.7}/tests/test_mcp_server_auth.py +0 -0
  82. {awnode-0.3.6 → awnode-0.3.7}/tests/test_mcp_sse_transport.py +0 -0
  83. {awnode-0.3.6 → awnode-0.3.7}/tests/test_pair_mode_route.py +0 -0
  84. {awnode-0.3.6 → awnode-0.3.7}/tests/test_proxy_plane.py +0 -0
  85. {awnode-0.3.6 → awnode-0.3.7}/tests/test_server_route_hygiene.py +0 -0
  86. {awnode-0.3.6 → awnode-0.3.7}/tests/test_server_security_hardening.py +0 -0
  87. {awnode-0.3.6 → awnode-0.3.7}/tests/test_sync_enrollment_lifecycle.py +0 -0
  88. {awnode-0.3.6 → awnode-0.3.7}/tests/test_update_check.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: awnode
3
- Version: 0.3.6
3
+ Version: 0.3.7
4
4
  Summary: awnode — lightweight local gateway for AitherOS
5
5
  Project-URL: Homepage, https://aitherium.com
6
6
  Author-email: Aitherium <hello@aitherium.com>
@@ -17,4 +17,4 @@ Install:
17
17
  aithernode status # Check what's connected
18
18
  """
19
19
 
20
- __version__ = "0.3.6"
20
+ __version__ = "0.3.7"
@@ -19,11 +19,28 @@ import os
19
19
  import shutil
20
20
  import sys
21
21
 
22
- #: Frozen from the Aither World registry at generation time. A shipped
23
- #: package cannot read the registry, and a doctor that guessed at the family
24
- #: would go stale in silence. Regenerate to update.
25
22
  SELF = 'awnode'
26
- FAMILY = ['awask', 'awavatar', 'awbac', 'awbrain', 'awbrowse', 'awcams', 'awclassify', 'awdecide', 'awdeck', 'awdelphi', 'awdit', 'awembed', 'awevolve', 'awfind', 'awflow', 'awfocus', 'awgit', 'awgraph', 'awgym', 'awiam', 'awkno', 'awm', 'awmail', 'awmine', 'awnboard', 'awnest', 'awnet', 'awpool', 'awpredict', 'awprism', 'awprove', 'awreason', 'awrecover', 'awrecurse', 'awrelay', 'awrena', 'awrepl', 'awreport', 'awresearch', 'awrise', 'awrouter', 'awrtifact', 'awrun', 'awscope', 'awscreen', 'awseal', 'awsettings', 'awshare', 'awsprite', 'awstorage', 'awsuite', 'awswarm', 'awtax', 'awtoll', 'awtunnel', 'awvision', 'awvoice', 'awwall', 'gawbbonet']
23
+
24
+
25
+ #: The family, read at import from this package's vendored family.json
26
+ #: (generated by gen_ecosystem.py --emit; EC018 keeps it fresh): every registry
27
+ #: brick that is an importable python package, minus this one. An unreadable
28
+ #: index sets FAMILY_ERROR and the verdict is UNJUDGED, never an empty stack.
29
+ def _family_from_data():
30
+ import json
31
+ from pathlib import Path
32
+ p = Path(__file__).resolve().parent / "data" / "family.json"
33
+ try:
34
+ doc = json.loads(p.read_text(encoding="utf-8"))
35
+ mods = sorted({b["module"] for b in doc["bricks"] if b.get("module")} - {SELF})
36
+ except (OSError, ValueError, KeyError, TypeError) as exc:
37
+ return [], f"cannot read the family index {p} ({type(exc).__name__}: {exc})"
38
+ if not mods:
39
+ return [], f"the family index {p} names no python bricks"
40
+ return mods, None
41
+
42
+
43
+ FAMILY, FAMILY_ERROR = _family_from_data()
27
44
  PAIRS_WITH = ['adk']
28
45
 
29
46
  #: This brick's OWN config, read out of its source at generation time.
@@ -33,7 +50,13 @@ PAIRS_WITH = ['adk']
33
50
  #: platform-wide vars it also touches would be noise, and a doctor that floods
34
51
  #: gets ignored.
35
52
  ENV_REQUIRED = []
36
- ENV_OPTIONAL = ['AITHERNODE_ALLOWED_ORIGINS', 'AITHERNODE_BIND_HOST', 'AITHERNODE_CUSTOM_BACKEND_API_KEY', 'AITHERNODE_CUSTOM_BACKEND_MODEL', 'AITHERNODE_CUSTOM_BACKEND_URL', 'AITHERNODE_FS_ROOT', 'AITHERNODE_LMSTUDIO_URL', 'AITHERNODE_MODE', 'AITHERNODE_PORT', 'AITHERNODE_PROXY_MAP', 'AITHERNODE_PROXY_TOKEN', 'AITHERNODE_SERVICE_HOST', 'AITHERNODE_TRUSTED_PROXIES', 'AWNODE_EXTENSION_IDS', 'AWNODE_IN_CONTAINER']
53
+ ENV_OPTIONAL = [
54
+ 'AITHERNODE_ALLOWED_ORIGINS', 'AITHERNODE_BIND_HOST', 'AITHERNODE_CUSTOM_BACKEND_API_KEY',
55
+ 'AITHERNODE_CUSTOM_BACKEND_MODEL', 'AITHERNODE_CUSTOM_BACKEND_URL', 'AITHERNODE_FS_ROOT',
56
+ 'AITHERNODE_LMSTUDIO_URL', 'AITHERNODE_MODE', 'AITHERNODE_PORT', 'AITHERNODE_PROXY_MAP',
57
+ 'AITHERNODE_PROXY_TOKEN', 'AITHERNODE_SERVICE_HOST', 'AITHERNODE_TRUSTED_PROXIES',
58
+ 'AWNODE_EXTENSION_IDS', 'AWNODE_IN_CONTAINER', 'AWNODE_LOCAL_MODEL', 'AWNODE_MCP_REPROBE_S',
59
+ ]
37
60
 
38
61
 
39
62
  def _installed(mod: str) -> "str | None":
@@ -63,6 +86,10 @@ def report(out=None) -> int:
63
86
  print(f" self {SELF} {mine or 'NOT IMPORTABLE'}", file=out)
64
87
  shim = shutil.which(SELF)
65
88
  print(f" command {shim or 'not on PATH'}", file=out)
89
+ if FAMILY_ERROR:
90
+ # Never an empty stack: "0/0 installed" reads as a clean machine.
91
+ print(f"\nverdict: UNJUDGED -- {FAMILY_ERROR}", file=out)
92
+ return 2
66
93
 
67
94
  # The stack. Siblings this brick pairs with are called out separately,
68
95
  # because a missing pair is a REASON, while a missing unrelated brick is