htmlgraph 0.9.3__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.
Files changed (331) hide show
  1. htmlgraph/.htmlgraph/.session-warning-state.json +6 -0
  2. htmlgraph/.htmlgraph/agents.json +72 -0
  3. htmlgraph/.htmlgraph/htmlgraph.db +0 -0
  4. htmlgraph/__init__.py +173 -17
  5. htmlgraph/__init__.pyi +123 -0
  6. htmlgraph/agent_detection.py +127 -0
  7. htmlgraph/agent_registry.py +45 -30
  8. htmlgraph/agents.py +160 -107
  9. htmlgraph/analytics/__init__.py +9 -2
  10. htmlgraph/analytics/cli.py +190 -51
  11. htmlgraph/analytics/cost_analyzer.py +391 -0
  12. htmlgraph/analytics/cost_monitor.py +664 -0
  13. htmlgraph/analytics/cost_reporter.py +675 -0
  14. htmlgraph/analytics/cross_session.py +617 -0
  15. htmlgraph/analytics/dependency.py +192 -100
  16. htmlgraph/analytics/pattern_learning.py +771 -0
  17. htmlgraph/analytics/session_graph.py +707 -0
  18. htmlgraph/analytics/strategic/__init__.py +80 -0
  19. htmlgraph/analytics/strategic/cost_optimizer.py +611 -0
  20. htmlgraph/analytics/strategic/pattern_detector.py +876 -0
  21. htmlgraph/analytics/strategic/preference_manager.py +709 -0
  22. htmlgraph/analytics/strategic/suggestion_engine.py +747 -0
  23. htmlgraph/analytics/work_type.py +190 -14
  24. htmlgraph/analytics_index.py +135 -51
  25. htmlgraph/api/__init__.py +3 -0
  26. htmlgraph/api/cost_alerts_websocket.py +416 -0
  27. htmlgraph/api/main.py +2498 -0
  28. htmlgraph/api/static/htmx.min.js +1 -0
  29. htmlgraph/api/static/style-redesign.css +1344 -0
  30. htmlgraph/api/static/style.css +1079 -0
  31. htmlgraph/api/templates/dashboard-redesign.html +1366 -0
  32. htmlgraph/api/templates/dashboard.html +794 -0
  33. htmlgraph/api/templates/partials/activity-feed-hierarchical.html +326 -0
  34. htmlgraph/api/templates/partials/activity-feed.html +1100 -0
  35. htmlgraph/api/templates/partials/agents-redesign.html +317 -0
  36. htmlgraph/api/templates/partials/agents.html +317 -0
  37. htmlgraph/api/templates/partials/event-traces.html +373 -0
  38. htmlgraph/api/templates/partials/features-kanban-redesign.html +509 -0
  39. htmlgraph/api/templates/partials/features.html +578 -0
  40. htmlgraph/api/templates/partials/metrics-redesign.html +346 -0
  41. htmlgraph/api/templates/partials/metrics.html +346 -0
  42. htmlgraph/api/templates/partials/orchestration-redesign.html +443 -0
  43. htmlgraph/api/templates/partials/orchestration.html +198 -0
  44. htmlgraph/api/templates/partials/spawners.html +375 -0
  45. htmlgraph/api/templates/partials/work-items.html +613 -0
  46. htmlgraph/api/websocket.py +538 -0
  47. htmlgraph/archive/__init__.py +24 -0
  48. htmlgraph/archive/bloom.py +234 -0
  49. htmlgraph/archive/fts.py +297 -0
  50. htmlgraph/archive/manager.py +583 -0
  51. htmlgraph/archive/search.py +244 -0
  52. htmlgraph/atomic_ops.py +560 -0
  53. htmlgraph/attribute_index.py +208 -0
  54. htmlgraph/bounded_paths.py +539 -0
  55. htmlgraph/builders/__init__.py +14 -0
  56. htmlgraph/builders/base.py +118 -29
  57. htmlgraph/builders/bug.py +150 -0
  58. htmlgraph/builders/chore.py +119 -0
  59. htmlgraph/builders/epic.py +150 -0
  60. htmlgraph/builders/feature.py +31 -6
  61. htmlgraph/builders/insight.py +195 -0
  62. htmlgraph/builders/metric.py +217 -0
  63. htmlgraph/builders/pattern.py +202 -0
  64. htmlgraph/builders/phase.py +162 -0
  65. htmlgraph/builders/spike.py +52 -19
  66. htmlgraph/builders/track.py +148 -72
  67. htmlgraph/cigs/__init__.py +81 -0
  68. htmlgraph/cigs/autonomy.py +385 -0
  69. htmlgraph/cigs/cost.py +475 -0
  70. htmlgraph/cigs/messages_basic.py +472 -0
  71. htmlgraph/cigs/messaging.py +365 -0
  72. htmlgraph/cigs/models.py +771 -0
  73. htmlgraph/cigs/pattern_storage.py +427 -0
  74. htmlgraph/cigs/patterns.py +503 -0
  75. htmlgraph/cigs/posttool_analyzer.py +234 -0
  76. htmlgraph/cigs/reporter.py +818 -0
  77. htmlgraph/cigs/tracker.py +317 -0
  78. htmlgraph/cli/.htmlgraph/.session-warning-state.json +6 -0
  79. htmlgraph/cli/.htmlgraph/agents.json +72 -0
  80. htmlgraph/cli/.htmlgraph/htmlgraph.db +0 -0
  81. htmlgraph/cli/__init__.py +42 -0
  82. htmlgraph/cli/__main__.py +6 -0
  83. htmlgraph/cli/analytics.py +1424 -0
  84. htmlgraph/cli/base.py +685 -0
  85. htmlgraph/cli/constants.py +206 -0
  86. htmlgraph/cli/core.py +954 -0
  87. htmlgraph/cli/main.py +147 -0
  88. htmlgraph/cli/models.py +475 -0
  89. htmlgraph/cli/templates/__init__.py +1 -0
  90. htmlgraph/cli/templates/cost_dashboard.py +399 -0
  91. htmlgraph/cli/work/__init__.py +239 -0
  92. htmlgraph/cli/work/browse.py +115 -0
  93. htmlgraph/cli/work/features.py +568 -0
  94. htmlgraph/cli/work/orchestration.py +676 -0
  95. htmlgraph/cli/work/report.py +728 -0
  96. htmlgraph/cli/work/sessions.py +466 -0
  97. htmlgraph/cli/work/snapshot.py +559 -0
  98. htmlgraph/cli/work/tracks.py +486 -0
  99. htmlgraph/cli_commands/__init__.py +1 -0
  100. htmlgraph/cli_commands/feature.py +195 -0
  101. htmlgraph/cli_framework.py +115 -0
  102. htmlgraph/collections/__init__.py +18 -0
  103. htmlgraph/collections/base.py +415 -98
  104. htmlgraph/collections/bug.py +53 -0
  105. htmlgraph/collections/chore.py +53 -0
  106. htmlgraph/collections/epic.py +53 -0
  107. htmlgraph/collections/feature.py +12 -26
  108. htmlgraph/collections/insight.py +100 -0
  109. htmlgraph/collections/metric.py +92 -0
  110. htmlgraph/collections/pattern.py +97 -0
  111. htmlgraph/collections/phase.py +53 -0
  112. htmlgraph/collections/session.py +194 -0
  113. htmlgraph/collections/spike.py +56 -16
  114. htmlgraph/collections/task_delegation.py +241 -0
  115. htmlgraph/collections/todo.py +511 -0
  116. htmlgraph/collections/traces.py +487 -0
  117. htmlgraph/config/cost_models.json +56 -0
  118. htmlgraph/config.py +190 -0
  119. htmlgraph/context_analytics.py +344 -0
  120. htmlgraph/converter.py +216 -28
  121. htmlgraph/cost_analysis/__init__.py +5 -0
  122. htmlgraph/cost_analysis/analyzer.py +438 -0
  123. htmlgraph/dashboard.html +2406 -307
  124. htmlgraph/dashboard.html.backup +6592 -0
  125. htmlgraph/dashboard.html.bak +7181 -0
  126. htmlgraph/dashboard.html.bak2 +7231 -0
  127. htmlgraph/dashboard.html.bak3 +7232 -0
  128. htmlgraph/db/__init__.py +38 -0
  129. htmlgraph/db/queries.py +790 -0
  130. htmlgraph/db/schema.py +1788 -0
  131. htmlgraph/decorators.py +317 -0
  132. htmlgraph/dependency_models.py +19 -2
  133. htmlgraph/deploy.py +142 -125
  134. htmlgraph/deployment_models.py +474 -0
  135. htmlgraph/docs/API_REFERENCE.md +841 -0
  136. htmlgraph/docs/HTTP_API.md +750 -0
  137. htmlgraph/docs/INTEGRATION_GUIDE.md +752 -0
  138. htmlgraph/docs/ORCHESTRATION_PATTERNS.md +717 -0
  139. htmlgraph/docs/README.md +532 -0
  140. htmlgraph/docs/__init__.py +77 -0
  141. htmlgraph/docs/docs_version.py +55 -0
  142. htmlgraph/docs/metadata.py +93 -0
  143. htmlgraph/docs/migrations.py +232 -0
  144. htmlgraph/docs/template_engine.py +143 -0
  145. htmlgraph/docs/templates/_sections/cli_reference.md.j2 +52 -0
  146. htmlgraph/docs/templates/_sections/core_concepts.md.j2 +29 -0
  147. htmlgraph/docs/templates/_sections/sdk_basics.md.j2 +69 -0
  148. htmlgraph/docs/templates/base_agents.md.j2 +78 -0
  149. htmlgraph/docs/templates/example_user_override.md.j2 +47 -0
  150. htmlgraph/docs/version_check.py +163 -0
  151. htmlgraph/edge_index.py +182 -27
  152. htmlgraph/error_handler.py +544 -0
  153. htmlgraph/event_log.py +100 -52
  154. htmlgraph/event_migration.py +13 -4
  155. htmlgraph/exceptions.py +49 -0
  156. htmlgraph/file_watcher.py +101 -28
  157. htmlgraph/find_api.py +75 -63
  158. htmlgraph/git_events.py +145 -63
  159. htmlgraph/graph.py +1122 -106
  160. htmlgraph/hooks/.htmlgraph/.session-warning-state.json +6 -0
  161. htmlgraph/hooks/.htmlgraph/agents.json +72 -0
  162. htmlgraph/hooks/.htmlgraph/index.sqlite +0 -0
  163. htmlgraph/hooks/__init__.py +45 -0
  164. htmlgraph/hooks/bootstrap.py +169 -0
  165. htmlgraph/hooks/cigs_pretool_enforcer.py +354 -0
  166. htmlgraph/hooks/concurrent_sessions.py +208 -0
  167. htmlgraph/hooks/context.py +350 -0
  168. htmlgraph/hooks/drift_handler.py +525 -0
  169. htmlgraph/hooks/event_tracker.py +1314 -0
  170. htmlgraph/hooks/git_commands.py +175 -0
  171. htmlgraph/hooks/hooks-config.example.json +12 -0
  172. htmlgraph/hooks/installer.py +343 -0
  173. htmlgraph/hooks/orchestrator.py +674 -0
  174. htmlgraph/hooks/orchestrator_reflector.py +223 -0
  175. htmlgraph/hooks/post-checkout.sh +28 -0
  176. htmlgraph/hooks/post-commit.sh +24 -0
  177. htmlgraph/hooks/post-merge.sh +26 -0
  178. htmlgraph/hooks/post_tool_use_failure.py +273 -0
  179. htmlgraph/hooks/post_tool_use_handler.py +257 -0
  180. htmlgraph/hooks/posttooluse.py +408 -0
  181. htmlgraph/hooks/pre-commit.sh +94 -0
  182. htmlgraph/hooks/pre-push.sh +28 -0
  183. htmlgraph/hooks/pretooluse.py +819 -0
  184. htmlgraph/hooks/prompt_analyzer.py +637 -0
  185. htmlgraph/hooks/session_handler.py +668 -0
  186. htmlgraph/hooks/session_summary.py +395 -0
  187. htmlgraph/hooks/state_manager.py +504 -0
  188. htmlgraph/hooks/subagent_detection.py +202 -0
  189. htmlgraph/hooks/subagent_stop.py +369 -0
  190. htmlgraph/hooks/task_enforcer.py +255 -0
  191. htmlgraph/hooks/task_validator.py +177 -0
  192. htmlgraph/hooks/validator.py +628 -0
  193. htmlgraph/ids.py +41 -27
  194. htmlgraph/index.d.ts +286 -0
  195. htmlgraph/learning.py +767 -0
  196. htmlgraph/mcp_server.py +69 -23
  197. htmlgraph/models.py +1586 -87
  198. htmlgraph/operations/README.md +62 -0
  199. htmlgraph/operations/__init__.py +79 -0
  200. htmlgraph/operations/analytics.py +339 -0
  201. htmlgraph/operations/bootstrap.py +289 -0
  202. htmlgraph/operations/events.py +244 -0
  203. htmlgraph/operations/fastapi_server.py +231 -0
  204. htmlgraph/operations/hooks.py +350 -0
  205. htmlgraph/operations/initialization.py +597 -0
  206. htmlgraph/operations/initialization.py.backup +228 -0
  207. htmlgraph/operations/server.py +303 -0
  208. htmlgraph/orchestration/__init__.py +58 -0
  209. htmlgraph/orchestration/claude_launcher.py +179 -0
  210. htmlgraph/orchestration/command_builder.py +72 -0
  211. htmlgraph/orchestration/headless_spawner.py +281 -0
  212. htmlgraph/orchestration/live_events.py +377 -0
  213. htmlgraph/orchestration/model_selection.py +327 -0
  214. htmlgraph/orchestration/plugin_manager.py +140 -0
  215. htmlgraph/orchestration/prompts.py +137 -0
  216. htmlgraph/orchestration/spawner_event_tracker.py +383 -0
  217. htmlgraph/orchestration/spawners/__init__.py +16 -0
  218. htmlgraph/orchestration/spawners/base.py +194 -0
  219. htmlgraph/orchestration/spawners/claude.py +173 -0
  220. htmlgraph/orchestration/spawners/codex.py +435 -0
  221. htmlgraph/orchestration/spawners/copilot.py +294 -0
  222. htmlgraph/orchestration/spawners/gemini.py +471 -0
  223. htmlgraph/orchestration/subprocess_runner.py +36 -0
  224. htmlgraph/orchestration/task_coordination.py +343 -0
  225. htmlgraph/orchestration.md +563 -0
  226. htmlgraph/orchestrator-system-prompt-optimized.txt +863 -0
  227. htmlgraph/orchestrator.py +669 -0
  228. htmlgraph/orchestrator_config.py +357 -0
  229. htmlgraph/orchestrator_mode.py +328 -0
  230. htmlgraph/orchestrator_validator.py +133 -0
  231. htmlgraph/parallel.py +646 -0
  232. htmlgraph/parser.py +160 -35
  233. htmlgraph/path_query.py +608 -0
  234. htmlgraph/pattern_matcher.py +636 -0
  235. htmlgraph/planning.py +147 -52
  236. htmlgraph/pydantic_models.py +476 -0
  237. htmlgraph/quality_gates.py +350 -0
  238. htmlgraph/query_builder.py +109 -72
  239. htmlgraph/query_composer.py +509 -0
  240. htmlgraph/reflection.py +443 -0
  241. htmlgraph/refs.py +344 -0
  242. htmlgraph/repo_hash.py +512 -0
  243. htmlgraph/repositories/__init__.py +292 -0
  244. htmlgraph/repositories/analytics_repository.py +455 -0
  245. htmlgraph/repositories/analytics_repository_standard.py +628 -0
  246. htmlgraph/repositories/feature_repository.py +581 -0
  247. htmlgraph/repositories/feature_repository_htmlfile.py +668 -0
  248. htmlgraph/repositories/feature_repository_memory.py +607 -0
  249. htmlgraph/repositories/feature_repository_sqlite.py +858 -0
  250. htmlgraph/repositories/filter_service.py +620 -0
  251. htmlgraph/repositories/filter_service_standard.py +445 -0
  252. htmlgraph/repositories/shared_cache.py +621 -0
  253. htmlgraph/repositories/shared_cache_memory.py +395 -0
  254. htmlgraph/repositories/track_repository.py +552 -0
  255. htmlgraph/repositories/track_repository_htmlfile.py +619 -0
  256. htmlgraph/repositories/track_repository_memory.py +508 -0
  257. htmlgraph/repositories/track_repository_sqlite.py +711 -0
  258. htmlgraph/routing.py +8 -19
  259. htmlgraph/scripts/deploy.py +1 -2
  260. htmlgraph/sdk/__init__.py +398 -0
  261. htmlgraph/sdk/__init__.pyi +14 -0
  262. htmlgraph/sdk/analytics/__init__.py +19 -0
  263. htmlgraph/sdk/analytics/engine.py +155 -0
  264. htmlgraph/sdk/analytics/helpers.py +178 -0
  265. htmlgraph/sdk/analytics/registry.py +109 -0
  266. htmlgraph/sdk/base.py +484 -0
  267. htmlgraph/sdk/constants.py +216 -0
  268. htmlgraph/sdk/core.pyi +308 -0
  269. htmlgraph/sdk/discovery.py +120 -0
  270. htmlgraph/sdk/help/__init__.py +12 -0
  271. htmlgraph/sdk/help/mixin.py +699 -0
  272. htmlgraph/sdk/mixins/__init__.py +15 -0
  273. htmlgraph/sdk/mixins/attribution.py +113 -0
  274. htmlgraph/sdk/mixins/mixin.py +410 -0
  275. htmlgraph/sdk/operations/__init__.py +12 -0
  276. htmlgraph/sdk/operations/mixin.py +427 -0
  277. htmlgraph/sdk/orchestration/__init__.py +17 -0
  278. htmlgraph/sdk/orchestration/coordinator.py +203 -0
  279. htmlgraph/sdk/orchestration/spawner.py +204 -0
  280. htmlgraph/sdk/planning/__init__.py +19 -0
  281. htmlgraph/sdk/planning/bottlenecks.py +93 -0
  282. htmlgraph/sdk/planning/mixin.py +211 -0
  283. htmlgraph/sdk/planning/parallel.py +186 -0
  284. htmlgraph/sdk/planning/queue.py +210 -0
  285. htmlgraph/sdk/planning/recommendations.py +87 -0
  286. htmlgraph/sdk/planning/smart_planning.py +319 -0
  287. htmlgraph/sdk/session/__init__.py +19 -0
  288. htmlgraph/sdk/session/continuity.py +57 -0
  289. htmlgraph/sdk/session/handoff.py +110 -0
  290. htmlgraph/sdk/session/info.py +309 -0
  291. htmlgraph/sdk/session/manager.py +103 -0
  292. htmlgraph/sdk/strategic/__init__.py +26 -0
  293. htmlgraph/sdk/strategic/mixin.py +563 -0
  294. htmlgraph/server.py +685 -180
  295. htmlgraph/services/__init__.py +10 -0
  296. htmlgraph/services/claiming.py +199 -0
  297. htmlgraph/session_hooks.py +300 -0
  298. htmlgraph/session_manager.py +1392 -175
  299. htmlgraph/session_registry.py +587 -0
  300. htmlgraph/session_state.py +436 -0
  301. htmlgraph/session_warning.py +201 -0
  302. htmlgraph/sessions/__init__.py +23 -0
  303. htmlgraph/sessions/handoff.py +756 -0
  304. htmlgraph/setup.py +34 -17
  305. htmlgraph/spike_index.py +143 -0
  306. htmlgraph/sync_docs.py +12 -15
  307. htmlgraph/system_prompts.py +450 -0
  308. htmlgraph/templates/AGENTS.md.template +366 -0
  309. htmlgraph/templates/CLAUDE.md.template +97 -0
  310. htmlgraph/templates/GEMINI.md.template +87 -0
  311. htmlgraph/templates/orchestration-view.html +350 -0
  312. htmlgraph/track_builder.py +146 -15
  313. htmlgraph/track_manager.py +69 -21
  314. htmlgraph/transcript.py +890 -0
  315. htmlgraph/transcript_analytics.py +699 -0
  316. htmlgraph/types.py +323 -0
  317. htmlgraph/validation.py +115 -0
  318. htmlgraph/watch.py +8 -5
  319. htmlgraph/work_type_utils.py +3 -2
  320. {htmlgraph-0.9.3.data → htmlgraph-0.27.5.data}/data/htmlgraph/dashboard.html +2406 -307
  321. htmlgraph-0.27.5.data/data/htmlgraph/templates/AGENTS.md.template +366 -0
  322. htmlgraph-0.27.5.data/data/htmlgraph/templates/CLAUDE.md.template +97 -0
  323. htmlgraph-0.27.5.data/data/htmlgraph/templates/GEMINI.md.template +87 -0
  324. {htmlgraph-0.9.3.dist-info → htmlgraph-0.27.5.dist-info}/METADATA +97 -64
  325. htmlgraph-0.27.5.dist-info/RECORD +337 -0
  326. {htmlgraph-0.9.3.dist-info → htmlgraph-0.27.5.dist-info}/entry_points.txt +1 -1
  327. htmlgraph/cli.py +0 -2688
  328. htmlgraph/sdk.py +0 -709
  329. htmlgraph-0.9.3.dist-info/RECORD +0 -61
  330. {htmlgraph-0.9.3.data → htmlgraph-0.27.5.data}/data/htmlgraph/styles.css +0 -0
  331. {htmlgraph-0.9.3.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)