julee 0.1.7__py3-none-any.whl → 0.1.8__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.
@@ -319,3 +319,146 @@ class TestAnthropicKnowledgeService:
319
319
  assert call_args[1]["model"] == anthropic_ks_module.DEFAULT_MODEL
320
320
  assert call_args[1]["max_tokens"] == anthropic_ks_module.DEFAULT_MAX_TOKENS
321
321
  assert "temperature" not in call_args[1] # Not set by default
322
+
323
+ @patch.dict("os.environ", {"ANTHROPIC_API_KEY": "test-key"})
324
+ async def test_execute_query_with_json_assistant_prompt(
325
+ self,
326
+ knowledge_service_config: KnowledgeServiceConfig,
327
+ ) -> None:
328
+ """Test execute_query with assistant prompt that starts with { for JSON parsing."""
329
+ # Mock response that would be concatenated with {
330
+ mock_client = MagicMock()
331
+ mock_response = MagicMock()
332
+ mock_content_block = MagicMock()
333
+ mock_content_block.type = "text"
334
+ mock_content_block.text = '"name": "John", "age": 30}'
335
+ mock_response.content = [mock_content_block]
336
+ mock_response.usage.input_tokens = 100
337
+ mock_response.usage.output_tokens = 20
338
+ mock_response.stop_reason = "end_turn"
339
+ mock_client.messages.create = AsyncMock(return_value=mock_response)
340
+
341
+ with patch(
342
+ "julee.services.knowledge_service.anthropic.knowledge_service.AsyncAnthropic"
343
+ ) as mock_anthropic:
344
+ mock_anthropic.return_value = mock_client
345
+
346
+ service = anthropic_ks.AnthropicKnowledgeService()
347
+
348
+ query_text = "What is the person's data?"
349
+ output_schema = {
350
+ "type": "object",
351
+ "properties": {"name": {"type": "string"}, "age": {"type": "number"}},
352
+ "required": ["name", "age"],
353
+ "additionalProperties": False,
354
+ }
355
+ assistant_prompt = "{"
356
+
357
+ result = await service.execute_query(
358
+ knowledge_service_config,
359
+ query_text,
360
+ output_schema=output_schema,
361
+ assistant_prompt=assistant_prompt,
362
+ )
363
+
364
+ # Verify the response was parsed as JSON after concatenation
365
+ assert result.result_data["response"] == {"name": "John", "age": 30}
366
+ assert isinstance(result.result_data["response"], dict)
367
+
368
+ # Verify API call included assistant message
369
+ mock_client.messages.create.assert_called_once()
370
+ call_args = mock_client.messages.create.call_args
371
+ messages = call_args[1]["messages"]
372
+ assert len(messages) == 2
373
+ assert messages[0]["role"] == "user"
374
+ assert messages[1]["role"] == "assistant"
375
+ assert messages[1]["content"] == "{"
376
+
377
+ @patch.dict("os.environ", {"ANTHROPIC_API_KEY": "test-key"})
378
+ async def test_execute_query_with_schema_but_no_assistant_prompt(
379
+ self,
380
+ knowledge_service_config: KnowledgeServiceConfig,
381
+ ) -> None:
382
+ """Test execute_query with schema but no assistant prompt - should parse response directly."""
383
+ # Mock response with complete JSON
384
+ mock_client = MagicMock()
385
+ mock_response = MagicMock()
386
+ mock_content_block = MagicMock()
387
+ mock_content_block.type = "text"
388
+ mock_content_block.text = '{"name": "Jane", "age": 25}'
389
+ mock_response.content = [mock_content_block]
390
+ mock_response.usage.input_tokens = 100
391
+ mock_response.usage.output_tokens = 20
392
+ mock_response.stop_reason = "end_turn"
393
+ mock_client.messages.create = AsyncMock(return_value=mock_response)
394
+
395
+ with patch(
396
+ "julee.services.knowledge_service.anthropic.knowledge_service.AsyncAnthropic"
397
+ ) as mock_anthropic:
398
+ mock_anthropic.return_value = mock_client
399
+
400
+ service = anthropic_ks.AnthropicKnowledgeService()
401
+
402
+ query_text = "What is the person's data?"
403
+ output_schema = {
404
+ "type": "object",
405
+ "properties": {"name": {"type": "string"}, "age": {"type": "number"}},
406
+ "required": ["name", "age"],
407
+ "additionalProperties": False,
408
+ }
409
+
410
+ result = await service.execute_query(
411
+ knowledge_service_config,
412
+ query_text,
413
+ output_schema=output_schema,
414
+ )
415
+
416
+ # Verify the response was parsed as JSON directly
417
+ assert result.result_data["response"] == {"name": "Jane", "age": 25}
418
+ assert isinstance(result.result_data["response"], dict)
419
+
420
+ # Verify API call had no assistant message
421
+ mock_client.messages.create.assert_called_once()
422
+ call_args = mock_client.messages.create.call_args
423
+ messages = call_args[1]["messages"]
424
+ assert len(messages) == 1
425
+ assert messages[0]["role"] == "user"
426
+
427
+ @patch.dict("os.environ", {"ANTHROPIC_API_KEY": "test-key"})
428
+ async def test_execute_query_json_parse_error_with_schema(
429
+ self,
430
+ knowledge_service_config: KnowledgeServiceConfig,
431
+ ) -> None:
432
+ """Test execute_query raises ValueError when JSON parsing fails with schema."""
433
+ # Mock response with invalid JSON
434
+ mock_client = MagicMock()
435
+ mock_response = MagicMock()
436
+ mock_content_block = MagicMock()
437
+ mock_content_block.type = "text"
438
+ mock_content_block.text = '"name": "John", invalid json}'
439
+ mock_response.content = [mock_content_block]
440
+ mock_response.usage.input_tokens = 100
441
+ mock_response.usage.output_tokens = 20
442
+ mock_response.stop_reason = "end_turn"
443
+ mock_client.messages.create = AsyncMock(return_value=mock_response)
444
+
445
+ with patch(
446
+ "julee.services.knowledge_service.anthropic.knowledge_service.AsyncAnthropic"
447
+ ) as mock_anthropic:
448
+ mock_anthropic.return_value = mock_client
449
+
450
+ service = anthropic_ks.AnthropicKnowledgeService()
451
+
452
+ output_schema = {"type": "object", "additionalProperties": False}
453
+ assistant_prompt = "{"
454
+
455
+ with pytest.raises(
456
+ ValueError,
457
+ match="Expected valid JSON response when output schema provided",
458
+ ):
459
+ await service.execute_query(
460
+ knowledge_service_config,
461
+ "Test query",
462
+ output_schema=output_schema,
463
+ assistant_prompt=assistant_prompt,
464
+ )
@@ -47,6 +47,7 @@ class ConfigurableKnowledgeService(KnowledgeService):
47
47
  self,
48
48
  config: KnowledgeServiceConfig,
49
49
  query_text: str,
50
+ output_schema: dict[str, Any] | None = None,
50
51
  service_file_ids: list[str] | None = None,
51
52
  query_metadata: dict[str, Any] | None = None,
52
53
  assistant_prompt: str | None = None,
@@ -56,6 +57,7 @@ class ConfigurableKnowledgeService(KnowledgeService):
56
57
  return await service.execute_query(
57
58
  config=config,
58
59
  query_text=query_text,
60
+ output_schema=output_schema,
59
61
  service_file_ids=service_file_ids,
60
62
  query_metadata=query_metadata,
61
63
  assistant_prompt=assistant_prompt,
@@ -111,6 +111,7 @@ class KnowledgeService(Protocol):
111
111
  self,
112
112
  config: "KnowledgeServiceConfig",
113
113
  query_text: str,
114
+ output_schema: dict[str, Any] | None = None,
114
115
  service_file_ids: list[str] | None = None,
115
116
  query_metadata: dict[str, Any] | None = None,
116
117
  assistant_prompt: str | None = None,
@@ -124,6 +125,10 @@ class KnowledgeService(Protocol):
124
125
  Args:
125
126
  config: KnowledgeServiceConfig for the service to use
126
127
  query_text: The query to execute (natural language or structured)
128
+ output_schema: Optional JSON schema for structured response.
129
+ When provided, the service will attempt to return
130
+ results conforming to this schema using structured
131
+ outputs or schema-guided prompting.
127
132
  service_file_ids: Optional list of service file IDs to provide as
128
133
  context for the query. These are the IDs returned
129
134
  by the knowledge service from register_file
@@ -7,6 +7,7 @@ configurable canned query responses. Useful for testing and development
7
7
  scenarios where external service dependencies should be avoided.
8
8
  """
9
9
 
10
+ import json
10
11
  import logging
11
12
  from collections import deque
12
13
  from datetime import datetime, timezone
@@ -204,6 +205,7 @@ class MemoryKnowledgeService(KnowledgeService):
204
205
  self,
205
206
  config: KnowledgeServiceConfig,
206
207
  query_text: str,
208
+ output_schema: dict[str, Any] | None = None,
207
209
  service_file_ids: list[str] | None = None,
208
210
  query_metadata: dict[str, Any] | None = None,
209
211
  assistant_prompt: str | None = None,
@@ -213,9 +215,9 @@ class MemoryKnowledgeService(KnowledgeService):
213
215
  Args:
214
216
  config: KnowledgeServiceConfig for this operation
215
217
  query_text: The query to execute
218
+ output_schema: Optional JSON schema for structured response
216
219
  service_file_ids: Optional list of service file IDs for query
217
- query_metadata: Optional service-specific metadata (ignored in
218
- memory implementation)
220
+ query_metadata: Optional service-specific metadata
219
221
  assistant_prompt: Optional assistant message content (ignored in
220
222
  memory implementation)
221
223
 
@@ -225,12 +227,29 @@ class MemoryKnowledgeService(KnowledgeService):
225
227
  Raises:
226
228
  ValueError: If no canned query results are available
227
229
  """
230
+ # Handle schema embedding if provided (same as Anthropic service)
231
+ if output_schema:
232
+ # Build query with embedded schema
233
+ schema_json = json.dumps(output_schema, indent=2)
234
+ enhanced_query_text = f"""{query_text}
235
+
236
+ Please structure your response according to this JSON schema:
237
+ {schema_json}
238
+
239
+ Return only valid JSON that conforms to this schema, without any surrounding
240
+ text or markdown formatting."""
241
+ has_schema = True
242
+ else:
243
+ enhanced_query_text = query_text
244
+ has_schema = False
245
+
228
246
  logger.debug(
229
247
  "Executing query with MemoryKnowledgeService",
230
248
  extra={
231
249
  "knowledge_service_id": config.knowledge_service_id,
232
- "query_text": query_text,
250
+ "query_text": enhanced_query_text,
233
251
  "document_count": (len(service_file_ids) if service_file_ids else 0),
252
+ "has_output_schema": has_schema,
234
253
  },
235
254
  )
236
255
 
@@ -252,12 +271,17 @@ class MemoryKnowledgeService(KnowledgeService):
252
271
  # Pop and return the next canned result
253
272
  result = self._canned_query_results.popleft()
254
273
 
274
+ # For memory service, the canned response should already be a parsed object
275
+ # This maintains compatibility with existing tests regardless of schema presence
276
+ response_value = result.result_data.get("response")
277
+
255
278
  # Update the result to reflect the actual query parameters
256
279
  updated_result = QueryResult(
257
280
  query_id=result.query_id,
258
- query_text=query_text, # Use actual query text
281
+ query_text=enhanced_query_text if has_schema else query_text,
259
282
  result_data={
260
283
  **result.result_data,
284
+ "response": response_value,
261
285
  "queried_documents": service_file_ids or [],
262
286
  "service": "memory",
263
287
  "knowledge_service_id": config.knowledge_service_id,
@@ -245,7 +245,7 @@ class TestMemoryKnowledgeService:
245
245
  memory_service.add_canned_query_result(sample_query_result)
246
246
 
247
247
  result = await memory_service.execute_query(
248
- knowledge_service_config, query_text, document_ids
248
+ knowledge_service_config, query_text, service_file_ids=document_ids
249
249
  )
250
250
 
251
251
  # Should return updated result with actual query parameters
@@ -243,9 +243,9 @@ def temporal_workflow_proxy(
243
243
  retry_methods_set = set(retry_methods or [])
244
244
 
245
245
  # Create default retry policy for methods that need it
246
- fail_fast_retry_policy = RetryPolicy(
246
+ default_retry_policy = RetryPolicy(
247
247
  initial_interval=timedelta(seconds=1),
248
- maximum_attempts=1,
248
+ maximum_attempts=4,
249
249
  backoff_coefficient=1.0,
250
250
  maximum_interval=timedelta(seconds=1),
251
251
  )
@@ -315,7 +315,7 @@ def temporal_workflow_proxy(
315
315
 
316
316
  # Add retry policy if this method needs it
317
317
  if method_name in retry_methods_set:
318
- retry_policy = fail_fast_retry_policy
318
+ retry_policy = default_retry_policy
319
319
 
320
320
  # Log the call
321
321
  logger.debug(
@@ -408,7 +408,7 @@ def temporal_workflow_proxy(
408
408
  super(cls, proxy_self).__init__()
409
409
  # Set instance variables for consistency with manual pattern
410
410
  proxy_self.activity_timeout = timedelta(seconds=default_timeout_seconds)
411
- proxy_self.activity_fail_fast_retry_policy = fail_fast_retry_policy
411
+ proxy_self.activity_default_retry_policy = default_retry_policy
412
412
  logger.debug(f"Initialized {cls.__name__}")
413
413
 
414
414
  cls.__init__ = __init__
@@ -682,7 +682,7 @@ class TestWorkflowProxyIntegration:
682
682
 
683
683
  # Check instance attributes
684
684
  assert hasattr(proxy, "activity_timeout")
685
- assert hasattr(proxy, "activity_fail_fast_retry_policy")
685
+ assert hasattr(proxy, "activity_default_retry_policy")
686
686
 
687
687
  def test_different_repositories_get_different_types(self) -> None:
688
688
  """Test that different repositories extract their respective types."""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: julee
3
- Version: 0.1.7
3
+ Version: 0.1.8
4
4
  Summary: Julee - Clean architecture for accountable and transparent digital supply chains
5
5
  Author-email: Pyx Industries <chris@pyx.io>
6
6
  License: GPL-3.0
@@ -1,4 +1,4 @@
1
- julee/__init__.py,sha256=lpc7dyHUdS7URdXnMUEbipojCJcSEniK4Dc9VTO_Q6Y,111
1
+ julee/__init__.py,sha256=R9tfeeZks10ifpwqvOXycLbfcvUoDB1hFJX4DGHNSMk,111
2
2
  julee/worker.py,sha256=26k7LkpLft8emjVsSRCK7VmbtTEaBxjokX_5CC52LDM,7231
3
3
  julee/api/__init__.py,sha256=bJECAJifuV-pochMVeDqKhQ63jvXel3W4Y0_NK9gn8s,801
4
4
  julee/api/app.py,sha256=I4a7fi9rE_0r92jmMusOxlcMalFnTy8qb4yyxKYg6-Q,4955
@@ -160,11 +160,11 @@ julee/domain/models/assembly/tests/factories.py,sha256=8piauYltuzpNkX5I2g5PJ9bxX
160
160
  julee/domain/models/assembly/tests/test_assembly.py,sha256=4eKIjpAeN0XoFRFDpaShjh7pOsTEy6QzXm1TshOJwvg,16460
161
161
  julee/domain/models/assembly_specification/__init__.py,sha256=8oHXxCUAwplrL1lTKNyLQg7QxFapmPgroU0W6TMWTNA,804
162
162
  julee/domain/models/assembly_specification/assembly_specification.py,sha256=bolyMo8eubj--W5k9yC_CZLU-99eXPTkSPtwjHcJmho,6783
163
- julee/domain/models/assembly_specification/knowledge_service_query.py,sha256=daVcEsOWN45Z0rjMAkTAiU8M8yiqrHUvCW1wchxsN-4,4282
163
+ julee/domain/models/assembly_specification/knowledge_service_query.py,sha256=cC9LChu7oIY_zie38lOTnu-RaH4_AwAfLz8-ZdDxN9Y,4275
164
164
  julee/domain/models/assembly_specification/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
165
165
  julee/domain/models/assembly_specification/tests/factories.py,sha256=CfVY65UW9PtC3isPervUH5pvtzquiHhxClyCG1LqAro,2370
166
166
  julee/domain/models/assembly_specification/tests/test_assembly_specification.py,sha256=AyW8eepsUAaY_TcE7zrQBl8lxE3o06i0ux26nECE9UE,18220
167
- julee/domain/models/assembly_specification/tests/test_knowledge_service_query.py,sha256=nEmLzAgSUaPfXnYPeuqyuidyjU39ah-Zp1NAK04SfGI,10442
167
+ julee/domain/models/assembly_specification/tests/test_knowledge_service_query.py,sha256=m_qaoNVITbQ-307jJVcNKXIrFEBmPBoy4rBGB2gv5Lc,10421
168
168
  julee/domain/models/custom_fields/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
169
169
  julee/domain/models/custom_fields/content_stream.py,sha256=DRpGjMSUuUwOzbJW-_pVy43IgvqQYn_Qi0612QJjlpY,2348
170
170
  julee/domain/models/custom_fields/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -194,16 +194,18 @@ julee/domain/repositories/knowledge_service_query.py,sha256=9qrWMLT9Xxms9Q7fMjBb
194
194
  julee/domain/repositories/policy.py,sha256=-1Miwk_wmblr9QqVb4aZ_ajk9YIwPUXhxfhGG5CTuFQ,1874
195
195
  julee/domain/use_cases/__init__.py,sha256=rKJyunXCHorEyxPfKDEYD27kese53e5spCfFTbDxpOc,534
196
196
  julee/domain/use_cases/decorators.py,sha256=mMlR5ws94frAZEUEjj545cZpwnTimZI6JVpMlGu3EpA,3497
197
- julee/domain/use_cases/extract_assemble_data.py,sha256=D7w63bR-3WXpwDaj2SH_L4ZO-pp4lHWV-K0--xLa7Qs,24946
197
+ julee/domain/use_cases/extract_assemble_data.py,sha256=6ZJszs6bVI_CUjBaEutTKFtQxAQZygpFjFtg4HIja3s,23353
198
198
  julee/domain/use_cases/initialize_system_data.py,sha256=CIYasO96HQMKXh098Gw3r2rerPKsVXRRVLsxnSJnVfo,31330
199
- julee/domain/use_cases/validate_document.py,sha256=noLzQp4hSJVAr-hL668ywxe4m7aNv2yuBMZzPgJPpIs,28219
199
+ julee/domain/use_cases/pointable_json_schema.py,sha256=-e8EJ9F4LfDhTDNugv7xxLNSb3WguKGBnZUS6Ci7Mek,4028
200
+ julee/domain/use_cases/validate_document.py,sha256=zVrvZQgyqTsE6_W3GiYlg8NupEK89y1q5ZDqNFpiuiE,28297
200
201
  julee/domain/use_cases/tests/__init__.py,sha256=xKgoU78i5zK5mlZ2NNfp8nhbnb9fIcNwCTcQD0j9gEw,199
201
- julee/domain/use_cases/tests/test_extract_assemble_data.py,sha256=erhTWfHx-FnoFVL1Kg8aT6hM4bd7-ewyuQwB_8f17T4,21627
202
+ julee/domain/use_cases/tests/test_extract_assemble_data.py,sha256=kC_bfAU37pBuSyzGc9cVDYgNgl1TScLSiZoimp4EWkM,27298
202
203
  julee/domain/use_cases/tests/test_initialize_system_data.py,sha256=1IyjuNPMBdnqCqn425vQpHrpVFJtvi_6N3hC6i2LoFE,17949
204
+ julee/domain/use_cases/tests/test_pointable_json_schema.py,sha256=OUkQA6FW1-3Wkm40qKVqCitEkHch1_U4tGkgkxdoZZ8,15970
203
205
  julee/domain/use_cases/tests/test_validate_document.py,sha256=JVMx3pXUbzYMLnT3Ah3UnCN8TUzEFzBv_D-QuKGelcw,50953
204
206
  julee/fixtures/documents.yaml,sha256=QMPbdMtjvsf08iFuNa4U2Kx7nTIGVpeRMlp-eeW9dY0,4918
205
207
  julee/fixtures/knowledge_service_configs.yaml,sha256=SfJO1SJFzYtF2Y7XTZmhl3d9Eiv2-xMrHKW1kI7NhI0,1378
206
- julee/fixtures/knowledge_service_queries.yaml,sha256=uYKD24jMIBhHjGaItyDVqtRlHLVeIRCw8XfhNjiMENk,2447
208
+ julee/fixtures/knowledge_service_queries.yaml,sha256=aBN84Ni2rk3pqJnKGgxqx8IbEOrpKdPg_rxPHygCgO4,1799
207
209
  julee/maintenance/__init__.py,sha256=tThzvZBQ4bTSiXVfLVuHI2uLQOhZRMfND1ndj26BNu0,65
208
210
  julee/maintenance/release.py,sha256=DavyBtyFb-hngtg8K36LjNx76DfrPDgFUbZePDW2lhk,7733
209
211
  julee/repositories/__init__.py,sha256=mJpDFYP5f4LBhavYSnC3SnTcWnozMCz7aXje4iB5pyU,571
@@ -245,15 +247,15 @@ julee/repositories/temporal/activity_names.py,sha256=qg0ZJvnMPaTHHnu9fHxzsDTjUb5
245
247
  julee/repositories/temporal/proxies.py,sha256=eKNEOD_HuNeDxA62eJpR_Zf2KpZ-xnL91UKsV7_aXVc,4783
246
248
  julee/services/__init__.py,sha256=LNoQvHMWQi1YMQW0xWw9KeTHOVMsYdhLj-nvu4HClFU,560
247
249
  julee/services/knowledge_service/__init__.py,sha256=xsrMieT-IezlINBEAkM9KAMy5ZDODQqDtbqpK8DMhXM,1148
248
- julee/services/knowledge_service/factory.py,sha256=gLRkbrmALuL7rqsuaqWJqHm6TllgsbYCe0RrvDIBfYE,4605
249
- julee/services/knowledge_service/knowledge_service.py,sha256=-CT_bAPi6oZm_TB7hVh5E6Q2EWAC9kFWvLfWGhR8h2M,6384
250
+ julee/services/knowledge_service/factory.py,sha256=j2aAwTrpr0TA6cIm2IjhdTP03XSnNxK2WtVfURSy3dc,4699
251
+ julee/services/knowledge_service/knowledge_service.py,sha256=3VzVTTnjVl4oAzF5zNyN5FWH0vNiwwaNdKLcN9PYDBM,6725
250
252
  julee/services/knowledge_service/test_factory.py,sha256=FKuzOooeNKdbJU6S-LmqT6Q6ZYo_6sVAV7MUVQKBCLI,3956
251
253
  julee/services/knowledge_service/anthropic/__init__.py,sha256=eO_85w4dd9hgzcnsqMoE0bvcjBtTuIhyQ0vqdPHdoQ4,297
252
- julee/services/knowledge_service/anthropic/knowledge_service.py,sha256=WtpQl9QTvNo6mAS7A-L18FHddJ7eF8BVYMIopEZdnVQ,11918
253
- julee/services/knowledge_service/anthropic/tests/test_knowledge_service.py,sha256=hN2W-0XL2cPFOyuib6tLvvA7S0YaK-2C4yNfhKG8ahw,12941
254
+ julee/services/knowledge_service/anthropic/knowledge_service.py,sha256=wNljMvdZFyxEjDBnc2o5Q_D8jBdJcWhj3fvuF-vVCFo,14069
255
+ julee/services/knowledge_service/anthropic/tests/test_knowledge_service.py,sha256=rUBhqgB1bSvb9RM41Y_V9DR4djANHw6N1hRVFMjDTtw,19010
254
256
  julee/services/knowledge_service/memory/__init__.py,sha256=QgAw_Bt3ctn2S2c2OeTwOSADqEx-UIsG1dnoyITifW0,364
255
- julee/services/knowledge_service/memory/knowledge_service.py,sha256=HATVCtJATkYAcZ_t13fSVrGtxeJZUZjlN1C4iMVPjEY,9954
256
- julee/services/knowledge_service/memory/test_knowledge_service.py,sha256=0mFSmJtGjTulQgl0s10ior2R3SWVzQLU0hzkjQ1eSxw,13004
257
+ julee/services/knowledge_service/memory/knowledge_service.py,sha256=WXY5YvIdXSyWV83nRgx-k4M7qrrIwQTR6AA3j719Nrc,10947
258
+ julee/services/knowledge_service/memory/test_knowledge_service.py,sha256=zZkqQjRS4eFq4IxHdgETiJfVPX7d_03N1je9EDF8iR0,13021
257
259
  julee/services/temporal/__init__.py,sha256=xPfg55wTler89fH4NbAt7uawGOJlz8vQiKJzi7ONAHM,1376
258
260
  julee/services/temporal/activities.py,sha256=UhXDt50tJbaKQ6n1BpQWs3lUBY9UuTdhS0hiov2k5-w,3319
259
261
  julee/services/temporal/activity_names.py,sha256=OG0XqCLt40m8h7nglV-k6K5Oyk9bUexND9M1OJ2zfoo,817
@@ -272,17 +274,17 @@ julee/util/repos/temporal/proxies/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeR
272
274
  julee/util/repos/temporal/proxies/file_storage.py,sha256=djmIlKn2yrRHvk5j9SRv7GuwPuVHh9gXFt-_m7uxLis,2458
273
275
  julee/util/temporal/__init__.py,sha256=86xXEL8K5NAhT4s2H1uov8jV68NLkJiCZl2GDJaLnPg,491
274
276
  julee/util/temporal/activities.py,sha256=j-xV12x-5KJQWT1I8_KhIWtPVYysLJo9A2Xwx4e31bc,4383
275
- julee/util/temporal/decorators.py,sha256=MJzQcp7jD6jAzcwE-o3uKpIZy5r0H5I6hn72fBtHbic,17984
277
+ julee/util/temporal/decorators.py,sha256=5CRkIKVKfBGD1qmjTZ1Gmfgagwp0bgE7GMwENXonhC4,17976
276
278
  julee/util/tests/__init__.py,sha256=guP9qBQwD15l3fIX1kYS8v67pKHAHOCCqib9Us_eJ1Y,61
277
- julee/util/tests/test_decorators.py,sha256=FXyJRHETk4C6zv-STdvaVfJy4Fz6zgxkbm2HOaj0NoA,27456
279
+ julee/util/tests/test_decorators.py,sha256=0tRCoSyQtwUi1-ZaiMlS9Xd7KGy4yV2wh9J0oWNI8lU,27454
278
280
  julee/util/validation/__init__.py,sha256=Jp8A3iXEvLRaj07Z2UPnOBVO2QAUOW5ITCwMdLAgQyw,769
279
281
  julee/util/validation/repository.py,sha256=li0bLav8ZpRqPe7aaOaZQQItdf_Ll-ZWJs7NpF8nmm0,3135
280
282
  julee/util/validation/type_guards.py,sha256=sH9NfnrWAOQnLKQQNpJRdz1ygkt5nTUmKyjVDOE8iME,12548
281
283
  julee/workflows/__init__.py,sha256=sHXZm4EPvsch6IYcJGqGuPJIep8XZQ8XvEju5b34tTs,724
282
284
  julee/workflows/extract_assemble.py,sha256=ZldmLdwwn1LomDJg4gNGYrnY87tiXtU8em3-l_fqLGs,7876
283
285
  julee/workflows/validate_document.py,sha256=Cwl-XgcQWeVCC-cGOAslS1vCjQosiWUi79c2uQfTYNc,8230
284
- julee-0.1.7.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
285
- julee-0.1.7.dist-info/METADATA,sha256=ng2LD3HdJe4ER49Y8VqVAUDPk-qujgfjPOgNBYPSR_g,4454
286
- julee-0.1.7.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
287
- julee-0.1.7.dist-info/top_level.txt,sha256=woyPXhn9n-aM3oekZ341P1enrjj6nIcTwOxQL32VCLc,6
288
- julee-0.1.7.dist-info/RECORD,,
286
+ julee-0.1.8.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
287
+ julee-0.1.8.dist-info/METADATA,sha256=41d1fSBvm9TJRzzMfmbO1WgCJdnb8E3_liBA46INUKg,4454
288
+ julee-0.1.8.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
289
+ julee-0.1.8.dist-info/top_level.txt,sha256=woyPXhn9n-aM3oekZ341P1enrjj6nIcTwOxQL32VCLc,6
290
+ julee-0.1.8.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.9.0)
2
+ Generator: setuptools (80.10.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5