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.
Files changed (304) 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 +51 -1
  5. htmlgraph/__init__.pyi +123 -0
  6. htmlgraph/agent_detection.py +26 -10
  7. htmlgraph/agent_registry.py +2 -1
  8. htmlgraph/analytics/__init__.py +8 -1
  9. htmlgraph/analytics/cli.py +86 -20
  10. htmlgraph/analytics/cost_analyzer.py +391 -0
  11. htmlgraph/analytics/cost_monitor.py +664 -0
  12. htmlgraph/analytics/cost_reporter.py +675 -0
  13. htmlgraph/analytics/cross_session.py +617 -0
  14. htmlgraph/analytics/dependency.py +10 -6
  15. htmlgraph/analytics/pattern_learning.py +771 -0
  16. htmlgraph/analytics/session_graph.py +707 -0
  17. htmlgraph/analytics/strategic/__init__.py +80 -0
  18. htmlgraph/analytics/strategic/cost_optimizer.py +611 -0
  19. htmlgraph/analytics/strategic/pattern_detector.py +876 -0
  20. htmlgraph/analytics/strategic/preference_manager.py +709 -0
  21. htmlgraph/analytics/strategic/suggestion_engine.py +747 -0
  22. htmlgraph/analytics/work_type.py +67 -27
  23. htmlgraph/analytics_index.py +53 -20
  24. htmlgraph/api/__init__.py +3 -0
  25. htmlgraph/api/cost_alerts_websocket.py +416 -0
  26. htmlgraph/api/main.py +2498 -0
  27. htmlgraph/api/static/htmx.min.js +1 -0
  28. htmlgraph/api/static/style-redesign.css +1344 -0
  29. htmlgraph/api/static/style.css +1079 -0
  30. htmlgraph/api/templates/dashboard-redesign.html +1366 -0
  31. htmlgraph/api/templates/dashboard.html +794 -0
  32. htmlgraph/api/templates/partials/activity-feed-hierarchical.html +326 -0
  33. htmlgraph/api/templates/partials/activity-feed.html +1100 -0
  34. htmlgraph/api/templates/partials/agents-redesign.html +317 -0
  35. htmlgraph/api/templates/partials/agents.html +317 -0
  36. htmlgraph/api/templates/partials/event-traces.html +373 -0
  37. htmlgraph/api/templates/partials/features-kanban-redesign.html +509 -0
  38. htmlgraph/api/templates/partials/features.html +578 -0
  39. htmlgraph/api/templates/partials/metrics-redesign.html +346 -0
  40. htmlgraph/api/templates/partials/metrics.html +346 -0
  41. htmlgraph/api/templates/partials/orchestration-redesign.html +443 -0
  42. htmlgraph/api/templates/partials/orchestration.html +198 -0
  43. htmlgraph/api/templates/partials/spawners.html +375 -0
  44. htmlgraph/api/templates/partials/work-items.html +613 -0
  45. htmlgraph/api/websocket.py +538 -0
  46. htmlgraph/archive/__init__.py +24 -0
  47. htmlgraph/archive/bloom.py +234 -0
  48. htmlgraph/archive/fts.py +297 -0
  49. htmlgraph/archive/manager.py +583 -0
  50. htmlgraph/archive/search.py +244 -0
  51. htmlgraph/atomic_ops.py +560 -0
  52. htmlgraph/attribute_index.py +2 -1
  53. htmlgraph/bounded_paths.py +539 -0
  54. htmlgraph/builders/base.py +57 -2
  55. htmlgraph/builders/bug.py +19 -3
  56. htmlgraph/builders/chore.py +19 -3
  57. htmlgraph/builders/epic.py +19 -3
  58. htmlgraph/builders/feature.py +27 -3
  59. htmlgraph/builders/insight.py +2 -1
  60. htmlgraph/builders/metric.py +2 -1
  61. htmlgraph/builders/pattern.py +2 -1
  62. htmlgraph/builders/phase.py +19 -3
  63. htmlgraph/builders/spike.py +29 -3
  64. htmlgraph/builders/track.py +42 -1
  65. htmlgraph/cigs/__init__.py +81 -0
  66. htmlgraph/cigs/autonomy.py +385 -0
  67. htmlgraph/cigs/cost.py +475 -0
  68. htmlgraph/cigs/messages_basic.py +472 -0
  69. htmlgraph/cigs/messaging.py +365 -0
  70. htmlgraph/cigs/models.py +771 -0
  71. htmlgraph/cigs/pattern_storage.py +427 -0
  72. htmlgraph/cigs/patterns.py +503 -0
  73. htmlgraph/cigs/posttool_analyzer.py +234 -0
  74. htmlgraph/cigs/reporter.py +818 -0
  75. htmlgraph/cigs/tracker.py +317 -0
  76. htmlgraph/cli/.htmlgraph/.session-warning-state.json +6 -0
  77. htmlgraph/cli/.htmlgraph/agents.json +72 -0
  78. htmlgraph/cli/.htmlgraph/htmlgraph.db +0 -0
  79. htmlgraph/cli/__init__.py +42 -0
  80. htmlgraph/cli/__main__.py +6 -0
  81. htmlgraph/cli/analytics.py +1424 -0
  82. htmlgraph/cli/base.py +685 -0
  83. htmlgraph/cli/constants.py +206 -0
  84. htmlgraph/cli/core.py +954 -0
  85. htmlgraph/cli/main.py +147 -0
  86. htmlgraph/cli/models.py +475 -0
  87. htmlgraph/cli/templates/__init__.py +1 -0
  88. htmlgraph/cli/templates/cost_dashboard.py +399 -0
  89. htmlgraph/cli/work/__init__.py +239 -0
  90. htmlgraph/cli/work/browse.py +115 -0
  91. htmlgraph/cli/work/features.py +568 -0
  92. htmlgraph/cli/work/orchestration.py +676 -0
  93. htmlgraph/cli/work/report.py +728 -0
  94. htmlgraph/cli/work/sessions.py +466 -0
  95. htmlgraph/cli/work/snapshot.py +559 -0
  96. htmlgraph/cli/work/tracks.py +486 -0
  97. htmlgraph/cli_commands/__init__.py +1 -0
  98. htmlgraph/cli_commands/feature.py +195 -0
  99. htmlgraph/cli_framework.py +115 -0
  100. htmlgraph/collections/__init__.py +2 -0
  101. htmlgraph/collections/base.py +197 -14
  102. htmlgraph/collections/bug.py +2 -1
  103. htmlgraph/collections/chore.py +2 -1
  104. htmlgraph/collections/epic.py +2 -1
  105. htmlgraph/collections/feature.py +2 -1
  106. htmlgraph/collections/insight.py +2 -1
  107. htmlgraph/collections/metric.py +2 -1
  108. htmlgraph/collections/pattern.py +2 -1
  109. htmlgraph/collections/phase.py +2 -1
  110. htmlgraph/collections/session.py +194 -0
  111. htmlgraph/collections/spike.py +13 -2
  112. htmlgraph/collections/task_delegation.py +241 -0
  113. htmlgraph/collections/todo.py +14 -1
  114. htmlgraph/collections/traces.py +487 -0
  115. htmlgraph/config/cost_models.json +56 -0
  116. htmlgraph/config.py +190 -0
  117. htmlgraph/context_analytics.py +2 -1
  118. htmlgraph/converter.py +116 -7
  119. htmlgraph/cost_analysis/__init__.py +5 -0
  120. htmlgraph/cost_analysis/analyzer.py +438 -0
  121. htmlgraph/dashboard.html +2246 -248
  122. htmlgraph/dashboard.html.backup +6592 -0
  123. htmlgraph/dashboard.html.bak +7181 -0
  124. htmlgraph/dashboard.html.bak2 +7231 -0
  125. htmlgraph/dashboard.html.bak3 +7232 -0
  126. htmlgraph/db/__init__.py +38 -0
  127. htmlgraph/db/queries.py +790 -0
  128. htmlgraph/db/schema.py +1788 -0
  129. htmlgraph/decorators.py +317 -0
  130. htmlgraph/dependency_models.py +2 -1
  131. htmlgraph/deploy.py +26 -27
  132. htmlgraph/docs/API_REFERENCE.md +841 -0
  133. htmlgraph/docs/HTTP_API.md +750 -0
  134. htmlgraph/docs/INTEGRATION_GUIDE.md +752 -0
  135. htmlgraph/docs/ORCHESTRATION_PATTERNS.md +717 -0
  136. htmlgraph/docs/README.md +532 -0
  137. htmlgraph/docs/__init__.py +77 -0
  138. htmlgraph/docs/docs_version.py +55 -0
  139. htmlgraph/docs/metadata.py +93 -0
  140. htmlgraph/docs/migrations.py +232 -0
  141. htmlgraph/docs/template_engine.py +143 -0
  142. htmlgraph/docs/templates/_sections/cli_reference.md.j2 +52 -0
  143. htmlgraph/docs/templates/_sections/core_concepts.md.j2 +29 -0
  144. htmlgraph/docs/templates/_sections/sdk_basics.md.j2 +69 -0
  145. htmlgraph/docs/templates/base_agents.md.j2 +78 -0
  146. htmlgraph/docs/templates/example_user_override.md.j2 +47 -0
  147. htmlgraph/docs/version_check.py +163 -0
  148. htmlgraph/edge_index.py +2 -1
  149. htmlgraph/error_handler.py +544 -0
  150. htmlgraph/event_log.py +86 -37
  151. htmlgraph/event_migration.py +2 -1
  152. htmlgraph/file_watcher.py +12 -8
  153. htmlgraph/find_api.py +2 -1
  154. htmlgraph/git_events.py +67 -9
  155. htmlgraph/hooks/.htmlgraph/.session-warning-state.json +6 -0
  156. htmlgraph/hooks/.htmlgraph/agents.json +72 -0
  157. htmlgraph/hooks/.htmlgraph/index.sqlite +0 -0
  158. htmlgraph/hooks/__init__.py +8 -0
  159. htmlgraph/hooks/bootstrap.py +169 -0
  160. htmlgraph/hooks/cigs_pretool_enforcer.py +354 -0
  161. htmlgraph/hooks/concurrent_sessions.py +208 -0
  162. htmlgraph/hooks/context.py +350 -0
  163. htmlgraph/hooks/drift_handler.py +525 -0
  164. htmlgraph/hooks/event_tracker.py +790 -99
  165. htmlgraph/hooks/git_commands.py +175 -0
  166. htmlgraph/hooks/installer.py +5 -1
  167. htmlgraph/hooks/orchestrator.py +327 -76
  168. htmlgraph/hooks/orchestrator_reflector.py +31 -4
  169. htmlgraph/hooks/post_tool_use_failure.py +32 -7
  170. htmlgraph/hooks/post_tool_use_handler.py +257 -0
  171. htmlgraph/hooks/posttooluse.py +92 -19
  172. htmlgraph/hooks/pretooluse.py +527 -7
  173. htmlgraph/hooks/prompt_analyzer.py +637 -0
  174. htmlgraph/hooks/session_handler.py +668 -0
  175. htmlgraph/hooks/session_summary.py +395 -0
  176. htmlgraph/hooks/state_manager.py +504 -0
  177. htmlgraph/hooks/subagent_detection.py +202 -0
  178. htmlgraph/hooks/subagent_stop.py +369 -0
  179. htmlgraph/hooks/task_enforcer.py +99 -4
  180. htmlgraph/hooks/validator.py +212 -91
  181. htmlgraph/ids.py +2 -1
  182. htmlgraph/learning.py +125 -100
  183. htmlgraph/mcp_server.py +2 -1
  184. htmlgraph/models.py +217 -18
  185. htmlgraph/operations/README.md +62 -0
  186. htmlgraph/operations/__init__.py +79 -0
  187. htmlgraph/operations/analytics.py +339 -0
  188. htmlgraph/operations/bootstrap.py +289 -0
  189. htmlgraph/operations/events.py +244 -0
  190. htmlgraph/operations/fastapi_server.py +231 -0
  191. htmlgraph/operations/hooks.py +350 -0
  192. htmlgraph/operations/initialization.py +597 -0
  193. htmlgraph/operations/initialization.py.backup +228 -0
  194. htmlgraph/operations/server.py +303 -0
  195. htmlgraph/orchestration/__init__.py +58 -0
  196. htmlgraph/orchestration/claude_launcher.py +179 -0
  197. htmlgraph/orchestration/command_builder.py +72 -0
  198. htmlgraph/orchestration/headless_spawner.py +281 -0
  199. htmlgraph/orchestration/live_events.py +377 -0
  200. htmlgraph/orchestration/model_selection.py +327 -0
  201. htmlgraph/orchestration/plugin_manager.py +140 -0
  202. htmlgraph/orchestration/prompts.py +137 -0
  203. htmlgraph/orchestration/spawner_event_tracker.py +383 -0
  204. htmlgraph/orchestration/spawners/__init__.py +16 -0
  205. htmlgraph/orchestration/spawners/base.py +194 -0
  206. htmlgraph/orchestration/spawners/claude.py +173 -0
  207. htmlgraph/orchestration/spawners/codex.py +435 -0
  208. htmlgraph/orchestration/spawners/copilot.py +294 -0
  209. htmlgraph/orchestration/spawners/gemini.py +471 -0
  210. htmlgraph/orchestration/subprocess_runner.py +36 -0
  211. htmlgraph/{orchestration.py → orchestration/task_coordination.py} +16 -8
  212. htmlgraph/orchestration.md +563 -0
  213. htmlgraph/orchestrator-system-prompt-optimized.txt +863 -0
  214. htmlgraph/orchestrator.py +2 -1
  215. htmlgraph/orchestrator_config.py +357 -0
  216. htmlgraph/orchestrator_mode.py +115 -4
  217. htmlgraph/parallel.py +2 -1
  218. htmlgraph/parser.py +86 -6
  219. htmlgraph/path_query.py +608 -0
  220. htmlgraph/pattern_matcher.py +636 -0
  221. htmlgraph/pydantic_models.py +476 -0
  222. htmlgraph/quality_gates.py +350 -0
  223. htmlgraph/query_builder.py +2 -1
  224. htmlgraph/query_composer.py +509 -0
  225. htmlgraph/reflection.py +443 -0
  226. htmlgraph/refs.py +344 -0
  227. htmlgraph/repo_hash.py +512 -0
  228. htmlgraph/repositories/__init__.py +292 -0
  229. htmlgraph/repositories/analytics_repository.py +455 -0
  230. htmlgraph/repositories/analytics_repository_standard.py +628 -0
  231. htmlgraph/repositories/feature_repository.py +581 -0
  232. htmlgraph/repositories/feature_repository_htmlfile.py +668 -0
  233. htmlgraph/repositories/feature_repository_memory.py +607 -0
  234. htmlgraph/repositories/feature_repository_sqlite.py +858 -0
  235. htmlgraph/repositories/filter_service.py +620 -0
  236. htmlgraph/repositories/filter_service_standard.py +445 -0
  237. htmlgraph/repositories/shared_cache.py +621 -0
  238. htmlgraph/repositories/shared_cache_memory.py +395 -0
  239. htmlgraph/repositories/track_repository.py +552 -0
  240. htmlgraph/repositories/track_repository_htmlfile.py +619 -0
  241. htmlgraph/repositories/track_repository_memory.py +508 -0
  242. htmlgraph/repositories/track_repository_sqlite.py +711 -0
  243. htmlgraph/sdk/__init__.py +398 -0
  244. htmlgraph/sdk/__init__.pyi +14 -0
  245. htmlgraph/sdk/analytics/__init__.py +19 -0
  246. htmlgraph/sdk/analytics/engine.py +155 -0
  247. htmlgraph/sdk/analytics/helpers.py +178 -0
  248. htmlgraph/sdk/analytics/registry.py +109 -0
  249. htmlgraph/sdk/base.py +484 -0
  250. htmlgraph/sdk/constants.py +216 -0
  251. htmlgraph/sdk/core.pyi +308 -0
  252. htmlgraph/sdk/discovery.py +120 -0
  253. htmlgraph/sdk/help/__init__.py +12 -0
  254. htmlgraph/sdk/help/mixin.py +699 -0
  255. htmlgraph/sdk/mixins/__init__.py +15 -0
  256. htmlgraph/sdk/mixins/attribution.py +113 -0
  257. htmlgraph/sdk/mixins/mixin.py +410 -0
  258. htmlgraph/sdk/operations/__init__.py +12 -0
  259. htmlgraph/sdk/operations/mixin.py +427 -0
  260. htmlgraph/sdk/orchestration/__init__.py +17 -0
  261. htmlgraph/sdk/orchestration/coordinator.py +203 -0
  262. htmlgraph/sdk/orchestration/spawner.py +204 -0
  263. htmlgraph/sdk/planning/__init__.py +19 -0
  264. htmlgraph/sdk/planning/bottlenecks.py +93 -0
  265. htmlgraph/sdk/planning/mixin.py +211 -0
  266. htmlgraph/sdk/planning/parallel.py +186 -0
  267. htmlgraph/sdk/planning/queue.py +210 -0
  268. htmlgraph/sdk/planning/recommendations.py +87 -0
  269. htmlgraph/sdk/planning/smart_planning.py +319 -0
  270. htmlgraph/sdk/session/__init__.py +19 -0
  271. htmlgraph/sdk/session/continuity.py +57 -0
  272. htmlgraph/sdk/session/handoff.py +110 -0
  273. htmlgraph/sdk/session/info.py +309 -0
  274. htmlgraph/sdk/session/manager.py +103 -0
  275. htmlgraph/sdk/strategic/__init__.py +26 -0
  276. htmlgraph/sdk/strategic/mixin.py +563 -0
  277. htmlgraph/server.py +295 -107
  278. htmlgraph/session_hooks.py +300 -0
  279. htmlgraph/session_manager.py +285 -3
  280. htmlgraph/session_registry.py +587 -0
  281. htmlgraph/session_state.py +436 -0
  282. htmlgraph/session_warning.py +2 -1
  283. htmlgraph/sessions/__init__.py +23 -0
  284. htmlgraph/sessions/handoff.py +756 -0
  285. htmlgraph/system_prompts.py +450 -0
  286. htmlgraph/templates/orchestration-view.html +350 -0
  287. htmlgraph/track_builder.py +33 -1
  288. htmlgraph/track_manager.py +38 -0
  289. htmlgraph/transcript.py +18 -5
  290. htmlgraph/validation.py +115 -0
  291. htmlgraph/watch.py +2 -1
  292. htmlgraph/work_type_utils.py +2 -1
  293. {htmlgraph-0.20.1.data → htmlgraph-0.27.5.data}/data/htmlgraph/dashboard.html +2246 -248
  294. {htmlgraph-0.20.1.dist-info → htmlgraph-0.27.5.dist-info}/METADATA +95 -64
  295. htmlgraph-0.27.5.dist-info/RECORD +337 -0
  296. {htmlgraph-0.20.1.dist-info → htmlgraph-0.27.5.dist-info}/entry_points.txt +1 -1
  297. htmlgraph/cli.py +0 -4839
  298. htmlgraph/sdk.py +0 -2359
  299. htmlgraph-0.20.1.dist-info/RECORD +0 -118
  300. {htmlgraph-0.20.1.data → htmlgraph-0.27.5.data}/data/htmlgraph/styles.css +0 -0
  301. {htmlgraph-0.20.1.data → htmlgraph-0.27.5.data}/data/htmlgraph/templates/AGENTS.md.template +0 -0
  302. {htmlgraph-0.20.1.data → htmlgraph-0.27.5.data}/data/htmlgraph/templates/CLAUDE.md.template +0 -0
  303. {htmlgraph-0.20.1.data → htmlgraph-0.27.5.data}/data/htmlgraph/templates/GEMINI.md.template +0 -0
  304. {htmlgraph-0.20.1.dist-info → htmlgraph-0.27.5.dist-info}/WHEEL +0 -0
@@ -0,0 +1,563 @@
1
+ """
2
+ Strategic Analytics Mixin for SDK
3
+
4
+ Provides SDK methods for accessing Phase 3 Strategic Analytics:
5
+ - Pattern detection (tool sequences, delegation chains, error patterns)
6
+ - Suggestion generation (next actions, delegations, model selection)
7
+ - Preference management (feedback, learning, personalization)
8
+ - Cost optimization (token budgets, parallelization, model selection)
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ import logging
14
+ from dataclasses import dataclass
15
+ from pathlib import Path
16
+ from typing import TYPE_CHECKING, Any
17
+
18
+ if TYPE_CHECKING:
19
+ from htmlgraph.sdk import SDK
20
+
21
+ logger = logging.getLogger(__name__)
22
+
23
+
24
+ @dataclass
25
+ class StrategicAnalyticsInterface:
26
+ """
27
+ Interface for strategic analytics operations.
28
+
29
+ Provides access to:
30
+ - PatternDetector for pattern detection
31
+ - SuggestionEngine for generating suggestions
32
+ - PreferenceManager for preference learning
33
+ - CostOptimizer for cost optimization
34
+
35
+ This interface is exposed as sdk.strategic on the SDK.
36
+ """
37
+
38
+ _sdk: SDK
39
+ _db_path: Path | None = None
40
+
41
+ def __post_init__(self) -> None:
42
+ """Initialize database path."""
43
+ from htmlgraph.config import get_database_path
44
+
45
+ self._db_path = get_database_path()
46
+
47
+ # ===== Pattern Detection =====
48
+
49
+ def detect_patterns(
50
+ self,
51
+ min_frequency: int = 3,
52
+ days_back: int = 30,
53
+ ) -> list[dict[str, Any]]:
54
+ """
55
+ Detect all patterns from event history.
56
+
57
+ Analyzes tool sequences, delegation chains, and error patterns
58
+ to identify successful workflows.
59
+
60
+ Args:
61
+ min_frequency: Minimum occurrences to be considered a pattern
62
+ days_back: Number of days of history to analyze
63
+
64
+ Returns:
65
+ List of pattern dictionaries sorted by confidence
66
+
67
+ Example:
68
+ >>> sdk = SDK(agent="claude")
69
+ >>> patterns = sdk.strategic.detect_patterns()
70
+ >>> for p in patterns[:5]:
71
+ ... print(f"{p['pattern_type']}: {p['confidence']:.0%}")
72
+ """
73
+ try:
74
+ from htmlgraph.analytics.strategic import PatternDetector
75
+
76
+ detector = PatternDetector(self._db_path)
77
+ patterns = detector.detect_all_patterns(
78
+ min_frequency=min_frequency,
79
+ days_back=days_back,
80
+ )
81
+ detector.close()
82
+
83
+ return [p.to_dict() for p in patterns]
84
+ except ImportError:
85
+ logger.warning("Strategic analytics not available")
86
+ return []
87
+ except Exception as e:
88
+ logger.error(f"Error detecting patterns: {e}")
89
+ return []
90
+
91
+ def detect_tool_sequences(
92
+ self,
93
+ window_size: int = 3,
94
+ min_frequency: int = 3,
95
+ ) -> list[dict[str, Any]]:
96
+ """
97
+ Detect common tool call sequence patterns.
98
+
99
+ Args:
100
+ window_size: Number of consecutive tools in each sequence
101
+ min_frequency: Minimum occurrences to be considered a pattern
102
+
103
+ Returns:
104
+ List of tool sequence patterns
105
+
106
+ Example:
107
+ >>> sequences = sdk.strategic.detect_tool_sequences()
108
+ >>> for seq in sequences[:3]:
109
+ ... print(f"Sequence: {' -> '.join(seq['sequence'])}")
110
+ """
111
+ try:
112
+ from htmlgraph.analytics.strategic import PatternDetector
113
+
114
+ detector = PatternDetector(self._db_path)
115
+ patterns = detector.detect_tool_sequences(
116
+ window_size=window_size,
117
+ min_frequency=min_frequency,
118
+ )
119
+ detector.close()
120
+
121
+ return [p.to_dict() for p in patterns]
122
+ except Exception as e:
123
+ logger.error(f"Error detecting tool sequences: {e}")
124
+ return []
125
+
126
+ def detect_delegation_chains(
127
+ self,
128
+ min_frequency: int = 2,
129
+ ) -> list[dict[str, Any]]:
130
+ """
131
+ Detect common delegation chain patterns.
132
+
133
+ Identifies which agent combinations work well together.
134
+
135
+ Args:
136
+ min_frequency: Minimum occurrences to be considered a pattern
137
+
138
+ Returns:
139
+ List of delegation chain patterns
140
+
141
+ Example:
142
+ >>> chains = sdk.strategic.detect_delegation_chains()
143
+ >>> for chain in chains:
144
+ ... print(f"Chain: {' -> '.join(chain['agents'])}")
145
+ """
146
+ try:
147
+ from htmlgraph.analytics.strategic import PatternDetector
148
+
149
+ detector = PatternDetector(self._db_path)
150
+ patterns = detector.detect_delegation_chains(min_frequency=min_frequency)
151
+ detector.close()
152
+
153
+ return [p.to_dict() for p in patterns]
154
+ except Exception as e:
155
+ logger.error(f"Error detecting delegation chains: {e}")
156
+ return []
157
+
158
+ # ===== Suggestion Engine =====
159
+
160
+ def get_suggestions(
161
+ self,
162
+ task_description: str = "",
163
+ max_suggestions: int = 5,
164
+ ) -> list[dict[str, Any]]:
165
+ """
166
+ Get suggestions based on current context and learned patterns.
167
+
168
+ Args:
169
+ task_description: Current task (optional, improves suggestions)
170
+ max_suggestions: Maximum number of suggestions
171
+
172
+ Returns:
173
+ List of suggestion dictionaries sorted by score
174
+
175
+ Example:
176
+ >>> suggestions = sdk.strategic.get_suggestions(
177
+ ... task_description="Implement user authentication"
178
+ ... )
179
+ >>> for s in suggestions:
180
+ ... print(f"{s['title']} ({s['confidence']:.0%})")
181
+ """
182
+ try:
183
+ from htmlgraph.analytics.strategic import SuggestionEngine
184
+ from htmlgraph.analytics.strategic.suggestion_engine import TaskContext
185
+
186
+ engine = SuggestionEngine(self._db_path)
187
+
188
+ context = TaskContext(
189
+ current_task=task_description,
190
+ agent_type=self._sdk._agent_id or "orchestrator",
191
+ )
192
+
193
+ suggestions = engine.suggest(context, max_suggestions=max_suggestions)
194
+ engine.close()
195
+
196
+ return [s.to_dict() for s in suggestions]
197
+ except Exception as e:
198
+ logger.error(f"Error getting suggestions: {e}")
199
+ return []
200
+
201
+ def generate_task_code(self, pattern_id: str) -> str | None:
202
+ """
203
+ Generate Task() code from a detected pattern.
204
+
205
+ Args:
206
+ pattern_id: ID of pattern to generate code from
207
+
208
+ Returns:
209
+ Python code snippet or None if pattern not found
210
+
211
+ Example:
212
+ >>> code = sdk.strategic.generate_task_code("tsp-abc123")
213
+ >>> print(code)
214
+ """
215
+ try:
216
+ from htmlgraph.analytics.strategic import PatternDetector, SuggestionEngine
217
+
218
+ detector = PatternDetector(self._db_path)
219
+ engine = SuggestionEngine(self._db_path)
220
+
221
+ pattern = detector.get_pattern_by_id(pattern_id)
222
+ if pattern:
223
+ code = engine.generate_task_code(pattern)
224
+ detector.close()
225
+ engine.close()
226
+ return code
227
+
228
+ detector.close()
229
+ engine.close()
230
+ return None
231
+ except Exception as e:
232
+ logger.error(f"Error generating task code: {e}")
233
+ return None
234
+
235
+ # ===== Preference Management =====
236
+
237
+ def get_preferences(self, user_id: str = "default") -> dict[str, Any]:
238
+ """
239
+ Get learned preferences for a user.
240
+
241
+ Args:
242
+ user_id: User identifier
243
+
244
+ Returns:
245
+ Dictionary of preference settings
246
+
247
+ Example:
248
+ >>> prefs = sdk.strategic.get_preferences()
249
+ >>> print(f"Model preferences: {prefs['model_preferences']}")
250
+ """
251
+ try:
252
+ from htmlgraph.analytics.strategic import PreferenceManager
253
+
254
+ manager = PreferenceManager(self._db_path)
255
+ prefs = manager.get_preferences(user_id)
256
+ manager.close()
257
+
258
+ return prefs.to_dict()
259
+ except Exception as e:
260
+ logger.error(f"Error getting preferences: {e}")
261
+ return {}
262
+
263
+ def record_feedback(
264
+ self,
265
+ suggestion_id: str,
266
+ accepted: bool,
267
+ outcome: str = "unknown",
268
+ comment: str | None = None,
269
+ ) -> str | None:
270
+ """
271
+ Record feedback on a suggestion.
272
+
273
+ This enables the system to learn from user decisions.
274
+
275
+ Args:
276
+ suggestion_id: ID of the suggestion
277
+ accepted: Whether user accepted the suggestion
278
+ outcome: Result of following suggestion (successful, failed, partial)
279
+ comment: Optional text comment
280
+
281
+ Returns:
282
+ Feedback ID if successful, None otherwise
283
+
284
+ Example:
285
+ >>> sdk.strategic.record_feedback(
286
+ ... suggestion_id="sug-abc123",
287
+ ... accepted=True,
288
+ ... outcome="successful"
289
+ ... )
290
+ """
291
+ try:
292
+ from htmlgraph.analytics.strategic import PreferenceManager
293
+
294
+ manager = PreferenceManager(self._db_path)
295
+ feedback_id = manager.record_feedback(
296
+ suggestion_id=suggestion_id,
297
+ accepted=accepted,
298
+ user_id="default",
299
+ session_id=self._sdk._parent_session or "cli-session",
300
+ outcome=outcome,
301
+ comment=comment,
302
+ )
303
+ manager.close()
304
+
305
+ return feedback_id
306
+ except Exception as e:
307
+ logger.error(f"Error recording feedback: {e}")
308
+ return None
309
+
310
+ def reset_preferences(self, user_id: str = "default") -> bool:
311
+ """
312
+ Reset preferences to defaults.
313
+
314
+ Args:
315
+ user_id: User to reset
316
+
317
+ Returns:
318
+ True if reset successfully
319
+
320
+ Example:
321
+ >>> sdk.strategic.reset_preferences()
322
+ """
323
+ try:
324
+ from htmlgraph.analytics.strategic import PreferenceManager
325
+
326
+ manager = PreferenceManager(self._db_path)
327
+ result = manager.reset_preferences(user_id)
328
+ manager.close()
329
+
330
+ return result
331
+ except Exception as e:
332
+ logger.error(f"Error resetting preferences: {e}")
333
+ return False
334
+
335
+ def get_acceptance_rate(
336
+ self,
337
+ suggestion_type: str | None = None,
338
+ ) -> float:
339
+ """
340
+ Get suggestion acceptance rate.
341
+
342
+ Args:
343
+ suggestion_type: Optional filter by type
344
+
345
+ Returns:
346
+ Acceptance rate as percentage (0-100)
347
+
348
+ Example:
349
+ >>> rate = sdk.strategic.get_acceptance_rate("delegation")
350
+ >>> print(f"Delegation suggestions: {rate:.0f}% accepted")
351
+ """
352
+ try:
353
+ from htmlgraph.analytics.strategic import PreferenceManager
354
+
355
+ manager = PreferenceManager(self._db_path)
356
+ rate = manager.get_acceptance_rate("default", suggestion_type)
357
+ manager.close()
358
+
359
+ return rate
360
+ except Exception as e:
361
+ logger.error(f"Error getting acceptance rate: {e}")
362
+ return 0.0
363
+
364
+ # ===== Cost Optimization =====
365
+
366
+ def suggest_token_budget(
367
+ self,
368
+ task_description: str,
369
+ tool_name: str | None = None,
370
+ ) -> dict[str, Any]:
371
+ """
372
+ Get token budget suggestion for a task.
373
+
374
+ Args:
375
+ task_description: Description of the task
376
+ tool_name: Specific tool being used (optional)
377
+
378
+ Returns:
379
+ Token budget recommendation
380
+
381
+ Example:
382
+ >>> budget = sdk.strategic.suggest_token_budget(
383
+ ... "Implement caching for API"
384
+ ... )
385
+ >>> print(f"Recommended: {budget['recommended']} tokens")
386
+ """
387
+ try:
388
+ from htmlgraph.analytics.strategic import CostOptimizer
389
+
390
+ optimizer = CostOptimizer(self._db_path)
391
+ budget = optimizer.suggest_token_budget(task_description, tool_name)
392
+ optimizer.close()
393
+
394
+ return budget.to_dict()
395
+ except Exception as e:
396
+ logger.error(f"Error suggesting token budget: {e}")
397
+ return {"recommended": 5000, "minimum": 2500, "maximum": 10000}
398
+
399
+ def choose_model(
400
+ self,
401
+ task_description: str,
402
+ budget_constraint: int | None = None,
403
+ ) -> dict[str, Any]:
404
+ """
405
+ Get model selection recommendation.
406
+
407
+ Args:
408
+ task_description: Description of the task
409
+ budget_constraint: Maximum token budget (optional)
410
+
411
+ Returns:
412
+ Model recommendation
413
+
414
+ Example:
415
+ >>> model = sdk.strategic.choose_model(
416
+ ... "Refactor authentication system"
417
+ ... )
418
+ >>> print(f"Recommended: {model['recommended_model']}")
419
+ """
420
+ try:
421
+ from htmlgraph.analytics.strategic import CostOptimizer
422
+
423
+ optimizer = CostOptimizer(self._db_path)
424
+ recommendation = optimizer.choose_model(task_description, budget_constraint)
425
+ optimizer.close()
426
+
427
+ return recommendation.to_dict()
428
+ except Exception as e:
429
+ logger.error(f"Error choosing model: {e}")
430
+ return {"recommended_model": "sonnet", "confidence": 0.5}
431
+
432
+ def get_cost_summary(self, session_id: str | None = None) -> dict[str, Any]:
433
+ """
434
+ Get cost summary for a session.
435
+
436
+ Args:
437
+ session_id: Session to summarize (current if not specified)
438
+
439
+ Returns:
440
+ Cost breakdown by tool
441
+
442
+ Example:
443
+ >>> summary = sdk.strategic.get_cost_summary()
444
+ >>> print(f"Total tokens: {summary['total_tokens']}")
445
+ """
446
+ try:
447
+ from htmlgraph.analytics.strategic import CostOptimizer
448
+
449
+ optimizer = CostOptimizer(self._db_path)
450
+ session = session_id or self._sdk._parent_session or "cli-session"
451
+ summary = optimizer.get_cost_summary(session)
452
+ optimizer.close()
453
+
454
+ return summary
455
+ except Exception as e:
456
+ logger.error(f"Error getting cost summary: {e}")
457
+ return {"total_tokens": 0, "breakdown": []}
458
+
459
+ # ===== Task Decomposition =====
460
+
461
+ def suggest_task_decomposition(
462
+ self,
463
+ task_description: str,
464
+ max_subtasks: int = 5,
465
+ ) -> list[dict[str, Any]]:
466
+ """
467
+ Suggest task decomposition based on learned patterns.
468
+
469
+ Uses pattern detection and heuristics to break down complex tasks.
470
+
471
+ Args:
472
+ task_description: Task to decompose
473
+ max_subtasks: Maximum number of subtasks
474
+
475
+ Returns:
476
+ List of suggested subtasks with agent recommendations
477
+
478
+ Example:
479
+ >>> subtasks = sdk.strategic.suggest_task_decomposition(
480
+ ... "Implement OAuth2 authentication"
481
+ ... )
482
+ >>> for task in subtasks:
483
+ ... print(f"{task['task']} -> {task['agent']}")
484
+ """
485
+ try:
486
+ # Use orchestrator's decomposition method
487
+ orchestrator = self._sdk.orchestrator
488
+ result = orchestrator.suggest_task_decomposition(
489
+ task_description, max_subtasks
490
+ )
491
+ return list(result) if result else []
492
+ except Exception as e:
493
+ logger.error(f"Error suggesting task decomposition: {e}")
494
+ return []
495
+
496
+ def create_task_plan(
497
+ self,
498
+ task_description: str,
499
+ include_cost_estimate: bool = True,
500
+ ) -> dict[str, Any]:
501
+ """
502
+ Create a comprehensive task execution plan.
503
+
504
+ Combines pattern detection, cost optimization, and model selection.
505
+
506
+ Args:
507
+ task_description: Description of the task
508
+ include_cost_estimate: Whether to include cost estimates
509
+
510
+ Returns:
511
+ Comprehensive execution plan
512
+
513
+ Example:
514
+ >>> plan = sdk.strategic.create_task_plan(
515
+ ... "Add caching to API endpoints"
516
+ ... )
517
+ >>> print(f"Subtasks: {len(plan['subtasks'])}")
518
+ >>> print(f"Estimated tokens: {plan.get('total_estimated_tokens')}")
519
+ """
520
+ try:
521
+ orchestrator = self._sdk.orchestrator
522
+ result = orchestrator.create_task_suggestion(
523
+ task_description, include_cost_estimate
524
+ )
525
+ return (
526
+ dict(result) if result else {"task": task_description, "subtasks": []}
527
+ )
528
+ except Exception as e:
529
+ logger.error(f"Error creating task plan: {e}")
530
+ return {"task": task_description, "subtasks": []}
531
+
532
+
533
+ class StrategicAnalyticsMixin:
534
+ """
535
+ Mixin that adds strategic analytics capabilities to SDK.
536
+
537
+ Provides access to Phase 3 Strategic Analytics via sdk.strategic property.
538
+ """
539
+
540
+ _strategic: StrategicAnalyticsInterface | None = None
541
+
542
+ @property
543
+ def strategic(self) -> StrategicAnalyticsInterface:
544
+ """
545
+ Access strategic analytics interface.
546
+
547
+ Returns:
548
+ StrategicAnalyticsInterface for pattern detection, suggestions, etc.
549
+
550
+ Example:
551
+ >>> sdk = SDK(agent="claude")
552
+ >>> patterns = sdk.strategic.detect_patterns()
553
+ >>> suggestions = sdk.strategic.get_suggestions()
554
+ """
555
+ if self._strategic is None:
556
+ # Cast self to SDK for type checking
557
+ from typing import cast
558
+
559
+ from htmlgraph.sdk import SDK
560
+
561
+ sdk_self = cast(SDK, self)
562
+ self._strategic = StrategicAnalyticsInterface(_sdk=sdk_self)
563
+ return self._strategic