empathy-framework 5.3.0__py3-none-any.whl → 5.4.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- empathy_framework-5.4.0.dist-info/METADATA +47 -0
- empathy_framework-5.4.0.dist-info/RECORD +8 -0
- {empathy_framework-5.3.0.dist-info → empathy_framework-5.4.0.dist-info}/top_level.txt +0 -1
- empathy_healthcare_plugin/__init__.py +12 -11
- empathy_llm_toolkit/__init__.py +12 -26
- empathy_os/__init__.py +12 -356
- empathy_software_plugin/__init__.py +12 -11
- empathy_framework-5.3.0.dist-info/METADATA +0 -1026
- empathy_framework-5.3.0.dist-info/RECORD +0 -456
- empathy_framework-5.3.0.dist-info/entry_points.txt +0 -26
- empathy_framework-5.3.0.dist-info/licenses/LICENSE +0 -201
- empathy_framework-5.3.0.dist-info/licenses/LICENSE_CHANGE_ANNOUNCEMENT.md +0 -101
- empathy_healthcare_plugin/monitors/__init__.py +0 -9
- empathy_healthcare_plugin/monitors/clinical_protocol_monitor.py +0 -315
- empathy_healthcare_plugin/monitors/monitoring/__init__.py +0 -44
- empathy_healthcare_plugin/monitors/monitoring/protocol_checker.py +0 -300
- empathy_healthcare_plugin/monitors/monitoring/protocol_loader.py +0 -214
- empathy_healthcare_plugin/monitors/monitoring/sensor_parsers.py +0 -306
- empathy_healthcare_plugin/monitors/monitoring/trajectory_analyzer.py +0 -389
- empathy_healthcare_plugin/protocols/cardiac.json +0 -93
- empathy_healthcare_plugin/protocols/post_operative.json +0 -92
- empathy_healthcare_plugin/protocols/respiratory.json +0 -92
- empathy_healthcare_plugin/protocols/sepsis.json +0 -141
- empathy_llm_toolkit/README.md +0 -553
- empathy_llm_toolkit/agent_factory/__init__.py +0 -53
- empathy_llm_toolkit/agent_factory/adapters/__init__.py +0 -85
- empathy_llm_toolkit/agent_factory/adapters/autogen_adapter.py +0 -312
- empathy_llm_toolkit/agent_factory/adapters/crewai_adapter.py +0 -483
- empathy_llm_toolkit/agent_factory/adapters/haystack_adapter.py +0 -298
- empathy_llm_toolkit/agent_factory/adapters/langchain_adapter.py +0 -362
- empathy_llm_toolkit/agent_factory/adapters/langgraph_adapter.py +0 -333
- empathy_llm_toolkit/agent_factory/adapters/native.py +0 -228
- empathy_llm_toolkit/agent_factory/adapters/wizard_adapter.py +0 -423
- empathy_llm_toolkit/agent_factory/base.py +0 -305
- empathy_llm_toolkit/agent_factory/crews/__init__.py +0 -67
- empathy_llm_toolkit/agent_factory/crews/code_review.py +0 -1113
- empathy_llm_toolkit/agent_factory/crews/health_check.py +0 -1262
- empathy_llm_toolkit/agent_factory/crews/refactoring.py +0 -1128
- empathy_llm_toolkit/agent_factory/crews/security_audit.py +0 -1018
- empathy_llm_toolkit/agent_factory/decorators.py +0 -287
- empathy_llm_toolkit/agent_factory/factory.py +0 -558
- empathy_llm_toolkit/agent_factory/framework.py +0 -193
- empathy_llm_toolkit/agent_factory/memory_integration.py +0 -328
- empathy_llm_toolkit/agent_factory/resilient.py +0 -320
- empathy_llm_toolkit/agents_md/__init__.py +0 -22
- empathy_llm_toolkit/agents_md/loader.py +0 -218
- empathy_llm_toolkit/agents_md/parser.py +0 -271
- empathy_llm_toolkit/agents_md/registry.py +0 -307
- empathy_llm_toolkit/claude_memory.py +0 -466
- empathy_llm_toolkit/cli/__init__.py +0 -8
- empathy_llm_toolkit/cli/sync_claude.py +0 -487
- empathy_llm_toolkit/code_health.py +0 -1313
- empathy_llm_toolkit/commands/__init__.py +0 -51
- empathy_llm_toolkit/commands/context.py +0 -375
- empathy_llm_toolkit/commands/loader.py +0 -301
- empathy_llm_toolkit/commands/models.py +0 -231
- empathy_llm_toolkit/commands/parser.py +0 -371
- empathy_llm_toolkit/commands/registry.py +0 -429
- empathy_llm_toolkit/config/__init__.py +0 -29
- empathy_llm_toolkit/config/unified.py +0 -291
- empathy_llm_toolkit/context/__init__.py +0 -22
- empathy_llm_toolkit/context/compaction.py +0 -455
- empathy_llm_toolkit/context/manager.py +0 -434
- empathy_llm_toolkit/contextual_patterns.py +0 -361
- empathy_llm_toolkit/core.py +0 -907
- empathy_llm_toolkit/git_pattern_extractor.py +0 -435
- empathy_llm_toolkit/hooks/__init__.py +0 -24
- empathy_llm_toolkit/hooks/config.py +0 -306
- empathy_llm_toolkit/hooks/executor.py +0 -289
- empathy_llm_toolkit/hooks/registry.py +0 -302
- empathy_llm_toolkit/hooks/scripts/__init__.py +0 -39
- empathy_llm_toolkit/hooks/scripts/evaluate_session.py +0 -201
- empathy_llm_toolkit/hooks/scripts/first_time_init.py +0 -285
- empathy_llm_toolkit/hooks/scripts/pre_compact.py +0 -207
- empathy_llm_toolkit/hooks/scripts/session_end.py +0 -183
- empathy_llm_toolkit/hooks/scripts/session_start.py +0 -163
- empathy_llm_toolkit/hooks/scripts/suggest_compact.py +0 -225
- empathy_llm_toolkit/learning/__init__.py +0 -30
- empathy_llm_toolkit/learning/evaluator.py +0 -438
- empathy_llm_toolkit/learning/extractor.py +0 -514
- empathy_llm_toolkit/learning/storage.py +0 -560
- empathy_llm_toolkit/levels.py +0 -227
- empathy_llm_toolkit/pattern_confidence.py +0 -414
- empathy_llm_toolkit/pattern_resolver.py +0 -272
- empathy_llm_toolkit/pattern_summary.py +0 -350
- empathy_llm_toolkit/providers.py +0 -967
- empathy_llm_toolkit/routing/__init__.py +0 -32
- empathy_llm_toolkit/routing/model_router.py +0 -362
- empathy_llm_toolkit/security/IMPLEMENTATION_SUMMARY.md +0 -413
- empathy_llm_toolkit/security/PHASE2_COMPLETE.md +0 -384
- empathy_llm_toolkit/security/PHASE2_SECRETS_DETECTOR_COMPLETE.md +0 -271
- empathy_llm_toolkit/security/QUICK_REFERENCE.md +0 -316
- empathy_llm_toolkit/security/README.md +0 -262
- empathy_llm_toolkit/security/__init__.py +0 -62
- empathy_llm_toolkit/security/audit_logger.py +0 -929
- empathy_llm_toolkit/security/audit_logger_example.py +0 -152
- empathy_llm_toolkit/security/pii_scrubber.py +0 -640
- empathy_llm_toolkit/security/secrets_detector.py +0 -678
- empathy_llm_toolkit/security/secrets_detector_example.py +0 -304
- empathy_llm_toolkit/security/secure_memdocs.py +0 -1192
- empathy_llm_toolkit/security/secure_memdocs_example.py +0 -278
- empathy_llm_toolkit/session_status.py +0 -745
- empathy_llm_toolkit/state.py +0 -246
- empathy_llm_toolkit/utils/__init__.py +0 -5
- empathy_llm_toolkit/utils/tokens.py +0 -349
- empathy_os/adaptive/__init__.py +0 -13
- empathy_os/adaptive/task_complexity.py +0 -127
- empathy_os/agent_monitoring.py +0 -414
- empathy_os/cache/__init__.py +0 -117
- empathy_os/cache/base.py +0 -166
- empathy_os/cache/dependency_manager.py +0 -256
- empathy_os/cache/hash_only.py +0 -251
- empathy_os/cache/hybrid.py +0 -457
- empathy_os/cache/storage.py +0 -285
- empathy_os/cache_monitor.py +0 -356
- empathy_os/cache_stats.py +0 -298
- empathy_os/cli/__init__.py +0 -152
- empathy_os/cli/__main__.py +0 -12
- empathy_os/cli/commands/__init__.py +0 -1
- empathy_os/cli/commands/batch.py +0 -264
- empathy_os/cli/commands/cache.py +0 -248
- empathy_os/cli/commands/help.py +0 -331
- empathy_os/cli/commands/info.py +0 -140
- empathy_os/cli/commands/inspect.py +0 -436
- empathy_os/cli/commands/inspection.py +0 -57
- empathy_os/cli/commands/memory.py +0 -48
- empathy_os/cli/commands/metrics.py +0 -92
- empathy_os/cli/commands/orchestrate.py +0 -184
- empathy_os/cli/commands/patterns.py +0 -207
- empathy_os/cli/commands/profiling.py +0 -202
- empathy_os/cli/commands/provider.py +0 -98
- empathy_os/cli/commands/routing.py +0 -285
- empathy_os/cli/commands/setup.py +0 -96
- empathy_os/cli/commands/status.py +0 -235
- empathy_os/cli/commands/sync.py +0 -166
- empathy_os/cli/commands/tier.py +0 -121
- empathy_os/cli/commands/utilities.py +0 -114
- empathy_os/cli/commands/workflow.py +0 -579
- empathy_os/cli/core.py +0 -32
- empathy_os/cli/parsers/__init__.py +0 -68
- empathy_os/cli/parsers/batch.py +0 -118
- empathy_os/cli/parsers/cache.py +0 -65
- empathy_os/cli/parsers/help.py +0 -41
- empathy_os/cli/parsers/info.py +0 -26
- empathy_os/cli/parsers/inspect.py +0 -66
- empathy_os/cli/parsers/metrics.py +0 -42
- empathy_os/cli/parsers/orchestrate.py +0 -61
- empathy_os/cli/parsers/patterns.py +0 -54
- empathy_os/cli/parsers/provider.py +0 -40
- empathy_os/cli/parsers/routing.py +0 -110
- empathy_os/cli/parsers/setup.py +0 -42
- empathy_os/cli/parsers/status.py +0 -47
- empathy_os/cli/parsers/sync.py +0 -31
- empathy_os/cli/parsers/tier.py +0 -33
- empathy_os/cli/parsers/workflow.py +0 -77
- empathy_os/cli/utils/__init__.py +0 -1
- empathy_os/cli/utils/data.py +0 -242
- empathy_os/cli/utils/helpers.py +0 -68
- empathy_os/cli_legacy.py +0 -3957
- empathy_os/cli_minimal.py +0 -1159
- empathy_os/cli_router.py +0 -437
- empathy_os/cli_unified.py +0 -814
- empathy_os/config/__init__.py +0 -66
- empathy_os/config/xml_config.py +0 -286
- empathy_os/config.py +0 -545
- empathy_os/coordination.py +0 -870
- empathy_os/core.py +0 -1511
- empathy_os/core_modules/__init__.py +0 -15
- empathy_os/cost_tracker.py +0 -626
- empathy_os/dashboard/__init__.py +0 -41
- empathy_os/dashboard/app.py +0 -512
- empathy_os/dashboard/simple_server.py +0 -435
- empathy_os/dashboard/standalone_server.py +0 -547
- empathy_os/discovery.py +0 -306
- empathy_os/emergence.py +0 -306
- empathy_os/exceptions.py +0 -123
- empathy_os/feedback_loops.py +0 -373
- empathy_os/hot_reload/README.md +0 -473
- empathy_os/hot_reload/__init__.py +0 -62
- empathy_os/hot_reload/config.py +0 -83
- empathy_os/hot_reload/integration.py +0 -229
- empathy_os/hot_reload/reloader.py +0 -298
- empathy_os/hot_reload/watcher.py +0 -183
- empathy_os/hot_reload/websocket.py +0 -177
- empathy_os/levels.py +0 -577
- empathy_os/leverage_points.py +0 -441
- empathy_os/logging_config.py +0 -261
- empathy_os/mcp/__init__.py +0 -10
- empathy_os/mcp/server.py +0 -506
- empathy_os/memory/__init__.py +0 -237
- empathy_os/memory/claude_memory.py +0 -469
- empathy_os/memory/config.py +0 -224
- empathy_os/memory/control_panel.py +0 -1290
- empathy_os/memory/control_panel_support.py +0 -145
- empathy_os/memory/cross_session.py +0 -845
- empathy_os/memory/edges.py +0 -179
- empathy_os/memory/encryption.py +0 -159
- empathy_os/memory/file_session.py +0 -770
- empathy_os/memory/graph.py +0 -570
- empathy_os/memory/long_term.py +0 -913
- empathy_os/memory/long_term_types.py +0 -99
- empathy_os/memory/mixins/__init__.py +0 -25
- empathy_os/memory/mixins/backend_init_mixin.py +0 -249
- empathy_os/memory/mixins/capabilities_mixin.py +0 -208
- empathy_os/memory/mixins/handoff_mixin.py +0 -208
- empathy_os/memory/mixins/lifecycle_mixin.py +0 -49
- empathy_os/memory/mixins/long_term_mixin.py +0 -352
- empathy_os/memory/mixins/promotion_mixin.py +0 -109
- empathy_os/memory/mixins/short_term_mixin.py +0 -182
- empathy_os/memory/nodes.py +0 -179
- empathy_os/memory/redis_bootstrap.py +0 -540
- empathy_os/memory/security/__init__.py +0 -31
- empathy_os/memory/security/audit_logger.py +0 -932
- empathy_os/memory/security/pii_scrubber.py +0 -640
- empathy_os/memory/security/secrets_detector.py +0 -678
- empathy_os/memory/short_term.py +0 -2192
- empathy_os/memory/simple_storage.py +0 -302
- empathy_os/memory/storage/__init__.py +0 -15
- empathy_os/memory/storage_backend.py +0 -167
- empathy_os/memory/summary_index.py +0 -583
- empathy_os/memory/types.py +0 -446
- empathy_os/memory/unified.py +0 -182
- empathy_os/meta_workflows/__init__.py +0 -74
- empathy_os/meta_workflows/agent_creator.py +0 -248
- empathy_os/meta_workflows/builtin_templates.py +0 -567
- empathy_os/meta_workflows/cli_commands/__init__.py +0 -56
- empathy_os/meta_workflows/cli_commands/agent_commands.py +0 -321
- empathy_os/meta_workflows/cli_commands/analytics_commands.py +0 -442
- empathy_os/meta_workflows/cli_commands/config_commands.py +0 -232
- empathy_os/meta_workflows/cli_commands/memory_commands.py +0 -182
- empathy_os/meta_workflows/cli_commands/template_commands.py +0 -354
- empathy_os/meta_workflows/cli_commands/workflow_commands.py +0 -382
- empathy_os/meta_workflows/cli_meta_workflows.py +0 -59
- empathy_os/meta_workflows/form_engine.py +0 -292
- empathy_os/meta_workflows/intent_detector.py +0 -409
- empathy_os/meta_workflows/models.py +0 -569
- empathy_os/meta_workflows/pattern_learner.py +0 -738
- empathy_os/meta_workflows/plan_generator.py +0 -384
- empathy_os/meta_workflows/session_context.py +0 -397
- empathy_os/meta_workflows/template_registry.py +0 -229
- empathy_os/meta_workflows/workflow.py +0 -984
- empathy_os/metrics/__init__.py +0 -12
- empathy_os/metrics/collector.py +0 -31
- empathy_os/metrics/prompt_metrics.py +0 -194
- empathy_os/models/__init__.py +0 -172
- empathy_os/models/__main__.py +0 -13
- empathy_os/models/adaptive_routing.py +0 -437
- empathy_os/models/auth_cli.py +0 -444
- empathy_os/models/auth_strategy.py +0 -450
- empathy_os/models/cli.py +0 -655
- empathy_os/models/empathy_executor.py +0 -354
- empathy_os/models/executor.py +0 -257
- empathy_os/models/fallback.py +0 -762
- empathy_os/models/provider_config.py +0 -282
- empathy_os/models/registry.py +0 -472
- empathy_os/models/tasks.py +0 -359
- empathy_os/models/telemetry/__init__.py +0 -71
- empathy_os/models/telemetry/analytics.py +0 -594
- empathy_os/models/telemetry/backend.py +0 -196
- empathy_os/models/telemetry/data_models.py +0 -431
- empathy_os/models/telemetry/storage.py +0 -489
- empathy_os/models/token_estimator.py +0 -420
- empathy_os/models/validation.py +0 -280
- empathy_os/monitoring/__init__.py +0 -52
- empathy_os/monitoring/alerts.py +0 -946
- empathy_os/monitoring/alerts_cli.py +0 -448
- empathy_os/monitoring/multi_backend.py +0 -271
- empathy_os/monitoring/otel_backend.py +0 -362
- empathy_os/optimization/__init__.py +0 -19
- empathy_os/optimization/context_optimizer.py +0 -272
- empathy_os/orchestration/__init__.py +0 -67
- empathy_os/orchestration/agent_templates.py +0 -707
- empathy_os/orchestration/config_store.py +0 -499
- empathy_os/orchestration/execution_strategies.py +0 -2111
- empathy_os/orchestration/meta_orchestrator.py +0 -1168
- empathy_os/orchestration/pattern_learner.py +0 -696
- empathy_os/orchestration/real_tools.py +0 -931
- empathy_os/pattern_cache.py +0 -187
- empathy_os/pattern_library.py +0 -542
- empathy_os/patterns/debugging/all_patterns.json +0 -81
- empathy_os/patterns/debugging/workflow_20260107_1770825e.json +0 -77
- empathy_os/patterns/refactoring_memory.json +0 -89
- empathy_os/persistence.py +0 -564
- empathy_os/platform_utils.py +0 -265
- empathy_os/plugins/__init__.py +0 -28
- empathy_os/plugins/base.py +0 -361
- empathy_os/plugins/registry.py +0 -268
- empathy_os/project_index/__init__.py +0 -32
- empathy_os/project_index/cli.py +0 -335
- empathy_os/project_index/index.py +0 -667
- empathy_os/project_index/models.py +0 -504
- empathy_os/project_index/reports.py +0 -474
- empathy_os/project_index/scanner.py +0 -777
- empathy_os/project_index/scanner_parallel.py +0 -291
- empathy_os/prompts/__init__.py +0 -61
- empathy_os/prompts/config.py +0 -77
- empathy_os/prompts/context.py +0 -177
- empathy_os/prompts/parser.py +0 -285
- empathy_os/prompts/registry.py +0 -313
- empathy_os/prompts/templates.py +0 -208
- empathy_os/redis_config.py +0 -302
- empathy_os/redis_memory.py +0 -799
- empathy_os/resilience/__init__.py +0 -56
- empathy_os/resilience/circuit_breaker.py +0 -256
- empathy_os/resilience/fallback.py +0 -179
- empathy_os/resilience/health.py +0 -300
- empathy_os/resilience/retry.py +0 -209
- empathy_os/resilience/timeout.py +0 -135
- empathy_os/routing/__init__.py +0 -43
- empathy_os/routing/chain_executor.py +0 -433
- empathy_os/routing/classifier.py +0 -217
- empathy_os/routing/smart_router.py +0 -234
- empathy_os/routing/workflow_registry.py +0 -343
- empathy_os/scaffolding/README.md +0 -589
- empathy_os/scaffolding/__init__.py +0 -35
- empathy_os/scaffolding/__main__.py +0 -14
- empathy_os/scaffolding/cli.py +0 -240
- empathy_os/socratic/__init__.py +0 -256
- empathy_os/socratic/ab_testing.py +0 -958
- empathy_os/socratic/blueprint.py +0 -533
- empathy_os/socratic/cli.py +0 -703
- empathy_os/socratic/collaboration.py +0 -1114
- empathy_os/socratic/domain_templates.py +0 -924
- empathy_os/socratic/embeddings.py +0 -738
- empathy_os/socratic/engine.py +0 -794
- empathy_os/socratic/explainer.py +0 -682
- empathy_os/socratic/feedback.py +0 -772
- empathy_os/socratic/forms.py +0 -629
- empathy_os/socratic/generator.py +0 -732
- empathy_os/socratic/llm_analyzer.py +0 -637
- empathy_os/socratic/mcp_server.py +0 -702
- empathy_os/socratic/session.py +0 -312
- empathy_os/socratic/storage.py +0 -667
- empathy_os/socratic/success.py +0 -730
- empathy_os/socratic/visual_editor.py +0 -860
- empathy_os/socratic/web_ui.py +0 -958
- empathy_os/telemetry/__init__.py +0 -39
- empathy_os/telemetry/agent_coordination.py +0 -475
- empathy_os/telemetry/agent_tracking.py +0 -367
- empathy_os/telemetry/approval_gates.py +0 -545
- empathy_os/telemetry/cli.py +0 -1231
- empathy_os/telemetry/commands/__init__.py +0 -14
- empathy_os/telemetry/commands/dashboard_commands.py +0 -696
- empathy_os/telemetry/event_streaming.py +0 -409
- empathy_os/telemetry/feedback_loop.py +0 -567
- empathy_os/telemetry/usage_tracker.py +0 -591
- empathy_os/templates.py +0 -754
- empathy_os/test_generator/__init__.py +0 -38
- empathy_os/test_generator/__main__.py +0 -14
- empathy_os/test_generator/cli.py +0 -234
- empathy_os/test_generator/generator.py +0 -355
- empathy_os/test_generator/risk_analyzer.py +0 -216
- empathy_os/tier_recommender.py +0 -384
- empathy_os/tools.py +0 -183
- empathy_os/trust/__init__.py +0 -28
- empathy_os/trust/circuit_breaker.py +0 -579
- empathy_os/trust_building.py +0 -527
- empathy_os/validation/__init__.py +0 -19
- empathy_os/validation/xml_validator.py +0 -281
- empathy_os/vscode_bridge.py +0 -173
- empathy_os/workflow_commands.py +0 -780
- empathy_os/workflow_patterns/__init__.py +0 -33
- empathy_os/workflow_patterns/behavior.py +0 -249
- empathy_os/workflow_patterns/core.py +0 -76
- empathy_os/workflow_patterns/output.py +0 -99
- empathy_os/workflow_patterns/registry.py +0 -255
- empathy_os/workflow_patterns/structural.py +0 -288
- empathy_os/workflows/__init__.py +0 -539
- empathy_os/workflows/autonomous_test_gen.py +0 -1268
- empathy_os/workflows/base.py +0 -2667
- empathy_os/workflows/batch_processing.py +0 -342
- empathy_os/workflows/bug_predict.py +0 -1084
- empathy_os/workflows/builder.py +0 -273
- empathy_os/workflows/caching.py +0 -253
- empathy_os/workflows/code_review.py +0 -1048
- empathy_os/workflows/code_review_adapters.py +0 -312
- empathy_os/workflows/code_review_pipeline.py +0 -722
- empathy_os/workflows/config.py +0 -645
- empathy_os/workflows/dependency_check.py +0 -644
- empathy_os/workflows/document_gen/__init__.py +0 -25
- empathy_os/workflows/document_gen/config.py +0 -30
- empathy_os/workflows/document_gen/report_formatter.py +0 -162
- empathy_os/workflows/document_gen/workflow.py +0 -1426
- empathy_os/workflows/document_manager.py +0 -216
- empathy_os/workflows/document_manager_README.md +0 -134
- empathy_os/workflows/documentation_orchestrator.py +0 -1205
- empathy_os/workflows/history.py +0 -510
- empathy_os/workflows/keyboard_shortcuts/__init__.py +0 -39
- empathy_os/workflows/keyboard_shortcuts/generators.py +0 -391
- empathy_os/workflows/keyboard_shortcuts/parsers.py +0 -416
- empathy_os/workflows/keyboard_shortcuts/prompts.py +0 -295
- empathy_os/workflows/keyboard_shortcuts/schema.py +0 -193
- empathy_os/workflows/keyboard_shortcuts/workflow.py +0 -509
- empathy_os/workflows/llm_base.py +0 -363
- empathy_os/workflows/manage_docs.py +0 -87
- empathy_os/workflows/manage_docs_README.md +0 -134
- empathy_os/workflows/manage_documentation.py +0 -821
- empathy_os/workflows/new_sample_workflow1.py +0 -149
- empathy_os/workflows/new_sample_workflow1_README.md +0 -150
- empathy_os/workflows/orchestrated_health_check.py +0 -849
- empathy_os/workflows/orchestrated_release_prep.py +0 -600
- empathy_os/workflows/output.py +0 -413
- empathy_os/workflows/perf_audit.py +0 -863
- empathy_os/workflows/pr_review.py +0 -762
- empathy_os/workflows/progress.py +0 -785
- empathy_os/workflows/progress_server.py +0 -322
- empathy_os/workflows/progressive/README 2.md +0 -454
- empathy_os/workflows/progressive/README.md +0 -454
- empathy_os/workflows/progressive/__init__.py +0 -82
- empathy_os/workflows/progressive/cli.py +0 -219
- empathy_os/workflows/progressive/core.py +0 -488
- empathy_os/workflows/progressive/orchestrator.py +0 -723
- empathy_os/workflows/progressive/reports.py +0 -520
- empathy_os/workflows/progressive/telemetry.py +0 -274
- empathy_os/workflows/progressive/test_gen.py +0 -495
- empathy_os/workflows/progressive/workflow.py +0 -589
- empathy_os/workflows/refactor_plan.py +0 -694
- empathy_os/workflows/release_prep.py +0 -895
- empathy_os/workflows/release_prep_crew.py +0 -969
- empathy_os/workflows/research_synthesis.py +0 -404
- empathy_os/workflows/routing.py +0 -168
- empathy_os/workflows/secure_release.py +0 -593
- empathy_os/workflows/security_adapters.py +0 -297
- empathy_os/workflows/security_audit.py +0 -1329
- empathy_os/workflows/security_audit_phase3.py +0 -355
- empathy_os/workflows/seo_optimization.py +0 -633
- empathy_os/workflows/step_config.py +0 -234
- empathy_os/workflows/telemetry_mixin.py +0 -269
- empathy_os/workflows/test5.py +0 -125
- empathy_os/workflows/test5_README.md +0 -158
- empathy_os/workflows/test_coverage_boost_crew.py +0 -849
- empathy_os/workflows/test_gen/__init__.py +0 -52
- empathy_os/workflows/test_gen/ast_analyzer.py +0 -249
- empathy_os/workflows/test_gen/config.py +0 -88
- empathy_os/workflows/test_gen/data_models.py +0 -38
- empathy_os/workflows/test_gen/report_formatter.py +0 -289
- empathy_os/workflows/test_gen/test_templates.py +0 -381
- empathy_os/workflows/test_gen/workflow.py +0 -655
- empathy_os/workflows/test_gen.py +0 -54
- empathy_os/workflows/test_gen_behavioral.py +0 -477
- empathy_os/workflows/test_gen_parallel.py +0 -341
- empathy_os/workflows/test_lifecycle.py +0 -526
- empathy_os/workflows/test_maintenance.py +0 -627
- empathy_os/workflows/test_maintenance_cli.py +0 -590
- empathy_os/workflows/test_maintenance_crew.py +0 -840
- empathy_os/workflows/test_runner.py +0 -622
- empathy_os/workflows/tier_tracking.py +0 -531
- empathy_os/workflows/xml_enhanced_crew.py +0 -285
- empathy_software_plugin/SOFTWARE_PLUGIN_README.md +0 -57
- empathy_software_plugin/cli/__init__.py +0 -120
- empathy_software_plugin/cli/inspect.py +0 -362
- empathy_software_plugin/cli.py +0 -574
- empathy_software_plugin/plugin.py +0 -188
- workflow_scaffolding/__init__.py +0 -11
- workflow_scaffolding/__main__.py +0 -12
- workflow_scaffolding/cli.py +0 -206
- workflow_scaffolding/generator.py +0 -265
- {empathy_framework-5.3.0.dist-info → empathy_framework-5.4.0.dist-info}/WHEEL +0 -0
|
@@ -1,397 +0,0 @@
|
|
|
1
|
-
"""Session Context for Meta-Workflows
|
|
2
|
-
|
|
3
|
-
Tracks user choices and preferences across workflow executions using short-term memory.
|
|
4
|
-
Enables intelligent defaults and personalized recommendations based on recent history.
|
|
5
|
-
|
|
6
|
-
Features:
|
|
7
|
-
- Record form choices per template
|
|
8
|
-
- Suggest defaults based on recent choices
|
|
9
|
-
- Session isolation per user
|
|
10
|
-
- TTL-based expiration (1 hour default)
|
|
11
|
-
- Graceful fallback when memory unavailable
|
|
12
|
-
|
|
13
|
-
Usage:
|
|
14
|
-
from empathy_os.meta_workflows.session_context import SessionContext
|
|
15
|
-
from empathy_os.memory.unified import UnifiedMemory
|
|
16
|
-
|
|
17
|
-
memory = UnifiedMemory(user_id="user@example.com")
|
|
18
|
-
session = SessionContext(memory=memory)
|
|
19
|
-
|
|
20
|
-
# Record choice
|
|
21
|
-
session.record_choice("python_package_publish", "has_tests", "Yes")
|
|
22
|
-
|
|
23
|
-
# Get suggested defaults
|
|
24
|
-
defaults = session.suggest_defaults("python_package_publish")
|
|
25
|
-
|
|
26
|
-
Copyright 2025 Smart AI Memory, LLC
|
|
27
|
-
Licensed under Fair Source 0.9
|
|
28
|
-
"""
|
|
29
|
-
|
|
30
|
-
import logging
|
|
31
|
-
import uuid
|
|
32
|
-
from datetime import datetime
|
|
33
|
-
from typing import TYPE_CHECKING, Any
|
|
34
|
-
|
|
35
|
-
if TYPE_CHECKING:
|
|
36
|
-
from empathy_os.memory.unified import UnifiedMemory
|
|
37
|
-
from empathy_os.meta_workflows.models import FormSchema
|
|
38
|
-
|
|
39
|
-
logger = logging.getLogger(__name__)
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
class SessionContext:
|
|
43
|
-
"""Track session-level patterns and user preferences.
|
|
44
|
-
|
|
45
|
-
Uses short-term memory to record form choices and suggest intelligent
|
|
46
|
-
defaults for subsequent workflow executions.
|
|
47
|
-
|
|
48
|
-
Attributes:
|
|
49
|
-
memory: UnifiedMemory instance for storage
|
|
50
|
-
session_id: Unique session identifier
|
|
51
|
-
user_id: User identifier (from memory)
|
|
52
|
-
default_ttl: Time-to-live for session data (seconds)
|
|
53
|
-
"""
|
|
54
|
-
|
|
55
|
-
def __init__(
|
|
56
|
-
self,
|
|
57
|
-
memory: "UnifiedMemory | None" = None,
|
|
58
|
-
session_id: str | None = None,
|
|
59
|
-
default_ttl: int = 3600,
|
|
60
|
-
):
|
|
61
|
-
"""Initialize session context.
|
|
62
|
-
|
|
63
|
-
Args:
|
|
64
|
-
memory: UnifiedMemory instance (optional, graceful fallback if None)
|
|
65
|
-
session_id: Optional session ID (generates new if None)
|
|
66
|
-
default_ttl: TTL for session data in seconds (default: 1 hour)
|
|
67
|
-
"""
|
|
68
|
-
self.memory = memory
|
|
69
|
-
self.session_id = session_id or str(uuid.uuid4())
|
|
70
|
-
self.user_id = memory.user_id if memory else "anonymous"
|
|
71
|
-
self.default_ttl = default_ttl
|
|
72
|
-
|
|
73
|
-
logger.info(
|
|
74
|
-
f"SessionContext initialized: session_id={self.session_id}, "
|
|
75
|
-
f"user_id={self.user_id}, memory={'enabled' if memory else 'disabled'}"
|
|
76
|
-
)
|
|
77
|
-
|
|
78
|
-
def record_choice(
|
|
79
|
-
self,
|
|
80
|
-
template_id: str,
|
|
81
|
-
question_id: str,
|
|
82
|
-
choice: Any,
|
|
83
|
-
ttl: int | None = None,
|
|
84
|
-
) -> bool:
|
|
85
|
-
"""Record a form choice in short-term memory.
|
|
86
|
-
|
|
87
|
-
Args:
|
|
88
|
-
template_id: Template identifier
|
|
89
|
-
question_id: Question identifier
|
|
90
|
-
choice: User's choice (any JSON-serializable type)
|
|
91
|
-
ttl: Optional TTL override (uses default_ttl if None)
|
|
92
|
-
|
|
93
|
-
Returns:
|
|
94
|
-
True if recorded successfully, False otherwise
|
|
95
|
-
"""
|
|
96
|
-
if not self.memory:
|
|
97
|
-
logger.debug("Memory not available, cannot record choice")
|
|
98
|
-
return False
|
|
99
|
-
|
|
100
|
-
try:
|
|
101
|
-
key = self._make_choice_key(template_id, question_id)
|
|
102
|
-
value = {
|
|
103
|
-
"choice": choice,
|
|
104
|
-
"timestamp": datetime.utcnow().isoformat(),
|
|
105
|
-
"template_id": template_id,
|
|
106
|
-
"question_id": question_id,
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
self.memory.stash(key, value, ttl_seconds=ttl or self.default_ttl)
|
|
110
|
-
|
|
111
|
-
logger.debug(
|
|
112
|
-
f"Recorded choice: template={template_id}, question={question_id}, choice={choice}"
|
|
113
|
-
)
|
|
114
|
-
return True
|
|
115
|
-
|
|
116
|
-
except Exception as e:
|
|
117
|
-
logger.error(f"Failed to record choice: {e}")
|
|
118
|
-
return False
|
|
119
|
-
|
|
120
|
-
def get_recent_choice(
|
|
121
|
-
self,
|
|
122
|
-
template_id: str,
|
|
123
|
-
question_id: str,
|
|
124
|
-
) -> Any | None:
|
|
125
|
-
"""Get the most recent choice for a specific question.
|
|
126
|
-
|
|
127
|
-
Args:
|
|
128
|
-
template_id: Template identifier
|
|
129
|
-
question_id: Question identifier
|
|
130
|
-
|
|
131
|
-
Returns:
|
|
132
|
-
Most recent choice, or None if not found
|
|
133
|
-
"""
|
|
134
|
-
if not self.memory:
|
|
135
|
-
return None
|
|
136
|
-
|
|
137
|
-
try:
|
|
138
|
-
key = self._make_choice_key(template_id, question_id)
|
|
139
|
-
value = self.memory.retrieve(key)
|
|
140
|
-
|
|
141
|
-
if value and isinstance(value, dict):
|
|
142
|
-
return value.get("choice")
|
|
143
|
-
|
|
144
|
-
return None
|
|
145
|
-
|
|
146
|
-
except Exception as e:
|
|
147
|
-
logger.debug(f"Failed to get recent choice: {e}")
|
|
148
|
-
return None
|
|
149
|
-
|
|
150
|
-
def get_recent_choices(
|
|
151
|
-
self,
|
|
152
|
-
template_id: str,
|
|
153
|
-
) -> dict[str, Any]:
|
|
154
|
-
"""Get all recent choices for a template.
|
|
155
|
-
|
|
156
|
-
Args:
|
|
157
|
-
template_id: Template identifier
|
|
158
|
-
|
|
159
|
-
Returns:
|
|
160
|
-
Dict mapping question_id -> choice
|
|
161
|
-
"""
|
|
162
|
-
if not self.memory:
|
|
163
|
-
return {}
|
|
164
|
-
|
|
165
|
-
try:
|
|
166
|
-
# Get all keys for this template and session
|
|
167
|
-
pattern = f"session:{self.session_id}:form:{template_id}:*"
|
|
168
|
-
|
|
169
|
-
# Note: This requires pattern matching support in short-term memory
|
|
170
|
-
# For now, we return empty dict (could be enhanced later)
|
|
171
|
-
logger.debug(f"Pattern matching not yet implemented: {pattern}")
|
|
172
|
-
return {}
|
|
173
|
-
|
|
174
|
-
except Exception as e:
|
|
175
|
-
logger.error(f"Failed to get recent choices: {e}")
|
|
176
|
-
return {}
|
|
177
|
-
|
|
178
|
-
def suggest_defaults(
|
|
179
|
-
self,
|
|
180
|
-
template_id: str,
|
|
181
|
-
form_schema: "FormSchema | None" = None,
|
|
182
|
-
) -> dict[str, Any]:
|
|
183
|
-
"""Suggest default values based on recent choices.
|
|
184
|
-
|
|
185
|
-
Args:
|
|
186
|
-
template_id: Template identifier
|
|
187
|
-
form_schema: Optional form schema for validation
|
|
188
|
-
|
|
189
|
-
Returns:
|
|
190
|
-
Dict mapping question_id -> suggested_default
|
|
191
|
-
"""
|
|
192
|
-
if not self.memory:
|
|
193
|
-
return {}
|
|
194
|
-
|
|
195
|
-
try:
|
|
196
|
-
# Get recent choices for this template
|
|
197
|
-
recent_choices = self.get_recent_choices(template_id)
|
|
198
|
-
|
|
199
|
-
# If form_schema provided, validate suggestions
|
|
200
|
-
if form_schema:
|
|
201
|
-
validated_suggestions = {}
|
|
202
|
-
for question in form_schema.questions:
|
|
203
|
-
if question.id in recent_choices:
|
|
204
|
-
# Validate that suggestion is valid for question type
|
|
205
|
-
choice = recent_choices[question.id]
|
|
206
|
-
if self._validate_choice(choice, question):
|
|
207
|
-
validated_suggestions[question.id] = choice
|
|
208
|
-
|
|
209
|
-
return validated_suggestions
|
|
210
|
-
|
|
211
|
-
return recent_choices
|
|
212
|
-
|
|
213
|
-
except Exception as e:
|
|
214
|
-
logger.error(f"Failed to suggest defaults: {e}")
|
|
215
|
-
return {}
|
|
216
|
-
|
|
217
|
-
def record_execution(
|
|
218
|
-
self,
|
|
219
|
-
template_id: str,
|
|
220
|
-
run_id: str,
|
|
221
|
-
success: bool,
|
|
222
|
-
cost: float,
|
|
223
|
-
duration: float,
|
|
224
|
-
ttl: int | None = None,
|
|
225
|
-
) -> bool:
|
|
226
|
-
"""Record workflow execution metadata.
|
|
227
|
-
|
|
228
|
-
Args:
|
|
229
|
-
template_id: Template identifier
|
|
230
|
-
run_id: Execution run ID
|
|
231
|
-
success: Whether execution succeeded
|
|
232
|
-
cost: Total cost in USD
|
|
233
|
-
duration: Duration in seconds
|
|
234
|
-
ttl: Optional TTL override
|
|
235
|
-
|
|
236
|
-
Returns:
|
|
237
|
-
True if recorded successfully
|
|
238
|
-
"""
|
|
239
|
-
if not self.memory:
|
|
240
|
-
return False
|
|
241
|
-
|
|
242
|
-
try:
|
|
243
|
-
key = f"session:{self.session_id}:execution:{run_id}"
|
|
244
|
-
value = {
|
|
245
|
-
"template_id": template_id,
|
|
246
|
-
"run_id": run_id,
|
|
247
|
-
"success": success,
|
|
248
|
-
"cost": cost,
|
|
249
|
-
"duration": duration,
|
|
250
|
-
"timestamp": datetime.utcnow().isoformat(),
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
self.memory.stash(key, value, ttl_seconds=ttl or self.default_ttl)
|
|
254
|
-
|
|
255
|
-
logger.debug(f"Recorded execution: run_id={run_id}, success={success}")
|
|
256
|
-
return True
|
|
257
|
-
|
|
258
|
-
except Exception as e:
|
|
259
|
-
logger.error(f"Failed to record execution: {e}")
|
|
260
|
-
return False
|
|
261
|
-
|
|
262
|
-
def get_session_stats(self) -> dict[str, Any]:
|
|
263
|
-
"""Get statistics for current session.
|
|
264
|
-
|
|
265
|
-
Returns:
|
|
266
|
-
Dict with session statistics (executions, success rate, etc.)
|
|
267
|
-
"""
|
|
268
|
-
if not self.memory:
|
|
269
|
-
return {"session_id": self.session_id, "memory_enabled": False}
|
|
270
|
-
|
|
271
|
-
try:
|
|
272
|
-
stats = {
|
|
273
|
-
"session_id": self.session_id,
|
|
274
|
-
"user_id": self.user_id,
|
|
275
|
-
"memory_enabled": True,
|
|
276
|
-
"executions": 0,
|
|
277
|
-
"successful_executions": 0,
|
|
278
|
-
"total_cost": 0.0,
|
|
279
|
-
"total_duration": 0.0,
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
# Note: Would need to query all execution records
|
|
283
|
-
# For now, return basic stats
|
|
284
|
-
return stats
|
|
285
|
-
|
|
286
|
-
except Exception as e:
|
|
287
|
-
logger.error(f"Failed to get session stats: {e}")
|
|
288
|
-
return {"session_id": self.session_id, "error": str(e)}
|
|
289
|
-
|
|
290
|
-
def clear_session(self) -> bool:
|
|
291
|
-
"""Clear all session data from memory.
|
|
292
|
-
|
|
293
|
-
Returns:
|
|
294
|
-
True if cleared successfully
|
|
295
|
-
"""
|
|
296
|
-
if not self.memory:
|
|
297
|
-
return False
|
|
298
|
-
|
|
299
|
-
try:
|
|
300
|
-
# Note: Would need to delete all keys matching session pattern
|
|
301
|
-
# For now, just log
|
|
302
|
-
logger.info(f"Session clear requested: {self.session_id}")
|
|
303
|
-
# Implementation would require pattern delete support
|
|
304
|
-
return True
|
|
305
|
-
|
|
306
|
-
except Exception as e:
|
|
307
|
-
logger.error(f"Failed to clear session: {e}")
|
|
308
|
-
return False
|
|
309
|
-
|
|
310
|
-
# =========================================================================
|
|
311
|
-
# HELPER METHODS
|
|
312
|
-
# =========================================================================
|
|
313
|
-
|
|
314
|
-
def _make_choice_key(self, template_id: str, question_id: str) -> str:
|
|
315
|
-
"""Create Redis key for a form choice.
|
|
316
|
-
|
|
317
|
-
Args:
|
|
318
|
-
template_id: Template identifier
|
|
319
|
-
question_id: Question identifier
|
|
320
|
-
|
|
321
|
-
Returns:
|
|
322
|
-
Redis key string
|
|
323
|
-
"""
|
|
324
|
-
return f"session:{self.session_id}:form:{template_id}:{question_id}"
|
|
325
|
-
|
|
326
|
-
def _validate_choice(self, choice: Any, question: Any) -> bool:
|
|
327
|
-
"""Validate that a choice is valid for a question.
|
|
328
|
-
|
|
329
|
-
Args:
|
|
330
|
-
choice: User's choice
|
|
331
|
-
question: FormQuestion object
|
|
332
|
-
|
|
333
|
-
Returns:
|
|
334
|
-
True if valid, False otherwise
|
|
335
|
-
"""
|
|
336
|
-
try:
|
|
337
|
-
# Basic validation - could be enhanced
|
|
338
|
-
if hasattr(question, "options") and question.options:
|
|
339
|
-
# Check if choice is in options (only if options are defined)
|
|
340
|
-
if isinstance(choice, list):
|
|
341
|
-
# Multi-select - all choices must be in options
|
|
342
|
-
return all(c in question.options for c in choice)
|
|
343
|
-
else:
|
|
344
|
-
# Single-select - choice must be in options
|
|
345
|
-
return choice in question.options
|
|
346
|
-
|
|
347
|
-
# No specific validation - assume valid
|
|
348
|
-
return True
|
|
349
|
-
|
|
350
|
-
except Exception:
|
|
351
|
-
return False
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
# =========================================================================
|
|
355
|
-
# CONVENIENCE FUNCTIONS
|
|
356
|
-
# =========================================================================
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
def create_session_context(
|
|
360
|
-
memory: "UnifiedMemory | None" = None,
|
|
361
|
-
session_id: str | None = None,
|
|
362
|
-
) -> SessionContext:
|
|
363
|
-
"""Create a new session context.
|
|
364
|
-
|
|
365
|
-
Convenience function for creating SessionContext instances.
|
|
366
|
-
|
|
367
|
-
Args:
|
|
368
|
-
memory: UnifiedMemory instance (optional)
|
|
369
|
-
session_id: Optional session ID
|
|
370
|
-
|
|
371
|
-
Returns:
|
|
372
|
-
SessionContext instance
|
|
373
|
-
"""
|
|
374
|
-
return SessionContext(memory=memory, session_id=session_id)
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
def get_session_defaults(
|
|
378
|
-
template_id: str,
|
|
379
|
-
form_schema: "FormSchema | None" = None,
|
|
380
|
-
memory: "UnifiedMemory | None" = None,
|
|
381
|
-
session_id: str | None = None,
|
|
382
|
-
) -> dict[str, Any]:
|
|
383
|
-
"""Get suggested defaults for a template.
|
|
384
|
-
|
|
385
|
-
Convenience function for getting defaults without creating SessionContext.
|
|
386
|
-
|
|
387
|
-
Args:
|
|
388
|
-
template_id: Template identifier
|
|
389
|
-
form_schema: Optional form schema
|
|
390
|
-
memory: Optional UnifiedMemory instance
|
|
391
|
-
session_id: Optional session ID
|
|
392
|
-
|
|
393
|
-
Returns:
|
|
394
|
-
Dict of suggested defaults
|
|
395
|
-
"""
|
|
396
|
-
session = SessionContext(memory=memory, session_id=session_id)
|
|
397
|
-
return session.suggest_defaults(template_id, form_schema)
|
|
@@ -1,229 +0,0 @@
|
|
|
1
|
-
"""Template registry for meta-workflows.
|
|
2
|
-
|
|
3
|
-
Handles loading, saving, and discovering meta-workflow templates.
|
|
4
|
-
|
|
5
|
-
Created: 2026-01-17
|
|
6
|
-
Updated: 2026-01-18 (v4.3.0 - Added built-in templates)
|
|
7
|
-
Purpose: Manage reusable workflow templates
|
|
8
|
-
"""
|
|
9
|
-
|
|
10
|
-
import importlib.util
|
|
11
|
-
import logging
|
|
12
|
-
from pathlib import Path
|
|
13
|
-
|
|
14
|
-
from empathy_os.meta_workflows.builtin_templates import (
|
|
15
|
-
BUILTIN_TEMPLATES,
|
|
16
|
-
get_builtin_template,
|
|
17
|
-
list_builtin_templates,
|
|
18
|
-
)
|
|
19
|
-
from empathy_os.meta_workflows.models import MetaWorkflowTemplate
|
|
20
|
-
|
|
21
|
-
logger = logging.getLogger(__name__)
|
|
22
|
-
|
|
23
|
-
# Import _validate_file_path from parent config.py (not config package)
|
|
24
|
-
_config_py_path = Path(__file__).parent.parent / "config.py"
|
|
25
|
-
_spec = importlib.util.spec_from_file_location("_config_module", _config_py_path)
|
|
26
|
-
if _spec and _spec.loader:
|
|
27
|
-
_config_module = importlib.util.module_from_spec(_spec)
|
|
28
|
-
_spec.loader.exec_module(_config_module)
|
|
29
|
-
_validate_file_path = _config_module._validate_file_path
|
|
30
|
-
else:
|
|
31
|
-
# Fallback: simple validation if import fails
|
|
32
|
-
def _validate_file_path(path: str, allowed_dir: str | None = None) -> Path:
|
|
33
|
-
if not path:
|
|
34
|
-
raise ValueError("path must be non-empty")
|
|
35
|
-
return Path(path).resolve()
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
class TemplateRegistry:
|
|
39
|
-
"""Registry for meta-workflow templates.
|
|
40
|
-
|
|
41
|
-
Manages template storage, loading, and discovery.
|
|
42
|
-
Templates are stored as JSON files in a directory.
|
|
43
|
-
|
|
44
|
-
Attributes:
|
|
45
|
-
storage_dir: Directory where templates are stored
|
|
46
|
-
"""
|
|
47
|
-
|
|
48
|
-
def __init__(self, storage_dir: str | None = None):
|
|
49
|
-
"""Initialize template registry.
|
|
50
|
-
|
|
51
|
-
Args:
|
|
52
|
-
storage_dir: Directory for template storage
|
|
53
|
-
(default: .empathy/meta_workflows/templates/)
|
|
54
|
-
|
|
55
|
-
Raises:
|
|
56
|
-
ValueError: If storage_dir is invalid
|
|
57
|
-
"""
|
|
58
|
-
if storage_dir is None:
|
|
59
|
-
storage_dir = str(Path.home() / ".empathy" / "meta_workflows" / "templates")
|
|
60
|
-
|
|
61
|
-
# Validate and create storage directory
|
|
62
|
-
self.storage_dir = Path(_validate_file_path(storage_dir))
|
|
63
|
-
self.storage_dir.mkdir(parents=True, exist_ok=True)
|
|
64
|
-
|
|
65
|
-
logger.info(f"Template registry initialized at: {self.storage_dir}")
|
|
66
|
-
|
|
67
|
-
def load_template(self, template_id: str) -> MetaWorkflowTemplate | None:
|
|
68
|
-
"""Load a template by ID.
|
|
69
|
-
|
|
70
|
-
Checks built-in templates first, then user templates.
|
|
71
|
-
|
|
72
|
-
Args:
|
|
73
|
-
template_id: ID of template to load
|
|
74
|
-
|
|
75
|
-
Returns:
|
|
76
|
-
MetaWorkflowTemplate if found, None otherwise
|
|
77
|
-
|
|
78
|
-
Raises:
|
|
79
|
-
ValueError: If template file is invalid or corrupted
|
|
80
|
-
"""
|
|
81
|
-
# Check built-in templates first
|
|
82
|
-
builtin = get_builtin_template(template_id)
|
|
83
|
-
if builtin is not None:
|
|
84
|
-
logger.info(f"Loaded built-in template: {template_id}")
|
|
85
|
-
return builtin
|
|
86
|
-
|
|
87
|
-
# Fall back to user templates
|
|
88
|
-
template_path = self.storage_dir / f"{template_id}.json"
|
|
89
|
-
|
|
90
|
-
if not template_path.exists():
|
|
91
|
-
logger.warning(f"Template not found: {template_id}")
|
|
92
|
-
return None
|
|
93
|
-
|
|
94
|
-
try:
|
|
95
|
-
json_str = template_path.read_text(encoding="utf-8")
|
|
96
|
-
template = MetaWorkflowTemplate.from_json(json_str)
|
|
97
|
-
logger.info(f"Loaded template: {template_id}")
|
|
98
|
-
return template
|
|
99
|
-
|
|
100
|
-
except (ValueError, KeyError) as e:
|
|
101
|
-
logger.error(f"Failed to load template {template_id}: {e}")
|
|
102
|
-
raise ValueError(f"Invalid template file {template_id}: {e}") from e
|
|
103
|
-
|
|
104
|
-
def save_template(self, template: MetaWorkflowTemplate) -> Path:
|
|
105
|
-
"""Save a template to disk.
|
|
106
|
-
|
|
107
|
-
Args:
|
|
108
|
-
template: Template to save
|
|
109
|
-
|
|
110
|
-
Returns:
|
|
111
|
-
Path where template was saved
|
|
112
|
-
|
|
113
|
-
Raises:
|
|
114
|
-
ValueError: If template is invalid or path is unsafe
|
|
115
|
-
OSError: If write operation fails
|
|
116
|
-
"""
|
|
117
|
-
template_path = self.storage_dir / f"{template.template_id}.json"
|
|
118
|
-
|
|
119
|
-
# Validate path (prevent path traversal)
|
|
120
|
-
validated_path = _validate_file_path(str(template_path))
|
|
121
|
-
|
|
122
|
-
try:
|
|
123
|
-
json_str = template.to_json()
|
|
124
|
-
validated_path.write_text(json_str, encoding="utf-8")
|
|
125
|
-
logger.info(f"Saved template: {template.template_id} → {validated_path}")
|
|
126
|
-
return validated_path
|
|
127
|
-
|
|
128
|
-
except OSError as e:
|
|
129
|
-
logger.error(f"Failed to save template {template.template_id}: {e}")
|
|
130
|
-
raise
|
|
131
|
-
|
|
132
|
-
def list_templates(self, include_builtin: bool = True) -> list[str]:
|
|
133
|
-
"""List all available template IDs.
|
|
134
|
-
|
|
135
|
-
Args:
|
|
136
|
-
include_builtin: Whether to include built-in templates (default: True)
|
|
137
|
-
|
|
138
|
-
Returns:
|
|
139
|
-
List of template IDs (sorted, built-in templates marked with *)
|
|
140
|
-
"""
|
|
141
|
-
# User templates
|
|
142
|
-
template_files = self.storage_dir.glob("*.json")
|
|
143
|
-
template_ids = {f.stem for f in template_files}
|
|
144
|
-
|
|
145
|
-
# Add built-in templates
|
|
146
|
-
if include_builtin:
|
|
147
|
-
template_ids.update(list_builtin_templates())
|
|
148
|
-
|
|
149
|
-
result = sorted(template_ids)
|
|
150
|
-
logger.debug(f"Found {len(result)} templates ({len(list_builtin_templates())} built-in)")
|
|
151
|
-
return result
|
|
152
|
-
|
|
153
|
-
def is_builtin(self, template_id: str) -> bool:
|
|
154
|
-
"""Check if a template is built-in.
|
|
155
|
-
|
|
156
|
-
Args:
|
|
157
|
-
template_id: ID of template to check
|
|
158
|
-
|
|
159
|
-
Returns:
|
|
160
|
-
True if template is built-in
|
|
161
|
-
"""
|
|
162
|
-
return template_id in BUILTIN_TEMPLATES
|
|
163
|
-
|
|
164
|
-
def get_template_info(self, template_id: str) -> dict | None:
|
|
165
|
-
"""Get basic info about a template without loading it fully.
|
|
166
|
-
|
|
167
|
-
Args:
|
|
168
|
-
template_id: ID of template
|
|
169
|
-
|
|
170
|
-
Returns:
|
|
171
|
-
Dictionary with basic template info, or None if not found
|
|
172
|
-
"""
|
|
173
|
-
template = self.load_template(template_id)
|
|
174
|
-
if template is None:
|
|
175
|
-
return None
|
|
176
|
-
|
|
177
|
-
return {
|
|
178
|
-
"template_id": template.template_id,
|
|
179
|
-
"name": template.name,
|
|
180
|
-
"description": template.description,
|
|
181
|
-
"version": template.version,
|
|
182
|
-
"tags": template.tags,
|
|
183
|
-
"author": template.author,
|
|
184
|
-
"estimated_cost_range": template.estimated_cost_range,
|
|
185
|
-
"estimated_duration_minutes": template.estimated_duration_minutes,
|
|
186
|
-
"question_count": len(template.form_schema.questions),
|
|
187
|
-
"agent_rule_count": len(template.agent_composition_rules),
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
def delete_template(self, template_id: str) -> bool:
|
|
191
|
-
"""Delete a template.
|
|
192
|
-
|
|
193
|
-
Args:
|
|
194
|
-
template_id: ID of template to delete
|
|
195
|
-
|
|
196
|
-
Returns:
|
|
197
|
-
True if deleted, False if not found
|
|
198
|
-
|
|
199
|
-
Raises:
|
|
200
|
-
OSError: If delete operation fails
|
|
201
|
-
"""
|
|
202
|
-
template_path = self.storage_dir / f"{template_id}.json"
|
|
203
|
-
|
|
204
|
-
if not template_path.exists():
|
|
205
|
-
logger.warning(f"Template not found for deletion: {template_id}")
|
|
206
|
-
return False
|
|
207
|
-
|
|
208
|
-
try:
|
|
209
|
-
template_path.unlink()
|
|
210
|
-
logger.info(f"Deleted template: {template_id}")
|
|
211
|
-
return True
|
|
212
|
-
|
|
213
|
-
except OSError as e:
|
|
214
|
-
logger.error(f"Failed to delete template {template_id}: {e}")
|
|
215
|
-
raise
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
# =============================================================================
|
|
219
|
-
# Module-level helpers
|
|
220
|
-
# =============================================================================
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
def get_default_registry() -> TemplateRegistry:
|
|
224
|
-
"""Get default template registry instance.
|
|
225
|
-
|
|
226
|
-
Returns:
|
|
227
|
-
TemplateRegistry using default storage location
|
|
228
|
-
"""
|
|
229
|
-
return TemplateRegistry()
|