svc-infra 0.1.625__tar.gz → 0.1.627__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.

Potentially problematic release.


This version of svc-infra might be problematic. Click here for more details.

Files changed (330) hide show
  1. {svc_infra-0.1.625 → svc_infra-0.1.627}/PKG-INFO +1 -1
  2. {svc_infra-0.1.625 → svc_infra-0.1.627}/pyproject.toml +1 -1
  3. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/cli/cmds/docs/docs_cmds.py +7 -56
  4. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/cli/cmds/help.py +2 -2
  5. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/jobs/queue.py +9 -1
  6. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/mcp/svc_infra_mcp.py +14 -18
  7. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/webhooks/service.py +10 -2
  8. {svc_infra-0.1.625 → svc_infra-0.1.627}/README.md +0 -0
  9. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/__init__.py +0 -0
  10. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/apf_payments/README.md +0 -0
  11. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/apf_payments/__init__.py +0 -0
  12. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/apf_payments/alembic.py +0 -0
  13. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/apf_payments/models.py +0 -0
  14. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/apf_payments/provider/__init__.py +0 -0
  15. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/apf_payments/provider/aiydan.py +0 -0
  16. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/apf_payments/provider/base.py +0 -0
  17. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/apf_payments/provider/registry.py +0 -0
  18. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/apf_payments/provider/stripe.py +0 -0
  19. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/apf_payments/schemas.py +0 -0
  20. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/apf_payments/service.py +0 -0
  21. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/apf_payments/settings.py +0 -0
  22. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/__init__.py +0 -0
  23. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/__init__.py +0 -0
  24. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/apf_payments/__init__.py +0 -0
  25. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/apf_payments/router.py +0 -0
  26. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/apf_payments/setup.py +0 -0
  27. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/auth/__init__.py +0 -0
  28. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/auth/_cookies.py +0 -0
  29. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/auth/add.py +0 -0
  30. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/auth/gaurd.py +0 -0
  31. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/auth/mfa/__init__.py +0 -0
  32. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/auth/mfa/models.py +0 -0
  33. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/auth/mfa/pre_auth.py +0 -0
  34. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/auth/mfa/router.py +0 -0
  35. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/auth/mfa/security.py +0 -0
  36. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/auth/mfa/utils.py +0 -0
  37. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/auth/mfa/verify.py +0 -0
  38. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/auth/policy.py +0 -0
  39. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/auth/providers.py +0 -0
  40. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/auth/routers/__init__.py +0 -0
  41. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/auth/routers/account.py +0 -0
  42. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/auth/routers/apikey_router.py +0 -0
  43. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/auth/routers/oauth_router.py +0 -0
  44. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/auth/routers/session_router.py +0 -0
  45. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/auth/security.py +0 -0
  46. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/auth/sender.py +0 -0
  47. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/auth/settings.py +0 -0
  48. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/auth/state.py +0 -0
  49. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/cache/__init__.py +0 -0
  50. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/cache/add.py +0 -0
  51. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/db/__init__.py +0 -0
  52. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/db/http.py +0 -0
  53. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/db/nosql/__init__.py +0 -0
  54. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/db/nosql/mongo/__init__.py +0 -0
  55. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/db/nosql/mongo/add.py +0 -0
  56. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/db/nosql/mongo/crud_router.py +0 -0
  57. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/db/nosql/mongo/health.py +0 -0
  58. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/db/sql/README.md +0 -0
  59. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/db/sql/__init__.py +0 -0
  60. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/db/sql/add.py +0 -0
  61. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/db/sql/crud_router.py +0 -0
  62. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/db/sql/health.py +0 -0
  63. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/db/sql/session.py +0 -0
  64. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/db/sql/users.py +0 -0
  65. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/dependencies/ratelimit.py +0 -0
  66. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/docs/__init__.py +0 -0
  67. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/docs/add.py +0 -0
  68. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/docs/landing.py +0 -0
  69. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/docs/scoped.py +0 -0
  70. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/dual/__init__.py +0 -0
  71. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/dual/dualize.py +0 -0
  72. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/dual/protected.py +0 -0
  73. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/dual/public.py +0 -0
  74. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/dual/router.py +0 -0
  75. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/dual/utils.py +0 -0
  76. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/dx.py +0 -0
  77. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/ease.py +0 -0
  78. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/http/__init__.py +0 -0
  79. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/http/concurrency.py +0 -0
  80. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/http/conditional.py +0 -0
  81. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/http/deprecation.py +0 -0
  82. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/middleware/__init__.py +0 -0
  83. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/middleware/debug.py +0 -0
  84. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/middleware/errors/__init__.py +0 -0
  85. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/middleware/errors/catchall.py +0 -0
  86. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/middleware/errors/exceptions.py +0 -0
  87. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/middleware/errors/handlers.py +0 -0
  88. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/middleware/idempotency.py +0 -0
  89. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/middleware/idempotency_store.py +0 -0
  90. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/middleware/optimistic_lock.py +0 -0
  91. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/middleware/ratelimit.py +0 -0
  92. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/middleware/ratelimit_store.py +0 -0
  93. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/middleware/request_id.py +0 -0
  94. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/middleware/request_size_limit.py +0 -0
  95. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/openapi/__init__.py +0 -0
  96. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/openapi/apply.py +0 -0
  97. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/openapi/conventions.py +0 -0
  98. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/openapi/models.py +0 -0
  99. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/openapi/mutators.py +0 -0
  100. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/openapi/pipeline.py +0 -0
  101. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/openapi/responses.py +0 -0
  102. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/openapi/security.py +0 -0
  103. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/ops/add.py +0 -0
  104. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/pagination.py +0 -0
  105. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/paths/__init__.py +0 -0
  106. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/paths/auth.py +0 -0
  107. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/paths/generic.py +0 -0
  108. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/paths/prefix.py +0 -0
  109. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/paths/user.py +0 -0
  110. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/routers/__init__.py +0 -0
  111. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/routers/ping.py +0 -0
  112. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/setup.py +0 -0
  113. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/tenancy/add.py +0 -0
  114. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/api/fastapi/tenancy/context.py +0 -0
  115. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/app/README.md +0 -0
  116. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/app/__init__.py +0 -0
  117. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/app/env.py +0 -0
  118. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/app/logging/__init__.py +0 -0
  119. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/app/logging/add.py +0 -0
  120. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/app/logging/filter.py +0 -0
  121. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/app/logging/formats.py +0 -0
  122. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/app/root.py +0 -0
  123. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/billing/__init__.py +0 -0
  124. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/billing/models.py +0 -0
  125. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/billing/service.py +0 -0
  126. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/bundled_docs/README.md +0 -0
  127. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/bundled_docs/__init__.py +0 -0
  128. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/bundled_docs/getting-started.md +0 -0
  129. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/cache/README.md +0 -0
  130. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/cache/__init__.py +0 -0
  131. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/cache/backend.py +0 -0
  132. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/cache/decorators.py +0 -0
  133. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/cache/demo.py +0 -0
  134. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/cache/keys.py +0 -0
  135. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/cache/recache.py +0 -0
  136. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/cache/resources.py +0 -0
  137. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/cache/tags.py +0 -0
  138. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/cache/ttl.py +0 -0
  139. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/cache/utils.py +0 -0
  140. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/cli/__init__.py +0 -0
  141. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/cli/__main__.py +0 -0
  142. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/cli/cmds/__init__.py +0 -0
  143. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/cli/cmds/db/__init__.py +0 -0
  144. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/cli/cmds/db/nosql/__init__.py +0 -0
  145. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/cli/cmds/db/nosql/mongo/README.md +0 -0
  146. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/cli/cmds/db/nosql/mongo/__init__.py +0 -0
  147. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/cli/cmds/db/nosql/mongo/mongo_cmds.py +0 -0
  148. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/cli/cmds/db/nosql/mongo/mongo_scaffold_cmds.py +0 -0
  149. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/cli/cmds/db/sql/__init__.py +0 -0
  150. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/cli/cmds/db/sql/alembic_cmds.py +0 -0
  151. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/cli/cmds/db/sql/sql_export_cmds.py +0 -0
  152. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/cli/cmds/db/sql/sql_scaffold_cmds.py +0 -0
  153. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/cli/cmds/dx/__init__.py +0 -0
  154. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/cli/cmds/dx/dx_cmds.py +0 -0
  155. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/cli/cmds/jobs/__init__.py +0 -0
  156. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/cli/cmds/jobs/jobs_cmds.py +0 -0
  157. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/cli/cmds/obs/__init__.py +0 -0
  158. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/cli/cmds/obs/obs_cmds.py +0 -0
  159. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/cli/cmds/sdk/__init__.py +0 -0
  160. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/cli/cmds/sdk/sdk_cmds.py +0 -0
  161. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/cli/foundation/__init__.py +0 -0
  162. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/cli/foundation/runner.py +0 -0
  163. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/cli/foundation/typer_bootstrap.py +0 -0
  164. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/data/add.py +0 -0
  165. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/data/backup.py +0 -0
  166. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/data/erasure.py +0 -0
  167. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/data/fixtures.py +0 -0
  168. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/data/retention.py +0 -0
  169. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/__init__.py +0 -0
  170. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/crud_schema.py +0 -0
  171. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/inbox.py +0 -0
  172. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/nosql/__init__.py +0 -0
  173. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/nosql/base.py +0 -0
  174. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/nosql/constants.py +0 -0
  175. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/nosql/core.py +0 -0
  176. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/nosql/indexes.py +0 -0
  177. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/nosql/management.py +0 -0
  178. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/nosql/mongo/README.md +0 -0
  179. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/nosql/mongo/__init__.py +0 -0
  180. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/nosql/mongo/client.py +0 -0
  181. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/nosql/mongo/settings.py +0 -0
  182. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/nosql/mongo/templates/__init__.py +0 -0
  183. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/nosql/mongo/templates/documents.py.tmpl +0 -0
  184. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/nosql/mongo/templates/resources.py.tmpl +0 -0
  185. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/nosql/mongo/templates/schemas.py.tmpl +0 -0
  186. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/nosql/repository.py +0 -0
  187. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/nosql/resource.py +0 -0
  188. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/nosql/scaffold.py +0 -0
  189. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/nosql/service.py +0 -0
  190. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/nosql/service_with_hooks.py +0 -0
  191. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/nosql/types.py +0 -0
  192. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/nosql/utils.py +0 -0
  193. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/outbox.py +0 -0
  194. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/sql/README.md +0 -0
  195. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/sql/__init__.py +0 -0
  196. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/sql/apikey.py +0 -0
  197. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/sql/authref.py +0 -0
  198. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/sql/base.py +0 -0
  199. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/sql/constants.py +0 -0
  200. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/sql/core.py +0 -0
  201. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/sql/management.py +0 -0
  202. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/sql/repository.py +0 -0
  203. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/sql/resource.py +0 -0
  204. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/sql/scaffold.py +0 -0
  205. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/sql/service.py +0 -0
  206. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/sql/service_with_hooks.py +0 -0
  207. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/sql/templates/__init__.py +0 -0
  208. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/sql/templates/models_schemas/__init__.py +0 -0
  209. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/sql/templates/models_schemas/auth/models.py.tmpl +0 -0
  210. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/sql/templates/models_schemas/auth/schemas.py.tmpl +0 -0
  211. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/sql/templates/models_schemas/entity/models.py.tmpl +0 -0
  212. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/sql/templates/models_schemas/entity/schemas.py.tmpl +0 -0
  213. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/sql/templates/setup/__init__.py +0 -0
  214. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/sql/templates/setup/alembic.ini.tmpl +0 -0
  215. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/sql/templates/setup/env_async.py.tmpl +0 -0
  216. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/sql/templates/setup/env_sync.py.tmpl +0 -0
  217. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/sql/templates/setup/script.py.mako.tmpl +0 -0
  218. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/sql/tenant.py +0 -0
  219. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/sql/types.py +0 -0
  220. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/sql/uniq.py +0 -0
  221. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/sql/uniq_hooks.py +0 -0
  222. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/sql/utils.py +0 -0
  223. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/sql/versioning.py +0 -0
  224. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/db/utils.py +0 -0
  225. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/docs/acceptance-matrix.md +0 -0
  226. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/docs/acceptance.md +0 -0
  227. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/docs/adr/0002-background-jobs-and-scheduling.md +0 -0
  228. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/docs/adr/0003-webhooks-framework.md +0 -0
  229. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/docs/adr/0004-tenancy-model.md +0 -0
  230. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/docs/adr/0005-data-lifecycle.md +0 -0
  231. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/docs/adr/0006-ops-slos-and-metrics.md +0 -0
  232. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/docs/adr/0007-docs-and-sdks.md +0 -0
  233. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/docs/adr/0008-billing-primitives.md +0 -0
  234. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/docs/adr/0009-acceptance-harness.md +0 -0
  235. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/docs/api.md +0 -0
  236. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/docs/auth.md +0 -0
  237. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/docs/cache.md +0 -0
  238. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/docs/cli.md +0 -0
  239. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/docs/contributing.md +0 -0
  240. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/docs/data-lifecycle.md +0 -0
  241. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/docs/database.md +0 -0
  242. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/docs/docs-and-sdks.md +0 -0
  243. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/docs/environment.md +0 -0
  244. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/docs/getting-started.md +0 -0
  245. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/docs/idempotency.md +0 -0
  246. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/docs/jobs.md +0 -0
  247. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/docs/observability.md +0 -0
  248. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/docs/ops.md +0 -0
  249. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/docs/rate-limiting.md +0 -0
  250. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/docs/repo-review.md +0 -0
  251. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/docs/security.md +0 -0
  252. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/docs/tenancy.md +0 -0
  253. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/docs/webhooks.md +0 -0
  254. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/dx/add.py +0 -0
  255. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/dx/changelog.py +0 -0
  256. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/dx/checks.py +0 -0
  257. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/jobs/builtins/outbox_processor.py +0 -0
  258. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/jobs/builtins/webhook_delivery.py +0 -0
  259. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/jobs/easy.py +0 -0
  260. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/jobs/loader.py +0 -0
  261. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/jobs/redis_queue.py +0 -0
  262. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/jobs/scheduler.py +0 -0
  263. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/jobs/worker.py +0 -0
  264. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/mcp/__init__.py +0 -0
  265. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/obs/README.md +0 -0
  266. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/obs/__init__.py +0 -0
  267. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/obs/add.py +0 -0
  268. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/obs/cloud_dash.py +0 -0
  269. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/obs/grafana/dashboards/http-overview.json +0 -0
  270. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/obs/metrics/__init__.py +0 -0
  271. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/obs/metrics/asgi.py +0 -0
  272. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/obs/metrics/base.py +0 -0
  273. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/obs/metrics/http.py +0 -0
  274. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/obs/metrics/sqlalchemy.py +0 -0
  275. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/obs/metrics.py +0 -0
  276. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/obs/providers/__init__.py +0 -0
  277. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/obs/providers/compose_cloud/__init__.py +0 -0
  278. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/obs/providers/compose_cloud/templates/__init__.py +0 -0
  279. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/obs/providers/compose_cloud/templates/agent.yaml.tmpl +0 -0
  280. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/obs/providers/compose_cloud/templates/docker-compose.cloud.yml.tmpl +0 -0
  281. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/obs/providers/grafana/__init__.py +0 -0
  282. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/obs/providers/grafana/dashboards/00_overview.json +0 -0
  283. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/obs/providers/grafana/dashboards/10_http.json +0 -0
  284. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/obs/providers/grafana/dashboards/20_db.json +0 -0
  285. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/obs/providers/grafana/dashboards/30_runtime.json +0 -0
  286. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/obs/providers/grafana/dashboards/40_clients.json +0 -0
  287. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/obs/providers/grafana/dashboards/__init__.py +0 -0
  288. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/obs/providers/grafana/templates/__init__.py +0 -0
  289. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/obs/providers/grafana/templates/docker-compose.yml.tmpl +0 -0
  290. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/obs/providers/grafana/templates/prometheus.yml.tmpl +0 -0
  291. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/obs/providers/grafana/templates/provisioning/__init__.py +0 -0
  292. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/obs/providers/grafana/templates/provisioning/dashboards.yml +0 -0
  293. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/obs/providers/grafana/templates/provisioning/datasource.yml +0 -0
  294. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/obs/settings.py +0 -0
  295. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/obs/templates/grafana_dashboard.json +0 -0
  296. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/obs/templates/prometheus_rules.yml +0 -0
  297. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/obs/templates/sidecars/__init__.py +0 -0
  298. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/obs/templates/sidecars/compose/__init__.py +0 -0
  299. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/obs/templates/sidecars/compose/agent.yaml +0 -0
  300. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/obs/templates/sidecars/compose/docker-compose.yml +0 -0
  301. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/obs/templates/sidecars/fly/__init__.py +0 -0
  302. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/obs/templates/sidecars/fly/agent.yaml +0 -0
  303. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/obs/templates/sidecars/fly/fly.toml.fragment +0 -0
  304. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/obs/templates/sidecars/k8s/__init__.py +0 -0
  305. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/obs/templates/sidecars/k8s/configmap.yaml +0 -0
  306. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/obs/templates/sidecars/k8s/deployment.yaml +0 -0
  307. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/obs/templates/sidecars/railway/Dockerfile +0 -0
  308. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/obs/templates/sidecars/railway/README.md +0 -0
  309. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/obs/templates/sidecars/railway/__init__.py +0 -0
  310. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/obs/templates/sidecars/railway/agent.yaml +0 -0
  311. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/py.typed +0 -0
  312. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/security/add.py +0 -0
  313. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/security/audit.py +0 -0
  314. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/security/audit_service.py +0 -0
  315. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/security/headers.py +0 -0
  316. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/security/hibp.py +0 -0
  317. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/security/jwt_rotation.py +0 -0
  318. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/security/lockout.py +0 -0
  319. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/security/models.py +0 -0
  320. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/security/org_invites.py +0 -0
  321. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/security/passwords.py +0 -0
  322. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/security/permissions.py +0 -0
  323. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/security/session.py +0 -0
  324. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/security/signed_cookies.py +0 -0
  325. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/utils.py +0 -0
  326. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/webhooks/__init__.py +0 -0
  327. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/webhooks/add.py +0 -0
  328. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/webhooks/fastapi.py +0 -0
  329. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/webhooks/router.py +0 -0
  330. {svc_infra-0.1.625 → svc_infra-0.1.627}/src/svc_infra/webhooks/signing.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: svc-infra
3
- Version: 0.1.625
3
+ Version: 0.1.627
4
4
  Summary: Infrastructure for building and deploying prod-ready services
5
5
  License: MIT
6
6
  Keywords: fastapi,sqlalchemy,alembic,auth,infra,async,pydantic
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "svc-infra"
3
- version = "0.1.625"
3
+ version = "0.1.627"
4
4
  description = "Infrastructure for building and deploying prod-ready services"
5
5
  authors = ["Ali Khatami <aliikhatami94@gmail.com>"]
6
6
  license = "MIT"
@@ -51,29 +51,17 @@ def _discover_pkg_topics() -> Dict[str, Path]:
51
51
  def _resolve_docs_dir(ctx: click.Context) -> Path | None:
52
52
  """
53
53
  Optional override precedence:
54
- 1) --docs-dir CLI option
55
- 2) SVC_INFRA_DOCS_DIR env var
56
- 3) *Only when working inside the svc-infra repo itself*: repo-root /docs
54
+ 1) SVC_INFRA_DOCS_DIR env var
55
+ 2) *Only when working inside the svc-infra repo itself*: repo-root /docs
57
56
  """
58
- # 1) CLI option on this or parent contexts
59
- current: click.Context | None = ctx
60
- while current is not None:
61
- docs_dir_opt = (current.params or {}).get("docs_dir")
62
- if docs_dir_opt:
63
- path = docs_dir_opt if isinstance(docs_dir_opt, Path) else Path(docs_dir_opt)
64
- path = path.expanduser()
65
- if path.exists():
66
- return path
67
- current = current.parent
68
-
69
- # 2) Env var
57
+ # 1) Env var
70
58
  env_dir = os.getenv("SVC_INFRA_DOCS_DIR")
71
59
  if env_dir:
72
60
  p = Path(env_dir).expanduser()
73
61
  if p.exists():
74
62
  return p
75
63
 
76
- # 3) In-repo convenience (so `svc-infra docs` works inside this repo)
64
+ # 2) In-repo convenience (so `svc-infra docs` works inside this repo)
77
65
  try:
78
66
  root = resolve_project_root()
79
67
  proj_docs = root / "docs"
@@ -130,46 +118,9 @@ def register(app: typer.Typer) -> None:
130
118
  docs_app = typer.Typer(no_args_is_help=True, add_completion=False, cls=DocsGroup)
131
119
 
132
120
  @docs_app.callback(invoke_without_command=True)
133
- def _docs_options(
134
- docs_dir: Path | None = typer.Option(
135
- None,
136
- "--docs-dir",
137
- help="Path to a docs directory to read from (overrides packaged docs)",
138
- ),
139
- topic: str | None = typer.Option(None, "--topic", help="Topic to show directly"),
140
- ) -> None:
141
- if topic:
142
- key = _norm(topic)
143
- ctx = click.get_current_context()
144
- dir_to_use = _resolve_docs_dir(ctx)
145
- fs = _discover_fs_topics(dir_to_use) if dir_to_use else {}
146
- if key in fs:
147
- typer.echo(fs[key].read_text(encoding="utf-8", errors="replace"))
148
- raise typer.Exit(code=0)
149
- pkg = _discover_pkg_topics()
150
- if key in pkg:
151
- typer.echo(pkg[key].read_text(encoding="utf-8", errors="replace"))
152
- raise typer.Exit(code=0)
153
- raise typer.BadParameter(f"Unknown topic: {topic}")
154
-
155
- @docs_app.command("list", help="List available documentation topics")
156
- def list_topics() -> None:
157
- ctx = click.get_current_context()
158
- dir_to_use = _resolve_docs_dir(ctx)
159
- fs = _discover_fs_topics(dir_to_use) if dir_to_use else {}
160
- pkg = _discover_pkg_topics()
161
-
162
- def _print(name: str, path: Path) -> None:
163
- try:
164
- typer.echo(f"{name}\t{path}")
165
- except Exception:
166
- typer.echo(name)
167
-
168
- for name, path in fs.items():
169
- _print(name, path)
170
- for name, path in pkg.items():
171
- if name not in fs:
172
- _print(name, path)
121
+ def _docs_options() -> None:
122
+ # No group-level options; dynamic commands and 'show' handle topics.
123
+ return None
173
124
 
174
125
  @docs_app.command("show", help="Show docs for a topic (alternative to dynamic subcommand)")
175
126
  def show(topic: str) -> None:
@@ -23,6 +23,6 @@ Notes:
23
23
  * You can point `--project-root` at your Alembic root; if omitted we auto-detect.
24
24
 
25
25
  Learn more:
26
- * For full integration guides and all topics, run: `svc-infra docs list`
27
- * To explore docs commands, run: `svc-infra docs --help`
26
+ * Explore available topics: `svc-infra docs --help`
27
+ * Show a topic directly: `svc-infra docs <topic>` or `svc-infra docs show <topic>`
28
28
  """
@@ -69,5 +69,13 @@ class InMemoryJobQueue:
69
69
  job.last_error = error
70
70
  # Exponential backoff: base * attempts
71
71
  delay = job.backoff_seconds * max(1, job.attempts)
72
- job.available_at = now + timedelta(seconds=delay)
72
+ if delay > 0:
73
+ # Add a tiny fudge so an immediate subsequent poll in ultra-fast
74
+ # environments (like our acceptance API) doesn't re-reserve the job.
75
+ # This keeps tests deterministic without impacting semantics.
76
+ job.available_at = now + timedelta(seconds=delay, milliseconds=250)
77
+ else:
78
+ # When backoff is explicitly zero (e.g., unit tests forcing
79
+ # immediate retry), make the job available right away.
80
+ job.available_at = now
73
81
  return
@@ -2,7 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  from enum import Enum
4
4
 
5
- from ai_infra.llm.tools.custom.cli import cli_cmd_help, cli_subcmd_help, run_cli
5
+ from ai_infra.llm.tools.custom.cli import cli_cmd_help, cli_subcmd_help
6
6
  from ai_infra.mcp.server.tools import mcp_from_functions
7
7
 
8
8
  from svc_infra.app.env import prepare_env
@@ -20,22 +20,22 @@ async def svc_infra_cmd_help() -> dict:
20
20
  return await cli_cmd_help(CLI_PROG)
21
21
 
22
22
 
23
- async def svc_infra_docs_list() -> dict:
24
- """Run `svc-infra docs list` and return its output.
23
+ # No dedicated 'docs list' function — users can use 'docs --help' to discover topics.
25
24
 
26
- Uses run_cli with the project root as cwd; falls back to run_from_root if needed.
25
+
26
+ async def svc_infra_docs_help() -> dict:
27
+ """
28
+ Run 'svc-infra docs --help' and return its output.
29
+ Prepares the project environment and executes from the repo root so
30
+ environment-provided docs directories and local topics are discoverable.
27
31
  """
28
32
  root = prepare_env()
29
- try:
30
- text = await run_cli(CLI_PROG, ["docs", "list"], cwd=str(root))
31
- except TypeError:
32
- # Fallback for older run_cli signatures
33
- text = await run_from_root(root, CLI_PROG, ["docs", "list"])
33
+ text = await run_from_root(root, CLI_PROG, ["docs", "--help"])
34
34
  return {
35
35
  "ok": True,
36
- "action": "docs_list",
36
+ "action": "docs_help",
37
37
  "project_root": str(root),
38
- "output": text,
38
+ "help": text,
39
39
  }
40
40
 
41
41
 
@@ -71,7 +71,7 @@ class Subcommand(str, Enum):
71
71
  obs_scaffold = "obs scaffold"
72
72
 
73
73
  # Docs group
74
- docs_list = "docs list"
74
+ docs_help = "docs --help"
75
75
  docs_show = "docs show"
76
76
 
77
77
  # DX group
@@ -114,12 +114,8 @@ mcp = mcp_from_functions(
114
114
  functions=[
115
115
  svc_infra_cmd_help,
116
116
  svc_infra_subcmd_help,
117
- svc_infra_docs_list,
118
- # Utility: list docs topics via `svc-infra docs list`
119
- # Exposed as a dedicated MCP function for quick discovery in clients.
120
- # See: svc_infra.cli.cmds.docs.docs_cmds
121
- # NOTE: Prefer run_cli with cwd=project root; fallback to run_from_root if signature differs.
122
- # Implemented as an inline wrapper to keep the API surface minimal.
117
+ svc_infra_docs_help,
118
+ # Docs listing is available via 'docs --help'; no separate MCP function needed.
123
119
  ],
124
120
  )
125
121
 
@@ -3,7 +3,6 @@ from __future__ import annotations
3
3
  from dataclasses import dataclass, field
4
4
  from datetime import datetime, timezone
5
5
  from typing import Dict, List
6
-
7
6
  from uuid import uuid4
8
7
 
9
8
  from svc_infra.db.outbox import OutboxStore
@@ -22,7 +21,16 @@ class InMemoryWebhookSubscriptions:
22
21
  self._subs: Dict[str, List[WebhookSubscription]] = {}
23
22
 
24
23
  def add(self, topic: str, url: str, secret: str) -> None:
25
- self._subs.setdefault(topic, []).append(WebhookSubscription(topic, url, secret))
24
+ # Upsert semantics per (topic, url): if a subscription already exists
25
+ # for this topic and URL, rotate its secret instead of adding a new row.
26
+ # This mirrors typical real-world secret rotation flows where the
27
+ # endpoint remains the same but the signing secret changes.
28
+ lst = self._subs.setdefault(topic, [])
29
+ for sub in lst:
30
+ if sub.url == url:
31
+ sub.secret = secret
32
+ return
33
+ lst.append(WebhookSubscription(topic, url, secret))
26
34
 
27
35
  def get_for_topic(self, topic: str) -> List[WebhookSubscription]:
28
36
  return list(self._subs.get(topic, []))
File without changes