apsimo 1.3.4__tar.gz → 1.4.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 (1006) hide show
  1. {apsimo-1.3.4 → apsimo-1.4.0}/PKG-INFO +2 -2
  2. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/api/routers/host.py +59 -8
  3. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contacts/comms.py +101 -31
  4. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/server.py +2 -1
  5. apsimo-1.4.0/apsimo/turns/tool_observations.py +87 -0
  6. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo.egg-info/PKG-INFO +2 -2
  7. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo.egg-info/SOURCES.txt +3 -0
  8. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo.egg-info/requires.txt +1 -1
  9. {apsimo-1.3.4 → apsimo-1.4.0}/pyproject.toml +2 -2
  10. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_colony_memory_provider.py +23 -0
  11. apsimo-1.4.0/tests/test_comms_source_erasure.py +241 -0
  12. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_hermes_general_governance.py +1 -0
  13. apsimo-1.4.0/tests/test_native_tool_observations.py +391 -0
  14. {apsimo-1.3.4 → apsimo-1.4.0}/LICENSE +0 -0
  15. {apsimo-1.3.4 → apsimo-1.4.0}/README.md +0 -0
  16. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/__init__.py +0 -0
  17. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/__main__.py +0 -0
  18. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/agent/__init__.py +0 -0
  19. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/agent/client.py +0 -0
  20. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/agent/models.py +0 -0
  21. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/agents/__init__.py +0 -0
  22. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/agents/models.py +0 -0
  23. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/agents/store.py +0 -0
  24. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/agents/websocket.py +0 -0
  25. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/api/__init__.py +0 -0
  26. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/api/auth_telemetry.py +0 -0
  27. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/api/authority.py +0 -0
  28. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/api/contact_grants.py +0 -0
  29. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/api/middleware.py +0 -0
  30. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/api/routers/__init__.py +0 -0
  31. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/api/routers/commitment_work.py +0 -0
  32. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/api/routers/context_gate.py +0 -0
  33. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/api/routers/executions.py +0 -0
  34. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/api/routers/followup_plans.py +0 -0
  35. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/api/routers/governed_actions.py +0 -0
  36. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/api/routers/initiative_work.py +0 -0
  37. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/api/routers/mining.py +0 -0
  38. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/api/routers/observations.py +0 -0
  39. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/api/routers/social_state.py +0 -0
  40. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/api/routers/task_queue.py +0 -0
  41. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/api/routers/temporal_followups.py +0 -0
  42. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/api/routers/transport.py +0 -0
  43. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/api/routers/transport_ingress_api.py +0 -0
  44. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/api/schemas/__init__.py +0 -0
  45. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/api/schemas/host.py +0 -0
  46. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/autonomy/cli.py +0 -0
  47. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/autonomy/condition_worker.py +0 -0
  48. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/autonomy/config.py +0 -0
  49. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/autonomy/loop.py +0 -0
  50. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/autonomy/registry.py +0 -0
  51. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/autonomy/scheduler.py +0 -0
  52. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/autonomy/synthesis.py +0 -0
  53. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/backup.py +0 -0
  54. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/beliefs/__init__.py +0 -0
  55. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/beliefs/contradictions.py +0 -0
  56. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/beliefs/decay.py +0 -0
  57. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/beliefs/engine.py +0 -0
  58. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/beliefs/models.py +0 -0
  59. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/beliefs/promotion.py +0 -0
  60. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/beliefs/resolve.py +0 -0
  61. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/beliefs/source_claims.py +0 -0
  62. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/beliefs/source_projection.py +0 -0
  63. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/beliefs/source_time.py +0 -0
  64. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/beliefs/store.py +0 -0
  65. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/briefings/aggregators.py +0 -0
  66. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/briefings/composer.py +0 -0
  67. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/briefings/config.py +0 -0
  68. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/briefings/delivery.py +0 -0
  69. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/briefings/engagement.py +0 -0
  70. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/briefings/engine.py +0 -0
  71. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/briefings/enhancer.py +0 -0
  72. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/briefings/models.py +0 -0
  73. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/briefings/scheduler.py +0 -0
  74. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/briefings/store.py +0 -0
  75. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/chain/__init__.py +0 -0
  76. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/chain/block.py +0 -0
  77. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/chain/cli.py +0 -0
  78. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/chain/genesis.py +0 -0
  79. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/chain/identity.py +0 -0
  80. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/chain/keys.py +0 -0
  81. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/chain/local_keys.py +0 -0
  82. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/chain/manager.py +0 -0
  83. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/chain/node.py +0 -0
  84. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/chain/plugin_transactions.py +0 -0
  85. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/chain/protocol.py +0 -0
  86. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/chain/state_machine.py +0 -0
  87. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/chain/storage.py +0 -0
  88. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/chain/transactions.py +0 -0
  89. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/chain/validation.py +0 -0
  90. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/channels/__init__.py +0 -0
  91. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/channels/manifest.py +0 -0
  92. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/channels/migrations/001_channels_schema.sql +0 -0
  93. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/channels/phone_gateways.py +0 -0
  94. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/channels/presence.py +0 -0
  95. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/channels/router.py +0 -0
  96. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/channels/store.py +0 -0
  97. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/cli.py +0 -0
  98. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/cognition/__init__.py +0 -0
  99. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/cognition/charter.py +0 -0
  100. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/cognition/drive_governance.py +0 -0
  101. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/cognition/evidence_pipeline.py +0 -0
  102. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/cognition/external_events.py +0 -0
  103. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/cognition/goal_spine.py +0 -0
  104. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/cognition/introspection.py +0 -0
  105. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/cognition/prompt.py +0 -0
  106. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/cognition/runtime.py +0 -0
  107. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/cognition/trigger.py +0 -0
  108. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/commitments/__init__.py +0 -0
  109. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/commitments/local_work.py +0 -0
  110. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/commitments/store.py +0 -0
  111. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/commitments/work.py +0 -0
  112. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/compat.py +0 -0
  113. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/compression/__init__.py +0 -0
  114. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/connectors/__init__.py +0 -0
  115. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/connectors/base.py +0 -0
  116. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/connectors/caldav_calendar.py +0 -0
  117. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/connectors/fs_documents.py +0 -0
  118. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/connectors/imap_email.py +0 -0
  119. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/connectors/manager.py +0 -0
  120. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/connectors/webhook_pull.py +0 -0
  121. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contacts/__init__.py +0 -0
  122. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contacts/config.py +0 -0
  123. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contacts/exporters/__init__.py +0 -0
  124. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contacts/exporters/vcard.py +0 -0
  125. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contacts/identity_links.py +0 -0
  126. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contacts/importer.py +0 -0
  127. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contacts/importers/__init__.py +0 -0
  128. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contacts/importers/batch.py +0 -0
  129. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contacts/importers/macos_contacts.py +0 -0
  130. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contacts/migrations/001_contacts_schema.sql +0 -0
  131. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contacts/migrations/002_trust_scopes.sql +0 -0
  132. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contacts/migrations/003_open_gateway_enum.sql +0 -0
  133. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contacts/migrations/004_contact_provision_operations.sql +0 -0
  134. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contacts/migrations/005_identity_links.sql +0 -0
  135. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contacts/models.py +0 -0
  136. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contacts/scoring.py +0 -0
  137. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contacts/store.py +0 -0
  138. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contacts/transport_ingress.py +0 -0
  139. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contacts/world_bridge.py +0 -0
  140. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contextgate/__init__.py +0 -0
  141. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contextgate/chunker.py +0 -0
  142. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contextgate/estimate.py +0 -0
  143. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contextgate/gate.py +0 -0
  144. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contextgate/retrieve.py +0 -0
  145. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/delivery/__init__.py +0 -0
  146. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/delivery/bridge.py +0 -0
  147. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/delivery/channels.py +0 -0
  148. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/delivery/classification.py +0 -0
  149. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/delivery/rate_limiter.py +0 -0
  150. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/delivery/reachout_policy.py +0 -0
  151. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/directed/__init__.py +0 -0
  152. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/directed/audit.py +0 -0
  153. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/directed/intake.py +0 -0
  154. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/directed/models.py +0 -0
  155. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/directed/service.py +0 -0
  156. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/directives/__init__.py +0 -0
  157. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/directives/evidence.py +0 -0
  158. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/directives/extractor.py +0 -0
  159. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/directives/guard.py +0 -0
  160. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/directives/models.py +0 -0
  161. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/directives/service.py +0 -0
  162. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/directives/store.py +0 -0
  163. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/doctor.py +0 -0
  164. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/environment.py +0 -0
  165. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/events/__init__.py +0 -0
  166. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/events/broadcaster.py +0 -0
  167. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/events/bus.py +0 -0
  168. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/events/journal.py +0 -0
  169. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/events/stream.py +0 -0
  170. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/events/types.py +0 -0
  171. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/execution_results.py +0 -0
  172. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/feedback/__init__.py +0 -0
  173. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/feedback/store.py +0 -0
  174. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/feeds/__init__.py +0 -0
  175. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/feeds/cli.py +0 -0
  176. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/feeds/engine.py +0 -0
  177. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/feeds/example-feed.yaml +0 -0
  178. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/feeds/hermes_cron.py +0 -0
  179. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/feeds/manager.py +0 -0
  180. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/feeds/spec.py +0 -0
  181. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/feeds/template.py +0 -0
  182. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/__init__.py +0 -0
  183. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/audit.py +0 -0
  184. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/communication_policy.py +0 -0
  185. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/config.py +0 -0
  186. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/context_provenance.py +0 -0
  187. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/env_risk.py +0 -0
  188. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/guard_audit.py +0 -0
  189. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/layers/__init__.py +0 -0
  190. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/layers/base.py +0 -0
  191. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/layers/l1_recipient.py +0 -0
  192. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/layers/l2_pii.py +0 -0
  193. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/layers/l3_cross_context.py +0 -0
  194. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/layers/l4_trust_tier.py +0 -0
  195. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/layers/l5_injection.py +0 -0
  196. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/layers/l6_review.py +0 -0
  197. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/layers/l7_delay.py +0 -0
  198. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/layers/tom2_epistemic.py +0 -0
  199. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/models.py +0 -0
  200. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/pending_dispatch.py +0 -0
  201. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/pipeline.py +0 -0
  202. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/rejection.py +0 -0
  203. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/response_guard.py +0 -0
  204. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/rulesets/injection_v1.yaml +0 -0
  205. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/surface_policy.py +0 -0
  206. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/taint.py +0 -0
  207. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/genesis.json +0 -0
  208. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/goals/__init__.py +0 -0
  209. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/goals/config.py +0 -0
  210. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/goals/decomposer.py +0 -0
  211. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/goals/engine.py +0 -0
  212. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/goals/inference.py +0 -0
  213. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/goals/models.py +0 -0
  214. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/goals/priority.py +0 -0
  215. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/goals/queue_bridge.py +0 -0
  216. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/goals/replan.py +0 -0
  217. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/goals/schema.sql +0 -0
  218. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/goals/store.py +0 -0
  219. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/governed_actions.py +0 -0
  220. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/harness_integration/__init__.py +0 -0
  221. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/harness_integration/context.py +0 -0
  222. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/harness_integration/skills.py +0 -0
  223. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/identity/__init__.py +0 -0
  224. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/identity/participants.py +0 -0
  225. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/identity/resolver.py +0 -0
  226. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/identity_bootstrap/__init__.py +0 -0
  227. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/identity_bootstrap/builder.py +0 -0
  228. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/identity_bootstrap/corpus.py +0 -0
  229. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/identity_bootstrap/models.py +0 -0
  230. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/identity_bootstrap/runner.py +0 -0
  231. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/identity_bootstrap/seeders/__init__.py +0 -0
  232. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/identity_bootstrap/seeders/briefings.py +0 -0
  233. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/identity_bootstrap/seeders/chain.py +0 -0
  234. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/identity_bootstrap/seeders/goals.py +0 -0
  235. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/identity_bootstrap/seeders/memory.py +0 -0
  236. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/identity_bootstrap/seeders/neo4j_cognition.py +0 -0
  237. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/identity_bootstrap/seeders/relationship.py +0 -0
  238. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/identity_bootstrap/seeders/sessions.py +0 -0
  239. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/identity_bootstrap/seeders/skills.py +0 -0
  240. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/identity_bootstrap/seeders/task_queue.py +0 -0
  241. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/identity_bootstrap/seeders/world_model.py +0 -0
  242. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/identity_bootstrap/self_query.py +0 -0
  243. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/identity_bootstrap/self_reflection.py +0 -0
  244. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/identity_bootstrap/skill.py +0 -0
  245. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/identity_bootstrap/verifier.py +0 -0
  246. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/initiatives/__init__.py +0 -0
  247. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/initiatives/action_registry.py +0 -0
  248. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/initiatives/approval_authority.py +0 -0
  249. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/initiatives/approval_policy.py +0 -0
  250. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/initiatives/assignment.py +0 -0
  251. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/initiatives/backup_evidence.py +0 -0
  252. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/initiatives/context_freshness.py +0 -0
  253. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/initiatives/models.py +0 -0
  254. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/initiatives/native_work.py +0 -0
  255. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/initiatives/standing_approvals.py +0 -0
  256. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/initiatives/store.py +0 -0
  257. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/initiatives/temporal_followup.py +0 -0
  258. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/__init__.py +0 -0
  259. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/cognition/__init__.py +0 -0
  260. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/cognition/gap_detector.py +0 -0
  261. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/cognition/metalearner.py +0 -0
  262. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/cognition/metrics_collector.py +0 -0
  263. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/cognition/performance_index.py +0 -0
  264. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/cognition/registry.py +0 -0
  265. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/cognition/strategy_adjuster.py +0 -0
  266. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/cognition/types.py +0 -0
  267. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/components/__init__.py +0 -0
  268. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/components/anomaly_detector.py +0 -0
  269. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/components/initiative_engine.py +0 -0
  270. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/components/preference_learner.py +0 -0
  271. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/components/research_orchestrator.py +0 -0
  272. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/components/self_directed_thinker.py +0 -0
  273. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/components/self_reflector.py +0 -0
  274. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/components/session_continuity.py +0 -0
  275. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/components/task_planner.py +0 -0
  276. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/components/tool_learner.py +0 -0
  277. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/graph/__init__.py +0 -0
  278. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/graph/client.py +0 -0
  279. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/graph/consolidator.py +0 -0
  280. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/graph/distiller.py +0 -0
  281. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/graph/migrations.py +0 -0
  282. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/graph/queries.py +0 -0
  283. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/graph/recall.py +0 -0
  284. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/graph/reconciler.py +0 -0
  285. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/graph/schema.py +0 -0
  286. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/graph/selection.py +0 -0
  287. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/learning/__init__.py +0 -0
  288. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/learning/continuous_learner.py +0 -0
  289. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/learning/feedback_store.py +0 -0
  290. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/mind_model/__init__.py +0 -0
  291. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/mind_model/graph_baseline.py +0 -0
  292. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/mind_model/signal_collector.py +0 -0
  293. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/relationships/__init__.py +0 -0
  294. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/relationships/profiler.py +0 -0
  295. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/relationships/scorer.py +0 -0
  296. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/relationships/signal_floor.py +0 -0
  297. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/relationships/trust_tiers.py +0 -0
  298. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/synthesis/__init__.py +0 -0
  299. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/synthesis/connection_discoverer.py +0 -0
  300. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/synthesis/cross_domain_analyzer.py +0 -0
  301. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/synthesis/insight_deliverer.py +0 -0
  302. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/synthesis/insight_store.py +0 -0
  303. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/synthesis/insight_validator.py +0 -0
  304. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/synthesis/novelty_scorer.py +0 -0
  305. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/turn_middleware/__init__.py +0 -0
  306. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/turn_middleware/memory_sync.py +0 -0
  307. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/mcp/__init__.py +0 -0
  308. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/mcp/__main__.py +0 -0
  309. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/mcp/config.py +0 -0
  310. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/mcp/server.py +0 -0
  311. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/migrations.py +0 -0
  312. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/mining/__init__.py +0 -0
  313. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/mining/corpus.py +0 -0
  314. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/mining/escalations.py +0 -0
  315. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/mining/models.py +0 -0
  316. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/mining/store.py +0 -0
  317. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/models/__init__.py +0 -0
  318. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/models/memory.py +0 -0
  319. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/models/mesh.py +0 -0
  320. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/models/person.py +0 -0
  321. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/models/signal.py +0 -0
  322. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/observations/__init__.py +0 -0
  323. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/observations/store.py +0 -0
  324. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/patterns/__init__.py +0 -0
  325. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/patterns/extract.py +0 -0
  326. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/patterns/store.py +0 -0
  327. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/persona/__init__.py +0 -0
  328. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/persona/engine.py +0 -0
  329. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/persona/manifest.py +0 -0
  330. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/projects/__init__.py +0 -0
  331. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/projects/engine.py +0 -0
  332. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/projects/event_outbox.py +0 -0
  333. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/projects/models.py +0 -0
  334. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/projects/planner.py +0 -0
  335. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/projects/store.py +0 -0
  336. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/proposals/__init__.py +0 -0
  337. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/proposals/engine.py +0 -0
  338. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/proposals/models.py +0 -0
  339. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/qualification/__init__.py +0 -0
  340. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/qualification/cases.py +0 -0
  341. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/qualification/cli.py +0 -0
  342. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/qualification/memory_cases.py +0 -0
  343. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/qualification/records.py +0 -0
  344. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/qualification/report.py +0 -0
  345. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/qualification/runner.py +0 -0
  346. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/qualification/structured_cases.py +0 -0
  347. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/reasoning/__init__.py +0 -0
  348. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/reasoning/executor.py +0 -0
  349. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/reasoning/loop.py +0 -0
  350. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/reasoning/native_tools/__init__.py +0 -0
  351. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/reasoning/native_tools/calculate.py +0 -0
  352. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/reasoning/native_tools/file_ops.py +0 -0
  353. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/reasoning/native_tools/web_search.py +0 -0
  354. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/reasoning/tool_policy.py +0 -0
  355. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/redact/__init__.py +0 -0
  356. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/repos/__init__.py +0 -0
  357. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/repos/mirrors.py +0 -0
  358. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/research/__init__.py +0 -0
  359. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/research/artifact.py +0 -0
  360. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/research/gatherer.py +0 -0
  361. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/research/pipeline.py +0 -0
  362. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/research/search/__init__.py +0 -0
  363. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/research/search/base.py +0 -0
  364. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/research/search/brave.py +0 -0
  365. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/research/search/cache.py +0 -0
  366. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/research/search/duckduckgo.py +0 -0
  367. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/research/search/orchestrator.py +0 -0
  368. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/research/search/serpapi.py +0 -0
  369. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/research/search/tavily.py +0 -0
  370. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/research/synthesizer.py +0 -0
  371. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/router/__init__.py +0 -0
  372. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/router/complexity_scorer.py +0 -0
  373. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/router/endpoints.py +0 -0
  374. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/router/fallback.py +0 -0
  375. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/router/functions.py +0 -0
  376. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/router/native_policy.py +0 -0
  377. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/router/router.py +0 -0
  378. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/router/self_learning.py +0 -0
  379. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/router/tiers.py +0 -0
  380. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/sandbox/__init__.py +0 -0
  381. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/sandbox/backend.py +0 -0
  382. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/sandbox/manager.py +0 -0
  383. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/scope_bounds.py +0 -0
  384. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/secrets/__init__.py +0 -0
  385. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/secrets/backends/__init__.py +0 -0
  386. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/secrets/backends/base.py +0 -0
  387. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/secrets/backends/env.py +0 -0
  388. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/secrets/backends/keyring.py +0 -0
  389. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/secrets/backends/onepassword.py +0 -0
  390. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/secrets/cli.py +0 -0
  391. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/secrets/manager.py +0 -0
  392. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/secrets/migration.py +0 -0
  393. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/secrets/types.py +0 -0
  394. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/seed.py +0 -0
  395. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/__init__.py +0 -0
  396. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/appraisals.py +0 -0
  397. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/benchmark.py +0 -0
  398. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/brief.py +0 -0
  399. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/event_concerns.py +0 -0
  400. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/execution_forecasts.py +0 -0
  401. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/expectations.py +0 -0
  402. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/experiments.py +0 -0
  403. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/journal.py +0 -0
  404. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/judgments.py +0 -0
  405. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/native_outcomes.py +0 -0
  406. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/params.py +0 -0
  407. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/perspective.py +0 -0
  408. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/reconcile.py +0 -0
  409. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/reply_forecasts.py +0 -0
  410. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/runtime_forecasts.py +0 -0
  411. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/runtime_models.py +0 -0
  412. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/settlement.py +0 -0
  413. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/situation.py +0 -0
  414. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/store.py +0 -0
  415. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/supervised.py +0 -0
  416. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/thinker.py +0 -0
  417. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/trust.py +0 -0
  418. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/workspace.py +0 -0
  419. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/services/__init__.py +0 -0
  420. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/services/agent_bridge.py +0 -0
  421. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/services/initiative_executor.py +0 -0
  422. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/services/instance.py +0 -0
  423. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/sessions/__init__.py +0 -0
  424. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/sessions/config.py +0 -0
  425. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/sessions/context_loader.py +0 -0
  426. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/sessions/federation_session.py +0 -0
  427. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/sessions/isolated_session.py +0 -0
  428. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/sessions/reports.py +0 -0
  429. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/sessions/store.py +0 -0
  430. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/setup.py +0 -0
  431. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/setup_hermes.py +0 -0
  432. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/setup_local_work.py +0 -0
  433. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/setup_native_goals.py +0 -0
  434. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/setup_native_reviews.py +0 -0
  435. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/__init__.py +0 -0
  436. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/base.py +0 -0
  437. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/budget.py +0 -0
  438. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/executor.py +0 -0
  439. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/executors/__init__.py +0 -0
  440. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/executors/behavioral_correction.py +0 -0
  441. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/executors/capability_gap.py +0 -0
  442. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/executors/data_quality.py +0 -0
  443. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/executors/knowledge_acquisition.py +0 -0
  444. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/executors/operational_hygiene.py +0 -0
  445. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/executors/subsystem_health.py +0 -0
  446. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/hermes_export.py +0 -0
  447. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/index.py +0 -0
  448. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/learning/__init__.py +0 -0
  449. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/learning/novelty_detector.py +0 -0
  450. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/learning/pattern_extractor.py +0 -0
  451. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/learning/triggers.py +0 -0
  452. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/loader.py +0 -0
  453. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/migrations/002_progressive_loading.sql +0 -0
  454. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/migrations/backfill_triggers.py +0 -0
  455. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/models.py +0 -0
  456. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/packager.py +0 -0
  457. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/protocols.py +0 -0
  458. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/registry.py +0 -0
  459. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/runtime.py +0 -0
  460. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/sandbox_runner.py +0 -0
  461. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/scheduler.py +0 -0
  462. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/schema.py +0 -0
  463. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/security/__init__.py +0 -0
  464. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/security/guards.py +0 -0
  465. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/security/scanner.py +0 -0
  466. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills_memory/__init__.py +0 -0
  467. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills_memory/distill.py +0 -0
  468. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills_memory/models.py +0 -0
  469. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills_memory/retrieve.py +0 -0
  470. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills_memory/store.py +0 -0
  471. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/surprise/__init__.py +0 -0
  472. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/surprise/accumulation.py +0 -0
  473. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/surprise/scorer.py +0 -0
  474. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/surprise/store.py +0 -0
  475. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/task_queue/__init__.py +0 -0
  476. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/task_queue/action_receipts.py +0 -0
  477. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/task_queue/approval_relay_canary.py +0 -0
  478. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/task_queue/config.py +0 -0
  479. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/task_queue/contract.py +0 -0
  480. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/task_queue/events.py +0 -0
  481. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/task_queue/governor.py +0 -0
  482. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/task_queue/handlers/__init__.py +0 -0
  483. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/task_queue/handlers/base.py +0 -0
  484. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/task_queue/handlers/inference.py +0 -0
  485. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/task_queue/handlers/monitoring.py +0 -0
  486. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/task_queue/handlers/registry.py +0 -0
  487. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/task_queue/handlers/subtask_handler.py +0 -0
  488. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/task_queue/handlers/system_maintenance.py +0 -0
  489. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/task_queue/mesh_integration.py +0 -0
  490. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/task_queue/models.py +0 -0
  491. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/task_queue/queue_manager.py +0 -0
  492. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/task_queue/routing.py +0 -0
  493. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/task_queue/scheduler.py +0 -0
  494. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/task_queue/schema.sql +0 -0
  495. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/task_queue/work_control.py +0 -0
  496. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/task_queue/worker.py +0 -0
  497. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/telemetry.py +0 -0
  498. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/tom/__init__.py +0 -0
  499. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/tom/affect.py +0 -0
  500. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/tom/approvals.py +0 -0
  501. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/tom/arcs.py +0 -0
  502. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/tom/asymmetry.py +0 -0
  503. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/tom/eligibility.py +0 -0
  504. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/tom/engagement.py +0 -0
  505. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/tom/exposure.py +0 -0
  506. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/tom/extractor.py +0 -0
  507. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/tom/fact_adapters.py +0 -0
  508. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/tom/facts.py +0 -0
  509. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/tom/integration.py +0 -0
  510. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/tom/leveled.py +0 -0
  511. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/tom/levels.py +0 -0
  512. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/tom/recipient_audit.py +0 -0
  513. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/tom/recipient_simulator.py +0 -0
  514. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/tom/source_lineage.py +0 -0
  515. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/tom/tom2.py +0 -0
  516. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/tom/visibility.py +0 -0
  517. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/tom/visibility_store.py +0 -0
  518. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/tools/__init__.py +0 -0
  519. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/tools/definitions.py +0 -0
  520. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/tools/handlers.py +0 -0
  521. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/toolsmith/__init__.py +0 -0
  522. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/toolsmith/authority.py +0 -0
  523. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/toolsmith/engine.py +0 -0
  524. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/toolsmith/integrity.py +0 -0
  525. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/toolsmith/miner.py +0 -0
  526. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/toolsmith/policy.py +0 -0
  527. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/toolsmith/registry.py +0 -0
  528. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/turns/__init__.py +0 -0
  529. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/turns/audio.py +0 -0
  530. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/turns/documents.py +0 -0
  531. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/turns/executions.py +0 -0
  532. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/turns/hermes_history.py +0 -0
  533. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/turns/hermes_kanban.py +0 -0
  534. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/turns/hermes_work.py +0 -0
  535. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/turns/history_references.py +0 -0
  536. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/turns/idempotency.py +0 -0
  537. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/turns/local_work.py +0 -0
  538. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/turns/media.py +0 -0
  539. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/turns/reported_workers.py +0 -0
  540. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/turns/source_annotations.py +0 -0
  541. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/turns/source_attribution.py +0 -0
  542. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/turns/source_read.py +0 -0
  543. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/turns/source_vectors.py +0 -0
  544. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/turns/video.py +0 -0
  545. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/util/autonomy_preset.py +0 -0
  546. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/util/instance.py +0 -0
  547. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/util/model_output.py +0 -0
  548. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/util/quiet_hours.py +0 -0
  549. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/util/session_safety.py +0 -0
  550. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/util/temporal.py +0 -0
  551. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/vector/__init__.py +0 -0
  552. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/vector/backfill.py +0 -0
  553. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/vector/caption.py +0 -0
  554. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/vector/collections.py +0 -0
  555. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/vector/config.py +0 -0
  556. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/vector/embedder.py +0 -0
  557. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/vector/image_preprocess.py +0 -0
  558. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/vector/image_store.py +0 -0
  559. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/vector/indexes.py +0 -0
  560. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/vector/migrate.py +0 -0
  561. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/vector/multimodal_provider.py +0 -0
  562. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/vector/multimodal_types.py +0 -0
  563. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/vector/openai_provider.py +0 -0
  564. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/vector/query.py +0 -0
  565. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/vector/reranker.py +0 -0
  566. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/vector/safety_image.py +0 -0
  567. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/vector/scanner.py +0 -0
  568. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/vector/setup.py +0 -0
  569. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/vector/store.py +0 -0
  570. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/vector/tiers.py +0 -0
  571. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/work_orders.py +0 -0
  572. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/workers/__init__.py +0 -0
  573. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/workers/agent_bridge.py +0 -0
  574. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/workers/colony_worker.py +0 -0
  575. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/workers/queue_worker.py +0 -0
  576. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/workers/skills_sync.py +0 -0
  577. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/__init__.py +0 -0
  578. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/causal_maintenance.py +0 -0
  579. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/causal_policy.py +0 -0
  580. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/causal_query.py +0 -0
  581. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/confidence.py +0 -0
  582. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/config.py +0 -0
  583. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/constants.py +0 -0
  584. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/entities.py +0 -0
  585. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/expectation_resolvers.py +0 -0
  586. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/extraction/__init__.py +0 -0
  587. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/extraction/base.py +0 -0
  588. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/extraction/conversation_extractor.py +0 -0
  589. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/extraction/detector.py +0 -0
  590. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/extraction/document_extractor.py +0 -0
  591. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/extraction/formats/__init__.py +0 -0
  592. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/extraction/formats/csv_fmt.py +0 -0
  593. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/extraction/formats/html_fmt.py +0 -0
  594. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/extraction/formats/json_fmt.py +0 -0
  595. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/extraction/formats/pdf.py +0 -0
  596. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/extraction/formats/text.py +0 -0
  597. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/extraction/llm_extractor.py +0 -0
  598. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/extraction/pipeline.py +0 -0
  599. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/integrations/__init__.py +0 -0
  600. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/integrations/mind_model_bridge.py +0 -0
  601. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/integrations/social_intel_bridge.py +0 -0
  602. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/jobs/__init__.py +0 -0
  603. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/jobs/extraction_job.py +0 -0
  604. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/llm_extract.py +0 -0
  605. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/neo4j/__init__.py +0 -0
  606. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/neo4j/backend.py +0 -0
  607. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/observations.py +0 -0
  608. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/populator.py +0 -0
  609. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/postgres/__init__.py +0 -0
  610. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/postgres/backend.py +0 -0
  611. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/relationships.py +0 -0
  612. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/resolution/__init__.py +0 -0
  613. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/resolution/entity_resolver.py +0 -0
  614. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/resolution/merge_audit.py +0 -0
  615. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/resolution/merge_workflow.py +0 -0
  616. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/source_reports.py +0 -0
  617. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/sqlite/__init__.py +0 -0
  618. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/sqlite/backend.py +0 -0
  619. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/sqlite/schema.sql +0 -0
  620. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/store.py +0 -0
  621. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo.egg-info/dependency_links.txt +0 -0
  622. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo.egg-info/entry_points.txt +0 -0
  623. {apsimo-1.3.4 → apsimo-1.4.0}/apsimo.egg-info/top_level.txt +0 -0
  624. {apsimo-1.3.4 → apsimo-1.4.0}/colony_sidecar/__init__.py +0 -0
  625. {apsimo-1.3.4 → apsimo-1.4.0}/setup.cfg +0 -0
  626. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_accepted_local_work.py +0 -0
  627. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_adaptive_params.py +0 -0
  628. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_affect.py +0 -0
  629. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_agent_action_routing.py +0 -0
  630. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_agent_api.py +0 -0
  631. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_agent_bridge.py +0 -0
  632. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_agent_bridge_service.py +0 -0
  633. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_agent_sdk.py +0 -0
  634. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_agent_sensor_loop.py +0 -0
  635. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_agent_snapshot.py +0 -0
  636. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_agent_store.py +0 -0
  637. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_annotated_recall_reinforcement.py +0 -0
  638. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_answer_source_lineage.py +0 -0
  639. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_appraisal_incident_decisions.py +0 -0
  640. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_approval_gate.py +0 -0
  641. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_approval_relay_canary.py +0 -0
  642. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_apsimo_compat.py +0 -0
  643. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_apsimo_harness_guidance.py +0 -0
  644. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_assignment_engine.py +0 -0
  645. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_audit_cleanup.py +0 -0
  646. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_auth_coverage.py +0 -0
  647. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_auth_migration_readiness.py +0 -0
  648. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_authz_scope_api.py +0 -0
  649. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_autonomy_preset.py +0 -0
  650. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_backup.py +0 -0
  651. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_backup_receipt_evidence.py +0 -0
  652. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_beliefs.py +0 -0
  653. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_bind_auth_guard.py +0 -0
  654. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_boundary_fail_closed.py +0 -0
  655. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_bounded_approval_authority.py +0 -0
  656. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_briefing_aggregators.py +0 -0
  657. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_canonical_scoped_context.py +0 -0
  658. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_canonical_source_read.py +0 -0
  659. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_causal_extract.py +0 -0
  660. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_causal_falsifiability.py +0 -0
  661. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_causal_maintenance.py +0 -0
  662. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_causal_policy.py +0 -0
  663. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_causal_query.py +0 -0
  664. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_causal_query_only_guard.py +0 -0
  665. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_chain_keys.py +0 -0
  666. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_channel_preferences.py +0 -0
  667. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_channel_registry.py +0 -0
  668. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_channel_store.py +0 -0
  669. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_cognition.py +0 -0
  670. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_cognition_evidence_pipeline.py +0 -0
  671. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_cognition_evidence_server_wiring.py +0 -0
  672. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_cognition_goal_spine.py +0 -0
  673. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_cognition_observability.py +0 -0
  674. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_cognition_p4_controlled_learning.py +0 -0
  675. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_cognition_p4_server_integration.py +0 -0
  676. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_cognition_p6_p7_server_wiring.py +0 -0
  677. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_cognition_p7_drive_governance.py +0 -0
  678. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_cognition_phase_b_runtime.py +0 -0
  679. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_cognition_phase_c_scheduler.py +0 -0
  680. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_cognition_server_wiring.py +0 -0
  681. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_commitment_resolution.py +0 -0
  682. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_commitment_resolution_downgrade.py +0 -0
  683. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_commitment_resolution_schema.py +0 -0
  684. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_commitment_work.py +0 -0
  685. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_commitments.py +0 -0
  686. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_competence_reconciliation.py +0 -0
  687. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_compression.py +0 -0
  688. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_concern_resolution_receipts.py +0 -0
  689. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_condition_producer.py +0 -0
  690. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_connectors.py +0 -0
  691. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_contact_fact_recall.py +0 -0
  692. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_contact_policy_projection.py +0 -0
  693. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_contact_provisioning.py +0 -0
  694. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_contact_timezone.py +0 -0
  695. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_contacts_intro.py +0 -0
  696. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_contacts_persistence.py +0 -0
  697. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_context_gate.py +0 -0
  698. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_context_phase1.py +0 -0
  699. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_context_provenance.py +0 -0
  700. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_conversation_presence.py +0 -0
  701. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_conversation_turn_concerns.py +0 -0
  702. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_current_work_recall_selection.py +0 -0
  703. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_delivery_bridge_503.py +0 -0
  704. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_delivery_gateway_identity.py +0 -0
  705. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_delivery_reachout_routing.py +0 -0
  706. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_directed.py +0 -0
  707. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_directed_envelope.py +0 -0
  708. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_directed_reports.py +0 -0
  709. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_directed_trust.py +0 -0
  710. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_directive_sources.py +0 -0
  711. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_directives.py +0 -0
  712. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_distill.py +0 -0
  713. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_doctor.py +0 -0
  714. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_document_memory_guard.py +0 -0
  715. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_duckduckgo_provider.py +0 -0
  716. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_embedding_generations.py +0 -0
  717. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_enrolled_sender_turns.py +0 -0
  718. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_ensure_channel_id.py +0 -0
  719. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_env_risk.py +0 -0
  720. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_event_broadcasts.py +0 -0
  721. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_event_bus_types.py +0 -0
  722. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_event_concerns.py +0 -0
  723. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_event_stream_reliability.py +0 -0
  724. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_execution_forecasts.py +0 -0
  725. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_execution_input_purpose.py +0 -0
  726. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_execution_registry.py +0 -0
  727. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_expectations.py +0 -0
  728. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_expectations_v2.py +0 -0
  729. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_experiments.py +0 -0
  730. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_external_cognition_events.py +0 -0
  731. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_external_event_concerns.py +0 -0
  732. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_facts_backfill.py +0 -0
  733. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_feedback.py +0 -0
  734. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_followup_plans.py +0 -0
  735. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_forecast_learning.py +0 -0
  736. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_function_routing.py +0 -0
  737. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_gap_generators.py +0 -0
  738. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_genesis_manifest.py +0 -0
  739. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_global_pause.py +0 -0
  740. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_goal_dispatch_availability.py +0 -0
  741. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_goal_inference_provenance.py +0 -0
  742. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_goal_reader_imports.py +0 -0
  743. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_governed_actions.py +0 -0
  744. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_governed_research_handoff.py +0 -0
  745. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_graduated_approvals.py +0 -0
  746. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_grant_envelope.py +0 -0
  747. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_graph_reindex_metadata.py +0 -0
  748. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_guard_audit.py +0 -0
  749. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_guard_chat_mode.py +0 -0
  750. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_guard_derive_context.py +0 -0
  751. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_guard_enforce_policy.py +0 -0
  752. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_hermes_export.py +0 -0
  753. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_hermes_history_import.py +0 -0
  754. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_hermes_native_tool_authority.py +0 -0
  755. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_hermes_plugin_contract.py +0 -0
  756. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_hermes_plugin_event_lifecycle.py +0 -0
  757. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_hermes_plugin_event_replay.py +0 -0
  758. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_hermes_plugin_guard_shadow.py +0 -0
  759. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_hermes_plugin_signals.py +0 -0
  760. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_hermes_plugin_turn_id.py +0 -0
  761. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_hermes_queue_stats_projection.py +0 -0
  762. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_hermes_setup.py +0 -0
  763. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_hermes_turn_outbox.py +0 -0
  764. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_hermes_work_projection.py +0 -0
  765. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_host_input_provenance.py +0 -0
  766. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_hostworker_agreement.py +0 -0
  767. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_identity_continuity.py +0 -0
  768. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_identity_corrections.py +0 -0
  769. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_inference_context_gate.py +0 -0
  770. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_initiative_engine.py +0 -0
  771. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_initiative_evidence.py +0 -0
  772. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_initiative_executor.py +0 -0
  773. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_initiative_feedback.py +0 -0
  774. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_initiative_pipeline_v016.py +0 -0
  775. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_initiative_retry.py +0 -0
  776. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_initiative_store.py +0 -0
  777. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_input_source_lineage.py +0 -0
  778. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_insight_store.py +0 -0
  779. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_instance_service.py +0 -0
  780. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_instance_service_live.py +0 -0
  781. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_intelligence_components.py +0 -0
  782. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_intelligence_synthesis.py +0 -0
  783. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_introduction_initiatives.py +0 -0
  784. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_job_writeback.py +0 -0
  785. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_journal.py +0 -0
  786. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_legacy_fact_context.py +0 -0
  787. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_local_work_context.py +0 -0
  788. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_loop_stats_accuracy.py +0 -0
  789. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_mcp_config.py +0 -0
  790. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_mcp_server.py +0 -0
  791. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_media_read_reference_presentation.py +0 -0
  792. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_memory_decay.py +0 -0
  793. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_memory_formation.py +0 -0
  794. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_memory_governance.py +0 -0
  795. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_memory_promotion.py +0 -0
  796. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_memory_prune.py +0 -0
  797. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_memory_read_hydration.py +0 -0
  798. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_memory_response_schemas.py +0 -0
  799. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_migrations.py +0 -0
  800. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_mining.py +0 -0
  801. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_model_qualification_cli.py +0 -0
  802. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_model_qualification_memory.py +0 -0
  803. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_model_qualification_runner.py +0 -0
  804. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_model_qualification_structured.py +0 -0
  805. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_native_accepted_local_work.py +0 -0
  806. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_native_history_references.py +0 -0
  807. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_native_initiative_work.py +0 -0
  808. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_native_input_carrier.py +0 -0
  809. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_native_outcome_judgments.py +0 -0
  810. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_native_request_erasure.py +0 -0
  811. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_native_review_recurrence.py +0 -0
  812. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_native_setup.py +0 -0
  813. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_native_source_image_read.py +0 -0
  814. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_native_source_read.py +0 -0
  815. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_native_source_video_read.py +0 -0
  816. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_neo4j_backend.py +0 -0
  817. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_operator_deck_read_truth.py +0 -0
  818. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_ordinary_context_briefings.py +0 -0
  819. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_owner_preferences.py +0 -0
  820. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_p2_wirings.py +0 -0
  821. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_partial_work_rendering.py +0 -0
  822. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_patterns.py +0 -0
  823. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_pending_work_coverage.py +0 -0
  824. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_persona.py +0 -0
  825. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_persona_setup_result.py +0 -0
  826. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_phase_capability_check.py +0 -0
  827. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_preset_loop_coupling.py +0 -0
  828. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_procedure_source_context.py +0 -0
  829. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_project_event_outbox.py +0 -0
  830. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_project_result_reconciliation_phase.py +0 -0
  831. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_projects.py +0 -0
  832. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_prompt_evals.py +0 -0
  833. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_proposals.py +0 -0
  834. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_provenance_population.py +0 -0
  835. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_pseudo_agi_production_chain.py +0 -0
  836. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_queue_completed_filter.py +0 -0
  837. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_queue_contract.py +0 -0
  838. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_quiet_hours_and_reload.py +0 -0
  839. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_reachout_policy.py +0 -0
  840. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_recall_hybrid.py +0 -0
  841. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_recall_person_boost.py +0 -0
  842. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_recall_ranking.py +0 -0
  843. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_recall_request_repetition.py +0 -0
  844. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_recall_rerank.py +0 -0
  845. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_recall_source_presentation.py +0 -0
  846. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_recall_unified_context.py +0 -0
  847. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_recency.py +0 -0
  848. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_reflection_task_routing.py +0 -0
  849. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_rejection_loop.py +0 -0
  850. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_relationship_calendar_aggregators.py +0 -0
  851. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_relationship_score_refresh.py +0 -0
  852. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_relationship_signal_floor.py +0 -0
  853. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_relationships.py +0 -0
  854. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_reply_forecast_callback_order.py +0 -0
  855. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_reply_forecast_stops.py +0 -0
  856. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_reply_forecasts.py +0 -0
  857. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_repo_tools.py +0 -0
  858. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_reported_worker_status.py +0 -0
  859. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_request_capabilities.py +0 -0
  860. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_request_work_context.py +0 -0
  861. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_reranker_remote.py +0 -0
  862. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_research_orchestrator.py +0 -0
  863. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_resolve_messaging_handle.py +0 -0
  864. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_response_guard.py +0 -0
  865. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_response_guard_communication_policy.py +0 -0
  866. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_response_guard_endpoint.py +0 -0
  867. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_response_guard_surface_policy.py +0 -0
  868. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_router_tiers.py +0 -0
  869. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_runtime_model_observations.py +0 -0
  870. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_sandbox.py +0 -0
  871. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_scoped_api_authority.py +0 -0
  872. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_scoped_contact_resolution.py +0 -0
  873. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_secondary_review_contract.py +0 -0
  874. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_seed_retirement.py +0 -0
  875. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_selected_autonomy.py +0 -0
  876. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_self_directed_thinker.py +0 -0
  877. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_self_initiatives.py +0 -0
  878. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_self_judgment_opt_in.py +0 -0
  879. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_self_judgment_premises.py +0 -0
  880. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_self_judgments.py +0 -0
  881. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_self_model.py +0 -0
  882. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_self_perspective.py +0 -0
  883. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_selfhood_benchmark.py +0 -0
  884. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_session_reports.py +0 -0
  885. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_shared_facts.py +0 -0
  886. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_shared_local_undertaking.py +0 -0
  887. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_short_source_context.py +0 -0
  888. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_sidecar.py +0 -0
  889. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_signals_attribution.py +0 -0
  890. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_situation_spine.py +0 -0
  891. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_skill_approval.py +0 -0
  892. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_skill_attribution.py +0 -0
  893. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_skill_sandbox.py +0 -0
  894. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_skill_synthesis.py +0 -0
  895. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_skill_synthesis_wiring.py +0 -0
  896. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_skills_memory.py +0 -0
  897. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_social_context_flow.py +0 -0
  898. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_social_transport.py +0 -0
  899. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_annotation_claim_survivors.py +0 -0
  900. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_annotations.py +0 -0
  901. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_appraisals.py +0 -0
  902. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_attribution.py +0 -0
  903. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_audio.py +0 -0
  904. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_audio_claims.py +0 -0
  905. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_claim_budget.py +0 -0
  906. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_claim_diagnostics.py +0 -0
  907. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_claim_media_eligibility.py +0 -0
  908. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_claim_projection.py +0 -0
  909. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_claim_review.py +0 -0
  910. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_claim_subject_basis.py +0 -0
  911. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_document_read.py +0 -0
  912. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_documents.py +0 -0
  913. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_episode_admission.py +0 -0
  914. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_episode_memory.py +0 -0
  915. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_episode_revisions.py +0 -0
  916. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_event_precision.py +0 -0
  917. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_excerpt_lineage.py +0 -0
  918. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_image_read.py +0 -0
  919. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_media.py +0 -0
  920. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_memory_backup.py +0 -0
  921. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_time_query.py +0 -0
  922. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_vectors.py +0 -0
  923. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_video.py +0 -0
  924. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_sqlite_connection_ownership.py +0 -0
  925. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_supervised_rung.py +0 -0
  926. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_surprise.py +0 -0
  927. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_sweep_fixes.py +0 -0
  928. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_synthesis.py +0 -0
  929. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_telemetry_staleness.py +0 -0
  930. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_temporal.py +0 -0
  931. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_temporal_followups.py +0 -0
  932. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_temporal_index.py +0 -0
  933. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_test_environment_isolation.py +0 -0
  934. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_thinking_phase.py +0 -0
  935. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_thought_function_routing.py +0 -0
  936. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tick_phase_budget.py +0 -0
  937. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tier_endpoints.py +0 -0
  938. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_timeline.py +0 -0
  939. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom2_approvals.py +0 -0
  940. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom2_asymmetry.py +0 -0
  941. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom2_context.py +0 -0
  942. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom2_cross_gate.py +0 -0
  943. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom2_eligibility.py +0 -0
  944. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom2_epistemic_guard.py +0 -0
  945. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom2_exposure.py +0 -0
  946. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom2_kill_switch.py +0 -0
  947. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom2_level_coherence.py +0 -0
  948. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom2_leveled.py +0 -0
  949. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom2_levels.py +0 -0
  950. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom2_source_corrections.py +0 -0
  951. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom2_store.py +0 -0
  952. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom2_taint.py +0 -0
  953. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom2_wiring.py +0 -0
  954. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom_event_lineage.py +0 -0
  955. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom_extractor.py +0 -0
  956. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom_p8_arcs.py +0 -0
  957. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom_p8_boundary_corpus.py +0 -0
  958. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom_p8_fact_adapters.py +0 -0
  959. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom_p8_outbound_integration.py +0 -0
  960. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom_p8_recipient_audit.py +0 -0
  961. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom_p8_recipient_simulator.py +0 -0
  962. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom_p8_server_integration.py +0 -0
  963. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom_p8_visibility.py +0 -0
  964. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom_p8_visibility_store.py +0 -0
  965. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom_source_lineage.py +0 -0
  966. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tool_handlers_graph.py +0 -0
  967. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tool_observation_reader.py +0 -0
  968. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tool_provenance.py +0 -0
  969. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tool_surface.py +0 -0
  970. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_toolsmith.py +0 -0
  971. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_transport_ingress.py +0 -0
  972. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_transport_ingress_api.py +0 -0
  973. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_trust_configure.py +0 -0
  974. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_trust_scopes.py +0 -0
  975. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_trust_scopes_p2.py +0 -0
  976. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_turn_idempotency_ledger.py +0 -0
  977. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_turn_idempotency_v2.py +0 -0
  978. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_turn_ner_entities.py +0 -0
  979. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_turn_source_erasure.py +0 -0
  980. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_turn_source_evidence.py +0 -0
  981. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_turn_survivor_delivery.py +0 -0
  982. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_validation_sweep_fixes.py +0 -0
  983. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_vector_vacuum.py +0 -0
  984. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_wizard_autonomy.py +0 -0
  985. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_work_ancestry_projection.py +0 -0
  986. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_work_control_production_blockers.py +0 -0
  987. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_work_control_v1.py +0 -0
  988. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_work_orders.py +0 -0
  989. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_work_read_surface_authority.py +0 -0
  990. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_work_source_coverage.py +0 -0
  991. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_worker_handler_boundaries.py +0 -0
  992. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_worker_heartbeat_truth.py +0 -0
  993. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_worker_http_authority.py +0 -0
  994. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_worker_integration.py +0 -0
  995. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_worker_lifecycle_durability.py +0 -0
  996. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_workers_governor.py +0 -0
  997. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_workers_install.py +0 -0
  998. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_workspace.py +0 -0
  999. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_world_context_query.py +0 -0
  1000. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_world_entity_reinforcement.py +0 -0
  1001. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_world_llm_extract.py +0 -0
  1002. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_world_model_prune.py +0 -0
  1003. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_world_observations.py +0 -0
  1004. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_world_populator.py +0 -0
  1005. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_world_quality.py +0 -0
  1006. {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_world_supervised.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: apsimo
3
- Version: 1.3.4
3
+ Version: 1.4.0
4
4
  Summary: Persistent identity, memory and autonomy for AI agents
5
5
  License-Expression: MIT
6
6
  Requires-Python: >=3.11
@@ -28,7 +28,7 @@ Requires-Dist: pandas>=2.0; extra == "vectors"
28
28
  Requires-Dist: pyarrow>=15.0; extra == "vectors"
29
29
  Requires-Dist: lancedb>=0.10; extra == "vectors"
30
30
  Provides-Extra: hermes
31
- Requires-Dist: apsimo-hermes<2,>=1.3.4; extra == "hermes"
31
+ Requires-Dist: apsimo-hermes<2,>=1.4.0; extra == "hermes"
32
32
  Provides-Extra: mcp
33
33
  Requires-Dist: mcp[cli]<2,>=1.0; extra == "mcp"
34
34
  Provides-Extra: lancedb
@@ -32,7 +32,10 @@ from apsimo.api.authority import (
32
32
  resolve_turn_person,
33
33
  )
34
34
 
35
+ from apsimo.turns.tool_observations import ToolObservation
35
36
  from apsimo.api.schemas.host import (
37
+ HostIdentity,
38
+ HostTurnContext,
36
39
  HostConfigureRequest,
37
40
  HostConfigureResponse,
38
41
  ModelInfo,
@@ -3881,7 +3884,8 @@ async def forget_turn_sources(body: SourceForgetRequest, request: Request = None
3881
3884
  tom_cleanup[name + '_cleanup'] = 'complete'
3882
3885
  except Exception:
3883
3886
  logger.warning('source erasure %s cleanup is pending', name, exc_info=True)
3884
- vector_cleanup = 'unavailable'
3887
+ vector_cleanup = ('disabled_not_checked' if os.environ.get('COLONY_EMBED_PROVIDER') == 'skip'
3888
+ else 'unavailable')
3885
3889
  from apsimo.vector import get_store
3886
3890
  vector_store = get_store()
3887
3891
  if vector_store is not None and getattr(vector_store, 'catalog', None) is not None:
@@ -3891,7 +3895,8 @@ async def forget_turn_sources(body: SourceForgetRequest, request: Request = None
3891
3895
  vector_cleanup = 'complete'
3892
3896
  except Exception:
3893
3897
  logger.warning('source erasure vector generation cleanup is pending', exc_info=True)
3894
- graph_cleanup = "unavailable" if _graph is None else "pending"
3898
+ graph_cleanup = ('disabled_not_checked' if os.environ.get('COLONY_GRAPH_ENABLED', 'true').lower()
3899
+ in {'0', 'false', 'off'} else 'unavailable') if _graph is None else 'pending'
3895
3900
  if _graph is not None:
3896
3901
  try:
3897
3902
  await _graph.delete_source_memories(list(dict.fromkeys(result["source_ids"] + result["affected_source_ids"])))
@@ -3916,11 +3921,25 @@ async def forget_turn_sources(body: SourceForgetRequest, request: Request = None
3916
3921
  transport_cleanup = forget_sources(list(dict.fromkeys(result['source_ids'] + result['affected_source_ids'])))
3917
3922
  except Exception:
3918
3923
  logger.warning('Source erasure transport cleanup remains pending', exc_info=True)
3924
+ communications_cleanup, communications_unlinked_rows = 'unavailable', None
3925
+ if _comms_log is not None:
3926
+ communications_cleanup = 'pending'
3927
+ try:
3928
+ _comms_log.purge_erased_sources(list(dict.fromkeys(result['source_ids'] + result['affected_source_ids'])),
3929
+ contact_id=person)
3930
+ communications_unlinked_rows = _comms_log.unlinked_summary_count(person)
3931
+ communications_cleanup = 'complete'
3932
+ except Exception:
3933
+ logger.warning('Source erasure communication summary cleanup remains pending', exc_info=True)
3919
3934
  return {"source_erased": True, **result, "graph_cleanup": graph_cleanup,
3920
3935
  "shared_facts_cleanup": fact_cleanup, "vector_cleanup": vector_cleanup,
3921
3936
  "world_cleanup": world_cleanup, "transport_cleanup": transport_cleanup, **tom_cleanup,
3937
+ "communications_cleanup": communications_cleanup,
3938
+ "communications_scope": "source_linked_summaries_only",
3939
+ "communications_unlinked_rows": communications_unlinked_rows,
3922
3940
  "scope": "canonical_turn_sources_and_linked_projections",
3923
- "host_reconciliation": "pending_until_each_host_connects"}
3941
+ "host_reconciliation": "not_observed",
3942
+ "host_reconciliation_detail": "The erasure feed is available at this watermark; this response does not measure which hosts have applied it."}
3924
3943
 
3925
3944
 
3926
3945
  async def _resolve_scoped_sender_contact(authority, gateway: str, address: str):
@@ -4177,6 +4196,37 @@ async def task_instruction_sync(turn_id: str, body: TurnSyncRequest, response: R
4177
4196
  return await turns_sync_v2(turn_id, body, response, request)
4178
4197
 
4179
4198
 
4199
+ class ToolObservationEnvelope(BaseModel):
4200
+ model_config = ConfigDict(extra='forbid')
4201
+ identity: HostIdentity
4202
+ context: HostTurnContext
4203
+ observation: ToolObservation
4204
+
4205
+
4206
+ @v2_router.put('/turns/source-observation/{turn_id:path}', response_model=TurnSyncResponse)
4207
+ def source_observation_sync(turn_id: str, body: ToolObservationEnvelope, response: Response, request: Request):
4208
+ from apsimo.api.routers.executions import authorized_viewer
4209
+ from apsimo.turns import get_turn_idempotency_ledger
4210
+ from apsimo.turns.idempotency import SourceErased
4211
+ from apsimo.turns.tool_observations import record
4212
+ person, owner = authorized_viewer(request, body.context.contact_id, scope='turns:write')
4213
+ if not owner:
4214
+ raise HTTPException(403, detail='owner_observation_required')
4215
+ if body.context.turn_id != turn_id:
4216
+ raise HTTPException(422, detail='observation_identity_mismatch')
4217
+ try:
4218
+ created = record(get_turn_idempotency_ledger(get_state_dir()), body.observation,
4219
+ contact_id=person, session_id=body.context.session_id, source_id=turn_id)
4220
+ except SourceErased:
4221
+ return TurnSyncResponse(accepted=False, source_recorded=False, continuity_updated=False,
4222
+ skipped_reason='source_erased')
4223
+ except ValueError as exc:
4224
+ raise HTTPException(409, detail=str(exc)) from exc
4225
+ response.status_code = 201 if created else 200
4226
+ return TurnSyncResponse(accepted=True, source_recorded=True, continuity_updated=False,
4227
+ skipped_reason='tool_observation_only')
4228
+
4229
+
4180
4230
  @v2_router.put("/turns/{turn_id:path}", response_model=TurnSyncResponse)
4181
4231
  async def turns_sync_v2(
4182
4232
  turn_id: str,
@@ -4633,16 +4683,17 @@ async def _process_turn_sync(
4633
4683
  # Cross-channel communication ledger: record this exchange under the
4634
4684
  # CONVERSATION's channel (group vs DM vs voice provenance), never the
4635
4685
  # contact's primary-handle gateway (which collapsed everything to one
4636
- # channel). System turns are recorded too, for ops visibility; they
4637
- # are excluded from every relationship surface.
4686
+ # channel). New prose requires a canonical person source; transport
4687
+ # receipts retain their separate metadata-only ingestion path.
4638
4688
  try:
4639
- if _comms_log is not None and body.context.contact_id:
4689
+ if _comms_log is not None and body.context.contact_id and source_recorded:
4640
4690
  _ch = body.context.channel_id or "direct"
4641
4691
  _sess = body.context.session_id or ""
4692
+ _lineage, _ = _comms_log.source_input(source_id, body.context.contact_id)
4642
4693
  _comms_log.log(body.context.contact_id, channel=_ch,
4643
4694
  direction="in",
4644
4695
  summary=(body.summary or "")[:300],
4645
- session_id=_sess)
4696
+ session_id=_sess, source_lineage=_lineage)
4646
4697
  # Record the assistant's reply as an OUTBOUND exchange on the
4647
4698
  # SAME resolved contact + conversation channel. Without this
4648
4699
  # the ledger sees only half of every conversation, so
@@ -4653,7 +4704,7 @@ async def _process_turn_sync(
4653
4704
  if _asst.strip():
4654
4705
  _comms_log.log(body.context.contact_id, channel=_ch,
4655
4706
  direction="out",
4656
- summary=_asst[:300], session_id=_sess)
4707
+ summary=_asst[:300], session_id=_sess, source_lineage=_lineage)
4657
4708
  except Exception:
4658
4709
  logger.debug("comms ledger log failed", exc_info=True)
4659
4710
  except Exception:
@@ -14,8 +14,10 @@ import logging
14
14
  from pathlib import Path
15
15
  import sqlite3
16
16
  import uuid
17
+ from contextlib import closing
17
18
  from datetime import datetime, timezone
18
19
  from typing import Any, Dict, List, Optional
20
+ from apsimo.tom.source_lineage import SourceLinkedStore
19
21
 
20
22
  logger = logging.getLogger(__name__)
21
23
 
@@ -34,11 +36,12 @@ def _parse(ts: Optional[str]) -> Optional[datetime]:
34
36
  return None
35
37
 
36
38
 
37
- class CommsLog:
39
+ class CommsLog(SourceLinkedStore):
38
40
  """SQLite ledger of communications with each contact, across all channels."""
39
41
 
40
- def __init__(self, db_path: str) -> None:
42
+ def __init__(self, db_path: str, *, source_ledger=None) -> None:
41
43
  self._db_path = str(db_path)
44
+ self._source_ledger = source_ledger
42
45
  self._conn = sqlite3.connect(str(db_path))
43
46
  self._conn.row_factory = sqlite3.Row
44
47
  self._conn.execute("PRAGMA journal_mode=WAL")
@@ -64,6 +67,7 @@ class CommsLog:
64
67
  "reaction": "TEXT",
65
68
  "receipt_ref": "TEXT",
66
69
  "outbound_ref": "TEXT",
70
+ "source_lineage_json": "TEXT",
67
71
  }.items():
68
72
  if name not in existing:
69
73
  self._conn.execute(
@@ -71,10 +75,64 @@ class CommsLog:
71
75
  self._conn.execute(
72
76
  "CREATE INDEX IF NOT EXISTS idx_comms_reply_ref "
73
77
  "ON communications(contact_id,reply_to_ref,ts)")
78
+ self._conn.execute("""CREATE INDEX IF NOT EXISTS idx_comms_source_lineage
79
+ ON communications(contact_id,json_extract(source_lineage_json,'$.turn_id'))
80
+ WHERE source_lineage_json IS NOT NULL""")
74
81
  self._conn.commit()
75
82
  from .transport_ingress import ensure_schema
76
83
  ensure_schema(self._conn)
77
84
 
85
+ def _ledger(self):
86
+ # An offline copy can belong to another profile. Missing local source
87
+ # rows are not evidence that its linked communications were erased.
88
+ if self._source_ledger is None:
89
+ raise ValueError('communications_source_ledger_required')
90
+ return self._source_ledger
91
+
92
+ def _reconcile_erasure_ids(self, contact_id=None) -> None:
93
+ """Read existing tombstone IDs, not every original conversation body."""
94
+ where, params = (' AND contact_id=?', (contact_id,)) if contact_id else ('', ())
95
+ if self._conn.execute('SELECT 1 FROM communications WHERE source_lineage_json IS NOT NULL'
96
+ + where + ' LIMIT 1', params).fetchone() is None:
97
+ return
98
+ condition = ' WHERE e.contact_id=?' if contact_id else ''
99
+ with closing(self._ledger()._connect()) as conn:
100
+ erased = conn.execute('''SELECT e.contact_id,coalesce(r.source_turn_id,e.turn_id)
101
+ FROM source_erasures e LEFT JOIN source_erasure_revisions r USING(sequence)'''
102
+ + condition + ''' UNION SELECT e.contact_id,p.turn_id FROM source_erasures e
103
+ LEFT JOIN source_erasure_revisions r USING(sequence)
104
+ JOIN source_projection_erasures p ON p.source_turn_id=coalesce(r.source_turn_id,e.turn_id)'''
105
+ + condition, params + params).fetchall()
106
+ with self._conn:
107
+ self._conn.executemany('''DELETE FROM communications WHERE contact_id=?
108
+ AND source_lineage_json IS NOT NULL
109
+ AND json_extract(source_lineage_json,'$.turn_id')=?''', [tuple(row) for row in erased])
110
+
111
+ def _summary_rows(self, query, params, fields, *, contact_id=None):
112
+ self._reconcile_erasure_ids(contact_id)
113
+ rows = self._conn.execute(query, params).fetchall()
114
+ invalid = self._invalid_sources([row for row in rows if row['source_lineage_json'] is not None])
115
+ rejected = {row['id'] for row in invalid}
116
+ with self._conn:
117
+ self._conn.executemany('DELETE FROM communications WHERE id=?', [(key,) for key in rejected])
118
+ return [{key: row[key] for key in fields} for row in rows if row['id'] not in rejected]
119
+
120
+ def purge_erased_sources(self, turn_ids=None, *, contact_id=None) -> int:
121
+ sql = ('SELECT id,contact_id,source_lineage_json FROM communications '
122
+ 'WHERE source_lineage_json IS NOT NULL')
123
+ rows = self._conn.execute(sql + (' AND contact_id=?' if contact_id else ''),
124
+ (contact_id,) if contact_id else ()).fetchall()
125
+ invalid = self._invalid_sources(rows, turn_ids)
126
+ with self._conn:
127
+ self._conn.executemany('DELETE FROM communications WHERE id=?', [(row['id'],) for row in invalid])
128
+ return len(invalid)
129
+
130
+ def unlinked_summary_count(self, contact_id: str) -> int:
131
+ """Historical/unattributed prose cannot be erased by guessing its source."""
132
+ return self._conn.execute('''SELECT count(*) FROM communications WHERE contact_id=?
133
+ AND source_lineage_json IS NULL AND coalesce(summary,'')!=''
134
+ AND coalesce(receipt_ref,'')='' ''', (contact_id,)).fetchone()[0]
135
+
78
136
  def read_connection(self):
79
137
  """An independent read connection for projections running on a worker thread.
80
138
 
@@ -117,9 +175,12 @@ class CommsLog:
117
175
  summary: str = "", session_id: str = "",
118
176
  external_ref: str = "", reply_to_ref: str = "",
119
177
  reaction: str = "", receipt_ref: str = "",
120
- ts: Optional[str] = None) -> None:
178
+ ts: Optional[str] = None, source_lineage=None) -> None:
121
179
  if not contact_id or direction not in ("in", "out"):
122
180
  return
181
+ if source_lineage is not None and not self._source_visible(contact_id, source_lineage):
182
+ from apsimo.turns.idempotency import SourceErased
183
+ raise SourceErased('source_erased')
123
184
  normalized_reaction = (reaction or "").strip().lower()
124
185
  if normalized_reaction not in {
125
186
  "", "accepted", "acknowledged", "actioned", "negative",
@@ -128,39 +189,48 @@ class CommsLog:
128
189
  self._conn.execute(
129
190
  "INSERT INTO communications "
130
191
  "(id,contact_id,channel,direction,summary,session_id,ts,"
131
- "external_ref,reply_to_ref,reaction,receipt_ref) "
132
- "VALUES (?,?,?,?,?,?,?,?,?,?,?)",
192
+ "external_ref,reply_to_ref,reaction,receipt_ref,source_lineage_json) "
193
+ "VALUES (?,?,?,?,?,?,?,?,?,?,?,?)",
133
194
  (uuid.uuid4().hex, contact_id, channel or "unknown", direction,
134
195
  (summary or "")[:500], session_id or "", ts or _now().isoformat(),
135
196
  (external_ref or "")[:512] or None,
136
197
  (reply_to_ref or "")[:512] or None,
137
198
  normalized_reaction or None,
138
- (receipt_ref or "")[:512] or None),
199
+ (receipt_ref or "")[:512] or None,
200
+ json.dumps(source_lineage) if source_lineage is not None else None),
139
201
  )
140
202
  self._conn.commit()
203
+ # A source erasure can finish while this separate projection is written.
204
+ if source_lineage is not None and not self._source_visible(contact_id, source_lineage):
205
+ self.purge_erased_sources(contact_id=contact_id)
206
+ from apsimo.turns.idempotency import SourceErased
207
+ raise SourceErased('source_erased')
141
208
 
142
209
  def history(self, contact_id: str, limit: int = 15) -> List[Dict[str, Any]]:
143
- rows = self._conn.execute(
144
- "SELECT channel, direction, summary, ts FROM communications WHERE contact_id=?"
145
- " ORDER BY ts DESC LIMIT ?", (contact_id, limit)).fetchall()
146
- return [dict(r) for r in rows]
210
+ return self._summary_rows(
211
+ "SELECT id,contact_id,source_lineage_json,channel,direction,summary,ts "
212
+ "FROM communications WHERE contact_id=? ORDER BY ts DESC LIMIT ?",
213
+ (contact_id, limit), ('channel', 'direction', 'summary', 'ts'), contact_id=contact_id)
147
214
 
148
215
  def last_per_channel(self, contact_id: str) -> Dict[str, Dict[str, Any]]:
149
- rows = self._conn.execute(
150
- "SELECT channel, direction, summary, MAX(ts) AS ts FROM communications"
151
- " WHERE contact_id=? GROUP BY channel", (contact_id,)).fetchall()
216
+ rows = self._summary_rows(
217
+ "SELECT id,contact_id,source_lineage_json,channel,direction,summary,MAX(ts) AS ts "
218
+ "FROM communications WHERE contact_id=? GROUP BY channel", (contact_id,),
219
+ ('channel', 'direction', 'summary', 'ts'), contact_id=contact_id)
152
220
  return {r["channel"]: {"direction": r["direction"], "summary": r["summary"], "ts": r["ts"]}
153
221
  for r in rows}
154
222
 
155
223
  def last_outbound(self, contact_id: str) -> Optional[Dict[str, Any]]:
156
- r = self._conn.execute(
157
- "SELECT channel, summary, ts FROM communications WHERE contact_id=? AND direction='out'"
158
- " ORDER BY ts DESC LIMIT 1", (contact_id,)).fetchone()
159
- return dict(r) if r else None
224
+ rows = self._summary_rows(
225
+ "SELECT id,contact_id,source_lineage_json,channel,summary,ts "
226
+ "FROM communications WHERE contact_id=? AND direction='out' ORDER BY ts DESC LIMIT 1",
227
+ (contact_id,), ('channel', 'summary', 'ts'), contact_id=contact_id)
228
+ return rows[0] if rows else None
160
229
 
161
230
  def inbound_since(self, contact_id: str, since_iso: str) -> List[str]:
162
231
  """Timestamps of inbound rows from a contact since an ISO instant
163
232
  (selfhood benchmark: did the owner respond after a delivery)."""
233
+ self._reconcile_erasure_ids(contact_id)
164
234
  rows = self._conn.execute(
165
235
  "SELECT ts FROM communications WHERE contact_id=? AND"
166
236
  " direction='in' AND ts >= ? ORDER BY ts ASC LIMIT 5000",
@@ -176,19 +246,18 @@ class CommsLog:
176
246
  until_iso: str,
177
247
  ) -> List[Dict[str, Any]]:
178
248
  """Explicit inbound reactions tied to exact outbound references."""
179
-
180
249
  bounded = sorted({str(ref) for ref in refs if str(ref).strip()})[:5000]
181
250
  if not bounded:
182
251
  return []
183
252
  placeholders = ",".join("?" for _ in bounded)
184
- rows = self._conn.execute(
185
- "SELECT id,channel,summary,ts,external_ref,reply_to_ref,reaction,"
253
+ return self._summary_rows(
254
+ "SELECT id,contact_id,source_lineage_json,channel,summary,ts,external_ref,reply_to_ref,reaction,"
186
255
  "receipt_ref FROM communications WHERE contact_id=? "
187
256
  "AND direction='in' AND ts>=? AND ts<? AND reply_to_ref IN ("
188
257
  f"{placeholders}) AND reaction IS NOT NULL ORDER BY ts",
189
258
  [contact_id, since_iso, until_iso, *bounded],
190
- ).fetchall()
191
- return [dict(row) for row in rows]
259
+ ('id', 'channel', 'summary', 'ts', 'external_ref', 'reply_to_ref', 'reaction', 'receipt_ref'),
260
+ contact_id=contact_id)
192
261
 
193
262
  def match_reply(self, *, contact_id: str, outbound_ref: str, since_iso: str,
194
263
  until_iso: Optional[str] = None, connection=None) -> Dict[str, Any]:
@@ -226,19 +295,18 @@ class CommsLog:
226
295
  require_receipt: bool = False,
227
296
  ) -> List[Dict[str, Any]]:
228
297
  """One auditable outbound cohort for benchmark denominators."""
229
-
230
298
  query = (
231
- "SELECT id,channel,summary,ts,external_ref,receipt_ref "
299
+ "SELECT id,contact_id,source_lineage_json,channel,summary,ts,external_ref,receipt_ref "
232
300
  "FROM communications WHERE contact_id=? AND direction='out' "
233
301
  "AND ts>=? AND ts<?")
234
302
  if require_receipt:
235
303
  query += " AND receipt_ref IS NOT NULL AND receipt_ref!=''"
236
304
  query += " ORDER BY ts"
237
- rows = self._conn.execute(
238
- query, (contact_id, since_iso, until_iso)).fetchall()
239
- return [dict(row) for row in rows]
305
+ return self._summary_rows(query, (contact_id, since_iso, until_iso),
306
+ ('id', 'channel', 'summary', 'ts', 'external_ref', 'receipt_ref'), contact_id=contact_id)
240
307
 
241
308
  def counts(self, contact_id: str) -> Dict[str, Any]:
309
+ self._reconcile_erasure_ids(contact_id)
242
310
  r = self._conn.execute(
243
311
  "SELECT SUM(direction='in') AS inbound, SUM(direction='out') AS outbound,"
244
312
  " COUNT(DISTINCT channel) AS channels FROM communications WHERE contact_id=?",
@@ -251,6 +319,7 @@ class CommsLog:
251
319
  the consumer shifts into the contact's timezone). Feeds the
252
320
  relationship profiler's approach guidance (preferred channel,
253
321
  best time to reach)."""
322
+ self._reconcile_erasure_ids(contact_id)
254
323
  rows = self._conn.execute(
255
324
  "SELECT channel, ts FROM communications"
256
325
  " WHERE contact_id=? AND ts >= datetime('now', ?)",
@@ -270,14 +339,15 @@ class CommsLog:
270
339
  first. The per-contact reads above answer 'how do I stand with X';
271
340
  this answers 'what has been flowing lately' for an ops ledger view."""
272
341
  limit = max(1, min(500, int(limit)))
273
- rows = self._conn.execute(
274
- "SELECT contact_id, channel, direction, summary, ts FROM communications"
275
- " ORDER BY ts DESC LIMIT ?", (limit,)).fetchall()
276
- return [dict(r) for r in rows]
342
+ return self._summary_rows(
343
+ "SELECT id,contact_id,source_lineage_json,channel,direction,summary,ts "
344
+ "FROM communications ORDER BY ts DESC LIMIT ?", (limit,),
345
+ ('contact_id', 'channel', 'direction', 'summary', 'ts'))
277
346
 
278
347
  def rollup(self, *, since_days: int = 30) -> Dict[str, Dict[str, int]]:
279
348
  """Inbound/outbound counts per channel over a window: the ledger's
280
349
  flow summary. ``{channel: {"in": n, "out": n}}``."""
350
+ self._reconcile_erasure_ids()
281
351
  rows = self._conn.execute(
282
352
  "SELECT channel, direction, COUNT(*) AS n FROM communications"
283
353
  " WHERE ts >= datetime('now', ?) GROUP BY channel, direction",
@@ -2069,7 +2069,8 @@ async def lifespan(app: FastAPI):
2069
2069
  logger.info("EngagementStore initialized (db=%s)", engagement_db)
2070
2070
 
2071
2071
  from apsimo.contacts.comms import CommsLog
2072
- comms_log = CommsLog(db_path=state_dir / "colony-comms.db")
2072
+ comms_log = CommsLog(db_path=state_dir / "colony-comms.db", source_ledger=source_ledger)
2073
+ comms_log.purge_erased_sources()
2073
2074
  set_comms_log(comms_log)
2074
2075
  logger.info("CommsLog initialized")
2075
2076
 
@@ -0,0 +1,87 @@
1
+ """Explicit host-retained original tool evidence, using the canonical source ledger."""
2
+ from contextlib import closing
3
+ from datetime import datetime, timezone
4
+ import hashlib
5
+ import json
6
+
7
+ from pydantic import BaseModel, ConfigDict, Field, model_validator
8
+
9
+ VERSION = 'native-tool-observation-v1'
10
+ MAX_BYTES = 16384
11
+
12
+
13
+ class NativeToolIdentity(BaseModel):
14
+ model_config = ConfigDict(extra='forbid')
15
+ profile_id: str = Field(pattern='^[0-9a-f]{64}$')
16
+ session_id: str = Field(min_length=1, max_length=256)
17
+ task_id: str = Field(min_length=1, max_length=256)
18
+ turn_id: str = Field(min_length=1, max_length=256)
19
+ tool_call_id: str = Field(min_length=1, max_length=256)
20
+ api_request_id: str = Field(min_length=1, max_length=256)
21
+ tool_name: str = Field(min_length=1, max_length=128)
22
+ message_id: int = Field(gt=0)
23
+ timestamp: float = Field(gt=0, allow_inf_nan=False)
24
+ result_sha256: str = Field(pattern='^[0-9a-f]{64}$')
25
+
26
+
27
+ class ObservationSource(BaseModel):
28
+ model_config = ConfigDict(extra='forbid')
29
+ source_id: str = Field(min_length=1, max_length=256)
30
+ source_version: str = Field(pattern='^[0-9a-f]{64}$')
31
+
32
+
33
+ class ToolObservation(BaseModel):
34
+ model_config = ConfigDict(extra='forbid')
35
+ native: NativeToolIdentity
36
+ content: str = Field(min_length=1, max_length=MAX_BYTES)
37
+ reason: str = Field(min_length=1, max_length=512)
38
+ origin: ObservationSource
39
+ sources: list[ObservationSource] = Field(default_factory=list, max_length=256)
40
+
41
+ @model_validator(mode='after')
42
+ def exact_result(self):
43
+ if (not self.content.strip() or not self.reason.strip()
44
+ or len(self.content.encode()) > MAX_BYTES
45
+ or hashlib.sha256(self.content.encode()).hexdigest() != self.native.result_sha256):
46
+ raise ValueError('invalid_original_tool_result')
47
+ return self
48
+
49
+
50
+ def identity_id(native):
51
+ return 'native-observation:' + hashlib.sha256(json.dumps(native, sort_keys=True,
52
+ separators=(',', ':'), ensure_ascii=False).encode()).hexdigest()
53
+
54
+
55
+ def record(ledger, observation, *, contact_id, session_id, source_id):
56
+ """The authenticated host supplies provenance; the model supplies only nomination."""
57
+ native = observation.native.model_dump()
58
+ if native['session_id'] != session_id or source_id != identity_id(native):
59
+ raise ValueError('observation_identity_mismatch')
60
+ origin = observation.origin.model_dump()
61
+ # The direct current owner instruction is already captured by the host.
62
+ # Tool results and machine task wrappers cannot stand in for this origin.
63
+ with closing(ledger._connect()) as conn:
64
+ row = conn.execute('SELECT session_id,messages_json FROM turn_sources WHERE turn_id=? AND contact_id=?',
65
+ (origin['source_id'], contact_id)).fetchone()
66
+ from apsimo.turns.idempotency import canonical_turn_digest, SourceErased
67
+ if row is None:
68
+ if ledger.is_source_erased(origin['source_id'], contact_id):
69
+ raise SourceErased('observation_origin_erased')
70
+ raise ValueError('observation_origin_missing')
71
+ messages = json.loads(row['messages_json'])
72
+ if (row['session_id'] != session_id or len(messages) != 1 or messages[0].get('role') != 'user'
73
+ or canonical_turn_digest(messages) != origin['source_version']):
74
+ raise ValueError('observation_origin_mismatch')
75
+ refs = {}
76
+ for ref in [origin, *(s.model_dump() for s in observation.sources)]:
77
+ if ref['source_id'] in refs and refs[ref['source_id']] != ref:
78
+ raise ValueError('observation_source_revision_conflict')
79
+ refs[ref['source_id']] = ref
80
+ message = {'role': 'tool', 'content': observation.content, '_native_tool_observation': VERSION,
81
+ '_observation_sources': list(refs.values()),
82
+ 'provenance': {'kind': VERSION, 'native': native,
83
+ 'selection': {'author': 'model', 'reason': observation.reason}}}
84
+ created = ledger.record_source(source_id, contact_id=contact_id, session_id=session_id,
85
+ messages=[message], occurred_at=datetime.fromtimestamp(native['timestamp'], timezone.utc).isoformat(),
86
+ derive_claims=False)
87
+ return created
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: apsimo
3
- Version: 1.3.4
3
+ Version: 1.4.0
4
4
  Summary: Persistent identity, memory and autonomy for AI agents
5
5
  License-Expression: MIT
6
6
  Requires-Python: >=3.11
@@ -28,7 +28,7 @@ Requires-Dist: pandas>=2.0; extra == "vectors"
28
28
  Requires-Dist: pyarrow>=15.0; extra == "vectors"
29
29
  Requires-Dist: lancedb>=0.10; extra == "vectors"
30
30
  Provides-Extra: hermes
31
- Requires-Dist: apsimo-hermes<2,>=1.3.4; extra == "hermes"
31
+ Requires-Dist: apsimo-hermes<2,>=1.4.0; extra == "hermes"
32
32
  Provides-Extra: mcp
33
33
  Requires-Dist: mcp[cli]<2,>=1.0; extra == "mcp"
34
34
  Provides-Extra: lancedb
@@ -539,6 +539,7 @@ apsimo/turns/source_annotations.py
539
539
  apsimo/turns/source_attribution.py
540
540
  apsimo/turns/source_read.py
541
541
  apsimo/turns/source_vectors.py
542
+ apsimo/turns/tool_observations.py
542
543
  apsimo/turns/video.py
543
544
  apsimo/util/autonomy_preset.py
544
545
  apsimo/util/instance.py
@@ -677,6 +678,7 @@ tests/test_commitment_resolution_downgrade.py
677
678
  tests/test_commitment_resolution_schema.py
678
679
  tests/test_commitment_work.py
679
680
  tests/test_commitments.py
681
+ tests/test_comms_source_erasure.py
680
682
  tests/test_competence_reconciliation.py
681
683
  tests/test_compression.py
682
684
  tests/test_concern_resolution_receipts.py
@@ -808,6 +810,7 @@ tests/test_native_setup.py
808
810
  tests/test_native_source_image_read.py
809
811
  tests/test_native_source_read.py
810
812
  tests/test_native_source_video_read.py
813
+ tests/test_native_tool_observations.py
811
814
  tests/test_neo4j_backend.py
812
815
  tests/test_operator_deck_read_truth.py
813
816
  tests/test_ordinary_context_briefings.py
@@ -35,7 +35,7 @@ beautifulsoup4>=4.12
35
35
  neo4j>=5.18
36
36
 
37
37
  [hermes]
38
- apsimo-hermes<2,>=1.3.4
38
+ apsimo-hermes<2,>=1.4.0
39
39
 
40
40
  [lancedb]
41
41
  lancedb>=0.6
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "apsimo"
7
- version = "1.3.4"
7
+ version = "1.4.0"
8
8
  description = "Persistent identity, memory and autonomy for AI agents"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -29,7 +29,7 @@ dependencies = [
29
29
  graph = ["neo4j>=5.18"]
30
30
  neo4j = ["neo4j>=5.18"]
31
31
  vectors = ["sentence-transformers>=3.0", "pandas>=2.0", "pyarrow>=15.0", "lancedb>=0.10"]
32
- hermes = ["apsimo-hermes>=1.3.4,<2"]
32
+ hermes = ["apsimo-hermes>=1.4.0,<2"]
33
33
  mcp = ["mcp[cli]>=1.0,<2"]
34
34
  lancedb = ["lancedb>=0.6", "pyarrow>=14.0", "pandas>=2.0"]
35
35
  postgres = ["asyncpg>=0.29"]
@@ -131,6 +131,29 @@ def _make_provider(provider_mod, fake_httpx, monkeypatch):
131
131
  return p
132
132
 
133
133
 
134
+ @pytest.mark.parametrize("reported", ["not_observed", "pending_until_each_host_connects", None])
135
+ def test_source_remove_preserves_server_reconciliation_receipt(provider_mod, monkeypatch, reported):
136
+ payload = {"source_erased": True, "watermark": 7}
137
+ if reported is not None:
138
+ payload["host_reconciliation"] = reported
139
+ fake = _FakeHttpx({("POST", "/v1/host/memory/sources/forget"): payload})
140
+ monkeypatch.setattr(_FakeResponse, "is_success", property(lambda response: response.status_code < 300), raising=False)
141
+ provider = _make_provider(provider_mod, fake, monkeypatch)
142
+ provider._session_id = "source-session"
143
+ monkeypatch.setattr(provider, "_prefetch_contact", lambda: "cid-base")
144
+ provider._cached_context = "A recalled source."
145
+ provider._temporal_cache = (1.0, "Prior context.")
146
+ provider.on_memory_write("remove", "MEMORY.md", "", metadata={"old_text": "A recalled source."})
147
+ assert provider._last_erasure == {
148
+ "state": "source_erased", "scope": "canonical_turn_sources", "watermark": 7,
149
+ "host_reconciliation": reported or "not_observed",
150
+ }
151
+ assert provider._cached_context == "" and provider._temporal_cache == (0.0, "")
152
+ assert fake.requests[0]["json"] == {
153
+ "contact_id": "cid-base", "session_id": "source-session", "old_text": "A recalled source.",
154
+ }
155
+
156
+
134
157
  def test_native_setup_settings_survive_restart_and_profiles_stay_separate(
135
158
  provider_mod, monkeypatch, tmp_path):
136
159
  homes = [tmp_path / "profile-one", tmp_path / "profile-two"]