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