arkitekt-next 0.9.4__tar.gz → 0.10.2__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.

Potentially problematic release.


This version of arkitekt-next might be problematic. Click here for more details.

Files changed (155) hide show
  1. arkitekt_next-0.10.2/.gitignore +148 -0
  2. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/PKG-INFO +40 -39
  3. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/README.md +2 -2
  4. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/__blok__.py +2 -2
  5. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/__init__.py +38 -37
  6. arkitekt_next-0.10.2/arkitekt_next/apps/__init__.py +3 -0
  7. arkitekt_next-0.9.4/arkitekt_next/apps/types.py → arkitekt_next-0.10.2/arkitekt_next/apps/protocols.py +22 -9
  8. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/apps/service/fakts_next.py +15 -30
  9. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/base_models.py +3 -3
  10. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/bloks/admin.py +0 -2
  11. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/bloks/base.py +2 -0
  12. arkitekt_next-0.10.2/arkitekt_next/bloks/channel.py +27 -0
  13. arkitekt_next-0.10.2/arkitekt_next/bloks/services/channel.py +12 -0
  14. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/builders.py +9 -8
  15. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/commands/call/main.py +2 -1
  16. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/commands/call/remote.py +4 -1
  17. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/commands/inspect/requirements.py +3 -8
  18. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/commands/inspect/templates.py +6 -9
  19. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/commands/run/dev.py +3 -4
  20. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/commands/run/utils.py +1 -1
  21. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/ui.py +2 -4
  22. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/utils.py +1 -1
  23. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/constants.py +0 -2
  24. arkitekt_next-0.10.2/arkitekt_next/init_registry.py +102 -0
  25. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/qt/builders.py +2 -2
  26. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/qt/magic_bar.py +1 -1
  27. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/qt/types.py +1 -1
  28. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/service_registry.py +52 -46
  29. arkitekt_next-0.10.2/arkitekt_next/tqdm.py +106 -0
  30. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/utils.py +7 -6
  31. arkitekt_next-0.10.2/pyproject.toml +137 -0
  32. arkitekt_next-0.9.4/arkitekt_next/apps/__init__.py +0 -3
  33. arkitekt_next-0.9.4/arkitekt_next/cli/configs/base.yaml +0 -867
  34. arkitekt_next-0.9.4/arkitekt_next/init_registry.py +0 -178
  35. arkitekt_next-0.9.4/arkitekt_next/tqdm.py +0 -45
  36. arkitekt_next-0.9.4/pyproject.toml +0 -134
  37. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/LICENSE +0 -0
  38. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/apps/service/__init__.py +0 -0
  39. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/apps/service/fakts_qt.py +0 -0
  40. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/apps/service/grant_registry.py +0 -0
  41. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/apps/service/herre.py +0 -0
  42. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/apps/service/herre_qt.py +0 -0
  43. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/apps/service/local_fakts.py +0 -0
  44. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/bloks/__init__.py +0 -0
  45. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/bloks/alpaka.py +0 -0
  46. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/bloks/arkitekt.py +0 -0
  47. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/bloks/config.py +0 -0
  48. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/bloks/elektro.py +0 -0
  49. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/bloks/fluss.py +0 -0
  50. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/bloks/gateway.py +0 -0
  51. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/bloks/internal_docker.py +0 -0
  52. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/bloks/kabinet.py +0 -0
  53. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/bloks/kraph.py +0 -0
  54. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/bloks/livekit.py +0 -0
  55. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/bloks/local_sign.py +0 -0
  56. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/bloks/lok.py +0 -0
  57. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/bloks/mikro.py +0 -0
  58. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/bloks/minio.py +0 -0
  59. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/bloks/mount.py +0 -0
  60. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/bloks/namegen.py +0 -0
  61. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/bloks/ollama.py +0 -0
  62. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/bloks/orkestrator.py +0 -0
  63. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/bloks/postgres.py +0 -0
  64. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/bloks/redis.py +0 -0
  65. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/bloks/rekuest.py +0 -0
  66. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/bloks/secret.py +0 -0
  67. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/bloks/self_signed.py +0 -0
  68. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/bloks/services/__init__.py +0 -0
  69. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/bloks/services/admin.py +0 -0
  70. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/bloks/services/certer.py +0 -0
  71. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/bloks/services/config.py +0 -0
  72. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/bloks/services/db.py +0 -0
  73. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/bloks/services/gateway.py +0 -0
  74. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/bloks/services/livekit.py +0 -0
  75. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/bloks/services/lok.py +0 -0
  76. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/bloks/services/mount.py +0 -0
  77. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/bloks/services/name.py +0 -0
  78. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/bloks/services/ollama.py +0 -0
  79. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/bloks/services/redis.py +0 -0
  80. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/bloks/services/s3.py +0 -0
  81. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/bloks/services/secret.py +0 -0
  82. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/bloks/services/socket.py +0 -0
  83. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/bloks/socket.py +0 -0
  84. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/bloks/tailscale.py +0 -0
  85. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/__init__.py +0 -0
  86. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/commands/call/__init__.py +0 -0
  87. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/commands/call/local.py +0 -0
  88. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/commands/gen/__init__.py +0 -0
  89. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/commands/gen/compile.py +0 -0
  90. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/commands/gen/init.py +0 -0
  91. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/commands/gen/main.py +0 -0
  92. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/commands/gen/watch.py +0 -0
  93. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/commands/init/__init__.py +0 -0
  94. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/commands/init/main.py +0 -0
  95. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/commands/inspect/__init__.py +0 -0
  96. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/commands/inspect/main.py +0 -0
  97. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/commands/inspect/variables.py +0 -0
  98. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/commands/kabinet/__init__.py +0 -0
  99. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/commands/kabinet/build.py +0 -0
  100. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/commands/kabinet/init.py +0 -0
  101. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/commands/kabinet/io.py +0 -0
  102. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/commands/kabinet/main.py +0 -0
  103. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/commands/kabinet/publish.py +0 -0
  104. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/commands/kabinet/stage.py +0 -0
  105. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/commands/kabinet/types.py +0 -0
  106. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/commands/kabinet/utils.py +0 -0
  107. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/commands/kabinet/validate.py +0 -0
  108. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/commands/manifest/__init__.py +0 -0
  109. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/commands/manifest/inspect.py +0 -0
  110. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/commands/manifest/main.py +0 -0
  111. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/commands/manifest/scopes.py +0 -0
  112. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/commands/manifest/version.py +0 -0
  113. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/commands/run/__init__.py +0 -0
  114. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/commands/run/main.py +0 -0
  115. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/commands/run/prod.py +0 -0
  116. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/constants.py +0 -0
  117. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/dockerfiles/vanilla.dockerfile +0 -0
  118. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/errors.py +0 -0
  119. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/inspect.py +0 -0
  120. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/io.py +0 -0
  121. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/main.py +0 -0
  122. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/options.py +0 -0
  123. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/schemas/fluss.schema.graphql +0 -0
  124. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/schemas/gucker.schema.graphql +0 -0
  125. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/schemas/kabinet.schema.graphql +0 -0
  126. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/schemas/kluster.schema.graphql +0 -0
  127. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/schemas/konviktion.schema.graphql +0 -0
  128. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/schemas/kuay.schema.graphql +0 -0
  129. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/schemas/mikro.schema.graphql +0 -0
  130. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/schemas/mikro_next.schema.graphql +0 -0
  131. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/schemas/napari.schema.graphql +0 -0
  132. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/schemas/omero_ark.schema.graphql +0 -0
  133. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/schemas/port.schema.graphql +0 -0
  134. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/schemas/rekuest.schema.graphql +0 -0
  135. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/schemas/rekuest_next.schema.graphql +0 -0
  136. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/schemas/unlok.schema.graphql +0 -0
  137. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/templates/filter.py +0 -0
  138. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/templates/simple.py +0 -0
  139. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/texts.py +0 -0
  140. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/types.py +0 -0
  141. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/validators.py +0 -0
  142. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/vars.py +0 -0
  143. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/cli/versions/v1.yaml +0 -0
  144. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/qt/__init__.py +0 -0
  145. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/qt/assets/dark/gear.png +0 -0
  146. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/qt/assets/dark/green pulse.gif +0 -0
  147. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/qt/assets/dark/orange pulse.gif +0 -0
  148. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/qt/assets/dark/pink pulse.gif +0 -0
  149. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/qt/assets/dark/red pulse.gif +0 -0
  150. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/qt/assets/light/gear.png +0 -0
  151. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/qt/assets/light/green pulse.gif +0 -0
  152. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/qt/assets/light/orange pulse.gif +0 -0
  153. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/qt/assets/light/pink pulse.gif +0 -0
  154. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/qt/assets/light/red pulse.gif +0 -0
  155. {arkitekt_next-0.9.4 → arkitekt_next-0.10.2}/arkitekt_next/qt/utils.py +0 -0
@@ -0,0 +1,148 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ **/__pycache__
4
+ *.py[cod]
5
+ *$py.class
6
+ *.pyc
7
+ *.DS_Store
8
+
9
+ # C extensions
10
+ *.so
11
+
12
+ # Distribution / packaging
13
+ .Python
14
+ build/
15
+ develop-eggs/
16
+ dist/
17
+ downloads/
18
+ eggs/
19
+ .eggs/
20
+ lib/
21
+ lib64/
22
+ parts/
23
+ sdist/
24
+ var/
25
+ wheels/
26
+ pip-wheel-metadata/
27
+ share/python-wheels/
28
+ *.egg-info/
29
+ .installed.cfg
30
+ *.egg
31
+
32
+ # PyInstaller
33
+ # Usually these files are written by a python script from a template
34
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
35
+
36
+ *.spec
37
+
38
+ # Installer logs
39
+ pip-log.txt
40
+ pip-delete-this-directory.txt
41
+
42
+ # Unit test / coverage reports
43
+ htmlcov/
44
+ .tox/
45
+ .nox/
46
+ .coverage
47
+ .coverage.*
48
+ .cache
49
+ nosetests.xml
50
+ coverage.xml
51
+ *.cover
52
+ *.py,cover
53
+ .hypothesis/
54
+ .pytest_cache/
55
+ cover/
56
+
57
+ # Translations
58
+ *.mo
59
+ *.pot
60
+
61
+ # Django stuff:
62
+ *.log
63
+ local_settings.py
64
+ db.sqlite3
65
+ db.sqlite3-journal
66
+
67
+ # Flask stuff:
68
+ instance/
69
+ .webassets-cache
70
+
71
+ # Scrapy stuff:
72
+ .scrapy
73
+
74
+ # Sphinx documentation
75
+ docs/_build/
76
+
77
+ # PyBuilder
78
+ .pybuilder/
79
+ target/
80
+
81
+ # Jupyter Notebook
82
+ .ipynb_checkpoints
83
+
84
+ # IPython
85
+ profile_default/
86
+ ipython_config.py
87
+
88
+ # pyenv
89
+ # For a library or package, you might want to ignore these files since the code is
90
+ # intended to run in multiple environments; otherwise, check them in:
91
+ # .python-version
92
+
93
+ # pipenv
94
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
95
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
96
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
97
+ # install all needed dependencies.
98
+ #Pipfile.lock
99
+
100
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow
101
+ __pypackages__/
102
+
103
+ # Celery stuff
104
+ celerybeat-schedule
105
+ celerybeat.pid
106
+
107
+ # SageMath parsed files
108
+ *.sage.py
109
+
110
+ # Environments
111
+ .env
112
+ .venv
113
+ env/
114
+ venv/
115
+ ENV/
116
+ env.bak/
117
+ venv.bak/
118
+
119
+ # Spyder project settings
120
+ .spyderproject
121
+ .spyproject
122
+
123
+ # Rope project settings
124
+ .ropeproject
125
+
126
+ # mkdocs documentation
127
+ /site
128
+
129
+ # mypy
130
+ .mypy_cache/
131
+ .dmypy.json
132
+ dmypy.json
133
+
134
+ # Pyre type checker
135
+ .pyre/
136
+
137
+ # pytype static type analyzer
138
+ .pytype/
139
+
140
+ # Cython debug symbols
141
+ cython_debug/
142
+
143
+ # static files generated from Django application using `collectstatic`
144
+ media
145
+ export
146
+ static_collected
147
+ data
148
+ token.temp
@@ -1,58 +1,60 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: arkitekt-next
3
- Version: 0.9.4
3
+ Version: 0.10.2
4
4
  Summary: client for the arkitekt_next platform
5
- License: MIT
6
- Author: jhnnsrs
7
- Author-email: jhnnsrs@gmail.com
8
- Requires-Python: >=3.9,<4
9
- Classifier: License :: OSI Approved :: MIT License
10
- Classifier: Programming Language :: Python :: 3
11
- Classifier: Programming Language :: Python :: 3.9
12
- Classifier: Programming Language :: Python :: 3.10
13
- Classifier: Programming Language :: Python :: 3.11
14
- Classifier: Programming Language :: Python :: 3.12
5
+ Author-email: jhnnsrs <jhnnsrs@gmail.com>
6
+ License-Expression: MIT
7
+ License-File: LICENSE
8
+ Requires-Python: <4,>=3.11
9
+ Requires-Dist: click>=8.2.0
10
+ Requires-Dist: dokker>=2.1.2
11
+ Requires-Dist: fakts-next>=1.2.2
12
+ Requires-Dist: herre-next>=1.2.0
13
+ Requires-Dist: koil>=2.0.4
14
+ Requires-Dist: rath>=3.4
15
+ Requires-Dist: rekuest-next>=0.7
15
16
  Provides-Extra: all
17
+ Requires-Dist: fluss-next>=0.2.0; extra == 'all'
18
+ Requires-Dist: kabinet>=0.2.0; extra == 'all'
19
+ Requires-Dist: mikro-next>=0.2.0; extra == 'all'
20
+ Requires-Dist: reaktion-next>=0.2.0; extra == 'all'
21
+ Requires-Dist: rekuest-next>=0.3.1; extra == 'all'
22
+ Requires-Dist: rich-click>=1.6.1; extra == 'all'
23
+ Requires-Dist: semver>=3.0.1; extra == 'all'
24
+ Requires-Dist: turms>=0.8.2; extra == 'all'
25
+ Requires-Dist: unlok-next>=0.2.0; extra == 'all'
26
+ Requires-Dist: watchfiles>=0.18.1; extra == 'all'
16
27
  Provides-Extra: alpaka
28
+ Requires-Dist: alpaka>=0.2.0; extra == 'alpaka'
17
29
  Provides-Extra: blok
30
+ Requires-Dist: blok>=0.1.0; extra == 'blok'
18
31
  Provides-Extra: cli
32
+ Requires-Dist: rekuest-next>=0.3.1; extra == 'cli'
33
+ Requires-Dist: turms>=0.8.2; extra == 'cli'
19
34
  Provides-Extra: elektro
35
+ Requires-Dist: elektro>=0.5.0; extra == 'elektro'
20
36
  Provides-Extra: extended
37
+ Requires-Dist: alpaka>=0.2.0; extra == 'extended'
38
+ Requires-Dist: kraph>=0.2.0; extra == 'extended'
21
39
  Provides-Extra: fluss
40
+ Requires-Dist: fluss-next>=0.2.0; extra == 'fluss'
22
41
  Provides-Extra: kabinet
42
+ Requires-Dist: kabinet>=0.4.0; extra == 'kabinet'
23
43
  Provides-Extra: kraph
44
+ Requires-Dist: kraph>=0.2.0; extra == 'kraph'
24
45
  Provides-Extra: lovekit
46
+ Requires-Dist: lovekit>=0.2.0; extra == 'lovekit'
25
47
  Provides-Extra: mikro
48
+ Requires-Dist: mikro-next>=0.3.1; extra == 'mikro'
26
49
  Provides-Extra: reaktion
50
+ Requires-Dist: reaktion-next>=0.2.0; extra == 'reaktion'
27
51
  Provides-Extra: rekuest
28
- Provides-Extra: stream
52
+ Requires-Dist: rekuest-next>=0.6.0; extra == 'rekuest'
29
53
  Provides-Extra: unlok
30
- Requires-Dist: alpaka (>=0.2.0) ; (python_version >= "3.10" and python_version < "4.0") and (extra == "alpaka" or extra == "extended")
31
- Requires-Dist: blok (>=0.1.0) ; (python_version >= "3.9" and python_version < "4.0") and (extra == "blok")
32
- Requires-Dist: cryptography (>=40.0.8) ; (python_version >= "3.9") and (extra == "blok")
33
- Requires-Dist: dokker (>=1.0.0)
34
- Requires-Dist: elektro (>=0.5.0) ; (python_version >= "3.9") and (extra == "elektro")
35
- Requires-Dist: fakts-next (>=1.1.0)
36
- Requires-Dist: fluss-next (>=0.2.0) ; (python_version >= "3.9") and (extra == "fluss" or extra == "all")
37
- Requires-Dist: herre-next (>=1.1.0)
38
- Requires-Dist: kabinet (>=0.2.0) ; (python_version >= "3.9" and python_version < "4.0") and (extra == "kabinet" or extra == "all")
39
- Requires-Dist: koil (>=1.0.3)
40
- Requires-Dist: kraph (>=0.2.0) ; (python_version >= "3.9") and (extra == "kraph" or extra == "extended")
41
- Requires-Dist: lovekit (>=0.2.0) ; (python_version >= "3.10") and (extra == "lovekit" or extra == "stream")
42
- Requires-Dist: mikro-next (>=0.2.0) ; (python_version >= "3.11" and python_version < "4.0") and (extra == "mikro" or extra == "all")
43
- Requires-Dist: namegenerator (>=1.0.6) ; (python_version >= "3.9") and (extra == "blok")
44
- Requires-Dist: netifaces (>=0.11.0) ; (python_version >= "3.9") and (extra == "blok")
45
- Requires-Dist: rath (>=1.1.1)
46
- Requires-Dist: reaktion-next (>=0.2.0) ; (python_version >= "3.9") and (extra == "reaktion" or extra == "all")
47
- Requires-Dist: rekuest-next (>=0.3.1) ; (python_version >= "3.9") and (extra == "cli" or extra == "rekuest" or extra == "all")
48
- Requires-Dist: rich-click (>=1.6.1) ; extra == "cli" or extra == "all" or extra == "blok"
49
- Requires-Dist: semver (>=3.0.1) ; extra == "cli" or extra == "all"
50
- Requires-Dist: turms (>=0.8.2) ; (python_version >= "3.9") and (extra == "cli" or extra == "all")
51
- Requires-Dist: unlok-next (>=0.2.0) ; (python_version >= "3.9") and (extra == "unlok" or extra == "all")
52
- Requires-Dist: watchfiles (>=0.18.1) ; extra == "cli" or extra == "all"
54
+ Requires-Dist: unlok-next>=0.2.0; extra == 'unlok'
53
55
  Description-Content-Type: text/markdown
54
56
 
55
- # arkitekt_next
57
+ # arkitekt-next
56
58
 
57
59
  [![codecov](https://codecov.io/gh/jhnnsrs/arkitekt_next/branch/master/graph/badge.svg?token=UGXEA2THBV)](https://codecov.io/gh/jhnnsrs/arkitekt_next)
58
60
  [![PyPI version](https://badge.fury.io/py/arkitekt_next.svg)](https://pypi.org/project/arkitekt_next/)
@@ -65,7 +67,7 @@ streaming analysis for mikroscopy
65
67
 
66
68
  ## Idea
67
69
 
68
- arkitekt_next is the python client for the arkitekt_next platform. It allows you to utilize the full extent of the platform from your python code.
70
+ arkitekt-next is the python client for the arkitekt_next platform. It allows you to utilize the full extent of the platform from your python code.
69
71
  To understand the idea behind arkitekt_next, you need to understand the idea behind the arkitekt_next platform.
70
72
  (More on this in the [documentation](https://arkitekt.live))
71
73
 
@@ -169,4 +171,3 @@ def complex_call(x: ComplexStrucuture) -> int:
169
171
  ```
170
172
 
171
173
  Check out the arkitekt_next [documentation](https://arkitekt.live) for usage of this libary
172
-
@@ -1,4 +1,4 @@
1
- # arkitekt_next
1
+ # arkitekt-next
2
2
 
3
3
  [![codecov](https://codecov.io/gh/jhnnsrs/arkitekt_next/branch/master/graph/badge.svg?token=UGXEA2THBV)](https://codecov.io/gh/jhnnsrs/arkitekt_next)
4
4
  [![PyPI version](https://badge.fury.io/py/arkitekt_next.svg)](https://pypi.org/project/arkitekt_next/)
@@ -11,7 +11,7 @@ streaming analysis for mikroscopy
11
11
 
12
12
  ## Idea
13
13
 
14
- arkitekt_next is the python client for the arkitekt_next platform. It allows you to utilize the full extent of the platform from your python code.
14
+ arkitekt-next is the python client for the arkitekt_next platform. It allows you to utilize the full extent of the platform from your python code.
15
15
  To understand the idea behind arkitekt_next, you need to understand the idea behind the arkitekt_next platform.
16
16
  (More on this in the [documentation](https://arkitekt.live))
17
17
 
@@ -23,9 +23,10 @@ from arkitekt_next.bloks.self_signed import SelfSignedBlok
23
23
  from arkitekt_next.bloks.kraph import KraphBlok
24
24
  from arkitekt_next.bloks.local_sign import LocalSignBlok
25
25
  from arkitekt_next.bloks.elektro import ElektroBlok
26
+ from blok.blok import Blok
26
27
 
27
28
 
28
- def get_bloks():
29
+ def get_bloks() -> list[Blok]:
29
30
  return [
30
31
  AdminBlok(),
31
32
  ArkitektBlok(),
@@ -53,4 +54,3 @@ def get_bloks():
53
54
  LocalSignBlok(),
54
55
  ElektroBlok(),
55
56
  ]
56
-
@@ -1,3 +1,14 @@
1
+ from .builders import easy, interactive
2
+ from .apps.protocols import App
3
+ from fakts_next.helpers import afakt, fakt
4
+ from .init_registry import init, InitHookRegisty, get_current_init_hook_registry
5
+ from .service_registry import (
6
+ require,
7
+ ServiceBuilderRegistry,
8
+ get_default_service_registry,
9
+ )
10
+
11
+
1
12
  def missing_install(name: str, error: Exception):
2
13
  def real_missing_install(*args, **kwargs):
3
14
  raise ImportError(
@@ -8,27 +19,34 @@ def missing_install(name: str, error: Exception):
8
19
 
9
20
 
10
21
  try:
11
- from rekuest_next.register import register, register_structure
12
- from rekuest_next.agents.hooks import background
13
- from rekuest_next.agents.hooks import startup
22
+ from rekuest_next.register import register
23
+ from rekuest_next.agents.hooks.background import background
24
+ from rekuest_next.agents.hooks.startup import startup
14
25
  from rekuest_next.agents.context import context
15
- from rekuest_next.state.state import state
16
- from rekuest_next.actors.reactive.api import abreakpoint, breakpoint
17
- from rekuest_next.actors.reactive.api import progress, aprogress
18
- from rekuest_next.actors.reactive.api import log, alog
19
- from rekuest_next.register import test, benchmark
26
+ from rekuest_next.state.decorator import state
27
+ from rekuest_next.actors.context import abreakpoint, breakpoint
28
+ from rekuest_next.actors.context import progress, aprogress
29
+ from rekuest_next.actors.context import log, alog
20
30
  from rekuest_next.structures.model import model
21
- from rekuest_next.utils import call, call_raw, acall, acall_raw, find, afind
22
- from rekuest_next.define import define
31
+ from rekuest_next.remote import (
32
+ call,
33
+ acall,
34
+ acall_raw,
35
+ iterate,
36
+ aiterate,
37
+ aiterate_raw,
38
+ find,
39
+ )
23
40
  except ImportError as e:
24
41
  raise e
25
- register_structure = missing_install("rekuest_next", e)
42
+ structure = missing_install("rekuest_next", e)
26
43
  register = missing_install("rekuest_next", e)
27
44
  background = missing_install("rekuest_next", e)
28
45
  abreakpoint = missing_install("rekuest_next", e)
29
46
  breakpoint = missing_install("rekuest_next", e)
30
47
  startup = missing_install("rekuest_next", e)
31
48
  context = missing_install("rekuest_next", e)
49
+ find = missing_install("rekuest_next", e)
32
50
  state = missing_install("rekuest_next", e)
33
51
  progress = missing_install("rekuest_next", e)
34
52
  aprogress = missing_install("rekuest_next", e)
@@ -40,16 +58,9 @@ except ImportError as e:
40
58
  acall_raw = missing_install("rekuest_next", e)
41
59
  find = missing_install("rekuest_next", e)
42
60
  afind = missing_install("rekuest_next", e)
43
-
44
- from .builders import easy, interactive
45
- from .apps.types import App
46
- from fakts_next.helpers import afakt, fakt
47
- from .init_registry import init, InitHookRegisty, get_current_init_hook_registry
48
- from .service_registry import (
49
- require,
50
- ServiceBuilderRegistry,
51
- get_current_service_registry,
52
- )
61
+ aiterate_raw = missing_install("rekuest_next", e)
62
+ aiterate = missing_install("rekuest_next", e)
63
+ iterate = missing_install("rekuest_next", e)
53
64
 
54
65
 
55
66
  __all__ = [
@@ -57,39 +68,29 @@ __all__ = [
57
68
  "require",
58
69
  "easy",
59
70
  "interactive",
60
- "publicqt",
61
- "jupy",
62
71
  "log",
63
72
  "alog",
64
73
  "afakt",
65
74
  "fakt",
66
75
  "progress",
67
76
  "aprogress",
68
- "scheduler",
69
- "register_structure",
70
- "requirement",
71
77
  "ServiceBuilderRegistry",
72
- "get_current_service_registry",
78
+ "get_default_service_registry",
73
79
  "register",
74
- "group",
75
- "useGuardian",
76
- "useInstanceID",
77
80
  "find",
78
- "afind",
81
+ "breakpoint",
82
+ "abreakpoint",
83
+ "aiterate",
84
+ "iterate",
85
+ "aiterate_raw",
79
86
  "call",
80
- "call_raw",
81
87
  "acall",
82
88
  "acall_raw",
83
89
  "model",
84
- "test",
85
- "benchmark",
86
- "useUser",
87
- "next",
88
90
  "state",
89
91
  "context",
90
92
  "background",
91
93
  "startup",
92
- "register_next",
93
94
  "init",
94
95
  "InitHookRegisty",
95
96
  "get_current_init_hook_registry",
@@ -0,0 +1,3 @@
1
+ from .protocols import App
2
+
3
+ __all__ = ["App"]
@@ -1,7 +1,6 @@
1
1
  """
2
2
  This module contains the types for the apps
3
3
  depending on the builder used.
4
-
5
4
  This module imports all the apps and their types
6
5
  and sets them as attributes on the App class, if they are available.
7
6
  If they are not available, they are set to Any, so that we can add
@@ -11,12 +10,17 @@ an import exception to the app.
11
10
  """
12
11
 
13
12
  import logging
14
- from typing import TYPE_CHECKING, Any, Dict
13
+ from typing import Any, Dict, TYPE_CHECKING
14
+ from koil import unkoil
15
15
  from arkitekt_next.base_models import Manifest
16
16
  from koil.composition import Composition
17
17
  from fakts_next import Fakts
18
18
  from herre_next import Herre
19
- from koil.helpers import KoilTask
19
+
20
+
21
+ if TYPE_CHECKING:
22
+ from rekuest_next.rekuest import RekuestNext
23
+
20
24
 
21
25
  logger = logging.getLogger(__name__)
22
26
 
@@ -29,18 +33,27 @@ class App(Composition):
29
33
  manifest: Manifest
30
34
  services: Dict[str, Any]
31
35
 
36
+ @property
37
+ def rekuest(self) -> "RekuestNext":
38
+ """Get the rekuest service"""
39
+ if "rekuest" not in self.services:
40
+ raise ValueError("Rekuest service is not available")
41
+ return self.services["rekuest"]
42
+
32
43
  def run(self):
33
- """Run the app"""
34
- return self.services["rekuest"].run()
44
+ return unkoil(self.rekuest.arun)
35
45
 
36
- def run_detached(self) -> KoilTask:
37
- """Run the app detached"""
46
+ async def arun(self):
47
+ return await self.rekuest.arun()
38
48
 
39
- return self.services["rekuest"].run_detached()
49
+ def run_detached(self):
50
+ """Run the app detached"""
51
+ return self.rekuest.run_detached()
40
52
 
41
53
  def register(self, *args, **kwargs):
42
54
  """Register a service"""
43
- self.services["rekuest"].register(*args, **kwargs)
55
+
56
+ self.rekuest.register(*args, **kwargs)
44
57
 
45
58
  async def __aenter__(self):
46
59
  await super().__aenter__()
@@ -4,41 +4,35 @@ from fakts_next.fakts import Fakts
4
4
  from fakts_next.grants.hard import HardFakts
5
5
  from fakts_next.grants.remote import RemoteGrant
6
6
  from fakts_next.grants.remote.discovery.well_known import WellKnownDiscovery
7
- from fakts_next.grants.remote import RemoteGrant
8
7
  from fakts_next.grants.remote.demanders.static import StaticDemander
9
- from fakts_next.grants.remote.demanders.device_code import DeviceCodeDemander
8
+ from fakts_next.grants.remote.demanders.device_code import (
9
+ ClientKind,
10
+ DeviceCodeDemander,
11
+ )
10
12
  from fakts_next.grants.remote.claimers.post import ClaimEndpointClaimer
11
13
  from fakts_next.grants.remote.demanders.redeem import RedeemDemander
12
14
  from fakts_next.cache.file import FileCache
13
15
  from arkitekt_next.base_models import Manifest
14
16
 
15
17
 
16
- class ArkitektNextFaktsQt(Fakts):
17
- grant: RemoteGrant
18
-
19
-
20
- class ArkitektNextFaktsNext(Fakts):
21
- pass
22
-
23
-
24
18
  def build_arkitekt_next_fakts_next(
25
19
  manifest: Manifest,
26
20
  url: Optional[str] = None,
27
21
  no_cache: bool = False,
28
22
  headless: bool = False,
29
- client_kind: str = "development",
30
- ) -> ArkitektNextFaktsNext:
23
+ ) -> Fakts:
31
24
  identifier = manifest.identifier
32
25
  version = manifest.version
26
+ if url is None:
27
+ raise ValueError("URL must be provided")
33
28
 
34
29
  demander = DeviceCodeDemander(
35
30
  manifest=manifest,
36
- redirect_uri="http://127.0.0.1:6767",
37
31
  open_browser=not headless,
38
- requested_client_kind=client_kind,
32
+ requested_client_kind=ClientKind.DEVELOPMENT,
39
33
  )
40
34
 
41
- return ArkitektNextFaktsNext(
35
+ return Fakts(
42
36
  grant=RemoteGrant(
43
37
  demander=demander,
44
38
  discovery=WellKnownDiscovery(url=url, auto_protocols=["https", "http"]),
@@ -47,22 +41,15 @@ def build_arkitekt_next_fakts_next(
47
41
  cache=FileCache(
48
42
  cache_file=f".arkitekt_next/cache/{identifier}-{version}_fakts_cache.json",
49
43
  hash=manifest.hash() + url,
50
- skip_cache=no_cache,
51
44
  ),
52
45
  )
53
46
 
54
47
 
55
- def build_arkitekt_next_redeem_fakts_next(
56
- manifest: Manifest,
57
- redeem_token: str,
58
- url,
59
- no_cache: Optional[bool] = False,
60
- headless=False,
61
- ):
48
+ def build_arkitekt_next_redeem_fakts_next(manifest: Manifest, redeem_token: str, url):
62
49
  identifier = manifest.identifier
63
50
  version = manifest.version
64
51
 
65
- return ArkitektNextFaktsNext(
52
+ return Fakts(
66
53
  grant=RemoteGrant(
67
54
  demander=RedeemDemander(token=redeem_token, manifest=manifest),
68
55
  discovery=WellKnownDiscovery(url=url, auto_protocols=["https", "http"]),
@@ -83,9 +70,9 @@ def build_arkitekt_next_token_fakts_next(
83
70
  identifier = manifest.identifier
84
71
  version = manifest.version
85
72
 
86
- return ArkitektNextFaktsNext(
73
+ return Fakts(
87
74
  grant=RemoteGrant(
88
- demander=StaticDemander(token=token),
75
+ demander=StaticDemander(token=token), # type: ignore
89
76
  discovery=WellKnownDiscovery(url=url, auto_protocols=["https", "http"]),
90
77
  claimer=ClaimEndpointClaimer(),
91
78
  ),
@@ -97,11 +84,9 @@ def build_arkitekt_next_token_fakts_next(
97
84
 
98
85
 
99
86
  def build_local_fakts(manifest, fakts):
100
-
101
87
  identifier = manifest.identifier
102
88
  version = manifest.version
103
89
 
104
- return ArkitektNextFaktsNext(
90
+ return Fakts(
105
91
  grant=HardFakts(fakts=fakts),
106
-
107
- )
92
+ )
@@ -43,7 +43,7 @@ class Manifest(BaseModel):
43
43
  requirements: Optional[List[Requirement]] = Field(default_factory=list)
44
44
  """ Requirements that this app has TODO: What are the requirements? """
45
45
  model_config = ConfigDict(extra="forbid")
46
-
46
+
47
47
  description: Optional[str] = None
48
48
  """ A human readable description of the app """
49
49
 
@@ -74,8 +74,8 @@ class Manifest(BaseModel):
74
74
  # Hash the JSON encoded dictionary
75
75
  return sha256(json_dd.encode()).hexdigest()
76
76
 
77
- @field_validator("identifier")
78
- def check_identifier(cls, v):
77
+ @field_validator("identifier", mode="after")
78
+ def check_identifier(cls, v: str) -> str:
79
79
  assert "/" not in v, "The identifier should not contain a /"
80
80
  assert len(v) > 0, "The identifier should not be empty"
81
81
  assert len(v) < 256, "The identifier should not be longer than 256 characters"
@@ -1,5 +1,3 @@
1
- from pydantic import BaseModel
2
- from typing import Dict, Any
3
1
  from blok import blok, InitContext, Option
4
2
  from arkitekt_next.bloks.services.admin import AdminService, AdminCredentials
5
3
 
@@ -1,3 +1,4 @@
1
+ from arkitekt_next.bloks.services.channel import ChannelService
1
2
  from blok import blok, InitContext, Option
2
3
  from blok.tree import YamlFile, Repo
3
4
  from typing import Any, Optional, Protocol
@@ -62,6 +63,7 @@ class BaseArkitektService:
62
63
  redis: RedisService,
63
64
  s3: S3Service,
64
65
  config: ConfigService,
66
+ channel: ChannelService,
65
67
  mount: MountService,
66
68
  admin: AdminService,
67
69
  secret: SecretService,
@@ -0,0 +1,27 @@
1
+ from pydantic import BaseModel
2
+ from typing import Dict, Any
3
+ from blok import blok, InitContext, Option
4
+ from arkitekt_next.bloks.services.channel import ChannelService
5
+
6
+
7
+ @blok(ChannelService, description="The current channel of the application")
8
+ class ChannelBlok:
9
+ def __init__(self) -> None:
10
+ self.name = "default"
11
+
12
+ def preflight(self, init: InitContext):
13
+ for key, value in init.kwargs.items():
14
+ setattr(self, key, value)
15
+
16
+ def retrieve(self):
17
+ return self.name
18
+
19
+ def get_options(self):
20
+ with_name = Option(
21
+ subcommand="name",
22
+ help="Which channel name to use",
23
+ default=self.name,
24
+ show_default=True,
25
+ )
26
+
27
+ return [with_name]
@@ -0,0 +1,12 @@
1
+ from typing import Dict, Any, Protocol
2
+ from blok import blok, InitContext, Option
3
+ from blok import service
4
+ from dataclasses import dataclass
5
+
6
+
7
+
8
+ @service("live.arkitekt.channel")
9
+ class ChannelService(Protocol):
10
+
11
+ def retrieve_channel(self) -> str:
12
+ return str