monoid-agent-kernel 0.18.0__tar.gz → 0.19.0__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 (401) hide show
  1. monoid_agent_kernel-0.19.0/.gitattributes +1 -0
  2. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/.github/workflows/ci.yml +22 -0
  3. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/.gitignore +7 -0
  4. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/CHANGELOG.md +16 -0
  5. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/PKG-INFO +14 -9
  6. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/README.md +13 -8
  7. monoid_agent_kernel-0.19.0/docs/img/studio-v019-main.jpg +0 -0
  8. monoid_agent_kernel-0.19.0/docs/img/studio-v019-profile-builder.jpg +0 -0
  9. monoid_agent_kernel-0.19.0/docs/img/studio-v019-review-changes.jpg +0 -0
  10. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/pyproject.toml +5 -3
  11. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/_version.py +1 -1
  12. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/loop.py +5 -4
  13. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/loop_phases.py +2 -4
  14. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/recorder.py +29 -0
  15. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/backend/proposal.py +47 -32
  16. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/backend/recovery.py +18 -5
  17. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/studio/README.md +40 -0
  18. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/studio/cli.py +10 -3
  19. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/studio/server.py +401 -28
  20. monoid_agent_kernel-0.19.0/src/monoid_agent_kernel/reference/studio/web/dist/assets/index-DOYa7R5h.js +7 -0
  21. monoid_agent_kernel-0.19.0/src/monoid_agent_kernel/reference/studio/web/dist/assets/index-GoYjJIxI.css +2 -0
  22. monoid_agent_kernel-0.19.0/src/monoid_agent_kernel/reference/studio/web/dist/index.html +15 -0
  23. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/studio/window.py +2 -2
  24. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_backend_recovery.py +73 -0
  25. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_release_packaging.py +11 -0
  26. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_studio.py +54 -60
  27. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_studio_proposals.py +136 -7
  28. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_studio_sessions.py +226 -0
  29. monoid_agent_kernel-0.18.0/src/monoid_agent_kernel/reference/studio/web/index.html +0 -1955
  30. monoid_agent_kernel-0.18.0/src/monoid_agent_kernel/reference/studio/web/settings.html +0 -108
  31. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/.env.example +0 -0
  32. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/.github/workflows/publish.yml +0 -0
  33. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/CODE_OF_CONDUCT.md +0 -0
  34. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/CONTRIBUTING.md +0 -0
  35. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/LICENSE +0 -0
  36. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/NOTICE +0 -0
  37. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/SECURITY.md +0 -0
  38. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/docs/BACKEND.md +0 -0
  39. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/docs/CLI.md +0 -0
  40. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/docs/COMPATIBILITY.md +0 -0
  41. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/docs/CONFORMANCE.md +0 -0
  42. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/docs/CONTRACTS.md +0 -0
  43. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/docs/CORE_HELPER_KIT.md +0 -0
  44. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/docs/DBOS_REFERENCE.md +0 -0
  45. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/docs/EMBEDDING.md +0 -0
  46. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/docs/FIRST_SKILL_TUTORIAL.md +0 -0
  47. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/docs/OBSERVABILITY.md +0 -0
  48. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/docs/OPERATIONAL_RULE_COVERAGE.md +0 -0
  49. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/docs/PHASE_1S_COVERAGE.md +0 -0
  50. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/docs/PHASE_4_CLOSURE.md +0 -0
  51. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/docs/README.md +0 -0
  52. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/docs/REFERENCE.md +0 -0
  53. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/docs/RUNNER_BACKEND_RESPONSIBILITY_MAP.md +0 -0
  54. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/docs/SKILLS_DESIGN.md +0 -0
  55. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/docs/SUBAGENT_DESIGN.md +0 -0
  56. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/docs/TOOL_SURFACE.md +0 -0
  57. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/docs/V0_18_RELEASE_AUDIT.md +0 -0
  58. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/docs/img/a2a.png +0 -0
  59. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/docs/img/hero.png +0 -0
  60. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/docs/img/studio-v016-main.png +0 -0
  61. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/docs/img/studio-v016-profile-builder.png +0 -0
  62. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/docs/security/PRODUCTION_CHECKLIST.md +0 -0
  63. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/docs/security/SECURITY_MODEL.md +0 -0
  64. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/docs/security/THREAT_MODEL.md +0 -0
  65. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/examples/custom_model_adapter.py +0 -0
  66. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/examples/custom_tool_quickstart.py +0 -0
  67. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/examples/custom_tools/word_count_tool.py +0 -0
  68. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/examples/embedding_hosted_product.py +0 -0
  69. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/examples/embedding_local_product.py +0 -0
  70. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/examples/full_stack_integration.py +0 -0
  71. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/examples/memory_quickstart.py +0 -0
  72. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/examples/messy_workspace_cleanup.py +0 -0
  73. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/examples/minimal_quickstart.py +0 -0
  74. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/examples/otel_tracing.py +0 -0
  75. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/examples/redacting_event_sink.py +0 -0
  76. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/examples/run-spec.json +0 -0
  77. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/examples/runtime-config.json +0 -0
  78. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/examples/workspaces/edit_markdown_notes/notes.md +0 -0
  79. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/__init__.py +0 -0
  80. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/_policy_util.py +0 -0
  81. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/_proc.py +0 -0
  82. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/builder.py +0 -0
  83. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/cli.py +0 -0
  84. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/conformance/__init__.py +0 -0
  85. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/conformance/contracts.py +0 -0
  86. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/conformance/fixtures/compatibility-v1.json +0 -0
  87. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/conformance/fixtures.py +0 -0
  88. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/conformance/harness.py +0 -0
  89. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/conformance/profiles/__init__.py +0 -0
  90. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/conformance/profiles/_metadata.py +0 -0
  91. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/conformance/profiles/capability_security.py +0 -0
  92. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/conformance/profiles/control_plane.py +0 -0
  93. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/conformance/profiles/durable_runner.py +0 -0
  94. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/conformance/profiles/message_fabric.py +0 -0
  95. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/conformance/profiles/minimal_agent.py +0 -0
  96. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/conformance/profiles/multi_agent.py +0 -0
  97. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/conformance/profiles/provider_gateway.py +0 -0
  98. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/conformance/profiles/reference_full.py +0 -0
  99. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/conformance/profiles/side_effect_tool_agent.py +0 -0
  100. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/conformance/profiles/tool_agent.py +0 -0
  101. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/conformance/report.py +0 -0
  102. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/conformance/runner.py +0 -0
  103. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/contracts.py +0 -0
  104. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/core/__init__.py +0 -0
  105. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/core/_util.py +0 -0
  106. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/core/agents.py +0 -0
  107. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/core/cancellation.py +0 -0
  108. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/core/capability.py +0 -0
  109. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/core/capability_revocation.py +0 -0
  110. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/core/checkpoint.py +0 -0
  111. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/core/compatibility.py +0 -0
  112. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/core/content.py +0 -0
  113. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/core/context.py +0 -0
  114. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/core/control.py +0 -0
  115. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/core/control_audit.py +0 -0
  116. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/core/durable_codec.py +0 -0
  117. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/core/durable_metadata.py +0 -0
  118. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/core/event_sequencing.py +0 -0
  119. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/core/event_subscription.py +0 -0
  120. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/core/events.py +0 -0
  121. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/core/external_agent_envelope.py +0 -0
  122. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/core/frontmatter.py +0 -0
  123. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/core/inbox.py +0 -0
  124. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/core/lease_admission.py +0 -0
  125. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/core/lifecycle.py +0 -0
  126. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/core/manifest.py +0 -0
  127. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/core/media.py +0 -0
  128. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/core/outbox.py +0 -0
  129. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/core/output_validator.py +0 -0
  130. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/core/packages.py +0 -0
  131. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/core/projections.py +0 -0
  132. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/core/prompt.py +0 -0
  133. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/core/proposal_file.py +0 -0
  134. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/core/result.py +0 -0
  135. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/core/schemas.py +0 -0
  136. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/core/scope.py +0 -0
  137. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/core/side_effect_policy.py +0 -0
  138. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/core/spec.py +0 -0
  139. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/core/streaming.py +0 -0
  140. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/core/subagent_runtime.py +0 -0
  141. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/core/tool_approval.py +0 -0
  142. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/core/tool_surface.py +0 -0
  143. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/core/trace_context.py +0 -0
  144. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/core/wire_validation.py +0 -0
  145. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/core/workspace.py +0 -0
  146. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/core/workspace_index.py +0 -0
  147. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/env.py +0 -0
  148. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/errors.py +0 -0
  149. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/event_loader.py +0 -0
  150. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/identifiers.py +0 -0
  151. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/mcp/__init__.py +0 -0
  152. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/mcp/client.py +0 -0
  153. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/mcp/provider.py +0 -0
  154. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/memory.py +0 -0
  155. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/narration.py +0 -0
  156. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/observability/__init__.py +0 -0
  157. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/observability/otel.py +0 -0
  158. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/permissions.py +0 -0
  159. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/providers/__init__.py +0 -0
  160. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/providers/_common.py +0 -0
  161. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/providers/base.py +0 -0
  162. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/providers/fake.py +0 -0
  163. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/providers/gateway.py +0 -0
  164. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/providers/openai.py +0 -0
  165. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/public_view.py +0 -0
  166. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/py.typed +0 -0
  167. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/__init__.py +0 -0
  168. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/_shared/__init__.py +0 -0
  169. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/_shared/control_transport.py +0 -0
  170. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/_shared/http_util.py +0 -0
  171. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/_shared/tokens.py +0 -0
  172. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/backend/__init__.py +0 -0
  173. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/backend/commands.py +0 -0
  174. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/backend/http.py +0 -0
  175. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/backend/jobs.py +0 -0
  176. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/backend/loop_factory.py +0 -0
  177. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/backend/outbox_dispatch.py +0 -0
  178. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/backend/ports.py +0 -0
  179. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/backend/projection.py +0 -0
  180. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/backend/proposal_reader.py +0 -0
  181. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/backend/run_execution.py +0 -0
  182. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/backend/run_preparation.py +0 -0
  183. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/backend/run_state.py +0 -0
  184. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/backend/run_types.py +0 -0
  185. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/backend/runtime_config.py +0 -0
  186. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/backend/service.py +0 -0
  187. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/backend/session.py +0 -0
  188. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/backend/session_drive.py +0 -0
  189. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/capability.py +0 -0
  190. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/command_inbox.py +0 -0
  191. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/conformance.py +0 -0
  192. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/dbos/__init__.py +0 -0
  193. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/dbos/control_plane.py +0 -0
  194. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/dbos/run_driver.py +0 -0
  195. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/dbos/runtime.py +0 -0
  196. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/llm_gateway/__init__.py +0 -0
  197. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/llm_gateway/http.py +0 -0
  198. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/llm_gateway/providers.py +0 -0
  199. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/llm_gateway/service.py +0 -0
  200. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/mcp_gateway/__init__.py +0 -0
  201. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/mcp_gateway/http.py +0 -0
  202. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/mcp_gateway/service.py +0 -0
  203. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/outbox.py +0 -0
  204. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/stores/__init__.py +0 -0
  205. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/stores/lease.py +0 -0
  206. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/stores/sqlite.py +0 -0
  207. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/studio/__init__.py +0 -0
  208. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/studio/activity.py +0 -0
  209. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/studio/chat_projection.py +0 -0
  210. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/studio/sample-skills/code-review-checklist/SKILL.md +0 -0
  211. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/studio/sample-skills/code-review-checklist/references/review-checklist.md +0 -0
  212. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/studio/sample-skills/commit-message/SKILL.md +0 -0
  213. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/studio/sample-skills/incident-summary/SKILL.md +0 -0
  214. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/studio/sample-skills/incident-summary/references/incident-template.md +0 -0
  215. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/studio/sample-skills/release-notes/SKILL.md +0 -0
  216. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/studio/sample-skills/release-notes/references/release-note-template.md +0 -0
  217. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/studio/sample-skills/release-notes/scripts/collect_changes.py +0 -0
  218. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/studio/web/vendor/katex/auto-render.min.js +0 -0
  219. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/studio/web/vendor/katex/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  220. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/studio/web/vendor/katex/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  221. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/studio/web/vendor/katex/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  222. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/studio/web/vendor/katex/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  223. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/studio/web/vendor/katex/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  224. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/studio/web/vendor/katex/fonts/KaTeX_Main-Bold.woff2 +0 -0
  225. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/studio/web/vendor/katex/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  226. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/studio/web/vendor/katex/fonts/KaTeX_Main-Italic.woff2 +0 -0
  227. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/studio/web/vendor/katex/fonts/KaTeX_Main-Regular.woff2 +0 -0
  228. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/studio/web/vendor/katex/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  229. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/studio/web/vendor/katex/fonts/KaTeX_Math-Italic.woff2 +0 -0
  230. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/studio/web/vendor/katex/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  231. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/studio/web/vendor/katex/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  232. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/studio/web/vendor/katex/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  233. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/studio/web/vendor/katex/fonts/KaTeX_Script-Regular.woff2 +0 -0
  234. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/studio/web/vendor/katex/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  235. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/studio/web/vendor/katex/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  236. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/studio/web/vendor/katex/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  237. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/studio/web/vendor/katex/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  238. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/studio/web/vendor/katex/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  239. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/studio/web/vendor/katex/katex.min.css +0 -0
  240. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/studio/web/vendor/katex/katex.min.js +0 -0
  241. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/web_gateway/__init__.py +0 -0
  242. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/web_gateway/http.py +0 -0
  243. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/web_gateway/providers.py +0 -0
  244. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/reference/web_gateway/service.py +0 -0
  245. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/shell.py +0 -0
  246. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/skills/__init__.py +0 -0
  247. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/skills/definition.py +0 -0
  248. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/skills/loader.py +0 -0
  249. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/skills/provider.py +0 -0
  250. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/subagent_loader.py +0 -0
  251. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/tasks.py +0 -0
  252. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/tool_loader.py +0 -0
  253. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/tool_services/__init__.py +0 -0
  254. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/tool_services/base.py +0 -0
  255. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/tool_services/jobs.py +0 -0
  256. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/tool_services/shell.py +0 -0
  257. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/tool_services/web.py +0 -0
  258. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/tools/__init__.py +0 -0
  259. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/tools/base.py +0 -0
  260. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/tools/builtin.py +0 -0
  261. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/tools/decorator.py +0 -0
  262. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/tools/defaults.py +0 -0
  263. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/tools/tool_ids.py +0 -0
  264. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/web.py +0 -0
  265. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/workspace/__init__.py +0 -0
  266. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/workspace/local.py +0 -0
  267. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/monoid_agent_kernel/workspace/paths.py +0 -0
  268. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/native_agent_runner/__init__.py +0 -0
  269. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/src/native_agent_runner/py.typed +0 -0
  270. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/conformance/test_capability_revocation_profile.py +0 -0
  271. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/conformance/test_capability_security_profile.py +0 -0
  272. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/conformance/test_compatibility_fixtures.py +0 -0
  273. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/conformance/test_control_plane_profile.py +0 -0
  274. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/conformance/test_durable_runner_profile.py +0 -0
  275. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/conformance/test_external_runner.py +0 -0
  276. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/conformance/test_import_boundaries.py +0 -0
  277. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/conformance/test_message_fabric_profile.py +0 -0
  278. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/conformance/test_multi_agent_profile.py +0 -0
  279. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/conformance/test_provider_gateway_profile.py +0 -0
  280. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/conformance/test_reference_full_profile.py +0 -0
  281. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/conformance/test_side_effect_tool_agent_profile.py +0 -0
  282. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/conformance/test_skeleton.py +0 -0
  283. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/conformance/test_tool_agent_profile.py +0 -0
  284. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/conftest.py +0 -0
  285. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/support/__init__.py +0 -0
  286. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/support/backend.py +0 -0
  287. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/support/backend_factory.py +0 -0
  288. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/support/backend_harness.py +0 -0
  289. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/support/dbos_control_worker.py +0 -0
  290. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/support/dbos_run_worker.py +0 -0
  291. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/support/http.py +0 -0
  292. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/support/mcp.py +0 -0
  293. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/support/process.py +0 -0
  294. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/support/runtime.py +0 -0
  295. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/support/studio_harness.py +0 -0
  296. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/support/test_tiers.py +0 -0
  297. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/support/waiting.py +0 -0
  298. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_agent_loop_lifecycle.py +0 -0
  299. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_agent_runtime_config.py +0 -0
  300. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_async_loop.py +0 -0
  301. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_async_tools.py +0 -0
  302. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_backend.py +0 -0
  303. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_backend_command_inbox.py +0 -0
  304. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_backend_control.py +0 -0
  305. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_backend_dbos_control.py +0 -0
  306. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_backend_dbos_run.py +0 -0
  307. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_backend_event_subscription.py +0 -0
  308. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_backend_http_api.py +0 -0
  309. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_backend_media.py +0 -0
  310. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_backend_providers.py +0 -0
  311. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_backend_runtime_config.py +0 -0
  312. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_backend_stream.py +0 -0
  313. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_backend_turn_recovery.py +0 -0
  314. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_backend_watchdog.py +0 -0
  315. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_builder_cli.py +0 -0
  316. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_cancellation.py +0 -0
  317. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_canonical_hash.py +0 -0
  318. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_capability.py +0 -0
  319. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_capability_broker_contract.py +0 -0
  320. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_capability_revocation.py +0 -0
  321. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_checkpoint.py +0 -0
  322. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_checkpoint_store_contract.py +0 -0
  323. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_cli_and_openai.py +0 -0
  324. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_command_store_contract.py +0 -0
  325. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_compatibility_ledger.py +0 -0
  326. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_content_parts.py +0 -0
  327. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_context_providers.py +0 -0
  328. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_dbos_control_models.py +0 -0
  329. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_dbos_run_driver.py +0 -0
  330. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_dbos_run_models.py +0 -0
  331. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_durability_fault_matrix.py +0 -0
  332. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_durable_codec.py +0 -0
  333. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_durable_metadata.py +0 -0
  334. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_event_data_schema.py +0 -0
  335. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_event_sequencing.py +0 -0
  336. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_event_subscription.py +0 -0
  337. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_examples.py +0 -0
  338. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_external_agent_envelope.py +0 -0
  339. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_external_agent_envelope_properties.py +0 -0
  340. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_external_implementation_contract.py +0 -0
  341. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_file_lock.py +0 -0
  342. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_frontmatter.py +0 -0
  343. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_gateway_provider.py +0 -0
  344. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_hitl.py +0 -0
  345. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_inbox.py +0 -0
  346. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_inbox_outbox_properties.py +0 -0
  347. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_jobs.py +0 -0
  348. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_lease_admission.py +0 -0
  349. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_lease_store_contract.py +0 -0
  350. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_llm_gateway_backend.py +0 -0
  351. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_llm_gateway_stream.py +0 -0
  352. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_loop.py +0 -0
  353. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_mcp.py +0 -0
  354. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_mcp_gateway.py +0 -0
  355. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_media.py +0 -0
  356. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_memory.py +0 -0
  357. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_multimodal_forwarding.py +0 -0
  358. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_namespace_compat.py +0 -0
  359. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_narration.py +0 -0
  360. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_observability.py +0 -0
  361. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_openai_adapter.py +0 -0
  362. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_otel.py +0 -0
  363. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_outbox.py +0 -0
  364. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_output_validator.py +0 -0
  365. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_prompt_composition.py +0 -0
  366. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_proposal_package.py +0 -0
  367. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_public_surface.py +0 -0
  368. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_pump.py +0 -0
  369. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_scenario_scoring.py +0 -0
  370. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_scope_relation.py +0 -0
  371. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_scope_relation_properties.py +0 -0
  372. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_session_drive.py +0 -0
  373. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_session_lifecycle.py +0 -0
  374. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_shell.py +0 -0
  375. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_side_effect_policy.py +0 -0
  376. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_skills.py +0 -0
  377. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_spec_serialization.py +0 -0
  378. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_studio_chat_projection.py +0 -0
  379. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_studio_cli.py +0 -0
  380. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_studio_settings.py +0 -0
  381. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_studio_shell_web.py +0 -0
  382. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_studio_skills_mcp.py +0 -0
  383. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_subagent.py +0 -0
  384. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_subagent_runtime_context.py +0 -0
  385. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_test_tiering.py +0 -0
  386. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_tokens.py +0 -0
  387. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_tool_approval.py +0 -0
  388. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_tool_decorator.py +0 -0
  389. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_tool_ids.py +0 -0
  390. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_tool_result_envelope.py +0 -0
  391. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_tool_services.py +0 -0
  392. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_tool_surface.py +0 -0
  393. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_tools.py +0 -0
  394. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_trace_context.py +0 -0
  395. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_usage_accounting.py +0 -0
  396. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_web_gateway.py +0 -0
  397. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_wire_validation.py +0 -0
  398. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_workspace_contract.py +0 -0
  399. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_workspace_paths_properties.py +0 -0
  400. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_workspace_permissions.py +0 -0
  401. {monoid_agent_kernel-0.18.0 → monoid_agent_kernel-0.19.0}/tests/test_workspace_protocol.py +0 -0
@@ -0,0 +1 @@
1
+ src/monoid_agent_kernel/reference/studio/web/dist/assets/*.js whitespace=-trailing-space
@@ -6,6 +6,28 @@ on:
6
6
  pull_request:
7
7
 
8
8
  jobs:
9
+ studio-ui:
10
+ name: Studio UI build
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - uses: actions/checkout@v4
14
+ - uses: actions/setup-node@v4
15
+ with:
16
+ node-version: "24"
17
+ cache: npm
18
+ cache-dependency-path: studio-ui/package-lock.json
19
+ - name: Install Studio UI dependencies
20
+ working-directory: studio-ui
21
+ run: npm ci
22
+ - name: Type and accessibility check
23
+ working-directory: studio-ui
24
+ run: npm run check
25
+ - name: Build packaged Studio UI
26
+ working-directory: studio-ui
27
+ run: npm run build
28
+ - name: Verify committed assets are current
29
+ run: git diff --exit-code -- src/monoid_agent_kernel/reference/studio/web/dist
30
+
9
31
  lint:
10
32
  runs-on: ubuntu-latest
11
33
  steps:
@@ -15,11 +15,18 @@ __pycache__/
15
15
  .eggs/
16
16
  build/
17
17
  dist/
18
+ !src/monoid_agent_kernel/reference/studio/web/dist/
19
+ !src/monoid_agent_kernel/reference/studio/web/dist/**
18
20
  .pytest_cache/
19
21
  .hypothesis/
20
22
  .mypy_cache/
21
23
  .ruff_cache/
22
24
 
25
+ # Studio frontend build workspace
26
+ node_modules/
27
+ studio-ui/coverage/
28
+ studio-ui/.vite/
29
+
23
30
  # Virtual environments
24
31
  .venv/
25
32
  venv/
@@ -7,6 +7,22 @@ out in commit messages and here.
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.19.0] - 2026-07-13
11
+
12
+ ### Added
13
+
14
+ - Rebuilt Agent Studio as a packaged Svelte 5, TypeScript, Vite, and Tailwind CSS application with
15
+ responsive profile, run-control, approval, live-config, change-review, and request-preview
16
+ surfaces. Released wheels and source distributions carry the compiled UI and require no Node.js
17
+ runtime.
18
+ - Added explicit Studio pause, resume, and failed-turn retry BFF controls plus a versioned,
19
+ runtime-resolved `ModelRequest` preview payload.
20
+
21
+ ### Changed
22
+
23
+ - Moved Studio frontend authoring dependencies into `studio-ui/` and added a deterministic CI build
24
+ check that keeps the committed Python-package assets synchronized with the Svelte source.
25
+
10
26
  ## [0.18.0] - 2026-07-12
11
27
 
12
28
  - Added an experimental optional DBOS Reference activation-recovery profile. Its finite,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: monoid-agent-kernel
3
- Version: 0.18.0
3
+ Version: 0.19.0
4
4
  Summary: Lightweight durable agent kernel for product integrations
5
5
  Project-URL: Homepage, https://github.com/hoonseokyoon/monoid-agent-kernel
6
6
  Project-URL: Repository, https://github.com/hoonseokyoon/monoid-agent-kernel
@@ -75,18 +75,19 @@ then follow the [Documentation map](#documentation) to the path for your role.
75
75
 
76
76
  The bundled **Agent Studio** reference app (`monoid studio serve`) drives the kernel
77
77
  through its Python API behind a single-page UI. A profile chooses the model, reasoning
78
- level, prompt instructions, and tool surface; each profile keeps its own chat history.
78
+ level, prompt instructions, and capability surface; each profile keeps its own chat history.
79
79
 
80
- ![Agent Studio: a Visual Analyst profile reads sales data, writes insights, and generates an annotated revenue chart](https://raw.githubusercontent.com/hoonseokyoon/monoid-agent-kernel/main/docs/img/studio-v016-main.png)
80
+ ![Agent Studio: a Visual Analyst reads sales data, pauses for approval, and previews an annotated revenue chart](https://raw.githubusercontent.com/hoonseokyoon/monoid-agent-kernel/main/docs/img/studio-v019-main.jpg)
81
81
 
82
- *A real Studio run: the agent reads `sales.csv`, writes `INSIGHTS.md`, generates an
83
- annotated `revenue_trend.svg`, and previews the artifact directly in the workspace panel.*
82
+ *A real Studio run: the agent reads `sales.csv`, pauses for human approval, and stages
83
+ `INSIGHTS.md` and `revenue_trend.svg` for file-by-file review. The user applies the approved
84
+ files through Studio and previews the chart directly in the workspace panel.*
84
85
 
85
- ![Agent Studio profile builder showing the exact system prompt and tool schema preview](https://raw.githubusercontent.com/hoonseokyoon/monoid-agent-kernel/main/docs/img/studio-v016-profile-builder.png)
86
+ ![Agent Profile Builder with capability controls and the exact ModelRequest preview](https://raw.githubusercontent.com/hoonseokyoon/monoid-agent-kernel/main/docs/img/studio-v019-profile-builder.jpg)
86
87
 
87
- *The profile editor shows the exact first-turn model request boundary: system prompt,
88
- tool schemas, model settings, and preview notes. Users can edit the profile on the left
89
- and see what the model will receive on the right.*
88
+ *The Profile Builder places model, reasoning, and capability controls beside the
89
+ backend-resolved first-turn `ModelRequest`: system prompt, exact tool schemas, model
90
+ settings, and boundary notes.*
90
91
 
91
92
  ## Architecture: Contract / Conformance Test / Core Helper Kit / Reference
92
93
 
@@ -119,6 +120,10 @@ For the dynamic binding-based tool surface, see
119
120
  pip install monoid-agent-kernel
120
121
  ```
121
122
 
123
+ The Studio UI ships as precompiled static assets. Running Studio does not install or require
124
+ Node.js, Svelte, Vite, or Tailwind CSS; those tools are confined to frontend development and the
125
+ release build.
126
+
122
127
  The default install runs Studio with complete one-shot gateway turns. Add the async HTTP extra
123
128
  to render live token deltas in Studio:
124
129
 
@@ -24,18 +24,19 @@ then follow the [Documentation map](#documentation) to the path for your role.
24
24
 
25
25
  The bundled **Agent Studio** reference app (`monoid studio serve`) drives the kernel
26
26
  through its Python API behind a single-page UI. A profile chooses the model, reasoning
27
- level, prompt instructions, and tool surface; each profile keeps its own chat history.
27
+ level, prompt instructions, and capability surface; each profile keeps its own chat history.
28
28
 
29
- ![Agent Studio: a Visual Analyst profile reads sales data, writes insights, and generates an annotated revenue chart](https://raw.githubusercontent.com/hoonseokyoon/monoid-agent-kernel/main/docs/img/studio-v016-main.png)
29
+ ![Agent Studio: a Visual Analyst reads sales data, pauses for approval, and previews an annotated revenue chart](https://raw.githubusercontent.com/hoonseokyoon/monoid-agent-kernel/main/docs/img/studio-v019-main.jpg)
30
30
 
31
- *A real Studio run: the agent reads `sales.csv`, writes `INSIGHTS.md`, generates an
32
- annotated `revenue_trend.svg`, and previews the artifact directly in the workspace panel.*
31
+ *A real Studio run: the agent reads `sales.csv`, pauses for human approval, and stages
32
+ `INSIGHTS.md` and `revenue_trend.svg` for file-by-file review. The user applies the approved
33
+ files through Studio and previews the chart directly in the workspace panel.*
33
34
 
34
- ![Agent Studio profile builder showing the exact system prompt and tool schema preview](https://raw.githubusercontent.com/hoonseokyoon/monoid-agent-kernel/main/docs/img/studio-v016-profile-builder.png)
35
+ ![Agent Profile Builder with capability controls and the exact ModelRequest preview](https://raw.githubusercontent.com/hoonseokyoon/monoid-agent-kernel/main/docs/img/studio-v019-profile-builder.jpg)
35
36
 
36
- *The profile editor shows the exact first-turn model request boundary: system prompt,
37
- tool schemas, model settings, and preview notes. Users can edit the profile on the left
38
- and see what the model will receive on the right.*
37
+ *The Profile Builder places model, reasoning, and capability controls beside the
38
+ backend-resolved first-turn `ModelRequest`: system prompt, exact tool schemas, model
39
+ settings, and boundary notes.*
39
40
 
40
41
  ## Architecture: Contract / Conformance Test / Core Helper Kit / Reference
41
42
 
@@ -68,6 +69,10 @@ For the dynamic binding-based tool surface, see
68
69
  pip install monoid-agent-kernel
69
70
  ```
70
71
 
72
+ The Studio UI ships as precompiled static assets. Running Studio does not install or require
73
+ Node.js, Svelte, Vite, or Tailwind CSS; those tools are confined to frontend development and the
74
+ release build.
75
+
71
76
  The default install runs Studio with complete one-shot gateway turns. Add the async HTTP extra
72
77
  to render live token deltas in Studio:
73
78
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "monoid-agent-kernel"
7
- version = "0.18.0"
7
+ version = "0.19.0"
8
8
  description = "Lightweight durable agent kernel for product integrations"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -96,8 +96,10 @@ exclude = ["**/DX_NOTES.md"]
96
96
  force-include = { "src/monoid_agent_kernel/py.typed" = "monoid_agent_kernel/py.typed", "src/native_agent_runner/py.typed" = "native_agent_runner/py.typed" }
97
97
 
98
98
  [tool.hatch.build.targets.sdist]
99
- # Keep internal journals and workspace-local release scratch data out of source distributions.
100
- exclude = ["**/DX_NOTES.md", "/.tmp"]
99
+ # Keep internal journals, workspace-local release scratch data, and the Node-only Studio authoring
100
+ # project out of source distributions. The compiled Studio assets live under the Python package and
101
+ # remain available to wheel/sdist users without Node.js.
102
+ exclude = ["**/DX_NOTES.md", "/.tmp", "/studio-ui"]
101
103
 
102
104
  [tool.pytest.ini_options]
103
105
  testpaths = ["tests"]
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  from importlib.metadata import PackageNotFoundError, version
4
4
 
5
5
  PACKAGE_NAME = "monoid-agent-kernel"
6
- FALLBACK_VERSION = "0.18.0"
6
+ FALLBACK_VERSION = "0.19.0"
7
7
 
8
8
 
9
9
  def package_version() -> str:
@@ -3495,8 +3495,7 @@ class AgentLoop:
3495
3495
  turn_id: str | None = None,
3496
3496
  parent_id: str | None = None,
3497
3497
  ) -> None:
3498
- diff_text = context.workspace.diff_patch()
3499
- diff_path = recorder.write_diff(diff_text)
3498
+ diff_text, diff_path, proposal_payload = recorder.write_proposal_revision(context.workspace)
3500
3499
  recorder.emit(
3501
3500
  "workspace.diff.updated",
3502
3501
  turn_id=turn_id,
@@ -3504,10 +3503,12 @@ class AgentLoop:
3504
3503
  data={
3505
3504
  "path": str(diff_path.relative_to(recorder.run_dir)),
3506
3505
  "bytes": len(diff_text.encode("utf-8")),
3507
- "changed_paths": [public_path(path, self.permission_policy) for path in context.workspace.changed_paths()],
3506
+ "changed_paths": [
3507
+ public_path(path, self.permission_policy)
3508
+ for path in context.workspace.changed_paths()
3509
+ ],
3508
3510
  },
3509
3511
  )
3510
- proposal_payload = recorder.write_proposal_snapshot(context.workspace, diff_path)
3511
3512
  recorder.emit(
3512
3513
  "workspace.proposal.updated",
3513
3514
  turn_id=turn_id,
@@ -477,8 +477,7 @@ class LoopFinalizer:
477
477
  recorder = res.recorder
478
478
  workspace = res.workspace
479
479
  context.job_manager.cancel_all()
480
- diff_path = recorder.write_diff(workspace.diff_patch())
481
- proposal_payload = recorder.write_proposal_snapshot(workspace, diff_path)
480
+ _diff_text, diff_path, proposal_payload = recorder.write_proposal_revision(workspace)
482
481
  metrics = self.build_metrics(state, res)
483
482
  recorder.write_metrics(metrics)
484
483
  recorder.emit(
@@ -535,8 +534,7 @@ class LoopFinalizer:
535
534
  loop = self._loop
536
535
  recorder = res.recorder
537
536
  workspace = res.workspace
538
- diff_path = recorder.write_diff(workspace.diff_patch())
539
- proposal_payload = recorder.write_proposal_snapshot(workspace, diff_path)
537
+ _diff_text, diff_path, proposal_payload = recorder.write_proposal_revision(workspace)
540
538
  metrics = self.build_metrics(state, res)
541
539
  recorder.write_metrics(metrics)
542
540
  recorder.emit(
@@ -3,7 +3,10 @@ from __future__ import annotations
3
3
  import json
4
4
  import logging
5
5
  import sys
6
+ import threading
6
7
  import time
8
+ from collections.abc import Iterator
9
+ from contextlib import contextmanager
7
10
  from dataclasses import dataclass, field
8
11
  from pathlib import Path
9
12
  from typing import TYPE_CHECKING, Any, TextIO
@@ -19,6 +22,24 @@ if TYPE_CHECKING:
19
22
  from monoid_agent_kernel.core.workspace import ChangedEntry, Workspace
20
23
 
21
24
  _LOGGER = logging.getLogger("monoid_agent_kernel.recorder")
25
+ _PROPOSAL_LOCKS_GUARD = threading.Lock()
26
+ _PROPOSAL_LOCKS: dict[str, threading.RLock] = {}
27
+
28
+
29
+ @contextmanager
30
+ def proposal_snapshot_lock(run_dir: Path) -> Iterator[None]:
31
+ """Serialize one run's proposal snapshot writes and live-directory consumers.
32
+
33
+ Proposal files form one logical revision even though they occupy several paths. The reference
34
+ backend and Studio use this same in-process lock while reading, exporting, approving, or
35
+ applying them, so no consumer can observe the writer between ``diff.patch`` and the final
36
+ atomic ``proposal.json`` replace.
37
+ """
38
+ key = str(run_dir.resolve())
39
+ with _PROPOSAL_LOCKS_GUARD:
40
+ lock = _PROPOSAL_LOCKS.setdefault(key, threading.RLock())
41
+ with lock:
42
+ yield
22
43
 
23
44
 
24
45
  @dataclass
@@ -255,6 +276,14 @@ class AgentRecorder:
255
276
  diff_path.write_text(diff_text, encoding="utf-8")
256
277
  return diff_path
257
278
 
279
+ def write_proposal_revision(self, workspace: Workspace) -> tuple[str, Path, dict[str, Any]]:
280
+ """Persist one internally consistent diff and proposal snapshot revision."""
281
+ with proposal_snapshot_lock(self.run_dir):
282
+ diff_text = workspace.diff_patch()
283
+ diff_path = self.write_diff(diff_text)
284
+ proposal_payload = self.write_proposal_snapshot(workspace, diff_path)
285
+ return diff_text, diff_path, proposal_payload
286
+
258
287
  def write_manifest(self, manifest: RunManifest) -> Path:
259
288
  manifest_path = self.run_dir / "manifest.json"
260
289
  write_json_atomic(manifest_path, manifest.to_json())
@@ -1,5 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import hashlib
3
4
  import re
4
5
  from collections.abc import Callable
5
6
  from dataclasses import dataclass
@@ -16,6 +17,7 @@ from monoid_agent_kernel.core.packages import (
16
17
  )
17
18
  from monoid_agent_kernel.core.proposal_file import ProposalFileError, read_proposal_file_payload
18
19
  from monoid_agent_kernel.errors import PermissionDenied
20
+ from monoid_agent_kernel.recorder import proposal_snapshot_lock
19
21
  from monoid_agent_kernel.reference.backend.ports import RunRecordPort
20
22
  from monoid_agent_kernel.reference.backend.proposal_reader import read_proposal_snapshot
21
23
  from monoid_agent_kernel.reference.backend.run_state import (
@@ -44,7 +46,8 @@ class ProposalService:
44
46
  def proposal(self, run_id: str, token: str) -> dict[str, Any]:
45
47
  self._context.authorize_run(run_id, token)
46
48
  record = self._context.record(run_id)
47
- payload = read_proposal_snapshot(record)
49
+ with proposal_snapshot_lock(record.run_dir):
50
+ payload = read_proposal_snapshot(record)
48
51
  if payload is None:
49
52
  return {
50
53
  "run_id": record.run_id,
@@ -65,23 +68,31 @@ class ProposalService:
65
68
  self._context.authorize_run(run_id, token)
66
69
  record = self._context.record(run_id)
67
70
  diff_path = record.run_dir / "diff.patch"
68
- diff = diff_path.read_text(encoding="utf-8") if diff_path.exists() else ""
69
- return {"run_id": run_id, "ready": diff_path.exists(), "diff": diff}
71
+ with proposal_snapshot_lock(record.run_dir):
72
+ ready = diff_path.exists()
73
+ data = diff_path.read_bytes() if ready else b""
74
+ return {
75
+ "run_id": run_id,
76
+ "ready": ready,
77
+ "diff": data.decode("utf-8"),
78
+ "diff_sha256": hashlib.sha256(data).hexdigest(),
79
+ }
70
80
 
71
81
  def proposal_file(self, run_id: str, token: str, path: str) -> dict[str, Any]:
72
82
  self._context.authorize_run(run_id, token)
73
83
  record = self._context.record(run_id)
74
- proposal = read_proposal_snapshot(record)
75
- if proposal is None:
76
- raise ValueError("proposal snapshot is not ready")
77
- try:
78
- file_payload = read_proposal_file_payload(record.run_dir, proposal, path)
79
- except ProposalFileError as exc:
80
- if exc.reason in {"not_found", "snapshot_missing"}:
81
- raise KeyError(str(exc)) from exc
82
- if exc.reason == "escapes_run_dir":
83
- raise PermissionDenied(str(exc)) from exc
84
- raise ValueError(str(exc)) from exc
84
+ with proposal_snapshot_lock(record.run_dir):
85
+ proposal = read_proposal_snapshot(record)
86
+ if proposal is None:
87
+ raise ValueError("proposal snapshot is not ready")
88
+ try:
89
+ file_payload = read_proposal_file_payload(record.run_dir, proposal, path)
90
+ except ProposalFileError as exc:
91
+ if exc.reason in {"not_found", "snapshot_missing"}:
92
+ raise KeyError(str(exc)) from exc
93
+ if exc.reason == "escapes_run_dir":
94
+ raise PermissionDenied(str(exc)) from exc
95
+ raise ValueError(str(exc)) from exc
85
96
  return {
86
97
  "run_id": record.run_id,
87
98
  "tenant_id": record.tenant_id,
@@ -93,8 +104,9 @@ class ProposalService:
93
104
  self._context.authorize_run(run_id, token)
94
105
  record = self._context.record(run_id)
95
106
  output = record.run_dir / "proposal.tar"
96
- payload = export_package(record.run_dir, output)
97
- tar_bytes = output.read_bytes()
107
+ with proposal_snapshot_lock(record.run_dir):
108
+ payload = export_package(record.run_dir, output)
109
+ tar_bytes = output.read_bytes()
98
110
  checkpoint_store = self._checkpoint_store()
99
111
  digest = checkpoint_store.put_blob(run_id, tar_bytes)
100
112
  self._context.emit_backend_event(
@@ -141,13 +153,14 @@ class ProposalService:
141
153
  ) -> dict[str, Any]:
142
154
  self._context.authorize_run(run_id, token)
143
155
  record = self._context.record(run_id)
144
- approval = create_approval(
145
- record.run_dir,
146
- approver_id=approver_id,
147
- approved_paths=approved_paths or None,
148
- note=note,
149
- )
150
- write_approval(record.run_dir / "approval.json", approval)
156
+ with proposal_snapshot_lock(record.run_dir):
157
+ approval = create_approval(
158
+ record.run_dir,
159
+ approver_id=approver_id,
160
+ approved_paths=approved_paths or None,
161
+ note=note,
162
+ )
163
+ write_approval(record.run_dir / "approval.json", approval)
151
164
  self._context.emit_backend_event(
152
165
  run_id,
153
166
  "proposal.approved",
@@ -165,13 +178,14 @@ class ProposalService:
165
178
  ) -> dict[str, Any]:
166
179
  self._context.authorize_run(run_id, token)
167
180
  record = self._context.record(run_id)
168
- approval = create_approval(
169
- record.run_dir,
170
- approver_id=approver_id,
171
- decision="rejected",
172
- note=reason,
173
- )
174
- write_approval(record.run_dir / "approval.json", approval)
181
+ with proposal_snapshot_lock(record.run_dir):
182
+ approval = create_approval(
183
+ record.run_dir,
184
+ approver_id=approver_id,
185
+ decision="rejected",
186
+ note=reason,
187
+ )
188
+ write_approval(record.run_dir / "approval.json", approval)
175
189
  self._context.emit_backend_event(
176
190
  run_id,
177
191
  "proposal.rejected",
@@ -197,8 +211,9 @@ class ProposalService:
197
211
  raise PermissionDenied(f"apply target is outside allowed roots: {target}")
198
212
  record = self._context.record(run_id)
199
213
  approval = approval_path or (record.run_dir / "approval.json")
200
- result = apply_package(record.run_dir, approval=approval, target=target, dry_run=dry_run)
201
- write_apply_result(record.run_dir / "apply-result.json", result)
214
+ with proposal_snapshot_lock(record.run_dir):
215
+ result = apply_package(record.run_dir, approval=approval, target=target, dry_run=dry_run)
216
+ write_apply_result(record.run_dir / "apply-result.json", result)
202
217
  event_type = "proposal.conflict" if result.status == "conflict" else "proposal.applied"
203
218
  self._context.emit_backend_event(
204
219
  run_id,
@@ -22,7 +22,11 @@ from monoid_agent_kernel.core.durable_metadata import (
22
22
  DurableMetadataCommitter,
23
23
  validate_recovery_metadata,
24
24
  )
25
- from monoid_agent_kernel.core.result import AgentRunResult, Suspension
25
+ from monoid_agent_kernel.core.result import (
26
+ AgentRunResult,
27
+ Suspension,
28
+ suspension_from_checkpoint_payload,
29
+ )
26
30
  from monoid_agent_kernel.identifiers import namespaced_id
27
31
  from monoid_agent_kernel.reference.backend.ports import (
28
32
  DriveOpenSessionPort,
@@ -209,15 +213,24 @@ class RecoveryService:
209
213
  record.seen_inbox_ids = set(checkpoint.inbox_seen_ids)
210
214
  for message in checkpoint.queued_messages:
211
215
  self._context.call_soon(record.message_queue.put_nowait, message)
212
- self._context.spawn(self.run_recovered(run_id, request, loop))
216
+ restored_suspension = (
217
+ suspension_from_checkpoint_payload(checkpoint.last_suspension)
218
+ if checkpoint.last_suspension is not None
219
+ else Suspension(reason="settled", status="completed")
220
+ )
221
+ self._context.spawn(self.run_recovered(run_id, request, loop, restored_suspension))
213
222
 
214
- async def run_recovered(self, run_id: str, request: RunRequestPort, loop: LoopPort) -> None:
223
+ async def run_recovered(
224
+ self,
225
+ run_id: str,
226
+ request: RunRequestPort,
227
+ loop: LoopPort,
228
+ suspension: Suspension,
229
+ ) -> None:
215
230
  await self._context.acquire_run_slot()
216
231
  try:
217
232
  if loop.has_pending_tasks():
218
233
  suspension = Suspension(reason="awaiting_tasks", status="running", has_external=True)
219
- else:
220
- suspension = Suspension(reason="settled", status="completed")
221
234
  record = self._context.record(run_id)
222
235
  result = await self._context.drive_open_session(
223
236
  record,
@@ -22,6 +22,33 @@ monoid studio accept # deterministic offline acceptance check, emits JSO
22
22
  Run `studio doctor` first if anything looks off — it turns late, cryptic setup failures into an
23
23
  upfront pass/fail checklist with remediation.
24
24
 
25
+ ## Frontend development
26
+
27
+ Studio's browser UI is a Svelte 5 + TypeScript application under `studio-ui/`. Tailwind CSS v4
28
+ maps the semantic Studio tokens to utilities. Node.js is needed only when authoring or rebuilding
29
+ the UI; released Python packages include the compiled assets.
30
+
31
+ ```bash
32
+ # terminal 1: BFF and agent runtime
33
+ monoid studio serve --port 8799
34
+
35
+ # terminal 2: Vite dev server with /api proxied to Studio
36
+ cd studio-ui
37
+ npm ci
38
+ npm run dev
39
+ ```
40
+
41
+ Before committing frontend changes, rebuild the packaged assets and run the Svelte checks:
42
+
43
+ ```bash
44
+ cd studio-ui
45
+ npm run check
46
+ npm run build
47
+ ```
48
+
49
+ The build writes to `src/monoid_agent_kernel/reference/studio/web/dist/`. Commit that directory so
50
+ wheel and sdist users can run Studio without Node.js.
51
+
25
52
  ### Flags & defaults
26
53
 
27
54
  | Flag | Default | Meaning |
@@ -59,6 +86,19 @@ at another file, or `--no-env-file` to rely only on the process environment.
59
86
  files, jobs, proposed changes, and file previews. Trace shows the live event tree. Live Config
60
87
  exposes model, reasoning, OTel, and capability toggles.
61
88
 
89
+ ## Review flow
90
+
91
+ Write-capable profiles stage workspace changes as a proposal. Studio presents human approval,
92
+ per-file review decisions, package export, and apply as separate workflow steps.
93
+
94
+ ![Review Changes with two approved files and a proposed SVG preview](../../../../docs/img/studio-v019-review-changes.jpg)
95
+
96
+ *Review Changes previews files from the proposal snapshot before apply. Each file can be approved or
97
+ excluded independently; **Apply approved** writes only the approved paths into the workspace.*
98
+
99
+ **Export package** builds a digest-addressed TAR from the complete current proposal. Per-file review
100
+ decisions control apply and do not filter the exported package.
101
+
62
102
  Profile state is lightweight Studio metadata. The `studio-profiles.json` sidecar under the run root
63
103
  stores custom profile presets and maps run ids to profile ids so scoped history survives a restart.
64
104
  Profiles are Studio-owned presets; the kernel contract stays unchanged.
@@ -73,9 +73,15 @@ def run_acceptance(
73
73
  base_url = server.start()
74
74
  check("healthz", _http_json(f"{base_url}/healthz").get("ok") is True)
75
75
  index_html = _http_text(f"{base_url}/")
76
- check("index-static-hooks", "data-testid=\"studio-shell\"" in index_html)
76
+ check(
77
+ "index-static-shell",
78
+ '<div id="app"></div>' in index_html and "/assets/" in index_html,
79
+ )
77
80
  settings_html = _http_text(f"{base_url}/settings")
78
- check("settings-static-hooks", "data-testid=\"settings-popup\"" in settings_html)
81
+ check(
82
+ "settings-static-shell",
83
+ '<div id="app"></div>' in settings_html and "/assets/" in settings_html,
84
+ )
79
85
  cfg = _http_json(f"{base_url}/api/config")
80
86
  check("config-route", cfg.get("offline") is True and cfg.get("provider") == "offline")
81
87
  settings = _http_json(f"{base_url}/api/settings")
@@ -103,7 +109,8 @@ def run_acceptance(
103
109
  if settled:
104
110
  final_text = str((settled[-1].get("data") or {}).get("final_text") or "")
105
111
  state = str(server.run_status(run_id).get("state") or "")
106
- break
112
+ if state != "running":
113
+ break
107
114
  time.sleep(0.1)
108
115
  check("deterministic-chat", bool(final_text), final_text[:120])
109
116
  transcript = _http_json(f"{base_url}/api/chat-transcript?run_id={quote(run_id)}") if run_id else {}