simcord 3.2.0__tar.gz → 3.2.2__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 (431) hide show
  1. {simcord-3.2.0 → simcord-3.2.2}/.github/workflows/verify.yml +6 -0
  2. {simcord-3.2.0 → simcord-3.2.2}/.gitignore +3 -0
  3. {simcord-3.2.0 → simcord-3.2.2}/CHANGELOG.md +47 -0
  4. {simcord-3.2.0 → simcord-3.2.2}/CONTRIBUTING.md +28 -2
  5. {simcord-3.2.0 → simcord-3.2.2}/PKG-INFO +2 -1
  6. simcord-3.2.2/benchmarks/simulation_attribution.py +570 -0
  7. simcord-3.2.2/benchmarks/test_dispatch_benchmarks.py +73 -0
  8. simcord-3.2.2/benchmarks/test_simulation_benchmarks.py +167 -0
  9. {simcord-3.2.0 → simcord-3.2.2}/docs/architecture.md +57 -8
  10. {simcord-3.2.0 → simcord-3.2.2}/docs/guides/monetization.md +24 -0
  11. {simcord-3.2.0 → simcord-3.2.2}/docs/guides/permissions.md +6 -2
  12. {simcord-3.2.0 → simcord-3.2.2}/docs/guides/preview.md +55 -10
  13. {simcord-3.2.0 → simcord-3.2.2}/docs/guides/time-control.md +28 -0
  14. {simcord-3.2.0 → simcord-3.2.2}/docs/installation.md +3 -2
  15. simcord-3.2.2/docs/performance.md +205 -0
  16. {simcord-3.2.0 → simcord-3.2.2}/docs/stability.md +6 -3
  17. simcord-3.2.2/jsconfig.preview.json +17 -0
  18. simcord-3.2.2/package-lock.json +27 -0
  19. simcord-3.2.2/package.json +11 -0
  20. {simcord-3.2.0 → simcord-3.2.2}/pyproject.toml +2 -2
  21. {simcord-3.2.0 → simcord-3.2.2}/scripts/capture_monetization_reference.py +428 -416
  22. {simcord-3.2.0 → simcord-3.2.2}/scripts/capture_remaining_monetization.py +524 -390
  23. {simcord-3.2.0 → simcord-3.2.2}/scripts/capture_visual_reference.py +20 -29
  24. {simcord-3.2.0 → simcord-3.2.2}/scripts/check_package.py +13 -0
  25. {simcord-3.2.0 → simcord-3.2.2}/scripts/monetization_reference_checkout.py +37 -22
  26. simcord-3.2.2/scripts/monetization_reference_config.py +189 -0
  27. {simcord-3.2.0 → simcord-3.2.2}/scripts/monetization_reference_expiry.py +10 -0
  28. simcord-3.2.2/scripts/monetization_reference_journal.py +154 -0
  29. {simcord-3.2.0 → simcord-3.2.2}/scripts/monetization_reference_lifecycle.py +127 -114
  30. simcord-3.2.2/scripts/monetization_reference_transport.py +198 -0
  31. {simcord-3.2.0 → simcord-3.2.2}/scripts/monetization_reference_upgrade.py +196 -172
  32. {simcord-3.2.0 → simcord-3.2.2}/scripts/replay_visual_reference.py +339 -320
  33. {simcord-3.2.0 → simcord-3.2.2}/scripts/validate_monetization_reference.py +404 -183
  34. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/_dpy_internals.py +100 -65
  35. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/_modal.py +7 -2
  36. simcord-3.2.2/src/simcord/_payload.py +54 -0
  37. simcord-3.2.2/src/simcord/_runtime.py +702 -0
  38. simcord-3.2.2/src/simcord/_settlement.py +341 -0
  39. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/actors.py +66 -14
  40. simcord-3.2.2/src/simcord/backend/_deadlines.py +162 -0
  41. simcord-3.2.2/src/simcord/backend/access.py +114 -0
  42. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/backend/cdn.py +11 -1
  43. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/backend/models/automod.py +4 -0
  44. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/backend/ops/base.py +174 -12
  45. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/backend/ops/channels.py +77 -2
  46. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/backend/ops/guilds.py +55 -8
  47. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/backend/ops/invites.py +15 -0
  48. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/backend/ops/messages.py +200 -35
  49. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/backend/ops/monetization.py +59 -9
  50. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/backend/ops/polls.py +22 -18
  51. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/backend/ops/scheduled_events.py +41 -20
  52. simcord-3.2.2/src/simcord/backend/ops/voice.py +78 -0
  53. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/backend/serializers.py +15 -13
  54. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/builders.py +94 -30
  55. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/components.py +50 -4
  56. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/env.py +194 -175
  57. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/gateway.py +3 -3
  58. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/http/_helpers.py +59 -104
  59. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/http/client.py +3 -6
  60. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/http/router.py +15 -3
  61. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/http/routes/application.py +1 -2
  62. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/http/routes/channels.py +42 -30
  63. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/http/routes/guilds.py +23 -25
  64. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/http/routes/interactions.py +6 -20
  65. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/http/routes/messages.py +50 -27
  66. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/http/routes/monetization.py +12 -10
  67. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/http/routes/reactions.py +19 -5
  68. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/interactions.py +30 -8
  69. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/__init__.py +5 -0
  70. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/_action_plans.py +52 -16
  71. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/_actions.py +84 -44
  72. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/_assets.py +36 -18
  73. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/_capture.py +9 -43
  74. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/_commands.py +40 -8
  75. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/_component_projection.py +119 -5
  76. simcord-3.2.2/src/simcord/preview/_dependencies.py +90 -0
  77. simcord-3.2.2/src/simcord/preview/_diagnostics.py +69 -0
  78. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/_markdown.py +11 -2
  79. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/_messages.py +106 -7
  80. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/_pages.py +144 -19
  81. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/_queries.py +211 -28
  82. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/_server.py +60 -8
  83. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/_snapshot.py +53 -36
  84. simcord-3.2.2/src/simcord/preview/static/actions.js +264 -0
  85. simcord-3.2.2/src/simcord/preview/static/app.js +883 -0
  86. simcord-3.2.2/src/simcord/preview/static/assets.js +107 -0
  87. simcord-3.2.2/src/simcord/preview/static/backend-diagnostics.json +219 -0
  88. simcord-3.2.2/src/simcord/preview/static/command-catalog.js +60 -0
  89. simcord-3.2.2/src/simcord/preview/static/command-drafts.js +62 -0
  90. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/commands.js +348 -261
  91. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/components.js +103 -34
  92. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/composer.js +87 -15
  93. simcord-3.2.2/src/simcord/preview/static/connection.js +73 -0
  94. simcord-3.2.2/src/simcord/preview/static/diagnostics.js +205 -0
  95. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/dom.js +23 -2
  96. simcord-3.2.2/src/simcord/preview/static/focus.js +69 -0
  97. simcord-3.2.2/src/simcord/preview/static/geometry.js +78 -0
  98. simcord-3.2.2/src/simcord/preview/static/highlight-types.d.ts +26 -0
  99. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/listbox.js +11 -1
  100. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/media.js +121 -50
  101. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/messages.js +35 -11
  102. simcord-3.2.2/src/simcord/preview/static/modal.js +199 -0
  103. simcord-3.2.2/src/simcord/preview/static/presentation.js +299 -0
  104. simcord-3.2.2/src/simcord/preview/static/preview-types.d.ts +262 -0
  105. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/preview.css +13 -26
  106. simcord-3.2.2/src/simcord/preview/static/select-drafts.js +465 -0
  107. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/selects.js +35 -12
  108. simcord-3.2.2/src/simcord/preview/static/session.js +116 -0
  109. simcord-3.2.2/src/simcord/preview/static/surfaces.js +153 -0
  110. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/text.js +30 -3
  111. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/timeline.js +85 -11
  112. simcord-3.2.2/src/simcord/preview/static/transport.js +50 -0
  113. simcord-3.2.2/src/simcord/preview/static/workbench.js +398 -0
  114. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/results.py +7 -1
  115. {simcord-3.2.0 → simcord-3.2.2}/tests/conformance/_world.py +1 -1
  116. simcord-3.2.2/tests/integration/test_access_boundaries.py +385 -0
  117. simcord-3.2.2/tests/integration/test_atomic_mutations.py +265 -0
  118. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_automod.py +74 -0
  119. simcord-3.2.2/tests/integration/test_callback_thread_safety.py +121 -0
  120. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_command_visibility.py +38 -15
  121. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_components_v2_interactions.py +70 -7
  122. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_forum.py +69 -0
  123. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_forwarding.py +143 -0
  124. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_interaction_followups.py +2 -0
  125. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_interactions.py +75 -0
  126. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_preview.py +21 -0
  127. simcord-3.2.2/tests/integration/test_preview_action_admission.py +254 -0
  128. simcord-3.2.2/tests/integration/test_preview_additional.py +535 -0
  129. simcord-3.2.2/tests/integration/test_preview_browser_ownership.py +808 -0
  130. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_preview_capture.py +42 -0
  131. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_preview_capture_dx.py +17 -187
  132. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_preview_channel.py +24 -170
  133. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_preview_command_picker.py +334 -114
  134. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_preview_commands.py +146 -2
  135. simcord-3.2.2/tests/integration/test_preview_components_v2.py +185 -0
  136. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_preview_dx.py +8 -160
  137. simcord-3.2.2/tests/integration/test_preview_entity_contracts.py +451 -0
  138. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_preview_fixes.py +72 -251
  139. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_preview_message_actions.py +29 -5
  140. simcord-3.2.2/tests/integration/test_preview_modal_contracts.py +342 -0
  141. simcord-3.2.2/tests/integration/test_preview_navigation_contracts.py +449 -0
  142. simcord-3.2.2/tests/integration/test_preview_observations.py +283 -0
  143. simcord-3.2.2/tests/integration/test_preview_provenance.py +295 -0
  144. simcord-3.2.2/tests/integration/test_preview_render_contracts.py +125 -0
  145. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_preview_security.py +21 -291
  146. simcord-3.2.2/tests/integration/test_preview_support_report.py +304 -0
  147. simcord-3.2.2/tests/integration/test_preview_viewport_ownership.py +168 -0
  148. simcord-3.2.2/tests/integration/test_preview_workbench_contracts.py +190 -0
  149. simcord-3.2.2/tests/integration/test_reference_replay.py +215 -0
  150. simcord-3.2.2/tests/integration/test_runtime_executor_ownership.py +942 -0
  151. simcord-3.2.2/tests/integration/test_sdk_compatibility.py +47 -0
  152. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_settlement_contract.py +489 -25
  153. simcord-3.2.2/tests/integration/test_visual_reference_geometry.py +139 -0
  154. simcord-3.2.2/tests/unit/test_automod_preparation.py +264 -0
  155. simcord-3.2.2/tests/unit/test_backend_performance_contracts.py +517 -0
  156. {simcord-3.2.0 → simcord-3.2.2}/tests/unit/test_dpy_internals.py +61 -120
  157. simcord-3.2.2/tests/unit/test_local_eliminations.py +228 -0
  158. simcord-3.2.2/tests/unit/test_monetization_reference_capture.py +132 -0
  159. {simcord-3.2.0 → simcord-3.2.2}/tests/unit/test_monetization_reference_checkout.py +26 -5
  160. {simcord-3.2.0 → simcord-3.2.2}/tests/unit/test_monetization_reference_expiry.py +19 -3
  161. {simcord-3.2.0 → simcord-3.2.2}/tests/unit/test_monetization_reference_lifecycle.py +1 -1
  162. {simcord-3.2.0 → simcord-3.2.2}/tests/unit/test_monetization_reference_upgrade.py +37 -5
  163. {simcord-3.2.0 → simcord-3.2.2}/tests/unit/test_monetization_reference_validation.py +149 -0
  164. simcord-3.2.2/tests/unit/test_payload_ownership.py +595 -0
  165. {simcord-3.2.0 → simcord-3.2.2}/tests/unit/test_preview_action_specs.py +1 -12
  166. simcord-3.2.2/tests/unit/test_remaining_monetization_capture.py +756 -0
  167. {simcord-3.2.0 → simcord-3.2.2}/uv.lock +3 -1
  168. simcord-3.2.0/benchmarks/test_dispatch_benchmarks.py +0 -54
  169. simcord-3.2.0/docs/performance.md +0 -58
  170. simcord-3.2.0/src/simcord/_runtime.py +0 -341
  171. simcord-3.2.0/src/simcord/_settlement.py +0 -272
  172. simcord-3.2.0/src/simcord/backend/access.py +0 -77
  173. simcord-3.2.0/src/simcord/backend/ops/voice.py +0 -40
  174. simcord-3.2.0/src/simcord/preview/_diagnostics.py +0 -284
  175. simcord-3.2.0/src/simcord/preview/static/app.js +0 -2280
  176. simcord-3.2.0/src/simcord/preview/static/select-drafts.js +0 -284
  177. simcord-3.2.0/src/simcord/preview/static/transport.js +0 -167
  178. simcord-3.2.0/src/simcord/preview/static/workbench.js +0 -130
  179. simcord-3.2.0/tests/integration/test_preview_additional.py +0 -1208
  180. simcord-3.2.0/tests/integration/test_reference_replay.py +0 -96
  181. simcord-3.2.0/tests/unit/test_remaining_monetization_capture.py +0 -367
  182. {simcord-3.2.0 → simcord-3.2.2}/.github/ISSUE_TEMPLATE/bug.md +0 -0
  183. {simcord-3.2.0 → simcord-3.2.2}/.github/ISSUE_TEMPLATE/feature.md +0 -0
  184. {simcord-3.2.0 → simcord-3.2.2}/.github/ISSUE_TEMPLATE/parity-gap.md +0 -0
  185. {simcord-3.2.0 → simcord-3.2.2}/.github/dependabot.yml +0 -0
  186. {simcord-3.2.0 → simcord-3.2.2}/.github/workflows/ci.yml +0 -0
  187. {simcord-3.2.0 → simcord-3.2.2}/.github/workflows/dpy-master.yml +0 -0
  188. {simcord-3.2.0 → simcord-3.2.2}/.github/workflows/release.yml +0 -0
  189. {simcord-3.2.0 → simcord-3.2.2}/.pre-commit-config.yaml +0 -0
  190. {simcord-3.2.0 → simcord-3.2.2}/.python-version +0 -0
  191. {simcord-3.2.0 → simcord-3.2.2}/.readthedocs.yaml +0 -0
  192. {simcord-3.2.0 → simcord-3.2.2}/CODE_OF_CONDUCT.md +0 -0
  193. {simcord-3.2.0 → simcord-3.2.2}/LICENSE +0 -0
  194. {simcord-3.2.0 → simcord-3.2.2}/README.md +0 -0
  195. {simcord-3.2.0 → simcord-3.2.2}/SECURITY.md +0 -0
  196. {simcord-3.2.0 → simcord-3.2.2}/benchmarks/_helpers.py +0 -0
  197. {simcord-3.2.0 → simcord-3.2.2}/benchmarks/test_perf_guards.py +0 -0
  198. {simcord-3.2.0 → simcord-3.2.2}/changes/README.md +0 -0
  199. {simcord-3.2.0 → simcord-3.2.2}/docs/api.md +0 -0
  200. {simcord-3.2.0 → simcord-3.2.2}/docs/assets/adventure/alpine.png +0 -0
  201. {simcord-3.2.0 → simcord-3.2.2}/docs/assets/adventure/canyon.png +0 -0
  202. {simcord-3.2.0 → simcord-3.2.2}/docs/assets/preview/attachments.png +0 -0
  203. {simcord-3.2.0 → simcord-3.2.2}/docs/assets/preview/buttons.png +0 -0
  204. {simcord-3.2.0 → simcord-3.2.2}/docs/assets/preview/embeds.png +0 -0
  205. {simcord-3.2.0 → simcord-3.2.2}/docs/assets/preview/entities.png +0 -0
  206. {simcord-3.2.0 → simcord-3.2.2}/docs/assets/preview/layouts.png +0 -0
  207. {simcord-3.2.0 → simcord-3.2.2}/docs/assets/preview/markdown.png +0 -0
  208. {simcord-3.2.0 → simcord-3.2.2}/docs/assets/preview/modals.png +0 -0
  209. {simcord-3.2.0 → simcord-3.2.2}/docs/assets/preview/polls.png +0 -0
  210. {simcord-3.2.0 → simcord-3.2.2}/docs/assets/preview/replies.png +0 -0
  211. {simcord-3.2.0 → simcord-3.2.2}/docs/assets/preview/selects.png +0 -0
  212. {simcord-3.2.0 → simcord-3.2.2}/docs/assets/preview/slash-commands.png +0 -0
  213. {simcord-3.2.0 → simcord-3.2.2}/docs/assets/simcord-showcase-poll-refresh.gif +0 -0
  214. {simcord-3.2.0 → simcord-3.2.2}/docs/assets/simcord-terminal-demo.gif +0 -0
  215. {simcord-3.2.0 → simcord-3.2.2}/docs/assets/simcord-transparent.webp +0 -0
  216. {simcord-3.2.0 → simcord-3.2.2}/docs/assets/social-card.png +0 -0
  217. {simcord-3.2.0 → simcord-3.2.2}/docs/changelog.md +0 -0
  218. {simcord-3.2.0 → simcord-3.2.2}/docs/concepts.md +0 -0
  219. {simcord-3.2.0 → simcord-3.2.2}/docs/cookbook.md +0 -0
  220. {simcord-3.2.0 → simcord-3.2.2}/docs/faq.md +0 -0
  221. {simcord-3.2.0 → simcord-3.2.2}/docs/guides/ai-coding-agents.md +0 -0
  222. {simcord-3.2.0 → simcord-3.2.2}/docs/guides/components.md +0 -0
  223. {simcord-3.2.0 → simcord-3.2.2}/docs/guides/diagnostics.md +0 -0
  224. {simcord-3.2.0 → simcord-3.2.2}/docs/guides/discord-visual-calibration.md +0 -0
  225. {simcord-3.2.0 → simcord-3.2.2}/docs/guides/fixtures.md +0 -0
  226. {simcord-3.2.0 → simcord-3.2.2}/docs/guides/intents.md +0 -0
  227. {simcord-3.2.0 → simcord-3.2.2}/docs/guides/interactions.md +0 -0
  228. {simcord-3.2.0 → simcord-3.2.2}/docs/guides/messages.md +0 -0
  229. {simcord-3.2.0 → simcord-3.2.2}/docs/guides/mocks-vs-simulation.md +0 -0
  230. {simcord-3.2.0 → simcord-3.2.2}/docs/guides/moderation-and-guild.md +0 -0
  231. {simcord-3.2.0 → simcord-3.2.2}/docs/guides/test-without-token.md +0 -0
  232. {simcord-3.2.0 → simcord-3.2.2}/docs/guides/testing-discord-py-bots.md +0 -0
  233. {simcord-3.2.0 → simcord-3.2.2}/docs/guides/testing-slash-commands.md +0 -0
  234. {simcord-3.2.0 → simcord-3.2.2}/docs/guides/threads-reactions-dms.md +0 -0
  235. {simcord-3.2.0 → simcord-3.2.2}/docs/index.md +0 -0
  236. {simcord-3.2.0 → simcord-3.2.2}/docs/llms.txt +0 -0
  237. {simcord-3.2.0 → simcord-3.2.2}/docs/parity-matrix.md +0 -0
  238. {simcord-3.2.0 → simcord-3.2.2}/docs/preview-attestation.md +0 -0
  239. {simcord-3.2.0 → simcord-3.2.2}/docs/quickstart.md +0 -0
  240. {simcord-3.2.0 → simcord-3.2.2}/docs/robots.txt +0 -0
  241. {simcord-3.2.0 → simcord-3.2.2}/examples/README.md +0 -0
  242. {simcord-3.2.0 → simcord-3.2.2}/examples/__init__.py +0 -0
  243. {simcord-3.2.0 → simcord-3.2.2}/examples/bot.py +0 -0
  244. {simcord-3.2.0 → simcord-3.2.2}/examples/conftest.py +0 -0
  245. {simcord-3.2.0 → simcord-3.2.2}/examples/preview_example.py +0 -0
  246. {simcord-3.2.0 → simcord-3.2.2}/examples/test_bot.py +0 -0
  247. {simcord-3.2.0 → simcord-3.2.2}/mkdocs.yml +0 -0
  248. {simcord-3.2.0 → simcord-3.2.2}/overrides/main.html +0 -0
  249. {simcord-3.2.0 → simcord-3.2.2}/scripts/capture_discord_reference.py +0 -0
  250. {simcord-3.2.0 → simcord-3.2.2}/scripts/check_discoverability.py +0 -0
  251. {simcord-3.2.0 → simcord-3.2.2}/scripts/check_reference_modal_offline.py +0 -0
  252. {simcord-3.2.0 → simcord-3.2.2}/scripts/compare_visual_reference.py +0 -0
  253. {simcord-3.2.0 → simcord-3.2.2}/scripts/discord_reference_bot.py +0 -0
  254. {simcord-3.2.0 → simcord-3.2.2}/scripts/preview_dogfood.py +0 -0
  255. {simcord-3.2.0 → simcord-3.2.2}/scripts/record_readme_demo.py +0 -0
  256. {simcord-3.2.0 → simcord-3.2.2}/scripts/validate_discord_reference_pack.py +0 -0
  257. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/__init__.py +0 -0
  258. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/_clock.py +0 -0
  259. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/asserts.py +0 -0
  260. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/backend/__init__.py +0 -0
  261. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/backend/command_access.py +0 -0
  262. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/backend/errors.py +0 -0
  263. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/backend/models/__init__.py +0 -0
  264. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/backend/models/auditlog.py +0 -0
  265. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/backend/models/channel.py +0 -0
  266. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/backend/models/expression.py +0 -0
  267. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/backend/models/guild.py +0 -0
  268. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/backend/models/interaction.py +0 -0
  269. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/backend/models/invite.py +0 -0
  270. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/backend/models/member.py +0 -0
  271. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/backend/models/message.py +0 -0
  272. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/backend/models/monetization.py +0 -0
  273. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/backend/models/role.py +0 -0
  274. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/backend/models/scheduled_event.py +0 -0
  275. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/backend/models/stage_instance.py +0 -0
  276. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/backend/models/user.py +0 -0
  277. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/backend/models/voice.py +0 -0
  278. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/backend/models/webhook.py +0 -0
  279. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/backend/ops/__init__.py +0 -0
  280. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/backend/ops/audit.py +0 -0
  281. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/backend/ops/commands.py +0 -0
  282. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/backend/ops/expressions.py +0 -0
  283. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/backend/ops/permissions.py +0 -0
  284. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/backend/ops/reactions.py +0 -0
  285. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/backend/ops/webhooks.py +0 -0
  286. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/backend/permissions.py +0 -0
  287. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/backend/state.py +0 -0
  288. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/enums.py +0 -0
  289. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/http/__init__.py +0 -0
  290. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/http/routes/__init__.py +0 -0
  291. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/http/routes/auditlogs.py +0 -0
  292. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/http/routes/automod.py +0 -0
  293. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/http/routes/commands.py +0 -0
  294. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/http/routes/expressions.py +0 -0
  295. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/http/routes/invites.py +0 -0
  296. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/http/routes/scheduled_events.py +0 -0
  297. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/http/routes/stage_instances.py +0 -0
  298. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/intents.py +0 -0
  299. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/monetization.py +0 -0
  300. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/parity.py +0 -0
  301. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/_identity.py +0 -0
  302. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/_media.py +0 -0
  303. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/_media_worker.py +0 -0
  304. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/protocol.schema.json +0 -0
  305. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/fonts/OFL-1.1-Noto-Arabic.txt +0 -0
  306. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/fonts/OFL-1.1-Noto-CJK.txt +0 -0
  307. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/fonts/OFL-1.1-Noto-Devanagari.txt +0 -0
  308. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/fonts/OFL-1.1-Noto-Emoji.txt +0 -0
  309. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/fonts/OFL-1.1-Noto-Hebrew.txt +0 -0
  310. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/fonts/OFL-1.1-Noto.txt +0 -0
  311. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/fonts/manifest.json +0 -0
  312. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/fonts/noto-color-emoji-v2.051.ttf +0 -0
  313. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/fonts/noto-sans-arabic-v2.012.ttf +0 -0
  314. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/fonts/noto-sans-devanagari-v2.007.ttf +0 -0
  315. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/fonts/noto-sans-hebrew-v3.001.ttf +0 -0
  316. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/fonts/noto-sans-latin-italic-v2.015.ttf +0 -0
  317. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/fonts/noto-sans-latin-v2.015.ttf +0 -0
  318. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/fonts/noto-sans-mono-v2.014.ttf +0 -0
  319. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/fonts/noto-sans-sc-v2.004.ttf +0 -0
  320. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/index.html +0 -0
  321. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/vendor/highlight/LICENSE +0 -0
  322. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/vendor/highlight/SHA256SUMS +0 -0
  323. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/vendor/highlight/es/core.min.js +0 -0
  324. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/vendor/highlight/es/languages/bash.min.js +0 -0
  325. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/vendor/highlight/es/languages/cpp.min.js +0 -0
  326. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/vendor/highlight/es/languages/csharp.min.js +0 -0
  327. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/vendor/highlight/es/languages/css.min.js +0 -0
  328. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/vendor/highlight/es/languages/diff.min.js +0 -0
  329. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/vendor/highlight/es/languages/dockerfile.min.js +0 -0
  330. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/vendor/highlight/es/languages/go.min.js +0 -0
  331. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/vendor/highlight/es/languages/ini.min.js +0 -0
  332. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/vendor/highlight/es/languages/java.min.js +0 -0
  333. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/vendor/highlight/es/languages/javascript.min.js +0 -0
  334. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/vendor/highlight/es/languages/json.min.js +0 -0
  335. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/vendor/highlight/es/languages/markdown.min.js +0 -0
  336. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/vendor/highlight/es/languages/python.min.js +0 -0
  337. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/vendor/highlight/es/languages/rust.min.js +0 -0
  338. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/vendor/highlight/es/languages/sql.min.js +0 -0
  339. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/vendor/highlight/es/languages/typescript.min.js +0 -0
  340. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/vendor/highlight/es/languages/xml.min.js +0 -0
  341. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/vendor/highlight/es/languages/yaml.min.js +0 -0
  342. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/vendor/lottie/5.12.2/lottie_light_canvas.min.js +0 -0
  343. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/vendor/lottie/LICENSE +0 -0
  344. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/preview/static/vendor/lottie/SHA256SUMS +0 -0
  345. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/py.typed +0 -0
  346. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/pytest_plugin.py +0 -0
  347. {simcord-3.2.0 → simcord-3.2.2}/src/simcord/types.py +0 -0
  348. {simcord-3.2.0 → simcord-3.2.2}/tests/conformance/test_field_honesty.py +0 -0
  349. {simcord-3.2.0 → simcord-3.2.2}/tests/conformance/test_field_honesty_fuzz.py +0 -0
  350. {simcord-3.2.0 → simcord-3.2.2}/tests/conformance/test_route_coverage.py +0 -0
  351. {simcord-3.2.0 → simcord-3.2.2}/tests/conformance/test_serializers.py +0 -0
  352. {simcord-3.2.0 → simcord-3.2.2}/tests/conftest.py +0 -0
  353. {simcord-3.2.0 → simcord-3.2.2}/tests/fixtures/__init__.py +0 -0
  354. {simcord-3.2.0 → simcord-3.2.2}/tests/fixtures/commands/option_cases.json +0 -0
  355. {simcord-3.2.0 → simcord-3.2.2}/tests/fixtures/preview/__init__.py +0 -0
  356. {simcord-3.2.0 → simcord-3.2.2}/tests/fixtures/preview/catalog.py +0 -0
  357. {simcord-3.2.0 → simcord-3.2.2}/tests/fixtures/preview/coverage.json +0 -0
  358. {simcord-3.2.0 → simcord-3.2.2}/tests/fixtures/preview/measurements.json +0 -0
  359. {simcord-3.2.0 → simcord-3.2.2}/tests/fixtures/preview/moving-square.json +0 -0
  360. {simcord-3.2.0 → simcord-3.2.2}/tests/fixtures/preview/profiles.json +0 -0
  361. {simcord-3.2.0 → simcord-3.2.2}/tests/fixtures/preview/states.json +0 -0
  362. {simcord-3.2.0 → simcord-3.2.2}/tests/fixtures/preview/video.mp4 +0 -0
  363. {simcord-3.2.0 → simcord-3.2.2}/tests/fixtures/preview/voice.ogg +0 -0
  364. {simcord-3.2.0 → simcord-3.2.2}/tests/fixtures/sample_bot/__init__.py +0 -0
  365. {simcord-3.2.0 → simcord-3.2.2}/tests/fixtures/sample_bot/events.py +0 -0
  366. {simcord-3.2.0 → simcord-3.2.2}/tests/fixtures/sample_bot/general.py +0 -0
  367. {simcord-3.2.0 → simcord-3.2.2}/tests/fixtures/sample_bot/interactions.py +0 -0
  368. {simcord-3.2.0 → simcord-3.2.2}/tests/fixtures/sample_bot/moderation.py +0 -0
  369. {simcord-3.2.0 → simcord-3.2.2}/tests/fixtures/sample_bot/picker.py +0 -0
  370. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/preview_helpers.py +0 -0
  371. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_app_commands.py +0 -0
  372. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_application_emojis.py +0 -0
  373. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_asserts.py +0 -0
  374. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_audit_logs.py +0 -0
  375. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_bot_users_and_webhooks.py +0 -0
  376. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_channels.py +0 -0
  377. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_command_permissions.py +0 -0
  378. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_common_bot_sweep.py +0 -0
  379. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_components_v2_messages.py +0 -0
  380. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_coverage_sweep.py +0 -0
  381. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_diagnostics.py +0 -0
  382. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_edge_cases.py +0 -0
  383. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_entitlement_journey.py +0 -0
  384. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_error_capture_and_edits.py +0 -0
  385. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_expressions.py +0 -0
  386. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_gateway_and_automod_exempt.py +0 -0
  387. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_guilds.py +0 -0
  388. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_intents.py +0 -0
  389. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_invites.py +0 -0
  390. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_lifecycle.py +0 -0
  391. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_members.py +0 -0
  392. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_message_content_rest.py +0 -0
  393. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_message_routes.py +0 -0
  394. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_messages.py +0 -0
  395. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_misc_branches.py +0 -0
  396. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_moderation.py +0 -0
  397. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_observation_contracts.py +0 -0
  398. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_polls.py +0 -0
  399. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_preview_coverage.py +0 -0
  400. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_preview_edges.py +0 -0
  401. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_preview_fonts.py +0 -0
  402. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_preview_identity.py +0 -0
  403. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_reactions.py +0 -0
  404. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_roles_and_ordering.py +0 -0
  405. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_scheduled_events.py +0 -0
  406. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_setup_hook_suspension.py +0 -0
  407. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_sharding.py +0 -0
  408. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_shared_clock.py +0 -0
  409. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_stage_instances.py +0 -0
  410. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_threads.py +0 -0
  411. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_time.py +0 -0
  412. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_transport_edges.py +0 -0
  413. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_voice_state.py +0 -0
  414. {simcord-3.2.0 → simcord-3.2.2}/tests/integration/test_world_helpers.py +0 -0
  415. {simcord-3.2.0 → simcord-3.2.2}/tests/unit/test_assert_helpers.py +0 -0
  416. {simcord-3.2.0 → simcord-3.2.2}/tests/unit/test_backend_lookup_errors.py +0 -0
  417. {simcord-3.2.0 → simcord-3.2.2}/tests/unit/test_command_access.py +0 -0
  418. {simcord-3.2.0 → simcord-3.2.2}/tests/unit/test_components_v2_validation.py +0 -0
  419. {simcord-3.2.0 → simcord-3.2.2}/tests/unit/test_errors.py +0 -0
  420. {simcord-3.2.0 → simcord-3.2.2}/tests/unit/test_intent_rules.py +0 -0
  421. {simcord-3.2.0 → simcord-3.2.2}/tests/unit/test_lazy_import.py +0 -0
  422. {simcord-3.2.0 → simcord-3.2.2}/tests/unit/test_monetization_backend.py +0 -0
  423. {simcord-3.2.0 → simcord-3.2.2}/tests/unit/test_monetization_http.py +0 -0
  424. {simcord-3.2.0 → simcord-3.2.2}/tests/unit/test_option_validation.py +0 -0
  425. {simcord-3.2.0 → simcord-3.2.2}/tests/unit/test_parity.py +0 -0
  426. {simcord-3.2.0 → simcord-3.2.2}/tests/unit/test_parity_tooling.py +0 -0
  427. {simcord-3.2.0 → simcord-3.2.2}/tests/unit/test_permission_validators.py +0 -0
  428. {simcord-3.2.0 → simcord-3.2.2}/tests/unit/test_permissions.py +0 -0
  429. {simcord-3.2.0 → simcord-3.2.2}/tests/unit/test_pytest_clock.py +0 -0
  430. {simcord-3.2.0 → simcord-3.2.2}/tests/unit/test_pytest_plugin.py +0 -0
  431. {simcord-3.2.0 → simcord-3.2.2}/tests/unit/test_router.py +0 -0
@@ -11,6 +11,12 @@ jobs:
11
11
  runs-on: ubuntu-latest
12
12
  steps:
13
13
  - uses: actions/checkout@v7
14
+ - uses: actions/setup-node@v6
15
+ with:
16
+ node-version: "24"
17
+ cache: npm
18
+ - run: npm ci --ignore-scripts
19
+ - run: npm run check:preview
14
20
  - uses: astral-sh/setup-uv@v7
15
21
  # screenshot extra pulls in playwright/PIL/markdown-it so pyright resolves
16
22
  # the lazy optional imports in simcord.preview with real type info.
@@ -15,6 +15,9 @@ build/
15
15
  .hypothesis/
16
16
  .coverage
17
17
  htmlcov/
18
+ node_modules/
19
+ npm-debug.log*
20
+ *.tsbuildinfo
18
21
 
19
22
  # Editors
20
23
  .idea/
@@ -4,6 +4,53 @@ This changelog is generated with [towncrier](https://towncrier.readthedocs.io/).
4
4
 
5
5
  <!-- towncrier release notes start -->
6
6
 
7
+ ## 3.2.2 (2026-10-31)
8
+
9
+ ### Bug fixes
10
+
11
+ - Detach nested AutoMod create/edit inputs and returned rule data so SDK object mutation cannot silently change enforcement. Lazily retain visited keyword patterns on each live rule, replacing preparation when its actual keyword filter changes and avoiding dependence on the shared regex cache.
12
+ - Synchronize per-Env callback publication, retirement and settlement snapshots when owned executor threads schedule callbacks. Preserve cancellation, context and exact-once completed effects without holding the lifecycle lock while user callbacks run.
13
+ - Settlement now considers the earliest live recognized wake across tracked and native timers, so a later timer cannot make an actor operation return before an earlier wake completes. Future-valued timer results are not mistaken for wake targets. Retired callbacks release their Handle links without changing native cancellation, Context or error behavior.
14
+ - Payload detachment uses exact type identity for its wire fast path. Custom metaclass equality can no longer bypass independent copying or the original whole-graph deepcopy hooks and failures.
15
+ - Retire all live message deadlines before publishing explicit finalization of a shared backend Poll, including when a subscriber raises. Keep automatic Poll expiry index-driven without an additional alias index.
16
+ - Preserve scheduled-event pass membership during synchronous subscriber creation without losing later-event rescheduling. Accept unhashable AutoMod string keywords and keep text-identical keyword definitions distinct with lazy positional preparation. Centralize edit preparation and callback-index lifecycle ownership while preserving upload atomicity, deferred-response identity, cancellation and native callback behavior; remove the superseded sleep recognizer.
17
+ Keep the standalone attribution overlay aligned with the canonical edit commit so documented comparison runs remain executable.
18
+
19
+ ### Miscellaneous
20
+
21
+ - AutoMod lazily skips impossible ASCII keyword matches before compiling or searching regexes, using the existing live-rule preparation owner. Keyword priority, Unicode and wildcard semantics, in-place edit detection and detached rule payloads are unchanged. No-rule, early-hit and Unicode workloads are not claimed as universal speedups.
22
+ Deferred preparation retains the original keyword's regex definition, including across equal-valued string-subclass replacements.
23
+ - Reconstruct send, edit and history dispatch worlds for every measured benchmark round, including their HTTP/transcript state. Add a small complete command/reply scenario to the existing public-operation lane and distinguish its setup/shutdown scope from bare dispatch and stress workloads.
24
+ - Reuse the publication schema fingerprint when validating live command catalogs, hashing only published keys without reconstructing wire option trees. Preserve live permissions, stale-entry removal, bounded publication and refresh behavior.
25
+ - Reduce settlement CPU for bots with live Views and native I/O: drain owned progress before rescanning SDK waits, and read verified View lifecycle fields directly rather than scanning their attributes. Preserve completed effects, executor ownership, virtual time and settlement deadlines. Add a fresh-world local-I/O/live-View scenario to the existing reported benchmark lane without adding caches or scheduling indexes.
26
+ - Avoid redundant wait recognition when neither an owned task nor its waiter has an indexed timer wake. Skip Preview mention/emoji discovery and command-map construction when all relevant message texts lack their opening syntax, preserving everyone mentions, channel mention inventories, rendered search and live authorization. No new cache, scheduler, ownership representation or tuning option; sparse search, repeated composition classification and expanded reply-history retention retain their existing scaling limits.
27
+ - Detach nested REST/SDK message responses, edit inputs and retained HTTP/gateway history from canonical state and live subscriber envelopes. Complete fallible ingress detachment before upload, deferred-response and index side effects; retain shared-Poll and ordered subscriber/partial-commit behavior. These correctness fixes add copying CPU and retained-memory costs. Avoid task scans for callbacks without wake targets, eager ordered-bucket allocation, unchanged message index membership updates and per-ID removal of discarded channel buckets. Exact rendered Preview text search now seeks bounded pages with correct surviving-pivot witnesses and empty-page semantics; sparse/absent queries remain linear. No new dependency, cache, retention policy or public protocol change.
28
+
29
+ Preserve previously functioning deep reply ancestry using stack-safe wire-payload detachment at event, response and SDK parsing boundaries. Keep independent mutable snapshots and custom-data deepcopy behavior; avoid an unused live envelope when no subscribers exist. Add reproducible interleaved original/correctness-reference/optimized comparisons rather than attributing all measured overhead to necessary isolation.
30
+ - Reduce simulator CPU overhead in callback tracking, wait classification, virtual-time scheduling, component preparation, bounded history/entitlement queries, and Preview projection. Wake settlement on tracked progress rather than imposing a callback-only polling delay. Preserve detached request/result payloads and authorization; mutate indexed backend state through Backend methods, not raw internal fields. Ordered selection adds the pure-Python Sorted Containers runtime dependency. Rejected actor/webhook message validation no longer leaves partially installed upload assets.
31
+
32
+ Retire callbacks canceled during settlement and inactive due poll schedules without waiting for a safety sweep. Preserve traversal-order errors when malformed deadlines and mixed timezone awareness coexist.
33
+
34
+
35
+ ## 3.2.1 (2026-10-24)
36
+
37
+ ### Bug fixes
38
+
39
+ - Fix obsolete preview responses restoring an older viewer, and reauthorize cached references, identities, command catalogs, and retained autocomplete results without publishing unrelated edits. Centralize browser read/poll ownership and capture geometry; release evicted media, clear private modal and command-picker state, preserve native keyboard focus, and make simulated layouts follow their logical viewport. Preserve affected-message diagnostic navigation and terminal completeness across Inspector redraws; recover cached catalogs even when an obsolete read fails. Keep protocol 3 and status schema 1 unchanged; add development-only checks for the extracted JavaScript boundaries.
40
+
41
+ Give browser actions, assets, catalog observations, File-bearing drafts and rendered surfaces explicit lifetimes; strictly check all first-party JavaScript and preserve frozen publication/result provenance across revocation and capture. Validate compound member/voice and forum mutations before committing state, enforce actor and bot REST authority without conflating token access, and track actual executor execution separately from caller cancellation. Split capture configuration, journal/recovery and transport responsibilities; independently verify exact API test-grant provenance and retain distinct capture crop policies. Networked reference capture now requires aiohttp 3.12+ to prevent implicit uncertain-write retries; Preview library requirements are unchanged.
42
+
43
+ Preserve supported native SDK overwrite targets while rejecting foreign state and cross-guild roles/members; apply existing-emoji reaction permissions consistently in actors, REST and preview controls. Keep newer Reply intents when older sends settle, reconcile refreshed entity selections, and restore Escape after applying modal choices. Verify captured animation content and timing without depending on unrelated avatar antialiasing.
44
+
45
+ Move selection-state reporting into its owner, leaving the bootstrap to assemble read-only status.
46
+
47
+ Observe native executor submission and completion independently of failed or cancelled caller facades, including initializer rejection and picklable process-pool calls. Preserve live gateway, shard and webhook machinery after a native-work shutdown timeout. Keep deleted session-owned grants out of later baselines without weakening receipt checks. Preserve earlier bot avatars when a human DM message is focused or captured, while retaining live revocation checks; construct uncached SDK messages with native partial channels.
48
+
49
+ Release successful executor callables without retaining them until long-lived parent tasks finish; preserve unobserved-error handling.
50
+
51
+ Reject DM and cross-guild service-message references at the fixture boundary while preserving valid same-guild, cross-channel references. ([#41](https://github.com/SilentHacks/simcord/pull/41))
52
+
53
+
7
54
  ## 3.2.0 (2026-10-22)
8
55
 
9
56
  ### Features
@@ -16,8 +16,9 @@ uv run ruff check src tests examples benchmarks scripts && uv run ruff format --
16
16
  uv run pyright src
17
17
  ```
18
18
 
19
- The pre-commit hooks mirror the CI `lint` job (ruff on commit, pyright on push)
20
- using the project's own pinned tools, so a clean commit means a green CI lint.
19
+ The Python hooks run ruff on commit and pyright on push using the project's
20
+ pinned tools. Run the frontend check below separately; passing Python hooks
21
+ does not replace the JavaScript CI gate.
21
22
 
22
23
  Optional extras layer on top of `dev` depending on what you work on:
23
24
 
@@ -31,6 +32,19 @@ uv sync --extra dev --extra screenshot # matches the CI lint job
31
32
  uv run playwright install --with-deps chromium # needed once for browser capture tests + the example
32
33
  ```
33
34
 
35
+ Frontend contributors also need Node 24:
36
+
37
+ ```bash
38
+ npm ci --ignore-scripts
39
+ npm run check:preview
40
+ ```
41
+
42
+ This strict JSDoc check includes every first-party `static/*.js` module and the
43
+ composing callers. The explicit root glob and `noResolve` keep unchanged vendored
44
+ Highlight.js code behind narrow declarations, not behind disabled first-party
45
+ checks. New first-party modules belong in that checked root and the server's
46
+ static allowlist. Preview users and installed-wheel captures do not need Node.
47
+
34
48
  ## Project layout
35
49
 
36
50
  - `src/simcord/backend/`: the virtual Discord with dataclass models, wire-format
@@ -42,6 +56,18 @@ uv run playwright install --with-deps chromium # needed once for browser
42
56
  - `src/simcord/{env,builders,actors,results,interactions}.py`: the public API.
43
57
  - `src/simcord/_dpy_internals.py`: **every** touch of a private discord.py API,
44
58
  behind an import-time self-check. New private-API usage goes here, nowhere else.
59
+ - `src/simcord/_runtime.py`: paired loop hooks and owned task/callback/executor
60
+ bookkeeping; `_settlement.py` consumes a narrow settlement view, not the world.
61
+ - `src/simcord/preview/static/app.js`: page composition and event wiring.
62
+ `actions.js` owns POST admission; `session.js` owns state reads/polling;
63
+ `assets.js` owns shared URLs and derived metadata. Composer, select, modal,
64
+ timeline and workbench owners keep their own mutable feature state.
65
+ - `command-catalog.js` owns catalog observations, `command-drafts.js` owns
66
+ versioned File-bearing drafts, and `commands.js` owns the native picker view.
67
+ - `scripts/monetization_reference_{config,journal,transport}.py`: validated
68
+ capture-mode configuration, durable ownership/recovery and raw transport.
69
+ `validate_monetization_reference.py` independently verifies evidence in explicit
70
+ phases; recorder flags alone are not authorization.
45
71
 
46
72
  ## Guidelines
47
73
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: simcord
3
- Version: 3.2.0
3
+ Version: 3.2.2
4
4
  Summary: Offline discord.py bot testing with pytest. No network, token, or test server.
5
5
  Project-URL: Homepage, https://github.com/SilentHacks/simcord
6
6
  Project-URL: Documentation, https://simcord.readthedocs.io/
@@ -23,6 +23,7 @@ Classifier: Topic :: Software Development :: Testing :: Mocking
23
23
  Classifier: Typing :: Typed
24
24
  Requires-Python: >=3.11
25
25
  Requires-Dist: discord-py<3,>=2.7.1
26
+ Requires-Dist: sortedcontainers<3,>=2.4
26
27
  Provides-Extra: bench
27
28
  Requires-Dist: pytest-asyncio>=0.24; extra == 'bench'
28
29
  Requires-Dist: pytest-benchmark>=4; extra == 'bench'