htmlgraph 0.26.21__tar.gz → 0.26.23__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 (505) hide show
  1. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/PKG-INFO +1 -1
  2. htmlgraph-0.26.23/examples/retry_decorator_examples.py +500 -0
  3. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/packages/gemini-extension/gemini-extension.json +1 -1
  4. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/pyproject.toml +1 -1
  5. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/__init__.py +6 -1
  6. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/cli/analytics.py +465 -0
  7. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/cli/core.py +97 -0
  8. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/cli/main.py +3 -0
  9. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/cli/models.py +12 -0
  10. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/cli/work/__init__.py +5 -0
  11. htmlgraph-0.26.23/src/python/htmlgraph/cli/work/report.py +727 -0
  12. htmlgraph-0.26.23/src/python/htmlgraph/decorators.py +317 -0
  13. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/hooks/subagent_stop.py +65 -6
  14. htmlgraph-0.26.23/src/python/htmlgraph/operations/bootstrap.py +288 -0
  15. htmlgraph-0.26.23/tests/cli/test_bootstrap_command.py +226 -0
  16. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/integration/test_orchestrator_spawner_delegation.py +21 -7
  17. htmlgraph-0.26.23/tests/python/test_costs_command.py +444 -0
  18. htmlgraph-0.26.23/tests/python/test_decorators.py +652 -0
  19. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/.gitignore +0 -0
  20. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/README.md +0 -0
  21. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/examples/agent-coordination/README.md +0 -0
  22. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/examples/agent-coordination/demo.py +0 -0
  23. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/examples/create_auth_track_demo.py +0 -0
  24. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/examples/create_htmlgraph_dev_track.py +0 -0
  25. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/examples/demo_agent_planning.py +0 -0
  26. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/examples/demo_real_project_analytics.py +0 -0
  27. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/examples/demo_sdk_operations.py +0 -0
  28. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/examples/documentation-site/README.md +0 -0
  29. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/examples/documentation-site/agents.json +0 -0
  30. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/examples/documentation-site/demo.py +0 -0
  31. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/examples/documentation-site/features/doc-api-graph.html +0 -0
  32. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/examples/documentation-site/features/doc-api-overview.html +0 -0
  33. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/examples/documentation-site/features/doc-api-sdk.html +0 -0
  34. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/examples/documentation-site/features/doc-example-advanced.html +0 -0
  35. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/examples/documentation-site/features/doc-example-basic.html +0 -0
  36. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/examples/documentation-site/features/doc-index.html +0 -0
  37. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/examples/documentation-site/features/doc-installation.html +0 -0
  38. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/examples/documentation-site/features/doc-quickstart.html +0 -0
  39. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/examples/example_query_compilation.py +0 -0
  40. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/examples/handoff-demo.py +0 -0
  41. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/examples/knowledge-base/README.md +0 -0
  42. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/examples/knowledge-base/agents.json +0 -0
  43. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/examples/knowledge-base/demo.py +0 -0
  44. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/examples/knowledge-base/features/feat-276c615f.html +0 -0
  45. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/examples/knowledge-base/features/feat-7a6f797d.html +0 -0
  46. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/examples/knowledge-base/features/note-ai-agents.html +0 -0
  47. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/examples/knowledge-base/features/note-graph-db.html +0 -0
  48. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/examples/knowledge-base/features/note-htmlgraph.html +0 -0
  49. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/examples/knowledge-base/features/note-web-standards.html +0 -0
  50. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/examples/parallel_task_coordination.py +0 -0
  51. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/examples/routing-demo.py +0 -0
  52. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/examples/sdk_demo.py +0 -0
  53. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/examples/todo-list/README.md +0 -0
  54. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/examples/todo-list/demo.py +0 -0
  55. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/examples/todo-list/index.html +0 -0
  56. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/examples/todo-list/styles.css +0 -0
  57. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/examples/todo-list/task-001.html +0 -0
  58. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/examples/todo-list/task-002.html +0 -0
  59. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/examples/todo-list/task-003.html +0 -0
  60. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/examples/todo-list/task-004.html +0 -0
  61. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/examples/todo-list/task-005.html +0 -0
  62. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/examples/todo-list/task-006.html +0 -0
  63. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/packages/gemini-extension/GEMINI.md +0 -0
  64. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/packages/gemini-extension/README.md +0 -0
  65. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/packages/gemini-extension/command_deploy.md +0 -0
  66. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/packages/gemini-extension/command_end.md +0 -0
  67. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/packages/gemini-extension/command_feature-add.md +0 -0
  68. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/packages/gemini-extension/command_feature-complete.md +0 -0
  69. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/packages/gemini-extension/command_feature-primary.md +0 -0
  70. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/packages/gemini-extension/command_feature-start.md +0 -0
  71. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/packages/gemini-extension/command_git-commit.md +0 -0
  72. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/packages/gemini-extension/command_help.md +0 -0
  73. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/packages/gemini-extension/command_init.md +0 -0
  74. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/packages/gemini-extension/command_plan.md +0 -0
  75. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/packages/gemini-extension/command_recommend.md +0 -0
  76. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/packages/gemini-extension/command_serve.md +0 -0
  77. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/packages/gemini-extension/command_spike.md +0 -0
  78. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/packages/gemini-extension/command_start.md +0 -0
  79. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/packages/gemini-extension/command_status.md +0 -0
  80. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/packages/gemini-extension/command_track.md +0 -0
  81. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/packages/gemini-extension/hooks/hooks.json +0 -0
  82. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/packages/gemini-extension/hooks/scripts/post-tool.sh +0 -0
  83. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/packages/gemini-extension/hooks/scripts/session-end.sh +0 -0
  84. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/packages/gemini-extension/hooks/scripts/session-start.sh +0 -0
  85. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/js/htmlgraph.js +0 -0
  86. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/.htmlgraph/.session-warning-state.json +0 -0
  87. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/.htmlgraph/agents.json +0 -0
  88. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/.htmlgraph/htmlgraph.db +0 -0
  89. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/agent_detection.py +0 -0
  90. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/agent_registry.py +0 -0
  91. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/agents.py +0 -0
  92. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/analytics/__init__.py +0 -0
  93. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/analytics/cli.py +0 -0
  94. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/analytics/cost_analyzer.py +0 -0
  95. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/analytics/cost_reporter.py +0 -0
  96. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/analytics/cross_session.py +0 -0
  97. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/analytics/dependency.py +0 -0
  98. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/analytics/work_type.py +0 -0
  99. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/analytics_index.py +0 -0
  100. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/api/__init__.py +0 -0
  101. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/api/main.py +0 -0
  102. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/api/static/htmx.min.js +0 -0
  103. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/api/static/style-redesign.css +0 -0
  104. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/api/static/style.css +0 -0
  105. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/api/templates/dashboard-redesign.html +0 -0
  106. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/api/templates/dashboard.html +0 -0
  107. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/api/templates/partials/activity-feed-hierarchical.html +0 -0
  108. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/api/templates/partials/activity-feed.html +0 -0
  109. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/api/templates/partials/agents-redesign.html +0 -0
  110. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/api/templates/partials/agents.html +0 -0
  111. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/api/templates/partials/event-traces.html +0 -0
  112. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/api/templates/partials/features-kanban-redesign.html +0 -0
  113. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/api/templates/partials/features.html +0 -0
  114. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/api/templates/partials/metrics-redesign.html +0 -0
  115. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/api/templates/partials/metrics.html +0 -0
  116. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/api/templates/partials/orchestration-redesign.html +0 -0
  117. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/api/templates/partials/orchestration.html +0 -0
  118. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/api/templates/partials/spawners.html +0 -0
  119. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/archive/__init__.py +0 -0
  120. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/archive/bloom.py +0 -0
  121. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/archive/fts.py +0 -0
  122. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/archive/manager.py +0 -0
  123. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/archive/search.py +0 -0
  124. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/atomic_ops.py +0 -0
  125. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/attribute_index.py +0 -0
  126. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/builders/__init__.py +0 -0
  127. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/builders/base.py +0 -0
  128. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/builders/bug.py +0 -0
  129. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/builders/chore.py +0 -0
  130. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/builders/epic.py +0 -0
  131. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/builders/feature.py +0 -0
  132. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/builders/insight.py +0 -0
  133. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/builders/metric.py +0 -0
  134. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/builders/pattern.py +0 -0
  135. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/builders/phase.py +0 -0
  136. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/builders/spike.py +0 -0
  137. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/builders/track.py +0 -0
  138. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/cigs/__init__.py +0 -0
  139. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/cigs/autonomy.py +0 -0
  140. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/cigs/cost.py +0 -0
  141. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/cigs/messages_basic.py +0 -0
  142. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/cigs/messaging.py +0 -0
  143. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/cigs/models.py +0 -0
  144. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/cigs/pattern_storage.py +0 -0
  145. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/cigs/patterns.py +0 -0
  146. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/cigs/posttool_analyzer.py +0 -0
  147. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/cigs/reporter.py +0 -0
  148. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/cigs/tracker.py +0 -0
  149. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/cli/.htmlgraph/.session-warning-state.json +0 -0
  150. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/cli/.htmlgraph/agents.json +0 -0
  151. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/cli/.htmlgraph/htmlgraph.db +0 -0
  152. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/cli/__init__.py +0 -0
  153. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/cli/__main__.py +0 -0
  154. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/cli/base.py +0 -0
  155. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/cli/constants.py +0 -0
  156. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/cli/templates/__init__.py +0 -0
  157. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/cli/templates/cost_dashboard.py +0 -0
  158. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/cli/work/features.py +0 -0
  159. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/cli/work/orchestration.py +0 -0
  160. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/cli/work/sessions.py +0 -0
  161. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/cli/work/tracks.py +0 -0
  162. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/cli_commands/__init__.py +0 -0
  163. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/cli_commands/feature.py +0 -0
  164. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/cli_framework.py +0 -0
  165. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/collections/__init__.py +0 -0
  166. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/collections/base.py +0 -0
  167. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/collections/bug.py +0 -0
  168. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/collections/chore.py +0 -0
  169. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/collections/epic.py +0 -0
  170. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/collections/feature.py +0 -0
  171. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/collections/insight.py +0 -0
  172. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/collections/metric.py +0 -0
  173. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/collections/pattern.py +0 -0
  174. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/collections/phase.py +0 -0
  175. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/collections/session.py +0 -0
  176. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/collections/spike.py +0 -0
  177. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/collections/task_delegation.py +0 -0
  178. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/collections/todo.py +0 -0
  179. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/collections/traces.py +0 -0
  180. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/config.py +0 -0
  181. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/context_analytics.py +0 -0
  182. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/converter.py +0 -0
  183. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/cost_analysis/__init__.py +0 -0
  184. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/cost_analysis/analyzer.py +0 -0
  185. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/dashboard.html +0 -0
  186. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/dashboard.html.backup +0 -0
  187. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/dashboard.html.bak +0 -0
  188. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/dashboard.html.bak2 +0 -0
  189. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/dashboard.html.bak3 +0 -0
  190. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/db/__init__.py +0 -0
  191. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/db/queries.py +0 -0
  192. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/db/schema.py +0 -0
  193. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/dependency_models.py +0 -0
  194. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/deploy.py +0 -0
  195. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/deployment_models.py +0 -0
  196. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/docs/API_REFERENCE.md +0 -0
  197. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/docs/HTTP_API.md +0 -0
  198. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/docs/INTEGRATION_GUIDE.md +0 -0
  199. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/docs/ORCHESTRATION_PATTERNS.md +0 -0
  200. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/docs/README.md +0 -0
  201. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/docs/__init__.py +0 -0
  202. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/docs/docs_version.py +0 -0
  203. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/docs/metadata.py +0 -0
  204. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/docs/migrations.py +0 -0
  205. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/docs/template_engine.py +0 -0
  206. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/docs/templates/_sections/cli_reference.md.j2 +0 -0
  207. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/docs/templates/_sections/core_concepts.md.j2 +0 -0
  208. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/docs/templates/_sections/sdk_basics.md.j2 +0 -0
  209. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/docs/templates/base_agents.md.j2 +0 -0
  210. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/docs/templates/example_user_override.md.j2 +0 -0
  211. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/docs/version_check.py +0 -0
  212. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/edge_index.py +0 -0
  213. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/error_handler.py +0 -0
  214. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/event_log.py +0 -0
  215. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/event_migration.py +0 -0
  216. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/exceptions.py +0 -0
  217. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/extensions/gemini/GEMINI.md +0 -0
  218. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/extensions/gemini/README.md +0 -0
  219. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/extensions/gemini/gemini-extension.json +0 -0
  220. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/extensions/gemini/hooks/hooks.json +0 -0
  221. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/extensions/gemini/hooks/scripts/post-tool.sh +0 -0
  222. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/extensions/gemini/hooks/scripts/session-end.sh +0 -0
  223. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/extensions/gemini/hooks/scripts/session-start.sh +0 -0
  224. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/file_watcher.py +0 -0
  225. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/find_api.py +0 -0
  226. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/git_events.py +0 -0
  227. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/graph.py +0 -0
  228. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/hooks/.htmlgraph/.session-warning-state.json +0 -0
  229. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/hooks/.htmlgraph/agents.json +0 -0
  230. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/hooks/.htmlgraph/index.sqlite +0 -0
  231. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/hooks/__init__.py +0 -0
  232. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/hooks/bootstrap.py +0 -0
  233. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/hooks/cigs_pretool_enforcer.py +0 -0
  234. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/hooks/concurrent_sessions.py +0 -0
  235. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/hooks/context.py +0 -0
  236. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/hooks/drift_handler.py +0 -0
  237. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/hooks/event_tracker.py +0 -0
  238. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/hooks/git_commands.py +0 -0
  239. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/hooks/hooks-config.example.json +0 -0
  240. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/hooks/installer.py +0 -0
  241. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/hooks/orchestrator.py +0 -0
  242. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/hooks/orchestrator_reflector.py +0 -0
  243. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/hooks/post-checkout.sh +0 -0
  244. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/hooks/post-commit.sh +0 -0
  245. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/hooks/post-merge.sh +0 -0
  246. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/hooks/post_tool_use_failure.py +0 -0
  247. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/hooks/post_tool_use_handler.py +0 -0
  248. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/hooks/posttooluse.py +0 -0
  249. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/hooks/pre-commit.sh +0 -0
  250. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/hooks/pre-push.sh +0 -0
  251. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/hooks/pretooluse.py +0 -0
  252. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/hooks/prompt_analyzer.py +0 -0
  253. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/hooks/session_handler.py +0 -0
  254. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/hooks/session_summary.py +0 -0
  255. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/hooks/state_manager.py +0 -0
  256. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/hooks/subagent_detection.py +0 -0
  257. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/hooks/task_enforcer.py +0 -0
  258. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/hooks/task_validator.py +0 -0
  259. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/hooks/validator.py +0 -0
  260. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/ids.py +0 -0
  261. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/index.d.ts +0 -0
  262. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/learning.py +0 -0
  263. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/mcp_server.py +0 -0
  264. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/models.py +0 -0
  265. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/operations/README.md +0 -0
  266. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/operations/__init__.py +0 -0
  267. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/operations/analytics.py +0 -0
  268. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/operations/events.py +0 -0
  269. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/operations/fastapi_server.py +0 -0
  270. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/operations/hooks.py +0 -0
  271. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/operations/initialization.py +0 -0
  272. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/operations/initialization.py.backup +0 -0
  273. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/operations/server.py +0 -0
  274. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/orchestration/__init__.py +0 -0
  275. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/orchestration/claude_launcher.py +0 -0
  276. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/orchestration/command_builder.py +0 -0
  277. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/orchestration/headless_spawner.py +0 -0
  278. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/orchestration/live_events.py +0 -0
  279. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/orchestration/model_selection.py +0 -0
  280. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/orchestration/plugin_manager.py +0 -0
  281. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/orchestration/prompts.py +0 -0
  282. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/orchestration/spawners/__init__.py +0 -0
  283. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/orchestration/spawners/base.py +0 -0
  284. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/orchestration/spawners/claude.py +0 -0
  285. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/orchestration/spawners/codex.py +0 -0
  286. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/orchestration/spawners/copilot.py +0 -0
  287. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/orchestration/spawners/gemini.py +0 -0
  288. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/orchestration/subprocess_runner.py +0 -0
  289. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/orchestration/task_coordination.py +0 -0
  290. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/orchestration.md +0 -0
  291. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/orchestrator-system-prompt-optimized.txt +0 -0
  292. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/orchestrator.py +0 -0
  293. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/orchestrator_config.py +0 -0
  294. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/orchestrator_mode.py +0 -0
  295. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/orchestrator_validator.py +0 -0
  296. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/parallel.py +0 -0
  297. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/parser.py +0 -0
  298. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/planning.py +0 -0
  299. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/pydantic_models.py +0 -0
  300. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/quality_gates.py +0 -0
  301. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/query_builder.py +0 -0
  302. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/reflection.py +0 -0
  303. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/repo_hash.py +0 -0
  304. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/routing.py +0 -0
  305. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/scripts/__init__.py +0 -0
  306. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/scripts/deploy.py +0 -0
  307. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/sdk.py +0 -0
  308. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/server.py +0 -0
  309. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/services/__init__.py +0 -0
  310. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/services/claiming.py +0 -0
  311. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/session_hooks.py +0 -0
  312. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/session_manager.py +0 -0
  313. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/session_registry.py +0 -0
  314. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/session_state.py +0 -0
  315. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/session_warning.py +0 -0
  316. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/setup.py +0 -0
  317. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/spike_index.py +0 -0
  318. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/styles.css +0 -0
  319. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/sync_docs.py +0 -0
  320. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/system_prompts.py +0 -0
  321. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/templates/AGENTS.md.template +0 -0
  322. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/templates/CLAUDE.md.template +0 -0
  323. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/templates/GEMINI.md.template +0 -0
  324. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/templates/orchestration-view.html +0 -0
  325. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/track_builder.py +0 -0
  326. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/track_manager.py +0 -0
  327. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/transcript.py +0 -0
  328. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/transcript_analytics.py +0 -0
  329. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/types.py +0 -0
  330. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/validation.py +0 -0
  331. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/watch.py +0 -0
  332. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/src/python/htmlgraph/work_type_utils.py +0 -0
  333. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/benchmarks/README.md +0 -0
  334. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/benchmarks/__init__.py +0 -0
  335. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/benchmarks/bench_graph.py +0 -0
  336. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/benchmarks/conftest.py +0 -0
  337. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/hooks/__init__.py +0 -0
  338. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/hooks/test_bootstrap.py +0 -0
  339. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/hooks/test_concurrent_sessions.py +0 -0
  340. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/hooks/test_context.py +0 -0
  341. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/hooks/test_event_tracker.py +0 -0
  342. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/hooks/test_git_commands.py +0 -0
  343. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/hooks/test_hybrid_event_capture.py +0 -0
  344. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/hooks/test_prompt_analyzer.py +0 -0
  345. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/hooks/test_session_handler.py +0 -0
  346. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/hooks/test_state_manager.py +0 -0
  347. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/hooks/test_system_prompt_persistence.py +0 -0
  348. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/hooks/test_system_prompt_persistence_integration.py +0 -0
  349. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/integration/multi_agent/README.md +0 -0
  350. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/integration/multi_agent/__init__.py +0 -0
  351. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/integration/multi_agent/test_agent_quirks.py +0 -0
  352. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/integration/multi_agent/test_git_continuity_spine.py +0 -0
  353. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/integration/test_cigs_hook_flow.py +0 -0
  354. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/integration/test_cigs_integration.py +0 -0
  355. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/integration/test_cigs_learning.py +0 -0
  356. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/integration/test_codex_spawner.py +0 -0
  357. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/integration/test_complexity_assessment.py +0 -0
  358. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/integration/test_copilot_spawner_tracking.py +0 -0
  359. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/integration/test_dashboard_spawner_display.py +0 -0
  360. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/integration/test_delegation_events.py +0 -0
  361. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/integration/test_deployment_workflow.py +0 -0
  362. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/integration/test_discoverability.py +0 -0
  363. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/integration/test_edge_index_bug.py +0 -0
  364. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/integration/test_features.py +0 -0
  365. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/integration/test_gemini_spawner_diagnosis.py +0 -0
  366. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/integration/test_handoff_routing.py +0 -0
  367. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/integration/test_multi_agent_coordination.py +0 -0
  368. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/integration/test_new_features.py +0 -0
  369. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/integration/test_orchestration_tab.py +0 -0
  370. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/integration/test_orchestration_with_playwright.py +0 -0
  371. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/integration/test_orchestrator_pattern.py +0 -0
  372. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/integration/test_phase4_delegation_events.py +0 -0
  373. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/integration/test_post_compact_delegation.py +0 -0
  374. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/integration/test_real_workitem_integration.py +0 -0
  375. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/integration/test_redesigned_dashboard.py +0 -0
  376. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/integration/test_spawner_integration.py +0 -0
  377. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/integration/test_spawner_live_events.py +0 -0
  378. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/integration/test_spawner_observability_e2e.py +0 -0
  379. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/integration/test_spawner_routing_live.py +0 -0
  380. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/integration/test_spawner_tool_tracking.py +0 -0
  381. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/integration/test_task_delegation.py +0 -0
  382. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/integration/test_user_query_events.py +0 -0
  383. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/integration/test_websocket_realtime.py +0 -0
  384. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/integration/test_websocket_streaming.py +0 -0
  385. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/integration/verify_phase1_userquery.py +0 -0
  386. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/js/README.md +0 -0
  387. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/js/test_htmlgraph.html +0 -0
  388. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/manual/test-hook-input.py +0 -0
  389. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/operations/__init__.py +0 -0
  390. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/operations/test_hooks.py +0 -0
  391. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/operations/test_server.py +0 -0
  392. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/__init__.py +0 -0
  393. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/conftest.py +0 -0
  394. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_activity_feed_ui.py +0 -0
  395. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_agent_attribution.py +0 -0
  396. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_agent_detection.py +0 -0
  397. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_analytics.py +0 -0
  398. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_archive_manager.py +0 -0
  399. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_archive_search.py +0 -0
  400. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_atomic_ops.py +0 -0
  401. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_auto_spike.py +0 -0
  402. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_cigs_pretool_enforcer.py +0 -0
  403. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_claiming.py +0 -0
  404. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_cli_commands.py +0 -0
  405. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_cli_pydantic_models.py +0 -0
  406. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_cli_rich_output.py +0 -0
  407. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_collection_filter.py +0 -0
  408. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_cost_analyzer.py +0 -0
  409. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_cross_agent_attribution.py +0 -0
  410. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_cross_session_analytics.py +0 -0
  411. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_dashboard_attribution.py +0 -0
  412. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_dashboard_ui.py +0 -0
  413. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_delegation_fk_fix.py +0 -0
  414. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_delete.py +0 -0
  415. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_deploy.py +0 -0
  416. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_drift_parent_activity.py +0 -0
  417. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_drift_queue_cleanup.py +0 -0
  418. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_edge_index.py +0 -0
  419. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_error_handling.py +0 -0
  420. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_event_index.py +0 -0
  421. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_event_query.py +0 -0
  422. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_event_tracing.py +0 -0
  423. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_feature_track_linkage_phase1.py +0 -0
  424. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_find_api.py +0 -0
  425. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_git_events.py +0 -0
  426. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_graph_traversal.py +0 -0
  427. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_handoff.py +0 -0
  428. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_headless_spawner.py +0 -0
  429. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_headless_spawner_parent_session.py +0 -0
  430. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_ids.py +0 -0
  431. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_install_hooks.py +0 -0
  432. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_lifecycle.py +0 -0
  433. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_mcp_server.py +0 -0
  434. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_mcp_stdio_transport.py +0 -0
  435. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_models.py +0 -0
  436. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_orchestration.py +0 -0
  437. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_orchestrator_circuit_breaker.py +0 -0
  438. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_orchestrator_cli.py +0 -0
  439. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_orchestrator_enforce_hook.py +0 -0
  440. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_orchestrator_mode.py +0 -0
  441. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_parent_child_event_linking.py +0 -0
  442. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_parent_child_linking.py +0 -0
  443. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_parent_linking_integration.py +0 -0
  444. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_pattern_storage.py +0 -0
  445. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_plugin_update_preservation.py +0 -0
  446. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_post_tool_use_failure.py +0 -0
  447. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_post_tool_use_handler.py +0 -0
  448. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_posttooluse_cigs.py +0 -0
  449. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_pre_commit_hooks.py +0 -0
  450. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_pre_work_validation_integration.py +0 -0
  451. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_pretooluse_event_hierarchy.py +0 -0
  452. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_quality_gates.py +0 -0
  453. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_query_builder.py +0 -0
  454. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_query_cache.py +0 -0
  455. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_query_compilation.py +0 -0
  456. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_reflection.py +0 -0
  457. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_repo_hash.py +0 -0
  458. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_routing.py +0 -0
  459. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_sdk_discoverability.py +0 -0
  460. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_sdk_get_active_work_item.py +0 -0
  461. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_sdk_parent_session.py +0 -0
  462. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_sdk_sqlite_integration.py +0 -0
  463. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_session_cleanup.py +0 -0
  464. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_session_continuity.py +0 -0
  465. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_session_integration.py +0 -0
  466. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_session_registry.py +0 -0
  467. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_session_start_cigs.py +0 -0
  468. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_session_start_info_validation.py +0 -0
  469. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_session_state_manager.py +0 -0
  470. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_spawner_agents.py +0 -0
  471. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_spawner_routing.py +0 -0
  472. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_sqlite_schema.py +0 -0
  473. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_stop_cigs.py +0 -0
  474. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_system_overhead_drift.py +0 -0
  475. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_template_system.py +0 -0
  476. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_todo_collection.py +0 -0
  477. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_traces_collection.py +0 -0
  478. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_track_loading.py +0 -0
  479. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_transcript_linking.py +0 -0
  480. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_update_preserves_incoming_edges.py +0 -0
  481. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_user_prompt_submit_cigs.py +0 -0
  482. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_validate_work_hook.py +0 -0
  483. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_version_migration.py +0 -0
  484. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_violation_tracker.py +0 -0
  485. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_work_queue.py +0 -0
  486. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/python/test_work_type.py +0 -0
  487. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/test_agent_routing.py +0 -0
  488. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/test_autonomy_recommender.py +0 -0
  489. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/test_cigs_cli.py +0 -0
  490. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/test_cigs_cost_calculator.py +0 -0
  491. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/test_cigs_cost_reporter.py +0 -0
  492. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/test_cigs_imperative_messages.py +0 -0
  493. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/test_cigs_messages_basic.py +0 -0
  494. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/test_cli_output_snapshots.py +0 -0
  495. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/test_cli_sdk_parity.py +0 -0
  496. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/test_deployment_models.py +0 -0
  497. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/test_event_log.py +0 -0
  498. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/test_hybrid_event_capture.py +0 -0
  499. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/test_orchestrator_config.py +0 -0
  500. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/test_orchestrator_validator.py +0 -0
  501. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/test_pattern_detector.py +0 -0
  502. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/test_sdk_api_surface.py +0 -0
  503. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/test_sdk_operations.py +0 -0
  504. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/test_transaction_snapshot.py +0 -0
  505. {htmlgraph-0.26.21 → htmlgraph-0.26.23}/tests/test_transcript.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: htmlgraph
3
- Version: 0.26.21
3
+ Version: 0.26.23
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
@@ -0,0 +1,500 @@
1
+ """Comprehensive examples demonstrating the retry decorator with exponential backoff.
2
+
3
+ This file showcases various use cases and patterns for the @retry decorator,
4
+ including basic usage, custom parameters, and integration with real-world scenarios.
5
+
6
+ Run with: uv run python examples/retry_decorator_examples.py
7
+ """
8
+
9
+ import asyncio
10
+ import logging
11
+ import time
12
+ from typing import Any
13
+
14
+ from htmlgraph import retry, retry_async
15
+
16
+ # Configure logging to see retry messages
17
+ logging.basicConfig(
18
+ level=logging.DEBUG,
19
+ format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
20
+ )
21
+ logger = logging.getLogger(__name__)
22
+
23
+
24
+ # ============================================================================
25
+ # Example 1: Basic API Call with Default Retry Logic
26
+ # ============================================================================
27
+
28
+
29
+ @retry()
30
+ def fetch_from_api() -> dict[str, Any]:
31
+ """Fetch data from an API with default retry parameters.
32
+
33
+ Uses default retry behavior:
34
+ - 3 maximum attempts
35
+ - 1 second initial delay
36
+ - 2x exponential backoff
37
+ - Jitter enabled (prevents thundering herd)
38
+ - Retries on any Exception
39
+ """
40
+ logger.info("Attempting API call...")
41
+ # Simulate occasional API failures
42
+ if time.time() % 3 < 1:
43
+ raise ConnectionError("API temporarily unavailable")
44
+ return {"status": "success", "data": ["item1", "item2"]}
45
+
46
+
47
+ # ============================================================================
48
+ # Example 2: Database Connection with Specific Exception Handling
49
+ # ============================================================================
50
+
51
+
52
+ class DatabaseConnectionError(Exception):
53
+ """Raised when database connection fails."""
54
+
55
+ pass
56
+
57
+
58
+ @retry(
59
+ max_attempts=5,
60
+ initial_delay=0.5,
61
+ exceptions=(DatabaseConnectionError, TimeoutError),
62
+ )
63
+ def connect_to_database(db_url: str) -> str:
64
+ """Connect to database with retry only on connection errors.
65
+
66
+ This approach:
67
+ - Retries only on DatabaseConnectionError and TimeoutError
68
+ - Fails immediately on other exceptions (e.g., auth errors)
69
+ - Attempts connection up to 5 times
70
+ - Initial delay is 0.5 seconds, growing exponentially
71
+
72
+ Args:
73
+ db_url: Database connection URL
74
+
75
+ Returns:
76
+ Connection string on success
77
+
78
+ Raises:
79
+ RetryError: If all 5 attempts fail
80
+ Other exceptions: (e.g., auth errors) propagate immediately
81
+ """
82
+ logger.info(f"Attempting database connection to {db_url}...")
83
+ import random
84
+
85
+ if random.random() < 0.4: # 40% failure rate
86
+ raise DatabaseConnectionError("Connection refused")
87
+ return f"Connected to {db_url}"
88
+
89
+
90
+ # ============================================================================
91
+ # Example 3: File Operations with Custom Backoff Parameters
92
+ # ============================================================================
93
+
94
+
95
+ @retry(
96
+ max_attempts=3,
97
+ initial_delay=0.1,
98
+ max_delay=2.0,
99
+ exponential_base=1.5,
100
+ jitter=True,
101
+ )
102
+ def read_file_with_lock(filepath: str) -> str:
103
+ """Read file, retrying if locked by another process.
104
+
105
+ Backoff progression with exponential_base=1.5:
106
+ - 1st retry: 0.1s delay
107
+ - 2nd retry: 0.15s delay
108
+ - 3rd retry: 0.225s delay
109
+
110
+ Args:
111
+ filepath: Path to file to read
112
+
113
+ Returns:
114
+ File contents on success
115
+ """
116
+ logger.info(f"Reading file: {filepath}...")
117
+ # Simulate file lock scenario
118
+ if time.time() % 2 < 0.5:
119
+ raise OSError("File is locked")
120
+ try:
121
+ with open(filepath) as f:
122
+ return f.read()
123
+ except FileNotFoundError:
124
+ # Don't retry on file not found (application error)
125
+ raise
126
+
127
+
128
+ # ============================================================================
129
+ # Example 4: Custom Retry Callback for Detailed Logging
130
+ # ============================================================================
131
+
132
+
133
+ def log_retry_attempt(attempt: int, exc: Exception, delay: float) -> None:
134
+ """Custom callback for detailed retry logging.
135
+
136
+ Args:
137
+ attempt: Attempt number (1-based)
138
+ exc: Exception that triggered the retry
139
+ delay: Delay in seconds before next attempt
140
+ """
141
+ logger.warning(
142
+ f"Retry #{attempt} after {delay:.2f}s | Error: {type(exc).__name__}: {exc}"
143
+ )
144
+
145
+
146
+ @retry(
147
+ max_attempts=4,
148
+ initial_delay=0.5,
149
+ on_retry=log_retry_attempt,
150
+ exceptions=(ConnectionError, TimeoutError),
151
+ )
152
+ def fetch_with_detailed_logging(url: str) -> dict[str, Any]:
153
+ """Fetch data with detailed retry logging.
154
+
155
+ The on_retry callback receives:
156
+ - Attempt number (for counting)
157
+ - Exception details (for diagnosis)
158
+ - Calculated delay (for transparency)
159
+
160
+ Args:
161
+ url: URL to fetch from
162
+
163
+ Returns:
164
+ Response data on success
165
+ """
166
+ logger.info(f"Fetching from {url}...")
167
+ import random
168
+
169
+ if random.random() < 0.6:
170
+ raise ConnectionError(f"Cannot reach {url}")
171
+ return {"success": True}
172
+
173
+
174
+ # ============================================================================
175
+ # Example 5: Class Method with Retry
176
+ # ============================================================================
177
+
178
+
179
+ class APIClient:
180
+ """HTTP client with automatic retry logic for resilience."""
181
+
182
+ def __init__(self, base_url: str):
183
+ self.base_url = base_url
184
+ self.request_count = 0
185
+
186
+ @retry(
187
+ max_attempts=3,
188
+ initial_delay=0.2,
189
+ exceptions=(ConnectionError, TimeoutError),
190
+ )
191
+ def get(self, endpoint: str) -> dict[str, Any]:
192
+ """GET request with automatic retries.
193
+
194
+ Args:
195
+ endpoint: API endpoint path
196
+
197
+ Returns:
198
+ Response data
199
+
200
+ Raises:
201
+ RetryError: If all 3 attempts fail
202
+ """
203
+ self.request_count += 1
204
+ url = f"{self.base_url}/{endpoint}"
205
+ logger.info(f"GET {url} (attempt #{self.request_count})")
206
+
207
+ import random
208
+
209
+ if random.random() < 0.5:
210
+ raise ConnectionError(f"Connection failed to {url}")
211
+
212
+ return {"endpoint": endpoint, "data": "response"}
213
+
214
+
215
+ # ============================================================================
216
+ # Example 6: Async Function with Retry
217
+ # ============================================================================
218
+
219
+
220
+ @retry_async(
221
+ max_attempts=3,
222
+ initial_delay=0.1,
223
+ max_delay=1.0,
224
+ exceptions=(asyncio.TimeoutError, ConnectionError),
225
+ )
226
+ async def async_fetch_data(url: str) -> dict[str, Any]:
227
+ """Async function with retry (non-blocking).
228
+
229
+ Uses asyncio.sleep instead of time.sleep, making it suitable for
230
+ concurrent operations and event loop integration.
231
+
232
+ Args:
233
+ url: URL to fetch from
234
+
235
+ Returns:
236
+ Response data on success
237
+
238
+ Raises:
239
+ RetryError: If all attempts fail
240
+ """
241
+ logger.info(f"Async fetch from {url}...")
242
+ await asyncio.sleep(0.1) # Simulate async operation
243
+
244
+ import random
245
+
246
+ if random.random() < 0.4:
247
+ raise ConnectionError(f"Cannot reach {url}")
248
+
249
+ return {"url": url, "data": "async_response"}
250
+
251
+
252
+ # ============================================================================
253
+ # Example 7: Multiple Async Operations with Retry
254
+ # ============================================================================
255
+
256
+
257
+ async def parallel_async_operations() -> list[dict[str, Any] | BaseException]:
258
+ """Execute multiple async operations with retry in parallel.
259
+
260
+ Demonstrates how retry_async integrates with asyncio.gather
261
+ for concurrent operations.
262
+
263
+ Returns:
264
+ List of responses from all operations
265
+ """
266
+ tasks = [
267
+ async_fetch_data("https://api1.example.com"),
268
+ async_fetch_data("https://api2.example.com"),
269
+ async_fetch_data("https://api3.example.com"),
270
+ ]
271
+ results = await asyncio.gather(*tasks, return_exceptions=True)
272
+ return results
273
+
274
+
275
+ # ============================================================================
276
+ # Example 8: Aggressive Retry for Critical Operations
277
+ # ============================================================================
278
+
279
+
280
+ @retry(
281
+ max_attempts=10,
282
+ initial_delay=0.05,
283
+ max_delay=30.0,
284
+ exponential_base=2.0,
285
+ jitter=True,
286
+ )
287
+ def critical_operation() -> str:
288
+ """Critical operation with aggressive retry strategy.
289
+
290
+ This uses:
291
+ - 10 attempts (many opportunities to succeed)
292
+ - 0.05s initial delay (fail fast initially)
293
+ - Exponential backoff caps at 30s (reasonable upper bound)
294
+ - Jitter to spread retries in distributed systems
295
+
296
+ Backoff sequence: 0.05s, 0.1s, 0.2s, 0.4s, 0.8s, 1.6s, 3.2s, 6.4s, 12.8s, 30s
297
+
298
+ Returns:
299
+ Result on success
300
+ """
301
+ logger.info("Executing critical operation...")
302
+ import random
303
+
304
+ if random.random() < 0.7: # High initial failure rate
305
+ raise RuntimeError("Critical operation failed")
306
+ return "Critical operation succeeded"
307
+
308
+
309
+ # ============================================================================
310
+ # Example 9: No Jitter for Predictable Testing
311
+ # ============================================================================
312
+
313
+
314
+ @retry(
315
+ max_attempts=3,
316
+ initial_delay=0.1,
317
+ exponential_base=2.0,
318
+ jitter=False, # Deterministic delays for testing
319
+ )
320
+ def predictable_retry() -> str:
321
+ """Function with deterministic retry timing (no jitter).
322
+
323
+ Without jitter, delays are exactly:
324
+ - 1st retry: 0.1s
325
+ - 2nd retry: 0.2s
326
+ - 3rd retry: 0.4s
327
+
328
+ Useful for testing and benchmarking where predictability matters.
329
+
330
+ Returns:
331
+ Result on success
332
+ """
333
+ logger.info("Running with predictable retry timing...")
334
+ import random
335
+
336
+ if random.random() < 0.6:
337
+ raise ValueError("Predictable test error")
338
+ return "Success with predictable timing"
339
+
340
+
341
+ # ============================================================================
342
+ # Example 10: Combining Multiple Decorators
343
+ # ============================================================================
344
+
345
+
346
+ def cache_decorator(
347
+ func: Any,
348
+ ) -> Any:
349
+ """Simple cache decorator for demonstration."""
350
+ cache: dict[tuple[Any, ...], Any] = {}
351
+
352
+ def wrapper(*args: Any, **kwargs: Any) -> Any:
353
+ key = (args, tuple(sorted(kwargs.items())))
354
+ if key not in cache:
355
+ cache[key] = func(*args, **kwargs)
356
+ return cache[key]
357
+
358
+ return wrapper
359
+
360
+
361
+ @cache_decorator
362
+ @retry(max_attempts=3, initial_delay=0.1)
363
+ def cached_api_call(user_id: int) -> dict[str, Any]:
364
+ """API call with both retry and caching.
365
+
366
+ Decorator order matters:
367
+ - @cache_decorator (outer): Return cached result if available
368
+ - @retry (inner): Retry network calls (called by cache_decorator)
369
+
370
+ Args:
371
+ user_id: User ID to fetch
372
+
373
+ Returns:
374
+ User data
375
+ """
376
+ logger.info(f"Fetching user {user_id}...")
377
+ import random
378
+
379
+ if random.random() < 0.4:
380
+ raise ConnectionError("API connection failed")
381
+ return {"id": user_id, "name": f"User {user_id}"}
382
+
383
+
384
+ # ============================================================================
385
+ # Main Demo
386
+ # ============================================================================
387
+
388
+
389
+ def main() -> None:
390
+ """Run all examples to demonstrate retry decorator usage."""
391
+ logger.info("=" * 70)
392
+ logger.info("RETRY DECORATOR EXAMPLES")
393
+ logger.info("=" * 70)
394
+
395
+ # Example 1: Basic API call
396
+ logger.info("\n1. Basic API call with default retry:")
397
+ try:
398
+ result = fetch_from_api()
399
+ logger.info(f" Result: {result}")
400
+ except Exception as e:
401
+ logger.error(f" Failed: {e}")
402
+
403
+ # Example 2: Database with specific exceptions
404
+ logger.info("\n2. Database connection with exception filtering:")
405
+ try:
406
+ result = connect_to_database("postgresql://localhost/mydb")
407
+ logger.info(f" Result: {result}")
408
+ except Exception as e:
409
+ logger.error(f" Failed: {e}")
410
+
411
+ # Example 3: File operations with custom backoff
412
+ logger.info("\n3. File read with custom backoff parameters:")
413
+ try:
414
+ # Create a test file
415
+ test_file = "/tmp/test_retry_example.txt"
416
+ with open(test_file, "w") as f:
417
+ f.write("Test content")
418
+
419
+ result = read_file_with_lock(test_file)
420
+ logger.info(f" File read successfully (length: {len(result)} chars)")
421
+ except Exception as e:
422
+ logger.error(f" Failed: {e}")
423
+
424
+ # Example 4: Custom logging callback
425
+ logger.info("\n4. API fetch with detailed retry logging:")
426
+ try:
427
+ result = fetch_with_detailed_logging("https://api.example.com")
428
+ logger.info(f" Result: {result}")
429
+ except Exception as e:
430
+ logger.error(f" Failed: {e}")
431
+
432
+ # Example 5: Class method retry
433
+ logger.info("\n5. HTTP client class with retry on methods:")
434
+ try:
435
+ client = APIClient("https://api.example.com")
436
+ result = client.get("users")
437
+ logger.info(f" Result: {result}")
438
+ except Exception as e:
439
+ logger.error(f" Failed: {e}")
440
+
441
+ # Example 6: Async function
442
+ logger.info("\n6. Async function with retry:")
443
+
444
+ async def run_async_example() -> None:
445
+ try:
446
+ result = await async_fetch_data("https://async-api.example.com")
447
+ logger.info(f" Async Result: {result}")
448
+ except Exception as e:
449
+ logger.error(f" Async Failed: {e}")
450
+
451
+ asyncio.run(run_async_example())
452
+
453
+ # Example 7: Parallel async operations
454
+ logger.info("\n7. Parallel async operations with retry:")
455
+
456
+ async def run_parallel_example() -> None:
457
+ try:
458
+ results = await parallel_async_operations()
459
+ logger.info(f" Parallel Results: {len(results)} operations completed")
460
+ except Exception as e:
461
+ logger.error(f" Parallel Failed: {e}")
462
+
463
+ asyncio.run(run_parallel_example())
464
+
465
+ # Example 8: Aggressive retry
466
+ logger.info("\n8. Critical operation with aggressive retry:")
467
+ try:
468
+ result = critical_operation()
469
+ logger.info(f" Result: {result}")
470
+ except Exception as e:
471
+ logger.error(f" Failed: {e}")
472
+
473
+ # Example 9: Predictable timing
474
+ logger.info("\n9. Function with predictable retry timing:")
475
+ try:
476
+ result = predictable_retry()
477
+ logger.info(f" Result: {result}")
478
+ except Exception as e:
479
+ logger.error(f" Failed: {e}")
480
+
481
+ # Example 10: Cached API call
482
+ logger.info("\n10. Cached API call (retry + caching):")
483
+ try:
484
+ # First call - goes to API with retry
485
+ result1 = cached_api_call(123)
486
+ logger.info(f" First call: {result1}")
487
+
488
+ # Second call - returns from cache
489
+ result2 = cached_api_call(123)
490
+ logger.info(f" Second call (cached): {result2}")
491
+ except Exception as e:
492
+ logger.error(f" Failed: {e}")
493
+
494
+ logger.info("\n" + "=" * 70)
495
+ logger.info("EXAMPLES COMPLETE")
496
+ logger.info("=" * 70)
497
+
498
+
499
+ if __name__ == "__main__":
500
+ main()
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "htmlgraph",
3
- "version": "0.26.21",
3
+ "version": "0.26.23",
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.21"
3
+ version = "0.26.23"
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"
@@ -19,6 +19,7 @@ from htmlgraph.atomic_ops import (
19
19
  from htmlgraph.builders import BaseBuilder, FeatureBuilder, SpikeBuilder
20
20
  from htmlgraph.collections import BaseCollection, FeatureCollection, SpikeCollection
21
21
  from htmlgraph.context_analytics import ContextAnalytics, ContextUsage
22
+ from htmlgraph.decorators import RetryError, retry, retry_async
22
23
  from htmlgraph.edge_index import EdgeIndex, EdgeRef
23
24
  from htmlgraph.exceptions import (
24
25
  ClaimConflictError,
@@ -95,7 +96,7 @@ from htmlgraph.types import (
95
96
  )
96
97
  from htmlgraph.work_type_utils import infer_work_type, infer_work_type_from_id
97
98
 
98
- __version__ = "0.26.21"
99
+ __version__ = "0.26.23"
99
100
  __all__ = [
100
101
  # Exceptions
101
102
  "HtmlGraphError",
@@ -103,6 +104,10 @@ __all__ = [
103
104
  "SessionNotFoundError",
104
105
  "ClaimConflictError",
105
106
  "ValidationError",
107
+ "RetryError",
108
+ # Decorators
109
+ "retry",
110
+ "retry_async",
106
111
  # Core models
107
112
  "Node",
108
113
  "Edge",