arkitekt-next 0.8.60__tar.gz → 0.8.61__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 (148) hide show
  1. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/PKG-INFO +19 -9
  2. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/__blok__.py +3 -0
  3. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/__init__.py +5 -1
  4. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/base_models.py +2 -4
  5. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/bloks/arkitekt.py +15 -13
  6. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/bloks/base.py +6 -4
  7. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/bloks/gateway.py +10 -6
  8. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/bloks/kraph.py +4 -1
  9. arkitekt_next-0.8.61/arkitekt_next/bloks/local_sign.py +261 -0
  10. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/bloks/lok.py +5 -3
  11. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/bloks/ollama.py +1 -4
  12. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/bloks/orkestrator.py +4 -6
  13. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/bloks/self_signed.py +1 -8
  14. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/bloks/services/certer.py +2 -2
  15. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/commands/gen/init.py +2 -2
  16. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/commands/inspect/templates.py +0 -2
  17. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/commands/kabinet/build.py +28 -9
  18. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/commands/kabinet/init.py +1 -1
  19. {arkitekt_next-0.8.60/arkitekt_next/cli → arkitekt_next-0.8.61/arkitekt_next/cli/commands/kabinet}/io.py +3 -63
  20. arkitekt_next-0.8.61/arkitekt_next/cli/commands/kabinet/main.py +43 -0
  21. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/commands/kabinet/publish.py +2 -2
  22. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/commands/kabinet/stage.py +1 -1
  23. {arkitekt_next-0.8.60/arkitekt_next/cli → arkitekt_next-0.8.61/arkitekt_next/cli/commands/kabinet}/types.py +0 -48
  24. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/commands/kabinet/utils.py +1 -1
  25. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/commands/kabinet/validate.py +1 -1
  26. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/commands/manifest/inspect.py +2 -7
  27. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/commands/manifest/main.py +0 -2
  28. arkitekt_next-0.8.61/arkitekt_next/cli/io.py +74 -0
  29. arkitekt_next-0.8.61/arkitekt_next/cli/types.py +42 -0
  30. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/ui.py +1 -1
  31. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/init_registry.py +2 -11
  32. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/qt/builders.py +2 -3
  33. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/service_registry.py +5 -87
  34. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/utils.py +3 -2
  35. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/pyproject.toml +20 -10
  36. arkitekt_next-0.8.60/arkitekt_next/cli/commands/kabinet/main.py +0 -31
  37. arkitekt_next-0.8.60/arkitekt_next/cli/commands/kabinet/wizard.py +0 -329
  38. arkitekt_next-0.8.60/arkitekt_next/cli/commands/manifest/wizard.py +0 -94
  39. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/LICENSE +0 -0
  40. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/README.md +0 -0
  41. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/apps/__init__.py +0 -0
  42. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/apps/service/__init__.py +0 -0
  43. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/apps/service/fakts_next.py +0 -0
  44. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/apps/service/fakts_qt.py +0 -0
  45. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/apps/service/grant_registry.py +0 -0
  46. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/apps/service/herre.py +0 -0
  47. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/apps/service/herre_qt.py +0 -0
  48. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/apps/types.py +0 -0
  49. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/bloks/__init__.py +0 -0
  50. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/bloks/admin.py +0 -0
  51. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/bloks/config.py +0 -0
  52. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/bloks/fluss.py +0 -0
  53. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/bloks/internal_docker.py +0 -0
  54. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/bloks/kabinet.py +0 -0
  55. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/bloks/livekit.py +0 -0
  56. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/bloks/mikro.py +0 -0
  57. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/bloks/minio.py +0 -0
  58. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/bloks/mount.py +0 -0
  59. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/bloks/namegen.py +0 -0
  60. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/bloks/postgres.py +0 -0
  61. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/bloks/redis.py +0 -0
  62. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/bloks/rekuest.py +0 -0
  63. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/bloks/secret.py +0 -0
  64. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/bloks/services/__init__.py +0 -0
  65. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/bloks/services/admin.py +0 -0
  66. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/bloks/services/config.py +0 -0
  67. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/bloks/services/db.py +0 -0
  68. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/bloks/services/gateway.py +0 -0
  69. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/bloks/services/livekit.py +0 -0
  70. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/bloks/services/lok.py +0 -0
  71. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/bloks/services/mount.py +0 -0
  72. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/bloks/services/name.py +0 -0
  73. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/bloks/services/ollama.py +0 -0
  74. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/bloks/services/redis.py +0 -0
  75. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/bloks/services/s3.py +0 -0
  76. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/bloks/services/secret.py +0 -0
  77. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/bloks/services/socket.py +0 -0
  78. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/bloks/socket.py +0 -0
  79. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/bloks/tailscale.py +0 -0
  80. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/builders.py +0 -0
  81. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/__init__.py +0 -0
  82. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/commands/call/__init__.py +0 -0
  83. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/commands/call/local.py +0 -0
  84. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/commands/call/main.py +0 -0
  85. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/commands/call/remote.py +0 -0
  86. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/commands/gen/__init__.py +0 -0
  87. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/commands/gen/compile.py +0 -0
  88. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/commands/gen/main.py +0 -0
  89. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/commands/gen/watch.py +0 -0
  90. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/commands/init/__init__.py +0 -0
  91. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/commands/init/main.py +0 -0
  92. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/commands/inspect/__init__.py +0 -0
  93. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/commands/inspect/main.py +0 -0
  94. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/commands/inspect/requirements.py +0 -0
  95. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/commands/inspect/variables.py +0 -0
  96. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/commands/kabinet/__init__.py +0 -0
  97. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/commands/manifest/__init__.py +0 -0
  98. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/commands/manifest/scopes.py +0 -0
  99. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/commands/manifest/version.py +0 -0
  100. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/commands/run/__init__.py +0 -0
  101. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/commands/run/dev.py +0 -0
  102. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/commands/run/main.py +0 -0
  103. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/commands/run/prod.py +0 -0
  104. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/commands/run/utils.py +0 -0
  105. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/configs/base.yaml +0 -0
  106. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/constants.py +0 -0
  107. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/dockerfiles/vanilla.dockerfile +0 -0
  108. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/errors.py +0 -0
  109. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/inspect.py +0 -0
  110. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/main.py +0 -0
  111. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/options.py +0 -0
  112. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/schemas/fluss.schema.graphql +0 -0
  113. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/schemas/gucker.schema.graphql +0 -0
  114. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/schemas/kabinet.schema.graphql +0 -0
  115. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/schemas/kluster.schema.graphql +0 -0
  116. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/schemas/konviktion.schema.graphql +0 -0
  117. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/schemas/kuay.schema.graphql +0 -0
  118. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/schemas/mikro.schema.graphql +0 -0
  119. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/schemas/mikro_next.schema.graphql +0 -0
  120. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/schemas/napari.schema.graphql +0 -0
  121. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/schemas/omero_ark.schema.graphql +0 -0
  122. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/schemas/port.schema.graphql +0 -0
  123. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/schemas/rekuest.schema.graphql +0 -0
  124. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/schemas/rekuest_next.schema.graphql +0 -0
  125. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/schemas/unlok.schema.graphql +0 -0
  126. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/templates/filter.py +0 -0
  127. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/templates/simple.py +0 -0
  128. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/texts.py +0 -0
  129. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/utils.py +0 -0
  130. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/validators.py +0 -0
  131. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/vars.py +0 -0
  132. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/cli/versions/v1.yaml +0 -0
  133. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/constants.py +0 -0
  134. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/qt/__init__.py +0 -0
  135. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/qt/assets/dark/gear.png +0 -0
  136. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/qt/assets/dark/green pulse.gif +0 -0
  137. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/qt/assets/dark/orange pulse.gif +0 -0
  138. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/qt/assets/dark/pink pulse.gif +0 -0
  139. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/qt/assets/dark/red pulse.gif +0 -0
  140. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/qt/assets/light/gear.png +0 -0
  141. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/qt/assets/light/green pulse.gif +0 -0
  142. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/qt/assets/light/orange pulse.gif +0 -0
  143. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/qt/assets/light/pink pulse.gif +0 -0
  144. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/qt/assets/light/red pulse.gif +0 -0
  145. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/qt/magic_bar.py +0 -0
  146. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/qt/types.py +0 -0
  147. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/qt/utils.py +0 -0
  148. {arkitekt_next-0.8.60 → arkitekt_next-0.8.61}/arkitekt_next/tqdm.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: arkitekt-next
3
- Version: 0.8.60
3
+ Version: 0.8.61
4
4
  Summary: client for the arkitekt_next platform
5
5
  License: MIT
6
6
  Author: jhnnsrs
@@ -14,29 +14,39 @@ Classifier: Programming Language :: Python :: 3.10
14
14
  Classifier: Programming Language :: Python :: 3.11
15
15
  Classifier: Programming Language :: Python :: 3.12
16
16
  Provides-Extra: all
17
+ Provides-Extra: alpaka
17
18
  Provides-Extra: blok
18
19
  Provides-Extra: cli
19
20
  Provides-Extra: extended
21
+ Provides-Extra: fluss
22
+ Provides-Extra: kabinet
23
+ Provides-Extra: kraph
24
+ Provides-Extra: lovekit
25
+ Provides-Extra: mikro
26
+ Provides-Extra: reaktion
27
+ Provides-Extra: rekuest
20
28
  Provides-Extra: stream
29
+ Provides-Extra: unlok
30
+ Requires-Dist: alpaka (>=0.1.17) ; (python_version >= "3.10" and python_version < "4.0") and (extra == "alpaka" or extra == "extended")
21
31
  Requires-Dist: blok (>=0.0.22) ; (python_version >= "3.9" and python_version < "4.0") and (extra == "blok")
22
32
  Requires-Dist: cryptography (>=40.0.8) ; (python_version >= "3.8" and python_version < "4.0") and (extra == "blok")
23
33
  Requires-Dist: dokker (>=1.0.0)
24
34
  Requires-Dist: fakts-next (>=1.0.4)
25
- Requires-Dist: fluss-next (>=0.1.95) ; extra == "all"
35
+ Requires-Dist: fluss-next (>=0.1.96) ; extra == "fluss" or extra == "all"
26
36
  Requires-Dist: herre-next (>=1.0.2)
27
- Requires-Dist: kabinet (>=0.1.45) ; (python_version >= "3.9" and python_version < "4.0") and (extra == "all")
37
+ Requires-Dist: kabinet (>=0.1.46) ; (python_version >= "3.9" and python_version < "4.0") and (extra == "kabinet" or extra == "all")
28
38
  Requires-Dist: koil (>=1.0.3)
29
- Requires-Dist: kraph (>=0.1.100) ; (python_version >= "3.8" and python_version < "4.0") and (extra == "extended")
30
- Requires-Dist: lovekit (>=0.1.18) ; (python_version >= "3.10" and python_version < "4.0") and (extra == "stream")
31
- Requires-Dist: mikro-next (>=0.1.50) ; (python_version >= "3.10" and python_version < "4.0") and (extra == "all")
39
+ Requires-Dist: kraph (>=0.1.101) ; (python_version >= "3.8" and python_version < "4.0") and (extra == "kraph" or extra == "extended")
40
+ Requires-Dist: lovekit (>=0.1.19) ; (python_version >= "3.10" and python_version < "4.0") and (extra == "lovekit" or extra == "stream")
41
+ Requires-Dist: mikro-next (>=0.1.55) ; (python_version >= "3.10" and python_version < "4.0") and (extra == "mikro" or extra == "all")
32
42
  Requires-Dist: namegenerator (>=1.0.6) ; (python_version >= "3.8" and python_version < "4.0") and (extra == "blok")
33
43
  Requires-Dist: netifaces (>=0.11.0) ; (python_version >= "3.8" and python_version < "4.0") and (extra == "blok")
34
- Requires-Dist: reaktion-next (>=0.1.86) ; (python_version >= "3.8" and python_version < "4.0") and (extra == "all")
35
- Requires-Dist: rekuest-next (>=0.2.58) ; (python_version >= "3.8" and python_version < "4.0") and (extra == "cli" or extra == "all")
44
+ Requires-Dist: reaktion-next (>=0.1.87) ; (python_version >= "3.8" and python_version < "4.0") and (extra == "reaktion" or extra == "all")
45
+ Requires-Dist: rekuest-next (>=0.2.82) ; (python_version >= "3.8" and python_version < "4.0") and (extra == "cli" or extra == "rekuest" or extra == "all")
36
46
  Requires-Dist: rich-click (>=1.6.1) ; extra == "cli" or extra == "all" or extra == "blok"
37
47
  Requires-Dist: semver (>=3.0.1) ; extra == "cli" or extra == "all"
38
48
  Requires-Dist: turms (>=0.8.2) ; (python_version >= "3.9" and python_version < "4.0") and (extra == "cli" or extra == "all")
39
- Requires-Dist: unlok-next (>=0.1.87) ; python_version >= "3.8" and python_version < "4.0"
49
+ Requires-Dist: unlok-next (>=0.1.89) ; (python_version >= "3.8" and python_version < "4.0") and (extra == "unlok")
40
50
  Requires-Dist: watchfiles (>=0.18.1) ; extra == "cli" or extra == "all"
41
51
  Description-Content-Type: text/markdown
42
52
 
@@ -21,6 +21,7 @@ from arkitekt_next.bloks.namegen import PreformedNamesBlok
21
21
  from arkitekt_next.bloks.ollama import OllamaBlok
22
22
  from arkitekt_next.bloks.self_signed import SelfSignedBlok
23
23
  from arkitekt_next.bloks.kraph import KraphBlok
24
+ from arkitekt_next.bloks.local_sign import LocalSignBlok
24
25
 
25
26
 
26
27
  def get_bloks():
@@ -48,4 +49,6 @@ def get_bloks():
48
49
  SecretBlok(),
49
50
  PreformedNamesBlok(),
50
51
  OrkestratorBlok(),
52
+ LocalSignBlok(),
51
53
  ]
54
+
@@ -34,7 +34,11 @@ from .builders import easy, interactive
34
34
  from .apps.types import App
35
35
  from fakts_next.helpers import afakt, fakt
36
36
  from .init_registry import init, InitHookRegisty, get_current_init_hook_registry
37
- from .service_registry import require, ServiceBuilderRegistry, get_current_service_registry
37
+ from .service_registry import (
38
+ require,
39
+ ServiceBuilderRegistry,
40
+ get_current_service_registry,
41
+ )
38
42
 
39
43
 
40
44
  __all__ = [
@@ -2,7 +2,7 @@
2
2
 
3
3
  from hashlib import sha256
4
4
  import json
5
- from pydantic import BaseModel, Field, field_validator
5
+ from pydantic import BaseModel, Field, field_validator, ConfigDict
6
6
  from typing import List, Optional
7
7
 
8
8
 
@@ -42,9 +42,7 @@ class Manifest(BaseModel):
42
42
  """ A URL to the logo of the app TODO: We should enforce this to be a http URL as local paths won't work """
43
43
  requirements: Optional[List[Requirement]] = Field(default_factory=list)
44
44
  """ Requirements that this app has TODO: What are the requirements? """
45
-
46
- class Config:
47
- extra = "forbid"
45
+ model_config = ConfigDict(extra="forbid")
48
46
 
49
47
  def hash(self):
50
48
  """Hash the manifest
@@ -22,18 +22,21 @@ class AdminCredentials(BaseModel):
22
22
  email: str
23
23
 
24
24
 
25
- @blok("live.arkitekt", dependencies=[
26
- MikroBlok.as_dependency(True, True),
27
- KabinetBlok.as_dependency(True, True),
28
- RekuestBlok.as_dependency(True, True),
29
- FlussBlok.as_dependency(True, True),
30
- InternalDockerBlok.as_dependency(True, True),
31
- LocalLiveKitBlok.as_dependency(True, True),
32
- OrkestratorBlok.as_dependency(True, False),
33
- KraphBlok.as_dependency(True, False),
34
- TailscaleBlok.as_dependency(True, False),
35
- OllamaBlok.as_dependency(True, False),
36
- ])
25
+ @blok(
26
+ "live.arkitekt",
27
+ dependencies=[
28
+ MikroBlok.as_dependency(True, True),
29
+ KabinetBlok.as_dependency(True, True),
30
+ RekuestBlok.as_dependency(True, True),
31
+ FlussBlok.as_dependency(True, True),
32
+ InternalDockerBlok.as_dependency(True, True),
33
+ LocalLiveKitBlok.as_dependency(True, True),
34
+ OrkestratorBlok.as_dependency(True, False),
35
+ KraphBlok.as_dependency(True, False),
36
+ TailscaleBlok.as_dependency(True, False),
37
+ OllamaBlok.as_dependency(True, False),
38
+ ],
39
+ )
37
40
  class ArkitektBlok:
38
41
 
39
42
  def entry(self, renderer: Renderer):
@@ -46,6 +49,5 @@ class ArkitektBlok:
46
49
  )
47
50
  )
48
51
 
49
-
50
52
  def build(self, cwd):
51
53
  pass
@@ -1,6 +1,6 @@
1
1
  from blok import blok, InitContext, Option
2
2
  from blok.tree import YamlFile, Repo
3
- from typing import Any, Protocol
3
+ from typing import Any, Optional, Protocol
4
4
  from blok.utils import check_protocol_compliance
5
5
  from dataclasses import asdict
6
6
  from arkitekt_next.bloks.services import (
@@ -58,15 +58,15 @@ class BaseArkitektService:
58
58
  self,
59
59
  init: InitContext,
60
60
  lok: LokService,
61
- dns: DnsService,
62
61
  db: DBService,
63
- gateway: GatewayService,
64
62
  redis: RedisService,
65
63
  s3: S3Service,
66
64
  config: ConfigService,
67
65
  mount: MountService,
68
66
  admin: AdminService,
69
67
  secret: SecretService,
68
+ gateway: Optional[GatewayService] = None,
69
+ dns: DnsService = None,
70
70
  mount_repo: bool = False,
71
71
  host: str = "",
72
72
  image: str = "",
@@ -83,7 +83,9 @@ class BaseArkitektService:
83
83
 
84
84
  path_name = self.host
85
85
 
86
- gateway_access = gateway.expose(path_name, 80, self.host)
86
+ if gateway:
87
+ print("Registering gateway access")
88
+ gateway_access = gateway.expose(path_name, 80, self.host)
87
89
 
88
90
  postgress_access = db.register_db(self.host)
89
91
  redis_access = redis.register()
@@ -33,7 +33,8 @@ class ExposedPort(BaseModel):
33
33
 
34
34
 
35
35
  @blok(
36
- "live.arkitekt.gateway", description="A gateway for exposing services on the host",
36
+ "live.arkitekt.gateway",
37
+ description="A gateway for exposing services on the host",
37
38
  )
38
39
  class CaddyBlok:
39
40
  def __init__(self) -> None:
@@ -63,7 +64,13 @@ class CaddyBlok:
63
64
  def retrieve_gateway_network(self):
64
65
  return self.gateway_network
65
66
 
66
- def preflight(self, init: InitContext, dns: DnsService, name: NameService, certer: CerterService):
67
+ def preflight(
68
+ self,
69
+ init: InitContext,
70
+ dns: DnsService,
71
+ name: NameService,
72
+ certer: CerterService,
73
+ ):
67
74
  for key, value in init.kwargs.items():
68
75
  setattr(self, key, value)
69
76
 
@@ -73,7 +80,6 @@ class CaddyBlok:
73
80
 
74
81
  self.cert_mount = certer.retrieve_certs_mount()
75
82
  self.depends_on = certer.retrieve_depends_on()
76
-
77
83
 
78
84
  def build(
79
85
  self,
@@ -108,8 +114,7 @@ class CaddyBlok:
108
114
  """
109
115
  tls /certs/caddy.crt /certs/caddy.key
110
116
  """
111
- if protocol == "https"
112
- and self.cert_mount
117
+ if protocol == "https" and self.cert_mount
113
118
  else ""
114
119
  )
115
120
  caddyfile += """
@@ -167,7 +172,6 @@ class CaddyBlok:
167
172
  f"{port.port}:{port.port}" for port in self.exposed_ports.values()
168
173
  ]
169
174
 
170
-
171
175
  volumes = ["./configs/Caddyfile:/etc/caddy/Caddyfile"]
172
176
  if self.cert_mount:
173
177
  volumes.append(f"{self.cert_mount}:/certs")
@@ -18,7 +18,10 @@ class AccessCredentials(BaseModel):
18
18
  db_name: str
19
19
 
20
20
 
21
- @blok("live.arkitekt.kraph", description="Kraph allows you to interconnect structures in a graph database")
21
+ @blok(
22
+ "live.arkitekt.kraph",
23
+ description="Kraph allows you to interconnect structures in a graph database",
24
+ )
22
25
  class KraphBlok(BaseArkitektService):
23
26
  def __init__(self) -> None:
24
27
  self.dev = False
@@ -0,0 +1,261 @@
1
+ import click
2
+
3
+ from pydantic import BaseModel
4
+ from cryptography.hazmat.primitives import serialization as crypto_serialization
5
+ from cryptography.hazmat.primitives.asymmetric import rsa
6
+ from cryptography.hazmat.backends import default_backend as crypto_default_backend
7
+ from typing import Dict, Optional
8
+ from arkitekt_next.bloks.secret import SecretBlok
9
+ from arkitekt_next.bloks.services.admin import AdminService
10
+ from arkitekt_next.bloks.services.db import DBService
11
+ from arkitekt_next.bloks.services.gateway import GatewayService
12
+ from arkitekt_next.bloks.services.livekit import LivekitService
13
+ from arkitekt_next.bloks.services.lok import LokCredentials, LokService
14
+ import yaml
15
+ import secrets
16
+ from dataclasses import asdict
17
+
18
+ from arkitekt_next.bloks.services.redis import RedisService
19
+ from blok import blok, InitContext, ExecutionContext, Option
20
+ from blok.bloks.services.dns import DnsService
21
+ from blok.tree import YamlFile, Repo
22
+ from blok import blok, InitContext
23
+
24
+
25
+ DEFAULT_ARKITEKT_URL = "http://localhost:8000"
26
+
27
+
28
+ # Define a custom user type that will parse and validate the user input
29
+ class UserParamType(click.ParamType):
30
+ name = "user"
31
+
32
+ def convert(self, value, param, ctx):
33
+ if isinstance(value, dict):
34
+ return value
35
+ try:
36
+ name, password = value.split(":")
37
+ return {"name": name, "password": password}
38
+ except ValueError:
39
+ self.fail(
40
+ f"User '{value}' is not in the correct format. It should be 'name:password'.",
41
+ param,
42
+ ctx,
43
+ )
44
+
45
+
46
+ USER = UserParamType()
47
+
48
+
49
+ # Define a custom user type that will parse and validate the user input
50
+ class GroupParamType(click.ParamType):
51
+ name = "group"
52
+
53
+ def convert(self, value, param, ctx):
54
+ if isinstance(value, dict):
55
+ return value
56
+ try:
57
+ name, description = value.split(":")
58
+ return {"name": name, "description": description}
59
+ except ValueError:
60
+ self.fail(
61
+ f"User '{value}' is not in the correct format. It should be 'name:password'.",
62
+ param,
63
+ ctx,
64
+ )
65
+
66
+
67
+ GROUP = GroupParamType()
68
+
69
+
70
+ class RedeemTokenParamType(click.ParamType):
71
+ name = "redeem_token"
72
+
73
+ def convert(self, value, param, ctx):
74
+ if isinstance(value, dict):
75
+ assert "user" in value, f"scope is required {value}"
76
+ assert "token" in value, f"description is required {value}"
77
+ return value
78
+
79
+ try:
80
+ user, token = value.split(":")
81
+ return {"user": user, "token": token}
82
+ except ValueError:
83
+ self.fail(
84
+ f"RedeemToken '{value}' is not in the correct format. It should be 'username:token'.",
85
+ param,
86
+ ctx,
87
+ )
88
+
89
+
90
+ TOKEN = RedeemTokenParamType()
91
+
92
+
93
+ class ScopeParamType(click.ParamType):
94
+ name = "scope"
95
+
96
+ def convert(self, value, param, ctx):
97
+ if isinstance(value, dict):
98
+ assert "scope" in value, f"scope is required {value}"
99
+ assert "description" in value, f"description is required {value}"
100
+ return value
101
+
102
+ try:
103
+ name, description = value.split(":")
104
+ return {"scope": name, "description": description}
105
+ except ValueError:
106
+ self.fail(
107
+ f"Scopes '{value}' is not in the correct format. It should be 'scope:description'.",
108
+ param,
109
+ ctx,
110
+ )
111
+
112
+
113
+ SCOPE = ScopeParamType()
114
+
115
+
116
+ @blok(LokService, description="A local sign service")
117
+ class LocalSignBlok:
118
+ db_name: str
119
+
120
+ def __init__(self) -> None:
121
+ self.db_name = "lok_db"
122
+ self.mount_repo = False
123
+ self.build_repo = False
124
+ self.private_key = None
125
+ self.public_key = None
126
+ self.host = "lok"
127
+ self.dev = False
128
+ self.with_repo = False
129
+ self.users = []
130
+ self.tokens = []
131
+ self.groups = []
132
+ self.scopes = {}
133
+ self.key = None
134
+ self.deployment_name = "default"
135
+ self.token_expiry_seconds = 700000
136
+ self.preformed_redeem_tokens = [secrets.token_hex(16) for i in range(80)]
137
+ self.registered_tokens = {}
138
+ self.local_access = None
139
+
140
+ def retrieve_credentials(self) -> LokCredentials:
141
+ return LokCredentials(
142
+ public_key=self.public_key, key_type="RS256", issuer="lok"
143
+ )
144
+
145
+ def retrieve_labels(self, service_name: str, builder_name: str) -> list[str]:
146
+ return [
147
+ f"fakts.service={service_name}",
148
+ f"fakts.builder={builder_name}",
149
+ ]
150
+
151
+ def retrieve_token(self, user: str = "admin") -> str:
152
+ pass
153
+ return "fake-token"
154
+
155
+ def register_scopes(self, scopes_dict: Dict[str, str]) -> LokCredentials:
156
+ self.scopes = self.scopes | scopes_dict
157
+
158
+ def preflight(
159
+ self,
160
+ init: InitContext
161
+ ):
162
+ for key, value in init.kwargs.items():
163
+ setattr(self, key, value)
164
+
165
+ assert self.public_key, "Public key is required"
166
+ assert self.private_key, "Private key is required"
167
+
168
+
169
+ def build(self, context: ExecutionContext):
170
+ context.file_tree.set_nested("secrets", "public_key.pem", self.public_key)
171
+ context.file_tree.set_nested("secrets", "private_key.pem", self.private_key)
172
+
173
+ def get_options(self):
174
+ key = rsa.generate_private_key(
175
+ public_exponent=65537, key_size=2048, backend=crypto_default_backend()
176
+ )
177
+
178
+ private_key = key.private_bytes(
179
+ crypto_serialization.Encoding.PEM,
180
+ crypto_serialization.PrivateFormat.PKCS8,
181
+ crypto_serialization.NoEncryption(),
182
+ ).decode()
183
+
184
+ public_key = (
185
+ key.public_key()
186
+ .public_bytes(
187
+ crypto_serialization.Encoding.OpenSSH,
188
+ crypto_serialization.PublicFormat.OpenSSH,
189
+ )
190
+ .decode()
191
+ )
192
+
193
+ with_dev = Option(
194
+ subcommand="dev",
195
+ help="Run the service in development mode",
196
+ type=bool,
197
+ default=self.dev,
198
+ show_default=True,
199
+ )
200
+
201
+ with_fakts_url = Option(
202
+ subcommand="db_name",
203
+ help="The name of the database",
204
+ default="db_name",
205
+ show_default=True,
206
+ )
207
+ with_users = Option(
208
+ subcommand="users",
209
+ help="Users that should be greated by default. Format is name:password",
210
+ default=["admin:admin"],
211
+ multiple=True,
212
+ type=USER,
213
+ show_default=True,
214
+ )
215
+ with_groups = Option(
216
+ subcommand="groups",
217
+ help="Groups that should be greated by default. Format is name:description",
218
+ default=["admin:admin_group"],
219
+ multiple=True,
220
+ type=GROUP,
221
+ show_default=True,
222
+ )
223
+ with_public_key = Option(
224
+ subcommand="public_key",
225
+ help="The public key for the JWT creation",
226
+ default=public_key,
227
+ required=True,
228
+ callback=validate_public_key,
229
+ )
230
+ with_private_key = Option(
231
+ subcommand="private_key",
232
+ help="The corresponding private key for the JWT creation",
233
+ default=private_key,
234
+ callback=validate_private_key,
235
+ required=True,
236
+ )
237
+
238
+ return [
239
+ with_dev,
240
+ with_fakts_url,
241
+ with_users,
242
+ with_groups,
243
+ with_private_key,
244
+ with_public_key,
245
+ ]
246
+
247
+
248
+ def validate_public_key(ctx, param, value):
249
+ if not value.startswith("ssh-rsa"):
250
+ raise click.BadParameter(
251
+ f"Public key must be in ssh-rsa format. Started with {value}"
252
+ )
253
+ return value
254
+
255
+
256
+ def validate_private_key(ctx, param, value):
257
+ if not value.startswith("-----BEGIN PRIVATE KEY-----"):
258
+ raise click.BadParameter(
259
+ f"Private key must be in PEM format. Started with {value}"
260
+ )
261
+ return value
@@ -234,8 +234,6 @@ class LokBlok:
234
234
  trusted_origins.append(f"http://{i}")
235
235
  trusted_origins.append(f"https://{i}")
236
236
 
237
-
238
-
239
237
  configuration = YamlFile(
240
238
  **{
241
239
  "db": asdict(self.postgress_access),
@@ -257,7 +255,11 @@ class LokBlok:
257
255
  ],
258
256
  "groups": [group for group in self.groups],
259
257
  "deployment": {"name": self.deployment_name},
260
- "livekit": asdict(self.local_access) if self.local_access else {"api_key": "dev", "api_secret": "secret", "api_url": None},
258
+ "livekit": (
259
+ asdict(self.local_access)
260
+ if self.local_access
261
+ else {"api_key": "dev", "api_secret": "secret", "api_url": None}
262
+ ),
261
263
  "token_expire_seconds": self.token_expiry_seconds,
262
264
  "apps": [],
263
265
  "force_script_name": "lok",
@@ -20,7 +20,6 @@ class OllamaBlok:
20
20
  for key, value in init.kwargs.items():
21
21
  setattr(self, key, value)
22
22
 
23
-
24
23
  if self.skip:
25
24
  return
26
25
 
@@ -28,7 +27,6 @@ class OllamaBlok:
28
27
 
29
28
  self.initialized = True
30
29
 
31
-
32
30
  def build(self, context: ExecutionContext):
33
31
  if self.skip:
34
32
  return
@@ -40,7 +38,7 @@ class OllamaBlok:
40
38
  "image": self.image,
41
39
  "environment": {
42
40
  "OLLAMA_KEEP_ALIVE": "24h",
43
- }
41
+ },
44
42
  }
45
43
 
46
44
  if self.gpu:
@@ -58,7 +56,6 @@ class OllamaBlok:
58
56
  }
59
57
  }
60
58
 
61
-
62
59
  context.docker_compose.set_nested("services", self.host, db_service)
63
60
 
64
61
  def get_options(self):
@@ -34,11 +34,10 @@ class OrkestratorBlok:
34
34
 
35
35
  if self.disable:
36
36
  return
37
-
37
+
38
38
  if not self.dev:
39
39
  gateway.expose(self.path_name, 80, self.host)
40
40
 
41
-
42
41
  self.service = {
43
42
  "image": "jhnnsrs/orkestrator_next:nightly",
44
43
  "environment": {
@@ -46,8 +45,8 @@ class OrkestratorBlok:
46
45
  },
47
46
  }
48
47
 
49
- return
50
-
48
+ return
49
+
51
50
  else:
52
51
 
53
52
  self.mount = mount.register_mount("orkestrator", Repo(self.repo))
@@ -73,7 +72,7 @@ class OrkestratorBlok:
73
72
  def build(self, context: ExecutionContext):
74
73
  if self.disable:
75
74
  return
76
-
75
+
77
76
  if self.dev:
78
77
 
79
78
  context.install_commands.set_nested(
@@ -84,7 +83,6 @@ class OrkestratorBlok:
84
83
  )
85
84
  return
86
85
 
87
-
88
86
  context.docker_compose.set_nested("services", self.host, self.service)
89
87
  pass
90
88
 
@@ -32,9 +32,7 @@ class ExposedPort(BaseModel):
32
32
  to: int
33
33
 
34
34
 
35
- @blok(
36
- "live.arkitekt.certer", description="A self-signed certificate generator"
37
- )
35
+ @blok("live.arkitekt.certer", description="A self-signed certificate generator")
38
36
  class SelfSignedBlok:
39
37
  def __init__(self) -> None:
40
38
  self.host = "certer"
@@ -44,7 +42,6 @@ class SelfSignedBlok:
44
42
  def retrieve_certs_mount(self):
45
43
  return self.certs_mount
46
44
 
47
-
48
45
  def retrieve_depends_on(self):
49
46
  return ["certer"]
50
47
 
@@ -55,7 +52,6 @@ class SelfSignedBlok:
55
52
  self.public_ips = dns.get_dns_result().ip_addresses
56
53
  self.public_hosts = dns.get_dns_result().hostnames
57
54
 
58
-
59
55
  def build(
60
56
  self,
61
57
  context: ExecutionContext,
@@ -63,7 +59,6 @@ class SelfSignedBlok:
63
59
 
64
60
  context.file_tree.set_nested("certs", {})
65
61
 
66
-
67
62
  certer_container = {
68
63
  "image": self.certer_image,
69
64
  "volumes": ["./certs:/certs"],
@@ -75,8 +70,6 @@ class SelfSignedBlok:
75
70
 
76
71
  context.docker_compose.set_nested("services", self.host, certer_container)
77
72
 
78
-
79
-
80
73
  def get_options(self):
81
74
  with_public_urls = Option(
82
75
  subcommand="public_url",
@@ -10,5 +10,5 @@ from blok import blok, InitContext, service
10
10
  class CerterService(Protocol):
11
11
 
12
12
  def retrieve_certs_mount(self) -> str: ...
13
-
14
- def retrieve_depends_on(self) -> list[str]: ...
13
+
14
+ def retrieve_depends_on(self) -> list[str]: ...
@@ -14,7 +14,7 @@ from arkitekt_next.cli.options import (
14
14
  import yaml
15
15
  from arkitekt_next.cli.utils import build_relative_dir
16
16
  from arkitekt_next.cli.vars import get_console, get_manifest
17
- from arkitekt_next.service_registry import check_and_import_services
17
+ from arkitekt_next.service_registry import get_default_service_registry
18
18
 
19
19
 
20
20
  @click.command()
@@ -51,7 +51,7 @@ def init(ctx, boring, services, config, documents, schemas, path, seperate_doc_d
51
51
  # Initializing the config
52
52
  projects = {}
53
53
 
54
- registry = check_and_import_services()
54
+ registry = get_default_service_registry()
55
55
 
56
56
  chosen_services = registry.service_builders
57
57