empathy-framework 4.6.6__py3-none-any.whl → 4.7.1__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-4.7.1.dist-info/METADATA +690 -0
- empathy_framework-4.7.1.dist-info/RECORD +379 -0
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.1.dist-info}/top_level.txt +1 -2
- empathy_healthcare_plugin/monitors/monitoring/__init__.py +9 -9
- empathy_llm_toolkit/agent_factory/__init__.py +6 -6
- empathy_llm_toolkit/agent_factory/adapters/wizard_adapter.py +7 -10
- empathy_llm_toolkit/agents_md/__init__.py +22 -0
- empathy_llm_toolkit/agents_md/loader.py +218 -0
- empathy_llm_toolkit/agents_md/parser.py +271 -0
- empathy_llm_toolkit/agents_md/registry.py +307 -0
- empathy_llm_toolkit/commands/__init__.py +51 -0
- empathy_llm_toolkit/commands/context.py +375 -0
- empathy_llm_toolkit/commands/loader.py +301 -0
- empathy_llm_toolkit/commands/models.py +231 -0
- empathy_llm_toolkit/commands/parser.py +371 -0
- empathy_llm_toolkit/commands/registry.py +429 -0
- empathy_llm_toolkit/config/__init__.py +8 -8
- empathy_llm_toolkit/config/unified.py +3 -7
- empathy_llm_toolkit/context/__init__.py +22 -0
- empathy_llm_toolkit/context/compaction.py +455 -0
- empathy_llm_toolkit/context/manager.py +434 -0
- empathy_llm_toolkit/hooks/__init__.py +24 -0
- empathy_llm_toolkit/hooks/config.py +306 -0
- empathy_llm_toolkit/hooks/executor.py +289 -0
- empathy_llm_toolkit/hooks/registry.py +302 -0
- empathy_llm_toolkit/hooks/scripts/__init__.py +39 -0
- empathy_llm_toolkit/hooks/scripts/evaluate_session.py +201 -0
- empathy_llm_toolkit/hooks/scripts/first_time_init.py +285 -0
- empathy_llm_toolkit/hooks/scripts/pre_compact.py +207 -0
- empathy_llm_toolkit/hooks/scripts/session_end.py +183 -0
- empathy_llm_toolkit/hooks/scripts/session_start.py +163 -0
- empathy_llm_toolkit/hooks/scripts/suggest_compact.py +225 -0
- empathy_llm_toolkit/learning/__init__.py +30 -0
- empathy_llm_toolkit/learning/evaluator.py +438 -0
- empathy_llm_toolkit/learning/extractor.py +514 -0
- empathy_llm_toolkit/learning/storage.py +560 -0
- empathy_llm_toolkit/providers.py +4 -11
- empathy_llm_toolkit/security/__init__.py +17 -17
- empathy_llm_toolkit/utils/tokens.py +2 -5
- empathy_os/__init__.py +202 -70
- empathy_os/cache_monitor.py +5 -3
- empathy_os/cli/__init__.py +11 -55
- empathy_os/cli/__main__.py +29 -15
- empathy_os/cli/commands/inspection.py +21 -12
- empathy_os/cli/commands/memory.py +4 -12
- empathy_os/cli/commands/profiling.py +198 -0
- empathy_os/cli/commands/utilities.py +27 -7
- empathy_os/cli.py +28 -57
- empathy_os/cli_unified.py +525 -1164
- empathy_os/cost_tracker.py +9 -3
- empathy_os/dashboard/server.py +200 -2
- empathy_os/hot_reload/__init__.py +7 -7
- empathy_os/hot_reload/config.py +6 -7
- empathy_os/hot_reload/integration.py +35 -35
- empathy_os/hot_reload/reloader.py +57 -57
- empathy_os/hot_reload/watcher.py +28 -28
- empathy_os/hot_reload/websocket.py +2 -2
- empathy_os/memory/__init__.py +11 -4
- empathy_os/memory/claude_memory.py +1 -1
- empathy_os/memory/cross_session.py +8 -12
- empathy_os/memory/edges.py +6 -6
- empathy_os/memory/file_session.py +770 -0
- empathy_os/memory/graph.py +30 -30
- empathy_os/memory/nodes.py +6 -6
- empathy_os/memory/short_term.py +15 -9
- empathy_os/memory/unified.py +606 -140
- empathy_os/meta_workflows/agent_creator.py +3 -9
- empathy_os/meta_workflows/cli_meta_workflows.py +113 -53
- empathy_os/meta_workflows/form_engine.py +6 -18
- empathy_os/meta_workflows/intent_detector.py +64 -24
- empathy_os/meta_workflows/models.py +3 -1
- empathy_os/meta_workflows/pattern_learner.py +13 -31
- empathy_os/meta_workflows/plan_generator.py +55 -47
- empathy_os/meta_workflows/session_context.py +2 -3
- empathy_os/meta_workflows/workflow.py +20 -51
- empathy_os/models/cli.py +2 -2
- empathy_os/models/tasks.py +1 -2
- empathy_os/models/telemetry.py +4 -1
- empathy_os/models/token_estimator.py +3 -1
- empathy_os/monitoring/alerts.py +938 -9
- empathy_os/monitoring/alerts_cli.py +346 -183
- empathy_os/orchestration/execution_strategies.py +12 -29
- empathy_os/orchestration/pattern_learner.py +20 -26
- empathy_os/orchestration/real_tools.py +6 -15
- empathy_os/platform_utils.py +2 -1
- empathy_os/plugins/__init__.py +2 -2
- empathy_os/plugins/base.py +64 -64
- empathy_os/plugins/registry.py +32 -32
- empathy_os/project_index/index.py +49 -15
- empathy_os/project_index/models.py +1 -2
- empathy_os/project_index/reports.py +1 -1
- empathy_os/project_index/scanner.py +1 -0
- empathy_os/redis_memory.py +10 -7
- empathy_os/resilience/__init__.py +1 -1
- empathy_os/resilience/health.py +10 -10
- empathy_os/routing/__init__.py +7 -7
- empathy_os/routing/chain_executor.py +37 -37
- empathy_os/routing/classifier.py +36 -36
- empathy_os/routing/smart_router.py +40 -40
- empathy_os/routing/{wizard_registry.py → workflow_registry.py} +47 -47
- empathy_os/scaffolding/__init__.py +8 -8
- empathy_os/scaffolding/__main__.py +1 -1
- empathy_os/scaffolding/cli.py +28 -28
- empathy_os/socratic/__init__.py +3 -19
- empathy_os/socratic/ab_testing.py +25 -36
- empathy_os/socratic/blueprint.py +38 -38
- empathy_os/socratic/cli.py +34 -20
- empathy_os/socratic/collaboration.py +30 -28
- empathy_os/socratic/domain_templates.py +9 -1
- empathy_os/socratic/embeddings.py +17 -13
- empathy_os/socratic/engine.py +135 -70
- empathy_os/socratic/explainer.py +70 -60
- empathy_os/socratic/feedback.py +24 -19
- empathy_os/socratic/forms.py +15 -10
- empathy_os/socratic/generator.py +51 -35
- empathy_os/socratic/llm_analyzer.py +25 -23
- empathy_os/socratic/mcp_server.py +99 -159
- empathy_os/socratic/session.py +19 -13
- empathy_os/socratic/storage.py +98 -67
- empathy_os/socratic/success.py +38 -27
- empathy_os/socratic/visual_editor.py +51 -39
- empathy_os/socratic/web_ui.py +99 -66
- empathy_os/telemetry/cli.py +3 -1
- empathy_os/telemetry/usage_tracker.py +1 -3
- empathy_os/test_generator/__init__.py +3 -3
- empathy_os/test_generator/cli.py +28 -28
- empathy_os/test_generator/generator.py +64 -66
- empathy_os/test_generator/risk_analyzer.py +11 -11
- empathy_os/vscode_bridge 2.py +173 -0
- empathy_os/vscode_bridge.py +173 -0
- empathy_os/workflows/__init__.py +212 -120
- empathy_os/workflows/batch_processing.py +8 -24
- empathy_os/workflows/bug_predict.py +1 -1
- empathy_os/workflows/code_review.py +20 -5
- empathy_os/workflows/code_review_pipeline.py +13 -8
- empathy_os/workflows/keyboard_shortcuts/workflow.py +6 -2
- empathy_os/workflows/manage_documentation.py +1 -0
- empathy_os/workflows/orchestrated_health_check.py +6 -11
- empathy_os/workflows/orchestrated_release_prep.py +3 -3
- empathy_os/workflows/pr_review.py +18 -10
- empathy_os/workflows/progressive/README 2.md +454 -0
- empathy_os/workflows/progressive/__init__ 2.py +92 -0
- empathy_os/workflows/progressive/__init__.py +2 -12
- empathy_os/workflows/progressive/cli 2.py +242 -0
- empathy_os/workflows/progressive/cli.py +14 -37
- empathy_os/workflows/progressive/core 2.py +488 -0
- empathy_os/workflows/progressive/core.py +12 -12
- empathy_os/workflows/progressive/orchestrator 2.py +701 -0
- empathy_os/workflows/progressive/orchestrator.py +166 -144
- empathy_os/workflows/progressive/reports 2.py +528 -0
- empathy_os/workflows/progressive/reports.py +22 -31
- empathy_os/workflows/progressive/telemetry 2.py +280 -0
- empathy_os/workflows/progressive/telemetry.py +8 -14
- empathy_os/workflows/progressive/test_gen 2.py +514 -0
- empathy_os/workflows/progressive/test_gen.py +29 -48
- empathy_os/workflows/progressive/workflow 2.py +628 -0
- empathy_os/workflows/progressive/workflow.py +31 -70
- empathy_os/workflows/release_prep.py +21 -6
- empathy_os/workflows/release_prep_crew.py +1 -0
- empathy_os/workflows/secure_release.py +13 -6
- empathy_os/workflows/security_audit.py +8 -3
- empathy_os/workflows/test_coverage_boost_crew.py +3 -2
- empathy_os/workflows/test_maintenance_crew.py +1 -0
- empathy_os/workflows/test_runner.py +16 -12
- empathy_software_plugin/SOFTWARE_PLUGIN_README.md +25 -703
- empathy_software_plugin/cli.py +0 -122
- patterns/README.md +119 -0
- patterns/__init__.py +95 -0
- patterns/behavior.py +298 -0
- patterns/code_review_memory.json +441 -0
- patterns/core.py +97 -0
- patterns/debugging.json +3763 -0
- patterns/empathy.py +268 -0
- patterns/health_check_memory.json +505 -0
- patterns/input.py +161 -0
- patterns/memory_graph.json +8 -0
- patterns/refactoring_memory.json +1113 -0
- patterns/registry.py +663 -0
- patterns/security_memory.json +8 -0
- patterns/structural.py +415 -0
- patterns/validation.py +194 -0
- coach_wizards/__init__.py +0 -45
- coach_wizards/accessibility_wizard.py +0 -91
- coach_wizards/api_wizard.py +0 -91
- coach_wizards/base_wizard.py +0 -209
- coach_wizards/cicd_wizard.py +0 -91
- coach_wizards/code_reviewer_README.md +0 -60
- coach_wizards/code_reviewer_wizard.py +0 -180
- coach_wizards/compliance_wizard.py +0 -91
- coach_wizards/database_wizard.py +0 -91
- coach_wizards/debugging_wizard.py +0 -91
- coach_wizards/documentation_wizard.py +0 -91
- coach_wizards/generate_wizards.py +0 -347
- coach_wizards/localization_wizard.py +0 -173
- coach_wizards/migration_wizard.py +0 -91
- coach_wizards/monitoring_wizard.py +0 -91
- coach_wizards/observability_wizard.py +0 -91
- coach_wizards/performance_wizard.py +0 -91
- coach_wizards/prompt_engineering_wizard.py +0 -661
- coach_wizards/refactoring_wizard.py +0 -91
- coach_wizards/scaling_wizard.py +0 -90
- coach_wizards/security_wizard.py +0 -92
- coach_wizards/testing_wizard.py +0 -91
- empathy_framework-4.6.6.dist-info/METADATA +0 -1597
- empathy_framework-4.6.6.dist-info/RECORD +0 -410
- empathy_llm_toolkit/wizards/__init__.py +0 -43
- empathy_llm_toolkit/wizards/base_wizard.py +0 -364
- empathy_llm_toolkit/wizards/customer_support_wizard.py +0 -190
- empathy_llm_toolkit/wizards/healthcare_wizard.py +0 -378
- empathy_llm_toolkit/wizards/patient_assessment_README.md +0 -64
- empathy_llm_toolkit/wizards/patient_assessment_wizard.py +0 -193
- empathy_llm_toolkit/wizards/technology_wizard.py +0 -209
- empathy_os/wizard_factory_cli.py +0 -170
- empathy_software_plugin/wizards/__init__.py +0 -42
- empathy_software_plugin/wizards/advanced_debugging_wizard.py +0 -395
- empathy_software_plugin/wizards/agent_orchestration_wizard.py +0 -511
- empathy_software_plugin/wizards/ai_collaboration_wizard.py +0 -503
- empathy_software_plugin/wizards/ai_context_wizard.py +0 -441
- empathy_software_plugin/wizards/ai_documentation_wizard.py +0 -503
- empathy_software_plugin/wizards/base_wizard.py +0 -288
- empathy_software_plugin/wizards/book_chapter_wizard.py +0 -519
- empathy_software_plugin/wizards/code_review_wizard.py +0 -604
- empathy_software_plugin/wizards/debugging/__init__.py +0 -50
- empathy_software_plugin/wizards/debugging/bug_risk_analyzer.py +0 -414
- empathy_software_plugin/wizards/debugging/config_loaders.py +0 -446
- empathy_software_plugin/wizards/debugging/fix_applier.py +0 -469
- empathy_software_plugin/wizards/debugging/language_patterns.py +0 -385
- empathy_software_plugin/wizards/debugging/linter_parsers.py +0 -470
- empathy_software_plugin/wizards/debugging/verification.py +0 -369
- empathy_software_plugin/wizards/enhanced_testing_wizard.py +0 -537
- empathy_software_plugin/wizards/memory_enhanced_debugging_wizard.py +0 -816
- empathy_software_plugin/wizards/multi_model_wizard.py +0 -501
- empathy_software_plugin/wizards/pattern_extraction_wizard.py +0 -422
- empathy_software_plugin/wizards/pattern_retriever_wizard.py +0 -400
- empathy_software_plugin/wizards/performance/__init__.py +0 -9
- empathy_software_plugin/wizards/performance/bottleneck_detector.py +0 -221
- empathy_software_plugin/wizards/performance/profiler_parsers.py +0 -278
- empathy_software_plugin/wizards/performance/trajectory_analyzer.py +0 -429
- empathy_software_plugin/wizards/performance_profiling_wizard.py +0 -305
- empathy_software_plugin/wizards/prompt_engineering_wizard.py +0 -425
- empathy_software_plugin/wizards/rag_pattern_wizard.py +0 -461
- empathy_software_plugin/wizards/security/__init__.py +0 -32
- empathy_software_plugin/wizards/security/exploit_analyzer.py +0 -290
- empathy_software_plugin/wizards/security/owasp_patterns.py +0 -241
- empathy_software_plugin/wizards/security/vulnerability_scanner.py +0 -604
- empathy_software_plugin/wizards/security_analysis_wizard.py +0 -322
- empathy_software_plugin/wizards/security_learning_wizard.py +0 -740
- empathy_software_plugin/wizards/tech_debt_wizard.py +0 -726
- empathy_software_plugin/wizards/testing/__init__.py +0 -27
- empathy_software_plugin/wizards/testing/coverage_analyzer.py +0 -459
- empathy_software_plugin/wizards/testing/quality_analyzer.py +0 -525
- empathy_software_plugin/wizards/testing/test_suggester.py +0 -533
- empathy_software_plugin/wizards/testing_wizard.py +0 -274
- wizards/__init__.py +0 -82
- wizards/admission_assessment_wizard.py +0 -644
- wizards/care_plan.py +0 -321
- wizards/clinical_assessment.py +0 -769
- wizards/discharge_planning.py +0 -77
- wizards/discharge_summary_wizard.py +0 -468
- wizards/dosage_calculation.py +0 -497
- wizards/incident_report_wizard.py +0 -454
- wizards/medication_reconciliation.py +0 -85
- wizards/nursing_assessment.py +0 -171
- wizards/patient_education.py +0 -654
- wizards/quality_improvement.py +0 -705
- wizards/sbar_report.py +0 -324
- wizards/sbar_wizard.py +0 -608
- wizards/shift_handoff_wizard.py +0 -535
- wizards/soap_note_wizard.py +0 -679
- wizards/treatment_plan.py +0 -15
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.1.dist-info}/WHEEL +0 -0
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.1.dist-info}/entry_points.txt +0 -0
- {empathy_framework-4.6.6.dist-info → empathy_framework-4.7.1.dist-info}/licenses/LICENSE +0 -0
|
@@ -56,13 +56,9 @@ class DynamicAgentCreator:
|
|
|
56
56
|
return []
|
|
57
57
|
|
|
58
58
|
agents = []
|
|
59
|
-
self.creation_stats["total_rules_evaluated"] = len(
|
|
60
|
-
template.agent_composition_rules
|
|
61
|
-
)
|
|
59
|
+
self.creation_stats["total_rules_evaluated"] = len(template.agent_composition_rules)
|
|
62
60
|
|
|
63
|
-
logger.info(
|
|
64
|
-
f"Evaluating {len(template.agent_composition_rules)} composition rules"
|
|
65
|
-
)
|
|
61
|
+
logger.info(f"Evaluating {len(template.agent_composition_rules)} composition rules")
|
|
66
62
|
|
|
67
63
|
for rule in template.agent_composition_rules:
|
|
68
64
|
# Check if agent should be created based on form responses
|
|
@@ -77,9 +73,7 @@ class DynamicAgentCreator:
|
|
|
77
73
|
)
|
|
78
74
|
else:
|
|
79
75
|
self.creation_stats["rules_skipped"] += 1
|
|
80
|
-
logger.debug(
|
|
81
|
-
f"Skipped agent {rule.role} - conditions not met"
|
|
82
|
-
)
|
|
76
|
+
logger.debug(f"Skipped agent {rule.role} - conditions not met")
|
|
83
77
|
|
|
84
78
|
logger.info(
|
|
85
79
|
f"Created {len(agents)} agents from {len(template.agent_composition_rules)} rules"
|
|
@@ -74,7 +74,7 @@ def list_templates(
|
|
|
74
74
|
if not template_ids:
|
|
75
75
|
console.print("[yellow]No templates found.[/yellow]")
|
|
76
76
|
console.print(f"\nLooking in: {storage_dir}")
|
|
77
|
-
console.print("\nCreate templates by running workflow
|
|
77
|
+
console.print("\nCreate templates by running workflow workflow or")
|
|
78
78
|
console.print("placing template JSON files in the templates directory.")
|
|
79
79
|
return
|
|
80
80
|
|
|
@@ -83,11 +83,15 @@ def list_templates(
|
|
|
83
83
|
user_count = len(template_ids) - builtin_count
|
|
84
84
|
|
|
85
85
|
console.print(f"\n[bold]Available Templates[/bold] ({len(template_ids)} total)")
|
|
86
|
-
console.print(
|
|
86
|
+
console.print(
|
|
87
|
+
f" [cyan]📦 Built-in:[/cyan] {builtin_count} [green]👤 User:[/green] {user_count}\n"
|
|
88
|
+
)
|
|
87
89
|
|
|
88
90
|
# Show migration hint for users coming from Crew workflows
|
|
89
91
|
if builtin_count > 0:
|
|
90
|
-
console.print(
|
|
92
|
+
console.print(
|
|
93
|
+
"[dim]💡 Tip: Built-in templates replace deprecated Crew workflows.[/dim]"
|
|
94
|
+
)
|
|
91
95
|
console.print("[dim] See: empathy meta-workflow migrate --help[/dim]\n")
|
|
92
96
|
|
|
93
97
|
for template_id in template_ids:
|
|
@@ -117,9 +121,13 @@ def list_templates(
|
|
|
117
121
|
|
|
118
122
|
# Add quick start command
|
|
119
123
|
info_lines.append("")
|
|
120
|
-
info_lines.append(
|
|
124
|
+
info_lines.append(
|
|
125
|
+
f"[bold]Quick Start:[/bold] empathy meta-workflow run {template_id}"
|
|
126
|
+
)
|
|
121
127
|
|
|
122
|
-
console.print(
|
|
128
|
+
console.print(
|
|
129
|
+
Panel("\n".join(info_lines), border_style="blue" if is_builtin else "green")
|
|
130
|
+
)
|
|
123
131
|
console.print()
|
|
124
132
|
|
|
125
133
|
except Exception as e:
|
|
@@ -185,7 +193,9 @@ def inspect_template(
|
|
|
185
193
|
|
|
186
194
|
# Agent Composition Rules (optional)
|
|
187
195
|
if show_rules:
|
|
188
|
-
console.print(
|
|
196
|
+
console.print(
|
|
197
|
+
f"\n[bold]Agent Composition Rules:[/bold] ({len(template.agent_composition_rules)})\n"
|
|
198
|
+
)
|
|
189
199
|
|
|
190
200
|
for i, rule in enumerate(template.agent_composition_rules, 1):
|
|
191
201
|
rule_lines = [
|
|
@@ -208,7 +218,9 @@ def inspect_template(
|
|
|
208
218
|
console.print("\n[bold]Summary:[/bold]")
|
|
209
219
|
console.print(f" Questions: {len(template.form_schema.questions)}")
|
|
210
220
|
console.print(f" Agent Rules: {len(template.agent_composition_rules)}")
|
|
211
|
-
console.print(
|
|
221
|
+
console.print(
|
|
222
|
+
f" Estimated Cost: ${template.estimated_cost_range[0]:.2f}-${template.estimated_cost_range[1]:.2f}"
|
|
223
|
+
)
|
|
212
224
|
console.print()
|
|
213
225
|
|
|
214
226
|
except Exception as e:
|
|
@@ -326,7 +338,9 @@ def generate_plan_cmd(
|
|
|
326
338
|
|
|
327
339
|
validated_skill_path = _validate_file_path(str(skill_path))
|
|
328
340
|
validated_skill_path.write_text(plan_content)
|
|
329
|
-
console.print(
|
|
341
|
+
console.print(
|
|
342
|
+
f"\n[green]✓ Installed as Claude Code skill:[/green] {validated_skill_path}"
|
|
343
|
+
)
|
|
330
344
|
console.print(f"\nRun with: [bold]/project:{template_id}[/bold]")
|
|
331
345
|
|
|
332
346
|
elif output_file:
|
|
@@ -512,7 +526,9 @@ def run_workflow(
|
|
|
512
526
|
if result.error:
|
|
513
527
|
summary_lines.append(f"\n[bold red]Error:[/bold red] {result.error}")
|
|
514
528
|
|
|
515
|
-
console.print(
|
|
529
|
+
console.print(
|
|
530
|
+
Panel("\n".join(summary_lines), title="Execution Summary", border_style="green")
|
|
531
|
+
)
|
|
516
532
|
|
|
517
533
|
# Show agents
|
|
518
534
|
console.print("\n[bold]Agents Executed:[/bold]\n")
|
|
@@ -539,6 +555,7 @@ def run_workflow(
|
|
|
539
555
|
else:
|
|
540
556
|
console.print(f"\n[red]Error:[/red] {e}")
|
|
541
557
|
import traceback
|
|
558
|
+
|
|
542
559
|
traceback.print_exc()
|
|
543
560
|
raise typer.Exit(code=1)
|
|
544
561
|
|
|
@@ -579,24 +596,32 @@ def natural_language_run(
|
|
|
579
596
|
matches = detector.detect(request)
|
|
580
597
|
|
|
581
598
|
if not matches:
|
|
582
|
-
console.print(
|
|
599
|
+
console.print(
|
|
600
|
+
"\n[yellow]I couldn't identify a matching agent team for your request.[/yellow]"
|
|
601
|
+
)
|
|
583
602
|
console.print("\n[bold]Available agent teams:[/bold]")
|
|
584
|
-
console.print(
|
|
585
|
-
|
|
603
|
+
console.print(
|
|
604
|
+
" • [cyan]release-prep[/cyan] - Security, testing, code quality, documentation checks"
|
|
605
|
+
)
|
|
606
|
+
console.print(
|
|
607
|
+
" • [cyan]test-coverage-boost[/cyan] - Analyze and improve test coverage"
|
|
608
|
+
)
|
|
586
609
|
console.print(" • [cyan]test-maintenance[/cyan] - Test lifecycle management")
|
|
587
610
|
console.print(" • [cyan]manage-docs[/cyan] - Documentation sync and gap detection")
|
|
588
611
|
console.print("\n[dim]Try: empathy meta-workflow run <template-id>[/dim]\n")
|
|
589
612
|
return
|
|
590
613
|
|
|
591
614
|
# Show detected matches
|
|
592
|
-
console.print(f
|
|
615
|
+
console.print(f'\n[bold]Analyzing:[/bold] "{request}"\n')
|
|
593
616
|
|
|
594
617
|
best_match = matches[0]
|
|
595
618
|
confidence_pct = int(best_match.confidence * 100)
|
|
596
619
|
|
|
597
620
|
# If auto-run and high confidence, run immediately
|
|
598
621
|
if auto_run and best_match.confidence >= 0.6:
|
|
599
|
-
console.print(
|
|
622
|
+
console.print(
|
|
623
|
+
f"[bold green]Auto-detected:[/bold green] {best_match.template_name} ({confidence_pct}% confidence)"
|
|
624
|
+
)
|
|
600
625
|
console.print(f"[dim]{best_match.description}[/dim]\n")
|
|
601
626
|
console.print(f"[bold]Running {best_match.template_id}...[/bold]\n")
|
|
602
627
|
|
|
@@ -615,7 +640,11 @@ def natural_language_run(
|
|
|
615
640
|
|
|
616
641
|
for i, match in enumerate(matches[:3], 1):
|
|
617
642
|
confidence = int(match.confidence * 100)
|
|
618
|
-
style =
|
|
643
|
+
style = (
|
|
644
|
+
"green"
|
|
645
|
+
if match.confidence >= 0.6
|
|
646
|
+
else "yellow" if match.confidence >= 0.4 else "dim"
|
|
647
|
+
)
|
|
619
648
|
|
|
620
649
|
console.print(f" {i}. [{style}]{match.template_name}[/{style}] ({confidence}% match)")
|
|
621
650
|
console.print(f" [dim]{match.description}[/dim]")
|
|
@@ -627,8 +656,12 @@ def natural_language_run(
|
|
|
627
656
|
|
|
628
657
|
# Prompt to run best match
|
|
629
658
|
if best_match.confidence >= 0.5:
|
|
630
|
-
console.print(
|
|
631
|
-
|
|
659
|
+
console.print(
|
|
660
|
+
"[bold]Quick Run:[/bold] Use [cyan]--auto[/cyan] to automatically run the best match"
|
|
661
|
+
)
|
|
662
|
+
console.print(
|
|
663
|
+
f'[dim]Example: empathy meta-workflow ask "{request}" --auto --real[/dim]\n'
|
|
664
|
+
)
|
|
632
665
|
|
|
633
666
|
except Exception as e:
|
|
634
667
|
console.print(f"[red]Error:[/red] {e}")
|
|
@@ -657,7 +690,7 @@ def detect_intent(
|
|
|
657
690
|
detector = IntentDetector()
|
|
658
691
|
matches = detector.detect(request, threshold=threshold)
|
|
659
692
|
|
|
660
|
-
console.print(f
|
|
693
|
+
console.print(f'\n[bold]Intent Analysis:[/bold] "{request}"\n')
|
|
661
694
|
console.print(f"[dim]Threshold: {threshold:.0%}[/dim]\n")
|
|
662
695
|
|
|
663
696
|
if not matches:
|
|
@@ -730,6 +763,7 @@ def show_analytics(
|
|
|
730
763
|
if use_memory:
|
|
731
764
|
console.print("[bold]Initializing memory-enhanced analytics...[/bold]\n")
|
|
732
765
|
from empathy_os.memory.unified import UnifiedMemory
|
|
766
|
+
|
|
733
767
|
memory = UnifiedMemory(user_id="cli_analytics")
|
|
734
768
|
pattern_learner = PatternLearner(memory=memory)
|
|
735
769
|
|
|
@@ -750,8 +784,7 @@ def show_analytics(
|
|
|
750
784
|
|
|
751
785
|
summary_table.add_row("Total Runs", str(summary["total_runs"]))
|
|
752
786
|
summary_table.add_row(
|
|
753
|
-
"Successful",
|
|
754
|
-
f"{summary['successful_runs']} ({summary['success_rate']:.0%})"
|
|
787
|
+
"Successful", f"{summary['successful_runs']} ({summary['success_rate']:.0%})"
|
|
755
788
|
)
|
|
756
789
|
summary_table.add_row("Total Cost", f"${summary['total_cost']:.2f}")
|
|
757
790
|
summary_table.add_row("Avg Cost/Run", f"${summary['avg_cost_per_run']:.2f}")
|
|
@@ -774,7 +807,9 @@ def show_analytics(
|
|
|
774
807
|
console.print("\n[bold]Tier Performance:[/bold]\n")
|
|
775
808
|
for insight in insights["tier_performance"][:5]: # Top 5
|
|
776
809
|
console.print(f" • {insight['description']}")
|
|
777
|
-
console.print(
|
|
810
|
+
console.print(
|
|
811
|
+
f" [dim]Confidence: {insight['confidence']:.0%} (n={insight['sample_size']})[/dim]"
|
|
812
|
+
)
|
|
778
813
|
|
|
779
814
|
if insights.get("cost_analysis"):
|
|
780
815
|
console.print("\n[bold]Cost Analysis:[/bold]\n")
|
|
@@ -782,7 +817,7 @@ def show_analytics(
|
|
|
782
817
|
console.print(f" • {insight['description']}")
|
|
783
818
|
|
|
784
819
|
# Tier breakdown
|
|
785
|
-
breakdown = insight[
|
|
820
|
+
breakdown = insight["data"].get("tier_breakdown", {})
|
|
786
821
|
if breakdown:
|
|
787
822
|
console.print("\n [dim]By Tier:[/dim]")
|
|
788
823
|
for tier, stats in breakdown.items():
|
|
@@ -838,7 +873,9 @@ def list_runs(
|
|
|
838
873
|
console.print("[yellow]No execution results found.[/yellow]")
|
|
839
874
|
return
|
|
840
875
|
|
|
841
|
-
console.print(
|
|
876
|
+
console.print(
|
|
877
|
+
f"\n[bold]Recent Executions[/bold] (showing {min(limit, len(run_ids))} of {len(run_ids)}):\n"
|
|
878
|
+
)
|
|
842
879
|
|
|
843
880
|
# Create table
|
|
844
881
|
table = Table(show_header=True)
|
|
@@ -1042,9 +1079,7 @@ def cleanup_executions(
|
|
|
1042
1079
|
continue
|
|
1043
1080
|
|
|
1044
1081
|
if not to_delete:
|
|
1045
|
-
console.print(
|
|
1046
|
-
f"[green]No executions older than {older_than_days} days found.[/green]"
|
|
1047
|
-
)
|
|
1082
|
+
console.print(f"[green]No executions older than {older_than_days} days found.[/green]")
|
|
1048
1083
|
return
|
|
1049
1084
|
|
|
1050
1085
|
# Show what will be deleted
|
|
@@ -1082,6 +1117,7 @@ def cleanup_executions(
|
|
|
1082
1117
|
|
|
1083
1118
|
# Delete
|
|
1084
1119
|
import shutil
|
|
1120
|
+
|
|
1085
1121
|
deleted = 0
|
|
1086
1122
|
for run_id, _, _ in to_delete:
|
|
1087
1123
|
try:
|
|
@@ -1177,8 +1213,7 @@ def search_memory(
|
|
|
1177
1213
|
|
|
1178
1214
|
except ImportError:
|
|
1179
1215
|
console.print(
|
|
1180
|
-
"[red]Error:[/red] UnifiedMemory not available. "
|
|
1181
|
-
"Ensure memory module is installed."
|
|
1216
|
+
"[red]Error:[/red] UnifiedMemory not available. Ensure memory module is installed."
|
|
1182
1217
|
)
|
|
1183
1218
|
raise typer.Exit(code=1)
|
|
1184
1219
|
except Exception as e:
|
|
@@ -1242,10 +1277,7 @@ def show_session_stats(
|
|
|
1242
1277
|
|
|
1243
1278
|
table.add_row("Total Choices", str(stats.get("choice_count", 0)))
|
|
1244
1279
|
table.add_row("Templates Used", str(len(stats.get("templates_used", []))))
|
|
1245
|
-
table.add_row(
|
|
1246
|
-
"Most Recent Choice",
|
|
1247
|
-
stats.get("most_recent_choice_timestamp", "N/A")
|
|
1248
|
-
)
|
|
1280
|
+
table.add_row("Most Recent Choice", stats.get("most_recent_choice_timestamp", "N/A"))
|
|
1249
1281
|
|
|
1250
1282
|
console.print(table)
|
|
1251
1283
|
console.print()
|
|
@@ -1332,8 +1364,7 @@ def suggest_defaults_cmd(
|
|
|
1332
1364
|
for question_id, value in defaults.items():
|
|
1333
1365
|
# Find the question to get the display text
|
|
1334
1366
|
question = next(
|
|
1335
|
-
(q for q in template.form_schema.questions if q.id == question_id),
|
|
1336
|
-
None
|
|
1367
|
+
(q for q in template.form_schema.questions if q.id == question_id), None
|
|
1337
1368
|
)
|
|
1338
1369
|
question_text = question.text if question else question_id
|
|
1339
1370
|
|
|
@@ -1462,7 +1493,9 @@ def show_migration_guide(
|
|
|
1462
1493
|
console.print(table)
|
|
1463
1494
|
|
|
1464
1495
|
console.print("\n[bold]Quick Start:[/bold]")
|
|
1465
|
-
console.print(
|
|
1496
|
+
console.print(
|
|
1497
|
+
" 1. List available templates: [cyan]empathy meta-workflow list-templates[/cyan]"
|
|
1498
|
+
)
|
|
1466
1499
|
console.print(" 2. Run a workflow: [cyan]empathy meta-workflow run release-prep[/cyan]")
|
|
1467
1500
|
console.print(" 3. View results: [cyan]empathy meta-workflow list-runs[/cyan]\n")
|
|
1468
1501
|
|
|
@@ -1534,7 +1567,9 @@ def create_agent(
|
|
|
1534
1567
|
|
|
1535
1568
|
# Question 2: Specific tasks
|
|
1536
1569
|
console.print("\n[bold]2. What specific tasks will it perform?[/bold]")
|
|
1537
|
-
console.print(
|
|
1570
|
+
console.print(
|
|
1571
|
+
" [dim]Examples: analyze code, generate tests, review PRs, write docs[/dim]"
|
|
1572
|
+
)
|
|
1538
1573
|
tasks = typer.prompt(" List main tasks (comma-separated)")
|
|
1539
1574
|
|
|
1540
1575
|
# Question 3: Tier selection
|
|
@@ -1598,7 +1633,9 @@ def create_agent(
|
|
|
1598
1633
|
|
|
1599
1634
|
# Show usage
|
|
1600
1635
|
console.print("\n[bold]Next Steps:[/bold]")
|
|
1601
|
-
console.print(
|
|
1636
|
+
console.print(
|
|
1637
|
+
" 1. Use this agent in a custom team: [cyan]empathy meta-workflow create-team[/cyan]"
|
|
1638
|
+
)
|
|
1602
1639
|
console.print(" 2. Or add to an existing template manually")
|
|
1603
1640
|
console.print(f"\n[dim]Agent tier '{tier}' will cost approximately:")
|
|
1604
1641
|
costs = {"cheap": "$0.001-0.01", "capable": "$0.01-0.05", "premium": "$0.05-0.20"}
|
|
@@ -1662,21 +1699,25 @@ def create_team(
|
|
|
1662
1699
|
|
|
1663
1700
|
# Question 3: Agent roles
|
|
1664
1701
|
console.print(f"\n[bold]3. Define {agent_count} agent roles:[/bold]")
|
|
1665
|
-
console.print(
|
|
1702
|
+
console.print(
|
|
1703
|
+
" [dim]Common roles: analyst, reviewer, generator, validator, reporter[/dim]"
|
|
1704
|
+
)
|
|
1666
1705
|
|
|
1667
1706
|
agents = []
|
|
1668
1707
|
for i in range(agent_count):
|
|
1669
|
-
console.print(f"\n [bold]Agent {i+1}:[/bold]")
|
|
1708
|
+
console.print(f"\n [bold]Agent {i + 1}:[/bold]")
|
|
1670
1709
|
role = typer.prompt(" Role name")
|
|
1671
1710
|
purpose = typer.prompt(" What does this agent do?")
|
|
1672
1711
|
tier = typer.prompt(" Tier (cheap/capable/premium)", default="capable")
|
|
1673
1712
|
|
|
1674
|
-
agents.append(
|
|
1675
|
-
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
1713
|
+
agents.append(
|
|
1714
|
+
{
|
|
1715
|
+
"role": role,
|
|
1716
|
+
"purpose": purpose,
|
|
1717
|
+
"tier": tier,
|
|
1718
|
+
"base_template": "generic",
|
|
1719
|
+
}
|
|
1720
|
+
)
|
|
1680
1721
|
|
|
1681
1722
|
# Question 4: Collaboration pattern
|
|
1682
1723
|
console.print("\n[bold]4. How should agents collaborate?[/bold]")
|
|
@@ -1716,9 +1757,24 @@ def create_team(
|
|
|
1716
1757
|
"description": goal,
|
|
1717
1758
|
"collaboration_pattern": "sequential",
|
|
1718
1759
|
"agents": [
|
|
1719
|
-
{
|
|
1720
|
-
|
|
1721
|
-
|
|
1760
|
+
{
|
|
1761
|
+
"role": "Analyst",
|
|
1762
|
+
"purpose": "Analyze requirements",
|
|
1763
|
+
"tier": "cheap",
|
|
1764
|
+
"base_template": "generic",
|
|
1765
|
+
},
|
|
1766
|
+
{
|
|
1767
|
+
"role": "Executor",
|
|
1768
|
+
"purpose": "Perform main task",
|
|
1769
|
+
"tier": "capable",
|
|
1770
|
+
"base_template": "generic",
|
|
1771
|
+
},
|
|
1772
|
+
{
|
|
1773
|
+
"role": "Validator",
|
|
1774
|
+
"purpose": "Verify results",
|
|
1775
|
+
"tier": "capable",
|
|
1776
|
+
"base_template": "generic",
|
|
1777
|
+
},
|
|
1722
1778
|
],
|
|
1723
1779
|
"estimated_cost_range": {"min": 0.03, "max": 0.45},
|
|
1724
1780
|
}
|
|
@@ -1737,11 +1793,15 @@ def create_team(
|
|
|
1737
1793
|
|
|
1738
1794
|
# Show usage
|
|
1739
1795
|
console.print("\n[bold]Next Steps:[/bold]")
|
|
1740
|
-
console.print(
|
|
1741
|
-
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
|
|
1796
|
+
console.print(
|
|
1797
|
+
f" 1. Save as template: [cyan]--output .empathy/meta_workflows/templates/{team_template['id']}.json[/cyan]"
|
|
1798
|
+
)
|
|
1799
|
+
console.print(
|
|
1800
|
+
f" 2. Run the team: [cyan]empathy meta-workflow run {team_template['id']}[/cyan]"
|
|
1801
|
+
)
|
|
1802
|
+
|
|
1803
|
+
cost_min = team_template["estimated_cost_range"]["min"]
|
|
1804
|
+
cost_max = team_template["estimated_cost_range"]["max"]
|
|
1745
1805
|
console.print(f"\n[dim]Estimated cost: ${cost_min:.2f} - ${cost_max:.2f} per execution[/dim]\n")
|
|
1746
1806
|
|
|
1747
1807
|
|
|
@@ -63,9 +63,7 @@ class SocraticFormEngine:
|
|
|
63
63
|
self._ask_user_callback = ask_user_callback
|
|
64
64
|
self._use_defaults_when_no_callback = use_defaults_when_no_callback
|
|
65
65
|
|
|
66
|
-
def ask_questions(
|
|
67
|
-
self, form_schema: FormSchema, template_id: str
|
|
68
|
-
) -> FormResponse:
|
|
66
|
+
def ask_questions(self, form_schema: FormSchema, template_id: str) -> FormResponse:
|
|
69
67
|
"""Ask all questions in the form schema and collect responses.
|
|
70
68
|
|
|
71
69
|
Args:
|
|
@@ -86,9 +84,7 @@ class SocraticFormEngine:
|
|
|
86
84
|
batches = form_schema.get_question_batches(batch_size=4)
|
|
87
85
|
all_responses = {}
|
|
88
86
|
|
|
89
|
-
logger.info(
|
|
90
|
-
f"Asking {len(form_schema.questions)} questions in {len(batches)} batch(es)"
|
|
91
|
-
)
|
|
87
|
+
logger.info(f"Asking {len(form_schema.questions)} questions in {len(batches)} batch(es)")
|
|
92
88
|
|
|
93
89
|
for batch_idx, batch in enumerate(batches, 1):
|
|
94
90
|
logger.debug(f"Processing batch {batch_idx}/{len(batches)}")
|
|
@@ -109,14 +105,10 @@ class SocraticFormEngine:
|
|
|
109
105
|
# Cache response
|
|
110
106
|
self.responses_cache[response.response_id] = response
|
|
111
107
|
|
|
112
|
-
logger.info(
|
|
113
|
-
f"Collected {len(all_responses)} responses for template {template_id}"
|
|
114
|
-
)
|
|
108
|
+
logger.info(f"Collected {len(all_responses)} responses for template {template_id}")
|
|
115
109
|
return response
|
|
116
110
|
|
|
117
|
-
def _convert_batch_to_ask_user_format(
|
|
118
|
-
self, batch: list[FormQuestion]
|
|
119
|
-
) -> list[dict[str, Any]]:
|
|
111
|
+
def _convert_batch_to_ask_user_format(self, batch: list[FormQuestion]) -> list[dict[str, Any]]:
|
|
120
112
|
"""Convert a batch of FormQuestions to AskUserQuestion format.
|
|
121
113
|
|
|
122
114
|
Args:
|
|
@@ -127,9 +119,7 @@ class SocraticFormEngine:
|
|
|
127
119
|
"""
|
|
128
120
|
return [q.to_ask_user_format() for q in batch]
|
|
129
121
|
|
|
130
|
-
def _ask_batch(
|
|
131
|
-
self, questions: list[dict[str, Any]], template_id: str
|
|
132
|
-
) -> dict[str, Any]:
|
|
122
|
+
def _ask_batch(self, questions: list[dict[str, Any]], template_id: str) -> dict[str, Any]:
|
|
133
123
|
"""Ask a batch of questions using AskUserQuestion tool.
|
|
134
124
|
|
|
135
125
|
Args:
|
|
@@ -173,9 +163,7 @@ class SocraticFormEngine:
|
|
|
173
163
|
"Either provide a callback or set use_defaults_when_no_callback=True."
|
|
174
164
|
)
|
|
175
165
|
|
|
176
|
-
def _get_defaults_from_questions(
|
|
177
|
-
self, questions: list[dict[str, Any]]
|
|
178
|
-
) -> dict[str, Any]:
|
|
166
|
+
def _get_defaults_from_questions(self, questions: list[dict[str, Any]]) -> dict[str, Any]:
|
|
179
167
|
"""Extract default values from question definitions.
|
|
180
168
|
|
|
181
169
|
Args:
|
|
@@ -39,12 +39,26 @@ class IntentMatch:
|
|
|
39
39
|
INTENT_PATTERNS = {
|
|
40
40
|
"release-prep": {
|
|
41
41
|
"keywords": [
|
|
42
|
-
"release",
|
|
43
|
-
"
|
|
44
|
-
"
|
|
45
|
-
"
|
|
46
|
-
"
|
|
47
|
-
"
|
|
42
|
+
"release",
|
|
43
|
+
"deploy",
|
|
44
|
+
"publish",
|
|
45
|
+
"ship",
|
|
46
|
+
"launch",
|
|
47
|
+
"ready",
|
|
48
|
+
"readiness",
|
|
49
|
+
"checklist",
|
|
50
|
+
"preparation",
|
|
51
|
+
"security scan",
|
|
52
|
+
"vulnerability",
|
|
53
|
+
"audit",
|
|
54
|
+
"production",
|
|
55
|
+
"go live",
|
|
56
|
+
"version bump",
|
|
57
|
+
"pre-release",
|
|
58
|
+
"before release",
|
|
59
|
+
"quality check",
|
|
60
|
+
"code review",
|
|
61
|
+
"final check",
|
|
48
62
|
],
|
|
49
63
|
"phrases": [
|
|
50
64
|
r"ready (for|to) (release|deploy|publish)",
|
|
@@ -63,11 +77,23 @@ INTENT_PATTERNS = {
|
|
|
63
77
|
},
|
|
64
78
|
"test-coverage-boost": {
|
|
65
79
|
"keywords": [
|
|
66
|
-
"test coverage",
|
|
67
|
-
"
|
|
68
|
-
"
|
|
69
|
-
"
|
|
70
|
-
"
|
|
80
|
+
"test coverage",
|
|
81
|
+
"coverage",
|
|
82
|
+
"tests",
|
|
83
|
+
"testing",
|
|
84
|
+
"unit tests",
|
|
85
|
+
"improve coverage",
|
|
86
|
+
"boost coverage",
|
|
87
|
+
"generate tests",
|
|
88
|
+
"missing tests",
|
|
89
|
+
"coverage gap",
|
|
90
|
+
"80%",
|
|
91
|
+
"90%",
|
|
92
|
+
"percent coverage",
|
|
93
|
+
"more tests",
|
|
94
|
+
"add tests",
|
|
95
|
+
"write tests",
|
|
96
|
+
"create tests",
|
|
71
97
|
],
|
|
72
98
|
"phrases": [
|
|
73
99
|
r"(improve|increase|boost) (test )?coverage",
|
|
@@ -83,10 +109,17 @@ INTENT_PATTERNS = {
|
|
|
83
109
|
},
|
|
84
110
|
"test-maintenance": {
|
|
85
111
|
"keywords": [
|
|
86
|
-
"test maintenance",
|
|
87
|
-
"
|
|
88
|
-
"
|
|
89
|
-
"
|
|
112
|
+
"test maintenance",
|
|
113
|
+
"stale tests",
|
|
114
|
+
"outdated tests",
|
|
115
|
+
"flaky tests",
|
|
116
|
+
"test health",
|
|
117
|
+
"test cleanup",
|
|
118
|
+
"test lifecycle",
|
|
119
|
+
"maintain tests",
|
|
120
|
+
"fix tests",
|
|
121
|
+
"broken tests",
|
|
122
|
+
"failing tests",
|
|
90
123
|
],
|
|
91
124
|
"phrases": [
|
|
92
125
|
r"(fix|update|maintain) tests",
|
|
@@ -101,10 +134,20 @@ INTENT_PATTERNS = {
|
|
|
101
134
|
},
|
|
102
135
|
"manage-docs": {
|
|
103
136
|
"keywords": [
|
|
104
|
-
"documentation",
|
|
105
|
-
"
|
|
106
|
-
"
|
|
107
|
-
"
|
|
137
|
+
"documentation",
|
|
138
|
+
"docs",
|
|
139
|
+
"docstrings",
|
|
140
|
+
"readme",
|
|
141
|
+
"api docs",
|
|
142
|
+
"missing docs",
|
|
143
|
+
"update docs",
|
|
144
|
+
"document",
|
|
145
|
+
"documenting",
|
|
146
|
+
"undocumented",
|
|
147
|
+
"up to date",
|
|
148
|
+
"sync",
|
|
149
|
+
"stale docs",
|
|
150
|
+
"outdated docs",
|
|
108
151
|
],
|
|
109
152
|
"phrases": [
|
|
110
153
|
r"(update|improve|fix|add) (the )?doc(s|umentation)?",
|
|
@@ -227,9 +270,7 @@ class IntentDetector:
|
|
|
227
270
|
|
|
228
271
|
for i, match in enumerate(matches[:3], 1): # Top 3 suggestions
|
|
229
272
|
confidence_pct = int(match.confidence * 100)
|
|
230
|
-
lines.append(
|
|
231
|
-
f" {i}. **{match.template_name}** ({confidence_pct}% match)"
|
|
232
|
-
)
|
|
273
|
+
lines.append(f" {i}. **{match.template_name}** ({confidence_pct}% match)")
|
|
233
274
|
lines.append(f" {match.description}")
|
|
234
275
|
lines.append(f" Run with: `empathy meta-workflow run {match.template_id}`")
|
|
235
276
|
lines.append("")
|
|
@@ -290,8 +331,7 @@ def auto_detect_template(user_input: str) -> str | None:
|
|
|
290
331
|
|
|
291
332
|
if match and match.confidence >= 0.6:
|
|
292
333
|
logger.info(
|
|
293
|
-
f"Auto-detected template: {match.template_id} "
|
|
294
|
-
f"(confidence: {match.confidence:.0%})"
|
|
334
|
+
f"Auto-detected template: {match.template_id} (confidence: {match.confidence:.0%})"
|
|
295
335
|
)
|
|
296
336
|
return match.template_id
|
|
297
337
|
|
|
@@ -136,7 +136,9 @@ class FormResponse:
|
|
|
136
136
|
template_id: str
|
|
137
137
|
responses: dict[str, Any] = field(default_factory=dict)
|
|
138
138
|
timestamp: str = field(default_factory=lambda: datetime.now().isoformat())
|
|
139
|
-
response_id: str = field(
|
|
139
|
+
response_id: str = field(
|
|
140
|
+
default_factory=lambda: f"resp-{datetime.now().strftime('%Y%m%d-%H%M%S')}"
|
|
141
|
+
)
|
|
140
142
|
|
|
141
143
|
def get(self, question_id: str, default: Any = None) -> Any:
|
|
142
144
|
"""Get response for a question.
|