hdsp-jupyter-extension 2.0.6__py3-none-any.whl → 2.0.7__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 (90) hide show
  1. agent_server/core/reflection_engine.py +0 -1
  2. agent_server/knowledge/watchdog_service.py +1 -1
  3. agent_server/langchain/ARCHITECTURE.md +1193 -0
  4. agent_server/langchain/agent.py +74 -588
  5. agent_server/langchain/custom_middleware.py +636 -0
  6. agent_server/langchain/executors/__init__.py +2 -7
  7. agent_server/langchain/executors/notebook_searcher.py +46 -38
  8. agent_server/langchain/hitl_config.py +66 -0
  9. agent_server/langchain/llm_factory.py +166 -0
  10. agent_server/langchain/logging_utils.py +184 -0
  11. agent_server/langchain/prompts.py +119 -0
  12. agent_server/langchain/state.py +16 -6
  13. agent_server/langchain/tools/__init__.py +6 -0
  14. agent_server/langchain/tools/file_tools.py +91 -129
  15. agent_server/langchain/tools/jupyter_tools.py +18 -18
  16. agent_server/langchain/tools/resource_tools.py +161 -0
  17. agent_server/langchain/tools/search_tools.py +198 -216
  18. agent_server/langchain/tools/shell_tools.py +54 -0
  19. agent_server/main.py +4 -1
  20. agent_server/routers/health.py +1 -1
  21. agent_server/routers/langchain_agent.py +940 -285
  22. hdsp_agent_core/prompts/auto_agent_prompts.py +3 -3
  23. {hdsp_jupyter_extension-2.0.6.data → hdsp_jupyter_extension-2.0.7.data}/data/share/jupyter/labextensions/hdsp-agent/build_log.json +1 -1
  24. {hdsp_jupyter_extension-2.0.6.data → hdsp_jupyter_extension-2.0.7.data}/data/share/jupyter/labextensions/hdsp-agent/package.json +2 -2
  25. hdsp_jupyter_extension-2.0.6.data/data/share/jupyter/labextensions/hdsp-agent/static/frontend_styles_index_js.02d346171474a0fb2dc1.js → hdsp_jupyter_extension-2.0.7.data/data/share/jupyter/labextensions/hdsp-agent/static/frontend_styles_index_js.4770ec0fb2d173b6deb4.js +312 -6
  26. hdsp_jupyter_extension-2.0.7.data/data/share/jupyter/labextensions/hdsp-agent/static/frontend_styles_index_js.4770ec0fb2d173b6deb4.js.map +1 -0
  27. hdsp_jupyter_extension-2.0.6.data/data/share/jupyter/labextensions/hdsp-agent/static/lib_index_js.a223ea20056954479ae9.js → hdsp_jupyter_extension-2.0.7.data/data/share/jupyter/labextensions/hdsp-agent/static/lib_index_js.29cf4312af19e86f82af.js +1547 -330
  28. hdsp_jupyter_extension-2.0.7.data/data/share/jupyter/labextensions/hdsp-agent/static/lib_index_js.29cf4312af19e86f82af.js.map +1 -0
  29. hdsp_jupyter_extension-2.0.6.data/data/share/jupyter/labextensions/hdsp-agent/static/remoteEntry.addf2fa038fa60304aa2.js → hdsp_jupyter_extension-2.0.7.data/data/share/jupyter/labextensions/hdsp-agent/static/remoteEntry.61343eb4cf0577e74b50.js +8 -8
  30. hdsp_jupyter_extension-2.0.7.data/data/share/jupyter/labextensions/hdsp-agent/static/remoteEntry.61343eb4cf0577e74b50.js.map +1 -0
  31. hdsp_jupyter_extension-2.0.6.data/data/share/jupyter/labextensions/hdsp-agent/static/vendors-node_modules_emotion_cache_dist_emotion-cache_browser_development_esm_js.24edcc52a1c014a8a5f0.js → hdsp_jupyter_extension-2.0.7.data/data/share/jupyter/labextensions/hdsp-agent/static/vendors-node_modules_emotion_cache_dist_emotion-cache_browser_development_esm_js-node_modules-782ee5.d9ed8645ef1d311657d8.js +209 -2
  32. hdsp_jupyter_extension-2.0.7.data/data/share/jupyter/labextensions/hdsp-agent/static/vendors-node_modules_emotion_cache_dist_emotion-cache_browser_development_esm_js-node_modules-782ee5.d9ed8645ef1d311657d8.js.map +1 -0
  33. jupyter_ext/labextension/static/vendors-node_modules_emotion_react_dist_emotion-react_browser_development_esm_js.19ecf6babe00caff6b8a.js → hdsp_jupyter_extension-2.0.7.data/data/share/jupyter/labextensions/hdsp-agent/static/vendors-node_modules_emotion_react_dist_emotion-react_browser_development_esm_js.36b49c71871f98d4f549.js +2 -209
  34. hdsp_jupyter_extension-2.0.7.data/data/share/jupyter/labextensions/hdsp-agent/static/vendors-node_modules_emotion_react_dist_emotion-react_browser_development_esm_js.36b49c71871f98d4f549.js.map +1 -0
  35. hdsp_jupyter_extension-2.0.6.data/data/share/jupyter/labextensions/hdsp-agent/static/vendors-node_modules_mui_material_utils_createSvgIcon_js.1f5038488cdfd8b3a85d.js → hdsp_jupyter_extension-2.0.7.data/data/share/jupyter/labextensions/hdsp-agent/static/vendors-node_modules_mui_material_utils_createSvgIcon_js.2e13df4ea61496e95d45.js +3 -212
  36. hdsp_jupyter_extension-2.0.7.data/data/share/jupyter/labextensions/hdsp-agent/static/vendors-node_modules_mui_material_utils_createSvgIcon_js.2e13df4ea61496e95d45.js.map +1 -0
  37. {hdsp_jupyter_extension-2.0.6.dist-info → hdsp_jupyter_extension-2.0.7.dist-info}/METADATA +2 -1
  38. {hdsp_jupyter_extension-2.0.6.dist-info → hdsp_jupyter_extension-2.0.7.dist-info}/RECORD +71 -68
  39. jupyter_ext/_version.py +1 -1
  40. jupyter_ext/handlers.py +1176 -58
  41. jupyter_ext/labextension/build_log.json +1 -1
  42. jupyter_ext/labextension/package.json +2 -2
  43. jupyter_ext/labextension/static/{frontend_styles_index_js.02d346171474a0fb2dc1.js → frontend_styles_index_js.4770ec0fb2d173b6deb4.js} +312 -6
  44. jupyter_ext/labextension/static/frontend_styles_index_js.4770ec0fb2d173b6deb4.js.map +1 -0
  45. jupyter_ext/labextension/static/{lib_index_js.a223ea20056954479ae9.js → lib_index_js.29cf4312af19e86f82af.js} +1547 -330
  46. jupyter_ext/labextension/static/lib_index_js.29cf4312af19e86f82af.js.map +1 -0
  47. jupyter_ext/labextension/static/{remoteEntry.addf2fa038fa60304aa2.js → remoteEntry.61343eb4cf0577e74b50.js} +8 -8
  48. jupyter_ext/labextension/static/remoteEntry.61343eb4cf0577e74b50.js.map +1 -0
  49. jupyter_ext/labextension/static/{vendors-node_modules_emotion_cache_dist_emotion-cache_browser_development_esm_js.24edcc52a1c014a8a5f0.js → vendors-node_modules_emotion_cache_dist_emotion-cache_browser_development_esm_js-node_modules-782ee5.d9ed8645ef1d311657d8.js} +209 -2
  50. jupyter_ext/labextension/static/vendors-node_modules_emotion_cache_dist_emotion-cache_browser_development_esm_js-node_modules-782ee5.d9ed8645ef1d311657d8.js.map +1 -0
  51. hdsp_jupyter_extension-2.0.6.data/data/share/jupyter/labextensions/hdsp-agent/static/vendors-node_modules_emotion_react_dist_emotion-react_browser_development_esm_js.19ecf6babe00caff6b8a.js → jupyter_ext/labextension/static/vendors-node_modules_emotion_react_dist_emotion-react_browser_development_esm_js.36b49c71871f98d4f549.js +2 -209
  52. jupyter_ext/labextension/static/vendors-node_modules_emotion_react_dist_emotion-react_browser_development_esm_js.36b49c71871f98d4f549.js.map +1 -0
  53. jupyter_ext/labextension/static/{vendors-node_modules_mui_material_utils_createSvgIcon_js.1f5038488cdfd8b3a85d.js → vendors-node_modules_mui_material_utils_createSvgIcon_js.2e13df4ea61496e95d45.js} +3 -212
  54. jupyter_ext/labextension/static/vendors-node_modules_mui_material_utils_createSvgIcon_js.2e13df4ea61496e95d45.js.map +1 -0
  55. jupyter_ext/resource_usage.py +180 -0
  56. jupyter_ext/tests/test_handlers.py +58 -0
  57. agent_server/langchain/executors/jupyter_executor.py +0 -429
  58. agent_server/langchain/middleware/__init__.py +0 -36
  59. agent_server/langchain/middleware/code_search_middleware.py +0 -278
  60. agent_server/langchain/middleware/error_handling_middleware.py +0 -338
  61. agent_server/langchain/middleware/jupyter_execution_middleware.py +0 -301
  62. agent_server/langchain/middleware/rag_middleware.py +0 -227
  63. agent_server/langchain/middleware/validation_middleware.py +0 -240
  64. hdsp_jupyter_extension-2.0.6.data/data/share/jupyter/labextensions/hdsp-agent/static/frontend_styles_index_js.02d346171474a0fb2dc1.js.map +0 -1
  65. hdsp_jupyter_extension-2.0.6.data/data/share/jupyter/labextensions/hdsp-agent/static/lib_index_js.a223ea20056954479ae9.js.map +0 -1
  66. hdsp_jupyter_extension-2.0.6.data/data/share/jupyter/labextensions/hdsp-agent/static/remoteEntry.addf2fa038fa60304aa2.js.map +0 -1
  67. hdsp_jupyter_extension-2.0.6.data/data/share/jupyter/labextensions/hdsp-agent/static/vendors-node_modules_emotion_cache_dist_emotion-cache_browser_development_esm_js.24edcc52a1c014a8a5f0.js.map +0 -1
  68. hdsp_jupyter_extension-2.0.6.data/data/share/jupyter/labextensions/hdsp-agent/static/vendors-node_modules_emotion_react_dist_emotion-react_browser_development_esm_js.19ecf6babe00caff6b8a.js.map +0 -1
  69. hdsp_jupyter_extension-2.0.6.data/data/share/jupyter/labextensions/hdsp-agent/static/vendors-node_modules_mui_material_utils_createSvgIcon_js.1f5038488cdfd8b3a85d.js.map +0 -1
  70. jupyter_ext/labextension/static/frontend_styles_index_js.02d346171474a0fb2dc1.js.map +0 -1
  71. jupyter_ext/labextension/static/lib_index_js.a223ea20056954479ae9.js.map +0 -1
  72. jupyter_ext/labextension/static/remoteEntry.addf2fa038fa60304aa2.js.map +0 -1
  73. jupyter_ext/labextension/static/vendors-node_modules_emotion_cache_dist_emotion-cache_browser_development_esm_js.24edcc52a1c014a8a5f0.js.map +0 -1
  74. jupyter_ext/labextension/static/vendors-node_modules_emotion_react_dist_emotion-react_browser_development_esm_js.19ecf6babe00caff6b8a.js.map +0 -1
  75. jupyter_ext/labextension/static/vendors-node_modules_mui_material_utils_createSvgIcon_js.1f5038488cdfd8b3a85d.js.map +0 -1
  76. {hdsp_jupyter_extension-2.0.6.data → hdsp_jupyter_extension-2.0.7.data}/data/etc/jupyter/jupyter_server_config.d/hdsp_jupyter_extension.json +0 -0
  77. {hdsp_jupyter_extension-2.0.6.data → hdsp_jupyter_extension-2.0.7.data}/data/share/jupyter/labextensions/hdsp-agent/install.json +0 -0
  78. {hdsp_jupyter_extension-2.0.6.data → hdsp_jupyter_extension-2.0.7.data}/data/share/jupyter/labextensions/hdsp-agent/static/node_modules_emotion_use-insertion-effect-with-fallbacks_dist_emotion-use-insertion-effect-wi-3ba6b80.c095373419d05e6f141a.js +0 -0
  79. {hdsp_jupyter_extension-2.0.6.data → hdsp_jupyter_extension-2.0.7.data}/data/share/jupyter/labextensions/hdsp-agent/static/node_modules_emotion_use-insertion-effect-with-fallbacks_dist_emotion-use-insertion-effect-wi-3ba6b80.c095373419d05e6f141a.js.map +0 -0
  80. {hdsp_jupyter_extension-2.0.6.data → hdsp_jupyter_extension-2.0.7.data}/data/share/jupyter/labextensions/hdsp-agent/static/node_modules_emotion_use-insertion-effect-with-fallbacks_dist_emotion-use-insertion-effect-wi-3ba6b81.61e75fb98ecff46cf836.js +0 -0
  81. {hdsp_jupyter_extension-2.0.6.data → hdsp_jupyter_extension-2.0.7.data}/data/share/jupyter/labextensions/hdsp-agent/static/node_modules_emotion_use-insertion-effect-with-fallbacks_dist_emotion-use-insertion-effect-wi-3ba6b81.61e75fb98ecff46cf836.js.map +0 -0
  82. {hdsp_jupyter_extension-2.0.6.data → hdsp_jupyter_extension-2.0.7.data}/data/share/jupyter/labextensions/hdsp-agent/static/style.js +0 -0
  83. {hdsp_jupyter_extension-2.0.6.data → hdsp_jupyter_extension-2.0.7.data}/data/share/jupyter/labextensions/hdsp-agent/static/vendors-node_modules_babel_runtime_helpers_esm_extends_js-node_modules_emotion_serialize_dist-051195.e2553aab0c3963b83dd7.js +0 -0
  84. {hdsp_jupyter_extension-2.0.6.data → hdsp_jupyter_extension-2.0.7.data}/data/share/jupyter/labextensions/hdsp-agent/static/vendors-node_modules_babel_runtime_helpers_esm_extends_js-node_modules_emotion_serialize_dist-051195.e2553aab0c3963b83dd7.js.map +0 -0
  85. {hdsp_jupyter_extension-2.0.6.data → hdsp_jupyter_extension-2.0.7.data}/data/share/jupyter/labextensions/hdsp-agent/static/vendors-node_modules_emotion_styled_dist_emotion-styled_browser_development_esm_js.661fb5836f4978a7c6e1.js +0 -0
  86. {hdsp_jupyter_extension-2.0.6.data → hdsp_jupyter_extension-2.0.7.data}/data/share/jupyter/labextensions/hdsp-agent/static/vendors-node_modules_emotion_styled_dist_emotion-styled_browser_development_esm_js.661fb5836f4978a7c6e1.js.map +0 -0
  87. {hdsp_jupyter_extension-2.0.6.data → hdsp_jupyter_extension-2.0.7.data}/data/share/jupyter/labextensions/hdsp-agent/static/vendors-node_modules_mui_material_index_js.985697e0162d8d088ca2.js +0 -0
  88. {hdsp_jupyter_extension-2.0.6.data → hdsp_jupyter_extension-2.0.7.data}/data/share/jupyter/labextensions/hdsp-agent/static/vendors-node_modules_mui_material_index_js.985697e0162d8d088ca2.js.map +0 -0
  89. {hdsp_jupyter_extension-2.0.6.dist-info → hdsp_jupyter_extension-2.0.7.dist-info}/WHEEL +0 -0
  90. {hdsp_jupyter_extension-2.0.6.dist-info → hdsp_jupyter_extension-2.0.7.dist-info}/licenses/LICENSE +0 -0
@@ -1,240 +0,0 @@
1
- """
2
- Validation Middleware
3
-
4
- Validates code before execution in Jupyter cells.
5
- Uses static analysis (AST, Ruff, Pyflakes) to detect issues.
6
- """
7
-
8
- import logging
9
- from typing import Any, Dict, Optional
10
-
11
- from agent_server.langchain.state import AgentRuntime, AgentState
12
-
13
- logger = logging.getLogger(__name__)
14
-
15
-
16
- class ValidationMiddleware:
17
- """
18
- Middleware that validates code before tool execution.
19
-
20
- This middleware:
21
- 1. Intercepts jupyter_cell tool calls
22
- 2. Validates the code using CodeValidator
23
- 3. Blocks execution if critical errors found
24
- 4. Provides fix suggestions when possible
25
-
26
- Uses @before_tool_call hook pattern from LangChain middleware.
27
- """
28
-
29
- def __init__(
30
- self,
31
- code_validator: Any = None,
32
- block_on_errors: bool = True,
33
- auto_fix: bool = False,
34
- enabled: bool = True,
35
- ):
36
- """
37
- Initialize validation middleware.
38
-
39
- Args:
40
- code_validator: CodeValidator instance
41
- block_on_errors: Block execution if errors found
42
- auto_fix: Attempt auto-fix for fixable issues
43
- enabled: Whether validation is enabled
44
- """
45
- self._validator = code_validator
46
- self._block_on_errors = block_on_errors
47
- self._auto_fix = auto_fix
48
- self._enabled = enabled
49
-
50
- @property
51
- def name(self) -> str:
52
- return "ValidationMiddleware"
53
-
54
- def _get_validator(self):
55
- """Lazy load code validator"""
56
- if self._validator is None:
57
- try:
58
- from agent_server.core.code_validator import CodeValidator
59
- self._validator = CodeValidator()
60
- except ImportError:
61
- logger.warning("CodeValidator not available")
62
- return None
63
- return self._validator
64
-
65
- def _extract_code_from_tool_call(
66
- self,
67
- tool_name: str,
68
- tool_input: Dict[str, Any],
69
- ) -> Optional[str]:
70
- """Extract code from tool call if applicable"""
71
- if tool_name != "jupyter_cell_tool":
72
- return None
73
-
74
- code = tool_input.get("code", "")
75
- if not code:
76
- return None
77
-
78
- return code
79
-
80
- def _validate_code(
81
- self,
82
- code: str,
83
- notebook_context: Dict[str, Any],
84
- ) -> Dict[str, Any]:
85
- """Validate code using CodeValidator"""
86
- validator = self._get_validator()
87
- if validator is None:
88
- return {
89
- "valid": True,
90
- "issues": [],
91
- "summary": "Validation skipped (validator not available)",
92
- }
93
-
94
- try:
95
- # Build context for validator
96
- ctx = {
97
- "definedVariables": notebook_context.get("defined_variables", []),
98
- "importedLibraries": notebook_context.get("imported_libraries", []),
99
- }
100
-
101
- # Reinitialize validator with context
102
- validator_with_ctx = type(validator)(notebook_context=ctx)
103
- result = validator_with_ctx.full_validation(code)
104
-
105
- return {
106
- "valid": result.is_valid,
107
- "issues": [issue.to_dict() for issue in result.issues],
108
- "has_errors": result.has_errors,
109
- "has_warnings": result.has_warnings,
110
- "summary": result.summary,
111
- "dependencies": result.dependencies.to_dict() if result.dependencies else None,
112
- }
113
- except Exception as e:
114
- logger.error(f"Validation failed: {e}")
115
- return {
116
- "valid": True, # Don't block on validation errors
117
- "issues": [],
118
- "summary": f"Validation error: {str(e)}",
119
- }
120
-
121
- async def before_tool_call(
122
- self,
123
- tool_name: str,
124
- tool_input: Dict[str, Any],
125
- state: AgentState,
126
- runtime: AgentRuntime,
127
- ) -> Optional[Dict[str, Any]]:
128
- """
129
- Hook called before each tool execution.
130
-
131
- Validates code for jupyter_cell tool calls.
132
-
133
- Args:
134
- tool_name: Name of the tool being called
135
- tool_input: Tool input parameters
136
- state: Current agent state
137
- runtime: Agent runtime context
138
-
139
- Returns:
140
- Modified tool input, or raises exception to block
141
- """
142
- if not self._enabled:
143
- return None
144
-
145
- code = self._extract_code_from_tool_call(tool_name, tool_input)
146
- if code is None:
147
- return None
148
-
149
- notebook_context = state.get("notebook_context", {})
150
- validation_result = self._validate_code(code, notebook_context)
151
-
152
- # Store validation result in state
153
- state["validation_result"] = validation_result
154
-
155
- if not validation_result.get("valid", True) and self._block_on_errors:
156
- # Get error details
157
- errors = [
158
- issue for issue in validation_result.get("issues", [])
159
- if issue.get("severity") == "error"
160
- ]
161
-
162
- if errors:
163
- error_messages = [
164
- f"- {e.get('category', 'error')}: {e.get('message', 'Unknown error')}"
165
- for e in errors[:5] # Limit to 5 errors
166
- ]
167
-
168
- logger.warning(f"Code validation failed: {len(errors)} errors")
169
-
170
- # Return modified result that includes validation feedback
171
- return {
172
- "code": code,
173
- "validation_failed": True,
174
- "validation_errors": error_messages,
175
- "original_input": tool_input,
176
- }
177
-
178
- # Log warnings but allow execution
179
- warnings = [
180
- issue for issue in validation_result.get("issues", [])
181
- if issue.get("severity") == "warning"
182
- ]
183
- if warnings:
184
- logger.info(f"Code validation: {len(warnings)} warnings")
185
-
186
- return None
187
-
188
- def format_validation_feedback(
189
- self,
190
- validation_result: Dict[str, Any],
191
- ) -> str:
192
- """
193
- Format validation result for feedback to the model.
194
-
195
- Args:
196
- validation_result: Validation result dict
197
-
198
- Returns:
199
- Formatted feedback string
200
- """
201
- if validation_result.get("valid", True):
202
- return ""
203
-
204
- lines = ["## Code Validation Issues"]
205
-
206
- for issue in validation_result.get("issues", [])[:10]:
207
- severity = issue.get("severity", "info")
208
- category = issue.get("category", "unknown")
209
- message = issue.get("message", "")
210
- line = issue.get("line")
211
-
212
- location = f"L{line}" if line else ""
213
- lines.append(f"- [{severity.upper()}] {category}{location}: {message}")
214
-
215
- lines.append("\nPlease fix these issues before execution.")
216
-
217
- return "\n".join(lines)
218
-
219
-
220
- def create_validation_middleware(
221
- block_on_errors: bool = True,
222
- auto_fix: bool = False,
223
- enabled: bool = True,
224
- ) -> ValidationMiddleware:
225
- """
226
- Factory function to create validation middleware.
227
-
228
- Args:
229
- block_on_errors: Block execution on validation errors
230
- auto_fix: Attempt auto-fix for issues
231
- enabled: Whether to enable validation
232
-
233
- Returns:
234
- Configured ValidationMiddleware instance
235
- """
236
- return ValidationMiddleware(
237
- block_on_errors=block_on_errors,
238
- auto_fix=auto_fix,
239
- enabled=enabled,
240
- )