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.
- {apsimo-1.3.4 → apsimo-1.4.0}/PKG-INFO +2 -2
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/api/routers/host.py +59 -8
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contacts/comms.py +101 -31
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/server.py +2 -1
- apsimo-1.4.0/apsimo/turns/tool_observations.py +87 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo.egg-info/PKG-INFO +2 -2
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo.egg-info/SOURCES.txt +3 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo.egg-info/requires.txt +1 -1
- {apsimo-1.3.4 → apsimo-1.4.0}/pyproject.toml +2 -2
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_colony_memory_provider.py +23 -0
- apsimo-1.4.0/tests/test_comms_source_erasure.py +241 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_hermes_general_governance.py +1 -0
- apsimo-1.4.0/tests/test_native_tool_observations.py +391 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/LICENSE +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/README.md +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/__main__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/agent/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/agent/client.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/agent/models.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/agents/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/agents/models.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/agents/store.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/agents/websocket.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/api/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/api/auth_telemetry.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/api/authority.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/api/contact_grants.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/api/middleware.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/api/routers/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/api/routers/commitment_work.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/api/routers/context_gate.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/api/routers/executions.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/api/routers/followup_plans.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/api/routers/governed_actions.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/api/routers/initiative_work.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/api/routers/mining.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/api/routers/observations.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/api/routers/social_state.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/api/routers/task_queue.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/api/routers/temporal_followups.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/api/routers/transport.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/api/routers/transport_ingress_api.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/api/schemas/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/api/schemas/host.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/autonomy/cli.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/autonomy/condition_worker.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/autonomy/config.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/autonomy/loop.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/autonomy/registry.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/autonomy/scheduler.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/autonomy/synthesis.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/backup.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/beliefs/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/beliefs/contradictions.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/beliefs/decay.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/beliefs/engine.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/beliefs/models.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/beliefs/promotion.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/beliefs/resolve.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/beliefs/source_claims.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/beliefs/source_projection.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/beliefs/source_time.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/beliefs/store.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/briefings/aggregators.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/briefings/composer.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/briefings/config.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/briefings/delivery.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/briefings/engagement.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/briefings/engine.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/briefings/enhancer.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/briefings/models.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/briefings/scheduler.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/briefings/store.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/chain/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/chain/block.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/chain/cli.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/chain/genesis.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/chain/identity.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/chain/keys.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/chain/local_keys.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/chain/manager.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/chain/node.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/chain/plugin_transactions.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/chain/protocol.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/chain/state_machine.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/chain/storage.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/chain/transactions.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/chain/validation.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/channels/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/channels/manifest.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/channels/migrations/001_channels_schema.sql +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/channels/phone_gateways.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/channels/presence.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/channels/router.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/channels/store.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/cli.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/cognition/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/cognition/charter.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/cognition/drive_governance.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/cognition/evidence_pipeline.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/cognition/external_events.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/cognition/goal_spine.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/cognition/introspection.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/cognition/prompt.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/cognition/runtime.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/cognition/trigger.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/commitments/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/commitments/local_work.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/commitments/store.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/commitments/work.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/compat.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/compression/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/connectors/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/connectors/base.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/connectors/caldav_calendar.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/connectors/fs_documents.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/connectors/imap_email.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/connectors/manager.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/connectors/webhook_pull.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contacts/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contacts/config.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contacts/exporters/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contacts/exporters/vcard.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contacts/identity_links.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contacts/importer.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contacts/importers/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contacts/importers/batch.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contacts/importers/macos_contacts.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contacts/migrations/001_contacts_schema.sql +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contacts/migrations/002_trust_scopes.sql +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contacts/migrations/003_open_gateway_enum.sql +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contacts/migrations/004_contact_provision_operations.sql +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contacts/migrations/005_identity_links.sql +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contacts/models.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contacts/scoring.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contacts/store.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contacts/transport_ingress.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contacts/world_bridge.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contextgate/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contextgate/chunker.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contextgate/estimate.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contextgate/gate.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/contextgate/retrieve.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/delivery/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/delivery/bridge.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/delivery/channels.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/delivery/classification.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/delivery/rate_limiter.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/delivery/reachout_policy.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/directed/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/directed/audit.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/directed/intake.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/directed/models.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/directed/service.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/directives/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/directives/evidence.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/directives/extractor.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/directives/guard.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/directives/models.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/directives/service.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/directives/store.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/doctor.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/environment.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/events/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/events/broadcaster.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/events/bus.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/events/journal.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/events/stream.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/events/types.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/execution_results.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/feedback/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/feedback/store.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/feeds/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/feeds/cli.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/feeds/engine.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/feeds/example-feed.yaml +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/feeds/hermes_cron.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/feeds/manager.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/feeds/spec.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/feeds/template.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/audit.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/communication_policy.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/config.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/context_provenance.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/env_risk.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/guard_audit.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/layers/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/layers/base.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/layers/l1_recipient.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/layers/l2_pii.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/layers/l3_cross_context.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/layers/l4_trust_tier.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/layers/l5_injection.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/layers/l6_review.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/layers/l7_delay.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/layers/tom2_epistemic.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/models.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/pending_dispatch.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/pipeline.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/rejection.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/response_guard.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/rulesets/injection_v1.yaml +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/surface_policy.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/gate/taint.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/genesis.json +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/goals/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/goals/config.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/goals/decomposer.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/goals/engine.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/goals/inference.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/goals/models.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/goals/priority.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/goals/queue_bridge.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/goals/replan.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/goals/schema.sql +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/goals/store.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/governed_actions.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/harness_integration/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/harness_integration/context.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/harness_integration/skills.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/identity/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/identity/participants.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/identity/resolver.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/identity_bootstrap/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/identity_bootstrap/builder.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/identity_bootstrap/corpus.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/identity_bootstrap/models.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/identity_bootstrap/runner.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/identity_bootstrap/seeders/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/identity_bootstrap/seeders/briefings.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/identity_bootstrap/seeders/chain.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/identity_bootstrap/seeders/goals.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/identity_bootstrap/seeders/memory.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/identity_bootstrap/seeders/neo4j_cognition.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/identity_bootstrap/seeders/relationship.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/identity_bootstrap/seeders/sessions.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/identity_bootstrap/seeders/skills.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/identity_bootstrap/seeders/task_queue.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/identity_bootstrap/seeders/world_model.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/identity_bootstrap/self_query.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/identity_bootstrap/self_reflection.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/identity_bootstrap/skill.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/identity_bootstrap/verifier.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/initiatives/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/initiatives/action_registry.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/initiatives/approval_authority.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/initiatives/approval_policy.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/initiatives/assignment.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/initiatives/backup_evidence.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/initiatives/context_freshness.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/initiatives/models.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/initiatives/native_work.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/initiatives/standing_approvals.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/initiatives/store.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/initiatives/temporal_followup.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/cognition/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/cognition/gap_detector.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/cognition/metalearner.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/cognition/metrics_collector.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/cognition/performance_index.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/cognition/registry.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/cognition/strategy_adjuster.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/cognition/types.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/components/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/components/anomaly_detector.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/components/initiative_engine.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/components/preference_learner.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/components/research_orchestrator.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/components/self_directed_thinker.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/components/self_reflector.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/components/session_continuity.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/components/task_planner.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/components/tool_learner.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/graph/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/graph/client.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/graph/consolidator.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/graph/distiller.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/graph/migrations.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/graph/queries.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/graph/recall.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/graph/reconciler.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/graph/schema.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/graph/selection.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/learning/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/learning/continuous_learner.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/learning/feedback_store.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/mind_model/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/mind_model/graph_baseline.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/mind_model/signal_collector.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/relationships/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/relationships/profiler.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/relationships/scorer.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/relationships/signal_floor.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/relationships/trust_tiers.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/synthesis/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/synthesis/connection_discoverer.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/synthesis/cross_domain_analyzer.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/synthesis/insight_deliverer.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/synthesis/insight_store.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/synthesis/insight_validator.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/synthesis/novelty_scorer.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/turn_middleware/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/intelligence/turn_middleware/memory_sync.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/mcp/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/mcp/__main__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/mcp/config.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/mcp/server.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/migrations.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/mining/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/mining/corpus.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/mining/escalations.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/mining/models.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/mining/store.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/models/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/models/memory.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/models/mesh.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/models/person.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/models/signal.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/observations/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/observations/store.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/patterns/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/patterns/extract.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/patterns/store.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/persona/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/persona/engine.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/persona/manifest.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/projects/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/projects/engine.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/projects/event_outbox.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/projects/models.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/projects/planner.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/projects/store.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/proposals/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/proposals/engine.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/proposals/models.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/qualification/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/qualification/cases.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/qualification/cli.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/qualification/memory_cases.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/qualification/records.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/qualification/report.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/qualification/runner.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/qualification/structured_cases.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/reasoning/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/reasoning/executor.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/reasoning/loop.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/reasoning/native_tools/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/reasoning/native_tools/calculate.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/reasoning/native_tools/file_ops.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/reasoning/native_tools/web_search.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/reasoning/tool_policy.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/redact/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/repos/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/repos/mirrors.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/research/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/research/artifact.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/research/gatherer.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/research/pipeline.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/research/search/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/research/search/base.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/research/search/brave.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/research/search/cache.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/research/search/duckduckgo.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/research/search/orchestrator.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/research/search/serpapi.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/research/search/tavily.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/research/synthesizer.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/router/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/router/complexity_scorer.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/router/endpoints.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/router/fallback.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/router/functions.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/router/native_policy.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/router/router.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/router/self_learning.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/router/tiers.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/sandbox/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/sandbox/backend.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/sandbox/manager.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/scope_bounds.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/secrets/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/secrets/backends/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/secrets/backends/base.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/secrets/backends/env.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/secrets/backends/keyring.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/secrets/backends/onepassword.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/secrets/cli.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/secrets/manager.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/secrets/migration.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/secrets/types.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/seed.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/appraisals.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/benchmark.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/brief.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/event_concerns.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/execution_forecasts.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/expectations.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/experiments.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/journal.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/judgments.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/native_outcomes.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/params.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/perspective.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/reconcile.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/reply_forecasts.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/runtime_forecasts.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/runtime_models.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/settlement.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/situation.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/store.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/supervised.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/thinker.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/trust.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/self_model/workspace.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/services/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/services/agent_bridge.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/services/initiative_executor.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/services/instance.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/sessions/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/sessions/config.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/sessions/context_loader.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/sessions/federation_session.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/sessions/isolated_session.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/sessions/reports.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/sessions/store.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/setup.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/setup_hermes.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/setup_local_work.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/setup_native_goals.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/setup_native_reviews.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/base.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/budget.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/executor.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/executors/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/executors/behavioral_correction.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/executors/capability_gap.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/executors/data_quality.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/executors/knowledge_acquisition.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/executors/operational_hygiene.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/executors/subsystem_health.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/hermes_export.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/index.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/learning/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/learning/novelty_detector.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/learning/pattern_extractor.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/learning/triggers.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/loader.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/migrations/002_progressive_loading.sql +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/migrations/backfill_triggers.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/models.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/packager.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/protocols.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/registry.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/runtime.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/sandbox_runner.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/scheduler.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/schema.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/security/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/security/guards.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills/security/scanner.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills_memory/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills_memory/distill.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills_memory/models.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills_memory/retrieve.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/skills_memory/store.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/surprise/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/surprise/accumulation.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/surprise/scorer.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/surprise/store.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/task_queue/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/task_queue/action_receipts.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/task_queue/approval_relay_canary.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/task_queue/config.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/task_queue/contract.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/task_queue/events.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/task_queue/governor.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/task_queue/handlers/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/task_queue/handlers/base.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/task_queue/handlers/inference.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/task_queue/handlers/monitoring.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/task_queue/handlers/registry.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/task_queue/handlers/subtask_handler.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/task_queue/handlers/system_maintenance.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/task_queue/mesh_integration.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/task_queue/models.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/task_queue/queue_manager.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/task_queue/routing.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/task_queue/scheduler.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/task_queue/schema.sql +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/task_queue/work_control.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/task_queue/worker.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/telemetry.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/tom/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/tom/affect.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/tom/approvals.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/tom/arcs.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/tom/asymmetry.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/tom/eligibility.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/tom/engagement.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/tom/exposure.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/tom/extractor.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/tom/fact_adapters.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/tom/facts.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/tom/integration.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/tom/leveled.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/tom/levels.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/tom/recipient_audit.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/tom/recipient_simulator.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/tom/source_lineage.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/tom/tom2.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/tom/visibility.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/tom/visibility_store.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/tools/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/tools/definitions.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/tools/handlers.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/toolsmith/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/toolsmith/authority.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/toolsmith/engine.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/toolsmith/integrity.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/toolsmith/miner.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/toolsmith/policy.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/toolsmith/registry.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/turns/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/turns/audio.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/turns/documents.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/turns/executions.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/turns/hermes_history.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/turns/hermes_kanban.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/turns/hermes_work.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/turns/history_references.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/turns/idempotency.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/turns/local_work.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/turns/media.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/turns/reported_workers.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/turns/source_annotations.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/turns/source_attribution.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/turns/source_read.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/turns/source_vectors.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/turns/video.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/util/autonomy_preset.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/util/instance.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/util/model_output.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/util/quiet_hours.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/util/session_safety.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/util/temporal.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/vector/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/vector/backfill.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/vector/caption.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/vector/collections.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/vector/config.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/vector/embedder.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/vector/image_preprocess.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/vector/image_store.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/vector/indexes.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/vector/migrate.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/vector/multimodal_provider.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/vector/multimodal_types.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/vector/openai_provider.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/vector/query.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/vector/reranker.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/vector/safety_image.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/vector/scanner.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/vector/setup.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/vector/store.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/vector/tiers.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/work_orders.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/workers/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/workers/agent_bridge.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/workers/colony_worker.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/workers/queue_worker.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/workers/skills_sync.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/causal_maintenance.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/causal_policy.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/causal_query.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/confidence.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/config.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/constants.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/entities.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/expectation_resolvers.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/extraction/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/extraction/base.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/extraction/conversation_extractor.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/extraction/detector.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/extraction/document_extractor.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/extraction/formats/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/extraction/formats/csv_fmt.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/extraction/formats/html_fmt.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/extraction/formats/json_fmt.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/extraction/formats/pdf.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/extraction/formats/text.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/extraction/llm_extractor.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/extraction/pipeline.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/integrations/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/integrations/mind_model_bridge.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/integrations/social_intel_bridge.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/jobs/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/jobs/extraction_job.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/llm_extract.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/neo4j/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/neo4j/backend.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/observations.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/populator.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/postgres/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/postgres/backend.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/relationships.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/resolution/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/resolution/entity_resolver.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/resolution/merge_audit.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/resolution/merge_workflow.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/source_reports.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/sqlite/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/sqlite/backend.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/sqlite/schema.sql +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo/world_model/store.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo.egg-info/dependency_links.txt +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo.egg-info/entry_points.txt +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/apsimo.egg-info/top_level.txt +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/colony_sidecar/__init__.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/setup.cfg +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_accepted_local_work.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_adaptive_params.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_affect.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_agent_action_routing.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_agent_api.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_agent_bridge.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_agent_bridge_service.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_agent_sdk.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_agent_sensor_loop.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_agent_snapshot.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_agent_store.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_annotated_recall_reinforcement.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_answer_source_lineage.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_appraisal_incident_decisions.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_approval_gate.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_approval_relay_canary.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_apsimo_compat.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_apsimo_harness_guidance.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_assignment_engine.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_audit_cleanup.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_auth_coverage.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_auth_migration_readiness.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_authz_scope_api.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_autonomy_preset.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_backup.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_backup_receipt_evidence.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_beliefs.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_bind_auth_guard.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_boundary_fail_closed.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_bounded_approval_authority.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_briefing_aggregators.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_canonical_scoped_context.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_canonical_source_read.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_causal_extract.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_causal_falsifiability.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_causal_maintenance.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_causal_policy.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_causal_query.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_causal_query_only_guard.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_chain_keys.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_channel_preferences.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_channel_registry.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_channel_store.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_cognition.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_cognition_evidence_pipeline.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_cognition_evidence_server_wiring.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_cognition_goal_spine.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_cognition_observability.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_cognition_p4_controlled_learning.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_cognition_p4_server_integration.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_cognition_p6_p7_server_wiring.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_cognition_p7_drive_governance.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_cognition_phase_b_runtime.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_cognition_phase_c_scheduler.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_cognition_server_wiring.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_commitment_resolution.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_commitment_resolution_downgrade.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_commitment_resolution_schema.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_commitment_work.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_commitments.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_competence_reconciliation.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_compression.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_concern_resolution_receipts.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_condition_producer.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_connectors.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_contact_fact_recall.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_contact_policy_projection.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_contact_provisioning.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_contact_timezone.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_contacts_intro.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_contacts_persistence.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_context_gate.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_context_phase1.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_context_provenance.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_conversation_presence.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_conversation_turn_concerns.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_current_work_recall_selection.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_delivery_bridge_503.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_delivery_gateway_identity.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_delivery_reachout_routing.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_directed.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_directed_envelope.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_directed_reports.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_directed_trust.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_directive_sources.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_directives.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_distill.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_doctor.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_document_memory_guard.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_duckduckgo_provider.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_embedding_generations.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_enrolled_sender_turns.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_ensure_channel_id.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_env_risk.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_event_broadcasts.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_event_bus_types.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_event_concerns.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_event_stream_reliability.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_execution_forecasts.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_execution_input_purpose.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_execution_registry.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_expectations.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_expectations_v2.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_experiments.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_external_cognition_events.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_external_event_concerns.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_facts_backfill.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_feedback.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_followup_plans.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_forecast_learning.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_function_routing.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_gap_generators.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_genesis_manifest.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_global_pause.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_goal_dispatch_availability.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_goal_inference_provenance.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_goal_reader_imports.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_governed_actions.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_governed_research_handoff.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_graduated_approvals.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_grant_envelope.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_graph_reindex_metadata.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_guard_audit.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_guard_chat_mode.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_guard_derive_context.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_guard_enforce_policy.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_hermes_export.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_hermes_history_import.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_hermes_native_tool_authority.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_hermes_plugin_contract.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_hermes_plugin_event_lifecycle.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_hermes_plugin_event_replay.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_hermes_plugin_guard_shadow.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_hermes_plugin_signals.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_hermes_plugin_turn_id.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_hermes_queue_stats_projection.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_hermes_setup.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_hermes_turn_outbox.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_hermes_work_projection.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_host_input_provenance.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_hostworker_agreement.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_identity_continuity.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_identity_corrections.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_inference_context_gate.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_initiative_engine.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_initiative_evidence.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_initiative_executor.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_initiative_feedback.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_initiative_pipeline_v016.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_initiative_retry.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_initiative_store.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_input_source_lineage.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_insight_store.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_instance_service.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_instance_service_live.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_intelligence_components.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_intelligence_synthesis.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_introduction_initiatives.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_job_writeback.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_journal.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_legacy_fact_context.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_local_work_context.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_loop_stats_accuracy.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_mcp_config.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_mcp_server.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_media_read_reference_presentation.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_memory_decay.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_memory_formation.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_memory_governance.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_memory_promotion.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_memory_prune.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_memory_read_hydration.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_memory_response_schemas.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_migrations.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_mining.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_model_qualification_cli.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_model_qualification_memory.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_model_qualification_runner.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_model_qualification_structured.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_native_accepted_local_work.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_native_history_references.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_native_initiative_work.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_native_input_carrier.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_native_outcome_judgments.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_native_request_erasure.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_native_review_recurrence.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_native_setup.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_native_source_image_read.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_native_source_read.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_native_source_video_read.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_neo4j_backend.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_operator_deck_read_truth.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_ordinary_context_briefings.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_owner_preferences.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_p2_wirings.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_partial_work_rendering.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_patterns.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_pending_work_coverage.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_persona.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_persona_setup_result.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_phase_capability_check.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_preset_loop_coupling.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_procedure_source_context.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_project_event_outbox.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_project_result_reconciliation_phase.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_projects.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_prompt_evals.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_proposals.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_provenance_population.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_pseudo_agi_production_chain.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_queue_completed_filter.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_queue_contract.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_quiet_hours_and_reload.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_reachout_policy.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_recall_hybrid.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_recall_person_boost.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_recall_ranking.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_recall_request_repetition.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_recall_rerank.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_recall_source_presentation.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_recall_unified_context.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_recency.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_reflection_task_routing.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_rejection_loop.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_relationship_calendar_aggregators.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_relationship_score_refresh.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_relationship_signal_floor.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_relationships.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_reply_forecast_callback_order.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_reply_forecast_stops.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_reply_forecasts.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_repo_tools.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_reported_worker_status.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_request_capabilities.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_request_work_context.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_reranker_remote.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_research_orchestrator.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_resolve_messaging_handle.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_response_guard.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_response_guard_communication_policy.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_response_guard_endpoint.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_response_guard_surface_policy.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_router_tiers.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_runtime_model_observations.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_sandbox.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_scoped_api_authority.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_scoped_contact_resolution.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_secondary_review_contract.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_seed_retirement.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_selected_autonomy.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_self_directed_thinker.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_self_initiatives.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_self_judgment_opt_in.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_self_judgment_premises.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_self_judgments.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_self_model.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_self_perspective.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_selfhood_benchmark.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_session_reports.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_shared_facts.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_shared_local_undertaking.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_short_source_context.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_sidecar.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_signals_attribution.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_situation_spine.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_skill_approval.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_skill_attribution.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_skill_sandbox.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_skill_synthesis.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_skill_synthesis_wiring.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_skills_memory.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_social_context_flow.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_social_transport.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_annotation_claim_survivors.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_annotations.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_appraisals.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_attribution.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_audio.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_audio_claims.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_claim_budget.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_claim_diagnostics.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_claim_media_eligibility.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_claim_projection.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_claim_review.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_claim_subject_basis.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_document_read.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_documents.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_episode_admission.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_episode_memory.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_episode_revisions.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_event_precision.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_excerpt_lineage.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_image_read.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_media.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_memory_backup.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_time_query.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_vectors.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_source_video.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_sqlite_connection_ownership.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_supervised_rung.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_surprise.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_sweep_fixes.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_synthesis.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_telemetry_staleness.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_temporal.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_temporal_followups.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_temporal_index.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_test_environment_isolation.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_thinking_phase.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_thought_function_routing.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tick_phase_budget.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tier_endpoints.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_timeline.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom2_approvals.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom2_asymmetry.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom2_context.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom2_cross_gate.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom2_eligibility.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom2_epistemic_guard.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom2_exposure.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom2_kill_switch.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom2_level_coherence.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom2_leveled.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom2_levels.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom2_source_corrections.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom2_store.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom2_taint.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom2_wiring.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom_event_lineage.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom_extractor.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom_p8_arcs.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom_p8_boundary_corpus.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom_p8_fact_adapters.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom_p8_outbound_integration.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom_p8_recipient_audit.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom_p8_recipient_simulator.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom_p8_server_integration.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom_p8_visibility.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom_p8_visibility_store.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tom_source_lineage.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tool_handlers_graph.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tool_observation_reader.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tool_provenance.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_tool_surface.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_toolsmith.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_transport_ingress.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_transport_ingress_api.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_trust_configure.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_trust_scopes.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_trust_scopes_p2.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_turn_idempotency_ledger.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_turn_idempotency_v2.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_turn_ner_entities.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_turn_source_erasure.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_turn_source_evidence.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_turn_survivor_delivery.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_validation_sweep_fixes.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_vector_vacuum.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_wizard_autonomy.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_work_ancestry_projection.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_work_control_production_blockers.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_work_control_v1.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_work_orders.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_work_read_surface_authority.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_work_source_coverage.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_worker_handler_boundaries.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_worker_heartbeat_truth.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_worker_http_authority.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_worker_integration.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_worker_lifecycle_durability.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_workers_governor.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_workers_install.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_workspace.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_world_context_query.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_world_entity_reinforcement.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_world_llm_extract.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_world_model_prune.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_world_observations.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_world_populator.py +0 -0
- {apsimo-1.3.4 → apsimo-1.4.0}/tests/test_world_quality.py +0 -0
- {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
|
+
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.
|
|
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 = '
|
|
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 =
|
|
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": "
|
|
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).
|
|
4637
|
-
#
|
|
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
|
-
|
|
144
|
-
"SELECT channel,
|
|
145
|
-
" ORDER BY ts DESC LIMIT ?",
|
|
146
|
-
|
|
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.
|
|
150
|
-
"SELECT channel,
|
|
151
|
-
" WHERE contact_id=? GROUP BY channel", (contact_id,)
|
|
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
|
-
|
|
157
|
-
"SELECT channel,
|
|
158
|
-
" ORDER BY ts DESC LIMIT 1",
|
|
159
|
-
|
|
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
|
-
|
|
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
|
-
|
|
191
|
-
|
|
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
|
-
|
|
238
|
-
|
|
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
|
-
|
|
274
|
-
"SELECT contact_id,
|
|
275
|
-
" ORDER BY ts DESC LIMIT ?", (limit,)
|
|
276
|
-
|
|
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
|
+
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.
|
|
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
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "apsimo"
|
|
7
|
-
version = "1.
|
|
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.
|
|
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"]
|