htmlgraph 0.20.1__py3-none-any.whl → 0.27.5__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.
- htmlgraph/.htmlgraph/.session-warning-state.json +6 -0
- htmlgraph/.htmlgraph/agents.json +72 -0
- htmlgraph/.htmlgraph/htmlgraph.db +0 -0
- htmlgraph/__init__.py +51 -1
- htmlgraph/__init__.pyi +123 -0
- htmlgraph/agent_detection.py +26 -10
- htmlgraph/agent_registry.py +2 -1
- htmlgraph/analytics/__init__.py +8 -1
- htmlgraph/analytics/cli.py +86 -20
- htmlgraph/analytics/cost_analyzer.py +391 -0
- htmlgraph/analytics/cost_monitor.py +664 -0
- htmlgraph/analytics/cost_reporter.py +675 -0
- htmlgraph/analytics/cross_session.py +617 -0
- htmlgraph/analytics/dependency.py +10 -6
- htmlgraph/analytics/pattern_learning.py +771 -0
- htmlgraph/analytics/session_graph.py +707 -0
- htmlgraph/analytics/strategic/__init__.py +80 -0
- htmlgraph/analytics/strategic/cost_optimizer.py +611 -0
- htmlgraph/analytics/strategic/pattern_detector.py +876 -0
- htmlgraph/analytics/strategic/preference_manager.py +709 -0
- htmlgraph/analytics/strategic/suggestion_engine.py +747 -0
- htmlgraph/analytics/work_type.py +67 -27
- htmlgraph/analytics_index.py +53 -20
- htmlgraph/api/__init__.py +3 -0
- htmlgraph/api/cost_alerts_websocket.py +416 -0
- htmlgraph/api/main.py +2498 -0
- htmlgraph/api/static/htmx.min.js +1 -0
- htmlgraph/api/static/style-redesign.css +1344 -0
- htmlgraph/api/static/style.css +1079 -0
- htmlgraph/api/templates/dashboard-redesign.html +1366 -0
- htmlgraph/api/templates/dashboard.html +794 -0
- htmlgraph/api/templates/partials/activity-feed-hierarchical.html +326 -0
- htmlgraph/api/templates/partials/activity-feed.html +1100 -0
- htmlgraph/api/templates/partials/agents-redesign.html +317 -0
- htmlgraph/api/templates/partials/agents.html +317 -0
- htmlgraph/api/templates/partials/event-traces.html +373 -0
- htmlgraph/api/templates/partials/features-kanban-redesign.html +509 -0
- htmlgraph/api/templates/partials/features.html +578 -0
- htmlgraph/api/templates/partials/metrics-redesign.html +346 -0
- htmlgraph/api/templates/partials/metrics.html +346 -0
- htmlgraph/api/templates/partials/orchestration-redesign.html +443 -0
- htmlgraph/api/templates/partials/orchestration.html +198 -0
- htmlgraph/api/templates/partials/spawners.html +375 -0
- htmlgraph/api/templates/partials/work-items.html +613 -0
- htmlgraph/api/websocket.py +538 -0
- htmlgraph/archive/__init__.py +24 -0
- htmlgraph/archive/bloom.py +234 -0
- htmlgraph/archive/fts.py +297 -0
- htmlgraph/archive/manager.py +583 -0
- htmlgraph/archive/search.py +244 -0
- htmlgraph/atomic_ops.py +560 -0
- htmlgraph/attribute_index.py +2 -1
- htmlgraph/bounded_paths.py +539 -0
- htmlgraph/builders/base.py +57 -2
- htmlgraph/builders/bug.py +19 -3
- htmlgraph/builders/chore.py +19 -3
- htmlgraph/builders/epic.py +19 -3
- htmlgraph/builders/feature.py +27 -3
- htmlgraph/builders/insight.py +2 -1
- htmlgraph/builders/metric.py +2 -1
- htmlgraph/builders/pattern.py +2 -1
- htmlgraph/builders/phase.py +19 -3
- htmlgraph/builders/spike.py +29 -3
- htmlgraph/builders/track.py +42 -1
- htmlgraph/cigs/__init__.py +81 -0
- htmlgraph/cigs/autonomy.py +385 -0
- htmlgraph/cigs/cost.py +475 -0
- htmlgraph/cigs/messages_basic.py +472 -0
- htmlgraph/cigs/messaging.py +365 -0
- htmlgraph/cigs/models.py +771 -0
- htmlgraph/cigs/pattern_storage.py +427 -0
- htmlgraph/cigs/patterns.py +503 -0
- htmlgraph/cigs/posttool_analyzer.py +234 -0
- htmlgraph/cigs/reporter.py +818 -0
- htmlgraph/cigs/tracker.py +317 -0
- htmlgraph/cli/.htmlgraph/.session-warning-state.json +6 -0
- htmlgraph/cli/.htmlgraph/agents.json +72 -0
- htmlgraph/cli/.htmlgraph/htmlgraph.db +0 -0
- htmlgraph/cli/__init__.py +42 -0
- htmlgraph/cli/__main__.py +6 -0
- htmlgraph/cli/analytics.py +1424 -0
- htmlgraph/cli/base.py +685 -0
- htmlgraph/cli/constants.py +206 -0
- htmlgraph/cli/core.py +954 -0
- htmlgraph/cli/main.py +147 -0
- htmlgraph/cli/models.py +475 -0
- htmlgraph/cli/templates/__init__.py +1 -0
- htmlgraph/cli/templates/cost_dashboard.py +399 -0
- htmlgraph/cli/work/__init__.py +239 -0
- htmlgraph/cli/work/browse.py +115 -0
- htmlgraph/cli/work/features.py +568 -0
- htmlgraph/cli/work/orchestration.py +676 -0
- htmlgraph/cli/work/report.py +728 -0
- htmlgraph/cli/work/sessions.py +466 -0
- htmlgraph/cli/work/snapshot.py +559 -0
- htmlgraph/cli/work/tracks.py +486 -0
- htmlgraph/cli_commands/__init__.py +1 -0
- htmlgraph/cli_commands/feature.py +195 -0
- htmlgraph/cli_framework.py +115 -0
- htmlgraph/collections/__init__.py +2 -0
- htmlgraph/collections/base.py +197 -14
- htmlgraph/collections/bug.py +2 -1
- htmlgraph/collections/chore.py +2 -1
- htmlgraph/collections/epic.py +2 -1
- htmlgraph/collections/feature.py +2 -1
- htmlgraph/collections/insight.py +2 -1
- htmlgraph/collections/metric.py +2 -1
- htmlgraph/collections/pattern.py +2 -1
- htmlgraph/collections/phase.py +2 -1
- htmlgraph/collections/session.py +194 -0
- htmlgraph/collections/spike.py +13 -2
- htmlgraph/collections/task_delegation.py +241 -0
- htmlgraph/collections/todo.py +14 -1
- htmlgraph/collections/traces.py +487 -0
- htmlgraph/config/cost_models.json +56 -0
- htmlgraph/config.py +190 -0
- htmlgraph/context_analytics.py +2 -1
- htmlgraph/converter.py +116 -7
- htmlgraph/cost_analysis/__init__.py +5 -0
- htmlgraph/cost_analysis/analyzer.py +438 -0
- htmlgraph/dashboard.html +2246 -248
- htmlgraph/dashboard.html.backup +6592 -0
- htmlgraph/dashboard.html.bak +7181 -0
- htmlgraph/dashboard.html.bak2 +7231 -0
- htmlgraph/dashboard.html.bak3 +7232 -0
- htmlgraph/db/__init__.py +38 -0
- htmlgraph/db/queries.py +790 -0
- htmlgraph/db/schema.py +1788 -0
- htmlgraph/decorators.py +317 -0
- htmlgraph/dependency_models.py +2 -1
- htmlgraph/deploy.py +26 -27
- htmlgraph/docs/API_REFERENCE.md +841 -0
- htmlgraph/docs/HTTP_API.md +750 -0
- htmlgraph/docs/INTEGRATION_GUIDE.md +752 -0
- htmlgraph/docs/ORCHESTRATION_PATTERNS.md +717 -0
- htmlgraph/docs/README.md +532 -0
- htmlgraph/docs/__init__.py +77 -0
- htmlgraph/docs/docs_version.py +55 -0
- htmlgraph/docs/metadata.py +93 -0
- htmlgraph/docs/migrations.py +232 -0
- htmlgraph/docs/template_engine.py +143 -0
- htmlgraph/docs/templates/_sections/cli_reference.md.j2 +52 -0
- htmlgraph/docs/templates/_sections/core_concepts.md.j2 +29 -0
- htmlgraph/docs/templates/_sections/sdk_basics.md.j2 +69 -0
- htmlgraph/docs/templates/base_agents.md.j2 +78 -0
- htmlgraph/docs/templates/example_user_override.md.j2 +47 -0
- htmlgraph/docs/version_check.py +163 -0
- htmlgraph/edge_index.py +2 -1
- htmlgraph/error_handler.py +544 -0
- htmlgraph/event_log.py +86 -37
- htmlgraph/event_migration.py +2 -1
- htmlgraph/file_watcher.py +12 -8
- htmlgraph/find_api.py +2 -1
- htmlgraph/git_events.py +67 -9
- htmlgraph/hooks/.htmlgraph/.session-warning-state.json +6 -0
- htmlgraph/hooks/.htmlgraph/agents.json +72 -0
- htmlgraph/hooks/.htmlgraph/index.sqlite +0 -0
- htmlgraph/hooks/__init__.py +8 -0
- htmlgraph/hooks/bootstrap.py +169 -0
- htmlgraph/hooks/cigs_pretool_enforcer.py +354 -0
- htmlgraph/hooks/concurrent_sessions.py +208 -0
- htmlgraph/hooks/context.py +350 -0
- htmlgraph/hooks/drift_handler.py +525 -0
- htmlgraph/hooks/event_tracker.py +790 -99
- htmlgraph/hooks/git_commands.py +175 -0
- htmlgraph/hooks/installer.py +5 -1
- htmlgraph/hooks/orchestrator.py +327 -76
- htmlgraph/hooks/orchestrator_reflector.py +31 -4
- htmlgraph/hooks/post_tool_use_failure.py +32 -7
- htmlgraph/hooks/post_tool_use_handler.py +257 -0
- htmlgraph/hooks/posttooluse.py +92 -19
- htmlgraph/hooks/pretooluse.py +527 -7
- htmlgraph/hooks/prompt_analyzer.py +637 -0
- htmlgraph/hooks/session_handler.py +668 -0
- htmlgraph/hooks/session_summary.py +395 -0
- htmlgraph/hooks/state_manager.py +504 -0
- htmlgraph/hooks/subagent_detection.py +202 -0
- htmlgraph/hooks/subagent_stop.py +369 -0
- htmlgraph/hooks/task_enforcer.py +99 -4
- htmlgraph/hooks/validator.py +212 -91
- htmlgraph/ids.py +2 -1
- htmlgraph/learning.py +125 -100
- htmlgraph/mcp_server.py +2 -1
- htmlgraph/models.py +217 -18
- htmlgraph/operations/README.md +62 -0
- htmlgraph/operations/__init__.py +79 -0
- htmlgraph/operations/analytics.py +339 -0
- htmlgraph/operations/bootstrap.py +289 -0
- htmlgraph/operations/events.py +244 -0
- htmlgraph/operations/fastapi_server.py +231 -0
- htmlgraph/operations/hooks.py +350 -0
- htmlgraph/operations/initialization.py +597 -0
- htmlgraph/operations/initialization.py.backup +228 -0
- htmlgraph/operations/server.py +303 -0
- htmlgraph/orchestration/__init__.py +58 -0
- htmlgraph/orchestration/claude_launcher.py +179 -0
- htmlgraph/orchestration/command_builder.py +72 -0
- htmlgraph/orchestration/headless_spawner.py +281 -0
- htmlgraph/orchestration/live_events.py +377 -0
- htmlgraph/orchestration/model_selection.py +327 -0
- htmlgraph/orchestration/plugin_manager.py +140 -0
- htmlgraph/orchestration/prompts.py +137 -0
- htmlgraph/orchestration/spawner_event_tracker.py +383 -0
- htmlgraph/orchestration/spawners/__init__.py +16 -0
- htmlgraph/orchestration/spawners/base.py +194 -0
- htmlgraph/orchestration/spawners/claude.py +173 -0
- htmlgraph/orchestration/spawners/codex.py +435 -0
- htmlgraph/orchestration/spawners/copilot.py +294 -0
- htmlgraph/orchestration/spawners/gemini.py +471 -0
- htmlgraph/orchestration/subprocess_runner.py +36 -0
- htmlgraph/{orchestration.py → orchestration/task_coordination.py} +16 -8
- htmlgraph/orchestration.md +563 -0
- htmlgraph/orchestrator-system-prompt-optimized.txt +863 -0
- htmlgraph/orchestrator.py +2 -1
- htmlgraph/orchestrator_config.py +357 -0
- htmlgraph/orchestrator_mode.py +115 -4
- htmlgraph/parallel.py +2 -1
- htmlgraph/parser.py +86 -6
- htmlgraph/path_query.py +608 -0
- htmlgraph/pattern_matcher.py +636 -0
- htmlgraph/pydantic_models.py +476 -0
- htmlgraph/quality_gates.py +350 -0
- htmlgraph/query_builder.py +2 -1
- htmlgraph/query_composer.py +509 -0
- htmlgraph/reflection.py +443 -0
- htmlgraph/refs.py +344 -0
- htmlgraph/repo_hash.py +512 -0
- htmlgraph/repositories/__init__.py +292 -0
- htmlgraph/repositories/analytics_repository.py +455 -0
- htmlgraph/repositories/analytics_repository_standard.py +628 -0
- htmlgraph/repositories/feature_repository.py +581 -0
- htmlgraph/repositories/feature_repository_htmlfile.py +668 -0
- htmlgraph/repositories/feature_repository_memory.py +607 -0
- htmlgraph/repositories/feature_repository_sqlite.py +858 -0
- htmlgraph/repositories/filter_service.py +620 -0
- htmlgraph/repositories/filter_service_standard.py +445 -0
- htmlgraph/repositories/shared_cache.py +621 -0
- htmlgraph/repositories/shared_cache_memory.py +395 -0
- htmlgraph/repositories/track_repository.py +552 -0
- htmlgraph/repositories/track_repository_htmlfile.py +619 -0
- htmlgraph/repositories/track_repository_memory.py +508 -0
- htmlgraph/repositories/track_repository_sqlite.py +711 -0
- htmlgraph/sdk/__init__.py +398 -0
- htmlgraph/sdk/__init__.pyi +14 -0
- htmlgraph/sdk/analytics/__init__.py +19 -0
- htmlgraph/sdk/analytics/engine.py +155 -0
- htmlgraph/sdk/analytics/helpers.py +178 -0
- htmlgraph/sdk/analytics/registry.py +109 -0
- htmlgraph/sdk/base.py +484 -0
- htmlgraph/sdk/constants.py +216 -0
- htmlgraph/sdk/core.pyi +308 -0
- htmlgraph/sdk/discovery.py +120 -0
- htmlgraph/sdk/help/__init__.py +12 -0
- htmlgraph/sdk/help/mixin.py +699 -0
- htmlgraph/sdk/mixins/__init__.py +15 -0
- htmlgraph/sdk/mixins/attribution.py +113 -0
- htmlgraph/sdk/mixins/mixin.py +410 -0
- htmlgraph/sdk/operations/__init__.py +12 -0
- htmlgraph/sdk/operations/mixin.py +427 -0
- htmlgraph/sdk/orchestration/__init__.py +17 -0
- htmlgraph/sdk/orchestration/coordinator.py +203 -0
- htmlgraph/sdk/orchestration/spawner.py +204 -0
- htmlgraph/sdk/planning/__init__.py +19 -0
- htmlgraph/sdk/planning/bottlenecks.py +93 -0
- htmlgraph/sdk/planning/mixin.py +211 -0
- htmlgraph/sdk/planning/parallel.py +186 -0
- htmlgraph/sdk/planning/queue.py +210 -0
- htmlgraph/sdk/planning/recommendations.py +87 -0
- htmlgraph/sdk/planning/smart_planning.py +319 -0
- htmlgraph/sdk/session/__init__.py +19 -0
- htmlgraph/sdk/session/continuity.py +57 -0
- htmlgraph/sdk/session/handoff.py +110 -0
- htmlgraph/sdk/session/info.py +309 -0
- htmlgraph/sdk/session/manager.py +103 -0
- htmlgraph/sdk/strategic/__init__.py +26 -0
- htmlgraph/sdk/strategic/mixin.py +563 -0
- htmlgraph/server.py +295 -107
- htmlgraph/session_hooks.py +300 -0
- htmlgraph/session_manager.py +285 -3
- htmlgraph/session_registry.py +587 -0
- htmlgraph/session_state.py +436 -0
- htmlgraph/session_warning.py +2 -1
- htmlgraph/sessions/__init__.py +23 -0
- htmlgraph/sessions/handoff.py +756 -0
- htmlgraph/system_prompts.py +450 -0
- htmlgraph/templates/orchestration-view.html +350 -0
- htmlgraph/track_builder.py +33 -1
- htmlgraph/track_manager.py +38 -0
- htmlgraph/transcript.py +18 -5
- htmlgraph/validation.py +115 -0
- htmlgraph/watch.py +2 -1
- htmlgraph/work_type_utils.py +2 -1
- {htmlgraph-0.20.1.data → htmlgraph-0.27.5.data}/data/htmlgraph/dashboard.html +2246 -248
- {htmlgraph-0.20.1.dist-info → htmlgraph-0.27.5.dist-info}/METADATA +95 -64
- htmlgraph-0.27.5.dist-info/RECORD +337 -0
- {htmlgraph-0.20.1.dist-info → htmlgraph-0.27.5.dist-info}/entry_points.txt +1 -1
- htmlgraph/cli.py +0 -4839
- htmlgraph/sdk.py +0 -2359
- htmlgraph-0.20.1.dist-info/RECORD +0 -118
- {htmlgraph-0.20.1.data → htmlgraph-0.27.5.data}/data/htmlgraph/styles.css +0 -0
- {htmlgraph-0.20.1.data → htmlgraph-0.27.5.data}/data/htmlgraph/templates/AGENTS.md.template +0 -0
- {htmlgraph-0.20.1.data → htmlgraph-0.27.5.data}/data/htmlgraph/templates/CLAUDE.md.template +0 -0
- {htmlgraph-0.20.1.data → htmlgraph-0.27.5.data}/data/htmlgraph/templates/GEMINI.md.template +0 -0
- {htmlgraph-0.20.1.dist-info → htmlgraph-0.27.5.dist-info}/WHEEL +0 -0
|
@@ -0,0 +1,472 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Basic Imperative Message Templates for CIGS (Level 0-1)
|
|
3
|
+
|
|
4
|
+
This module provides message generators for the Computational Imperative Guidance System.
|
|
5
|
+
It handles Level 0 (Guidance) and Level 1 (Imperative) messages with cost awareness.
|
|
6
|
+
|
|
7
|
+
Design Reference:
|
|
8
|
+
- CIGS Design Doc: .htmlgraph/spikes/computational-imperative-guidance-system-design.md
|
|
9
|
+
- Part 4: Appendix B.1-B.2 (Message Examples)
|
|
10
|
+
- Part 4.1: Message Escalation Levels
|
|
11
|
+
|
|
12
|
+
Architecture:
|
|
13
|
+
- BasicMessageGenerator: Level 0-1 templates with tool-specific messaging
|
|
14
|
+
- PositiveReinforcementGenerator: Positive feedback for correct delegation
|
|
15
|
+
- Tool-specific delegation suggestions (spawn_gemini, spawn_codex, spawn_copilot)
|
|
16
|
+
- Cost impact estimation and rationale generation
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
from dataclasses import dataclass
|
|
20
|
+
from enum import Enum
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class ToolCategory(Enum):
|
|
24
|
+
"""Classification of tools by operational type."""
|
|
25
|
+
|
|
26
|
+
EXPLORATION = "exploration" # Read, Grep, Glob
|
|
27
|
+
IMPLEMENTATION = "implementation" # Edit, Write, NotebookEdit
|
|
28
|
+
GIT_OPERATIONS = "git_operations" # git commands via Bash
|
|
29
|
+
TESTING = "testing" # pytest, npm test via Bash
|
|
30
|
+
UNKNOWN = "unknown"
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
@dataclass
|
|
34
|
+
class OperationContext:
|
|
35
|
+
"""Context for an operation being classified."""
|
|
36
|
+
|
|
37
|
+
tool: str
|
|
38
|
+
operation_type: str # e.g., "direct_read", "multiple_edits"
|
|
39
|
+
category: ToolCategory
|
|
40
|
+
predicted_cost: int = 5000 # Default estimated tokens
|
|
41
|
+
optimal_cost: int = 500 # Default with delegation
|
|
42
|
+
violation_count: int = 0 # Violations this session
|
|
43
|
+
is_sequence: bool = False # Part of a sequence
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class BasicMessageGenerator:
|
|
47
|
+
"""Generate Level 0-1 imperative messages for CIGS."""
|
|
48
|
+
|
|
49
|
+
# Tool-to-delegation mapping
|
|
50
|
+
DELEGATION_SUGGESTIONS = {
|
|
51
|
+
ToolCategory.EXPLORATION: {
|
|
52
|
+
"subagent": "spawn_gemini()",
|
|
53
|
+
"rationale": "Exploration operations have unpredictable scope. What looks like 'one Read' often becomes 3-5 reads. Each direct read pollutes your strategic context with tactical details.",
|
|
54
|
+
"example": "spawn_gemini(prompt='Search and analyze codebase for...')",
|
|
55
|
+
},
|
|
56
|
+
ToolCategory.IMPLEMENTATION: {
|
|
57
|
+
"subagent": "spawn_codex()",
|
|
58
|
+
"rationale": "Implementation requires iteration (write → test → fix → test). Delegating keeps your context focused on architecture, while subagent handles the edit-test cycle.",
|
|
59
|
+
"example": "spawn_codex(prompt='Implement feature X with full test coverage')",
|
|
60
|
+
},
|
|
61
|
+
ToolCategory.GIT_OPERATIONS: {
|
|
62
|
+
"subagent": "spawn_copilot()",
|
|
63
|
+
"rationale": "Git operations cascade unpredictably (hooks, conflicts, push failures). Copilot specializes in git AND costs 60% less than Task().",
|
|
64
|
+
"example": "spawn_copilot(prompt='Commit these changes with appropriate message')",
|
|
65
|
+
},
|
|
66
|
+
ToolCategory.TESTING: {
|
|
67
|
+
"subagent": "Task()",
|
|
68
|
+
"rationale": "Testing requires careful iteration and interpretation of results. Task() delegation keeps your context clean while handling the full test cycle.",
|
|
69
|
+
"example": "Task(prompt='Run all tests and fix failures')",
|
|
70
|
+
},
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
# Tool classification
|
|
74
|
+
TOOL_TO_CATEGORY = {
|
|
75
|
+
"Read": ToolCategory.EXPLORATION,
|
|
76
|
+
"Grep": ToolCategory.EXPLORATION,
|
|
77
|
+
"Glob": ToolCategory.EXPLORATION,
|
|
78
|
+
"Edit": ToolCategory.IMPLEMENTATION,
|
|
79
|
+
"Write": ToolCategory.IMPLEMENTATION,
|
|
80
|
+
"NotebookEdit": ToolCategory.IMPLEMENTATION,
|
|
81
|
+
"Delete": ToolCategory.IMPLEMENTATION,
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
def __init__(self) -> None:
|
|
85
|
+
"""Initialize message generator."""
|
|
86
|
+
pass
|
|
87
|
+
|
|
88
|
+
def generate_guidance(
|
|
89
|
+
self,
|
|
90
|
+
tool: str,
|
|
91
|
+
operation_type: str,
|
|
92
|
+
cost_estimate: int = 5000,
|
|
93
|
+
optimal_cost: int = 500,
|
|
94
|
+
) -> str:
|
|
95
|
+
"""
|
|
96
|
+
Generate Level 0 (Guidance) message - soft suggestion.
|
|
97
|
+
|
|
98
|
+
Args:
|
|
99
|
+
tool: Tool being used (Read, Edit, Bash, etc.)
|
|
100
|
+
operation_type: Type of operation (e.g., "direct_read", "exploration_sequence")
|
|
101
|
+
cost_estimate: Estimated tokens for direct execution
|
|
102
|
+
optimal_cost: Estimated tokens with delegation
|
|
103
|
+
|
|
104
|
+
Returns:
|
|
105
|
+
Formatted guidance message
|
|
106
|
+
"""
|
|
107
|
+
category = self._get_category(tool)
|
|
108
|
+
delegation = self.DELEGATION_SUGGESTIONS.get(category)
|
|
109
|
+
|
|
110
|
+
if not delegation:
|
|
111
|
+
return f"💡 GUIDANCE: Consider delegating {tool} operations for better efficiency."
|
|
112
|
+
|
|
113
|
+
savings_percent = int(((cost_estimate - optimal_cost) / cost_estimate) * 100)
|
|
114
|
+
|
|
115
|
+
return f"""💡 GUIDANCE: Consider delegating {tool} operations to {delegation["subagent"]}
|
|
116
|
+
|
|
117
|
+
{delegation["subagent"]} is designed for exploration work and can search your entire codebase efficiently.
|
|
118
|
+
Direct {tool} operations add ~{cost_estimate} tokens to your context per operation.
|
|
119
|
+
|
|
120
|
+
**Example:**
|
|
121
|
+
```python
|
|
122
|
+
{delegation["example"]}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
**Benefit:** Estimated {savings_percent}% token savings + cleaner context"""
|
|
126
|
+
|
|
127
|
+
def generate_imperative(
|
|
128
|
+
self,
|
|
129
|
+
tool: str,
|
|
130
|
+
operation_type: str,
|
|
131
|
+
cost_waste: int = 4500,
|
|
132
|
+
violation_count: int = 1,
|
|
133
|
+
) -> str:
|
|
134
|
+
"""
|
|
135
|
+
Generate Level 1 (Imperative) message - commanding with cost impact.
|
|
136
|
+
|
|
137
|
+
Args:
|
|
138
|
+
tool: Tool being used
|
|
139
|
+
operation_type: Type of operation
|
|
140
|
+
cost_waste: Estimated token waste from direct execution
|
|
141
|
+
violation_count: Number of violations so far this session
|
|
142
|
+
|
|
143
|
+
Returns:
|
|
144
|
+
Formatted imperative message with cost and delegation guidance
|
|
145
|
+
"""
|
|
146
|
+
category = self._get_category(tool)
|
|
147
|
+
delegation = self.DELEGATION_SUGGESTIONS.get(category)
|
|
148
|
+
|
|
149
|
+
if not delegation:
|
|
150
|
+
return f"🔴 IMPERATIVE: YOU MUST delegate {tool} operations."
|
|
151
|
+
|
|
152
|
+
rationale = self._get_rationale(operation_type, category)
|
|
153
|
+
cost_message = self._get_cost_message(tool, cost_waste)
|
|
154
|
+
warning_suffix = self._get_warning_suffix(violation_count)
|
|
155
|
+
|
|
156
|
+
return f"""🔴 IMPERATIVE: YOU MUST delegate {tool} operations to {delegation["subagent"]}.
|
|
157
|
+
|
|
158
|
+
**WHY:** {rationale}
|
|
159
|
+
|
|
160
|
+
{cost_message}
|
|
161
|
+
|
|
162
|
+
**INSTEAD:**
|
|
163
|
+
```python
|
|
164
|
+
{delegation["example"]}
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
{warning_suffix}"""
|
|
168
|
+
|
|
169
|
+
def generate_guidance_with_context(
|
|
170
|
+
self,
|
|
171
|
+
context: OperationContext,
|
|
172
|
+
) -> str:
|
|
173
|
+
"""
|
|
174
|
+
Generate Level 0 message from structured context.
|
|
175
|
+
|
|
176
|
+
Args:
|
|
177
|
+
context: OperationContext with all relevant details
|
|
178
|
+
|
|
179
|
+
Returns:
|
|
180
|
+
Formatted guidance message
|
|
181
|
+
"""
|
|
182
|
+
return self.generate_guidance(
|
|
183
|
+
tool=context.tool,
|
|
184
|
+
operation_type=context.operation_type,
|
|
185
|
+
cost_estimate=context.predicted_cost,
|
|
186
|
+
optimal_cost=context.optimal_cost,
|
|
187
|
+
)
|
|
188
|
+
|
|
189
|
+
def generate_imperative_with_context(
|
|
190
|
+
self,
|
|
191
|
+
context: OperationContext,
|
|
192
|
+
) -> str:
|
|
193
|
+
"""
|
|
194
|
+
Generate Level 1 message from structured context.
|
|
195
|
+
|
|
196
|
+
Args:
|
|
197
|
+
context: OperationContext with all relevant details
|
|
198
|
+
|
|
199
|
+
Returns:
|
|
200
|
+
Formatted imperative message
|
|
201
|
+
"""
|
|
202
|
+
cost_waste = context.predicted_cost - context.optimal_cost
|
|
203
|
+
return self.generate_imperative(
|
|
204
|
+
tool=context.tool,
|
|
205
|
+
operation_type=context.operation_type,
|
|
206
|
+
cost_waste=cost_waste,
|
|
207
|
+
violation_count=context.violation_count,
|
|
208
|
+
)
|
|
209
|
+
|
|
210
|
+
def _get_category(self, tool: str) -> ToolCategory:
|
|
211
|
+
"""Get tool category."""
|
|
212
|
+
return self.TOOL_TO_CATEGORY.get(tool, ToolCategory.UNKNOWN)
|
|
213
|
+
|
|
214
|
+
def _get_rationale(self, operation_type: str, category: ToolCategory) -> str:
|
|
215
|
+
"""Get specific rationale for operation type."""
|
|
216
|
+
rationales = {
|
|
217
|
+
"direct_exploration": (
|
|
218
|
+
"Exploration operations have unpredictable scope. "
|
|
219
|
+
"What looks like 'one Read' often becomes 3-5 reads. "
|
|
220
|
+
"Each direct read pollutes your strategic context with tactical details."
|
|
221
|
+
),
|
|
222
|
+
"exploration_sequence": (
|
|
223
|
+
"You have already executed multiple exploration operations. "
|
|
224
|
+
"This pattern indicates research work that should be delegated. "
|
|
225
|
+
"Subagent can explore comprehensively and return a summary."
|
|
226
|
+
),
|
|
227
|
+
"direct_implementation": (
|
|
228
|
+
"Implementation requires iteration (write → test → fix → test). "
|
|
229
|
+
"Delegating keeps your context focused on architecture, "
|
|
230
|
+
"while subagent handles the edit-test cycle."
|
|
231
|
+
),
|
|
232
|
+
"direct_git": (
|
|
233
|
+
"Git operations cascade unpredictably (hooks, conflicts, push failures). "
|
|
234
|
+
"Copilot specializes in git AND costs 60% less than Task()."
|
|
235
|
+
),
|
|
236
|
+
"direct_testing": (
|
|
237
|
+
"Test execution requires careful interpretation of results. "
|
|
238
|
+
"Task() delegation keeps your context clean while handling the full test cycle."
|
|
239
|
+
),
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
# Use provided rationale if available, otherwise use category default
|
|
243
|
+
if operation_type in rationales:
|
|
244
|
+
return rationales[operation_type]
|
|
245
|
+
|
|
246
|
+
delegation = self.DELEGATION_SUGGESTIONS.get(category)
|
|
247
|
+
return (
|
|
248
|
+
delegation["rationale"]
|
|
249
|
+
if delegation
|
|
250
|
+
else "Delegation preserves your strategic context."
|
|
251
|
+
)
|
|
252
|
+
|
|
253
|
+
def _get_cost_message(self, tool: str, cost_waste: int) -> str:
|
|
254
|
+
"""Generate cost impact message."""
|
|
255
|
+
optimal_estimate = max(500, cost_waste // 10) # Rough estimate
|
|
256
|
+
savings_pct = int((cost_waste / (cost_waste + optimal_estimate)) * 100)
|
|
257
|
+
|
|
258
|
+
return f"""**COST IMPACT:**
|
|
259
|
+
- Direct execution: ~{cost_waste + optimal_estimate} tokens in your context
|
|
260
|
+
- Delegation: ~{optimal_estimate} tokens ({savings_pct}% savings)
|
|
261
|
+
- This session waste so far: {cost_waste} tokens"""
|
|
262
|
+
|
|
263
|
+
def _get_warning_suffix(self, violation_count: int) -> str:
|
|
264
|
+
"""Get warning message based on violation count."""
|
|
265
|
+
if violation_count == 0:
|
|
266
|
+
return ""
|
|
267
|
+
elif violation_count == 1:
|
|
268
|
+
return "**NOTE:** This is your first violation this session. Next violation escalates to final warning."
|
|
269
|
+
elif violation_count == 2:
|
|
270
|
+
return "**WARNING:** This is your second violation this session. Next violation triggers circuit breaker."
|
|
271
|
+
else:
|
|
272
|
+
return "**CRITICAL:** Circuit breaker will trigger with next violation."
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
class PositiveReinforcementGenerator:
|
|
276
|
+
"""Generate positive feedback for correct delegation patterns."""
|
|
277
|
+
|
|
278
|
+
ENCOURAGEMENTS = [
|
|
279
|
+
"Excellent delegation pattern!",
|
|
280
|
+
"Perfect use of subagent!",
|
|
281
|
+
"Context preserved effectively!",
|
|
282
|
+
"Optimal delegation choice!",
|
|
283
|
+
"Great orchestration!",
|
|
284
|
+
"Superb task decomposition!",
|
|
285
|
+
]
|
|
286
|
+
|
|
287
|
+
def generate(
|
|
288
|
+
self,
|
|
289
|
+
tool: str,
|
|
290
|
+
cost_savings: int,
|
|
291
|
+
compliance_rate: float,
|
|
292
|
+
delegation_type: str = "Task",
|
|
293
|
+
) -> str:
|
|
294
|
+
"""
|
|
295
|
+
Generate positive reinforcement message.
|
|
296
|
+
|
|
297
|
+
Args:
|
|
298
|
+
tool: Tool that was delegated (spawn_gemini, Task, etc.)
|
|
299
|
+
cost_savings: Estimated tokens saved
|
|
300
|
+
compliance_rate: Delegation compliance rate (0.0-1.0)
|
|
301
|
+
delegation_type: Type of delegation ("Task", "spawn_gemini", etc.)
|
|
302
|
+
|
|
303
|
+
Returns:
|
|
304
|
+
Positive reinforcement message
|
|
305
|
+
"""
|
|
306
|
+
import random
|
|
307
|
+
|
|
308
|
+
base = random.choice(self.ENCOURAGEMENTS)
|
|
309
|
+
|
|
310
|
+
# Estimate context size saved
|
|
311
|
+
context_impact = f"~{cost_savings} tokens"
|
|
312
|
+
if cost_savings > 5000:
|
|
313
|
+
context_impact = "large portion of your"
|
|
314
|
+
|
|
315
|
+
return f"""✅ {base}
|
|
316
|
+
|
|
317
|
+
**Impact:**
|
|
318
|
+
- Saved {context_impact} of strategic context
|
|
319
|
+
- Subagent handled tactical details
|
|
320
|
+
- Your focus remained on orchestration
|
|
321
|
+
|
|
322
|
+
**Session Stats:**
|
|
323
|
+
- Delegation compliance: {compliance_rate:.0%}
|
|
324
|
+
- Keep maintaining this pattern! Consistent delegation improves response quality."""
|
|
325
|
+
|
|
326
|
+
def generate_from_metrics(
|
|
327
|
+
self,
|
|
328
|
+
actual_cost: int,
|
|
329
|
+
optimal_cost: int,
|
|
330
|
+
compliance_rate: float,
|
|
331
|
+
) -> str:
|
|
332
|
+
"""
|
|
333
|
+
Generate positive reinforcement from cost metrics.
|
|
334
|
+
|
|
335
|
+
Args:
|
|
336
|
+
actual_cost: Actual tokens used (with delegation)
|
|
337
|
+
optimal_cost: Optimal tokens for the operation
|
|
338
|
+
compliance_rate: Overall delegation compliance
|
|
339
|
+
|
|
340
|
+
Returns:
|
|
341
|
+
Positive reinforcement message
|
|
342
|
+
"""
|
|
343
|
+
cost_savings = max(0, actual_cost - optimal_cost)
|
|
344
|
+
return self.generate(
|
|
345
|
+
tool="subagent",
|
|
346
|
+
cost_savings=cost_savings,
|
|
347
|
+
compliance_rate=compliance_rate,
|
|
348
|
+
)
|
|
349
|
+
|
|
350
|
+
|
|
351
|
+
class MessageTemplateLibrary:
|
|
352
|
+
"""Pre-built message templates for common scenarios."""
|
|
353
|
+
|
|
354
|
+
# Template scenarios
|
|
355
|
+
TEMPLATES = {
|
|
356
|
+
"first_read": {
|
|
357
|
+
"level": 0,
|
|
358
|
+
"message": "💡 GUIDANCE: Reading a single file is allowed. If you need to explore multiple files, consider delegating to spawn_gemini() for comprehensive search.",
|
|
359
|
+
},
|
|
360
|
+
"second_read": {
|
|
361
|
+
"level": 1,
|
|
362
|
+
"message": "🔴 IMPERATIVE: YOU MUST delegate file reading. You've used 2 exploration tools - this indicates research work. Use spawn_gemini() for comprehensive analysis.",
|
|
363
|
+
},
|
|
364
|
+
"third_exploration": {
|
|
365
|
+
"level": 1,
|
|
366
|
+
"message": "🔴 IMPERATIVE: YOU MUST delegate NOW. Pattern detected: exploration sequence. spawn_gemini() can handle all remaining searches at once.",
|
|
367
|
+
},
|
|
368
|
+
"direct_edit": {
|
|
369
|
+
"level": 1,
|
|
370
|
+
"message": "🔴 IMPERATIVE: YOU MUST delegate code changes to spawn_codex(). This ensures full test cycle and prevents context pollution.",
|
|
371
|
+
},
|
|
372
|
+
"git_commit": {
|
|
373
|
+
"level": 1,
|
|
374
|
+
"message": "🔴 IMPERATIVE: YOU MUST delegate git operations to spawn_copilot(). Saves 60% tokens and handles hooks/conflicts automatically.",
|
|
375
|
+
},
|
|
376
|
+
"correct_delegation": {
|
|
377
|
+
"level": 0,
|
|
378
|
+
"message": "✅ Excellent! Delegating keeps your strategic context clean and improves response quality.",
|
|
379
|
+
},
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
@classmethod
|
|
383
|
+
def get_template(cls, scenario: str) -> str | None:
|
|
384
|
+
"""
|
|
385
|
+
Get a pre-built template for a scenario.
|
|
386
|
+
|
|
387
|
+
Args:
|
|
388
|
+
scenario: Template scenario key
|
|
389
|
+
|
|
390
|
+
Returns:
|
|
391
|
+
Message template or None if not found
|
|
392
|
+
"""
|
|
393
|
+
if scenario not in cls.TEMPLATES:
|
|
394
|
+
return None
|
|
395
|
+
template = cls.TEMPLATES[scenario].get("message")
|
|
396
|
+
return template if isinstance(template, str) else None
|
|
397
|
+
|
|
398
|
+
@classmethod
|
|
399
|
+
def list_scenarios(cls) -> list[str]:
|
|
400
|
+
"""List all available template scenarios."""
|
|
401
|
+
return list(cls.TEMPLATES.keys())
|
|
402
|
+
|
|
403
|
+
|
|
404
|
+
# Utility functions for hook integration
|
|
405
|
+
|
|
406
|
+
|
|
407
|
+
def classify_operation(
|
|
408
|
+
tool: str, history_count: int = 0, is_git: bool = False
|
|
409
|
+
) -> tuple[str, str]:
|
|
410
|
+
"""
|
|
411
|
+
Classify an operation for guidance generation.
|
|
412
|
+
|
|
413
|
+
Args:
|
|
414
|
+
tool: Tool name
|
|
415
|
+
history_count: Number of recent similar operations
|
|
416
|
+
is_git: Whether this is a git operation
|
|
417
|
+
|
|
418
|
+
Returns:
|
|
419
|
+
(operation_type, category_name) tuple
|
|
420
|
+
"""
|
|
421
|
+
if is_git:
|
|
422
|
+
return ("direct_git", "git_operations")
|
|
423
|
+
|
|
424
|
+
if tool in ["Read", "Grep", "Glob"]:
|
|
425
|
+
if history_count >= 2:
|
|
426
|
+
return ("exploration_sequence", "exploration")
|
|
427
|
+
return ("direct_exploration", "exploration")
|
|
428
|
+
|
|
429
|
+
if tool in ["Edit", "Write", "NotebookEdit", "Delete"]:
|
|
430
|
+
return ("direct_implementation", "implementation")
|
|
431
|
+
|
|
432
|
+
return ("unknown", "unknown")
|
|
433
|
+
|
|
434
|
+
|
|
435
|
+
def estimate_costs(
|
|
436
|
+
operation_type: str,
|
|
437
|
+
tool: str,
|
|
438
|
+
) -> tuple[int, int]:
|
|
439
|
+
"""
|
|
440
|
+
Estimate costs for an operation.
|
|
441
|
+
|
|
442
|
+
Args:
|
|
443
|
+
operation_type: Type of operation
|
|
444
|
+
tool: Tool being used
|
|
445
|
+
|
|
446
|
+
Returns:
|
|
447
|
+
(predicted_cost, optimal_cost) tuple in tokens
|
|
448
|
+
"""
|
|
449
|
+
# Base costs by tool
|
|
450
|
+
base_costs = {
|
|
451
|
+
"Read": 5000,
|
|
452
|
+
"Grep": 3000,
|
|
453
|
+
"Glob": 2000,
|
|
454
|
+
"Edit": 8000,
|
|
455
|
+
"Write": 6000,
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
predicted = base_costs.get(tool, 5000)
|
|
459
|
+
|
|
460
|
+
# Optimal costs with delegation
|
|
461
|
+
if tool in ["Read", "Grep", "Glob"]:
|
|
462
|
+
optimal = 500 # spawn_gemini very efficient
|
|
463
|
+
elif tool in ["Edit", "Write"]:
|
|
464
|
+
optimal = 2000 # spawn_codex handles iteration
|
|
465
|
+
else:
|
|
466
|
+
optimal = 1000
|
|
467
|
+
|
|
468
|
+
# Increase predicted cost for sequences
|
|
469
|
+
if "sequence" in operation_type:
|
|
470
|
+
predicted = int(predicted * 1.5)
|
|
471
|
+
|
|
472
|
+
return (predicted, optimal)
|