htmlgraph 0.24.1__py3-none-any.whl → 0.25.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. htmlgraph/__init__.py +20 -1
  2. htmlgraph/agent_detection.py +26 -10
  3. htmlgraph/analytics/cross_session.py +4 -3
  4. htmlgraph/analytics/work_type.py +52 -16
  5. htmlgraph/analytics_index.py +51 -19
  6. htmlgraph/api/__init__.py +3 -0
  7. htmlgraph/api/main.py +2115 -0
  8. htmlgraph/api/static/htmx.min.js +1 -0
  9. htmlgraph/api/static/style-redesign.css +1344 -0
  10. htmlgraph/api/static/style.css +1079 -0
  11. htmlgraph/api/templates/dashboard-redesign.html +812 -0
  12. htmlgraph/api/templates/dashboard.html +783 -0
  13. htmlgraph/api/templates/partials/activity-feed-hierarchical.html +326 -0
  14. htmlgraph/api/templates/partials/activity-feed.html +570 -0
  15. htmlgraph/api/templates/partials/agents-redesign.html +317 -0
  16. htmlgraph/api/templates/partials/agents.html +317 -0
  17. htmlgraph/api/templates/partials/event-traces.html +373 -0
  18. htmlgraph/api/templates/partials/features-kanban-redesign.html +509 -0
  19. htmlgraph/api/templates/partials/features.html +509 -0
  20. htmlgraph/api/templates/partials/metrics-redesign.html +346 -0
  21. htmlgraph/api/templates/partials/metrics.html +346 -0
  22. htmlgraph/api/templates/partials/orchestration-redesign.html +443 -0
  23. htmlgraph/api/templates/partials/orchestration.html +163 -0
  24. htmlgraph/api/templates/partials/spawners.html +375 -0
  25. htmlgraph/atomic_ops.py +560 -0
  26. htmlgraph/builders/base.py +55 -1
  27. htmlgraph/builders/bug.py +17 -2
  28. htmlgraph/builders/chore.py +17 -2
  29. htmlgraph/builders/epic.py +17 -2
  30. htmlgraph/builders/feature.py +25 -2
  31. htmlgraph/builders/phase.py +17 -2
  32. htmlgraph/builders/spike.py +27 -2
  33. htmlgraph/builders/track.py +14 -0
  34. htmlgraph/cigs/__init__.py +4 -0
  35. htmlgraph/cigs/reporter.py +818 -0
  36. htmlgraph/cli.py +1427 -401
  37. htmlgraph/cli_commands/__init__.py +1 -0
  38. htmlgraph/cli_commands/feature.py +195 -0
  39. htmlgraph/cli_framework.py +115 -0
  40. htmlgraph/collections/__init__.py +2 -0
  41. htmlgraph/collections/base.py +21 -0
  42. htmlgraph/collections/session.py +189 -0
  43. htmlgraph/collections/spike.py +7 -1
  44. htmlgraph/collections/task_delegation.py +236 -0
  45. htmlgraph/collections/traces.py +482 -0
  46. htmlgraph/config.py +113 -0
  47. htmlgraph/converter.py +41 -0
  48. htmlgraph/cost_analysis/__init__.py +5 -0
  49. htmlgraph/cost_analysis/analyzer.py +438 -0
  50. htmlgraph/dashboard.html +3315 -492
  51. htmlgraph-0.24.1.data/data/htmlgraph/dashboard.html → htmlgraph/dashboard.html.backup +2246 -248
  52. htmlgraph/dashboard.html.bak +7181 -0
  53. htmlgraph/dashboard.html.bak2 +7231 -0
  54. htmlgraph/dashboard.html.bak3 +7232 -0
  55. htmlgraph/db/__init__.py +38 -0
  56. htmlgraph/db/queries.py +790 -0
  57. htmlgraph/db/schema.py +1334 -0
  58. htmlgraph/deploy.py +26 -27
  59. htmlgraph/docs/API_REFERENCE.md +841 -0
  60. htmlgraph/docs/HTTP_API.md +750 -0
  61. htmlgraph/docs/INTEGRATION_GUIDE.md +752 -0
  62. htmlgraph/docs/ORCHESTRATION_PATTERNS.md +710 -0
  63. htmlgraph/docs/README.md +533 -0
  64. htmlgraph/docs/version_check.py +3 -1
  65. htmlgraph/error_handler.py +544 -0
  66. htmlgraph/event_log.py +2 -0
  67. htmlgraph/hooks/__init__.py +8 -0
  68. htmlgraph/hooks/bootstrap.py +169 -0
  69. htmlgraph/hooks/context.py +271 -0
  70. htmlgraph/hooks/drift_handler.py +521 -0
  71. htmlgraph/hooks/event_tracker.py +405 -15
  72. htmlgraph/hooks/post_tool_use_handler.py +257 -0
  73. htmlgraph/hooks/pretooluse.py +476 -6
  74. htmlgraph/hooks/prompt_analyzer.py +648 -0
  75. htmlgraph/hooks/session_handler.py +583 -0
  76. htmlgraph/hooks/state_manager.py +501 -0
  77. htmlgraph/hooks/subagent_stop.py +309 -0
  78. htmlgraph/hooks/task_enforcer.py +39 -0
  79. htmlgraph/models.py +111 -15
  80. htmlgraph/operations/fastapi_server.py +230 -0
  81. htmlgraph/orchestration/headless_spawner.py +22 -14
  82. htmlgraph/pydantic_models.py +476 -0
  83. htmlgraph/quality_gates.py +350 -0
  84. htmlgraph/repo_hash.py +511 -0
  85. htmlgraph/sdk.py +348 -10
  86. htmlgraph/server.py +194 -0
  87. htmlgraph/session_hooks.py +300 -0
  88. htmlgraph/session_manager.py +131 -1
  89. htmlgraph/session_registry.py +587 -0
  90. htmlgraph/session_state.py +436 -0
  91. htmlgraph/system_prompts.py +449 -0
  92. htmlgraph/templates/orchestration-view.html +350 -0
  93. htmlgraph/track_builder.py +19 -0
  94. htmlgraph/validation.py +115 -0
  95. htmlgraph-0.25.0.data/data/htmlgraph/dashboard.html +7417 -0
  96. {htmlgraph-0.24.1.dist-info → htmlgraph-0.25.0.dist-info}/METADATA +91 -64
  97. {htmlgraph-0.24.1.dist-info → htmlgraph-0.25.0.dist-info}/RECORD +103 -42
  98. {htmlgraph-0.24.1.data → htmlgraph-0.25.0.data}/data/htmlgraph/styles.css +0 -0
  99. {htmlgraph-0.24.1.data → htmlgraph-0.25.0.data}/data/htmlgraph/templates/AGENTS.md.template +0 -0
  100. {htmlgraph-0.24.1.data → htmlgraph-0.25.0.data}/data/htmlgraph/templates/CLAUDE.md.template +0 -0
  101. {htmlgraph-0.24.1.data → htmlgraph-0.25.0.data}/data/htmlgraph/templates/GEMINI.md.template +0 -0
  102. {htmlgraph-0.24.1.dist-info → htmlgraph-0.25.0.dist-info}/WHEEL +0 -0
  103. {htmlgraph-0.24.1.dist-info → htmlgraph-0.25.0.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,373 @@
1
+ <!-- Event Traces - Parent-Child Event Nesting Visualization -->
2
+
3
+ <div class="event-traces-container">
4
+ <div class="traces-header">
5
+ <h2>Task Delegation Traces</h2>
6
+ <p class="subtitle">Parent-child event relationships showing delegation hierarchy</p>
7
+ </div>
8
+
9
+ {% if hierarchical_events %}
10
+ <div class="traces-list">
11
+ {% for trace in hierarchical_events %}
12
+ <div class="event-trace">
13
+ <!-- Parent Event (Task Delegation) -->
14
+ <div class="trace-parent">
15
+ <div class="event-header">
16
+ <span class="event-badge parent-badge">TASK</span>
17
+ <span class="agent-name">{{ trace.parent_event_id }}</span>
18
+ <span class="subagent-type" title="Subagent Type">
19
+ {{ trace.subagent_type or "general-purpose" }}
20
+ </span>
21
+ <span class="event-status" :class="'status-' + trace.status.lower()">
22
+ {{ trace.status.upper() }}
23
+ </span>
24
+ <span class="timestamp">{{ trace.started_at }}</span>
25
+ </div>
26
+
27
+ <div class="event-metadata">
28
+ {% if trace.duration_seconds %}
29
+ <span class="metadata-item">
30
+ <strong>Duration:</strong> {{ "%.1f" % trace.duration_seconds }}s
31
+ </span>
32
+ {% endif %}
33
+ <span class="metadata-item">
34
+ <strong>Child Events:</strong> {{ trace.child_spike_count or 0 }}
35
+ </span>
36
+ </div>
37
+ </div>
38
+
39
+ <!-- Child Events (Spikes Created by Subagent) -->
40
+ {% if trace.child_events or trace.child_spikes %}
41
+ <div class="trace-children">
42
+ <div class="children-header">
43
+ <span class="connector">├─</span>
44
+ <span class="label">Subagent Activity</span>
45
+ <span class="count">{{ trace.child_events|length + (trace.child_spikes|length if trace.child_spikes else 0) }} events</span>
46
+ </div>
47
+
48
+ <!-- Child Events (e.g., completion markers) -->
49
+ {% for child_event in trace.child_events %}
50
+ <div class="trace-child event-item">
51
+ <span class="connector">│ ├─</span>
52
+ <span class="event-icon">▪</span>
53
+ <span class="event-type">{{ child_event.event_type }}</span>
54
+ <span class="event-id">{{ child_event.event_id }}</span>
55
+ <span class="timestamp">{{ child_event.timestamp }}</span>
56
+ <span class="status" :class="'status-' + child_event.status.lower()">
57
+ {{ child_event.status }}
58
+ </span>
59
+ </div>
60
+ {% endfor %}
61
+
62
+ <!-- Child Spikes (Knowledge Created) -->
63
+ {% for spike_id in trace.child_spikes %}
64
+ <div class="trace-child spike-item">
65
+ <span class="connector">│ ├─</span>
66
+ <span class="spike-icon">✦</span>
67
+ <span class="event-type">spike</span>
68
+ <span class="spike-id" title="Knowledge Created">{{ spike_id }}</span>
69
+ </div>
70
+ {% endfor %}
71
+
72
+ <!-- Closing connector -->
73
+ <div class="trace-child-close">
74
+ <span class="connector">│</span>
75
+ </div>
76
+ </div>
77
+ {% else %}
78
+ <div class="trace-children empty">
79
+ <span class="connector">└─</span>
80
+ <span class="label">No child events</span>
81
+ </div>
82
+ {% endif %}
83
+ </div>
84
+ {% endfor %}
85
+ </div>
86
+
87
+ <style>
88
+ .event-traces-container {
89
+ padding: 16px;
90
+ background: #f8f9fa;
91
+ border-radius: 8px;
92
+ }
93
+
94
+ .traces-header {
95
+ margin-bottom: 20px;
96
+ border-bottom: 2px solid #e0e0e0;
97
+ padding-bottom: 12px;
98
+ }
99
+
100
+ .traces-header h2 {
101
+ margin: 0 0 4px 0;
102
+ color: #333;
103
+ font-size: 18px;
104
+ font-weight: 600;
105
+ }
106
+
107
+ .traces-header .subtitle {
108
+ margin: 0;
109
+ color: #666;
110
+ font-size: 13px;
111
+ }
112
+
113
+ .traces-list {
114
+ display: flex;
115
+ flex-direction: column;
116
+ gap: 12px;
117
+ }
118
+
119
+ .event-trace {
120
+ background: white;
121
+ border: 1px solid #ddd;
122
+ border-radius: 6px;
123
+ overflow: hidden;
124
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);
125
+ }
126
+
127
+ .trace-parent {
128
+ padding: 12px;
129
+ background: #f5f7ff;
130
+ border-left: 4px solid #4a90e2;
131
+ }
132
+
133
+ .event-header {
134
+ display: flex;
135
+ align-items: center;
136
+ gap: 8px;
137
+ margin-bottom: 8px;
138
+ flex-wrap: wrap;
139
+ }
140
+
141
+ .event-badge {
142
+ display: inline-block;
143
+ padding: 2px 8px;
144
+ font-size: 11px;
145
+ font-weight: 600;
146
+ border-radius: 3px;
147
+ text-transform: uppercase;
148
+ letter-spacing: 0.5px;
149
+ }
150
+
151
+ .event-badge.parent-badge {
152
+ background: #4a90e2;
153
+ color: white;
154
+ }
155
+
156
+ .agent-name {
157
+ font-family: 'Monaco', 'Menlo', monospace;
158
+ font-size: 12px;
159
+ font-weight: 500;
160
+ color: #333;
161
+ }
162
+
163
+ .subagent-type {
164
+ display: inline-block;
165
+ padding: 2px 6px;
166
+ font-size: 11px;
167
+ background: #e8f0ff;
168
+ color: #4a90e2;
169
+ border-radius: 3px;
170
+ border: 1px solid #b3d9ff;
171
+ }
172
+
173
+ .event-status {
174
+ display: inline-block;
175
+ padding: 2px 8px;
176
+ font-size: 11px;
177
+ font-weight: 600;
178
+ border-radius: 3px;
179
+ text-transform: uppercase;
180
+ }
181
+
182
+ .event-status.status-completed {
183
+ background: #d4f4dd;
184
+ color: #2d7a4a;
185
+ }
186
+
187
+ .event-status.status-started {
188
+ background: #fff3cd;
189
+ color: #856404;
190
+ }
191
+
192
+ .event-status.status-failed {
193
+ background: #f8d7da;
194
+ color: #721c24;
195
+ }
196
+
197
+ .timestamp {
198
+ font-size: 12px;
199
+ color: #999;
200
+ font-family: 'Monaco', 'Menlo', monospace;
201
+ margin-left: auto;
202
+ }
203
+
204
+ .event-metadata {
205
+ display: flex;
206
+ gap: 16px;
207
+ font-size: 12px;
208
+ color: #666;
209
+ padding: 0 0 0 0;
210
+ }
211
+
212
+ .metadata-item {
213
+ display: flex;
214
+ align-items: center;
215
+ gap: 4px;
216
+ }
217
+
218
+ .metadata-item strong {
219
+ color: #333;
220
+ font-weight: 600;
221
+ }
222
+
223
+ .trace-children {
224
+ padding: 8px 12px;
225
+ background: white;
226
+ border-top: 1px solid #eee;
227
+ }
228
+
229
+ .trace-children.empty {
230
+ color: #999;
231
+ font-size: 12px;
232
+ font-style: italic;
233
+ padding: 8px 12px;
234
+ }
235
+
236
+ .children-header {
237
+ display: flex;
238
+ align-items: center;
239
+ gap: 8px;
240
+ margin-bottom: 8px;
241
+ font-size: 12px;
242
+ font-weight: 600;
243
+ color: #666;
244
+ }
245
+
246
+ .connector {
247
+ font-family: 'Monaco', 'Menlo', monospace;
248
+ color: #ddd;
249
+ font-weight: bold;
250
+ min-width: 20px;
251
+ }
252
+
253
+ .label {
254
+ color: #333;
255
+ }
256
+
257
+ .count {
258
+ margin-left: auto;
259
+ font-size: 11px;
260
+ background: #f0f0f0;
261
+ padding: 2px 6px;
262
+ border-radius: 3px;
263
+ color: #666;
264
+ }
265
+
266
+ .trace-child {
267
+ display: flex;
268
+ align-items: center;
269
+ gap: 6px;
270
+ padding: 6px 0;
271
+ font-size: 12px;
272
+ border-bottom: 1px solid #f5f5f5;
273
+ }
274
+
275
+ .trace-child:last-child {
276
+ border-bottom: none;
277
+ }
278
+
279
+ .event-icon,
280
+ .spike-icon {
281
+ font-size: 10px;
282
+ color: #999;
283
+ }
284
+
285
+ .spike-icon {
286
+ color: #e8a600;
287
+ }
288
+
289
+ .event-type {
290
+ display: inline-block;
291
+ padding: 2px 6px;
292
+ font-size: 10px;
293
+ background: #f0f0f0;
294
+ color: #666;
295
+ border-radius: 2px;
296
+ text-transform: uppercase;
297
+ font-weight: 500;
298
+ }
299
+
300
+ .event-id,
301
+ .spike-id {
302
+ font-family: 'Monaco', 'Menlo', monospace;
303
+ font-size: 11px;
304
+ color: #666;
305
+ font-weight: 500;
306
+ }
307
+
308
+ .trace-child .timestamp {
309
+ font-size: 11px;
310
+ margin-left: auto;
311
+ }
312
+
313
+ .trace-child .status {
314
+ font-size: 10px;
315
+ padding: 2px 6px;
316
+ border-radius: 2px;
317
+ font-weight: 500;
318
+ text-transform: uppercase;
319
+ }
320
+
321
+ .trace-child .status.status-completed {
322
+ background: #d4f4dd;
323
+ color: #2d7a4a;
324
+ }
325
+
326
+ .trace-child-close {
327
+ padding: 2px 0;
328
+ font-size: 12px;
329
+ }
330
+
331
+ @media (max-width: 768px) {
332
+ .event-header {
333
+ flex-direction: column;
334
+ align-items: flex-start;
335
+ }
336
+
337
+ .timestamp {
338
+ margin-left: 0;
339
+ }
340
+
341
+ .event-metadata {
342
+ flex-direction: column;
343
+ gap: 4px;
344
+ }
345
+ }
346
+ </style>
347
+
348
+ {% else %}
349
+ <div class="no-traces">
350
+ <p>No task delegation traces found.</p>
351
+ <p class="hint">Task delegation traces appear here when you use Task() to delegate work to subagents.</p>
352
+ </div>
353
+
354
+ <style>
355
+ .no-traces {
356
+ padding: 40px 20px;
357
+ text-align: center;
358
+ color: #999;
359
+ }
360
+
361
+ .no-traces p {
362
+ margin: 8px 0;
363
+ font-size: 14px;
364
+ }
365
+
366
+ .no-traces .hint {
367
+ font-size: 12px;
368
+ color: #bbb;
369
+ font-style: italic;
370
+ }
371
+ </style>
372
+ {% endif %}
373
+ </div>