hdsp-jupyter-extension 2.0.8__py3-none-any.whl → 2.0.11__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 (88) hide show
  1. agent_server/core/notebook_generator.py +4 -4
  2. agent_server/core/rag_manager.py +12 -3
  3. agent_server/core/retriever.py +2 -1
  4. agent_server/core/vllm_embedding_service.py +8 -5
  5. agent_server/langchain/ARCHITECTURE.md +7 -51
  6. agent_server/langchain/agent.py +31 -20
  7. agent_server/langchain/custom_middleware.py +234 -31
  8. agent_server/langchain/hitl_config.py +5 -8
  9. agent_server/langchain/logging_utils.py +7 -7
  10. agent_server/langchain/prompts.py +106 -120
  11. agent_server/langchain/tools/__init__.py +1 -10
  12. agent_server/langchain/tools/file_tools.py +9 -61
  13. agent_server/langchain/tools/jupyter_tools.py +0 -1
  14. agent_server/langchain/tools/lsp_tools.py +8 -8
  15. agent_server/langchain/tools/resource_tools.py +12 -12
  16. agent_server/langchain/tools/search_tools.py +3 -158
  17. agent_server/prompts/file_action_prompts.py +8 -8
  18. agent_server/routers/langchain_agent.py +200 -125
  19. hdsp_agent_core/__init__.py +46 -47
  20. hdsp_agent_core/factory.py +6 -10
  21. hdsp_agent_core/interfaces.py +4 -2
  22. hdsp_agent_core/knowledge/__init__.py +5 -5
  23. hdsp_agent_core/knowledge/chunking.py +87 -61
  24. hdsp_agent_core/knowledge/loader.py +103 -101
  25. hdsp_agent_core/llm/service.py +192 -107
  26. hdsp_agent_core/managers/config_manager.py +16 -22
  27. hdsp_agent_core/managers/session_manager.py +5 -4
  28. hdsp_agent_core/models/__init__.py +12 -12
  29. hdsp_agent_core/models/agent.py +15 -8
  30. hdsp_agent_core/models/common.py +1 -2
  31. hdsp_agent_core/models/rag.py +48 -111
  32. hdsp_agent_core/prompts/__init__.py +12 -12
  33. hdsp_agent_core/prompts/cell_action_prompts.py +9 -7
  34. hdsp_agent_core/services/agent_service.py +10 -8
  35. hdsp_agent_core/services/chat_service.py +10 -6
  36. hdsp_agent_core/services/rag_service.py +3 -6
  37. hdsp_agent_core/tests/conftest.py +4 -1
  38. hdsp_agent_core/tests/test_factory.py +2 -2
  39. hdsp_agent_core/tests/test_services.py +12 -19
  40. {hdsp_jupyter_extension-2.0.8.data → hdsp_jupyter_extension-2.0.11.data}/data/share/jupyter/labextensions/hdsp-agent/build_log.json +1 -1
  41. {hdsp_jupyter_extension-2.0.8.data → hdsp_jupyter_extension-2.0.11.data}/data/share/jupyter/labextensions/hdsp-agent/package.json +2 -2
  42. hdsp_jupyter_extension-2.0.8.data/data/share/jupyter/labextensions/hdsp-agent/static/frontend_styles_index_js.8740a527757068814573.js → hdsp_jupyter_extension-2.0.11.data/data/share/jupyter/labextensions/hdsp-agent/static/frontend_styles_index_js.2d9fb488c82498c45c2d.js +93 -4
  43. hdsp_jupyter_extension-2.0.11.data/data/share/jupyter/labextensions/hdsp-agent/static/frontend_styles_index_js.2d9fb488c82498c45c2d.js.map +1 -0
  44. hdsp_jupyter_extension-2.0.8.data/data/share/jupyter/labextensions/hdsp-agent/static/lib_index_js.e4ff4b5779b5e049f84c.js → hdsp_jupyter_extension-2.0.11.data/data/share/jupyter/labextensions/hdsp-agent/static/lib_index_js.58c1e128ba0b76f41f04.js +153 -130
  45. hdsp_jupyter_extension-2.0.11.data/data/share/jupyter/labextensions/hdsp-agent/static/lib_index_js.58c1e128ba0b76f41f04.js.map +1 -0
  46. hdsp_jupyter_extension-2.0.8.data/data/share/jupyter/labextensions/hdsp-agent/static/remoteEntry.020cdb0b864cfaa4e41e.js → hdsp_jupyter_extension-2.0.11.data/data/share/jupyter/labextensions/hdsp-agent/static/remoteEntry.9da31d1134a53b0c4af5.js +6 -6
  47. hdsp_jupyter_extension-2.0.11.data/data/share/jupyter/labextensions/hdsp-agent/static/remoteEntry.9da31d1134a53b0c4af5.js.map +1 -0
  48. {hdsp_jupyter_extension-2.0.8.dist-info → hdsp_jupyter_extension-2.0.11.dist-info}/METADATA +1 -3
  49. hdsp_jupyter_extension-2.0.11.dist-info/RECORD +144 -0
  50. jupyter_ext/__init__.py +21 -11
  51. jupyter_ext/_version.py +1 -1
  52. jupyter_ext/handlers.py +69 -50
  53. jupyter_ext/labextension/build_log.json +1 -1
  54. jupyter_ext/labextension/package.json +2 -2
  55. jupyter_ext/labextension/static/{frontend_styles_index_js.8740a527757068814573.js → frontend_styles_index_js.2d9fb488c82498c45c2d.js} +93 -4
  56. jupyter_ext/labextension/static/frontend_styles_index_js.2d9fb488c82498c45c2d.js.map +1 -0
  57. jupyter_ext/labextension/static/{lib_index_js.e4ff4b5779b5e049f84c.js → lib_index_js.58c1e128ba0b76f41f04.js} +153 -130
  58. jupyter_ext/labextension/static/lib_index_js.58c1e128ba0b76f41f04.js.map +1 -0
  59. jupyter_ext/labextension/static/{remoteEntry.020cdb0b864cfaa4e41e.js → remoteEntry.9da31d1134a53b0c4af5.js} +6 -6
  60. jupyter_ext/labextension/static/remoteEntry.9da31d1134a53b0c4af5.js.map +1 -0
  61. hdsp_jupyter_extension-2.0.8.data/data/share/jupyter/labextensions/hdsp-agent/static/frontend_styles_index_js.8740a527757068814573.js.map +0 -1
  62. hdsp_jupyter_extension-2.0.8.data/data/share/jupyter/labextensions/hdsp-agent/static/lib_index_js.e4ff4b5779b5e049f84c.js.map +0 -1
  63. hdsp_jupyter_extension-2.0.8.data/data/share/jupyter/labextensions/hdsp-agent/static/remoteEntry.020cdb0b864cfaa4e41e.js.map +0 -1
  64. hdsp_jupyter_extension-2.0.8.dist-info/RECORD +0 -144
  65. jupyter_ext/labextension/static/frontend_styles_index_js.8740a527757068814573.js.map +0 -1
  66. jupyter_ext/labextension/static/lib_index_js.e4ff4b5779b5e049f84c.js.map +0 -1
  67. jupyter_ext/labextension/static/remoteEntry.020cdb0b864cfaa4e41e.js.map +0 -1
  68. {hdsp_jupyter_extension-2.0.8.data → hdsp_jupyter_extension-2.0.11.data}/data/etc/jupyter/jupyter_server_config.d/hdsp_jupyter_extension.json +0 -0
  69. {hdsp_jupyter_extension-2.0.8.data → hdsp_jupyter_extension-2.0.11.data}/data/share/jupyter/labextensions/hdsp-agent/install.json +0 -0
  70. {hdsp_jupyter_extension-2.0.8.data → hdsp_jupyter_extension-2.0.11.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
  71. {hdsp_jupyter_extension-2.0.8.data → hdsp_jupyter_extension-2.0.11.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
  72. {hdsp_jupyter_extension-2.0.8.data → hdsp_jupyter_extension-2.0.11.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
  73. {hdsp_jupyter_extension-2.0.8.data → hdsp_jupyter_extension-2.0.11.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
  74. {hdsp_jupyter_extension-2.0.8.data → hdsp_jupyter_extension-2.0.11.data}/data/share/jupyter/labextensions/hdsp-agent/static/style.js +0 -0
  75. {hdsp_jupyter_extension-2.0.8.data → hdsp_jupyter_extension-2.0.11.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
  76. {hdsp_jupyter_extension-2.0.8.data → hdsp_jupyter_extension-2.0.11.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
  77. {hdsp_jupyter_extension-2.0.8.data → hdsp_jupyter_extension-2.0.11.data}/data/share/jupyter/labextensions/hdsp-agent/static/vendors-node_modules_emotion_cache_dist_emotion-cache_browser_development_esm_js.24edcc52a1c014a8a5f0.js +0 -0
  78. {hdsp_jupyter_extension-2.0.8.data → hdsp_jupyter_extension-2.0.11.data}/data/share/jupyter/labextensions/hdsp-agent/static/vendors-node_modules_emotion_cache_dist_emotion-cache_browser_development_esm_js.24edcc52a1c014a8a5f0.js.map +0 -0
  79. {hdsp_jupyter_extension-2.0.8.data → hdsp_jupyter_extension-2.0.11.data}/data/share/jupyter/labextensions/hdsp-agent/static/vendors-node_modules_emotion_react_dist_emotion-react_browser_development_esm_js.19ecf6babe00caff6b8a.js +0 -0
  80. {hdsp_jupyter_extension-2.0.8.data → hdsp_jupyter_extension-2.0.11.data}/data/share/jupyter/labextensions/hdsp-agent/static/vendors-node_modules_emotion_react_dist_emotion-react_browser_development_esm_js.19ecf6babe00caff6b8a.js.map +0 -0
  81. {hdsp_jupyter_extension-2.0.8.data → hdsp_jupyter_extension-2.0.11.data}/data/share/jupyter/labextensions/hdsp-agent/static/vendors-node_modules_emotion_styled_dist_emotion-styled_browser_development_esm_js.661fb5836f4978a7c6e1.js +0 -0
  82. {hdsp_jupyter_extension-2.0.8.data → hdsp_jupyter_extension-2.0.11.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
  83. {hdsp_jupyter_extension-2.0.8.data → hdsp_jupyter_extension-2.0.11.data}/data/share/jupyter/labextensions/hdsp-agent/static/vendors-node_modules_mui_material_index_js.985697e0162d8d088ca2.js +0 -0
  84. {hdsp_jupyter_extension-2.0.8.data → hdsp_jupyter_extension-2.0.11.data}/data/share/jupyter/labextensions/hdsp-agent/static/vendors-node_modules_mui_material_index_js.985697e0162d8d088ca2.js.map +0 -0
  85. {hdsp_jupyter_extension-2.0.8.data → hdsp_jupyter_extension-2.0.11.data}/data/share/jupyter/labextensions/hdsp-agent/static/vendors-node_modules_mui_material_utils_createSvgIcon_js.1f5038488cdfd8b3a85d.js +0 -0
  86. {hdsp_jupyter_extension-2.0.8.data → hdsp_jupyter_extension-2.0.11.data}/data/share/jupyter/labextensions/hdsp-agent/static/vendors-node_modules_mui_material_utils_createSvgIcon_js.1f5038488cdfd8b3a85d.js.map +0 -0
  87. {hdsp_jupyter_extension-2.0.8.dist-info → hdsp_jupyter_extension-2.0.11.dist-info}/WHEEL +0 -0
  88. {hdsp_jupyter_extension-2.0.8.dist-info → hdsp_jupyter_extension-2.0.11.dist-info}/licenses/LICENSE +0 -0
@@ -179,11 +179,11 @@ class EmbeddedAgentService(IAgentService):
179
179
  rag_context = None
180
180
  try:
181
181
  from hdsp_agent_core.factory import get_service_factory
182
+
182
183
  rag_service = get_service_factory().get_rag_service()
183
184
  if rag_service.is_ready():
184
185
  rag_context = await rag_service.get_context_for_query(
185
- query=request.request,
186
- detected_libraries=detected_libraries
186
+ query=request.request, detected_libraries=detected_libraries
187
187
  )
188
188
  except Exception as e:
189
189
  logger.warning(f"RAG context retrieval failed: {e}")
@@ -208,7 +208,9 @@ class EmbeddedAgentService(IAgentService):
208
208
  plan_data = self._parse_json_response(response)
209
209
 
210
210
  if not plan_data or "plan" not in plan_data:
211
- raise ValueError(f"Failed to parse plan from LLM response: {response[:200]}")
211
+ raise ValueError(
212
+ f"Failed to parse plan from LLM response: {response[:200]}"
213
+ )
212
214
 
213
215
  # Sanitize and ensure goal
214
216
  plan_data = self._sanitize_tool_calls(plan_data)
@@ -291,6 +293,7 @@ class EmbeddedAgentService(IAgentService):
291
293
  # Use error classifier for deterministic classification
292
294
  try:
293
295
  from hdsp_agent_core.managers.error_classifier import get_error_classifier
296
+
294
297
  classifier = get_error_classifier()
295
298
  except ImportError:
296
299
  # Fallback if error_classifier not yet migrated
@@ -346,7 +349,9 @@ class EmbeddedAgentService(IAgentService):
346
349
  return {
347
350
  "valid": result.is_valid,
348
351
  "issues": [issue.to_dict() for issue in result.issues],
349
- "dependencies": result.dependencies.to_dict() if result.dependencies else None,
352
+ "dependencies": result.dependencies.to_dict()
353
+ if result.dependencies
354
+ else None,
350
355
  "hasErrors": result.has_errors,
351
356
  "hasWarnings": result.has_warnings,
352
357
  "summary": result.summary,
@@ -379,10 +384,7 @@ class ProxyAgentService(IAgentService):
379
384
  logger.info(f"ProxyAgentService initialized (server: {self._base_url})")
380
385
 
381
386
  async def _request(
382
- self,
383
- method: str,
384
- path: str,
385
- data: Optional[Dict] = None
387
+ self, method: str, path: str, data: Optional[Dict] = None
386
388
  ) -> Dict[str, Any]:
387
389
  """Make HTTP request to agent server"""
388
390
  url = f"{self._base_url}{path}"
@@ -69,7 +69,9 @@ class EmbeddedChatService(IChatService):
69
69
  session = self._session_manager.get_or_create_session(conversation_id)
70
70
  return session.id
71
71
 
72
- def _build_context(self, conversation_id: str, max_messages: int = 5) -> Optional[str]:
72
+ def _build_context(
73
+ self, conversation_id: str, max_messages: int = 5
74
+ ) -> Optional[str]:
73
75
  """Build conversation context from history"""
74
76
  return self._session_manager.build_context(conversation_id, max_messages)
75
77
 
@@ -88,7 +90,9 @@ class EmbeddedChatService(IChatService):
88
90
  config = self._build_llm_config(request.llmConfig)
89
91
 
90
92
  if not config or not config.get("provider"):
91
- raise ValueError("LLM not configured. Please provide llmConfig with API keys.")
93
+ raise ValueError(
94
+ "LLM not configured. Please provide llmConfig with API keys."
95
+ )
92
96
 
93
97
  # Get or create conversation
94
98
  conversation_id = self._get_or_create_conversation(request.conversationId)
@@ -98,9 +102,7 @@ class EmbeddedChatService(IChatService):
98
102
 
99
103
  # Call LLM
100
104
  llm_service = LLMService(config)
101
- response = await llm_service.generate_response(
102
- request.message, context=context
103
- )
105
+ response = await llm_service.generate_response(request.message, context=context)
104
106
 
105
107
  # Store messages
106
108
  self._store_messages(conversation_id, request.message, response)
@@ -124,7 +126,9 @@ class EmbeddedChatService(IChatService):
124
126
  config = self._build_llm_config(request.llmConfig)
125
127
 
126
128
  if not config or not config.get("provider"):
127
- yield {"error": "LLM not configured. Please provide llmConfig with API keys."}
129
+ yield {
130
+ "error": "LLM not configured. Please provide llmConfig with API keys."
131
+ }
128
132
  return
129
133
 
130
134
  # Get or create conversation
@@ -91,7 +91,7 @@ class EmbeddedRAGService(IRAGService):
91
91
  self,
92
92
  query: str,
93
93
  detected_libraries: Optional[List[str]] = None,
94
- max_results: int = 5
94
+ max_results: int = 5,
95
95
  ) -> Optional[str]:
96
96
  """Get formatted context for a query"""
97
97
  logger.info(f"[Embedded] Get context for query: {query[:100]}...")
@@ -186,10 +186,7 @@ class ProxyRAGService(IRAGService):
186
186
  return self._ready
187
187
 
188
188
  async def _request(
189
- self,
190
- method: str,
191
- path: str,
192
- data: Optional[Dict] = None
189
+ self, method: str, path: str, data: Optional[Dict] = None
193
190
  ) -> Dict[str, Any]:
194
191
  """Make HTTP request to RAG server"""
195
192
  url = f"{self._base_url}{path}"
@@ -218,7 +215,7 @@ class ProxyRAGService(IRAGService):
218
215
  self,
219
216
  query: str,
220
217
  detected_libraries: Optional[List[str]] = None,
221
- max_results: int = 5
218
+ max_results: int = 5,
222
219
  ) -> Optional[str]:
223
220
  """Get context via proxy"""
224
221
  logger.info(f"[Proxy] Get context for query: {query[:100]}...")
@@ -5,7 +5,6 @@ Provides pytest fixtures for testing ServiceFactory and service implementations.
5
5
  """
6
6
 
7
7
  import os
8
- from typing import Generator
9
8
  from unittest.mock import AsyncMock, MagicMock, patch
10
9
 
11
10
  import pytest
@@ -15,6 +14,7 @@ import pytest
15
14
  def reset_factory():
16
15
  """Reset ServiceFactory singleton before each test"""
17
16
  from hdsp_agent_core.factory import ServiceFactory
17
+
18
18
  ServiceFactory.reset_instance()
19
19
  yield
20
20
  ServiceFactory.reset_instance()
@@ -76,6 +76,7 @@ def sample_plan_request():
76
76
  """Sample plan request for testing"""
77
77
  from hdsp_agent_core.models.agent import PlanRequest
78
78
  from hdsp_agent_core.models.common import NotebookContext
79
+
79
80
  return PlanRequest(
80
81
  request="Create a simple plot",
81
82
  notebookContext=NotebookContext(),
@@ -86,6 +87,7 @@ def sample_plan_request():
86
87
  def sample_chat_request():
87
88
  """Sample chat request for testing"""
88
89
  from hdsp_agent_core.models.chat import ChatRequest
90
+
89
91
  return ChatRequest(
90
92
  message="Hello, how can I analyze this data?",
91
93
  conversationId="test-conversation",
@@ -96,6 +98,7 @@ def sample_chat_request():
96
98
  def sample_search_request():
97
99
  """Sample search request for testing"""
98
100
  from hdsp_agent_core.models.rag import SearchRequest
101
+
99
102
  return SearchRequest(
100
103
  query="pandas dataframe operations",
101
104
  top_k=5,
@@ -137,7 +137,7 @@ class TestServiceFactoryInitialization:
137
137
  # Mock the RAG service initialization
138
138
  with patch(
139
139
  "hdsp_agent_core.services.rag_service.EmbeddedRAGService.initialize",
140
- new_callable=AsyncMock
140
+ new_callable=AsyncMock,
141
141
  ):
142
142
  factory = ServiceFactory.get_instance()
143
143
  await factory.initialize()
@@ -241,7 +241,7 @@ class TestServiceFactoryModeSpecificServices:
241
241
  # Mock RAG initialization
242
242
  with patch(
243
243
  "hdsp_agent_core.services.rag_service.EmbeddedRAGService.initialize",
244
- new_callable=AsyncMock
244
+ new_callable=AsyncMock,
245
245
  ):
246
246
  factory = ServiceFactory.get_instance()
247
247
  await factory.initialize()
@@ -18,10 +18,8 @@ class TestProxyAgentService:
18
18
  def proxy_agent_service(self):
19
19
  """Create ProxyAgentService instance"""
20
20
  from hdsp_agent_core.services.agent_service import ProxyAgentService
21
- return ProxyAgentService(
22
- base_url="http://localhost:8000",
23
- timeout=30.0
24
- )
21
+
22
+ return ProxyAgentService(base_url="http://localhost:8000", timeout=30.0)
25
23
 
26
24
  def test_implements_interface(self, proxy_agent_service):
27
25
  """Test ProxyAgentService implements IAgentService"""
@@ -41,12 +39,8 @@ class TestProxyAgentService:
41
39
  ):
42
40
  """Test generate_plan makes HTTP POST request"""
43
41
  mock_response_data = {
44
- "plan": {
45
- "goal": "Create a simple plot",
46
- "totalSteps": 1,
47
- "steps": []
48
- },
49
- "reasoning": "Test reasoning"
42
+ "plan": {"goal": "Create a simple plot", "totalSteps": 1, "steps": []},
43
+ "reasoning": "Test reasoning",
50
44
  }
51
45
 
52
46
  with patch(
@@ -76,10 +70,8 @@ class TestProxyChatService:
76
70
  def proxy_chat_service(self):
77
71
  """Create ProxyChatService instance"""
78
72
  from hdsp_agent_core.services.chat_service import ProxyChatService
79
- return ProxyChatService(
80
- base_url="http://localhost:8000",
81
- timeout=30.0
82
- )
73
+
74
+ return ProxyChatService(base_url="http://localhost:8000", timeout=30.0)
83
75
 
84
76
  def test_implements_interface(self, proxy_chat_service):
85
77
  """Test ProxyChatService implements IChatService"""
@@ -119,10 +111,8 @@ class TestProxyRAGService:
119
111
  def proxy_rag_service(self):
120
112
  """Create ProxyRAGService instance"""
121
113
  from hdsp_agent_core.services.rag_service import ProxyRAGService
122
- return ProxyRAGService(
123
- base_url="http://localhost:8000",
124
- timeout=30.0
125
- )
114
+
115
+ return ProxyRAGService(base_url="http://localhost:8000", timeout=30.0)
126
116
 
127
117
  def test_implements_interface(self, proxy_rag_service):
128
118
  """Test ProxyRAGService implements IRAGService"""
@@ -189,6 +179,7 @@ class TestEmbeddedAgentService:
189
179
  def embedded_agent_service(self):
190
180
  """Create EmbeddedAgentService instance"""
191
181
  from hdsp_agent_core.services.agent_service import EmbeddedAgentService
182
+
192
183
  return EmbeddedAgentService()
193
184
 
194
185
  def test_implements_interface(self, embedded_agent_service):
@@ -202,7 +193,7 @@ class TestEmbeddedAgentService:
202
193
  """Test generate_plan calls LLM service"""
203
194
  # Mock the LLM service
204
195
  with patch.object(
205
- embedded_agent_service, '_llm_service', create=True
196
+ embedded_agent_service, "_llm_service", create=True
206
197
  ) as mock_llm:
207
198
  mock_llm.generate_response = AsyncMock(
208
199
  return_value='{"steps": [], "plan_id": "test"}'
@@ -219,6 +210,7 @@ class TestEmbeddedChatService:
219
210
  def embedded_chat_service(self):
220
211
  """Create EmbeddedChatService instance"""
221
212
  from hdsp_agent_core.services.chat_service import EmbeddedChatService
213
+
222
214
  return EmbeddedChatService()
223
215
 
224
216
  def test_implements_interface(self, embedded_chat_service):
@@ -233,6 +225,7 @@ class TestEmbeddedRAGService:
233
225
  def embedded_rag_service(self):
234
226
  """Create EmbeddedRAGService instance with mocked RAG manager"""
235
227
  from hdsp_agent_core.services.rag_service import EmbeddedRAGService
228
+
236
229
  service = EmbeddedRAGService()
237
230
  return service
238
231
 
@@ -722,7 +722,7 @@
722
722
  "@mui/material": {},
723
723
  "react-markdown": {},
724
724
  "hdsp-agent": {
725
- "version": "2.0.8",
725
+ "version": "2.0.11",
726
726
  "singleton": true,
727
727
  "import": "/Users/a421721/Desktop/hdsp/hdsp_agent/extensions/jupyter/lib/index.js"
728
728
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hdsp-agent",
3
- "version": "2.0.8",
3
+ "version": "2.0.11",
4
4
  "description": "HDSP Agent JupyterLab Extension - Thin client for Agent Server",
5
5
  "keywords": [
6
6
  "jupyter",
@@ -127,7 +127,7 @@
127
127
  }
128
128
  },
129
129
  "_build": {
130
- "load": "static/remoteEntry.020cdb0b864cfaa4e41e.js",
130
+ "load": "static/remoteEntry.9da31d1134a53b0c4af5.js",
131
131
  "extension": "./extension",
132
132
  "style": "./style"
133
133
  }