jettask 0.2.14__py3-none-any.whl → 0.2.16__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 (148) hide show
  1. jettask/__init__.py +14 -35
  2. jettask/{webui/__main__.py → __main__.py} +4 -4
  3. jettask/api/__init__.py +103 -0
  4. jettask/api/v1/__init__.py +29 -0
  5. jettask/api/v1/alerts.py +226 -0
  6. jettask/api/v1/analytics.py +323 -0
  7. jettask/api/v1/namespaces.py +134 -0
  8. jettask/api/v1/overview.py +136 -0
  9. jettask/api/v1/queues.py +530 -0
  10. jettask/api/v1/scheduled.py +420 -0
  11. jettask/api/v1/settings.py +44 -0
  12. jettask/{webui/api.py → api.py} +4 -46
  13. jettask/{webui/backend → backend}/main.py +21 -109
  14. jettask/{webui/backend → backend}/main_unified.py +1 -1
  15. jettask/{webui/backend → backend}/namespace_api_old.py +3 -30
  16. jettask/{webui/backend → backend}/namespace_data_access.py +2 -1
  17. jettask/{webui/backend → backend}/unified_api_router.py +14 -74
  18. jettask/{core/cli.py → cli.py} +106 -26
  19. jettask/config/nacos_config.py +386 -0
  20. jettask/core/app.py +8 -100
  21. jettask/core/db_manager.py +515 -0
  22. jettask/core/event_pool.py +5 -2
  23. jettask/core/unified_manager_base.py +47 -14
  24. jettask/{webui/db_init.py → db_init.py} +1 -1
  25. jettask/executors/asyncio.py +2 -2
  26. jettask/{webui/integrated_gradio_app.py → integrated_gradio_app.py} +1 -1
  27. jettask/{webui/multi_namespace_consumer.py → multi_namespace_consumer.py} +5 -2
  28. jettask/{webui/pg_consumer.py → pg_consumer.py} +137 -69
  29. jettask/{webui/run.py → run.py} +1 -1
  30. jettask/{webui/run_webui.py → run_webui.py} +4 -4
  31. jettask/scheduler/multi_namespace_scheduler.py +2 -2
  32. jettask/scheduler/unified_manager.py +5 -5
  33. jettask/scheduler/unified_scheduler_manager.py +1 -1
  34. jettask/schemas/__init__.py +166 -0
  35. jettask/schemas/alert.py +99 -0
  36. jettask/schemas/backlog.py +122 -0
  37. jettask/schemas/common.py +139 -0
  38. jettask/schemas/monitoring.py +181 -0
  39. jettask/schemas/namespace.py +168 -0
  40. jettask/schemas/queue.py +83 -0
  41. jettask/schemas/scheduled_task.py +128 -0
  42. jettask/schemas/task.py +70 -0
  43. jettask/services/__init__.py +24 -0
  44. jettask/services/alert_service.py +454 -0
  45. jettask/services/analytics_service.py +46 -0
  46. jettask/services/overview_service.py +978 -0
  47. jettask/services/queue_service.py +711 -0
  48. jettask/services/redis_monitor_service.py +151 -0
  49. jettask/services/scheduled_task_service.py +207 -0
  50. jettask/services/settings_service.py +758 -0
  51. jettask/services/task_service.py +157 -0
  52. jettask/{webui/task_center.py → task_center.py} +30 -8
  53. jettask/{webui/task_center_client.py → task_center_client.py} +1 -1
  54. jettask/{webui/config.py → webui_config.py} +6 -1
  55. jettask/webui_exceptions.py +67 -0
  56. jettask/webui_sql/verify_database.sql +72 -0
  57. {jettask-0.2.14.dist-info → jettask-0.2.16.dist-info}/METADATA +3 -1
  58. jettask-0.2.16.dist-info/RECORD +150 -0
  59. {jettask-0.2.14.dist-info → jettask-0.2.16.dist-info}/entry_points.txt +1 -1
  60. jettask/webui/backend/data_api.py +0 -3294
  61. jettask/webui/backend/namespace_api.py +0 -295
  62. jettask/webui/backend/queue_backlog_api.py +0 -727
  63. jettask/webui/backend/redis_monitor_api.py +0 -476
  64. jettask/webui/frontend/index.html +0 -13
  65. jettask/webui/frontend/package.json +0 -30
  66. jettask/webui/frontend/src/App.css +0 -109
  67. jettask/webui/frontend/src/App.jsx +0 -66
  68. jettask/webui/frontend/src/components/NamespaceSelector.jsx +0 -166
  69. jettask/webui/frontend/src/components/QueueBacklogChart.jsx +0 -298
  70. jettask/webui/frontend/src/components/QueueBacklogTrend.jsx +0 -638
  71. jettask/webui/frontend/src/components/QueueDetailsTable.css +0 -65
  72. jettask/webui/frontend/src/components/QueueDetailsTable.jsx +0 -487
  73. jettask/webui/frontend/src/components/QueueDetailsTableV2.jsx +0 -465
  74. jettask/webui/frontend/src/components/ScheduledTaskFilter.jsx +0 -423
  75. jettask/webui/frontend/src/components/TaskFilter.jsx +0 -425
  76. jettask/webui/frontend/src/components/TimeRangeSelector.css +0 -21
  77. jettask/webui/frontend/src/components/TimeRangeSelector.jsx +0 -160
  78. jettask/webui/frontend/src/components/charts/QueueChart.jsx +0 -111
  79. jettask/webui/frontend/src/components/charts/QueueTrendChart.jsx +0 -115
  80. jettask/webui/frontend/src/components/charts/WorkerChart.jsx +0 -40
  81. jettask/webui/frontend/src/components/common/StatsCard.jsx +0 -18
  82. jettask/webui/frontend/src/components/layout/AppLayout.css +0 -95
  83. jettask/webui/frontend/src/components/layout/AppLayout.jsx +0 -49
  84. jettask/webui/frontend/src/components/layout/Header.css +0 -106
  85. jettask/webui/frontend/src/components/layout/Header.jsx +0 -106
  86. jettask/webui/frontend/src/components/layout/SideMenu.css +0 -137
  87. jettask/webui/frontend/src/components/layout/SideMenu.jsx +0 -209
  88. jettask/webui/frontend/src/components/layout/TabsNav.css +0 -244
  89. jettask/webui/frontend/src/components/layout/TabsNav.jsx +0 -206
  90. jettask/webui/frontend/src/components/layout/UserInfo.css +0 -197
  91. jettask/webui/frontend/src/components/layout/UserInfo.jsx +0 -197
  92. jettask/webui/frontend/src/contexts/LoadingContext.jsx +0 -27
  93. jettask/webui/frontend/src/contexts/NamespaceContext.jsx +0 -72
  94. jettask/webui/frontend/src/contexts/TabsContext.backup.jsx +0 -245
  95. jettask/webui/frontend/src/index.css +0 -114
  96. jettask/webui/frontend/src/main.jsx +0 -22
  97. jettask/webui/frontend/src/pages/Alerts.jsx +0 -684
  98. jettask/webui/frontend/src/pages/Dashboard/index.css +0 -35
  99. jettask/webui/frontend/src/pages/Dashboard/index.jsx +0 -281
  100. jettask/webui/frontend/src/pages/Dashboard.jsx +0 -1330
  101. jettask/webui/frontend/src/pages/QueueDetail.jsx +0 -1117
  102. jettask/webui/frontend/src/pages/QueueMonitor.jsx +0 -527
  103. jettask/webui/frontend/src/pages/Queues.jsx +0 -12
  104. jettask/webui/frontend/src/pages/ScheduledTasks.jsx +0 -810
  105. jettask/webui/frontend/src/pages/Settings.jsx +0 -801
  106. jettask/webui/frontend/src/pages/Workers.jsx +0 -12
  107. jettask/webui/frontend/src/services/api.js +0 -159
  108. jettask/webui/frontend/src/services/queueTrend.js +0 -166
  109. jettask/webui/frontend/src/utils/suppressWarnings.js +0 -22
  110. jettask/webui/frontend/src/utils/userPreferences.js +0 -154
  111. jettask/webui/frontend/vite.config.js +0 -26
  112. jettask/webui/sql/init_database.sql +0 -640
  113. jettask-0.2.14.dist-info/RECORD +0 -172
  114. /jettask/{webui/backend → backend}/__init__.py +0 -0
  115. /jettask/{webui/backend → backend}/api/__init__.py +0 -0
  116. /jettask/{webui/backend → backend}/api/v1/__init__.py +0 -0
  117. /jettask/{webui/backend → backend}/api/v1/monitoring.py +0 -0
  118. /jettask/{webui/backend → backend}/api/v1/namespaces.py +0 -0
  119. /jettask/{webui/backend → backend}/api/v1/queues.py +0 -0
  120. /jettask/{webui/backend → backend}/api/v1/tasks.py +0 -0
  121. /jettask/{webui/backend → backend}/config.py +0 -0
  122. /jettask/{webui/backend → backend}/core/__init__.py +0 -0
  123. /jettask/{webui/backend → backend}/core/cache.py +0 -0
  124. /jettask/{webui/backend → backend}/core/database.py +0 -0
  125. /jettask/{webui/backend → backend}/core/exceptions.py +0 -0
  126. /jettask/{webui/backend → backend}/data_access.py +0 -0
  127. /jettask/{webui/backend → backend}/dependencies.py +0 -0
  128. /jettask/{webui/backend → backend}/init_meta_db.py +0 -0
  129. /jettask/{webui/backend → backend}/main_v2.py +0 -0
  130. /jettask/{webui/backend → backend}/models/__init__.py +0 -0
  131. /jettask/{webui/backend → backend}/models/requests.py +0 -0
  132. /jettask/{webui/backend → backend}/models/responses.py +0 -0
  133. /jettask/{webui/backend → backend}/queue_stats_v2.py +0 -0
  134. /jettask/{webui/backend → backend}/services/__init__.py +0 -0
  135. /jettask/{webui/backend → backend}/start.py +0 -0
  136. /jettask/{webui/cleanup_deprecated_tables.sql → cleanup_deprecated_tables.sql} +0 -0
  137. /jettask/{webui/gradio_app.py → gradio_app.py} +0 -0
  138. /jettask/{webui/__init__.py → main.py} +0 -0
  139. /jettask/{webui/models.py → models.py} +0 -0
  140. /jettask/{webui/run_monitor.py → run_monitor.py} +0 -0
  141. /jettask/{webui/schema.sql → schema.sql} +0 -0
  142. /jettask/{webui/unified_consumer_manager.py → unified_consumer_manager.py} +0 -0
  143. /jettask/{webui/models → webui_models}/__init__.py +0 -0
  144. /jettask/{webui/models → webui_models}/namespace.py +0 -0
  145. /jettask/{webui/sql → webui_sql}/batch_upsert_functions.sql +0 -0
  146. {jettask-0.2.14.dist-info → jettask-0.2.16.dist-info}/WHEEL +0 -0
  147. {jettask-0.2.14.dist-info → jettask-0.2.16.dist-info}/licenses/LICENSE +0 -0
  148. {jettask-0.2.14.dist-info → jettask-0.2.16.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,157 @@
1
+ """
2
+ 任务服务层
3
+ 处理任务相关的业务逻辑
4
+ """
5
+ from typing import Optional, List, Dict, Any
6
+ from datetime import datetime, timedelta, timezone
7
+ import logging
8
+
9
+ logger = logging.getLogger(__name__)
10
+
11
+
12
+ class TaskService:
13
+ """任务服务类"""
14
+
15
+ def __init__(self, data_access):
16
+ """
17
+ 初始化任务服务
18
+
19
+ Args:
20
+ data_access: 数据访问层实例
21
+ """
22
+ self.data_access = data_access
23
+
24
+ async def get_tasks_with_filters(
25
+ self,
26
+ queue_name: str,
27
+ page: int = 1,
28
+ page_size: int = 20,
29
+ filters: Optional[List[Dict]] = None,
30
+ time_range: Optional[str] = None,
31
+ start_time: Optional[datetime] = None,
32
+ end_time: Optional[datetime] = None
33
+ ) -> Dict[str, Any]:
34
+ """
35
+ 获取任务列表(支持灵活筛选和时间范围)
36
+
37
+ Args:
38
+ queue_name: 队列名称
39
+ page: 页码
40
+ page_size: 每页大小
41
+ filters: 筛选条件
42
+ time_range: 时间范围字符串
43
+ start_time: 开始时间
44
+ end_time: 结束时间
45
+
46
+ Returns:
47
+ 任务列表结果
48
+ """
49
+ # 处理时间范围
50
+ if not start_time or not end_time:
51
+ if time_range:
52
+ start_time, end_time = await self._calculate_time_range(
53
+ time_range, queue_name
54
+ )
55
+
56
+ # 转换时间格式
57
+ if start_time and isinstance(start_time, str):
58
+ start_time = datetime.fromisoformat(start_time.replace('Z', '+00:00'))
59
+ if end_time and isinstance(end_time, str):
60
+ end_time = datetime.fromisoformat(end_time.replace('Z', '+00:00'))
61
+
62
+ logger.info(
63
+ f"获取队列 {queue_name} 的任务列表, "
64
+ f"页码: {page}, 每页: {page_size}, "
65
+ f"筛选条件: {filters}, "
66
+ f"时间范围: {start_time} - {end_time}"
67
+ )
68
+
69
+ # 调用数据访问层
70
+ return await self.data_access.fetch_tasks_with_filters(
71
+ queue_name=queue_name,
72
+ page=page,
73
+ page_size=page_size,
74
+ filters=filters or [],
75
+ start_time=start_time,
76
+ end_time=end_time
77
+ )
78
+
79
+ async def get_task_details(
80
+ self,
81
+ task_id: str,
82
+ consumer_group: Optional[str] = None
83
+ ) -> Dict[str, Any]:
84
+ """
85
+ 获取任务详细信息
86
+
87
+ Args:
88
+ task_id: 任务ID
89
+ consumer_group: 消费者组名称(可选)
90
+
91
+ Returns:
92
+ 任务详细信息
93
+
94
+ Raises:
95
+ ValueError: 当任务不存在时
96
+ """
97
+ logger.info(
98
+ f"获取任务 {task_id} 的详细数据, "
99
+ f"consumer_group={consumer_group}"
100
+ )
101
+
102
+ task_details = await self.data_access.fetch_task_details(
103
+ task_id, consumer_group
104
+ )
105
+
106
+ if not task_details:
107
+ raise ValueError(f"Task {task_id} not found")
108
+
109
+ return task_details
110
+
111
+ async def _calculate_time_range(
112
+ self,
113
+ time_range: str,
114
+ queue_name: str
115
+ ) -> tuple[datetime, datetime]:
116
+ """
117
+ 计算时间范围
118
+
119
+ Args:
120
+ time_range: 时间范围字符串 (如 "15m", "1h", "7d")
121
+ queue_name: 队列名称
122
+
123
+ Returns:
124
+ (开始时间, 结束时间) 元组
125
+ """
126
+ now = datetime.now(timezone.utc)
127
+
128
+ time_range_map = {
129
+ "15m": timedelta(minutes=15),
130
+ "30m": timedelta(minutes=30),
131
+ "1h": timedelta(hours=1),
132
+ "3h": timedelta(hours=3),
133
+ "6h": timedelta(hours=6),
134
+ "12h": timedelta(hours=12),
135
+ "24h": timedelta(hours=24),
136
+ "7d": timedelta(days=7),
137
+ "30d": timedelta(days=30),
138
+ }
139
+
140
+ delta = time_range_map.get(time_range, timedelta(minutes=15))
141
+
142
+ # 获取队列的最新任务时间
143
+ latest_time = await self.data_access.get_latest_task_time(queue_name)
144
+ if latest_time:
145
+ # 使用最新任务时间作为结束时间
146
+ end_time = latest_time.replace(second=59, microsecond=999999)
147
+ logger.info(f"使用最新任务时间: {latest_time}")
148
+ else:
149
+ # 如果没有任务,使用当前时间
150
+ end_time = now.replace(second=0, microsecond=0)
151
+
152
+ start_time = end_time - delta
153
+ logger.info(
154
+ f"使用时间范围 {time_range}: {start_time} 到 {end_time}"
155
+ )
156
+
157
+ return start_time, end_time
@@ -17,7 +17,7 @@ class TaskCenter:
17
17
  初始化任务中心客户端
18
18
 
19
19
  Args:
20
- namespace_url: 命名空间的URL,如 http://localhost:8001/api/namespaces/{name}
20
+ namespace_url: 命名空间的URL,如 http://localhost:8001/api/v1/namespaces/{name}
21
21
  """
22
22
  self.namespace_url = namespace_url
23
23
  self._session: Optional[aiohttp.ClientSession] = None
@@ -33,8 +33,8 @@ class TaskCenter:
33
33
  """解析URL获取命名空间名称"""
34
34
  if url.startswith("http://") or url.startswith("https://"):
35
35
  import re
36
- # 匹配格式: /api/namespaces/{name}
37
- match = re.search(r'/namespaces/([^/]+)$', url)
36
+ # 匹配格式: /api/v1/namespaces/{name}
37
+ match = re.search(r'/api/v1/namespaces/([^/]+)$', url)
38
38
  if match:
39
39
  self._namespace_name = match.group(1)
40
40
  elif url.startswith("taskcenter://"):
@@ -43,7 +43,7 @@ class TaskCenter:
43
43
  if len(parts) >= 2 and parts[0] == "namespace":
44
44
  self._namespace_name = parts[1]
45
45
  base_url = os.getenv("TASK_CENTER_BASE_URL", "http://localhost:8001")
46
- self.namespace_url = f"{base_url}/api/namespaces/{self._namespace_name}"
46
+ self.namespace_url = f"{base_url}/api/v1/namespaces/{self._namespace_name}"
47
47
 
48
48
  @property
49
49
  def is_enabled(self) -> bool:
@@ -111,9 +111,20 @@ class TaskCenter:
111
111
  if response.status_code == 200:
112
112
  data = response.json()
113
113
  self._namespace_name = data.get('name')
114
+
115
+ # 构建redis_config
116
+ redis_config = None
117
+ if data.get('redis_url'):
118
+ redis_config = {'url': data['redis_url']}
119
+
120
+ # 构建pg_config
121
+ pg_config = None
122
+ if data.get('pg_url'):
123
+ pg_config = {'url': data['pg_url']}
124
+
114
125
  self._config = {
115
- 'redis_config': data.get('redis_config'),
116
- 'pg_config': data.get('pg_config'),
126
+ 'redis_config': redis_config,
127
+ 'pg_config': pg_config,
117
128
  'namespace_name': data.get('name'),
118
129
  'version': data.get('version', 1)
119
130
  }
@@ -142,9 +153,20 @@ class TaskCenter:
142
153
  if resp.status == 200:
143
154
  data = await resp.json()
144
155
  self._namespace_name = data.get('name')
156
+
157
+ # 构建redis_config
158
+ redis_config = None
159
+ if data.get('redis_url'):
160
+ redis_config = {'url': data['redis_url']}
161
+
162
+ # 构建pg_config
163
+ pg_config = None
164
+ if data.get('pg_url'):
165
+ pg_config = {'url': data['pg_url']}
166
+
145
167
  self._config = {
146
- 'redis_config': data.get('redis_config'),
147
- 'pg_config': data.get('pg_config'),
168
+ 'redis_config': redis_config,
169
+ 'pg_config': pg_config,
148
170
  'namespace_name': data.get('name'),
149
171
  'version': data.get('version', 1)
150
172
  }
@@ -47,7 +47,7 @@ class TaskCenterClient:
47
47
  # 旧格式使用的是ID,转换为按名称查找
48
48
  self._namespace_name = parts[1] # 假设传入的也是名称
49
49
  base_url = os.getenv("TASK_CENTER_BASE_URL", "http://localhost:8001")
50
- self._config_url = f"{base_url}/api/namespaces/{self._namespace_name}"
50
+ self._config_url = f"{base_url}/api/v1/namespaces/{self._namespace_name}"
51
51
 
52
52
  @property
53
53
  def is_enabled(self) -> bool:
@@ -30,13 +30,18 @@ class PostgreSQLConfig:
30
30
  """
31
31
  from urllib.parse import urlparse
32
32
 
33
+ # 清理URL前缀(支持postgresql+asyncpg://)
34
+ if url.startswith('postgresql+asyncpg://'):
35
+ url = url.replace('postgresql+asyncpg://', 'postgresql://')
36
+
33
37
  parsed = urlparse(url)
38
+
34
39
  return cls(
35
40
  host=parsed.hostname or "localhost",
36
41
  port=parsed.port or 5432,
37
42
  database=parsed.path.lstrip("/") if parsed.path else "jettask",
38
43
  user=parsed.username or "jettask",
39
- password=parsed.password or "123456"
44
+ password=parsed.password or "" # 如果没有密码返回空字符串
40
45
  )
41
46
 
42
47
  @property
@@ -0,0 +1,67 @@
1
+ """
2
+ JetTask 异常定义
3
+ """
4
+ import sys
5
+ import traceback as tb
6
+
7
+
8
+ class JetTaskException(Exception):
9
+ """JetTask 基础异常类"""
10
+ pass
11
+
12
+
13
+ class TaskTimeoutError(JetTaskException):
14
+ """任务等待超时异常"""
15
+ pass
16
+
17
+
18
+ class TaskExecutionError(JetTaskException):
19
+ """任务执行错误异常
20
+
21
+ 这个异常会直接打印错误信息并退出,避免显示框架层堆栈
22
+ """
23
+ def __init__(self, task_id, error_traceback):
24
+ self.task_id = task_id
25
+ self.error_traceback = error_traceback
26
+ # 存储简单的消息用于日志等场景
27
+ super().__init__(f"Task {task_id} failed")
28
+
29
+ def print_and_exit(self, exit_code=1):
30
+ """打印错误信息并退出程序"""
31
+ print(f"\n任务执行失败 (Task ID: {self.task_id}):", file=sys.stderr)
32
+ print("-" * 60, file=sys.stderr)
33
+ if self.error_traceback and self.error_traceback != "Task execution failed":
34
+ print(self.error_traceback, file=sys.stderr)
35
+ else:
36
+ print("Task execution failed (no detailed error information available)", file=sys.stderr)
37
+ print("-" * 60, file=sys.stderr)
38
+ sys.exit(exit_code)
39
+
40
+ def __str__(self):
41
+ """返回异常消息"""
42
+ return f"Task {self.task_id} failed:\n{self.error_traceback}"
43
+
44
+
45
+ class TaskNotFoundError(JetTaskException):
46
+ """任务未找到异常"""
47
+ pass
48
+
49
+
50
+ class RetryableError(JetTaskException):
51
+ """
52
+ 可重试的错误
53
+
54
+ 使用这个异常可以指定建议的重试延迟时间
55
+
56
+ Example:
57
+ raise RetryableError("Service temporarily unavailable", retry_after=30)
58
+ """
59
+
60
+ def __init__(self, message: str, retry_after: float = None):
61
+ """
62
+ Args:
63
+ message: 错误消息
64
+ retry_after: 建议的重试延迟时间(秒),如果不指定则使用默认的重试策略
65
+ """
66
+ super().__init__(message)
67
+ self.retry_after = retry_after
@@ -0,0 +1,72 @@
1
+ -- JetTask 数据库结构验证脚本
2
+ -- 用于验证数据库表结构是否正确
3
+
4
+ -- 检查所有表是否存在
5
+ SELECT
6
+ 'namespaces' as table_name,
7
+ EXISTS(SELECT 1 FROM information_schema.tables WHERE table_name = 'namespaces') as exists
8
+ UNION ALL
9
+ SELECT
10
+ 'scheduled_tasks' as table_name,
11
+ EXISTS(SELECT 1 FROM information_schema.tables WHERE table_name = 'scheduled_tasks') as exists
12
+ UNION ALL
13
+ SELECT
14
+ 'tasks' as table_name,
15
+ EXISTS(SELECT 1 FROM information_schema.tables WHERE table_name = 'tasks') as exists
16
+ UNION ALL
17
+ SELECT
18
+ 'task_runs' as table_name,
19
+ EXISTS(SELECT 1 FROM information_schema.tables WHERE table_name = 'task_runs') as exists
20
+ UNION ALL
21
+ SELECT
22
+ 'stream_backlog_monitor' as table_name,
23
+ EXISTS(SELECT 1 FROM information_schema.tables WHERE table_name = 'stream_backlog_monitor') as exists
24
+ UNION ALL
25
+ SELECT
26
+ 'alert_rules' as table_name,
27
+ EXISTS(SELECT 1 FROM information_schema.tables WHERE table_name = 'alert_rules') as exists
28
+ UNION ALL
29
+ SELECT
30
+ 'alert_history' as table_name,
31
+ EXISTS(SELECT 1 FROM information_schema.tables WHERE table_name = 'alert_history') as exists;
32
+
33
+ -- 检查 namespaces 表的关键列
34
+ SELECT
35
+ column_name,
36
+ data_type,
37
+ is_nullable,
38
+ column_default
39
+ FROM information_schema.columns
40
+ WHERE table_name = 'namespaces'
41
+ AND column_name IN ('id', 'name', 'redis_config', 'pg_config', 'version', 'is_active')
42
+ ORDER BY ordinal_position;
43
+
44
+ -- 检查索引
45
+ SELECT
46
+ indexname,
47
+ tablename,
48
+ indexdef
49
+ FROM pg_indexes
50
+ WHERE schemaname = 'public'
51
+ AND tablename IN ('namespaces', 'scheduled_tasks', 'tasks', 'task_runs', 'alert_rules', 'alert_history')
52
+ ORDER BY tablename, indexname;
53
+
54
+ -- 检查分区表
55
+ SELECT
56
+ parent.relname AS parent_table,
57
+ child.relname AS partition_name,
58
+ pg_get_expr(child.relpartbound, child.oid, true) AS partition_expression
59
+ FROM pg_inherits
60
+ JOIN pg_class parent ON pg_inherits.inhparent = parent.oid
61
+ JOIN pg_class child ON pg_inherits.inhrelid = child.oid
62
+ WHERE parent.relname IN ('tasks', 'task_runs', 'stream_backlog_monitor')
63
+ ORDER BY parent.relname, child.relname;
64
+
65
+ -- 检查触发器
66
+ SELECT
67
+ trigger_name,
68
+ event_object_table,
69
+ action_statement
70
+ FROM information_schema.triggers
71
+ WHERE trigger_schema = 'public'
72
+ ORDER BY event_object_table, trigger_name;
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jettask
3
- Version: 0.2.14
3
+ Version: 0.2.16
4
4
  Summary: A high-performance distributed task queue system with web monitoring
5
5
  Author-email: JetTask Team <support@jettask.io>
6
6
  License-Expression: MIT
@@ -32,6 +32,7 @@ Requires-Dist: websockets>=11.0
32
32
  Requires-Dist: pydantic>=2.0.0
33
33
  Requires-Dist: python-multipart>=0.0.6
34
34
  Requires-Dist: aiohttp>=3.8.0
35
+ Requires-Dist: requests>=2.28.0
35
36
  Requires-Dist: sqlalchemy[asyncio]>=2.0.0
36
37
  Requires-Dist: psycopg[binary,pool]>=3.1.0
37
38
  Requires-Dist: asyncpg>=0.28.0
@@ -39,6 +40,7 @@ Requires-Dist: croniter>=1.4.0
39
40
  Requires-Dist: click>=8.1.0
40
41
  Requires-Dist: python-dotenv>=1.0.0
41
42
  Requires-Dist: psutil>=5.9.0
43
+ Requires-Dist: nacos_tools
42
44
  Provides-Extra: dev
43
45
  Requires-Dist: pytest>=7.0; extra == "dev"
44
46
  Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
@@ -0,0 +1,150 @@
1
+ jettask/__init__.py,sha256=47VRBRUO5FL1efkUz1wmo3o-Gh7yiKhUjPuWvc0PuI0,362
2
+ jettask/__main__.py,sha256=NfkMpD7z2Jc6YrgbZaBlgCGO621zIi632Ee-P87UcfU,5556
3
+ jettask/api.py,sha256=agK2l6zBq4KRcthX5GexDBMo9rYgCtSGPgWemucuexk,95867
4
+ jettask/cleanup_deprecated_tables.sql,sha256=RmgwI1zx1qWiy4OXtTYPvBRFICkeqzC-1_xWOsnrrlI,529
5
+ jettask/cli.py,sha256=ILj5uSk8LvCvrnTwbbLg75aNYx2Kr0Nm08IAjbKMzo0,35042
6
+ jettask/constants.py,sha256=rw06U4WPSFk6f80blC0ebkqnPUS_eteKQesTSBXKn6A,7028
7
+ jettask/db_init.py,sha256=QQ7SMQN5tqU3mlz3jpc5XPlSRgzXgVV2C20WRCtvHrM,15363
8
+ jettask/exceptions.py,sha256=aQTUpiF2ftiZwGORUHXatAKbDEzptUf6iP7ZOXBQ3tQ,1971
9
+ jettask/gradio_app.py,sha256=ija3UDwWczbp5j0QwNxWw48MW-r9n4NsQkcxL67A14s,22650
10
+ jettask/integrated_gradio_app.py,sha256=JZySKZMwmiLELJi6EOcZcTEVRxC5BHpTU9TjAkmfGmg,44634
11
+ jettask/main.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
+ jettask/models.py,sha256=QHYqU_6X5mTDFW_DA1aFQJ6kdmFRgVs4shqr7RJUXzk,2026
13
+ jettask/multi_namespace_consumer.py,sha256=zKavB0EOGO6aLerRTvGeSdfFhdB9q3rVzcIP1fSUdV0,23146
14
+ jettask/pg_consumer.py,sha256=EXtiK0ec77BbVQLSuuNbLpeeM5cDJBTksgQrAz02wVg,96347
15
+ jettask/router.py,sha256=RWlaQKDeQIHqqshT026wGKMLk3HtnqM_8L6d7MgPP_4,5177
16
+ jettask/run.py,sha256=OiHdQpc86e6JU1KfxGg_jTHSV7375udxrrcd_4_gnPw,1433
17
+ jettask/run_monitor.py,sha256=n6aCsKE4BnjSTBPEJlFIU6b465pCcXJZZIsd5kUCvE0,562
18
+ jettask/run_webui.py,sha256=aWf1f1bITfNFqsgIdVKDgCOpfPBSfmXJvhjb_aHPeBI,4501
19
+ jettask/schema.sql,sha256=IY-vLzj3TYoR4p51ChLuSxzo4KU1PQNFNDutc7p0nHg,4490
20
+ jettask/task_center.py,sha256=BcJOaKAeUKDl75GQzoQdBkZdBiC4gPxLrNa5VbKC86I,8537
21
+ jettask/task_center_client.py,sha256=BAls3E02LBhBrEaOadGLQQg28Yx5wYt-sv-U39aRpYM,5957
22
+ jettask/unified_consumer_manager.py,sha256=568KKQFUFuDbbn4eUfvZzH4iYR-UOoiumsweHttrQD8,7424
23
+ jettask/webui_config.py,sha256=8THiJZIbnmhMN3iVvynGuE2U8POxvldcG8pqwXFkWGo,2854
24
+ jettask/webui_exceptions.py,sha256=aQTUpiF2ftiZwGORUHXatAKbDEzptUf6iP7ZOXBQ3tQ,1971
25
+ jettask/api/__init__.py,sha256=gUskl_HqYIQTzqaf8z8wq1OIX6iJcuSl_sy9NzkGxHA,3391
26
+ jettask/api/v1/__init__.py,sha256=AvzzOJ1W38LrDkyPiNQODaGiSdF4olYR0xy-ZpyIIJg,1243
27
+ jettask/api/v1/alerts.py,sha256=rnRbN43KlmwRxbLJKzgMRU-P_CPNTfJTa3oOZ3l9fI8,6214
28
+ jettask/api/v1/analytics.py,sha256=w6jcR5njOz9KIDocDO53E2XuYZ06CtaDjH1aD3yI6zo,8595
29
+ jettask/api/v1/namespaces.py,sha256=aIxi19Cj8QbXhfwgSa1gD_YR3qHXLMI4eyXPrt_gWoQ,4200
30
+ jettask/api/v1/overview.py,sha256=ab3jAqdmVsyVjeQWPFcuF4JxqMkIve4rqm9ghCpa3-w,4175
31
+ jettask/api/v1/queues.py,sha256=zrZMlqn9t9RnHD2X24nvMPvXGOJ1-peJnaMbgw7WRes,17665
32
+ jettask/api/v1/scheduled.py,sha256=Zfha0z0nP72WL8VNTRitcPGwtxaLdgiEC5viHUwAet8,13484
33
+ jettask/api/v1/settings.py,sha256=UQ_jwp-m6y-cVaN9srxt31ltAzUoikgE2SfBzx8IlnE,1184
34
+ jettask/backend/__init__.py,sha256=OK2w-Nm0pF2nqNhhUoSRIDHFnAsQBJdPlIyp5_RU-Rw,32
35
+ jettask/backend/config.py,sha256=dJ9UkWRR1kulHFhfSVXmT_bM-N7yEMJdp0JylUkrLZ4,2062
36
+ jettask/backend/data_access.py,sha256=5gC4x4XL7YpWsRoJxalgT05hr05wtHf82jT36JE_JOQ,115164
37
+ jettask/backend/dependencies.py,sha256=ZG8_O9rDrdSOyImqaxDbimK-Cf8ZrZyRNq_VS3WWWsk,8236
38
+ jettask/backend/init_meta_db.py,sha256=_QRQKlnatfYpz8C9ygqiazO8lNye7HIn5x41-y5snIw,5482
39
+ jettask/backend/main.py,sha256=RM83CHYcyBR6Ha_C9bLRZMsZiF1HZiV9ChjiZQacXDo,50913
40
+ jettask/backend/main_unified.py,sha256=Fw7j2PPXJhQ8iAPbNNl1RuWqWxidTQhImJ1i0M6JswQ,2086
41
+ jettask/backend/main_v2.py,sha256=XU7LZriOuTcMHt8rZTeNUAtY7HBIu50vzJT-f8_AbCs,11603
42
+ jettask/backend/namespace_api_old.py,sha256=ZNTN_W4JybtHofWMqxd9PyIZ6rRSOWOWGRcXnzrVeCI,10553
43
+ jettask/backend/namespace_data_access.py,sha256=SERjZSuVxIA5fE3osJReRydbppp6HNk4RG9OGmesRXQ,25859
44
+ jettask/backend/queue_stats_v2.py,sha256=VeI46WQREFAQgqW330eKs0jO7ZBehLIEKsxAAu907T8,24402
45
+ jettask/backend/start.py,sha256=HMY7QMfWewmgJQTUamjzGV8YONTpjH4B9_W7fbL6_hE,1060
46
+ jettask/backend/unified_api_router.py,sha256=F0N_sOMdzbzj3YakYtNDkhW1Hk19_W6RriG0wxWN0YY,58267
47
+ jettask/backend/api/__init__.py,sha256=2vM3ARaoFV6FAMfhRIEK3BVVRUfsdciYdHH2piNrXn8,44
48
+ jettask/backend/api/v1/__init__.py,sha256=6QopP8txnoYol62VxB8omXrRDH_BQym1ZxQ9DqKst7Y,638
49
+ jettask/backend/api/v1/monitoring.py,sha256=u9qRhSfDV8r_tNC4lJb7yiOUsvgpqEZFGhuUMkxNy1U,15239
50
+ jettask/backend/api/v1/namespaces.py,sha256=I_0aMui5E0n2b3EpljY92Y9FY8KIhbMyoXB1eoQV3jg,18838
51
+ jettask/backend/api/v1/queues.py,sha256=c3AsdSmSku0JrPBSvPcpN3lic7srq6PPgUza3OhUaiQ,13138
52
+ jettask/backend/api/v1/tasks.py,sha256=4i05ToZmn3sZ8Ll-Ak-WwTg78_8iQM2vXUsVzqChSRQ,13250
53
+ jettask/backend/core/__init__.py,sha256=_VvuKQCXSZo_WaKhtFm8ArKGo44DWMPrS9i_TF1sf8g,61
54
+ jettask/backend/core/cache.py,sha256=F0TXkh8Vf4lCWZKNaQyxqwkl_xcuY4lFyqUFX6hQ__s,6789
55
+ jettask/backend/core/database.py,sha256=7HNesi-1MDm2HydhvyhHpCk066hJ7Dm0XaxO1QxggQo,7899
56
+ jettask/backend/core/exceptions.py,sha256=hC11lxkdaepfVhZONSEaQWo288ebHbx0BdZWxUK62Js,2951
57
+ jettask/backend/models/__init__.py,sha256=dSUQ2573SBZklLsuGrnd3QRFluUhXTg2ExdCiV1OWBk,45
58
+ jettask/backend/models/requests.py,sha256=fsHiv4sU46biQ1bK1KfV-yxak0LRoFLoe-dPvHSLC00,10002
59
+ jettask/backend/models/responses.py,sha256=FwGpAFNL61a2okJFD41TYLcuwu-41FHXrk6P190jxzw,8528
60
+ jettask/backend/services/__init__.py,sha256=DCf9NuJo1a65q3CXG0GtRksQpDhg3QuvmTYiWjxGjVE,57
61
+ jettask/config/__init__.py,sha256=qCRGmiXSK45LDU9pr0bUC-VoZAkTK1jAch1i9tvHCeE,158
62
+ jettask/config/nacos_config.py,sha256=ujipoLitNYKJDFMm_zskaLmFF4eoRFCU0L7p-s5LW08,14172
63
+ jettask/config/performance.py,sha256=bOdLEskfB_6cRfS10IRgmtKEsJw_CaIZsPHbXxaHwbU,5686
64
+ jettask/core/__init__.py,sha256=CvBoBCERXCo-jgnkPqAuIgT4uC7oQMnSi7okRxMi6Vc,181
65
+ jettask/core/app.py,sha256=qQPYl74uKV1ZgnuNTvPNPD0F_JVH20oZrsz9jIJusjk,70737
66
+ jettask/core/app_importer.py,sha256=B8WiSUz5_O5jlFIBr1CxI_F2gqFYK6ItpONiY_4AiXI,10266
67
+ jettask/core/consumer_manager.py,sha256=7z3IBvH85YD61ZkVNfOVsuP5NaAwV2Ki8aVz9TCplAM,79870
68
+ jettask/core/context.py,sha256=XI4Q1s75NIWImcrHIkCLgGo_kpuJIk8MlBoNIJuEfF0,993
69
+ jettask/core/db_manager.py,sha256=M6NXRAKXrdQBTjdj8LjxW3OEe7LZE5aqq1HFQaP1AYg,17602
70
+ jettask/core/delay_scanner.py,sha256=rwbIA7SFyOxAV14FW7NB40_djFrrqJJpNkpOri7XcZI,8394
71
+ jettask/core/enums.py,sha256=ufXI5OcGZoOSbLEyAWtnkZVO-LcqNbIOygyjLLa6ce8,4632
72
+ jettask/core/event_pool.py,sha256=_UQN07hfQqKlq2ejdXTsxgXmbks9uEUlMv246JKJTsc,85088
73
+ jettask/core/heartbeat_process.py,sha256=G-4rHSMgHIvFCRPlZeh91tKd0Fir8jJ9YVL4vdajQDE,9233
74
+ jettask/core/message.py,sha256=WDOY8kvoV6at4MsIP01c3GJmIwHvRnUHimli6NKcw8w,4340
75
+ jettask/core/offline_worker_recovery.py,sha256=L1i61RN5NnPiP7neudmdb_qYMEEvIYRd39OvZ6gwjZk,23633
76
+ jettask/core/retry.py,sha256=lX56Z0fvKjEhVbYPHYdoN-W4XUPVplHlfIOupBylEeI,10711
77
+ jettask/core/task.py,sha256=7VygTXcsBPjkfecz2oGXIVECvuuEI_p4lCjE2FzvLZc,5261
78
+ jettask/core/task_batch.py,sha256=lSI4ijf7YrMqS9m9NX3qQ3_HMkrCVZ3LGHL_zDOKc4k,4339
79
+ jettask/core/unified_manager_base.py,sha256=foUeCL8FmtI3SY89ZLOapPsX4dbVS7X-bV30DYCYIac,11174
80
+ jettask/core/worker_scanner.py,sha256=_ZFlH7eKeg-2lIL-3JFMV_Oht9Shf7VMEw_uyCBh5Tc,11277
81
+ jettask/executors/__init__.py,sha256=1aXRvwHzlypVcHNYy60UgUELOlNmbPp8oFMS5T0tJbs,186
82
+ jettask/executors/asyncio.py,sha256=zy2mezaRtri2RYXzl7jG9_idnvX9edFiTZWutPLfx9U,43167
83
+ jettask/executors/base.py,sha256=XwTIb8-_pTr_C3skRBOy9qgVpGOlFux258BNKG6CP6k,776
84
+ jettask/executors/common.py,sha256=eLYtBSzh44hHEiJAHFXtNyIMucsOTc2O-IZJt143OYg,6246
85
+ jettask/executors/multi_asyncio.py,sha256=M3Jpx8Eak1XYiQRuO3MwBbZ58vZWJbsiju3ltb-XEPI,13002
86
+ jettask/monitor/run_backlog_collector.py,sha256=hEe8VqlObgWQgVEmy5B6DfnCD9RIjMHPO54CUpnEEVs,2530
87
+ jettask/monitor/stream_backlog_monitor.py,sha256=UuA6FUXhvw17XuZE0QNAtQIju3-5jj7Ltf2x9ib_VnQ,15639
88
+ jettask/monitoring/__init__.py,sha256=xWEEH5C2e8TW2iH6KNxBj5R-aTMg1GH3DrrwjRzRGD4,76
89
+ jettask/monitoring/file_watcher.py,sha256=r3Mgekb_5sOssDrnFBCbbyvpWkwD2ZPA_j22ztzRCT0,1207
90
+ jettask/pg_consumer/pg_consumer_v2.py,sha256=ajd6ZM_HY9YWK_I5BNbGuWxNqSS892d3ZzvDlTSQgwc,16211
91
+ jettask/pg_consumer/sql_utils.py,sha256=dZM_8kIzUmRq0me4yLwb3UeoDvIVKJdIc9VNP1nbS0E,6461
92
+ jettask/pg_consumer/sql/add_execution_time_field.sql,sha256=z2Jx-0uG-IW5RsTGxcLFu2_BcMReluEptMJWB6Qrj08,1184
93
+ jettask/pg_consumer/sql/create_new_tables.sql,sha256=layb08_MFGVSE-NQEcjlQBklZ307JtJaccrnqkcj7Vg,6566
94
+ jettask/pg_consumer/sql/create_tables_v3.sql,sha256=ZwBjxKWU6imWACoWMCIACLsYUPiPep9WmJsdIjI2a58,8173
95
+ jettask/pg_consumer/sql/migrate_to_new_structure.sql,sha256=elhObWvbtqAhb4osJC6D5JhxcOxhGJgIBqx4ItB_xO8,5716
96
+ jettask/pg_consumer/sql/modify_time_fields.sql,sha256=mRfoXbP9iXbAJBj-xNume8-4AV_UPQcBALNUqEf3aKw,2572
97
+ jettask/scheduler/__init__.py,sha256=egJ-b3VjifFPOFhdEe6JOGyBBNxtqtH4cQvB6Vm_t-c,372
98
+ jettask/scheduler/add_execution_count.sql,sha256=x4jBsOFGj4JvEd-Ene3OhbR5QCKh5rv8dF01_qLSeE8,383
99
+ jettask/scheduler/add_priority_field.sql,sha256=z9S10u2D2eekVqB8xOAtDD4Rw1Ey497cmDL4pN2MgB0,915
100
+ jettask/scheduler/add_scheduler_id.sql,sha256=uDPSnYVjGE75LcOMKuT2kMEbCPW1JEbDq0uMqmN68aQ,818
101
+ jettask/scheduler/add_scheduler_id_index.sql,sha256=xaY4uXa5QitIEgx4tcDqh1SRZ1NIZXuq5NtQQH_4Liw,471
102
+ jettask/scheduler/loader.py,sha256=oZtz-RbXlxlHbzUOE2WVutPljtXV7SuPRU0W-4KGlVM,8727
103
+ jettask/scheduler/make_scheduler_id_required.sql,sha256=ksZ8rA7cAobrcQk3t93CrTePE2G40KQNESqA9WyPF50,854
104
+ jettask/scheduler/manager.py,sha256=dBZJrm72LU0J6BjStW-AOJ62g-Lam0nxBiPCIxdRNds,26236
105
+ jettask/scheduler/migrate_interval_seconds.sql,sha256=40MSij1-YsOX7mQU958v7Qsse6NCId0R6NkZEjeWr-8,391
106
+ jettask/scheduler/models.py,sha256=Mv-csKjsrYp4nI2H6IldCh6avu-9ke5YTfyufhlYjKI,7376
107
+ jettask/scheduler/multi_namespace_scheduler.py,sha256=629GGTMi8Rsaw62kzkt4Y8yF59WQMjHk67yrQP3I-4A,11375
108
+ jettask/scheduler/performance_optimization.sql,sha256=sXa5dh4DAAgjj8CsfByjCePcAXtGnxKwwPyMgbMbG2I,1733
109
+ jettask/scheduler/run_scheduler.py,sha256=zRp_V5D7CaTsfEDSEuzISN4Pdypj3NR62zbJn8R5JOQ,6305
110
+ jettask/scheduler/scheduler.py,sha256=PUEqVlYH_SyCYxKj0xzvig78AHzpoYhcUHAnLP9v5MU,27733
111
+ jettask/scheduler/schema.sql,sha256=iBGUrsMYv9_FQCr_0b5DC-XFUXOaLIjnwWH-yvy4LdM,4109
112
+ jettask/scheduler/unified_manager.py,sha256=rah9xUiZlTJiKu_2EuuM6shn9vAEE3KJ3tMpXlzhmGk,17580
113
+ jettask/scheduler/unified_scheduler_manager.py,sha256=nq3Xkh-JuZ5iZrJdxt-D0YEDDvro1hiMLgV7GkRtsNs,11142
114
+ jettask/schemas/__init__.py,sha256=YtyBjdLtZCceqmeVohlykFdgl5xtF_w9jtRmBfMRlqk,3170
115
+ jettask/schemas/alert.py,sha256=Od29QjDrnLN1Tw_F2rPFSGsqRvbBcO2hf1d8GO1_WEQ,4958
116
+ jettask/schemas/backlog.py,sha256=Qxl5I2cVI1ek1JujLl8I55IFINpXZr0Kbd1WWoyyRQg,5493
117
+ jettask/schemas/common.py,sha256=e1lrLnOpxKT25FH7QnDQy38Qj4SGqd_cwHvRObTuRZw,6038
118
+ jettask/schemas/monitoring.py,sha256=zPfNv6YXw3uufj61PseQTaQkpwa9azgsnCGUaF4HNUk,8084
119
+ jettask/schemas/namespace.py,sha256=0KZC2V--mmMIxzS7Yn2P4ue6lo9Ui0HGcez8gfNK8Vo,8625
120
+ jettask/schemas/queue.py,sha256=uier_qvrJWiZYh6m1rWM84mBjoKS6DjABM0WBTu9ToM,3968
121
+ jettask/schemas/scheduled_task.py,sha256=MPAXvDeqmyQTWhL31yS94mRuzJWOV4njukp6BQrX6K4,7130
122
+ jettask/schemas/task.py,sha256=niW2F_84HvstAjX3vo2pZswoRwMCF3DIoONuHwWNwtk,3172
123
+ jettask/services/__init__.py,sha256=6BvdLBzDFu_hdU6tnOkv9eIf1xkJ89T_Ctlu0bRpWy0,630
124
+ jettask/services/alert_service.py,sha256=AIk4hjx-yoFnl5vPff7TMwjgjheKu91da9mZ5gYDroo,14169
125
+ jettask/services/analytics_service.py,sha256=zLTtGUJ7wYIU7O5NP_VS_-wk_IXNfxKikAvQ3aaeCmI,1101
126
+ jettask/services/overview_service.py,sha256=qOc2fCXLyceBRRFORDjFE_sNIFdfVe6Bej3is4lxfIw,36546
127
+ jettask/services/queue_service.py,sha256=wTInU2mEBAE9e5iwFAdKFxrYdcJbQrBFpE26VyRy9BU,27412
128
+ jettask/services/redis_monitor_service.py,sha256=2l6fF2qAtctS9HUaEV3acJMJ5zhkvT4iygJGhGBCoKw,3660
129
+ jettask/services/scheduled_task_service.py,sha256=ZFFtcUdk_IDGm17maHA1Hb0p00_56QqQ9ETFAF7T1bU,6226
130
+ jettask/services/settings_service.py,sha256=PKEwlYDaYA0VTiwW5ZiXASFazVyOmFlN1jbgSZdAvP8,31561
131
+ jettask/services/task_service.py,sha256=vfSEyhFxDcEzOuA4sHEg1sYvLriUUvJ08SQ2ICG7MSU,4751
132
+ jettask/utils/__init__.py,sha256=7oEoX1Au4GxQ_hbXjSc1q5titSBWsi-62UIIUbZ7zto,133
133
+ jettask/utils/error_handler.py,sha256=9iYHCInUkEkP9o07dUgPxQr4aWqR5FUhnNWLgB0TEqM,2794
134
+ jettask/utils/exception_hook.py,sha256=Fp0m71_jjmmZvyoELARSsPIvSVPCmMQMVC1FxMFOoHQ,1765
135
+ jettask/utils/helpers.py,sha256=uTdyRFZsdwSQzuEcNoGgADuVnHaDEYq6JQP6zVxAj04,3368
136
+ jettask/utils/logger.py,sha256=PcZgUtx7I9pe90Y8WgPQtKhMefd1oQ14pgUlKCFpCXo,843
137
+ jettask/utils/serializer.py,sha256=kTVDtPz1gwkmspeazNNjuCqrYxJLc2bzqmS8_I0Zxn0,714
138
+ jettask/utils/serializer_optimized.py,sha256=UijmvEX6WQBnaNL653z9YOmpxADdEtfS3wQMMBl5_KI,883
139
+ jettask/utils/task_logger.py,sha256=kauCgiDDzhuge3wk-BXR_KwytOfmrrVBKe1S4XUWBXU,13628
140
+ jettask/utils/traceback_filter.py,sha256=2svLo5_OoosAbS08UpceeWtjSKkdx-Fp6U-ysJQkroY,3025
141
+ jettask/webui_models/__init__.py,sha256=5cv0oZksj1B3_rzCqsPmF3Gn9NRZLwzMnaJ8bOKGB4I,25
142
+ jettask/webui_models/namespace.py,sha256=jDj-hZF_-wXzrWAWVDyZVU0JUWDax9apb4Gyykwg-rE,2006
143
+ jettask/webui_sql/batch_upsert_functions.sql,sha256=5eWOhOD8gWHhtcop_BrCpZTxPFeyBHtt_leNQZO89Cs,6615
144
+ jettask/webui_sql/verify_database.sql,sha256=HtTup3xHWbOo1BTU_u4i41E9LrPEXB8qYbChL9WeWOc,2313
145
+ jettask-0.2.16.dist-info/licenses/LICENSE,sha256=sKR8OPWvnqxzcHAmnaVSANpRpeM0Z52PNLCB0ZlFN6c,1062
146
+ jettask-0.2.16.dist-info/METADATA,sha256=XBPB5oPLr203wel3tDT7JnkmxhcuZmeV0qluyzUb-GE,3015
147
+ jettask-0.2.16.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
148
+ jettask-0.2.16.dist-info/entry_points.txt,sha256=9-8eTLJPgzpBgeGC8WHdMYtldZxHAXFspMeqArVUdew,148
149
+ jettask-0.2.16.dist-info/top_level.txt,sha256=uymyRUF87-OsSurk5NhpeTW0jy3Wltnn91Zoa6jmAaw,8
150
+ jettask-0.2.16.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  [console_scripts]
2
- jettask = jettask.core.cli:main
2
+ jettask = jettask.cli:main
3
3
  jettask-monitor = jettask.webui.run_monitor:main
4
4
  jettask-webui = jettask.webui.backend.main:run_server