htmlgraph 0.26.8__tar.gz → 0.26.9__tar.gz

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 (495) hide show
  1. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/PKG-INFO +1 -1
  2. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/packages/gemini-extension/gemini-extension.json +1 -1
  3. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/pyproject.toml +1 -1
  4. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/__init__.py +1 -1
  5. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/hooks/event_tracker.py +101 -348
  6. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/hooks/subagent_stop.py +12 -71
  7. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/hooks/test_event_tracker.py +51 -699
  8. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/integration/test_codex_spawner.py +13 -17
  9. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/integration/test_copilot_spawner_tracking.py +47 -58
  10. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/integration/test_gemini_spawner_diagnosis.py +2 -2
  11. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_pretooluse_event_hierarchy.py +23 -115
  12. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/.gitignore +0 -0
  13. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/README.md +0 -0
  14. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/examples/agent-coordination/README.md +0 -0
  15. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/examples/agent-coordination/demo.py +0 -0
  16. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/examples/create_auth_track_demo.py +0 -0
  17. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/examples/create_htmlgraph_dev_track.py +0 -0
  18. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/examples/demo_agent_planning.py +0 -0
  19. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/examples/demo_real_project_analytics.py +0 -0
  20. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/examples/demo_sdk_operations.py +0 -0
  21. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/examples/documentation-site/README.md +0 -0
  22. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/examples/documentation-site/agents.json +0 -0
  23. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/examples/documentation-site/demo.py +0 -0
  24. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/examples/documentation-site/features/doc-api-graph.html +0 -0
  25. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/examples/documentation-site/features/doc-api-overview.html +0 -0
  26. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/examples/documentation-site/features/doc-api-sdk.html +0 -0
  27. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/examples/documentation-site/features/doc-example-advanced.html +0 -0
  28. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/examples/documentation-site/features/doc-example-basic.html +0 -0
  29. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/examples/documentation-site/features/doc-index.html +0 -0
  30. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/examples/documentation-site/features/doc-installation.html +0 -0
  31. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/examples/documentation-site/features/doc-quickstart.html +0 -0
  32. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/examples/example_query_compilation.py +0 -0
  33. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/examples/handoff-demo.py +0 -0
  34. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/examples/knowledge-base/README.md +0 -0
  35. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/examples/knowledge-base/agents.json +0 -0
  36. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/examples/knowledge-base/demo.py +0 -0
  37. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/examples/knowledge-base/features/feat-276c615f.html +0 -0
  38. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/examples/knowledge-base/features/feat-7a6f797d.html +0 -0
  39. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/examples/knowledge-base/features/note-ai-agents.html +0 -0
  40. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/examples/knowledge-base/features/note-graph-db.html +0 -0
  41. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/examples/knowledge-base/features/note-htmlgraph.html +0 -0
  42. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/examples/knowledge-base/features/note-web-standards.html +0 -0
  43. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/examples/parallel_task_coordination.py +0 -0
  44. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/examples/routing-demo.py +0 -0
  45. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/examples/sdk_demo.py +0 -0
  46. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/examples/todo-list/README.md +0 -0
  47. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/examples/todo-list/demo.py +0 -0
  48. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/examples/todo-list/index.html +0 -0
  49. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/examples/todo-list/styles.css +0 -0
  50. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/examples/todo-list/task-001.html +0 -0
  51. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/examples/todo-list/task-002.html +0 -0
  52. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/examples/todo-list/task-003.html +0 -0
  53. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/examples/todo-list/task-004.html +0 -0
  54. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/examples/todo-list/task-005.html +0 -0
  55. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/examples/todo-list/task-006.html +0 -0
  56. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/packages/gemini-extension/GEMINI.md +0 -0
  57. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/packages/gemini-extension/README.md +0 -0
  58. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/packages/gemini-extension/command_deploy.md +0 -0
  59. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/packages/gemini-extension/command_end.md +0 -0
  60. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/packages/gemini-extension/command_feature-add.md +0 -0
  61. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/packages/gemini-extension/command_feature-complete.md +0 -0
  62. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/packages/gemini-extension/command_feature-primary.md +0 -0
  63. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/packages/gemini-extension/command_feature-start.md +0 -0
  64. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/packages/gemini-extension/command_git-commit.md +0 -0
  65. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/packages/gemini-extension/command_help.md +0 -0
  66. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/packages/gemini-extension/command_init.md +0 -0
  67. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/packages/gemini-extension/command_plan.md +0 -0
  68. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/packages/gemini-extension/command_recommend.md +0 -0
  69. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/packages/gemini-extension/command_serve.md +0 -0
  70. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/packages/gemini-extension/command_spike.md +0 -0
  71. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/packages/gemini-extension/command_start.md +0 -0
  72. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/packages/gemini-extension/command_status.md +0 -0
  73. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/packages/gemini-extension/command_track.md +0 -0
  74. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/packages/gemini-extension/hooks/hooks.json +0 -0
  75. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/packages/gemini-extension/hooks/scripts/post-tool.sh +0 -0
  76. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/packages/gemini-extension/hooks/scripts/session-end.sh +0 -0
  77. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/packages/gemini-extension/hooks/scripts/session-start.sh +0 -0
  78. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/js/htmlgraph.js +0 -0
  79. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/.htmlgraph/.session-warning-state.json +0 -0
  80. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/.htmlgraph/agents.json +0 -0
  81. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/.htmlgraph/htmlgraph.db +0 -0
  82. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/agent_detection.py +0 -0
  83. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/agent_registry.py +0 -0
  84. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/agents.py +0 -0
  85. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/analytics/__init__.py +0 -0
  86. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/analytics/cli.py +0 -0
  87. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/analytics/cross_session.py +0 -0
  88. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/analytics/dependency.py +0 -0
  89. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/analytics/work_type.py +0 -0
  90. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/analytics_index.py +0 -0
  91. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/api/__init__.py +0 -0
  92. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/api/main.py +0 -0
  93. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/api/static/htmx.min.js +0 -0
  94. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/api/static/style-redesign.css +0 -0
  95. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/api/static/style.css +0 -0
  96. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/api/templates/dashboard-redesign.html +0 -0
  97. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/api/templates/dashboard.html +0 -0
  98. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/api/templates/partials/activity-feed-hierarchical.html +0 -0
  99. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/api/templates/partials/activity-feed.html +0 -0
  100. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/api/templates/partials/agents-redesign.html +0 -0
  101. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/api/templates/partials/agents.html +0 -0
  102. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/api/templates/partials/event-traces.html +0 -0
  103. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/api/templates/partials/features-kanban-redesign.html +0 -0
  104. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/api/templates/partials/features.html +0 -0
  105. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/api/templates/partials/metrics-redesign.html +0 -0
  106. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/api/templates/partials/metrics.html +0 -0
  107. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/api/templates/partials/orchestration-redesign.html +0 -0
  108. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/api/templates/partials/orchestration.html +0 -0
  109. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/api/templates/partials/spawners.html +0 -0
  110. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/archive/__init__.py +0 -0
  111. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/archive/bloom.py +0 -0
  112. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/archive/fts.py +0 -0
  113. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/archive/manager.py +0 -0
  114. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/archive/search.py +0 -0
  115. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/atomic_ops.py +0 -0
  116. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/attribute_index.py +0 -0
  117. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/builders/__init__.py +0 -0
  118. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/builders/base.py +0 -0
  119. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/builders/bug.py +0 -0
  120. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/builders/chore.py +0 -0
  121. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/builders/epic.py +0 -0
  122. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/builders/feature.py +0 -0
  123. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/builders/insight.py +0 -0
  124. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/builders/metric.py +0 -0
  125. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/builders/pattern.py +0 -0
  126. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/builders/phase.py +0 -0
  127. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/builders/spike.py +0 -0
  128. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/builders/track.py +0 -0
  129. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/cigs/__init__.py +0 -0
  130. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/cigs/autonomy.py +0 -0
  131. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/cigs/cost.py +0 -0
  132. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/cigs/messages_basic.py +0 -0
  133. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/cigs/messaging.py +0 -0
  134. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/cigs/models.py +0 -0
  135. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/cigs/pattern_storage.py +0 -0
  136. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/cigs/patterns.py +0 -0
  137. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/cigs/posttool_analyzer.py +0 -0
  138. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/cigs/reporter.py +0 -0
  139. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/cigs/tracker.py +0 -0
  140. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/cli/.htmlgraph/.session-warning-state.json +0 -0
  141. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/cli/.htmlgraph/agents.json +0 -0
  142. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/cli/__init__.py +0 -0
  143. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/cli/__main__.py +0 -0
  144. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/cli/analytics.py +0 -0
  145. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/cli/base.py +0 -0
  146. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/cli/constants.py +0 -0
  147. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/cli/core.py +0 -0
  148. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/cli/main.py +0 -0
  149. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/cli/models.py +0 -0
  150. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/cli/templates/__init__.py +0 -0
  151. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/cli/templates/cost_dashboard.py +0 -0
  152. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/cli/work/__init__.py +0 -0
  153. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/cli/work/features.py +0 -0
  154. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/cli/work/orchestration.py +0 -0
  155. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/cli/work/sessions.py +0 -0
  156. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/cli/work/tracks.py +0 -0
  157. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/cli_commands/__init__.py +0 -0
  158. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/cli_commands/feature.py +0 -0
  159. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/cli_framework.py +0 -0
  160. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/collections/__init__.py +0 -0
  161. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/collections/base.py +0 -0
  162. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/collections/bug.py +0 -0
  163. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/collections/chore.py +0 -0
  164. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/collections/epic.py +0 -0
  165. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/collections/feature.py +0 -0
  166. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/collections/insight.py +0 -0
  167. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/collections/metric.py +0 -0
  168. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/collections/pattern.py +0 -0
  169. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/collections/phase.py +0 -0
  170. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/collections/session.py +0 -0
  171. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/collections/spike.py +0 -0
  172. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/collections/task_delegation.py +0 -0
  173. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/collections/todo.py +0 -0
  174. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/collections/traces.py +0 -0
  175. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/config.py +0 -0
  176. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/context_analytics.py +0 -0
  177. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/converter.py +0 -0
  178. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/cost_analysis/__init__.py +0 -0
  179. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/cost_analysis/analyzer.py +0 -0
  180. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/dashboard.html +0 -0
  181. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/dashboard.html.backup +0 -0
  182. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/dashboard.html.bak +0 -0
  183. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/dashboard.html.bak2 +0 -0
  184. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/dashboard.html.bak3 +0 -0
  185. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/db/__init__.py +0 -0
  186. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/db/queries.py +0 -0
  187. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/db/schema.py +0 -0
  188. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/dependency_models.py +0 -0
  189. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/deploy.py +0 -0
  190. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/deployment_models.py +0 -0
  191. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/docs/API_REFERENCE.md +0 -0
  192. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/docs/HTTP_API.md +0 -0
  193. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/docs/INTEGRATION_GUIDE.md +0 -0
  194. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/docs/ORCHESTRATION_PATTERNS.md +0 -0
  195. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/docs/README.md +0 -0
  196. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/docs/__init__.py +0 -0
  197. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/docs/docs_version.py +0 -0
  198. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/docs/metadata.py +0 -0
  199. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/docs/migrations.py +0 -0
  200. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/docs/template_engine.py +0 -0
  201. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/docs/templates/_sections/cli_reference.md.j2 +0 -0
  202. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/docs/templates/_sections/core_concepts.md.j2 +0 -0
  203. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/docs/templates/_sections/sdk_basics.md.j2 +0 -0
  204. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/docs/templates/base_agents.md.j2 +0 -0
  205. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/docs/templates/example_user_override.md.j2 +0 -0
  206. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/docs/version_check.py +0 -0
  207. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/edge_index.py +0 -0
  208. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/error_handler.py +0 -0
  209. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/event_log.py +0 -0
  210. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/event_migration.py +0 -0
  211. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/exceptions.py +0 -0
  212. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/extensions/gemini/GEMINI.md +0 -0
  213. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/extensions/gemini/README.md +0 -0
  214. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/extensions/gemini/gemini-extension.json +0 -0
  215. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/extensions/gemini/hooks/hooks.json +0 -0
  216. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/extensions/gemini/hooks/scripts/post-tool.sh +0 -0
  217. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/extensions/gemini/hooks/scripts/session-end.sh +0 -0
  218. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/extensions/gemini/hooks/scripts/session-start.sh +0 -0
  219. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/file_watcher.py +0 -0
  220. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/find_api.py +0 -0
  221. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/git_events.py +0 -0
  222. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/graph.py +0 -0
  223. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/hooks/.htmlgraph/.session-warning-state.json +0 -0
  224. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/hooks/.htmlgraph/agents.json +0 -0
  225. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/hooks/.htmlgraph/index.sqlite +0 -0
  226. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/hooks/__init__.py +0 -0
  227. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/hooks/bootstrap.py +0 -0
  228. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/hooks/cigs_pretool_enforcer.py +0 -0
  229. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/hooks/concurrent_sessions.py +0 -0
  230. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/hooks/context.py +0 -0
  231. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/hooks/drift_handler.py +0 -0
  232. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/hooks/git_commands.py +0 -0
  233. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/hooks/hooks-config.example.json +0 -0
  234. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/hooks/installer.py +0 -0
  235. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/hooks/orchestrator.py +0 -0
  236. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/hooks/orchestrator_reflector.py +0 -0
  237. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/hooks/post-checkout.sh +0 -0
  238. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/hooks/post-commit.sh +0 -0
  239. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/hooks/post-merge.sh +0 -0
  240. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/hooks/post_tool_use_failure.py +0 -0
  241. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/hooks/post_tool_use_handler.py +0 -0
  242. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/hooks/posttooluse.py +0 -0
  243. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/hooks/pre-commit.sh +0 -0
  244. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/hooks/pre-push.sh +0 -0
  245. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/hooks/pretooluse.py +0 -0
  246. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/hooks/prompt_analyzer.py +0 -0
  247. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/hooks/session_handler.py +0 -0
  248. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/hooks/session_summary.py +0 -0
  249. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/hooks/state_manager.py +0 -0
  250. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/hooks/subagent_detection.py +0 -0
  251. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/hooks/task_enforcer.py +0 -0
  252. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/hooks/task_validator.py +0 -0
  253. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/hooks/validator.py +0 -0
  254. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/ids.py +0 -0
  255. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/index.d.ts +0 -0
  256. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/learning.py +0 -0
  257. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/mcp_server.py +0 -0
  258. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/models.py +0 -0
  259. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/operations/README.md +0 -0
  260. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/operations/__init__.py +0 -0
  261. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/operations/analytics.py +0 -0
  262. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/operations/events.py +0 -0
  263. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/operations/fastapi_server.py +0 -0
  264. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/operations/hooks.py +0 -0
  265. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/operations/initialization.py +0 -0
  266. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/operations/initialization.py.backup +0 -0
  267. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/operations/server.py +0 -0
  268. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/orchestration/__init__.py +0 -0
  269. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/orchestration/claude_launcher.py +0 -0
  270. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/orchestration/command_builder.py +0 -0
  271. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/orchestration/headless_spawner.py +0 -0
  272. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/orchestration/live_events.py +0 -0
  273. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/orchestration/model_selection.py +0 -0
  274. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/orchestration/plugin_manager.py +0 -0
  275. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/orchestration/prompts.py +0 -0
  276. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/orchestration/spawners/__init__.py +0 -0
  277. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/orchestration/spawners/base.py +0 -0
  278. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/orchestration/spawners/claude.py +0 -0
  279. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/orchestration/spawners/codex.py +0 -0
  280. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/orchestration/spawners/copilot.py +0 -0
  281. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/orchestration/spawners/gemini.py +0 -0
  282. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/orchestration/subprocess_runner.py +0 -0
  283. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/orchestration/task_coordination.py +0 -0
  284. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/orchestration.md +0 -0
  285. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/orchestrator-system-prompt-optimized.txt +0 -0
  286. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/orchestrator.py +0 -0
  287. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/orchestrator_config.py +0 -0
  288. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/orchestrator_mode.py +0 -0
  289. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/orchestrator_validator.py +0 -0
  290. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/parallel.py +0 -0
  291. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/parser.py +0 -0
  292. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/planning.py +0 -0
  293. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/pydantic_models.py +0 -0
  294. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/quality_gates.py +0 -0
  295. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/query_builder.py +0 -0
  296. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/reflection.py +0 -0
  297. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/repo_hash.py +0 -0
  298. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/routing.py +0 -0
  299. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/scripts/__init__.py +0 -0
  300. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/scripts/deploy.py +0 -0
  301. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/sdk.py +0 -0
  302. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/server.py +0 -0
  303. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/services/__init__.py +0 -0
  304. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/services/claiming.py +0 -0
  305. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/session_hooks.py +0 -0
  306. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/session_manager.py +0 -0
  307. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/session_registry.py +0 -0
  308. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/session_state.py +0 -0
  309. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/session_warning.py +0 -0
  310. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/setup.py +0 -0
  311. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/spike_index.py +0 -0
  312. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/styles.css +0 -0
  313. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/sync_docs.py +0 -0
  314. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/system_prompts.py +0 -0
  315. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/templates/AGENTS.md.template +0 -0
  316. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/templates/CLAUDE.md.template +0 -0
  317. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/templates/GEMINI.md.template +0 -0
  318. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/templates/orchestration-view.html +0 -0
  319. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/track_builder.py +0 -0
  320. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/track_manager.py +0 -0
  321. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/transcript.py +0 -0
  322. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/transcript_analytics.py +0 -0
  323. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/types.py +0 -0
  324. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/validation.py +0 -0
  325. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/watch.py +0 -0
  326. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/src/python/htmlgraph/work_type_utils.py +0 -0
  327. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/benchmarks/README.md +0 -0
  328. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/benchmarks/__init__.py +0 -0
  329. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/benchmarks/bench_graph.py +0 -0
  330. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/benchmarks/conftest.py +0 -0
  331. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/hooks/__init__.py +0 -0
  332. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/hooks/test_bootstrap.py +0 -0
  333. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/hooks/test_concurrent_sessions.py +0 -0
  334. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/hooks/test_context.py +0 -0
  335. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/hooks/test_git_commands.py +0 -0
  336. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/hooks/test_hybrid_event_capture.py +0 -0
  337. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/hooks/test_prompt_analyzer.py +0 -0
  338. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/hooks/test_session_handler.py +0 -0
  339. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/hooks/test_state_manager.py +0 -0
  340. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/hooks/test_system_prompt_persistence.py +0 -0
  341. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/hooks/test_system_prompt_persistence_integration.py +0 -0
  342. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/integration/multi_agent/README.md +0 -0
  343. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/integration/multi_agent/__init__.py +0 -0
  344. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/integration/multi_agent/test_agent_quirks.py +0 -0
  345. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/integration/multi_agent/test_git_continuity_spine.py +0 -0
  346. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/integration/test_cigs_hook_flow.py +0 -0
  347. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/integration/test_cigs_integration.py +0 -0
  348. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/integration/test_cigs_learning.py +0 -0
  349. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/integration/test_complexity_assessment.py +0 -0
  350. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/integration/test_dashboard_spawner_display.py +0 -0
  351. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/integration/test_delegation_events.py +0 -0
  352. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/integration/test_deployment_workflow.py +0 -0
  353. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/integration/test_discoverability.py +0 -0
  354. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/integration/test_edge_index_bug.py +0 -0
  355. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/integration/test_features.py +0 -0
  356. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/integration/test_handoff_routing.py +0 -0
  357. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/integration/test_multi_agent_coordination.py +0 -0
  358. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/integration/test_new_features.py +0 -0
  359. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/integration/test_orchestration_tab.py +0 -0
  360. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/integration/test_orchestration_with_playwright.py +0 -0
  361. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/integration/test_orchestrator_pattern.py +0 -0
  362. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/integration/test_orchestrator_spawner_delegation.py +0 -0
  363. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/integration/test_phase1_userquery.py +0 -0
  364. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/integration/test_phase4_delegation_events.py +0 -0
  365. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/integration/test_post_compact_delegation.py +0 -0
  366. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/integration/test_real_workitem_integration.py +0 -0
  367. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/integration/test_redesigned_dashboard.py +0 -0
  368. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/integration/test_spawner_integration.py +0 -0
  369. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/integration/test_spawner_live_events.py +0 -0
  370. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/integration/test_spawner_observability_e2e.py +0 -0
  371. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/integration/test_spawner_routing_live.py +0 -0
  372. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/integration/test_spawner_tool_tracking.py +0 -0
  373. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/integration/test_task_delegation.py +0 -0
  374. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/integration/test_user_query_events.py +0 -0
  375. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/integration/test_websocket_realtime.py +0 -0
  376. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/integration/test_websocket_streaming.py +0 -0
  377. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/js/README.md +0 -0
  378. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/js/test_htmlgraph.html +0 -0
  379. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/manual/test-hook-input.py +0 -0
  380. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/operations/__init__.py +0 -0
  381. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/operations/test_hooks.py +0 -0
  382. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/operations/test_server.py +0 -0
  383. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/__init__.py +0 -0
  384. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/conftest.py +0 -0
  385. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_activity_feed_ui.py +0 -0
  386. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_agent_attribution.py +0 -0
  387. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_agent_detection.py +0 -0
  388. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_analytics.py +0 -0
  389. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_archive_manager.py +0 -0
  390. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_archive_search.py +0 -0
  391. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_atomic_ops.py +0 -0
  392. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_auto_spike.py +0 -0
  393. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_cigs_pretool_enforcer.py +0 -0
  394. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_claiming.py +0 -0
  395. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_cli_commands.py +0 -0
  396. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_cli_pydantic_models.py +0 -0
  397. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_cli_rich_output.py +0 -0
  398. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_collection_filter.py +0 -0
  399. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_cost_analyzer.py +0 -0
  400. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_cross_agent_attribution.py +0 -0
  401. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_cross_session_analytics.py +0 -0
  402. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_dashboard_attribution.py +0 -0
  403. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_dashboard_ui.py +0 -0
  404. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_delegation_fk_fix.py +0 -0
  405. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_delete.py +0 -0
  406. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_deploy.py +0 -0
  407. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_drift_parent_activity.py +0 -0
  408. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_drift_queue_cleanup.py +0 -0
  409. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_edge_index.py +0 -0
  410. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_error_handling.py +0 -0
  411. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_event_index.py +0 -0
  412. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_event_query.py +0 -0
  413. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_event_tracing.py +0 -0
  414. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_feature_track_linkage_phase1.py +0 -0
  415. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_find_api.py +0 -0
  416. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_git_events.py +0 -0
  417. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_graph_traversal.py +0 -0
  418. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_handoff.py +0 -0
  419. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_headless_spawner.py +0 -0
  420. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_headless_spawner_parent_session.py +0 -0
  421. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_ids.py +0 -0
  422. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_install_hooks.py +0 -0
  423. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_lifecycle.py +0 -0
  424. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_mcp_server.py +0 -0
  425. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_mcp_stdio_transport.py +0 -0
  426. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_models.py +0 -0
  427. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_orchestration.py +0 -0
  428. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_orchestrator_circuit_breaker.py +0 -0
  429. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_orchestrator_cli.py +0 -0
  430. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_orchestrator_enforce_hook.py +0 -0
  431. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_orchestrator_mode.py +0 -0
  432. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_parent_child_event_linking.py +0 -0
  433. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_parent_child_linking.py +0 -0
  434. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_parent_linking_integration.py +0 -0
  435. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_pattern_storage.py +0 -0
  436. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_plugin_update_preservation.py +0 -0
  437. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_post_tool_use_failure.py +0 -0
  438. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_post_tool_use_handler.py +0 -0
  439. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_posttooluse_cigs.py +0 -0
  440. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_pre_commit_hooks.py +0 -0
  441. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_pre_work_validation_integration.py +0 -0
  442. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_quality_gates.py +0 -0
  443. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_query_builder.py +0 -0
  444. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_query_cache.py +0 -0
  445. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_query_compilation.py +0 -0
  446. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_reflection.py +0 -0
  447. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_repo_hash.py +0 -0
  448. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_routing.py +0 -0
  449. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_sdk_discoverability.py +0 -0
  450. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_sdk_get_active_work_item.py +0 -0
  451. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_sdk_parent_session.py +0 -0
  452. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_sdk_sqlite_integration.py +0 -0
  453. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_session_cleanup.py +0 -0
  454. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_session_continuity.py +0 -0
  455. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_session_integration.py +0 -0
  456. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_session_registry.py +0 -0
  457. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_session_start_cigs.py +0 -0
  458. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_session_start_info_validation.py +0 -0
  459. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_session_state_manager.py +0 -0
  460. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_spawner_agents.py +0 -0
  461. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_spawner_routing.py +0 -0
  462. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_sqlite_schema.py +0 -0
  463. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_stop_cigs.py +0 -0
  464. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_system_overhead_drift.py +0 -0
  465. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_template_system.py +0 -0
  466. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_todo_collection.py +0 -0
  467. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_traces_collection.py +0 -0
  468. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_track_loading.py +0 -0
  469. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_transcript_linking.py +0 -0
  470. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_update_preserves_incoming_edges.py +0 -0
  471. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_user_prompt_submit_cigs.py +0 -0
  472. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_validate_work_hook.py +0 -0
  473. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_version_migration.py +0 -0
  474. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_violation_tracker.py +0 -0
  475. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_work_queue.py +0 -0
  476. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/python/test_work_type.py +0 -0
  477. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/test_agent_routing.py +0 -0
  478. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/test_autonomy_recommender.py +0 -0
  479. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/test_cigs_cli.py +0 -0
  480. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/test_cigs_cost_calculator.py +0 -0
  481. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/test_cigs_cost_reporter.py +0 -0
  482. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/test_cigs_imperative_messages.py +0 -0
  483. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/test_cigs_messages_basic.py +0 -0
  484. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/test_cli_output_snapshots.py +0 -0
  485. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/test_cli_sdk_parity.py +0 -0
  486. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/test_deployment_models.py +0 -0
  487. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/test_event_log.py +0 -0
  488. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/test_hybrid_event_capture.py +0 -0
  489. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/test_orchestrator_config.py +0 -0
  490. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/test_orchestrator_validator.py +0 -0
  491. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/test_pattern_detector.py +0 -0
  492. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/test_sdk_api_surface.py +0 -0
  493. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/test_sdk_operations.py +0 -0
  494. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/test_transaction_snapshot.py +0 -0
  495. {htmlgraph-0.26.8 → htmlgraph-0.26.9}/tests/test_transcript.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: htmlgraph
3
- Version: 0.26.8
3
+ Version: 0.26.9
4
4
  Summary: HTML is All You Need - Graph database on web standards
5
5
  Project-URL: Homepage, https://github.com/Shakes-tzd/htmlgraph
6
6
  Project-URL: Documentation, https://github.com/Shakes-tzd/htmlgraph#readme
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "htmlgraph",
3
- "version": "0.26.8",
3
+ "version": "0.26.9",
4
4
  "description": "HtmlGraph session tracking and documentation for Gemini CLI. Ensures proper activity attribution, feature awareness, and continuous work tracking.",
5
5
  "author": "Shakes",
6
6
  "license": "MIT",
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "htmlgraph"
3
- version = "0.26.8"
3
+ version = "0.26.9"
4
4
  description = "HTML is All You Need - Graph database on web standards"
5
5
  authors = [{name = "Shakes", email = "shakestzd@gmail.com"}]
6
6
  readme = "README.md"
@@ -95,7 +95,7 @@ from htmlgraph.types import (
95
95
  )
96
96
  from htmlgraph.work_type_utils import infer_work_type, infer_work_type_from_id
97
97
 
98
- __version__ = "0.26.8"
98
+ __version__ = "0.26.9"
99
99
  __all__ = [
100
100
  # Exceptions
101
101
  "HtmlGraphError",
@@ -353,7 +353,6 @@ def detect_model_from_hook_input(hook_input: dict[str, Any]) -> str | None:
353
353
  1. Task() model parameter (if tool_name == 'Task')
354
354
  2. HTMLGRAPH_MODEL environment variable (set by hooks)
355
355
  3. ANTHROPIC_MODEL or CLAUDE_MODEL environment variables
356
- 4. Status line cache (for orchestrator tool calls)
357
356
 
358
357
  Args:
359
358
  hook_input: Hook input dict containing tool_name and tool_input
@@ -387,14 +386,6 @@ def detect_model_from_hook_input(hook_input: dict[str, Any]) -> str | None:
387
386
  if model:
388
387
  return model
389
388
 
390
- # 3. Fallback to status line cache for orchestrator's own tool calls
391
- # This gives regular tool calls (Bash, Read, etc.) the model of the orchestrator
392
- session_id = hook_input.get("session_id") or hook_input.get("sessionId")
393
- if session_id:
394
- model_from_cache = get_model_from_status_cache(session_id)
395
- if model_from_cache:
396
- return model_from_cache
397
-
398
389
  return None
399
390
 
400
391
 
@@ -455,179 +446,6 @@ def detect_agent_from_environment() -> tuple[str, str | None]:
455
446
  return agent_id, model_name
456
447
 
457
448
 
458
- def detect_subagent_context_from_database(
459
- db: HtmlGraphDB,
460
- current_session_id: str,
461
- parent_event_id_hint: str | None = None,
462
- current_tool_name: str | None = None,
463
- ) -> tuple[str | None, str | None, str | None]:
464
- """
465
- Detect if we're in a subagent context by checking for active task_delegation events.
466
-
467
- This is the DATABASE-BASED approach to subagent detection, which is necessary because
468
- environment variables set by PreToolUse hooks in the parent process do NOT propagate
469
- to subagent processes spawned by Claude Code's Task() tool.
470
-
471
- IMPORTANT CONTEXT:
472
- - Claude Code passes the SAME session_id to both parent and subagent hooks
473
- - Environment variables set in hooks don't persist (each hook is a new subprocess)
474
- - The only way to detect subagent context is through database state
475
-
476
- DETECTION STRATEGY:
477
- - If there's an active task_delegation (status='started') within the time window,
478
- AND the current tool is NOT the Task tool itself (to avoid self-detection),
479
- then we're likely in a subagent context.
480
- - The Task tool check is critical: when PostToolUse fires for the Task tool itself,
481
- we should NOT consider ourselves in a subagent context - we're the orchestrator
482
- that just finished delegating.
483
-
484
- Strategy (in order of precedence):
485
- 1. If parent_event_id_hint is provided, look up that specific event directly
486
- 2. Otherwise, query for task_delegation events with status='started' (fallback)
487
- 3. If found within the last 5 minutes AND current tool is not Task, we're in subagent context
488
- 4. Return the subagent_type and parent session info
489
-
490
- Args:
491
- db: HtmlGraphDB instance
492
- current_session_id: The session_id from hook_input (Claude Code's session ID)
493
- parent_event_id_hint: Optional event_id from environment variable for direct lookup.
494
- This is the preferred method when available, as it correctly
495
- handles parallel Task() calls.
496
- current_tool_name: The tool being executed. If "Task", we skip subagent detection
497
- to avoid the orchestrator thinking it's a subagent.
498
-
499
- Returns:
500
- Tuple of (subagent_type, parent_session_id, parent_event_id)
501
- All None if not in subagent context
502
- """
503
- # Skip detection if the current tool is Task - we're the orchestrator, not a subagent
504
- if current_tool_name == "Task":
505
- print(
506
- "DEBUG detect_subagent_context_from_database: "
507
- "Skipping detection for Task tool (we're the orchestrator)",
508
- file=sys.stderr,
509
- )
510
- return None, None, None
511
- try:
512
- if db.connection is None:
513
- return None, None, None
514
-
515
- cursor = db.connection.cursor()
516
-
517
- # Priority 1: Direct lookup using parent_event_id_hint (handles parallel tasks correctly)
518
- if parent_event_id_hint:
519
- cursor.execute(
520
- """
521
- SELECT event_id, session_id, subagent_type, timestamp
522
- FROM agent_events
523
- WHERE event_id = ?
524
- AND event_type = 'task_delegation'
525
- AND status = 'started'
526
- """,
527
- (parent_event_id_hint,),
528
- )
529
- row = cursor.fetchone()
530
-
531
- if row:
532
- parent_event_id = row[0]
533
- parent_session_id = row[1]
534
- subagent_type = row[2] or "general-purpose"
535
-
536
- print(
537
- f"Debug: Detected subagent context via hint: "
538
- f"type={subagent_type}, parent_session={parent_session_id}, "
539
- f"parent_event={parent_event_id}",
540
- file=sys.stderr,
541
- )
542
-
543
- return subagent_type, parent_session_id, parent_event_id
544
-
545
- # Hint provided but event not found or not in 'started' status
546
- # This can happen if the event was already completed
547
- print(
548
- f"Debug: Parent event hint '{parent_event_id_hint}' not found or not active",
549
- file=sys.stderr,
550
- )
551
-
552
- # Priority 2: Fallback to most recent active task_delegation
553
- # WARNING: This can pick the wrong parent when multiple Task() calls run in parallel!
554
- # This is kept as a fallback for cases where environment variables don't propagate.
555
- #
556
- # IMPORTANT: We previously had `AND session_id != ?` to exclude the current session,
557
- # but this was WRONG. Claude Code passes the SAME session_id to subagent hooks as
558
- # to the parent session. So we need to find task_delegation events from the SAME
559
- # session that are in 'started' status (not yet completed).
560
- #
561
- # The key insight: when a subagent runs, the task_delegation event from the parent
562
- # is ALREADY in the database with status='started'. We just need to find it.
563
- print(
564
- f"DEBUG detect_subagent_context_from_database: "
565
- f"Querying for task_delegation events in session {current_session_id}",
566
- file=sys.stderr,
567
- )
568
-
569
- # First, let's see what task_delegation events exist at all (debug)
570
- cursor.execute(
571
- """
572
- SELECT event_id, session_id, subagent_type, status, timestamp
573
- FROM agent_events
574
- WHERE event_type = 'task_delegation'
575
- ORDER BY timestamp DESC
576
- LIMIT 5
577
- """
578
- )
579
- debug_rows = cursor.fetchall()
580
- print(
581
- f"DEBUG detect_subagent_context_from_database: "
582
- f"Recent task_delegation events: {debug_rows}",
583
- file=sys.stderr,
584
- )
585
-
586
- # Query for active task_delegation in the SAME session (or any session within time window)
587
- # The subagent may have the same session_id as parent, so we look for ANY active
588
- # task_delegation within the time window. The most recent one is likely our parent.
589
- cursor.execute(
590
- """
591
- SELECT event_id, session_id, subagent_type, timestamp
592
- FROM agent_events
593
- WHERE event_type = 'task_delegation'
594
- AND status = 'started'
595
- AND timestamp >= datetime('now', '-5 minutes')
596
- ORDER BY timestamp DESC
597
- LIMIT 1
598
- """
599
- )
600
- row = cursor.fetchone()
601
- print(
602
- f"DEBUG detect_subagent_context_from_database: "
603
- f"Fallback query result: {row}",
604
- file=sys.stderr,
605
- )
606
-
607
- if row:
608
- parent_event_id = row[0]
609
- parent_session_id = row[1]
610
- subagent_type = row[2] or "general-purpose"
611
-
612
- print(
613
- f"Debug: Detected subagent context from database (fallback): "
614
- f"type={subagent_type}, parent_session={parent_session_id}, "
615
- f"parent_event={parent_event_id}",
616
- file=sys.stderr,
617
- )
618
-
619
- return subagent_type, parent_session_id, parent_event_id
620
-
621
- return None, None, None
622
-
623
- except Exception as e:
624
- print(
625
- f"Debug: Error detecting subagent context from database: {e}",
626
- file=sys.stderr,
627
- )
628
- return None, None, None
629
-
630
-
631
449
  def extract_file_paths(tool_input: dict[str, Any], tool_name: str) -> list[str]:
632
450
  """Extract file paths from tool input based on tool type."""
633
451
  paths = []
@@ -862,24 +680,6 @@ def track_event(hook_type: str, hook_input: dict[str, Any]) -> dict[str, Any]:
862
680
  Returns:
863
681
  Response dict with {"continue": True} and optional hookSpecificOutput
864
682
  """
865
- # Check for debug mode (set HTMLGRAPH_DEBUG=1 to enable verbose logging)
866
- debug_mode = os.environ.get("HTMLGRAPH_DEBUG") == "1"
867
-
868
- if debug_mode:
869
- print(
870
- f"DEBUG track_event: hook_type={hook_type}, "
871
- f"session_id={hook_input.get('session_id')}, "
872
- f"tool_name={hook_input.get('tool_name', hook_input.get('name', 'unknown'))}",
873
- file=sys.stderr,
874
- )
875
- print(
876
- f"DEBUG track_event: ENV HTMLGRAPH_PARENT_EVENT="
877
- f"{os.environ.get('HTMLGRAPH_PARENT_EVENT')}, "
878
- f"HTMLGRAPH_SUBAGENT_TYPE={os.environ.get('HTMLGRAPH_SUBAGENT_TYPE')}, "
879
- f"HTMLGRAPH_PARENT_SESSION={os.environ.get('HTMLGRAPH_PARENT_SESSION')}",
880
- file=sys.stderr,
881
- )
882
-
883
683
  cwd = hook_input.get("cwd")
884
684
  project_dir = resolve_project_path(cwd if cwd else None)
885
685
  graph_dir = Path(project_dir) / ".htmlgraph"
@@ -913,115 +713,104 @@ def track_event(hook_type: str, hook_input: dict[str, Any]) -> dict[str, Any]:
913
713
  detected_model = model_from_input
914
714
 
915
715
  active_session = None
916
- is_subagent_session = False
917
- parent_event_id_for_session = None
918
-
919
- # Get session_id from hook_input first (Claude Code provides this)
920
- hook_session_id = hook_input.get("session_id") or hook_input.get("sessionId")
921
716
 
922
717
  # Check if we're in a subagent context using multiple methods:
923
718
  #
924
- # PRECEDENCE ORDER (fixes parallel Task() bug):
925
- # 1. Environment variables - most reliable when available, correctly identifies
926
- # the specific parent event even with multiple parallel Task() calls
927
- # 2. Database with hint - uses env var as hint for direct lookup
928
- # 3. Database fallback - picks most recent (WARNING: wrong for parallel tasks!)
719
+ # PRECEDENCE ORDER:
720
+ # 1. Sessions table - if THIS session is already marked as subagent, use stored parent info
721
+ # (fixes persistence issue for subsequent tool calls in same subagent)
722
+ # 2. Environment variables - set by spawner router for first tool call
723
+ # 3. Fallback to normal orchestrator context
929
724
  #
930
- # Method 1: Environment variables (works if Task() spawner sets them)
931
- subagent_type = os.environ.get("HTMLGRAPH_SUBAGENT_TYPE")
932
- parent_session_id = os.environ.get("HTMLGRAPH_PARENT_SESSION")
933
- env_parent_event_id = os.environ.get("HTMLGRAPH_PARENT_EVENT")
934
-
935
- # DEBUG: Log subagent detection attempt
936
- print(
937
- f"DEBUG subagent detection: "
938
- f"env subagent_type={subagent_type}, "
939
- f"env parent_session_id={parent_session_id}, "
940
- f"env parent_event_id={env_parent_event_id}",
941
- file=sys.stderr,
942
- )
943
-
944
- # If we have parent event from environment, use it directly
945
- if env_parent_event_id:
946
- parent_event_id_for_session = env_parent_event_id
947
- print(
948
- f"Debug: Using environment variable for parent event: {env_parent_event_id}",
949
- file=sys.stderr,
950
- )
725
+ # Method 1: Check if current session is already a subagent (CRITICAL for persistence!)
726
+ # This fixes the issue where subsequent tool calls in the same subagent session
727
+ # lose the parent_event_id linkage.
728
+ subagent_type = None
729
+ parent_session_id = None
730
+ hook_session_id = hook_input.get("session_id") or hook_input.get("sessionId")
951
731
 
952
- # Method 2: Database-based detection (CRITICAL for Claude Code Task() tool)
953
- # Environment variables may not propagate to subagent processes, so we check
954
- # the database for active task_delegation events.
955
- # IMPORTANT: Pass env_parent_event_id as hint to handle parallel Task() correctly
956
- # Get the current tool name for subagent detection
957
- current_tool_name = hook_input.get("tool_name") or hook_input.get("name")
958
-
959
- print(
960
- f"DEBUG db detection: will_check={not subagent_type and db and hook_session_id}, "
961
- f"subagent_type={subagent_type}, db={db is not None}, hook_session_id={hook_session_id}, "
962
- f"current_tool_name={current_tool_name}",
963
- file=sys.stderr,
964
- )
965
- if not subagent_type and db and hook_session_id:
966
- print(
967
- f"DEBUG db detection: calling detect_subagent_context_from_database "
968
- f"with current_session_id={hook_session_id}, hint={env_parent_event_id}, "
969
- f"current_tool_name={current_tool_name}",
970
- file=sys.stderr,
971
- )
972
- db_subagent_type, db_parent_session_id, db_parent_event_id = (
973
- detect_subagent_context_from_database(
974
- db,
975
- hook_session_id,
976
- parent_event_id_hint=env_parent_event_id,
977
- current_tool_name=current_tool_name,
732
+ if db and db.connection and hook_session_id:
733
+ try:
734
+ cursor = db.connection.cursor()
735
+ cursor.execute(
736
+ """
737
+ SELECT parent_session_id, agent_assigned
738
+ FROM sessions
739
+ WHERE session_id = ? AND is_subagent = 1
740
+ LIMIT 1
741
+ """,
742
+ (hook_session_id,),
978
743
  )
979
- )
980
- print(
981
- f"DEBUG db detection result: "
982
- f"db_subagent_type={db_subagent_type}, "
983
- f"db_parent_session_id={db_parent_session_id}, "
984
- f"db_parent_event_id={db_parent_event_id}",
985
- file=sys.stderr,
986
- )
987
- if db_subagent_type:
988
- subagent_type = db_subagent_type
989
- parent_session_id = db_parent_session_id
990
- # Only update parent_event_id if not already set from env
991
- if not parent_event_id_for_session:
992
- parent_event_id_for_session = db_parent_event_id
744
+ row = cursor.fetchone()
745
+ if row:
746
+ parent_session_id = row[0]
747
+ # Extract subagent_type from agent_assigned (e.g., "general-purpose-spawner" -> "general-purpose")
748
+ agent_assigned = row[1] or ""
749
+ if agent_assigned and agent_assigned.endswith("-spawner"):
750
+ subagent_type = agent_assigned[:-8] # Remove "-spawner" suffix
751
+ else:
752
+ subagent_type = "general-purpose" # Default if format unexpected
753
+
754
+ print(
755
+ f"DEBUG subagent persistence: Found current session as subagent in sessions table: "
756
+ f"type={subagent_type}, parent_session={parent_session_id}",
757
+ file=sys.stderr,
758
+ )
759
+ except Exception as e:
993
760
  print(
994
- f"Debug: Using database-based subagent detection: "
995
- f"type={subagent_type}, parent={parent_session_id}, "
996
- f"parent_event={parent_event_id_for_session}",
761
+ f"DEBUG: Error checking sessions table for subagent: {e}",
997
762
  file=sys.stderr,
998
763
  )
999
764
 
1000
- # DEBUG: Log subagent context decision
1001
- print(
1002
- f"DEBUG subagent context decision: "
1003
- f"subagent_type={subagent_type}, parent_session_id={parent_session_id}, "
1004
- f"will_create_subagent_session={bool(subagent_type and parent_session_id)}",
1005
- file=sys.stderr,
1006
- )
765
+ # Method 2: Environment variables (for first tool call before session table is populated)
766
+ if not subagent_type:
767
+ subagent_type = os.environ.get("HTMLGRAPH_SUBAGENT_TYPE")
768
+ parent_session_id = os.environ.get("HTMLGRAPH_PARENT_SESSION")
1007
769
 
1008
- if subagent_type and parent_session_id:
1009
- # We're in a subagent context
1010
- is_subagent_session = True
1011
- print(
1012
- "DEBUG: SUBAGENT CONTEXT DETECTED! Creating subagent session...",
1013
- file=sys.stderr,
1014
- )
770
+ # Method 3: Database detection of active task_delegation events
771
+ # CRITICAL: When Task() subprocess is launched, environment variables don't propagate
772
+ # So we must query the database for active task_delegation events to detect subagent context
773
+ if not subagent_type and db and db.connection:
774
+ try:
775
+ cursor = db.connection.cursor()
776
+ # Find the most recent active task_delegation event
777
+ cursor.execute(
778
+ """
779
+ SELECT event_id, subagent_type, session_id
780
+ FROM agent_events
781
+ WHERE event_type = 'task_delegation'
782
+ AND status = 'started'
783
+ AND tool_name = 'Task'
784
+ ORDER BY timestamp DESC
785
+ LIMIT 1
786
+ """,
787
+ )
788
+ row = cursor.fetchone()
789
+ if row:
790
+ task_event_id, detected_subagent_type, parent_sess = row
791
+ # Only treat as subagent if we're in a DIFFERENT session
792
+ # (same session = we're the orchestrator running Task())
793
+ if hook_session_id and hook_session_id != parent_sess:
794
+ subagent_type = detected_subagent_type or "general-purpose"
795
+ parent_session_id = parent_sess
796
+ print(
797
+ f"DEBUG subagent detection (database): Detected active task_delegation "
798
+ f"type={subagent_type}, parent_session={parent_session_id}, "
799
+ f"parent_event={task_event_id}",
800
+ file=sys.stderr,
801
+ )
802
+ except Exception as e:
803
+ print(
804
+ f"DEBUG: Error detecting subagent from database: {e}",
805
+ file=sys.stderr,
806
+ )
1015
807
 
1016
- # Use Claude's session_id (hook_session_id) as the subagent session ID
1017
- # This ensures events are properly tracked to this session
1018
- subagent_session_id = hook_session_id or f"{parent_session_id}-{subagent_type}"
1019
- print(
1020
- f"DEBUG: subagent_session_id={subagent_session_id}",
1021
- file=sys.stderr,
1022
- )
808
+ if subagent_type and parent_session_id:
809
+ # We're in a subagent - create or get subagent session
810
+ # Use deterministic session ID based on parent + subagent type
811
+ subagent_session_id = f"{parent_session_id}-{subagent_type}"
1023
812
 
1024
- # Check if session already exists in our system
813
+ # Check if subagent session already exists
1025
814
  existing = manager.session_converter.load(subagent_session_id)
1026
815
  if existing:
1027
816
  active_session = existing
@@ -1032,11 +821,6 @@ def track_event(hook_type: str, hook_input: dict[str, Any]) -> dict[str, Any]:
1032
821
  else:
1033
822
  # Create new subagent session with parent link
1034
823
  try:
1035
- print(
1036
- f"DEBUG: Creating NEW subagent session with is_subagent=True, "
1037
- f"parent_session_id={parent_session_id}",
1038
- file=sys.stderr,
1039
- )
1040
824
  active_session = manager.start_session(
1041
825
  session_id=subagent_session_id,
1042
826
  agent=f"{subagent_type}-spawner",
@@ -1046,7 +830,7 @@ def track_event(hook_type: str, hook_input: dict[str, Any]) -> dict[str, Any]:
1046
830
  )
1047
831
  print(
1048
832
  f"Debug: Created subagent session: {subagent_session_id} "
1049
- f"(parent: {parent_session_id}, is_subagent=True)",
833
+ f"(parent: {parent_session_id})",
1050
834
  file=sys.stderr,
1051
835
  )
1052
836
  except Exception as e:
@@ -1062,6 +846,8 @@ def track_event(hook_type: str, hook_input: dict[str, Any]) -> dict[str, Any]:
1062
846
  # Normal orchestrator/parent context
1063
847
  # CRITICAL: Use session_id from hook_input (Claude Code provides this)
1064
848
  # Only fall back to manager.get_active_session() if not in hook_input
849
+ # hook_session_id already defined at line 730
850
+
1065
851
  if hook_session_id:
1066
852
  # Claude Code provided session_id - use it directly
1067
853
  # Check if session already exists
@@ -1110,13 +896,10 @@ def track_event(hook_type: str, hook_input: dict[str, Any]) -> dict[str, Any]:
1110
896
  except Exception:
1111
897
  return default
1112
898
 
1113
- # Use is_subagent_session flag from our detection, not just from session object
1114
899
  is_subagent_raw = safe_getattr(active_session, "is_subagent", False)
1115
- is_subagent_from_obj = (
900
+ is_subagent = (
1116
901
  bool(is_subagent_raw) if isinstance(is_subagent_raw, bool) else False
1117
902
  )
1118
- # Prefer our detection (is_subagent_session) over object attribute
1119
- final_is_subagent = is_subagent_session or is_subagent_from_obj
1120
903
 
1121
904
  transcript_id = safe_getattr(active_session, "transcript_id", None)
1122
905
  transcript_path = safe_getattr(active_session, "transcript_path", None)
@@ -1126,35 +909,14 @@ def track_event(hook_type: str, hook_input: dict[str, Any]) -> dict[str, Any]:
1126
909
  if transcript_path is not None and not isinstance(transcript_path, str):
1127
910
  transcript_path = None
1128
911
 
1129
- # Get parent_session_id from our detection or from session object
1130
- final_parent_session_id = parent_session_id or safe_getattr(
1131
- active_session, "parent_session_id", None
1132
- )
1133
- if final_parent_session_id is not None and not isinstance(
1134
- final_parent_session_id, str
1135
- ):
1136
- final_parent_session_id = None
1137
-
1138
912
  db.insert_session(
1139
913
  session_id=active_session_id,
1140
914
  agent_assigned=safe_getattr(active_session, "agent", None)
1141
915
  or detected_agent,
1142
- parent_session_id=final_parent_session_id,
1143
- parent_event_id=parent_event_id_for_session,
1144
- is_subagent=final_is_subagent,
916
+ is_subagent=is_subagent,
1145
917
  transcript_id=transcript_id,
1146
918
  transcript_path=transcript_path,
1147
919
  )
1148
-
1149
- # Log subagent session creation for debugging
1150
- if final_is_subagent:
1151
- print(
1152
- f"Debug: Inserted subagent session to SQLite: "
1153
- f"session_id={active_session_id}, is_subagent=True, "
1154
- f"parent_session={final_parent_session_id}, "
1155
- f"parent_event={parent_event_id_for_session}",
1156
- file=sys.stderr,
1157
- )
1158
920
  except Exception as e:
1159
921
  # Session may already exist, that's OK - continue
1160
922
  print(
@@ -1265,29 +1027,20 @@ def track_event(hook_type: str, hook_input: dict[str, Any]) -> dict[str, Any]:
1265
1027
  warning_threshold = drift_settings.get("warning_threshold") or 0.7
1266
1028
  auto_classify_threshold = drift_settings.get("auto_classify_threshold") or 0.85
1267
1029
 
1268
- # Determine parent activity context using multiple sources
1030
+ # Determine parent activity context using database-only lookup
1269
1031
  parent_activity_id = None
1270
1032
 
1271
- # Priority 1: If we're in a subagent context, use the parent event from
1272
- # the task_delegation that spawned us (detected from database)
1273
- if is_subagent_session and parent_event_id_for_session:
1274
- parent_activity_id = parent_event_id_for_session
1275
- print(
1276
- f"Debug: Using parent_event from subagent detection: {parent_activity_id}",
1277
- file=sys.stderr,
1278
- )
1279
- # Priority 2: Check environment variable for cross-process parent linking
1033
+ # Check environment variable FIRST for cross-process parent linking
1280
1034
  # This is set by PreToolUse hook when Task() spawns a subagent
1281
- else:
1282
- env_parent = os.environ.get("HTMLGRAPH_PARENT_EVENT") or os.environ.get(
1283
- "HTMLGRAPH_PARENT_QUERY_EVENT"
1284
- )
1285
- if env_parent:
1286
- parent_activity_id = env_parent
1287
- # Priority 3: Query database for most recent UserQuery event as parent
1288
- # Database is the single source of truth for parent-child linking
1289
- elif db:
1290
- parent_activity_id = get_parent_user_query(db, active_session_id)
1035
+ env_parent = os.environ.get("HTMLGRAPH_PARENT_EVENT") or os.environ.get(
1036
+ "HTMLGRAPH_PARENT_QUERY_EVENT"
1037
+ )
1038
+ if env_parent:
1039
+ parent_activity_id = env_parent
1040
+ # Query database for most recent UserQuery event as parent
1041
+ # Database is the single source of truth for parent-child linking
1042
+ elif db:
1043
+ parent_activity_id = get_parent_user_query(db, active_session_id)
1291
1044
 
1292
1045
  # Track the activity
1293
1046
  nudge = None