meerschaum 2.9.5__py3-none-any.whl → 3.0.0__py3-none-any.whl

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 (200) hide show
  1. meerschaum/__init__.py +5 -2
  2. meerschaum/_internal/__init__.py +1 -0
  3. meerschaum/_internal/arguments/_parse_arguments.py +4 -4
  4. meerschaum/_internal/arguments/_parser.py +33 -4
  5. meerschaum/_internal/cli/__init__.py +6 -0
  6. meerschaum/_internal/cli/daemons.py +103 -0
  7. meerschaum/_internal/cli/entry.py +220 -0
  8. meerschaum/_internal/cli/workers.py +435 -0
  9. meerschaum/_internal/docs/index.py +48 -2
  10. meerschaum/_internal/entry.py +50 -14
  11. meerschaum/_internal/shell/Shell.py +121 -29
  12. meerschaum/_internal/shell/__init__.py +4 -1
  13. meerschaum/_internal/static.py +359 -0
  14. meerschaum/_internal/term/TermPageHandler.py +1 -2
  15. meerschaum/_internal/term/__init__.py +40 -6
  16. meerschaum/_internal/term/tools.py +33 -8
  17. meerschaum/actions/__init__.py +6 -4
  18. meerschaum/actions/api.py +53 -13
  19. meerschaum/actions/attach.py +1 -0
  20. meerschaum/actions/bootstrap.py +8 -8
  21. meerschaum/actions/delete.py +4 -2
  22. meerschaum/actions/edit.py +171 -25
  23. meerschaum/actions/login.py +8 -8
  24. meerschaum/actions/register.py +143 -6
  25. meerschaum/actions/reload.py +22 -5
  26. meerschaum/actions/restart.py +14 -0
  27. meerschaum/actions/show.py +184 -31
  28. meerschaum/actions/start.py +166 -17
  29. meerschaum/actions/stop.py +38 -2
  30. meerschaum/actions/sync.py +7 -2
  31. meerschaum/actions/tag.py +9 -8
  32. meerschaum/actions/verify.py +5 -8
  33. meerschaum/api/__init__.py +45 -15
  34. meerschaum/api/_events.py +46 -4
  35. meerschaum/api/_oauth2.py +162 -9
  36. meerschaum/api/_tokens.py +102 -0
  37. meerschaum/api/dash/__init__.py +0 -3
  38. meerschaum/api/dash/callbacks/__init__.py +1 -0
  39. meerschaum/api/dash/callbacks/custom.py +4 -3
  40. meerschaum/api/dash/callbacks/dashboard.py +198 -118
  41. meerschaum/api/dash/callbacks/jobs.py +14 -7
  42. meerschaum/api/dash/callbacks/login.py +10 -1
  43. meerschaum/api/dash/callbacks/pipes.py +194 -14
  44. meerschaum/api/dash/callbacks/plugins.py +0 -1
  45. meerschaum/api/dash/callbacks/register.py +10 -3
  46. meerschaum/api/dash/callbacks/settings/password_reset.py +2 -2
  47. meerschaum/api/dash/callbacks/tokens.py +389 -0
  48. meerschaum/api/dash/components.py +36 -15
  49. meerschaum/api/dash/jobs.py +1 -1
  50. meerschaum/api/dash/keys.py +35 -93
  51. meerschaum/api/dash/pages/__init__.py +2 -1
  52. meerschaum/api/dash/pages/dashboard.py +1 -20
  53. meerschaum/api/dash/pages/{job.py → jobs.py} +10 -7
  54. meerschaum/api/dash/pages/login.py +2 -2
  55. meerschaum/api/dash/pages/pipes.py +16 -5
  56. meerschaum/api/dash/pages/settings/password_reset.py +1 -1
  57. meerschaum/api/dash/pages/tokens.py +53 -0
  58. meerschaum/api/dash/pipes.py +382 -95
  59. meerschaum/api/dash/sessions.py +12 -0
  60. meerschaum/api/dash/tokens.py +603 -0
  61. meerschaum/api/dash/websockets.py +1 -1
  62. meerschaum/api/dash/webterm.py +18 -6
  63. meerschaum/api/models/__init__.py +23 -3
  64. meerschaum/api/models/_actions.py +22 -0
  65. meerschaum/api/models/_pipes.py +91 -7
  66. meerschaum/api/models/_tokens.py +81 -0
  67. meerschaum/api/resources/static/js/terminado.js +3 -0
  68. meerschaum/api/resources/static/js/xterm-addon-unicode11.js +2 -0
  69. meerschaum/api/resources/templates/termpage.html +13 -0
  70. meerschaum/api/routes/__init__.py +1 -0
  71. meerschaum/api/routes/_actions.py +3 -4
  72. meerschaum/api/routes/_connectors.py +3 -7
  73. meerschaum/api/routes/_jobs.py +26 -35
  74. meerschaum/api/routes/_login.py +120 -15
  75. meerschaum/api/routes/_misc.py +5 -10
  76. meerschaum/api/routes/_pipes.py +178 -143
  77. meerschaum/api/routes/_plugins.py +38 -28
  78. meerschaum/api/routes/_tokens.py +236 -0
  79. meerschaum/api/routes/_users.py +47 -35
  80. meerschaum/api/routes/_version.py +3 -3
  81. meerschaum/api/routes/_webterm.py +3 -3
  82. meerschaum/config/__init__.py +100 -30
  83. meerschaum/config/_default.py +132 -64
  84. meerschaum/config/_edit.py +38 -32
  85. meerschaum/config/_formatting.py +2 -0
  86. meerschaum/config/_patch.py +10 -8
  87. meerschaum/config/_paths.py +133 -13
  88. meerschaum/config/_read_config.py +87 -36
  89. meerschaum/config/_sync.py +6 -3
  90. meerschaum/config/_version.py +1 -1
  91. meerschaum/config/environment.py +262 -0
  92. meerschaum/config/stack/__init__.py +37 -15
  93. meerschaum/config/static.py +18 -0
  94. meerschaum/connectors/_Connector.py +11 -6
  95. meerschaum/connectors/__init__.py +41 -22
  96. meerschaum/connectors/api/_APIConnector.py +34 -6
  97. meerschaum/connectors/api/_actions.py +2 -2
  98. meerschaum/connectors/api/_jobs.py +12 -1
  99. meerschaum/connectors/api/_login.py +33 -7
  100. meerschaum/connectors/api/_misc.py +2 -2
  101. meerschaum/connectors/api/_pipes.py +23 -32
  102. meerschaum/connectors/api/_plugins.py +2 -2
  103. meerschaum/connectors/api/_request.py +1 -1
  104. meerschaum/connectors/api/_tokens.py +146 -0
  105. meerschaum/connectors/api/_users.py +70 -58
  106. meerschaum/connectors/instance/_InstanceConnector.py +83 -0
  107. meerschaum/connectors/instance/__init__.py +10 -0
  108. meerschaum/connectors/instance/_pipes.py +442 -0
  109. meerschaum/connectors/instance/_plugins.py +159 -0
  110. meerschaum/connectors/instance/_tokens.py +317 -0
  111. meerschaum/connectors/instance/_users.py +188 -0
  112. meerschaum/connectors/parse.py +5 -2
  113. meerschaum/connectors/sql/_SQLConnector.py +22 -5
  114. meerschaum/connectors/sql/_cli.py +12 -11
  115. meerschaum/connectors/sql/_create_engine.py +12 -168
  116. meerschaum/connectors/sql/_fetch.py +2 -18
  117. meerschaum/connectors/sql/_pipes.py +295 -278
  118. meerschaum/connectors/sql/_plugins.py +29 -0
  119. meerschaum/connectors/sql/_sql.py +46 -21
  120. meerschaum/connectors/sql/_users.py +36 -2
  121. meerschaum/connectors/sql/tables/__init__.py +254 -122
  122. meerschaum/connectors/valkey/_ValkeyConnector.py +5 -7
  123. meerschaum/connectors/valkey/_pipes.py +60 -31
  124. meerschaum/connectors/valkey/_plugins.py +2 -26
  125. meerschaum/core/Pipe/__init__.py +115 -85
  126. meerschaum/core/Pipe/_attributes.py +425 -124
  127. meerschaum/core/Pipe/_bootstrap.py +54 -24
  128. meerschaum/core/Pipe/_cache.py +555 -0
  129. meerschaum/core/Pipe/_clear.py +0 -11
  130. meerschaum/core/Pipe/_data.py +96 -68
  131. meerschaum/core/Pipe/_deduplicate.py +0 -13
  132. meerschaum/core/Pipe/_delete.py +12 -21
  133. meerschaum/core/Pipe/_drop.py +11 -23
  134. meerschaum/core/Pipe/_dtypes.py +49 -19
  135. meerschaum/core/Pipe/_edit.py +14 -4
  136. meerschaum/core/Pipe/_fetch.py +1 -1
  137. meerschaum/core/Pipe/_index.py +8 -14
  138. meerschaum/core/Pipe/_show.py +5 -5
  139. meerschaum/core/Pipe/_sync.py +123 -204
  140. meerschaum/core/Pipe/_verify.py +4 -4
  141. meerschaum/{plugins → core/Plugin}/_Plugin.py +16 -12
  142. meerschaum/core/Plugin/__init__.py +1 -1
  143. meerschaum/core/Token/_Token.py +220 -0
  144. meerschaum/core/Token/__init__.py +12 -0
  145. meerschaum/core/User/_User.py +35 -10
  146. meerschaum/core/User/__init__.py +9 -1
  147. meerschaum/core/__init__.py +1 -0
  148. meerschaum/jobs/_Executor.py +88 -4
  149. meerschaum/jobs/_Job.py +149 -38
  150. meerschaum/jobs/__init__.py +3 -2
  151. meerschaum/jobs/systemd.py +8 -3
  152. meerschaum/models/__init__.py +35 -0
  153. meerschaum/models/pipes.py +247 -0
  154. meerschaum/models/tokens.py +38 -0
  155. meerschaum/models/users.py +26 -0
  156. meerschaum/plugins/__init__.py +301 -88
  157. meerschaum/plugins/bootstrap.py +510 -4
  158. meerschaum/utils/_get_pipes.py +97 -30
  159. meerschaum/utils/daemon/Daemon.py +199 -43
  160. meerschaum/utils/daemon/FileDescriptorInterceptor.py +0 -1
  161. meerschaum/utils/daemon/RotatingFile.py +63 -36
  162. meerschaum/utils/daemon/StdinFile.py +53 -13
  163. meerschaum/utils/daemon/__init__.py +47 -6
  164. meerschaum/utils/daemon/_names.py +6 -3
  165. meerschaum/utils/dataframe.py +479 -81
  166. meerschaum/utils/debug.py +49 -19
  167. meerschaum/utils/dtypes/__init__.py +476 -34
  168. meerschaum/utils/dtypes/sql.py +369 -29
  169. meerschaum/utils/formatting/__init__.py +5 -2
  170. meerschaum/utils/formatting/_jobs.py +1 -1
  171. meerschaum/utils/formatting/_pipes.py +52 -50
  172. meerschaum/utils/formatting/_pprint.py +1 -0
  173. meerschaum/utils/formatting/_shell.py +44 -18
  174. meerschaum/utils/misc.py +268 -186
  175. meerschaum/utils/packages/__init__.py +25 -40
  176. meerschaum/utils/packages/_packages.py +42 -34
  177. meerschaum/utils/pipes.py +213 -0
  178. meerschaum/utils/process.py +2 -2
  179. meerschaum/utils/prompt.py +175 -144
  180. meerschaum/utils/schedule.py +2 -1
  181. meerschaum/utils/sql.py +134 -47
  182. meerschaum/utils/threading.py +42 -0
  183. meerschaum/utils/typing.py +1 -4
  184. meerschaum/utils/venv/_Venv.py +2 -2
  185. meerschaum/utils/venv/__init__.py +7 -7
  186. meerschaum/utils/warnings.py +19 -13
  187. {meerschaum-2.9.5.dist-info → meerschaum-3.0.0.dist-info}/METADATA +94 -96
  188. meerschaum-3.0.0.dist-info/RECORD +289 -0
  189. {meerschaum-2.9.5.dist-info → meerschaum-3.0.0.dist-info}/WHEEL +1 -1
  190. meerschaum-3.0.0.dist-info/licenses/NOTICE +2 -0
  191. meerschaum/api/models/_interfaces.py +0 -15
  192. meerschaum/api/models/_locations.py +0 -15
  193. meerschaum/api/models/_metrics.py +0 -15
  194. meerschaum/config/_environment.py +0 -145
  195. meerschaum/config/static/__init__.py +0 -186
  196. meerschaum-2.9.5.dist-info/RECORD +0 -263
  197. {meerschaum-2.9.5.dist-info → meerschaum-3.0.0.dist-info}/entry_points.txt +0 -0
  198. {meerschaum-2.9.5.dist-info → meerschaum-3.0.0.dist-info}/licenses/LICENSE +0 -0
  199. {meerschaum-2.9.5.dist-info → meerschaum-3.0.0.dist-info}/top_level.txt +0 -0
  200. {meerschaum-2.9.5.dist-info → meerschaum-3.0.0.dist-info}/zip-safe +0 -0
@@ -6,6 +6,26 @@
6
6
  Create and manipulate SQL tables with ORM
7
7
  """
8
8
 
9
- from meerschaum.api.models._pipes import MetaPipe
10
- # from meerschaum.api.models._metrics import Metric
11
- # from meerschaum.api.models._locations import Location
9
+ import meerschaum as mrsm
10
+ import meerschaum.models
11
+
12
+ from meerschaum.api.models._pipes import (
13
+ FetchPipesKeysResponseModel,
14
+ SyncPipeRequestModel,
15
+ )
16
+ from meerschaum.api.models._actions import SuccessTupleResponseModel
17
+ from meerschaum.api.models._tokens import (
18
+ GetTokensResponseModel,
19
+ RegisterTokenResponseModel,
20
+ RegisterTokenRequestModel,
21
+ GetTokenResponseModel,
22
+ )
23
+
24
+ __all__ = (
25
+ 'FetchPipesKeysResponseModel',
26
+ 'SyncPipeRequestModel',
27
+ 'SuccessTupleResponseModel',
28
+ 'RegisterTokenResponseModel',
29
+ 'RegisterTokenRequestModel',
30
+ 'GetTokenResponseModel',
31
+ )
@@ -0,0 +1,22 @@
1
+ #! /usr/bin/env python3
2
+ # vim:fenc=utf-8
3
+
4
+ """
5
+ Define actions response models.
6
+ """
7
+
8
+ from typing import Tuple
9
+ from pydantic import RootModel, ConfigDict
10
+ from meerschaum.utils.typing import SuccessTuple
11
+
12
+
13
+ class SuccessTupleResponseModel(RootModel[SuccessTuple]):
14
+ """
15
+ A response model for a tuple of a boolean and a string.
16
+ E.g. `[true, "Success"]`
17
+ """
18
+ model_config = ConfigDict(
19
+ json_schema_extra={
20
+ 'example': [True, "Success"],
21
+ },
22
+ )
@@ -8,14 +8,98 @@ Pydantic model for a pipe's keys.
8
8
 
9
9
  from __future__ import annotations
10
10
 
11
+ from typing import Optional, List, Tuple, Dict, Union, Any
12
+
11
13
  import meerschaum as mrsm
12
- from meerschaum.utils.typing import Optional
13
14
 
14
- pydantic = mrsm.attempt_import('pydantic', warn=False, lazy=False)
15
+ from meerschaum.models.pipes import (
16
+ PipeModel as BasePipeModel,
17
+ ConnectorKeysModel,
18
+ MetricKeyModel,
19
+ LocationKeyModel,
20
+ )
21
+
22
+ pydantic = mrsm.attempt_import('pydantic', lazy=False)
23
+ from pydantic import (
24
+ BaseModel,
25
+ RootModel,
26
+ field_validator,
27
+ ValidationInfo,
28
+ ConfigDict,
29
+ )
30
+
31
+
32
+ class PipeModel(BasePipeModel):
33
+ """
34
+ A `Pipe`'s model to be used in API responses.
35
+ """
36
+ parameters: Optional[dict] = None
37
+ model_config = ConfigDict(
38
+ json_schema_extra={
39
+ 'example': {
40
+ 'connector_keys': 'sql:main',
41
+ 'metric_key': 'weather',
42
+ 'location_key': 'us.co.denver',
43
+ 'instance_keys': 'sql:main',
44
+ 'parameters': {
45
+ 'columns': {
46
+ 'datetime': 'dt',
47
+ 'id': 'id',
48
+ 'value': 'val',
49
+ },
50
+ },
51
+ },
52
+ },
53
+ )
54
+
55
+
56
+ class FetchPipesKeysResponseModel(
57
+ RootModel[
58
+ Union[
59
+ List[Tuple[ConnectorKeysModel, MetricKeyModel, LocationKeyModel]],
60
+ List[Tuple[ConnectorKeysModel, MetricKeyModel, LocationKeyModel, Dict[str, Any]]],
61
+ List[Tuple[ConnectorKeysModel, MetricKeyModel, LocationKeyModel, List[str]]],
62
+ ]
63
+ ]
64
+ ):
65
+ """
66
+ A list of tuples containing connector, metric, and location keys.
67
+ """
68
+ model_config = ConfigDict(
69
+ json_schema_extra={
70
+ 'example': [
71
+ ['sql:main', 'weather', 'greenville'],
72
+ ['plugin:noaa', 'weather', 'greenville'],
73
+ ],
74
+ },
75
+ )
15
76
 
16
77
 
17
- class MetaPipe(pydantic.BaseModel):
18
- connector_keys: str
19
- metric_key: str
20
- location_key: Optional[str] = None
21
- instance_keys: Optional[str] = None
78
+ class SyncPipeRequestModel(
79
+ RootModel[
80
+ Union[
81
+ List[Dict[str, Any]],
82
+ Dict[str, List[Any]],
83
+ str
84
+ ]
85
+ ]
86
+ ):
87
+ """
88
+ The accepted formats of dataframes to be synced.
89
+ """
90
+ model_config = ConfigDict(
91
+ json_schema_extra={
92
+ 'example': [
93
+ {
94
+ 'timestamp': '2026-01-01',
95
+ 'id': 1,
96
+ 'value': 100.1,
97
+ },
98
+ {
99
+ 'timestamp': '2026-01-02',
100
+ 'id': 1,
101
+ 'value': 200.2,
102
+ }
103
+ ],
104
+ }
105
+ )
@@ -0,0 +1,81 @@
1
+ #! /usr/bin/env python3
2
+ # vim:fenc=utf-8
3
+
4
+ """
5
+ Response models for tokens.
6
+ """
7
+
8
+ import uuid
9
+ from datetime import datetime
10
+ from typing import Optional, List, Union
11
+
12
+ import meerschaum as mrsm
13
+ from meerschaum._internal.static import STATIC_CONFIG
14
+
15
+ from pydantic import BaseModel, RootModel, Field, ConfigDict
16
+
17
+
18
+ class RegisterTokenRequestModel(BaseModel):
19
+ label: Optional[str] = None
20
+ expiration: Optional[datetime] = None
21
+ scopes: List[str] = Field(default_factory=lambda: list(STATIC_CONFIG['tokens']['scopes']))
22
+ model_config = ConfigDict(
23
+ json_schema_extra = {
24
+ 'examples': [
25
+ {
26
+ 'label': 'my-iot-device',
27
+ 'expiration': '2026-01-01T00:00:00Z',
28
+ 'scopes': list(STATIC_CONFIG['tokens']['scopes']),
29
+ }
30
+ ]
31
+ }
32
+ )
33
+
34
+
35
+ class RegisterTokenResponseModel(BaseModel):
36
+ label: str
37
+ secret: str
38
+ id: uuid.UUID
39
+ api_key: str
40
+ expiration: Optional[datetime]
41
+ model_config = ConfigDict(
42
+ json_schema_extra = {
43
+ 'examples': [
44
+ {
45
+ 'label': 'my-iot-device',
46
+ 'secret': 'a_very_long_secret_string_that_is_only_shown_once',
47
+ 'id': '1540c2f6-a99d-463c-bfab-47d361200123',
48
+ 'expiration': '2026-01-01T00:00:00Z',
49
+ 'api_key': 'mrsm-key:MTU0MGMyZjYtYTk5ZC00NjNjLWJmYWItNDdkMzYxMjAwMTIzOmFfdmVyeV9sb25nX3NlY3JldF9zdHJpbmdfdGhhdF9pc19vbmx5X3Nob3duX29uY2U=',
50
+ }
51
+ ]
52
+ }
53
+ )
54
+
55
+
56
+ class GetTokenResponseModel(BaseModel):
57
+ id: Optional[uuid.UUID] = Field(default=None)
58
+ creation: datetime = Field()
59
+ expiration: Optional[datetime] = Field()
60
+ label: str = Field()
61
+ user_id: Optional[Union[int, str, uuid.UUID]] = Field(default=None)
62
+ scopes: List[str] = Field(default=list(STATIC_CONFIG['tokens']['scopes']))
63
+ is_valid: bool = Field(default=True)
64
+
65
+
66
+ class GetTokensResponseModel(RootModel[List[GetTokenResponseModel]]):
67
+ model_config = ConfigDict(
68
+ json_schema_extra={
69
+ 'example': [
70
+ {
71
+ 'label': 'my-iot-device',
72
+ 'id': '1540c2f6-a99d-463c-bfab-47d361200123',
73
+ 'user_id': 1,
74
+ 'scopes': ['pipes:write'],
75
+ 'creation': '2025-07-01T00:00:00Z',
76
+ 'expiration': '2026-01-01T00:00:00Z',
77
+ 'is_valid': True,
78
+ },
79
+ ],
80
+ }
81
+ )
@@ -11,7 +11,10 @@ function make_terminal(element, size, ws_url) {
11
11
  useStyle: true,
12
12
  scrollback: 9999999,
13
13
  cursorBlink: true,
14
+ allowProposedApi: true
14
15
  });
16
+ term.loadAddon(new Unicode11Addon.Unicode11Addon());
17
+ term.unicode.activeVersion = '11';
15
18
  term.attachCustomKeyEventHandler(copyPasteKeyEventHandler);
16
19
  term.open(element);
17
20
 
@@ -0,0 +1,2 @@
1
+ !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.Unicode11Addon=t():e.Unicode11Addon=t()}(this,(()=>(()=>{"use strict";var e={433:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.UnicodeV11=void 0;const r=i(938),s=[[768,879],[1155,1161],[1425,1469],[1471,1471],[1473,1474],[1476,1477],[1479,1479],[1536,1541],[1552,1562],[1564,1564],[1611,1631],[1648,1648],[1750,1757],[1759,1764],[1767,1768],[1770,1773],[1807,1807],[1809,1809],[1840,1866],[1958,1968],[2027,2035],[2045,2045],[2070,2073],[2075,2083],[2085,2087],[2089,2093],[2137,2139],[2259,2306],[2362,2362],[2364,2364],[2369,2376],[2381,2381],[2385,2391],[2402,2403],[2433,2433],[2492,2492],[2497,2500],[2509,2509],[2530,2531],[2558,2558],[2561,2562],[2620,2620],[2625,2626],[2631,2632],[2635,2637],[2641,2641],[2672,2673],[2677,2677],[2689,2690],[2748,2748],[2753,2757],[2759,2760],[2765,2765],[2786,2787],[2810,2815],[2817,2817],[2876,2876],[2879,2879],[2881,2884],[2893,2893],[2902,2902],[2914,2915],[2946,2946],[3008,3008],[3021,3021],[3072,3072],[3076,3076],[3134,3136],[3142,3144],[3146,3149],[3157,3158],[3170,3171],[3201,3201],[3260,3260],[3263,3263],[3270,3270],[3276,3277],[3298,3299],[3328,3329],[3387,3388],[3393,3396],[3405,3405],[3426,3427],[3530,3530],[3538,3540],[3542,3542],[3633,3633],[3636,3642],[3655,3662],[3761,3761],[3764,3772],[3784,3789],[3864,3865],[3893,3893],[3895,3895],[3897,3897],[3953,3966],[3968,3972],[3974,3975],[3981,3991],[3993,4028],[4038,4038],[4141,4144],[4146,4151],[4153,4154],[4157,4158],[4184,4185],[4190,4192],[4209,4212],[4226,4226],[4229,4230],[4237,4237],[4253,4253],[4448,4607],[4957,4959],[5906,5908],[5938,5940],[5970,5971],[6002,6003],[6068,6069],[6071,6077],[6086,6086],[6089,6099],[6109,6109],[6155,6158],[6277,6278],[6313,6313],[6432,6434],[6439,6440],[6450,6450],[6457,6459],[6679,6680],[6683,6683],[6742,6742],[6744,6750],[6752,6752],[6754,6754],[6757,6764],[6771,6780],[6783,6783],[6832,6846],[6912,6915],[6964,6964],[6966,6970],[6972,6972],[6978,6978],[7019,7027],[7040,7041],[7074,7077],[7080,7081],[7083,7085],[7142,7142],[7144,7145],[7149,7149],[7151,7153],[7212,7219],[7222,7223],[7376,7378],[7380,7392],[7394,7400],[7405,7405],[7412,7412],[7416,7417],[7616,7673],[7675,7679],[8203,8207],[8234,8238],[8288,8292],[8294,8303],[8400,8432],[11503,11505],[11647,11647],[11744,11775],[12330,12333],[12441,12442],[42607,42610],[42612,42621],[42654,42655],[42736,42737],[43010,43010],[43014,43014],[43019,43019],[43045,43046],[43204,43205],[43232,43249],[43263,43263],[43302,43309],[43335,43345],[43392,43394],[43443,43443],[43446,43449],[43452,43453],[43493,43493],[43561,43566],[43569,43570],[43573,43574],[43587,43587],[43596,43596],[43644,43644],[43696,43696],[43698,43700],[43703,43704],[43710,43711],[43713,43713],[43756,43757],[43766,43766],[44005,44005],[44008,44008],[44013,44013],[64286,64286],[65024,65039],[65056,65071],[65279,65279],[65529,65531]],n=[[66045,66045],[66272,66272],[66422,66426],[68097,68099],[68101,68102],[68108,68111],[68152,68154],[68159,68159],[68325,68326],[68900,68903],[69446,69456],[69633,69633],[69688,69702],[69759,69761],[69811,69814],[69817,69818],[69821,69821],[69837,69837],[69888,69890],[69927,69931],[69933,69940],[70003,70003],[70016,70017],[70070,70078],[70089,70092],[70191,70193],[70196,70196],[70198,70199],[70206,70206],[70367,70367],[70371,70378],[70400,70401],[70459,70460],[70464,70464],[70502,70508],[70512,70516],[70712,70719],[70722,70724],[70726,70726],[70750,70750],[70835,70840],[70842,70842],[70847,70848],[70850,70851],[71090,71093],[71100,71101],[71103,71104],[71132,71133],[71219,71226],[71229,71229],[71231,71232],[71339,71339],[71341,71341],[71344,71349],[71351,71351],[71453,71455],[71458,71461],[71463,71467],[71727,71735],[71737,71738],[72148,72151],[72154,72155],[72160,72160],[72193,72202],[72243,72248],[72251,72254],[72263,72263],[72273,72278],[72281,72283],[72330,72342],[72344,72345],[72752,72758],[72760,72765],[72767,72767],[72850,72871],[72874,72880],[72882,72883],[72885,72886],[73009,73014],[73018,73018],[73020,73021],[73023,73029],[73031,73031],[73104,73105],[73109,73109],[73111,73111],[73459,73460],[78896,78904],[92912,92916],[92976,92982],[94031,94031],[94095,94098],[113821,113822],[113824,113827],[119143,119145],[119155,119170],[119173,119179],[119210,119213],[119362,119364],[121344,121398],[121403,121452],[121461,121461],[121476,121476],[121499,121503],[121505,121519],[122880,122886],[122888,122904],[122907,122913],[122915,122916],[122918,122922],[123184,123190],[123628,123631],[125136,125142],[125252,125258],[917505,917505],[917536,917631],[917760,917999]],o=[[4352,4447],[8986,8987],[9001,9002],[9193,9196],[9200,9200],[9203,9203],[9725,9726],[9748,9749],[9800,9811],[9855,9855],[9875,9875],[9889,9889],[9898,9899],[9917,9918],[9924,9925],[9934,9934],[9940,9940],[9962,9962],[9970,9971],[9973,9973],[9978,9978],[9981,9981],[9989,9989],[9994,9995],[10024,10024],[10060,10060],[10062,10062],[10067,10069],[10071,10071],[10133,10135],[10160,10160],[10175,10175],[11035,11036],[11088,11088],[11093,11093],[11904,11929],[11931,12019],[12032,12245],[12272,12283],[12288,12329],[12334,12350],[12353,12438],[12443,12543],[12549,12591],[12593,12686],[12688,12730],[12736,12771],[12784,12830],[12832,12871],[12880,19903],[19968,42124],[42128,42182],[43360,43388],[44032,55203],[63744,64255],[65040,65049],[65072,65106],[65108,65126],[65128,65131],[65281,65376],[65504,65510]],c=[[94176,94179],[94208,100343],[100352,101106],[110592,110878],[110928,110930],[110948,110951],[110960,111355],[126980,126980],[127183,127183],[127374,127374],[127377,127386],[127488,127490],[127504,127547],[127552,127560],[127568,127569],[127584,127589],[127744,127776],[127789,127797],[127799,127868],[127870,127891],[127904,127946],[127951,127955],[127968,127984],[127988,127988],[127992,128062],[128064,128064],[128066,128252],[128255,128317],[128331,128334],[128336,128359],[128378,128378],[128405,128406],[128420,128420],[128507,128591],[128640,128709],[128716,128716],[128720,128722],[128725,128725],[128747,128748],[128756,128762],[128992,129003],[129293,129393],[129395,129398],[129402,129442],[129445,129450],[129454,129482],[129485,129535],[129648,129651],[129656,129658],[129664,129666],[129680,129685],[131072,196605],[196608,262141]];let l;function d(e,t){let i,r=0,s=t.length-1;if(e<t[0][0]||e>t[s][1])return!1;for(;s>=r;)if(i=r+s>>1,e>t[i][1])r=i+1;else{if(!(e<t[i][0]))return!0;s=i-1}return!1}t.UnicodeV11=class{constructor(){if(this.version="11",!l){l=new Uint8Array(65536),l.fill(1),l[0]=0,l.fill(0,1,32),l.fill(0,127,160);for(let e=0;e<s.length;++e)l.fill(0,s[e][0],s[e][1]+1);for(let e=0;e<o.length;++e)l.fill(2,o[e][0],o[e][1]+1)}}wcwidth(e){return e<32?0:e<127?1:e<65536?l[e]:d(e,n)?0:d(e,c)?2:1}charProperties(e,t){let i=this.wcwidth(e),s=0===i&&0!==t;if(s){const e=r.UnicodeService.extractWidth(t);0===e?s=!1:e>i&&(i=e)}return r.UnicodeService.createPropertyValue(0,i,s)}}},345:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.runAndSubscribe=t.forwardEvent=t.EventEmitter=void 0,t.EventEmitter=class{constructor(){this._listeners=[],this._disposed=!1}get event(){return this._event||(this._event=e=>(this._listeners.push(e),{dispose:()=>{if(!this._disposed)for(let t=0;t<this._listeners.length;t++)if(this._listeners[t]===e)return void this._listeners.splice(t,1)}})),this._event}fire(e,t){const i=[];for(let e=0;e<this._listeners.length;e++)i.push(this._listeners[e]);for(let r=0;r<i.length;r++)i[r].call(void 0,e,t)}dispose(){this.clearListeners(),this._disposed=!0}clearListeners(){this._listeners&&(this._listeners.length=0)}},t.forwardEvent=function(e,t){return e((e=>t.fire(e)))},t.runAndSubscribe=function(e,t){return t(void 0),e((e=>t(e)))}},490:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.UnicodeV6=void 0;const r=i(938),s=[[768,879],[1155,1158],[1160,1161],[1425,1469],[1471,1471],[1473,1474],[1476,1477],[1479,1479],[1536,1539],[1552,1557],[1611,1630],[1648,1648],[1750,1764],[1767,1768],[1770,1773],[1807,1807],[1809,1809],[1840,1866],[1958,1968],[2027,2035],[2305,2306],[2364,2364],[2369,2376],[2381,2381],[2385,2388],[2402,2403],[2433,2433],[2492,2492],[2497,2500],[2509,2509],[2530,2531],[2561,2562],[2620,2620],[2625,2626],[2631,2632],[2635,2637],[2672,2673],[2689,2690],[2748,2748],[2753,2757],[2759,2760],[2765,2765],[2786,2787],[2817,2817],[2876,2876],[2879,2879],[2881,2883],[2893,2893],[2902,2902],[2946,2946],[3008,3008],[3021,3021],[3134,3136],[3142,3144],[3146,3149],[3157,3158],[3260,3260],[3263,3263],[3270,3270],[3276,3277],[3298,3299],[3393,3395],[3405,3405],[3530,3530],[3538,3540],[3542,3542],[3633,3633],[3636,3642],[3655,3662],[3761,3761],[3764,3769],[3771,3772],[3784,3789],[3864,3865],[3893,3893],[3895,3895],[3897,3897],[3953,3966],[3968,3972],[3974,3975],[3984,3991],[3993,4028],[4038,4038],[4141,4144],[4146,4146],[4150,4151],[4153,4153],[4184,4185],[4448,4607],[4959,4959],[5906,5908],[5938,5940],[5970,5971],[6002,6003],[6068,6069],[6071,6077],[6086,6086],[6089,6099],[6109,6109],[6155,6157],[6313,6313],[6432,6434],[6439,6440],[6450,6450],[6457,6459],[6679,6680],[6912,6915],[6964,6964],[6966,6970],[6972,6972],[6978,6978],[7019,7027],[7616,7626],[7678,7679],[8203,8207],[8234,8238],[8288,8291],[8298,8303],[8400,8431],[12330,12335],[12441,12442],[43014,43014],[43019,43019],[43045,43046],[64286,64286],[65024,65039],[65056,65059],[65279,65279],[65529,65531]],n=[[68097,68099],[68101,68102],[68108,68111],[68152,68154],[68159,68159],[119143,119145],[119155,119170],[119173,119179],[119210,119213],[119362,119364],[917505,917505],[917536,917631],[917760,917999]];let o;t.UnicodeV6=class{constructor(){if(this.version="6",!o){o=new Uint8Array(65536),o.fill(1),o[0]=0,o.fill(0,1,32),o.fill(0,127,160),o.fill(2,4352,4448),o[9001]=2,o[9002]=2,o.fill(2,11904,42192),o[12351]=1,o.fill(2,44032,55204),o.fill(2,63744,64256),o.fill(2,65040,65050),o.fill(2,65072,65136),o.fill(2,65280,65377),o.fill(2,65504,65511);for(let e=0;e<s.length;++e)o.fill(0,s[e][0],s[e][1]+1)}}wcwidth(e){return e<32?0:e<127?1:e<65536?o[e]:function(e,t){let i,r=0,s=t.length-1;if(e<t[0][0]||e>t[s][1])return!1;for(;s>=r;)if(i=r+s>>1,e>t[i][1])r=i+1;else{if(!(e<t[i][0]))return!0;s=i-1}return!1}(e,n)?0:e>=131072&&e<=196605||e>=196608&&e<=262141?2:1}charProperties(e,t){let i=this.wcwidth(e),s=0===i&&0!==t;if(s){const e=r.UnicodeService.extractWidth(t);0===e?s=!1:e>i&&(i=e)}return r.UnicodeService.createPropertyValue(0,i,s)}}},938:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.UnicodeService=void 0;const r=i(345),s=i(490);class n{static extractShouldJoin(e){return 0!=(1&e)}static extractWidth(e){return e>>1&3}static extractCharKind(e){return e>>3}static createPropertyValue(e,t,i=!1){return(16777215&e)<<3|(3&t)<<1|(i?1:0)}constructor(){this._providers=Object.create(null),this._active="",this._onChange=new r.EventEmitter,this.onChange=this._onChange.event;const e=new s.UnicodeV6;this.register(e),this._active=e.version,this._activeProvider=e}dispose(){this._onChange.dispose()}get versions(){return Object.keys(this._providers)}get activeVersion(){return this._active}set activeVersion(e){if(!this._providers[e])throw new Error(`unknown Unicode version "${e}"`);this._active=e,this._activeProvider=this._providers[e],this._onChange.fire(e)}register(e){this._providers[e.version]=e}wcwidth(e){return this._activeProvider.wcwidth(e)}getStringCellWidth(e){let t=0,i=0;const r=e.length;for(let s=0;s<r;++s){let o=e.charCodeAt(s);if(55296<=o&&o<=56319){if(++s>=r)return t+this.wcwidth(o);const i=e.charCodeAt(s);56320<=i&&i<=57343?o=1024*(o-55296)+i-56320+65536:t+=this.wcwidth(i)}const c=this.charProperties(o,i);let l=n.extractWidth(c);n.extractShouldJoin(c)&&(l-=n.extractWidth(i)),t+=l,i=c}return t}charProperties(e,t){return this._activeProvider.charProperties(e,t)}}t.UnicodeService=n}},t={};function i(r){var s=t[r];if(void 0!==s)return s.exports;var n=t[r]={exports:{}};return e[r](n,n.exports,i),n.exports}var r={};return(()=>{var e=r;Object.defineProperty(e,"__esModule",{value:!0}),e.Unicode11Addon=void 0;const t=i(433);e.Unicode11Addon=class{activate(e){e.unicode.register(new t.UnicodeV11)}dispose(){}}})(),r})()));
2
+ //# sourceMappingURL=addon-unicode11.js.map
@@ -9,6 +9,7 @@
9
9
  </style>
10
10
  <link rel="stylesheet" href="{{ static('css/xterm.css') }}"/>
11
11
  <script src="{{ static('js/xterm.js') }}"></script>
12
+ <script src="{{ static('js/xterm-addon-unicode11.js') }}"></script>
12
13
  <script src="{{ static('js/terminado.js') }}"></script>
13
14
  <script>
14
15
 
@@ -30,6 +31,7 @@ window.addEventListener(
30
31
  let connector_keys = event.data['connector_keys'] ? event.data['connector_keys'] : [];
31
32
  let metric_keys = event.data['metric_keys'] ? event.data['metric_keys'] : [];
32
33
  let location_keys = event.data['location_keys'] ? event.data['location_keys'] : [];
34
+ let tags = event.data['tags'] ? event.data['tags'] : [];
33
35
  let connector_keys_str = " -c";
34
36
  for (let ck of connector_keys){
35
37
  if (typeof ck === "string"){
@@ -62,6 +64,16 @@ window.addEventListener(
62
64
  if (location_keys_str === " -l"){
63
65
  location_keys_str = "";
64
66
  }
67
+ let tags_str = " -t";
68
+ for (tag of tags){
69
+ if (typeof tag === "string"){
70
+ quote_str = tag.includes(" ") ? "'" : "";
71
+ tags_str += " " + quote_str + tag + quote_str;
72
+ }
73
+ }
74
+ if (tags_str === " -t"){
75
+ tags_str = "";
76
+ }
65
77
 
66
78
  let instance = event.data['instance'] ? event.data['instance'] : '';
67
79
  let flags_str = "";
@@ -105,6 +117,7 @@ window.addEventListener(
105
117
  + connector_keys_str
106
118
  + metric_keys_str
107
119
  + location_keys_str
120
+ + tags_str
108
121
  + flags_str
109
122
  + '\r'
110
123
  );
@@ -15,6 +15,7 @@ import meerschaum.api.routes._misc
15
15
  import meerschaum.api.routes._pipes
16
16
  import meerschaum.api.routes._plugins
17
17
  import meerschaum.api.routes._users
18
+ import meerschaum.api.routes._tokens
18
19
  import meerschaum.api.routes._version
19
20
 
20
21
  from meerschaum.api import _include_dash
@@ -18,6 +18,7 @@ from meerschaum.api import (
18
18
  manager,
19
19
  private,
20
20
  no_auth,
21
+ ScopedAuth,
21
22
  )
22
23
  from meerschaum.actions import actions
23
24
  from meerschaum.core.User import is_user_allowed_to_execute
@@ -28,7 +29,7 @@ actions_endpoint = endpoints['actions']
28
29
  @app.get(actions_endpoint, tags=['Actions'])
29
30
  def get_actions(
30
31
  curr_user = (
31
- fastapi.Depends(manager) if private else None
32
+ fastapi.Depends(ScopedAuth(['actions:execute'])) if private else None
32
33
  ),
33
34
  ) -> List[str]:
34
35
  """
@@ -41,9 +42,7 @@ def get_actions(
41
42
  def do_action_legacy(
42
43
  action: str,
43
44
  keywords: Dict[str, Any] = fastapi.Body(...),
44
- curr_user = (
45
- fastapi.Depends(manager) if not no_auth else None
46
- ),
45
+ curr_user = fastapi.Depends(ScopedAuth(['actions:execute'])),
47
46
  ) -> SuccessTuple:
48
47
  """
49
48
  Perform a Meerschaum action (if permissions allow).
@@ -10,7 +10,7 @@ import fastapi
10
10
  from fastapi import HTTPException
11
11
 
12
12
  import meerschaum as mrsm
13
- from meerschaum.api import app, endpoints, no_auth, manager
13
+ from meerschaum.api import app, endpoints, ScopedAuth
14
14
  from meerschaum.utils.typing import Optional, Dict, List, Union
15
15
 
16
16
  endpoint = endpoints['connectors']
@@ -19,9 +19,7 @@ endpoint = endpoints['connectors']
19
19
  @app.get(endpoint, tags=['Connectors'])
20
20
  def get_connectors(
21
21
  type: Optional[str] = None,
22
- curr_user = (
23
- fastapi.Depends(manager) if not no_auth else None
24
- ),
22
+ curr_user=fastapi.Depends(ScopedAuth(['connectors:read'])),
25
23
  ) -> Union[Dict[str, List[str]], List[str]]:
26
24
  """
27
25
  Return the keys of the registered connectors.
@@ -54,9 +52,7 @@ def get_connectors(
54
52
  @app.get(endpoint + "/{type}", tags=['Connectors'])
55
53
  def get_connectors_by_type(
56
54
  type: str,
57
- curr_user = (
58
- fastapi.Depends(manager) if not no_auth else None
59
- ),
55
+ curr_user=fastapi.Depends(ScopedAuth(['connectors:read']))
60
56
  ):
61
57
  """
62
58
  Convenience method for `get_connectors()`.
@@ -28,11 +28,12 @@ from meerschaum.api import (
28
28
  fastapi,
29
29
  app,
30
30
  endpoints,
31
- manager,
31
+ ScopedAuth,
32
32
  no_auth,
33
+ manager,
33
34
  debug,
34
35
  )
35
- from meerschaum.config.static import STATIC_CONFIG
36
+ from meerschaum._internal.static import STATIC_CONFIG
36
37
  from meerschaum.core.User import is_user_allowed_to_execute
37
38
 
38
39
 
@@ -53,9 +54,7 @@ def _get_job(name: str, sysargs: Union[str, List[str], None] = None):
53
54
 
54
55
  @app.get(endpoints['jobs'], tags=['Jobs'])
55
56
  def get_jobs(
56
- curr_user=(
57
- fastapi.Depends(manager) if not no_auth else None
58
- ),
57
+ curr_user=fastapi.Security(ScopedAuth(['jobs:read'])),
59
58
  ) -> Dict[str, Dict[str, Any]]:
60
59
  """
61
60
  Return metadata about the current jobs.
@@ -84,9 +83,7 @@ def get_jobs(
84
83
  @app.get(endpoints['jobs'] + '/{name}', tags=['Jobs'])
85
84
  def get_job(
86
85
  name: str,
87
- curr_user=(
88
- fastapi.Depends(manager) if not no_auth else None
89
- ),
86
+ curr_user=fastapi.Security(ScopedAuth(['jobs:read'])),
90
87
  ) -> Dict[str, Any]:
91
88
  """
92
89
  Return metadata for a single job.
@@ -137,9 +134,7 @@ def clean_sysargs(sysargs: List[str]) -> List[str]:
137
134
  def create_job(
138
135
  name: str,
139
136
  metadata: Union[List[str], Dict[str, Any]],
140
- curr_user=(
141
- fastapi.Depends(manager) if not no_auth else None
142
- ),
137
+ curr_user=fastapi.Security(ScopedAuth(['jobs:execute', 'jobs:write'])),
143
138
  ) -> SuccessTuple:
144
139
  """
145
140
  Create and start a new job.
@@ -172,9 +167,7 @@ def create_job(
172
167
  @app.delete(endpoints['jobs'] + '/{name}', tags=['Jobs'])
173
168
  def delete_job(
174
169
  name: str,
175
- curr_user=(
176
- fastapi.Depends(manager) if not no_auth else None
177
- ),
170
+ curr_user=fastapi.Security(ScopedAuth(['jobs:delete'])),
178
171
  ) -> SuccessTuple:
179
172
  """
180
173
  Delete a job.
@@ -189,9 +182,7 @@ def delete_job(
189
182
  @app.get(endpoints['jobs'] + '/{name}/exists', tags=['Jobs'])
190
183
  def get_job_exists(
191
184
  name: str,
192
- curr_user=(
193
- fastapi.Depends(manager) if not no_auth else None
194
- ),
185
+ curr_user=fastapi.Security(ScopedAuth(['jobs:read'])),
195
186
  ) -> bool:
196
187
  """
197
188
  Return whether a job exists.
@@ -203,9 +194,7 @@ def get_job_exists(
203
194
  @app.get(endpoints['logs'] + '/{name}', tags=['Jobs'])
204
195
  def get_logs(
205
196
  name: str,
206
- curr_user=(
207
- fastapi.Depends(manager) if not no_auth else None
208
- ),
197
+ curr_user=fastapi.Security(ScopedAuth(['jobs:read', 'logs:read'])),
209
198
  ) -> Union[str, None]:
210
199
  """
211
200
  Return a job's log text.
@@ -224,9 +213,7 @@ def get_logs(
224
213
  @app.post(endpoints['jobs'] + '/{name}/start', tags=['Jobs'])
225
214
  def start_job(
226
215
  name: str,
227
- curr_user=(
228
- fastapi.Depends(manager) if not no_auth else None
229
- ),
216
+ curr_user=fastapi.Security(ScopedAuth(['jobs:execute'])),
230
217
  ) -> SuccessTuple:
231
218
  """
232
219
  Start a job if stopped.
@@ -247,9 +234,7 @@ def start_job(
247
234
  @app.post(endpoints['jobs'] + '/{name}/stop', tags=['Jobs'])
248
235
  def stop_job(
249
236
  name: str,
250
- curr_user=(
251
- fastapi.Depends(manager) if not no_auth else None
252
- ),
237
+ curr_user=fastapi.Security(ScopedAuth(['jobs:execute', 'josb:stop'])),
253
238
  ) -> SuccessTuple:
254
239
  """
255
240
  Stop a job if running.
@@ -270,9 +255,7 @@ def stop_job(
270
255
  @app.post(endpoints['jobs'] + '/{name}/pause', tags=['Jobs'])
271
256
  def pause_job(
272
257
  name: str,
273
- curr_user=(
274
- fastapi.Depends(manager) if not no_auth else None
275
- ),
258
+ curr_user=fastapi.Security(ScopedAuth(['jobs:execute', 'jobs:pause'])),
276
259
  ) -> SuccessTuple:
277
260
  """
278
261
  Pause a job if running.
@@ -293,9 +276,7 @@ def pause_job(
293
276
  @app.get(endpoints['jobs'] + '/{name}/stop_time', tags=['Jobs'])
294
277
  def get_stop_time(
295
278
  name: str,
296
- curr_user=(
297
- fastapi.Depends(manager) if not no_auth else None
298
- ),
279
+ curr_user=fastapi.Security(ScopedAuth(['jobs:read'])),
299
280
  ) -> Union[datetime, None]:
300
281
  """
301
282
  Get the timestamp when the job was manually stopped.
@@ -307,9 +288,7 @@ def get_stop_time(
307
288
  @app.get(endpoints['jobs'] + '/{name}/is_blocking_on_stdin', tags=['Jobs'])
308
289
  def get_is_blocking_on_stdin(
309
290
  name: str,
310
- curr_user=(
311
- fastapi.Depends(manager) if not no_auth else None
312
- ),
291
+ curr_user=fastapi.Security(ScopedAuth(['jobs:read'])),
313
292
  ) -> bool:
314
293
  """
315
294
  Return whether a job is blocking on stdin.
@@ -318,6 +297,18 @@ def get_is_blocking_on_stdin(
318
297
  return job.is_blocking_on_stdin()
319
298
 
320
299
 
300
+ @app.get(endpoints['jobs'] + '{name}/prompt_kwargs', tags=['Jobs'])
301
+ def get_prompt_kwargs(
302
+ name: str,
303
+ curr_user=fastapi.Security(ScopedAuth(['jobs:read'])),
304
+ ) -> Dict[str, Any]:
305
+ """
306
+ Return the kwargs for the blocking `prompt`, if available.
307
+ """
308
+ job = _get_job(name)
309
+ return job.get_prompt_kwargs()
310
+
311
+
321
312
  _job_clients = defaultdict(lambda: [])
322
313
  _job_stop_events = defaultdict(lambda: asyncio.Event())
323
314
  _job_queues = defaultdict(lambda: asyncio.Queue())